/ Hex Artifact Content
Login

Artifact bcfa17eb257bf8dc2359e99ba7e6bdfab7901705db013bc47a5be6d7fa7a037e:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 63 6f 64  ile contains cod
0190: 65 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74  e to implement t
01a0: 68 65 20 22 73 71 6c 69 74 65 22 20 63 6f 6d 6d  he "sqlite" comm
01b0: 61 6e 64 20 6c 69 6e 65 0a 2a 2a 20 75 74 69 6c  and line.** util
01c0: 69 74 79 20 66 6f 72 20 61 63 63 65 73 73 69 6e  ity for accessin
01d0: 67 20 53 51 4c 69 74 65 20 64 61 74 61 62 61 73  g SQLite databas
01e0: 65 73 2e 0a 2a 2f 0a 23 69 66 20 28 64 65 66 69  es..*/.#if (defi
01f0: 6e 65 64 28 5f 57 49 4e 33 32 29 20 7c 7c 20 64  ned(_WIN32) || d
0200: 65 66 69 6e 65 64 28 57 49 4e 33 32 29 29 20 26  efined(WIN32)) &
0210: 26 20 21 64 65 66 69 6e 65 64 28 5f 43 52 54 5f  & !defined(_CRT_
0220: 53 45 43 55 52 45 5f 4e 4f 5f 57 41 52 4e 49 4e  SECURE_NO_WARNIN
0230: 47 53 29 0a 2f 2a 20 54 68 69 73 20 6e 65 65 64  GS)./* This need
0240: 73 20 74 6f 20 63 6f 6d 65 20 62 65 66 6f 72 65  s to come before
0250: 20 61 6e 79 20 69 6e 63 6c 75 64 65 73 20 66 6f   any includes fo
0260: 72 20 4d 53 56 43 20 63 6f 6d 70 69 6c 65 72 20  r MSVC compiler 
0270: 2a 2f 0a 23 64 65 66 69 6e 65 20 5f 43 52 54 5f  */.#define _CRT_
0280: 53 45 43 55 52 45 5f 4e 4f 5f 57 41 52 4e 49 4e  SECURE_NO_WARNIN
0290: 47 53 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  GS.#endif../*.**
02a0: 20 57 61 72 6e 69 6e 67 20 70 72 61 67 6d 61 73   Warning pragmas
02b0: 20 63 6f 70 69 65 64 20 66 72 6f 6d 20 6d 73 76   copied from msv
02c0: 63 2e 68 20 69 6e 20 74 68 65 20 63 6f 72 65 2e  c.h in the core.
02d0: 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28  .*/.#if defined(
02e0: 5f 4d 53 43 5f 56 45 52 29 0a 23 70 72 61 67 6d  _MSC_VER).#pragm
02f0: 61 20 77 61 72 6e 69 6e 67 28 64 69 73 61 62 6c  a warning(disabl
0300: 65 20 3a 20 34 30 35 34 29 0a 23 70 72 61 67 6d  e : 4054).#pragm
0310: 61 20 77 61 72 6e 69 6e 67 28 64 69 73 61 62 6c  a warning(disabl
0320: 65 20 3a 20 34 30 35 35 29 0a 23 70 72 61 67 6d  e : 4055).#pragm
0330: 61 20 77 61 72 6e 69 6e 67 28 64 69 73 61 62 6c  a warning(disabl
0340: 65 20 3a 20 34 31 30 30 29 0a 23 70 72 61 67 6d  e : 4100).#pragm
0350: 61 20 77 61 72 6e 69 6e 67 28 64 69 73 61 62 6c  a warning(disabl
0360: 65 20 3a 20 34 31 32 37 29 0a 23 70 72 61 67 6d  e : 4127).#pragm
0370: 61 20 77 61 72 6e 69 6e 67 28 64 69 73 61 62 6c  a warning(disabl
0380: 65 20 3a 20 34 31 33 30 29 0a 23 70 72 61 67 6d  e : 4130).#pragm
0390: 61 20 77 61 72 6e 69 6e 67 28 64 69 73 61 62 6c  a warning(disabl
03a0: 65 20 3a 20 34 31 35 32 29 0a 23 70 72 61 67 6d  e : 4152).#pragm
03b0: 61 20 77 61 72 6e 69 6e 67 28 64 69 73 61 62 6c  a warning(disabl
03c0: 65 20 3a 20 34 31 38 39 29 0a 23 70 72 61 67 6d  e : 4189).#pragm
03d0: 61 20 77 61 72 6e 69 6e 67 28 64 69 73 61 62 6c  a warning(disabl
03e0: 65 20 3a 20 34 32 30 36 29 0a 23 70 72 61 67 6d  e : 4206).#pragm
03f0: 61 20 77 61 72 6e 69 6e 67 28 64 69 73 61 62 6c  a warning(disabl
0400: 65 20 3a 20 34 32 31 30 29 0a 23 70 72 61 67 6d  e : 4210).#pragm
0410: 61 20 77 61 72 6e 69 6e 67 28 64 69 73 61 62 6c  a warning(disabl
0420: 65 20 3a 20 34 32 33 32 29 0a 23 70 72 61 67 6d  e : 4232).#pragm
0430: 61 20 77 61 72 6e 69 6e 67 28 64 69 73 61 62 6c  a warning(disabl
0440: 65 20 3a 20 34 32 34 34 29 0a 23 70 72 61 67 6d  e : 4244).#pragm
0450: 61 20 77 61 72 6e 69 6e 67 28 64 69 73 61 62 6c  a warning(disabl
0460: 65 20 3a 20 34 33 30 35 29 0a 23 70 72 61 67 6d  e : 4305).#pragm
0470: 61 20 77 61 72 6e 69 6e 67 28 64 69 73 61 62 6c  a warning(disabl
0480: 65 20 3a 20 34 33 30 36 29 0a 23 70 72 61 67 6d  e : 4306).#pragm
0490: 61 20 77 61 72 6e 69 6e 67 28 64 69 73 61 62 6c  a warning(disabl
04a0: 65 20 3a 20 34 37 30 32 29 0a 23 70 72 61 67 6d  e : 4702).#pragm
04b0: 61 20 77 61 72 6e 69 6e 67 28 64 69 73 61 62 6c  a warning(disabl
04c0: 65 20 3a 20 34 37 30 36 29 0a 23 65 6e 64 69 66  e : 4706).#endif
04d0: 20 2f 2a 20 64 65 66 69 6e 65 64 28 5f 4d 53 43   /* defined(_MSC
04e0: 5f 56 45 52 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  _VER) */../*.** 
04f0: 4e 6f 20 73 75 70 70 6f 72 74 20 66 6f 72 20 6c  No support for l
0500: 6f 61 64 61 62 6c 65 20 65 78 74 65 6e 73 69 6f  oadable extensio
0510: 6e 73 20 69 6e 20 56 78 57 6f 72 6b 73 2e 0a 2a  ns in VxWorks..*
0520: 2f 0a 23 69 66 20 28 64 65 66 69 6e 65 64 28 5f  /.#if (defined(_
0530: 5f 52 54 50 5f 5f 29 20 7c 7c 20 64 65 66 69 6e  _RTP__) || defin
0540: 65 64 28 5f 57 52 53 5f 4b 45 52 4e 45 4c 29 29  ed(_WRS_KERNEL))
0550: 20 26 26 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54   && !SQLITE_OMIT
0560: 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 0a  _LOAD_EXTENSION.
0570: 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f  # define SQLITE_
0580: 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53  OMIT_LOAD_EXTENS
0590: 49 4f 4e 20 31 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ION 1.#endif../*
05a0: 0a 2a 2a 20 45 6e 61 62 6c 65 20 6c 61 72 67 65  .** Enable large
05b0: 2d 66 69 6c 65 20 73 75 70 70 6f 72 74 20 66 6f  -file support fo
05c0: 72 20 66 6f 70 65 6e 28 29 20 61 6e 64 20 66 72  r fopen() and fr
05d0: 69 65 6e 64 73 20 6f 6e 20 75 6e 69 78 2e 0a 2a  iends on unix..*
05e0: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
05f0: 5f 44 49 53 41 42 4c 45 5f 4c 46 53 0a 23 20 64  _DISABLE_LFS.# d
0600: 65 66 69 6e 65 20 5f 4c 41 52 47 45 5f 46 49 4c  efine _LARGE_FIL
0610: 45 20 20 20 20 20 20 20 31 0a 23 20 69 66 6e 64  E       1.# ifnd
0620: 65 66 20 5f 46 49 4c 45 5f 4f 46 46 53 45 54 5f  ef _FILE_OFFSET_
0630: 42 49 54 53 0a 23 20 20 20 64 65 66 69 6e 65 20  BITS.#   define 
0640: 5f 46 49 4c 45 5f 4f 46 46 53 45 54 5f 42 49 54  _FILE_OFFSET_BIT
0650: 53 20 36 34 0a 23 20 65 6e 64 69 66 0a 23 20 64  S 64.# endif.# d
0660: 65 66 69 6e 65 20 5f 4c 41 52 47 45 46 49 4c 45  efine _LARGEFILE
0670: 5f 53 4f 55 52 43 45 20 31 0a 23 65 6e 64 69 66  _SOURCE 1.#endif
0680: 0a 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 64 6c  ..#include <stdl
0690: 69 62 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c  ib.h>.#include <
06a0: 73 74 72 69 6e 67 2e 68 3e 0a 23 69 6e 63 6c 75  string.h>.#inclu
06b0: 64 65 20 3c 73 74 64 69 6f 2e 68 3e 0a 23 69 6e  de <stdio.h>.#in
06c0: 63 6c 75 64 65 20 3c 61 73 73 65 72 74 2e 68 3e  clude <assert.h>
06d0: 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74  .#include "sqlit
06e0: 65 33 2e 68 22 0a 74 79 70 65 64 65 66 20 73 71  e3.h".typedef sq
06f0: 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 36 34 3b  lite3_int64 i64;
0700: 0a 74 79 70 65 64 65 66 20 73 71 6c 69 74 65 33  .typedef sqlite3
0710: 5f 75 69 6e 74 36 34 20 75 36 34 3b 0a 74 79 70  _uint64 u64;.typ
0720: 65 64 65 66 20 75 6e 73 69 67 6e 65 64 20 63 68  edef unsigned ch
0730: 61 72 20 75 38 3b 0a 23 69 66 20 53 51 4c 49 54  ar u8;.#if SQLIT
0740: 45 5f 55 53 45 52 5f 41 55 54 48 45 4e 54 49 43  E_USER_AUTHENTIC
0750: 41 54 49 4f 4e 0a 23 20 69 6e 63 6c 75 64 65 20  ATION.# include 
0760: 22 73 71 6c 69 74 65 33 75 73 65 72 61 75 74 68  "sqlite3userauth
0770: 2e 68 22 0a 23 65 6e 64 69 66 0a 23 69 6e 63 6c  .h".#endif.#incl
0780: 75 64 65 20 3c 63 74 79 70 65 2e 68 3e 0a 23 69  ude <ctype.h>.#i
0790: 6e 63 6c 75 64 65 20 3c 73 74 64 61 72 67 2e 68  nclude <stdarg.h
07a0: 3e 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  >..#if !defined(
07b0: 5f 57 49 4e 33 32 29 20 26 26 20 21 64 65 66 69  _WIN32) && !defi
07c0: 6e 65 64 28 57 49 4e 33 32 29 0a 23 20 69 6e 63  ned(WIN32).# inc
07d0: 6c 75 64 65 20 3c 73 69 67 6e 61 6c 2e 68 3e 0a  lude <signal.h>.
07e0: 23 20 69 66 20 21 64 65 66 69 6e 65 64 28 5f 5f  # if !defined(__
07f0: 52 54 50 5f 5f 29 20 26 26 20 21 64 65 66 69 6e  RTP__) && !defin
0800: 65 64 28 5f 57 52 53 5f 4b 45 52 4e 45 4c 29 0a  ed(_WRS_KERNEL).
0810: 23 20 20 69 6e 63 6c 75 64 65 20 3c 70 77 64 2e  #  include <pwd.
0820: 68 3e 0a 23 20 65 6e 64 69 66 0a 23 65 6e 64 69  h>.# endif.#endi
0830: 66 0a 23 69 66 20 28 21 64 65 66 69 6e 65 64 28  f.#if (!defined(
0840: 5f 57 49 4e 33 32 29 20 26 26 20 21 64 65 66 69  _WIN32) && !defi
0850: 6e 65 64 28 57 49 4e 33 32 29 29 20 7c 7c 20 64  ned(WIN32)) || d
0860: 65 66 69 6e 65 64 28 5f 5f 4d 49 4e 47 57 33 32  efined(__MINGW32
0870: 5f 5f 29 0a 23 20 69 6e 63 6c 75 64 65 20 3c 75  __).# include <u
0880: 6e 69 73 74 64 2e 68 3e 0a 23 20 69 6e 63 6c 75  nistd.h>.# inclu
0890: 64 65 20 3c 64 69 72 65 6e 74 2e 68 3e 0a 23 20  de <dirent.h>.# 
08a0: 64 65 66 69 6e 65 20 47 45 54 50 49 44 20 67 65  define GETPID ge
08b0: 74 70 69 64 0a 23 20 69 66 20 64 65 66 69 6e 65  tpid.# if define
08c0: 64 28 5f 5f 4d 49 4e 47 57 33 32 5f 5f 29 0a 23  d(__MINGW32__).#
08d0: 20 20 64 65 66 69 6e 65 20 44 49 52 45 4e 54 20    define DIRENT 
08e0: 64 69 72 65 6e 74 0a 23 20 20 69 66 6e 64 65 66  dirent.#  ifndef
08f0: 20 53 5f 49 53 4c 4e 4b 0a 23 20 20 20 64 65 66   S_ISLNK.#   def
0900: 69 6e 65 20 53 5f 49 53 4c 4e 4b 28 6d 6f 64 65  ine S_ISLNK(mode
0910: 29 20 28 30 29 0a 23 20 20 65 6e 64 69 66 0a 23  ) (0).#  endif.#
0920: 20 65 6e 64 69 66 0a 23 65 6c 73 65 0a 23 20 64   endif.#else.# d
0930: 65 66 69 6e 65 20 47 45 54 50 49 44 20 28 69 6e  efine GETPID (in
0940: 74 29 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63  t)GetCurrentProc
0950: 65 73 73 49 64 0a 23 65 6e 64 69 66 0a 23 69 6e  essId.#endif.#in
0960: 63 6c 75 64 65 20 3c 73 79 73 2f 74 79 70 65 73  clude <sys/types
0970: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79  .h>.#include <sy
0980: 73 2f 73 74 61 74 2e 68 3e 0a 0a 23 69 66 20 48  s/stat.h>..#if H
0990: 41 56 45 5f 52 45 41 44 4c 49 4e 45 0a 23 20 69  AVE_READLINE.# i
09a0: 6e 63 6c 75 64 65 20 3c 72 65 61 64 6c 69 6e 65  nclude <readline
09b0: 2f 72 65 61 64 6c 69 6e 65 2e 68 3e 0a 23 20 69  /readline.h>.# i
09c0: 6e 63 6c 75 64 65 20 3c 72 65 61 64 6c 69 6e 65  nclude <readline
09d0: 2f 68 69 73 74 6f 72 79 2e 68 3e 0a 23 65 6e 64  /history.h>.#end
09e0: 69 66 0a 0a 23 69 66 20 48 41 56 45 5f 45 44 49  if..#if HAVE_EDI
09f0: 54 4c 49 4e 45 0a 23 20 69 6e 63 6c 75 64 65 20  TLINE.# include 
0a00: 3c 65 64 69 74 6c 69 6e 65 2f 72 65 61 64 6c 69  <editline/readli
0a10: 6e 65 2e 68 3e 0a 23 65 6e 64 69 66 0a 0a 23 69  ne.h>.#endif..#i
0a20: 66 20 48 41 56 45 5f 45 44 49 54 4c 49 4e 45 20  f HAVE_EDITLINE 
0a30: 7c 7c 20 48 41 56 45 5f 52 45 41 44 4c 49 4e 45  || HAVE_READLINE
0a40: 0a 0a 23 20 64 65 66 69 6e 65 20 73 68 65 6c 6c  ..# define shell
0a50: 5f 61 64 64 5f 68 69 73 74 6f 72 79 28 58 29 20  _add_history(X) 
0a60: 61 64 64 5f 68 69 73 74 6f 72 79 28 58 29 0a 23  add_history(X).#
0a70: 20 64 65 66 69 6e 65 20 73 68 65 6c 6c 5f 72 65   define shell_re
0a80: 61 64 5f 68 69 73 74 6f 72 79 28 58 29 20 72 65  ad_history(X) re
0a90: 61 64 5f 68 69 73 74 6f 72 79 28 58 29 0a 23 20  ad_history(X).# 
0aa0: 64 65 66 69 6e 65 20 73 68 65 6c 6c 5f 77 72 69  define shell_wri
0ab0: 74 65 5f 68 69 73 74 6f 72 79 28 58 29 20 77 72  te_history(X) wr
0ac0: 69 74 65 5f 68 69 73 74 6f 72 79 28 58 29 0a 23  ite_history(X).#
0ad0: 20 64 65 66 69 6e 65 20 73 68 65 6c 6c 5f 73 74   define shell_st
0ae0: 69 66 6c 65 5f 68 69 73 74 6f 72 79 28 58 29 20  ifle_history(X) 
0af0: 73 74 69 66 6c 65 5f 68 69 73 74 6f 72 79 28 58  stifle_history(X
0b00: 29 0a 23 20 64 65 66 69 6e 65 20 73 68 65 6c 6c  ).# define shell
0b10: 5f 72 65 61 64 6c 69 6e 65 28 58 29 20 72 65 61  _readline(X) rea
0b20: 64 6c 69 6e 65 28 58 29 0a 0a 23 65 6c 69 66 20  dline(X)..#elif 
0b30: 48 41 56 45 5f 4c 49 4e 45 4e 4f 49 53 45 0a 0a  HAVE_LINENOISE..
0b40: 23 20 69 6e 63 6c 75 64 65 20 22 6c 69 6e 65 6e  # include "linen
0b50: 6f 69 73 65 2e 68 22 0a 23 20 64 65 66 69 6e 65  oise.h".# define
0b60: 20 73 68 65 6c 6c 5f 61 64 64 5f 68 69 73 74 6f   shell_add_histo
0b70: 72 79 28 58 29 20 6c 69 6e 65 6e 6f 69 73 65 48  ry(X) linenoiseH
0b80: 69 73 74 6f 72 79 41 64 64 28 58 29 0a 23 20 64  istoryAdd(X).# d
0b90: 65 66 69 6e 65 20 73 68 65 6c 6c 5f 72 65 61 64  efine shell_read
0ba0: 5f 68 69 73 74 6f 72 79 28 58 29 20 6c 69 6e 65  _history(X) line
0bb0: 6e 6f 69 73 65 48 69 73 74 6f 72 79 4c 6f 61 64  noiseHistoryLoad
0bc0: 28 58 29 0a 23 20 64 65 66 69 6e 65 20 73 68 65  (X).# define she
0bd0: 6c 6c 5f 77 72 69 74 65 5f 68 69 73 74 6f 72 79  ll_write_history
0be0: 28 58 29 20 6c 69 6e 65 6e 6f 69 73 65 48 69 73  (X) linenoiseHis
0bf0: 74 6f 72 79 53 61 76 65 28 58 29 0a 23 20 64 65  torySave(X).# de
0c00: 66 69 6e 65 20 73 68 65 6c 6c 5f 73 74 69 66 6c  fine shell_stifl
0c10: 65 5f 68 69 73 74 6f 72 79 28 58 29 20 6c 69 6e  e_history(X) lin
0c20: 65 6e 6f 69 73 65 48 69 73 74 6f 72 79 53 65 74  enoiseHistorySet
0c30: 4d 61 78 4c 65 6e 28 58 29 0a 23 20 64 65 66 69  MaxLen(X).# defi
0c40: 6e 65 20 73 68 65 6c 6c 5f 72 65 61 64 6c 69 6e  ne shell_readlin
0c50: 65 28 58 29 20 6c 69 6e 65 6e 6f 69 73 65 28 58  e(X) linenoise(X
0c60: 29 0a 0a 23 65 6c 73 65 0a 0a 23 20 64 65 66 69  )..#else..# defi
0c70: 6e 65 20 73 68 65 6c 6c 5f 72 65 61 64 5f 68 69  ne shell_read_hi
0c80: 73 74 6f 72 79 28 58 29 0a 23 20 64 65 66 69 6e  story(X).# defin
0c90: 65 20 73 68 65 6c 6c 5f 77 72 69 74 65 5f 68 69  e shell_write_hi
0ca0: 73 74 6f 72 79 28 58 29 0a 23 20 64 65 66 69 6e  story(X).# defin
0cb0: 65 20 73 68 65 6c 6c 5f 73 74 69 66 6c 65 5f 68  e shell_stifle_h
0cc0: 69 73 74 6f 72 79 28 58 29 0a 0a 23 20 64 65 66  istory(X)..# def
0cd0: 69 6e 65 20 53 48 45 4c 4c 5f 55 53 45 5f 4c 4f  ine SHELL_USE_LO
0ce0: 43 41 4c 5f 47 45 54 4c 49 4e 45 20 31 0a 23 65  CAL_GETLINE 1.#e
0cf0: 6e 64 69 66 0a 0a 0a 23 69 66 20 64 65 66 69 6e  ndif...#if defin
0d00: 65 64 28 5f 57 49 4e 33 32 29 20 7c 7c 20 64 65  ed(_WIN32) || de
0d10: 66 69 6e 65 64 28 57 49 4e 33 32 29 0a 23 20 69  fined(WIN32).# i
0d20: 6e 63 6c 75 64 65 20 3c 69 6f 2e 68 3e 0a 23 20  nclude <io.h>.# 
0d30: 69 6e 63 6c 75 64 65 20 3c 66 63 6e 74 6c 2e 68  include <fcntl.h
0d40: 3e 0a 23 20 64 65 66 69 6e 65 20 69 73 61 74 74  >.# define isatt
0d50: 79 28 68 29 20 5f 69 73 61 74 74 79 28 68 29 0a  y(h) _isatty(h).
0d60: 23 20 69 66 6e 64 65 66 20 61 63 63 65 73 73 0a  # ifndef access.
0d70: 23 20 20 64 65 66 69 6e 65 20 61 63 63 65 73 73  #  define access
0d80: 28 66 2c 6d 29 20 5f 61 63 63 65 73 73 28 28 66  (f,m) _access((f
0d90: 29 2c 28 6d 29 29 0a 23 20 65 6e 64 69 66 0a 23  ),(m)).# endif.#
0da0: 20 69 66 6e 64 65 66 20 75 6e 6c 69 6e 6b 0a 23   ifndef unlink.#
0db0: 20 20 64 65 66 69 6e 65 20 75 6e 6c 69 6e 6b 20    define unlink 
0dc0: 5f 75 6e 6c 69 6e 6b 0a 23 20 65 6e 64 69 66 0a  _unlink.# endif.
0dd0: 23 20 69 66 6e 64 65 66 20 73 74 72 64 75 70 0a  # ifndef strdup.
0de0: 23 20 20 64 65 66 69 6e 65 20 73 74 72 64 75 70  #  define strdup
0df0: 20 5f 73 74 72 64 75 70 0a 23 20 65 6e 64 69 66   _strdup.# endif
0e00: 0a 23 20 75 6e 64 65 66 20 70 6f 70 65 6e 0a 23  .# undef popen.#
0e10: 20 64 65 66 69 6e 65 20 70 6f 70 65 6e 20 5f 70   define popen _p
0e20: 6f 70 65 6e 0a 23 20 75 6e 64 65 66 20 70 63 6c  open.# undef pcl
0e30: 6f 73 65 0a 23 20 64 65 66 69 6e 65 20 70 63 6c  ose.# define pcl
0e40: 6f 73 65 20 5f 70 63 6c 6f 73 65 0a 23 65 6c 73  ose _pclose.#els
0e50: 65 0a 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20  e. /* Make sure 
0e60: 69 73 61 74 74 79 28 29 20 68 61 73 20 61 20 70  isatty() has a p
0e70: 72 6f 74 6f 74 79 70 65 2e 20 2a 2f 0a 20 65 78  rototype. */. ex
0e80: 74 65 72 6e 20 69 6e 74 20 69 73 61 74 74 79 28  tern int isatty(
0e90: 69 6e 74 29 3b 0a 0a 23 20 69 66 20 21 64 65 66  int);..# if !def
0ea0: 69 6e 65 64 28 5f 5f 52 54 50 5f 5f 29 20 26 26  ined(__RTP__) &&
0eb0: 20 21 64 65 66 69 6e 65 64 28 5f 57 52 53 5f 4b   !defined(_WRS_K
0ec0: 45 52 4e 45 4c 29 0a 20 20 2f 2a 20 70 6f 70 65  ERNEL).  /* pope
0ed0: 6e 20 61 6e 64 20 70 63 6c 6f 73 65 20 61 72 65  n and pclose are
0ee0: 20 6e 6f 74 20 43 38 39 20 66 75 6e 63 74 69 6f   not C89 functio
0ef0: 6e 73 20 61 6e 64 20 73 6f 20 61 72 65 0a 20 20  ns and so are.  
0f00: 2a 2a 20 73 6f 6d 65 74 69 6d 65 73 20 6f 6d 69  ** sometimes omi
0f10: 74 74 65 64 20 66 72 6f 6d 20 74 68 65 20 3c 73  tted from the <s
0f20: 74 64 69 6f 2e 68 3e 20 68 65 61 64 65 72 20 2a  tdio.h> header *
0f30: 2f 0a 20 20 20 65 78 74 65 72 6e 20 46 49 4c 45  /.   extern FILE
0f40: 20 2a 70 6f 70 65 6e 28 63 6f 6e 73 74 20 63 68   *popen(const ch
0f50: 61 72 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29  ar*,const char*)
0f60: 3b 0a 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20  ;.   extern int 
0f70: 70 63 6c 6f 73 65 28 46 49 4c 45 2a 29 3b 0a 23  pclose(FILE*);.#
0f80: 20 65 6c 73 65 0a 23 20 20 64 65 66 69 6e 65 20   else.#  define 
0f90: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 4f 50 45  SQLITE_OMIT_POPE
0fa0: 4e 20 31 0a 23 20 65 6e 64 69 66 0a 23 65 6e 64  N 1.# endif.#end
0fb0: 69 66 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  if..#if defined(
0fc0: 5f 57 49 4e 33 32 5f 57 43 45 29 0a 2f 2a 20 57  _WIN32_WCE)./* W
0fd0: 69 6e 64 6f 77 73 20 43 45 20 28 61 72 6d 2d 77  indows CE (arm-w
0fe0: 69 6e 63 65 2d 6d 69 6e 67 77 33 32 63 65 2d 67  ince-mingw32ce-g
0ff0: 63 63 29 20 64 6f 65 73 20 6e 6f 74 20 70 72 6f  cc) does not pro
1000: 76 69 64 65 20 69 73 61 74 74 79 28 29 0a 20 2a  vide isatty(). *
1010: 20 74 68 75 73 20 77 65 20 61 6c 77 61 79 73 20   thus we always 
1020: 61 73 73 75 6d 65 20 74 68 61 74 20 77 65 20 68  assume that we h
1030: 61 76 65 20 61 20 63 6f 6e 73 6f 6c 65 2e 20 54  ave a console. T
1040: 68 61 74 20 63 61 6e 20 62 65 0a 20 2a 20 6f 76  hat can be. * ov
1050: 65 72 72 69 64 64 65 6e 20 77 69 74 68 20 74 68  erridden with th
1060: 65 20 2d 62 61 74 63 68 20 63 6f 6d 6d 61 6e 64  e -batch command
1070: 20 6c 69 6e 65 20 6f 70 74 69 6f 6e 2e 0a 20 2a   line option.. *
1080: 2f 0a 23 64 65 66 69 6e 65 20 69 73 61 74 74 79  /.#define isatty
1090: 28 78 29 20 31 0a 23 65 6e 64 69 66 0a 0a 2f 2a  (x) 1.#endif../*
10a0: 20 63 74 79 70 65 20 6d 61 63 72 6f 73 20 74 68   ctype macros th
10b0: 61 74 20 77 6f 72 6b 20 77 69 74 68 20 73 69 67  at work with sig
10c0: 6e 65 64 20 63 68 61 72 61 63 74 65 72 73 20 2a  ned characters *
10d0: 2f 0a 23 64 65 66 69 6e 65 20 49 73 53 70 61 63  /.#define IsSpac
10e0: 65 28 58 29 20 20 69 73 73 70 61 63 65 28 28 75  e(X)  isspace((u
10f0: 6e 73 69 67 6e 65 64 20 63 68 61 72 29 58 29 0a  nsigned char)X).
1100: 23 64 65 66 69 6e 65 20 49 73 44 69 67 69 74 28  #define IsDigit(
1110: 58 29 20 20 69 73 64 69 67 69 74 28 28 75 6e 73  X)  isdigit((uns
1120: 69 67 6e 65 64 20 63 68 61 72 29 58 29 0a 23 64  igned char)X).#d
1130: 65 66 69 6e 65 20 54 6f 4c 6f 77 65 72 28 58 29  efine ToLower(X)
1140: 20 20 28 63 68 61 72 29 74 6f 6c 6f 77 65 72 28    (char)tolower(
1150: 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 29 58  (unsigned char)X
1160: 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f  )..#if defined(_
1170: 57 49 4e 33 32 29 20 7c 7c 20 64 65 66 69 6e 65  WIN32) || define
1180: 64 28 57 49 4e 33 32 29 0a 23 69 6e 63 6c 75 64  d(WIN32).#includ
1190: 65 20 3c 77 69 6e 64 6f 77 73 2e 68 3e 0a 0a 2f  e <windows.h>../
11a0: 2a 20 73 74 72 69 6e 67 20 63 6f 6e 76 65 72 73  * string convers
11b0: 69 6f 6e 20 72 6f 75 74 69 6e 65 73 20 6f 6e 6c  ion routines onl
11c0: 79 20 6e 65 65 64 65 64 20 6f 6e 20 57 69 6e 33  y needed on Win3
11d0: 32 20 2a 2f 0a 65 78 74 65 72 6e 20 63 68 61 72  2 */.extern char
11e0: 20 2a 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f   *sqlite3_win32_
11f0: 75 6e 69 63 6f 64 65 5f 74 6f 5f 75 74 66 38 28  unicode_to_utf8(
1200: 4c 50 43 57 53 54 52 29 3b 0a 65 78 74 65 72 6e  LPCWSTR);.extern
1210: 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 77   char *sqlite3_w
1220: 69 6e 33 32 5f 6d 62 63 73 5f 74 6f 5f 75 74 66  in32_mbcs_to_utf
1230: 38 5f 76 32 28 63 6f 6e 73 74 20 63 68 61 72 20  8_v2(const char 
1240: 2a 2c 20 69 6e 74 29 3b 0a 65 78 74 65 72 6e 20  *, int);.extern 
1250: 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 77 69  char *sqlite3_wi
1260: 6e 33 32 5f 75 74 66 38 5f 74 6f 5f 6d 62 63 73  n32_utf8_to_mbcs
1270: 5f 76 32 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  _v2(const char *
1280: 2c 20 69 6e 74 29 3b 0a 65 78 74 65 72 6e 20 4c  , int);.extern L
1290: 50 57 53 54 52 20 73 71 6c 69 74 65 33 5f 77 69  PWSTR sqlite3_wi
12a0: 6e 33 32 5f 75 74 66 38 5f 74 6f 5f 75 6e 69 63  n32_utf8_to_unic
12b0: 6f 64 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  ode(const char *
12c0: 7a 54 65 78 74 29 3b 0a 23 65 6e 64 69 66 0a 0a  zText);.#endif..
12d0: 2f 2a 20 4f 6e 20 57 69 6e 64 6f 77 73 2c 20 77  /* On Windows, w
12e0: 65 20 6e 6f 72 6d 61 6c 6c 79 20 72 75 6e 20 77  e normally run w
12f0: 69 74 68 20 6f 75 74 70 75 74 20 6d 6f 64 65 20  ith output mode 
1300: 6f 66 20 54 45 58 54 20 73 6f 20 74 68 61 74 20  of TEXT so that 
1310: 5c 6e 20 63 68 61 72 61 63 74 65 72 73 0a 2a 2a  \n characters.**
1320: 20 61 72 65 20 61 75 74 6f 6d 61 74 69 63 61 6c   are automatical
1330: 6c 79 20 74 72 61 6e 73 6c 61 74 65 64 20 69 6e  ly translated in
1340: 74 6f 20 5c 72 5c 6e 2e 20 20 48 6f 77 65 76 65  to \r\n.  Howeve
1350: 72 2c 20 74 68 69 73 20 62 65 68 61 76 69 6f 72  r, this behavior
1360: 20 6e 65 65 64 73 0a 2a 2a 20 74 6f 20 62 65 20   needs.** to be 
1370: 64 69 73 61 62 6c 65 64 20 69 6e 20 73 6f 6d 65  disabled in some
1380: 20 63 61 73 65 73 20 28 65 78 3a 20 77 68 65 6e   cases (ex: when
1390: 20 67 65 6e 65 72 61 74 69 6e 67 20 43 53 56 20   generating CSV 
13a0: 6f 75 74 70 75 74 20 61 6e 64 20 77 68 65 6e 0a  output and when.
13b0: 2a 2a 20 72 65 6e 64 65 72 69 6e 67 20 71 75 6f  ** rendering quo
13c0: 74 65 64 20 73 74 72 69 6e 67 73 20 74 68 61 74  ted strings that
13d0: 20 63 6f 6e 74 61 69 6e 20 5c 6e 20 63 68 61 72   contain \n char
13e0: 61 63 74 65 72 73 29 2e 20 20 54 68 65 20 66 6f  acters).  The fo
13f0: 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 72 6f 75 74 69  llowing.** routi
1400: 6e 65 73 20 74 61 6b 65 20 63 61 72 65 20 6f 66  nes take care of
1410: 20 74 68 61 74 2e 0a 2a 2f 0a 23 69 66 20 64 65   that..*/.#if de
1420: 66 69 6e 65 64 28 5f 57 49 4e 33 32 29 20 7c 7c  fined(_WIN32) ||
1430: 20 64 65 66 69 6e 65 64 28 57 49 4e 33 32 29 0a   defined(WIN32).
1440: 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 74 42  static void setB
1450: 69 6e 61 72 79 4d 6f 64 65 28 46 49 4c 45 20 2a  inaryMode(FILE *
1460: 66 69 6c 65 2c 20 69 6e 74 20 69 73 4f 75 74 70  file, int isOutp
1470: 75 74 29 7b 0a 20 20 69 66 28 20 69 73 4f 75 74  ut){.  if( isOut
1480: 70 75 74 20 29 20 66 66 6c 75 73 68 28 66 69 6c  put ) fflush(fil
1490: 65 29 3b 0a 20 20 5f 73 65 74 6d 6f 64 65 28 5f  e);.  _setmode(_
14a0: 66 69 6c 65 6e 6f 28 66 69 6c 65 29 2c 20 5f 4f  fileno(file), _O
14b0: 5f 42 49 4e 41 52 59 29 3b 0a 7d 0a 73 74 61 74  _BINARY);.}.stat
14c0: 69 63 20 76 6f 69 64 20 73 65 74 54 65 78 74 4d  ic void setTextM
14d0: 6f 64 65 28 46 49 4c 45 20 2a 66 69 6c 65 2c 20  ode(FILE *file, 
14e0: 69 6e 74 20 69 73 4f 75 74 70 75 74 29 7b 0a 20  int isOutput){. 
14f0: 20 69 66 28 20 69 73 4f 75 74 70 75 74 20 29 20   if( isOutput ) 
1500: 66 66 6c 75 73 68 28 66 69 6c 65 29 3b 0a 20 20  fflush(file);.  
1510: 5f 73 65 74 6d 6f 64 65 28 5f 66 69 6c 65 6e 6f  _setmode(_fileno
1520: 28 66 69 6c 65 29 2c 20 5f 4f 5f 54 45 58 54 29  (file), _O_TEXT)
1530: 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  ;.}.#else.# defi
1540: 6e 65 20 73 65 74 42 69 6e 61 72 79 4d 6f 64 65  ne setBinaryMode
1550: 28 58 2c 59 29 0a 23 20 64 65 66 69 6e 65 20 73  (X,Y).# define s
1560: 65 74 54 65 78 74 4d 6f 64 65 28 58 2c 59 29 0a  etTextMode(X,Y).
1570: 23 65 6e 64 69 66 0a 0a 0a 2f 2a 20 54 72 75 65  #endif.../* True
1580: 20 69 66 20 74 68 65 20 74 69 6d 65 72 20 69 73   if the timer is
1590: 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 73 74 61 74   enabled */.stat
15a0: 69 63 20 69 6e 74 20 65 6e 61 62 6c 65 54 69 6d  ic int enableTim
15b0: 65 72 20 3d 20 30 3b 0a 0a 2f 2a 20 52 65 74 75  er = 0;../* Retu
15c0: 72 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 77  rn the current w
15d0: 61 6c 6c 2d 63 6c 6f 63 6b 20 74 69 6d 65 20 2a  all-clock time *
15e0: 2f 0a 73 74 61 74 69 63 20 73 71 6c 69 74 65 33  /.static sqlite3
15f0: 5f 69 6e 74 36 34 20 74 69 6d 65 4f 66 44 61 79  _int64 timeOfDay
1600: 28 76 6f 69 64 29 7b 0a 20 20 73 74 61 74 69 63  (void){.  static
1610: 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 63 6c   sqlite3_vfs *cl
1620: 6f 63 6b 56 66 73 20 3d 20 30 3b 0a 20 20 73 71  ockVfs = 0;.  sq
1630: 6c 69 74 65 33 5f 69 6e 74 36 34 20 74 3b 0a 20  lite3_int64 t;. 
1640: 20 69 66 28 20 63 6c 6f 63 6b 56 66 73 3d 3d 30   if( clockVfs==0
1650: 20 29 20 63 6c 6f 63 6b 56 66 73 20 3d 20 73 71   ) clockVfs = sq
1660: 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 30  lite3_vfs_find(0
1670: 29 3b 0a 20 20 69 66 28 20 63 6c 6f 63 6b 56 66  );.  if( clockVf
1680: 73 2d 3e 69 56 65 72 73 69 6f 6e 3e 3d 32 20 26  s->iVersion>=2 &
1690: 26 20 63 6c 6f 63 6b 56 66 73 2d 3e 78 43 75 72  & clockVfs->xCur
16a0: 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 21 3d 30  rentTimeInt64!=0
16b0: 20 29 7b 0a 20 20 20 20 63 6c 6f 63 6b 56 66 73   ){.    clockVfs
16c0: 2d 3e 78 43 75 72 72 65 6e 74 54 69 6d 65 49 6e  ->xCurrentTimeIn
16d0: 74 36 34 28 63 6c 6f 63 6b 56 66 73 2c 20 26 74  t64(clockVfs, &t
16e0: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
16f0: 64 6f 75 62 6c 65 20 72 3b 0a 20 20 20 20 63 6c  double r;.    cl
1700: 6f 63 6b 56 66 73 2d 3e 78 43 75 72 72 65 6e 74  ockVfs->xCurrent
1710: 54 69 6d 65 28 63 6c 6f 63 6b 56 66 73 2c 20 26  Time(clockVfs, &
1720: 72 29 3b 0a 20 20 20 20 74 20 3d 20 28 73 71 6c  r);.    t = (sql
1730: 69 74 65 33 5f 69 6e 74 36 34 29 28 72 2a 38 36  ite3_int64)(r*86
1740: 34 30 30 30 30 30 2e 30 29 3b 0a 20 20 7d 0a 20  400000.0);.  }. 
1750: 20 72 65 74 75 72 6e 20 74 3b 0a 7d 0a 0a 23 69   return t;.}..#i
1760: 66 20 21 64 65 66 69 6e 65 64 28 5f 57 49 4e 33  f !defined(_WIN3
1770: 32 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 57  2) && !defined(W
1780: 49 4e 33 32 29 20 26 26 20 21 64 65 66 69 6e 65  IN32) && !define
1790: 64 28 5f 5f 6d 69 6e 75 78 29 0a 23 69 6e 63 6c  d(__minux).#incl
17a0: 75 64 65 20 3c 73 79 73 2f 74 69 6d 65 2e 68 3e  ude <sys/time.h>
17b0: 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 72  .#include <sys/r
17c0: 65 73 6f 75 72 63 65 2e 68 3e 0a 0a 2f 2a 20 56  esource.h>../* V
17d0: 78 57 6f 72 6b 73 20 64 6f 65 73 20 6e 6f 74 20  xWorks does not 
17e0: 73 75 70 70 6f 72 74 20 67 65 74 72 75 73 61 67  support getrusag
17f0: 65 28 29 20 61 73 20 66 61 72 20 61 73 20 77 65  e() as far as we
1800: 20 63 61 6e 20 64 65 74 65 72 6d 69 6e 65 20 2a   can determine *
1810: 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 57  /.#if defined(_W
1820: 52 53 5f 4b 45 52 4e 45 4c 29 20 7c 7c 20 64 65  RS_KERNEL) || de
1830: 66 69 6e 65 64 28 5f 5f 52 54 50 5f 5f 29 0a 73  fined(__RTP__).s
1840: 74 72 75 63 74 20 72 75 73 61 67 65 20 7b 0a 20  truct rusage {. 
1850: 20 73 74 72 75 63 74 20 74 69 6d 65 76 61 6c 20   struct timeval 
1860: 72 75 5f 75 74 69 6d 65 3b 20 2f 2a 20 75 73 65  ru_utime; /* use
1870: 72 20 43 50 55 20 74 69 6d 65 20 75 73 65 64 20  r CPU time used 
1880: 2a 2f 0a 20 20 73 74 72 75 63 74 20 74 69 6d 65  */.  struct time
1890: 76 61 6c 20 72 75 5f 73 74 69 6d 65 3b 20 2f 2a  val ru_stime; /*
18a0: 20 73 79 73 74 65 6d 20 43 50 55 20 74 69 6d 65   system CPU time
18b0: 20 75 73 65 64 20 2a 2f 0a 7d 3b 0a 23 64 65 66   used */.};.#def
18c0: 69 6e 65 20 67 65 74 72 75 73 61 67 65 28 41 2c  ine getrusage(A,
18d0: 42 29 20 6d 65 6d 73 65 74 28 42 2c 30 2c 73 69  B) memset(B,0,si
18e0: 7a 65 6f 66 28 2a 42 29 29 0a 23 65 6e 64 69 66  zeof(*B)).#endif
18f0: 0a 0a 2f 2a 20 53 61 76 65 64 20 72 65 73 6f 75  ../* Saved resou
1900: 72 63 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  rce information 
1910: 66 6f 72 20 74 68 65 20 62 65 67 69 6e 6e 69 6e  for the beginnin
1920: 67 20 6f 66 20 61 6e 20 6f 70 65 72 61 74 69 6f  g of an operatio
1930: 6e 20 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75  n */.static stru
1940: 63 74 20 72 75 73 61 67 65 20 73 42 65 67 69 6e  ct rusage sBegin
1950: 3b 20 20 2f 2a 20 43 50 55 20 74 69 6d 65 20 61  ;  /* CPU time a
1960: 74 20 73 74 61 72 74 20 2a 2f 0a 73 74 61 74 69  t start */.stati
1970: 63 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20  c sqlite3_int64 
1980: 69 42 65 67 69 6e 3b 20 20 2f 2a 20 57 61 6c 6c  iBegin;  /* Wall
1990: 2d 63 6c 6f 63 6b 20 74 69 6d 65 20 61 74 20 73  -clock time at s
19a0: 74 61 72 74 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 42  tart */../*.** B
19b0: 65 67 69 6e 20 74 69 6d 69 6e 67 20 61 6e 20 6f  egin timing an o
19c0: 70 65 72 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74  peration.*/.stat
19d0: 69 63 20 76 6f 69 64 20 62 65 67 69 6e 54 69 6d  ic void beginTim
19e0: 65 72 28 76 6f 69 64 29 7b 0a 20 20 69 66 28 20  er(void){.  if( 
19f0: 65 6e 61 62 6c 65 54 69 6d 65 72 20 29 7b 0a 20  enableTimer ){. 
1a00: 20 20 20 67 65 74 72 75 73 61 67 65 28 52 55 53     getrusage(RUS
1a10: 41 47 45 5f 53 45 4c 46 2c 20 26 73 42 65 67 69  AGE_SELF, &sBegi
1a20: 6e 29 3b 0a 20 20 20 20 69 42 65 67 69 6e 20 3d  n);.    iBegin =
1a30: 20 74 69 6d 65 4f 66 44 61 79 28 29 3b 0a 20 20   timeOfDay();.  
1a40: 7d 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 74  }.}../* Return t
1a50: 68 65 20 64 69 66 66 65 72 65 6e 63 65 20 6f 66  he difference of
1a60: 20 74 77 6f 20 74 69 6d 65 5f 73 74 72 75 63 74   two time_struct
1a70: 73 20 69 6e 20 73 65 63 6f 6e 64 73 20 2a 2f 0a  s in seconds */.
1a80: 73 74 61 74 69 63 20 64 6f 75 62 6c 65 20 74 69  static double ti
1a90: 6d 65 44 69 66 66 28 73 74 72 75 63 74 20 74 69  meDiff(struct ti
1aa0: 6d 65 76 61 6c 20 2a 70 53 74 61 72 74 2c 20 73  meval *pStart, s
1ab0: 74 72 75 63 74 20 74 69 6d 65 76 61 6c 20 2a 70  truct timeval *p
1ac0: 45 6e 64 29 7b 0a 20 20 72 65 74 75 72 6e 20 28  End){.  return (
1ad0: 70 45 6e 64 2d 3e 74 76 5f 75 73 65 63 20 2d 20  pEnd->tv_usec - 
1ae0: 70 53 74 61 72 74 2d 3e 74 76 5f 75 73 65 63 29  pStart->tv_usec)
1af0: 2a 30 2e 30 30 30 30 30 31 20 2b 0a 20 20 20 20  *0.000001 +.    
1b00: 20 20 20 20 20 28 64 6f 75 62 6c 65 29 28 70 45       (double)(pE
1b10: 6e 64 2d 3e 74 76 5f 73 65 63 20 2d 20 70 53 74  nd->tv_sec - pSt
1b20: 61 72 74 2d 3e 74 76 5f 73 65 63 29 3b 0a 7d 0a  art->tv_sec);.}.
1b30: 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 74 68 65  ./*.** Print the
1b40: 20 74 69 6d 69 6e 67 20 72 65 73 75 6c 74 73 2e   timing results.
1b50: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1b60: 65 6e 64 54 69 6d 65 72 28 76 6f 69 64 29 7b 0a  endTimer(void){.
1b70: 20 20 69 66 28 20 65 6e 61 62 6c 65 54 69 6d 65    if( enableTime
1b80: 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  r ){.    sqlite3
1b90: 5f 69 6e 74 36 34 20 69 45 6e 64 20 3d 20 74 69  _int64 iEnd = ti
1ba0: 6d 65 4f 66 44 61 79 28 29 3b 0a 20 20 20 20 73  meOfDay();.    s
1bb0: 74 72 75 63 74 20 72 75 73 61 67 65 20 73 45 6e  truct rusage sEn
1bc0: 64 3b 0a 20 20 20 20 67 65 74 72 75 73 61 67 65  d;.    getrusage
1bd0: 28 52 55 53 41 47 45 5f 53 45 4c 46 2c 20 26 73  (RUSAGE_SELF, &s
1be0: 45 6e 64 29 3b 0a 20 20 20 20 70 72 69 6e 74 66  End);.    printf
1bf0: 28 22 52 75 6e 20 54 69 6d 65 3a 20 72 65 61 6c  ("Run Time: real
1c00: 20 25 2e 33 66 20 75 73 65 72 20 25 66 20 73 79   %.3f user %f sy
1c10: 73 20 25 66 5c 6e 22 2c 0a 20 20 20 20 20 20 20  s %f\n",.       
1c20: 28 69 45 6e 64 20 2d 20 69 42 65 67 69 6e 29 2a  (iEnd - iBegin)*
1c30: 30 2e 30 30 31 2c 0a 20 20 20 20 20 20 20 74 69  0.001,.       ti
1c40: 6d 65 44 69 66 66 28 26 73 42 65 67 69 6e 2e 72  meDiff(&sBegin.r
1c50: 75 5f 75 74 69 6d 65 2c 20 26 73 45 6e 64 2e 72  u_utime, &sEnd.r
1c60: 75 5f 75 74 69 6d 65 29 2c 0a 20 20 20 20 20 20  u_utime),.      
1c70: 20 74 69 6d 65 44 69 66 66 28 26 73 42 65 67 69   timeDiff(&sBegi
1c80: 6e 2e 72 75 5f 73 74 69 6d 65 2c 20 26 73 45 6e  n.ru_stime, &sEn
1c90: 64 2e 72 75 5f 73 74 69 6d 65 29 29 3b 0a 20 20  d.ru_stime));.  
1ca0: 7d 0a 7d 0a 0a 23 64 65 66 69 6e 65 20 42 45 47  }.}..#define BEG
1cb0: 49 4e 5f 54 49 4d 45 52 20 62 65 67 69 6e 54 69  IN_TIMER beginTi
1cc0: 6d 65 72 28 29 0a 23 64 65 66 69 6e 65 20 45 4e  mer().#define EN
1cd0: 44 5f 54 49 4d 45 52 20 65 6e 64 54 69 6d 65 72  D_TIMER endTimer
1ce0: 28 29 0a 23 64 65 66 69 6e 65 20 48 41 53 5f 54  ().#define HAS_T
1cf0: 49 4d 45 52 20 31 0a 0a 23 65 6c 69 66 20 28 64  IMER 1..#elif (d
1d00: 65 66 69 6e 65 64 28 5f 57 49 4e 33 32 29 20 7c  efined(_WIN32) |
1d10: 7c 20 64 65 66 69 6e 65 64 28 57 49 4e 33 32 29  | defined(WIN32)
1d20: 29 0a 0a 2f 2a 20 53 61 76 65 64 20 72 65 73 6f  )../* Saved reso
1d30: 75 72 63 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  urce information
1d40: 20 66 6f 72 20 74 68 65 20 62 65 67 69 6e 6e 69   for the beginni
1d50: 6e 67 20 6f 66 20 61 6e 20 6f 70 65 72 61 74 69  ng of an operati
1d60: 6f 6e 20 2a 2f 0a 73 74 61 74 69 63 20 48 41 4e  on */.static HAN
1d70: 44 4c 45 20 68 50 72 6f 63 65 73 73 3b 0a 73 74  DLE hProcess;.st
1d80: 61 74 69 63 20 46 49 4c 45 54 49 4d 45 20 66 74  atic FILETIME ft
1d90: 4b 65 72 6e 65 6c 42 65 67 69 6e 3b 0a 73 74 61  KernelBegin;.sta
1da0: 74 69 63 20 46 49 4c 45 54 49 4d 45 20 66 74 55  tic FILETIME ftU
1db0: 73 65 72 42 65 67 69 6e 3b 0a 73 74 61 74 69 63  serBegin;.static
1dc0: 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 66   sqlite3_int64 f
1dd0: 74 57 61 6c 6c 42 65 67 69 6e 3b 0a 74 79 70 65  tWallBegin;.type
1de0: 64 65 66 20 42 4f 4f 4c 20 28 57 49 4e 41 50 49  def BOOL (WINAPI
1df0: 20 2a 47 45 54 50 52 4f 43 54 49 4d 45 53 29 28   *GETPROCTIMES)(
1e00: 48 41 4e 44 4c 45 2c 20 4c 50 46 49 4c 45 54 49  HANDLE, LPFILETI
1e10: 4d 45 2c 20 4c 50 46 49 4c 45 54 49 4d 45 2c 0a  ME, LPFILETIME,.
1e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e40: 20 20 20 20 4c 50 46 49 4c 45 54 49 4d 45 2c 20      LPFILETIME, 
1e50: 4c 50 46 49 4c 45 54 49 4d 45 29 3b 0a 73 74 61  LPFILETIME);.sta
1e60: 74 69 63 20 47 45 54 50 52 4f 43 54 49 4d 45 53  tic GETPROCTIMES
1e70: 20 67 65 74 50 72 6f 63 65 73 73 54 69 6d 65 73   getProcessTimes
1e80: 41 64 64 72 20 3d 20 4e 55 4c 4c 3b 0a 0a 2f 2a  Addr = NULL;../*
1e90: 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65  .** Check to see
1ea0: 20 69 66 20 77 65 20 68 61 76 65 20 74 69 6d 65   if we have time
1eb0: 72 20 73 75 70 70 6f 72 74 2e 20 20 52 65 74 75  r support.  Retu
1ec0: 72 6e 20 31 20 69 66 20 6e 65 63 65 73 73 61 72  rn 1 if necessar
1ed0: 79 0a 2a 2a 20 73 75 70 70 6f 72 74 20 66 6f 75  y.** support fou
1ee0: 6e 64 20 28 6f 72 20 66 6f 75 6e 64 20 70 72 65  nd (or found pre
1ef0: 76 69 6f 75 73 6c 79 29 2e 0a 2a 2f 0a 73 74 61  viously)..*/.sta
1f00: 74 69 63 20 69 6e 74 20 68 61 73 54 69 6d 65 72  tic int hasTimer
1f10: 28 76 6f 69 64 29 7b 0a 20 20 69 66 28 20 67 65  (void){.  if( ge
1f20: 74 50 72 6f 63 65 73 73 54 69 6d 65 73 41 64 64  tProcessTimesAdd
1f30: 72 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  r ){.    return 
1f40: 31 3b 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20  1;.  } else {.  
1f50: 20 20 2f 2a 20 47 65 74 50 72 6f 63 65 73 73 54    /* GetProcessT
1f60: 69 6d 65 73 28 29 20 69 73 6e 27 74 20 73 75 70  imes() isn't sup
1f70: 70 6f 72 74 65 64 20 69 6e 20 57 49 4e 39 35 20  ported in WIN95 
1f80: 61 6e 64 20 73 6f 6d 65 20 6f 74 68 65 72 20 57  and some other W
1f90: 69 6e 64 6f 77 73 0a 20 20 20 20 2a 2a 20 76 65  indows.    ** ve
1fa0: 72 73 69 6f 6e 73 2e 20 53 65 65 20 69 66 20 74  rsions. See if t
1fb0: 68 65 20 76 65 72 73 69 6f 6e 20 77 65 20 61 72  he version we ar
1fc0: 65 20 72 75 6e 6e 69 6e 67 20 6f 6e 20 68 61 73  e running on has
1fd0: 20 69 74 2c 20 61 6e 64 20 69 66 20 69 74 0a 20   it, and if it. 
1fe0: 20 20 20 2a 2a 20 64 6f 65 73 2c 20 73 61 76 65     ** does, save
1ff0: 20 6f 66 66 20 61 20 70 6f 69 6e 74 65 72 20 74   off a pointer t
2000: 6f 20 69 74 20 61 6e 64 20 74 68 65 20 63 75 72  o it and the cur
2010: 72 65 6e 74 20 70 72 6f 63 65 73 73 20 68 61 6e  rent process han
2020: 64 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  dle..    */.    
2030: 68 50 72 6f 63 65 73 73 20 3d 20 47 65 74 43 75  hProcess = GetCu
2040: 72 72 65 6e 74 50 72 6f 63 65 73 73 28 29 3b 0a  rrentProcess();.
2050: 20 20 20 20 69 66 28 20 68 50 72 6f 63 65 73 73      if( hProcess
2060: 20 29 7b 0a 20 20 20 20 20 20 48 49 4e 53 54 41   ){.      HINSTA
2070: 4e 43 45 20 68 69 6e 73 74 4c 69 62 20 3d 20 4c  NCE hinstLib = L
2080: 6f 61 64 4c 69 62 72 61 72 79 28 54 45 58 54 28  oadLibrary(TEXT(
2090: 22 4b 65 72 6e 65 6c 33 32 2e 64 6c 6c 22 29 29  "Kernel32.dll"))
20a0: 3b 0a 20 20 20 20 20 20 69 66 28 20 4e 55 4c 4c  ;.      if( NULL
20b0: 20 21 3d 20 68 69 6e 73 74 4c 69 62 20 29 7b 0a   != hinstLib ){.
20c0: 20 20 20 20 20 20 20 20 67 65 74 50 72 6f 63 65          getProce
20d0: 73 73 54 69 6d 65 73 41 64 64 72 20 3d 0a 20 20  ssTimesAddr =.  
20e0: 20 20 20 20 20 20 20 20 20 20 28 47 45 54 50 52            (GETPR
20f0: 4f 43 54 49 4d 45 53 29 20 47 65 74 50 72 6f 63  OCTIMES) GetProc
2100: 41 64 64 72 65 73 73 28 68 69 6e 73 74 4c 69 62  Address(hinstLib
2110: 2c 20 22 47 65 74 50 72 6f 63 65 73 73 54 69 6d  , "GetProcessTim
2120: 65 73 22 29 3b 0a 20 20 20 20 20 20 20 20 69 66  es");.        if
2130: 28 20 4e 55 4c 4c 20 21 3d 20 67 65 74 50 72 6f  ( NULL != getPro
2140: 63 65 73 73 54 69 6d 65 73 41 64 64 72 20 29 7b  cessTimesAddr ){
2150: 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
2160: 6e 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  n 1;.        }. 
2170: 20 20 20 20 20 20 20 46 72 65 65 4c 69 62 72 61         FreeLibra
2180: 72 79 28 68 69 6e 73 74 4c 69 62 29 3b 0a 20 20  ry(hinstLib);.  
2190: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
21a0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
21b0: 2a 0a 2a 2a 20 42 65 67 69 6e 20 74 69 6d 69 6e  *.** Begin timin
21c0: 67 20 61 6e 20 6f 70 65 72 61 74 69 6f 6e 0a 2a  g an operation.*
21d0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62 65  /.static void be
21e0: 67 69 6e 54 69 6d 65 72 28 76 6f 69 64 29 7b 0a  ginTimer(void){.
21f0: 20 20 69 66 28 20 65 6e 61 62 6c 65 54 69 6d 65    if( enableTime
2200: 72 20 26 26 20 67 65 74 50 72 6f 63 65 73 73 54  r && getProcessT
2210: 69 6d 65 73 41 64 64 72 20 29 7b 0a 20 20 20 20  imesAddr ){.    
2220: 46 49 4c 45 54 49 4d 45 20 66 74 43 72 65 61 74  FILETIME ftCreat
2230: 69 6f 6e 2c 20 66 74 45 78 69 74 3b 0a 20 20 20  ion, ftExit;.   
2240: 20 67 65 74 50 72 6f 63 65 73 73 54 69 6d 65 73   getProcessTimes
2250: 41 64 64 72 28 68 50 72 6f 63 65 73 73 2c 26 66  Addr(hProcess,&f
2260: 74 43 72 65 61 74 69 6f 6e 2c 26 66 74 45 78 69  tCreation,&ftExi
2270: 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t,.             
2280: 20 20 20 20 20 20 20 20 20 20 20 26 66 74 4b 65             &ftKe
2290: 72 6e 65 6c 42 65 67 69 6e 2c 26 66 74 55 73 65  rnelBegin,&ftUse
22a0: 72 42 65 67 69 6e 29 3b 0a 20 20 20 20 66 74 57  rBegin);.    ftW
22b0: 61 6c 6c 42 65 67 69 6e 20 3d 20 74 69 6d 65 4f  allBegin = timeO
22c0: 66 44 61 79 28 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  fDay();.  }.}../
22d0: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 64 69 66  * Return the dif
22e0: 66 65 72 65 6e 63 65 20 6f 66 20 74 77 6f 20 46  ference of two F
22f0: 49 4c 45 54 49 4d 45 20 73 74 72 75 63 74 73 20  ILETIME structs 
2300: 69 6e 20 73 65 63 6f 6e 64 73 20 2a 2f 0a 73 74  in seconds */.st
2310: 61 74 69 63 20 64 6f 75 62 6c 65 20 74 69 6d 65  atic double time
2320: 44 69 66 66 28 46 49 4c 45 54 49 4d 45 20 2a 70  Diff(FILETIME *p
2330: 53 74 61 72 74 2c 20 46 49 4c 45 54 49 4d 45 20  Start, FILETIME 
2340: 2a 70 45 6e 64 29 7b 0a 20 20 73 71 6c 69 74 65  *pEnd){.  sqlite
2350: 5f 69 6e 74 36 34 20 69 36 34 53 74 61 72 74 20  _int64 i64Start 
2360: 3d 20 2a 28 28 73 71 6c 69 74 65 5f 69 6e 74 36  = *((sqlite_int6
2370: 34 20 2a 29 20 70 53 74 61 72 74 29 3b 0a 20 20  4 *) pStart);.  
2380: 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 69 36 34  sqlite_int64 i64
2390: 45 6e 64 20 3d 20 2a 28 28 73 71 6c 69 74 65 5f  End = *((sqlite_
23a0: 69 6e 74 36 34 20 2a 29 20 70 45 6e 64 29 3b 0a  int64 *) pEnd);.
23b0: 20 20 72 65 74 75 72 6e 20 28 64 6f 75 62 6c 65    return (double
23c0: 29 20 28 28 69 36 34 45 6e 64 20 2d 20 69 36 34  ) ((i64End - i64
23d0: 53 74 61 72 74 29 20 2f 20 31 30 30 30 30 30 30  Start) / 1000000
23e0: 30 2e 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  0.0);.}../*.** P
23f0: 72 69 6e 74 20 74 68 65 20 74 69 6d 69 6e 67 20  rint the timing 
2400: 72 65 73 75 6c 74 73 2e 0a 2a 2f 0a 73 74 61 74  results..*/.stat
2410: 69 63 20 76 6f 69 64 20 65 6e 64 54 69 6d 65 72  ic void endTimer
2420: 28 76 6f 69 64 29 7b 0a 20 20 69 66 28 20 65 6e  (void){.  if( en
2430: 61 62 6c 65 54 69 6d 65 72 20 26 26 20 67 65 74  ableTimer && get
2440: 50 72 6f 63 65 73 73 54 69 6d 65 73 41 64 64 72  ProcessTimesAddr
2450: 29 7b 0a 20 20 20 20 46 49 4c 45 54 49 4d 45 20  ){.    FILETIME 
2460: 66 74 43 72 65 61 74 69 6f 6e 2c 20 66 74 45 78  ftCreation, ftEx
2470: 69 74 2c 20 66 74 4b 65 72 6e 65 6c 45 6e 64 2c  it, ftKernelEnd,
2480: 20 66 74 55 73 65 72 45 6e 64 3b 0a 20 20 20 20   ftUserEnd;.    
2490: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 66 74  sqlite3_int64 ft
24a0: 57 61 6c 6c 45 6e 64 20 3d 20 74 69 6d 65 4f 66  WallEnd = timeOf
24b0: 44 61 79 28 29 3b 0a 20 20 20 20 67 65 74 50 72  Day();.    getPr
24c0: 6f 63 65 73 73 54 69 6d 65 73 41 64 64 72 28 68  ocessTimesAddr(h
24d0: 50 72 6f 63 65 73 73 2c 26 66 74 43 72 65 61 74  Process,&ftCreat
24e0: 69 6f 6e 2c 26 66 74 45 78 69 74 2c 26 66 74 4b  ion,&ftExit,&ftK
24f0: 65 72 6e 65 6c 45 6e 64 2c 26 66 74 55 73 65 72  ernelEnd,&ftUser
2500: 45 6e 64 29 3b 0a 20 20 20 20 70 72 69 6e 74 66  End);.    printf
2510: 28 22 52 75 6e 20 54 69 6d 65 3a 20 72 65 61 6c  ("Run Time: real
2520: 20 25 2e 33 66 20 75 73 65 72 20 25 66 20 73 79   %.3f user %f sy
2530: 73 20 25 66 5c 6e 22 2c 0a 20 20 20 20 20 20 20  s %f\n",.       
2540: 28 66 74 57 61 6c 6c 45 6e 64 20 2d 20 66 74 57  (ftWallEnd - ftW
2550: 61 6c 6c 42 65 67 69 6e 29 2a 30 2e 30 30 31 2c  allBegin)*0.001,
2560: 0a 20 20 20 20 20 20 20 74 69 6d 65 44 69 66 66  .       timeDiff
2570: 28 26 66 74 55 73 65 72 42 65 67 69 6e 2c 20 26  (&ftUserBegin, &
2580: 66 74 55 73 65 72 45 6e 64 29 2c 0a 20 20 20 20  ftUserEnd),.    
2590: 20 20 20 74 69 6d 65 44 69 66 66 28 26 66 74 4b     timeDiff(&ftK
25a0: 65 72 6e 65 6c 42 65 67 69 6e 2c 20 26 66 74 4b  ernelBegin, &ftK
25b0: 65 72 6e 65 6c 45 6e 64 29 29 3b 0a 20 20 7d 0a  ernelEnd));.  }.
25c0: 7d 0a 0a 23 64 65 66 69 6e 65 20 42 45 47 49 4e  }..#define BEGIN
25d0: 5f 54 49 4d 45 52 20 62 65 67 69 6e 54 69 6d 65  _TIMER beginTime
25e0: 72 28 29 0a 23 64 65 66 69 6e 65 20 45 4e 44 5f  r().#define END_
25f0: 54 49 4d 45 52 20 65 6e 64 54 69 6d 65 72 28 29  TIMER endTimer()
2600: 0a 23 64 65 66 69 6e 65 20 48 41 53 5f 54 49 4d  .#define HAS_TIM
2610: 45 52 20 68 61 73 54 69 6d 65 72 28 29 0a 0a 23  ER hasTimer()..#
2620: 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 42 45 47  else.#define BEG
2630: 49 4e 5f 54 49 4d 45 52 0a 23 64 65 66 69 6e 65  IN_TIMER.#define
2640: 20 45 4e 44 5f 54 49 4d 45 52 0a 23 64 65 66 69   END_TIMER.#defi
2650: 6e 65 20 48 41 53 5f 54 49 4d 45 52 20 30 0a 23  ne HAS_TIMER 0.#
2660: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 55 73 65  endif../*.** Use
2670: 64 20 74 6f 20 70 72 65 76 65 6e 74 20 77 61 72  d to prevent war
2680: 6e 69 6e 67 73 20 61 62 6f 75 74 20 75 6e 75 73  nings about unus
2690: 65 64 20 70 61 72 61 6d 65 74 65 72 73 0a 2a 2f  ed parameters.*/
26a0: 0a 23 64 65 66 69 6e 65 20 55 4e 55 53 45 44 5f  .#define UNUSED_
26b0: 50 41 52 41 4d 45 54 45 52 28 78 29 20 28 76 6f  PARAMETER(x) (vo
26c0: 69 64 29 28 78 29 0a 0a 2f 2a 0a 2a 2a 20 4e 75  id)(x)../*.** Nu
26d0: 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73  mber of elements
26e0: 20 69 6e 20 61 6e 20 61 72 72 61 79 0a 2a 2f 0a   in an array.*/.
26f0: 23 64 65 66 69 6e 65 20 41 72 72 61 79 53 69 7a  #define ArraySiz
2700: 65 28 58 29 20 20 28 69 6e 74 29 28 73 69 7a 65  e(X)  (int)(size
2710: 6f 66 28 58 29 2f 73 69 7a 65 6f 66 28 58 5b 30  of(X)/sizeof(X[0
2720: 5d 29 29 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68  ]))../*.** If th
2730: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 6c 61 67  e following flag
2740: 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 63 6f   is set, then co
2750: 6d 6d 61 6e 64 20 65 78 65 63 75 74 69 6f 6e 20  mmand execution 
2760: 73 74 6f 70 73 0a 2a 2a 20 61 74 20 61 6e 20 65  stops.** at an e
2770: 72 72 6f 72 20 69 66 20 77 65 20 61 72 65 20 6e  rror if we are n
2780: 6f 74 20 69 6e 74 65 72 61 63 74 69 76 65 2e 0a  ot interactive..
2790: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 61  */.static int ba
27a0: 69 6c 5f 6f 6e 5f 65 72 72 6f 72 20 3d 20 30 3b  il_on_error = 0;
27b0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 72 65 61 74 20 73  ../*.** Threat s
27c0: 74 64 69 6e 20 61 73 20 61 6e 20 69 6e 74 65 72  tdin as an inter
27d0: 61 63 74 69 76 65 20 69 6e 70 75 74 20 69 66 20  active input if 
27e0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61  the following va
27f0: 72 69 61 62 6c 65 0a 2a 2a 20 69 73 20 74 72 75  riable.** is tru
2800: 65 2e 20 20 4f 74 68 65 72 77 69 73 65 2c 20 61  e.  Otherwise, a
2810: 73 73 75 6d 65 20 73 74 64 69 6e 20 69 73 20 63  ssume stdin is c
2820: 6f 6e 6e 65 63 74 65 64 20 74 6f 20 61 20 66 69  onnected to a fi
2830: 6c 65 20 6f 72 20 70 69 70 65 2e 0a 2a 2f 0a 73  le or pipe..*/.s
2840: 74 61 74 69 63 20 69 6e 74 20 73 74 64 69 6e 5f  tatic int stdin_
2850: 69 73 5f 69 6e 74 65 72 61 63 74 69 76 65 20 3d  is_interactive =
2860: 20 31 3b 0a 0a 2f 2a 0a 2a 2a 20 4f 6e 20 57 69   1;../*.** On Wi
2870: 6e 64 6f 77 73 20 73 79 73 74 65 6d 73 20 77 65  ndows systems we
2880: 20 68 61 76 65 20 74 6f 20 6b 6e 6f 77 20 69 66   have to know if
2890: 20 73 74 61 6e 64 61 72 64 20 6f 75 74 70 75 74   standard output
28a0: 20 69 73 20 61 20 63 6f 6e 73 6f 6c 65 0a 2a 2a   is a console.**
28b0: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 74 72 61   in order to tra
28c0: 6e 73 6c 61 74 65 20 55 54 46 2d 38 20 69 6e 74  nslate UTF-8 int
28d0: 6f 20 4d 42 43 53 2e 20 20 54 68 65 20 66 6f 6c  o MBCS.  The fol
28e0: 6c 6f 77 69 6e 67 20 76 61 72 69 61 62 6c 65 20  lowing variable 
28f0: 69 73 0a 2a 2a 20 74 72 75 65 20 69 66 20 74 72  is.** true if tr
2900: 61 6e 73 6c 61 74 69 6f 6e 20 69 73 20 72 65 71  anslation is req
2910: 75 69 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  uired..*/.static
2920: 20 69 6e 74 20 73 74 64 6f 75 74 5f 69 73 5f 63   int stdout_is_c
2930: 6f 6e 73 6f 6c 65 20 3d 20 31 3b 0a 0a 2f 2a 0a  onsole = 1;../*.
2940: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
2950: 20 69 73 20 74 68 65 20 6f 70 65 6e 20 53 51 4c   is the open SQL
2960: 69 74 65 20 64 61 74 61 62 61 73 65 2e 20 20 57  ite database.  W
2970: 65 20 6d 61 6b 65 20 61 20 70 6f 69 6e 74 65 72  e make a pointer
2980: 0a 2a 2a 20 74 6f 20 74 68 69 73 20 64 61 74 61  .** to this data
2990: 62 61 73 65 20 61 20 73 74 61 74 69 63 20 76 61  base a static va
29a0: 72 69 61 62 6c 65 20 73 6f 20 74 68 61 74 20 69  riable so that i
29b0: 74 20 63 61 6e 20 62 65 20 61 63 63 65 73 73 65  t can be accesse
29c0: 64 0a 2a 2a 20 62 79 20 74 68 65 20 53 49 47 49  d.** by the SIGI
29d0: 4e 54 20 68 61 6e 64 6c 65 72 20 74 6f 20 69 6e  NT handler to in
29e0: 74 65 72 72 75 70 74 20 64 61 74 61 62 61 73 65  terrupt database
29f0: 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2f 0a   processing..*/.
2a00: 73 74 61 74 69 63 20 73 71 6c 69 74 65 33 20 2a  static sqlite3 *
2a10: 67 6c 6f 62 61 6c 44 62 20 3d 20 30 3b 0a 0a 2f  globalDb = 0;../
2a20: 2a 0a 2a 2a 20 54 72 75 65 20 69 66 20 61 6e 20  *.** True if an 
2a30: 69 6e 74 65 72 72 75 70 74 20 28 43 6f 6e 74 72  interrupt (Contr
2a40: 6f 6c 2d 43 29 20 68 61 73 20 62 65 65 6e 20 72  ol-C) has been r
2a50: 65 63 65 69 76 65 64 2e 0a 2a 2f 0a 73 74 61 74  eceived..*/.stat
2a60: 69 63 20 76 6f 6c 61 74 69 6c 65 20 69 6e 74 20  ic volatile int 
2a70: 73 65 65 6e 49 6e 74 65 72 72 75 70 74 20 3d 20  seenInterrupt = 
2a80: 30 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69  0;../*.** This i
2a90: 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 6f 75  s the name of ou
2aa0: 72 20 70 72 6f 67 72 61 6d 2e 20 49 74 20 69 73  r program. It is
2ab0: 20 73 65 74 20 69 6e 20 6d 61 69 6e 28 29 2c 20   set in main(), 
2ac0: 75 73 65 64 0a 2a 2a 20 69 6e 20 61 20 6e 75 6d  used.** in a num
2ad0: 62 65 72 20 6f 66 20 6f 74 68 65 72 20 70 6c 61  ber of other pla
2ae0: 63 65 73 2c 20 6d 6f 73 74 6c 79 20 66 6f 72 20  ces, mostly for 
2af0: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 2e 0a  error messages..
2b00: 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a  */.static char *
2b10: 41 72 67 76 30 3b 0a 0a 2f 2a 0a 2a 2a 20 50 72  Argv0;../*.** Pr
2b20: 6f 6d 70 74 20 73 74 72 69 6e 67 73 2e 20 49 6e  ompt strings. In
2b30: 69 74 69 61 6c 69 7a 65 64 20 69 6e 20 6d 61 69  itialized in mai
2b40: 6e 2e 20 53 65 74 74 61 62 6c 65 20 77 69 74 68  n. Settable with
2b50: 0a 2a 2a 20 20 20 2e 70 72 6f 6d 70 74 20 6d 61  .**   .prompt ma
2b60: 69 6e 20 63 6f 6e 74 69 6e 75 65 0a 2a 2f 0a 73  in continue.*/.s
2b70: 74 61 74 69 63 20 63 68 61 72 20 6d 61 69 6e 50  tatic char mainP
2b80: 72 6f 6d 70 74 5b 32 30 5d 3b 20 20 20 20 20 2f  rompt[20];     /
2b90: 2a 20 46 69 72 73 74 20 6c 69 6e 65 20 70 72 6f  * First line pro
2ba0: 6d 70 74 2e 20 64 65 66 61 75 6c 74 3a 20 22 73  mpt. default: "s
2bb0: 71 6c 69 74 65 3e 20 22 2a 2f 0a 73 74 61 74 69  qlite> "*/.stati
2bc0: 63 20 63 68 61 72 20 63 6f 6e 74 69 6e 75 65 50  c char continueP
2bd0: 72 6f 6d 70 74 5b 32 30 5d 3b 20 2f 2a 20 43 6f  rompt[20]; /* Co
2be0: 6e 74 69 6e 75 61 74 69 6f 6e 20 70 72 6f 6d 70  ntinuation promp
2bf0: 74 2e 20 64 65 66 61 75 6c 74 3a 20 22 20 20 20  t. default: "   
2c00: 2e 2e 2e 3e 20 22 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  ...> " */../*.**
2c10: 20 52 65 6e 64 65 72 20 6f 75 74 70 75 74 20 6c   Render output l
2c20: 69 6b 65 20 66 70 72 69 6e 74 66 28 29 2e 20 20  ike fprintf().  
2c30: 45 78 63 65 70 74 2c 20 69 66 20 74 68 65 20 6f  Except, if the o
2c40: 75 74 70 75 74 20 69 73 20 67 6f 69 6e 67 20 74  utput is going t
2c50: 6f 20 74 68 65 0a 2a 2a 20 63 6f 6e 73 6f 6c 65  o the.** console
2c60: 20 61 6e 64 20 69 66 20 74 68 69 73 20 69 73 20   and if this is 
2c70: 72 75 6e 6e 69 6e 67 20 6f 6e 20 61 20 57 69 6e  running on a Win
2c80: 64 6f 77 73 20 6d 61 63 68 69 6e 65 2c 20 74 72  dows machine, tr
2c90: 61 6e 73 6c 61 74 65 20 74 68 65 0a 2a 2a 20 6f  anslate the.** o
2ca0: 75 74 70 75 74 20 66 72 6f 6d 20 55 54 46 2d 38  utput from UTF-8
2cb0: 20 69 6e 74 6f 20 4d 42 43 53 2e 0a 2a 2f 0a 23   into MBCS..*/.#
2cc0: 69 66 20 64 65 66 69 6e 65 64 28 5f 57 49 4e 33  if defined(_WIN3
2cd0: 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 57 49  2) || defined(WI
2ce0: 4e 33 32 29 0a 76 6f 69 64 20 75 74 66 38 5f 70  N32).void utf8_p
2cf0: 72 69 6e 74 66 28 46 49 4c 45 20 2a 6f 75 74 2c  rintf(FILE *out,
2d00: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f   const char *zFo
2d10: 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61  rmat, ...){.  va
2d20: 5f 6c 69 73 74 20 61 70 3b 0a 20 20 76 61 5f 73  _list ap;.  va_s
2d30: 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74  tart(ap, zFormat
2d40: 29 3b 0a 20 20 69 66 28 20 73 74 64 6f 75 74 5f  );.  if( stdout_
2d50: 69 73 5f 63 6f 6e 73 6f 6c 65 20 26 26 20 28 6f  is_console && (o
2d60: 75 74 3d 3d 73 74 64 6f 75 74 20 7c 7c 20 6f 75  ut==stdout || ou
2d70: 74 3d 3d 73 74 64 65 72 72 29 20 29 7b 0a 20 20  t==stderr) ){.  
2d80: 20 20 63 68 61 72 20 2a 7a 31 20 3d 20 73 71 6c    char *z1 = sql
2d90: 69 74 65 33 5f 76 6d 70 72 69 6e 74 66 28 7a 46  ite3_vmprintf(zF
2da0: 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 20 20  ormat, ap);.    
2db0: 63 68 61 72 20 2a 7a 32 20 3d 20 73 71 6c 69 74  char *z2 = sqlit
2dc0: 65 33 5f 77 69 6e 33 32 5f 75 74 66 38 5f 74 6f  e3_win32_utf8_to
2dd0: 5f 6d 62 63 73 5f 76 32 28 7a 31 2c 20 30 29 3b  _mbcs_v2(z1, 0);
2de0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
2df0: 65 28 7a 31 29 3b 0a 20 20 20 20 66 70 75 74 73  e(z1);.    fputs
2e00: 28 7a 32 2c 20 6f 75 74 29 3b 0a 20 20 20 20 73  (z2, out);.    s
2e10: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 32 29 3b  qlite3_free(z2);
2e20: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 76 66  .  }else{.    vf
2e30: 70 72 69 6e 74 66 28 6f 75 74 2c 20 7a 46 6f 72  printf(out, zFor
2e40: 6d 61 74 2c 20 61 70 29 3b 0a 20 20 7d 0a 20 20  mat, ap);.  }.  
2e50: 76 61 5f 65 6e 64 28 61 70 29 3b 0a 7d 0a 23 65  va_end(ap);.}.#e
2e60: 6c 69 66 20 21 64 65 66 69 6e 65 64 28 75 74 66  lif !defined(utf
2e70: 38 5f 70 72 69 6e 74 66 29 0a 23 20 64 65 66 69  8_printf).# defi
2e80: 6e 65 20 75 74 66 38 5f 70 72 69 6e 74 66 20 66  ne utf8_printf f
2e90: 70 72 69 6e 74 66 0a 23 65 6e 64 69 66 0a 0a 2f  printf.#endif../
2ea0: 2a 0a 2a 2a 20 52 65 6e 64 65 72 20 6f 75 74 70  *.** Render outp
2eb0: 75 74 20 6c 69 6b 65 20 66 70 72 69 6e 74 66 28  ut like fprintf(
2ec0: 29 2e 20 20 54 68 69 73 20 73 68 6f 75 6c 64 20  ).  This should 
2ed0: 6e 6f 74 20 62 65 20 75 73 65 64 20 6f 6e 20 61  not be used on a
2ee0: 6e 79 74 68 69 6e 67 20 74 68 61 74 0a 2a 2a 20  nything that.** 
2ef0: 69 6e 63 6c 75 64 65 73 20 73 74 72 69 6e 67 20  includes string 
2f00: 66 6f 72 6d 61 74 74 69 6e 67 20 28 65 2e 67 2e  formatting (e.g.
2f10: 20 22 25 73 22 29 2e 0a 2a 2f 0a 23 69 66 20 21   "%s")..*/.#if !
2f20: 64 65 66 69 6e 65 64 28 72 61 77 5f 70 72 69 6e  defined(raw_prin
2f30: 74 66 29 0a 23 20 64 65 66 69 6e 65 20 72 61 77  tf).# define raw
2f40: 5f 70 72 69 6e 74 66 20 66 70 72 69 6e 74 66 0a  _printf fprintf.
2f50: 23 65 6e 64 69 66 0a 0a 2f 2a 20 49 6e 64 69 63  #endif../* Indic
2f60: 61 74 65 20 6f 75 74 2d 6f 66 2d 6d 65 6d 6f 72  ate out-of-memor
2f70: 79 20 61 6e 64 20 65 78 69 74 2e 20 2a 2f 0a 73  y and exit. */.s
2f80: 74 61 74 69 63 20 76 6f 69 64 20 73 68 65 6c 6c  tatic void shell
2f90: 5f 6f 75 74 5f 6f 66 5f 6d 65 6d 6f 72 79 28 76  _out_of_memory(v
2fa0: 6f 69 64 29 7b 0a 20 20 72 61 77 5f 70 72 69 6e  oid){.  raw_prin
2fb0: 74 66 28 73 74 64 65 72 72 2c 22 45 72 72 6f 72  tf(stderr,"Error
2fc0: 3a 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 5c  : out of memory\
2fd0: 6e 22 29 3b 0a 20 20 65 78 69 74 28 31 29 3b 0a  n");.  exit(1);.
2fe0: 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 49  }../*.** Write I
2ff0: 2f 4f 20 74 72 61 63 65 73 20 74 6f 20 74 68 65  /O traces to the
3000: 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 65 61   following strea
3010: 6d 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  m..*/.#ifdef SQL
3020: 49 54 45 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41  ITE_ENABLE_IOTRA
3030: 43 45 0a 73 74 61 74 69 63 20 46 49 4c 45 20 2a  CE.static FILE *
3040: 69 6f 74 72 61 63 65 20 3d 20 30 3b 0a 23 65 6e  iotrace = 0;.#en
3050: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  dif../*.** This 
3060: 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73 20 6c 69  routine works li
3070: 6b 65 20 70 72 69 6e 74 66 20 69 6e 20 74 68 61  ke printf in tha
3080: 74 20 69 74 73 20 66 69 72 73 74 20 61 72 67 75  t its first argu
3090: 6d 65 6e 74 20 69 73 20 61 0a 2a 2a 20 66 6f 72  ment is a.** for
30a0: 6d 61 74 20 73 74 72 69 6e 67 20 61 6e 64 20 73  mat string and s
30b0: 75 62 73 65 71 75 65 6e 74 20 61 72 67 75 6d 65  ubsequent argume
30c0: 6e 74 73 20 61 72 65 20 76 61 6c 75 65 73 20 74  nts are values t
30d0: 6f 20 62 65 20 73 75 62 73 74 69 74 75 74 65 64  o be substituted
30e0: 0a 2a 2a 20 69 6e 20 70 6c 61 63 65 20 6f 66 20  .** in place of 
30f0: 25 20 66 69 65 6c 64 73 2e 20 20 54 68 65 20 72  % fields.  The r
3100: 65 73 75 6c 74 20 6f 66 20 66 6f 72 6d 61 74 74  esult of formatt
3110: 69 6e 67 20 74 68 69 73 20 73 74 72 69 6e 67 0a  ing this string.
3120: 2a 2a 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f  ** is written to
3130: 20 69 6f 74 72 61 63 65 2e 0a 2a 2f 0a 23 69 66   iotrace..*/.#if
3140: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
3150: 45 5f 49 4f 54 52 41 43 45 0a 73 74 61 74 69 63  E_IOTRACE.static
3160: 20 76 6f 69 64 20 53 51 4c 49 54 45 5f 43 44 45   void SQLITE_CDE
3170: 43 4c 20 69 6f 74 72 61 63 65 50 72 69 6e 74 66  CL iotracePrintf
3180: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f  (const char *zFo
3190: 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61  rmat, ...){.  va
31a0: 5f 6c 69 73 74 20 61 70 3b 0a 20 20 63 68 61 72  _list ap;.  char
31b0: 20 2a 7a 3b 0a 20 20 69 66 28 20 69 6f 74 72 61   *z;.  if( iotra
31c0: 63 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  ce==0 ) return;.
31d0: 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a    va_start(ap, z
31e0: 46 6f 72 6d 61 74 29 3b 0a 20 20 7a 20 3d 20 73  Format);.  z = s
31f0: 71 6c 69 74 65 33 5f 76 6d 70 72 69 6e 74 66 28  qlite3_vmprintf(
3200: 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20  zFormat, ap);.  
3210: 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 75 74  va_end(ap);.  ut
3220: 66 38 5f 70 72 69 6e 74 66 28 69 6f 74 72 61 63  f8_printf(iotrac
3230: 65 2c 20 22 25 73 22 2c 20 7a 29 3b 0a 20 20 73  e, "%s", z);.  s
3240: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a  qlite3_free(z);.
3250: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
3260: 4f 75 74 70 75 74 20 73 74 72 69 6e 67 20 7a 55  Output string zU
3270: 74 66 20 74 6f 20 73 74 72 65 61 6d 20 70 4f 75  tf to stream pOu
3280: 74 20 61 73 20 77 20 63 68 61 72 61 63 74 65 72  t as w character
3290: 73 2e 20 20 49 66 20 77 20 69 73 20 6e 65 67 61  s.  If w is nega
32a0: 74 69 76 65 2c 0a 2a 2a 20 74 68 65 6e 20 72 69  tive,.** then ri
32b0: 67 68 74 2d 6a 75 73 74 69 66 79 20 74 68 65 20  ght-justify the 
32c0: 74 65 78 74 2e 20 20 57 20 69 73 20 74 68 65 20  text.  W is the 
32d0: 77 69 64 74 68 20 69 6e 20 55 54 46 2d 38 20 63  width in UTF-8 c
32e0: 68 61 72 61 63 74 65 72 73 2c 20 6e 6f 74 0a 2a  haracters, not.*
32f0: 2a 20 69 6e 20 62 79 74 65 73 2e 20 20 54 68 69  * in bytes.  Thi
3300: 73 20 69 73 20 64 69 66 66 65 72 65 6e 74 20 66  s is different f
3310: 72 6f 6d 20 74 68 65 20 25 2a 2e 2a 73 20 73 70  rom the %*.*s sp
3320: 65 63 69 66 69 63 61 74 69 6f 6e 20 69 6e 20 70  ecification in p
3330: 72 69 6e 74 66 0a 2a 2a 20 73 69 6e 63 65 20 77  rintf.** since w
3340: 69 74 68 20 25 2a 2e 2a 73 20 74 68 65 20 77 69  ith %*.*s the wi
3350: 64 74 68 20 69 73 20 6d 65 61 73 75 72 65 64 20  dth is measured 
3360: 69 6e 20 62 79 74 65 73 2c 20 6e 6f 74 20 63 68  in bytes, not ch
3370: 61 72 61 63 74 65 72 73 2e 0a 2a 2f 0a 73 74 61  aracters..*/.sta
3380: 74 69 63 20 76 6f 69 64 20 75 74 66 38 5f 77 69  tic void utf8_wi
3390: 64 74 68 5f 70 72 69 6e 74 28 46 49 4c 45 20 2a  dth_print(FILE *
33a0: 70 4f 75 74 2c 20 69 6e 74 20 77 2c 20 63 6f 6e  pOut, int w, con
33b0: 73 74 20 63 68 61 72 20 2a 7a 55 74 66 29 7b 0a  st char *zUtf){.
33c0: 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e    int i;.  int n
33d0: 3b 0a 20 20 69 6e 74 20 61 77 20 3d 20 77 3c 30  ;.  int aw = w<0
33e0: 20 3f 20 2d 77 20 3a 20 77 3b 0a 20 20 63 68 61   ? -w : w;.  cha
33f0: 72 20 7a 42 75 66 5b 31 30 30 30 5d 3b 0a 20 20  r zBuf[1000];.  
3400: 69 66 28 20 61 77 3e 28 69 6e 74 29 73 69 7a 65  if( aw>(int)size
3410: 6f 66 28 7a 42 75 66 29 2f 33 20 29 20 61 77 20  of(zBuf)/3 ) aw 
3420: 3d 20 28 69 6e 74 29 73 69 7a 65 6f 66 28 7a 42  = (int)sizeof(zB
3430: 75 66 29 2f 33 3b 0a 20 20 66 6f 72 28 69 3d 6e  uf)/3;.  for(i=n
3440: 3d 30 3b 20 7a 55 74 66 5b 69 5d 3b 20 69 2b 2b  =0; zUtf[i]; i++
3450: 29 7b 0a 20 20 20 20 69 66 28 20 28 7a 55 74 66  ){.    if( (zUtf
3460: 5b 69 5d 26 30 78 63 30 29 21 3d 30 78 38 30 20  [i]&0xc0)!=0x80 
3470: 29 7b 0a 20 20 20 20 20 20 6e 2b 2b 3b 0a 20 20  ){.      n++;.  
3480: 20 20 20 20 69 66 28 20 6e 3d 3d 61 77 20 29 7b      if( n==aw ){
3490: 0a 20 20 20 20 20 20 20 20 64 6f 7b 20 69 2b 2b  .        do{ i++
34a0: 3b 20 7d 77 68 69 6c 65 28 20 28 7a 55 74 66 5b  ; }while( (zUtf[
34b0: 69 5d 26 30 78 63 30 29 3d 3d 30 78 38 30 20 29  i]&0xc0)==0x80 )
34c0: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
34d0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
34e0: 20 7d 0a 20 20 69 66 28 20 6e 3e 3d 61 77 20 29   }.  if( n>=aw )
34f0: 7b 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74  {.    utf8_print
3500: 66 28 70 4f 75 74 2c 20 22 25 2e 2a 73 22 2c 20  f(pOut, "%.*s", 
3510: 69 2c 20 7a 55 74 66 29 3b 0a 20 20 7d 65 6c 73  i, zUtf);.  }els
3520: 65 20 69 66 28 20 77 3c 30 20 29 7b 0a 20 20 20  e if( w<0 ){.   
3530: 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 4f 75   utf8_printf(pOu
3540: 74 2c 20 22 25 2a 73 25 73 22 2c 20 61 77 2d 6e  t, "%*s%s", aw-n
3550: 2c 20 22 22 2c 20 7a 55 74 66 29 3b 0a 20 20 7d  , "", zUtf);.  }
3560: 65 6c 73 65 7b 0a 20 20 20 20 75 74 66 38 5f 70  else{.    utf8_p
3570: 72 69 6e 74 66 28 70 4f 75 74 2c 20 22 25 73 25  rintf(pOut, "%s%
3580: 2a 73 22 2c 20 7a 55 74 66 2c 20 61 77 2d 6e 2c  *s", zUtf, aw-n,
3590: 20 22 22 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a   "");.  }.}.../*
35a0: 0a 2a 2a 20 44 65 74 65 72 6d 69 6e 65 73 20 69  .** Determines i
35b0: 66 20 61 20 73 74 72 69 6e 67 20 69 73 20 61 20  f a string is a 
35c0: 6e 75 6d 62 65 72 20 6f 66 20 6e 6f 74 2e 0a 2a  number of not..*
35d0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 73 4e  /.static int isN
35e0: 75 6d 62 65 72 28 63 6f 6e 73 74 20 63 68 61 72  umber(const char
35f0: 20 2a 7a 2c 20 69 6e 74 20 2a 72 65 61 6c 6e 75   *z, int *realnu
3600: 6d 29 7b 0a 20 20 69 66 28 20 2a 7a 3d 3d 27 2d  m){.  if( *z=='-
3610: 27 20 7c 7c 20 2a 7a 3d 3d 27 2b 27 20 29 20 7a  ' || *z=='+' ) z
3620: 2b 2b 3b 0a 20 20 69 66 28 20 21 49 73 44 69 67  ++;.  if( !IsDig
3630: 69 74 28 2a 7a 29 20 29 7b 0a 20 20 20 20 72 65  it(*z) ){.    re
3640: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a 2b  turn 0;.  }.  z+
3650: 2b 3b 0a 20 20 69 66 28 20 72 65 61 6c 6e 75 6d  +;.  if( realnum
3660: 20 29 20 2a 72 65 61 6c 6e 75 6d 20 3d 20 30 3b   ) *realnum = 0;
3670: 0a 20 20 77 68 69 6c 65 28 20 49 73 44 69 67 69  .  while( IsDigi
3680: 74 28 2a 7a 29 20 29 7b 20 7a 2b 2b 3b 20 7d 0a  t(*z) ){ z++; }.
3690: 20 20 69 66 28 20 2a 7a 3d 3d 27 2e 27 20 29 7b    if( *z=='.' ){
36a0: 0a 20 20 20 20 7a 2b 2b 3b 0a 20 20 20 20 69 66  .    z++;.    if
36b0: 28 20 21 49 73 44 69 67 69 74 28 2a 7a 29 20 29  ( !IsDigit(*z) )
36c0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 77   return 0;.    w
36d0: 68 69 6c 65 28 20 49 73 44 69 67 69 74 28 2a 7a  hile( IsDigit(*z
36e0: 29 20 29 7b 20 7a 2b 2b 3b 20 7d 0a 20 20 20 20  ) ){ z++; }.    
36f0: 69 66 28 20 72 65 61 6c 6e 75 6d 20 29 20 2a 72  if( realnum ) *r
3700: 65 61 6c 6e 75 6d 20 3d 20 31 3b 0a 20 20 7d 0a  ealnum = 1;.  }.
3710: 20 20 69 66 28 20 2a 7a 3d 3d 27 65 27 20 7c 7c    if( *z=='e' ||
3720: 20 2a 7a 3d 3d 27 45 27 20 29 7b 0a 20 20 20 20   *z=='E' ){.    
3730: 7a 2b 2b 3b 0a 20 20 20 20 69 66 28 20 2a 7a 3d  z++;.    if( *z=
3740: 3d 27 2b 27 20 7c 7c 20 2a 7a 3d 3d 27 2d 27 20  ='+' || *z=='-' 
3750: 29 20 7a 2b 2b 3b 0a 20 20 20 20 69 66 28 20 21  ) z++;.    if( !
3760: 49 73 44 69 67 69 74 28 2a 7a 29 20 29 20 72 65  IsDigit(*z) ) re
3770: 74 75 72 6e 20 30 3b 0a 20 20 20 20 77 68 69 6c  turn 0;.    whil
3780: 65 28 20 49 73 44 69 67 69 74 28 2a 7a 29 20 29  e( IsDigit(*z) )
3790: 7b 20 7a 2b 2b 3b 20 7d 0a 20 20 20 20 69 66 28  { z++; }.    if(
37a0: 20 72 65 61 6c 6e 75 6d 20 29 20 2a 72 65 61 6c   realnum ) *real
37b0: 6e 75 6d 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72  num = 1;.  }.  r
37c0: 65 74 75 72 6e 20 2a 7a 3d 3d 30 3b 0a 7d 0a 0a  eturn *z==0;.}..
37d0: 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 61 20  /*.** Compute a 
37e0: 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 74 68  string length th
37f0: 61 74 20 69 73 20 6c 69 6d 69 74 65 64 20 74 6f  at is limited to
3800: 20 77 68 61 74 20 63 61 6e 20 62 65 20 73 74 6f   what can be sto
3810: 72 65 64 20 69 6e 0a 2a 2a 20 6c 6f 77 65 72 20  red in.** lower 
3820: 33 30 20 62 69 74 73 20 6f 66 20 61 20 33 32 2d  30 bits of a 32-
3830: 62 69 74 20 73 69 67 6e 65 64 20 69 6e 74 65 67  bit signed integ
3840: 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  er..*/.static in
3850: 74 20 73 74 72 6c 65 6e 33 30 28 63 6f 6e 73 74  t strlen30(const
3860: 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 63 6f 6e   char *z){.  con
3870: 73 74 20 63 68 61 72 20 2a 7a 32 20 3d 20 7a 3b  st char *z2 = z;
3880: 0a 20 20 77 68 69 6c 65 28 20 2a 7a 32 20 29 7b  .  while( *z2 ){
3890: 20 7a 32 2b 2b 3b 20 7d 0a 20 20 72 65 74 75 72   z2++; }.  retur
38a0: 6e 20 30 78 33 66 66 66 66 66 66 66 20 26 20 28  n 0x3fffffff & (
38b0: 69 6e 74 29 28 7a 32 20 2d 20 7a 29 3b 0a 7d 0a  int)(z2 - z);.}.
38c0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
38d0: 65 20 6c 65 6e 67 74 68 20 6f 66 20 61 20 73 74  e length of a st
38e0: 72 69 6e 67 20 69 6e 20 63 68 61 72 61 63 74 65  ring in characte
38f0: 72 73 2e 20 20 4d 75 6c 74 69 62 79 74 65 20 55  rs.  Multibyte U
3900: 54 46 38 20 63 68 61 72 61 63 74 65 72 73 0a 2a  TF8 characters.*
3910: 2a 20 63 6f 75 6e 74 20 61 73 20 61 20 73 69 6e  * count as a sin
3920: 67 6c 65 20 63 68 61 72 61 63 74 65 72 2e 0a 2a  gle character..*
3930: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 74 72  /.static int str
3940: 6c 65 6e 43 68 61 72 28 63 6f 6e 73 74 20 63 68  lenChar(const ch
3950: 61 72 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 6e 20  ar *z){.  int n 
3960: 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 2a 7a  = 0;.  while( *z
3970: 20 29 7b 0a 20 20 20 20 69 66 28 20 28 30 78 63   ){.    if( (0xc
3980: 30 26 2a 28 7a 2b 2b 29 29 21 3d 30 78 38 30 20  0&*(z++))!=0x80 
3990: 29 20 6e 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74  ) n++;.  }.  ret
39a0: 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn n;.}../*.** 
39b0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 61  This routine rea
39c0: 64 73 20 61 20 6c 69 6e 65 20 6f 66 20 74 65 78  ds a line of tex
39d0: 74 20 66 72 6f 6d 20 46 49 4c 45 20 69 6e 2c 20  t from FILE in, 
39e0: 73 74 6f 72 65 73 0a 2a 2a 20 74 68 65 20 74 65  stores.** the te
39f0: 78 74 20 69 6e 20 6d 65 6d 6f 72 79 20 6f 62 74  xt in memory obt
3a00: 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f  ained from mallo
3a10: 63 28 29 20 61 6e 64 20 72 65 74 75 72 6e 73 20  c() and returns 
3a20: 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20  a pointer.** to 
3a30: 74 68 65 20 74 65 78 74 2e 20 20 4e 55 4c 4c 20  the text.  NULL 
3a40: 69 73 20 72 65 74 75 72 6e 65 64 20 61 74 20 65  is returned at e
3a50: 6e 64 20 6f 66 20 66 69 6c 65 2c 20 6f 72 20 69  nd of file, or i
3a60: 66 20 6d 61 6c 6c 6f 63 28 29 0a 2a 2a 20 66 61  f malloc().** fa
3a70: 69 6c 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 4c  ils..**.** If zL
3a80: 69 6e 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20  ine is not NULL 
3a90: 74 68 65 6e 20 69 74 20 69 73 20 61 20 6d 61 6c  then it is a mal
3aa0: 6c 6f 63 65 64 20 62 75 66 66 65 72 20 72 65 74  loced buffer ret
3ab0: 75 72 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20 61 20  urned from.** a 
3ac0: 70 72 65 76 69 6f 75 73 20 63 61 6c 6c 20 74 6f  previous call to
3ad0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74 68   this routine th
3ae0: 61 74 20 6d 61 79 20 62 65 20 72 65 75 73 65 64  at may be reused
3af0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  ..*/.static char
3b00: 20 2a 6c 6f 63 61 6c 5f 67 65 74 6c 69 6e 65 28   *local_getline(
3b10: 63 68 61 72 20 2a 7a 4c 69 6e 65 2c 20 46 49 4c  char *zLine, FIL
3b20: 45 20 2a 69 6e 29 7b 0a 20 20 69 6e 74 20 6e 4c  E *in){.  int nL
3b30: 69 6e 65 20 3d 20 7a 4c 69 6e 65 3d 3d 30 20 3f  ine = zLine==0 ?
3b40: 20 30 20 3a 20 31 30 30 3b 0a 20 20 69 6e 74 20   0 : 100;.  int 
3b50: 6e 20 3d 20 30 3b 0a 0a 20 20 77 68 69 6c 65 28  n = 0;..  while(
3b60: 20 31 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 2b   1 ){.    if( n+
3b70: 31 30 30 3e 6e 4c 69 6e 65 20 29 7b 0a 20 20 20  100>nLine ){.   
3b80: 20 20 20 6e 4c 69 6e 65 20 3d 20 6e 4c 69 6e 65     nLine = nLine
3b90: 2a 32 20 2b 20 31 30 30 3b 0a 20 20 20 20 20 20  *2 + 100;.      
3ba0: 7a 4c 69 6e 65 20 3d 20 72 65 61 6c 6c 6f 63 28  zLine = realloc(
3bb0: 7a 4c 69 6e 65 2c 20 6e 4c 69 6e 65 29 3b 0a 20  zLine, nLine);. 
3bc0: 20 20 20 20 20 69 66 28 20 7a 4c 69 6e 65 3d 3d       if( zLine==
3bd0: 30 20 29 20 73 68 65 6c 6c 5f 6f 75 74 5f 6f 66  0 ) shell_out_of
3be0: 5f 6d 65 6d 6f 72 79 28 29 3b 0a 20 20 20 20 7d  _memory();.    }
3bf0: 0a 20 20 20 20 69 66 28 20 66 67 65 74 73 28 26  .    if( fgets(&
3c00: 7a 4c 69 6e 65 5b 6e 5d 2c 20 6e 4c 69 6e 65 20  zLine[n], nLine 
3c10: 2d 20 6e 2c 20 69 6e 29 3d 3d 30 20 29 7b 0a 20  - n, in)==0 ){. 
3c20: 20 20 20 20 20 69 66 28 20 6e 3d 3d 30 20 29 7b       if( n==0 ){
3c30: 0a 20 20 20 20 20 20 20 20 66 72 65 65 28 7a 4c  .        free(zL
3c40: 69 6e 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65  ine);.        re
3c50: 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a  turn 0;.      }.
3c60: 20 20 20 20 20 20 7a 4c 69 6e 65 5b 6e 5d 20 3d        zLine[n] =
3c70: 20 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   0;.      break;
3c80: 0a 20 20 20 20 7d 0a 20 20 20 20 77 68 69 6c 65  .    }.    while
3c90: 28 20 7a 4c 69 6e 65 5b 6e 5d 20 29 20 6e 2b 2b  ( zLine[n] ) n++
3ca0: 3b 0a 20 20 20 20 69 66 28 20 6e 3e 30 20 26 26  ;.    if( n>0 &&
3cb0: 20 7a 4c 69 6e 65 5b 6e 2d 31 5d 3d 3d 27 5c 6e   zLine[n-1]=='\n
3cc0: 27 20 29 7b 0a 20 20 20 20 20 20 6e 2d 2d 3b 0a  ' ){.      n--;.
3cd0: 20 20 20 20 20 20 69 66 28 20 6e 3e 30 20 26 26        if( n>0 &&
3ce0: 20 7a 4c 69 6e 65 5b 6e 2d 31 5d 3d 3d 27 5c 72   zLine[n-1]=='\r
3cf0: 27 20 29 20 6e 2d 2d 3b 0a 20 20 20 20 20 20 7a  ' ) n--;.      z
3d00: 4c 69 6e 65 5b 6e 5d 20 3d 20 30 3b 0a 20 20 20  Line[n] = 0;.   
3d10: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
3d20: 20 20 7d 0a 23 69 66 20 64 65 66 69 6e 65 64 28    }.#if defined(
3d30: 5f 57 49 4e 33 32 29 20 7c 7c 20 64 65 66 69 6e  _WIN32) || defin
3d40: 65 64 28 57 49 4e 33 32 29 0a 20 20 2f 2a 20 46  ed(WIN32).  /* F
3d50: 6f 72 20 69 6e 74 65 72 61 63 74 69 76 65 20 69  or interactive i
3d60: 6e 70 75 74 20 6f 6e 20 57 69 6e 64 6f 77 73 20  nput on Windows 
3d70: 73 79 73 74 65 6d 73 2c 20 74 72 61 6e 73 6c 61  systems, transla
3d80: 74 65 20 74 68 65 0a 20 20 2a 2a 20 6d 75 6c 74  te the.  ** mult
3d90: 69 2d 62 79 74 65 20 63 68 61 72 61 63 74 65 72  i-byte character
3da0: 73 65 74 20 63 68 61 72 61 63 74 65 72 73 20 69  set characters i
3db0: 6e 74 6f 20 55 54 46 2d 38 2e 20 2a 2f 0a 20 20  nto UTF-8. */.  
3dc0: 69 66 28 20 73 74 64 69 6e 5f 69 73 5f 69 6e 74  if( stdin_is_int
3dd0: 65 72 61 63 74 69 76 65 20 26 26 20 69 6e 3d 3d  eractive && in==
3de0: 73 74 64 69 6e 20 29 7b 0a 20 20 20 20 63 68 61  stdin ){.    cha
3df0: 72 20 2a 7a 54 72 61 6e 73 20 3d 20 73 71 6c 69  r *zTrans = sqli
3e00: 74 65 33 5f 77 69 6e 33 32 5f 6d 62 63 73 5f 74  te3_win32_mbcs_t
3e10: 6f 5f 75 74 66 38 5f 76 32 28 7a 4c 69 6e 65 2c  o_utf8_v2(zLine,
3e20: 20 30 29 3b 0a 20 20 20 20 69 66 28 20 7a 54 72   0);.    if( zTr
3e30: 61 6e 73 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ans ){.      int
3e40: 20 6e 54 72 61 6e 73 20 3d 20 73 74 72 6c 65 6e   nTrans = strlen
3e50: 33 30 28 7a 54 72 61 6e 73 29 2b 31 3b 0a 20 20  30(zTrans)+1;.  
3e60: 20 20 20 20 69 66 28 20 6e 54 72 61 6e 73 3e 6e      if( nTrans>n
3e70: 4c 69 6e 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Line ){.        
3e80: 7a 4c 69 6e 65 20 3d 20 72 65 61 6c 6c 6f 63 28  zLine = realloc(
3e90: 7a 4c 69 6e 65 2c 20 6e 54 72 61 6e 73 29 3b 0a  zLine, nTrans);.
3ea0: 20 20 20 20 20 20 20 20 69 66 28 20 7a 4c 69 6e          if( zLin
3eb0: 65 3d 3d 30 20 29 20 73 68 65 6c 6c 5f 6f 75 74  e==0 ) shell_out
3ec0: 5f 6f 66 5f 6d 65 6d 6f 72 79 28 29 3b 0a 20 20  _of_memory();.  
3ed0: 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 65 6d 63      }.      memc
3ee0: 70 79 28 7a 4c 69 6e 65 2c 20 7a 54 72 61 6e 73  py(zLine, zTrans
3ef0: 2c 20 6e 54 72 61 6e 73 29 3b 0a 20 20 20 20 20  , nTrans);.     
3f00: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 54   sqlite3_free(zT
3f10: 72 61 6e 73 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  rans);.    }.  }
3f20: 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e  .#endif /* defin
3f30: 65 64 28 5f 57 49 4e 33 32 29 20 7c 7c 20 64 65  ed(_WIN32) || de
3f40: 66 69 6e 65 64 28 57 49 4e 33 32 29 20 2a 2f 0a  fined(WIN32) */.
3f50: 20 20 72 65 74 75 72 6e 20 7a 4c 69 6e 65 3b 0a    return zLine;.
3f60: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 72 69 65 76  }../*.** Retriev
3f70: 65 20 61 20 73 69 6e 67 6c 65 20 6c 69 6e 65 20  e a single line 
3f80: 6f 66 20 69 6e 70 75 74 20 74 65 78 74 2e 0a 2a  of input text..*
3f90: 2a 0a 2a 2a 20 49 66 20 69 6e 3d 3d 30 20 74 68  *.** If in==0 th
3fa0: 65 6e 20 72 65 61 64 20 66 72 6f 6d 20 73 74 61  en read from sta
3fb0: 6e 64 61 72 64 20 69 6e 70 75 74 20 61 6e 64 20  ndard input and 
3fc0: 70 72 6f 6d 70 74 20 62 65 66 6f 72 65 20 65 61  prompt before ea
3fd0: 63 68 20 6c 69 6e 65 2e 0a 2a 2a 20 49 66 20 69  ch line..** If i
3fe0: 73 43 6f 6e 74 69 6e 75 61 74 69 6f 6e 20 69 73  sContinuation is
3ff0: 20 74 72 75 65 2c 20 74 68 65 6e 20 61 20 63 6f   true, then a co
4000: 6e 74 69 6e 75 61 74 69 6f 6e 20 70 72 6f 6d 70  ntinuation promp
4010: 74 20 69 73 20 61 70 70 72 6f 70 72 69 61 74 65  t is appropriate
4020: 2e 0a 2a 2a 20 49 66 20 69 73 43 6f 6e 74 69 6e  ..** If isContin
4030: 75 61 74 69 6f 6e 20 69 73 20 7a 65 72 6f 2c 20  uation is zero, 
4040: 74 68 65 6e 20 74 68 65 20 6d 61 69 6e 20 70 72  then the main pr
4050: 6f 6d 70 74 20 73 68 6f 75 6c 64 20 62 65 20 75  ompt should be u
4060: 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 50  sed..**.** If zP
4070: 72 69 6f 72 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  rior is not NULL
4080: 20 74 68 65 6e 20 69 74 20 69 73 20 61 20 62 75   then it is a bu
4090: 66 66 65 72 20 66 72 6f 6d 20 61 20 70 72 69 6f  ffer from a prio
40a0: 72 20 63 61 6c 6c 20 74 6f 20 74 68 69 73 0a 2a  r call to this.*
40b0: 2a 20 72 6f 75 74 69 6e 65 20 74 68 61 74 20 63  * routine that c
40c0: 61 6e 20 62 65 20 72 65 75 73 65 64 2e 0a 2a 2a  an be reused..**
40d0: 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 20 69  .** The result i
40e0: 73 20 73 74 6f 72 65 64 20 69 6e 20 73 70 61 63  s stored in spac
40f0: 65 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  e obtained from 
4100: 6d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 6d 75 73  malloc() and mus
4110: 74 20 65 69 74 68 65 72 0a 2a 2a 20 62 65 20 66  t either.** be f
4120: 72 65 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c  reed by the call
4130: 65 72 20 6f 72 20 65 6c 73 65 20 70 61 73 73 65  er or else passe
4140: 64 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 69 73  d back into this
4150: 20 72 6f 75 74 69 6e 65 20 76 69 61 20 74 68 65   routine via the
4160: 0a 2a 2a 20 7a 50 72 69 6f 72 20 61 72 67 75 6d  .** zPrior argum
4170: 65 6e 74 20 66 6f 72 20 72 65 75 73 65 2e 0a 2a  ent for reuse..*
4180: 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 6f  /.static char *o
4190: 6e 65 5f 69 6e 70 75 74 5f 6c 69 6e 65 28 46 49  ne_input_line(FI
41a0: 4c 45 20 2a 69 6e 2c 20 63 68 61 72 20 2a 7a 50  LE *in, char *zP
41b0: 72 69 6f 72 2c 20 69 6e 74 20 69 73 43 6f 6e 74  rior, int isCont
41c0: 69 6e 75 61 74 69 6f 6e 29 7b 0a 20 20 63 68 61  inuation){.  cha
41d0: 72 20 2a 7a 50 72 6f 6d 70 74 3b 0a 20 20 63 68  r *zPrompt;.  ch
41e0: 61 72 20 2a 7a 52 65 73 75 6c 74 3b 0a 20 20 69  ar *zResult;.  i
41f0: 66 28 20 69 6e 21 3d 30 20 29 7b 0a 20 20 20 20  f( in!=0 ){.    
4200: 7a 52 65 73 75 6c 74 20 3d 20 6c 6f 63 61 6c 5f  zResult = local_
4210: 67 65 74 6c 69 6e 65 28 7a 50 72 69 6f 72 2c 20  getline(zPrior, 
4220: 69 6e 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  in);.  }else{.  
4230: 20 20 7a 50 72 6f 6d 70 74 20 3d 20 69 73 43 6f    zPrompt = isCo
4240: 6e 74 69 6e 75 61 74 69 6f 6e 20 3f 20 63 6f 6e  ntinuation ? con
4250: 74 69 6e 75 65 50 72 6f 6d 70 74 20 3a 20 6d 61  tinuePrompt : ma
4260: 69 6e 50 72 6f 6d 70 74 3b 0a 23 69 66 20 53 48  inPrompt;.#if SH
4270: 45 4c 4c 5f 55 53 45 5f 4c 4f 43 41 4c 5f 47 45  ELL_USE_LOCAL_GE
4280: 54 4c 49 4e 45 0a 20 20 20 20 70 72 69 6e 74 66  TLINE.    printf
4290: 28 22 25 73 22 2c 20 7a 50 72 6f 6d 70 74 29 3b  ("%s", zPrompt);
42a0: 0a 20 20 20 20 66 66 6c 75 73 68 28 73 74 64 6f  .    fflush(stdo
42b0: 75 74 29 3b 0a 20 20 20 20 7a 52 65 73 75 6c 74  ut);.    zResult
42c0: 20 3d 20 6c 6f 63 61 6c 5f 67 65 74 6c 69 6e 65   = local_getline
42d0: 28 7a 50 72 69 6f 72 2c 20 73 74 64 69 6e 29 3b  (zPrior, stdin);
42e0: 0a 23 65 6c 73 65 0a 20 20 20 20 66 72 65 65 28  .#else.    free(
42f0: 7a 50 72 69 6f 72 29 3b 0a 20 20 20 20 7a 52 65  zPrior);.    zRe
4300: 73 75 6c 74 20 3d 20 73 68 65 6c 6c 5f 72 65 61  sult = shell_rea
4310: 64 6c 69 6e 65 28 7a 50 72 6f 6d 70 74 29 3b 0a  dline(zPrompt);.
4320: 20 20 20 20 69 66 28 20 7a 52 65 73 75 6c 74 20      if( zResult 
4330: 26 26 20 2a 7a 52 65 73 75 6c 74 20 29 20 73 68  && *zResult ) sh
4340: 65 6c 6c 5f 61 64 64 5f 68 69 73 74 6f 72 79 28  ell_add_history(
4350: 7a 52 65 73 75 6c 74 29 3b 0a 23 65 6e 64 69 66  zResult);.#endif
4360: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 52  .  }.  return zR
4370: 65 73 75 6c 74 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  esult;.}.../*.**
4380: 20 52 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75   Return the valu
4390: 65 20 6f 66 20 61 20 68 65 78 61 64 65 63 69 6d  e of a hexadecim
43a0: 61 6c 20 64 69 67 69 74 2e 20 20 52 65 74 75 72  al digit.  Retur
43b0: 6e 20 2d 31 20 69 66 20 74 68 65 20 69 6e 70 75  n -1 if the inpu
43c0: 74 0a 2a 2a 20 69 73 20 6e 6f 74 20 61 20 68 65  t.** is not a he
43d0: 78 20 64 69 67 69 74 2e 0a 2a 2f 0a 73 74 61 74  x digit..*/.stat
43e0: 69 63 20 69 6e 74 20 68 65 78 44 69 67 69 74 56  ic int hexDigitV
43f0: 61 6c 75 65 28 63 68 61 72 20 63 29 7b 0a 20 20  alue(char c){.  
4400: 69 66 28 20 63 3e 3d 27 30 27 20 26 26 20 63 3c  if( c>='0' && c<
4410: 3d 27 39 27 20 29 20 72 65 74 75 72 6e 20 63 20  ='9' ) return c 
4420: 2d 20 27 30 27 3b 0a 20 20 69 66 28 20 63 3e 3d  - '0';.  if( c>=
4430: 27 61 27 20 26 26 20 63 3c 3d 27 66 27 20 29 20  'a' && c<='f' ) 
4440: 72 65 74 75 72 6e 20 63 20 2d 20 27 61 27 20 2b  return c - 'a' +
4450: 20 31 30 3b 0a 20 20 69 66 28 20 63 3e 3d 27 41   10;.  if( c>='A
4460: 27 20 26 26 20 63 3c 3d 27 46 27 20 29 20 72 65  ' && c<='F' ) re
4470: 74 75 72 6e 20 63 20 2d 20 27 41 27 20 2b 20 31  turn c - 'A' + 1
4480: 30 3b 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a  0;.  return -1;.
4490: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72 70 72  }../*.** Interpr
44a0: 65 74 20 7a 41 72 67 20 61 73 20 61 6e 20 69 6e  et zArg as an in
44b0: 74 65 67 65 72 20 76 61 6c 75 65 2c 20 70 6f 73  teger value, pos
44c0: 73 69 62 6c 79 20 77 69 74 68 20 73 75 66 66 69  sibly with suffi
44d0: 78 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73  xes..*/.static s
44e0: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 6e 74  qlite3_int64 int
44f0: 65 67 65 72 56 61 6c 75 65 28 63 6f 6e 73 74 20  egerValue(const 
4500: 63 68 61 72 20 2a 7a 41 72 67 29 7b 0a 20 20 73  char *zArg){.  s
4510: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 76 20 3d  qlite3_int64 v =
4520: 20 30 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e   0;.  static con
4530: 73 74 20 73 74 72 75 63 74 20 7b 20 63 68 61 72  st struct { char
4540: 20 2a 7a 53 75 66 66 69 78 3b 20 69 6e 74 20 69   *zSuffix; int i
4550: 4d 75 6c 74 3b 20 7d 20 61 4d 75 6c 74 5b 5d 20  Mult; } aMult[] 
4560: 3d 20 7b 0a 20 20 20 20 7b 20 22 4b 69 42 22 2c  = {.    { "KiB",
4570: 20 31 30 32 34 20 7d 2c 0a 20 20 20 20 7b 20 22   1024 },.    { "
4580: 4d 69 42 22 2c 20 31 30 32 34 2a 31 30 32 34 20  MiB", 1024*1024 
4590: 7d 2c 0a 20 20 20 20 7b 20 22 47 69 42 22 2c 20  },.    { "GiB", 
45a0: 31 30 32 34 2a 31 30 32 34 2a 31 30 32 34 20 7d  1024*1024*1024 }
45b0: 2c 0a 20 20 20 20 7b 20 22 4b 42 22 2c 20 20 31  ,.    { "KB",  1
45c0: 30 30 30 20 7d 2c 0a 20 20 20 20 7b 20 22 4d 42  000 },.    { "MB
45d0: 22 2c 20 20 31 30 30 30 30 30 30 20 7d 2c 0a 20  ",  1000000 },. 
45e0: 20 20 20 7b 20 22 47 42 22 2c 20 20 31 30 30 30     { "GB",  1000
45f0: 30 30 30 30 30 30 20 7d 2c 0a 20 20 20 20 7b 20  000000 },.    { 
4600: 22 4b 22 2c 20 20 20 31 30 30 30 20 7d 2c 0a 20  "K",   1000 },. 
4610: 20 20 20 7b 20 22 4d 22 2c 20 20 20 31 30 30 30     { "M",   1000
4620: 30 30 30 20 7d 2c 0a 20 20 20 20 7b 20 22 47 22  000 },.    { "G"
4630: 2c 20 20 20 31 30 30 30 30 30 30 30 30 30 20 7d  ,   1000000000 }
4640: 2c 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69 3b 0a  ,.  };.  int i;.
4650: 20 20 69 6e 74 20 69 73 4e 65 67 20 3d 20 30 3b    int isNeg = 0;
4660: 0a 20 20 69 66 28 20 7a 41 72 67 5b 30 5d 3d 3d  .  if( zArg[0]==
4670: 27 2d 27 20 29 7b 0a 20 20 20 20 69 73 4e 65 67  '-' ){.    isNeg
4680: 20 3d 20 31 3b 0a 20 20 20 20 7a 41 72 67 2b 2b   = 1;.    zArg++
4690: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 41  ;.  }else if( zA
46a0: 72 67 5b 30 5d 3d 3d 27 2b 27 20 29 7b 0a 20 20  rg[0]=='+' ){.  
46b0: 20 20 7a 41 72 67 2b 2b 3b 0a 20 20 7d 0a 20 20    zArg++;.  }.  
46c0: 69 66 28 20 7a 41 72 67 5b 30 5d 3d 3d 27 30 27  if( zArg[0]=='0'
46d0: 20 26 26 20 7a 41 72 67 5b 31 5d 3d 3d 27 78 27   && zArg[1]=='x'
46e0: 20 29 7b 0a 20 20 20 20 69 6e 74 20 78 3b 0a 20   ){.    int x;. 
46f0: 20 20 20 7a 41 72 67 20 2b 3d 20 32 3b 0a 20 20     zArg += 2;.  
4700: 20 20 77 68 69 6c 65 28 20 28 78 20 3d 20 68 65    while( (x = he
4710: 78 44 69 67 69 74 56 61 6c 75 65 28 7a 41 72 67  xDigitValue(zArg
4720: 5b 30 5d 29 29 3e 3d 30 20 29 7b 0a 20 20 20 20  [0]))>=0 ){.    
4730: 20 20 76 20 3d 20 28 76 3c 3c 34 29 20 2b 20 78    v = (v<<4) + x
4740: 3b 0a 20 20 20 20 20 20 7a 41 72 67 2b 2b 3b 0a  ;.      zArg++;.
4750: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
4760: 20 20 20 77 68 69 6c 65 28 20 49 73 44 69 67 69     while( IsDigi
4770: 74 28 7a 41 72 67 5b 30 5d 29 20 29 7b 0a 20 20  t(zArg[0]) ){.  
4780: 20 20 20 20 76 20 3d 20 76 2a 31 30 20 2b 20 7a      v = v*10 + z
4790: 41 72 67 5b 30 5d 20 2d 20 27 30 27 3b 0a 20 20  Arg[0] - '0';.  
47a0: 20 20 20 20 7a 41 72 67 2b 2b 3b 0a 20 20 20 20      zArg++;.    
47b0: 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b  }.  }.  for(i=0;
47c0: 20 69 3c 41 72 72 61 79 53 69 7a 65 28 61 4d 75   i<ArraySize(aMu
47d0: 6c 74 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  lt); i++){.    i
47e0: 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63  f( sqlite3_stric
47f0: 6d 70 28 61 4d 75 6c 74 5b 69 5d 2e 7a 53 75 66  mp(aMult[i].zSuf
4800: 66 69 78 2c 20 7a 41 72 67 29 3d 3d 30 20 29 7b  fix, zArg)==0 ){
4810: 0a 20 20 20 20 20 20 76 20 2a 3d 20 61 4d 75 6c  .      v *= aMul
4820: 74 5b 69 5d 2e 69 4d 75 6c 74 3b 0a 20 20 20 20  t[i].iMult;.    
4830: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
4840: 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 73 4e 65   }.  return isNe
4850: 67 3f 20 2d 76 20 3a 20 76 3b 0a 7d 0a 0a 2f 2a  g? -v : v;.}../*
4860: 0a 2a 2a 20 41 20 76 61 72 69 61 62 6c 65 20 6c  .** A variable l
4870: 65 6e 67 74 68 20 73 74 72 69 6e 67 20 74 6f 20  ength string to 
4880: 77 68 69 63 68 20 6f 6e 65 20 63 61 6e 20 61 70  which one can ap
4890: 70 65 6e 64 20 74 65 78 74 2e 0a 2a 2f 0a 74 79  pend text..*/.ty
48a0: 70 65 64 65 66 20 73 74 72 75 63 74 20 53 68 65  pedef struct She
48b0: 6c 6c 54 65 78 74 20 53 68 65 6c 6c 54 65 78 74  llText ShellText
48c0: 3b 0a 73 74 72 75 63 74 20 53 68 65 6c 6c 54 65  ;.struct ShellTe
48d0: 78 74 20 7b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a  xt {.  char *z;.
48e0: 20 20 69 6e 74 20 6e 3b 0a 20 20 69 6e 74 20 6e    int n;.  int n
48f0: 41 6c 6c 6f 63 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  Alloc;.};../*.**
4900: 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 6e 64 20   Initialize and 
4910: 64 65 73 74 72 6f 79 20 61 20 53 68 65 6c 6c 54  destroy a ShellT
4920: 65 78 74 20 6f 62 6a 65 63 74 0a 2a 2f 0a 73 74  ext object.*/.st
4930: 61 74 69 63 20 76 6f 69 64 20 69 6e 69 74 54 65  atic void initTe
4940: 78 74 28 53 68 65 6c 6c 54 65 78 74 20 2a 70 29  xt(ShellText *p)
4950: 7b 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c  {.  memset(p, 0,
4960: 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 7d 0a   sizeof(*p));.}.
4970: 73 74 61 74 69 63 20 76 6f 69 64 20 66 72 65 65  static void free
4980: 54 65 78 74 28 53 68 65 6c 6c 54 65 78 74 20 2a  Text(ShellText *
4990: 70 29 7b 0a 20 20 66 72 65 65 28 70 2d 3e 7a 29  p){.  free(p->z)
49a0: 3b 0a 20 20 69 6e 69 74 54 65 78 74 28 70 29 3b  ;.  initText(p);
49b0: 0a 7d 0a 0a 2f 2a 20 7a 49 6e 20 69 73 20 65 69  .}../* zIn is ei
49c0: 74 68 65 72 20 61 20 70 6f 69 6e 74 65 72 20 74  ther a pointer t
49d0: 6f 20 61 20 4e 55 4c 4c 2d 74 65 72 6d 69 6e 61  o a NULL-termina
49e0: 74 65 64 20 73 74 72 69 6e 67 20 69 6e 20 6d 65  ted string in me
49f0: 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 0a 2a 2a  mory obtained.**
4a00: 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 28 29 2c 20   from malloc(), 
4a10: 6f 72 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65  or a NULL pointe
4a20: 72 2e 20 54 68 65 20 73 74 72 69 6e 67 20 70 6f  r. The string po
4a30: 69 6e 74 65 64 20 74 6f 20 62 79 20 7a 41 70 70  inted to by zApp
4a40: 65 6e 64 20 69 73 0a 2a 2a 20 61 64 64 65 64 20  end is.** added 
4a50: 74 6f 20 7a 49 6e 2c 20 61 6e 64 20 74 68 65 20  to zIn, and the 
4a60: 72 65 73 75 6c 74 20 72 65 74 75 72 6e 65 64 20  result returned 
4a70: 69 6e 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e  in memory obtain
4a80: 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 28 29  ed from malloc()
4a90: 2e 0a 2a 2a 20 7a 49 6e 2c 20 69 66 20 69 74 20  ..** zIn, if it 
4aa0: 77 61 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69 73  was not NULL, is
4ab0: 20 66 72 65 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66   freed..**.** If
4ac0: 20 74 68 65 20 74 68 69 72 64 20 61 72 67 75 6d   the third argum
4ad0: 65 6e 74 2c 20 71 75 6f 74 65 2c 20 69 73 20 6e  ent, quote, is n
4ae0: 6f 74 20 27 5c 30 27 2c 20 74 68 65 6e 20 69 74  ot '\0', then it
4af0: 20 69 73 20 75 73 65 64 20 61 73 20 61 0a 2a 2a   is used as a.**
4b00: 20 71 75 6f 74 65 20 63 68 61 72 61 63 74 65 72   quote character
4b10: 20 66 6f 72 20 7a 41 70 70 65 6e 64 2e 0a 2a 2f   for zAppend..*/
4b20: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61 70 70  .static void app
4b30: 65 6e 64 54 65 78 74 28 53 68 65 6c 6c 54 65 78  endText(ShellTex
4b40: 74 20 2a 70 2c 20 63 68 61 72 20 63 6f 6e 73 74  t *p, char const
4b50: 20 2a 7a 41 70 70 65 6e 64 2c 20 63 68 61 72 20   *zAppend, char 
4b60: 71 75 6f 74 65 29 7b 0a 20 20 69 6e 74 20 6c 65  quote){.  int le
4b70: 6e 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  n;.  int i;.  in
4b80: 74 20 6e 41 70 70 65 6e 64 20 3d 20 73 74 72 6c  t nAppend = strl
4b90: 65 6e 33 30 28 7a 41 70 70 65 6e 64 29 3b 0a 0a  en30(zAppend);..
4ba0: 20 20 6c 65 6e 20 3d 20 6e 41 70 70 65 6e 64 2b    len = nAppend+
4bb0: 70 2d 3e 6e 2b 31 3b 0a 20 20 69 66 28 20 71 75  p->n+1;.  if( qu
4bc0: 6f 74 65 20 29 7b 0a 20 20 20 20 6c 65 6e 20 2b  ote ){.    len +
4bd0: 3d 20 32 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  = 2;.    for(i=0
4be0: 3b 20 69 3c 6e 41 70 70 65 6e 64 3b 20 69 2b 2b  ; i<nAppend; i++
4bf0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 7a 41 70  ){.      if( zAp
4c00: 70 65 6e 64 5b 69 5d 3d 3d 71 75 6f 74 65 20 29  pend[i]==quote )
4c10: 20 6c 65 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20   len++;.    }.  
4c20: 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 6e 2b 6c 65  }..  if( p->n+le
4c30: 6e 3e 3d 70 2d 3e 6e 41 6c 6c 6f 63 20 29 7b 0a  n>=p->nAlloc ){.
4c40: 20 20 20 20 70 2d 3e 6e 41 6c 6c 6f 63 20 3d 20      p->nAlloc = 
4c50: 70 2d 3e 6e 41 6c 6c 6f 63 2a 32 20 2b 20 6c 65  p->nAlloc*2 + le
4c60: 6e 20 2b 20 32 30 3b 0a 20 20 20 20 70 2d 3e 7a  n + 20;.    p->z
4c70: 20 3d 20 72 65 61 6c 6c 6f 63 28 70 2d 3e 7a 2c   = realloc(p->z,
4c80: 20 70 2d 3e 6e 41 6c 6c 6f 63 29 3b 0a 20 20 20   p->nAlloc);.   
4c90: 20 69 66 28 20 70 2d 3e 7a 3d 3d 30 20 29 20 73   if( p->z==0 ) s
4ca0: 68 65 6c 6c 5f 6f 75 74 5f 6f 66 5f 6d 65 6d 6f  hell_out_of_memo
4cb0: 72 79 28 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  ry();.  }..  if(
4cc0: 20 71 75 6f 74 65 20 29 7b 0a 20 20 20 20 63 68   quote ){.    ch
4cd0: 61 72 20 2a 7a 43 73 72 20 3d 20 70 2d 3e 7a 2b  ar *zCsr = p->z+
4ce0: 70 2d 3e 6e 3b 0a 20 20 20 20 2a 7a 43 73 72 2b  p->n;.    *zCsr+
4cf0: 2b 20 3d 20 71 75 6f 74 65 3b 0a 20 20 20 20 66  + = quote;.    f
4d00: 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 70 70 65 6e  or(i=0; i<nAppen
4d10: 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 2a  d; i++){.      *
4d20: 7a 43 73 72 2b 2b 20 3d 20 7a 41 70 70 65 6e 64  zCsr++ = zAppend
4d30: 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 7a  [i];.      if( z
4d40: 41 70 70 65 6e 64 5b 69 5d 3d 3d 71 75 6f 74 65  Append[i]==quote
4d50: 20 29 20 2a 7a 43 73 72 2b 2b 20 3d 20 71 75 6f   ) *zCsr++ = quo
4d60: 74 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a 7a  te;.    }.    *z
4d70: 43 73 72 2b 2b 20 3d 20 71 75 6f 74 65 3b 0a 20  Csr++ = quote;. 
4d80: 20 20 20 70 2d 3e 6e 20 3d 20 28 69 6e 74 29 28     p->n = (int)(
4d90: 7a 43 73 72 20 2d 20 70 2d 3e 7a 29 3b 0a 20 20  zCsr - p->z);.  
4da0: 20 20 2a 7a 43 73 72 20 3d 20 27 5c 30 27 3b 0a    *zCsr = '\0';.
4db0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6d 65 6d    }else{.    mem
4dc0: 63 70 79 28 70 2d 3e 7a 2b 70 2d 3e 6e 2c 20 7a  cpy(p->z+p->n, z
4dd0: 41 70 70 65 6e 64 2c 20 6e 41 70 70 65 6e 64 29  Append, nAppend)
4de0: 3b 0a 20 20 20 20 70 2d 3e 6e 20 2b 3d 20 6e 41  ;.    p->n += nA
4df0: 70 70 65 6e 64 3b 0a 20 20 20 20 70 2d 3e 7a 5b  ppend;.    p->z[
4e00: 70 2d 3e 6e 5d 20 3d 20 27 5c 30 27 3b 0a 20 20  p->n] = '\0';.  
4e10: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d  }.}../*.** Attem
4e20: 70 74 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  pt to determine 
4e30: 69 66 20 69 64 65 6e 74 69 66 69 65 72 20 7a 4e  if identifier zN
4e40: 61 6d 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20  ame needs to be 
4e50: 71 75 6f 74 65 64 2c 20 65 69 74 68 65 72 0a 2a  quoted, either.*
4e60: 2a 20 62 65 63 61 75 73 65 20 69 74 20 63 6f 6e  * because it con
4e70: 74 61 69 6e 73 20 6e 6f 6e 2d 61 6c 70 68 61 6e  tains non-alphan
4e80: 75 6d 65 72 69 63 20 63 68 61 72 61 63 74 65 72  umeric character
4e90: 73 2c 20 6f 72 20 62 65 63 61 75 73 65 20 69 74  s, or because it
4ea0: 20 69 73 20 61 6e 0a 2a 2a 20 53 51 4c 69 74 65   is an.** SQLite
4eb0: 20 6b 65 79 77 6f 72 64 2e 20 20 42 65 20 63 6f   keyword.  Be co
4ec0: 6e 73 65 72 76 61 74 69 76 65 20 69 6e 20 74 68  nservative in th
4ed0: 69 73 20 65 73 74 69 6d 61 74 65 3a 20 20 57 68  is estimate:  Wh
4ee0: 65 6e 20 69 6e 20 64 6f 75 62 74 20 61 73 73 75  en in doubt assu
4ef0: 6d 65 0a 2a 2a 20 74 68 61 74 20 71 75 6f 74 69  me.** that quoti
4f00: 6e 67 20 69 73 20 72 65 71 75 69 72 65 64 2e 0a  ng is required..
4f10: 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 27 22 27  **.** Return '"'
4f20: 20 69 66 20 71 75 6f 74 69 6e 67 20 69 73 20 72   if quoting is r
4f30: 65 71 75 69 72 65 64 2e 20 20 52 65 74 75 72 6e  equired.  Return
4f40: 20 30 20 69 66 20 6e 6f 20 71 75 6f 74 69 6e 67   0 if no quoting
4f50: 20 69 73 20 72 65 71 75 69 72 65 64 2e 0a 2a 2f   is required..*/
4f60: 0a 73 74 61 74 69 63 20 63 68 61 72 20 71 75 6f  .static char quo
4f70: 74 65 43 68 61 72 28 63 6f 6e 73 74 20 63 68 61  teChar(const cha
4f80: 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e 74  r *zName){.  int
4f90: 20 69 3b 0a 20 20 69 66 28 20 21 69 73 61 6c 70   i;.  if( !isalp
4fa0: 68 61 28 28 75 6e 73 69 67 6e 65 64 20 63 68 61  ha((unsigned cha
4fb0: 72 29 7a 4e 61 6d 65 5b 30 5d 29 20 26 26 20 7a  r)zName[0]) && z
4fc0: 4e 61 6d 65 5b 30 5d 21 3d 27 5f 27 20 29 20 72  Name[0]!='_' ) r
4fd0: 65 74 75 72 6e 20 27 22 27 3b 0a 20 20 66 6f 72  eturn '"';.  for
4fe0: 28 69 3d 30 3b 20 7a 4e 61 6d 65 5b 69 5d 3b 20  (i=0; zName[i]; 
4ff0: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 21 69  i++){.    if( !i
5000: 73 61 6c 6e 75 6d 28 28 75 6e 73 69 67 6e 65 64  salnum((unsigned
5010: 20 63 68 61 72 29 7a 4e 61 6d 65 5b 69 5d 29 20   char)zName[i]) 
5020: 26 26 20 7a 4e 61 6d 65 5b 69 5d 21 3d 27 5f 27  && zName[i]!='_'
5030: 20 29 20 72 65 74 75 72 6e 20 27 22 27 3b 0a 20   ) return '"';. 
5040: 20 7d 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69   }.  return sqli
5050: 74 65 33 5f 6b 65 79 77 6f 72 64 5f 63 68 65 63  te3_keyword_chec
5060: 6b 28 7a 4e 61 6d 65 2c 20 69 29 20 3f 20 27 22  k(zName, i) ? '"
5070: 27 20 3a 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ' : 0;.}../*.** 
5080: 43 6f 6e 73 74 72 75 63 74 20 61 20 66 61 6b 65  Construct a fake
5090: 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 61 6e 64   object name and
50a0: 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 74 6f 20   column list to 
50b0: 64 65 73 63 72 69 62 65 20 74 68 65 20 73 74 72  describe the str
50c0: 75 63 74 75 72 65 0a 2a 2a 20 6f 66 20 74 68 65  ucture.** of the
50d0: 20 76 69 65 77 2c 20 76 69 72 74 75 61 6c 20 74   view, virtual t
50e0: 61 62 6c 65 2c 20 6f 72 20 74 61 62 6c 65 20 76  able, or table v
50f0: 61 6c 75 65 64 20 66 75 6e 63 74 69 6f 6e 20 7a  alued function z
5100: 53 63 68 65 6d 61 2e 7a 4e 61 6d 65 2e 0a 2a 2f  Schema.zName..*/
5110: 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 73 68  .static char *sh
5120: 65 6c 6c 46 61 6b 65 53 63 68 65 6d 61 28 0a 20  ellFakeSchema(. 
5130: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20   sqlite3 *db,   
5140: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
5150: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
5160: 69 6f 6e 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ion containing t
5170: 68 65 20 76 74 61 62 20 2a 2f 0a 20 20 63 6f 6e  he vtab */.  con
5180: 73 74 20 63 68 61 72 20 2a 7a 53 63 68 65 6d 61  st char *zSchema
5190: 2c 20 20 20 20 2f 2a 20 53 63 68 65 6d 61 20 6f  ,    /* Schema o
51a0: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68  f the database h
51b0: 6f 6c 64 69 6e 67 20 74 68 65 20 76 74 61 62 20  olding the vtab 
51c0: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
51d0: 2a 7a 4e 61 6d 65 20 20 20 20 20 20 20 2f 2a 20  *zName       /* 
51e0: 54 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  The name of the 
51f0: 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 2a 2f  virtual table */
5200: 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  .){.  sqlite3_st
5210: 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20  mt *pStmt = 0;. 
5220: 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 53   char *zSql;.  S
5230: 68 65 6c 6c 54 65 78 74 20 73 3b 0a 20 20 63 68  hellText s;.  ch
5240: 61 72 20 63 51 75 6f 74 65 3b 0a 20 20 63 68 61  ar cQuote;.  cha
5250: 72 20 2a 7a 44 69 76 20 3d 20 22 28 22 3b 0a 20  r *zDiv = "(";. 
5260: 20 69 6e 74 20 6e 52 6f 77 20 3d 20 30 3b 0a 0a   int nRow = 0;..
5270: 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33    zSql = sqlite3
5280: 5f 6d 70 72 69 6e 74 66 28 22 50 52 41 47 4d 41  _mprintf("PRAGMA
5290: 20 5c 22 25 77 5c 22 2e 74 61 62 6c 65 5f 69 6e   \"%w\".table_in
52a0: 66 6f 3d 25 51 3b 22 2c 0a 20 20 20 20 20 20 20  fo=%Q;",.       
52b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
52c0: 20 20 7a 53 63 68 65 6d 61 20 3f 20 7a 53 63 68    zSchema ? zSch
52d0: 65 6d 61 20 3a 20 22 6d 61 69 6e 22 2c 20 7a 4e  ema : "main", zN
52e0: 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  ame);.  sqlite3_
52f0: 70 72 65 70 61 72 65 5f 76 32 28 64 62 2c 20 7a  prepare_v2(db, z
5300: 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c  Sql, -1, &pStmt,
5310: 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66   0);.  sqlite3_f
5320: 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 69 6e 69  ree(zSql);.  ini
5330: 74 54 65 78 74 28 26 73 29 3b 0a 20 20 69 66 28  tText(&s);.  if(
5340: 20 7a 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20   zSchema ){.    
5350: 63 51 75 6f 74 65 20 3d 20 71 75 6f 74 65 43 68  cQuote = quoteCh
5360: 61 72 28 7a 53 63 68 65 6d 61 29 3b 0a 20 20 20  ar(zSchema);.   
5370: 20 69 66 28 20 63 51 75 6f 74 65 20 26 26 20 73   if( cQuote && s
5380: 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28 7a  qlite3_stricmp(z
5390: 53 63 68 65 6d 61 2c 22 74 65 6d 70 22 29 3d 3d  Schema,"temp")==
53a0: 30 20 29 20 63 51 75 6f 74 65 20 3d 20 30 3b 0a  0 ) cQuote = 0;.
53b0: 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26      appendText(&
53c0: 73 2c 20 7a 53 63 68 65 6d 61 2c 20 63 51 75 6f  s, zSchema, cQuo
53d0: 74 65 29 3b 0a 20 20 20 20 61 70 70 65 6e 64 54  te);.    appendT
53e0: 65 78 74 28 26 73 2c 20 22 2e 22 2c 20 30 29 3b  ext(&s, ".", 0);
53f0: 0a 20 20 7d 0a 20 20 63 51 75 6f 74 65 20 3d 20  .  }.  cQuote = 
5400: 71 75 6f 74 65 43 68 61 72 28 7a 4e 61 6d 65 29  quoteChar(zName)
5410: 3b 0a 20 20 61 70 70 65 6e 64 54 65 78 74 28 26  ;.  appendText(&
5420: 73 2c 20 7a 4e 61 6d 65 2c 20 63 51 75 6f 74 65  s, zName, cQuote
5430: 29 3b 0a 20 20 77 68 69 6c 65 28 20 73 71 6c 69  );.  while( sqli
5440: 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3d  te3_step(pStmt)=
5450: 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20  =SQLITE_ROW ){. 
5460: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
5470: 43 6f 6c 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  Col = (const cha
5480: 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  r*)sqlite3_colum
5490: 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 31 29  n_text(pStmt, 1)
54a0: 3b 0a 20 20 20 20 6e 52 6f 77 2b 2b 3b 0a 20 20  ;.    nRow++;.  
54b0: 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 2c    appendText(&s,
54c0: 20 7a 44 69 76 2c 20 30 29 3b 0a 20 20 20 20 7a   zDiv, 0);.    z
54d0: 44 69 76 20 3d 20 22 2c 22 3b 0a 20 20 20 20 63  Div = ",";.    c
54e0: 51 75 6f 74 65 20 3d 20 71 75 6f 74 65 43 68 61  Quote = quoteCha
54f0: 72 28 7a 43 6f 6c 29 3b 0a 20 20 20 20 61 70 70  r(zCol);.    app
5500: 65 6e 64 54 65 78 74 28 26 73 2c 20 7a 43 6f 6c  endText(&s, zCol
5510: 2c 20 63 51 75 6f 74 65 29 3b 0a 20 20 7d 0a 20  , cQuote);.  }. 
5520: 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 2c 20   appendText(&s, 
5530: 22 29 22 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74  ")", 0);.  sqlit
5540: 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d  e3_finalize(pStm
5550: 74 29 3b 0a 20 20 69 66 28 20 6e 52 6f 77 3d 3d  t);.  if( nRow==
5560: 30 20 29 7b 0a 20 20 20 20 66 72 65 65 54 65 78  0 ){.    freeTex
5570: 74 28 26 73 29 3b 0a 20 20 20 20 73 2e 7a 20 3d  t(&s);.    s.z =
5580: 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
5590: 20 73 2e 7a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53   s.z;.}../*.** S
55a0: 51 4c 20 66 75 6e 63 74 69 6f 6e 3a 20 20 73 68  QL function:  sh
55b0: 65 6c 6c 5f 6d 6f 64 75 6c 65 5f 73 63 68 65 6d  ell_module_schem
55c0: 61 28 58 29 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  a(X).**.** Retur
55d0: 6e 20 61 20 66 61 6b 65 20 73 63 68 65 6d 61 20  n a fake schema 
55e0: 66 6f 72 20 74 68 65 20 74 61 62 6c 65 2d 76 61  for the table-va
55f0: 6c 75 65 64 20 66 75 6e 63 74 69 6f 6e 20 6f 72  lued function or
5600: 20 65 70 6f 6e 79 6d 6f 75 73 20 76 69 72 74 75   eponymous virtu
5610: 61 6c 0a 2a 2a 20 74 61 62 6c 65 20 58 2e 0a 2a  al.** table X..*
5620: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 68  /.static void sh
5630: 65 6c 6c 4d 6f 64 75 6c 65 53 63 68 65 6d 61 28  ellModuleSchema(
5640: 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  .  sqlite3_conte
5650: 78 74 20 2a 70 43 74 78 2c 0a 20 20 69 6e 74 20  xt *pCtx,.  int 
5660: 6e 56 61 6c 2c 0a 20 20 73 71 6c 69 74 65 33 5f  nVal,.  sqlite3_
5670: 76 61 6c 75 65 20 2a 2a 61 70 56 61 6c 0a 29 7b  value **apVal.){
5680: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
5690: 4e 61 6d 65 20 3d 20 28 63 6f 6e 73 74 20 63 68  Name = (const ch
56a0: 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75  ar*)sqlite3_valu
56b0: 65 5f 74 65 78 74 28 61 70 56 61 6c 5b 30 5d 29  e_text(apVal[0])
56c0: 3b 0a 20 20 63 68 61 72 20 2a 7a 46 61 6b 65 20  ;.  char *zFake 
56d0: 3d 20 73 68 65 6c 6c 46 61 6b 65 53 63 68 65 6d  = shellFakeSchem
56e0: 61 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  a(sqlite3_contex
56f0: 74 5f 64 62 5f 68 61 6e 64 6c 65 28 70 43 74 78  t_db_handle(pCtx
5700: 29 2c 20 30 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  ), 0, zName);.  
5710: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
5720: 28 6e 56 61 6c 29 3b 0a 20 20 69 66 28 20 7a 46  (nVal);.  if( zF
5730: 61 6b 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ake ){.    sqlit
5740: 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 70  e3_result_text(p
5750: 43 74 78 2c 20 73 71 6c 69 74 65 33 5f 6d 70 72  Ctx, sqlite3_mpr
5760: 69 6e 74 66 28 22 2f 2a 20 25 73 20 2a 2f 22 2c  intf("/* %s */",
5770: 20 7a 46 61 6b 65 29 2c 0a 20 20 20 20 20 20 20   zFake),.       
5780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5790: 20 2d 31 2c 20 73 71 6c 69 74 65 33 5f 66 72 65   -1, sqlite3_fre
57a0: 65 29 3b 0a 20 20 20 20 66 72 65 65 28 7a 46 61  e);.    free(zFa
57b0: 6b 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ke);.  }.}../*.*
57c0: 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 3a 20  * SQL function: 
57d0: 20 73 68 65 6c 6c 5f 61 64 64 5f 73 63 68 65 6d   shell_add_schem
57e0: 61 28 53 2c 58 29 0a 2a 2a 0a 2a 2a 20 41 64 64  a(S,X).**.** Add
57f0: 20 74 68 65 20 73 63 68 65 6d 61 20 6e 61 6d 65   the schema name
5800: 20 58 20 74 6f 20 74 68 65 20 43 52 45 41 54 45   X to the CREATE
5810: 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 20 53 20   statement in S 
5820: 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20 72  and return the r
5830: 65 73 75 6c 74 2e 0a 2a 2a 20 45 78 61 6d 70 6c  esult..** Exampl
5840: 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 43 52 45  es:.**.**    CRE
5850: 41 54 45 20 54 41 42 4c 45 20 74 31 28 78 29 20  ATE TABLE t1(x) 
5860: 20 20 2d 3e 20 20 20 43 52 45 41 54 45 20 54 41    ->   CREATE TA
5870: 42 4c 45 20 78 79 7a 2e 74 31 28 78 29 3b 0a 2a  BLE xyz.t1(x);.*
5880: 2a 0a 2a 2a 20 41 6c 73 6f 20 77 6f 72 6b 73 20  *.** Also works 
5890: 6f 6e 0a 2a 2a 0a 2a 2a 20 20 20 20 43 52 45 41  on.**.**    CREA
58a0: 54 45 20 49 4e 44 45 58 0a 2a 2a 20 20 20 20 43  TE INDEX.**    C
58b0: 52 45 41 54 45 20 55 4e 49 51 55 45 20 49 4e 44  REATE UNIQUE IND
58c0: 45 58 0a 2a 2a 20 20 20 20 43 52 45 41 54 45 20  EX.**    CREATE 
58d0: 56 49 45 57 0a 2a 2a 20 20 20 20 43 52 45 41 54  VIEW.**    CREAT
58e0: 45 20 54 52 49 47 47 45 52 0a 2a 2a 20 20 20 20  E TRIGGER.**    
58f0: 43 52 45 41 54 45 20 56 49 52 54 55 41 4c 20 54  CREATE VIRTUAL T
5900: 41 42 4c 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ABLE.**.** This 
5910: 55 44 46 20 69 73 20 75 73 65 64 20 62 79 20 74  UDF is used by t
5920: 68 65 20 2e 73 63 68 65 6d 61 20 63 6f 6d 6d 61  he .schema comma
5930: 6e 64 20 74 6f 20 69 6e 73 65 72 74 20 74 68 65  nd to insert the
5940: 20 73 63 68 65 6d 61 20 6e 61 6d 65 20 6f 66 0a   schema name of.
5950: 2a 2a 20 61 74 74 61 63 68 65 64 20 64 61 74 61  ** attached data
5960: 62 61 73 65 73 20 69 6e 74 6f 20 74 68 65 20 6d  bases into the m
5970: 69 64 64 6c 65 20 6f 66 20 74 68 65 20 73 71 6c  iddle of the sql
5980: 69 74 65 5f 6d 61 73 74 65 72 2e 73 71 6c 20 66  ite_master.sql f
5990: 69 65 6c 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ield..*/.static 
59a0: 76 6f 69 64 20 73 68 65 6c 6c 41 64 64 53 63 68  void shellAddSch
59b0: 65 6d 61 4e 61 6d 65 28 0a 20 20 73 71 6c 69 74  emaName(.  sqlit
59c0: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78  e3_context *pCtx
59d0: 2c 0a 20 20 69 6e 74 20 6e 56 61 6c 2c 0a 20 20  ,.  int nVal,.  
59e0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
59f0: 61 70 56 61 6c 0a 29 7b 0a 20 20 73 74 61 74 69  apVal.){.  stati
5a00: 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 50  c const char *aP
5a10: 72 65 66 69 78 5b 5d 20 3d 20 7b 0a 20 20 20 20  refix[] = {.    
5a20: 20 22 54 41 42 4c 45 22 2c 0a 20 20 20 20 20 22   "TABLE",.     "
5a30: 49 4e 44 45 58 22 2c 0a 20 20 20 20 20 22 55 4e  INDEX",.     "UN
5a40: 49 51 55 45 20 49 4e 44 45 58 22 2c 0a 20 20 20  IQUE INDEX",.   
5a50: 20 20 22 56 49 45 57 22 2c 0a 20 20 20 20 20 22    "VIEW",.     "
5a60: 54 52 49 47 47 45 52 22 2c 0a 20 20 20 20 20 22  TRIGGER",.     "
5a70: 56 49 52 54 55 41 4c 20 54 41 42 4c 45 22 0a 20  VIRTUAL TABLE". 
5a80: 20 7d 3b 0a 20 20 69 6e 74 20 69 20 3d 20 30 3b   };.  int i = 0;
5a90: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
5aa0: 49 6e 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  In = (const char
5ab0: 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  *)sqlite3_value_
5ac0: 74 65 78 74 28 61 70 56 61 6c 5b 30 5d 29 3b 0a  text(apVal[0]);.
5ad0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53    const char *zS
5ae0: 63 68 65 6d 61 20 3d 20 28 63 6f 6e 73 74 20 63  chema = (const c
5af0: 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c  har*)sqlite3_val
5b00: 75 65 5f 74 65 78 74 28 61 70 56 61 6c 5b 31 5d  ue_text(apVal[1]
5b10: 29 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  );.  const char 
5b20: 2a 7a 4e 61 6d 65 20 3d 20 28 63 6f 6e 73 74 20  *zName = (const 
5b30: 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61  char*)sqlite3_va
5b40: 6c 75 65 5f 74 65 78 74 28 61 70 56 61 6c 5b 32  lue_text(apVal[2
5b50: 5d 29 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  ]);.  sqlite3 *d
5b60: 62 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74  b = sqlite3_cont
5b70: 65 78 74 5f 64 62 5f 68 61 6e 64 6c 65 28 70 43  ext_db_handle(pC
5b80: 74 78 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  tx);.  UNUSED_PA
5b90: 52 41 4d 45 54 45 52 28 6e 56 61 6c 29 3b 0a 20  RAMETER(nVal);. 
5ba0: 20 69 66 28 20 7a 49 6e 21 3d 30 20 26 26 20 73   if( zIn!=0 && s
5bb0: 74 72 6e 63 6d 70 28 7a 49 6e 2c 20 22 43 52 45  trncmp(zIn, "CRE
5bc0: 41 54 45 20 22 2c 20 37 29 3d 3d 30 20 29 7b 0a  ATE ", 7)==0 ){.
5bd0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 28      for(i=0; i<(
5be0: 69 6e 74 29 28 73 69 7a 65 6f 66 28 61 50 72 65  int)(sizeof(aPre
5bf0: 66 69 78 29 2f 73 69 7a 65 6f 66 28 61 50 72 65  fix)/sizeof(aPre
5c00: 66 69 78 5b 30 5d 29 29 3b 20 69 2b 2b 29 7b 0a  fix[0])); i++){.
5c10: 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 73 74        int n = st
5c20: 72 6c 65 6e 33 30 28 61 50 72 65 66 69 78 5b 69  rlen30(aPrefix[i
5c30: 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 74  ]);.      if( st
5c40: 72 6e 63 6d 70 28 7a 49 6e 2b 37 2c 20 61 50 72  rncmp(zIn+7, aPr
5c50: 65 66 69 78 5b 69 5d 2c 20 6e 29 3d 3d 30 20 26  efix[i], n)==0 &
5c60: 26 20 7a 49 6e 5b 6e 2b 37 5d 3d 3d 27 20 27 20  & zIn[n+7]==' ' 
5c70: 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  ){.        char 
5c80: 2a 7a 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  *z = 0;.        
5c90: 63 68 61 72 20 2a 7a 46 61 6b 65 20 3d 20 30 3b  char *zFake = 0;
5ca0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 53 63  .        if( zSc
5cb0: 68 65 6d 61 20 29 7b 0a 20 20 20 20 20 20 20 20  hema ){.        
5cc0: 20 20 63 68 61 72 20 63 51 75 6f 74 65 20 3d 20    char cQuote = 
5cd0: 71 75 6f 74 65 43 68 61 72 28 7a 53 63 68 65 6d  quoteChar(zSchem
5ce0: 61 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  a);.          if
5cf0: 28 20 63 51 75 6f 74 65 20 26 26 20 73 71 6c 69  ( cQuote && sqli
5d00: 74 65 33 5f 73 74 72 69 63 6d 70 28 7a 53 63 68  te3_stricmp(zSch
5d10: 65 6d 61 2c 22 74 65 6d 70 22 29 21 3d 30 20 29  ema,"temp")!=0 )
5d20: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 20  {.            z 
5d30: 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
5d40: 66 28 22 25 2e 2a 73 20 5c 22 25 77 5c 22 2e 25  f("%.*s \"%w\".%
5d50: 73 22 2c 20 6e 2b 37 2c 20 7a 49 6e 2c 20 7a 53  s", n+7, zIn, zS
5d60: 63 68 65 6d 61 2c 20 7a 49 6e 2b 6e 2b 38 29 3b  chema, zIn+n+8);
5d70: 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
5d80: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 20  {.            z 
5d90: 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
5da0: 66 28 22 25 2e 2a 73 20 25 73 2e 25 73 22 2c 20  f("%.*s %s.%s", 
5db0: 6e 2b 37 2c 20 7a 49 6e 2c 20 7a 53 63 68 65 6d  n+7, zIn, zSchem
5dc0: 61 2c 20 7a 49 6e 2b 6e 2b 38 29 3b 0a 20 20 20  a, zIn+n+8);.   
5dd0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
5de0: 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a   }.        if( z
5df0: 4e 61 6d 65 0a 20 20 20 20 20 20 20 20 20 26 26  Name.         &&
5e00: 20 61 50 72 65 66 69 78 5b 69 5d 5b 30 5d 3d 3d   aPrefix[i][0]==
5e10: 27 56 27 0a 20 20 20 20 20 20 20 20 20 26 26 20  'V'.         && 
5e20: 28 7a 46 61 6b 65 20 3d 20 73 68 65 6c 6c 46 61  (zFake = shellFa
5e30: 6b 65 53 63 68 65 6d 61 28 64 62 2c 20 7a 53 63  keSchema(db, zSc
5e40: 68 65 6d 61 2c 20 7a 4e 61 6d 65 29 29 21 3d 30  hema, zName))!=0
5e50: 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20  .        ){.    
5e60: 20 20 20 20 20 20 69 66 28 20 7a 3d 3d 30 20 29        if( z==0 )
5e70: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 20  {.            z 
5e80: 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
5e90: 66 28 22 25 73 5c 6e 2f 2a 20 25 73 20 2a 2f 22  f("%s\n/* %s */"
5ea0: 2c 20 7a 49 6e 2c 20 7a 46 61 6b 65 29 3b 0a 20  , zIn, zFake);. 
5eb0: 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
5ec0: 20 20 20 20 20 20 20 20 20 20 20 20 7a 20 3d 20              z = 
5ed0: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
5ee0: 22 25 7a 5c 6e 2f 2a 20 25 73 20 2a 2f 22 2c 20  "%z\n/* %s */", 
5ef0: 7a 2c 20 7a 46 61 6b 65 29 3b 0a 20 20 20 20 20  z, zFake);.     
5f00: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
5f10: 20 66 72 65 65 28 7a 46 61 6b 65 29 3b 0a 20 20   free(zFake);.  
5f20: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
5f30: 69 66 28 20 7a 20 29 7b 0a 20 20 20 20 20 20 20  if( z ){.       
5f40: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
5f50: 74 5f 74 65 78 74 28 70 43 74 78 2c 20 7a 2c 20  t_text(pCtx, z, 
5f60: 2d 31 2c 20 73 71 6c 69 74 65 33 5f 66 72 65 65  -1, sqlite3_free
5f70: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  );.          ret
5f80: 75 72 6e 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  urn;.        }. 
5f90: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
5fa0: 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  .  sqlite3_resul
5fb0: 74 5f 76 61 6c 75 65 28 70 43 74 78 2c 20 61 70  t_value(pCtx, ap
5fc0: 56 61 6c 5b 30 5d 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  Val[0]);.}../*.*
5fd0: 2a 20 54 68 65 20 73 6f 75 72 63 65 20 63 6f 64  * The source cod
5fe0: 65 20 66 6f 72 20 73 65 76 65 72 61 6c 20 72 75  e for several ru
5ff0: 6e 2d 74 69 6d 65 20 6c 6f 61 64 61 62 6c 65 20  n-time loadable 
6000: 65 78 74 65 6e 73 69 6f 6e 73 20 69 73 20 69 6e  extensions is in
6010: 73 65 72 74 65 64 0a 2a 2a 20 62 65 6c 6f 77 20  serted.** below 
6020: 62 79 20 74 68 65 20 2e 2e 2f 74 6f 6f 6c 2f 6d  by the ../tool/m
6030: 6b 73 68 65 6c 6c 63 2e 74 63 6c 20 73 63 72 69  kshellc.tcl scri
6040: 70 74 2e 20 20 42 65 66 6f 72 65 20 70 72 6f 63  pt.  Before proc
6050: 65 73 73 69 6e 67 20 74 68 61 74 20 69 6e 63 6c  essing that incl
6060: 75 64 65 64 0a 2a 2a 20 63 6f 64 65 2c 20 77 65  uded.** code, we
6070: 20 6e 65 65 64 20 74 6f 20 6f 76 65 72 72 69 64   need to overrid
6080: 65 20 73 6f 6d 65 20 6d 61 63 72 6f 73 20 74 6f  e some macros to
6090: 20 6d 61 6b 65 20 74 68 65 20 69 6e 63 6c 75 64   make the includ
60a0: 65 64 20 70 72 6f 67 72 61 6d 20 63 6f 64 65 0a  ed program code.
60b0: 2a 2a 20 77 6f 72 6b 20 68 65 72 65 20 69 6e 20  ** work here in 
60c0: 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 20 74 68  the middle of th
60d0: 69 73 20 72 65 67 75 6c 61 72 20 70 72 6f 67 72  is regular progr
60e0: 61 6d 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 53  am..*/.#define S
60f0: 51 4c 49 54 45 5f 45 58 54 45 4e 53 49 4f 4e 5f  QLITE_EXTENSION_
6100: 49 4e 49 54 31 0a 23 64 65 66 69 6e 65 20 53 51  INIT1.#define SQ
6110: 4c 49 54 45 5f 45 58 54 45 4e 53 49 4f 4e 5f 49  LITE_EXTENSION_I
6120: 4e 49 54 32 28 58 29 20 28 76 6f 69 64 29 28 58  NIT2(X) (void)(X
6130: 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f  )..#if defined(_
6140: 57 49 4e 33 32 29 20 26 26 20 64 65 66 69 6e 65  WIN32) && define
6150: 64 28 5f 4d 53 43 5f 56 45 52 29 0a 49 4e 43 4c  d(_MSC_VER).INCL
6160: 55 44 45 20 74 65 73 74 5f 77 69 6e 64 69 72 65  UDE test_windire
6170: 6e 74 2e 68 0a 49 4e 43 4c 55 44 45 20 74 65 73  nt.h.INCLUDE tes
6180: 74 5f 77 69 6e 64 69 72 65 6e 74 2e 63 0a 23 64  t_windirent.c.#d
6190: 65 66 69 6e 65 20 64 69 72 65 6e 74 20 44 49 52  efine dirent DIR
61a0: 45 4e 54 0a 23 65 6e 64 69 66 0a 49 4e 43 4c 55  ENT.#endif.INCLU
61b0: 44 45 20 2e 2e 2f 65 78 74 2f 6d 69 73 63 2f 73  DE ../ext/misc/s
61c0: 68 61 74 68 72 65 65 2e 63 0a 49 4e 43 4c 55 44  hathree.c.INCLUD
61d0: 45 20 2e 2e 2f 65 78 74 2f 6d 69 73 63 2f 66 69  E ../ext/misc/fi
61e0: 6c 65 69 6f 2e 63 0a 49 4e 43 4c 55 44 45 20 2e  leio.c.INCLUDE .
61f0: 2e 2f 65 78 74 2f 6d 69 73 63 2f 63 6f 6d 70 6c  ./ext/misc/compl
6200: 65 74 69 6f 6e 2e 63 0a 49 4e 43 4c 55 44 45 20  etion.c.INCLUDE 
6210: 2e 2e 2f 65 78 74 2f 6d 69 73 63 2f 61 70 70 65  ../ext/misc/appe
6220: 6e 64 76 66 73 2e 63 0a 49 4e 43 4c 55 44 45 20  ndvfs.c.INCLUDE 
6230: 2e 2e 2f 65 78 74 2f 6d 69 73 63 2f 6d 65 6d 74  ../ext/misc/memt
6240: 72 61 63 65 2e 63 0a 23 69 66 64 65 66 20 53 51  race.c.#ifdef SQ
6250: 4c 49 54 45 5f 48 41 56 45 5f 5a 4c 49 42 0a 49  LITE_HAVE_ZLIB.I
6260: 4e 43 4c 55 44 45 20 2e 2e 2f 65 78 74 2f 6d 69  NCLUDE ../ext/mi
6270: 73 63 2f 7a 69 70 66 69 6c 65 2e 63 0a 49 4e 43  sc/zipfile.c.INC
6280: 4c 55 44 45 20 2e 2e 2f 65 78 74 2f 6d 69 73 63  LUDE ../ext/misc
6290: 2f 73 71 6c 61 72 2e 63 0a 23 65 6e 64 69 66 0a  /sqlar.c.#endif.
62a0: 49 4e 43 4c 55 44 45 20 2e 2e 2f 65 78 74 2f 65  INCLUDE ../ext/e
62b0: 78 70 65 72 74 2f 73 71 6c 69 74 65 33 65 78 70  xpert/sqlite3exp
62c0: 65 72 74 2e 68 0a 49 4e 43 4c 55 44 45 20 2e 2e  ert.h.INCLUDE ..
62d0: 2f 65 78 74 2f 65 78 70 65 72 74 2f 73 71 6c 69  /ext/expert/sqli
62e0: 74 65 33 65 78 70 65 72 74 2e 63 0a 0a 23 69 66  te3expert.c..#if
62f0: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
6300: 45 4e 41 42 4c 45 5f 53 45 53 53 49 4f 4e 29 0a  ENABLE_SESSION).
6310: 2f 2a 0a 2a 2a 20 53 74 61 74 65 20 69 6e 66 6f  /*.** State info
6320: 72 6d 61 74 69 6f 6e 20 66 6f 72 20 61 20 73 69  rmation for a si
6330: 6e 67 6c 65 20 6f 70 65 6e 20 73 65 73 73 69 6f  ngle open sessio
6340: 6e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  n.*/.typedef str
6350: 75 63 74 20 4f 70 65 6e 53 65 73 73 69 6f 6e 20  uct OpenSession 
6360: 4f 70 65 6e 53 65 73 73 69 6f 6e 3b 0a 73 74 72  OpenSession;.str
6370: 75 63 74 20 4f 70 65 6e 53 65 73 73 69 6f 6e 20  uct OpenSession 
6380: 7b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b  {.  char *zName;
6390: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
63a0: 53 79 6d 62 6f 6c 69 63 20 6e 61 6d 65 20 66 6f  Symbolic name fo
63b0: 72 20 74 68 69 73 20 73 65 73 73 69 6f 6e 20 2a  r this session *
63c0: 2f 0a 20 20 69 6e 74 20 6e 46 69 6c 74 65 72 3b  /.  int nFilter;
63d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
63e0: 4e 75 6d 62 65 72 20 6f 66 20 78 46 69 6c 74 65  Number of xFilte
63f0: 72 20 72 65 6a 65 63 74 69 6f 6e 20 47 4c 4f 42  r rejection GLOB
6400: 20 70 61 74 74 65 72 6e 73 20 2a 2f 0a 20 20 63   patterns */.  c
6410: 68 61 72 20 2a 2a 61 7a 46 69 6c 74 65 72 3b 20  har **azFilter; 
6420: 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79          /* Array
6430: 20 6f 66 20 78 46 69 6c 74 65 72 20 72 65 6a 65   of xFilter reje
6440: 63 74 69 6f 6e 20 47 4c 4f 42 20 70 61 74 74 65  ction GLOB patte
6450: 72 6e 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  rns */.  sqlite3
6460: 5f 73 65 73 73 69 6f 6e 20 2a 70 3b 20 20 20 20  _session *p;    
6470: 20 20 2f 2a 20 54 68 65 20 6f 70 65 6e 20 73 65    /* The open se
6480: 73 73 69 6f 6e 20 2a 2f 0a 7d 3b 0a 23 65 6e 64  ssion */.};.#end
6490: 69 66 0a 0a 2f 2a 0a 2a 2a 20 53 68 65 6c 6c 20  if../*.** Shell 
64a0: 6f 75 74 70 75 74 20 6d 6f 64 65 20 69 6e 66 6f  output mode info
64b0: 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 62 65 66  rmation from bef
64c0: 6f 72 65 20 22 2e 65 78 70 6c 61 69 6e 20 6f 6e  ore ".explain on
64d0: 22 2c 0a 2a 2a 20 73 61 76 65 64 20 73 6f 20 74  ",.** saved so t
64e0: 68 61 74 20 69 74 20 63 61 6e 20 62 65 20 72 65  hat it can be re
64f0: 73 74 6f 72 65 64 20 62 79 20 22 2e 65 78 70 6c  stored by ".expl
6500: 61 69 6e 20 6f 66 66 22 0a 2a 2f 0a 74 79 70 65  ain off".*/.type
6510: 64 65 66 20 73 74 72 75 63 74 20 53 61 76 65 64  def struct Saved
6520: 4d 6f 64 65 49 6e 66 6f 20 53 61 76 65 64 4d 6f  ModeInfo SavedMo
6530: 64 65 49 6e 66 6f 3b 0a 73 74 72 75 63 74 20 53  deInfo;.struct S
6540: 61 76 65 64 4d 6f 64 65 49 6e 66 6f 20 7b 0a 20  avedModeInfo {. 
6550: 20 69 6e 74 20 76 61 6c 69 64 3b 20 20 20 20 20   int valid;     
6560: 20 20 20 20 20 2f 2a 20 49 73 20 74 68 65 72 65       /* Is there
6570: 20 6c 65 67 69 74 20 64 61 74 61 20 69 6e 20 68   legit data in h
6580: 65 72 65 3f 20 2a 2f 0a 20 20 69 6e 74 20 6d 6f  ere? */.  int mo
6590: 64 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  de;           /*
65a0: 20 4d 6f 64 65 20 70 72 69 6f 72 20 74 6f 20 22   Mode prior to "
65b0: 2e 65 78 70 6c 61 69 6e 20 6f 6e 22 20 2a 2f 0a  .explain on" */.
65c0: 20 20 69 6e 74 20 73 68 6f 77 48 65 61 64 65 72    int showHeader
65d0: 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 22 2e 68  ;     /* The ".h
65e0: 65 61 64 65 72 22 20 73 65 74 74 69 6e 67 20 70  eader" setting p
65f0: 72 69 6f 72 20 74 6f 20 22 2e 65 78 70 6c 61 69  rior to ".explai
6600: 6e 20 6f 6e 22 20 2a 2f 0a 20 20 69 6e 74 20 63  n on" */.  int c
6610: 6f 6c 57 69 64 74 68 5b 31 30 30 5d 3b 20 20 2f  olWidth[100];  /
6620: 2a 20 43 6f 6c 75 6d 6e 20 77 69 64 74 68 73 20  * Column widths 
6630: 70 72 69 6f 72 20 74 6f 20 22 2e 65 78 70 6c 61  prior to ".expla
6640: 69 6e 20 6f 6e 22 20 2a 2f 0a 7d 3b 0a 0a 74 79  in on" */.};..ty
6650: 70 65 64 65 66 20 73 74 72 75 63 74 20 45 78 70  pedef struct Exp
6660: 65 72 74 49 6e 66 6f 20 45 78 70 65 72 74 49 6e  ertInfo ExpertIn
6670: 66 6f 3b 0a 73 74 72 75 63 74 20 45 78 70 65 72  fo;.struct Exper
6680: 74 49 6e 66 6f 20 7b 0a 20 20 73 71 6c 69 74 65  tInfo {.  sqlite
6690: 33 65 78 70 65 72 74 20 2a 70 45 78 70 65 72 74  3expert *pExpert
66a0: 3b 0a 20 20 69 6e 74 20 62 56 65 72 62 6f 73 65  ;.  int bVerbose
66b0: 3b 0a 7d 3b 0a 0a 2f 2a 20 41 20 73 69 6e 67 6c  ;.};../* A singl
66c0: 65 20 6c 69 6e 65 20 69 6e 20 74 68 65 20 45 51  e line in the EQ
66d0: 50 20 6f 75 74 70 75 74 20 2a 2f 0a 74 79 70 65  P output */.type
66e0: 64 65 66 20 73 74 72 75 63 74 20 45 51 50 47 72  def struct EQPGr
66f0: 61 70 68 52 6f 77 20 45 51 50 47 72 61 70 68 52  aphRow EQPGraphR
6700: 6f 77 3b 0a 73 74 72 75 63 74 20 45 51 50 47 72  ow;.struct EQPGr
6710: 61 70 68 52 6f 77 20 7b 0a 20 20 69 6e 74 20 69  aphRow {.  int i
6720: 45 71 70 49 64 3b 20 20 20 20 20 20 20 20 20 20  EqpId;          
6730: 20 2f 2a 20 49 44 20 66 6f 72 20 74 68 69 73 20   /* ID for this 
6740: 72 6f 77 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61  row */.  int iPa
6750: 72 65 6e 74 49 64 3b 20 20 20 20 20 20 20 20 2f  rentId;        /
6760: 2a 20 49 44 20 6f 66 20 74 68 65 20 70 61 72 65  * ID of the pare
6770: 6e 74 20 72 6f 77 20 2a 2f 0a 20 20 45 51 50 47  nt row */.  EQPG
6780: 72 61 70 68 52 6f 77 20 2a 70 4e 65 78 74 3b 20  raphRow *pNext; 
6790: 20 20 2f 2a 20 4e 65 78 74 20 72 6f 77 20 69 6e    /* Next row in
67a0: 20 73 65 71 75 65 6e 63 65 20 2a 2f 0a 20 20 63   sequence */.  c
67b0: 68 61 72 20 7a 54 65 78 74 5b 31 5d 3b 20 20 20  har zText[1];   
67c0: 20 20 20 20 20 2f 2a 20 54 65 78 74 20 74 6f 20       /* Text to 
67d0: 64 69 73 70 6c 61 79 20 66 6f 72 20 74 68 69 73  display for this
67e0: 20 72 6f 77 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 41   row */.};../* A
67f0: 6c 6c 20 45 51 50 20 6f 75 74 70 75 74 20 69 73  ll EQP output is
6800: 20 63 6f 6c 6c 65 63 74 65 64 20 69 6e 74 6f 20   collected into 
6810: 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  an instance of t
6820: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 2a 2f 0a  he following */.
6830: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 45  typedef struct E
6840: 51 50 47 72 61 70 68 20 45 51 50 47 72 61 70 68  QPGraph EQPGraph
6850: 3b 0a 73 74 72 75 63 74 20 45 51 50 47 72 61 70  ;.struct EQPGrap
6860: 68 20 7b 0a 20 20 45 51 50 47 72 61 70 68 52 6f  h {.  EQPGraphRo
6870: 77 20 2a 70 52 6f 77 3b 20 20 20 20 2f 2a 20 4c  w *pRow;    /* L
6880: 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 61 6c  inked list of al
6890: 6c 20 72 6f 77 73 20 6f 66 20 74 68 65 20 45 51  l rows of the EQ
68a0: 50 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20 45 51  P output */.  EQ
68b0: 50 47 72 61 70 68 52 6f 77 20 2a 70 4c 61 73 74  PGraphRow *pLast
68c0: 3b 20 20 20 2f 2a 20 4c 61 73 74 20 65 6c 65 6d  ;   /* Last elem
68d0: 65 6e 74 20 6f 66 20 74 68 65 20 70 52 6f 77 20  ent of the pRow 
68e0: 6c 69 73 74 20 2a 2f 0a 20 20 63 68 61 72 20 7a  list */.  char z
68f0: 50 72 65 66 69 78 5b 31 30 30 5d 3b 20 20 20 20  Prefix[100];    
6900: 2f 2a 20 47 72 61 70 68 20 70 72 65 66 69 78 20  /* Graph prefix 
6910: 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 53 74 61  */.};../*.** Sta
6920: 74 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61  te information a
6930: 62 6f 75 74 20 74 68 65 20 64 61 74 61 62 61 73  bout the databas
6940: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20  e connection is 
6950: 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 61 6e 0a  contained in an.
6960: 2a 2a 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  ** instance of t
6970: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72  he following str
6980: 75 63 74 75 72 65 2e 0a 2a 2f 0a 74 79 70 65 64  ucture..*/.typed
6990: 65 66 20 73 74 72 75 63 74 20 53 68 65 6c 6c 53  ef struct ShellS
69a0: 74 61 74 65 20 53 68 65 6c 6c 53 74 61 74 65 3b  tate ShellState;
69b0: 0a 73 74 72 75 63 74 20 53 68 65 6c 6c 53 74 61  .struct ShellSta
69c0: 74 65 20 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  te {.  sqlite3 *
69d0: 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  db;           /*
69e0: 20 54 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f   The database */
69f0: 0a 20 20 75 38 20 61 75 74 6f 45 78 70 6c 61 69  .  u8 autoExplai
6a00: 6e 3b 20 20 20 20 20 20 20 20 2f 2a 20 41 75 74  n;        /* Aut
6a10: 6f 6d 61 74 69 63 61 6c 6c 79 20 74 75 72 6e 20  omatically turn 
6a20: 6f 6e 20 2e 65 78 70 6c 61 69 6e 20 6d 6f 64 65  on .explain mode
6a30: 20 2a 2f 0a 20 20 75 38 20 61 75 74 6f 45 51 50   */.  u8 autoEQP
6a40: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
6a50: 52 75 6e 20 45 58 50 4c 41 49 4e 20 51 55 45 52  Run EXPLAIN QUER
6a60: 59 20 50 4c 41 4e 20 70 72 69 6f 72 20 74 6f 20  Y PLAN prior to 
6a70: 73 65 61 63 68 20 53 51 4c 20 73 74 6d 74 20 2a  seach SQL stmt *
6a80: 2f 0a 20 20 75 38 20 61 75 74 6f 45 51 50 74 65  /.  u8 autoEQPte
6a90: 73 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 61 75  st;        /* au
6aa0: 74 6f 45 51 50 20 69 73 20 69 6e 20 74 65 73 74  toEQP is in test
6ab0: 20 6d 6f 64 65 20 2a 2f 0a 20 20 75 38 20 61 75   mode */.  u8 au
6ac0: 74 6f 45 51 50 74 72 61 63 65 3b 20 20 20 20 20  toEQPtrace;     
6ad0: 20 20 2f 2a 20 61 75 74 6f 45 51 50 20 69 73 20    /* autoEQP is 
6ae0: 69 6e 20 74 72 61 63 65 20 6d 6f 64 65 20 2a 2f  in trace mode */
6af0: 0a 20 20 75 38 20 73 74 61 74 73 4f 6e 3b 20 20  .  u8 statsOn;  
6b00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
6b10: 65 20 74 6f 20 64 69 73 70 6c 61 79 20 6d 65 6d  e to display mem
6b20: 6f 72 79 20 73 74 61 74 73 20 62 65 66 6f 72 65  ory stats before
6b30: 20 65 61 63 68 20 66 69 6e 61 6c 69 7a 65 20 2a   each finalize *
6b40: 2f 0a 20 20 75 38 20 73 63 61 6e 73 74 61 74 73  /.  u8 scanstats
6b50: 4f 6e 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72  On;        /* Tr
6b60: 75 65 20 74 6f 20 64 69 73 70 6c 61 79 20 73 63  ue to display sc
6b70: 61 6e 20 73 74 61 74 73 20 62 65 66 6f 72 65 20  an stats before 
6b80: 65 61 63 68 20 66 69 6e 61 6c 69 7a 65 20 2a 2f  each finalize */
6b90: 0a 20 20 75 38 20 6f 70 65 6e 4d 6f 64 65 3b 20  .  u8 openMode; 
6ba0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 48 45            /* SHE
6bb0: 4c 4c 5f 4f 50 45 4e 5f 4e 4f 52 4d 41 4c 2c 20  LL_OPEN_NORMAL, 
6bc0: 5f 41 50 50 45 4e 44 56 46 53 2c 20 6f 72 20 5f  _APPENDVFS, or _
6bd0: 5a 49 50 46 49 4c 45 20 2a 2f 0a 20 20 75 38 20  ZIPFILE */.  u8 
6be0: 64 6f 58 64 67 4f 70 65 6e 3b 20 20 20 20 20 20  doXdgOpen;      
6bf0: 20 20 20 20 2f 2a 20 49 6e 76 6f 6b 65 20 73 74      /* Invoke st
6c00: 61 72 74 2f 6f 70 65 6e 2f 78 64 67 2d 6f 70 65  art/open/xdg-ope
6c10: 6e 20 69 6e 20 6f 75 74 70 75 74 5f 72 65 73 65  n in output_rese
6c20: 74 28 29 20 2a 2f 0a 20 20 75 38 20 6e 45 71 70  t() */.  u8 nEqp
6c30: 4c 65 76 65 6c 3b 20 20 20 20 20 20 20 20 20 20  Level;          
6c40: 2f 2a 20 44 65 70 74 68 20 6f 66 20 74 68 65 20  /* Depth of the 
6c50: 45 51 50 20 6f 75 74 70 75 74 20 67 72 61 70 68  EQP output graph
6c60: 20 2a 2f 0a 20 20 75 38 20 65 54 72 61 63 65 54   */.  u8 eTraceT
6c70: 79 70 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ype;         /* 
6c80: 53 48 45 4c 4c 5f 54 52 41 43 45 5f 2a 20 76 61  SHELL_TRACE_* va
6c90: 6c 75 65 20 66 6f 72 20 74 79 70 65 20 6f 66 20  lue for type of 
6ca0: 74 72 61 63 65 20 2a 2f 0a 20 20 75 6e 73 69 67  trace */.  unsig
6cb0: 6e 65 64 20 6d 45 71 70 4c 69 6e 65 73 3b 20 20  ned mEqpLines;  
6cc0: 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 76 65 72    /* Mask of ver
6cd0: 69 74 69 63 61 6c 20 6c 69 6e 65 73 20 69 6e 20  itical lines in 
6ce0: 74 68 65 20 45 51 50 20 6f 75 74 70 75 74 20 67  the EQP output g
6cf0: 72 61 70 68 20 2a 2f 0a 20 20 69 6e 74 20 6f 75  raph */.  int ou
6d00: 74 43 6f 75 6e 74 3b 20 20 20 20 20 20 20 20 20  tCount;         
6d10: 20 2f 2a 20 52 65 76 65 72 74 20 74 6f 20 73 74   /* Revert to st
6d20: 64 6f 75 74 20 77 68 65 6e 20 72 65 61 63 68 69  dout when reachi
6d30: 6e 67 20 7a 65 72 6f 20 2a 2f 0a 20 20 69 6e 74  ng zero */.  int
6d40: 20 63 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20   cnt;           
6d50: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
6d60: 20 72 65 63 6f 72 64 73 20 64 69 73 70 6c 61 79   records display
6d70: 65 64 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 69  ed so far */.  i
6d80: 6e 74 20 6c 69 6e 65 6e 6f 3b 20 20 20 20 20 20  nt lineno;      
6d90: 20 20 20 20 20 20 2f 2a 20 4c 69 6e 65 20 6e 75        /* Line nu
6da0: 6d 62 65 72 20 6f 66 20 6c 61 73 74 20 6c 69 6e  mber of last lin
6db0: 65 20 72 65 61 64 20 66 72 6f 6d 20 69 6e 20 2a  e read from in *
6dc0: 2f 0a 20 20 46 49 4c 45 20 2a 69 6e 3b 20 20 20  /.  FILE *in;   
6dd0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
6de0: 61 64 20 63 6f 6d 6d 61 6e 64 73 20 66 72 6f 6d  ad commands from
6df0: 20 74 68 69 73 20 73 74 72 65 61 6d 20 2a 2f 0a   this stream */.
6e00: 20 20 46 49 4c 45 20 2a 6f 75 74 3b 20 20 20 20    FILE *out;    
6e10: 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
6e20: 65 20 72 65 73 75 6c 74 73 20 68 65 72 65 20 2a  e results here *
6e30: 2f 0a 20 20 46 49 4c 45 20 2a 74 72 61 63 65 4f  /.  FILE *traceO
6e40: 75 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 4f 75  ut;        /* Ou
6e50: 74 70 75 74 20 66 6f 72 20 73 71 6c 69 74 65 33  tput for sqlite3
6e60: 5f 74 72 61 63 65 28 29 20 2a 2f 0a 20 20 69 6e  _trace() */.  in
6e70: 74 20 6e 45 72 72 3b 20 20 20 20 20 20 20 20 20  t nErr;         
6e80: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
6e90: 66 20 65 72 72 6f 72 73 20 73 65 65 6e 20 2a 2f  f errors seen */
6ea0: 0a 20 20 69 6e 74 20 6d 6f 64 65 3b 20 20 20 20  .  int mode;    
6eb0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20            /* An 
6ec0: 6f 75 74 70 75 74 20 6d 6f 64 65 20 73 65 74 74  output mode sett
6ed0: 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 6d 6f 64  ing */.  int mod
6ee0: 65 50 72 69 6f 72 3b 20 20 20 20 20 20 20 20 20  ePrior;         
6ef0: 2f 2a 20 53 61 76 65 64 20 6d 6f 64 65 20 2a 2f  /* Saved mode */
6f00: 0a 20 20 69 6e 74 20 63 4d 6f 64 65 3b 20 20 20  .  int cMode;   
6f10: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 74 65 6d            /* tem
6f20: 70 6f 72 61 72 79 20 6f 75 74 70 75 74 20 6d 6f  porary output mo
6f30: 64 65 20 66 6f 72 20 74 68 65 20 63 75 72 72 65  de for the curre
6f40: 6e 74 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e  nt query */.  in
6f50: 74 20 6e 6f 72 6d 61 6c 4d 6f 64 65 3b 20 20 20  t normalMode;   
6f60: 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 6d       /* Output m
6f70: 6f 64 65 20 62 65 66 6f 72 65 20 22 2e 65 78 70  ode before ".exp
6f80: 6c 61 69 6e 20 6f 6e 22 20 2a 2f 0a 20 20 69 6e  lain on" */.  in
6f90: 74 20 77 72 69 74 61 62 6c 65 53 63 68 65 6d 61  t writableSchema
6fa0: 3b 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20  ;    /* True if 
6fb0: 50 52 41 47 4d 41 20 77 72 69 74 61 62 6c 65 5f  PRAGMA writable_
6fc0: 73 63 68 65 6d 61 3d 4f 4e 20 2a 2f 0a 20 20 69  schema=ON */.  i
6fd0: 6e 74 20 73 68 6f 77 48 65 61 64 65 72 3b 20 20  nt showHeader;  
6fe0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f        /* True to
6ff0: 20 73 68 6f 77 20 63 6f 6c 75 6d 6e 20 6e 61 6d   show column nam
7000: 65 73 20 69 6e 20 4c 69 73 74 20 6f 72 20 43 6f  es in List or Co
7010: 6c 75 6d 6e 20 6d 6f 64 65 20 2a 2f 0a 20 20 69  lumn mode */.  i
7020: 6e 74 20 6e 43 68 65 63 6b 3b 20 20 20 20 20 20  nt nCheck;      
7030: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
7040: 6f 66 20 22 2e 63 68 65 63 6b 22 20 63 6f 6d 6d  of ".check" comm
7050: 61 6e 64 73 20 72 75 6e 20 2a 2f 0a 20 20 75 6e  ands run */.  un
7060: 73 69 67 6e 65 64 20 6e 50 72 6f 67 72 65 73 73  signed nProgress
7070: 3b 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f  ;    /* Number o
7080: 66 20 70 72 6f 67 72 65 73 73 20 63 61 6c 6c 62  f progress callb
7090: 61 63 6b 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  acks encountered
70a0: 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 6d   */.  unsigned m
70b0: 78 50 72 6f 67 72 65 73 73 3b 20 20 20 2f 2a 20  xProgress;   /* 
70c0: 4d 61 78 69 6d 75 6d 20 70 72 6f 67 72 65 73 73  Maximum progress
70d0: 20 63 61 6c 6c 62 61 63 6b 73 20 62 65 66 6f 72   callbacks befor
70e0: 65 20 66 61 69 6c 69 6e 67 20 2a 2f 0a 20 20 75  e failing */.  u
70f0: 6e 73 69 67 6e 65 64 20 66 6c 67 50 72 6f 67 72  nsigned flgProgr
7100: 65 73 73 3b 20 20 2f 2a 20 46 6c 61 67 73 20 66  ess;  /* Flags f
7110: 6f 72 20 74 68 65 20 70 72 6f 67 72 65 73 73 20  or the progress 
7120: 63 61 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20 75 6e  callback */.  un
7130: 73 69 67 6e 65 64 20 73 68 65 6c 6c 46 6c 67 73  signed shellFlgs
7140: 3b 20 20 20 20 2f 2a 20 56 61 72 69 6f 75 73 20  ;    /* Various 
7150: 66 6c 61 67 73 20 2a 2f 0a 20 20 73 71 6c 69 74  flags */.  sqlit
7160: 65 33 5f 69 6e 74 36 34 20 73 7a 4d 61 78 3b 20  e3_int64 szMax; 
7170: 20 20 2f 2a 20 2d 2d 6d 61 78 73 69 7a 65 20 61    /* --maxsize a
7180: 72 67 75 6d 65 6e 74 20 74 6f 20 2e 6f 70 65 6e  rgument to .open
7190: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 44 65 73   */.  char *zDes
71a0: 74 54 61 62 6c 65 3b 20 20 20 20 20 20 2f 2a 20  tTable;      /* 
71b0: 4e 61 6d 65 20 6f 66 20 64 65 73 74 69 6e 61 74  Name of destinat
71c0: 69 6f 6e 20 74 61 62 6c 65 20 77 68 65 6e 20 4d  ion table when M
71d0: 4f 44 45 5f 49 6e 73 65 72 74 20 2a 2f 0a 20 20  ODE_Insert */.  
71e0: 63 68 61 72 20 2a 7a 54 65 6d 70 46 69 6c 65 3b  char *zTempFile;
71f0: 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 6f 72         /* Tempor
7200: 61 72 79 20 66 69 6c 65 20 74 68 61 74 20 6d 69  ary file that mi
7210: 67 68 74 20 6e 65 65 64 20 64 65 6c 65 74 69 6e  ght need deletin
7220: 67 20 2a 2f 0a 20 20 63 68 61 72 20 7a 54 65 73  g */.  char zTes
7230: 74 63 61 73 65 5b 33 30 5d 3b 20 20 20 20 2f 2a  tcase[30];    /*
7240: 20 4e 61 6d 65 20 6f 66 20 63 75 72 72 65 6e 74   Name of current
7250: 20 74 65 73 74 20 63 61 73 65 20 2a 2f 0a 20 20   test case */.  
7260: 63 68 61 72 20 63 6f 6c 53 65 70 61 72 61 74 6f  char colSeparato
7270: 72 5b 32 30 5d 3b 20 2f 2a 20 43 6f 6c 75 6d 6e  r[20]; /* Column
7280: 20 73 65 70 61 72 61 74 6f 72 20 63 68 61 72 61   separator chara
7290: 63 74 65 72 20 66 6f 72 20 73 65 76 65 72 61 6c  cter for several
72a0: 20 6d 6f 64 65 73 20 2a 2f 0a 20 20 63 68 61 72   modes */.  char
72b0: 20 72 6f 77 53 65 70 61 72 61 74 6f 72 5b 32 30   rowSeparator[20
72c0: 5d 3b 20 2f 2a 20 52 6f 77 20 73 65 70 61 72 61  ]; /* Row separa
72d0: 74 6f 72 20 63 68 61 72 61 63 74 65 72 20 66 6f  tor character fo
72e0: 72 20 4d 4f 44 45 5f 41 73 63 69 69 20 2a 2f 0a  r MODE_Ascii */.
72f0: 20 20 63 68 61 72 20 63 6f 6c 53 65 70 50 72 69    char colSepPri
7300: 6f 72 5b 32 30 5d 3b 20 20 2f 2a 20 53 61 76 65  or[20];  /* Save
7310: 64 20 63 6f 6c 75 6d 6e 20 73 65 70 61 72 61 74  d column separat
7320: 6f 72 20 2a 2f 0a 20 20 63 68 61 72 20 72 6f 77  or */.  char row
7330: 53 65 70 50 72 69 6f 72 5b 32 30 5d 3b 20 20 2f  SepPrior[20];  /
7340: 2a 20 53 61 76 65 64 20 72 6f 77 20 73 65 70 61  * Saved row sepa
7350: 72 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 63  rator */.  int c
7360: 6f 6c 57 69 64 74 68 5b 31 30 30 5d 3b 20 20 20  olWidth[100];   
7370: 20 20 2f 2a 20 52 65 71 75 65 73 74 65 64 20 77    /* Requested w
7380: 69 64 74 68 20 6f 66 20 65 61 63 68 20 63 6f 6c  idth of each col
7390: 75 6d 6e 20 77 68 65 6e 20 69 6e 20 63 6f 6c 75  umn when in colu
73a0: 6d 6e 20 6d 6f 64 65 2a 2f 0a 20 20 69 6e 74 20  mn mode*/.  int 
73b0: 61 63 74 75 61 6c 57 69 64 74 68 5b 31 30 30 5d  actualWidth[100]
73c0: 3b 20 20 2f 2a 20 41 63 74 75 61 6c 20 77 69 64  ;  /* Actual wid
73d0: 74 68 20 6f 66 20 65 61 63 68 20 63 6f 6c 75 6d  th of each colum
73e0: 6e 20 2a 2f 0a 20 20 63 68 61 72 20 6e 75 6c 6c  n */.  char null
73f0: 56 61 6c 75 65 5b 32 30 5d 3b 20 20 20 20 2f 2a  Value[20];    /*
7400: 20 54 68 65 20 74 65 78 74 20 74 6f 20 70 72 69   The text to pri
7410: 6e 74 20 77 68 65 6e 20 61 20 4e 55 4c 4c 20 63  nt when a NULL c
7420: 6f 6d 65 73 20 62 61 63 6b 20 66 72 6f 6d 0a 20  omes back from. 
7430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7440: 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 64          ** the d
7450: 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 63 68 61  atabase */.  cha
7460: 72 20 6f 75 74 66 69 6c 65 5b 46 49 4c 45 4e 41  r outfile[FILENA
7470: 4d 45 5f 4d 41 58 5d 3b 20 2f 2a 20 46 69 6c 65  ME_MAX]; /* File
7480: 6e 61 6d 65 20 66 6f 72 20 2a 6f 75 74 20 2a 2f  name for *out */
7490: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
74a0: 44 62 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20 2f  DbFilename;    /
74b0: 2a 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61  * name of the da
74c0: 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
74d0: 20 63 68 61 72 20 2a 7a 46 72 65 65 4f 6e 43 6c   char *zFreeOnCl
74e0: 6f 73 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ose;         /* 
74f0: 46 69 6c 65 6e 61 6d 65 20 74 6f 20 66 72 65 65  Filename to free
7500: 20 77 68 65 6e 20 63 6c 6f 73 69 6e 67 20 2a 2f   when closing */
7510: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
7520: 56 66 73 3b 20 20 20 20 20 20 20 20 20 20 20 2f  Vfs;           /
7530: 2a 20 4e 61 6d 65 20 6f 66 20 56 46 53 20 74 6f  * Name of VFS to
7540: 20 75 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65   use */.  sqlite
7550: 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 20 20  3_stmt *pStmt;  
7560: 20 2f 2a 20 43 75 72 72 65 6e 74 20 73 74 61 74   /* Current stat
7570: 65 6d 65 6e 74 20 69 66 20 61 6e 79 2e 20 2a 2f  ement if any. */
7580: 0a 20 20 46 49 4c 45 20 2a 70 4c 6f 67 3b 20 20  .  FILE *pLog;  
7590: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
75a0: 74 65 20 6c 6f 67 20 6f 75 74 70 75 74 20 68 65  te log output he
75b0: 72 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 69 49  re */.  int *aiI
75c0: 6e 64 65 6e 74 3b 20 20 20 20 20 20 20 20 20 2f  ndent;         /
75d0: 2a 20 41 72 72 61 79 20 6f 66 20 69 6e 64 65 6e  * Array of inden
75e0: 74 73 20 75 73 65 64 20 69 6e 20 4d 4f 44 45 5f  ts used in MODE_
75f0: 45 78 70 6c 61 69 6e 20 2a 2f 0a 20 20 69 6e 74  Explain */.  int
7600: 20 6e 49 6e 64 65 6e 74 3b 20 20 20 20 20 20 20   nIndent;       
7610: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61      /* Size of a
7620: 72 72 61 79 20 61 69 49 6e 64 65 6e 74 5b 5d 20  rray aiIndent[] 
7630: 2a 2f 0a 20 20 69 6e 74 20 69 49 6e 64 65 6e 74  */.  int iIndent
7640: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  ;           /* I
7650: 6e 64 65 78 20 6f 66 20 63 75 72 72 65 6e 74 20  ndex of current 
7660: 6f 70 20 69 6e 20 61 69 49 6e 64 65 6e 74 5b 5d  op in aiIndent[]
7670: 20 2a 2f 0a 20 20 45 51 50 47 72 61 70 68 20 73   */.  EQPGraph s
7680: 47 72 61 70 68 3b 20 20 20 20 20 20 20 2f 2a 20  Graph;       /* 
7690: 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20  Information for 
76a0: 74 68 65 20 67 72 61 70 68 69 63 61 6c 20 45 58  the graphical EX
76b0: 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e  PLAIN QUERY PLAN
76c0: 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28   */.#if defined(
76d0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 45  SQLITE_ENABLE_SE
76e0: 53 53 49 4f 4e 29 0a 20 20 69 6e 74 20 6e 53 65  SSION).  int nSe
76f0: 73 73 69 6f 6e 3b 20 20 20 20 20 20 20 20 20 20  ssion;          
7700: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
7710: 61 63 74 69 76 65 20 73 65 73 73 69 6f 6e 73 20  active sessions 
7720: 2a 2f 0a 20 20 4f 70 65 6e 53 65 73 73 69 6f 6e  */.  OpenSession
7730: 20 61 53 65 73 73 69 6f 6e 5b 34 5d 3b 20 20 2f   aSession[4];  /
7740: 2a 20 41 72 72 61 79 20 6f 66 20 73 65 73 73 69  * Array of sessi
7750: 6f 6e 73 2e 20 20 5b 30 5d 20 69 73 20 69 6e 20  ons.  [0] is in 
7760: 66 6f 63 75 73 2e 20 2a 2f 0a 23 65 6e 64 69 66  focus. */.#endif
7770: 0a 20 20 45 78 70 65 72 74 49 6e 66 6f 20 65 78  .  ExpertInfo ex
7780: 70 65 72 74 3b 20 20 20 20 20 20 20 20 2f 2a 20  pert;        /* 
7790: 56 61 6c 69 64 20 69 66 20 70 72 65 76 69 6f 75  Valid if previou
77a0: 73 20 63 6f 6d 6d 61 6e 64 20 77 61 73 20 22 2e  s command was ".
77b0: 65 78 70 65 72 74 20 4f 50 54 2e 2e 2e 22 20 2a  expert OPT..." *
77c0: 2f 0a 7d 3b 0a 0a 0a 2f 2a 20 41 6c 6c 6f 77 65  /.};.../* Allowe
77d0: 64 20 76 61 6c 75 65 73 20 66 6f 72 20 53 68 65  d values for She
77e0: 6c 6c 53 74 61 74 65 2e 61 75 74 6f 45 51 50 0a  llState.autoEQP.
77f0: 2a 2f 0a 23 64 65 66 69 6e 65 20 41 55 54 4f 45  */.#define AUTOE
7800: 51 50 5f 6f 66 66 20 20 20 20 20 20 30 20 20 20  QP_off      0   
7810: 20 20 20 20 20 20 20 20 2f 2a 20 41 75 74 6f 6d          /* Autom
7820: 61 74 69 63 20 45 58 50 4c 41 49 4e 20 51 55 45  atic EXPLAIN QUE
7830: 52 59 20 50 4c 41 4e 20 69 73 20 6f 66 66 20 2a  RY PLAN is off *
7840: 2f 0a 23 64 65 66 69 6e 65 20 41 55 54 4f 45 51  /.#define AUTOEQ
7850: 50 5f 6f 6e 20 20 20 20 20 20 20 31 20 20 20 20  P_on       1    
7860: 20 20 20 20 20 20 20 2f 2a 20 41 75 74 6f 6d 61         /* Automa
7870: 74 69 63 20 45 51 50 20 69 73 20 6f 6e 20 2a 2f  tic EQP is on */
7880: 0a 23 64 65 66 69 6e 65 20 41 55 54 4f 45 51 50  .#define AUTOEQP
7890: 5f 74 72 69 67 67 65 72 20 20 32 20 20 20 20 20  _trigger  2     
78a0: 20 20 20 20 20 20 2f 2a 20 4f 6e 20 61 6e 64 20        /* On and 
78b0: 61 6c 73 6f 20 73 68 6f 77 20 70 6c 61 6e 73 20  also show plans 
78c0: 66 6f 72 20 74 72 69 67 67 65 72 73 20 2a 2f 0a  for triggers */.
78d0: 23 64 65 66 69 6e 65 20 41 55 54 4f 45 51 50 5f  #define AUTOEQP_
78e0: 66 75 6c 6c 20 20 20 20 20 33 20 20 20 20 20 20  full     3      
78f0: 20 20 20 20 20 2f 2a 20 53 68 6f 77 20 66 75 6c       /* Show ful
7900: 6c 20 45 58 50 4c 41 49 4e 20 2a 2f 0a 0a 2f 2a  l EXPLAIN */../*
7910: 20 41 6c 6c 6f 77 65 64 20 76 61 6c 75 65 73 20   Allowed values 
7920: 66 6f 72 20 53 68 65 6c 6c 53 74 61 74 65 2e 6f  for ShellState.o
7930: 70 65 6e 4d 6f 64 65 0a 2a 2f 0a 23 64 65 66 69  penMode.*/.#defi
7940: 6e 65 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f 55 4e  ne SHELL_OPEN_UN
7950: 53 50 45 43 20 20 20 20 20 20 30 20 20 20 20 20  SPEC      0     
7960: 20 2f 2a 20 4e 6f 20 6f 70 65 6e 2d 6d 6f 64 65   /* No open-mode
7970: 20 73 70 65 63 69 66 69 65 64 20 2a 2f 0a 23 64   specified */.#d
7980: 65 66 69 6e 65 20 53 48 45 4c 4c 5f 4f 50 45 4e  efine SHELL_OPEN
7990: 5f 4e 4f 52 4d 41 4c 20 20 20 20 20 20 31 20 20  _NORMAL      1  
79a0: 20 20 20 20 2f 2a 20 4e 6f 72 6d 61 6c 20 64 61      /* Normal da
79b0: 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 23  tabase file */.#
79c0: 64 65 66 69 6e 65 20 53 48 45 4c 4c 5f 4f 50 45  define SHELL_OPE
79d0: 4e 5f 41 50 50 45 4e 44 56 46 53 20 20 20 32 20  N_APPENDVFS   2 
79e0: 20 20 20 20 20 2f 2a 20 55 73 65 20 61 70 70 65       /* Use appe
79f0: 6e 64 76 66 73 20 2a 2f 0a 23 64 65 66 69 6e 65  ndvfs */.#define
7a00: 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f 5a 49 50 46   SHELL_OPEN_ZIPF
7a10: 49 4c 45 20 20 20 20 20 33 20 20 20 20 20 20 2f  ILE     3      /
7a20: 2a 20 55 73 65 20 74 68 65 20 7a 69 70 66 69 6c  * Use the zipfil
7a30: 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  e virtual table 
7a40: 2a 2f 0a 23 64 65 66 69 6e 65 20 53 48 45 4c 4c  */.#define SHELL
7a50: 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 20 20  _OPEN_READONLY  
7a60: 20 20 34 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e    4      /* Open
7a70: 20 61 20 6e 6f 72 6d 61 6c 20 64 61 74 61 62 61   a normal databa
7a80: 73 65 20 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a  se read-only */.
7a90: 23 64 65 66 69 6e 65 20 53 48 45 4c 4c 5f 4f 50  #define SHELL_OP
7aa0: 45 4e 5f 44 45 53 45 52 49 41 4c 49 5a 45 20 35  EN_DESERIALIZE 5
7ab0: 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 75 73        /* Open us
7ac0: 69 6e 67 20 73 71 6c 69 74 65 33 5f 64 65 73 65  ing sqlite3_dese
7ad0: 72 69 61 6c 69 7a 65 28 29 20 2a 2f 0a 23 64 65  rialize() */.#de
7ae0: 66 69 6e 65 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f  fine SHELL_OPEN_
7af0: 48 45 58 44 42 20 20 20 20 20 20 20 36 20 20 20  HEXDB       6   
7b00: 20 20 20 2f 2a 20 55 73 65 20 22 64 62 74 6f 74     /* Use "dbtot
7b10: 78 74 22 20 6f 75 74 70 75 74 20 61 73 20 64 61  xt" output as da
7b20: 74 61 20 73 6f 75 72 63 65 20 2a 2f 0a 0a 2f 2a  ta source */../*
7b30: 20 41 6c 6c 6f 77 65 64 20 76 61 6c 75 65 73 20   Allowed values 
7b40: 66 6f 72 20 53 68 65 6c 6c 53 74 61 74 65 2e 65  for ShellState.e
7b50: 54 72 61 63 65 54 79 70 65 0a 2a 2f 0a 23 64 65  TraceType.*/.#de
7b60: 66 69 6e 65 20 53 48 45 4c 4c 5f 54 52 41 43 45  fine SHELL_TRACE
7b70: 5f 50 4c 41 49 4e 20 20 20 20 20 20 30 20 20 20  _PLAIN      0   
7b80: 20 20 20 2f 2a 20 53 68 6f 77 20 69 6e 70 75 74     /* Show input
7b90: 20 53 51 4c 20 74 65 78 74 20 2a 2f 0a 23 64 65   SQL text */.#de
7ba0: 66 69 6e 65 20 53 48 45 4c 4c 5f 54 52 41 43 45  fine SHELL_TRACE
7bb0: 5f 45 58 50 41 4e 44 45 44 20 20 20 31 20 20 20  _EXPANDED   1   
7bc0: 20 20 20 2f 2a 20 53 68 6f 77 20 65 78 70 61 6e     /* Show expan
7bd0: 64 65 64 20 53 51 4c 20 74 65 78 74 20 2a 2f 0a  ded SQL text */.
7be0: 23 64 65 66 69 6e 65 20 53 48 45 4c 4c 5f 54 52  #define SHELL_TR
7bf0: 41 43 45 5f 4e 4f 52 4d 41 4c 49 5a 45 44 20 32  ACE_NORMALIZED 2
7c00: 20 20 20 20 20 20 2f 2a 20 53 68 6f 77 20 6e 6f        /* Show no
7c10: 72 6d 61 6c 69 7a 65 64 20 53 51 4c 20 74 65 78  rmalized SQL tex
7c20: 74 20 2a 2f 0a 0a 2f 2a 20 42 69 74 73 20 69 6e  t */../* Bits in
7c30: 20 74 68 65 20 53 68 65 6c 6c 53 74 61 74 65 2e   the ShellState.
7c40: 66 6c 67 50 72 6f 67 72 65 73 73 20 76 61 72 69  flgProgress vari
7c50: 61 62 6c 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20  able */.#define 
7c60: 53 48 45 4c 4c 5f 50 52 4f 47 52 45 53 53 5f 51  SHELL_PROGRESS_Q
7c70: 55 49 45 54 20 30 78 30 31 20 20 2f 2a 20 4f 6d  UIET 0x01  /* Om
7c80: 69 74 20 61 6e 6e 6f 75 6e 63 69 6e 67 20 65 76  it announcing ev
7c90: 65 72 79 20 70 72 6f 67 72 65 73 73 20 63 61 6c  ery progress cal
7ca0: 6c 62 61 63 6b 20 2a 2f 0a 23 64 65 66 69 6e 65  lback */.#define
7cb0: 20 53 48 45 4c 4c 5f 50 52 4f 47 52 45 53 53 5f   SHELL_PROGRESS_
7cc0: 52 45 53 45 54 20 30 78 30 32 20 20 2f 2a 20 52  RESET 0x02  /* R
7cd0: 65 73 65 74 20 74 68 65 20 63 6f 75 6e 74 20 77  eset the count w
7ce0: 68 65 6e 20 74 68 65 20 70 72 6f 67 72 65 73 0a  hen the progres.
7cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7d10: 20 20 20 2a 2a 20 63 61 6c 6c 62 61 63 6b 20 6c     ** callback l
7d20: 69 6d 69 74 20 69 73 20 72 65 61 63 68 65 64 2c  imit is reached,
7d30: 20 61 6e 64 20 66 6f 72 20 65 61 63 68 0a 20 20   and for each.  
7d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7d60: 20 2a 2a 20 74 6f 70 2d 6c 65 76 65 6c 20 53 51   ** top-level SQ
7d70: 4c 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 23  L statement */.#
7d80: 64 65 66 69 6e 65 20 53 48 45 4c 4c 5f 50 52 4f  define SHELL_PRO
7d90: 47 52 45 53 53 5f 4f 4e 43 45 20 20 30 78 30 34  GRESS_ONCE  0x04
7da0: 20 20 2f 2a 20 43 61 6e 63 65 6c 20 74 68 65 20    /* Cancel the 
7db0: 2d 2d 6c 69 6d 69 74 20 61 66 74 65 72 20 66 69  --limit after fi
7dc0: 72 69 6e 67 20 6f 6e 63 65 20 2a 2f 0a 0a 2f 2a  ring once */../*
7dd0: 0a 2a 2a 20 54 68 65 73 65 20 61 72 65 20 74 68  .** These are th
7de0: 65 20 61 6c 6c 6f 77 65 64 20 73 68 65 6c 6c 46  e allowed shellF
7df0: 6c 67 73 20 76 61 6c 75 65 73 0a 2a 2f 0a 23 64  lgs values.*/.#d
7e00: 65 66 69 6e 65 20 53 48 46 4c 47 5f 50 61 67 65  efine SHFLG_Page
7e10: 63 61 63 68 65 20 20 20 20 20 20 30 78 30 30 30  cache      0x000
7e20: 30 30 30 30 31 20 2f 2a 20 54 68 65 20 2d 2d 70  00001 /* The --p
7e30: 61 67 65 63 61 63 68 65 20 6f 70 74 69 6f 6e 20  agecache option 
7e40: 69 73 20 75 73 65 64 20 2a 2f 0a 23 64 65 66 69  is used */.#defi
7e50: 6e 65 20 53 48 46 4c 47 5f 4c 6f 6f 6b 61 73 69  ne SHFLG_Lookasi
7e60: 64 65 20 20 20 20 20 20 30 78 30 30 30 30 30 30  de      0x000000
7e70: 30 32 20 2f 2a 20 4c 6f 6f 6b 61 73 69 64 65 20  02 /* Lookaside 
7e80: 6d 65 6d 6f 72 79 20 69 73 20 75 73 65 64 20 2a  memory is used *
7e90: 2f 0a 23 64 65 66 69 6e 65 20 53 48 46 4c 47 5f  /.#define SHFLG_
7ea0: 42 61 63 6b 73 6c 61 73 68 20 20 20 20 20 20 30  Backslash      0
7eb0: 78 30 30 30 30 30 30 30 34 20 2f 2a 20 54 68 65  x00000004 /* The
7ec0: 20 2d 2d 62 61 63 6b 73 6c 61 73 68 20 6f 70 74   --backslash opt
7ed0: 69 6f 6e 20 69 73 20 75 73 65 64 20 2a 2f 0a 23  ion is used */.#
7ee0: 64 65 66 69 6e 65 20 53 48 46 4c 47 5f 50 72 65  define SHFLG_Pre
7ef0: 73 65 72 76 65 52 6f 77 69 64 20 20 30 78 30 30  serveRowid  0x00
7f00: 30 30 30 30 30 38 20 2f 2a 20 2e 64 75 6d 70 20  000008 /* .dump 
7f10: 70 72 65 73 65 72 76 65 73 20 72 6f 77 69 64 20  preserves rowid 
7f20: 76 61 6c 75 65 73 20 2a 2f 0a 23 64 65 66 69 6e  values */.#defin
7f30: 65 20 53 48 46 4c 47 5f 4e 65 77 6c 69 6e 65 73  e SHFLG_Newlines
7f40: 20 20 20 20 20 20 20 30 78 30 30 30 30 30 30 31         0x0000001
7f50: 30 20 2f 2a 20 2e 64 75 6d 70 20 2d 2d 6e 65 77  0 /* .dump --new
7f60: 6c 69 6e 65 20 66 6c 61 67 20 2a 2f 0a 23 64 65  line flag */.#de
7f70: 66 69 6e 65 20 53 48 46 4c 47 5f 43 6f 75 6e 74  fine SHFLG_Count
7f80: 43 68 61 6e 67 65 73 20 20 20 30 78 30 30 30 30  Changes   0x0000
7f90: 30 30 32 30 20 2f 2a 20 2e 63 68 61 6e 67 65 73  0020 /* .changes
7fa0: 20 73 65 74 74 69 6e 67 20 2a 2f 0a 23 64 65 66   setting */.#def
7fb0: 69 6e 65 20 53 48 46 4c 47 5f 45 63 68 6f 20 20  ine SHFLG_Echo  
7fc0: 20 20 20 20 20 20 20 20 20 30 78 30 30 30 30 30           0x00000
7fd0: 30 34 30 20 2f 2a 20 2e 65 63 68 6f 20 6f 72 20  040 /* .echo or 
7fe0: 2d 2d 65 63 68 6f 20 73 65 74 74 69 6e 67 20 2a  --echo setting *
7ff0: 2f 0a 0a 2f 2a 0a 2a 2a 20 4d 61 63 72 6f 73 20  /../*.** Macros 
8000: 66 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20  for testing and 
8010: 73 65 74 74 69 6e 67 20 73 68 65 6c 6c 46 6c 67  setting shellFlg
8020: 73 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 53 68 65  s.*/.#define She
8030: 6c 6c 48 61 73 46 6c 61 67 28 50 2c 58 29 20 20  llHasFlag(P,X)  
8040: 20 20 28 28 28 50 29 2d 3e 73 68 65 6c 6c 46 6c    (((P)->shellFl
8050: 67 73 20 26 20 28 58 29 29 21 3d 30 29 0a 23 64  gs & (X))!=0).#d
8060: 65 66 69 6e 65 20 53 68 65 6c 6c 53 65 74 46 6c  efine ShellSetFl
8070: 61 67 28 50 2c 58 29 20 20 20 20 28 28 50 29 2d  ag(P,X)    ((P)-
8080: 3e 73 68 65 6c 6c 46 6c 67 73 7c 3d 28 58 29 29  >shellFlgs|=(X))
8090: 0a 23 64 65 66 69 6e 65 20 53 68 65 6c 6c 43 6c  .#define ShellCl
80a0: 65 61 72 46 6c 61 67 28 50 2c 58 29 20 20 28 28  earFlag(P,X)  ((
80b0: 50 29 2d 3e 73 68 65 6c 6c 46 6c 67 73 26 3d 28  P)->shellFlgs&=(
80c0: 7e 28 58 29 29 29 0a 0a 2f 2a 0a 2a 2a 20 54 68  ~(X)))../*.** Th
80d0: 65 73 65 20 61 72 65 20 74 68 65 20 61 6c 6c 6f  ese are the allo
80e0: 77 65 64 20 6d 6f 64 65 73 2e 0a 2a 2f 0a 23 64  wed modes..*/.#d
80f0: 65 66 69 6e 65 20 4d 4f 44 45 5f 4c 69 6e 65 20  efine MODE_Line 
8100: 20 20 20 20 30 20 20 2f 2a 20 4f 6e 65 20 63 6f      0  /* One co
8110: 6c 75 6d 6e 20 70 65 72 20 6c 69 6e 65 2e 20 20  lumn per line.  
8120: 42 6c 61 6e 6b 20 6c 69 6e 65 20 62 65 74 77 65  Blank line betwe
8130: 65 6e 20 72 65 63 6f 72 64 73 20 2a 2f 0a 23 64  en records */.#d
8140: 65 66 69 6e 65 20 4d 4f 44 45 5f 43 6f 6c 75 6d  efine MODE_Colum
8150: 6e 20 20 20 31 20 20 2f 2a 20 4f 6e 65 20 72 65  n   1  /* One re
8160: 63 6f 72 64 20 70 65 72 20 6c 69 6e 65 20 69 6e  cord per line in
8170: 20 6e 65 61 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f   neat columns */
8180: 0a 23 64 65 66 69 6e 65 20 4d 4f 44 45 5f 4c 69  .#define MODE_Li
8190: 73 74 20 20 20 20 20 32 20 20 2f 2a 20 4f 6e 65  st     2  /* One
81a0: 20 72 65 63 6f 72 64 20 70 65 72 20 6c 69 6e 65   record per line
81b0: 20 77 69 74 68 20 61 20 73 65 70 61 72 61 74 6f   with a separato
81c0: 72 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 4f 44  r */.#define MOD
81d0: 45 5f 53 65 6d 69 20 20 20 20 20 33 20 20 2f 2a  E_Semi     3  /*
81e0: 20 53 61 6d 65 20 61 73 20 4d 4f 44 45 5f 4c 69   Same as MODE_Li
81f0: 73 74 20 62 75 74 20 61 70 70 65 6e 64 20 22 3b  st but append ";
8200: 22 20 74 6f 20 65 61 63 68 20 6c 69 6e 65 20 2a  " to each line *
8210: 2f 0a 23 64 65 66 69 6e 65 20 4d 4f 44 45 5f 48  /.#define MODE_H
8220: 74 6d 6c 20 20 20 20 20 34 20 20 2f 2a 20 47 65  tml     4  /* Ge
8230: 6e 65 72 61 74 65 20 61 6e 20 58 48 54 4d 4c 20  nerate an XHTML 
8240: 74 61 62 6c 65 20 2a 2f 0a 23 64 65 66 69 6e 65  table */.#define
8250: 20 4d 4f 44 45 5f 49 6e 73 65 72 74 20 20 20 35   MODE_Insert   5
8260: 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 53 51    /* Generate SQ
8270: 4c 20 22 69 6e 73 65 72 74 22 20 73 74 61 74 65  L "insert" state
8280: 6d 65 6e 74 73 20 2a 2f 0a 23 64 65 66 69 6e 65  ments */.#define
8290: 20 4d 4f 44 45 5f 51 75 6f 74 65 20 20 20 20 36   MODE_Quote    6
82a0: 20 20 2f 2a 20 51 75 6f 74 65 20 76 61 6c 75 65    /* Quote value
82b0: 73 20 61 73 20 66 6f 72 20 53 51 4c 20 2a 2f 0a  s as for SQL */.
82c0: 23 64 65 66 69 6e 65 20 4d 4f 44 45 5f 54 63 6c  #define MODE_Tcl
82d0: 20 20 20 20 20 20 37 20 20 2f 2a 20 47 65 6e 65        7  /* Gene
82e0: 72 61 74 65 20 41 4e 53 49 2d 43 20 6f 72 20 54  rate ANSI-C or T
82f0: 43 4c 20 71 75 6f 74 65 64 20 65 6c 65 6d 65 6e  CL quoted elemen
8300: 74 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 4f  ts */.#define MO
8310: 44 45 5f 43 73 76 20 20 20 20 20 20 38 20 20 2f  DE_Csv      8  /
8320: 2a 20 51 75 6f 74 65 20 73 74 72 69 6e 67 73 2c  * Quote strings,
8330: 20 6e 75 6d 62 65 72 73 20 61 72 65 20 70 6c 61   numbers are pla
8340: 69 6e 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 4f  in */.#define MO
8350: 44 45 5f 45 78 70 6c 61 69 6e 20 20 39 20 20 2f  DE_Explain  9  /
8360: 2a 20 4c 69 6b 65 20 4d 4f 44 45 5f 43 6f 6c 75  * Like MODE_Colu
8370: 6d 6e 2c 20 62 75 74 20 64 6f 20 6e 6f 74 20 74  mn, but do not t
8380: 72 75 6e 63 61 74 65 20 64 61 74 61 20 2a 2f 0a  runcate data */.
8390: 23 64 65 66 69 6e 65 20 4d 4f 44 45 5f 41 73 63  #define MODE_Asc
83a0: 69 69 20 20 20 31 30 20 20 2f 2a 20 55 73 65 20  ii   10  /* Use 
83b0: 41 53 43 49 49 20 75 6e 69 74 20 61 6e 64 20 72  ASCII unit and r
83c0: 65 63 6f 72 64 20 73 65 70 61 72 61 74 6f 72 73  ecord separators
83d0: 20 28 30 78 31 46 2f 30 78 31 45 29 20 2a 2f 0a   (0x1F/0x1E) */.
83e0: 23 64 65 66 69 6e 65 20 4d 4f 44 45 5f 50 72 65  #define MODE_Pre
83f0: 74 74 79 20 20 31 31 20 20 2f 2a 20 50 72 65 74  tty  11  /* Pret
8400: 74 79 2d 70 72 69 6e 74 20 73 63 68 65 6d 61 73  ty-print schemas
8410: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 4f 44 45   */.#define MODE
8420: 5f 45 51 50 20 20 20 20 20 31 32 20 20 2f 2a 20  _EQP     12  /* 
8430: 43 6f 6e 76 65 72 74 73 20 45 58 50 4c 41 49 4e  Converts EXPLAIN
8440: 20 51 55 45 52 59 20 50 4c 41 4e 20 6f 75 74 70   QUERY PLAN outp
8450: 75 74 20 69 6e 74 6f 20 61 20 67 72 61 70 68 20  ut into a graph 
8460: 2a 2f 0a 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  */..static const
8470: 20 63 68 61 72 20 2a 6d 6f 64 65 44 65 73 63 72   char *modeDescr
8480: 5b 5d 20 3d 20 7b 0a 20 20 22 6c 69 6e 65 22 2c  [] = {.  "line",
8490: 0a 20 20 22 63 6f 6c 75 6d 6e 22 2c 0a 20 20 22  .  "column",.  "
84a0: 6c 69 73 74 22 2c 0a 20 20 22 73 65 6d 69 22 2c  list",.  "semi",
84b0: 0a 20 20 22 68 74 6d 6c 22 2c 0a 20 20 22 69 6e  .  "html",.  "in
84c0: 73 65 72 74 22 2c 0a 20 20 22 71 75 6f 74 65 22  sert",.  "quote"
84d0: 2c 0a 20 20 22 74 63 6c 22 2c 0a 20 20 22 63 73  ,.  "tcl",.  "cs
84e0: 76 22 2c 0a 20 20 22 65 78 70 6c 61 69 6e 22 2c  v",.  "explain",
84f0: 0a 20 20 22 61 73 63 69 69 22 2c 0a 20 20 22 70  .  "ascii",.  "p
8500: 72 65 74 74 79 70 72 69 6e 74 22 2c 0a 20 20 22  rettyprint",.  "
8510: 65 71 70 22 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54  eqp".};../*.** T
8520: 68 65 73 65 20 61 72 65 20 74 68 65 20 63 6f 6c  hese are the col
8530: 75 6d 6e 2f 72 6f 77 2f 6c 69 6e 65 20 73 65 70  umn/row/line sep
8540: 61 72 61 74 6f 72 73 20 75 73 65 64 20 62 79 20  arators used by 
8550: 74 68 65 20 76 61 72 69 6f 75 73 0a 2a 2a 20 69  the various.** i
8560: 6d 70 6f 72 74 2f 65 78 70 6f 72 74 20 6d 6f 64  mport/export mod
8570: 65 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 53  es..*/.#define S
8580: 45 50 5f 43 6f 6c 75 6d 6e 20 20 20 20 22 7c 22  EP_Column    "|"
8590: 0a 23 64 65 66 69 6e 65 20 53 45 50 5f 52 6f 77  .#define SEP_Row
85a0: 20 20 20 20 20 20 20 22 5c 6e 22 0a 23 64 65 66         "\n".#def
85b0: 69 6e 65 20 53 45 50 5f 54 61 62 20 20 20 20 20  ine SEP_Tab     
85c0: 20 20 22 5c 74 22 0a 23 64 65 66 69 6e 65 20 53    "\t".#define S
85d0: 45 50 5f 53 70 61 63 65 20 20 20 20 20 22 20 22  EP_Space     " "
85e0: 0a 23 64 65 66 69 6e 65 20 53 45 50 5f 43 6f 6d  .#define SEP_Com
85f0: 6d 61 20 20 20 20 20 22 2c 22 0a 23 64 65 66 69  ma     ",".#defi
8600: 6e 65 20 53 45 50 5f 43 72 4c 66 20 20 20 20 20  ne SEP_CrLf     
8610: 20 22 5c 72 5c 6e 22 0a 23 64 65 66 69 6e 65 20   "\r\n".#define 
8620: 53 45 50 5f 55 6e 69 74 20 20 20 20 20 20 22 5c  SEP_Unit      "\
8630: 78 31 46 22 0a 23 64 65 66 69 6e 65 20 53 45 50  x1F".#define SEP
8640: 5f 52 65 63 6f 72 64 20 20 20 20 22 5c 78 31 45  _Record    "\x1E
8650: 22 0a 0a 2f 2a 0a 2a 2a 20 41 20 63 61 6c 6c 62  "../*.** A callb
8660: 61 63 6b 20 66 6f 72 20 74 68 65 20 73 71 6c 69  ack for the sqli
8670: 74 65 33 5f 6c 6f 67 28 29 20 69 6e 74 65 72 66  te3_log() interf
8680: 61 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ace..*/.static v
8690: 6f 69 64 20 73 68 65 6c 6c 4c 6f 67 28 76 6f 69  oid shellLog(voi
86a0: 64 20 2a 70 41 72 67 2c 20 69 6e 74 20 69 45 72  d *pArg, int iEr
86b0: 72 43 6f 64 65 2c 20 63 6f 6e 73 74 20 63 68 61  rCode, const cha
86c0: 72 20 2a 7a 4d 73 67 29 7b 0a 20 20 53 68 65 6c  r *zMsg){.  Shel
86d0: 6c 53 74 61 74 65 20 2a 70 20 3d 20 28 53 68 65  lState *p = (She
86e0: 6c 6c 53 74 61 74 65 2a 29 70 41 72 67 3b 0a 20  llState*)pArg;. 
86f0: 20 69 66 28 20 70 2d 3e 70 4c 6f 67 3d 3d 30 20   if( p->pLog==0 
8700: 29 20 72 65 74 75 72 6e 3b 0a 20 20 75 74 66 38  ) return;.  utf8
8710: 5f 70 72 69 6e 74 66 28 70 2d 3e 70 4c 6f 67 2c  _printf(p->pLog,
8720: 20 22 28 25 64 29 20 25 73 5c 6e 22 2c 20 69 45   "(%d) %s\n", iE
8730: 72 72 43 6f 64 65 2c 20 7a 4d 73 67 29 3b 0a 20  rrCode, zMsg);. 
8740: 20 66 66 6c 75 73 68 28 70 2d 3e 70 4c 6f 67 29   fflush(p->pLog)
8750: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 51 4c 20 66  ;.}../*.** SQL f
8760: 75 6e 63 74 69 6f 6e 3a 20 20 73 68 65 6c 6c 5f  unction:  shell_
8770: 70 75 74 73 6e 6c 28 58 29 0a 2a 2a 0a 2a 2a 20  putsnl(X).**.** 
8780: 57 72 69 74 65 20 74 68 65 20 74 65 78 74 20 58  Write the text X
8790: 20 74 6f 20 74 68 65 20 73 63 72 65 65 6e 20 28   to the screen (
87a0: 6f 72 20 77 68 61 74 65 76 65 72 20 6f 75 74 70  or whatever outp
87b0: 75 74 20 69 73 20 62 65 69 6e 67 20 64 69 72 65  ut is being dire
87c0: 63 74 65 64 29 0a 2a 2a 20 61 64 64 69 6e 67 20  cted).** adding 
87d0: 61 20 6e 65 77 6c 69 6e 65 20 61 74 20 74 68 65  a newline at the
87e0: 20 65 6e 64 2c 20 61 6e 64 20 74 68 65 6e 20 72   end, and then r
87f0: 65 74 75 72 6e 20 58 2e 0a 2a 2f 0a 73 74 61 74  eturn X..*/.stat
8800: 69 63 20 76 6f 69 64 20 73 68 65 6c 6c 50 75 74  ic void shellPut
8810: 73 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33  sFunc(.  sqlite3
8820: 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c 0a  _context *pCtx,.
8830: 20 20 69 6e 74 20 6e 56 61 6c 2c 0a 20 20 73 71    int nVal,.  sq
8840: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70  lite3_value **ap
8850: 56 61 6c 0a 29 7b 0a 20 20 53 68 65 6c 6c 53 74  Val.){.  ShellSt
8860: 61 74 65 20 2a 70 20 3d 20 28 53 68 65 6c 6c 53  ate *p = (ShellS
8870: 74 61 74 65 2a 29 73 71 6c 69 74 65 33 5f 75 73  tate*)sqlite3_us
8880: 65 72 5f 64 61 74 61 28 70 43 74 78 29 3b 0a 20  er_data(pCtx);. 
8890: 20 28 76 6f 69 64 29 6e 56 61 6c 3b 0a 20 20 75   (void)nVal;.  u
88a0: 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  tf8_printf(p->ou
88b0: 74 2c 20 22 25 73 5c 6e 22 2c 20 73 71 6c 69 74  t, "%s\n", sqlit
88c0: 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 70  e3_value_text(ap
88d0: 56 61 6c 5b 30 5d 29 29 3b 0a 20 20 73 71 6c 69  Val[0]));.  sqli
88e0: 74 65 33 5f 72 65 73 75 6c 74 5f 76 61 6c 75 65  te3_result_value
88f0: 28 70 43 74 78 2c 20 61 70 56 61 6c 5b 30 5d 29  (pCtx, apVal[0])
8900: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 51 4c 20 66  ;.}../*.** SQL f
8910: 75 6e 63 74 69 6f 6e 3a 20 20 20 65 64 69 74 28  unction:   edit(
8920: 56 41 4c 55 45 29 0a 2a 2a 20 20 20 20 20 20 20  VALUE).**       
8930: 20 20 20 20 20 20 20 20 20 20 65 64 69 74 28 56            edit(V
8940: 41 4c 55 45 2c 45 44 49 54 4f 52 29 0a 2a 2a 0a  ALUE,EDITOR).**.
8950: 2a 2a 20 54 68 65 73 65 20 73 74 65 70 73 3a 0a  ** These steps:.
8960: 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 57 72  **.**     (1) Wr
8970: 69 74 65 20 56 41 4c 55 45 20 69 6e 74 6f 20 61  ite VALUE into a
8980: 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e   temporary file.
8990: 0a 2a 2a 20 20 20 20 20 28 32 29 20 52 75 6e 20  .**     (2) Run 
89a0: 70 72 6f 67 72 61 6d 20 45 44 49 54 4f 52 20 6f  program EDITOR o
89b0: 6e 20 74 68 61 74 20 74 65 6d 70 6f 72 61 72 79  n that temporary
89c0: 20 66 69 6c 65 2e 0a 2a 2a 20 20 20 20 20 28 33   file..**     (3
89d0: 29 20 52 65 61 64 20 74 68 65 20 74 65 6d 70 6f  ) Read the tempo
89e0: 72 61 72 79 20 66 69 6c 65 20 62 61 63 6b 20 61  rary file back a
89f0: 6e 64 20 72 65 74 75 72 6e 20 69 74 73 20 63 6f  nd return its co
8a00: 6e 74 65 6e 74 20 61 73 20 74 68 65 20 72 65 73  ntent as the res
8a10: 75 6c 74 2e 0a 2a 2a 20 20 20 20 20 28 34 29 20  ult..**     (4) 
8a20: 44 65 6c 65 74 65 20 74 68 65 20 74 65 6d 70 6f  Delete the tempo
8a30: 72 61 72 79 20 66 69 6c 65 0a 2a 2a 0a 2a 2a 20  rary file.**.** 
8a40: 49 66 20 74 68 65 20 45 44 49 54 4f 52 20 61 72  If the EDITOR ar
8a50: 67 75 6d 65 6e 74 20 69 73 20 6f 6d 69 74 74 65  gument is omitte
8a60: 64 2c 20 75 73 65 20 74 68 65 20 76 61 6c 75 65  d, use the value
8a70: 20 69 6e 20 74 68 65 20 56 49 53 55 41 4c 0a 2a   in the VISUAL.*
8a80: 2a 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20 76 61  * environment va
8a90: 72 69 61 62 6c 65 2e 20 20 49 66 20 73 74 69 6c  riable.  If stil
8aa0: 6c 20 74 68 65 72 65 20 69 73 20 6e 6f 20 45 44  l there is no ED
8ab0: 49 54 4f 52 2c 20 74 68 72 6f 75 67 68 20 61 6e  ITOR, through an
8ac0: 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 41 6c   error..**.** Al
8ad0: 73 6f 20 74 68 72 6f 77 20 61 6e 20 65 72 72 6f  so throw an erro
8ae0: 72 20 69 66 20 74 68 65 20 45 44 49 54 4f 52 20  r if the EDITOR 
8af0: 70 72 6f 67 72 61 6d 20 72 65 74 75 72 6e 73 20  program returns 
8b00: 61 20 6e 6f 6e 2d 7a 65 72 6f 20 65 78 69 74 20  a non-zero exit 
8b10: 63 6f 64 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  code..*/.#ifndef
8b20: 20 53 51 4c 49 54 45 5f 4e 4f 48 41 56 45 5f 53   SQLITE_NOHAVE_S
8b30: 59 53 54 45 4d 0a 73 74 61 74 69 63 20 76 6f 69  YSTEM.static voi
8b40: 64 20 65 64 69 74 46 75 6e 63 28 0a 20 20 73 71  d editFunc(.  sq
8b50: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63  lite3_context *c
8b60: 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20 61 72  ontext,.  int ar
8b70: 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61  gc,.  sqlite3_va
8b80: 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20  lue **argv.){.  
8b90: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 64 69  const char *zEdi
8ba0: 74 6f 72 3b 0a 20 20 63 68 61 72 20 2a 7a 54 65  tor;.  char *zTe
8bb0: 6d 70 46 69 6c 65 20 3d 20 30 3b 0a 20 20 73 71  mpFile = 0;.  sq
8bc0: 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 63 68 61  lite3 *db;.  cha
8bd0: 72 20 2a 7a 43 6d 64 20 3d 20 30 3b 0a 20 20 69  r *zCmd = 0;.  i
8be0: 6e 74 20 62 42 69 6e 3b 0a 20 20 69 6e 74 20 72  nt bBin;.  int r
8bf0: 63 3b 0a 20 20 69 6e 74 20 68 61 73 43 52 4e 4c  c;.  int hasCRNL
8c00: 20 3d 20 30 3b 0a 20 20 46 49 4c 45 20 2a 66 20   = 0;.  FILE *f 
8c10: 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69  = 0;.  sqlite3_i
8c20: 6e 74 36 34 20 73 7a 3b 0a 20 20 73 71 6c 69 74  nt64 sz;.  sqlit
8c30: 65 33 5f 69 6e 74 36 34 20 78 3b 0a 20 20 75 6e  e3_int64 x;.  un
8c40: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 20 3d  signed char *p =
8c50: 20 30 3b 0a 0a 20 20 69 66 28 20 61 72 67 63 3d   0;..  if( argc=
8c60: 3d 32 20 29 7b 0a 20 20 20 20 7a 45 64 69 74 6f  =2 ){.    zEdito
8c70: 72 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a  r = (const char*
8c80: 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  )sqlite3_value_t
8c90: 65 78 74 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20  ext(argv[1]);.  
8ca0: 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 45 64 69 74  }else{.    zEdit
8cb0: 6f 72 20 3d 20 67 65 74 65 6e 76 28 22 56 49 53  or = getenv("VIS
8cc0: 55 41 4c 22 29 3b 0a 20 20 7d 0a 20 20 69 66 28  UAL");.  }.  if(
8cd0: 20 7a 45 64 69 74 6f 72 3d 3d 30 20 29 7b 0a 20   zEditor==0 ){. 
8ce0: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
8cf0: 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c  t_error(context,
8d00: 20 22 6e 6f 20 65 64 69 74 6f 72 20 66 6f 72 20   "no editor for 
8d10: 65 64 69 74 28 29 22 2c 20 2d 31 29 3b 0a 20 20  edit()", -1);.  
8d20: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
8d30: 69 66 28 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  if( sqlite3_valu
8d40: 65 5f 74 79 70 65 28 61 72 67 76 5b 30 5d 29 3d  e_type(argv[0])=
8d50: 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 20 29 7b 0a  =SQLITE_NULL ){.
8d60: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
8d70: 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78 74  lt_error(context
8d80: 2c 20 22 4e 55 4c 4c 20 69 6e 70 75 74 20 74 6f  , "NULL input to
8d90: 20 65 64 69 74 28 29 22 2c 20 2d 31 29 3b 0a 20   edit()", -1);. 
8da0: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
8db0: 20 64 62 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f   db = sqlite3_co
8dc0: 6e 74 65 78 74 5f 64 62 5f 68 61 6e 64 6c 65 28  ntext_db_handle(
8dd0: 63 6f 6e 74 65 78 74 29 3b 0a 20 20 7a 54 65 6d  context);.  zTem
8de0: 70 46 69 6c 65 20 3d 20 30 3b 0a 20 20 73 71 6c  pFile = 0;.  sql
8df0: 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f  ite3_file_contro
8e00: 6c 28 64 62 2c 20 30 2c 20 53 51 4c 49 54 45 5f  l(db, 0, SQLITE_
8e10: 46 43 4e 54 4c 5f 54 45 4d 50 46 49 4c 45 4e 41  FCNTL_TEMPFILENA
8e20: 4d 45 2c 20 26 7a 54 65 6d 70 46 69 6c 65 29 3b  ME, &zTempFile);
8e30: 0a 20 20 69 66 28 20 7a 54 65 6d 70 46 69 6c 65  .  if( zTempFile
8e40: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
8e50: 65 33 5f 75 69 6e 74 36 34 20 72 20 3d 20 30 3b  e3_uint64 r = 0;
8e60: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 61 6e  .    sqlite3_ran
8e70: 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28 72  domness(sizeof(r
8e80: 29 2c 20 26 72 29 3b 0a 20 20 20 20 7a 54 65 6d  ), &r);.    zTem
8e90: 70 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 5f  pFile = sqlite3_
8ea0: 6d 70 72 69 6e 74 66 28 22 74 65 6d 70 25 6c 6c  mprintf("temp%ll
8eb0: 78 22 2c 20 72 29 3b 0a 20 20 20 20 69 66 28 20  x", r);.    if( 
8ec0: 7a 54 65 6d 70 46 69 6c 65 3d 3d 30 20 29 7b 0a  zTempFile==0 ){.
8ed0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
8ee0: 73 75 6c 74 5f 65 72 72 6f 72 5f 6e 6f 6d 65 6d  sult_error_nomem
8ef0: 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 20  (context);.     
8f00: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20   return;.    }. 
8f10: 20 7d 0a 20 20 62 42 69 6e 20 3d 20 73 71 6c 69   }.  bBin = sqli
8f20: 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 61  te3_value_type(a
8f30: 72 67 76 5b 30 5d 29 3d 3d 53 51 4c 49 54 45 5f  rgv[0])==SQLITE_
8f40: 42 4c 4f 42 3b 0a 20 20 2f 2a 20 57 68 65 6e 20  BLOB;.  /* When 
8f50: 77 72 69 74 69 6e 67 20 74 68 65 20 66 69 6c 65  writing the file
8f60: 20 74 6f 20 62 65 20 65 64 69 74 65 64 2c 20 64   to be edited, d
8f70: 6f 20 5c 6e 20 74 6f 20 5c 72 5c 6e 20 63 6f 6e  o \n to \r\n con
8f80: 76 65 72 73 69 6f 6e 73 20 6f 6e 20 73 79 73 74  versions on syst
8f90: 65 6d 73 0a 20 20 2a 2a 20 74 68 61 74 20 77 61  ems.  ** that wa
8fa0: 6e 74 20 5c 72 5c 6e 20 6c 69 6e 65 20 65 6e 64  nt \r\n line end
8fb0: 69 6e 67 73 20 2a 2f 0a 20 20 66 20 3d 20 66 6f  ings */.  f = fo
8fc0: 70 65 6e 28 7a 54 65 6d 70 46 69 6c 65 2c 20 62  pen(zTempFile, b
8fd0: 42 69 6e 20 3f 20 22 77 62 22 20 3a 20 22 77 22  Bin ? "wb" : "w"
8fe0: 29 3b 0a 20 20 69 66 28 20 66 3d 3d 30 20 29 7b  );.  if( f==0 ){
8ff0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73  .    sqlite3_res
9000: 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78  ult_error(contex
9010: 74 2c 20 22 65 64 69 74 28 29 20 63 61 6e 6e 6f  t, "edit() canno
9020: 74 20 6f 70 65 6e 20 74 65 6d 70 20 66 69 6c 65  t open temp file
9030: 22 2c 20 2d 31 29 3b 0a 20 20 20 20 67 6f 74 6f  ", -1);.    goto
9040: 20 65 64 69 74 5f 66 75 6e 63 5f 65 6e 64 3b 0a   edit_func_end;.
9050: 20 20 7d 0a 20 20 73 7a 20 3d 20 73 71 6c 69 74    }.  sz = sqlit
9060: 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 61  e3_value_bytes(a
9070: 72 67 76 5b 30 5d 29 3b 0a 20 20 69 66 28 20 62  rgv[0]);.  if( b
9080: 42 69 6e 20 29 7b 0a 20 20 20 20 78 20 3d 20 66  Bin ){.    x = f
9090: 77 72 69 74 65 28 73 71 6c 69 74 65 33 5f 76 61  write(sqlite3_va
90a0: 6c 75 65 5f 62 6c 6f 62 28 61 72 67 76 5b 30 5d  lue_blob(argv[0]
90b0: 29 2c 20 31 2c 20 73 7a 2c 20 66 29 3b 0a 20 20  ), 1, sz, f);.  
90c0: 7d 65 6c 73 65 7b 0a 20 20 20 20 63 6f 6e 73 74  }else{.    const
90d0: 20 63 68 61 72 20 2a 7a 20 3d 20 28 63 6f 6e 73   char *z = (cons
90e0: 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f  t char*)sqlite3_
90f0: 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b  value_text(argv[
9100: 30 5d 29 3b 0a 20 20 20 20 2f 2a 20 52 65 6d 65  0]);.    /* Reme
9110: 6d 62 65 72 20 77 68 65 74 68 65 72 20 6f 72 20  mber whether or 
9120: 6e 6f 74 20 74 68 65 20 76 61 6c 75 65 20 6f 72  not the value or
9130: 69 67 69 6e 61 6c 6c 79 20 63 6f 6e 74 61 69 6e  iginally contain
9140: 65 64 20 5c 72 5c 6e 20 2a 2f 0a 20 20 20 20 69  ed \r\n */.    i
9150: 66 28 20 7a 20 26 26 20 73 74 72 73 74 72 28 7a  f( z && strstr(z
9160: 2c 22 5c 72 5c 6e 22 29 21 3d 30 20 29 20 68 61  ,"\r\n")!=0 ) ha
9170: 73 43 52 4e 4c 20 3d 20 31 3b 0a 20 20 20 20 78  sCRNL = 1;.    x
9180: 20 3d 20 66 77 72 69 74 65 28 73 71 6c 69 74 65   = fwrite(sqlite
9190: 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67  3_value_text(arg
91a0: 76 5b 30 5d 29 2c 20 31 2c 20 73 7a 2c 20 66 29  v[0]), 1, sz, f)
91b0: 3b 0a 20 20 7d 0a 20 20 66 63 6c 6f 73 65 28 66  ;.  }.  fclose(f
91c0: 29 3b 0a 20 20 66 20 3d 20 30 3b 0a 20 20 69 66  );.  f = 0;.  if
91d0: 28 20 78 21 3d 73 7a 20 29 7b 0a 20 20 20 20 73  ( x!=sz ){.    s
91e0: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72  qlite3_result_er
91f0: 72 6f 72 28 63 6f 6e 74 65 78 74 2c 20 22 65 64  ror(context, "ed
9200: 69 74 28 29 20 63 6f 75 6c 64 20 6e 6f 74 20 77  it() could not w
9210: 72 69 74 65 20 74 68 65 20 77 68 6f 6c 65 20 66  rite the whole f
9220: 69 6c 65 22 2c 20 2d 31 29 3b 0a 20 20 20 20 67  ile", -1);.    g
9230: 6f 74 6f 20 65 64 69 74 5f 66 75 6e 63 5f 65 6e  oto edit_func_en
9240: 64 3b 0a 20 20 7d 0a 20 20 7a 43 6d 64 20 3d 20  d;.  }.  zCmd = 
9250: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
9260: 22 25 73 20 5c 22 25 73 5c 22 22 2c 20 7a 45 64  "%s \"%s\"", zEd
9270: 69 74 6f 72 2c 20 7a 54 65 6d 70 46 69 6c 65 29  itor, zTempFile)
9280: 3b 0a 20 20 69 66 28 20 7a 43 6d 64 3d 3d 30 20  ;.  if( zCmd==0 
9290: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72  ){.    sqlite3_r
92a0: 65 73 75 6c 74 5f 65 72 72 6f 72 5f 6e 6f 6d 65  esult_error_nome
92b0: 6d 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20  m(context);.    
92c0: 67 6f 74 6f 20 65 64 69 74 5f 66 75 6e 63 5f 65  goto edit_func_e
92d0: 6e 64 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73  nd;.  }.  rc = s
92e0: 79 73 74 65 6d 28 7a 43 6d 64 29 3b 0a 20 20 73  ystem(zCmd);.  s
92f0: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6d 64  qlite3_free(zCmd
9300: 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  );.  if( rc ){. 
9310: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
9320: 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c  t_error(context,
9330: 20 22 45 44 49 54 4f 52 20 72 65 74 75 72 6e 65   "EDITOR returne
9340: 64 20 6e 6f 6e 2d 7a 65 72 6f 22 2c 20 2d 31 29  d non-zero", -1)
9350: 3b 0a 20 20 20 20 67 6f 74 6f 20 65 64 69 74 5f  ;.    goto edit_
9360: 66 75 6e 63 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20  func_end;.  }.  
9370: 66 20 3d 20 66 6f 70 65 6e 28 7a 54 65 6d 70 46  f = fopen(zTempF
9380: 69 6c 65 2c 20 22 72 62 22 29 3b 0a 20 20 69 66  ile, "rb");.  if
9390: 28 20 66 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  ( f==0 ){.    sq
93a0: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72  lite3_result_err
93b0: 6f 72 28 63 6f 6e 74 65 78 74 2c 0a 20 20 20 20  or(context,.    
93c0: 20 20 22 65 64 69 74 28 29 20 63 61 6e 6e 6f 74    "edit() cannot
93d0: 20 72 65 6f 70 65 6e 20 74 65 6d 70 20 66 69 6c   reopen temp fil
93e0: 65 20 61 66 74 65 72 20 65 64 69 74 22 2c 20 2d  e after edit", -
93f0: 31 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 64 69  1);.    goto edi
9400: 74 5f 66 75 6e 63 5f 65 6e 64 3b 0a 20 20 7d 0a  t_func_end;.  }.
9410: 20 20 66 73 65 65 6b 28 66 2c 20 30 2c 20 53 45    fseek(f, 0, SE
9420: 45 4b 5f 45 4e 44 29 3b 0a 20 20 73 7a 20 3d 20  EK_END);.  sz = 
9430: 66 74 65 6c 6c 28 66 29 3b 0a 20 20 72 65 77 69  ftell(f);.  rewi
9440: 6e 64 28 66 29 3b 0a 20 20 70 20 3d 20 73 71 6c  nd(f);.  p = sql
9450: 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 20 73  ite3_malloc64( s
9460: 7a 2b 28 62 42 69 6e 3d 3d 30 29 20 29 3b 0a 20  z+(bBin==0) );. 
9470: 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a 20 20 20   if( p==0 ){.   
9480: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
9490: 65 72 72 6f 72 5f 6e 6f 6d 65 6d 28 63 6f 6e 74  error_nomem(cont
94a0: 65 78 74 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65  ext);.    goto e
94b0: 64 69 74 5f 66 75 6e 63 5f 65 6e 64 3b 0a 20 20  dit_func_end;.  
94c0: 7d 0a 20 20 78 20 3d 20 66 72 65 61 64 28 70 2c  }.  x = fread(p,
94d0: 20 31 2c 20 73 7a 2c 20 66 29 3b 0a 20 20 66 63   1, sz, f);.  fc
94e0: 6c 6f 73 65 28 66 29 3b 0a 20 20 66 20 3d 20 30  lose(f);.  f = 0
94f0: 3b 0a 20 20 69 66 28 20 78 21 3d 73 7a 20 29 7b  ;.  if( x!=sz ){
9500: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73  .    sqlite3_res
9510: 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78  ult_error(contex
9520: 74 2c 20 22 63 6f 75 6c 64 20 6e 6f 74 20 72 65  t, "could not re
9530: 61 64 20 62 61 63 6b 20 74 68 65 20 77 68 6f 6c  ad back the whol
9540: 65 20 66 69 6c 65 22 2c 20 2d 31 29 3b 0a 20 20  e file", -1);.  
9550: 20 20 67 6f 74 6f 20 65 64 69 74 5f 66 75 6e 63    goto edit_func
9560: 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 69 66 28 20  _end;.  }.  if( 
9570: 62 42 69 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69  bBin ){.    sqli
9580: 74 65 33 5f 72 65 73 75 6c 74 5f 62 6c 6f 62 36  te3_result_blob6
9590: 34 28 63 6f 6e 74 65 78 74 2c 20 70 2c 20 73 7a  4(context, p, sz
95a0: 2c 20 73 71 6c 69 74 65 33 5f 66 72 65 65 29 3b  , sqlite3_free);
95b0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
95c0: 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 2c 20 6a  lite3_int64 i, j
95d0: 3b 0a 20 20 20 20 69 66 28 20 68 61 73 43 52 4e  ;.    if( hasCRN
95e0: 4c 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66  L ){.      /* If
95f0: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 63 6f   the original co
9600: 6e 74 61 69 6e 73 20 5c 72 5c 6e 20 74 68 65 6e  ntains \r\n then
9610: 20 64 6f 20 6e 6f 20 63 6f 6e 76 65 72 73 69 6f   do no conversio
9620: 6e 73 20 62 61 63 6b 20 74 6f 20 5c 6e 20 2a 2f  ns back to \n */
9630: 0a 20 20 20 20 20 20 6a 20 3d 20 73 7a 3b 0a 20  .      j = sz;. 
9640: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
9650: 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 64  /* If the file d
9660: 69 64 20 6e 6f 74 20 6f 72 69 67 69 6e 61 6c 6c  id not originall
9670: 79 20 63 6f 6e 74 61 69 6e 20 5c 72 5c 6e 20 74  y contain \r\n t
9680: 68 65 6e 20 63 6f 6e 76 65 72 74 20 61 6e 79 20  hen convert any 
9690: 6e 65 77 0a 20 20 20 20 20 20 2a 2a 20 5c 72 5c  new.      ** \r\
96a0: 6e 20 62 61 63 6b 20 69 6e 74 6f 20 5c 6e 20 2a  n back into \n *
96b0: 2f 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 6a 3d  /.      for(i=j=
96c0: 30 3b 20 69 3c 73 7a 3b 20 69 2b 2b 29 7b 0a 20  0; i<sz; i++){. 
96d0: 20 20 20 20 20 20 20 69 66 28 20 70 5b 69 5d 3d         if( p[i]=
96e0: 3d 27 5c 72 27 20 26 26 20 70 5b 69 2b 31 5d 3d  ='\r' && p[i+1]=
96f0: 3d 27 5c 6e 27 20 29 20 69 2b 2b 3b 0a 20 20 20  ='\n' ) i++;.   
9700: 20 20 20 20 20 70 5b 6a 2b 2b 5d 20 3d 20 70 5b       p[j++] = p[
9710: 69 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  i];.      }.    
9720: 20 20 73 7a 20 3d 20 6a 3b 0a 20 20 20 20 20 20    sz = j;.      
9730: 70 5b 73 7a 5d 20 3d 20 30 3b 0a 20 20 20 20 7d  p[sz] = 0;.    }
9740: 20 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65   .    sqlite3_re
9750: 73 75 6c 74 5f 74 65 78 74 36 34 28 63 6f 6e 74  sult_text64(cont
9760: 65 78 74 2c 20 28 63 6f 6e 73 74 20 63 68 61 72  ext, (const char
9770: 2a 29 70 2c 20 73 7a 2c 0a 20 20 20 20 20 20 20  *)p, sz,.       
9780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9790: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 2c     sqlite3_free,
97a0: 20 53 51 4c 49 54 45 5f 55 54 46 38 29 3b 0a 20   SQLITE_UTF8);. 
97b0: 20 7d 0a 20 20 70 20 3d 20 30 3b 0a 0a 65 64 69   }.  p = 0;..edi
97c0: 74 5f 66 75 6e 63 5f 65 6e 64 3a 0a 20 20 69 66  t_func_end:.  if
97d0: 28 20 66 20 29 20 66 63 6c 6f 73 65 28 66 29 3b  ( f ) fclose(f);
97e0: 0a 20 20 75 6e 6c 69 6e 6b 28 7a 54 65 6d 70 46  .  unlink(zTempF
97f0: 69 6c 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  ile);.  sqlite3_
9800: 66 72 65 65 28 7a 54 65 6d 70 46 69 6c 65 29 3b  free(zTempFile);
9810: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
9820: 70 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  p);.}.#endif /* 
9830: 53 51 4c 49 54 45 5f 4e 4f 48 41 56 45 5f 53 59  SQLITE_NOHAVE_SY
9840: 53 54 45 4d 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53  STEM */../*.** S
9850: 61 76 65 20 6f 72 20 72 65 73 74 6f 72 65 20 74  ave or restore t
9860: 68 65 20 63 75 72 72 65 6e 74 20 6f 75 74 70 75  he current outpu
9870: 74 20 6d 6f 64 65 0a 2a 2f 0a 73 74 61 74 69 63  t mode.*/.static
9880: 20 76 6f 69 64 20 6f 75 74 70 75 74 4d 6f 64 65   void outputMode
9890: 50 75 73 68 28 53 68 65 6c 6c 53 74 61 74 65 20  Push(ShellState 
98a0: 2a 70 29 7b 0a 20 20 70 2d 3e 6d 6f 64 65 50 72  *p){.  p->modePr
98b0: 69 6f 72 20 3d 20 70 2d 3e 6d 6f 64 65 3b 0a 20  ior = p->mode;. 
98c0: 20 6d 65 6d 63 70 79 28 70 2d 3e 63 6f 6c 53 65   memcpy(p->colSe
98d0: 70 50 72 69 6f 72 2c 20 70 2d 3e 63 6f 6c 53 65  pPrior, p->colSe
98e0: 70 61 72 61 74 6f 72 2c 20 73 69 7a 65 6f 66 28  parator, sizeof(
98f0: 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 29  p->colSeparator)
9900: 29 3b 0a 20 20 6d 65 6d 63 70 79 28 70 2d 3e 72  );.  memcpy(p->r
9910: 6f 77 53 65 70 50 72 69 6f 72 2c 20 70 2d 3e 72  owSepPrior, p->r
9920: 6f 77 53 65 70 61 72 61 74 6f 72 2c 20 73 69 7a  owSeparator, siz
9930: 65 6f 66 28 70 2d 3e 72 6f 77 53 65 70 61 72 61  eof(p->rowSepara
9940: 74 6f 72 29 29 3b 0a 7d 0a 73 74 61 74 69 63 20  tor));.}.static 
9950: 76 6f 69 64 20 6f 75 74 70 75 74 4d 6f 64 65 50  void outputModeP
9960: 6f 70 28 53 68 65 6c 6c 53 74 61 74 65 20 2a 70  op(ShellState *p
9970: 29 7b 0a 20 20 70 2d 3e 6d 6f 64 65 20 3d 20 70  ){.  p->mode = p
9980: 2d 3e 6d 6f 64 65 50 72 69 6f 72 3b 0a 20 20 6d  ->modePrior;.  m
9990: 65 6d 63 70 79 28 70 2d 3e 63 6f 6c 53 65 70 61  emcpy(p->colSepa
99a0: 72 61 74 6f 72 2c 20 70 2d 3e 63 6f 6c 53 65 70  rator, p->colSep
99b0: 50 72 69 6f 72 2c 20 73 69 7a 65 6f 66 28 70 2d  Prior, sizeof(p-
99c0: 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 29 29 3b  >colSeparator));
99d0: 0a 20 20 6d 65 6d 63 70 79 28 70 2d 3e 72 6f 77  .  memcpy(p->row
99e0: 53 65 70 61 72 61 74 6f 72 2c 20 70 2d 3e 72 6f  Separator, p->ro
99f0: 77 53 65 70 50 72 69 6f 72 2c 20 73 69 7a 65 6f  wSepPrior, sizeo
9a00: 66 28 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f  f(p->rowSeparato
9a10: 72 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 75  r));.}../*.** Ou
9a20: 74 70 75 74 20 74 68 65 20 67 69 76 65 6e 20 73  tput the given s
9a30: 74 72 69 6e 67 20 61 73 20 61 20 68 65 78 2d 65  tring as a hex-e
9a40: 6e 63 6f 64 65 64 20 62 6c 6f 62 20 28 65 67 2e  ncoded blob (eg.
9a50: 20 58 27 31 32 33 34 27 20 29 0a 2a 2f 0a 73 74   X'1234' ).*/.st
9a60: 61 74 69 63 20 76 6f 69 64 20 6f 75 74 70 75 74  atic void output
9a70: 5f 68 65 78 5f 62 6c 6f 62 28 46 49 4c 45 20 2a  _hex_blob(FILE *
9a80: 6f 75 74 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20  out, const void 
9a90: 2a 70 42 6c 6f 62 2c 20 69 6e 74 20 6e 42 6c 6f  *pBlob, int nBlo
9aa0: 62 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63  b){.  int i;.  c
9ab0: 68 61 72 20 2a 7a 42 6c 6f 62 20 3d 20 28 63 68  har *zBlob = (ch
9ac0: 61 72 20 2a 29 70 42 6c 6f 62 3b 0a 20 20 72 61  ar *)pBlob;.  ra
9ad0: 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 22 58 27  w_printf(out,"X'
9ae0: 22 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  ");.  for(i=0; i
9af0: 3c 6e 42 6c 6f 62 3b 20 69 2b 2b 29 7b 20 72 61  <nBlob; i++){ ra
9b00: 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 22 25 30  w_printf(out,"%0
9b10: 32 78 22 2c 7a 42 6c 6f 62 5b 69 5d 26 30 78 66  2x",zBlob[i]&0xf
9b20: 66 29 3b 20 7d 0a 20 20 72 61 77 5f 70 72 69 6e  f); }.  raw_prin
9b30: 74 66 28 6f 75 74 2c 22 27 22 29 3b 0a 7d 0a 0a  tf(out,"'");.}..
9b40: 2f 2a 0a 2a 2a 20 46 69 6e 64 20 61 20 73 74 72  /*.** Find a str
9b50: 69 6e 67 20 74 68 61 74 20 69 73 20 6e 6f 74 20  ing that is not 
9b60: 66 6f 75 6e 64 20 61 6e 79 77 68 65 72 65 20 69  found anywhere i
9b70: 6e 20 7a 5b 5d 2e 20 20 52 65 74 75 72 6e 20 61  n z[].  Return a
9b80: 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74   pointer.** to t
9b90: 68 61 74 20 73 74 72 69 6e 67 2e 0a 2a 2a 0a 2a  hat string..**.*
9ba0: 2a 20 54 72 79 20 74 6f 20 75 73 65 20 7a 41 20  * Try to use zA 
9bb0: 61 6e 64 20 7a 42 20 66 69 72 73 74 2e 20 20 49  and zB first.  I
9bc0: 66 20 62 6f 74 68 20 6f 66 20 74 68 6f 73 65 20  f both of those 
9bd0: 61 72 65 20 61 6c 72 65 61 64 79 20 66 6f 75 6e  are already foun
9be0: 64 20 69 6e 20 7a 5b 5d 0a 2a 2a 20 74 68 65 6e  d in z[].** then
9bf0: 20 6d 61 6b 65 20 75 70 20 73 6f 6d 65 20 73 74   make up some st
9c00: 72 69 6e 67 20 61 6e 64 20 73 74 6f 72 65 20 69  ring and store i
9c10: 74 20 69 6e 20 74 68 65 20 62 75 66 66 65 72 20  t in the buffer 
9c20: 7a 42 75 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  zBuf..*/.static 
9c30: 63 6f 6e 73 74 20 63 68 61 72 20 2a 75 6e 75 73  const char *unus
9c40: 65 64 5f 73 74 72 69 6e 67 28 0a 20 20 63 6f 6e  ed_string(.  con
9c50: 73 74 20 63 68 61 72 20 2a 7a 2c 20 20 20 20 20  st char *z,     
9c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9c70: 2a 20 52 65 73 75 6c 74 20 6d 75 73 74 20 6e 6f  * Result must no
9c80: 74 20 61 70 70 65 61 72 20 61 6e 79 77 68 65 72  t appear anywher
9c90: 65 20 69 6e 20 7a 20 2a 2f 0a 20 20 63 6f 6e 73  e in z */.  cons
9ca0: 74 20 63 68 61 72 20 2a 7a 41 2c 20 63 6f 6e 73  t char *zA, cons
9cb0: 74 20 63 68 61 72 20 2a 7a 42 2c 20 20 20 2f 2a  t char *zB,   /*
9cc0: 20 54 72 79 20 74 68 65 73 65 20 66 69 72 73 74   Try these first
9cd0: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 42 75 66   */.  char *zBuf
9ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9cf0: 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65          /* Space
9d00: 20 74 6f 20 73 74 6f 72 65 20 61 20 67 65 6e 65   to store a gene
9d10: 72 61 74 65 64 20 73 74 72 69 6e 67 20 2a 2f 0a  rated string */.
9d20: 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 20  ){.  unsigned i 
9d30: 3d 20 30 3b 0a 20 20 69 66 28 20 73 74 72 73 74  = 0;.  if( strst
9d40: 72 28 7a 2c 20 7a 41 29 3d 3d 30 20 29 20 72 65  r(z, zA)==0 ) re
9d50: 74 75 72 6e 20 7a 41 3b 0a 20 20 69 66 28 20 73  turn zA;.  if( s
9d60: 74 72 73 74 72 28 7a 2c 20 7a 42 29 3d 3d 30 20  trstr(z, zB)==0 
9d70: 29 20 72 65 74 75 72 6e 20 7a 42 3b 0a 20 20 64  ) return zB;.  d
9d80: 6f 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  o{.    sqlite3_s
9d90: 6e 70 72 69 6e 74 66 28 32 30 2c 7a 42 75 66 2c  nprintf(20,zBuf,
9da0: 22 28 25 73 25 75 29 22 2c 20 7a 41 2c 20 69 2b  "(%s%u)", zA, i+
9db0: 2b 29 3b 0a 20 20 7d 77 68 69 6c 65 28 20 73 74  +);.  }while( st
9dc0: 72 73 74 72 28 7a 2c 7a 42 75 66 29 21 3d 30 20  rstr(z,zBuf)!=0 
9dd0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 42 75 66  );.  return zBuf
9de0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 75 74 70 75  ;.}../*.** Outpu
9df0: 74 20 74 68 65 20 67 69 76 65 6e 20 73 74 72 69  t the given stri
9e00: 6e 67 20 61 73 20 61 20 71 75 6f 74 65 64 20 73  ng as a quoted s
9e10: 74 72 69 6e 67 20 75 73 69 6e 67 20 53 51 4c 20  tring using SQL 
9e20: 71 75 6f 74 69 6e 67 20 63 6f 6e 76 65 6e 74 69  quoting conventi
9e30: 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61  ons..**.** See a
9e40: 6c 73 6f 3a 20 6f 75 74 70 75 74 5f 71 75 6f 74  lso: output_quot
9e50: 65 64 5f 65 73 63 61 70 65 64 5f 73 74 72 69 6e  ed_escaped_strin
9e60: 67 28 29 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  g().*/.static vo
9e70: 69 64 20 6f 75 74 70 75 74 5f 71 75 6f 74 65 64  id output_quoted
9e80: 5f 73 74 72 69 6e 67 28 46 49 4c 45 20 2a 6f 75  _string(FILE *ou
9e90: 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  t, const char *z
9ea0: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 68  ){.  int i;.  ch
9eb0: 61 72 20 63 3b 0a 20 20 73 65 74 42 69 6e 61 72  ar c;.  setBinar
9ec0: 79 4d 6f 64 65 28 6f 75 74 2c 20 31 29 3b 0a 20  yMode(out, 1);. 
9ed0: 20 66 6f 72 28 69 3d 30 3b 20 28 63 20 3d 20 7a   for(i=0; (c = z
9ee0: 5b 69 5d 29 21 3d 30 20 26 26 20 63 21 3d 27 5c  [i])!=0 && c!='\
9ef0: 27 27 3b 20 69 2b 2b 29 7b 7d 0a 20 20 69 66 28  ''; i++){}.  if(
9f00: 20 63 3d 3d 30 20 29 7b 0a 20 20 20 20 75 74 66   c==0 ){.    utf
9f10: 38 5f 70 72 69 6e 74 66 28 6f 75 74 2c 22 27 25  8_printf(out,"'%
9f20: 73 27 22 2c 7a 29 3b 0a 20 20 7d 65 6c 73 65 7b  s'",z);.  }else{
9f30: 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28  .    raw_printf(
9f40: 6f 75 74 2c 20 22 27 22 29 3b 0a 20 20 20 20 77  out, "'");.    w
9f50: 68 69 6c 65 28 20 2a 7a 20 29 7b 0a 20 20 20 20  hile( *z ){.    
9f60: 20 20 66 6f 72 28 69 3d 30 3b 20 28 63 20 3d 20    for(i=0; (c = 
9f70: 7a 5b 69 5d 29 21 3d 30 20 26 26 20 63 21 3d 27  z[i])!=0 && c!='
9f80: 5c 27 27 3b 20 69 2b 2b 29 7b 7d 0a 20 20 20 20  \''; i++){}.    
9f90: 20 20 69 66 28 20 63 3d 3d 27 5c 27 27 20 29 20    if( c=='\'' ) 
9fa0: 69 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 69  i++;.      if( i
9fb0: 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38   ){.        utf8
9fc0: 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 2e  _printf(out, "%.
9fd0: 2a 73 22 2c 20 69 2c 20 7a 29 3b 0a 20 20 20 20  *s", i, z);.    
9fe0: 20 20 20 20 7a 20 2b 3d 20 69 3b 0a 20 20 20 20      z += i;.    
9ff0: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63 3d    }.      if( c=
a000: 3d 27 5c 27 27 20 29 7b 0a 20 20 20 20 20 20 20  ='\'' ){.       
a010: 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c   raw_printf(out,
a020: 20 22 27 22 29 3b 0a 20 20 20 20 20 20 20 20 63   "'");.        c
a030: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d  ontinue;.      }
a040: 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d 30 20  .      if( c==0 
a050: 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  ){.        break
a060: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
a070: 7a 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  z++;.    }.    r
a080: 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22  aw_printf(out, "
a090: 27 22 29 3b 0a 20 20 7d 0a 20 20 73 65 74 54 65  '");.  }.  setTe
a0a0: 78 74 4d 6f 64 65 28 6f 75 74 2c 20 31 29 3b 0a  xtMode(out, 1);.
a0b0: 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 75 74 70 75 74 20  }../*.** Output 
a0c0: 74 68 65 20 67 69 76 65 6e 20 73 74 72 69 6e 67  the given string
a0d0: 20 61 73 20 61 20 71 75 6f 74 65 64 20 73 74 72   as a quoted str
a0e0: 69 6e 67 20 75 73 69 6e 67 20 53 51 4c 20 71 75  ing using SQL qu
a0f0: 6f 74 69 6e 67 20 63 6f 6e 76 65 6e 74 69 6f 6e  oting convention
a100: 73 2e 0a 2a 2a 20 41 64 64 69 74 69 6f 6e 61 6c  s..** Additional
a110: 6c 6c 79 20 2c 20 65 73 63 61 70 65 20 74 68 65  lly , escape the
a120: 20 22 5c 6e 22 20 61 6e 64 20 22 5c 72 22 20 63   "\n" and "\r" c
a130: 68 61 72 61 63 74 65 72 73 20 73 6f 20 74 68 61  haracters so tha
a140: 74 20 74 68 65 79 20 64 6f 20 6e 6f 74 0a 2a 2a  t they do not.**
a150: 20 67 65 74 20 63 6f 72 72 75 70 74 65 64 20 62   get corrupted b
a160: 79 20 65 6e 64 2d 6f 66 2d 6c 69 6e 65 20 74 72  y end-of-line tr
a170: 61 6e 73 6c 61 74 69 6f 6e 20 66 61 63 69 6c 69  anslation facili
a180: 74 69 65 73 20 69 6e 20 73 6f 6d 65 20 6f 70 65  ties in some ope
a190: 72 61 74 69 6e 67 0a 2a 2a 20 73 79 73 74 65 6d  rating.** system
a1a0: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73  s..**.** This is
a1b0: 20 6c 69 6b 65 20 6f 75 74 70 75 74 5f 71 75 6f   like output_quo
a1c0: 74 65 64 5f 73 74 72 69 6e 67 28 29 20 62 75 74  ted_string() but
a1d0: 20 77 69 74 68 20 74 68 65 20 61 64 64 69 74 69   with the additi
a1e0: 6f 6e 20 6f 66 20 74 68 65 20 5c 72 5c 6e 0a 2a  on of the \r\n.*
a1f0: 2a 20 65 73 63 61 70 65 20 6d 65 63 68 61 6e 69  * escape mechani
a200: 73 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  sm..*/.static vo
a210: 69 64 20 6f 75 74 70 75 74 5f 71 75 6f 74 65 64  id output_quoted
a220: 5f 65 73 63 61 70 65 64 5f 73 74 72 69 6e 67 28  _escaped_string(
a230: 46 49 4c 45 20 2a 6f 75 74 2c 20 63 6f 6e 73 74  FILE *out, const
a240: 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69 6e 74   char *z){.  int
a250: 20 69 3b 0a 20 20 63 68 61 72 20 63 3b 0a 20 20   i;.  char c;.  
a260: 73 65 74 42 69 6e 61 72 79 4d 6f 64 65 28 6f 75  setBinaryMode(ou
a270: 74 2c 20 31 29 3b 0a 20 20 66 6f 72 28 69 3d 30  t, 1);.  for(i=0
a280: 3b 20 28 63 20 3d 20 7a 5b 69 5d 29 21 3d 30 20  ; (c = z[i])!=0 
a290: 26 26 20 63 21 3d 27 5c 27 27 20 26 26 20 63 21  && c!='\'' && c!
a2a0: 3d 27 5c 6e 27 20 26 26 20 63 21 3d 27 5c 72 27  ='\n' && c!='\r'
a2b0: 3b 20 69 2b 2b 29 7b 7d 0a 20 20 69 66 28 20 63  ; i++){}.  if( c
a2c0: 3d 3d 30 20 29 7b 0a 20 20 20 20 75 74 66 38 5f  ==0 ){.    utf8_
a2d0: 70 72 69 6e 74 66 28 6f 75 74 2c 22 27 25 73 27  printf(out,"'%s'
a2e0: 22 2c 7a 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ",z);.  }else{. 
a2f0: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
a300: 4e 4c 20 3d 20 30 3b 0a 20 20 20 20 63 6f 6e 73  NL = 0;.    cons
a310: 74 20 63 68 61 72 20 2a 7a 43 52 20 3d 20 30 3b  t char *zCR = 0;
a320: 0a 20 20 20 20 69 6e 74 20 6e 4e 4c 20 3d 20 30  .    int nNL = 0
a330: 3b 0a 20 20 20 20 69 6e 74 20 6e 43 52 20 3d 20  ;.    int nCR = 
a340: 30 3b 0a 20 20 20 20 63 68 61 72 20 7a 42 75 66  0;.    char zBuf
a350: 31 5b 32 30 5d 2c 20 7a 42 75 66 32 5b 32 30 5d  1[20], zBuf2[20]
a360: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 7a  ;.    for(i=0; z
a370: 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  [i]; i++){.     
a380: 20 69 66 28 20 7a 5b 69 5d 3d 3d 27 5c 6e 27 20   if( z[i]=='\n' 
a390: 29 20 6e 4e 4c 2b 2b 3b 0a 20 20 20 20 20 20 69  ) nNL++;.      i
a3a0: 66 28 20 7a 5b 69 5d 3d 3d 27 5c 72 27 20 29 20  f( z[i]=='\r' ) 
a3b0: 6e 43 52 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20  nCR++;.    }.   
a3c0: 20 69 66 28 20 6e 4e 4c 20 29 7b 0a 20 20 20 20   if( nNL ){.    
a3d0: 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74    raw_printf(out
a3e0: 2c 20 22 72 65 70 6c 61 63 65 28 22 29 3b 0a 20  , "replace(");. 
a3f0: 20 20 20 20 20 7a 4e 4c 20 3d 20 75 6e 75 73 65       zNL = unuse
a400: 64 5f 73 74 72 69 6e 67 28 7a 2c 20 22 5c 5c 6e  d_string(z, "\\n
a410: 22 2c 20 22 5c 5c 30 31 32 22 2c 20 7a 42 75 66  ", "\\012", zBuf
a420: 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  1);.    }.    if
a430: 28 20 6e 43 52 20 29 7b 0a 20 20 20 20 20 20 72  ( nCR ){.      r
a440: 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22  aw_printf(out, "
a450: 72 65 70 6c 61 63 65 28 22 29 3b 0a 20 20 20 20  replace(");.    
a460: 20 20 7a 43 52 20 3d 20 75 6e 75 73 65 64 5f 73    zCR = unused_s
a470: 74 72 69 6e 67 28 7a 2c 20 22 5c 5c 72 22 2c 20  tring(z, "\\r", 
a480: 22 5c 5c 30 31 35 22 2c 20 7a 42 75 66 32 29 3b  "\\015", zBuf2);
a490: 0a 20 20 20 20 7d 0a 20 20 20 20 72 61 77 5f 70  .    }.    raw_p
a4a0: 72 69 6e 74 66 28 6f 75 74 2c 20 22 27 22 29 3b  rintf(out, "'");
a4b0: 0a 20 20 20 20 77 68 69 6c 65 28 20 2a 7a 20 29  .    while( *z )
a4c0: 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  {.      for(i=0;
a4d0: 20 28 63 20 3d 20 7a 5b 69 5d 29 21 3d 30 20 26   (c = z[i])!=0 &
a4e0: 26 20 63 21 3d 27 5c 6e 27 20 26 26 20 63 21 3d  & c!='\n' && c!=
a4f0: 27 5c 72 27 20 26 26 20 63 21 3d 27 5c 27 27 3b  '\r' && c!='\'';
a500: 20 69 2b 2b 29 7b 7d 0a 20 20 20 20 20 20 69 66   i++){}.      if
a510: 28 20 63 3d 3d 27 5c 27 27 20 29 20 69 2b 2b 3b  ( c=='\'' ) i++;
a520: 0a 20 20 20 20 20 20 69 66 28 20 69 20 29 7b 0a  .      if( i ){.
a530: 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69          utf8_pri
a540: 6e 74 66 28 6f 75 74 2c 20 22 25 2e 2a 73 22 2c  ntf(out, "%.*s",
a550: 20 69 2c 20 7a 29 3b 0a 20 20 20 20 20 20 20 20   i, z);.        
a560: 7a 20 2b 3d 20 69 3b 0a 20 20 20 20 20 20 7d 0a  z += i;.      }.
a570: 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27 5c 27        if( c=='\'
a580: 27 20 29 7b 0a 20 20 20 20 20 20 20 20 72 61 77  ' ){.        raw
a590: 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 27 22  _printf(out, "'"
a5a0: 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69  );.        conti
a5b0: 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  nue;.      }.   
a5c0: 20 20 20 69 66 28 20 63 3d 3d 30 20 29 7b 0a 20     if( c==0 ){. 
a5d0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
a5e0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 2b 2b 3b      }.      z++;
a5f0: 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27 5c  .      if( c=='\
a600: 6e 27 20 29 7b 0a 20 20 20 20 20 20 20 20 72 61  n' ){.        ra
a610: 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25  w_printf(out, "%
a620: 73 22 2c 20 7a 4e 4c 29 3b 0a 20 20 20 20 20 20  s", zNL);.      
a630: 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
a640: 20 20 7d 0a 20 20 20 20 20 20 72 61 77 5f 70 72    }.      raw_pr
a650: 69 6e 74 66 28 6f 75 74 2c 20 22 25 73 22 2c 20  intf(out, "%s", 
a660: 7a 43 52 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  zCR);.    }.    
a670: 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20  raw_printf(out, 
a680: 22 27 22 29 3b 0a 20 20 20 20 69 66 28 20 6e 43  "'");.    if( nC
a690: 52 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70  R ){.      raw_p
a6a0: 72 69 6e 74 66 28 6f 75 74 2c 20 22 2c 27 25 73  rintf(out, ",'%s
a6b0: 27 2c 63 68 61 72 28 31 33 29 29 22 2c 20 7a 43  ',char(13))", zC
a6c0: 52 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  R);.    }.    if
a6d0: 28 20 6e 4e 4c 20 29 7b 0a 20 20 20 20 20 20 72  ( nNL ){.      r
a6e0: 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22  aw_printf(out, "
a6f0: 2c 27 25 73 27 2c 63 68 61 72 28 31 30 29 29 22  ,'%s',char(10))"
a700: 2c 20 7a 4e 4c 29 3b 0a 20 20 20 20 7d 0a 20 20  , zNL);.    }.  
a710: 7d 0a 20 20 73 65 74 54 65 78 74 4d 6f 64 65 28  }.  setTextMode(
a720: 6f 75 74 2c 20 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  out, 1);.}../*.*
a730: 2a 20 4f 75 74 70 75 74 20 74 68 65 20 67 69 76  * Output the giv
a740: 65 6e 20 73 74 72 69 6e 67 20 61 73 20 61 20 71  en string as a q
a750: 75 6f 74 65 64 20 61 63 63 6f 72 64 69 6e 67 20  uoted according 
a760: 74 6f 20 43 20 6f 72 20 54 43 4c 20 71 75 6f 74  to C or TCL quot
a770: 69 6e 67 20 72 75 6c 65 73 2e 0a 2a 2f 0a 73 74  ing rules..*/.st
a780: 61 74 69 63 20 76 6f 69 64 20 6f 75 74 70 75 74  atic void output
a790: 5f 63 5f 73 74 72 69 6e 67 28 46 49 4c 45 20 2a  _c_string(FILE *
a7a0: 6f 75 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  out, const char 
a7b0: 2a 7a 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20  *z){.  unsigned 
a7c0: 69 6e 74 20 63 3b 0a 20 20 66 70 75 74 63 28 27  int c;.  fputc('
a7d0: 22 27 2c 20 6f 75 74 29 3b 0a 20 20 77 68 69 6c  "', out);.  whil
a7e0: 65 28 20 28 63 20 3d 20 2a 28 7a 2b 2b 29 29 21  e( (c = *(z++))!
a7f0: 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 63 3d  =0 ){.    if( c=
a800: 3d 27 5c 5c 27 20 29 7b 0a 20 20 20 20 20 20 66  ='\\' ){.      f
a810: 70 75 74 63 28 63 2c 20 6f 75 74 29 3b 0a 20 20  putc(c, out);.  
a820: 20 20 20 20 66 70 75 74 63 28 63 2c 20 6f 75 74      fputc(c, out
a830: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
a840: 20 63 3d 3d 27 22 27 20 29 7b 0a 20 20 20 20 20   c=='"' ){.     
a850: 20 66 70 75 74 63 28 27 5c 5c 27 2c 20 6f 75 74   fputc('\\', out
a860: 29 3b 0a 20 20 20 20 20 20 66 70 75 74 63 28 27  );.      fputc('
a870: 22 27 2c 20 6f 75 74 29 3b 0a 20 20 20 20 7d 65  "', out);.    }e
a880: 6c 73 65 20 69 66 28 20 63 3d 3d 27 5c 74 27 20  lse if( c=='\t' 
a890: 29 7b 0a 20 20 20 20 20 20 66 70 75 74 63 28 27  ){.      fputc('
a8a0: 5c 5c 27 2c 20 6f 75 74 29 3b 0a 20 20 20 20 20  \\', out);.     
a8b0: 20 66 70 75 74 63 28 27 74 27 2c 20 6f 75 74 29   fputc('t', out)
a8c0: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
a8d0: 63 3d 3d 27 5c 6e 27 20 29 7b 0a 20 20 20 20 20  c=='\n' ){.     
a8e0: 20 66 70 75 74 63 28 27 5c 5c 27 2c 20 6f 75 74   fputc('\\', out
a8f0: 29 3b 0a 20 20 20 20 20 20 66 70 75 74 63 28 27  );.      fputc('
a900: 6e 27 2c 20 6f 75 74 29 3b 0a 20 20 20 20 7d 65  n', out);.    }e
a910: 6c 73 65 20 69 66 28 20 63 3d 3d 27 5c 72 27 20  lse if( c=='\r' 
a920: 29 7b 0a 20 20 20 20 20 20 66 70 75 74 63 28 27  ){.      fputc('
a930: 5c 5c 27 2c 20 6f 75 74 29 3b 0a 20 20 20 20 20  \\', out);.     
a940: 20 66 70 75 74 63 28 27 72 27 2c 20 6f 75 74 29   fputc('r', out)
a950: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
a960: 21 69 73 70 72 69 6e 74 28 63 26 30 78 66 66 29  !isprint(c&0xff)
a970: 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72   ){.      raw_pr
a980: 69 6e 74 66 28 6f 75 74 2c 20 22 5c 5c 25 30 33  intf(out, "\\%03
a990: 6f 22 2c 20 63 26 30 78 66 66 29 3b 0a 20 20 20  o", c&0xff);.   
a9a0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 66 70   }else{.      fp
a9b0: 75 74 63 28 63 2c 20 6f 75 74 29 3b 0a 20 20 20  utc(c, out);.   
a9c0: 20 7d 0a 20 20 7d 0a 20 20 66 70 75 74 63 28 27   }.  }.  fputc('
a9d0: 22 27 2c 20 6f 75 74 29 3b 0a 7d 0a 0a 2f 2a 0a  "', out);.}../*.
a9e0: 2a 2a 20 4f 75 74 70 75 74 20 74 68 65 20 67 69  ** Output the gi
a9f0: 76 65 6e 20 73 74 72 69 6e 67 20 77 69 74 68 20  ven string with 
aa00: 63 68 61 72 61 63 74 65 72 73 20 74 68 61 74 20  characters that 
aa10: 61 72 65 20 73 70 65 63 69 61 6c 20 74 6f 0a 2a  are special to.*
aa20: 2a 20 48 54 4d 4c 20 65 73 63 61 70 65 64 2e 0a  * HTML escaped..
aa30: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6f  */.static void o
aa40: 75 74 70 75 74 5f 68 74 6d 6c 5f 73 74 72 69 6e  utput_html_strin
aa50: 67 28 46 49 4c 45 20 2a 6f 75 74 2c 20 63 6f 6e  g(FILE *out, con
aa60: 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69  st char *z){.  i
aa70: 6e 74 20 69 3b 0a 20 20 69 66 28 20 7a 3d 3d 30  nt i;.  if( z==0
aa80: 20 29 20 7a 20 3d 20 22 22 3b 0a 20 20 77 68 69   ) z = "";.  whi
aa90: 6c 65 28 20 2a 7a 20 29 7b 0a 20 20 20 20 66 6f  le( *z ){.    fo
aaa0: 72 28 69 3d 30 3b 20 20 20 7a 5b 69 5d 0a 20 20  r(i=0;   z[i].  
aab0: 20 20 20 20 20 20 20 20 20 20 26 26 20 7a 5b 69            && z[i
aac0: 5d 21 3d 27 3c 27 0a 20 20 20 20 20 20 20 20 20  ]!='<'.         
aad0: 20 20 20 26 26 20 7a 5b 69 5d 21 3d 27 26 27 0a     && z[i]!='&'.
aae0: 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 7a              && z
aaf0: 5b 69 5d 21 3d 27 3e 27 0a 20 20 20 20 20 20 20  [i]!='>'.       
ab00: 20 20 20 20 20 26 26 20 7a 5b 69 5d 21 3d 27 5c       && z[i]!='\
ab10: 22 27 0a 20 20 20 20 20 20 20 20 20 20 20 20 26  "'.            &
ab20: 26 20 7a 5b 69 5d 21 3d 27 5c 27 27 3b 0a 20 20  & z[i]!='\'';.  
ab30: 20 20 20 20 20 20 69 2b 2b 29 7b 7d 0a 20 20 20        i++){}.   
ab40: 20 69 66 28 20 69 3e 30 20 29 7b 0a 20 20 20 20   if( i>0 ){.    
ab50: 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 6f 75    utf8_printf(ou
ab60: 74 2c 22 25 2e 2a 73 22 2c 69 2c 7a 29 3b 0a 20  t,"%.*s",i,z);. 
ab70: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 7a 5b 69     }.    if( z[i
ab80: 5d 3d 3d 27 3c 27 20 29 7b 0a 20 20 20 20 20 20  ]=='<' ){.      
ab90: 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 22  raw_printf(out,"
aba0: 26 6c 74 3b 22 29 3b 0a 20 20 20 20 7d 65 6c 73  &lt;");.    }els
abb0: 65 20 69 66 28 20 7a 5b 69 5d 3d 3d 27 26 27 20  e if( z[i]=='&' 
abc0: 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69  ){.      raw_pri
abd0: 6e 74 66 28 6f 75 74 2c 22 26 61 6d 70 3b 22 29  ntf(out,"&amp;")
abe0: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
abf0: 7a 5b 69 5d 3d 3d 27 3e 27 20 29 7b 0a 20 20 20  z[i]=='>' ){.   
ac00: 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75     raw_printf(ou
ac10: 74 2c 22 26 67 74 3b 22 29 3b 0a 20 20 20 20 7d  t,"&gt;");.    }
ac20: 65 6c 73 65 20 69 66 28 20 7a 5b 69 5d 3d 3d 27  else if( z[i]=='
ac30: 5c 22 27 20 29 7b 0a 20 20 20 20 20 20 72 61 77  \"' ){.      raw
ac40: 5f 70 72 69 6e 74 66 28 6f 75 74 2c 22 26 71 75  _printf(out,"&qu
ac50: 6f 74 3b 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65  ot;");.    }else
ac60: 20 69 66 28 20 7a 5b 69 5d 3d 3d 27 5c 27 27 20   if( z[i]=='\'' 
ac70: 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69  ){.      raw_pri
ac80: 6e 74 66 28 6f 75 74 2c 22 26 23 33 39 3b 22 29  ntf(out,"&#39;")
ac90: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
aca0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
acb0: 20 20 20 20 7a 20 2b 3d 20 69 20 2b 20 31 3b 0a      z += i + 1;.
acc0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20    }.}../*.** If 
acd0: 61 20 66 69 65 6c 64 20 63 6f 6e 74 61 69 6e 73  a field contains
ace0: 20 61 6e 79 20 63 68 61 72 61 63 74 65 72 20 69   any character i
acf0: 64 65 6e 74 69 66 69 65 64 20 62 79 20 61 20 31  dentified by a 1
ad00: 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   in the followin
ad10: 67 0a 2a 2a 20 61 72 72 61 79 2c 20 74 68 65 6e  g.** array, then
ad20: 20 74 68 65 20 73 74 72 69 6e 67 20 6d 75 73 74   the string must
ad30: 20 62 65 20 71 75 6f 74 65 64 20 66 6f 72 20 43   be quoted for C
ad40: 53 56 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f  SV..*/.static co
ad50: 6e 73 74 20 63 68 61 72 20 6e 65 65 64 43 73 76  nst char needCsv
ad60: 51 75 6f 74 65 5b 5d 20 3d 20 7b 0a 20 20 31 2c  Quote[] = {.  1,
ad70: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
ad80: 31 2c 20 31 2c 20 20 20 31 2c 20 31 2c 20 31 2c  1, 1,   1, 1, 1,
ad90: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 0a   1, 1, 1, 1, 1,.
ada0: 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c    1, 1, 1, 1, 1,
adb0: 20 31 2c 20 31 2c 20 31 2c 20 20 20 31 2c 20 31   1, 1, 1,   1, 1
adc0: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c  , 1, 1, 1, 1, 1,
add0: 20 31 2c 0a 20 20 31 2c 20 30 2c 20 31 2c 20 30   1,.  1, 0, 1, 0
ade0: 2c 20 30 2c 20 30 2c 20 30 2c 20 31 2c 20 20 20  , 0, 0, 0, 1,   
adf0: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
ae00: 2c 20 30 2c 20 30 2c 0a 20 20 30 2c 20 30 2c 20  , 0, 0,.  0, 0, 
ae10: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
ae20: 2c 20 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20  ,   0, 0, 0, 0, 
ae30: 30 2c 20 30 2c 20 30 2c 20 30 2c 0a 20 20 30 2c  0, 0, 0, 0,.  0,
ae40: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
ae50: 30 2c 20 30 2c 20 20 20 30 2c 20 30 2c 20 30 2c  0, 0,   0, 0, 0,
ae60: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 0a   0, 0, 0, 0, 0,.
ae70: 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c    0, 0, 0, 0, 0,
ae80: 20 30 2c 20 30 2c 20 30 2c 20 20 20 30 2c 20 30   0, 0, 0,   0, 0
ae90: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
aea0: 20 30 2c 0a 20 20 30 2c 20 30 2c 20 30 2c 20 30   0,.  0, 0, 0, 0
aeb0: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 20 20  , 0, 0, 0, 0,   
aec0: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
aed0: 2c 20 30 2c 20 30 2c 0a 20 20 30 2c 20 30 2c 20  , 0, 0,.  0, 0, 
aee0: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
aef0: 2c 20 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20  ,   0, 0, 0, 0, 
af00: 30 2c 20 30 2c 20 30 2c 20 31 2c 0a 20 20 31 2c  0, 0, 0, 1,.  1,
af10: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
af20: 31 2c 20 31 2c 20 20 20 31 2c 20 31 2c 20 31 2c  1, 1,   1, 1, 1,
af30: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 0a   1, 1, 1, 1, 1,.
af40: 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c    1, 1, 1, 1, 1,
af50: 20 31 2c 20 31 2c 20 31 2c 20 20 20 31 2c 20 31   1, 1, 1,   1, 1
af60: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c  , 1, 1, 1, 1, 1,
af70: 20 31 2c 0a 20 20 31 2c 20 31 2c 20 31 2c 20 31   1,.  1, 1, 1, 1
af80: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 20 20  , 1, 1, 1, 1,   
af90: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
afa0: 2c 20 31 2c 20 31 2c 0a 20 20 31 2c 20 31 2c 20  , 1, 1,.  1, 1, 
afb0: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
afc0: 2c 20 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20  ,   1, 1, 1, 1, 
afd0: 31 2c 20 31 2c 20 31 2c 20 31 2c 0a 20 20 31 2c  1, 1, 1, 1,.  1,
afe0: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
aff0: 31 2c 20 31 2c 20 20 20 31 2c 20 31 2c 20 31 2c  1, 1,   1, 1, 1,
b000: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 0a   1, 1, 1, 1, 1,.
b010: 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c    1, 1, 1, 1, 1,
b020: 20 31 2c 20 31 2c 20 31 2c 20 20 20 31 2c 20 31   1, 1, 1,   1, 1
b030: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c  , 1, 1, 1, 1, 1,
b040: 20 31 2c 0a 20 20 31 2c 20 31 2c 20 31 2c 20 31   1,.  1, 1, 1, 1
b050: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 20 20  , 1, 1, 1, 1,   
b060: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
b070: 2c 20 31 2c 20 31 2c 0a 20 20 31 2c 20 31 2c 20  , 1, 1,.  1, 1, 
b080: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
b090: 2c 20 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20  ,   1, 1, 1, 1, 
b0a0: 31 2c 20 31 2c 20 31 2c 20 31 2c 0a 7d 3b 0a 0a  1, 1, 1, 1,.};..
b0b0: 2f 2a 0a 2a 2a 20 4f 75 74 70 75 74 20 61 20 73  /*.** Output a s
b0c0: 69 6e 67 6c 65 20 74 65 72 6d 20 6f 66 20 43 53  ingle term of CS
b0d0: 56 2e 20 20 41 63 74 75 61 6c 6c 79 2c 20 70 2d  V.  Actually, p-
b0e0: 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 20 69 73  >colSeparator is
b0f0: 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20 74 68 65   used for.** the
b100: 20 73 65 70 61 72 61 74 6f 72 2c 20 77 68 69 63   separator, whic
b110: 68 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74  h may or may not
b120: 20 62 65 20 61 20 63 6f 6d 6d 61 2e 20 20 70 2d   be a comma.  p-
b130: 3e 6e 75 6c 6c 56 61 6c 75 65 20 69 73 0a 2a 2a  >nullValue is.**
b140: 20 74 68 65 20 6e 75 6c 6c 20 76 61 6c 75 65 2e   the null value.
b150: 20 20 53 74 72 69 6e 67 73 20 61 72 65 20 71 75    Strings are qu
b160: 6f 74 65 64 20 69 66 20 6e 65 63 65 73 73 61 72  oted if necessar
b170: 79 2e 20 20 54 68 65 20 73 65 70 61 72 61 74 6f  y.  The separato
b180: 72 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20 69 73 73  r.** is only iss
b190: 75 65 64 20 69 66 20 62 53 65 70 20 69 73 20 74  ued if bSep is t
b1a0: 72 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  rue..*/.static v
b1b0: 6f 69 64 20 6f 75 74 70 75 74 5f 63 73 76 28 53  oid output_csv(S
b1c0: 68 65 6c 6c 53 74 61 74 65 20 2a 70 2c 20 63 6f  hellState *p, co
b1d0: 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74  nst char *z, int
b1e0: 20 62 53 65 70 29 7b 0a 20 20 46 49 4c 45 20 2a   bSep){.  FILE *
b1f0: 6f 75 74 20 3d 20 70 2d 3e 6f 75 74 3b 0a 20 20  out = p->out;.  
b200: 69 66 28 20 7a 3d 3d 30 20 29 7b 0a 20 20 20 20  if( z==0 ){.    
b210: 75 74 66 38 5f 70 72 69 6e 74 66 28 6f 75 74 2c  utf8_printf(out,
b220: 22 25 73 22 2c 70 2d 3e 6e 75 6c 6c 56 61 6c 75  "%s",p->nullValu
b230: 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  e);.  }else{.   
b240: 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74 20   int i;.    int 
b250: 6e 53 65 70 20 3d 20 73 74 72 6c 65 6e 33 30 28  nSep = strlen30(
b260: 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 29  p->colSeparator)
b270: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 7a  ;.    for(i=0; z
b280: 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  [i]; i++){.     
b290: 20 69 66 28 20 6e 65 65 64 43 73 76 51 75 6f 74   if( needCsvQuot
b2a0: 65 5b 28 28 75 6e 73 69 67 6e 65 64 20 63 68 61  e[((unsigned cha
b2b0: 72 2a 29 7a 29 5b 69 5d 5d 0a 20 20 20 20 20 20  r*)z)[i]].      
b2c0: 20 20 20 7c 7c 20 28 7a 5b 69 5d 3d 3d 70 2d 3e     || (z[i]==p->
b2d0: 63 6f 6c 53 65 70 61 72 61 74 6f 72 5b 30 5d 20  colSeparator[0] 
b2e0: 26 26 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  &&.             
b2f0: 28 6e 53 65 70 3d 3d 31 20 7c 7c 20 6d 65 6d 63  (nSep==1 || memc
b300: 6d 70 28 7a 2c 20 70 2d 3e 63 6f 6c 53 65 70 61  mp(z, p->colSepa
b310: 72 61 74 6f 72 2c 20 6e 53 65 70 29 3d 3d 30 29  rator, nSep)==0)
b320: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 20 3d  ) ){.        i =
b330: 20 30 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61   0;.        brea
b340: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
b350: 0a 20 20 20 20 69 66 28 20 69 3d 3d 30 20 29 7b  .    if( i==0 ){
b360: 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 51 75  .      char *zQu
b370: 6f 74 65 64 20 3d 20 73 71 6c 69 74 65 33 5f 6d  oted = sqlite3_m
b380: 70 72 69 6e 74 66 28 22 5c 22 25 77 5c 22 22 2c  printf("\"%w\"",
b390: 20 7a 29 3b 0a 20 20 20 20 20 20 75 74 66 38 5f   z);.      utf8_
b3a0: 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 73 22  printf(out, "%s"
b3b0: 2c 20 7a 51 75 6f 74 65 64 29 3b 0a 20 20 20 20  , zQuoted);.    
b3c0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
b3d0: 51 75 6f 74 65 64 29 3b 0a 20 20 20 20 7d 65 6c  Quoted);.    }el
b3e0: 73 65 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70  se{.      utf8_p
b3f0: 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 73 22 2c  rintf(out, "%s",
b400: 20 7a 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20   z);.    }.  }. 
b410: 20 69 66 28 20 62 53 65 70 20 29 7b 0a 20 20 20   if( bSep ){.   
b420: 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e   utf8_printf(p->
b430: 6f 75 74 2c 20 22 25 73 22 2c 20 70 2d 3e 63 6f  out, "%s", p->co
b440: 6c 53 65 70 61 72 61 74 6f 72 29 3b 0a 20 20 7d  lSeparator);.  }
b450: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
b460: 6f 75 74 69 6e 65 20 72 75 6e 73 20 77 68 65 6e  outine runs when
b470: 20 74 68 65 20 75 73 65 72 20 70 72 65 73 73 65   the user presse
b480: 73 20 43 74 72 6c 2d 43 0a 2a 2f 0a 73 74 61 74  s Ctrl-C.*/.stat
b490: 69 63 20 76 6f 69 64 20 69 6e 74 65 72 72 75 70  ic void interrup
b4a0: 74 5f 68 61 6e 64 6c 65 72 28 69 6e 74 20 4e 6f  t_handler(int No
b4b0: 74 55 73 65 64 29 7b 0a 20 20 55 4e 55 53 45 44  tUsed){.  UNUSED
b4c0: 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73  _PARAMETER(NotUs
b4d0: 65 64 29 3b 0a 20 20 73 65 65 6e 49 6e 74 65 72  ed);.  seenInter
b4e0: 72 75 70 74 2b 2b 3b 0a 20 20 69 66 28 20 73 65  rupt++;.  if( se
b4f0: 65 6e 49 6e 74 65 72 72 75 70 74 3e 32 20 29 20  enInterrupt>2 ) 
b500: 65 78 69 74 28 31 29 3b 0a 20 20 69 66 28 20 67  exit(1);.  if( g
b510: 6c 6f 62 61 6c 44 62 20 29 20 73 71 6c 69 74 65  lobalDb ) sqlite
b520: 33 5f 69 6e 74 65 72 72 75 70 74 28 67 6c 6f 62  3_interrupt(glob
b530: 61 6c 44 62 29 3b 0a 7d 0a 0a 23 69 66 20 28 64  alDb);.}..#if (d
b540: 65 66 69 6e 65 64 28 5f 57 49 4e 33 32 29 20 7c  efined(_WIN32) |
b550: 7c 20 64 65 66 69 6e 65 64 28 57 49 4e 33 32 29  | defined(WIN32)
b560: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 5f 57  ) && !defined(_W
b570: 49 4e 33 32 5f 57 43 45 29 0a 2f 2a 0a 2a 2a 20  IN32_WCE)./*.** 
b580: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 75 6e  This routine run
b590: 73 20 66 6f 72 20 63 6f 6e 73 6f 6c 65 20 65 76  s for console ev
b5a0: 65 6e 74 73 20 28 65 2e 67 2e 20 43 74 72 6c 2d  ents (e.g. Ctrl-
b5b0: 43 29 20 6f 6e 20 57 69 6e 33 32 0a 2a 2f 0a 73  C) on Win32.*/.s
b5c0: 74 61 74 69 63 20 42 4f 4f 4c 20 57 49 4e 41 50  tatic BOOL WINAP
b5d0: 49 20 43 6f 6e 73 6f 6c 65 43 74 72 6c 48 61 6e  I ConsoleCtrlHan
b5e0: 64 6c 65 72 28 0a 20 20 44 57 4f 52 44 20 64 77  dler(.  DWORD dw
b5f0: 43 74 72 6c 54 79 70 65 20 2f 2a 20 4f 6e 65 20  CtrlType /* One 
b600: 6f 66 20 74 68 65 20 43 54 52 4c 5f 2a 5f 45 56  of the CTRL_*_EV
b610: 45 4e 54 20 63 6f 6e 73 74 61 6e 74 73 20 2a 2f  ENT constants */
b620: 0a 29 7b 0a 20 20 69 66 28 20 64 77 43 74 72 6c  .){.  if( dwCtrl
b630: 54 79 70 65 3d 3d 43 54 52 4c 5f 43 5f 45 56 45  Type==CTRL_C_EVE
b640: 4e 54 20 29 7b 0a 20 20 20 20 69 6e 74 65 72 72  NT ){.    interr
b650: 75 70 74 5f 68 61 6e 64 6c 65 72 28 30 29 3b 0a  upt_handler(0);.
b660: 20 20 20 20 72 65 74 75 72 6e 20 54 52 55 45 3b      return TRUE;
b670: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 46 41  .  }.  return FA
b680: 4c 53 45 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23  LSE;.}.#endif..#
b690: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
b6a0: 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e  IT_AUTHORIZATION
b6b0: 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 65 20  ./*.** When the 
b6c0: 22 2e 61 75 74 68 20 4f 4e 22 20 69 73 20 73 65  ".auth ON" is se
b6d0: 74 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  t, the following
b6e0: 20 61 75 74 68 6f 72 69 7a 65 72 20 63 61 6c 6c   authorizer call
b6f0: 62 61 63 6b 20 69 73 0a 2a 2a 20 69 6e 76 6f 6b  back is.** invok
b700: 65 64 2e 20 20 49 74 20 61 6c 77 61 79 73 20 72  ed.  It always r
b710: 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b  eturns SQLITE_OK
b720: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
b730: 73 68 65 6c 6c 41 75 74 68 28 0a 20 20 76 6f 69  shellAuth(.  voi
b740: 64 20 2a 70 43 6c 69 65 6e 74 44 61 74 61 2c 0a  d *pClientData,.
b750: 20 20 69 6e 74 20 6f 70 2c 0a 20 20 63 6f 6e 73    int op,.  cons
b760: 74 20 63 68 61 72 20 2a 7a 41 31 2c 0a 20 20 63  t char *zA1,.  c
b770: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 32 2c 0a  onst char *zA2,.
b780: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41    const char *zA
b790: 33 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  3,.  const char 
b7a0: 2a 7a 41 34 0a 29 7b 0a 20 20 53 68 65 6c 6c 53  *zA4.){.  ShellS
b7b0: 74 61 74 65 20 2a 70 20 3d 20 28 53 68 65 6c 6c  tate *p = (Shell
b7c0: 53 74 61 74 65 2a 29 70 43 6c 69 65 6e 74 44 61  State*)pClientDa
b7d0: 74 61 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e  ta;.  static con
b7e0: 73 74 20 63 68 61 72 20 2a 61 7a 41 63 74 69 6f  st char *azActio
b7f0: 6e 5b 5d 20 3d 20 7b 20 30 2c 0a 20 20 20 20 20  n[] = { 0,.     
b800: 22 43 52 45 41 54 45 5f 49 4e 44 45 58 22 2c 20  "CREATE_INDEX", 
b810: 20 20 20 20 20 20 20 20 22 43 52 45 41 54 45 5f          "CREATE_
b820: 54 41 42 4c 45 22 2c 20 20 20 20 20 20 20 20 20  TABLE",         
b830: 22 43 52 45 41 54 45 5f 54 45 4d 50 5f 49 4e 44  "CREATE_TEMP_IND
b840: 45 58 22 2c 0a 20 20 20 20 20 22 43 52 45 41 54  EX",.     "CREAT
b850: 45 5f 54 45 4d 50 5f 54 41 42 4c 45 22 2c 20 20  E_TEMP_TABLE",  
b860: 20 20 22 43 52 45 41 54 45 5f 54 45 4d 50 5f 54    "CREATE_TEMP_T
b870: 52 49 47 47 45 52 22 2c 20 20 22 43 52 45 41 54  RIGGER",  "CREAT
b880: 45 5f 54 45 4d 50 5f 56 49 45 57 22 2c 0a 20 20  E_TEMP_VIEW",.  
b890: 20 20 20 22 43 52 45 41 54 45 5f 54 52 49 47 47     "CREATE_TRIGG
b8a0: 45 52 22 2c 20 20 20 20 20 20 20 22 43 52 45 41  ER",       "CREA
b8b0: 54 45 5f 56 49 45 57 22 2c 20 20 20 20 20 20 20  TE_VIEW",       
b8c0: 20 20 20 22 44 45 4c 45 54 45 22 2c 0a 20 20 20     "DELETE",.   
b8d0: 20 20 22 44 52 4f 50 5f 49 4e 44 45 58 22 2c 20    "DROP_INDEX", 
b8e0: 20 20 20 20 20 20 20 20 20 20 22 44 52 4f 50 5f            "DROP_
b8f0: 54 41 42 4c 45 22 2c 20 20 20 20 20 20 20 20 20  TABLE",         
b900: 20 20 22 44 52 4f 50 5f 54 45 4d 50 5f 49 4e 44    "DROP_TEMP_IND
b910: 45 58 22 2c 0a 20 20 20 20 20 22 44 52 4f 50 5f  EX",.     "DROP_
b920: 54 45 4d 50 5f 54 41 42 4c 45 22 2c 20 20 20 20  TEMP_TABLE",    
b930: 20 20 22 44 52 4f 50 5f 54 45 4d 50 5f 54 52 49    "DROP_TEMP_TRI
b940: 47 47 45 52 22 2c 20 20 20 20 22 44 52 4f 50 5f  GGER",    "DROP_
b950: 54 45 4d 50 5f 56 49 45 57 22 2c 0a 20 20 20 20  TEMP_VIEW",.    
b960: 20 22 44 52 4f 50 5f 54 52 49 47 47 45 52 22 2c   "DROP_TRIGGER",
b970: 20 20 20 20 20 20 20 20 20 22 44 52 4f 50 5f 56           "DROP_V
b980: 49 45 57 22 2c 20 20 20 20 20 20 20 20 20 20 20  IEW",           
b990: 20 22 49 4e 53 45 52 54 22 2c 0a 20 20 20 20 20   "INSERT",.     
b9a0: 22 50 52 41 47 4d 41 22 2c 20 20 20 20 20 20 20  "PRAGMA",       
b9b0: 20 20 20 20 20 20 20 20 22 52 45 41 44 22 2c 20          "READ", 
b9c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b9d0: 22 53 45 4c 45 43 54 22 2c 0a 20 20 20 20 20 22  "SELECT",.     "
b9e0: 54 52 41 4e 53 41 43 54 49 4f 4e 22 2c 20 20 20  TRANSACTION",   
b9f0: 20 20 20 20 20 20 20 22 55 50 44 41 54 45 22 2c         "UPDATE",
ba00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
ba10: 41 54 54 41 43 48 22 2c 0a 20 20 20 20 20 22 44  ATTACH",.     "D
ba20: 45 54 41 43 48 22 2c 20 20 20 20 20 20 20 20 20  ETACH",         
ba30: 20 20 20 20 20 20 22 41 4c 54 45 52 5f 54 41 42        "ALTER_TAB
ba40: 4c 45 22 2c 20 20 20 20 20 20 20 20 20 20 22 52  LE",          "R
ba50: 45 49 4e 44 45 58 22 2c 0a 20 20 20 20 20 22 41  EINDEX",.     "A
ba60: 4e 41 4c 59 5a 45 22 2c 20 20 20 20 20 20 20 20  NALYZE",        
ba70: 20 20 20 20 20 20 22 43 52 45 41 54 45 5f 56 54        "CREATE_VT
ba80: 41 42 4c 45 22 2c 20 20 20 20 20 20 20 20 22 44  ABLE",        "D
ba90: 52 4f 50 5f 56 54 41 42 4c 45 22 2c 0a 20 20 20  ROP_VTABLE",.   
baa0: 20 20 22 46 55 4e 43 54 49 4f 4e 22 2c 20 20 20    "FUNCTION",   
bab0: 20 20 20 20 20 20 20 20 20 20 22 53 41 56 45 50            "SAVEP
bac0: 4f 49 4e 54 22 2c 20 20 20 20 20 20 20 20 20 20  OINT",          
bad0: 20 20 22 52 45 43 55 52 53 49 56 45 22 0a 20 20    "RECURSIVE".  
bae0: 7d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 6f  };.  int i;.  co
baf0: 6e 73 74 20 63 68 61 72 20 2a 61 7a 5b 34 5d 3b  nst char *az[4];
bb00: 0a 20 20 61 7a 5b 30 5d 20 3d 20 7a 41 31 3b 0a  .  az[0] = zA1;.
bb10: 20 20 61 7a 5b 31 5d 20 3d 20 7a 41 32 3b 0a 20    az[1] = zA2;. 
bb20: 20 61 7a 5b 32 5d 20 3d 20 7a 41 33 3b 0a 20 20   az[2] = zA3;.  
bb30: 61 7a 5b 33 5d 20 3d 20 7a 41 34 3b 0a 20 20 75  az[3] = zA4;.  u
bb40: 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  tf8_printf(p->ou
bb50: 74 2c 20 22 61 75 74 68 6f 72 69 7a 65 72 3a 20  t, "authorizer: 
bb60: 25 73 22 2c 20 61 7a 41 63 74 69 6f 6e 5b 6f 70  %s", azAction[op
bb70: 5d 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  ]);.  for(i=0; i
bb80: 3c 34 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 72 61  <4; i++){.    ra
bb90: 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  w_printf(p->out,
bba0: 20 22 20 22 29 3b 0a 20 20 20 20 69 66 28 20 61   " ");.    if( a
bbb0: 7a 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20 6f 75  z[i] ){.      ou
bbc0: 74 70 75 74 5f 63 5f 73 74 72 69 6e 67 28 70 2d  tput_c_string(p-
bbd0: 3e 6f 75 74 2c 20 61 7a 5b 69 5d 29 3b 0a 20 20  >out, az[i]);.  
bbe0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
bbf0: 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  aw_printf(p->out
bc00: 2c 20 22 4e 55 4c 4c 22 29 3b 0a 20 20 20 20 7d  , "NULL");.    }
bc10: 0a 20 20 7d 0a 20 20 72 61 77 5f 70 72 69 6e 74  .  }.  raw_print
bc20: 66 28 70 2d 3e 6f 75 74 2c 20 22 5c 6e 22 29 3b  f(p->out, "\n");
bc30: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
bc40: 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  _OK;.}.#endif../
bc50: 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 20 73 63 68  *.** Print a sch
bc60: 65 6d 61 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  ema statement.  
bc70: 50 61 72 74 20 6f 66 20 4d 4f 44 45 5f 53 65 6d  Part of MODE_Sem
bc80: 69 20 61 6e 64 20 4d 4f 44 45 5f 50 72 65 74 74  i and MODE_Prett
bc90: 79 20 6f 75 74 70 75 74 2e 0a 2a 2a 0a 2a 2a 20  y output..**.** 
bca0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 6f 6e  This routine con
bcb0: 76 65 72 74 73 20 73 6f 6d 65 20 43 52 45 41 54  verts some CREAT
bcc0: 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
bcd0: 74 73 20 66 6f 72 20 73 68 61 64 6f 77 20 74 61  ts for shadow ta
bce0: 62 6c 65 73 0a 2a 2a 20 69 6e 20 46 54 53 33 2f  bles.** in FTS3/
bcf0: 34 2f 35 20 69 6e 74 6f 20 43 52 45 41 54 45 20  4/5 into CREATE 
bd00: 54 41 42 4c 45 20 49 46 20 4e 4f 54 20 45 58 49  TABLE IF NOT EXI
bd10: 53 54 53 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a  STS statements..
bd20: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  */.static void p
bd30: 72 69 6e 74 53 63 68 65 6d 61 4c 69 6e 65 28 46  rintSchemaLine(F
bd40: 49 4c 45 20 2a 6f 75 74 2c 20 63 6f 6e 73 74 20  ILE *out, const 
bd50: 63 68 61 72 20 2a 7a 2c 20 63 6f 6e 73 74 20 63  char *z, const c
bd60: 68 61 72 20 2a 7a 54 61 69 6c 29 7b 0a 20 20 69  har *zTail){.  i
bd70: 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72 67 6c  f( sqlite3_strgl
bd80: 6f 62 28 22 43 52 45 41 54 45 20 54 41 42 4c 45  ob("CREATE TABLE
bd90: 20 5b 27 5c 22 5d 2a 22 2c 20 7a 29 3d 3d 30 20   ['\"]*", z)==0 
bda0: 29 7b 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e  ){.    utf8_prin
bdb0: 74 66 28 6f 75 74 2c 20 22 43 52 45 41 54 45 20  tf(out, "CREATE 
bdc0: 54 41 42 4c 45 20 49 46 20 4e 4f 54 20 45 58 49  TABLE IF NOT EXI
bdd0: 53 54 53 20 25 73 25 73 22 2c 20 7a 2b 31 33 2c  STS %s%s", z+13,
bde0: 20 7a 54 61 69 6c 29 3b 0a 20 20 7d 65 6c 73 65   zTail);.  }else
bdf0: 7b 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74  {.    utf8_print
be00: 66 28 6f 75 74 2c 20 22 25 73 25 73 22 2c 20 7a  f(out, "%s%s", z
be10: 2c 20 7a 54 61 69 6c 29 3b 0a 20 20 7d 0a 7d 0a  , zTail);.  }.}.
be20: 73 74 61 74 69 63 20 76 6f 69 64 20 70 72 69 6e  static void prin
be30: 74 53 63 68 65 6d 61 4c 69 6e 65 4e 28 46 49 4c  tSchemaLineN(FIL
be40: 45 20 2a 6f 75 74 2c 20 63 68 61 72 20 2a 7a 2c  E *out, char *z,
be50: 20 69 6e 74 20 6e 2c 20 63 6f 6e 73 74 20 63 68   int n, const ch
be60: 61 72 20 2a 7a 54 61 69 6c 29 7b 0a 20 20 63 68  ar *zTail){.  ch
be70: 61 72 20 63 20 3d 20 7a 5b 6e 5d 3b 0a 20 20 7a  ar c = z[n];.  z
be80: 5b 6e 5d 20 3d 20 30 3b 0a 20 20 70 72 69 6e 74  [n] = 0;.  print
be90: 53 63 68 65 6d 61 4c 69 6e 65 28 6f 75 74 2c 20  SchemaLine(out, 
bea0: 7a 2c 20 7a 54 61 69 6c 29 3b 0a 20 20 7a 5b 6e  z, zTail);.  z[n
beb0: 5d 20 3d 20 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ] = c;.}../*.** 
bec0: 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 73  Return true if s
bed0: 74 72 69 6e 67 20 7a 5b 5d 20 68 61 73 20 6e 6f  tring z[] has no
bee0: 74 68 69 6e 67 20 62 75 74 20 77 68 69 74 65 73  thing but whites
bef0: 70 61 63 65 20 61 6e 64 20 63 6f 6d 6d 65 6e 74  pace and comment
bf00: 73 20 74 6f 20 74 68 65 0a 2a 2a 20 65 6e 64 20  s to the.** end 
bf10: 6f 66 20 74 68 65 20 66 69 72 73 74 20 6c 69 6e  of the first lin
bf20: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
bf30: 20 77 73 54 6f 45 6f 6c 28 63 6f 6e 73 74 20 63   wsToEol(const c
bf40: 68 61 72 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 69  har *z){.  int i
bf50: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 7a 5b 69  ;.  for(i=0; z[i
bf60: 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  ]; i++){.    if(
bf70: 20 7a 5b 69 5d 3d 3d 27 5c 6e 27 20 29 20 72 65   z[i]=='\n' ) re
bf80: 74 75 72 6e 20 31 3b 0a 20 20 20 20 69 66 28 20  turn 1;.    if( 
bf90: 49 73 53 70 61 63 65 28 7a 5b 69 5d 29 20 29 20  IsSpace(z[i]) ) 
bfa0: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
bfb0: 28 20 7a 5b 69 5d 3d 3d 27 2d 27 20 26 26 20 7a  ( z[i]=='-' && z
bfc0: 5b 69 2b 31 5d 3d 3d 27 2d 27 20 29 20 72 65 74  [i+1]=='-' ) ret
bfd0: 75 72 6e 20 31 3b 0a 20 20 20 20 72 65 74 75 72  urn 1;.    retur
bfe0: 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  n 0;.  }.  retur
bff0: 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  n 1;.}../*.** Ad
c000: 64 20 61 20 6e 65 77 20 65 6e 74 72 79 20 74 6f  d a new entry to
c010: 20 74 68 65 20 45 58 50 4c 41 49 4e 20 51 55 45   the EXPLAIN QUE
c020: 52 59 20 50 4c 41 4e 20 64 61 74 61 0a 2a 2f 0a  RY PLAN data.*/.
c030: 73 74 61 74 69 63 20 76 6f 69 64 20 65 71 70 5f  static void eqp_
c040: 61 70 70 65 6e 64 28 53 68 65 6c 6c 53 74 61 74  append(ShellStat
c050: 65 20 2a 70 2c 20 69 6e 74 20 69 45 71 70 49 64  e *p, int iEqpId
c060: 2c 20 69 6e 74 20 70 32 2c 20 63 6f 6e 73 74 20  , int p2, const 
c070: 63 68 61 72 20 2a 7a 54 65 78 74 29 7b 0a 20 20  char *zText){.  
c080: 45 51 50 47 72 61 70 68 52 6f 77 20 2a 70 4e 65  EQPGraphRow *pNe
c090: 77 3b 0a 20 20 69 6e 74 20 6e 54 65 78 74 20 3d  w;.  int nText =
c0a0: 20 73 74 72 6c 65 6e 33 30 28 7a 54 65 78 74 29   strlen30(zText)
c0b0: 3b 0a 20 20 69 66 28 20 70 2d 3e 61 75 74 6f 45  ;.  if( p->autoE
c0c0: 51 50 74 65 73 74 20 29 7b 0a 20 20 20 20 75 74  QPtest ){.    ut
c0d0: 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  f8_printf(p->out
c0e0: 2c 20 22 25 64 2c 25 64 2c 25 73 5c 6e 22 2c 20  , "%d,%d,%s\n", 
c0f0: 69 45 71 70 49 64 2c 20 70 32 2c 20 7a 54 65 78  iEqpId, p2, zTex
c100: 74 29 3b 0a 20 20 7d 0a 20 20 70 4e 65 77 20 3d  t);.  }.  pNew =
c110: 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36   sqlite3_malloc6
c120: 34 28 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29  4( sizeof(*pNew)
c130: 20 2b 20 6e 54 65 78 74 20 29 3b 0a 20 20 69 66   + nText );.  if
c140: 28 20 70 4e 65 77 3d 3d 30 20 29 20 73 68 65 6c  ( pNew==0 ) shel
c150: 6c 5f 6f 75 74 5f 6f 66 5f 6d 65 6d 6f 72 79 28  l_out_of_memory(
c160: 29 3b 0a 20 20 70 4e 65 77 2d 3e 69 45 71 70 49  );.  pNew->iEqpI
c170: 64 20 3d 20 69 45 71 70 49 64 3b 0a 20 20 70 4e  d = iEqpId;.  pN
c180: 65 77 2d 3e 69 50 61 72 65 6e 74 49 64 20 3d 20  ew->iParentId = 
c190: 70 32 3b 0a 20 20 6d 65 6d 63 70 79 28 70 4e 65  p2;.  memcpy(pNe
c1a0: 77 2d 3e 7a 54 65 78 74 2c 20 7a 54 65 78 74 2c  w->zText, zText,
c1b0: 20 6e 54 65 78 74 2b 31 29 3b 0a 20 20 70 4e 65   nText+1);.  pNe
c1c0: 77 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20  w->pNext = 0;.  
c1d0: 69 66 28 20 70 2d 3e 73 47 72 61 70 68 2e 70 4c  if( p->sGraph.pL
c1e0: 61 73 74 20 29 7b 0a 20 20 20 20 70 2d 3e 73 47  ast ){.    p->sG
c1f0: 72 61 70 68 2e 70 4c 61 73 74 2d 3e 70 4e 65 78  raph.pLast->pNex
c200: 74 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 65 6c 73  t = pNew;.  }els
c210: 65 7b 0a 20 20 20 20 70 2d 3e 73 47 72 61 70 68  e{.    p->sGraph
c220: 2e 70 52 6f 77 20 3d 20 70 4e 65 77 3b 0a 20 20  .pRow = pNew;.  
c230: 7d 0a 20 20 70 2d 3e 73 47 72 61 70 68 2e 70 4c  }.  p->sGraph.pL
c240: 61 73 74 20 3d 20 70 4e 65 77 3b 0a 7d 0a 0a 2f  ast = pNew;.}../
c250: 2a 0a 2a 2a 20 46 72 65 65 20 61 6e 64 20 72 65  *.** Free and re
c260: 73 65 74 20 74 68 65 20 45 58 50 4c 41 49 4e 20  set the EXPLAIN 
c270: 51 55 45 52 59 20 50 4c 41 4e 20 64 61 74 61 20  QUERY PLAN data 
c280: 74 68 61 74 20 68 61 73 20 62 65 65 6e 20 63 6f  that has been co
c290: 6c 6c 65 63 74 65 64 0a 2a 2a 20 69 6e 20 70 2d  llected.** in p-
c2a0: 3e 73 47 72 61 70 68 2e 0a 2a 2f 0a 73 74 61 74  >sGraph..*/.stat
c2b0: 69 63 20 76 6f 69 64 20 65 71 70 5f 72 65 73 65  ic void eqp_rese
c2c0: 74 28 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 29  t(ShellState *p)
c2d0: 7b 0a 20 20 45 51 50 47 72 61 70 68 52 6f 77 20  {.  EQPGraphRow 
c2e0: 2a 70 52 6f 77 2c 20 2a 70 4e 65 78 74 3b 0a 20  *pRow, *pNext;. 
c2f0: 20 66 6f 72 28 70 52 6f 77 20 3d 20 70 2d 3e 73   for(pRow = p->s
c300: 47 72 61 70 68 2e 70 52 6f 77 3b 20 70 52 6f 77  Graph.pRow; pRow
c310: 3b 20 70 52 6f 77 20 3d 20 70 4e 65 78 74 29 7b  ; pRow = pNext){
c320: 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70 52 6f  .    pNext = pRo
c330: 77 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 73 71  w->pNext;.    sq
c340: 6c 69 74 65 33 5f 66 72 65 65 28 70 52 6f 77 29  lite3_free(pRow)
c350: 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 26  ;.  }.  memset(&
c360: 70 2d 3e 73 47 72 61 70 68 2c 20 30 2c 20 73 69  p->sGraph, 0, si
c370: 7a 65 6f 66 28 70 2d 3e 73 47 72 61 70 68 29 29  zeof(p->sGraph))
c380: 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 74  ;.}../* Return t
c390: 68 65 20 6e 65 78 74 20 45 58 50 4c 41 49 4e 20  he next EXPLAIN 
c3a0: 51 55 45 52 59 20 50 4c 41 4e 20 6c 69 6e 65 20  QUERY PLAN line 
c3b0: 77 69 74 68 20 69 45 71 70 49 64 20 74 68 61 74  with iEqpId that
c3c0: 20 6f 63 63 75 72 73 20 61 66 74 65 72 0a 2a 2a   occurs after.**
c3d0: 20 70 4f 6c 64 2c 20 6f 72 20 72 65 74 75 72 6e   pOld, or return
c3e0: 20 74 68 65 20 66 69 72 73 74 20 73 75 63 68 20   the first such 
c3f0: 6c 69 6e 65 20 69 66 20 70 4f 6c 64 20 69 73 20  line if pOld is 
c400: 4e 55 4c 4c 0a 2a 2f 0a 73 74 61 74 69 63 20 45  NULL.*/.static E
c410: 51 50 47 72 61 70 68 52 6f 77 20 2a 65 71 70 5f  QPGraphRow *eqp_
c420: 6e 65 78 74 5f 72 6f 77 28 53 68 65 6c 6c 53 74  next_row(ShellSt
c430: 61 74 65 20 2a 70 2c 20 69 6e 74 20 69 45 71 70  ate *p, int iEqp
c440: 49 64 2c 20 45 51 50 47 72 61 70 68 52 6f 77 20  Id, EQPGraphRow 
c450: 2a 70 4f 6c 64 29 7b 0a 20 20 45 51 50 47 72 61  *pOld){.  EQPGra
c460: 70 68 52 6f 77 20 2a 70 52 6f 77 20 3d 20 70 4f  phRow *pRow = pO
c470: 6c 64 20 3f 20 70 4f 6c 64 2d 3e 70 4e 65 78 74  ld ? pOld->pNext
c480: 20 3a 20 70 2d 3e 73 47 72 61 70 68 2e 70 52 6f   : p->sGraph.pRo
c490: 77 3b 0a 20 20 77 68 69 6c 65 28 20 70 52 6f 77  w;.  while( pRow
c4a0: 20 26 26 20 70 52 6f 77 2d 3e 69 50 61 72 65 6e   && pRow->iParen
c4b0: 74 49 64 21 3d 69 45 71 70 49 64 20 29 20 70 52  tId!=iEqpId ) pR
c4c0: 6f 77 20 3d 20 70 52 6f 77 2d 3e 70 4e 65 78 74  ow = pRow->pNext
c4d0: 3b 0a 20 20 72 65 74 75 72 6e 20 70 52 6f 77 3b  ;.  return pRow;
c4e0: 0a 7d 0a 0a 2f 2a 20 52 65 6e 64 65 72 20 61 20  .}../* Render a 
c4f0: 73 69 6e 67 6c 65 20 6c 65 76 65 6c 20 6f 66 20  single level of 
c500: 74 68 65 20 67 72 61 70 68 20 74 68 61 74 20 68  the graph that h
c510: 61 73 20 69 45 71 70 49 64 20 61 73 20 69 74 73  as iEqpId as its
c520: 20 70 61 72 65 6e 74 2e 20 20 43 61 6c 6c 65 64   parent.  Called
c530: 0a 2a 2a 20 72 65 63 75 72 73 69 76 65 6c 79 20  .** recursively 
c540: 74 6f 20 72 65 6e 64 65 72 20 73 75 62 6c 65 76  to render sublev
c550: 65 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  els..*/.static v
c560: 6f 69 64 20 65 71 70 5f 72 65 6e 64 65 72 5f 6c  oid eqp_render_l
c570: 65 76 65 6c 28 53 68 65 6c 6c 53 74 61 74 65 20  evel(ShellState 
c580: 2a 70 2c 20 69 6e 74 20 69 45 71 70 49 64 29 7b  *p, int iEqpId){
c590: 0a 20 20 45 51 50 47 72 61 70 68 52 6f 77 20 2a  .  EQPGraphRow *
c5a0: 70 52 6f 77 2c 20 2a 70 4e 65 78 74 3b 0a 20 20  pRow, *pNext;.  
c5b0: 69 6e 74 20 6e 20 3d 20 73 74 72 6c 65 6e 33 30  int n = strlen30
c5c0: 28 70 2d 3e 73 47 72 61 70 68 2e 7a 50 72 65 66  (p->sGraph.zPref
c5d0: 69 78 29 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a  ix);.  char *z;.
c5e0: 20 20 66 6f 72 28 70 52 6f 77 20 3d 20 65 71 70    for(pRow = eqp
c5f0: 5f 6e 65 78 74 5f 72 6f 77 28 70 2c 20 69 45 71  _next_row(p, iEq
c600: 70 49 64 2c 20 30 29 3b 20 70 52 6f 77 3b 20 70  pId, 0); pRow; p
c610: 52 6f 77 20 3d 20 70 4e 65 78 74 29 7b 0a 20 20  Row = pNext){.  
c620: 20 20 70 4e 65 78 74 20 3d 20 65 71 70 5f 6e 65    pNext = eqp_ne
c630: 78 74 5f 72 6f 77 28 70 2c 20 69 45 71 70 49 64  xt_row(p, iEqpId
c640: 2c 20 70 52 6f 77 29 3b 0a 20 20 20 20 7a 20 3d  , pRow);.    z =
c650: 20 70 52 6f 77 2d 3e 7a 54 65 78 74 3b 0a 20 20   pRow->zText;.  
c660: 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d    utf8_printf(p-
c670: 3e 6f 75 74 2c 20 22 25 73 25 73 25 73 5c 6e 22  >out, "%s%s%s\n"
c680: 2c 20 70 2d 3e 73 47 72 61 70 68 2e 7a 50 72 65  , p->sGraph.zPre
c690: 66 69 78 2c 20 70 4e 65 78 74 20 3f 20 22 7c 2d  fix, pNext ? "|-
c6a0: 2d 22 20 3a 20 22 60 2d 2d 22 2c 20 7a 29 3b 0a  -" : "`--", z);.
c6b0: 20 20 20 20 69 66 28 20 6e 3c 28 69 6e 74 29 73      if( n<(int)s
c6c0: 69 7a 65 6f 66 28 70 2d 3e 73 47 72 61 70 68 2e  izeof(p->sGraph.
c6d0: 7a 50 72 65 66 69 78 29 2d 37 20 29 7b 0a 20 20  zPrefix)-7 ){.  
c6e0: 20 20 20 20 6d 65 6d 63 70 79 28 26 70 2d 3e 73      memcpy(&p->s
c6f0: 47 72 61 70 68 2e 7a 50 72 65 66 69 78 5b 6e 5d  Graph.zPrefix[n]
c700: 2c 20 70 4e 65 78 74 20 3f 20 22 7c 20 20 22 20  , pNext ? "|  " 
c710: 3a 20 22 20 20 20 22 2c 20 34 29 3b 0a 20 20 20  : "   ", 4);.   
c720: 20 20 20 65 71 70 5f 72 65 6e 64 65 72 5f 6c 65     eqp_render_le
c730: 76 65 6c 28 70 2c 20 70 52 6f 77 2d 3e 69 45 71  vel(p, pRow->iEq
c740: 70 49 64 29 3b 0a 20 20 20 20 20 20 70 2d 3e 73  pId);.      p->s
c750: 47 72 61 70 68 2e 7a 50 72 65 66 69 78 5b 6e 5d  Graph.zPrefix[n]
c760: 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
c770: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 70 6c 61 79  }../*.** Display
c780: 20 61 6e 64 20 72 65 73 65 74 20 74 68 65 20 45   and reset the E
c790: 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41  XPLAIN QUERY PLA
c7a0: 4e 20 64 61 74 61 0a 2a 2f 0a 73 74 61 74 69 63  N data.*/.static
c7b0: 20 76 6f 69 64 20 65 71 70 5f 72 65 6e 64 65 72   void eqp_render
c7c0: 28 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 29 7b  (ShellState *p){
c7d0: 0a 20 20 45 51 50 47 72 61 70 68 52 6f 77 20 2a  .  EQPGraphRow *
c7e0: 70 52 6f 77 20 3d 20 70 2d 3e 73 47 72 61 70 68  pRow = p->sGraph
c7f0: 2e 70 52 6f 77 3b 0a 20 20 69 66 28 20 70 52 6f  .pRow;.  if( pRo
c800: 77 20 29 7b 0a 20 20 20 20 69 66 28 20 70 52 6f  w ){.    if( pRo
c810: 77 2d 3e 7a 54 65 78 74 5b 30 5d 3d 3d 27 2d 27  w->zText[0]=='-'
c820: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 52   ){.      if( pR
c830: 6f 77 2d 3e 70 4e 65 78 74 3d 3d 30 20 29 7b 0a  ow->pNext==0 ){.
c840: 20 20 20 20 20 20 20 20 65 71 70 5f 72 65 73 65          eqp_rese
c850: 74 28 70 29 3b 0a 20 20 20 20 20 20 20 20 72 65  t(p);.        re
c860: 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20  turn;.      }.  
c870: 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
c880: 70 2d 3e 6f 75 74 2c 20 22 25 73 5c 6e 22 2c 20  p->out, "%s\n", 
c890: 70 52 6f 77 2d 3e 7a 54 65 78 74 2b 33 29 3b 0a  pRow->zText+3);.
c8a0: 20 20 20 20 20 20 70 2d 3e 73 47 72 61 70 68 2e        p->sGraph.
c8b0: 70 52 6f 77 20 3d 20 70 52 6f 77 2d 3e 70 4e 65  pRow = pRow->pNe
c8c0: 78 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  xt;.      sqlite
c8d0: 33 5f 66 72 65 65 28 70 52 6f 77 29 3b 0a 20 20  3_free(pRow);.  
c8e0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 75    }else{.      u
c8f0: 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  tf8_printf(p->ou
c900: 74 2c 20 22 51 55 45 52 59 20 50 4c 41 4e 5c 6e  t, "QUERY PLAN\n
c910: 22 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d  ");.    }.    p-
c920: 3e 73 47 72 61 70 68 2e 7a 50 72 65 66 69 78 5b  >sGraph.zPrefix[
c930: 30 5d 20 3d 20 30 3b 0a 20 20 20 20 65 71 70 5f  0] = 0;.    eqp_
c940: 72 65 6e 64 65 72 5f 6c 65 76 65 6c 28 70 2c 20  render_level(p, 
c950: 30 29 3b 0a 20 20 20 20 65 71 70 5f 72 65 73 65  0);.    eqp_rese
c960: 74 28 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66  t(p);.  }.}..#if
c970: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
c980: 5f 50 52 4f 47 52 45 53 53 5f 43 41 4c 4c 42 41  _PROGRESS_CALLBA
c990: 43 4b 0a 2f 2a 0a 2a 2a 20 50 72 6f 67 72 65 73  CK./*.** Progres
c9a0: 73 20 68 61 6e 64 6c 65 72 20 63 61 6c 6c 62 61  s handler callba
c9b0: 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ck..*/.static in
c9c0: 74 20 70 72 6f 67 72 65 73 73 5f 68 61 6e 64 6c  t progress_handl
c9d0: 65 72 28 76 6f 69 64 20 2a 70 43 6c 69 65 6e 74  er(void *pClient
c9e0: 44 61 74 61 29 20 7b 0a 20 20 53 68 65 6c 6c 53  Data) {.  ShellS
c9f0: 74 61 74 65 20 2a 70 20 3d 20 28 53 68 65 6c 6c  tate *p = (Shell
ca00: 53 74 61 74 65 2a 29 70 43 6c 69 65 6e 74 44 61  State*)pClientDa
ca10: 74 61 3b 0a 20 20 70 2d 3e 6e 50 72 6f 67 72 65  ta;.  p->nProgre
ca20: 73 73 2b 2b 3b 0a 20 20 69 66 28 20 70 2d 3e 6e  ss++;.  if( p->n
ca30: 50 72 6f 67 72 65 73 73 3e 3d 70 2d 3e 6d 78 50  Progress>=p->mxP
ca40: 72 6f 67 72 65 73 73 20 26 26 20 70 2d 3e 6d 78  rogress && p->mx
ca50: 50 72 6f 67 72 65 73 73 3e 30 20 29 7b 0a 20 20  Progress>0 ){.  
ca60: 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e    raw_printf(p->
ca70: 6f 75 74 2c 20 22 50 72 6f 67 72 65 73 73 20 6c  out, "Progress l
ca80: 69 6d 69 74 20 72 65 61 63 68 65 64 20 28 25 75  imit reached (%u
ca90: 29 5c 6e 22 2c 20 70 2d 3e 6e 50 72 6f 67 72 65  )\n", p->nProgre
caa0: 73 73 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  ss);.    if( p->
cab0: 66 6c 67 50 72 6f 67 72 65 73 73 20 26 20 53 48  flgProgress & SH
cac0: 45 4c 4c 5f 50 52 4f 47 52 45 53 53 5f 52 45 53  ELL_PROGRESS_RES
cad0: 45 54 20 29 20 70 2d 3e 6e 50 72 6f 67 72 65 73  ET ) p->nProgres
cae0: 73 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70  s = 0;.    if( p
caf0: 2d 3e 66 6c 67 50 72 6f 67 72 65 73 73 20 26 20  ->flgProgress & 
cb00: 53 48 45 4c 4c 5f 50 52 4f 47 52 45 53 53 5f 4f  SHELL_PROGRESS_O
cb10: 4e 43 45 20 29 20 70 2d 3e 6d 78 50 72 6f 67 72  NCE ) p->mxProgr
cb20: 65 73 73 20 3d 20 30 3b 0a 20 20 20 20 72 65 74  ess = 0;.    ret
cb30: 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 1;.  }.  if(
cb40: 20 28 70 2d 3e 66 6c 67 50 72 6f 67 72 65 73 73   (p->flgProgress
cb50: 20 26 20 53 48 45 4c 4c 5f 50 52 4f 47 52 45 53   & SHELL_PROGRES
cb60: 53 5f 51 55 49 45 54 29 3d 3d 30 20 29 7b 0a 20  S_QUIET)==0 ){. 
cb70: 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d     raw_printf(p-
cb80: 3e 6f 75 74 2c 20 22 50 72 6f 67 72 65 73 73 20  >out, "Progress 
cb90: 25 75 5c 6e 22 2c 20 70 2d 3e 6e 50 72 6f 67 72  %u\n", p->nProgr
cba0: 65 73 73 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ess);.  }.  retu
cbb0: 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  rn 0;.}.#endif /
cbc0: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 52  * SQLITE_OMIT_PR
cbd0: 4f 47 52 45 53 53 5f 43 41 4c 4c 42 41 43 4b 20  OGRESS_CALLBACK 
cbe0: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69  */../*.** This i
cbf0: 73 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 72  s the callback r
cc00: 6f 75 74 69 6e 65 20 74 68 61 74 20 74 68 65 20  outine that the 
cc10: 73 68 65 6c 6c 0a 2a 2a 20 69 6e 76 6f 6b 65 73  shell.** invokes
cc20: 20 66 6f 72 20 65 61 63 68 20 72 6f 77 20 6f 66   for each row of
cc30: 20 61 20 71 75 65 72 79 20 72 65 73 75 6c 74 2e   a query result.
cc40: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
cc50: 68 65 6c 6c 5f 63 61 6c 6c 62 61 63 6b 28 0a 20  hell_callback(. 
cc60: 20 76 6f 69 64 20 2a 70 41 72 67 2c 0a 20 20 69   void *pArg,.  i
cc70: 6e 74 20 6e 41 72 67 2c 20 20 20 20 20 20 20 20  nt nArg,        
cc80: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 73  /* Number of res
cc90: 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20  ult columns */. 
cca0: 20 63 68 61 72 20 2a 2a 61 7a 41 72 67 2c 20 20   char **azArg,  
ccb0: 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63    /* Text of eac
ccc0: 68 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 20  h result column 
ccd0: 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 7a 43 6f  */.  char **azCo
cce0: 6c 2c 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20  l,    /* Column 
ccf0: 6e 61 6d 65 73 20 2a 2f 0a 20 20 69 6e 74 20 2a  names */.  int *
cd00: 61 69 54 79 70 65 20 20 20 20 20 20 2f 2a 20 43  aiType      /* C
cd10: 6f 6c 75 6d 6e 20 74 79 70 65 73 20 2a 2f 0a 29  olumn types */.)
cd20: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 53 68 65  {.  int i;.  She
cd30: 6c 6c 53 74 61 74 65 20 2a 70 20 3d 20 28 53 68  llState *p = (Sh
cd40: 65 6c 6c 53 74 61 74 65 2a 29 70 41 72 67 3b 0a  ellState*)pArg;.
cd50: 0a 20 20 69 66 28 20 61 7a 41 72 67 3d 3d 30 20  .  if( azArg==0 
cd60: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 73 77  ) return 0;.  sw
cd70: 69 74 63 68 28 20 70 2d 3e 63 4d 6f 64 65 20 29  itch( p->cMode )
cd80: 7b 0a 20 20 20 20 63 61 73 65 20 4d 4f 44 45 5f  {.    case MODE_
cd90: 4c 69 6e 65 3a 20 7b 0a 20 20 20 20 20 20 69 6e  Line: {.      in
cda0: 74 20 77 20 3d 20 35 3b 0a 20 20 20 20 20 20 69  t w = 5;.      i
cdb0: 66 28 20 61 7a 41 72 67 3d 3d 30 20 29 20 62 72  f( azArg==0 ) br
cdc0: 65 61 6b 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  eak;.      for(i
cdd0: 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29  =0; i<nArg; i++)
cde0: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6c 65  {.        int le
cdf0: 6e 20 3d 20 73 74 72 6c 65 6e 33 30 28 61 7a 43  n = strlen30(azC
ce00: 6f 6c 5b 69 5d 20 3f 20 61 7a 43 6f 6c 5b 69 5d  ol[i] ? azCol[i]
ce10: 20 3a 20 22 22 29 3b 0a 20 20 20 20 20 20 20 20   : "");.        
ce20: 69 66 28 20 6c 65 6e 3e 77 20 29 20 77 20 3d 20  if( len>w ) w = 
ce30: 6c 65 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  len;.      }.   
ce40: 20 20 20 69 66 28 20 70 2d 3e 63 6e 74 2b 2b 3e     if( p->cnt++>
ce50: 30 20 29 20 75 74 66 38 5f 70 72 69 6e 74 66 28  0 ) utf8_printf(
ce60: 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20 70 2d  p->out, "%s", p-
ce70: 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 29 3b 0a  >rowSeparator);.
ce80: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
ce90: 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nArg; i++){.   
cea0: 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
ceb0: 28 70 2d 3e 6f 75 74 2c 22 25 2a 73 20 3d 20 25  (p->out,"%*s = %
cec0: 73 25 73 22 2c 20 77 2c 20 61 7a 43 6f 6c 5b 69  s%s", w, azCol[i
ced0: 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ],.             
cee0: 20 20 20 61 7a 41 72 67 5b 69 5d 20 3f 20 61 7a     azArg[i] ? az
cef0: 41 72 67 5b 69 5d 20 3a 20 70 2d 3e 6e 75 6c 6c  Arg[i] : p->null
cf00: 56 61 6c 75 65 2c 20 70 2d 3e 72 6f 77 53 65 70  Value, p->rowSep
cf10: 61 72 61 74 6f 72 29 3b 0a 20 20 20 20 20 20 7d  arator);.      }
cf20: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
cf30: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 4d 4f 44    }.    case MOD
cf40: 45 5f 45 78 70 6c 61 69 6e 3a 0a 20 20 20 20 63  E_Explain:.    c
cf50: 61 73 65 20 4d 4f 44 45 5f 43 6f 6c 75 6d 6e 3a  ase MODE_Column:
cf60: 20 7b 0a 20 20 20 20 20 20 73 74 61 74 69 63 20   {.      static 
cf70: 63 6f 6e 73 74 20 69 6e 74 20 61 45 78 70 6c 61  const int aExpla
cf80: 69 6e 57 69 64 74 68 73 5b 5d 20 3d 20 7b 34 2c  inWidths[] = {4,
cf90: 20 31 33 2c 20 34 2c 20 34 2c 20 34 2c 20 31 33   13, 4, 4, 4, 13
cfa0: 2c 20 32 2c 20 31 33 7d 3b 0a 20 20 20 20 20 20  , 2, 13};.      
cfb0: 63 6f 6e 73 74 20 69 6e 74 20 2a 63 6f 6c 57 69  const int *colWi
cfc0: 64 74 68 3b 0a 20 20 20 20 20 20 69 6e 74 20 73  dth;.      int s
cfd0: 68 6f 77 48 64 72 3b 0a 20 20 20 20 20 20 63 68  howHdr;.      ch
cfe0: 61 72 20 2a 72 6f 77 53 65 70 3b 0a 20 20 20 20  ar *rowSep;.    
cff0: 20 20 69 66 28 20 70 2d 3e 63 4d 6f 64 65 3d 3d    if( p->cMode==
d000: 4d 4f 44 45 5f 43 6f 6c 75 6d 6e 20 29 7b 0a 20  MODE_Column ){. 
d010: 20 20 20 20 20 20 20 63 6f 6c 57 69 64 74 68 20         colWidth 
d020: 3d 20 70 2d 3e 63 6f 6c 57 69 64 74 68 3b 0a 20  = p->colWidth;. 
d030: 20 20 20 20 20 20 20 73 68 6f 77 48 64 72 20 3d         showHdr =
d040: 20 70 2d 3e 73 68 6f 77 48 65 61 64 65 72 3b 0a   p->showHeader;.
d050: 20 20 20 20 20 20 20 20 72 6f 77 53 65 70 20 3d          rowSep =
d060: 20 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72   p->rowSeparator
d070: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
d080: 20 20 20 20 20 20 20 63 6f 6c 57 69 64 74 68 20         colWidth 
d090: 3d 20 61 45 78 70 6c 61 69 6e 57 69 64 74 68 73  = aExplainWidths
d0a0: 3b 0a 20 20 20 20 20 20 20 20 73 68 6f 77 48 64  ;.        showHd
d0b0: 72 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 72  r = 1;.        r
d0c0: 6f 77 53 65 70 20 3d 20 53 45 50 5f 52 6f 77 3b  owSep = SEP_Row;
d0d0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
d0e0: 66 28 20 70 2d 3e 63 6e 74 2b 2b 3d 3d 30 20 29  f( p->cnt++==0 )
d0f0: 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  {.        for(i=
d100: 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b  0; i<nArg; i++){
d110: 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 77  .          int w
d120: 2c 20 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 69  , n;.          i
d130: 66 28 20 69 3c 41 72 72 61 79 53 69 7a 65 28 70  f( i<ArraySize(p
d140: 2d 3e 63 6f 6c 57 69 64 74 68 29 20 29 7b 0a 20  ->colWidth) ){. 
d150: 20 20 20 20 20 20 20 20 20 20 20 77 20 3d 20 63             w = c
d160: 6f 6c 57 69 64 74 68 5b 69 5d 3b 0a 20 20 20 20  olWidth[i];.    
d170: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
d180: 20 20 20 20 20 20 20 20 20 77 20 3d 20 30 3b 0a           w = 0;.
d190: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
d1a0: 20 20 20 20 20 20 69 66 28 20 77 3d 3d 30 20 29        if( w==0 )
d1b0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 77 20  {.            w 
d1c0: 3d 20 73 74 72 6c 65 6e 43 68 61 72 28 61 7a 43  = strlenChar(azC
d1d0: 6f 6c 5b 69 5d 20 3f 20 61 7a 43 6f 6c 5b 69 5d  ol[i] ? azCol[i]
d1e0: 20 3a 20 22 22 29 3b 0a 20 20 20 20 20 20 20 20   : "");.        
d1f0: 20 20 20 20 69 66 28 20 77 3c 31 30 20 29 20 77      if( w<10 ) w
d200: 20 3d 20 31 30 3b 0a 20 20 20 20 20 20 20 20 20   = 10;.         
d210: 20 20 20 6e 20 3d 20 73 74 72 6c 65 6e 43 68 61     n = strlenCha
d220: 72 28 61 7a 41 72 67 20 26 26 20 61 7a 41 72 67  r(azArg && azArg
d230: 5b 69 5d 20 3f 20 61 7a 41 72 67 5b 69 5d 20 3a  [i] ? azArg[i] :
d240: 20 70 2d 3e 6e 75 6c 6c 56 61 6c 75 65 29 3b 0a   p->nullValue);.
d250: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
d260: 77 3c 6e 20 29 20 77 20 3d 20 6e 3b 0a 20 20 20  w<n ) w = n;.   
d270: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
d280: 20 20 20 69 66 28 20 69 3c 41 72 72 61 79 53 69     if( i<ArraySi
d290: 7a 65 28 70 2d 3e 61 63 74 75 61 6c 57 69 64 74  ze(p->actualWidt
d2a0: 68 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  h) ){.          
d2b0: 20 20 70 2d 3e 61 63 74 75 61 6c 57 69 64 74 68    p->actualWidth
d2c0: 5b 69 5d 20 3d 20 77 3b 0a 20 20 20 20 20 20 20  [i] = w;.       
d2d0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69     }.          i
d2e0: 66 28 20 73 68 6f 77 48 64 72 20 29 7b 0a 20 20  f( showHdr ){.  
d2f0: 20 20 20 20 20 20 20 20 20 20 75 74 66 38 5f 77            utf8_w
d300: 69 64 74 68 5f 70 72 69 6e 74 28 70 2d 3e 6f 75  idth_print(p->ou
d310: 74 2c 20 77 2c 20 61 7a 43 6f 6c 5b 69 5d 29 3b  t, w, azCol[i]);
d320: 0a 20 20 20 20 20 20 20 20 20 20 20 20 75 74 66  .            utf
d330: 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  8_printf(p->out,
d340: 20 22 25 73 22 2c 20 69 3d 3d 6e 41 72 67 2d 31   "%s", i==nArg-1
d350: 20 3f 20 72 6f 77 53 65 70 20 3a 20 22 20 20 22   ? rowSep : "  "
d360: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
d370: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
d380: 20 69 66 28 20 73 68 6f 77 48 64 72 20 29 7b 0a   if( showHdr ){.
d390: 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d            for(i=
d3a0: 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b  0; i<nArg; i++){
d3b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74  .            int
d3c0: 20 77 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   w;.            
d3d0: 69 66 28 20 69 3c 41 72 72 61 79 53 69 7a 65 28  if( i<ArraySize(
d3e0: 70 2d 3e 61 63 74 75 61 6c 57 69 64 74 68 29 20  p->actualWidth) 
d3f0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
d400: 20 20 77 20 3d 20 70 2d 3e 61 63 74 75 61 6c 57    w = p->actualW
d410: 69 64 74 68 5b 69 5d 3b 0a 20 20 20 20 20 20 20  idth[i];.       
d420: 20 20 20 20 20 20 20 20 69 66 28 20 77 3c 30 20          if( w<0 
d430: 29 20 77 20 3d 20 2d 77 3b 0a 20 20 20 20 20 20  ) w = -w;.      
d440: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
d450: 20 20 20 20 20 20 20 20 20 20 20 20 77 20 3d 20              w = 
d460: 31 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  10;.            
d470: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 75 74  }.            ut
d480: 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  f8_printf(p->out
d490: 2c 22 25 2d 2a 2e 2a 73 25 73 22 2c 77 2c 77 2c  ,"%-*.*s%s",w,w,
d4a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
d4b0: 20 20 20 20 22 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d      "-----------
d4c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d4d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d4e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 22  ---------------"
d4f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
d500: 20 20 20 20 22 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d      "-----------
d510: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d520: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d530: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 22  ---------------"
d540: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
d550: 20 20 20 20 20 20 69 3d 3d 6e 41 72 67 2d 31 20        i==nArg-1 
d560: 3f 20 72 6f 77 53 65 70 20 3a 20 22 20 20 22 29  ? rowSep : "  ")
d570: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
d580: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
d590: 20 20 20 20 20 20 69 66 28 20 61 7a 41 72 67 3d        if( azArg=
d5a0: 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
d5b0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72    for(i=0; i<nAr
d5c0: 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  g; i++){.       
d5d0: 20 69 6e 74 20 77 3b 0a 20 20 20 20 20 20 20 20   int w;.        
d5e0: 69 66 28 20 69 3c 41 72 72 61 79 53 69 7a 65 28  if( i<ArraySize(
d5f0: 70 2d 3e 61 63 74 75 61 6c 57 69 64 74 68 29 20  p->actualWidth) 
d600: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 77 20  ){.           w 
d610: 3d 20 70 2d 3e 61 63 74 75 61 6c 57 69 64 74 68  = p->actualWidth
d620: 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  [i];.        }el
d630: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 77  se{.           w
d640: 20 3d 20 31 30 3b 0a 20 20 20 20 20 20 20 20 7d   = 10;.        }
d650: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e  .        if( p->
d660: 63 4d 6f 64 65 3d 3d 4d 4f 44 45 5f 45 78 70 6c  cMode==MODE_Expl
d670: 61 69 6e 20 26 26 20 61 7a 41 72 67 5b 69 5d 20  ain && azArg[i] 
d680: 26 26 20 73 74 72 6c 65 6e 43 68 61 72 28 61 7a  && strlenChar(az
d690: 41 72 67 5b 69 5d 29 3e 77 20 29 7b 0a 20 20 20  Arg[i])>w ){.   
d6a0: 20 20 20 20 20 20 20 77 20 3d 20 73 74 72 6c 65         w = strle
d6b0: 6e 43 68 61 72 28 61 7a 41 72 67 5b 69 5d 29 3b  nChar(azArg[i]);
d6c0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
d6d0: 20 20 20 69 66 28 20 69 3d 3d 31 20 26 26 20 70     if( i==1 && p
d6e0: 2d 3e 61 69 49 6e 64 65 6e 74 20 26 26 20 70 2d  ->aiIndent && p-
d6f0: 3e 70 53 74 6d 74 20 29 7b 0a 20 20 20 20 20 20  >pStmt ){.      
d700: 20 20 20 20 69 66 28 20 70 2d 3e 69 49 6e 64 65      if( p->iInde
d710: 6e 74 3c 70 2d 3e 6e 49 6e 64 65 6e 74 20 29 7b  nt<p->nIndent ){
d720: 0a 20 20 20 20 20 20 20 20 20 20 20 20 75 74 66  .            utf
d730: 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  8_printf(p->out,
d740: 20 22 25 2a 2e 73 22 2c 20 70 2d 3e 61 69 49 6e   "%*.s", p->aiIn
d750: 64 65 6e 74 5b 70 2d 3e 69 49 6e 64 65 6e 74 5d  dent[p->iIndent]
d760: 2c 20 22 22 29 3b 0a 20 20 20 20 20 20 20 20 20  , "");.         
d770: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e   }.          p->
d780: 69 49 6e 64 65 6e 74 2b 2b 3b 0a 20 20 20 20 20  iIndent++;.     
d790: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 75 74 66     }.        utf
d7a0: 38 5f 77 69 64 74 68 5f 70 72 69 6e 74 28 70 2d  8_width_print(p-
d7b0: 3e 6f 75 74 2c 20 77 2c 20 61 7a 41 72 67 5b 69  >out, w, azArg[i
d7c0: 5d 20 3f 20 61 7a 41 72 67 5b 69 5d 20 3a 20 70  ] ? azArg[i] : p
d7d0: 2d 3e 6e 75 6c 6c 56 61 6c 75 65 29 3b 0a 20 20  ->nullValue);.  
d7e0: 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
d7f0: 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20  f(p->out, "%s", 
d800: 69 3d 3d 6e 41 72 67 2d 31 20 3f 20 72 6f 77 53  i==nArg-1 ? rowS
d810: 65 70 20 3a 20 22 20 20 22 29 3b 0a 20 20 20 20  ep : "  ");.    
d820: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
d830: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
d840: 4d 4f 44 45 5f 53 65 6d 69 3a 20 7b 20 20 20 2f  MODE_Semi: {   /
d850: 2a 20 2e 73 63 68 65 6d 61 20 61 6e 64 20 2e 66  * .schema and .f
d860: 75 6c 6c 73 63 68 65 6d 61 20 6f 75 74 70 75 74  ullschema output
d870: 20 2a 2f 0a 20 20 20 20 20 20 70 72 69 6e 74 53   */.      printS
d880: 63 68 65 6d 61 4c 69 6e 65 28 70 2d 3e 6f 75 74  chemaLine(p->out
d890: 2c 20 61 7a 41 72 67 5b 30 5d 2c 20 22 3b 5c 6e  , azArg[0], ";\n
d8a0: 22 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ");.      break;
d8b0: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
d8c0: 4d 4f 44 45 5f 50 72 65 74 74 79 3a 20 7b 20 20  MODE_Pretty: {  
d8d0: 2f 2a 20 2e 73 63 68 65 6d 61 20 61 6e 64 20 2e  /* .schema and .
d8e0: 66 75 6c 6c 73 63 68 65 6d 61 20 77 69 74 68 20  fullschema with 
d8f0: 2d 2d 69 6e 64 65 6e 74 20 2a 2f 0a 20 20 20 20  --indent */.    
d900: 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20 20    char *z;.     
d910: 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 69 6e   int j;.      in
d920: 74 20 6e 50 61 72 65 6e 20 3d 20 30 3b 0a 20 20  t nParen = 0;.  
d930: 20 20 20 20 63 68 61 72 20 63 45 6e 64 20 3d 20      char cEnd = 
d940: 30 3b 0a 20 20 20 20 20 20 63 68 61 72 20 63 3b  0;.      char c;
d950: 0a 20 20 20 20 20 20 69 6e 74 20 6e 4c 69 6e 65  .      int nLine
d960: 20 3d 20 30 3b 0a 20 20 20 20 20 20 61 73 73 65   = 0;.      asse
d970: 72 74 28 20 6e 41 72 67 3d 3d 31 20 29 3b 0a 20  rt( nArg==1 );. 
d980: 20 20 20 20 20 69 66 28 20 61 7a 41 72 67 5b 30       if( azArg[0
d990: 5d 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  ]==0 ) break;.  
d9a0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f      if( sqlite3_
d9b0: 73 74 72 6c 69 6b 65 28 22 43 52 45 41 54 45 20  strlike("CREATE 
d9c0: 56 49 45 57 25 22 2c 20 61 7a 41 72 67 5b 30 5d  VIEW%", azArg[0]
d9d0: 2c 20 30 29 3d 3d 30 0a 20 20 20 20 20 20 20 7c  , 0)==0.       |
d9e0: 7c 20 73 71 6c 69 74 65 33 5f 73 74 72 6c 69 6b  | sqlite3_strlik
d9f0: 65 28 22 43 52 45 41 54 45 20 54 52 49 47 25 22  e("CREATE TRIG%"
da00: 2c 20 61 7a 41 72 67 5b 30 5d 2c 20 30 29 3d 3d  , azArg[0], 0)==
da10: 30 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20  0.      ){.     
da20: 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70     utf8_printf(p
da30: 2d 3e 6f 75 74 2c 20 22 25 73 3b 5c 6e 22 2c 20  ->out, "%s;\n", 
da40: 61 7a 41 72 67 5b 30 5d 29 3b 0a 20 20 20 20 20  azArg[0]);.     
da50: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
da60: 7d 0a 20 20 20 20 20 20 7a 20 3d 20 73 71 6c 69  }.      z = sqli
da70: 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 22  te3_mprintf("%s"
da80: 2c 20 61 7a 41 72 67 5b 30 5d 29 3b 0a 20 20 20  , azArg[0]);.   
da90: 20 20 20 6a 20 3d 20 30 3b 0a 20 20 20 20 20 20     j = 0;.      
daa0: 66 6f 72 28 69 3d 30 3b 20 49 73 53 70 61 63 65  for(i=0; IsSpace
dab0: 28 7a 5b 69 5d 29 3b 20 69 2b 2b 29 7b 7d 0a 20  (z[i]); i++){}. 
dac0: 20 20 20 20 20 66 6f 72 28 3b 20 28 63 20 3d 20       for(; (c = 
dad0: 7a 5b 69 5d 29 21 3d 30 3b 20 69 2b 2b 29 7b 0a  z[i])!=0; i++){.
dae0: 20 20 20 20 20 20 20 20 69 66 28 20 49 73 53 70          if( IsSp
daf0: 61 63 65 28 63 29 20 29 7b 0a 20 20 20 20 20 20  ace(c) ){.      
db00: 20 20 20 20 69 66 28 20 7a 5b 6a 2d 31 5d 3d 3d      if( z[j-1]==
db10: 27 5c 72 27 20 29 20 7a 5b 6a 2d 31 5d 20 3d 20  '\r' ) z[j-1] = 
db20: 27 5c 6e 27 3b 0a 20 20 20 20 20 20 20 20 20 20  '\n';.          
db30: 69 66 28 20 49 73 53 70 61 63 65 28 7a 5b 6a 2d  if( IsSpace(z[j-
db40: 31 5d 29 20 7c 7c 20 7a 5b 6a 2d 31 5d 3d 3d 27  1]) || z[j-1]=='
db50: 28 27 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  (' ) continue;. 
db60: 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
db70: 20 28 63 3d 3d 27 28 27 20 7c 7c 20 63 3d 3d 27   (c=='(' || c=='
db80: 29 27 29 20 26 26 20 6a 3e 30 20 26 26 20 49 73  )') && j>0 && Is
db90: 53 70 61 63 65 28 7a 5b 6a 2d 31 5d 29 20 29 7b  Space(z[j-1]) ){
dba0: 0a 20 20 20 20 20 20 20 20 20 20 6a 2d 2d 3b 0a  .          j--;.
dbb0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
dbc0: 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 63 3b 0a 20 20    z[j++] = c;.  
dbd0: 20 20 20 20 7d 0a 20 20 20 20 20 20 77 68 69 6c      }.      whil
dbe0: 65 28 20 6a 3e 30 20 26 26 20 49 73 53 70 61 63  e( j>0 && IsSpac
dbf0: 65 28 7a 5b 6a 2d 31 5d 29 20 29 7b 20 6a 2d 2d  e(z[j-1]) ){ j--
dc00: 3b 20 7d 0a 20 20 20 20 20 20 7a 5b 6a 5d 20 3d  ; }.      z[j] =
dc10: 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 73 74   0;.      if( st
dc20: 72 6c 65 6e 33 30 28 7a 29 3e 3d 37 39 20 29 7b  rlen30(z)>=79 ){
dc30: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 6a  .        for(i=j
dc40: 3d 30 3b 20 28 63 20 3d 20 7a 5b 69 5d 29 21 3d  =0; (c = z[i])!=
dc50: 30 3b 20 69 2b 2b 29 7b 20 20 2f 2a 20 43 6f 70  0; i++){  /* Cop
dc60: 79 20 63 68 61 6e 67 65 73 20 66 72 6f 6d 20 7a  y changes from z
dc70: 5b 69 5d 20 62 61 63 6b 20 74 6f 20 7a 5b 6a 5d  [i] back to z[j]
dc80: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66   */.          if
dc90: 28 20 63 3d 3d 63 45 6e 64 20 29 7b 0a 20 20 20  ( c==cEnd ){.   
dca0: 20 20 20 20 20 20 20 20 20 63 45 6e 64 20 3d 20           cEnd = 
dcb0: 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  0;.          }el
dcc0: 73 65 20 69 66 28 20 63 3d 3d 27 22 27 20 7c 7c  se if( c=='"' ||
dcd0: 20 63 3d 3d 27 5c 27 27 20 7c 7c 20 63 3d 3d 27   c=='\'' || c=='
dce0: 60 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  `' ){.          
dcf0: 20 20 63 45 6e 64 20 3d 20 63 3b 0a 20 20 20 20    cEnd = c;.    
dd00: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
dd10: 63 3d 3d 27 5b 27 20 29 7b 0a 20 20 20 20 20 20  c=='[' ){.      
dd20: 20 20 20 20 20 20 63 45 6e 64 20 3d 20 27 5d 27        cEnd = ']'
dd30: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
dd40: 65 20 69 66 28 20 63 3d 3d 27 2d 27 20 26 26 20  e if( c=='-' && 
dd50: 7a 5b 69 2b 31 5d 3d 3d 27 2d 27 20 29 7b 0a 20  z[i+1]=='-' ){. 
dd60: 20 20 20 20 20 20 20 20 20 20 20 63 45 6e 64 20             cEnd 
dd70: 3d 20 27 5c 6e 27 3b 0a 20 20 20 20 20 20 20 20  = '\n';.        
dd80: 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27    }else if( c=='
dd90: 28 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  (' ){.          
dda0: 20 20 6e 50 61 72 65 6e 2b 2b 3b 0a 20 20 20 20    nParen++;.    
ddb0: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
ddc0: 63 3d 3d 27 29 27 20 29 7b 0a 20 20 20 20 20 20  c==')' ){.      
ddd0: 20 20 20 20 20 20 6e 50 61 72 65 6e 2d 2d 3b 0a        nParen--;.
dde0: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
ddf0: 6e 4c 69 6e 65 3e 30 20 26 26 20 6e 50 61 72 65  nLine>0 && nPare
de00: 6e 3d 3d 30 20 26 26 20 6a 3e 30 20 29 7b 0a 20  n==0 && j>0 ){. 
de10: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 72 69               pri
de20: 6e 74 53 63 68 65 6d 61 4c 69 6e 65 4e 28 70 2d  ntSchemaLineN(p-
de30: 3e 6f 75 74 2c 20 7a 2c 20 6a 2c 20 22 5c 6e 22  >out, z, j, "\n"
de40: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
de50: 20 6a 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20   j = 0;.        
de60: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
de70: 7d 0a 20 20 20 20 20 20 20 20 20 20 7a 5b 6a 2b  }.          z[j+
de80: 2b 5d 20 3d 20 63 3b 0a 20 20 20 20 20 20 20 20  +] = c;.        
de90: 20 20 69 66 28 20 6e 50 61 72 65 6e 3d 3d 31 20    if( nParen==1 
dea0: 26 26 20 63 45 6e 64 3d 3d 30 0a 20 20 20 20 20  && cEnd==0.     
deb0: 20 20 20 20 20 20 26 26 20 28 63 3d 3d 27 28 27        && (c=='('
dec0: 20 7c 7c 20 63 3d 3d 27 5c 6e 27 20 7c 7c 20 28   || c=='\n' || (
ded0: 63 3d 3d 27 2c 27 20 26 26 20 21 77 73 54 6f 45  c==',' && !wsToE
dee0: 6f 6c 28 7a 2b 69 2b 31 29 29 29 0a 20 20 20 20  ol(z+i+1))).    
def0: 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
df00: 20 20 20 20 20 69 66 28 20 63 3d 3d 27 5c 6e 27       if( c=='\n'
df10: 20 29 20 6a 2d 2d 3b 0a 20 20 20 20 20 20 20 20   ) j--;.        
df20: 20 20 20 20 70 72 69 6e 74 53 63 68 65 6d 61 4c      printSchemaL
df30: 69 6e 65 4e 28 70 2d 3e 6f 75 74 2c 20 7a 2c 20  ineN(p->out, z, 
df40: 6a 2c 20 22 5c 6e 20 20 22 29 3b 0a 20 20 20 20  j, "\n  ");.    
df50: 20 20 20 20 20 20 20 20 6a 20 3d 20 30 3b 0a 20          j = 0;. 
df60: 20 20 20 20 20 20 20 20 20 20 20 6e 4c 69 6e 65             nLine
df70: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ++;.            
df80: 77 68 69 6c 65 28 20 49 73 53 70 61 63 65 28 7a  while( IsSpace(z
df90: 5b 69 2b 31 5d 29 20 29 7b 20 69 2b 2b 3b 20 7d  [i+1]) ){ i++; }
dfa0: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
dfb0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7a       }.        z
dfc0: 5b 6a 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  [j] = 0;.      }
dfd0: 0a 20 20 20 20 20 20 70 72 69 6e 74 53 63 68 65  .      printSche
dfe0: 6d 61 4c 69 6e 65 28 70 2d 3e 6f 75 74 2c 20 7a  maLine(p->out, z
dff0: 2c 20 22 3b 5c 6e 22 29 3b 0a 20 20 20 20 20 20  , ";\n");.      
e000: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 29 3b  sqlite3_free(z);
e010: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
e020: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 4d 4f 44    }.    case MOD
e030: 45 5f 4c 69 73 74 3a 20 7b 0a 20 20 20 20 20 20  E_List: {.      
e040: 69 66 28 20 70 2d 3e 63 6e 74 2b 2b 3d 3d 30 20  if( p->cnt++==0 
e050: 26 26 20 70 2d 3e 73 68 6f 77 48 65 61 64 65 72  && p->showHeader
e060: 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28   ){.        for(
e070: 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b  i=0; i<nArg; i++
e080: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 74 66  ){.          utf
e090: 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  8_printf(p->out,
e0a0: 22 25 73 25 73 22 2c 61 7a 43 6f 6c 5b 69 5d 2c  "%s%s",azCol[i],
e0b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
e0c0: 20 20 20 69 3d 3d 6e 41 72 67 2d 31 20 3f 20 70     i==nArg-1 ? p
e0d0: 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 20 3a  ->rowSeparator :
e0e0: 20 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72   p->colSeparator
e0f0: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
e100: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 61     }.      if( a
e110: 7a 41 72 67 3d 3d 30 20 29 20 62 72 65 61 6b 3b  zArg==0 ) break;
e120: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
e130: 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20  i<nArg; i++){.  
e140: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20        char *z = 
e150: 61 7a 41 72 67 5b 69 5d 3b 0a 20 20 20 20 20 20  azArg[i];.      
e160: 20 20 69 66 28 20 7a 3d 3d 30 20 29 20 7a 20 3d    if( z==0 ) z =
e170: 20 70 2d 3e 6e 75 6c 6c 56 61 6c 75 65 3b 0a 20   p->nullValue;. 
e180: 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e         utf8_prin
e190: 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c  tf(p->out, "%s",
e1a0: 20 7a 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   z);.        if(
e1b0: 20 69 3c 6e 41 72 67 2d 31 20 29 7b 0a 20 20 20   i<nArg-1 ){.   
e1c0: 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e         utf8_prin
e1d0: 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c  tf(p->out, "%s",
e1e0: 20 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72   p->colSeparator
e1f0: 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
e200: 7b 0a 20 20 20 20 20 20 20 20 20 20 75 74 66 38  {.          utf8
e210: 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
e220: 22 25 73 22 2c 20 70 2d 3e 72 6f 77 53 65 70 61  "%s", p->rowSepa
e230: 72 61 74 6f 72 29 3b 0a 20 20 20 20 20 20 20 20  rator);.        
e240: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
e250: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
e260: 20 63 61 73 65 20 4d 4f 44 45 5f 48 74 6d 6c 3a   case MODE_Html:
e270: 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e   {.      if( p->
e280: 63 6e 74 2b 2b 3d 3d 30 20 26 26 20 70 2d 3e 73  cnt++==0 && p->s
e290: 68 6f 77 48 65 61 64 65 72 20 29 7b 0a 20 20 20  howHeader ){.   
e2a0: 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
e2b0: 70 2d 3e 6f 75 74 2c 22 3c 54 52 3e 22 29 3b 0a  p->out,"<TR>");.
e2c0: 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
e2d0: 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20   i<nArg; i++){. 
e2e0: 20 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69           raw_pri
e2f0: 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 3c 54 48 3e  ntf(p->out,"<TH>
e300: 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6f 75  ");.          ou
e310: 74 70 75 74 5f 68 74 6d 6c 5f 73 74 72 69 6e 67  tput_html_string
e320: 28 70 2d 3e 6f 75 74 2c 20 61 7a 43 6f 6c 5b 69  (p->out, azCol[i
e330: 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 61  ]);.          ra
e340: 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  w_printf(p->out,
e350: 22 3c 2f 54 48 3e 5c 6e 22 29 3b 0a 20 20 20 20  "</TH>\n");.    
e360: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 61      }.        ra
e370: 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  w_printf(p->out,
e380: 22 3c 2f 54 52 3e 5c 6e 22 29 3b 0a 20 20 20 20  "</TR>\n");.    
e390: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 61 7a    }.      if( az
e3a0: 41 72 67 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  Arg==0 ) break;.
e3b0: 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
e3c0: 28 70 2d 3e 6f 75 74 2c 22 3c 54 52 3e 22 29 3b  (p->out,"<TR>");
e3d0: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
e3e0: 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20  i<nArg; i++){.  
e3f0: 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
e400: 28 70 2d 3e 6f 75 74 2c 22 3c 54 44 3e 22 29 3b  (p->out,"<TD>");
e410: 0a 20 20 20 20 20 20 20 20 6f 75 74 70 75 74 5f  .        output_
e420: 68 74 6d 6c 5f 73 74 72 69 6e 67 28 70 2d 3e 6f  html_string(p->o
e430: 75 74 2c 20 61 7a 41 72 67 5b 69 5d 20 3f 20 61  ut, azArg[i] ? a
e440: 7a 41 72 67 5b 69 5d 20 3a 20 70 2d 3e 6e 75 6c  zArg[i] : p->nul
e450: 6c 56 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 20  lValue);.       
e460: 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f   raw_printf(p->o
e470: 75 74 2c 22 3c 2f 54 44 3e 5c 6e 22 29 3b 0a 20  ut,"</TD>\n");. 
e480: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 61 77       }.      raw
e490: 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22  _printf(p->out,"
e4a0: 3c 2f 54 52 3e 5c 6e 22 29 3b 0a 20 20 20 20 20  </TR>\n");.     
e4b0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
e4c0: 20 20 63 61 73 65 20 4d 4f 44 45 5f 54 63 6c 3a    case MODE_Tcl:
e4d0: 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e   {.      if( p->
e4e0: 63 6e 74 2b 2b 3d 3d 30 20 26 26 20 70 2d 3e 73  cnt++==0 && p->s
e4f0: 68 6f 77 48 65 61 64 65 72 20 29 7b 0a 20 20 20  howHeader ){.   
e500: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
e510: 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nArg; i++){.    
e520: 20 20 20 20 20 20 6f 75 74 70 75 74 5f 63 5f 73        output_c_s
e530: 74 72 69 6e 67 28 70 2d 3e 6f 75 74 2c 61 7a 43  tring(p->out,azC
e540: 6f 6c 5b 69 5d 20 3f 20 61 7a 43 6f 6c 5b 69 5d  ol[i] ? azCol[i]
e550: 20 3a 20 22 22 29 3b 0a 20 20 20 20 20 20 20 20   : "");.        
e560: 20 20 69 66 28 69 3c 6e 41 72 67 2d 31 29 20 75    if(i<nArg-1) u
e570: 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  tf8_printf(p->ou
e580: 74 2c 20 22 25 73 22 2c 20 70 2d 3e 63 6f 6c 53  t, "%s", p->colS
e590: 65 70 61 72 61 74 6f 72 29 3b 0a 20 20 20 20 20  eparator);.     
e5a0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 75 74 66     }.        utf
e5b0: 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  8_printf(p->out,
e5c0: 20 22 25 73 22 2c 20 70 2d 3e 72 6f 77 53 65 70   "%s", p->rowSep
e5d0: 61 72 61 74 6f 72 29 3b 0a 20 20 20 20 20 20 7d  arator);.      }
e5e0: 0a 20 20 20 20 20 20 69 66 28 20 61 7a 41 72 67  .      if( azArg
e5f0: 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
e600: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41     for(i=0; i<nA
e610: 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  rg; i++){.      
e620: 20 20 6f 75 74 70 75 74 5f 63 5f 73 74 72 69 6e    output_c_strin
e630: 67 28 70 2d 3e 6f 75 74 2c 20 61 7a 41 72 67 5b  g(p->out, azArg[
e640: 69 5d 20 3f 20 61 7a 41 72 67 5b 69 5d 20 3a 20  i] ? azArg[i] : 
e650: 70 2d 3e 6e 75 6c 6c 56 61 6c 75 65 29 3b 0a 20  p->nullValue);. 
e660: 20 20 20 20 20 20 20 69 66 28 69 3c 6e 41 72 67         if(i<nArg
e670: 2d 31 29 20 75 74 66 38 5f 70 72 69 6e 74 66 28  -1) utf8_printf(
e680: 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20 70 2d  p->out, "%s", p-
e690: 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 29 3b 0a  >colSeparator);.
e6a0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 75 74        }.      ut
e6b0: 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  f8_printf(p->out
e6c0: 2c 20 22 25 73 22 2c 20 70 2d 3e 72 6f 77 53 65  , "%s", p->rowSe
e6d0: 70 61 72 61 74 6f 72 29 3b 0a 20 20 20 20 20 20  parator);.      
e6e0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
e6f0: 20 63 61 73 65 20 4d 4f 44 45 5f 43 73 76 3a 20   case MODE_Csv: 
e700: 7b 0a 20 20 20 20 20 20 73 65 74 42 69 6e 61 72  {.      setBinar
e710: 79 4d 6f 64 65 28 70 2d 3e 6f 75 74 2c 20 31 29  yMode(p->out, 1)
e720: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 63  ;.      if( p->c
e730: 6e 74 2b 2b 3d 3d 30 20 26 26 20 70 2d 3e 73 68  nt++==0 && p->sh
e740: 6f 77 48 65 61 64 65 72 20 29 7b 0a 20 20 20 20  owHeader ){.    
e750: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
e760: 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Arg; i++){.     
e770: 20 20 20 20 20 6f 75 74 70 75 74 5f 63 73 76 28       output_csv(
e780: 70 2c 20 61 7a 43 6f 6c 5b 69 5d 20 3f 20 61 7a  p, azCol[i] ? az
e790: 43 6f 6c 5b 69 5d 20 3a 20 22 22 2c 20 69 3c 6e  Col[i] : "", i<n
e7a0: 41 72 67 2d 31 29 3b 0a 20 20 20 20 20 20 20 20  Arg-1);.        
e7b0: 7d 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70  }.        utf8_p
e7c0: 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25  rintf(p->out, "%
e7d0: 73 22 2c 20 70 2d 3e 72 6f 77 53 65 70 61 72 61  s", p->rowSepara
e7e0: 74 6f 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  tor);.      }.  
e7f0: 20 20 20 20 69 66 28 20 6e 41 72 67 3e 30 20 29      if( nArg>0 )
e800: 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  {.        for(i=
e810: 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b  0; i<nArg; i++){
e820: 0a 20 20 20 20 20 20 20 20 20 20 6f 75 74 70 75  .          outpu
e830: 74 5f 63 73 76 28 70 2c 20 61 7a 41 72 67 5b 69  t_csv(p, azArg[i
e840: 5d 2c 20 69 3c 6e 41 72 67 2d 31 29 3b 0a 20 20  ], i<nArg-1);.  
e850: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
e860: 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f  utf8_printf(p->o
e870: 75 74 2c 20 22 25 73 22 2c 20 70 2d 3e 72 6f 77  ut, "%s", p->row
e880: 53 65 70 61 72 61 74 6f 72 29 3b 0a 20 20 20 20  Separator);.    
e890: 20 20 7d 0a 20 20 20 20 20 20 73 65 74 54 65 78    }.      setTex
e8a0: 74 4d 6f 64 65 28 70 2d 3e 6f 75 74 2c 20 31 29  tMode(p->out, 1)
e8b0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
e8c0: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 4d 4f     }.    case MO
e8d0: 44 45 5f 49 6e 73 65 72 74 3a 20 7b 0a 20 20 20  DE_Insert: {.   
e8e0: 20 20 20 69 66 28 20 61 7a 41 72 67 3d 3d 30 20     if( azArg==0 
e8f0: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 75  ) break;.      u
e900: 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  tf8_printf(p->ou
e910: 74 2c 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 25  t,"INSERT INTO %
e920: 73 22 2c 70 2d 3e 7a 44 65 73 74 54 61 62 6c 65  s",p->zDestTable
e930: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  );.      if( p->
e940: 73 68 6f 77 48 65 61 64 65 72 20 29 7b 0a 20 20  showHeader ){.  
e950: 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
e960: 28 70 2d 3e 6f 75 74 2c 22 28 22 29 3b 0a 20 20  (p->out,"(");.  
e970: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
e980: 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nArg; i++){.   
e990: 20 20 20 20 20 20 20 69 66 28 20 69 3e 30 20 29         if( i>0 )
e9a0: 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f   raw_printf(p->o
e9b0: 75 74 2c 20 22 2c 22 29 3b 0a 20 20 20 20 20 20  ut, ",");.      
e9c0: 20 20 20 20 69 66 28 20 71 75 6f 74 65 43 68 61      if( quoteCha
e9d0: 72 28 61 7a 43 6f 6c 5b 69 5d 29 20 29 7b 0a 20  r(azCol[i]) ){. 
e9e0: 20 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20             char 
e9f0: 2a 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  *z = sqlite3_mpr
ea00: 69 6e 74 66 28 22 5c 22 25 77 5c 22 22 2c 20 61  intf("\"%w\"", a
ea10: 7a 43 6f 6c 5b 69 5d 29 3b 0a 20 20 20 20 20 20  zCol[i]);.      
ea20: 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
ea30: 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20  f(p->out, "%s", 
ea40: 7a 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  z);.            
ea50: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 29 3b  sqlite3_free(z);
ea60: 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
ea70: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 61  {.            ra
ea80: 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  w_printf(p->out,
ea90: 20 22 25 73 22 2c 20 61 7a 43 6f 6c 5b 69 5d 29   "%s", azCol[i])
eaa0: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
eab0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
eac0: 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  raw_printf(p->ou
ead0: 74 2c 22 29 22 29 3b 0a 20 20 20 20 20 20 7d 0a  t,")");.      }.
eae0: 20 20 20 20 20 20 70 2d 3e 63 6e 74 2b 2b 3b 0a        p->cnt++;.
eaf0: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
eb00: 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nArg; i++){.   
eb10: 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
eb20: 70 2d 3e 6f 75 74 2c 20 69 3e 30 20 3f 20 22 2c  p->out, i>0 ? ",
eb30: 22 20 3a 20 22 20 56 41 4c 55 45 53 28 22 29 3b  " : " VALUES(");
eb40: 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 61 7a  .        if( (az
eb50: 41 72 67 5b 69 5d 3d 3d 30 29 20 7c 7c 20 28 61  Arg[i]==0) || (a
eb60: 69 54 79 70 65 20 26 26 20 61 69 54 79 70 65 5b  iType && aiType[
eb70: 69 5d 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 29  i]==SQLITE_NULL)
eb80: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 74   ){.          ut
eb90: 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  f8_printf(p->out
eba0: 2c 22 4e 55 4c 4c 22 29 3b 0a 20 20 20 20 20 20  ,"NULL");.      
ebb0: 20 20 7d 65 6c 73 65 20 69 66 28 20 61 69 54 79    }else if( aiTy
ebc0: 70 65 20 26 26 20 61 69 54 79 70 65 5b 69 5d 3d  pe && aiType[i]=
ebd0: 3d 53 51 4c 49 54 45 5f 54 45 58 54 20 29 7b 0a  =SQLITE_TEXT ){.
ebe0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 53 68            if( Sh
ebf0: 65 6c 6c 48 61 73 46 6c 61 67 28 70 2c 20 53 48  ellHasFlag(p, SH
ec00: 46 4c 47 5f 4e 65 77 6c 69 6e 65 73 29 20 29 7b  FLG_Newlines) ){
ec10: 0a 20 20 20 20 20 20 20 20 20 20 20 20 6f 75 74  .            out
ec20: 70 75 74 5f 71 75 6f 74 65 64 5f 73 74 72 69 6e  put_quoted_strin
ec30: 67 28 70 2d 3e 6f 75 74 2c 20 61 7a 41 72 67 5b  g(p->out, azArg[
ec40: 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  i]);.          }
ec50: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
ec60: 20 20 6f 75 74 70 75 74 5f 71 75 6f 74 65 64 5f    output_quoted_
ec70: 65 73 63 61 70 65 64 5f 73 74 72 69 6e 67 28 70  escaped_string(p
ec80: 2d 3e 6f 75 74 2c 20 61 7a 41 72 67 5b 69 5d 29  ->out, azArg[i])
ec90: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
eca0: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
ecb0: 61 69 54 79 70 65 20 26 26 20 61 69 54 79 70 65  aiType && aiType
ecc0: 5b 69 5d 3d 3d 53 51 4c 49 54 45 5f 49 4e 54 45  [i]==SQLITE_INTE
ecd0: 47 45 52 20 29 7b 0a 20 20 20 20 20 20 20 20 20  GER ){.         
ece0: 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e   utf8_printf(p->
ecf0: 6f 75 74 2c 22 25 73 22 2c 20 61 7a 41 72 67 5b  out,"%s", azArg[
ed00: 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  i]);.        }el
ed10: 73 65 20 69 66 28 20 61 69 54 79 70 65 20 26 26  se if( aiType &&
ed20: 20 61 69 54 79 70 65 5b 69 5d 3d 3d 53 51 4c 49   aiType[i]==SQLI
ed30: 54 45 5f 46 4c 4f 41 54 20 29 7b 0a 20 20 20 20  TE_FLOAT ){.    
ed40: 20 20 20 20 20 20 63 68 61 72 20 7a 5b 35 30 5d        char z[50]
ed50: 3b 0a 20 20 20 20 20 20 20 20 20 20 64 6f 75 62  ;.          doub
ed60: 6c 65 20 72 20 3d 20 73 71 6c 69 74 65 33 5f 63  le r = sqlite3_c
ed70: 6f 6c 75 6d 6e 5f 64 6f 75 62 6c 65 28 70 2d 3e  olumn_double(p->
ed80: 70 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20 20 20  pStmt, i);.     
ed90: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 75 69 6e       sqlite3_uin
eda0: 74 36 34 20 75 72 3b 0a 20 20 20 20 20 20 20 20  t64 ur;.        
edb0: 20 20 6d 65 6d 63 70 79 28 26 75 72 2c 26 72 2c    memcpy(&ur,&r,
edc0: 73 69 7a 65 6f 66 28 72 29 29 3b 0a 20 20 20 20  sizeof(r));.    
edd0: 20 20 20 20 20 20 69 66 28 20 75 72 3d 3d 30 78        if( ur==0x
ede0: 37 66 66 30 30 30 30 30 30 30 30 30 30 30 30 30  7ff0000000000000
edf0: 4c 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  LL ){.          
ee00: 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e    raw_printf(p->
ee10: 6f 75 74 2c 20 22 31 65 39 39 39 22 29 3b 0a 20  out, "1e999");. 
ee20: 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69           }else i
ee30: 66 28 20 75 72 3d 3d 30 78 66 66 66 30 30 30 30  f( ur==0xfff0000
ee40: 30 30 30 30 30 30 30 30 30 4c 4c 20 29 7b 0a 20  000000000LL ){. 
ee50: 20 20 20 20 20 20 20 20 20 20 20 72 61 77 5f 70             raw_p
ee60: 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 2d  rintf(p->out, "-
ee70: 31 65 39 39 39 22 29 3b 0a 20 20 20 20 20 20 20  1e999");.       
ee80: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
ee90: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
eea0: 70 72 69 6e 74 66 28 35 30 2c 7a 2c 22 25 21 2e  printf(50,z,"%!.
eeb0: 32 30 67 22 2c 20 72 29 3b 0a 20 20 20 20 20 20  20g", r);.      
eec0: 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
eed0: 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20 7a  (p->out, "%s", z
eee0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
eef0: 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
ef00: 20 61 69 54 79 70 65 20 26 26 20 61 69 54 79 70   aiType && aiTyp
ef10: 65 5b 69 5d 3d 3d 53 51 4c 49 54 45 5f 42 4c 4f  e[i]==SQLITE_BLO
ef20: 42 20 26 26 20 70 2d 3e 70 53 74 6d 74 20 29 7b  B && p->pStmt ){
ef30: 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74  .          const
ef40: 20 76 6f 69 64 20 2a 70 42 6c 6f 62 20 3d 20 73   void *pBlob = s
ef50: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c  qlite3_column_bl
ef60: 6f 62 28 70 2d 3e 70 53 74 6d 74 2c 20 69 29 3b  ob(p->pStmt, i);
ef70: 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e  .          int n
ef80: 42 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33 5f 63  Blob = sqlite3_c
ef90: 6f 6c 75 6d 6e 5f 62 79 74 65 73 28 70 2d 3e 70  olumn_bytes(p->p
efa0: 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20 20 20 20  Stmt, i);.      
efb0: 20 20 20 20 6f 75 74 70 75 74 5f 68 65 78 5f 62      output_hex_b
efc0: 6c 6f 62 28 70 2d 3e 6f 75 74 2c 20 70 42 6c 6f  lob(p->out, pBlo
efd0: 62 2c 20 6e 42 6c 6f 62 29 3b 0a 20 20 20 20 20  b, nBlob);.     
efe0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69 73 4e     }else if( isN
eff0: 75 6d 62 65 72 28 61 7a 41 72 67 5b 69 5d 2c 20  umber(azArg[i], 
f000: 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  0) ){.          
f010: 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f  utf8_printf(p->o
f020: 75 74 2c 22 25 73 22 2c 20 61 7a 41 72 67 5b 69  ut,"%s", azArg[i
f030: 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ]);.        }els
f040: 65 20 69 66 28 20 53 68 65 6c 6c 48 61 73 46 6c  e if( ShellHasFl
f050: 61 67 28 70 2c 20 53 48 46 4c 47 5f 4e 65 77 6c  ag(p, SHFLG_Newl
f060: 69 6e 65 73 29 20 29 7b 0a 20 20 20 20 20 20 20  ines) ){.       
f070: 20 20 20 6f 75 74 70 75 74 5f 71 75 6f 74 65 64     output_quoted
f080: 5f 73 74 72 69 6e 67 28 70 2d 3e 6f 75 74 2c 20  _string(p->out, 
f090: 61 7a 41 72 67 5b 69 5d 29 3b 0a 20 20 20 20 20  azArg[i]);.     
f0a0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
f0b0: 20 20 20 20 6f 75 74 70 75 74 5f 71 75 6f 74 65      output_quote
f0c0: 64 5f 65 73 63 61 70 65 64 5f 73 74 72 69 6e 67  d_escaped_string
f0d0: 28 70 2d 3e 6f 75 74 2c 20 61 7a 41 72 67 5b 69  (p->out, azArg[i
f0e0: 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ]);.        }.  
f0f0: 20 20 20 20 7d 0a 20 20 20 20 20 20 72 61 77 5f      }.      raw_
f100: 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 29  printf(p->out,")
f110: 3b 5c 6e 22 29 3b 0a 20 20 20 20 20 20 62 72 65  ;\n");.      bre
f120: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
f130: 73 65 20 4d 4f 44 45 5f 51 75 6f 74 65 3a 20 7b  se MODE_Quote: {
f140: 0a 20 20 20 20 20 20 69 66 28 20 61 7a 41 72 67  .      if( azArg
f150: 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
f160: 20 20 20 69 66 28 20 70 2d 3e 63 6e 74 3d 3d 30     if( p->cnt==0
f170: 20 26 26 20 70 2d 3e 73 68 6f 77 48 65 61 64 65   && p->showHeade
f180: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6f 72  r ){.        for
f190: 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b  (i=0; i<nArg; i+
f1a0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66  +){.          if
f1b0: 28 20 69 3e 30 20 29 20 72 61 77 5f 70 72 69 6e  ( i>0 ) raw_prin
f1c0: 74 66 28 70 2d 3e 6f 75 74 2c 20 22 2c 22 29 3b  tf(p->out, ",");
f1d0: 0a 20 20 20 20 20 20 20 20 20 20 6f 75 74 70 75  .          outpu
f1e0: 74 5f 71 75 6f 74 65 64 5f 73 74 72 69 6e 67 28  t_quoted_string(
f1f0: 70 2d 3e 6f 75 74 2c 20 61 7a 43 6f 6c 5b 69 5d  p->out, azCol[i]
f200: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
f210: 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
f220: 70 2d 3e 6f 75 74 2c 22 5c 6e 22 29 3b 0a 20 20  p->out,"\n");.  
f230: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e 63      }.      p->c
f240: 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 66 6f 72 28  nt++;.      for(
f250: 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b  i=0; i<nArg; i++
f260: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  ){.        if( i
f270: 3e 30 20 29 20 72 61 77 5f 70 72 69 6e 74 66 28  >0 ) raw_printf(
f280: 70 2d 3e 6f 75 74 2c 20 22 2c 22 29 3b 0a 20 20  p->out, ",");.  
f290: 20 20 20 20 20 20 69 66 28 20 28 61 7a 41 72 67        if( (azArg
f2a0: 5b 69 5d 3d 3d 30 29 20 7c 7c 20 28 61 69 54 79  [i]==0) || (aiTy
f2b0: 70 65 20 26 26 20 61 69 54 79 70 65 5b 69 5d 3d  pe && aiType[i]=
f2c0: 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 29 20 29 7b  =SQLITE_NULL) ){
f2d0: 0a 20 20 20 20 20 20 20 20 20 20 75 74 66 38 5f  .          utf8_
f2e0: 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 4e  printf(p->out,"N
f2f0: 55 4c 4c 22 29 3b 0a 20 20 20 20 20 20 20 20 7d  ULL");.        }
f300: 65 6c 73 65 20 69 66 28 20 61 69 54 79 70 65 20  else if( aiType 
f310: 26 26 20 61 69 54 79 70 65 5b 69 5d 3d 3d 53 51  && aiType[i]==SQ
f320: 4c 49 54 45 5f 54 45 58 54 20 29 7b 0a 20 20 20  LITE_TEXT ){.   
f330: 20 20 20 20 20 20 20 6f 75 74 70 75 74 5f 71 75         output_qu
f340: 6f 74 65 64 5f 73 74 72 69 6e 67 28 70 2d 3e 6f  oted_string(p->o
f350: 75 74 2c 20 61 7a 41 72 67 5b 69 5d 29 3b 0a 20  ut, azArg[i]);. 
f360: 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
f370: 20 61 69 54 79 70 65 20 26 26 20 61 69 54 79 70   aiType && aiTyp
f380: 65 5b 69 5d 3d 3d 53 51 4c 49 54 45 5f 49 4e 54  e[i]==SQLITE_INT
f390: 45 47 45 52 20 29 7b 0a 20 20 20 20 20 20 20 20  EGER ){.        
f3a0: 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d    utf8_printf(p-
f3b0: 3e 6f 75 74 2c 22 25 73 22 2c 20 61 7a 41 72 67  >out,"%s", azArg
f3c0: 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  [i]);.        }e
f3d0: 6c 73 65 20 69 66 28 20 61 69 54 79 70 65 20 26  lse if( aiType &
f3e0: 26 20 61 69 54 79 70 65 5b 69 5d 3d 3d 53 51 4c  & aiType[i]==SQL
f3f0: 49 54 45 5f 46 4c 4f 41 54 20 29 7b 0a 20 20 20  ITE_FLOAT ){.   
f400: 20 20 20 20 20 20 20 63 68 61 72 20 7a 5b 35 30         char z[50
f410: 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 64 6f 75  ];.          dou
f420: 62 6c 65 20 72 20 3d 20 73 71 6c 69 74 65 33 5f  ble r = sqlite3_
f430: 63 6f 6c 75 6d 6e 5f 64 6f 75 62 6c 65 28 70 2d  column_double(p-
f440: 3e 70 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20 20  >pStmt, i);.    
f450: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
f460: 70 72 69 6e 74 66 28 35 30 2c 7a 2c 22 25 21 2e  printf(50,z,"%!.
f470: 32 30 67 22 2c 20 72 29 3b 0a 20 20 20 20 20 20  20g", r);.      
f480: 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70      raw_printf(p
f490: 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20 7a 29 3b  ->out, "%s", z);
f4a0: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
f4b0: 66 28 20 61 69 54 79 70 65 20 26 26 20 61 69 54  f( aiType && aiT
f4c0: 79 70 65 5b 69 5d 3d 3d 53 51 4c 49 54 45 5f 42  ype[i]==SQLITE_B
f4d0: 4c 4f 42 20 26 26 20 70 2d 3e 70 53 74 6d 74 20  LOB && p->pStmt 
f4e0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e  ){.          con
f4f0: 73 74 20 76 6f 69 64 20 2a 70 42 6c 6f 62 20 3d  st void *pBlob =
f500: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
f510: 62 6c 6f 62 28 70 2d 3e 70 53 74 6d 74 2c 20 69  blob(p->pStmt, i
f520: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  );.          int
f530: 20 6e 42 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33   nBlob = sqlite3
f540: 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 28 70 2d  _column_bytes(p-
f550: 3e 70 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20 20  >pStmt, i);.    
f560: 20 20 20 20 20 20 6f 75 74 70 75 74 5f 68 65 78        output_hex
f570: 5f 62 6c 6f 62 28 70 2d 3e 6f 75 74 2c 20 70 42  _blob(p->out, pB
f580: 6c 6f 62 2c 20 6e 42 6c 6f 62 29 3b 0a 20 20 20  lob, nBlob);.   
f590: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69       }else if( i
f5a0: 73 4e 75 6d 62 65 72 28 61 7a 41 72 67 5b 69 5d  sNumber(azArg[i]
f5b0: 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20  , 0) ){.        
f5c0: 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d    utf8_printf(p-
f5d0: 3e 6f 75 74 2c 22 25 73 22 2c 20 61 7a 41 72 67  >out,"%s", azArg
f5e0: 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  [i]);.        }e
f5f0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 6f  lse{.          o
f600: 75 74 70 75 74 5f 71 75 6f 74 65 64 5f 73 74 72  utput_quoted_str
f610: 69 6e 67 28 70 2d 3e 6f 75 74 2c 20 61 7a 41 72  ing(p->out, azAr
f620: 67 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d  g[i]);.        }
f630: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
f640: 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  aw_printf(p->out
f650: 2c 22 5c 6e 22 29 3b 0a 20 20 20 20 20 20 62 72  ,"\n");.      br
f660: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
f670: 61 73 65 20 4d 4f 44 45 5f 41 73 63 69 69 3a 20  ase MODE_Ascii: 
f680: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 63  {.      if( p->c
f690: 6e 74 2b 2b 3d 3d 30 20 26 26 20 70 2d 3e 73 68  nt++==0 && p->sh
f6a0: 6f 77 48 65 61 64 65 72 20 29 7b 0a 20 20 20 20  owHeader ){.    
f6b0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
f6c0: 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Arg; i++){.     
f6d0: 20 20 20 20 20 69 66 28 20 69 3e 30 20 29 20 75       if( i>0 ) u
f6e0: 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  tf8_printf(p->ou
f6f0: 74 2c 20 22 25 73 22 2c 20 70 2d 3e 63 6f 6c 53  t, "%s", p->colS
f700: 65 70 61 72 61 74 6f 72 29 3b 0a 20 20 20 20 20  eparator);.     
f710: 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
f720: 28 70 2d 3e 6f 75 74 2c 22 25 73 22 2c 61 7a 43  (p->out,"%s",azC
f730: 6f 6c 5b 69 5d 20 3f 20 61 7a 43 6f 6c 5b 69 5d  ol[i] ? azCol[i]
f740: 20 3a 20 22 22 29 3b 0a 20 20 20 20 20 20 20 20   : "");.        
f750: 7d 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70  }.        utf8_p
f760: 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25  rintf(p->out, "%
f770: 73 22 2c 20 70 2d 3e 72 6f 77 53 65 70 61 72 61  s", p->rowSepara
f780: 74 6f 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  tor);.      }.  
f790: 20 20 20 20 69 66 28 20 61 7a 41 72 67 3d 3d 30      if( azArg==0
f7a0: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
f7b0: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b  for(i=0; i<nArg;
f7c0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   i++){.        i
f7d0: 66 28 20 69 3e 30 20 29 20 75 74 66 38 5f 70 72  f( i>0 ) utf8_pr
f7e0: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73  intf(p->out, "%s
f7f0: 22 2c 20 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74  ", p->colSeparat
f800: 6f 72 29 3b 0a 20 20 20 20 20 20 20 20 75 74 66  or);.        utf
f810: 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  8_printf(p->out,
f820: 22 25 73 22 2c 61 7a 41 72 67 5b 69 5d 20 3f 20  "%s",azArg[i] ? 
f830: 61 7a 41 72 67 5b 69 5d 20 3a 20 70 2d 3e 6e 75  azArg[i] : p->nu
f840: 6c 6c 56 61 6c 75 65 29 3b 0a 20 20 20 20 20 20  llValue);.      
f850: 7d 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69  }.      utf8_pri
f860: 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22  ntf(p->out, "%s"
f870: 2c 20 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f  , p->rowSeparato
f880: 72 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  r);.      break;
f890: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
f8a0: 4d 4f 44 45 5f 45 51 50 3a 20 7b 0a 20 20 20 20  MODE_EQP: {.    
f8b0: 20 20 65 71 70 5f 61 70 70 65 6e 64 28 70 2c 20    eqp_append(p, 
f8c0: 61 74 6f 69 28 61 7a 41 72 67 5b 30 5d 29 2c 20  atoi(azArg[0]), 
f8d0: 61 74 6f 69 28 61 7a 41 72 67 5b 31 5d 29 2c 20  atoi(azArg[1]), 
f8e0: 61 7a 41 72 67 5b 33 5d 29 3b 0a 20 20 20 20 20  azArg[3]);.     
f8f0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
f900: 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
f910: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 74  ./*.** This is t
f920: 68 65 20 63 61 6c 6c 62 61 63 6b 20 72 6f 75 74  he callback rout
f930: 69 6e 65 20 74 68 61 74 20 74 68 65 20 53 51 4c  ine that the SQL
f940: 69 74 65 20 6c 69 62 72 61 72 79 0a 2a 2a 20 69  ite library.** i
f950: 6e 76 6f 6b 65 73 20 66 6f 72 20 65 61 63 68 20  nvokes for each 
f960: 72 6f 77 20 6f 66 20 61 20 71 75 65 72 79 20 72  row of a query r
f970: 65 73 75 6c 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  esult..*/.static
f980: 20 69 6e 74 20 63 61 6c 6c 62 61 63 6b 28 76 6f   int callback(vo
f990: 69 64 20 2a 70 41 72 67 2c 20 69 6e 74 20 6e 41  id *pArg, int nA
f9a0: 72 67 2c 20 63 68 61 72 20 2a 2a 61 7a 41 72 67  rg, char **azArg
f9b0: 2c 20 63 68 61 72 20 2a 2a 61 7a 43 6f 6c 29 7b  , char **azCol){
f9c0: 0a 20 20 2f 2a 20 73 69 6e 63 65 20 77 65 20 64  .  /* since we d
f9d0: 6f 6e 27 74 20 68 61 76 65 20 74 79 70 65 20 69  on't have type i
f9e0: 6e 66 6f 2c 20 63 61 6c 6c 20 74 68 65 20 73 68  nfo, call the sh
f9f0: 65 6c 6c 5f 63 61 6c 6c 62 61 63 6b 20 77 69 74  ell_callback wit
fa00: 68 20 61 20 4e 55 4c 4c 20 76 61 6c 75 65 20 2a  h a NULL value *
fa10: 2f 0a 20 20 72 65 74 75 72 6e 20 73 68 65 6c 6c  /.  return shell
fa20: 5f 63 61 6c 6c 62 61 63 6b 28 70 41 72 67 2c 20  _callback(pArg, 
fa30: 6e 41 72 67 2c 20 61 7a 41 72 67 2c 20 61 7a 43  nArg, azArg, azC
fa40: 6f 6c 2c 20 4e 55 4c 4c 29 3b 0a 7d 0a 0a 2f 2a  ol, NULL);.}../*
fa50: 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65 20  .** This is the 
fa60: 63 61 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65  callback routine
fa70: 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 65 78   from sqlite3_ex
fa80: 65 63 28 29 20 74 68 61 74 20 61 70 70 65 6e 64  ec() that append
fa90: 73 20 61 6c 6c 0a 2a 2a 20 6f 75 74 70 75 74 20  s all.** output 
faa0: 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  onto the end of 
fab0: 61 20 53 68 65 6c 6c 54 65 78 74 20 6f 62 6a 65  a ShellText obje
fac0: 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ct..*/.static in
fad0: 74 20 63 61 70 74 75 72 65 4f 75 74 70 75 74 43  t captureOutputC
fae0: 61 6c 6c 62 61 63 6b 28 76 6f 69 64 20 2a 70 41  allback(void *pA
faf0: 72 67 2c 20 69 6e 74 20 6e 41 72 67 2c 20 63 68  rg, int nArg, ch
fb00: 61 72 20 2a 2a 61 7a 41 72 67 2c 20 63 68 61 72  ar **azArg, char
fb10: 20 2a 2a 61 7a 29 7b 0a 20 20 53 68 65 6c 6c 54   **az){.  ShellT
fb20: 65 78 74 20 2a 70 20 3d 20 28 53 68 65 6c 6c 54  ext *p = (ShellT
fb30: 65 78 74 2a 29 70 41 72 67 3b 0a 20 20 69 6e 74  ext*)pArg;.  int
fb40: 20 69 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52   i;.  UNUSED_PAR
fb50: 41 4d 45 54 45 52 28 61 7a 29 3b 0a 20 20 69 66  AMETER(az);.  if
fb60: 28 20 61 7a 41 72 67 3d 3d 30 20 29 20 72 65 74  ( azArg==0 ) ret
fb70: 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e  urn 0;.  if( p->
fb80: 6e 20 29 20 61 70 70 65 6e 64 54 65 78 74 28 70  n ) appendText(p
fb90: 2c 20 22 7c 22 2c 20 30 29 3b 0a 20 20 66 6f 72  , "|", 0);.  for
fba0: 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b  (i=0; i<nArg; i+
fbb0: 2b 29 7b 0a 20 20 20 20 69 66 28 20 69 20 29 20  +){.    if( i ) 
fbc0: 61 70 70 65 6e 64 54 65 78 74 28 70 2c 20 22 2c  appendText(p, ",
fbd0: 22 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 61  ", 0);.    if( a
fbe0: 7a 41 72 67 5b 69 5d 20 29 20 61 70 70 65 6e 64  zArg[i] ) append
fbf0: 54 65 78 74 28 70 2c 20 61 7a 41 72 67 5b 69 5d  Text(p, azArg[i]
fc00: 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  , 0);.  }.  retu
fc10: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  rn 0;.}../*.** G
fc20: 65 6e 65 72 61 74 65 20 61 6e 20 61 70 70 72 6f  enerate an appro
fc30: 70 72 69 61 74 65 20 53 45 4c 46 54 45 53 54 20  priate SELFTEST 
fc40: 74 61 62 6c 65 20 69 6e 20 74 68 65 20 6d 61 69  table in the mai
fc50: 6e 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 73  n database..*/.s
fc60: 74 61 74 69 63 20 76 6f 69 64 20 63 72 65 61 74  tatic void creat
fc70: 65 53 65 6c 66 74 65 73 74 54 61 62 6c 65 28 53  eSelftestTable(S
fc80: 68 65 6c 6c 53 74 61 74 65 20 2a 70 29 7b 0a 20  hellState *p){. 
fc90: 20 63 68 61 72 20 2a 7a 45 72 72 4d 73 67 20 3d   char *zErrMsg =
fca0: 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 65 78   0;.  sqlite3_ex
fcb0: 65 63 28 70 2d 3e 64 62 2c 0a 20 20 20 20 22 53  ec(p->db,.    "S
fcc0: 41 56 45 50 4f 49 4e 54 20 73 65 6c 66 74 65 73  AVEPOINT selftes
fcd0: 74 5f 69 6e 69 74 3b 5c 6e 22 0a 20 20 20 20 22  t_init;\n".    "
fce0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 49 46 20  CREATE TABLE IF 
fcf0: 4e 4f 54 20 45 58 49 53 54 53 20 73 65 6c 66 74  NOT EXISTS selft
fd00: 65 73 74 28 5c 6e 22 0a 20 20 20 20 22 20 20 74  est(\n".    "  t
fd10: 6e 6f 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41  no INTEGER PRIMA
fd20: 52 59 20 4b 45 59 2c 5c 6e 22 20 20 20 2f 2a 20  RY KEY,\n"   /* 
fd30: 54 65 73 74 20 6e 75 6d 62 65 72 20 2a 2f 0a 20  Test number */. 
fd40: 20 20 20 22 20 20 6f 70 20 54 45 58 54 2c 5c 6e     "  op TEXT,\n
fd50: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
fd60: 20 20 20 20 2f 2a 20 4f 70 65 72 61 74 6f 72 3a      /* Operator:
fd70: 20 20 6d 65 6d 6f 20 72 75 6e 20 2a 2f 0a 20 20    memo run */.  
fd80: 20 20 22 20 20 63 6d 64 20 54 45 58 54 2c 5c 6e    "  cmd TEXT,\n
fd90: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
fda0: 20 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 74 65     /* Command te
fdb0: 78 74 20 2a 2f 0a 20 20 20 20 22 20 20 61 6e 73  xt */.    "  ans
fdc0: 20 54 45 58 54 5c 6e 22 20 20 20 20 20 20 20 20   TEXT\n"        
fdd0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65             /* De
fde0: 73 69 72 65 64 20 61 6e 73 77 65 72 20 2a 2f 0a  sired answer */.
fdf0: 20 20 20 20 22 29 3b 22 0a 20 20 20 20 22 43 52      ");".    "CR
fe00: 45 41 54 45 20 54 45 4d 50 20 54 41 42 4c 45 20  EATE TEMP TABLE 
fe10: 5b 5f 73 68 65 6c 6c 24 73 65 6c 66 5d 28 6f 70  [_shell$self](op
fe20: 2c 63 6d 64 2c 61 6e 73 29 3b 5c 6e 22 0a 20 20  ,cmd,ans);\n".  
fe30: 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 5b    "INSERT INTO [
fe40: 5f 73 68 65 6c 6c 24 73 65 6c 66 5d 28 72 6f 77  _shell$self](row
fe50: 69 64 2c 6f 70 2c 63 6d 64 29 5c 6e 22 0a 20 20  id,op,cmd)\n".  
fe60: 20 20 22 20 20 56 41 4c 55 45 53 28 63 6f 61 6c    "  VALUES(coal
fe70: 65 73 63 65 28 28 53 45 4c 45 43 54 20 28 6d 61  esce((SELECT (ma
fe80: 78 28 74 6e 6f 29 2b 31 30 30 29 2f 31 30 20 46  x(tno)+100)/10 F
fe90: 52 4f 4d 20 73 65 6c 66 74 65 73 74 29 2c 31 30  ROM selftest),10
fea0: 29 2c 5c 6e 22 0a 20 20 20 20 22 20 20 20 20 20  ),\n".    "     
feb0: 20 20 20 20 27 6d 65 6d 6f 27 2c 27 54 65 73 74      'memo','Test
fec0: 73 20 67 65 6e 65 72 61 74 65 64 20 62 79 20 2d  s generated by -
fed0: 2d 69 6e 69 74 27 29 3b 5c 6e 22 0a 20 20 20 20  -init');\n".    
fee0: 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 5b 5f 73  "INSERT INTO [_s
fef0: 68 65 6c 6c 24 73 65 6c 66 5d 5c 6e 22 0a 20 20  hell$self]\n".  
ff00: 20 20 22 20 20 53 45 4c 45 43 54 20 27 72 75 6e    "  SELECT 'run
ff10: 27 2c 5c 6e 22 0a 20 20 20 20 22 20 20 20 20 27  ',\n".    "    '
ff20: 53 45 4c 45 43 54 20 68 65 78 28 73 68 61 33 5f  SELECT hex(sha3_
ff30: 71 75 65 72 79 28 27 27 53 45 4c 45 43 54 20 74  query(''SELECT t
ff40: 79 70 65 2c 6e 61 6d 65 2c 74 62 6c 5f 6e 61 6d  ype,name,tbl_nam
ff50: 65 2c 73 71 6c 20 22 0a 20 20 20 20 20 20 20 20  e,sql ".        
ff60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ff70: 20 20 20 20 20 20 20 20 20 22 46 52 4f 4d 20 73           "FROM s
ff80: 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 4f 52 44  qlite_master ORD
ff90: 45 52 20 42 59 20 32 27 27 2c 32 32 34 29 29 27  ER BY 2'',224))'
ffa0: 2c 5c 6e 22 0a 20 20 20 20 22 20 20 20 20 68 65  ,\n".    "    he
ffb0: 78 28 73 68 61 33 5f 71 75 65 72 79 28 27 53 45  x(sha3_query('SE
ffc0: 4c 45 43 54 20 74 79 70 65 2c 6e 61 6d 65 2c 74  LECT type,name,t
ffd0: 62 6c 5f 6e 61 6d 65 2c 73 71 6c 20 22 0a 20 20  bl_name,sql ".  
ffe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fff0: 20 20 20 20 20 20 20 20 22 46 52 4f 4d 20 73 71          "FROM sq
10000 6c 69 74 65 5f 6d 61 73 74 65 72 20 4f 52 44 45  lite_master ORDE
10010 52 20 42 59 20 32 27 2c 32 32 34 29 29 3b 5c 6e  R BY 2',224));\n
10020 22 0a 20 20 20 20 22 49 4e 53 45 52 54 20 49 4e  ".    "INSERT IN
10030 54 4f 20 5b 5f 73 68 65 6c 6c 24 73 65 6c 66 5d  TO [_shell$self]
10040 5c 6e 22 0a 20 20 20 20 22 20 20 53 45 4c 45 43  \n".    "  SELEC
10050 54 20 27 72 75 6e 27 2c 22 0a 20 20 20 20 22 20  T 'run',".    " 
10060 20 20 20 27 53 45 4c 45 43 54 20 68 65 78 28 73     'SELECT hex(s
10070 68 61 33 5f 71 75 65 72 79 28 27 27 53 45 4c 45  ha3_query(''SELE
10080 43 54 20 2a 20 46 52 4f 4d 20 5c 22 27 20 7c 7c  CT * FROM \"' ||
10090 22 0a 20 20 20 20 22 20 20 20 20 20 20 20 20 70  ".    "        p
100a0 72 69 6e 74 66 28 27 25 77 27 2c 6e 61 6d 65 29  rintf('%w',name)
100b0 20 7c 7c 20 27 5c 22 20 4e 4f 54 20 49 4e 44 45   || '\" NOT INDE
100c0 58 45 44 27 27 2c 32 32 34 29 29 27 2c 5c 6e 22  XED'',224))',\n"
100d0 0a 20 20 20 20 22 20 20 20 20 68 65 78 28 73 68  .    "    hex(sh
100e0 61 33 5f 71 75 65 72 79 28 70 72 69 6e 74 66 28  a3_query(printf(
100f0 27 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 5c  'SELECT * FROM \
10100 22 25 77 5c 22 20 4e 4f 54 20 49 4e 44 45 58 45  "%w\" NOT INDEXE
10110 44 27 2c 6e 61 6d 65 29 2c 32 32 34 29 29 5c 6e  D',name),224))\n
10120 22 0a 20 20 20 20 22 20 20 46 52 4f 4d 20 28 5c  ".    "  FROM (\
10130 6e 22 0a 20 20 20 20 22 20 20 20 20 53 45 4c 45  n".    "    SELE
10140 43 54 20 6e 61 6d 65 20 46 52 4f 4d 20 73 71 6c  CT name FROM sql
10150 69 74 65 5f 6d 61 73 74 65 72 5c 6e 22 0a 20 20  ite_master\n".  
10160 20 20 22 20 20 20 20 20 57 48 45 52 45 20 74 79    "     WHERE ty
10170 70 65 3d 27 74 61 62 6c 65 27 5c 6e 22 0a 20 20  pe='table'\n".  
10180 20 20 22 20 20 20 20 20 20 20 41 4e 44 20 6e 61    "       AND na
10190 6d 65 3c 3e 27 73 65 6c 66 74 65 73 74 27 5c 6e  me<>'selftest'\n
101a0 22 0a 20 20 20 20 22 20 20 20 20 20 20 20 41 4e  ".    "       AN
101b0 44 20 63 6f 61 6c 65 73 63 65 28 72 6f 6f 74 70  D coalesce(rootp
101c0 61 67 65 2c 30 29 3e 30 5c 6e 22 0a 20 20 20 20  age,0)>0\n".    
101d0 22 20 20 29 5c 6e 22 0a 20 20 20 20 22 20 4f 52  "  )\n".    " OR
101e0 44 45 52 20 42 59 20 6e 61 6d 65 3b 5c 6e 22 0a  DER BY name;\n".
101f0 20 20 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f      "INSERT INTO
10200 20 5b 5f 73 68 65 6c 6c 24 73 65 6c 66 5d 5c 6e   [_shell$self]\n
10210 22 0a 20 20 20 20 22 20 20 56 41 4c 55 45 53 28  ".    "  VALUES(
10220 27 72 75 6e 27 2c 27 50 52 41 47 4d 41 20 69 6e  'run','PRAGMA in
10230 74 65 67 72 69 74 79 5f 63 68 65 63 6b 27 2c 27  tegrity_check','
10240 6f 6b 27 29 3b 5c 6e 22 0a 20 20 20 20 22 49 4e  ok');\n".    "IN
10250 53 45 52 54 20 49 4e 54 4f 20 73 65 6c 66 74 65  SERT INTO selfte
10260 73 74 28 74 6e 6f 2c 6f 70 2c 63 6d 64 2c 61 6e  st(tno,op,cmd,an
10270 73 29 22 0a 20 20 20 20 22 20 20 53 45 4c 45 43  s)".    "  SELEC
10280 54 20 72 6f 77 69 64 2a 31 30 2c 6f 70 2c 63 6d  T rowid*10,op,cm
10290 64 2c 61 6e 73 20 46 52 4f 4d 20 5b 5f 73 68 65  d,ans FROM [_she
102a0 6c 6c 24 73 65 6c 66 5d 3b 5c 6e 22 0a 20 20 20  ll$self];\n".   
102b0 20 22 44 52 4f 50 20 54 41 42 4c 45 20 5b 5f 73   "DROP TABLE [_s
102c0 68 65 6c 6c 24 73 65 6c 66 5d 3b 22 0a 20 20 20  hell$self];".   
102d0 20 2c 30 2c 30 2c 26 7a 45 72 72 4d 73 67 29 3b   ,0,0,&zErrMsg);
102e0 0a 20 20 69 66 28 20 7a 45 72 72 4d 73 67 20 29  .  if( zErrMsg )
102f0 7b 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74  {.    utf8_print
10300 66 28 73 74 64 65 72 72 2c 20 22 53 45 4c 46 54  f(stderr, "SELFT
10310 45 53 54 20 69 6e 69 74 69 61 6c 69 7a 61 74 69  EST initializati
10320 6f 6e 20 66 61 69 6c 75 72 65 3a 20 25 73 5c 6e  on failure: %s\n
10330 22 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20  ", zErrMsg);.   
10340 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 45   sqlite3_free(zE
10350 72 72 4d 73 67 29 3b 0a 20 20 7d 0a 20 20 73 71  rrMsg);.  }.  sq
10360 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62  lite3_exec(p->db
10370 2c 20 22 52 45 4c 45 41 53 45 20 73 65 6c 66 74  , "RELEASE selft
10380 65 73 74 5f 69 6e 69 74 22 2c 30 2c 30 2c 30 29  est_init",0,0,0)
10390 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  ;.}.../*.** Set 
103a0 74 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 20  the destination 
103b0 74 61 62 6c 65 20 66 69 65 6c 64 20 6f 66 20 74  table field of t
103c0 68 65 20 53 68 65 6c 6c 53 74 61 74 65 20 73 74  he ShellState st
103d0 72 75 63 74 75 72 65 20 74 6f 0a 2a 2a 20 74 68  ructure to.** th
103e0 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61  e name of the ta
103f0 62 6c 65 20 67 69 76 65 6e 2e 20 20 45 73 63 61  ble given.  Esca
10400 70 65 20 61 6e 79 20 71 75 6f 74 65 20 63 68 61  pe any quote cha
10410 72 61 63 74 65 72 73 20 69 6e 20 74 68 65 0a 2a  racters in the.*
10420 2a 20 74 61 62 6c 65 20 6e 61 6d 65 2e 0a 2a 2f  * table name..*/
10430 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 74  .static void set
10440 5f 74 61 62 6c 65 5f 6e 61 6d 65 28 53 68 65 6c  _table_name(Shel
10450 6c 53 74 61 74 65 20 2a 70 2c 20 63 6f 6e 73 74  lState *p, const
10460 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20   char *zName){. 
10470 20 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 63 68 61   int i, n;.  cha
10480 72 20 63 51 75 6f 74 65 3b 0a 20 20 63 68 61 72  r cQuote;.  char
10490 20 2a 7a 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 7a   *z;..  if( p->z
104a0 44 65 73 74 54 61 62 6c 65 20 29 7b 0a 20 20 20  DestTable ){.   
104b0 20 66 72 65 65 28 70 2d 3e 7a 44 65 73 74 54 61   free(p->zDestTa
104c0 62 6c 65 29 3b 0a 20 20 20 20 70 2d 3e 7a 44 65  ble);.    p->zDe
104d0 73 74 54 61 62 6c 65 20 3d 20 30 3b 0a 20 20 7d  stTable = 0;.  }
104e0 0a 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20  .  if( zName==0 
104f0 29 20 72 65 74 75 72 6e 3b 0a 20 20 63 51 75 6f  ) return;.  cQuo
10500 74 65 20 3d 20 71 75 6f 74 65 43 68 61 72 28 7a  te = quoteChar(z
10510 4e 61 6d 65 29 3b 0a 20 20 6e 20 3d 20 73 74 72  Name);.  n = str
10520 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 3b 0a 20 20  len30(zName);.  
10530 69 66 28 20 63 51 75 6f 74 65 20 29 20 6e 20 2b  if( cQuote ) n +
10540 3d 20 6e 2b 32 3b 0a 20 20 7a 20 3d 20 70 2d 3e  = n+2;.  z = p->
10550 7a 44 65 73 74 54 61 62 6c 65 20 3d 20 6d 61 6c  zDestTable = mal
10560 6c 6f 63 28 20 6e 2b 31 20 29 3b 0a 20 20 69 66  loc( n+1 );.  if
10570 28 20 7a 3d 3d 30 20 29 20 73 68 65 6c 6c 5f 6f  ( z==0 ) shell_o
10580 75 74 5f 6f 66 5f 6d 65 6d 6f 72 79 28 29 3b 0a  ut_of_memory();.
10590 20 20 6e 20 3d 20 30 3b 0a 20 20 69 66 28 20 63    n = 0;.  if( c
105a0 51 75 6f 74 65 20 29 20 7a 5b 6e 2b 2b 5d 20 3d  Quote ) z[n++] =
105b0 20 63 51 75 6f 74 65 3b 0a 20 20 66 6f 72 28 69   cQuote;.  for(i
105c0 3d 30 3b 20 7a 4e 61 6d 65 5b 69 5d 3b 20 69 2b  =0; zName[i]; i+
105d0 2b 29 7b 0a 20 20 20 20 7a 5b 6e 2b 2b 5d 20 3d  +){.    z[n++] =
105e0 20 7a 4e 61 6d 65 5b 69 5d 3b 0a 20 20 20 20 69   zName[i];.    i
105f0 66 28 20 7a 4e 61 6d 65 5b 69 5d 3d 3d 63 51 75  f( zName[i]==cQu
10600 6f 74 65 20 29 20 7a 5b 6e 2b 2b 5d 20 3d 20 63  ote ) z[n++] = c
10610 51 75 6f 74 65 3b 0a 20 20 7d 0a 20 20 69 66 28  Quote;.  }.  if(
10620 20 63 51 75 6f 74 65 20 29 20 7a 5b 6e 2b 2b 5d   cQuote ) z[n++]
10630 20 3d 20 63 51 75 6f 74 65 3b 0a 20 20 7a 5b 6e   = cQuote;.  z[n
10640 5d 20 3d 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  ] = 0;.}.../*.**
10650 20 45 78 65 63 75 74 65 20 61 20 71 75 65 72 79   Execute a query
10660 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20   statement that 
10670 77 69 6c 6c 20 67 65 6e 65 72 61 74 65 20 53 51  will generate SQ
10680 4c 20 6f 75 74 70 75 74 2e 20 20 50 72 69 6e 74  L output.  Print
10690 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20 63  .** the result c
106a0 6f 6c 75 6d 6e 73 2c 20 63 6f 6d 6d 61 2d 73 65  olumns, comma-se
106b0 70 61 72 61 74 65 64 2c 20 6f 6e 20 61 20 6c 69  parated, on a li
106c0 6e 65 20 61 6e 64 20 74 68 65 6e 20 61 64 64 20  ne and then add 
106d0 61 0a 2a 2a 20 73 65 6d 69 63 6f 6c 6f 6e 20 74  a.** semicolon t
106e0 65 72 6d 69 6e 61 74 6f 72 20 74 6f 20 74 68 65  erminator to the
106f0 20 65 6e 64 20 6f 66 20 74 68 61 74 20 6c 69 6e   end of that lin
10700 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
10710 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  number of column
10720 73 20 69 73 20 31 20 61 6e 64 20 74 68 61 74 20  s is 1 and that 
10730 63 6f 6c 75 6d 6e 20 63 6f 6e 74 61 69 6e 73 20  column contains 
10740 74 65 78 74 20 22 2d 2d 22 0a 2a 2a 20 74 68 65  text "--".** the
10750 6e 20 77 72 69 74 65 20 74 68 65 20 73 65 6d 69  n write the semi
10760 63 6f 6c 6f 6e 20 6f 6e 20 61 20 73 65 70 61 72  colon on a separ
10770 61 74 65 20 6c 69 6e 65 2e 20 20 54 68 61 74 20  ate line.  That 
10780 77 61 79 2c 20 69 66 20 61 0a 2a 2a 20 22 2d 2d  way, if a.** "--
10790 22 20 63 6f 6d 6d 65 6e 74 20 6f 63 63 75 72 73  " comment occurs
107a0 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   at the end of t
107b0 68 65 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68  he statement, th
107c0 65 20 63 6f 6d 6d 65 6e 74 0a 2a 2a 20 77 6f 6e  e comment.** won
107d0 27 74 20 63 6f 6e 73 75 6d 65 20 74 68 65 20 73  't consume the s
107e0 65 6d 69 63 6f 6c 6f 6e 20 74 65 72 6d 69 6e 61  emicolon termina
107f0 74 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  tor..*/.static i
10800 6e 74 20 72 75 6e 5f 74 61 62 6c 65 5f 64 75 6d  nt run_table_dum
10810 70 5f 71 75 65 72 79 28 0a 20 20 53 68 65 6c 6c  p_query(.  Shell
10820 53 74 61 74 65 20 2a 70 2c 20 20 20 20 20 20 20  State *p,       
10830 20 20 20 20 2f 2a 20 51 75 65 72 79 20 63 6f 6e      /* Query con
10840 74 65 78 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  text */.  const 
10850 63 68 61 72 20 2a 7a 53 65 6c 65 63 74 2c 20 20  char *zSelect,  
10860 20 20 20 2f 2a 20 53 45 4c 45 43 54 20 73 74 61     /* SELECT sta
10870 74 65 6d 65 6e 74 20 74 6f 20 65 78 74 72 61 63  tement to extrac
10880 74 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 63  t content */.  c
10890 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 72 73  onst char *zFirs
108a0 74 52 6f 77 20 20 20 20 2f 2a 20 50 72 69 6e 74  tRow    /* Print
108b0 20 62 65 66 6f 72 65 20 66 69 72 73 74 20 72 6f   before first ro
108c0 77 2c 20 69 66 20 6e 6f 74 20 4e 55 4c 4c 20 2a  w, if not NULL *
108d0 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73  /.){.  sqlite3_s
108e0 74 6d 74 20 2a 70 53 65 6c 65 63 74 3b 0a 20 20  tmt *pSelect;.  
108f0 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 6e 52  int rc;.  int nR
10900 65 73 75 6c 74 3b 0a 20 20 69 6e 74 20 69 3b 0a  esult;.  int i;.
10910 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b    const char *z;
10920 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
10930 70 72 65 70 61 72 65 5f 76 32 28 70 2d 3e 64 62  prepare_v2(p->db
10940 2c 20 7a 53 65 6c 65 63 74 2c 20 2d 31 2c 20 26  , zSelect, -1, &
10950 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20 69  pSelect, 0);.  i
10960 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
10970 20 7c 7c 20 21 70 53 65 6c 65 63 74 20 29 7b 0a   || !pSelect ){.
10980 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
10990 70 2d 3e 6f 75 74 2c 20 22 2f 2a 2a 2a 2a 20 45  p->out, "/**** E
109a0 52 52 4f 52 3a 20 28 25 64 29 20 25 73 20 2a 2a  RROR: (%d) %s **
109b0 2a 2a 2a 2f 5c 6e 22 2c 20 72 63 2c 0a 20 20 20  ***/\n", rc,.   
109c0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
109d0 69 74 65 33 5f 65 72 72 6d 73 67 28 70 2d 3e 64  ite3_errmsg(p->d
109e0 62 29 29 3b 0a 20 20 20 20 69 66 28 20 28 72 63  b));.    if( (rc
109f0 26 30 78 66 66 29 21 3d 53 51 4c 49 54 45 5f 43  &0xff)!=SQLITE_C
10a00 4f 52 52 55 50 54 20 29 20 70 2d 3e 6e 45 72 72  ORRUPT ) p->nErr
10a10 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72  ++;.    return r
10a20 63 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71  c;.  }.  rc = sq
10a30 6c 69 74 65 33 5f 73 74 65 70 28 70 53 65 6c 65  lite3_step(pSele
10a40 63 74 29 3b 0a 20 20 6e 52 65 73 75 6c 74 20 3d  ct);.  nResult =
10a50 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
10a60 63 6f 75 6e 74 28 70 53 65 6c 65 63 74 29 3b 0a  count(pSelect);.
10a70 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c    while( rc==SQL
10a80 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 69  ITE_ROW ){.    i
10a90 66 28 20 7a 46 69 72 73 74 52 6f 77 20 29 7b 0a  f( zFirstRow ){.
10aa0 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
10ab0 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20  f(p->out, "%s", 
10ac0 7a 46 69 72 73 74 52 6f 77 29 3b 0a 20 20 20 20  zFirstRow);.    
10ad0 20 20 7a 46 69 72 73 74 52 6f 77 20 3d 20 30 3b    zFirstRow = 0;
10ae0 0a 20 20 20 20 7d 0a 20 20 20 20 7a 20 3d 20 28  .    }.    z = (
10af0 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69  const char*)sqli
10b00 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28  te3_column_text(
10b10 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20 20  pSelect, 0);.   
10b20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e   utf8_printf(p->
10b30 6f 75 74 2c 20 22 25 73 22 2c 20 7a 29 3b 0a 20  out, "%s", z);. 
10b40 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 52     for(i=1; i<nR
10b50 65 73 75 6c 74 3b 20 69 2b 2b 29 7b 0a 20 20 20  esult; i++){.   
10b60 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70     utf8_printf(p
10b70 2d 3e 6f 75 74 2c 20 22 2c 25 73 22 2c 20 73 71  ->out, ",%s", sq
10b80 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
10b90 74 28 70 53 65 6c 65 63 74 2c 20 69 29 29 3b 0a  t(pSelect, i));.
10ba0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 7a 3d      }.    if( z=
10bb0 3d 30 20 29 20 7a 20 3d 20 22 22 3b 0a 20 20 20  =0 ) z = "";.   
10bc0 20 77 68 69 6c 65 28 20 7a 5b 30 5d 20 26 26 20   while( z[0] && 
10bd0 28 7a 5b 30 5d 21 3d 27 2d 27 20 7c 7c 20 7a 5b  (z[0]!='-' || z[
10be0 31 5d 21 3d 27 2d 27 29 20 29 20 7a 2b 2b 3b 0a  1]!='-') ) z++;.
10bf0 20 20 20 20 69 66 28 20 7a 5b 30 5d 20 29 7b 0a      if( z[0] ){.
10c00 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
10c10 28 70 2d 3e 6f 75 74 2c 20 22 5c 6e 3b 5c 6e 22  (p->out, "\n;\n"
10c20 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
10c30 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70      raw_printf(p
10c40 2d 3e 6f 75 74 2c 20 22 3b 5c 6e 22 29 3b 0a 20  ->out, ";\n");. 
10c50 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71     }.    rc = sq
10c60 6c 69 74 65 33 5f 73 74 65 70 28 70 53 65 6c 65  lite3_step(pSele
10c70 63 74 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  ct);.  }.  rc = 
10c80 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
10c90 28 70 53 65 6c 65 63 74 29 3b 0a 20 20 69 66 28  (pSelect);.  if(
10ca0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
10cb0 7b 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74  {.    utf8_print
10cc0 66 28 70 2d 3e 6f 75 74 2c 20 22 2f 2a 2a 2a 2a  f(p->out, "/****
10cd0 20 45 52 52 4f 52 3a 20 28 25 64 29 20 25 73 20   ERROR: (%d) %s 
10ce0 2a 2a 2a 2a 2a 2f 5c 6e 22 2c 20 72 63 2c 0a 20  *****/\n", rc,. 
10cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
10d00 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 2d  qlite3_errmsg(p-
10d10 3e 64 62 29 29 3b 0a 20 20 20 20 69 66 28 20 28  >db));.    if( (
10d20 72 63 26 30 78 66 66 29 21 3d 53 51 4c 49 54 45  rc&0xff)!=SQLITE
10d30 5f 43 4f 52 52 55 50 54 20 29 20 70 2d 3e 6e 45  _CORRUPT ) p->nE
10d40 72 72 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rr++;.  }.  retu
10d50 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
10d60 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 61  Allocate space a
10d70 6e 64 20 73 61 76 65 20 6f 66 66 20 63 75 72 72  nd save off curr
10d80 65 6e 74 20 65 72 72 6f 72 20 73 74 72 69 6e 67  ent error string
10d90 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  ..*/.static char
10da0 20 2a 73 61 76 65 5f 65 72 72 5f 6d 73 67 28 0a   *save_err_msg(.
10db0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 20 20    sqlite3 *db   
10dc0 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
10dd0 62 61 73 65 20 74 6f 20 71 75 65 72 79 20 2a 2f  base to query */
10de0 0a 29 7b 0a 20 20 69 6e 74 20 6e 45 72 72 4d 73  .){.  int nErrMs
10df0 67 20 3d 20 31 2b 73 74 72 6c 65 6e 33 30 28 73  g = 1+strlen30(s
10e00 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62  qlite3_errmsg(db
10e10 29 29 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72  ));.  char *zErr
10e20 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61  Msg = sqlite3_ma
10e30 6c 6c 6f 63 36 34 28 6e 45 72 72 4d 73 67 29 3b  lloc64(nErrMsg);
10e40 0a 20 20 69 66 28 20 7a 45 72 72 4d 73 67 20 29  .  if( zErrMsg )
10e50 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a 45 72  {.    memcpy(zEr
10e60 72 4d 73 67 2c 20 73 71 6c 69 74 65 33 5f 65 72  rMsg, sqlite3_er
10e70 72 6d 73 67 28 64 62 29 2c 20 6e 45 72 72 4d 73  rmsg(db), nErrMs
10e80 67 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  g);.  }.  return
10e90 20 7a 45 72 72 4d 73 67 3b 0a 7d 0a 0a 23 69 66   zErrMsg;.}..#if
10ea0 64 65 66 20 5f 5f 6c 69 6e 75 78 5f 5f 0a 2f 2a  def __linux__./*
10eb0 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 64  .** Attempt to d
10ec0 69 73 70 6c 61 79 20 49 2f 4f 20 73 74 61 74 73  isplay I/O stats
10ed0 20 6f 6e 20 4c 69 6e 75 78 20 75 73 69 6e 67 20   on Linux using 
10ee0 2f 70 72 6f 63 2f 50 49 44 2f 69 6f 0a 2a 2f 0a  /proc/PID/io.*/.
10ef0 73 74 61 74 69 63 20 76 6f 69 64 20 64 69 73 70  static void disp
10f00 6c 61 79 4c 69 6e 75 78 49 6f 53 74 61 74 73 28  layLinuxIoStats(
10f10 46 49 4c 45 20 2a 6f 75 74 29 7b 0a 20 20 46 49  FILE *out){.  FI
10f20 4c 45 20 2a 69 6e 3b 0a 20 20 63 68 61 72 20 7a  LE *in;.  char z
10f30 5b 32 30 30 5d 3b 0a 20 20 73 71 6c 69 74 65 33  [200];.  sqlite3
10f40 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66  _snprintf(sizeof
10f50 28 7a 29 2c 20 7a 2c 20 22 2f 70 72 6f 63 2f 25  (z), z, "/proc/%
10f60 64 2f 69 6f 22 2c 20 67 65 74 70 69 64 28 29 29  d/io", getpid())
10f70 3b 0a 20 20 69 6e 20 3d 20 66 6f 70 65 6e 28 7a  ;.  in = fopen(z
10f80 2c 20 22 72 62 22 29 3b 0a 20 20 69 66 28 20 69  , "rb");.  if( i
10f90 6e 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  n==0 ) return;. 
10fa0 20 77 68 69 6c 65 28 20 66 67 65 74 73 28 7a 2c   while( fgets(z,
10fb0 20 73 69 7a 65 6f 66 28 7a 29 2c 20 69 6e 29 21   sizeof(z), in)!
10fc0 3d 30 20 29 7b 0a 20 20 20 20 73 74 61 74 69 63  =0 ){.    static
10fd0 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20 7b 0a   const struct {.
10fe0 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
10ff0 20 2a 7a 50 61 74 74 65 72 6e 3b 0a 20 20 20 20   *zPattern;.    
11000 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
11010 65 73 63 3b 0a 20 20 20 20 7d 20 61 54 72 61 6e  esc;.    } aTran
11020 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 7b 20  s[] = {.      { 
11030 22 72 63 68 61 72 3a 20 22 2c 20 20 20 20 20 20  "rchar: ",      
11040 20 20 20 20 20 20 20 20 20 20 20 20 22 42 79 74              "Byt
11050 65 73 20 72 65 63 65 69 76 65 64 20 62 79 20 72  es received by r
11060 65 61 64 28 29 3a 22 20 7d 2c 0a 20 20 20 20 20  ead():" },.     
11070 20 7b 20 22 77 63 68 61 72 3a 20 22 2c 20 20 20   { "wchar: ",   
11080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
11090 42 79 74 65 73 20 73 65 6e 74 20 74 6f 20 77 72  Bytes sent to wr
110a0 69 74 65 28 29 3a 22 20 20 20 20 7d 2c 0a 20 20  ite():"    },.  
110b0 20 20 20 20 7b 20 22 73 79 73 63 72 3a 20 22 2c      { "syscr: ",
110c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
110d0 20 20 22 52 65 61 64 28 29 20 73 79 73 74 65 6d    "Read() system
110e0 20 63 61 6c 6c 73 3a 22 20 20 20 20 20 20 7d 2c   calls:"      },
110f0 0a 20 20 20 20 20 20 7b 20 22 73 79 73 63 77 3a  .      { "syscw:
11100 20 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   ",             
11110 20 20 20 20 20 22 57 72 69 74 65 28 29 20 73 79       "Write() sy
11120 73 74 65 6d 20 63 61 6c 6c 73 3a 22 20 20 20 20  stem calls:"    
11130 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 72 65 61   },.      { "rea
11140 64 5f 62 79 74 65 73 3a 20 22 2c 20 20 20 20 20  d_bytes: ",     
11150 20 20 20 20 20 20 20 20 22 42 79 74 65 73 20 72          "Bytes r
11160 65 61 64 20 66 72 6f 6d 20 73 74 6f 72 61 67 65  ead from storage
11170 3a 22 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22  :"  },.      { "
11180 77 72 69 74 65 5f 62 79 74 65 73 3a 20 22 2c 20  write_bytes: ", 
11190 20 20 20 20 20 20 20 20 20 20 20 22 42 79 74 65             "Byte
111a0 73 20 77 72 69 74 74 65 6e 20 74 6f 20 73 74 6f  s written to sto
111b0 72 61 67 65 3a 22 20 7d 2c 0a 20 20 20 20 20 20  rage:" },.      
111c0 7b 20 22 63 61 6e 63 65 6c 6c 65 64 5f 77 72 69  { "cancelled_wri
111d0 74 65 5f 62 79 74 65 73 3a 20 22 2c 20 20 22 43  te_bytes: ",  "C
111e0 61 6e 63 65 6c 6c 65 64 20 77 72 69 74 65 20 62  ancelled write b
111f0 79 74 65 73 3a 22 20 20 20 20 7d 2c 0a 20 20 20  ytes:"    },.   
11200 20 7d 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   };.    int i;. 
11210 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 41 72     for(i=0; i<Ar
11220 72 61 79 53 69 7a 65 28 61 54 72 61 6e 73 29 3b  raySize(aTrans);
11230 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74   i++){.      int
11240 20 6e 20 3d 20 73 74 72 6c 65 6e 33 30 28 61 54   n = strlen30(aT
11250 72 61 6e 73 5b 69 5d 2e 7a 50 61 74 74 65 72 6e  rans[i].zPattern
11260 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 74 72  );.      if( str
11270 6e 63 6d 70 28 61 54 72 61 6e 73 5b 69 5d 2e 7a  ncmp(aTrans[i].z
11280 50 61 74 74 65 72 6e 2c 20 7a 2c 20 6e 29 3d 3d  Pattern, z, n)==
11290 30 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66  0 ){.        utf
112a0 38 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25  8_printf(out, "%
112b0 2d 33 36 73 20 25 73 22 2c 20 61 54 72 61 6e 73  -36s %s", aTrans
112c0 5b 69 5d 2e 7a 44 65 73 63 2c 20 26 7a 5b 6e 5d  [i].zDesc, &z[n]
112d0 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
112e0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
112f0 20 20 7d 0a 20 20 66 63 6c 6f 73 65 28 69 6e 29    }.  fclose(in)
11300 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
11310 2a 20 44 69 73 70 6c 61 79 20 61 20 73 69 6e 67  * Display a sing
11320 6c 65 20 6c 69 6e 65 20 6f 66 20 73 74 61 74 75  le line of statu
11330 73 20 75 73 69 6e 67 20 36 34 2d 62 69 74 20 76  s using 64-bit v
11340 61 6c 75 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  alues..*/.static
11350 20 76 6f 69 64 20 64 69 73 70 6c 61 79 53 74 61   void displaySta
11360 74 4c 69 6e 65 28 0a 20 20 53 68 65 6c 6c 53 74  tLine(.  ShellSt
11370 61 74 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ate *p,         
11380 20 20 20 2f 2a 20 54 68 65 20 73 68 65 6c 6c 20     /* The shell 
11390 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 63 68 61  context */.  cha
113a0 72 20 2a 7a 4c 61 62 65 6c 2c 20 20 20 20 20 20  r *zLabel,      
113b0 20 20 20 20 20 20 20 2f 2a 20 4c 61 62 65 6c 20         /* Label 
113c0 66 6f 72 20 74 68 69 73 20 6f 6e 65 20 6c 69 6e  for this one lin
113d0 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 46 6f  e */.  char *zFo
113e0 72 6d 61 74 2c 20 20 20 20 20 20 20 20 20 20 20  rmat,           
113f0 20 2f 2a 20 46 6f 72 6d 61 74 20 66 6f 72 20 74   /* Format for t
11400 68 65 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20 69  he result */.  i
11410 6e 74 20 69 53 74 61 74 75 73 43 74 72 6c 2c 20  nt iStatusCtrl, 
11420 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68 69 63           /* Whic
11430 68 20 73 74 61 74 75 73 20 74 6f 20 64 69 73 70  h status to disp
11440 6c 61 79 20 2a 2f 0a 20 20 69 6e 74 20 62 52 65  lay */.  int bRe
11450 73 65 74 20 20 20 20 20 20 20 20 20 20 20 20 20  set             
11460 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 72 65     /* True to re
11470 73 65 74 20 74 68 65 20 73 74 61 74 73 20 2a 2f  set the stats */
11480 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e  .){.  sqlite3_in
11490 74 36 34 20 69 43 75 72 20 3d 20 2d 31 3b 0a 20  t64 iCur = -1;. 
114a0 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69   sqlite3_int64 i
114b0 48 69 77 74 72 20 3d 20 2d 31 3b 0a 20 20 69 6e  Hiwtr = -1;.  in
114c0 74 20 69 2c 20 6e 50 65 72 63 65 6e 74 3b 0a 20  t i, nPercent;. 
114d0 20 63 68 61 72 20 7a 4c 69 6e 65 5b 32 30 30 5d   char zLine[200]
114e0 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 61 74  ;.  sqlite3_stat
114f0 75 73 36 34 28 69 53 74 61 74 75 73 43 74 72 6c  us64(iStatusCtrl
11500 2c 20 26 69 43 75 72 2c 20 26 69 48 69 77 74 72  , &iCur, &iHiwtr
11510 2c 20 62 52 65 73 65 74 29 3b 0a 20 20 66 6f 72  , bReset);.  for
11520 28 69 3d 30 2c 20 6e 50 65 72 63 65 6e 74 3d 30  (i=0, nPercent=0
11530 3b 20 7a 46 6f 72 6d 61 74 5b 69 5d 3b 20 69 2b  ; zFormat[i]; i+
11540 2b 29 7b 0a 20 20 20 20 69 66 28 20 7a 46 6f 72  +){.    if( zFor
11550 6d 61 74 5b 69 5d 3d 3d 27 25 27 20 29 20 6e 50  mat[i]=='%' ) nP
11560 65 72 63 65 6e 74 2b 2b 3b 0a 20 20 7d 0a 20 20  ercent++;.  }.  
11570 69 66 28 20 6e 50 65 72 63 65 6e 74 3e 31 20 29  if( nPercent>1 )
11580 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  {.    sqlite3_sn
11590 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 4c  printf(sizeof(zL
115a0 69 6e 65 29 2c 20 7a 4c 69 6e 65 2c 20 7a 46 6f  ine), zLine, zFo
115b0 72 6d 61 74 2c 20 69 43 75 72 2c 20 69 48 69 77  rmat, iCur, iHiw
115c0 74 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  tr);.  }else{.  
115d0 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
115e0 74 66 28 73 69 7a 65 6f 66 28 7a 4c 69 6e 65 29  tf(sizeof(zLine)
115f0 2c 20 7a 4c 69 6e 65 2c 20 7a 46 6f 72 6d 61 74  , zLine, zFormat
11600 2c 20 69 48 69 77 74 72 29 3b 0a 20 20 7d 0a 20  , iHiwtr);.  }. 
11610 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f   raw_printf(p->o
11620 75 74 2c 20 22 25 2d 33 36 73 20 25 73 5c 6e 22  ut, "%-36s %s\n"
11630 2c 20 7a 4c 61 62 65 6c 2c 20 7a 4c 69 6e 65 29  , zLabel, zLine)
11640 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 70 6c  ;.}../*.** Displ
11650 61 79 20 6d 65 6d 6f 72 79 20 73 74 61 74 73 2e  ay memory stats.
11660 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64  .*/.static int d
11670 69 73 70 6c 61 79 5f 73 74 61 74 73 28 0a 20 20  isplay_stats(.  
11680 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20  sqlite3 *db,    
11690 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
116a0 61 74 61 62 61 73 65 20 74 6f 20 71 75 65 72 79  atabase to query
116b0 20 2a 2f 0a 20 20 53 68 65 6c 6c 53 74 61 74 65   */.  ShellState
116c0 20 2a 70 41 72 67 2c 20 20 20 20 20 20 20 20 20   *pArg,         
116d0 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
116e0 53 68 65 6c 6c 53 74 61 74 65 20 2a 2f 0a 20 20  ShellState */.  
116f0 69 6e 74 20 62 52 65 73 65 74 20 20 20 20 20 20  int bReset      
11700 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
11710 72 75 65 20 74 6f 20 72 65 73 65 74 20 74 68 65  rue to reset the
11720 20 73 74 61 74 73 20 2a 2f 0a 29 7b 0a 20 20 69   stats */.){.  i
11730 6e 74 20 69 43 75 72 3b 0a 20 20 69 6e 74 20 69  nt iCur;.  int i
11740 48 69 77 74 72 3b 0a 20 20 46 49 4c 45 20 2a 6f  Hiwtr;.  FILE *o
11750 75 74 3b 0a 20 20 69 66 28 20 70 41 72 67 3d 3d  ut;.  if( pArg==
11760 30 20 7c 7c 20 70 41 72 67 2d 3e 6f 75 74 3d 3d  0 || pArg->out==
11770 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
11780 6f 75 74 20 3d 20 70 41 72 67 2d 3e 6f 75 74 3b  out = pArg->out;
11790 0a 0a 20 20 69 66 28 20 70 41 72 67 2d 3e 70 53  ..  if( pArg->pS
117a0 74 6d 74 20 26 26 20 28 70 41 72 67 2d 3e 73 74  tmt && (pArg->st
117b0 61 74 73 4f 6e 20 26 20 32 29 20 29 7b 0a 20 20  atsOn & 2) ){.  
117c0 20 20 69 6e 74 20 6e 43 6f 6c 2c 20 69 2c 20 78    int nCol, i, x
117d0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74  ;.    sqlite3_st
117e0 6d 74 20 2a 70 53 74 6d 74 20 3d 20 70 41 72 67  mt *pStmt = pArg
117f0 2d 3e 70 53 74 6d 74 3b 0a 20 20 20 20 63 68 61  ->pStmt;.    cha
11800 72 20 7a 5b 31 30 30 5d 3b 0a 20 20 20 20 6e 43  r z[100];.    nC
11810 6f 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  ol = sqlite3_col
11820 75 6d 6e 5f 63 6f 75 6e 74 28 70 53 74 6d 74 29  umn_count(pStmt)
11830 3b 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66  ;.    raw_printf
11840 28 6f 75 74 2c 20 22 25 2d 33 36 73 20 25 64 5c  (out, "%-36s %d\
11850 6e 22 2c 20 22 4e 75 6d 62 65 72 20 6f 66 20 6f  n", "Number of o
11860 75 74 70 75 74 20 63 6f 6c 75 6d 6e 73 3a 22 2c  utput columns:",
11870 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 66 6f 72 28   nCol);.    for(
11880 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b  i=0; i<nCol; i++
11890 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
118a0 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66  _snprintf(sizeof
118b0 28 7a 29 2c 7a 2c 22 43 6f 6c 75 6d 6e 20 25 64  (z),z,"Column %d
118c0 20 25 6e 6e 61 6d 65 3a 22 2c 20 69 2c 20 26 78   %nname:", i, &x
118d0 29 3b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72  );.      utf8_pr
118e0 69 6e 74 66 28 6f 75 74 2c 20 22 25 2d 33 36 73  intf(out, "%-36s
118f0 20 25 73 5c 6e 22 2c 20 7a 2c 20 73 71 6c 69 74   %s\n", z, sqlit
11900 65 33 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 28 70  e3_column_name(p
11910 53 74 6d 74 2c 69 29 29 3b 0a 23 69 66 6e 64 65  Stmt,i));.#ifnde
11920 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45  f SQLITE_OMIT_DE
11930 43 4c 54 59 50 45 0a 20 20 20 20 20 20 73 71 6c  CLTYPE.      sql
11940 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 33 30  ite3_snprintf(30
11950 2c 20 7a 2b 78 2c 20 22 64 65 63 6c 61 72 65 64  , z+x, "declared
11960 20 74 79 70 65 3a 22 29 3b 0a 20 20 20 20 20 20   type:");.      
11970 75 74 66 38 5f 70 72 69 6e 74 66 28 6f 75 74 2c  utf8_printf(out,
11980 20 22 25 2d 33 36 73 20 25 73 5c 6e 22 2c 20 7a   "%-36s %s\n", z
11990 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  , sqlite3_column
119a0 5f 64 65 63 6c 74 79 70 65 28 70 53 74 6d 74 2c  _decltype(pStmt,
119b0 20 69 29 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66   i));.#endif.#if
119c0 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
119d0 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54  E_COLUMN_METADAT
119e0 41 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  A.      sqlite3_
119f0 73 6e 70 72 69 6e 74 66 28 33 30 2c 20 7a 2b 78  snprintf(30, z+x
11a00 2c 20 22 64 61 74 61 62 61 73 65 20 6e 61 6d 65  , "database name
11a10 3a 22 29 3b 0a 20 20 20 20 20 20 75 74 66 38 5f  :");.      utf8_
11a20 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 2d 33  printf(out, "%-3
11a30 36 73 20 25 73 5c 6e 22 2c 20 7a 2c 20 73 71 6c  6s %s\n", z, sql
11a40 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 61 74 61  ite3_column_data
11a50 62 61 73 65 5f 6e 61 6d 65 28 70 53 74 6d 74 2c  base_name(pStmt,
11a60 69 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  i));.      sqlit
11a70 65 33 5f 73 6e 70 72 69 6e 74 66 28 33 30 2c 20  e3_snprintf(30, 
11a80 7a 2b 78 2c 20 22 74 61 62 6c 65 20 6e 61 6d 65  z+x, "table name
11a90 3a 22 29 3b 0a 20 20 20 20 20 20 75 74 66 38 5f  :");.      utf8_
11aa0 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 2d 33  printf(out, "%-3
11ab0 36 73 20 25 73 5c 6e 22 2c 20 7a 2c 20 73 71 6c  6s %s\n", z, sql
11ac0 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 61 62 6c  ite3_column_tabl
11ad0 65 5f 6e 61 6d 65 28 70 53 74 6d 74 2c 69 29 29  e_name(pStmt,i))
11ae0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
11af0 73 6e 70 72 69 6e 74 66 28 33 30 2c 20 7a 2b 78  snprintf(30, z+x
11b00 2c 20 22 6f 72 69 67 69 6e 20 6e 61 6d 65 3a 22  , "origin name:"
11b10 29 3b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72  );.      utf8_pr
11b20 69 6e 74 66 28 6f 75 74 2c 20 22 25 2d 33 36 73  intf(out, "%-36s
11b30 20 25 73 5c 6e 22 2c 20 7a 2c 20 73 71 6c 69 74   %s\n", z, sqlit
11b40 65 33 5f 63 6f 6c 75 6d 6e 5f 6f 72 69 67 69 6e  e3_column_origin
11b50 5f 6e 61 6d 65 28 70 53 74 6d 74 2c 69 29 29 3b  _name(pStmt,i));
11b60 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20  .#endif.    }.  
11b70 7d 0a 0a 20 20 64 69 73 70 6c 61 79 53 74 61 74  }..  displayStat
11b80 4c 69 6e 65 28 70 41 72 67 2c 20 22 4d 65 6d 6f  Line(pArg, "Memo
11b90 72 79 20 55 73 65 64 3a 22 2c 0a 20 20 20 20 20  ry Used:",.     
11ba0 22 25 6c 6c 64 20 28 6d 61 78 20 25 6c 6c 64 29  "%lld (max %lld)
11bb0 20 62 79 74 65 73 22 2c 20 53 51 4c 49 54 45 5f   bytes", SQLITE_
11bc0 53 54 41 54 55 53 5f 4d 45 4d 4f 52 59 5f 55 53  STATUS_MEMORY_US
11bd0 45 44 2c 20 62 52 65 73 65 74 29 3b 0a 20 20 64  ED, bReset);.  d
11be0 69 73 70 6c 61 79 53 74 61 74 4c 69 6e 65 28 70  isplayStatLine(p
11bf0 41 72 67 2c 20 22 4e 75 6d 62 65 72 20 6f 66 20  Arg, "Number of 
11c00 4f 75 74 73 74 61 6e 64 69 6e 67 20 41 6c 6c 6f  Outstanding Allo
11c10 63 61 74 69 6f 6e 73 3a 22 2c 0a 20 20 20 20 20  cations:",.     
11c20 22 25 6c 6c 64 20 28 6d 61 78 20 25 6c 6c 64 29  "%lld (max %lld)
11c30 22 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 55 53  ", SQLITE_STATUS
11c40 5f 4d 41 4c 4c 4f 43 5f 43 4f 55 4e 54 2c 20 62  _MALLOC_COUNT, b
11c50 52 65 73 65 74 29 3b 0a 20 20 69 66 28 20 70 41  Reset);.  if( pA
11c60 72 67 2d 3e 73 68 65 6c 6c 46 6c 67 73 20 26 20  rg->shellFlgs & 
11c70 53 48 46 4c 47 5f 50 61 67 65 63 61 63 68 65 20  SHFLG_Pagecache 
11c80 29 7b 0a 20 20 20 20 64 69 73 70 6c 61 79 53 74  ){.    displaySt
11c90 61 74 4c 69 6e 65 28 70 41 72 67 2c 20 22 4e 75  atLine(pArg, "Nu
11ca0 6d 62 65 72 20 6f 66 20 50 63 61 63 68 65 20 50  mber of Pcache P
11cb0 61 67 65 73 20 55 73 65 64 3a 22 2c 0a 20 20 20  ages Used:",.   
11cc0 20 20 20 20 22 25 6c 6c 64 20 28 6d 61 78 20 25      "%lld (max %
11cd0 6c 6c 64 29 20 70 61 67 65 73 22 2c 20 53 51 4c  lld) pages", SQL
11ce0 49 54 45 5f 53 54 41 54 55 53 5f 50 41 47 45 43  ITE_STATUS_PAGEC
11cf0 41 43 48 45 5f 55 53 45 44 2c 20 62 52 65 73 65  ACHE_USED, bRese
11d00 74 29 3b 0a 20 20 7d 0a 20 20 64 69 73 70 6c 61  t);.  }.  displa
11d10 79 53 74 61 74 4c 69 6e 65 28 70 41 72 67 2c 20  yStatLine(pArg, 
11d20 22 4e 75 6d 62 65 72 20 6f 66 20 50 63 61 63 68  "Number of Pcach
11d30 65 20 4f 76 65 72 66 6c 6f 77 20 42 79 74 65 73  e Overflow Bytes
11d40 3a 22 2c 0a 20 20 20 20 20 22 25 6c 6c 64 20 28  :",.     "%lld (
11d50 6d 61 78 20 25 6c 6c 64 29 20 62 79 74 65 73 22  max %lld) bytes"
11d60 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 55 53 5f  , SQLITE_STATUS_
11d70 50 41 47 45 43 41 43 48 45 5f 4f 56 45 52 46 4c  PAGECACHE_OVERFL
11d80 4f 57 2c 20 62 52 65 73 65 74 29 3b 0a 20 20 64  OW, bReset);.  d
11d90 69 73 70 6c 61 79 53 74 61 74 4c 69 6e 65 28 70  isplayStatLine(p
11da0 41 72 67 2c 20 22 4c 61 72 67 65 73 74 20 41 6c  Arg, "Largest Al
11db0 6c 6f 63 61 74 69 6f 6e 3a 22 2c 0a 20 20 20 20  location:",.    
11dc0 20 22 25 6c 6c 64 20 62 79 74 65 73 22 2c 20 53   "%lld bytes", S
11dd0 51 4c 49 54 45 5f 53 54 41 54 55 53 5f 4d 41 4c  QLITE_STATUS_MAL
11de0 4c 4f 43 5f 53 49 5a 45 2c 20 62 52 65 73 65 74  LOC_SIZE, bReset
11df0 29 3b 0a 20 20 64 69 73 70 6c 61 79 53 74 61 74  );.  displayStat
11e00 4c 69 6e 65 28 70 41 72 67 2c 20 22 4c 61 72 67  Line(pArg, "Larg
11e10 65 73 74 20 50 63 61 63 68 65 20 41 6c 6c 6f 63  est Pcache Alloc
11e20 61 74 69 6f 6e 3a 22 2c 0a 20 20 20 20 20 22 25  ation:",.     "%
11e30 6c 6c 64 20 62 79 74 65 73 22 2c 20 53 51 4c 49  lld bytes", SQLI
11e40 54 45 5f 53 54 41 54 55 53 5f 50 41 47 45 43 41  TE_STATUS_PAGECA
11e50 43 48 45 5f 53 49 5a 45 2c 20 62 52 65 73 65 74  CHE_SIZE, bReset
11e60 29 3b 0a 23 69 66 64 65 66 20 59 59 54 52 41 43  );.#ifdef YYTRAC
11e70 4b 4d 41 58 53 54 41 43 4b 44 45 50 54 48 0a 20  KMAXSTACKDEPTH. 
11e80 20 64 69 73 70 6c 61 79 53 74 61 74 4c 69 6e 65   displayStatLine
11e90 28 70 41 72 67 2c 20 22 44 65 65 70 65 73 74 20  (pArg, "Deepest 
11ea0 50 61 72 73 65 72 20 53 74 61 63 6b 3a 22 2c 0a  Parser Stack:",.
11eb0 20 20 20 20 20 22 25 6c 6c 64 20 28 6d 61 78 20       "%lld (max 
11ec0 25 6c 6c 64 29 22 2c 20 53 51 4c 49 54 45 5f 53  %lld)", SQLITE_S
11ed0 54 41 54 55 53 5f 50 41 52 53 45 52 5f 53 54 41  TATUS_PARSER_STA
11ee0 43 4b 2c 20 62 52 65 73 65 74 29 3b 0a 23 65 6e  CK, bReset);.#en
11ef0 64 69 66 0a 0a 20 20 69 66 28 20 64 62 20 29 7b  dif..  if( db ){
11f00 0a 20 20 20 20 69 66 28 20 70 41 72 67 2d 3e 73  .    if( pArg->s
11f10 68 65 6c 6c 46 6c 67 73 20 26 20 53 48 46 4c 47  hellFlgs & SHFLG
11f20 5f 4c 6f 6f 6b 61 73 69 64 65 20 29 7b 0a 20 20  _Lookaside ){.  
11f30 20 20 20 20 69 48 69 77 74 72 20 3d 20 69 43 75      iHiwtr = iCu
11f40 72 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 73 71  r = -1;.      sq
11f50 6c 69 74 65 33 5f 64 62 5f 73 74 61 74 75 73 28  lite3_db_status(
11f60 64 62 2c 20 53 51 4c 49 54 45 5f 44 42 53 54 41  db, SQLITE_DBSTA
11f70 54 55 53 5f 4c 4f 4f 4b 41 53 49 44 45 5f 55 53  TUS_LOOKASIDE_US
11f80 45 44 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ED,.            
11f90 20 20 20 20 20 20 20 20 20 20 20 20 26 69 43 75              &iCu
11fa0 72 2c 20 26 69 48 69 77 74 72 2c 20 62 52 65 73  r, &iHiwtr, bRes
11fb0 65 74 29 3b 0a 20 20 20 20 20 20 72 61 77 5f 70  et);.      raw_p
11fc0 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c  rintf(pArg->out,
11fd0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22  .              "
11fe0 4c 6f 6f 6b 61 73 69 64 65 20 53 6c 6f 74 73 20  Lookaside Slots 
11ff0 55 73 65 64 3a 20 20 20 20 20 20 20 20 20 20 20  Used:           
12000 20 20 20 20 20 25 64 20 28 6d 61 78 20 25 64 29       %d (max %d)
12010 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
12020 20 20 20 69 43 75 72 2c 20 69 48 69 77 74 72 29     iCur, iHiwtr)
12030 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
12040 64 62 5f 73 74 61 74 75 73 28 64 62 2c 20 53 51  db_status(db, SQ
12050 4c 49 54 45 5f 44 42 53 54 41 54 55 53 5f 4c 4f  LITE_DBSTATUS_LO
12060 4f 4b 41 53 49 44 45 5f 48 49 54 2c 0a 20 20 20  OKASIDE_HIT,.   
12070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12080 20 20 20 20 20 26 69 43 75 72 2c 20 26 69 48 69       &iCur, &iHi
12090 77 74 72 2c 20 62 52 65 73 65 74 29 3b 0a 20 20  wtr, bReset);.  
120a0 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70      raw_printf(p
120b0 41 72 67 2d 3e 6f 75 74 2c 20 22 53 75 63 63 65  Arg->out, "Succe
120c0 73 73 66 75 6c 20 6c 6f 6f 6b 61 73 69 64 65 20  ssful lookaside 
120d0 61 74 74 65 6d 70 74 73 3a 20 20 20 20 20 20 20  attempts:       
120e0 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %d\n",.         
120f0 20 20 20 20 20 69 48 69 77 74 72 29 3b 0a 20 20       iHiwtr);.  
12100 20 20 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 73      sqlite3_db_s
12110 74 61 74 75 73 28 64 62 2c 20 53 51 4c 49 54 45  tatus(db, SQLITE
12120 5f 44 42 53 54 41 54 55 53 5f 4c 4f 4f 4b 41 53  _DBSTATUS_LOOKAS
12130 49 44 45 5f 4d 49 53 53 5f 53 49 5a 45 2c 0a 20  IDE_MISS_SIZE,. 
12140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12150 20 20 20 20 20 20 20 26 69 43 75 72 2c 20 26 69         &iCur, &i
12160 48 69 77 74 72 2c 20 62 52 65 73 65 74 29 3b 0a  Hiwtr, bReset);.
12170 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
12180 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22 4c 6f 6f  (pArg->out, "Loo
12190 6b 61 73 69 64 65 20 66 61 69 6c 75 72 65 73 20  kaside failures 
121a0 64 75 65 20 74 6f 20 73 69 7a 65 3a 20 20 20 20  due to size:    
121b0 20 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20    %d\n",.       
121c0 20 20 20 20 20 20 20 69 48 69 77 74 72 29 3b 0a         iHiwtr);.
121d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 64 62        sqlite3_db
121e0 5f 73 74 61 74 75 73 28 64 62 2c 20 53 51 4c 49  _status(db, SQLI
121f0 54 45 5f 44 42 53 54 41 54 55 53 5f 4c 4f 4f 4b  TE_DBSTATUS_LOOK
12200 41 53 49 44 45 5f 4d 49 53 53 5f 46 55 4c 4c 2c  ASIDE_MISS_FULL,
12210 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
12220 20 20 20 20 20 20 20 20 20 26 69 43 75 72 2c 20           &iCur, 
12230 26 69 48 69 77 74 72 2c 20 62 52 65 73 65 74 29  &iHiwtr, bReset)
12240 3b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e  ;.      raw_prin
12250 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22 4c  tf(pArg->out, "L
12260 6f 6f 6b 61 73 69 64 65 20 66 61 69 6c 75 72 65  ookaside failure
12270 73 20 64 75 65 20 74 6f 20 4f 4f 4d 3a 20 20 20  s due to OOM:   
12280 20 20 20 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20      %d\n",.     
12290 20 20 20 20 20 20 20 20 20 69 48 69 77 74 72 29           iHiwtr)
122a0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 48 69 77  ;.    }.    iHiw
122b0 74 72 20 3d 20 69 43 75 72 20 3d 20 2d 31 3b 0a  tr = iCur = -1;.
122c0 20 20 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 73      sqlite3_db_s
122d0 74 61 74 75 73 28 64 62 2c 20 53 51 4c 49 54 45  tatus(db, SQLITE
122e0 5f 44 42 53 54 41 54 55 53 5f 43 41 43 48 45 5f  _DBSTATUS_CACHE_
122f0 55 53 45 44 2c 20 26 69 43 75 72 2c 20 26 69 48  USED, &iCur, &iH
12300 69 77 74 72 2c 20 62 52 65 73 65 74 29 3b 0a 20  iwtr, bReset);. 
12310 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 41     raw_printf(pA
12320 72 67 2d 3e 6f 75 74 2c 20 22 50 61 67 65 72 20  rg->out, "Pager 
12330 48 65 61 70 20 55 73 61 67 65 3a 20 20 20 20 20  Heap Usage:     
12340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 25                 %
12350 64 20 62 79 74 65 73 5c 6e 22 2c 0a 20 20 20 20  d bytes\n",.    
12360 20 20 20 20 20 20 20 20 69 43 75 72 29 3b 0a 20          iCur);. 
12370 20 20 20 69 48 69 77 74 72 20 3d 20 69 43 75 72     iHiwtr = iCur
12380 20 3d 20 2d 31 3b 0a 20 20 20 20 73 71 6c 69 74   = -1;.    sqlit
12390 65 33 5f 64 62 5f 73 74 61 74 75 73 28 64 62 2c  e3_db_status(db,
123a0 20 53 51 4c 49 54 45 5f 44 42 53 54 41 54 55 53   SQLITE_DBSTATUS
123b0 5f 43 41 43 48 45 5f 48 49 54 2c 20 26 69 43 75  _CACHE_HIT, &iCu
123c0 72 2c 20 26 69 48 69 77 74 72 2c 20 31 29 3b 0a  r, &iHiwtr, 1);.
123d0 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70      raw_printf(p
123e0 41 72 67 2d 3e 6f 75 74 2c 20 22 50 61 67 65 20  Arg->out, "Page 
123f0 63 61 63 68 65 20 68 69 74 73 3a 20 20 20 20 20  cache hits:     
12400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12410 25 64 5c 6e 22 2c 20 69 43 75 72 29 3b 0a 20 20  %d\n", iCur);.  
12420 20 20 69 48 69 77 74 72 20 3d 20 69 43 75 72 20    iHiwtr = iCur 
12430 3d 20 2d 31 3b 0a 20 20 20 20 73 71 6c 69 74 65  = -1;.    sqlite
12440 33 5f 64 62 5f 73 74 61 74 75 73 28 64 62 2c 20  3_db_status(db, 
12450 53 51 4c 49 54 45 5f 44 42 53 54 41 54 55 53 5f  SQLITE_DBSTATUS_
12460 43 41 43 48 45 5f 4d 49 53 53 2c 20 26 69 43 75  CACHE_MISS, &iCu
12470 72 2c 20 26 69 48 69 77 74 72 2c 20 31 29 3b 0a  r, &iHiwtr, 1);.
12480 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70      raw_printf(p
12490 41 72 67 2d 3e 6f 75 74 2c 20 22 50 61 67 65 20  Arg->out, "Page 
124a0 63 61 63 68 65 20 6d 69 73 73 65 73 3a 20 20 20  cache misses:   
124b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
124c0 25 64 5c 6e 22 2c 20 69 43 75 72 29 3b 0a 20 20  %d\n", iCur);.  
124d0 20 20 69 48 69 77 74 72 20 3d 20 69 43 75 72 20    iHiwtr = iCur 
124e0 3d 20 2d 31 3b 0a 20 20 20 20 73 71 6c 69 74 65  = -1;.    sqlite
124f0 33 5f 64 62 5f 73 74 61 74 75 73 28 64 62 2c 20  3_db_status(db, 
12500 53 51 4c 49 54 45 5f 44 42 53 54 41 54 55 53 5f  SQLITE_DBSTATUS_
12510 43 41 43 48 45 5f 57 52 49 54 45 2c 20 26 69 43  CACHE_WRITE, &iC
12520 75 72 2c 20 26 69 48 69 77 74 72 2c 20 31 29 3b  ur, &iHiwtr, 1);
12530 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28  .    raw_printf(
12540 70 41 72 67 2d 3e 6f 75 74 2c 20 22 50 61 67 65  pArg->out, "Page
12550 20 63 61 63 68 65 20 77 72 69 74 65 73 3a 20 20   cache writes:  
12560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12570 20 25 64 5c 6e 22 2c 20 69 43 75 72 29 3b 0a 20   %d\n", iCur);. 
12580 20 20 20 69 48 69 77 74 72 20 3d 20 69 43 75 72     iHiwtr = iCur
12590 20 3d 20 2d 31 3b 0a 20 20 20 20 73 71 6c 69 74   = -1;.    sqlit
125a0 65 33 5f 64 62 5f 73 74 61 74 75 73 28 64 62 2c  e3_db_status(db,
125b0 20 53 51 4c 49 54 45 5f 44 42 53 54 41 54 55 53   SQLITE_DBSTATUS
125c0 5f 43 41 43 48 45 5f 53 50 49 4c 4c 2c 20 26 69  _CACHE_SPILL, &i
125d0 43 75 72 2c 20 26 69 48 69 77 74 72 2c 20 31 29  Cur, &iHiwtr, 1)
125e0 3b 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66  ;.    raw_printf
125f0 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22 50 61 67  (pArg->out, "Pag
12600 65 20 63 61 63 68 65 20 73 70 69 6c 6c 73 3a 20  e cache spills: 
12610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12620 20 20 25 64 5c 6e 22 2c 20 69 43 75 72 29 3b 0a    %d\n", iCur);.
12630 20 20 20 20 69 48 69 77 74 72 20 3d 20 69 43 75      iHiwtr = iCu
12640 72 20 3d 20 2d 31 3b 0a 20 20 20 20 73 71 6c 69  r = -1;.    sqli
12650 74 65 33 5f 64 62 5f 73 74 61 74 75 73 28 64 62  te3_db_status(db
12660 2c 20 53 51 4c 49 54 45 5f 44 42 53 54 41 54 55  , SQLITE_DBSTATU
12670 53 5f 53 43 48 45 4d 41 5f 55 53 45 44 2c 20 26  S_SCHEMA_USED, &
12680 69 43 75 72 2c 20 26 69 48 69 77 74 72 2c 20 62  iCur, &iHiwtr, b
12690 52 65 73 65 74 29 3b 0a 20 20 20 20 72 61 77 5f  Reset);.    raw_
126a0 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74  printf(pArg->out
126b0 2c 20 22 53 63 68 65 6d 61 20 48 65 61 70 20 55  , "Schema Heap U
126c0 73 61 67 65 3a 20 20 20 20 20 20 20 20 20 20 20  sage:           
126d0 20 20 20 20 20 20 20 20 25 64 20 62 79 74 65 73          %d bytes
126e0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
126f0 20 69 43 75 72 29 3b 0a 20 20 20 20 69 48 69 77   iCur);.    iHiw
12700 74 72 20 3d 20 69 43 75 72 20 3d 20 2d 31 3b 0a  tr = iCur = -1;.
12710 20 20 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 73      sqlite3_db_s
12720 74 61 74 75 73 28 64 62 2c 20 53 51 4c 49 54 45  tatus(db, SQLITE
12730 5f 44 42 53 54 41 54 55 53 5f 53 54 4d 54 5f 55  _DBSTATUS_STMT_U
12740 53 45 44 2c 20 26 69 43 75 72 2c 20 26 69 48 69  SED, &iCur, &iHi
12750 77 74 72 2c 20 62 52 65 73 65 74 29 3b 0a 20 20  wtr, bReset);.  
12760 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 41 72    raw_printf(pAr
12770 67 2d 3e 6f 75 74 2c 20 22 53 74 61 74 65 6d 65  g->out, "Stateme
12780 6e 74 20 48 65 61 70 2f 4c 6f 6f 6b 61 73 69 64  nt Heap/Lookasid
12790 65 20 55 73 61 67 65 3a 20 20 20 20 20 20 25 64  e Usage:      %d
127a0 20 62 79 74 65 73 5c 6e 22 2c 0a 20 20 20 20 20   bytes\n",.     
127b0 20 20 20 20 20 20 20 69 43 75 72 29 3b 0a 20 20         iCur);.  
127c0 7d 0a 0a 20 20 69 66 28 20 70 41 72 67 2d 3e 70  }..  if( pArg->p
127d0 53 74 6d 74 20 29 7b 0a 20 20 20 20 69 43 75 72  Stmt ){.    iCur
127e0 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f   = sqlite3_stmt_
127f0 73 74 61 74 75 73 28 70 41 72 67 2d 3e 70 53 74  status(pArg->pSt
12800 6d 74 2c 20 53 51 4c 49 54 45 5f 53 54 4d 54 53  mt, SQLITE_STMTS
12810 54 41 54 55 53 5f 46 55 4c 4c 53 43 41 4e 5f 53  TATUS_FULLSCAN_S
12820 54 45 50 2c 0a 20 20 20 20 20 20 20 20 20 20 20  TEP,.           
12830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12840 20 20 20 20 62 52 65 73 65 74 29 3b 0a 20 20 20      bReset);.   
12850 20 72 61 77 5f 70 72 69 6e 74 66 28 70 41 72 67   raw_printf(pArg
12860 2d 3e 6f 75 74 2c 20 22 46 75 6c 6c 73 63 61 6e  ->out, "Fullscan
12870 20 53 74 65 70 73 3a 20 20 20 20 20 20 20 20 20   Steps:         
12880 20 20 20 20 20 20 20 20 20 20 20 20 20 25 64 5c               %d\
12890 6e 22 2c 20 69 43 75 72 29 3b 0a 20 20 20 20 69  n", iCur);.    i
128a0 43 75 72 20 3d 20 73 71 6c 69 74 65 33 5f 73 74  Cur = sqlite3_st
128b0 6d 74 5f 73 74 61 74 75 73 28 70 41 72 67 2d 3e  mt_status(pArg->
128c0 70 53 74 6d 74 2c 20 53 51 4c 49 54 45 5f 53 54  pStmt, SQLITE_ST
128d0 4d 54 53 54 41 54 55 53 5f 53 4f 52 54 2c 20 62  MTSTATUS_SORT, b
128e0 52 65 73 65 74 29 3b 0a 20 20 20 20 72 61 77 5f  Reset);.    raw_
128f0 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74  printf(pArg->out
12900 2c 20 22 53 6f 72 74 20 4f 70 65 72 61 74 69 6f  , "Sort Operatio
12910 6e 73 3a 20 20 20 20 20 20 20 20 20 20 20 20 20  ns:             
12920 20 20 20 20 20 20 20 20 25 64 5c 6e 22 2c 20 69          %d\n", i
12930 43 75 72 29 3b 0a 20 20 20 20 69 43 75 72 20 3d  Cur);.    iCur =
12940 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 74   sqlite3_stmt_st
12950 61 74 75 73 28 70 41 72 67 2d 3e 70 53 74 6d 74  atus(pArg->pStmt
12960 2c 20 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41  , SQLITE_STMTSTA
12970 54 55 53 5f 41 55 54 4f 49 4e 44 45 58 2c 62 52  TUS_AUTOINDEX,bR
12980 65 73 65 74 29 3b 0a 20 20 20 20 72 61 77 5f 70  eset);.    raw_p
12990 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c  rintf(pArg->out,
129a0 20 22 41 75 74 6f 69 6e 64 65 78 20 49 6e 73 65   "Autoindex Inse
129b0 72 74 73 3a 20 20 20 20 20 20 20 20 20 20 20 20  rts:            
129c0 20 20 20 20 20 20 20 25 64 5c 6e 22 2c 20 69 43         %d\n", iC
129d0 75 72 29 3b 0a 20 20 20 20 69 43 75 72 20 3d 20  ur);.    iCur = 
129e0 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 74 61  sqlite3_stmt_sta
129f0 74 75 73 28 70 41 72 67 2d 3e 70 53 74 6d 74 2c  tus(pArg->pStmt,
12a00 20 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54   SQLITE_STMTSTAT
12a10 55 53 5f 56 4d 5f 53 54 45 50 2c 20 62 52 65 73  US_VM_STEP, bRes
12a20 65 74 29 3b 0a 20 20 20 20 72 61 77 5f 70 72 69  et);.    raw_pri
12a30 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22  ntf(pArg->out, "
12a40 56 69 72 74 75 61 6c 20 4d 61 63 68 69 6e 65 20  Virtual Machine 
12a50 53 74 65 70 73 3a 20 20 20 20 20 20 20 20 20 20  Steps:          
12a60 20 20 20 20 20 25 64 5c 6e 22 2c 20 69 43 75 72       %d\n", iCur
12a70 29 3b 0a 20 20 20 20 69 43 75 72 20 3d 20 73 71  );.    iCur = sq
12a80 6c 69 74 65 33 5f 73 74 6d 74 5f 73 74 61 74 75  lite3_stmt_statu
12a90 73 28 70 41 72 67 2d 3e 70 53 74 6d 74 2c 20 53  s(pArg->pStmt, S
12aa0 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53  QLITE_STMTSTATUS
12ab0 5f 52 45 50 52 45 50 41 52 45 2c 20 62 52 65 73  _REPREPARE, bRes
12ac0 65 74 29 3b 0a 20 20 20 20 72 61 77 5f 70 72 69  et);.    raw_pri
12ad0 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22  ntf(pArg->out, "
12ae0 52 65 70 72 65 70 61 72 65 20 6f 70 65 72 61 74  Reprepare operat
12af0 69 6f 6e 73 3a 20 20 20 20 20 20 20 20 20 20 20  ions:           
12b00 20 20 20 20 20 25 64 5c 6e 22 2c 20 69 43 75 72       %d\n", iCur
12b10 29 3b 0a 20 20 20 20 69 43 75 72 20 3d 20 73 71  );.    iCur = sq
12b20 6c 69 74 65 33 5f 73 74 6d 74 5f 73 74 61 74 75  lite3_stmt_statu
12b30 73 28 70 41 72 67 2d 3e 70 53 74 6d 74 2c 20 53  s(pArg->pStmt, S
12b40 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53  QLITE_STMTSTATUS
12b50 5f 52 55 4e 2c 20 62 52 65 73 65 74 29 3b 0a 20  _RUN, bReset);. 
12b60 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 41     raw_printf(pA
12b70 72 67 2d 3e 6f 75 74 2c 20 22 4e 75 6d 62 65 72  rg->out, "Number
12b80 20 6f 66 20 74 69 6d 65 73 20 72 75 6e 3a 20 20   of times run:  
12b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 25                 %
12ba0 64 5c 6e 22 2c 20 69 43 75 72 29 3b 0a 20 20 20  d\n", iCur);.   
12bb0 20 69 43 75 72 20 3d 20 73 71 6c 69 74 65 33 5f   iCur = sqlite3_
12bc0 73 74 6d 74 5f 73 74 61 74 75 73 28 70 41 72 67  stmt_status(pArg
12bd0 2d 3e 70 53 74 6d 74 2c 20 53 51 4c 49 54 45 5f  ->pStmt, SQLITE_
12be0 53 54 4d 54 53 54 41 54 55 53 5f 4d 45 4d 55 53  STMTSTATUS_MEMUS
12bf0 45 44 2c 20 62 52 65 73 65 74 29 3b 0a 20 20 20  ED, bReset);.   
12c00 20 72 61 77 5f 70 72 69 6e 74 66 28 70 41 72 67   raw_printf(pArg
12c10 2d 3e 6f 75 74 2c 20 22 4d 65 6d 6f 72 79 20 75  ->out, "Memory u
12c20 73 65 64 20 62 79 20 70 72 65 70 61 72 65 64 20  sed by prepared 
12c30 73 74 6d 74 3a 20 20 20 20 20 20 20 20 25 64 5c  stmt:        %d\
12c40 6e 22 2c 20 69 43 75 72 29 3b 0a 20 20 7d 0a 0a  n", iCur);.  }..
12c50 23 69 66 64 65 66 20 5f 5f 6c 69 6e 75 78 5f 5f  #ifdef __linux__
12c60 0a 20 20 64 69 73 70 6c 61 79 4c 69 6e 75 78 49  .  displayLinuxI
12c70 6f 53 74 61 74 73 28 70 41 72 67 2d 3e 6f 75 74  oStats(pArg->out
12c80 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20  );.#endif..  /* 
12c90 44 6f 20 6e 6f 74 20 72 65 6d 6f 76 65 20 74 68  Do not remove th
12ca0 69 73 20 6d 61 63 68 69 6e 65 20 72 65 61 64 61  is machine reada
12cb0 62 6c 65 20 63 6f 6d 6d 65 6e 74 3a 20 65 78 74  ble comment: ext
12cc0 72 61 2d 73 74 61 74 73 2d 6f 75 74 70 75 74 2d  ra-stats-output-
12cd0 68 65 72 65 20 2a 2f 0a 0a 20 20 72 65 74 75 72  here */..  retur
12ce0 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69  n 0;.}../*.** Di
12cf0 73 70 6c 61 79 20 73 63 61 6e 20 73 74 61 74 73  splay scan stats
12d00 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
12d10 20 64 69 73 70 6c 61 79 5f 73 63 61 6e 73 74 61   display_scansta
12d20 74 73 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  ts(.  sqlite3 *d
12d30 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b,              
12d40 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
12d50 65 20 74 6f 20 71 75 65 72 79 20 2a 2f 0a 20 20  e to query */.  
12d60 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 41 72 67  ShellState *pArg
12d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12d80 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 53 68  /* Pointer to Sh
12d90 65 6c 6c 53 74 61 74 65 20 2a 2f 0a 29 7b 0a 23  ellState */.){.#
12da0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  ifndef SQLITE_EN
12db0 41 42 4c 45 5f 53 54 4d 54 5f 53 43 41 4e 53 54  ABLE_STMT_SCANST
12dc0 41 54 55 53 0a 20 20 55 4e 55 53 45 44 5f 50 41  ATUS.  UNUSED_PA
12dd0 52 41 4d 45 54 45 52 28 64 62 29 3b 0a 20 20 55  RAMETER(db);.  U
12de0 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
12df0 70 41 72 67 29 3b 0a 23 65 6c 73 65 0a 20 20 69  pArg);.#else.  i
12e00 6e 74 20 69 2c 20 6b 2c 20 6e 2c 20 6d 78 3b 0a  nt i, k, n, mx;.
12e10 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 41 72    raw_printf(pAr
12e20 67 2d 3e 6f 75 74 2c 20 22 2d 2d 2d 2d 2d 2d 2d  g->out, "-------
12e30 2d 20 73 63 61 6e 73 74 61 74 73 20 2d 2d 2d 2d  - scanstats ----
12e40 2d 2d 2d 2d 5c 6e 22 29 3b 0a 20 20 6d 78 20 3d  ----\n");.  mx =
12e50 20 30 3b 0a 20 20 66 6f 72 28 6b 3d 30 3b 20 6b   0;.  for(k=0; k
12e60 3c 3d 6d 78 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20  <=mx; k++){.    
12e70 64 6f 75 62 6c 65 20 72 45 73 74 4c 6f 6f 70 20  double rEstLoop 
12e80 3d 20 31 2e 30 3b 0a 20 20 20 20 66 6f 72 28 69  = 1.0;.    for(i
12e90 3d 6e 3d 30 3b 20 31 3b 20 69 2b 2b 29 7b 0a 20  =n=0; 1; i++){. 
12ea0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d       sqlite3_stm
12eb0 74 20 2a 70 20 3d 20 70 41 72 67 2d 3e 70 53 74  t *p = pArg->pSt
12ec0 6d 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  mt;.      sqlite
12ed0 33 5f 69 6e 74 36 34 20 6e 4c 6f 6f 70 2c 20 6e  3_int64 nLoop, n
12ee0 56 69 73 69 74 3b 0a 20 20 20 20 20 20 64 6f 75  Visit;.      dou
12ef0 62 6c 65 20 72 45 73 74 3b 0a 20 20 20 20 20 20  ble rEst;.      
12f00 69 6e 74 20 69 53 69 64 3b 0a 20 20 20 20 20 20  int iSid;.      
12f10 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 78 70  const char *zExp
12f20 6c 61 69 6e 3b 0a 20 20 20 20 20 20 69 66 28 20  lain;.      if( 
12f30 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 63 61  sqlite3_stmt_sca
12f40 6e 73 74 61 74 75 73 28 70 2c 20 69 2c 20 53 51  nstatus(p, i, SQ
12f50 4c 49 54 45 5f 53 43 41 4e 53 54 41 54 5f 4e 4c  LITE_SCANSTAT_NL
12f60 4f 4f 50 2c 20 28 76 6f 69 64 2a 29 26 6e 4c 6f  OOP, (void*)&nLo
12f70 6f 70 29 20 29 7b 0a 20 20 20 20 20 20 20 20 62  op) ){.        b
12f80 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
12f90 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74      sqlite3_stmt
12fa0 5f 73 63 61 6e 73 74 61 74 75 73 28 70 2c 20 69  _scanstatus(p, i
12fb0 2c 20 53 51 4c 49 54 45 5f 53 43 41 4e 53 54 41  , SQLITE_SCANSTA
12fc0 54 5f 53 45 4c 45 43 54 49 44 2c 20 28 76 6f 69  T_SELECTID, (voi
12fd0 64 2a 29 26 69 53 69 64 29 3b 0a 20 20 20 20 20  d*)&iSid);.     
12fe0 20 69 66 28 20 69 53 69 64 3e 6d 78 20 29 20 6d   if( iSid>mx ) m
12ff0 78 20 3d 20 69 53 69 64 3b 0a 20 20 20 20 20 20  x = iSid;.      
13000 69 66 28 20 69 53 69 64 21 3d 6b 20 29 20 63 6f  if( iSid!=k ) co
13010 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66  ntinue;.      if
13020 28 20 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ( n==0 ){.      
13030 20 20 72 45 73 74 4c 6f 6f 70 20 3d 20 28 64 6f    rEstLoop = (do
13040 75 62 6c 65 29 6e 4c 6f 6f 70 3b 0a 20 20 20 20  uble)nLoop;.    
13050 20 20 20 20 69 66 28 20 6b 3e 30 20 29 20 72 61      if( k>0 ) ra
13060 77 5f 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f  w_printf(pArg->o
13070 75 74 2c 20 22 2d 2d 2d 2d 2d 2d 2d 2d 20 73 75  ut, "-------- su
13080 62 71 75 65 72 79 20 25 64 20 2d 2d 2d 2d 2d 2d  bquery %d ------
13090 2d 5c 6e 22 2c 20 6b 29 3b 0a 20 20 20 20 20 20  -\n", k);.      
130a0 7d 0a 20 20 20 20 20 20 6e 2b 2b 3b 0a 20 20 20  }.      n++;.   
130b0 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f     sqlite3_stmt_
130c0 73 63 61 6e 73 74 61 74 75 73 28 70 2c 20 69 2c  scanstatus(p, i,
130d0 20 53 51 4c 49 54 45 5f 53 43 41 4e 53 54 41 54   SQLITE_SCANSTAT
130e0 5f 4e 56 49 53 49 54 2c 20 28 76 6f 69 64 2a 29  _NVISIT, (void*)
130f0 26 6e 56 69 73 69 74 29 3b 0a 20 20 20 20 20 20  &nVisit);.      
13100 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 63 61  sqlite3_stmt_sca
13110 6e 73 74 61 74 75 73 28 70 2c 20 69 2c 20 53 51  nstatus(p, i, SQ
13120 4c 49 54 45 5f 53 43 41 4e 53 54 41 54 5f 45 53  LITE_SCANSTAT_ES
13130 54 2c 20 28 76 6f 69 64 2a 29 26 72 45 73 74 29  T, (void*)&rEst)
13140 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
13150 73 74 6d 74 5f 73 63 61 6e 73 74 61 74 75 73 28  stmt_scanstatus(
13160 70 2c 20 69 2c 20 53 51 4c 49 54 45 5f 53 43 41  p, i, SQLITE_SCA
13170 4e 53 54 41 54 5f 45 58 50 4c 41 49 4e 2c 20 28  NSTAT_EXPLAIN, (
13180 76 6f 69 64 2a 29 26 7a 45 78 70 6c 61 69 6e 29  void*)&zExplain)
13190 3b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69  ;.      utf8_pri
131a0 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22  ntf(pArg->out, "
131b0 4c 6f 6f 70 20 25 32 64 3a 20 25 73 5c 6e 22 2c  Loop %2d: %s\n",
131c0 20 6e 2c 20 7a 45 78 70 6c 61 69 6e 29 3b 0a 20   n, zExplain);. 
131d0 20 20 20 20 20 72 45 73 74 4c 6f 6f 70 20 2a 3d       rEstLoop *=
131e0 20 72 45 73 74 3b 0a 20 20 20 20 20 20 72 61 77   rEst;.      raw
131f0 5f 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75  _printf(pArg->ou
13200 74 2c 0a 20 20 20 20 20 20 20 20 20 20 22 20 20  t,.          "  
13210 20 20 20 20 20 20 20 6e 4c 6f 6f 70 3d 25 2d 38         nLoop=%-8
13220 6c 6c 64 20 6e 52 6f 77 3d 25 2d 38 6c 6c 64 20  lld nRow=%-8lld 
13230 65 73 74 52 6f 77 3d 25 2d 38 6c 6c 64 20 65 73  estRow=%-8lld es
13240 74 52 6f 77 2f 4c 6f 6f 70 3d 25 2d 38 67 5c 6e  tRow/Loop=%-8g\n
13250 22 2c 0a 20 20 20 20 20 20 20 20 20 20 6e 4c 6f  ",.          nLo
13260 6f 70 2c 20 6e 56 69 73 69 74 2c 20 28 73 71 6c  op, nVisit, (sql
13270 69 74 65 33 5f 69 6e 74 36 34 29 28 72 45 73 74  ite3_int64)(rEst
13280 4c 6f 6f 70 2b 30 2e 35 29 2c 20 72 45 73 74 0a  Loop+0.5), rEst.
13290 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20        );.    }. 
132a0 20 7d 0a 20 20 72 61 77 5f 70 72 69 6e 74 66 28   }.  raw_printf(
132b0 70 41 72 67 2d 3e 6f 75 74 2c 20 22 2d 2d 2d 2d  pArg->out, "----
132c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
132d0 2d 2d 2d 2d 2d 2d 2d 5c 6e 22 29 3b 0a 23 65 6e  -------\n");.#en
132e0 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72  dif.}../*.** Par
132f0 61 6d 65 74 65 72 20 61 7a 41 72 72 61 79 20 70  ameter azArray p
13300 6f 69 6e 74 73 20 74 6f 20 61 20 7a 65 72 6f 2d  oints to a zero-
13310 74 65 72 6d 69 6e 61 74 65 64 20 61 72 72 61 79  terminated array
13320 20 6f 66 20 73 74 72 69 6e 67 73 2e 20 7a 53 74   of strings. zSt
13330 72 0a 2a 2a 20 70 6f 69 6e 74 73 20 74 6f 20 61  r.** points to a
13340 20 73 69 6e 67 6c 65 20 6e 75 6c 2d 74 65 72 6d   single nul-term
13350 69 6e 61 74 65 64 20 73 74 72 69 6e 67 2e 20 52  inated string. R
13360 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69  eturn non-zero i
13370 66 20 7a 53 74 72 0a 2a 2a 20 69 73 20 65 71 75  f zStr.** is equ
13380 61 6c 2c 20 61 63 63 6f 72 64 69 6e 67 20 74 6f  al, according to
13390 20 73 74 72 63 6d 70 28 29 2c 20 74 6f 20 61 6e   strcmp(), to an
133a0 79 20 6f 66 20 74 68 65 20 73 74 72 69 6e 67 73  y of the strings
133b0 20 69 6e 20 74 68 65 20 61 72 72 61 79 2e 0a 2a   in the array..*
133c0 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65 74  * Otherwise, ret
133d0 75 72 6e 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61  urn zero..*/.sta
133e0 74 69 63 20 69 6e 74 20 73 74 72 5f 69 6e 5f 61  tic int str_in_a
133f0 72 72 61 79 28 63 6f 6e 73 74 20 63 68 61 72 20  rray(const char 
13400 2a 7a 53 74 72 2c 20 63 6f 6e 73 74 20 63 68 61  *zStr, const cha
13410 72 20 2a 2a 61 7a 41 72 72 61 79 29 7b 0a 20 20  r **azArray){.  
13420 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30  int i;.  for(i=0
13430 3b 20 61 7a 41 72 72 61 79 5b 69 5d 3b 20 69 2b  ; azArray[i]; i+
13440 2b 29 7b 0a 20 20 20 20 69 66 28 20 30 3d 3d 73  +){.    if( 0==s
13450 74 72 63 6d 70 28 7a 53 74 72 2c 20 61 7a 41 72  trcmp(zStr, azAr
13460 72 61 79 5b 69 5d 29 20 29 20 72 65 74 75 72 6e  ray[i]) ) return
13470 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   1;.  }.  return
13480 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20   0;.}../*.** If 
13490 63 6f 6d 70 69 6c 65 64 20 73 74 61 74 65 6d 65  compiled stateme
134a0 6e 74 20 70 53 71 6c 20 61 70 70 65 61 72 73 20  nt pSql appears 
134b0 74 6f 20 62 65 20 61 6e 20 45 58 50 4c 41 49 4e  to be an EXPLAIN
134c0 20 73 74 61 74 65 6d 65 6e 74 2c 20 61 6c 6c 6f   statement, allo
134d0 63 61 74 65 0a 2a 2a 20 61 6e 64 20 70 6f 70 75  cate.** and popu
134e0 6c 61 74 65 20 74 68 65 20 53 68 65 6c 6c 53 74  late the ShellSt
134f0 61 74 65 2e 61 69 49 6e 64 65 6e 74 5b 5d 20 61  ate.aiIndent[] a
13500 72 72 61 79 20 77 69 74 68 20 74 68 65 20 6e 75  rray with the nu
13510 6d 62 65 72 20 6f 66 0a 2a 2a 20 73 70 61 63 65  mber of.** space
13520 73 20 65 61 63 68 20 6f 70 63 6f 64 65 20 73 68  s each opcode sh
13530 6f 75 6c 64 20 62 65 20 69 6e 64 65 6e 74 65 64  ould be indented
13540 20 62 65 66 6f 72 65 20 69 74 20 69 73 20 6f 75   before it is ou
13550 74 70 75 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tput..**.** The 
13560 69 6e 64 65 6e 74 69 6e 67 20 72 75 6c 65 73 20  indenting rules 
13570 61 72 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a  are:.**.**     *
13580 20 46 6f 72 20 65 61 63 68 20 22 4e 65 78 74 22   For each "Next"
13590 2c 20 22 50 72 65 76 22 2c 20 22 56 4e 65 78 74  , "Prev", "VNext
135a0 22 20 6f 72 20 22 56 50 72 65 76 22 20 69 6e 73  " or "VPrev" ins
135b0 74 72 75 63 74 69 6f 6e 2c 20 69 6e 64 65 6e 74  truction, indent
135c0 0a 2a 2a 20 20 20 20 20 20 20 61 6c 6c 20 6f 70  .**       all op
135d0 63 6f 64 65 73 20 74 68 61 74 20 6f 63 63 75 72  codes that occur
135e0 20 62 65 74 77 65 65 6e 20 74 68 65 20 70 32 20   between the p2 
135f0 6a 75 6d 70 20 64 65 73 74 69 6e 61 74 69 6f 6e  jump destination
13600 20 61 6e 64 20 74 68 65 20 6f 70 63 6f 64 65 0a   and the opcode.
13610 2a 2a 20 20 20 20 20 20 20 69 74 73 65 6c 66 20  **       itself 
13620 62 79 20 32 20 73 70 61 63 65 73 2e 0a 2a 2a 0a  by 2 spaces..**.
13630 2a 2a 20 20 20 20 20 2a 20 46 6f 72 20 65 61 63  **     * For eac
13640 68 20 22 47 6f 74 6f 22 2c 20 69 66 20 74 68 65  h "Goto", if the
13650 20 6a 75 6d 70 20 64 65 73 74 69 6e 61 74 69 6f   jump destinatio
13660 6e 20 69 73 20 65 61 72 6c 69 65 72 20 69 6e 20  n is earlier in 
13670 74 68 65 20 70 72 6f 67 72 61 6d 0a 2a 2a 20 20  the program.**  
13680 20 20 20 20 20 61 6e 64 20 65 6e 64 73 20 6f 6e       and ends on
13690 20 6f 6e 65 20 6f 66 3a 0a 2a 2a 20 20 20 20 20   one of:.**     
136a0 20 20 20 20 20 59 69 65 6c 64 20 20 53 65 65 6b       Yield  Seek
136b0 47 74 20 20 53 65 65 6b 4c 74 20 20 52 6f 77 53  Gt  SeekLt  RowS
136c0 65 74 52 65 61 64 20 20 52 65 77 69 6e 64 0a 2a  etRead  Rewind.*
136d0 2a 20 20 20 20 20 20 20 6f 72 20 69 66 20 74 68  *       or if th
136e0 65 20 50 31 20 70 61 72 61 6d 65 74 65 72 20 69  e P1 parameter i
136f0 73 20 6f 6e 65 20 69 6e 73 74 65 61 64 20 6f 66  s one instead of
13700 20 7a 65 72 6f 2c 0a 2a 2a 20 20 20 20 20 20 20   zero,.**       
13710 74 68 65 6e 20 69 6e 64 65 6e 74 20 61 6c 6c 20  then indent all 
13720 6f 70 63 6f 64 65 73 20 62 65 74 77 65 65 6e 20  opcodes between 
13730 74 68 65 20 65 61 72 6c 69 65 72 20 69 6e 73 74  the earlier inst
13740 72 75 63 74 69 6f 6e 0a 2a 2a 20 20 20 20 20 20  ruction.**      
13750 20 61 6e 64 20 22 47 6f 74 6f 22 20 62 79 20 32   and "Goto" by 2
13760 20 73 70 61 63 65 73 2e 0a 2a 2f 0a 73 74 61 74   spaces..*/.stat
13770 69 63 20 76 6f 69 64 20 65 78 70 6c 61 69 6e 5f  ic void explain_
13780 64 61 74 61 5f 70 72 65 70 61 72 65 28 53 68 65  data_prepare(She
13790 6c 6c 53 74 61 74 65 20 2a 70 2c 20 73 71 6c 69  llState *p, sqli
137a0 74 65 33 5f 73 74 6d 74 20 2a 70 53 71 6c 29 7b  te3_stmt *pSql){
137b0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
137c0 53 71 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Sql;            
137d0 20 20 20 2f 2a 20 54 68 65 20 74 65 78 74 20 6f     /* The text o
137e0 66 20 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d  f the SQL statem
137f0 65 6e 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ent */.  const c
13800 68 61 72 20 2a 7a 3b 20 20 20 20 20 20 20 20 20  har *z;         
13810 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64           /* Used
13820 20 74 6f 20 63 68 65 63 6b 20 69 66 20 74 68 69   to check if thi
13830 73 20 69 73 20 61 6e 20 45 58 50 4c 41 49 4e 20  s is an EXPLAIN 
13840 2a 2f 0a 20 20 69 6e 74 20 2a 61 62 59 69 65 6c  */.  int *abYiel
13850 64 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  d = 0;          
13860 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
13870 6f 70 20 69 73 20 61 6e 20 4f 50 5f 59 69 65 6c  op is an OP_Yiel
13880 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 6c 6c 6f  d */.  int nAllo
13890 63 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  c = 0;          
138a0 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61         /* Alloca
138b0 74 65 64 20 73 69 7a 65 20 6f 66 20 70 2d 3e 61  ted size of p->a
138c0 69 49 6e 64 65 6e 74 5b 5d 2c 20 61 62 59 69 65  iIndent[], abYie
138d0 6c 64 20 2a 2f 0a 20 20 69 6e 74 20 69 4f 70 3b  ld */.  int iOp;
138e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
138f0 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
13900 20 6f 66 20 6f 70 65 72 61 74 69 6f 6e 20 69 6e   of operation in
13910 20 70 2d 3e 61 69 49 6e 64 65 6e 74 5b 5d 20 2a   p->aiIndent[] *
13920 2f 0a 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  /..  const char 
13930 2a 61 7a 4e 65 78 74 5b 5d 20 3d 20 7b 20 22 4e  *azNext[] = { "N
13940 65 78 74 22 2c 20 22 50 72 65 76 22 2c 20 22 56  ext", "Prev", "V
13950 50 72 65 76 22 2c 20 22 56 4e 65 78 74 22 2c 20  Prev", "VNext", 
13960 22 53 6f 72 74 65 72 4e 65 78 74 22 2c 20 30 20  "SorterNext", 0 
13970 7d 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  };.  const char 
13980 2a 61 7a 59 69 65 6c 64 5b 5d 20 3d 20 7b 20 22  *azYield[] = { "
13990 59 69 65 6c 64 22 2c 20 22 53 65 65 6b 4c 54 22  Yield", "SeekLT"
139a0 2c 20 22 53 65 65 6b 47 54 22 2c 20 22 52 6f 77  , "SeekGT", "Row
139b0 53 65 74 52 65 61 64 22 2c 0a 20 20 20 20 20 20  SetRead",.      
139c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
139d0 20 20 20 20 20 20 22 52 65 77 69 6e 64 22 2c 20        "Rewind", 
139e0 30 20 7d 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  0 };.  const cha
139f0 72 20 2a 61 7a 47 6f 74 6f 5b 5d 20 3d 20 7b 20  r *azGoto[] = { 
13a00 22 47 6f 74 6f 22 2c 20 30 20 7d 3b 0a 0a 20 20  "Goto", 0 };..  
13a10 2f 2a 20 54 72 79 20 74 6f 20 66 69 67 75 72 65  /* Try to figure
13a20 20 6f 75 74 20 69 66 20 74 68 69 73 20 69 73 20   out if this is 
13a30 72 65 61 6c 6c 79 20 61 6e 20 45 58 50 4c 41 49  really an EXPLAI
13a40 4e 20 73 74 61 74 65 6d 65 6e 74 2e 20 49 66 20  N statement. If 
13a50 74 68 69 73 0a 20 20 2a 2a 20 63 61 6e 6e 6f 74  this.  ** cannot
13a60 20 62 65 20 76 65 72 69 66 69 65 64 2c 20 72 65   be verified, re
13a70 74 75 72 6e 20 65 61 72 6c 79 2e 20 20 2a 2f 0a  turn early.  */.
13a80 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 63 6f    if( sqlite3_co
13a90 6c 75 6d 6e 5f 63 6f 75 6e 74 28 70 53 71 6c 29  lumn_count(pSql)
13aa0 21 3d 38 20 29 7b 0a 20 20 20 20 70 2d 3e 63 4d  !=8 ){.    p->cM
13ab0 6f 64 65 20 3d 20 70 2d 3e 6d 6f 64 65 3b 0a 20  ode = p->mode;. 
13ac0 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
13ad0 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f   zSql = sqlite3_
13ae0 73 71 6c 28 70 53 71 6c 29 3b 0a 20 20 69 66 28  sql(pSql);.  if(
13af0 20 7a 53 71 6c 3d 3d 30 20 29 20 72 65 74 75 72   zSql==0 ) retur
13b00 6e 3b 0a 20 20 66 6f 72 28 7a 3d 7a 53 71 6c 3b  n;.  for(z=zSql;
13b10 20 2a 7a 3d 3d 27 20 27 20 7c 7c 20 2a 7a 3d 3d   *z==' ' || *z==
13b20 27 5c 74 27 20 7c 7c 20 2a 7a 3d 3d 27 5c 6e 27  '\t' || *z=='\n'
13b30 20 7c 7c 20 2a 7a 3d 3d 27 5c 66 27 20 7c 7c 20   || *z=='\f' || 
13b40 2a 7a 3d 3d 27 5c 72 27 3b 20 7a 2b 2b 29 3b 0a  *z=='\r'; z++);.
13b50 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74    if( sqlite3_st
13b60 72 6e 69 63 6d 70 28 7a 2c 20 22 65 78 70 6c 61  rnicmp(z, "expla
13b70 69 6e 22 2c 20 37 29 20 29 7b 0a 20 20 20 20 70  in", 7) ){.    p
13b80 2d 3e 63 4d 6f 64 65 20 3d 20 70 2d 3e 6d 6f 64  ->cMode = p->mod
13b90 65 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  e;.    return;. 
13ba0 20 7d 0a 0a 20 20 66 6f 72 28 69 4f 70 3d 30 3b   }..  for(iOp=0;
13bb0 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c   SQLITE_ROW==sql
13bc0 69 74 65 33 5f 73 74 65 70 28 70 53 71 6c 29 3b  ite3_step(pSql);
13bd0 20 69 4f 70 2b 2b 29 7b 0a 20 20 20 20 69 6e 74   iOp++){.    int
13be0 20 69 3b 0a 20 20 20 20 69 6e 74 20 69 41 64 64   i;.    int iAdd
13bf0 72 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  r = sqlite3_colu
13c00 6d 6e 5f 69 6e 74 28 70 53 71 6c 2c 20 30 29 3b  mn_int(pSql, 0);
13c10 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
13c20 2a 7a 4f 70 20 3d 20 28 63 6f 6e 73 74 20 63 68  *zOp = (const ch
13c30 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75  ar*)sqlite3_colu
13c40 6d 6e 5f 74 65 78 74 28 70 53 71 6c 2c 20 31 29  mn_text(pSql, 1)
13c50 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 70 32  ;..    /* Set p2
13c60 20 74 6f 20 74 68 65 20 50 32 20 66 69 65 6c 64   to the P2 field
13c70 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   of the current 
13c80 6f 70 63 6f 64 65 2e 20 54 68 65 6e 2c 20 61 73  opcode. Then, as
13c90 73 75 6d 69 6e 67 20 74 68 61 74 0a 20 20 20 20  suming that.    
13ca0 2a 2a 20 70 32 20 69 73 20 61 6e 20 69 6e 73 74  ** p2 is an inst
13cb0 72 75 63 74 69 6f 6e 20 61 64 64 72 65 73 73 2c  ruction address,
13cc0 20 73 65 74 20 76 61 72 69 61 62 6c 65 20 70 32   set variable p2
13cd0 6f 70 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20  op to the index 
13ce0 6f 66 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 69  of that.    ** i
13cf0 6e 73 74 72 75 63 74 69 6f 6e 20 69 6e 20 74 68  nstruction in th
13d00 65 20 61 69 49 6e 64 65 6e 74 5b 5d 20 61 72 72  e aiIndent[] arr
13d10 61 79 2e 20 70 32 20 61 6e 64 20 70 32 6f 70 20  ay. p2 and p2op 
13d20 6d 61 79 20 62 65 20 64 69 66 66 65 72 65 6e 74  may be different
13d30 20 69 66 0a 20 20 20 20 2a 2a 20 74 68 65 20 63   if.    ** the c
13d40 75 72 72 65 6e 74 20 69 6e 73 74 72 75 63 74 69  urrent instructi
13d50 6f 6e 20 69 73 20 70 61 72 74 20 6f 66 20 61 20  on is part of a 
13d60 73 75 62 2d 70 72 6f 67 72 61 6d 20 67 65 6e 65  sub-program gene
13d70 72 61 74 65 64 20 62 79 20 61 6e 0a 20 20 20 20  rated by an.    
13d80 2a 2a 20 53 51 4c 20 74 72 69 67 67 65 72 20 6f  ** SQL trigger o
13d90 72 20 66 6f 72 65 69 67 6e 20 6b 65 79 2e 20 20  r foreign key.  
13da0 2a 2f 0a 20 20 20 20 69 6e 74 20 70 32 20 3d 20  */.    int p2 = 
13db0 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69  sqlite3_column_i
13dc0 6e 74 28 70 53 71 6c 2c 20 33 29 3b 0a 20 20 20  nt(pSql, 3);.   
13dd0 20 69 6e 74 20 70 32 6f 70 20 3d 20 28 70 32 20   int p2op = (p2 
13de0 2b 20 28 69 4f 70 2d 69 41 64 64 72 29 29 3b 0a  + (iOp-iAddr));.
13df0 0a 20 20 20 20 2f 2a 20 47 72 6f 77 20 74 68 65  .    /* Grow the
13e00 20 70 2d 3e 61 69 49 6e 64 65 6e 74 20 61 72 72   p->aiIndent arr
13e10 61 79 20 61 73 20 72 65 71 75 69 72 65 64 20 2a  ay as required *
13e20 2f 0a 20 20 20 20 69 66 28 20 69 4f 70 3e 3d 6e  /.    if( iOp>=n
13e30 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 20 20 69  Alloc ){.      i
13e40 66 28 20 69 4f 70 3d 3d 30 20 29 7b 0a 20 20 20  f( iOp==0 ){.   
13e50 20 20 20 20 20 2f 2a 20 44 6f 20 66 75 72 74 68       /* Do furth
13e60 65 72 20 76 65 72 66 69 63 61 74 69 6f 6e 20 74  er verfication t
13e70 68 61 74 20 74 68 69 73 20 69 73 20 65 78 70 6c  hat this is expl
13e80 61 69 6e 20 6f 75 74 70 75 74 2e 20 20 41 62 6f  ain output.  Abo
13e90 72 74 20 69 66 0a 20 20 20 20 20 20 20 20 2a 2a  rt if.        **
13ea0 20 69 74 20 69 73 20 6e 6f 74 20 2a 2f 0a 20 20   it is not */.  
13eb0 20 20 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e        static con
13ec0 73 74 20 63 68 61 72 20 2a 65 78 70 6c 61 69 6e  st char *explain
13ed0 43 6f 6c 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 20  Cols[] = {.     
13ee0 20 20 20 20 20 20 22 61 64 64 72 22 2c 20 22 6f        "addr", "o
13ef0 70 63 6f 64 65 22 2c 20 22 70 31 22 2c 20 22 70  pcode", "p1", "p
13f00 32 22 2c 20 22 70 33 22 2c 20 22 70 34 22 2c 20  2", "p3", "p4", 
13f10 22 70 35 22 2c 20 22 63 6f 6d 6d 65 6e 74 22 20  "p5", "comment" 
13f20 7d 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6a  };.        int j
13f30 6a 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a  j;.        for(j
13f40 6a 3d 30 3b 20 6a 6a 3c 41 72 72 61 79 53 69 7a  j=0; jj<ArraySiz
13f50 65 28 65 78 70 6c 61 69 6e 43 6f 6c 73 29 3b 20  e(explainCols); 
13f60 6a 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20  jj++){.         
13f70 20 69 66 28 20 73 74 72 63 6d 70 28 73 71 6c 69   if( strcmp(sqli
13f80 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 28  te3_column_name(
13f90 70 53 71 6c 2c 6a 6a 29 2c 65 78 70 6c 61 69 6e  pSql,jj),explain
13fa0 43 6f 6c 73 5b 6a 6a 5d 29 21 3d 30 20 29 7b 0a  Cols[jj])!=0 ){.
13fb0 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 63              p->c
13fc0 4d 6f 64 65 20 3d 20 70 2d 3e 6d 6f 64 65 3b 0a  Mode = p->mode;.
13fd0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
13fe0 74 65 33 5f 72 65 73 65 74 28 70 53 71 6c 29 3b  te3_reset(pSql);
13ff0 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74  .            ret
14000 75 72 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  urn;.          }
14010 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
14020 20 7d 0a 20 20 20 20 20 20 6e 41 6c 6c 6f 63 20   }.      nAlloc 
14030 2b 3d 20 31 30 30 3b 0a 20 20 20 20 20 20 70 2d  += 100;.      p-
14040 3e 61 69 49 6e 64 65 6e 74 20 3d 20 28 69 6e 74  >aiIndent = (int
14050 2a 29 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f  *)sqlite3_reallo
14060 63 36 34 28 70 2d 3e 61 69 49 6e 64 65 6e 74 2c  c64(p->aiIndent,
14070 20 6e 41 6c 6c 6f 63 2a 73 69 7a 65 6f 66 28 69   nAlloc*sizeof(i
14080 6e 74 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20  nt));.      if( 
14090 70 2d 3e 61 69 49 6e 64 65 6e 74 3d 3d 30 20 29  p->aiIndent==0 )
140a0 20 73 68 65 6c 6c 5f 6f 75 74 5f 6f 66 5f 6d 65   shell_out_of_me
140b0 6d 6f 72 79 28 29 3b 0a 20 20 20 20 20 20 61 62  mory();.      ab
140c0 59 69 65 6c 64 20 3d 20 28 69 6e 74 2a 29 73 71  Yield = (int*)sq
140d0 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 36 34 28  lite3_realloc64(
140e0 61 62 59 69 65 6c 64 2c 20 6e 41 6c 6c 6f 63 2a  abYield, nAlloc*
140f0 73 69 7a 65 6f 66 28 69 6e 74 29 29 3b 0a 20 20  sizeof(int));.  
14100 20 20 20 20 69 66 28 20 61 62 59 69 65 6c 64 3d      if( abYield=
14110 3d 30 20 29 20 73 68 65 6c 6c 5f 6f 75 74 5f 6f  =0 ) shell_out_o
14120 66 5f 6d 65 6d 6f 72 79 28 29 3b 0a 20 20 20 20  f_memory();.    
14130 7d 0a 20 20 20 20 61 62 59 69 65 6c 64 5b 69 4f  }.    abYield[iO
14140 70 5d 20 3d 20 73 74 72 5f 69 6e 5f 61 72 72 61  p] = str_in_arra
14150 79 28 7a 4f 70 2c 20 61 7a 59 69 65 6c 64 29 3b  y(zOp, azYield);
14160 0a 20 20 20 20 70 2d 3e 61 69 49 6e 64 65 6e 74  .    p->aiIndent
14170 5b 69 4f 70 5d 20 3d 20 30 3b 0a 20 20 20 20 70  [iOp] = 0;.    p
14180 2d 3e 6e 49 6e 64 65 6e 74 20 3d 20 69 4f 70 2b  ->nIndent = iOp+
14190 31 3b 0a 0a 20 20 20 20 69 66 28 20 73 74 72 5f  1;..    if( str_
141a0 69 6e 5f 61 72 72 61 79 28 7a 4f 70 2c 20 61 7a  in_array(zOp, az
141b0 4e 65 78 74 29 20 29 7b 0a 20 20 20 20 20 20 66  Next) ){.      f
141c0 6f 72 28 69 3d 70 32 6f 70 3b 20 69 3c 69 4f 70  or(i=p2op; i<iOp
141d0 3b 20 69 2b 2b 29 20 70 2d 3e 61 69 49 6e 64 65  ; i++) p->aiInde
141e0 6e 74 5b 69 5d 20 2b 3d 20 32 3b 0a 20 20 20 20  nt[i] += 2;.    
141f0 7d 0a 20 20 20 20 69 66 28 20 73 74 72 5f 69 6e  }.    if( str_in
14200 5f 61 72 72 61 79 28 7a 4f 70 2c 20 61 7a 47 6f  _array(zOp, azGo
14210 74 6f 29 20 26 26 20 70 32 6f 70 3c 70 2d 3e 6e  to) && p2op<p->n
14220 49 6e 64 65 6e 74 0a 20 20 20 20 20 26 26 20 28  Indent.     && (
14230 61 62 59 69 65 6c 64 5b 70 32 6f 70 5d 20 7c 7c  abYield[p2op] ||
14240 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
14250 69 6e 74 28 70 53 71 6c 2c 20 32 29 29 0a 20 20  int(pSql, 2)).  
14260 20 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69    ){.      for(i
14270 3d 70 32 6f 70 3b 20 69 3c 69 4f 70 3b 20 69 2b  =p2op; i<iOp; i+
14280 2b 29 20 70 2d 3e 61 69 49 6e 64 65 6e 74 5b 69  +) p->aiIndent[i
14290 5d 20 2b 3d 20 32 3b 0a 20 20 20 20 7d 0a 20 20  ] += 2;.    }.  
142a0 7d 0a 0a 20 20 70 2d 3e 69 49 6e 64 65 6e 74 20  }..  p->iIndent 
142b0 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  = 0;.  sqlite3_f
142c0 72 65 65 28 61 62 59 69 65 6c 64 29 3b 0a 20 20  ree(abYield);.  
142d0 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 53  sqlite3_reset(pS
142e0 71 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72  ql);.}../*.** Fr
142f0 65 65 20 74 68 65 20 61 72 72 61 79 20 61 6c 6c  ee the array all
14300 6f 63 61 74 65 64 20 62 79 20 65 78 70 6c 61 69  ocated by explai
14310 6e 5f 64 61 74 61 5f 70 72 65 70 61 72 65 28 29  n_data_prepare()
14320 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
14330 20 65 78 70 6c 61 69 6e 5f 64 61 74 61 5f 64 65   explain_data_de
14340 6c 65 74 65 28 53 68 65 6c 6c 53 74 61 74 65 20  lete(ShellState 
14350 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 66  *p){.  sqlite3_f
14360 72 65 65 28 70 2d 3e 61 69 49 6e 64 65 6e 74 29  ree(p->aiIndent)
14370 3b 0a 20 20 70 2d 3e 61 69 49 6e 64 65 6e 74 20  ;.  p->aiIndent 
14380 3d 20 30 3b 0a 20 20 70 2d 3e 6e 49 6e 64 65 6e  = 0;.  p->nInden
14390 74 20 3d 20 30 3b 0a 20 20 70 2d 3e 69 49 6e 64  t = 0;.  p->iInd
143a0 65 6e 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  ent = 0;.}../*.*
143b0 2a 20 44 69 73 61 62 6c 65 20 61 6e 64 20 72 65  * Disable and re
143c0 73 74 6f 72 65 20 2e 77 68 65 72 65 74 72 61 63  store .wheretrac
143d0 65 20 61 6e 64 20 2e 73 65 6c 65 63 74 74 72 61  e and .selecttra
143e0 63 65 20 73 65 74 74 69 6e 67 73 2e 0a 2a 2f 0a  ce settings..*/.
143f0 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
14400 54 45 5f 44 45 42 55 47 29 20 26 26 20 64 65 66  TE_DEBUG) && def
14410 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
14420 4c 45 5f 53 45 4c 45 43 54 54 52 41 43 45 29 0a  LE_SELECTTRACE).
14430 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74  extern int sqlit
14440 65 33 53 65 6c 65 63 74 54 72 61 63 65 3b 0a 73  e3SelectTrace;.s
14450 74 61 74 69 63 20 69 6e 74 20 73 61 76 65 64 53  tatic int savedS
14460 65 6c 65 63 74 54 72 61 63 65 3b 0a 23 65 6e 64  electTrace;.#end
14470 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  if.#if defined(S
14480 51 4c 49 54 45 5f 44 45 42 55 47 29 20 26 26 20  QLITE_DEBUG) && 
14490 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
144a0 4e 41 42 4c 45 5f 57 48 45 52 45 54 52 41 43 45  NABLE_WHERETRACE
144b0 29 0a 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c  ).extern int sql
144c0 69 74 65 33 57 68 65 72 65 54 72 61 63 65 3b 0a  ite3WhereTrace;.
144d0 73 74 61 74 69 63 20 69 6e 74 20 73 61 76 65 64  static int saved
144e0 57 68 65 72 65 54 72 61 63 65 3b 0a 23 65 6e 64  WhereTrace;.#end
144f0 69 66 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64  if.static void d
14500 69 73 61 62 6c 65 5f 64 65 62 75 67 5f 74 72 61  isable_debug_tra
14510 63 65 5f 6d 6f 64 65 73 28 76 6f 69 64 29 7b 0a  ce_modes(void){.
14520 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
14530 54 45 5f 44 45 42 55 47 29 20 26 26 20 64 65 66  TE_DEBUG) && def
14540 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
14550 4c 45 5f 53 45 4c 45 43 54 54 52 41 43 45 29 0a  LE_SELECTTRACE).
14560 20 20 73 61 76 65 64 53 65 6c 65 63 74 54 72 61    savedSelectTra
14570 63 65 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  ce = sqlite3Sele
14580 63 74 54 72 61 63 65 3b 0a 20 20 73 71 6c 69 74  ctTrace;.  sqlit
14590 65 33 53 65 6c 65 63 74 54 72 61 63 65 20 3d 20  e3SelectTrace = 
145a0 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65  0;.#endif.#if de
145b0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42  fined(SQLITE_DEB
145c0 55 47 29 20 26 26 20 64 65 66 69 6e 65 64 28 53  UG) && defined(S
145d0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 57 48 45  QLITE_ENABLE_WHE
145e0 52 45 54 52 41 43 45 29 0a 20 20 73 61 76 65 64  RETRACE).  saved
145f0 57 68 65 72 65 54 72 61 63 65 20 3d 20 73 71 6c  WhereTrace = sql
14600 69 74 65 33 57 68 65 72 65 54 72 61 63 65 3b 0a  ite3WhereTrace;.
14610 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72    sqlite3WhereTr
14620 61 63 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a  ace = 0;.#endif.
14630 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65  }.static void re
14640 73 74 6f 72 65 5f 64 65 62 75 67 5f 74 72 61 63  store_debug_trac
14650 65 5f 6d 6f 64 65 73 28 76 6f 69 64 29 7b 0a 23  e_modes(void){.#
14660 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
14670 45 5f 44 45 42 55 47 29 20 26 26 20 64 65 66 69  E_DEBUG) && defi
14680 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
14690 45 5f 53 45 4c 45 43 54 54 52 41 43 45 29 0a 20  E_SELECTTRACE). 
146a0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72   sqlite3SelectTr
146b0 61 63 65 20 3d 20 73 61 76 65 64 53 65 6c 65 63  ace = savedSelec
146c0 74 54 72 61 63 65 3b 0a 23 65 6e 64 69 66 0a 23  tTrace;.#endif.#
146d0 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
146e0 45 5f 44 45 42 55 47 29 20 26 26 20 64 65 66 69  E_DEBUG) && defi
146f0 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
14700 45 5f 57 48 45 52 45 54 52 41 43 45 29 0a 20 20  E_WHERETRACE).  
14710 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63  sqlite3WhereTrac
14720 65 20 3d 20 73 61 76 65 64 57 68 65 72 65 54 72  e = savedWhereTr
14730 61 63 65 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f  ace;.#endif.}../
14740 2a 20 43 72 65 61 74 65 20 74 68 65 20 54 45 4d  * Create the TEM
14750 50 20 74 61 62 6c 65 20 75 73 65 64 20 74 6f 20  P table used to 
14760 73 74 6f 72 65 20 70 61 72 61 6d 65 74 65 72 20  store parameter 
14770 62 69 6e 64 69 6e 67 73 20 2a 2f 0a 73 74 61 74  bindings */.stat
14780 69 63 20 76 6f 69 64 20 62 69 6e 64 5f 74 61 62  ic void bind_tab
14790 6c 65 5f 69 6e 69 74 28 53 68 65 6c 6c 53 74 61  le_init(ShellSta
147a0 74 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 77 72  te *p){.  int wr
147b0 53 63 68 65 6d 61 20 3d 20 30 3b 0a 20 20 73 71  Schema = 0;.  sq
147c0 6c 69 74 65 33 5f 64 62 5f 63 6f 6e 66 69 67 28  lite3_db_config(
147d0 70 2d 3e 64 62 2c 20 53 51 4c 49 54 45 5f 44 42  p->db, SQLITE_DB
147e0 43 4f 4e 46 49 47 5f 57 52 49 54 41 42 4c 45 5f  CONFIG_WRITABLE_
147f0 53 43 48 45 4d 41 2c 20 2d 31 2c 20 26 77 72 53  SCHEMA, -1, &wrS
14800 63 68 65 6d 61 29 3b 0a 20 20 73 71 6c 69 74 65  chema);.  sqlite
14810 33 5f 64 62 5f 63 6f 6e 66 69 67 28 70 2d 3e 64  3_db_config(p->d
14820 62 2c 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46  b, SQLITE_DBCONF
14830 49 47 5f 57 52 49 54 41 42 4c 45 5f 53 43 48 45  IG_WRITABLE_SCHE
14840 4d 41 2c 20 31 2c 20 30 29 3b 0a 20 20 73 71 6c  MA, 1, 0);.  sql
14850 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c  ite3_exec(p->db,
14860 0a 20 20 20 20 22 43 52 45 41 54 45 20 54 41 42  .    "CREATE TAB
14870 4c 45 20 49 46 20 4e 4f 54 20 45 58 49 53 54 53  LE IF NOT EXISTS
14880 20 74 65 6d 70 2e 73 71 6c 69 74 65 5f 70 61 72   temp.sqlite_par
14890 61 6d 65 74 65 72 73 28 5c 6e 22 0a 20 20 20 20  ameters(\n".    
148a0 22 20 20 6b 65 79 20 54 45 58 54 20 50 52 49 4d  "  key TEXT PRIM
148b0 41 52 59 20 4b 45 59 2c 5c 6e 22 0a 20 20 20 20  ARY KEY,\n".    
148c0 22 20 20 76 61 6c 75 65 20 41 4e 59 5c 6e 22 0a  "  value ANY\n".
148d0 20 20 20 20 22 29 20 57 49 54 48 4f 55 54 20 52      ") WITHOUT R
148e0 4f 57 49 44 3b 22 2c 0a 20 20 20 20 30 2c 20 30  OWID;",.    0, 0
148f0 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  , 0);.  sqlite3_
14900 64 62 5f 63 6f 6e 66 69 67 28 70 2d 3e 64 62 2c  db_config(p->db,
14910 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47   SQLITE_DBCONFIG
14920 5f 57 52 49 54 41 42 4c 45 5f 53 43 48 45 4d 41  _WRITABLE_SCHEMA
14930 2c 20 77 72 53 63 68 65 6d 61 2c 20 30 29 3b 0a  , wrSchema, 0);.
14940 7d 0a 0a 2f 2a 0a 2a 2a 20 42 69 6e 64 20 70 61  }../*.** Bind pa
14950 72 61 6d 65 74 65 72 73 20 6f 6e 20 61 20 70 72  rameters on a pr
14960 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
14970 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65  ..**.** Paramete
14980 72 20 62 69 6e 64 69 6e 67 73 20 61 72 65 20 74  r bindings are t
14990 61 6b 65 6e 20 66 72 6f 6d 20 61 20 54 45 4d 50  aken from a TEMP
149a0 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20 66 6f   table of the fo
149b0 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 43 52 45  rm:.**.**    CRE
149c0 41 54 45 20 54 45 4d 50 20 54 41 42 4c 45 20 73  ATE TEMP TABLE s
149d0 71 6c 69 74 65 5f 70 61 72 61 6d 65 74 65 72 73  qlite_parameters
149e0 28 6b 65 79 20 54 45 58 54 20 50 52 49 4d 41 52  (key TEXT PRIMAR
149f0 59 20 4b 45 59 2c 20 76 61 6c 75 65 29 0a 2a 2a  Y KEY, value).**
14a00 20 20 20 20 57 49 54 48 4f 55 54 20 52 4f 57 49      WITHOUT ROWI
14a10 44 3b 0a 2a 2a 0a 2a 2a 20 4e 6f 20 62 69 6e 64  D;.**.** No bind
14a20 69 6e 67 73 20 6f 63 63 75 72 20 69 66 20 74 68  ings occur if th
14a30 69 73 20 74 61 62 6c 65 20 64 6f 65 73 20 6e 6f  is table does no
14a40 74 20 65 78 69 73 74 2e 20 20 54 68 65 20 73 70  t exist.  The sp
14a50 65 63 69 61 6c 20 63 68 61 72 61 63 74 65 72 20  ecial character 
14a60 27 24 27 0a 2a 2a 20 69 73 20 69 6e 63 6c 75 64  '$'.** is includ
14a70 65 64 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20  ed in the table 
14a80 6e 61 6d 65 20 74 6f 20 68 65 6c 70 20 70 72 65  name to help pre
14a90 76 65 6e 74 20 63 6f 6c 6c 69 73 69 6f 6e 73 20  vent collisions 
14aa0 77 69 74 68 20 61 63 74 75 61 6c 20 74 61 62 6c  with actual tabl
14ab0 65 73 2e 0a 2a 2a 20 54 68 65 20 74 61 62 6c 65  es..** The table
14ac0 20 6d 75 73 74 20 62 65 20 69 6e 20 74 68 65 20   must be in the 
14ad0 54 45 4d 50 20 73 63 68 65 6d 61 2e 0a 2a 2f 0a  TEMP schema..*/.
14ae0 73 74 61 74 69 63 20 76 6f 69 64 20 62 69 6e 64  static void bind
14af0 5f 70 72 65 70 61 72 65 64 5f 73 74 6d 74 28 53  _prepared_stmt(S
14b00 68 65 6c 6c 53 74 61 74 65 20 2a 70 41 72 67 2c  hellState *pArg,
14b10 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
14b20 53 74 6d 74 29 7b 0a 20 20 69 6e 74 20 6e 56 61  Stmt){.  int nVa
14b30 72 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  r;.  int i;.  in
14b40 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 5f  t rc;.  sqlite3_
14b50 73 74 6d 74 20 2a 70 51 20 3d 20 30 3b 0a 0a 20  stmt *pQ = 0;.. 
14b60 20 6e 56 61 72 20 3d 20 73 71 6c 69 74 65 33 5f   nVar = sqlite3_
14b70 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 63  bind_parameter_c
14b80 6f 75 6e 74 28 70 53 74 6d 74 29 3b 0a 20 20 69  ount(pStmt);.  i
14b90 66 28 20 6e 56 61 72 3d 3d 30 20 29 20 72 65 74  f( nVar==0 ) ret
14ba0 75 72 6e 3b 20 20 2f 2a 20 4e 6f 74 68 69 6e 67  urn;  /* Nothing
14bb0 20 74 6f 20 64 6f 20 2a 2f 0a 20 20 69 66 28 20   to do */.  if( 
14bc0 73 71 6c 69 74 65 33 5f 74 61 62 6c 65 5f 63 6f  sqlite3_table_co
14bd0 6c 75 6d 6e 5f 6d 65 74 61 64 61 74 61 28 70 41  lumn_metadata(pA
14be0 72 67 2d 3e 64 62 2c 20 22 54 45 4d 50 22 2c 20  rg->db, "TEMP", 
14bf0 22 73 71 6c 69 74 65 5f 70 61 72 61 6d 65 74 65  "sqlite_paramete
14c00 72 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rs",.           
14c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14c20 20 20 20 20 20 20 20 20 20 22 6b 65 79 22 2c 20           "key", 
14c30 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29 21 3d  0, 0, 0, 0, 0)!=
14c40 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
14c50 20 72 65 74 75 72 6e 3b 20 2f 2a 20 50 61 72 61   return; /* Para
14c60 6d 65 74 65 72 20 74 61 62 6c 65 20 64 6f 65 73  meter table does
14c70 20 6e 6f 74 20 65 78 69 73 74 20 2a 2f 0a 20 20   not exist */.  
14c80 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  }.  rc = sqlite3
14c90 5f 70 72 65 70 61 72 65 5f 76 32 28 70 41 72 67  _prepare_v2(pArg
14ca0 2d 3e 64 62 2c 0a 20 20 20 20 20 20 20 20 20 20  ->db,.          
14cb0 22 53 45 4c 45 43 54 20 76 61 6c 75 65 20 46 52  "SELECT value FR
14cc0 4f 4d 20 74 65 6d 70 2e 73 71 6c 69 74 65 5f 70  OM temp.sqlite_p
14cd0 61 72 61 6d 65 74 65 72 73 22 0a 20 20 20 20 20  arameters".     
14ce0 20 20 20 20 20 22 20 57 48 45 52 45 20 6b 65 79       " WHERE key
14cf0 3d 3f 31 22 2c 20 2d 31 2c 20 26 70 51 2c 20 30  =?1", -1, &pQ, 0
14d00 29 3b 0a 20 20 69 66 28 20 72 63 20 7c 7c 20 70  );.  if( rc || p
14d10 51 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  Q==0 ) return;. 
14d20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 3d 6e 56 61   for(i=1; i<=nVa
14d30 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 68 61  r; i++){.    cha
14d40 72 20 7a 4e 75 6d 5b 33 30 5d 3b 0a 20 20 20 20  r zNum[30];.    
14d50 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56 61 72  const char *zVar
14d60 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f   = sqlite3_bind_
14d70 70 61 72 61 6d 65 74 65 72 5f 6e 61 6d 65 28 70  parameter_name(p
14d80 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20 20 69 66  Stmt, i);.    if
14d90 28 20 7a 56 61 72 3d 3d 30 20 29 7b 0a 20 20 20  ( zVar==0 ){.   
14da0 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
14db0 6e 74 66 28 73 69 7a 65 6f 66 28 7a 4e 75 6d 29  ntf(sizeof(zNum)
14dc0 2c 7a 4e 75 6d 2c 22 3f 25 64 22 2c 69 29 3b 0a  ,zNum,"?%d",i);.
14dd0 20 20 20 20 20 20 7a 56 61 72 20 3d 20 7a 4e 75        zVar = zNu
14de0 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  m;.    }.    sql
14df0 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 28 70  ite3_bind_text(p
14e00 51 2c 20 31 2c 20 7a 56 61 72 2c 20 2d 31 2c 20  Q, 1, zVar, -1, 
14e10 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a  SQLITE_STATIC);.
14e20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f      if( sqlite3_
14e30 73 74 65 70 28 70 51 29 3d 3d 53 51 4c 49 54 45  step(pQ)==SQLITE
14e40 5f 52 4f 57 20 29 7b 0a 20 20 20 20 20 20 73 71  _ROW ){.      sq
14e50 6c 69 74 65 33 5f 62 69 6e 64 5f 76 61 6c 75 65  lite3_bind_value
14e60 28 70 53 74 6d 74 2c 20 69 2c 20 73 71 6c 69 74  (pStmt, i, sqlit
14e70 65 33 5f 63 6f 6c 75 6d 6e 5f 76 61 6c 75 65 28  e3_column_value(
14e80 70 51 2c 20 30 29 29 3b 0a 20 20 20 20 7d 65 6c  pQ, 0));.    }el
14e90 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
14ea0 33 5f 62 69 6e 64 5f 6e 75 6c 6c 28 70 53 74 6d  3_bind_null(pStm
14eb0 74 2c 20 69 29 3b 0a 20 20 20 20 7d 0a 20 20 20  t, i);.    }.   
14ec0 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70   sqlite3_reset(p
14ed0 51 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  Q);.  }.  sqlite
14ee0 33 5f 66 69 6e 61 6c 69 7a 65 28 70 51 29 3b 0a  3_finalize(pQ);.
14ef0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 75 6e 20 61 20 70  }../*.** Run a p
14f00 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
14f10 74 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  t.*/.static void
14f20 20 65 78 65 63 5f 70 72 65 70 61 72 65 64 5f 73   exec_prepared_s
14f30 74 6d 74 28 0a 20 20 53 68 65 6c 6c 53 74 61 74  tmt(.  ShellStat
14f40 65 20 2a 70 41 72 67 2c 20 20 20 20 20 20 20 20  e *pArg,        
14f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14f60 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
14f70 65 72 20 74 6f 20 53 68 65 6c 6c 53 74 61 74 65  er to ShellState
14f80 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74   */.  sqlite3_st
14f90 6d 74 20 2a 70 53 74 6d 74 20 20 20 20 20 20 20  mt *pStmt       
14fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14fb0 20 20 20 20 20 20 20 2f 2a 20 53 74 61 74 6d 65         /* Statme
14fc0 6e 74 20 74 6f 20 72 75 6e 20 2a 2f 0a 29 7b 0a  nt to run */.){.
14fd0 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a 20    int rc;..  /* 
14fe0 70 65 72 66 6f 72 6d 20 74 68 65 20 66 69 72 73  perform the firs
14ff0 74 20 73 74 65 70 2e 20 20 74 68 69 73 20 77 69  t step.  this wi
15000 6c 6c 20 74 65 6c 6c 20 75 73 20 69 66 20 77 65  ll tell us if we
15010 0a 20 20 2a 2a 20 68 61 76 65 20 61 20 72 65 73  .  ** have a res
15020 75 6c 74 20 73 65 74 20 6f 72 20 6e 6f 74 20 61  ult set or not a
15030 6e 64 20 68 6f 77 20 77 69 64 65 20 69 74 20 69  nd how wide it i
15040 73 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73  s..  */.  rc = s
15050 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d  qlite3_step(pStm
15060 74 29 3b 0a 20 20 2f 2a 20 69 66 20 77 65 20 68  t);.  /* if we h
15070 61 76 65 20 61 20 72 65 73 75 6c 74 20 73 65 74  ave a result set
15080 2e 2e 2e 20 2a 2f 0a 20 20 69 66 28 20 53 51 4c  ... */.  if( SQL
15090 49 54 45 5f 52 4f 57 20 3d 3d 20 72 63 20 29 7b  ITE_ROW == rc ){
150a0 0a 20 20 20 20 2f 2a 20 61 6c 6c 6f 63 61 74 65  .    /* allocate
150b0 20 73 70 61 63 65 20 66 6f 72 20 63 6f 6c 20 6e   space for col n
150c0 61 6d 65 20 70 74 72 2c 20 76 61 6c 75 65 20 70  ame ptr, value p
150d0 74 72 2c 20 61 6e 64 20 74 79 70 65 20 2a 2f 0a  tr, and type */.
150e0 20 20 20 20 69 6e 74 20 6e 43 6f 6c 20 3d 20 73      int nCol = s
150f0 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f  qlite3_column_co
15100 75 6e 74 28 70 53 74 6d 74 29 3b 0a 20 20 20 20  unt(pStmt);.    
15110 76 6f 69 64 20 2a 70 44 61 74 61 20 3d 20 73 71  void *pData = sq
15120 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 33  lite3_malloc64(3
15130 2a 6e 43 6f 6c 2a 73 69 7a 65 6f 66 28 63 6f 6e  *nCol*sizeof(con
15140 73 74 20 63 68 61 72 2a 29 20 2b 20 31 29 3b 0a  st char*) + 1);.
15150 20 20 20 20 69 66 28 20 21 70 44 61 74 61 20 29      if( !pData )
15160 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
15170 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d  ITE_NOMEM;.    }
15180 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 61 72  else{.      char
15190 20 2a 2a 61 7a 43 6f 6c 73 20 3d 20 28 63 68 61   **azCols = (cha
151a0 72 20 2a 2a 29 70 44 61 74 61 3b 20 20 20 20 20  r **)pData;     
151b0 20 2f 2a 20 4e 61 6d 65 73 20 6f 66 20 72 65 73   /* Names of res
151c0 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20  ult columns */. 
151d0 20 20 20 20 20 63 68 61 72 20 2a 2a 61 7a 56 61       char **azVa
151e0 6c 73 20 3d 20 26 61 7a 43 6f 6c 73 5b 6e 43 6f  ls = &azCols[nCo
151f0 6c 5d 3b 20 20 20 20 20 20 20 2f 2a 20 52 65 73  l];       /* Res
15200 75 6c 74 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e  ults */.      in
15210 74 20 2a 61 69 54 79 70 65 73 20 3d 20 28 69 6e  t *aiTypes = (in
15220 74 20 2a 29 26 61 7a 56 61 6c 73 5b 6e 43 6f 6c  t *)&azVals[nCol
15230 5d 3b 20 2f 2a 20 52 65 73 75 6c 74 20 74 79 70  ]; /* Result typ
15240 65 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  es */.      int 
15250 69 2c 20 78 3b 0a 20 20 20 20 20 20 61 73 73 65  i, x;.      asse
15260 72 74 28 73 69 7a 65 6f 66 28 69 6e 74 29 20 3c  rt(sizeof(int) <
15270 3d 20 73 69 7a 65 6f 66 28 63 68 61 72 20 2a 29  = sizeof(char *)
15280 29 3b 0a 20 20 20 20 20 20 2f 2a 20 73 61 76 65  );.      /* save
15290 20 6f 66 66 20 70 74 72 73 20 74 6f 20 63 6f 6c   off ptrs to col
152a0 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 20  umn names */.   
152b0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43     for(i=0; i<nC
152c0 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; i++){.      
152d0 20 20 61 7a 43 6f 6c 73 5b 69 5d 20 3d 20 28 63    azCols[i] = (c
152e0 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 63 6f  har *)sqlite3_co
152f0 6c 75 6d 6e 5f 6e 61 6d 65 28 70 53 74 6d 74 2c  lumn_name(pStmt,
15300 20 69 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   i);.      }.   
15310 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 20 20 2f     do{.        /
15320 2a 20 65 78 74 72 61 63 74 20 74 68 65 20 64 61  * extract the da
15330 74 61 20 61 6e 64 20 64 61 74 61 20 74 79 70 65  ta and data type
15340 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 6f 72  s */.        for
15350 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b  (i=0; i<nCol; i+
15360 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 69  +){.          ai
15370 54 79 70 65 73 5b 69 5d 20 3d 20 78 20 3d 20 73  Types[i] = x = s
15380 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 79  qlite3_column_ty
15390 70 65 28 70 53 74 6d 74 2c 20 69 29 3b 0a 20 20  pe(pStmt, i);.  
153a0 20 20 20 20 20 20 20 20 69 66 28 20 78 3d 3d 53          if( x==S
153b0 51 4c 49 54 45 5f 42 4c 4f 42 20 26 26 20 70 41  QLITE_BLOB && pA
153c0 72 67 20 26 26 20 70 41 72 67 2d 3e 63 4d 6f 64  rg && pArg->cMod
153d0 65 3d 3d 4d 4f 44 45 5f 49 6e 73 65 72 74 20 29  e==MODE_Insert )
153e0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 7a  {.            az
153f0 56 61 6c 73 5b 69 5d 20 3d 20 22 22 3b 0a 20 20  Vals[i] = "";.  
15400 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
15410 20 20 20 20 20 20 20 20 20 20 20 61 7a 56 61 6c             azVal
15420 73 5b 69 5d 20 3d 20 28 63 68 61 72 2a 29 73 71  s[i] = (char*)sq
15430 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
15440 74 28 70 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20  t(pStmt, i);.   
15450 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
15460 20 20 20 69 66 28 20 21 61 7a 56 61 6c 73 5b 69     if( !azVals[i
15470 5d 20 26 26 20 28 61 69 54 79 70 65 73 5b 69 5d  ] && (aiTypes[i]
15480 21 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 29 20 29  !=SQLITE_NULL) )
15490 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  {.            rc
154a0 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
154b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65  .            bre
154c0 61 6b 3b 20 2f 2a 20 66 72 6f 6d 20 66 6f 72 20  ak; /* from for 
154d0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  */.          }. 
154e0 20 20 20 20 20 20 20 7d 20 2f 2a 20 65 6e 64 20         } /* end 
154f0 66 6f 72 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20  for */..        
15500 2f 2a 20 69 66 20 64 61 74 61 20 61 6e 64 20 74  /* if data and t
15510 79 70 65 73 20 65 78 74 72 61 63 74 65 64 20 73  ypes extracted s
15520 75 63 63 65 73 73 66 75 6c 6c 79 2e 2e 2e 20 2a  uccessfully... *
15530 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 53 51  /.        if( SQ
15540 4c 49 54 45 5f 52 4f 57 20 3d 3d 20 72 63 20 29  LITE_ROW == rc )
15550 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 63  {.          /* c
15560 61 6c 6c 20 74 68 65 20 73 75 70 70 6c 69 65 64  all the supplied
15570 20 63 61 6c 6c 62 61 63 6b 20 77 69 74 68 20 74   callback with t
15580 68 65 20 72 65 73 75 6c 74 20 72 6f 77 20 64 61  he result row da
15590 74 61 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ta */.          
155a0 69 66 28 20 73 68 65 6c 6c 5f 63 61 6c 6c 62 61  if( shell_callba
155b0 63 6b 28 70 41 72 67 2c 20 6e 43 6f 6c 2c 20 61  ck(pArg, nCol, a
155c0 7a 56 61 6c 73 2c 20 61 7a 43 6f 6c 73 2c 20 61  zVals, azCols, a
155d0 69 54 79 70 65 73 29 20 29 7b 0a 20 20 20 20 20  iTypes) ){.     
155e0 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
155f0 54 45 5f 41 42 4f 52 54 3b 0a 20 20 20 20 20 20  TE_ABORT;.      
15600 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
15610 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
15620 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3b  te3_step(pStmt);
15630 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
15640 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 20 77       }.      } w
15650 68 69 6c 65 28 20 53 51 4c 49 54 45 5f 52 4f 57  hile( SQLITE_ROW
15660 20 3d 3d 20 72 63 20 29 3b 0a 20 20 20 20 20 20   == rc );.      
15670 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 44 61  sqlite3_free(pDa
15680 74 61 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  ta);.    }.  }.}
15690 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
156a0 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
156b0 4c 45 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  LE./*.** This fu
156c0 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
156d0 20 74 6f 20 70 72 6f 63 65 73 73 20 53 51 4c 20   to process SQL 
156e0 69 66 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  if the previous 
156f0 73 68 65 6c 6c 20 63 6f 6d 6d 61 6e 64 0a 2a 2a  shell command.**
15700 20 77 61 73 20 22 2e 65 78 70 65 72 74 22 2e 20   was ".expert". 
15710 49 74 20 70 61 73 73 65 73 20 74 68 65 20 53 51  It passes the SQ
15720 4c 20 69 6e 20 74 68 65 20 73 65 63 6f 6e 64 20  L in the second 
15730 61 72 67 75 6d 65 6e 74 20 64 69 72 65 63 74 6c  argument directl
15740 79 20 74 6f 0a 2a 2a 20 74 68 65 20 73 71 6c 69  y to.** the sqli
15750 74 65 33 65 78 70 65 72 74 20 6f 62 6a 65 63 74  te3expert object
15760 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65  ..**.** If succe
15770 73 73 66 75 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b  ssful, SQLITE_OK
15780 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74   is returned. Ot
15790 68 65 72 77 69 73 65 2c 20 61 6e 20 53 51 4c 69  herwise, an SQLi
157a0 74 65 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65  te error.** code
157b0 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20  . In this case, 
157c0 28 2a 70 7a 45 72 72 29 20 6d 61 79 20 62 65 20  (*pzErr) may be 
157d0 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  set to point to 
157e0 61 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e  a buffer contain
157f0 69 6e 67 0a 2a 2a 20 61 6e 20 45 6e 67 6c 69 73  ing.** an Englis
15800 68 20 6c 61 6e 67 75 61 67 65 20 65 72 72 6f 72  h language error
15810 20 6d 65 73 73 61 67 65 2e 20 49 74 20 69 73 20   message. It is 
15820 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69  the responsibili
15830 74 79 20 6f 66 20 74 68 65 0a 2a 2a 20 63 61 6c  ty of the.** cal
15840 6c 65 72 20 74 6f 20 65 76 65 6e 74 75 61 6c 6c  ler to eventuall
15850 79 20 66 72 65 65 20 74 68 69 73 20 62 75 66 66  y free this buff
15860 65 72 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  er using sqlite3
15870 5f 66 72 65 65 28 29 2e 0a 2a 2f 0a 73 74 61 74  _free()..*/.stat
15880 69 63 20 69 6e 74 20 65 78 70 65 72 74 48 61 6e  ic int expertHan
15890 64 6c 65 53 51 4c 28 0a 20 20 53 68 65 6c 6c 53  dleSQL(.  ShellS
158a0 74 61 74 65 20 2a 70 53 74 61 74 65 2c 20 0a 20  tate *pState, . 
158b0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71   const char *zSq
158c0 6c 2c 20 0a 20 20 63 68 61 72 20 2a 2a 70 7a 45  l, .  char **pzE
158d0 72 72 0a 29 7b 0a 20 20 61 73 73 65 72 74 28 20  rr.){.  assert( 
158e0 70 53 74 61 74 65 2d 3e 65 78 70 65 72 74 2e 70  pState->expert.p
158f0 45 78 70 65 72 74 20 29 3b 0a 20 20 61 73 73 65  Expert );.  asse
15900 72 74 28 20 70 7a 45 72 72 3d 3d 30 20 7c 7c 20  rt( pzErr==0 || 
15910 2a 70 7a 45 72 72 3d 3d 30 20 29 3b 0a 20 20 72  *pzErr==0 );.  r
15920 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 65 78  eturn sqlite3_ex
15930 70 65 72 74 5f 73 71 6c 28 70 53 74 61 74 65 2d  pert_sql(pState-
15940 3e 65 78 70 65 72 74 2e 70 45 78 70 65 72 74 2c  >expert.pExpert,
15950 20 7a 53 71 6c 2c 20 70 7a 45 72 72 29 3b 0a 7d   zSql, pzErr);.}
15960 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
15970 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
15980 65 69 74 68 65 72 20 74 6f 20 73 69 6c 65 6e 74  either to silent
15990 6c 79 20 63 6c 65 61 6e 20 75 70 20 74 68 65 20  ly clean up the 
159a0 6f 62 6a 65 63 74 0a 2a 2a 20 63 72 65 61 74 65  object.** create
159b0 64 20 62 79 20 74 68 65 20 22 2e 65 78 70 65 72  d by the ".exper
159c0 74 22 20 63 6f 6d 6d 61 6e 64 20 28 69 66 20 62  t" command (if b
159d0 43 61 6e 63 65 6c 3d 3d 31 29 2c 20 6f 72 20 74  Cancel==1), or t
159e0 6f 20 67 65 6e 65 72 61 74 65 20 61 20 0a 2a 2a  o generate a .**
159f0 20 72 65 70 6f 72 74 20 66 72 6f 6d 20 69 74 20   report from it 
15a00 61 6e 64 20 74 68 65 6e 20 63 6c 65 61 6e 20 69  and then clean i
15a10 74 20 75 70 20 28 69 66 20 62 43 61 6e 63 65 6c  t up (if bCancel
15a20 3d 3d 30 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73  ==0)..**.** If s
15a30 75 63 63 65 73 73 66 75 6c 2c 20 53 51 4c 49 54  uccessful, SQLIT
15a40 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
15a50 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 61 6e 20  . Otherwise, an 
15a60 53 51 4c 69 74 65 20 65 72 72 6f 72 0a 2a 2a 20  SQLite error.** 
15a70 63 6f 64 65 2e 20 49 6e 20 74 68 69 73 20 63 61  code. In this ca
15a80 73 65 2c 20 28 2a 70 7a 45 72 72 29 20 6d 61 79  se, (*pzErr) may
15a90 20 62 65 20 73 65 74 20 74 6f 20 70 6f 69 6e 74   be set to point
15aa0 20 74 6f 20 61 20 62 75 66 66 65 72 20 63 6f 6e   to a buffer con
15ab0 74 61 69 6e 69 6e 67 0a 2a 2a 20 61 6e 20 45 6e  taining.** an En
15ac0 67 6c 69 73 68 20 6c 61 6e 67 75 61 67 65 20 65  glish language e
15ad0 72 72 6f 72 20 6d 65 73 73 61 67 65 2e 20 49 74  rror message. It
15ae0 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69   is the responsi
15af0 62 69 6c 69 74 79 20 6f 66 20 74 68 65 0a 2a 2a  bility of the.**
15b00 20 63 61 6c 6c 65 72 20 74 6f 20 65 76 65 6e 74   caller to event
15b10 75 61 6c 6c 79 20 66 72 65 65 20 74 68 69 73 20  ually free this 
15b20 62 75 66 66 65 72 20 75 73 69 6e 67 20 73 71 6c  buffer using sql
15b30 69 74 65 33 5f 66 72 65 65 28 29 2e 0a 2a 2f 0a  ite3_free()..*/.
15b40 73 74 61 74 69 63 20 69 6e 74 20 65 78 70 65 72  static int exper
15b50 74 46 69 6e 69 73 68 28 0a 20 20 53 68 65 6c 6c  tFinish(.  Shell
15b60 53 74 61 74 65 20 2a 70 53 74 61 74 65 2c 0a 20  State *pState,. 
15b70 20 69 6e 74 20 62 43 61 6e 63 65 6c 2c 0a 20 20   int bCancel,.  
15b80 63 68 61 72 20 2a 2a 70 7a 45 72 72 0a 29 7b 0a  char **pzErr.){.
15b90 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
15ba0 45 5f 4f 4b 3b 0a 20 20 73 71 6c 69 74 65 33 65  E_OK;.  sqlite3e
15bb0 78 70 65 72 74 20 2a 70 20 3d 20 70 53 74 61 74  xpert *p = pStat
15bc0 65 2d 3e 65 78 70 65 72 74 2e 70 45 78 70 65 72  e->expert.pExper
15bd0 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70 20 29  t;.  assert( p )
15be0 3b 0a 20 20 61 73 73 65 72 74 28 20 62 43 61 6e  ;.  assert( bCan
15bf0 63 65 6c 20 7c 7c 20 70 7a 45 72 72 3d 3d 30 20  cel || pzErr==0 
15c00 7c 7c 20 2a 70 7a 45 72 72 3d 3d 30 20 29 3b 0a  || *pzErr==0 );.
15c10 20 20 69 66 28 20 62 43 61 6e 63 65 6c 3d 3d 30    if( bCancel==0
15c20 20 29 7b 0a 20 20 20 20 46 49 4c 45 20 2a 6f 75   ){.    FILE *ou
15c30 74 20 3d 20 70 53 74 61 74 65 2d 3e 6f 75 74 3b  t = pState->out;
15c40 0a 20 20 20 20 69 6e 74 20 62 56 65 72 62 6f 73  .    int bVerbos
15c50 65 20 3d 20 70 53 74 61 74 65 2d 3e 65 78 70 65  e = pState->expe
15c60 72 74 2e 62 56 65 72 62 6f 73 65 3b 0a 0a 20 20  rt.bVerbose;..  
15c70 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65    rc = sqlite3_e
15c80 78 70 65 72 74 5f 61 6e 61 6c 79 7a 65 28 70 2c  xpert_analyze(p,
15c90 20 70 7a 45 72 72 29 3b 0a 20 20 20 20 69 66 28   pzErr);.    if(
15ca0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
15cb0 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 51 75 65  {.      int nQue
15cc0 72 79 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 70  ry = sqlite3_exp
15cd0 65 72 74 5f 63 6f 75 6e 74 28 70 29 3b 0a 20 20  ert_count(p);.  
15ce0 20 20 20 20 69 6e 74 20 69 3b 0a 0a 20 20 20 20      int i;..    
15cf0 20 20 69 66 28 20 62 56 65 72 62 6f 73 65 20 29    if( bVerbose )
15d00 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20  {.        const 
15d10 63 68 61 72 20 2a 7a 43 61 6e 64 20 3d 20 73 71  char *zCand = sq
15d20 6c 69 74 65 33 5f 65 78 70 65 72 74 5f 72 65 70  lite3_expert_rep
15d30 6f 72 74 28 70 2c 30 2c 45 58 50 45 52 54 5f 52  ort(p,0,EXPERT_R
15d40 45 50 4f 52 54 5f 43 41 4e 44 49 44 41 54 45 53  EPORT_CANDIDATES
15d50 29 3b 0a 20 20 20 20 20 20 20 20 72 61 77 5f 70  );.        raw_p
15d60 72 69 6e 74 66 28 6f 75 74 2c 20 22 2d 2d 20 43  rintf(out, "-- C
15d70 61 6e 64 69 64 61 74 65 73 20 2d 2d 2d 2d 2d 2d  andidates ------
15d80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15d90 2d 2d 2d 2d 2d 2d 2d 5c 6e 22 29 3b 0a 20 20 20  -------\n");.   
15da0 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
15db0 6f 75 74 2c 20 22 25 73 5c 6e 22 2c 20 7a 43 61  out, "%s\n", zCa
15dc0 6e 64 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  nd);.      }.   
15dd0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 51     for(i=0; i<nQ
15de0 75 65 72 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  uery; i++){.    
15df0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
15e00 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 65  zSql = sqlite3_e
15e10 78 70 65 72 74 5f 72 65 70 6f 72 74 28 70 2c 20  xpert_report(p, 
15e20 69 2c 20 45 58 50 45 52 54 5f 52 45 50 4f 52 54  i, EXPERT_REPORT
15e30 5f 53 51 4c 29 3b 0a 20 20 20 20 20 20 20 20 63  _SQL);.        c
15e40 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 64 78 20  onst char *zIdx 
15e50 3d 20 73 71 6c 69 74 65 33 5f 65 78 70 65 72 74  = sqlite3_expert
15e60 5f 72 65 70 6f 72 74 28 70 2c 20 69 2c 20 45 58  _report(p, i, EX
15e70 50 45 52 54 5f 52 45 50 4f 52 54 5f 49 4e 44 45  PERT_REPORT_INDE
15e80 58 45 53 29 3b 0a 20 20 20 20 20 20 20 20 63 6f  XES);.        co
15e90 6e 73 74 20 63 68 61 72 20 2a 7a 45 51 50 20 3d  nst char *zEQP =
15ea0 20 73 71 6c 69 74 65 33 5f 65 78 70 65 72 74 5f   sqlite3_expert_
15eb0 72 65 70 6f 72 74 28 70 2c 20 69 2c 20 45 58 50  report(p, i, EXP
15ec0 45 52 54 5f 52 45 50 4f 52 54 5f 50 4c 41 4e 29  ERT_REPORT_PLAN)
15ed0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 49  ;.        if( zI
15ee0 64 78 3d 3d 30 20 29 20 7a 49 64 78 20 3d 20 22  dx==0 ) zIdx = "
15ef0 28 6e 6f 20 6e 65 77 20 69 6e 64 65 78 65 73 29  (no new indexes)
15f00 5c 6e 22 3b 0a 20 20 20 20 20 20 20 20 69 66 28  \n";.        if(
15f10 20 62 56 65 72 62 6f 73 65 20 29 7b 0a 20 20 20   bVerbose ){.   
15f20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74         raw_print
15f30 66 28 6f 75 74 2c 20 22 2d 2d 20 51 75 65 72 79  f(out, "-- Query
15f40 20 25 64 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   %d ------------
15f50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15f60 2d 2d 2d 2d 5c 6e 22 2c 69 2b 31 29 3b 0a 20 20  ----\n",i+1);.  
15f70 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e          raw_prin
15f80 74 66 28 6f 75 74 2c 20 22 25 73 5c 6e 5c 6e 22  tf(out, "%s\n\n"
15f90 2c 20 7a 53 71 6c 29 3b 0a 20 20 20 20 20 20 20  , zSql);.       
15fa0 20 7d 0a 20 20 20 20 20 20 20 20 72 61 77 5f 70   }.        raw_p
15fb0 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 73 5c 6e  rintf(out, "%s\n
15fc0 22 2c 20 7a 49 64 78 29 3b 0a 20 20 20 20 20 20  ", zIdx);.      
15fd0 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74    raw_printf(out
15fe0 2c 20 22 25 73 5c 6e 22 2c 20 7a 45 51 50 29 3b  , "%s\n", zEQP);
15ff0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
16000 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 65 78 70   }.  sqlite3_exp
16010 65 72 74 5f 64 65 73 74 72 6f 79 28 70 29 3b 0a  ert_destroy(p);.
16020 20 20 70 53 74 61 74 65 2d 3e 65 78 70 65 72 74    pState->expert
16030 2e 70 45 78 70 65 72 74 20 3d 20 30 3b 0a 20 20  .pExpert = 0;.  
16040 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
16050 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69  .** Implementati
16060 6f 6e 20 6f 66 20 22 2e 65 78 70 65 72 74 22 20  on of ".expert" 
16070 64 6f 74 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a  dot command..*/.
16080 73 74 61 74 69 63 20 69 6e 74 20 65 78 70 65 72  static int exper
16090 74 44 6f 74 43 6f 6d 6d 61 6e 64 28 0a 20 20 53  tDotCommand(.  S
160a0 68 65 6c 6c 53 74 61 74 65 20 2a 70 53 74 61 74  hellState *pStat
160b0 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  e,             /
160c0 2a 20 43 75 72 72 65 6e 74 20 73 68 65 6c 6c 20  * Current shell 
160d0 74 6f 6f 6c 20 73 74 61 74 65 20 2a 2f 0a 20 20  tool state */.  
160e0 63 68 61 72 20 2a 2a 61 7a 41 72 67 2c 20 20 20  char **azArg,   
160f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16100 2f 2a 20 41 72 72 61 79 20 6f 66 20 61 72 67 75  /* Array of argu
16110 6d 65 6e 74 73 20 70 61 73 73 65 64 20 74 6f 20  ments passed to 
16120 64 6f 74 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  dot command */. 
16130 20 69 6e 74 20 6e 41 72 67 20 20 20 20 20 20 20   int nArg       
16140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16150 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e   /* Number of en
16160 74 72 69 65 73 20 69 6e 20 61 7a 41 72 67 5b 5d  tries in azArg[]
16170 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20   */.){.  int rc 
16180 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 63  = SQLITE_OK;.  c
16190 68 61 72 20 2a 7a 45 72 72 20 3d 20 30 3b 0a 20  har *zErr = 0;. 
161a0 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 69 53   int i;.  int iS
161b0 61 6d 70 6c 65 20 3d 20 30 3b 0a 0a 20 20 61 73  ample = 0;..  as
161c0 73 65 72 74 28 20 70 53 74 61 74 65 2d 3e 65 78  sert( pState->ex
161d0 70 65 72 74 2e 70 45 78 70 65 72 74 3d 3d 30 20  pert.pExpert==0 
161e0 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 70 53 74  );.  memset(&pSt
161f0 61 74 65 2d 3e 65 78 70 65 72 74 2c 20 30 2c 20  ate->expert, 0, 
16200 73 69 7a 65 6f 66 28 45 78 70 65 72 74 49 6e 66  sizeof(ExpertInf
16210 6f 29 29 3b 0a 0a 20 20 66 6f 72 28 69 3d 31 3b  o));..  for(i=1;
16220 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
16230 26 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a  & i<nArg; i++){.
16240 20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20 61 7a      char *z = az
16250 41 72 67 5b 69 5d 3b 0a 20 20 20 20 69 6e 74 20  Arg[i];.    int 
16260 6e 3b 0a 20 20 20 20 69 66 28 20 7a 5b 30 5d 3d  n;.    if( z[0]=
16270 3d 27 2d 27 20 26 26 20 7a 5b 31 5d 3d 3d 27 2d  ='-' && z[1]=='-
16280 27 20 29 20 7a 2b 2b 3b 0a 20 20 20 20 6e 20 3d  ' ) z++;.    n =
16290 20 73 74 72 6c 65 6e 33 30 28 7a 29 3b 0a 20 20   strlen30(z);.  
162a0 20 20 69 66 28 20 6e 3e 3d 32 20 26 26 20 30 3d    if( n>=2 && 0=
162b0 3d 73 74 72 6e 63 6d 70 28 7a 2c 20 22 2d 76 65  =strncmp(z, "-ve
162c0 72 62 6f 73 65 22 2c 20 6e 29 20 29 7b 0a 20 20  rbose", n) ){.  
162d0 20 20 20 20 70 53 74 61 74 65 2d 3e 65 78 70 65      pState->expe
162e0 72 74 2e 62 56 65 72 62 6f 73 65 20 3d 20 31 3b  rt.bVerbose = 1;
162f0 0a 20 20 20 20 7d 0a 20 20 20 20 65 6c 73 65 20  .    }.    else 
16300 69 66 28 20 6e 3e 3d 32 20 26 26 20 30 3d 3d 73  if( n>=2 && 0==s
16310 74 72 6e 63 6d 70 28 7a 2c 20 22 2d 73 61 6d 70  trncmp(z, "-samp
16320 6c 65 22 2c 20 6e 29 20 29 7b 0a 20 20 20 20 20  le", n) ){.     
16330 20 69 66 28 20 69 3d 3d 28 6e 41 72 67 2d 31 29   if( i==(nArg-1)
16340 20 29 7b 0a 20 20 20 20 20 20 20 20 72 61 77 5f   ){.        raw_
16350 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
16360 6f 70 74 69 6f 6e 20 72 65 71 75 69 72 65 73 20  option requires 
16370 61 6e 20 61 72 67 75 6d 65 6e 74 3a 20 25 73 5c  an argument: %s\
16380 6e 22 2c 20 7a 29 3b 0a 20 20 20 20 20 20 20 20  n", z);.        
16390 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
163a0 52 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  R;.      }else{.
163b0 20 20 20 20 20 20 20 20 69 53 61 6d 70 6c 65 20          iSample 
163c0 3d 20 28 69 6e 74 29 69 6e 74 65 67 65 72 56 61  = (int)integerVa
163d0 6c 75 65 28 61 7a 41 72 67 5b 2b 2b 69 5d 29 3b  lue(azArg[++i]);
163e0 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 53 61  .        if( iSa
163f0 6d 70 6c 65 3c 30 20 7c 7c 20 69 53 61 6d 70 6c  mple<0 || iSampl
16400 65 3e 31 30 30 20 29 7b 0a 20 20 20 20 20 20 20  e>100 ){.       
16410 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74     raw_printf(st
16420 64 65 72 72 2c 20 22 76 61 6c 75 65 20 6f 75 74  derr, "value out
16430 20 6f 66 20 72 61 6e 67 65 3a 20 25 73 5c 6e 22   of range: %s\n"
16440 2c 20 61 7a 41 72 67 5b 69 5d 29 3b 0a 20 20 20  , azArg[i]);.   
16450 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
16460 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  TE_ERROR;.      
16470 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
16480 7d 0a 20 20 20 20 65 6c 73 65 7b 0a 20 20 20 20  }.    else{.    
16490 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64    raw_printf(std
164a0 65 72 72 2c 20 22 75 6e 6b 6e 6f 77 6e 20 6f 70  err, "unknown op
164b0 74 69 6f 6e 3a 20 25 73 5c 6e 22 2c 20 7a 29 3b  tion: %s\n", z);
164c0 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
164d0 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  TE_ERROR;.    }.
164e0 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53    }..  if( rc==S
164f0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
16500 70 53 74 61 74 65 2d 3e 65 78 70 65 72 74 2e 70  pState->expert.p
16510 45 78 70 65 72 74 20 3d 20 73 71 6c 69 74 65 33  Expert = sqlite3
16520 5f 65 78 70 65 72 74 5f 6e 65 77 28 70 53 74 61  _expert_new(pSta
16530 74 65 2d 3e 64 62 2c 20 26 7a 45 72 72 29 3b 0a  te->db, &zErr);.
16540 20 20 20 20 69 66 28 20 70 53 74 61 74 65 2d 3e      if( pState->
16550 65 78 70 65 72 74 2e 70 45 78 70 65 72 74 3d 3d  expert.pExpert==
16560 30 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70  0 ){.      raw_p
16570 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 73  rintf(stderr, "s
16580 71 6c 69 74 65 33 5f 65 78 70 65 72 74 5f 6e 65  qlite3_expert_ne
16590 77 3a 20 25 73 5c 6e 22 2c 20 7a 45 72 72 29 3b  w: %s\n", zErr);
165a0 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
165b0 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 65  TE_ERROR;.    }e
165c0 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
165d0 65 33 5f 65 78 70 65 72 74 5f 63 6f 6e 66 69 67  e3_expert_config
165e0 28 0a 20 20 20 20 20 20 20 20 20 20 70 53 74 61  (.          pSta
165f0 74 65 2d 3e 65 78 70 65 72 74 2e 70 45 78 70 65  te->expert.pExpe
16600 72 74 2c 20 45 58 50 45 52 54 5f 43 4f 4e 46 49  rt, EXPERT_CONFI
16610 47 5f 53 41 4d 50 4c 45 2c 20 69 53 61 6d 70 6c  G_SAMPLE, iSampl
16620 65 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d  e.      );.    }
16630 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
16640 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 69  c;.}.#endif /* i
16650 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
16660 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a  T_VIRTUALTABLE *
16670 2f 0a 0a 2f 2a 0a 2a 2a 20 45 78 65 63 75 74 65  /../*.** Execute
16680 20 61 20 73 74 61 74 65 6d 65 6e 74 20 6f 72 20   a statement or 
16690 73 65 74 20 6f 66 20 73 74 61 74 65 6d 65 6e 74  set of statement
166a0 73 2e 20 20 50 72 69 6e 74 0a 2a 2a 20 61 6e 79  s.  Print.** any
166b0 20 72 65 73 75 6c 74 20 72 6f 77 73 2f 63 6f 6c   result rows/col
166c0 75 6d 6e 73 20 64 65 70 65 6e 64 69 6e 67 20 6f  umns depending o
166d0 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 6d 6f  n the current mo
166e0 64 65 0a 2a 2a 20 73 65 74 20 76 69 61 20 74 68  de.** set via th
166f0 65 20 73 75 70 70 6c 69 65 64 20 63 61 6c 6c 62  e supplied callb
16700 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ack..**.** This 
16710 69 73 20 76 65 72 79 20 73 69 6d 69 6c 61 72 20  is very similar 
16720 74 6f 20 53 51 4c 69 74 65 27 73 20 62 75 69 6c  to SQLite's buil
16730 74 2d 69 6e 20 73 71 6c 69 74 65 33 5f 65 78 65  t-in sqlite3_exe
16740 63 28 29 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  c().** function 
16750 65 78 63 65 70 74 20 69 74 20 74 61 6b 65 73 20  except it takes 
16760 61 20 73 6c 69 67 68 74 6c 79 20 64 69 66 66 65  a slightly diffe
16770 72 65 6e 74 20 63 61 6c 6c 62 61 63 6b 0a 2a 2a  rent callback.**
16780 20 61 6e 64 20 63 61 6c 6c 62 61 63 6b 20 64 61   and callback da
16790 74 61 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a  ta argument..*/.
167a0 73 74 61 74 69 63 20 69 6e 74 20 73 68 65 6c 6c  static int shell
167b0 5f 65 78 65 63 28 0a 20 20 53 68 65 6c 6c 53 74  _exec(.  ShellSt
167c0 61 74 65 20 2a 70 41 72 67 2c 20 20 20 20 20 20  ate *pArg,      
167d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
167e0 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
167f0 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 2f 0a 20   ShellState */. 
16800 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71   const char *zSq
16810 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l,              
16820 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 51             /* SQ
16830 4c 20 74 6f 20 62 65 20 65 76 61 6c 75 61 74 65  L to be evaluate
16840 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70 7a  d */.  char **pz
16850 45 72 72 4d 73 67 20 20 20 20 20 20 20 20 20 20  ErrMsg          
16860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16870 20 2f 2a 20 45 72 72 6f 72 20 6d 73 67 20 77 72   /* Error msg wr
16880 69 74 74 65 6e 20 68 65 72 65 20 2a 2f 0a 29 7b  itten here */.){
16890 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
168a0 2a 70 53 74 6d 74 20 3d 20 4e 55 4c 4c 3b 20 20  *pStmt = NULL;  
168b0 20 20 20 2f 2a 20 53 74 61 74 65 6d 65 6e 74 20     /* Statement 
168c0 74 6f 20 65 78 65 63 75 74 65 2e 20 2a 2f 0a 20  to execute. */. 
168d0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
168e0 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
168f0 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64 65 20   /* Return Code 
16900 2a 2f 0a 20 20 69 6e 74 20 72 63 32 3b 0a 20 20  */.  int rc2;.  
16910 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4c 65 66  const char *zLef
16920 74 6f 76 65 72 3b 20 20 20 20 20 20 20 20 20 20  tover;          
16930 2f 2a 20 54 61 69 6c 20 6f 66 20 75 6e 70 72 6f  /* Tail of unpro
16940 63 65 73 73 65 64 20 53 51 4c 20 2a 2f 0a 20 20  cessed SQL */.  
16950 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 41  sqlite3 *db = pA
16960 72 67 2d 3e 64 62 3b 0a 0a 20 20 69 66 28 20 70  rg->db;..  if( p
16970 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20 2a  zErrMsg ){.    *
16980 70 7a 45 72 72 4d 73 67 20 3d 20 4e 55 4c 4c 3b  pzErrMsg = NULL;
16990 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  .  }..#ifndef SQ
169a0 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
169b0 4c 54 41 42 4c 45 0a 20 20 69 66 28 20 70 41 72  LTABLE.  if( pAr
169c0 67 2d 3e 65 78 70 65 72 74 2e 70 45 78 70 65 72  g->expert.pExper
169d0 74 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 65 78  t ){.    rc = ex
169e0 70 65 72 74 48 61 6e 64 6c 65 53 51 4c 28 70 41  pertHandleSQL(pA
169f0 72 67 2c 20 7a 53 71 6c 2c 20 70 7a 45 72 72 4d  rg, zSql, pzErrM
16a00 73 67 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  sg);.    return 
16a10 65 78 70 65 72 74 46 69 6e 69 73 68 28 70 41 72  expertFinish(pAr
16a20 67 2c 20 28 72 63 21 3d 53 51 4c 49 54 45 5f 4f  g, (rc!=SQLITE_O
16a30 4b 29 2c 20 70 7a 45 72 72 4d 73 67 29 3b 0a 20  K), pzErrMsg);. 
16a40 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 77 68 69   }.#endif..  whi
16a50 6c 65 28 20 7a 53 71 6c 5b 30 5d 20 26 26 20 28  le( zSql[0] && (
16a60 53 51 4c 49 54 45 5f 4f 4b 20 3d 3d 20 72 63 29  SQLITE_OK == rc)
16a70 20 29 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63   ){.    static c
16a80 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 74 6d 74  onst char *zStmt
16a90 53 71 6c 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  Sql;.    rc = sq
16aa0 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32  lite3_prepare_v2
16ab0 28 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26  (db, zSql, -1, &
16ac0 70 53 74 6d 74 2c 20 26 7a 4c 65 66 74 6f 76 65  pStmt, &zLeftove
16ad0 72 29 3b 0a 20 20 20 20 69 66 28 20 53 51 4c 49  r);.    if( SQLI
16ae0 54 45 5f 4f 4b 20 21 3d 20 72 63 20 29 7b 0a 20  TE_OK != rc ){. 
16af0 20 20 20 20 20 69 66 28 20 70 7a 45 72 72 4d 73       if( pzErrMs
16b00 67 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 7a  g ){.        *pz
16b10 45 72 72 4d 73 67 20 3d 20 73 61 76 65 5f 65 72  ErrMsg = save_er
16b20 72 5f 6d 73 67 28 64 62 29 3b 0a 20 20 20 20 20  r_msg(db);.     
16b30 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
16b40 20 20 20 20 69 66 28 20 21 70 53 74 6d 74 20 29      if( !pStmt )
16b50 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 74 68 69  {.        /* thi
16b60 73 20 68 61 70 70 65 6e 73 20 66 6f 72 20 61 20  s happens for a 
16b70 63 6f 6d 6d 65 6e 74 20 6f 72 20 77 68 69 74 65  comment or white
16b80 2d 73 70 61 63 65 20 2a 2f 0a 20 20 20 20 20 20  -space */.      
16b90 20 20 7a 53 71 6c 20 3d 20 7a 4c 65 66 74 6f 76    zSql = zLeftov
16ba0 65 72 3b 0a 20 20 20 20 20 20 20 20 77 68 69 6c  er;.        whil
16bb0 65 28 20 49 73 53 70 61 63 65 28 7a 53 71 6c 5b  e( IsSpace(zSql[
16bc0 30 5d 29 20 29 20 7a 53 71 6c 2b 2b 3b 0a 20 20  0]) ) zSql++;.  
16bd0 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
16be0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 53        }.      zS
16bf0 74 6d 74 53 71 6c 20 3d 20 73 71 6c 69 74 65 33  tmtSql = sqlite3
16c00 5f 73 71 6c 28 70 53 74 6d 74 29 3b 0a 20 20 20  _sql(pStmt);.   
16c10 20 20 20 69 66 28 20 7a 53 74 6d 74 53 71 6c 3d     if( zStmtSql=
16c20 3d 30 20 29 20 7a 53 74 6d 74 53 71 6c 20 3d 20  =0 ) zStmtSql = 
16c30 22 22 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28  "";.      while(
16c40 20 49 73 53 70 61 63 65 28 7a 53 74 6d 74 53 71   IsSpace(zStmtSq
16c50 6c 5b 30 5d 29 20 29 20 7a 53 74 6d 74 53 71 6c  l[0]) ) zStmtSql
16c60 2b 2b 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 73 61  ++;..      /* sa
16c70 76 65 20 6f 66 66 20 74 68 65 20 70 72 65 70 61  ve off the prepa
16c80 72 65 64 20 73 74 61 74 6d 65 6e 74 20 68 61 6e  red statment han
16c90 64 6c 65 20 61 6e 64 20 72 65 73 65 74 20 72 6f  dle and reset ro
16ca0 77 20 63 6f 75 6e 74 20 2a 2f 0a 20 20 20 20 20  w count */.     
16cb0 20 69 66 28 20 70 41 72 67 20 29 7b 0a 20 20 20   if( pArg ){.   
16cc0 20 20 20 20 20 70 41 72 67 2d 3e 70 53 74 6d 74       pArg->pStmt
16cd0 20 3d 20 70 53 74 6d 74 3b 0a 20 20 20 20 20 20   = pStmt;.      
16ce0 20 20 70 41 72 67 2d 3e 63 6e 74 20 3d 20 30 3b    pArg->cnt = 0;
16cf0 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
16d00 2f 2a 20 65 63 68 6f 20 74 68 65 20 73 71 6c 20  /* echo the sql 
16d10 73 74 61 74 65 6d 65 6e 74 20 69 66 20 65 63 68  statement if ech
16d20 6f 20 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 69 66  o on */.      if
16d30 28 20 70 41 72 67 20 26 26 20 53 68 65 6c 6c 48  ( pArg && ShellH
16d40 61 73 46 6c 61 67 28 70 41 72 67 2c 20 53 48 46  asFlag(pArg, SHF
16d50 4c 47 5f 45 63 68 6f 29 20 29 7b 0a 20 20 20 20  LG_Echo) ){.    
16d60 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
16d70 70 41 72 67 2d 3e 6f 75 74 2c 20 22 25 73 5c 6e  pArg->out, "%s\n
16d80 22 2c 20 7a 53 74 6d 74 53 71 6c 20 3f 20 7a 53  ", zStmtSql ? zS
16d90 74 6d 74 53 71 6c 20 3a 20 7a 53 71 6c 29 3b 0a  tmtSql : zSql);.
16da0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
16db0 2a 20 53 68 6f 77 20 74 68 65 20 45 58 50 4c 41  * Show the EXPLA
16dc0 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 20 69 66  IN QUERY PLAN if
16dd0 20 2e 65 71 70 20 69 73 20 6f 6e 20 2a 2f 0a 20   .eqp is on */. 
16de0 20 20 20 20 20 69 66 28 20 70 41 72 67 20 26 26       if( pArg &&
16df0 20 70 41 72 67 2d 3e 61 75 74 6f 45 51 50 20 26   pArg->autoEQP &
16e00 26 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 69  & sqlite3_stmt_i
16e10 73 65 78 70 6c 61 69 6e 28 70 53 74 6d 74 29 3d  sexplain(pStmt)=
16e20 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =0 ){.        sq
16e30 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 45 78 70  lite3_stmt *pExp
16e40 6c 61 69 6e 3b 0a 20 20 20 20 20 20 20 20 63 68  lain;.        ch
16e50 61 72 20 2a 7a 45 51 50 3b 0a 20 20 20 20 20 20  ar *zEQP;.      
16e60 20 20 69 6e 74 20 74 72 69 67 67 65 72 45 51 50    int triggerEQP
16e70 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 64 69   = 0;.        di
16e80 73 61 62 6c 65 5f 64 65 62 75 67 5f 74 72 61 63  sable_debug_trac
16e90 65 5f 6d 6f 64 65 73 28 29 3b 0a 20 20 20 20 20  e_modes();.     
16ea0 20 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 63 6f     sqlite3_db_co
16eb0 6e 66 69 67 28 64 62 2c 20 53 51 4c 49 54 45 5f  nfig(db, SQLITE_
16ec0 44 42 43 4f 4e 46 49 47 5f 54 52 49 47 47 45 52  DBCONFIG_TRIGGER
16ed0 5f 45 51 50 2c 20 2d 31 2c 20 26 74 72 69 67 67  _EQP, -1, &trigg
16ee0 65 72 45 51 50 29 3b 0a 20 20 20 20 20 20 20 20  erEQP);.        
16ef0 69 66 28 20 70 41 72 67 2d 3e 61 75 74 6f 45 51  if( pArg->autoEQ
16f00 50 3e 3d 41 55 54 4f 45 51 50 5f 74 72 69 67 67  P>=AUTOEQP_trigg
16f10 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  er ){.          
16f20 73 71 6c 69 74 65 33 5f 64 62 5f 63 6f 6e 66 69  sqlite3_db_confi
16f30 67 28 64 62 2c 20 53 51 4c 49 54 45 5f 44 42 43  g(db, SQLITE_DBC
16f40 4f 4e 46 49 47 5f 54 52 49 47 47 45 52 5f 45 51  ONFIG_TRIGGER_EQ
16f50 50 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20  P, 1, 0);.      
16f60 20 20 7d 0a 20 20 20 20 20 20 20 20 7a 45 51 50    }.        zEQP
16f70 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
16f80 74 66 28 22 45 58 50 4c 41 49 4e 20 51 55 45 52  tf("EXPLAIN QUER
16f90 59 20 50 4c 41 4e 20 25 73 22 2c 20 7a 53 74 6d  Y PLAN %s", zStm
16fa0 74 53 71 6c 29 3b 0a 20 20 20 20 20 20 20 20 72  tSql);.        r
16fb0 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70  c = sqlite3_prep
16fc0 61 72 65 5f 76 32 28 64 62 2c 20 7a 45 51 50 2c  are_v2(db, zEQP,
16fd0 20 2d 31 2c 20 26 70 45 78 70 6c 61 69 6e 2c 20   -1, &pExplain, 
16fe0 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  0);.        if( 
16ff0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
17000 0a 20 20 20 20 20 20 20 20 20 20 77 68 69 6c 65  .          while
17010 28 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70  ( sqlite3_step(p
17020 45 78 70 6c 61 69 6e 29 3d 3d 53 51 4c 49 54 45  Explain)==SQLITE
17030 5f 52 4f 57 20 29 7b 0a 20 20 20 20 20 20 20 20  _ROW ){.        
17040 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
17050 7a 45 51 50 4c 69 6e 65 20 3d 20 28 63 6f 6e 73  zEQPLine = (cons
17060 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f  t char*)sqlite3_
17070 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 45 78 70  column_text(pExp
17080 6c 61 69 6e 2c 33 29 3b 0a 20 20 20 20 20 20 20  lain,3);.       
17090 20 20 20 20 20 69 6e 74 20 69 45 71 70 49 64 20       int iEqpId 
170a0 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
170b0 5f 69 6e 74 28 70 45 78 70 6c 61 69 6e 2c 20 30  _int(pExplain, 0
170c0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
170d0 6e 74 20 69 50 61 72 65 6e 74 49 64 20 3d 20 73  nt iParentId = s
170e0 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e  qlite3_column_in
170f0 74 28 70 45 78 70 6c 61 69 6e 2c 20 31 29 3b 0a  t(pExplain, 1);.
17100 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
17110 7a 45 51 50 4c 69 6e 65 5b 30 5d 3d 3d 27 2d 27  zEQPLine[0]=='-'
17120 20 29 20 65 71 70 5f 72 65 6e 64 65 72 28 70 41   ) eqp_render(pA
17130 72 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  rg);.           
17140 20 65 71 70 5f 61 70 70 65 6e 64 28 70 41 72 67   eqp_append(pArg
17150 2c 20 69 45 71 70 49 64 2c 20 69 50 61 72 65 6e  , iEqpId, iParen
17160 74 49 64 2c 20 7a 45 51 50 4c 69 6e 65 29 3b 0a  tId, zEQPLine);.
17170 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
17180 20 20 20 20 20 20 65 71 70 5f 72 65 6e 64 65 72        eqp_render
17190 28 70 41 72 67 29 3b 0a 20 20 20 20 20 20 20 20  (pArg);.        
171a0 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  }.        sqlite
171b0 33 5f 66 69 6e 61 6c 69 7a 65 28 70 45 78 70 6c  3_finalize(pExpl
171c0 61 69 6e 29 3b 0a 20 20 20 20 20 20 20 20 73 71  ain);.        sq
171d0 6c 69 74 65 33 5f 66 72 65 65 28 7a 45 51 50 29  lite3_free(zEQP)
171e0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 41  ;.        if( pA
171f0 72 67 2d 3e 61 75 74 6f 45 51 50 3e 3d 41 55 54  rg->autoEQP>=AUT
17200 4f 45 51 50 5f 66 75 6c 6c 20 29 7b 0a 20 20 20  OEQP_full ){.   
17210 20 20 20 20 20 20 20 2f 2a 20 41 6c 73 6f 20 64         /* Also d
17220 6f 20 61 6e 20 45 58 50 4c 41 49 4e 20 66 6f 72  o an EXPLAIN for
17230 20 22 2e 65 71 70 20 66 75 6c 6c 22 20 6d 6f 64   ".eqp full" mod
17240 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 7a  e */.          z
17250 45 51 50 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  EQP = sqlite3_mp
17260 72 69 6e 74 66 28 22 45 58 50 4c 41 49 4e 20 25  rintf("EXPLAIN %
17270 73 22 2c 20 7a 53 74 6d 74 53 71 6c 29 3b 0a 20  s", zStmtSql);. 
17280 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
17290 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32  lite3_prepare_v2
172a0 28 64 62 2c 20 7a 45 51 50 2c 20 2d 31 2c 20 26  (db, zEQP, -1, &
172b0 70 45 78 70 6c 61 69 6e 2c 20 30 29 3b 0a 20 20  pExplain, 0);.  
172c0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
172d0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
172e0 20 20 20 20 20 20 20 20 20 70 41 72 67 2d 3e 63           pArg->c
172f0 4d 6f 64 65 20 3d 20 4d 4f 44 45 5f 45 78 70 6c  Mode = MODE_Expl
17300 61 69 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ain;.           
17310 20 65 78 70 6c 61 69 6e 5f 64 61 74 61 5f 70 72   explain_data_pr
17320 65 70 61 72 65 28 70 41 72 67 2c 20 70 45 78 70  epare(pArg, pExp
17330 6c 61 69 6e 29 3b 0a 20 20 20 20 20 20 20 20 20  lain);.         
17340 20 20 20 65 78 65 63 5f 70 72 65 70 61 72 65 64     exec_prepared
17350 5f 73 74 6d 74 28 70 41 72 67 2c 20 70 45 78 70  _stmt(pArg, pExp
17360 6c 61 69 6e 29 3b 0a 20 20 20 20 20 20 20 20 20  lain);.         
17370 20 20 20 65 78 70 6c 61 69 6e 5f 64 61 74 61 5f     explain_data_
17380 64 65 6c 65 74 65 28 70 41 72 67 29 3b 0a 20 20  delete(pArg);.  
17390 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
173a0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61      sqlite3_fina
173b0 6c 69 7a 65 28 70 45 78 70 6c 61 69 6e 29 3b 0a  lize(pExplain);.
173c0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
173d0 33 5f 66 72 65 65 28 7a 45 51 50 29 3b 0a 20 20  3_free(zEQP);.  
173e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
173f0 69 66 28 20 70 41 72 67 2d 3e 61 75 74 6f 45 51  if( pArg->autoEQ
17400 50 3e 3d 41 55 54 4f 45 51 50 5f 74 72 69 67 67  P>=AUTOEQP_trigg
17410 65 72 20 26 26 20 74 72 69 67 67 65 72 45 51 50  er && triggerEQP
17420 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
17430 20 73 71 6c 69 74 65 33 5f 64 62 5f 63 6f 6e 66   sqlite3_db_conf
17440 69 67 28 64 62 2c 20 53 51 4c 49 54 45 5f 44 42  ig(db, SQLITE_DB
17450 43 4f 4e 46 49 47 5f 54 52 49 47 47 45 52 5f 45  CONFIG_TRIGGER_E
17460 51 50 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  QP, 0, 0);.     
17470 20 20 20 20 20 2f 2a 20 52 65 70 72 65 70 61 72       /* Reprepar
17480 65 20 70 53 74 6d 74 20 62 65 66 6f 72 65 20 72  e pStmt before r
17490 65 61 63 74 69 76 69 6e 67 20 74 72 61 63 65 20  eactiving trace 
174a0 6d 6f 64 65 73 20 2a 2f 0a 20 20 20 20 20 20 20  modes */.       
174b0 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c     sqlite3_final
174c0 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20  ize(pStmt);.    
174d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 70 72        sqlite3_pr
174e0 65 70 61 72 65 5f 76 32 28 64 62 2c 20 7a 53 71  epare_v2(db, zSq
174f0 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30  l, -1, &pStmt, 0
17500 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
17510 20 70 41 72 67 20 29 20 70 41 72 67 2d 3e 70 53   pArg ) pArg->pS
17520 74 6d 74 20 3d 20 70 53 74 6d 74 3b 0a 20 20 20  tmt = pStmt;.   
17530 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72       }.        r
17540 65 73 74 6f 72 65 5f 64 65 62 75 67 5f 74 72 61  estore_debug_tra
17550 63 65 5f 6d 6f 64 65 73 28 29 3b 0a 20 20 20 20  ce_modes();.    
17560 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 70    }..      if( p
17570 41 72 67 20 29 7b 0a 20 20 20 20 20 20 20 20 70  Arg ){.        p
17580 41 72 67 2d 3e 63 4d 6f 64 65 20 3d 20 70 41 72  Arg->cMode = pAr
17590 67 2d 3e 6d 6f 64 65 3b 0a 20 20 20 20 20 20 20  g->mode;.       
175a0 20 69 66 28 20 70 41 72 67 2d 3e 61 75 74 6f 45   if( pArg->autoE
175b0 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20 20 20  xplain ){.      
175c0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f      if( sqlite3_
175d0 73 74 6d 74 5f 69 73 65 78 70 6c 61 69 6e 28 70  stmt_isexplain(p
175e0 53 74 6d 74 29 3d 3d 31 20 29 7b 0a 20 20 20 20  Stmt)==1 ){.    
175f0 20 20 20 20 20 20 20 20 70 41 72 67 2d 3e 63 4d          pArg->cM
17600 6f 64 65 20 3d 20 4d 4f 44 45 5f 45 78 70 6c 61  ode = MODE_Expla
17610 69 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  in;.          }.
17620 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71            if( sq
17630 6c 69 74 65 33 5f 73 74 6d 74 5f 69 73 65 78 70  lite3_stmt_isexp
17640 6c 61 69 6e 28 70 53 74 6d 74 29 3d 3d 32 20 29  lain(pStmt)==2 )
17650 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 41  {.            pA
17660 72 67 2d 3e 63 4d 6f 64 65 20 3d 20 4d 4f 44 45  rg->cMode = MODE
17670 5f 45 51 50 3b 0a 20 20 20 20 20 20 20 20 20 20  _EQP;.          
17680 7d 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  }.        }..   
17690 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73       /* If the s
176a0 68 65 6c 6c 20 69 73 20 63 75 72 72 65 6e 74 6c  hell is currentl
176b0 79 20 69 6e 20 22 2e 65 78 70 6c 61 69 6e 22 20  y in ".explain" 
176c0 6d 6f 64 65 2c 20 67 61 74 68 65 72 20 74 68 65  mode, gather the
176d0 20 65 78 74 72 61 0a 20 20 20 20 20 20 20 20 2a   extra.        *
176e0 2a 20 64 61 74 61 20 72 65 71 75 69 72 65 64 20  * data required 
176f0 74 6f 20 61 64 64 20 69 6e 64 65 6e 74 73 20 74  to add indents t
17700 6f 20 74 68 65 20 6f 75 74 70 75 74 2e 2a 2f 0a  o the output.*/.
17710 20 20 20 20 20 20 20 20 69 66 28 20 70 41 72 67          if( pArg
17720 2d 3e 63 4d 6f 64 65 3d 3d 4d 4f 44 45 5f 45 78  ->cMode==MODE_Ex
17730 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20 20 20 20  plain ){.       
17740 20 20 20 65 78 70 6c 61 69 6e 5f 64 61 74 61 5f     explain_data_
17750 70 72 65 70 61 72 65 28 70 41 72 67 2c 20 70 53  prepare(pArg, pS
17760 74 6d 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  tmt);.        }.
17770 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 62        }..      b
17780 69 6e 64 5f 70 72 65 70 61 72 65 64 5f 73 74 6d  ind_prepared_stm
17790 74 28 70 41 72 67 2c 20 70 53 74 6d 74 29 3b 0a  t(pArg, pStmt);.
177a0 20 20 20 20 20 20 65 78 65 63 5f 70 72 65 70 61        exec_prepa
177b0 72 65 64 5f 73 74 6d 74 28 70 41 72 67 2c 20 70  red_stmt(pArg, p
177c0 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 65 78 70  Stmt);.      exp
177d0 6c 61 69 6e 5f 64 61 74 61 5f 64 65 6c 65 74 65  lain_data_delete
177e0 28 70 41 72 67 29 3b 0a 20 20 20 20 20 20 65 71  (pArg);.      eq
177f0 70 5f 72 65 6e 64 65 72 28 70 41 72 67 29 3b 0a  p_render(pArg);.
17800 0a 20 20 20 20 20 20 2f 2a 20 70 72 69 6e 74 20  .      /* print 
17810 75 73 61 67 65 20 73 74 61 74 73 20 69 66 20 73  usage stats if s
17820 74 61 74 73 20 6f 6e 20 2a 2f 0a 20 20 20 20 20  tats on */.     
17830 20 69 66 28 20 70 41 72 67 20 26 26 20 70 41 72   if( pArg && pAr
17840 67 2d 3e 73 74 61 74 73 4f 6e 20 29 7b 0a 20 20  g->statsOn ){.  
17850 20 20 20 20 20 20 64 69 73 70 6c 61 79 5f 73 74        display_st
17860 61 74 73 28 64 62 2c 20 70 41 72 67 2c 20 30 29  ats(db, pArg, 0)
17870 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
17880 20 2f 2a 20 70 72 69 6e 74 20 6c 6f 6f 70 2d 63   /* print loop-c
17890 6f 75 6e 74 65 72 73 20 69 66 20 72 65 71 75 69  ounters if requi
178a0 72 65 64 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  red */.      if(
178b0 20 70 41 72 67 20 26 26 20 70 41 72 67 2d 3e 73   pArg && pArg->s
178c0 63 61 6e 73 74 61 74 73 4f 6e 20 29 7b 0a 20 20  canstatsOn ){.  
178d0 20 20 20 20 20 20 64 69 73 70 6c 61 79 5f 73 63        display_sc
178e0 61 6e 73 74 61 74 73 28 64 62 2c 20 70 41 72 67  anstats(db, pArg
178f0 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
17900 20 20 2f 2a 20 46 69 6e 61 6c 69 7a 65 20 74 68    /* Finalize th
17910 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 75 73 74  e statement just
17920 20 65 78 65 63 75 74 65 64 2e 20 49 66 20 74 68   executed. If th
17930 69 73 20 66 61 69 6c 73 2c 20 73 61 76 65 20 61  is fails, save a
17940 0a 20 20 20 20 20 20 2a 2a 20 63 6f 70 79 20 6f  .      ** copy o
17950 66 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73  f the error mess
17960 61 67 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  age. Otherwise, 
17970 73 65 74 20 7a 53 71 6c 20 74 6f 20 70 6f 69 6e  set zSql to poin
17980 74 20 74 6f 20 74 68 65 0a 20 20 20 20 20 20 2a  t to the.      *
17990 2a 20 6e 65 78 74 20 73 74 61 74 65 6d 65 6e 74  * next statement
179a0 20 74 6f 20 65 78 65 63 75 74 65 2e 20 2a 2f 0a   to execute. */.
179b0 20 20 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69        rc2 = sqli
179c0 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74  te3_finalize(pSt
179d0 6d 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  mt);.      if( r
179e0 63 21 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c!=SQLITE_NOMEM 
179f0 29 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 20 20  ) rc = rc2;.    
17a00 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
17a10 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  _OK ){.        z
17a20 53 71 6c 20 3d 20 7a 4c 65 66 74 6f 76 65 72 3b  Sql = zLeftover;
17a30 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20  .        while( 
17a40 49 73 53 70 61 63 65 28 7a 53 71 6c 5b 30 5d 29  IsSpace(zSql[0])
17a50 20 29 20 7a 53 71 6c 2b 2b 3b 0a 20 20 20 20 20   ) zSql++;.     
17a60 20 7d 65 6c 73 65 20 69 66 28 20 70 7a 45 72 72   }else if( pzErr
17a70 4d 73 67 20 29 7b 0a 20 20 20 20 20 20 20 20 2a  Msg ){.        *
17a80 70 7a 45 72 72 4d 73 67 20 3d 20 73 61 76 65 5f  pzErrMsg = save_
17a90 65 72 72 5f 6d 73 67 28 64 62 29 3b 0a 20 20 20  err_msg(db);.   
17aa0 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 63     }..      /* c
17ab0 6c 65 61 72 20 73 61 76 65 64 20 73 74 6d 74 20  lear saved stmt 
17ac0 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 20 20 20 20  handle */.      
17ad0 69 66 28 20 70 41 72 67 20 29 7b 0a 20 20 20 20  if( pArg ){.    
17ae0 20 20 20 20 70 41 72 67 2d 3e 70 53 74 6d 74 20      pArg->pStmt 
17af0 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 20 20 7d 0a  = NULL;.      }.
17b00 20 20 20 20 7d 0a 20 20 7d 20 2f 2a 20 65 6e 64      }.  } /* end
17b10 20 77 68 69 6c 65 20 2a 2f 0a 0a 20 20 72 65 74   while */..  ret
17b20 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
17b30 20 52 65 6c 65 61 73 65 20 6d 65 6d 6f 72 79 20   Release memory 
17b40 70 72 65 76 69 6f 75 73 6c 79 20 61 6c 6c 6f 63  previously alloc
17b50 61 74 65 64 20 62 79 20 74 61 62 6c 65 43 6f 6c  ated by tableCol
17b60 75 6d 6e 4c 69 73 74 28 29 2e 0a 2a 2f 0a 73 74  umnList()..*/.st
17b70 61 74 69 63 20 76 6f 69 64 20 66 72 65 65 43 6f  atic void freeCo
17b80 6c 75 6d 6e 4c 69 73 74 28 63 68 61 72 20 2a 2a  lumnList(char **
17b90 61 7a 43 6f 6c 29 7b 0a 20 20 69 6e 74 20 69 3b  azCol){.  int i;
17ba0 0a 20 20 66 6f 72 28 69 3d 31 3b 20 61 7a 43 6f  .  for(i=1; azCo
17bb0 6c 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  l[i]; i++){.    
17bc0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 61 7a 43  sqlite3_free(azC
17bd0 6f 6c 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 2f 2a  ol[i]);.  }.  /*
17be0 20 61 7a 43 6f 6c 5b 30 5d 20 69 73 20 61 20 73   azCol[0] is a s
17bf0 74 61 74 69 63 20 73 74 72 69 6e 67 20 2a 2f 0a  tatic string */.
17c00 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 61    sqlite3_free(a
17c10 7a 43 6f 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  zCol);.}../*.** 
17c20 52 65 74 75 72 6e 20 61 20 6c 69 73 74 20 6f 66  Return a list of
17c30 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 73 74 72   pointers to str
17c40 69 6e 67 73 20 77 68 69 63 68 20 61 72 65 20 74  ings which are t
17c50 68 65 20 6e 61 6d 65 73 20 6f 66 20 61 6c 6c 0a  he names of all.
17c60 2a 2a 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 61  ** columns in ta
17c70 62 6c 65 20 7a 54 61 62 2e 20 20 20 54 68 65 20  ble zTab.   The 
17c80 6d 65 6d 6f 72 79 20 74 6f 20 68 6f 6c 64 20 74  memory to hold t
17c90 68 65 20 6e 61 6d 65 73 20 69 73 20 64 79 6e 61  he names is dyna
17ca0 6d 69 63 61 6c 6c 79 0a 2a 2a 20 61 6c 6c 6f 63  mically.** alloc
17cb0 61 74 65 64 20 61 6e 64 20 6d 75 73 74 20 62 65  ated and must be
17cc0 20 72 65 6c 65 61 73 65 64 20 62 79 20 74 68 65   released by the
17cd0 20 63 61 6c 6c 65 72 20 75 73 69 6e 67 20 61 20   caller using a 
17ce0 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 0a  subsequent call.
17cf0 2a 2a 20 74 6f 20 66 72 65 65 43 6f 6c 75 6d 6e  ** to freeColumn
17d00 4c 69 73 74 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68  List()..**.** Th
17d10 65 20 61 7a 43 6f 6c 5b 30 5d 20 65 6e 74 72 79  e azCol[0] entry
17d20 20 69 73 20 75 73 75 61 6c 6c 79 20 4e 55 4c 4c   is usually NULL
17d30 2e 20 20 48 6f 77 65 76 65 72 2c 20 69 66 20 7a  .  However, if z
17d40 54 61 62 20 63 6f 6e 74 61 69 6e 73 20 61 20 72  Tab contains a r
17d50 6f 77 69 64 0a 2a 2a 20 76 61 6c 75 65 20 74 68  owid.** value th
17d60 61 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 70  at needs to be p
17d70 72 65 73 65 72 76 65 64 2c 20 74 68 65 6e 20 61  reserved, then a
17d80 7a 43 6f 6c 5b 30 5d 20 69 73 20 66 69 6c 6c 65  zCol[0] is fille
17d90 64 20 69 6e 20 77 69 74 68 20 74 68 65 0a 2a 2a  d in with the.**
17da0 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 72 6f 77   name of the row
17db0 69 64 20 63 6f 6c 75 6d 6e 2e 0a 2a 2a 0a 2a 2a  id column..**.**
17dc0 20 54 68 65 20 66 69 72 73 74 20 72 65 67 75 6c   The first regul
17dd0 61 72 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65  ar column in the
17de0 20 74 61 62 6c 65 20 69 73 20 61 7a 43 6f 6c 5b   table is azCol[
17df0 31 5d 2e 20 20 54 68 65 20 6c 69 73 74 20 69 73  1].  The list is
17e00 20 74 65 72 6d 69 6e 61 74 65 64 0a 2a 2a 20 62   terminated.** b
17e10 79 20 61 6e 20 65 6e 74 72 79 20 77 69 74 68 20  y an entry with 
17e20 61 7a 43 6f 6c 5b 69 5d 3d 3d 30 2e 0a 2a 2f 0a  azCol[i]==0..*/.
17e30 73 74 61 74 69 63 20 63 68 61 72 20 2a 2a 74 61  static char **ta
17e40 62 6c 65 43 6f 6c 75 6d 6e 4c 69 73 74 28 53 68  bleColumnList(Sh
17e50 65 6c 6c 53 74 61 74 65 20 2a 70 2c 20 63 6f 6e  ellState *p, con
17e60 73 74 20 63 68 61 72 20 2a 7a 54 61 62 29 7b 0a  st char *zTab){.
17e70 20 20 63 68 61 72 20 2a 2a 61 7a 43 6f 6c 20 3d    char **azCol =
17e80 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74   0;.  sqlite3_st
17e90 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 63 68 61  mt *pStmt;.  cha
17ea0 72 20 2a 7a 53 71 6c 3b 0a 20 20 69 6e 74 20 6e  r *zSql;.  int n
17eb0 43 6f 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e  Col = 0;.  int n
17ec0 41 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 69 6e 74  Alloc = 0;.  int
17ed0 20 6e 50 4b 20 3d 20 30 3b 20 20 20 20 20 20 20   nPK = 0;       
17ee0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 50 52 49  /* Number of PRI
17ef0 4d 41 52 59 20 4b 45 59 20 63 6f 6c 75 6d 6e 73  MARY KEY columns
17f00 20 73 65 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 69   seen */.  int i
17f10 73 49 50 4b 20 3d 20 30 3b 20 20 20 20 20 2f 2a  sIPK = 0;     /*
17f20 20 54 72 75 65 20 69 66 20 6f 6e 65 20 50 52 49   True if one PRI
17f30 4d 41 52 59 20 4b 45 59 20 63 6f 6c 75 6d 6e 20  MARY KEY column 
17f40 6f 66 20 74 79 70 65 20 49 4e 54 45 47 45 52 20  of type INTEGER 
17f50 2a 2f 0a 20 20 69 6e 74 20 70 72 65 73 65 72 76  */.  int preserv
17f60 65 52 6f 77 69 64 20 3d 20 53 68 65 6c 6c 48 61  eRowid = ShellHa
17f70 73 46 6c 61 67 28 70 2c 20 53 48 46 4c 47 5f 50  sFlag(p, SHFLG_P
17f80 72 65 73 65 72 76 65 52 6f 77 69 64 29 3b 0a 20  reserveRowid);. 
17f90 20 69 6e 74 20 72 63 3b 0a 0a 20 20 7a 53 71 6c   int rc;..  zSql
17fa0 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
17fb0 74 66 28 22 50 52 41 47 4d 41 20 74 61 62 6c 65  tf("PRAGMA table
17fc0 5f 69 6e 66 6f 3d 25 51 22 2c 20 7a 54 61 62 29  _info=%Q", zTab)
17fd0 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
17fe0 5f 70 72 65 70 61 72 65 5f 76 32 28 70 2d 3e 64  _prepare_v2(p->d
17ff0 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53  b, zSql, -1, &pS
18000 74 6d 74 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74  tmt, 0);.  sqlit
18010 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20  e3_free(zSql);. 
18020 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
18030 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 73 71 6c   0;.  while( sql
18040 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29  ite3_step(pStmt)
18050 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a  ==SQLITE_ROW ){.
18060 20 20 20 20 69 66 28 20 6e 43 6f 6c 3e 3d 6e 41      if( nCol>=nA
18070 6c 6c 6f 63 2d 32 20 29 7b 0a 20 20 20 20 20 20  lloc-2 ){.      
18080 6e 41 6c 6c 6f 63 20 3d 20 6e 41 6c 6c 6f 63 2a  nAlloc = nAlloc*
18090 32 20 2b 20 6e 43 6f 6c 20 2b 20 31 30 3b 0a 20  2 + nCol + 10;. 
180a0 20 20 20 20 20 61 7a 43 6f 6c 20 3d 20 73 71 6c       azCol = sql
180b0 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 61 7a 43  ite3_realloc(azC
180c0 6f 6c 2c 20 6e 41 6c 6c 6f 63 2a 73 69 7a 65 6f  ol, nAlloc*sizeo
180d0 66 28 61 7a 43 6f 6c 5b 30 5d 29 29 3b 0a 20 20  f(azCol[0]));.  
180e0 20 20 20 20 69 66 28 20 61 7a 43 6f 6c 3d 3d 30      if( azCol==0
180f0 20 29 20 73 68 65 6c 6c 5f 6f 75 74 5f 6f 66 5f   ) shell_out_of_
18100 6d 65 6d 6f 72 79 28 29 3b 0a 20 20 20 20 7d 0a  memory();.    }.
18110 20 20 20 20 61 7a 43 6f 6c 5b 2b 2b 6e 43 6f 6c      azCol[++nCol
18120 5d 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  ] = sqlite3_mpri
18130 6e 74 66 28 22 25 73 22 2c 20 73 71 6c 69 74 65  ntf("%s", sqlite
18140 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53  3_column_text(pS
18150 74 6d 74 2c 20 31 29 29 3b 0a 20 20 20 20 69 66  tmt, 1));.    if
18160 28 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  ( sqlite3_column
18170 5f 69 6e 74 28 70 53 74 6d 74 2c 20 35 29 20 29  _int(pStmt, 5) )
18180 7b 0a 20 20 20 20 20 20 6e 50 4b 2b 2b 3b 0a 20  {.      nPK++;. 
18190 20 20 20 20 20 69 66 28 20 6e 50 4b 3d 3d 31 0a       if( nPK==1.
181a0 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65         && sqlite
181b0 33 5f 73 74 72 69 63 6d 70 28 28 63 6f 6e 73 74  3_stricmp((const
181c0 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63   char*)sqlite3_c
181d0 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74  olumn_text(pStmt
181e0 2c 32 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ,2),.           
181f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
18200 49 4e 54 45 47 45 52 22 29 3d 3d 30 0a 20 20 20  INTEGER")==0.   
18210 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 69 73     ){.        is
18220 49 50 4b 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  IPK = 1;.      }
18230 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 73  else{.        is
18240 49 50 4b 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  IPK = 0;.      }
18250 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
18260 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53  ite3_finalize(pS
18270 74 6d 74 29 3b 0a 20 20 69 66 28 20 61 7a 43 6f  tmt);.  if( azCo
18280 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  l==0 ) return 0;
18290 0a 20 20 61 7a 43 6f 6c 5b 30 5d 20 3d 20 30 3b  .  azCol[0] = 0;
182a0 0a 20 20 61 7a 43 6f 6c 5b 6e 43 6f 6c 2b 31 5d  .  azCol[nCol+1]
182b0 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 54 68 65 20   = 0;..  /* The 
182c0 64 65 63 69 73 69 6f 6e 20 6f 66 20 77 68 65 74  decision of whet
182d0 68 65 72 20 6f 72 20 6e 6f 74 20 61 20 72 6f 77  her or not a row
182e0 69 64 20 72 65 61 6c 6c 79 20 6e 65 65 64 73 20  id really needs 
182f0 74 6f 20 62 65 20 70 72 65 73 65 72 76 65 64 0a  to be preserved.
18300 20 20 2a 2a 20 69 73 20 74 72 69 63 6b 79 2e 20    ** is tricky. 
18310 20 57 65 20 6e 65 76 65 72 20 6e 65 65 64 20 74   We never need t
18320 6f 20 70 72 65 73 65 72 76 65 20 61 20 72 6f 77  o preserve a row
18330 69 64 20 66 6f 72 20 61 20 57 49 54 48 4f 55 54  id for a WITHOUT
18340 20 52 4f 57 49 44 20 74 61 62 6c 65 0a 20 20 2a   ROWID table.  *
18350 2a 20 6f 72 20 61 20 74 61 62 6c 65 20 77 69 74  * or a table wit
18360 68 20 61 6e 20 49 4e 54 45 47 45 52 20 50 52 49  h an INTEGER PRI
18370 4d 41 52 59 20 4b 45 59 2e 20 20 57 65 20 61 72  MARY KEY.  We ar
18380 65 20 75 6e 61 62 6c 65 20 74 6f 20 70 72 65 73  e unable to pres
18390 65 72 76 65 0a 20 20 2a 2a 20 72 6f 77 69 64 73  erve.  ** rowids
183a0 20 6f 6e 20 74 61 62 6c 65 73 20 77 68 65 72 65   on tables where
183b0 20 74 68 65 20 72 6f 77 69 64 20 69 73 20 69 6e   the rowid is in
183c0 61 63 63 65 73 73 69 62 6c 65 20 62 65 63 61 75  accessible becau
183d0 73 65 20 74 68 65 72 65 20 61 72 65 20 6f 74 68  se there are oth
183e0 65 72 0a 20 20 2a 2a 20 63 6f 6c 75 6d 6e 73 20  er.  ** columns 
183f0 69 6e 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d  in the table nam
18400 65 64 20 22 72 6f 77 69 64 22 2c 20 22 5f 72 6f  ed "rowid", "_ro
18410 77 69 64 5f 22 2c 20 61 6e 64 20 22 6f 69 64 22  wid_", and "oid"
18420 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 72 65  ..  */.  if( pre
18430 73 65 72 76 65 52 6f 77 69 64 20 26 26 20 69 73  serveRowid && is
18440 49 50 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  IPK ){.    /* If
18450 20 61 20 73 69 6e 67 6c 65 20 50 52 49 4d 41 52   a single PRIMAR
18460 59 20 4b 45 59 20 63 6f 6c 75 6d 6e 20 77 69 74  Y KEY column wit
18470 68 20 74 79 70 65 20 49 4e 54 45 47 45 52 20 77  h type INTEGER w
18480 61 73 20 73 65 65 6e 2c 20 74 68 65 6e 20 69 74  as seen, then it
18490 0a 20 20 20 20 2a 2a 20 6d 69 67 68 74 20 62 65  .    ** might be
184a0 20 61 6e 20 61 6c 69 73 65 20 66 6f 72 20 74 68   an alise for th
184b0 65 20 52 4f 57 49 44 2e 20 20 42 75 74 20 69 74  e ROWID.  But it
184c0 20 6d 69 67 68 74 20 61 6c 73 6f 20 62 65 20 61   might also be a
184d0 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 0a 20   WITHOUT ROWID. 
184e0 20 20 20 2a 2a 20 74 61 62 6c 65 20 6f 72 20 61     ** table or a
184f0 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
18500 20 4b 45 59 20 44 45 53 43 20 63 6f 6c 75 6d 6e   KEY DESC column
18510 2c 20 6e 65 69 74 68 65 72 20 6f 66 20 77 68 69  , neither of whi
18520 63 68 20 61 72 65 0a 20 20 20 20 2a 2a 20 52 4f  ch are.    ** RO
18530 57 49 44 20 61 6c 69 61 73 65 73 2e 20 20 54 6f  WID aliases.  To
18540 20 64 69 73 74 69 6e 67 75 69 73 68 20 74 68 65   distinguish the
18550 73 65 20 63 61 73 65 73 2c 20 63 68 65 63 6b 20  se cases, check 
18560 74 6f 20 73 65 65 20 69 66 0a 20 20 20 20 2a 2a  to see if.    **
18570 20 74 68 65 72 65 20 69 73 20 61 20 22 70 6b 22   there is a "pk"
18580 20 65 6e 74 72 79 20 69 6e 20 22 50 52 41 47 4d   entry in "PRAGM
18590 41 20 69 6e 64 65 78 5f 6c 69 73 74 22 2e 20 20  A index_list".  
185a0 54 68 65 72 65 20 77 69 6c 6c 20 62 65 0a 20 20  There will be.  
185b0 20 20 2a 2a 20 6e 6f 20 22 70 6b 22 20 69 6e 64    ** no "pk" ind
185c0 65 78 20 69 66 20 74 68 65 20 50 52 49 4d 41 52  ex if the PRIMAR
185d0 59 20 4b 45 59 20 72 65 61 6c 6c 79 20 69 73 20  Y KEY really is 
185e0 61 6e 20 61 6c 69 61 73 20 66 6f 72 20 74 68 65  an alias for the
185f0 20 52 4f 57 49 44 2e 0a 20 20 20 20 2a 2f 0a 20   ROWID..    */. 
18600 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65     zSql = sqlite
18610 33 5f 6d 70 72 69 6e 74 66 28 22 53 45 4c 45 43  3_mprintf("SELEC
18620 54 20 31 20 46 52 4f 4d 20 70 72 61 67 6d 61 5f  T 1 FROM pragma_
18630 69 6e 64 65 78 5f 6c 69 73 74 28 25 51 29 22 0a  index_list(%Q)".
18640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18650 20 20 20 20 20 20 20 20 20 20 20 22 20 57 48 45             " WHE
18660 52 45 20 6f 72 69 67 69 6e 3d 27 70 6b 27 22 2c  RE origin='pk'",
18670 20 7a 54 61 62 29 3b 0a 20 20 20 20 72 63 20 3d   zTab);.    rc =
18680 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
18690 5f 76 32 28 70 2d 3e 64 62 2c 20 7a 53 71 6c 2c  _v2(p->db, zSql,
186a0 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b   -1, &pStmt, 0);
186b0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
186c0 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20 69 66 28  e(zSql);.    if(
186d0 20 72 63 20 29 7b 0a 20 20 20 20 20 20 66 72 65   rc ){.      fre
186e0 65 43 6f 6c 75 6d 6e 4c 69 73 74 28 61 7a 43 6f  eColumnList(azCo
186f0 6c 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  l);.      return
18700 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63   0;.    }.    rc
18710 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28   = sqlite3_step(
18720 70 53 74 6d 74 29 3b 0a 20 20 20 20 73 71 6c 69  pStmt);.    sqli
18730 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74  te3_finalize(pSt
18740 6d 74 29 3b 0a 20 20 20 20 70 72 65 73 65 72 76  mt);.    preserv
18750 65 52 6f 77 69 64 20 3d 20 72 63 3d 3d 53 51 4c  eRowid = rc==SQL
18760 49 54 45 5f 52 4f 57 3b 0a 20 20 7d 0a 20 20 69  ITE_ROW;.  }.  i
18770 66 28 20 70 72 65 73 65 72 76 65 52 6f 77 69 64  f( preserveRowid
18780 20 29 7b 0a 20 20 20 20 2f 2a 20 4f 6e 6c 79 20   ){.    /* Only 
18790 70 72 65 73 65 72 76 65 20 74 68 65 20 72 6f 77  preserve the row
187a0 69 64 20 69 66 20 77 65 20 63 61 6e 20 66 69 6e  id if we can fin
187b0 64 20 61 20 6e 61 6d 65 20 74 6f 20 75 73 65 20  d a name to use 
187c0 66 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 72  for the.    ** r
187d0 6f 77 69 64 20 2a 2f 0a 20 20 20 20 73 74 61 74  owid */.    stat
187e0 69 63 20 63 68 61 72 20 2a 61 7a 52 6f 77 69 64  ic char *azRowid
187f0 5b 5d 20 3d 20 7b 20 22 72 6f 77 69 64 22 2c 20  [] = { "rowid", 
18800 22 5f 72 6f 77 69 64 5f 22 2c 20 22 6f 69 64 22  "_rowid_", "oid"
18810 20 7d 3b 0a 20 20 20 20 69 6e 74 20 69 2c 20 6a   };.    int i, j
18820 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a  ;.    for(j=0; j
18830 3c 33 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  <3; j++){.      
18840 66 6f 72 28 69 3d 31 3b 20 69 3c 3d 6e 43 6f 6c  for(i=1; i<=nCol
18850 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
18860 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72 69  if( sqlite3_stri
18870 63 6d 70 28 61 7a 52 6f 77 69 64 5b 6a 5d 2c 61  cmp(azRowid[j],a
18880 7a 43 6f 6c 5b 69 5d 29 3d 3d 30 20 29 20 62 72  zCol[i])==0 ) br
18890 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
188a0 20 20 20 69 66 28 20 69 3e 6e 43 6f 6c 20 29 7b     if( i>nCol ){
188b0 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 74 20 74  .        /* At t
188c0 68 69 73 20 70 6f 69 6e 74 2c 20 77 65 20 6b 6e  his point, we kn
188d0 6f 77 20 74 68 61 74 20 61 7a 52 6f 77 69 64 5b  ow that azRowid[
188e0 6a 5d 20 69 73 20 6e 6f 74 20 74 68 65 20 6e 61  j] is not the na
188f0 6d 65 20 6f 66 20 61 6e 79 0a 20 20 20 20 20 20  me of any.      
18900 20 20 2a 2a 20 6f 72 64 69 6e 61 72 79 20 63 6f    ** ordinary co
18910 6c 75 6d 6e 20 69 6e 20 74 68 65 20 74 61 62 6c  lumn in the tabl
18920 65 2e 20 20 56 65 72 69 66 79 20 74 68 61 74 20  e.  Verify that 
18930 61 7a 52 6f 77 69 64 5b 6a 5d 20 69 73 20 61 20  azRowid[j] is a 
18940 76 61 6c 69 64 0a 20 20 20 20 20 20 20 20 2a 2a  valid.        **
18950 20 6e 61 6d 65 20 66 6f 72 20 74 68 65 20 72 6f   name for the ro
18960 77 69 64 20 62 65 66 6f 72 65 20 61 64 64 69 6e  wid before addin
18970 67 20 69 74 20 74 6f 20 61 7a 43 6f 6c 5b 30 5d  g it to azCol[0]
18980 2e 20 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44  .  WITHOUT ROWID
18990 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 61 62 6c  .        ** tabl
189a0 65 73 20 77 69 6c 6c 20 66 61 69 6c 20 74 68 69  es will fail thi
189b0 73 20 6c 61 73 74 20 63 68 65 63 6b 20 2a 2f 0a  s last check */.
189c0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
189d0 69 74 65 33 5f 74 61 62 6c 65 5f 63 6f 6c 75 6d  ite3_table_colum
189e0 6e 5f 6d 65 74 61 64 61 74 61 28 70 2d 3e 64 62  n_metadata(p->db
189f0 2c 30 2c 7a 54 61 62 2c 61 7a 52 6f 77 69 64 5b  ,0,zTab,azRowid[
18a00 6a 5d 2c 30 2c 30 2c 30 2c 30 2c 30 29 3b 0a 20  j],0,0,0,0,0);. 
18a10 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
18a20 51 4c 49 54 45 5f 4f 4b 20 29 20 61 7a 43 6f 6c  QLITE_OK ) azCol
18a30 5b 30 5d 20 3d 20 61 7a 52 6f 77 69 64 5b 6a 5d  [0] = azRowid[j]
18a40 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
18a50 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
18a60 20 7d 0a 20 20 72 65 74 75 72 6e 20 61 7a 43 6f   }.  return azCo
18a70 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 6f 67 67  l;.}../*.** Togg
18a80 6c 65 20 74 68 65 20 72 65 76 65 72 73 65 5f 75  le the reverse_u
18a90 6e 6f 72 64 65 72 65 64 5f 73 65 6c 65 63 74 73  nordered_selects
18aa0 20 73 65 74 74 69 6e 67 2e 0a 2a 2f 0a 73 74 61   setting..*/.sta
18ab0 74 69 63 20 76 6f 69 64 20 74 6f 67 67 6c 65 53  tic void toggleS
18ac0 65 6c 65 63 74 4f 72 64 65 72 28 73 71 6c 69 74  electOrder(sqlit
18ad0 65 33 20 2a 64 62 29 7b 0a 20 20 73 71 6c 69 74  e3 *db){.  sqlit
18ae0 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d  e3_stmt *pStmt =
18af0 20 30 3b 0a 20 20 69 6e 74 20 69 53 65 74 74 69   0;.  int iSetti
18b00 6e 67 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 7a  ng = 0;.  char z
18b10 53 74 6d 74 5b 31 30 30 5d 3b 0a 20 20 73 71 6c  Stmt[100];.  sql
18b20 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28  ite3_prepare_v2(
18b30 64 62 2c 20 22 50 52 41 47 4d 41 20 72 65 76 65  db, "PRAGMA reve
18b40 72 73 65 5f 75 6e 6f 72 64 65 72 65 64 5f 73 65  rse_unordered_se
18b50 6c 65 63 74 73 22 2c 20 2d 31 2c 20 26 70 53 74  lects", -1, &pSt
18b60 6d 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 73 71  mt, 0);.  if( sq
18b70 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74  lite3_step(pStmt
18b80 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b  )==SQLITE_ROW ){
18b90 0a 20 20 20 20 69 53 65 74 74 69 6e 67 20 3d 20  .    iSetting = 
18ba0 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69  sqlite3_column_i
18bb0 6e 74 28 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20  nt(pStmt, 0);.  
18bc0 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61  }.  sqlite3_fina
18bd0 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 73  lize(pStmt);.  s
18be0 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
18bf0 73 69 7a 65 6f 66 28 7a 53 74 6d 74 29 2c 20 7a  sizeof(zStmt), z
18c00 53 74 6d 74 2c 0a 20 20 20 20 20 20 20 22 50 52  Stmt,.       "PR
18c10 41 47 4d 41 20 72 65 76 65 72 73 65 5f 75 6e 6f  AGMA reverse_uno
18c20 72 64 65 72 65 64 5f 73 65 6c 65 63 74 73 28 25  rdered_selects(%
18c30 64 29 22 2c 20 21 69 53 65 74 74 69 6e 67 29 3b  d)", !iSetting);
18c40 0a 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28  .  sqlite3_exec(
18c50 64 62 2c 20 7a 53 74 6d 74 2c 20 30 2c 20 30 2c  db, zStmt, 0, 0,
18c60 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   0);.}../*.** Th
18c70 69 73 20 69 73 20 61 20 64 69 66 66 65 72 65 6e  is is a differen
18c80 74 20 63 61 6c 6c 62 61 63 6b 20 72 6f 75 74 69  t callback routi
18c90 6e 65 20 75 73 65 64 20 66 6f 72 20 64 75 6d 70  ne used for dump
18ca0 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
18cb0 2e 0a 2a 2a 20 45 61 63 68 20 72 6f 77 20 72 65  ..** Each row re
18cc0 63 65 69 76 65 64 20 62 79 20 74 68 69 73 20 63  ceived by this c
18cd0 61 6c 6c 62 61 63 6b 20 63 6f 6e 73 69 73 74 73  allback consists
18ce0 20 6f 66 20 61 20 74 61 62 6c 65 20 6e 61 6d 65   of a table name
18cf0 2c 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 74  ,.** the table t
18d00 79 70 65 20 28 22 69 6e 64 65 78 22 20 6f 72 20  ype ("index" or 
18d10 22 74 61 62 6c 65 22 29 20 61 6e 64 20 53 51 4c  "table") and SQL
18d20 20 74 6f 20 63 72 65 61 74 65 20 74 68 65 20 74   to create the t
18d30 61 62 6c 65 2e 0a 2a 2a 20 54 68 69 73 20 72 6f  able..** This ro
18d40 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 70 72 69  utine should pri
18d50 6e 74 20 74 65 78 74 20 73 75 66 66 69 63 69 65  nt text sufficie
18d60 6e 74 20 74 6f 20 72 65 63 72 65 61 74 65 20 74  nt to recreate t
18d70 68 65 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61  he table..*/.sta
18d80 74 69 63 20 69 6e 74 20 64 75 6d 70 5f 63 61 6c  tic int dump_cal
18d90 6c 62 61 63 6b 28 76 6f 69 64 20 2a 70 41 72 67  lback(void *pArg
18da0 2c 20 69 6e 74 20 6e 41 72 67 2c 20 63 68 61 72  , int nArg, char
18db0 20 2a 2a 61 7a 41 72 67 2c 20 63 68 61 72 20 2a   **azArg, char *
18dc0 2a 61 7a 4e 6f 74 55 73 65 64 29 7b 0a 20 20 69  *azNotUsed){.  i
18dd0 6e 74 20 72 63 3b 0a 20 20 63 6f 6e 73 74 20 63  nt rc;.  const c
18de0 68 61 72 20 2a 7a 54 61 62 6c 65 3b 0a 20 20 63  har *zTable;.  c
18df0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65  onst char *zType
18e00 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
18e10 7a 53 71 6c 3b 0a 20 20 53 68 65 6c 6c 53 74 61  zSql;.  ShellSta
18e20 74 65 20 2a 70 20 3d 20 28 53 68 65 6c 6c 53 74  te *p = (ShellSt
18e30 61 74 65 20 2a 29 70 41 72 67 3b 0a 0a 20 20 55  ate *)pArg;..  U
18e40 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
18e50 61 7a 4e 6f 74 55 73 65 64 29 3b 0a 20 20 69 66  azNotUsed);.  if
18e60 28 20 6e 41 72 67 21 3d 33 20 7c 7c 20 61 7a 41  ( nArg!=3 || azA
18e70 72 67 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  rg==0 ) return 0
18e80 3b 0a 20 20 7a 54 61 62 6c 65 20 3d 20 61 7a 41  ;.  zTable = azA
18e90 72 67 5b 30 5d 3b 0a 20 20 7a 54 79 70 65 20 3d  rg[0];.  zType =
18ea0 20 61 7a 41 72 67 5b 31 5d 3b 0a 20 20 7a 53 71   azArg[1];.  zSq
18eb0 6c 20 3d 20 61 7a 41 72 67 5b 32 5d 3b 0a 0a 20  l = azArg[2];.. 
18ec0 20 69 66 28 20 73 74 72 63 6d 70 28 7a 54 61 62   if( strcmp(zTab
18ed0 6c 65 2c 20 22 73 71 6c 69 74 65 5f 73 65 71 75  le, "sqlite_sequ
18ee0 65 6e 63 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20  ence")==0 ){.   
18ef0 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f   raw_printf(p->o
18f00 75 74 2c 20 22 44 45 4c 45 54 45 20 46 52 4f 4d  ut, "DELETE FROM
18f10 20 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65   sqlite_sequence
18f20 3b 5c 6e 22 29 3b 0a 20 20 7d 65 6c 73 65 20 69  ;\n");.  }else i
18f30 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72 67 6c  f( sqlite3_strgl
18f40 6f 62 28 22 73 71 6c 69 74 65 5f 73 74 61 74 3f  ob("sqlite_stat?
18f50 22 2c 20 7a 54 61 62 6c 65 29 3d 3d 30 20 29 7b  ", zTable)==0 ){
18f60 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28  .    raw_printf(
18f70 70 2d 3e 6f 75 74 2c 20 22 41 4e 41 4c 59 5a 45  p->out, "ANALYZE
18f80 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 3b 5c   sqlite_master;\
18f90 6e 22 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  n");.  }else if(
18fa0 20 73 74 72 6e 63 6d 70 28 7a 54 61 62 6c 65 2c   strncmp(zTable,
18fb0 20 22 73 71 6c 69 74 65 5f 22 2c 20 37 29 3d 3d   "sqlite_", 7)==
18fc0 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
18fd0 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73  0;.  }else if( s
18fe0 74 72 6e 63 6d 70 28 7a 53 71 6c 2c 20 22 43 52  trncmp(zSql, "CR
18ff0 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42  EATE VIRTUAL TAB
19000 4c 45 22 2c 20 32 30 29 3d 3d 30 20 29 7b 0a 20  LE", 20)==0 ){. 
19010 20 20 20 63 68 61 72 20 2a 7a 49 6e 73 3b 0a 20     char *zIns;. 
19020 20 20 20 69 66 28 20 21 70 2d 3e 77 72 69 74 61     if( !p->writa
19030 62 6c 65 53 63 68 65 6d 61 20 29 7b 0a 20 20 20  bleSchema ){.   
19040 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d     raw_printf(p-
19050 3e 6f 75 74 2c 20 22 50 52 41 47 4d 41 20 77 72  >out, "PRAGMA wr
19060 69 74 61 62 6c 65 5f 73 63 68 65 6d 61 3d 4f 4e  itable_schema=ON
19070 3b 5c 6e 22 29 3b 0a 20 20 20 20 20 20 70 2d 3e  ;\n");.      p->
19080 77 72 69 74 61 62 6c 65 53 63 68 65 6d 61 20 3d  writableSchema =
19090 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 49   1;.    }.    zI
190a0 6e 73 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  ns = sqlite3_mpr
190b0 69 6e 74 66 28 0a 20 20 20 20 20 20 20 22 49 4e  intf(.       "IN
190c0 53 45 52 54 20 49 4e 54 4f 20 73 71 6c 69 74 65  SERT INTO sqlite
190d0 5f 6d 61 73 74 65 72 28 74 79 70 65 2c 6e 61 6d  _master(type,nam
190e0 65 2c 74 62 6c 5f 6e 61 6d 65 2c 72 6f 6f 74 70  e,tbl_name,rootp
190f0 61 67 65 2c 73 71 6c 29 22 0a 20 20 20 20 20 20  age,sql)".      
19100 20 22 56 41 4c 55 45 53 28 27 74 61 62 6c 65 27   "VALUES('table'
19110 2c 27 25 71 27 2c 27 25 71 27 2c 30 2c 27 25 71  ,'%q','%q',0,'%q
19120 27 29 3b 22 2c 0a 20 20 20 20 20 20 20 7a 54 61  ');",.       zTa
19130 62 6c 65 2c 20 7a 54 61 62 6c 65 2c 20 7a 53 71  ble, zTable, zSq
19140 6c 29 3b 0a 20 20 20 20 75 74 66 38 5f 70 72 69  l);.    utf8_pri
19150 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 5c  ntf(p->out, "%s\
19160 6e 22 2c 20 7a 49 6e 73 29 3b 0a 20 20 20 20 73  n", zIns);.    s
19170 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 49 6e 73  qlite3_free(zIns
19180 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  );.    return 0;
19190 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 72  .  }else{.    pr
191a0 69 6e 74 53 63 68 65 6d 61 4c 69 6e 65 28 70 2d  intSchemaLine(p-
191b0 3e 6f 75 74 2c 20 7a 53 71 6c 2c 20 22 3b 5c 6e  >out, zSql, ";\n
191c0 22 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 73  ");.  }..  if( s
191d0 74 72 63 6d 70 28 7a 54 79 70 65 2c 20 22 74 61  trcmp(zType, "ta
191e0 62 6c 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ble")==0 ){.    
191f0 53 68 65 6c 6c 54 65 78 74 20 73 53 65 6c 65 63  ShellText sSelec
19200 74 3b 0a 20 20 20 20 53 68 65 6c 6c 54 65 78 74  t;.    ShellText
19210 20 73 54 61 62 6c 65 3b 0a 20 20 20 20 63 68 61   sTable;.    cha
19220 72 20 2a 2a 61 7a 43 6f 6c 3b 0a 20 20 20 20 69  r **azCol;.    i
19230 6e 74 20 69 3b 0a 20 20 20 20 63 68 61 72 20 2a  nt i;.    char *
19240 73 61 76 65 64 44 65 73 74 54 61 62 6c 65 3b 0a  savedDestTable;.
19250 20 20 20 20 69 6e 74 20 73 61 76 65 64 4d 6f 64      int savedMod
19260 65 3b 0a 0a 20 20 20 20 61 7a 43 6f 6c 20 3d 20  e;..    azCol = 
19270 74 61 62 6c 65 43 6f 6c 75 6d 6e 4c 69 73 74 28  tableColumnList(
19280 70 2c 20 7a 54 61 62 6c 65 29 3b 0a 20 20 20 20  p, zTable);.    
19290 69 66 28 20 61 7a 43 6f 6c 3d 3d 30 20 29 7b 0a  if( azCol==0 ){.
192a0 20 20 20 20 20 20 70 2d 3e 6e 45 72 72 2b 2b 3b        p->nErr++;
192b0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
192c0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41  .    }..    /* A
192d0 6c 77 61 79 73 20 71 75 6f 74 65 20 74 68 65 20  lways quote the 
192e0 74 61 62 6c 65 20 6e 61 6d 65 2c 20 65 76 65 6e  table name, even
192f0 20 69 66 20 69 74 20 61 70 70 65 61 72 73 20 74   if it appears t
19300 6f 20 62 65 20 70 75 72 65 20 61 73 63 69 69 2c  o be pure ascii,
19310 0a 20 20 20 20 2a 2a 20 69 6e 20 63 61 73 65 20  .    ** in case 
19320 69 74 20 69 73 20 61 20 6b 65 79 77 6f 72 64 2e  it is a keyword.
19330 20 45 78 3a 20 20 49 4e 53 45 52 54 20 49 4e 54   Ex:  INSERT INT
19340 4f 20 22 74 61 62 6c 65 22 20 2e 2e 2e 20 2a 2f  O "table" ... */
19350 0a 20 20 20 20 69 6e 69 74 54 65 78 74 28 26 73  .    initText(&s
19360 54 61 62 6c 65 29 3b 0a 20 20 20 20 61 70 70 65  Table);.    appe
19370 6e 64 54 65 78 74 28 26 73 54 61 62 6c 65 2c 20  ndText(&sTable, 
19380 7a 54 61 62 6c 65 2c 20 71 75 6f 74 65 43 68 61  zTable, quoteCha
19390 72 28 7a 54 61 62 6c 65 29 29 3b 0a 20 20 20 20  r(zTable));.    
193a0 2f 2a 20 49 66 20 70 72 65 73 65 72 76 69 6e 67  /* If preserving
193b0 20 74 68 65 20 72 6f 77 69 64 2c 20 61 64 64 20   the rowid, add 
193c0 61 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 61 66  a column list af
193d0 74 65 72 20 74 68 65 20 74 61 62 6c 65 20 6e 61  ter the table na
193e0 6d 65 2e 0a 20 20 20 20 2a 2a 20 49 6e 20 6f 74  me..    ** In ot
193f0 68 65 72 20 77 6f 72 64 73 3a 20 20 22 49 4e 53  her words:  "INS
19400 45 52 54 20 49 4e 54 4f 20 74 61 62 28 72 6f 77  ERT INTO tab(row
19410 69 64 2c 61 2c 62 2c 63 2c 2e 2e 2e 29 20 56 41  id,a,b,c,...) VA
19420 4c 55 45 53 28 2e 2e 2e 29 22 0a 20 20 20 20 2a  LUES(...)".    *
19430 2a 20 69 6e 73 74 65 61 64 20 6f 66 20 74 68 65  * instead of the
19440 20 75 73 75 61 6c 20 22 49 4e 53 45 52 54 20 49   usual "INSERT I
19450 4e 54 4f 20 74 61 62 20 56 41 4c 55 45 53 28 2e  NTO tab VALUES(.
19460 2e 2e 29 22 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ..)"..    */.   
19470 20 69 66 28 20 61 7a 43 6f 6c 5b 30 5d 20 29 7b   if( azCol[0] ){
19480 0a 20 20 20 20 20 20 61 70 70 65 6e 64 54 65 78  .      appendTex
19490 74 28 26 73 54 61 62 6c 65 2c 20 22 28 22 2c 20  t(&sTable, "(", 
194a0 30 29 3b 0a 20 20 20 20 20 20 61 70 70 65 6e 64  0);.      append
194b0 54 65 78 74 28 26 73 54 61 62 6c 65 2c 20 61 7a  Text(&sTable, az
194c0 43 6f 6c 5b 30 5d 2c 20 30 29 3b 0a 20 20 20 20  Col[0], 0);.    
194d0 20 20 66 6f 72 28 69 3d 31 3b 20 61 7a 43 6f 6c    for(i=1; azCol
194e0 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  [i]; i++){.     
194f0 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73     appendText(&s
19500 54 61 62 6c 65 2c 20 22 2c 22 2c 20 30 29 3b 0a  Table, ",", 0);.
19510 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 54 65          appendTe
19520 78 74 28 26 73 54 61 62 6c 65 2c 20 61 7a 43 6f  xt(&sTable, azCo
19530 6c 5b 69 5d 2c 20 71 75 6f 74 65 43 68 61 72 28  l[i], quoteChar(
19540 61 7a 43 6f 6c 5b 69 5d 29 29 3b 0a 20 20 20 20  azCol[i]));.    
19550 20 20 7d 0a 20 20 20 20 20 20 61 70 70 65 6e 64    }.      append
19560 54 65 78 74 28 26 73 54 61 62 6c 65 2c 20 22 29  Text(&sTable, ")
19570 22 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  ", 0);.    }..  
19580 20 20 2f 2a 20 42 75 69 6c 64 20 61 6e 20 61 70    /* Build an ap
19590 70 72 6f 70 72 69 61 74 65 20 53 45 4c 45 43 54  propriate SELECT
195a0 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
195b0 20 20 69 6e 69 74 54 65 78 74 28 26 73 53 65 6c    initText(&sSel
195c0 65 63 74 29 3b 0a 20 20 20 20 61 70 70 65 6e 64  ect);.    append
195d0 54 65 78 74 28 26 73 53 65 6c 65 63 74 2c 20 22  Text(&sSelect, "
195e0 53 45 4c 45 43 54 20 22 2c 20 30 29 3b 0a 20 20  SELECT ", 0);.  
195f0 20 20 69 66 28 20 61 7a 43 6f 6c 5b 30 5d 20 29    if( azCol[0] )
19600 7b 0a 20 20 20 20 20 20 61 70 70 65 6e 64 54 65  {.      appendTe
19610 78 74 28 26 73 53 65 6c 65 63 74 2c 20 61 7a 43  xt(&sSelect, azC
19620 6f 6c 5b 30 5d 2c 20 30 29 3b 0a 20 20 20 20 20  ol[0], 0);.     
19630 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 53 65   appendText(&sSe
19640 6c 65 63 74 2c 20 22 2c 22 2c 20 30 29 3b 0a 20  lect, ",", 0);. 
19650 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 31     }.    for(i=1
19660 3b 20 61 7a 43 6f 6c 5b 69 5d 3b 20 69 2b 2b 29  ; azCol[i]; i++)
19670 7b 0a 20 20 20 20 20 20 61 70 70 65 6e 64 54 65  {.      appendTe
19680 78 74 28 26 73 53 65 6c 65 63 74 2c 20 61 7a 43  xt(&sSelect, azC
19690 6f 6c 5b 69 5d 2c 20 71 75 6f 74 65 43 68 61 72  ol[i], quoteChar
196a0 28 61 7a 43 6f 6c 5b 69 5d 29 29 3b 0a 20 20 20  (azCol[i]));.   
196b0 20 20 20 69 66 28 20 61 7a 43 6f 6c 5b 69 2b 31     if( azCol[i+1
196c0 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 61 70 70  ] ){.        app
196d0 65 6e 64 54 65 78 74 28 26 73 53 65 6c 65 63 74  endText(&sSelect
196e0 2c 20 22 2c 22 2c 20 30 29 3b 0a 20 20 20 20 20  , ",", 0);.     
196f0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66 72 65   }.    }.    fre
19700 65 43 6f 6c 75 6d 6e 4c 69 73 74 28 61 7a 43 6f  eColumnList(azCo
19710 6c 29 3b 0a 20 20 20 20 61 70 70 65 6e 64 54 65  l);.    appendTe
19720 78 74 28 26 73 53 65 6c 65 63 74 2c 20 22 20 46  xt(&sSelect, " F
19730 52 4f 4d 20 22 2c 20 30 29 3b 0a 20 20 20 20 61  ROM ", 0);.    a
19740 70 70 65 6e 64 54 65 78 74 28 26 73 53 65 6c 65  ppendText(&sSele
19750 63 74 2c 20 7a 54 61 62 6c 65 2c 20 71 75 6f 74  ct, zTable, quot
19760 65 43 68 61 72 28 7a 54 61 62 6c 65 29 29 3b 0a  eChar(zTable));.
19770 0a 20 20 20 20 73 61 76 65 64 44 65 73 74 54 61  .    savedDestTa
19780 62 6c 65 20 3d 20 70 2d 3e 7a 44 65 73 74 54 61  ble = p->zDestTa
19790 62 6c 65 3b 0a 20 20 20 20 73 61 76 65 64 4d 6f  ble;.    savedMo
197a0 64 65 20 3d 20 70 2d 3e 6d 6f 64 65 3b 0a 20 20  de = p->mode;.  
197b0 20 20 70 2d 3e 7a 44 65 73 74 54 61 62 6c 65 20    p->zDestTable 
197c0 3d 20 73 54 61 62 6c 65 2e 7a 3b 0a 20 20 20 20  = sTable.z;.    
197d0 70 2d 3e 6d 6f 64 65 20 3d 20 70 2d 3e 63 4d 6f  p->mode = p->cMo
197e0 64 65 20 3d 20 4d 4f 44 45 5f 49 6e 73 65 72 74  de = MODE_Insert
197f0 3b 0a 20 20 20 20 72 63 20 3d 20 73 68 65 6c 6c  ;.    rc = shell
19800 5f 65 78 65 63 28 70 2c 20 73 53 65 6c 65 63 74  _exec(p, sSelect
19810 2e 7a 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  .z, 0);.    if( 
19820 28 72 63 26 30 78 66 66 29 3d 3d 53 51 4c 49 54  (rc&0xff)==SQLIT
19830 45 5f 43 4f 52 52 55 50 54 20 29 7b 0a 20 20 20  E_CORRUPT ){.   
19840 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d     raw_printf(p-
19850 3e 6f 75 74 2c 20 22 2f 2a 2a 2a 2a 2a 2a 20 43  >out, "/****** C
19860 4f 52 52 55 50 54 49 4f 4e 20 45 52 52 4f 52 20  ORRUPTION ERROR 
19870 2a 2a 2a 2a 2a 2a 2a 2f 5c 6e 22 29 3b 0a 20 20  *******/\n");.  
19880 20 20 20 20 74 6f 67 67 6c 65 53 65 6c 65 63 74      toggleSelect
19890 4f 72 64 65 72 28 70 2d 3e 64 62 29 3b 0a 20 20  Order(p->db);.  
198a0 20 20 20 20 73 68 65 6c 6c 5f 65 78 65 63 28 70      shell_exec(p
198b0 2c 20 73 53 65 6c 65 63 74 2e 7a 2c 20 30 29 3b  , sSelect.z, 0);
198c0 0a 20 20 20 20 20 20 74 6f 67 67 6c 65 53 65 6c  .      toggleSel
198d0 65 63 74 4f 72 64 65 72 28 70 2d 3e 64 62 29 3b  ectOrder(p->db);
198e0 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 7a 44  .    }.    p->zD
198f0 65 73 74 54 61 62 6c 65 20 3d 20 73 61 76 65 64  estTable = saved
19900 44 65 73 74 54 61 62 6c 65 3b 0a 20 20 20 20 70  DestTable;.    p
19910 2d 3e 6d 6f 64 65 20 3d 20 73 61 76 65 64 4d 6f  ->mode = savedMo
19920 64 65 3b 0a 20 20 20 20 66 72 65 65 54 65 78 74  de;.    freeText
19930 28 26 73 54 61 62 6c 65 29 3b 0a 20 20 20 20 66  (&sTable);.    f
19940 72 65 65 54 65 78 74 28 26 73 53 65 6c 65 63 74  reeText(&sSelect
19950 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
19960 70 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 7d 0a 20  p->nErr++;.  }. 
19970 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
19980 0a 2a 2a 20 52 75 6e 20 7a 51 75 65 72 79 2e 20  .** Run zQuery. 
19990 20 55 73 65 20 64 75 6d 70 5f 63 61 6c 6c 62 61   Use dump_callba
199a0 63 6b 28 29 20 61 73 20 74 68 65 20 63 61 6c 6c  ck() as the call
199b0 62 61 63 6b 20 72 6f 75 74 69 6e 65 20 73 6f 20  back routine so 
199c0 74 68 61 74 0a 2a 2a 20 74 68 65 20 63 6f 6e 74  that.** the cont
199d0 65 6e 74 73 20 6f 66 20 74 68 65 20 71 75 65 72  ents of the quer
199e0 79 20 61 72 65 20 6f 75 74 70 75 74 20 61 73 20  y are output as 
199f0 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a  SQL statements..
19a00 2a 2a 0a 2a 2a 20 49 66 20 77 65 20 67 65 74 20  **.** If we get 
19a10 61 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  a SQLITE_CORRUPT
19a20 20 65 72 72 6f 72 2c 20 72 65 72 75 6e 20 74 68   error, rerun th
19a30 65 20 71 75 65 72 79 20 61 66 74 65 72 20 61 70  e query after ap
19a40 70 65 6e 64 69 6e 67 0a 2a 2a 20 22 4f 52 44 45  pending.** "ORDE
19a50 52 20 42 59 20 72 6f 77 69 64 20 44 45 53 43 22  R BY rowid DESC"
19a60 20 74 6f 20 74 68 65 20 65 6e 64 2e 0a 2a 2f 0a   to the end..*/.
19a70 73 74 61 74 69 63 20 69 6e 74 20 72 75 6e 5f 73  static int run_s
19a80 63 68 65 6d 61 5f 64 75 6d 70 5f 71 75 65 72 79  chema_dump_query
19a90 28 0a 20 20 53 68 65 6c 6c 53 74 61 74 65 20 2a  (.  ShellState *
19aa0 70 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  p,.  const char 
19ab0 2a 7a 51 75 65 72 79 0a 29 7b 0a 20 20 69 6e 74  *zQuery.){.  int
19ac0 20 72 63 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72   rc;.  char *zEr
19ad0 72 20 3d 20 30 3b 0a 20 20 72 63 20 3d 20 73 71  r = 0;.  rc = sq
19ae0 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62  lite3_exec(p->db
19af0 2c 20 7a 51 75 65 72 79 2c 20 64 75 6d 70 5f 63  , zQuery, dump_c
19b00 61 6c 6c 62 61 63 6b 2c 20 70 2c 20 26 7a 45 72  allback, p, &zEr
19b10 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  r);.  if( rc==SQ
19b20 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 29 7b 0a  LITE_CORRUPT ){.
19b30 20 20 20 20 63 68 61 72 20 2a 7a 51 32 3b 0a 20      char *zQ2;. 
19b40 20 20 20 69 6e 74 20 6c 65 6e 20 3d 20 73 74 72     int len = str
19b50 6c 65 6e 33 30 28 7a 51 75 65 72 79 29 3b 0a 20  len30(zQuery);. 
19b60 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d     raw_printf(p-
19b70 3e 6f 75 74 2c 20 22 2f 2a 2a 2a 2a 2a 2a 20 43  >out, "/****** C
19b80 4f 52 52 55 50 54 49 4f 4e 20 45 52 52 4f 52 20  ORRUPTION ERROR 
19b90 2a 2a 2a 2a 2a 2a 2a 2f 5c 6e 22 29 3b 0a 20 20  *******/\n");.  
19ba0 20 20 69 66 28 20 7a 45 72 72 20 29 7b 0a 20 20    if( zErr ){.  
19bb0 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
19bc0 70 2d 3e 6f 75 74 2c 20 22 2f 2a 2a 2a 2a 2a 2a  p->out, "/******
19bd0 20 25 73 20 2a 2a 2a 2a 2a 2a 2f 5c 6e 22 2c 20   %s ******/\n", 
19be0 7a 45 72 72 29 3b 0a 20 20 20 20 20 20 73 71 6c  zErr);.      sql
19bf0 69 74 65 33 5f 66 72 65 65 28 7a 45 72 72 29 3b  ite3_free(zErr);
19c00 0a 20 20 20 20 20 20 7a 45 72 72 20 3d 20 30 3b  .      zErr = 0;
19c10 0a 20 20 20 20 7d 0a 20 20 20 20 7a 51 32 20 3d  .    }.    zQ2 =
19c20 20 6d 61 6c 6c 6f 63 28 20 6c 65 6e 2b 31 30 30   malloc( len+100
19c30 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 51 32 3d   );.    if( zQ2=
19c40 3d 30 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  =0 ) return rc;.
19c50 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
19c60 69 6e 74 66 28 6c 65 6e 2b 31 30 30 2c 20 7a 51  intf(len+100, zQ
19c70 32 2c 20 22 25 73 20 4f 52 44 45 52 20 42 59 20  2, "%s ORDER BY 
19c80 72 6f 77 69 64 20 44 45 53 43 22 2c 20 7a 51 75  rowid DESC", zQu
19c90 65 72 79 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  ery);.    rc = s
19ca0 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64  qlite3_exec(p->d
19cb0 62 2c 20 7a 51 32 2c 20 64 75 6d 70 5f 63 61 6c  b, zQ2, dump_cal
19cc0 6c 62 61 63 6b 2c 20 70 2c 20 26 7a 45 72 72 29  lback, p, &zErr)
19cd0 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a  ;.    if( rc ){.
19ce0 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
19cf0 66 28 70 2d 3e 6f 75 74 2c 20 22 2f 2a 2a 2a 2a  f(p->out, "/****
19d00 2a 2a 20 45 52 52 4f 52 3a 20 25 73 20 2a 2a 2a  ** ERROR: %s ***
19d10 2a 2a 2a 2f 5c 6e 22 2c 20 7a 45 72 72 29 3b 0a  ***/\n", zErr);.
19d20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
19d30 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
19d40 52 55 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RUPT;.    }.    
19d50 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 45 72  sqlite3_free(zEr
19d60 72 29 3b 0a 20 20 20 20 66 72 65 65 28 7a 51 32  r);.    free(zQ2
19d70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
19d80 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 65 78  rc;.}../*.** Tex
19d90 74 20 6f 66 20 68 65 6c 70 20 6d 65 73 73 61 67  t of help messag
19da0 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 68 65  es..**.** The he
19db0 6c 70 20 74 65 78 74 20 66 6f 72 20 65 61 63 68  lp text for each
19dc0 20 69 6e 64 69 76 69 64 75 61 6c 20 63 6f 6d 6d   individual comm
19dd0 61 6e 64 20 62 65 67 69 6e 73 20 77 69 74 68 20  and begins with 
19de0 61 20 6c 69 6e 65 20 74 68 61 74 20 73 74 61 72  a line that star
19df0 74 73 0a 2a 2a 20 77 69 74 68 20 22 2e 22 2e 20  ts.** with ".". 
19e00 20 53 75 62 73 65 71 75 65 6e 74 20 6c 69 6e 65   Subsequent line
19e10 73 20 61 72 65 20 73 75 70 70 6c 69 6d 65 6e 74  s are suppliment
19e20 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a  al information..
19e30 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 6d 75 73 74  **.** There must
19e40 20 62 65 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20   be two or more 
19e50 73 70 61 63 65 73 20 62 65 74 77 65 65 6e 20 74  spaces between t
19e60 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 63 6f  he end of the co
19e70 6d 6d 61 6e 64 20 61 6e 64 20 74 68 65 0a 2a 2a  mmand and the.**
19e80 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 64 65   start of the de
19e90 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 77 68 61  scription of wha
19ea0 74 20 74 68 61 74 20 63 6f 6d 6d 61 6e 64 20 64  t that command d
19eb0 6f 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  oes..*/.static c
19ec0 6f 6e 73 74 20 63 68 61 72 20 2a 28 61 7a 48 65  onst char *(azHe
19ed0 6c 70 5b 5d 29 20 3d 20 7b 0a 23 69 66 20 64 65  lp[]) = {.#if de
19ee0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 48 41 56  fined(SQLITE_HAV
19ef0 45 5f 5a 4c 49 42 29 20 26 26 20 21 64 65 66 69  E_ZLIB) && !defi
19f00 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
19f10 56 49 52 54 55 41 4c 54 41 42 4c 45 29 0a 20 20  VIRTUALTABLE).  
19f20 22 2e 61 72 63 68 69 76 65 20 2e 2e 2e 20 20 20  ".archive ...   
19f30 20 20 20 20 20 20 20 20 20 20 4d 61 6e 61 67 65            Manage
19f40 20 53 51 4c 20 61 72 63 68 69 76 65 73 22 2c 0a   SQL archives",.
19f50 20 20 22 20 20 20 45 61 63 68 20 63 6f 6d 6d 61    "   Each comma
19f60 6e 64 20 6d 75 73 74 20 68 61 76 65 20 65 78 61  nd must have exa
19f70 63 74 6c 79 20 6f 6e 65 20 6f 66 20 74 68 65 20  ctly one of the 
19f80 66 6f 6c 6c 6f 77 69 6e 67 20 6f 70 74 69 6f 6e  following option
19f90 73 3a 22 2c 0a 20 20 22 20 20 20 20 20 2d 63 2c  s:",.  "     -c,
19fa0 20 2d 2d 63 72 65 61 74 65 20 20 20 20 20 20 20   --create       
19fb0 20 20 20 20 20 20 20 20 43 72 65 61 74 65 20 61          Create a
19fc0 20 6e 65 77 20 61 72 63 68 69 76 65 22 2c 0a 20   new archive",. 
19fd0 20 22 20 20 20 20 20 2d 75 2c 20 2d 2d 75 70 64   "     -u, --upd
19fe0 61 74 65 20 20 20 20 20 20 20 20 20 20 20 20 20  ate             
19ff0 20 20 41 64 64 20 66 69 6c 65 73 20 6f 72 20 75    Add files or u
1a000 70 64 61 74 65 20 66 69 6c 65 73 20 77 69 74 68  pdate files with
1a010 20 63 68 61 6e 67 65 64 20 6d 74 69 6d 65 22 2c   changed mtime",
1a020 0a 20 20 22 20 20 20 20 20 2d 69 2c 20 2d 2d 69  .  "     -i, --i
1a030 6e 73 65 72 74 20 20 20 20 20 20 20 20 20 20 20  nsert           
1a040 20 20 20 20 4c 69 6b 65 20 2d 75 20 62 75 74 20      Like -u but 
1a050 61 6c 77 61 79 73 20 61 64 64 20 65 76 65 6e 20  always add even 
1a060 69 66 20 6d 74 69 6d 65 20 75 6e 63 68 61 6e 67  if mtime unchang
1a070 65 64 22 2c 0a 20 20 22 20 20 20 20 20 2d 74 2c  ed",.  "     -t,
1a080 20 2d 2d 6c 69 73 74 20 20 20 20 20 20 20 20 20   --list         
1a090 20 20 20 20 20 20 20 20 4c 69 73 74 20 63 6f 6e          List con
1a0a0 74 65 6e 74 73 20 6f 66 20 61 72 63 68 69 76 65  tents of archive
1a0b0 22 2c 0a 20 20 22 20 20 20 20 20 2d 78 2c 20 2d  ",.  "     -x, -
1a0c0 2d 65 78 74 72 61 63 74 20 20 20 20 20 20 20 20  -extract        
1a0d0 20 20 20 20 20 20 45 78 74 72 61 63 74 20 66 69        Extract fi
1a0e0 6c 65 73 20 66 72 6f 6d 20 61 72 63 68 69 76 65  les from archive
1a0f0 22 2c 0a 20 20 22 20 20 20 4f 70 74 69 6f 6e 61  ",.  "   Optiona
1a100 6c 20 61 72 67 75 6d 65 6e 74 73 3a 22 2c 0a 20  l arguments:",. 
1a110 20 22 20 20 20 20 20 2d 76 2c 20 2d 2d 76 65 72   "     -v, --ver
1a120 62 6f 73 65 20 20 20 20 20 20 20 20 20 20 20 20  bose            
1a130 20 20 50 72 69 6e 74 20 65 61 63 68 20 66 69 6c    Print each fil
1a140 65 6e 61 6d 65 20 61 73 20 69 74 20 69 73 20 70  ename as it is p
1a150 72 6f 63 65 73 73 65 64 22 2c 0a 20 20 22 20 20  rocessed",.  "  
1a160 20 20 20 2d 66 20 46 49 4c 45 2c 20 2d 2d 66 69     -f FILE, --fi
1a170 6c 65 20 46 49 4c 45 20 20 20 20 20 20 20 4f 70  le FILE       Op
1a180 65 72 61 74 65 20 6f 6e 20 61 72 63 68 69 76 65  erate on archive
1a190 20 46 49 4c 45 20 28 64 65 66 61 75 6c 74 20 69   FILE (default i
1a1a0 73 20 63 75 72 72 65 6e 74 20 64 62 29 22 2c 0a  s current db)",.
1a1b0 20 20 22 20 20 20 20 20 2d 61 20 46 49 4c 45 2c    "     -a FILE,
1a1c0 20 2d 2d 61 70 70 65 6e 64 20 46 49 4c 45 20 20   --append FILE  
1a1d0 20 20 20 4f 70 65 72 61 74 65 20 6f 6e 20 46 49     Operate on FI
1a1e0 4c 45 20 6f 70 65 6e 65 64 20 75 73 69 6e 67 20  LE opened using 
1a1f0 74 68 65 20 61 70 6e 64 76 66 73 20 56 46 53 22  the apndvfs VFS"
1a200 2c 0a 20 20 22 20 20 20 20 20 2d 43 20 44 49 52  ,.  "     -C DIR
1a210 2c 20 2d 2d 64 69 72 65 63 74 6f 72 79 20 44 49  , --directory DI
1a220 52 20 20 20 20 43 68 61 6e 67 65 20 74 6f 20 64  R    Change to d
1a230 69 72 65 63 74 6f 72 79 20 44 49 52 20 74 6f 20  irectory DIR to 
1a240 72 65 61 64 2f 65 78 74 72 61 63 74 20 66 69 6c  read/extract fil
1a250 65 73 22 2c 0a 20 20 22 20 20 20 20 20 2d 6e 2c  es",.  "     -n,
1a260 20 2d 2d 64 72 79 72 75 6e 20 20 20 20 20 20 20   --dryrun       
1a270 20 20 20 20 20 20 20 20 53 68 6f 77 20 74 68 65          Show the
1a280 20 53 51 4c 20 74 68 61 74 20 77 6f 75 6c 64 20   SQL that would 
1a290 68 61 76 65 20 6f 63 63 75 72 72 65 64 22 2c 0a  have occurred",.
1a2a0 20 20 22 20 20 20 45 78 61 6d 70 6c 65 73 3a 22    "   Examples:"
1a2b0 2c 0a 20 20 22 20 20 20 20 20 2e 61 72 20 2d 63  ,.  "     .ar -c
1a2c0 66 20 61 72 63 68 69 76 65 2e 73 61 72 20 66 6f  f archive.sar fo
1a2d0 6f 20 62 61 72 20 20 23 20 43 72 65 61 74 65 20  o bar  # Create 
1a2e0 61 72 63 68 69 76 65 2e 73 61 72 20 66 72 6f 6d  archive.sar from
1a2f0 20 66 69 6c 65 73 20 66 6f 6f 20 61 6e 64 20 62   files foo and b
1a300 61 72 22 2c 0a 20 20 22 20 20 20 20 20 2e 61 72  ar",.  "     .ar
1a310 20 2d 74 66 20 61 72 63 68 69 76 65 2e 73 61 72   -tf archive.sar
1a320 20 20 20 20 20 20 20 20 20 20 23 20 4c 69 73 74            # List
1a330 20 6d 65 6d 62 65 72 73 20 6f 66 20 61 72 63 68   members of arch
1a340 69 76 65 2e 73 61 72 22 2c 0a 20 20 22 20 20 20  ive.sar",.  "   
1a350 20 20 2e 61 72 20 2d 78 76 66 20 61 72 63 68 69    .ar -xvf archi
1a360 76 65 2e 73 61 72 20 20 20 20 20 20 20 20 20 23  ve.sar         #
1a370 20 56 65 72 62 6f 73 65 6c 79 20 65 78 74 72 61   Verbosely extra
1a380 63 74 20 66 69 6c 65 73 20 66 72 6f 6d 20 61 72  ct files from ar
1a390 63 68 69 76 65 2e 73 61 72 22 2c 0a 20 20 22 20  chive.sar",.  " 
1a3a0 20 20 53 65 65 20 61 6c 73 6f 3a 22 2c 0a 20 20    See also:",.  
1a3b0 22 20 20 20 20 20 20 68 74 74 70 3a 2f 2f 73 71  "      http://sq
1a3c0 6c 69 74 65 2e 6f 72 67 2f 63 6c 69 2e 68 74 6d  lite.org/cli.htm
1a3d0 6c 23 73 71 6c 61 72 5f 61 72 63 68 69 76 65 5f  l#sqlar_archive_
1a3e0 73 75 70 70 6f 72 74 22 2c 0a 23 65 6e 64 69 66  support",.#endif
1a3f0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1a400 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49  OMIT_AUTHORIZATI
1a410 4f 4e 0a 20 20 22 2e 61 75 74 68 20 4f 4e 7c 4f  ON.  ".auth ON|O
1a420 46 46 20 20 20 20 20 20 20 20 20 20 20 20 20 53  FF             S
1a430 68 6f 77 20 61 75 74 68 6f 72 69 7a 65 72 20 63  how authorizer c
1a440 61 6c 6c 62 61 63 6b 73 22 2c 0a 23 65 6e 64 69  allbacks",.#endi
1a450 66 0a 20 20 22 2e 62 61 63 6b 75 70 20 3f 44 42  f.  ".backup ?DB
1a460 3f 20 46 49 4c 45 20 20 20 20 20 20 20 20 42 61  ? FILE        Ba
1a470 63 6b 75 70 20 44 42 20 28 64 65 66 61 75 6c 74  ckup DB (default
1a480 20 5c 22 6d 61 69 6e 5c 22 29 20 74 6f 20 46 49   \"main\") to FI
1a490 4c 45 22 2c 0a 20 20 22 20 20 20 20 20 20 20 2d  LE",.  "       -
1a4a0 2d 61 70 70 65 6e 64 20 20 20 20 20 20 20 20 20  -append         
1a4b0 20 20 20 55 73 65 20 74 68 65 20 61 70 70 65 6e     Use the appen
1a4c0 64 76 66 73 22 2c 0a 20 20 22 20 20 20 20 20 20  dvfs",.  "      
1a4d0 20 2d 2d 61 73 79 6e 63 20 20 20 20 20 20 20 20   --async        
1a4e0 20 20 20 20 20 57 72 69 74 65 20 74 6f 20 46 49       Write to FI
1a4f0 4c 45 20 77 69 74 68 6f 75 74 20 61 20 6a 6f 75  LE without a jou
1a500 72 6e 61 6c 20 61 6e 64 20 77 69 74 68 6f 75 74  rnal and without
1a510 20 66 73 79 6e 63 28 29 22 2c 0a 20 20 22 2e 62   fsync()",.  ".b
1a520 61 69 6c 20 6f 6e 7c 6f 66 66 20 20 20 20 20 20  ail on|off      
1a530 20 20 20 20 20 20 20 53 74 6f 70 20 61 66 74 65         Stop afte
1a540 72 20 68 69 74 74 69 6e 67 20 61 6e 20 65 72 72  r hitting an err
1a550 6f 72 2e 20 20 44 65 66 61 75 6c 74 20 4f 46 46  or.  Default OFF
1a560 22 2c 0a 20 20 22 2e 62 69 6e 61 72 79 20 6f 6e  ",.  ".binary on
1a570 7c 6f 66 66 20 20 20 20 20 20 20 20 20 20 20 54  |off           T
1a580 75 72 6e 20 62 69 6e 61 72 79 20 6f 75 74 70 75  urn binary outpu
1a590 74 20 6f 6e 20 6f 72 20 6f 66 66 2e 20 20 44 65  t on or off.  De
1a5a0 66 61 75 6c 74 20 4f 46 46 22 2c 0a 20 20 22 2e  fault OFF",.  ".
1a5b0 63 64 20 44 49 52 45 43 54 4f 52 59 20 20 20 20  cd DIRECTORY    
1a5c0 20 20 20 20 20 20 20 20 43 68 61 6e 67 65 20 74          Change t
1a5d0 68 65 20 77 6f 72 6b 69 6e 67 20 64 69 72 65 63  he working direc
1a5e0 74 6f 72 79 20 74 6f 20 44 49 52 45 43 54 4f 52  tory to DIRECTOR
1a5f0 59 22 2c 0a 20 20 22 2e 63 68 61 6e 67 65 73 20  Y",.  ".changes 
1a600 6f 6e 7c 6f 66 66 20 20 20 20 20 20 20 20 20 20  on|off          
1a610 53 68 6f 77 20 6e 75 6d 62 65 72 20 6f 66 20 72  Show number of r
1a620 6f 77 73 20 63 68 61 6e 67 65 64 20 62 79 20 53  ows changed by S
1a630 51 4c 22 2c 0a 20 20 22 2e 63 68 65 63 6b 20 47  QL",.  ".check G
1a640 4c 4f 42 20 20 20 20 20 20 20 20 20 20 20 20 20  LOB             
1a650 20 46 61 69 6c 20 69 66 20 6f 75 74 70 75 74 20   Fail if output 
1a660 73 69 6e 63 65 20 2e 74 65 73 74 63 61 73 65 20  since .testcase 
1a670 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 22 2c  does not match",
1a680 0a 20 20 22 2e 63 6c 6f 6e 65 20 4e 45 57 44 42  .  ".clone NEWDB
1a690 20 20 20 20 20 20 20 20 20 20 20 20 20 43 6c 6f               Clo
1a6a0 6e 65 20 64 61 74 61 20 69 6e 74 6f 20 4e 45 57  ne data into NEW
1a6b0 44 42 20 66 72 6f 6d 20 74 68 65 20 65 78 69 73  DB from the exis
1a6c0 74 69 6e 67 20 64 61 74 61 62 61 73 65 22 2c 0a  ting database",.
1a6d0 20 20 22 2e 64 61 74 61 62 61 73 65 73 20 20 20    ".databases   
1a6e0 20 20 20 20 20 20 20 20 20 20 20 20 4c 69 73 74              List
1a6f0 20 6e 61 6d 65 73 20 61 6e 64 20 66 69 6c 65 73   names and files
1a700 20 6f 66 20 61 74 74 61 63 68 65 64 20 64 61 74   of attached dat
1a710 61 62 61 73 65 73 22 2c 0a 20 20 22 2e 64 62 63  abases",.  ".dbc
1a720 6f 6e 66 69 67 20 3f 6f 70 3f 20 3f 76 61 6c 3f  onfig ?op? ?val?
1a730 20 20 20 20 20 4c 69 73 74 20 6f 72 20 63 68 61       List or cha
1a740 6e 67 65 20 73 71 6c 69 74 65 33 5f 64 62 5f 63  nge sqlite3_db_c
1a750 6f 6e 66 69 67 28 29 20 6f 70 74 69 6f 6e 73 22  onfig() options"
1a760 2c 0a 20 20 22 2e 64 62 69 6e 66 6f 20 3f 44 42  ,.  ".dbinfo ?DB
1a770 3f 20 20 20 20 20 20 20 20 20 20 20 20 20 53 68  ?             Sh
1a780 6f 77 20 73 74 61 74 75 73 20 69 6e 66 6f 72 6d  ow status inform
1a790 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20  ation about the 
1a7a0 64 61 74 61 62 61 73 65 22 2c 0a 20 20 22 2e 64  database",.  ".d
1a7b0 75 6d 70 20 3f 54 41 42 4c 45 3f 20 2e 2e 2e 20  ump ?TABLE? ... 
1a7c0 20 20 20 20 20 20 20 52 65 6e 64 65 72 20 61 6c         Render al
1a7d0 6c 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74 65  l database conte
1a7e0 6e 74 20 61 73 20 53 51 4c 22 2c 0a 20 20 22 20  nt as SQL",.  " 
1a7f0 20 20 4f 70 74 69 6f 6e 73 3a 22 2c 0a 20 20 22    Options:",.  "
1a800 20 20 20 20 20 2d 2d 70 72 65 73 65 72 76 65 2d       --preserve-
1a810 72 6f 77 69 64 73 20 20 20 20 20 20 49 6e 63 6c  rowids      Incl
1a820 75 64 65 20 52 4f 57 49 44 20 76 61 6c 75 65 73  ude ROWID values
1a830 20 69 6e 20 74 68 65 20 6f 75 74 70 75 74 22 2c   in the output",
1a840 0a 20 20 22 20 20 20 20 20 2d 2d 6e 65 77 6c 69  .  "     --newli
1a850 6e 65 73 20 20 20 20 20 20 20 20 20 20 20 20 20  nes             
1a860 41 6c 6c 6f 77 20 75 6e 65 73 63 61 70 65 64 20  Allow unescaped 
1a870 6e 65 77 6c 69 6e 65 20 63 68 61 72 61 63 74 65  newline characte
1a880 72 73 20 69 6e 20 6f 75 74 70 75 74 22 2c 0a 20  rs in output",. 
1a890 20 22 20 20 20 54 41 42 4c 45 20 69 73 20 61 20   "   TABLE is a 
1a8a0 4c 49 4b 45 20 70 61 74 74 65 72 6e 20 66 6f 72  LIKE pattern for
1a8b0 20 74 68 65 20 74 61 62 6c 65 73 20 74 6f 20 64   the tables to d
1a8c0 75 6d 70 22 2c 0a 20 20 22 2e 65 63 68 6f 20 6f  ump",.  ".echo o
1a8d0 6e 7c 6f 66 66 20 20 20 20 20 20 20 20 20 20 20  n|off           
1a8e0 20 20 54 75 72 6e 20 63 6f 6d 6d 61 6e 64 20 65    Turn command e
1a8f0 63 68 6f 20 6f 6e 20 6f 72 20 6f 66 66 22 2c 0a  cho on or off",.
1a900 20 20 22 2e 65 71 70 20 6f 6e 7c 6f 66 66 7c 66    ".eqp on|off|f
1a910 75 6c 6c 7c 2e 2e 2e 20 20 20 20 20 45 6e 61 62  ull|...     Enab
1a920 6c 65 20 6f 72 20 64 69 73 61 62 6c 65 20 61 75  le or disable au
1a930 74 6f 6d 61 74 69 63 20 45 58 50 4c 41 49 4e 20  tomatic EXPLAIN 
1a940 51 55 45 52 59 20 50 4c 41 4e 22 2c 0a 20 20 22  QUERY PLAN",.  "
1a950 20 20 20 4f 74 68 65 72 20 4d 6f 64 65 73 3a 22     Other Modes:"
1a960 2c 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ,.#ifdef SQLITE_
1a970 44 45 42 55 47 0a 20 20 22 20 20 20 20 20 20 74  DEBUG.  "      t
1a980 65 73 74 20 20 20 20 20 20 20 20 20 20 20 20 20  est             
1a990 20 20 20 20 20 53 68 6f 77 20 72 61 77 20 45 58       Show raw EX
1a9a0 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e  PLAIN QUERY PLAN
1a9b0 20 6f 75 74 70 75 74 22 2c 0a 20 20 22 20 20 20   output",.  "   
1a9c0 20 20 20 74 72 61 63 65 20 20 20 20 20 20 20 20     trace        
1a9d0 20 20 20 20 20 20 20 20 20 4c 69 6b 65 20 5c 22           Like \"
1a9e0 66 75 6c 6c 5c 22 20 62 75 74 20 61 6c 73 6f 20  full\" but also 
1a9f0 65 6e 61 62 6c 65 20 5c 22 50 52 41 47 4d 41 20  enable \"PRAGMA 
1aa00 76 64 62 65 5f 74 72 61 63 65 5c 22 22 2c 0a 23  vdbe_trace\"",.#
1aa10 65 6e 64 69 66 0a 20 20 22 20 20 20 20 20 20 74  endif.  "      t
1aa20 72 69 67 67 65 72 20 20 20 20 20 20 20 20 20 20  rigger          
1aa30 20 20 20 20 20 4c 69 6b 65 20 5c 22 66 75 6c 6c       Like \"full
1aa40 5c 22 20 62 75 74 20 61 6c 73 6f 20 73 68 6f 77  \" but also show
1aa50 20 74 72 69 67 67 65 72 20 62 79 74 65 63 6f 64   trigger bytecod
1aa60 65 22 2c 0a 20 20 22 2e 65 78 63 65 6c 20 20 20  e",.  ".excel   
1aa70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aa80 44 69 73 70 6c 61 79 20 74 68 65 20 6f 75 74 70  Display the outp
1aa90 75 74 20 6f 66 20 6e 65 78 74 20 63 6f 6d 6d 61  ut of next comma
1aaa0 6e 64 20 69 6e 20 61 20 73 70 72 65 61 64 73 68  nd in a spreadsh
1aab0 65 65 74 22 2c 0a 20 20 22 2e 65 78 69 74 20 3f  eet",.  ".exit ?
1aac0 43 4f 44 45 3f 20 20 20 20 20 20 20 20 20 20 20  CODE?           
1aad0 20 20 45 78 69 74 20 74 68 69 73 20 70 72 6f 67    Exit this prog
1aae0 72 61 6d 20 77 69 74 68 20 72 65 74 75 72 6e 2d  ram with return-
1aaf0 63 6f 64 65 20 43 4f 44 45 22 2c 0a 20 20 22 2e  code CODE",.  ".
1ab00 65 78 70 65 72 74 20 20 20 20 20 20 20 20 20 20  expert          
1ab10 20 20 20 20 20 20 20 20 45 58 50 45 52 49 4d 45          EXPERIME
1ab20 4e 54 41 4c 2e 20 53 75 67 67 65 73 74 20 69 6e  NTAL. Suggest in
1ab30 64 65 78 65 73 20 66 6f 72 20 73 70 65 63 69 66  dexes for specif
1ab40 69 65 64 20 71 75 65 72 69 65 73 22 2c 0a 2f 2a  ied queries",./*
1ab50 20 42 65 63 61 75 73 65 20 65 78 70 6c 61 69 6e   Because explain
1ab60 20 6d 6f 64 65 20 63 6f 6d 65 73 20 6f 6e 20 61   mode comes on a
1ab70 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 6e 6f 77  utomatically now
1ab80 2c 20 74 68 65 20 22 2e 65 78 70 6c 61 69 6e 22  , the ".explain"
1ab90 20 6d 6f 64 65 0a 2a 2a 20 69 73 20 72 65 6d 6f   mode.** is remo
1aba0 76 65 64 20 66 72 6f 6d 20 74 68 65 20 68 65 6c  ved from the hel
1abb0 70 20 73 63 72 65 65 6e 2e 20 20 49 74 20 69 73  p screen.  It is
1abc0 20 73 74 69 6c 6c 20 73 75 70 70 6f 72 74 65 64   still supported
1abd0 20 66 6f 72 20 6c 65 67 61 63 79 2c 20 68 6f 77   for legacy, how
1abe0 65 76 65 72 20 2a 2f 0a 2f 2a 22 2e 65 78 70 6c  ever */./*".expl
1abf0 61 69 6e 20 3f 6f 6e 7c 6f 66 66 7c 61 75 74 6f  ain ?on|off|auto
1ac00 3f 20 20 20 54 75 72 6e 20 45 58 50 4c 41 49 4e  ?   Turn EXPLAIN
1ac10 20 6f 75 74 70 75 74 20 6d 6f 64 65 20 6f 6e 20   output mode on 
1ac20 6f 72 20 6f 66 66 20 6f 72 20 74 6f 20 61 75 74  or off or to aut
1ac30 6f 6d 61 74 69 63 22 2c 2a 2f 0a 20 20 22 2e 66  omatic",*/.  ".f
1ac40 75 6c 6c 73 63 68 65 6d 61 20 3f 2d 2d 69 6e 64  ullschema ?--ind
1ac50 65 6e 74 3f 20 20 20 53 68 6f 77 20 73 63 68 65  ent?   Show sche
1ac60 6d 61 20 61 6e 64 20 74 68 65 20 63 6f 6e 74 65  ma and the conte
1ac70 6e 74 20 6f 66 20 73 71 6c 69 74 65 5f 73 74 61  nt of sqlite_sta
1ac80 74 20 74 61 62 6c 65 73 22 2c 0a 20 20 22 2e 68  t tables",.  ".h
1ac90 65 61 64 65 72 73 20 6f 6e 7c 6f 66 66 20 20 20  eaders on|off   
1aca0 20 20 20 20 20 20 20 54 75 72 6e 20 64 69 73 70         Turn disp
1acb0 6c 61 79 20 6f 66 20 68 65 61 64 65 72 73 20 6f  lay of headers o
1acc0 6e 20 6f 72 20 6f 66 66 22 2c 0a 20 20 22 2e 68  n or off",.  ".h
1acd0 65 6c 70 20 3f 2d 61 6c 6c 3f 20 3f 50 41 54 54  elp ?-all? ?PATT
1ace0 45 52 4e 3f 20 20 20 53 68 6f 77 20 68 65 6c 70  ERN?   Show help
1acf0 20 74 65 78 74 20 66 6f 72 20 50 41 54 54 45 52   text for PATTER
1ad00 4e 22 2c 0a 20 20 22 2e 69 6d 70 6f 72 74 20 46  N",.  ".import F
1ad10 49 4c 45 20 54 41 42 4c 45 20 20 20 20 20 20 20  ILE TABLE       
1ad20 49 6d 70 6f 72 74 20 64 61 74 61 20 66 72 6f 6d  Import data from
1ad30 20 46 49 4c 45 20 69 6e 74 6f 20 54 41 42 4c 45   FILE into TABLE
1ad40 22 2c 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ",.#ifndef SQLIT
1ad50 45 5f 4f 4d 49 54 5f 54 45 53 54 5f 43 4f 4e 54  E_OMIT_TEST_CONT
1ad60 52 4f 4c 0a 20 20 22 2e 69 6d 70 6f 73 74 65 72  ROL.  ".imposter
1ad70 20 49 4e 44 45 58 20 54 41 42 4c 45 20 20 20 20   INDEX TABLE    
1ad80 43 72 65 61 74 65 20 69 6d 70 6f 73 74 65 72 20  Create imposter 
1ad90 74 61 62 6c 65 20 54 41 42 4c 45 20 6f 6e 20 69  table TABLE on i
1ada0 6e 64 65 78 20 49 4e 44 45 58 22 2c 0a 23 65 6e  ndex INDEX",.#en
1adb0 64 69 66 0a 20 20 22 2e 69 6e 64 65 78 65 73 20  dif.  ".indexes 
1adc0 3f 54 41 42 4c 45 3f 20 20 20 20 20 20 20 20 20  ?TABLE?         
1add0 53 68 6f 77 20 6e 61 6d 65 73 20 6f 66 20 69 6e  Show names of in
1ade0 64 65 78 65 73 22 2c 0a 20 20 22 20 20 20 20 20  dexes",.  "     
1adf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ae00 20 20 20 20 20 20 49 66 20 54 41 42 4c 45 20 69        If TABLE i
1ae10 73 20 73 70 65 63 69 66 69 65 64 2c 20 6f 6e 6c  s specified, onl
1ae20 79 20 73 68 6f 77 20 69 6e 64 65 78 65 73 20 66  y show indexes f
1ae30 6f 72 22 2c 0a 20 20 22 20 20 20 20 20 20 20 20  or",.  "        
1ae40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ae50 20 20 20 74 61 62 6c 65 73 20 6d 61 74 63 68 69     tables matchi
1ae60 6e 67 20 54 41 42 4c 45 20 75 73 69 6e 67 20 74  ng TABLE using t
1ae70 68 65 20 4c 49 4b 45 20 6f 70 65 72 61 74 6f 72  he LIKE operator
1ae80 2e 22 2c 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .",.#ifdef SQLIT
1ae90 45 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41 43 45  E_ENABLE_IOTRACE
1aea0 0a 20 20 22 2e 69 6f 74 72 61 63 65 20 46 49 4c  .  ".iotrace FIL
1aeb0 45 20 20 20 20 20 20 20 20 20 20 20 20 45 6e 61  E            Ena
1aec0 62 6c 65 20 49 2f 4f 20 64 69 61 67 6e 6f 73 74  ble I/O diagnost
1aed0 69 63 20 6c 6f 67 67 69 6e 67 20 74 6f 20 46 49  ic logging to FI
1aee0 4c 45 22 2c 0a 23 65 6e 64 69 66 0a 20 20 22 2e  LE",.#endif.  ".
1aef0 6c 69 6d 69 74 20 3f 4c 49 4d 49 54 3f 20 3f 56  limit ?LIMIT? ?V
1af00 41 4c 3f 20 20 20 20 20 44 69 73 70 6c 61 79 20  AL?     Display 
1af10 6f 72 20 63 68 61 6e 67 65 20 74 68 65 20 76 61  or change the va
1af20 6c 75 65 20 6f 66 20 61 6e 20 53 51 4c 49 54 45  lue of an SQLITE
1af30 5f 4c 49 4d 49 54 22 2c 0a 20 20 22 2e 6c 69 6e  _LIMIT",.  ".lin
1af40 74 20 4f 50 54 49 4f 4e 53 20 20 20 20 20 20 20  t OPTIONS       
1af50 20 20 20 20 20 52 65 70 6f 72 74 20 70 6f 74 65       Report pote
1af60 6e 74 69 61 6c 20 73 63 68 65 6d 61 20 69 73 73  ntial schema iss
1af70 75 65 73 2e 22 2c 0a 20 20 22 20 20 20 20 20 4f  ues.",.  "     O
1af80 70 74 69 6f 6e 73 3a 22 2c 0a 20 20 22 20 20 20  ptions:",.  "   
1af90 20 20 20 20 20 66 6b 65 79 2d 69 6e 64 65 78 65       fkey-indexe
1afa0 73 20 20 20 20 20 46 69 6e 64 20 6d 69 73 73 69  s     Find missi
1afb0 6e 67 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 69  ng foreign key i
1afc0 6e 64 65 78 65 73 22 2c 0a 23 69 66 6e 64 65 66  ndexes",.#ifndef
1afd0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41   SQLITE_OMIT_LOA
1afe0 44 5f 45 58 54 45 4e 53 49 4f 4e 0a 20 20 22 2e  D_EXTENSION.  ".
1aff0 6c 6f 61 64 20 46 49 4c 45 20 3f 45 4e 54 52 59  load FILE ?ENTRY
1b000 3f 20 20 20 20 20 20 20 4c 6f 61 64 20 61 6e 20  ?       Load an 
1b010 65 78 74 65 6e 73 69 6f 6e 20 6c 69 62 72 61 72  extension librar
1b020 79 22 2c 0a 23 65 6e 64 69 66 0a 20 20 22 2e 6c  y",.#endif.  ".l
1b030 6f 67 20 46 49 4c 45 7c 6f 66 66 20 20 20 20 20  og FILE|off     
1b040 20 20 20 20 20 20 20 54 75 72 6e 20 6c 6f 67 67         Turn logg
1b050 69 6e 67 20 6f 6e 20 6f 72 20 6f 66 66 2e 20 20  ing on or off.  
1b060 46 49 4c 45 20 63 61 6e 20 62 65 20 73 74 64 65  FILE can be stde
1b070 72 72 2f 73 74 64 6f 75 74 22 2c 0a 20 20 22 2e  rr/stdout",.  ".
1b080 6d 6f 64 65 20 4d 4f 44 45 20 3f 54 41 42 4c 45  mode MODE ?TABLE
1b090 3f 20 20 20 20 20 20 20 53 65 74 20 6f 75 74 70  ?       Set outp
1b0a0 75 74 20 6d 6f 64 65 22 2c 0a 20 20 22 20 20 20  ut mode",.  "   
1b0b0 4d 4f 44 45 20 69 73 20 6f 6e 65 20 6f 66 3a 22  MODE is one of:"
1b0c0 2c 0a 20 20 22 20 20 20 20 20 61 73 63 69 69 20  ,.  "     ascii 
1b0d0 20 20 20 43 6f 6c 75 6d 6e 73 2f 72 6f 77 73 20     Columns/rows 
1b0e0 64 65 6c 69 6d 69 74 65 64 20 62 79 20 30 78 31  delimited by 0x1
1b0f0 46 20 61 6e 64 20 30 78 31 45 22 2c 0a 20 20 22  F and 0x1E",.  "
1b100 20 20 20 20 20 63 73 76 20 20 20 20 20 20 43 6f       csv      Co
1b110 6d 6d 61 2d 73 65 70 61 72 61 74 65 64 20 76 61  mma-separated va
1b120 6c 75 65 73 22 2c 0a 20 20 22 20 20 20 20 20 63  lues",.  "     c
1b130 6f 6c 75 6d 6e 20 20 20 4c 65 66 74 2d 61 6c 69  olumn   Left-ali
1b140 67 6e 65 64 20 63 6f 6c 75 6d 6e 73 2e 20 20 28  gned columns.  (
1b150 53 65 65 20 2e 77 69 64 74 68 29 22 2c 0a 20 20  See .width)",.  
1b160 22 20 20 20 20 20 68 74 6d 6c 20 20 20 20 20 48  "     html     H
1b170 54 4d 4c 20 3c 74 61 62 6c 65 3e 20 63 6f 64 65  TML <table> code
1b180 22 2c 0a 20 20 22 20 20 20 20 20 69 6e 73 65 72  ",.  "     inser
1b190 74 20 20 20 53 51 4c 20 69 6e 73 65 72 74 20 73  t   SQL insert s
1b1a0 74 61 74 65 6d 65 6e 74 73 20 66 6f 72 20 54 41  tatements for TA
1b1b0 42 4c 45 22 2c 0a 20 20 22 20 20 20 20 20 6c 69  BLE",.  "     li
1b1c0 6e 65 20 20 20 20 20 4f 6e 65 20 76 61 6c 75 65  ne     One value
1b1d0 20 70 65 72 20 6c 69 6e 65 22 2c 0a 20 20 22 20   per line",.  " 
1b1e0 20 20 20 20 6c 69 73 74 20 20 20 20 20 56 61 6c      list     Val
1b1f0 75 65 73 20 64 65 6c 69 6d 69 74 65 64 20 62 79  ues delimited by
1b200 20 5c 22 7c 5c 22 22 2c 0a 20 20 22 20 20 20 20   \"|\"",.  "    
1b210 20 71 75 6f 74 65 20 20 20 20 45 73 63 61 70 65   quote    Escape
1b220 20 61 6e 73 77 65 72 73 20 61 73 20 66 6f 72 20   answers as for 
1b230 53 51 4c 22 2c 0a 20 20 22 20 20 20 20 20 74 61  SQL",.  "     ta
1b240 62 73 20 20 20 20 20 54 61 62 2d 73 65 70 61 72  bs     Tab-separ
1b250 61 74 65 64 20 76 61 6c 75 65 73 22 2c 0a 20 20  ated values",.  
1b260 22 20 20 20 20 20 74 63 6c 20 20 20 20 20 20 54  "     tcl      T
1b270 43 4c 20 6c 69 73 74 20 65 6c 65 6d 65 6e 74 73  CL list elements
1b280 22 2c 0a 20 20 22 2e 6e 75 6c 6c 76 61 6c 75 65  ",.  ".nullvalue
1b290 20 53 54 52 49 4e 47 20 20 20 20 20 20 20 20 55   STRING        U
1b2a0 73 65 20 53 54 52 49 4e 47 20 69 6e 20 70 6c 61  se STRING in pla
1b2b0 63 65 20 6f 66 20 4e 55 4c 4c 20 76 61 6c 75 65  ce of NULL value
1b2c0 73 22 2c 0a 20 20 22 2e 6f 6e 63 65 20 28 2d 65  s",.  ".once (-e
1b2d0 7c 2d 78 7c 46 49 4c 45 29 20 20 20 20 20 20 20  |-x|FILE)       
1b2e0 4f 75 74 70 75 74 20 66 6f 72 20 74 68 65 20 6e  Output for the n
1b2f0 65 78 74 20 53 51 4c 20 63 6f 6d 6d 61 6e 64 20  ext SQL command 
1b300 6f 6e 6c 79 20 74 6f 20 46 49 4c 45 22 2c 0a 20  only to FILE",. 
1b310 20 22 20 20 20 20 20 49 66 20 46 49 4c 45 20 62   "     If FILE b
1b320 65 67 69 6e 73 20 77 69 74 68 20 27 7c 27 20 74  egins with '|' t
1b330 68 65 6e 20 6f 70 65 6e 20 61 73 20 61 20 70 69  hen open as a pi
1b340 70 65 22 2c 0a 20 20 22 20 20 20 20 20 4f 74 68  pe",.  "     Oth
1b350 65 72 20 6f 70 74 69 6f 6e 73 3a 22 2c 0a 20 20  er options:",.  
1b360 22 20 20 20 20 20 20 20 2d 65 20 20 20 20 49 6e  "       -e    In
1b370 76 6f 6b 65 20 73 79 73 74 65 6d 20 74 65 78 74  voke system text
1b380 20 65 64 69 74 6f 72 22 2c 0a 20 20 22 20 20 20   editor",.  "   
1b390 20 20 20 20 2d 78 20 20 20 20 4f 70 65 6e 20 69      -x    Open i
1b3a0 6e 20 61 20 73 70 72 65 61 64 73 68 65 65 74 22  n a spreadsheet"
1b3b0 2c 0a 20 20 22 2e 6f 70 65 6e 20 3f 4f 50 54 49  ,.  ".open ?OPTI
1b3c0 4f 4e 53 3f 20 3f 46 49 4c 45 3f 20 20 20 43 6c  ONS? ?FILE?   Cl
1b3d0 6f 73 65 20 65 78 69 73 74 69 6e 67 20 64 61 74  ose existing dat
1b3e0 61 62 61 73 65 20 61 6e 64 20 72 65 6f 70 65 6e  abase and reopen
1b3f0 20 46 49 4c 45 22 2c 0a 20 20 22 20 20 20 20 20   FILE",.  "     
1b400 4f 70 74 69 6f 6e 73 3a 22 2c 0a 20 20 22 20 20  Options:",.  "  
1b410 20 20 20 20 20 20 2d 2d 61 70 70 65 6e 64 20 20        --append  
1b420 20 20 20 20 20 20 55 73 65 20 61 70 70 65 6e 64        Use append
1b430 76 66 73 20 74 6f 20 61 70 70 65 6e 64 20 64 61  vfs to append da
1b440 74 61 62 61 73 65 20 74 6f 20 74 68 65 20 65 6e  tabase to the en
1b450 64 20 6f 66 20 46 49 4c 45 22 2c 0a 23 69 66 64  d of FILE",.#ifd
1b460 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
1b470 5f 44 45 53 45 52 49 41 4c 49 5a 45 0a 20 20 22  _DESERIALIZE.  "
1b480 20 20 20 20 20 20 20 20 2d 2d 64 65 73 65 72 69          --deseri
1b490 61 6c 69 7a 65 20 20 20 4c 6f 61 64 20 69 6e 74  alize   Load int
1b4a0 6f 20 6d 65 6d 6f 72 79 20 75 73 65 69 6e 67 20  o memory useing 
1b4b0 73 71 6c 69 74 65 33 5f 64 65 73 65 72 69 61 6c  sqlite3_deserial
1b4c0 69 7a 65 28 29 22 2c 0a 20 20 22 20 20 20 20 20  ize()",.  "     
1b4d0 20 20 20 2d 2d 68 65 78 64 62 20 20 20 20 20 20     --hexdb      
1b4e0 20 20 20 4c 6f 61 64 20 74 68 65 20 6f 75 74 70     Load the outp
1b4f0 75 74 20 6f 66 20 5c 22 64 62 74 6f 74 78 74 5c  ut of \"dbtotxt\
1b500 22 20 61 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  " as an in-memor
1b510 79 20 64 61 74 61 62 61 73 65 22 2c 0a 20 20 22  y database",.  "
1b520 20 20 20 20 20 20 20 20 2d 2d 6d 61 78 73 69 7a          --maxsiz
1b530 65 20 4e 20 20 20 20 20 4d 61 78 69 6d 75 6d 20  e N     Maximum 
1b540 73 69 7a 65 20 66 6f 72 20 2d 2d 68 65 78 64 62  size for --hexdb
1b550 20 6f 72 20 2d 2d 64 65 73 65 72 69 61 6c 69 7a   or --deserializ
1b560 65 64 20 64 61 74 61 62 61 73 65 22 2c 0a 23 65  ed database",.#e
1b570 6e 64 69 66 0a 20 20 22 20 20 20 20 20 20 20 20  ndif.  "        
1b580 2d 2d 6e 65 77 20 20 20 20 20 20 20 20 20 20 20  --new           
1b590 49 6e 69 74 69 61 6c 69 7a 65 20 46 49 4c 45 20  Initialize FILE 
1b5a0 74 6f 20 61 6e 20 65 6d 70 74 79 20 64 61 74 61  to an empty data
1b5b0 62 61 73 65 22 2c 0a 20 20 22 20 20 20 20 20 20  base",.  "      
1b5c0 20 20 2d 2d 72 65 61 64 6f 6e 6c 79 20 20 20 20    --readonly    
1b5d0 20 20 4f 70 65 6e 20 46 49 4c 45 20 72 65 61 64    Open FILE read
1b5e0 6f 6e 6c 79 22 2c 0a 20 20 22 20 20 20 20 20 20  only",.  "      
1b5f0 20 20 2d 2d 7a 69 70 20 20 20 20 20 20 20 20 20    --zip         
1b600 20 20 46 49 4c 45 20 69 73 20 61 20 5a 49 50 20    FILE is a ZIP 
1b610 61 72 63 68 69 76 65 22 2c 0a 20 20 22 2e 6f 75  archive",.  ".ou
1b620 74 70 75 74 20 3f 46 49 4c 45 3f 20 20 20 20 20  tput ?FILE?     
1b630 20 20 20 20 20 20 53 65 6e 64 20 6f 75 74 70 75        Send outpu
1b640 74 20 74 6f 20 46 49 4c 45 20 6f 72 20 73 74 64  t to FILE or std
1b650 6f 75 74 20 69 66 20 46 49 4c 45 20 69 73 20 6f  out if FILE is o
1b660 6d 69 74 74 65 64 22 2c 0a 20 20 22 20 20 20 20  mitted",.  "    
1b670 20 49 66 20 46 49 4c 45 20 62 65 67 69 6e 73 20   If FILE begins 
1b680 77 69 74 68 20 27 7c 27 20 74 68 65 6e 20 6f 70  with '|' then op
1b690 65 6e 20 69 74 20 61 73 20 61 20 70 69 70 65 2e  en it as a pipe.
1b6a0 22 2c 0a 20 20 22 2e 70 61 72 61 6d 65 74 65 72  ",.  ".parameter
1b6b0 20 43 4d 44 20 2e 2e 2e 20 20 20 20 20 20 20 4d   CMD ...       M
1b6c0 61 6e 61 67 65 20 53 51 4c 20 70 61 72 61 6d 65  anage SQL parame
1b6d0 74 65 72 20 62 69 6e 64 69 6e 67 73 22 2c 0a 20  ter bindings",. 
1b6e0 20 22 20 20 20 63 6c 65 61 72 20 20 20 20 20 20   "   clear      
1b6f0 20 20 20 20 20 20 20 20 20 20 20 20 20 45 72 61               Era
1b700 73 65 20 61 6c 6c 20 62 69 6e 64 69 6e 67 73 22  se all bindings"
1b710 2c 0a 20 20 22 20 20 20 69 6e 69 74 20 20 20 20  ,.  "   init    
1b720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b730 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 54  Initialize the T
1b740 45 4d 50 20 74 61 62 6c 65 20 74 68 61 74 20 68  EMP table that h
1b750 6f 6c 64 73 20 62 69 6e 64 69 6e 67 73 22 2c 0a  olds bindings",.
1b760 20 20 22 20 20 20 6c 69 73 74 20 20 20 20 20 20    "   list      
1b770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4c 69                Li
1b780 73 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 70  st the current p
1b790 61 72 61 6d 65 74 65 72 20 62 69 6e 64 69 6e 67  arameter binding
1b7a0 73 22 2c 0a 20 20 22 20 20 20 73 65 74 20 50 41  s",.  "   set PA
1b7b0 52 41 4d 45 54 45 52 20 56 41 4c 55 45 20 20 20  RAMETER VALUE   
1b7c0 20 20 47 69 76 65 6e 20 53 51 4c 20 70 61 72 61    Given SQL para
1b7d0 6d 65 74 65 72 20 50 41 52 41 4d 45 54 45 52 20  meter PARAMETER 
1b7e0 61 20 76 61 6c 75 65 20 6f 66 20 56 41 4c 55 45  a value of VALUE
1b7f0 22 2c 0a 20 20 22 20 20 20 20 20 20 20 20 20 20  ",.  "          
1b800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b810 20 50 41 52 41 4d 45 54 45 52 20 73 68 6f 75 6c   PARAMETER shoul
1b820 64 20 73 74 61 72 74 20 77 69 74 68 20 27 24 27  d start with '$'
1b830 2c 20 27 3a 27 2c 20 27 40 27 2c 20 6f 72 20 27  , ':', '@', or '
1b840 3f 27 22 2c 0a 20 20 22 20 20 20 75 6e 73 65 74  ?'",.  "   unset
1b850 20 50 41 52 41 4d 45 54 45 52 20 20 20 20 20 20   PARAMETER      
1b860 20 20 20 52 65 6d 6f 76 65 20 50 41 52 41 4d 45     Remove PARAME
1b870 54 45 52 20 66 72 6f 6d 20 74 68 65 20 62 69 6e  TER from the bin
1b880 64 69 6e 67 20 74 61 62 6c 65 22 2c 0a 20 20 22  ding table",.  "
1b890 2e 70 72 69 6e 74 20 53 54 52 49 4e 47 2e 2e 2e  .print STRING...
1b8a0 20 20 20 20 20 20 20 20 20 50 72 69 6e 74 20 6c           Print l
1b8b0 69 74 65 72 61 6c 20 53 54 52 49 4e 47 22 2c 0a  iteral STRING",.
1b8c0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1b8d0 4d 49 54 5f 50 52 4f 47 52 45 53 53 5f 43 41 4c  MIT_PROGRESS_CAL
1b8e0 4c 42 41 43 4b 0a 20 20 22 2e 70 72 6f 67 72 65  LBACK.  ".progre
1b8f0 73 73 20 4e 20 20 20 20 20 20 20 20 20 20 20 20  ss N            
1b900 20 20 49 6e 76 6f 6b 65 20 70 72 6f 67 72 65 73    Invoke progres
1b910 73 20 68 61 6e 64 6c 65 72 20 61 66 74 65 72 20  s handler after 
1b920 65 76 65 72 79 20 4e 20 6f 70 63 6f 64 65 73 22  every N opcodes"
1b930 2c 0a 20 20 22 20 20 20 2d 2d 6c 69 6d 69 74 20  ,.  "   --limit 
1b940 4e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  N               
1b950 20 20 49 6e 74 65 72 72 75 70 74 20 61 66 74 65    Interrupt afte
1b960 72 20 4e 20 70 72 6f 67 72 65 73 73 20 63 61 6c  r N progress cal
1b970 6c 62 61 63 6b 73 22 2c 0a 20 20 22 20 20 20 2d  lbacks",.  "   -
1b980 2d 6f 6e 63 65 20 20 20 20 20 20 20 20 20 20 20  -once           
1b990 20 20 20 20 20 20 20 20 20 44 6f 20 6e 6f 20 6d           Do no m
1b9a0 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 70 72 6f  ore than one pro
1b9b0 67 72 65 73 73 20 69 6e 74 65 72 72 75 70 74 22  gress interrupt"
1b9c0 2c 0a 20 20 22 20 20 20 2d 2d 71 75 69 65 74 7c  ,.  "   --quiet|
1b9d0 2d 71 20 20 20 20 20 20 20 20 20 20 20 20 20 20  -q              
1b9e0 20 20 4e 6f 20 6f 75 74 70 75 74 20 65 78 63 65    No output exce
1b9f0 70 74 20 61 74 20 69 6e 74 65 72 72 75 70 74 73  pt at interrupts
1ba00 22 2c 0a 20 20 22 20 20 20 2d 2d 72 65 73 65 74  ",.  "   --reset
1ba10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ba20 20 20 20 52 65 73 65 74 20 74 68 65 20 63 6f 75     Reset the cou
1ba30 6e 74 20 66 6f 72 20 65 61 63 68 20 69 6e 70 75  nt for each inpu
1ba40 74 20 61 6e 64 20 69 6e 74 65 72 72 75 70 74 22  t and interrupt"
1ba50 2c 0a 23 65 6e 64 69 66 0a 20 20 22 2e 70 72 6f  ,.#endif.  ".pro
1ba60 6d 70 74 20 4d 41 49 4e 20 43 4f 4e 54 49 4e 55  mpt MAIN CONTINU
1ba70 45 20 20 20 20 52 65 70 6c 61 63 65 20 74 68 65  E    Replace the
1ba80 20 73 74 61 6e 64 61 72 64 20 70 72 6f 6d 70 74   standard prompt
1ba90 73 22 2c 0a 20 20 22 2e 71 75 69 74 20 20 20 20  s",.  ".quit    
1baa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bab0 45 78 69 74 20 74 68 69 73 20 70 72 6f 67 72 61  Exit this progra
1bac0 6d 22 2c 0a 20 20 22 2e 72 65 61 64 20 46 49 4c  m",.  ".read FIL
1bad0 45 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  E               
1bae0 52 65 61 64 20 69 6e 70 75 74 20 66 72 6f 6d 20  Read input from 
1baf0 46 49 4c 45 22 2c 0a 20 20 22 2e 72 65 73 74 6f  FILE",.  ".resto
1bb00 72 65 20 3f 44 42 3f 20 46 49 4c 45 20 20 20 20  re ?DB? FILE    
1bb10 20 20 20 52 65 73 74 6f 72 65 20 63 6f 6e 74 65     Restore conte
1bb20 6e 74 20 6f 66 20 44 42 20 28 64 65 66 61 75 6c  nt of DB (defaul
1bb30 74 20 5c 22 6d 61 69 6e 5c 22 29 20 66 72 6f 6d  t \"main\") from
1bb40 20 46 49 4c 45 22 2c 0a 20 20 22 2e 73 61 76 65   FILE",.  ".save
1bb50 20 46 49 4c 45 20 20 20 20 20 20 20 20 20 20 20   FILE           
1bb60 20 20 20 20 57 72 69 74 65 20 69 6e 2d 6d 65 6d      Write in-mem
1bb70 6f 72 79 20 64 61 74 61 62 61 73 65 20 69 6e 74  ory database int
1bb80 6f 20 46 49 4c 45 22 2c 0a 20 20 22 2e 73 63 61  o FILE",.  ".sca
1bb90 6e 73 74 61 74 73 20 6f 6e 7c 6f 66 66 20 20 20  nstats on|off   
1bba0 20 20 20 20 20 54 75 72 6e 20 73 71 6c 69 74 65       Turn sqlite
1bbb0 33 5f 73 74 6d 74 5f 73 63 61 6e 73 74 61 74 75  3_stmt_scanstatu
1bbc0 73 28 29 20 6d 65 74 72 69 63 73 20 6f 6e 20 6f  s() metrics on o
1bbd0 72 20 6f 66 66 22 2c 0a 20 20 22 2e 73 63 68 65  r off",.  ".sche
1bbe0 6d 61 20 3f 50 41 54 54 45 52 4e 3f 20 20 20 20  ma ?PATTERN?    
1bbf0 20 20 20 20 53 68 6f 77 20 74 68 65 20 43 52 45      Show the CRE
1bc00 41 54 45 20 73 74 61 74 65 6d 65 6e 74 73 20 6d  ATE statements m
1bc10 61 74 63 68 69 6e 67 20 50 41 54 54 45 52 4e 22  atching PATTERN"
1bc20 2c 0a 20 20 22 20 20 20 20 20 4f 70 74 69 6f 6e  ,.  "     Option
1bc30 73 3a 22 2c 0a 20 20 22 20 20 20 20 20 20 20 20  s:",.  "        
1bc40 20 2d 2d 69 6e 64 65 6e 74 20 20 20 20 20 20 20   --indent       
1bc50 20 20 20 20 20 54 72 79 20 74 6f 20 70 72 65 74       Try to pret
1bc60 74 79 2d 70 72 69 6e 74 20 74 68 65 20 73 63 68  ty-print the sch
1bc70 65 6d 61 22 2c 0a 20 20 22 2e 73 65 6c 66 74 65  ema",.  ".selfte
1bc80 73 74 20 3f 4f 50 54 49 4f 4e 53 3f 20 20 20 20  st ?OPTIONS?    
1bc90 20 20 52 75 6e 20 74 65 73 74 73 20 64 65 66 69    Run tests defi
1bca0 6e 65 64 20 69 6e 20 74 68 65 20 53 45 4c 46 54  ned in the SELFT
1bcb0 45 53 54 20 74 61 62 6c 65 22 2c 0a 20 20 22 20  EST table",.  " 
1bcc0 20 20 20 4f 70 74 69 6f 6e 73 3a 22 2c 0a 20 20     Options:",.  
1bcd0 22 20 20 20 20 20 20 20 2d 2d 69 6e 69 74 20 20  "       --init  
1bce0 20 20 20 20 20 20 20 20 20 20 20 20 20 43 72 65               Cre
1bcf0 61 74 65 20 61 20 6e 65 77 20 53 45 4c 46 54 45  ate a new SELFTE
1bd00 53 54 20 74 61 62 6c 65 22 2c 0a 20 20 22 20 20  ST table",.  "  
1bd10 20 20 20 20 20 2d 76 20 20 20 20 20 20 20 20 20       -v         
1bd20 20 20 20 20 20 20 20 20 20 20 56 65 72 62 6f 73            Verbos
1bd30 65 20 6f 75 74 70 75 74 22 2c 0a 20 20 22 2e 73  e output",.  ".s
1bd40 65 70 61 72 61 74 6f 72 20 43 4f 4c 20 3f 52 4f  eparator COL ?RO
1bd50 57 3f 20 20 20 20 20 43 68 61 6e 67 65 20 74 68  W?     Change th
1bd60 65 20 63 6f 6c 75 6d 6e 20 61 6e 64 20 72 6f 77  e column and row
1bd70 20 73 65 70 61 72 61 74 6f 72 73 22 2c 0a 23 69   separators",.#i
1bd80 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
1bd90 5f 45 4e 41 42 4c 45 5f 53 45 53 53 49 4f 4e 29  _ENABLE_SESSION)
1bda0 0a 20 20 22 2e 73 65 73 73 69 6f 6e 20 3f 4e 41  .  ".session ?NA
1bdb0 4d 45 3f 20 43 4d 44 20 2e 2e 2e 20 20 43 72 65  ME? CMD ...  Cre
1bdc0 61 74 65 20 6f 72 20 63 6f 6e 74 72 6f 6c 20 73  ate or control s
1bdd0 65 73 73 69 6f 6e 73 22 2c 0a 20 20 22 20 20 20  essions",.  "   
1bde0 53 75 62 63 6f 6d 6d 61 6e 64 73 3a 22 2c 0a 20  Subcommands:",. 
1bdf0 20 22 20 20 20 20 20 61 74 74 61 63 68 20 54 41   "     attach TA
1be00 42 4c 45 20 20 20 20 20 20 20 20 20 20 20 20 20  BLE             
1be10 41 74 74 61 63 68 20 54 41 42 4c 45 22 2c 0a 20  Attach TABLE",. 
1be20 20 22 20 20 20 20 20 63 68 61 6e 67 65 73 65 74   "     changeset
1be30 20 46 49 4c 45 20 20 20 20 20 20 20 20 20 20 20   FILE           
1be40 57 72 69 74 65 20 61 20 63 68 61 6e 67 65 73 65  Write a changese
1be50 74 20 69 6e 74 6f 20 46 49 4c 45 22 2c 0a 20 20  t into FILE",.  
1be60 22 20 20 20 20 20 63 6c 6f 73 65 20 20 20 20 20  "     close     
1be70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 43                 C
1be80 6c 6f 73 65 20 6f 6e 65 20 73 65 73 73 69 6f 6e  lose one session
1be90 22 2c 0a 20 20 22 20 20 20 20 20 65 6e 61 62 6c  ",.  "     enabl
1bea0 65 20 3f 42 4f 4f 4c 45 41 4e 3f 20 20 20 20 20  e ?BOOLEAN?     
1beb0 20 20 20 20 53 65 74 20 6f 72 20 71 75 65 72 79      Set or query
1bec0 20 74 68 65 20 65 6e 61 62 6c 65 20 62 69 74 22   the enable bit"
1bed0 2c 0a 20 20 22 20 20 20 20 20 66 69 6c 74 65 72  ,.  "     filter
1bee0 20 47 4c 4f 42 2e 2e 2e 20 20 20 20 20 20 20 20   GLOB...        
1bef0 20 20 20 52 65 6a 65 63 74 20 74 61 62 6c 65 73     Reject tables
1bf00 20 6d 61 74 63 68 69 6e 67 20 47 4c 4f 42 73 22   matching GLOBs"
1bf10 2c 0a 20 20 22 20 20 20 20 20 69 6e 64 69 72 65  ,.  "     indire
1bf20 63 74 20 3f 42 4f 4f 4c 45 41 4e 3f 20 20 20 20  ct ?BOOLEAN?    
1bf30 20 20 20 4d 61 72 6b 20 6f 72 20 71 75 65 72 79     Mark or query
1bf40 20 74 68 65 20 69 6e 64 69 72 65 63 74 20 73 74   the indirect st
1bf50 61 74 75 73 22 2c 0a 20 20 22 20 20 20 20 20 69  atus",.  "     i
1bf60 73 65 6d 70 74 79 20 20 20 20 20 20 20 20 20 20  sempty          
1bf70 20 20 20 20 20 20 20 20 51 75 65 72 79 20 77 68          Query wh
1bf80 65 74 68 65 72 20 74 68 65 20 73 65 73 73 69 6f  ether the sessio
1bf90 6e 20 69 73 20 65 6d 70 74 79 22 2c 0a 20 20 22  n is empty",.  "
1bfa0 20 20 20 20 20 6c 69 73 74 20 20 20 20 20 20 20       list       
1bfb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4c 69                Li
1bfc0 73 74 20 63 75 72 72 65 6e 74 6c 79 20 6f 70 65  st currently ope
1bfd0 6e 20 73 65 73 73 69 6f 6e 20 6e 61 6d 65 73 22  n session names"
1bfe0 2c 0a 20 20 22 20 20 20 20 20 6f 70 65 6e 20 44  ,.  "     open D
1bff0 42 20 4e 41 4d 45 20 20 20 20 20 20 20 20 20 20  B NAME          
1c000 20 20 20 4f 70 65 6e 20 61 20 6e 65 77 20 73 65     Open a new se
1c010 73 73 69 6f 6e 20 6f 6e 20 44 42 22 2c 0a 20 20  ssion on DB",.  
1c020 22 20 20 20 20 20 70 61 74 63 68 73 65 74 20 46  "     patchset F
1c030 49 4c 45 20 20 20 20 20 20 20 20 20 20 20 20 57  ILE            W
1c040 72 69 74 65 20 61 20 70 61 74 63 68 73 65 74 20  rite a patchset 
1c050 69 6e 74 6f 20 46 49 4c 45 22 2c 0a 20 20 22 20  into FILE",.  " 
1c060 20 20 49 66 20 3f 4e 41 4d 45 3f 20 69 73 20 6f    If ?NAME? is o
1c070 6d 69 74 74 65 64 2c 20 74 68 65 20 66 69 72 73  mitted, the firs
1c080 74 20 64 65 66 69 6e 65 64 20 73 65 73 73 69 6f  t defined sessio
1c090 6e 20 69 73 20 75 73 65 64 2e 22 2c 0a 23 65 6e  n is used.",.#en
1c0a0 64 69 66 0a 20 20 22 2e 73 68 61 33 73 75 6d 20  dif.  ".sha3sum 
1c0b0 2e 2e 2e 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
1c0c0 43 6f 6d 70 75 74 65 20 61 20 53 48 41 33 20 68  Compute a SHA3 h
1c0d0 61 73 68 20 6f 66 20 64 61 74 61 62 61 73 65 20  ash of database 
1c0e0 63 6f 6e 74 65 6e 74 22 2c 0a 20 20 22 20 20 20  content",.  "   
1c0f0 20 4f 70 74 69 6f 6e 73 3a 22 2c 0a 20 20 22 20   Options:",.  " 
1c100 20 20 20 20 20 2d 2d 73 63 68 65 6d 61 20 20 20       --schema   
1c110 20 20 20 20 20 20 20 20 20 20 20 41 6c 73 6f 20             Also 
1c120 68 61 73 68 20 74 68 65 20 73 71 6c 69 74 65 5f  hash the sqlite_
1c130 6d 61 73 74 65 72 20 74 61 62 6c 65 22 2c 0a 20  master table",. 
1c140 20 22 20 20 20 20 20 20 2d 2d 73 68 61 33 2d 32   "      --sha3-2
1c150 32 34 20 20 20 20 20 20 20 20 20 20 20 20 55 73  24            Us
1c160 65 20 74 68 65 20 73 68 61 33 2d 32 32 34 20 61  e the sha3-224 a
1c170 6c 67 6f 72 69 74 68 6d 22 2c 0a 20 20 22 20 20  lgorithm",.  "  
1c180 20 20 20 20 2d 2d 73 68 61 33 2d 32 35 36 20 20      --sha3-256  
1c190 20 20 20 20 20 20 20 20 20 20 55 73 65 20 74 68            Use th
1c1a0 65 20 73 68 61 33 2d 32 35 36 20 61 6c 67 6f 72  e sha3-256 algor
1c1b0 69 74 68 6d 2e 20 20 54 68 69 73 20 69 73 20 74  ithm.  This is t
1c1c0 68 65 20 64 65 66 61 75 6c 74 2e 22 2c 0a 20 20  he default.",.  
1c1d0 22 20 20 20 20 20 20 2d 2d 73 68 61 33 2d 33 38  "      --sha3-38
1c1e0 34 20 20 20 20 20 20 20 20 20 20 20 20 55 73 65  4            Use
1c1f0 20 74 68 65 20 73 68 61 33 2d 33 38 34 20 61 6c   the sha3-384 al
1c200 67 6f 72 69 74 68 6d 22 2c 0a 20 20 22 20 20 20  gorithm",.  "   
1c210 20 20 20 2d 2d 73 68 61 33 2d 35 31 32 20 20 20     --sha3-512   
1c220 20 20 20 20 20 20 20 20 20 55 73 65 20 74 68 65           Use the
1c230 20 73 68 61 33 2d 35 31 32 20 61 6c 67 6f 72 69   sha3-512 algori
1c240 74 68 6d 22 2c 0a 20 20 22 20 20 20 20 41 6e 79  thm",.  "    Any
1c250 20 6f 74 68 65 72 20 61 72 67 75 6d 65 6e 74 20   other argument 
1c260 69 73 20 61 20 4c 49 4b 45 20 70 61 74 74 65 72  is a LIKE patter
1c270 6e 20 66 6f 72 20 74 61 62 6c 65 73 20 74 6f 20  n for tables to 
1c280 68 61 73 68 22 2c 0a 23 69 66 6e 64 65 66 20 53  hash",.#ifndef S
1c290 51 4c 49 54 45 5f 4e 4f 48 41 56 45 5f 53 59 53  QLITE_NOHAVE_SYS
1c2a0 54 45 4d 0a 20 20 22 2e 73 68 65 6c 6c 20 43 4d  TEM.  ".shell CM
1c2b0 44 20 41 52 47 53 2e 2e 2e 20 20 20 20 20 20 20  D ARGS...       
1c2c0 52 75 6e 20 43 4d 44 20 41 52 47 53 2e 2e 2e 20  Run CMD ARGS... 
1c2d0 69 6e 20 61 20 73 79 73 74 65 6d 20 73 68 65 6c  in a system shel
1c2e0 6c 22 2c 0a 23 65 6e 64 69 66 0a 20 20 22 2e 73  l",.#endif.  ".s
1c2f0 68 6f 77 20 20 20 20 20 20 20 20 20 20 20 20 20  how             
1c300 20 20 20 20 20 20 20 53 68 6f 77 20 74 68 65 20         Show the 
1c310 63 75 72 72 65 6e 74 20 76 61 6c 75 65 73 20 66  current values f
1c320 6f 72 20 76 61 72 69 6f 75 73 20 73 65 74 74 69  or various setti
1c330 6e 67 73 22 2c 0a 20 20 22 2e 73 74 61 74 73 20  ngs",.  ".stats 
1c340 3f 6f 6e 7c 6f 66 66 3f 20 20 20 20 20 20 20 20  ?on|off?        
1c350 20 20 53 68 6f 77 20 73 74 61 74 73 20 6f 72 20    Show stats or 
1c360 74 75 72 6e 20 73 74 61 74 73 20 6f 6e 20 6f 72  turn stats on or
1c370 20 6f 66 66 22 2c 0a 23 69 66 6e 64 65 66 20 53   off",.#ifndef S
1c380 51 4c 49 54 45 5f 4e 4f 48 41 56 45 5f 53 59 53  QLITE_NOHAVE_SYS
1c390 54 45 4d 0a 20 20 22 2e 73 79 73 74 65 6d 20 43  TEM.  ".system C
1c3a0 4d 44 20 41 52 47 53 2e 2e 2e 20 20 20 20 20 20  MD ARGS...      
1c3b0 52 75 6e 20 43 4d 44 20 41 52 47 53 2e 2e 2e 20  Run CMD ARGS... 
1c3c0 69 6e 20 61 20 73 79 73 74 65 6d 20 73 68 65 6c  in a system shel
1c3d0 6c 22 2c 0a 23 65 6e 64 69 66 0a 20 20 22 2e 74  l",.#endif.  ".t
1c3e0 61 62 6c 65 73 20 3f 54 41 42 4c 45 3f 20 20 20  ables ?TABLE?   
1c3f0 20 20 20 20 20 20 20 4c 69 73 74 20 6e 61 6d 65         List name
1c400 73 20 6f 66 20 74 61 62 6c 65 73 20 6d 61 74 63  s of tables matc
1c410 68 69 6e 67 20 4c 49 4b 45 20 70 61 74 74 65 72  hing LIKE patter
1c420 6e 20 54 41 42 4c 45 22 2c 0a 20 20 22 2e 74 65  n TABLE",.  ".te
1c430 73 74 63 61 73 65 20 4e 41 4d 45 20 20 20 20 20  stcase NAME     
1c440 20 20 20 20 20 20 42 65 67 69 6e 20 72 65 64 69        Begin redi
1c450 72 65 63 74 69 6e 67 20 6f 75 74 70 75 74 20 74  recting output t
1c460 6f 20 27 74 65 73 74 63 61 73 65 2d 6f 75 74 2e  o 'testcase-out.
1c470 74 78 74 27 22 2c 0a 20 20 22 2e 74 69 6d 65 6f  txt'",.  ".timeo
1c480 75 74 20 4d 53 20 20 20 20 20 20 20 20 20 20 20  ut MS           
1c490 20 20 20 54 72 79 20 6f 70 65 6e 69 6e 67 20 6c     Try opening l
1c4a0 6f 63 6b 65 64 20 74 61 62 6c 65 73 20 66 6f 72  ocked tables for
1c4b0 20 4d 53 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73   MS milliseconds
1c4c0 22 2c 0a 20 20 22 2e 74 69 6d 65 72 20 6f 6e 7c  ",.  ".timer on|
1c4d0 6f 66 66 20 20 20 20 20 20 20 20 20 20 20 20 54  off            T
1c4e0 75 72 6e 20 53 51 4c 20 74 69 6d 65 72 20 6f 6e  urn SQL timer on
1c4f0 20 6f 72 20 6f 66 66 22 2c 0a 23 69 66 6e 64 65   or off",.#ifnde
1c500 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52  f SQLITE_OMIT_TR
1c510 41 43 45 0a 20 20 22 2e 74 72 61 63 65 20 3f 4f  ACE.  ".trace ?O
1c520 50 54 49 4f 4e 53 3f 20 20 20 20 20 20 20 20 20  PTIONS?         
1c530 4f 75 74 70 75 74 20 65 61 63 68 20 53 51 4c 20  Output each SQL 
1c540 73 74 61 74 65 6d 65 6e 74 20 61 73 20 69 74 20  statement as it 
1c550 69 73 20 72 75 6e 22 2c 0a 20 20 22 20 20 20 20  is run",.  "    
1c560 46 49 4c 45 20 20 20 20 20 20 20 20 20 20 20 20  FILE            
1c570 20 20 20 20 20 20 20 20 53 65 6e 64 20 6f 75 74          Send out
1c580 70 75 74 20 74 6f 20 46 49 4c 45 22 2c 0a 20 20  put to FILE",.  
1c590 22 20 20 20 20 73 74 64 6f 75 74 20 20 20 20 20  "    stdout     
1c5a0 20 20 20 20 20 20 20 20 20 20 20 20 20 53 65 6e               Sen
1c5b0 64 20 6f 75 74 70 75 74 20 74 6f 20 73 74 64 6f  d output to stdo
1c5c0 75 74 22 2c 0a 20 20 22 20 20 20 20 73 74 64 65  ut",.  "    stde
1c5d0 72 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20  rr              
1c5e0 20 20 20 20 53 65 6e 64 20 6f 75 74 70 75 74 20      Send output 
1c5f0 74 6f 20 73 74 64 65 72 72 22 2c 0a 20 20 22 20  to stderr",.  " 
1c600 20 20 20 6f 66 66 20 20 20 20 20 20 20 20 20 20     off          
1c610 20 20 20 20 20 20 20 20 20 20 20 44 69 73 61 62             Disab
1c620 6c 65 20 74 72 61 63 69 6e 67 22 2c 0a 20 20 22  le tracing",.  "
1c630 20 20 20 20 2d 2d 65 78 70 61 6e 64 65 64 20 20      --expanded  
1c640 20 20 20 20 20 20 20 20 20 20 20 20 45 78 70 61              Expa
1c650 6e 64 20 71 75 65 72 79 20 70 61 72 61 6d 65 74  nd query paramet
1c660 65 72 73 22 2c 0a 23 69 66 64 65 66 20 53 51 4c  ers",.#ifdef SQL
1c670 49 54 45 5f 45 4e 41 42 4c 45 5f 4e 4f 52 4d 41  ITE_ENABLE_NORMA
1c680 4c 49 5a 45 0a 20 20 22 20 20 20 20 2d 2d 6e 6f  LIZE.  "    --no
1c690 72 6d 61 6c 69 7a 65 64 20 20 20 20 20 20 20 20  rmalized        
1c6a0 20 20 20 20 4e 6f 72 6d 61 6c 20 74 68 65 20 53      Normal the S
1c6b0 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 22 2c 0a  QL statements",.
1c6c0 23 65 6e 64 69 66 0a 20 20 22 20 20 20 20 2d 2d  #endif.  "    --
1c6d0 70 6c 61 69 6e 20 20 20 20 20 20 20 20 20 20 20  plain           
1c6e0 20 20 20 20 20 20 53 68 6f 77 20 53 51 4c 20 61        Show SQL a
1c6f0 73 20 69 74 20 69 73 20 69 6e 70 75 74 22 2c 0a  s it is input",.
1c700 20 20 22 20 20 20 20 2d 2d 73 74 6d 74 20 20 20    "    --stmt   
1c710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54                 T
1c720 72 61 63 65 20 73 74 61 74 65 6d 65 6e 74 20 65  race statement e
1c730 78 65 63 75 74 69 6f 6e 20 28 53 51 4c 49 54 45  xecution (SQLITE
1c740 5f 54 52 41 43 45 5f 53 54 4d 54 29 22 2c 0a 20  _TRACE_STMT)",. 
1c750 20 22 20 20 20 20 2d 2d 70 72 6f 66 69 6c 65 20   "    --profile 
1c760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50 72                Pr
1c770 6f 66 69 6c 65 20 73 74 61 74 65 6d 65 6e 74 73  ofile statements
1c780 20 28 53 51 4c 49 54 45 5f 54 52 41 43 45 5f 50   (SQLITE_TRACE_P
1c790 52 4f 46 49 4c 45 29 22 2c 0a 20 20 22 20 20 20  ROFILE)",.  "   
1c7a0 20 2d 2d 72 6f 77 20 20 20 20 20 20 20 20 20 20   --row          
1c7b0 20 20 20 20 20 20 20 20 20 54 72 61 63 65 20 65           Trace e
1c7c0 61 63 68 20 72 6f 77 20 28 53 51 4c 49 54 45 5f  ach row (SQLITE_
1c7d0 54 52 41 43 45 5f 52 4f 57 29 22 2c 0a 20 20 22  TRACE_ROW)",.  "
1c7e0 20 20 20 20 2d 2d 63 6c 6f 73 65 20 20 20 20 20      --close     
1c7f0 20 20 20 20 20 20 20 20 20 20 20 20 54 72 61 63              Trac
1c800 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 6c 6f  e connection clo
1c810 73 65 20 28 53 51 4c 49 54 45 5f 54 52 41 43 45  se (SQLITE_TRACE
1c820 5f 43 4c 4f 53 45 29 22 2c 0a 23 65 6e 64 69 66  _CLOSE)",.#endif
1c830 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
1c840 54 52 41 43 45 20 2a 2f 0a 20 20 22 2e 76 66 73  TRACE */.  ".vfs
1c850 69 6e 66 6f 20 3f 41 55 58 3f 20 20 20 20 20 20  info ?AUX?      
1c860 20 20 20 20 20 49 6e 66 6f 72 6d 61 74 69 6f 6e       Information
1c870 20 61 62 6f 75 74 20 74 68 65 20 74 6f 70 2d 6c   about the top-l
1c880 65 76 65 6c 20 56 46 53 22 2c 0a 20 20 22 2e 76  evel VFS",.  ".v
1c890 66 73 6c 69 73 74 20 20 20 20 20 20 20 20 20 20  fslist          
1c8a0 20 20 20 20 20 20 20 4c 69 73 74 20 61 6c 6c 20         List all 
1c8b0 61 76 61 69 6c 61 62 6c 65 20 56 46 53 65 73 22  available VFSes"
1c8c0 2c 0a 20 20 22 2e 76 66 73 6e 61 6d 65 20 3f 41  ,.  ".vfsname ?A
1c8d0 55 58 3f 20 20 20 20 20 20 20 20 20 20 20 50 72  UX?           Pr
1c8e0 69 6e 74 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  int the name of 
1c8f0 74 68 65 20 56 46 53 20 73 74 61 63 6b 22 2c 0a  the VFS stack",.
1c900 20 20 22 2e 77 69 64 74 68 20 4e 55 4d 31 20 4e    ".width NUM1 N
1c910 55 4d 32 20 2e 2e 2e 20 20 20 20 20 53 65 74 20  UM2 ...     Set 
1c920 63 6f 6c 75 6d 6e 20 77 69 64 74 68 73 20 66 6f  column widths fo
1c930 72 20 5c 22 63 6f 6c 75 6d 6e 5c 22 20 6d 6f 64  r \"column\" mod
1c940 65 22 2c 0a 20 20 22 20 20 20 20 20 4e 65 67 61  e",.  "     Nega
1c950 74 69 76 65 20 76 61 6c 75 65 73 20 72 69 67 68  tive values righ
1c960 74 2d 6a 75 73 74 69 66 79 22 2c 0a 7d 3b 0a 0a  t-justify",.};..
1c970 2f 2a 0a 2a 2a 20 4f 75 74 70 75 74 20 68 65 6c  /*.** Output hel
1c980 70 20 74 65 78 74 2e 0a 2a 2a 0a 2a 2a 20 7a 50  p text..**.** zP
1c990 61 74 74 65 72 6e 20 64 65 73 63 72 69 62 65 73  attern describes
1c9a0 20 74 68 65 20 73 65 74 20 6f 66 20 63 6f 6d 6d   the set of comm
1c9b0 61 6e 64 73 20 66 6f 72 20 77 68 69 63 68 20 68  ands for which h
1c9c0 65 6c 70 20 74 65 78 74 20 69 73 20 70 72 6f 76  elp text is prov
1c9d0 69 64 65 64 2e 0a 2a 2a 20 49 66 20 7a 50 61 74  ided..** If zPat
1c9e0 74 65 72 6e 20 69 73 20 4e 55 4c 4c 2c 20 74 68  tern is NULL, th
1c9f0 65 6e 20 73 68 6f 77 20 61 6c 6c 20 63 6f 6d 6d  en show all comm
1ca00 61 6e 64 73 2c 20 62 75 74 20 6f 6e 6c 79 20 67  ands, but only g
1ca10 69 76 65 20 61 20 6f 6e 65 2d 6c 69 6e 65 0a 2a  ive a one-line.*
1ca20 2a 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66  * description of
1ca30 20 65 61 63 68 2e 0a 2a 2a 0a 2a 2a 20 52 65 74   each..**.** Ret
1ca40 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
1ca50 66 20 6d 61 74 63 68 65 73 2e 0a 2a 2f 0a 73 74  f matches..*/.st
1ca60 61 74 69 63 20 69 6e 74 20 73 68 6f 77 48 65 6c  atic int showHel
1ca70 70 28 46 49 4c 45 20 2a 6f 75 74 2c 20 63 6f 6e  p(FILE *out, con
1ca80 73 74 20 63 68 61 72 20 2a 7a 50 61 74 74 65 72  st char *zPatter
1ca90 6e 29 7b 0a 20 20 69 6e 74 20 69 20 3d 20 30 3b  n){.  int i = 0;
1caa0 0a 20 20 69 6e 74 20 6a 20 3d 20 30 3b 0a 20 20  .  int j = 0;.  
1cab0 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 63 68 61  int n = 0;.  cha
1cac0 72 20 2a 7a 50 61 74 3b 0a 20 20 69 66 28 20 7a  r *zPat;.  if( z
1cad0 50 61 74 74 65 72 6e 3d 3d 30 0a 20 20 20 7c 7c  Pattern==0.   ||
1cae0 20 7a 50 61 74 74 65 72 6e 5b 30 5d 3d 3d 27 30   zPattern[0]=='0
1caf0 27 0a 20 20 20 7c 7c 20 73 74 72 63 6d 70 28 7a  '.   || strcmp(z
1cb00 50 61 74 74 65 72 6e 2c 22 2d 61 22 29 3d 3d 30  Pattern,"-a")==0
1cb10 0a 20 20 20 7c 7c 20 73 74 72 63 6d 70 28 7a 50  .   || strcmp(zP
1cb20 61 74 74 65 72 6e 2c 22 2d 61 6c 6c 22 29 3d 3d  attern,"-all")==
1cb30 30 0a 20 20 29 7b 0a 20 20 20 20 2f 2a 20 53 68  0.  ){.    /* Sh
1cb40 6f 77 20 61 6c 6c 20 63 6f 6d 6d 61 6e 64 73 2c  ow all commands,
1cb50 20 62 75 74 20 6f 6e 6c 79 20 6f 6e 65 20 6c 69   but only one li
1cb60 6e 65 20 70 65 72 20 63 6f 6d 6d 61 6e 64 20 2a  ne per command *
1cb70 2f 0a 20 20 20 20 69 66 28 20 7a 50 61 74 74 65  /.    if( zPatte
1cb80 72 6e 3d 3d 30 20 29 20 7a 50 61 74 74 65 72 6e  rn==0 ) zPattern
1cb90 20 3d 20 22 22 3b 0a 20 20 20 20 66 6f 72 28 69   = "";.    for(i
1cba0 3d 30 3b 20 69 3c 41 72 72 61 79 53 69 7a 65 28  =0; i<ArraySize(
1cbb0 61 7a 48 65 6c 70 29 3b 20 69 2b 2b 29 7b 0a 20  azHelp); i++){. 
1cbc0 20 20 20 20 20 69 66 28 20 61 7a 48 65 6c 70 5b       if( azHelp[
1cbd0 69 5d 5b 30 5d 3d 3d 27 2e 27 20 7c 7c 20 7a 50  i][0]=='.' || zP
1cbe0 61 74 74 65 72 6e 5b 30 5d 20 29 7b 0a 20 20 20  attern[0] ){.   
1cbf0 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
1cc00 28 6f 75 74 2c 20 22 25 73 5c 6e 22 2c 20 61 7a  (out, "%s\n", az
1cc10 48 65 6c 70 5b 69 5d 29 3b 0a 20 20 20 20 20 20  Help[i]);.      
1cc20 20 20 6e 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20    n++;.      }. 
1cc30 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
1cc40 20 20 2f 2a 20 4c 6f 6f 6b 20 66 6f 72 20 63 6f    /* Look for co
1cc50 6d 6d 61 6e 64 73 20 74 68 61 74 20 66 6f 72 20  mmands that for 
1cc60 77 68 69 63 68 20 7a 50 61 74 74 65 72 6e 20 69  which zPattern i
1cc70 73 20 61 6e 20 65 78 61 63 74 20 70 72 65 66 69  s an exact prefi
1cc80 78 20 2a 2f 0a 20 20 20 20 7a 50 61 74 20 3d 20  x */.    zPat = 
1cc90 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
1cca0 22 2e 25 73 2a 22 2c 20 7a 50 61 74 74 65 72 6e  ".%s*", zPattern
1ccb0 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  );.    for(i=0; 
1ccc0 69 3c 41 72 72 61 79 53 69 7a 65 28 61 7a 48 65  i<ArraySize(azHe
1ccd0 6c 70 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  lp); i++){.     
1cce0 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72   if( sqlite3_str
1ccf0 67 6c 6f 62 28 7a 50 61 74 2c 20 61 7a 48 65 6c  glob(zPat, azHel
1cd00 70 5b 69 5d 29 3d 3d 30 20 29 7b 0a 20 20 20 20  p[i])==0 ){.    
1cd10 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
1cd20 6f 75 74 2c 20 22 25 73 5c 6e 22 2c 20 61 7a 48  out, "%s\n", azH
1cd30 65 6c 70 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20  elp[i]);.       
1cd40 20 6a 20 3d 20 69 2b 31 3b 0a 20 20 20 20 20 20   j = i+1;.      
1cd50 20 20 6e 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20    n++;.      }. 
1cd60 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
1cd70 5f 66 72 65 65 28 7a 50 61 74 29 3b 0a 20 20 20  _free(zPat);.   
1cd80 20 69 66 28 20 6e 20 29 7b 0a 20 20 20 20 20 20   if( n ){.      
1cd90 69 66 28 20 6e 3d 3d 31 20 29 7b 0a 20 20 20 20  if( n==1 ){.    
1cda0 20 20 20 20 2f 2a 20 77 68 65 6e 20 7a 50 61 74      /* when zPat
1cdb0 74 65 72 6e 20 69 73 20 61 20 70 72 65 66 69 78  tern is a prefix
1cdc0 20 6f 66 20 65 78 61 63 74 6c 79 20 6f 6e 65 20   of exactly one 
1cdd0 63 6f 6d 6d 61 6e 64 2c 20 74 68 65 6e 20 69 6e  command, then in
1cde0 63 6c 75 64 65 20 74 68 65 0a 20 20 20 20 20 20  clude the.      
1cdf0 20 20 2a 2a 20 64 65 74 61 69 6c 73 20 6f 66 20    ** details of 
1ce00 74 68 61 74 20 63 6f 6d 6d 61 6e 64 2c 20 77 68  that command, wh
1ce10 69 63 68 20 73 68 6f 75 6c 64 20 62 65 67 69 6e  ich should begin
1ce20 20 61 74 20 6f 66 66 73 65 74 20 6a 20 2a 2f 0a   at offset j */.
1ce30 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 6a          while( j
1ce40 3c 41 72 72 61 79 53 69 7a 65 28 61 7a 48 65 6c  <ArraySize(azHel
1ce50 70 29 2d 31 20 26 26 20 61 7a 48 65 6c 70 5b 6a  p)-1 && azHelp[j
1ce60 5d 5b 30 5d 21 3d 27 2e 27 20 29 7b 0a 20 20 20  ][0]!='.' ){.   
1ce70 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e         utf8_prin
1ce80 74 66 28 6f 75 74 2c 20 22 25 73 5c 6e 22 2c 20  tf(out, "%s\n", 
1ce90 61 7a 48 65 6c 70 5b 6a 5d 29 3b 0a 20 20 20 20  azHelp[j]);.    
1cea0 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 20        j++;.     
1ceb0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
1cec0 20 20 20 72 65 74 75 72 6e 20 6e 3b 0a 20 20 20     return n;.   
1ced0 20 7d 0a 20 20 20 20 2f 2a 20 4c 6f 6f 6b 20 66   }.    /* Look f
1cee0 6f 72 20 63 6f 6d 6d 61 6e 64 73 20 74 68 61 74  or commands that
1cef0 20 63 6f 6e 74 61 69 6e 20 7a 50 61 74 74 65 72   contain zPatter
1cf00 6e 20 61 6e 79 77 68 65 72 65 2e 20 20 53 68 6f  n anywhere.  Sho
1cf10 77 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 0a 20  w the complete. 
1cf20 20 20 20 2a 2a 20 74 65 78 74 20 6f 66 20 61 6c     ** text of al
1cf30 6c 20 63 6f 6d 6d 61 6e 64 73 20 74 68 61 74 20  l commands that 
1cf40 6d 61 74 63 68 2e 20 2a 2f 0a 20 20 20 20 7a 50  match. */.    zP
1cf50 61 74 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  at = sqlite3_mpr
1cf60 69 6e 74 66 28 22 25 25 25 73 25 25 22 2c 20 7a  intf("%%%s%%", z
1cf70 50 61 74 74 65 72 6e 29 3b 0a 20 20 20 20 66 6f  Pattern);.    fo
1cf80 72 28 69 3d 30 3b 20 69 3c 41 72 72 61 79 53 69  r(i=0; i<ArraySi
1cf90 7a 65 28 61 7a 48 65 6c 70 29 3b 20 69 2b 2b 29  ze(azHelp); i++)
1cfa0 7b 0a 20 20 20 20 20 20 69 66 28 20 61 7a 48 65  {.      if( azHe
1cfb0 6c 70 5b 69 5d 5b 30 5d 3d 3d 27 2e 27 20 29 20  lp[i][0]=='.' ) 
1cfc0 6a 20 3d 20 69 3b 0a 20 20 20 20 20 20 69 66 28  j = i;.      if(
1cfd0 20 73 71 6c 69 74 65 33 5f 73 74 72 6c 69 6b 65   sqlite3_strlike
1cfe0 28 7a 50 61 74 2c 20 61 7a 48 65 6c 70 5b 69 5d  (zPat, azHelp[i]
1cff0 2c 20 30 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  , 0)==0 ){.     
1d000 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 6f     utf8_printf(o
1d010 75 74 2c 20 22 25 73 5c 6e 22 2c 20 61 7a 48 65  ut, "%s\n", azHe
1d020 6c 70 5b 6a 5d 29 3b 0a 20 20 20 20 20 20 20 20  lp[j]);.        
1d030 77 68 69 6c 65 28 20 6a 3c 41 72 72 61 79 53 69  while( j<ArraySi
1d040 7a 65 28 61 7a 48 65 6c 70 29 2d 31 20 26 26 20  ze(azHelp)-1 && 
1d050 61 7a 48 65 6c 70 5b 6a 2b 31 5d 5b 30 5d 21 3d  azHelp[j+1][0]!=
1d060 27 2e 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20  '.' ){.         
1d070 20 6a 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20   j++;.          
1d080 75 74 66 38 5f 70 72 69 6e 74 66 28 6f 75 74 2c  utf8_printf(out,
1d090 20 22 25 73 5c 6e 22 2c 20 61 7a 48 65 6c 70 5b   "%s\n", azHelp[
1d0a0 6a 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  j]);.        }. 
1d0b0 20 20 20 20 20 20 20 69 20 3d 20 6a 3b 0a 20 20         i = j;.  
1d0c0 20 20 20 20 20 20 6e 2b 2b 3b 0a 20 20 20 20 20        n++;.     
1d0d0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c   }.    }.    sql
1d0e0 69 74 65 33 5f 66 72 65 65 28 7a 50 61 74 29 3b  ite3_free(zPat);
1d0f0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 3b  .  }.  return n;
1d100 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72  .}../* Forward r
1d110 65 66 65 72 65 6e 63 65 20 2a 2f 0a 73 74 61 74  eference */.stat
1d120 69 63 20 69 6e 74 20 70 72 6f 63 65 73 73 5f 69  ic int process_i
1d130 6e 70 75 74 28 53 68 65 6c 6c 53 74 61 74 65 20  nput(ShellState 
1d140 2a 70 29 3b 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64  *p);../*.** Read
1d150 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
1d160 66 69 6c 65 20 7a 4e 61 6d 65 20 69 6e 74 6f 20  file zName into 
1d170 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20  memory obtained 
1d180 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  from sqlite3_mal
1d190 6c 6f 63 36 34 28 29 0a 2a 2a 20 61 6e 64 20 72  loc64().** and r
1d1a0 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
1d1b0 74 6f 20 74 68 65 20 62 75 66 66 65 72 2e 20 54  to the buffer. T
1d1c0 68 65 20 63 61 6c 6c 65 72 20 69 73 20 72 65 73  he caller is res
1d1d0 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 66 72 65  ponsible for fre
1d1e0 65 69 6e 67 0a 2a 2a 20 74 68 65 20 6d 65 6d 6f  eing.** the memo
1d1f0 72 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72  ry..**.** If par
1d200 61 6d 65 74 65 72 20 70 6e 42 79 74 65 20 69 73  ameter pnByte is
1d210 20 6e 6f 74 20 4e 55 4c 4c 2c 20 28 2a 70 6e 42   not NULL, (*pnB
1d220 79 74 65 29 20 69 73 20 73 65 74 20 74 6f 20 74  yte) is set to t
1d230 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
1d240 65 73 0a 2a 2a 20 72 65 61 64 2e 0a 2a 2a 0a 2a  es.** read..**.*
1d250 2a 20 46 6f 72 20 63 6f 6e 76 65 6e 69 65 6e 63  * For convenienc
1d260 65 2c 20 61 20 6e 75 6c 2d 74 65 72 6d 69 6e 61  e, a nul-termina
1d270 74 6f 72 20 62 79 74 65 20 69 73 20 61 6c 77 61  tor byte is alwa
1d280 79 73 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74  ys appended to t
1d290 68 65 20 64 61 74 61 20 72 65 61 64 0a 2a 2a 20  he data read.** 
1d2a0 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 62 65  from the file be
1d2b0 66 6f 72 65 20 74 68 65 20 62 75 66 66 65 72 20  fore the buffer 
1d2c0 69 73 20 72 65 74 75 72 6e 65 64 2e 20 54 68 69  is returned. Thi
1d2d0 73 20 62 79 74 65 20 69 73 20 6e 6f 74 20 69 6e  s byte is not in
1d2e0 63 6c 75 64 65 64 20 69 6e 0a 2a 2a 20 74 68 65  cluded in.** the
1d2f0 20 66 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20   final value of 
1d300 28 2a 70 6e 42 79 74 65 29 2c 20 69 66 20 61 70  (*pnByte), if ap
1d310 70 6c 69 63 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20  plicable..**.** 
1d320 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64  NULL is returned
1d330 20 69 66 20 61 6e 79 20 65 72 72 6f 72 20 69 73   if any error is
1d340 20 65 6e 63 6f 75 6e 74 65 72 65 64 2e 20 54 68   encountered. Th
1d350 65 20 66 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66  e final value of
1d360 20 2a 70 6e 42 79 74 65 0a 2a 2a 20 69 73 20 75   *pnByte.** is u
1d370 6e 64 65 66 69 6e 65 64 20 69 6e 20 74 68 69 73  ndefined in this
1d380 20 63 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   case..*/.static
1d390 20 63 68 61 72 20 2a 72 65 61 64 46 69 6c 65 28   char *readFile(
1d3a0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
1d3b0 65 2c 20 69 6e 74 20 2a 70 6e 42 79 74 65 29 7b  e, int *pnByte){
1d3c0 0a 20 20 46 49 4c 45 20 2a 69 6e 20 3d 20 66 6f  .  FILE *in = fo
1d3d0 70 65 6e 28 7a 4e 61 6d 65 2c 20 22 72 62 22 29  pen(zName, "rb")
1d3e0 3b 0a 20 20 6c 6f 6e 67 20 6e 49 6e 3b 0a 20 20  ;.  long nIn;.  
1d3f0 73 69 7a 65 5f 74 20 6e 52 65 61 64 3b 0a 20 20  size_t nRead;.  
1d400 63 68 61 72 20 2a 70 42 75 66 3b 0a 20 20 69 66  char *pBuf;.  if
1d410 28 20 69 6e 3d 3d 30 20 29 20 72 65 74 75 72 6e  ( in==0 ) return
1d420 20 30 3b 0a 20 20 66 73 65 65 6b 28 69 6e 2c 20   0;.  fseek(in, 
1d430 30 2c 20 53 45 45 4b 5f 45 4e 44 29 3b 0a 20 20  0, SEEK_END);.  
1d440 6e 49 6e 20 3d 20 66 74 65 6c 6c 28 69 6e 29 3b  nIn = ftell(in);
1d450 0a 20 20 72 65 77 69 6e 64 28 69 6e 29 3b 0a 20  .  rewind(in);. 
1d460 20 70 42 75 66 20 3d 20 73 71 6c 69 74 65 33 5f   pBuf = sqlite3_
1d470 6d 61 6c 6c 6f 63 36 34 28 20 6e 49 6e 2b 31 20  malloc64( nIn+1 
1d480 29 3b 0a 20 20 69 66 28 20 70 42 75 66 3d 3d 30  );.  if( pBuf==0
1d490 20 29 7b 20 66 63 6c 6f 73 65 28 69 6e 29 3b 20   ){ fclose(in); 
1d4a0 72 65 74 75 72 6e 20 30 3b 20 7d 0a 20 20 6e 52  return 0; }.  nR
1d4b0 65 61 64 20 3d 20 66 72 65 61 64 28 70 42 75 66  ead = fread(pBuf
1d4c0 2c 20 6e 49 6e 2c 20 31 2c 20 69 6e 29 3b 0a 20  , nIn, 1, in);. 
1d4d0 20 66 63 6c 6f 73 65 28 69 6e 29 3b 0a 20 20 69   fclose(in);.  i
1d4e0 66 28 20 6e 52 65 61 64 21 3d 31 20 29 7b 0a 20  f( nRead!=1 ){. 
1d4f0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
1d500 70 42 75 66 29 3b 0a 20 20 20 20 72 65 74 75 72  pBuf);.    retur
1d510 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 42 75 66 5b  n 0;.  }.  pBuf[
1d520 6e 49 6e 5d 20 3d 20 30 3b 0a 20 20 69 66 28 20  nIn] = 0;.  if( 
1d530 70 6e 42 79 74 65 20 29 20 2a 70 6e 42 79 74 65  pnByte ) *pnByte
1d540 20 3d 20 6e 49 6e 3b 0a 20 20 72 65 74 75 72 6e   = nIn;.  return
1d550 20 70 42 75 66 3b 0a 7d 0a 0a 23 69 66 20 64 65   pBuf;.}..#if de
1d560 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
1d570 42 4c 45 5f 53 45 53 53 49 4f 4e 29 0a 2f 2a 0a  BLE_SESSION)./*.
1d580 2a 2a 20 43 6c 6f 73 65 20 61 20 73 69 6e 67 6c  ** Close a singl
1d590 65 20 4f 70 65 6e 53 65 73 73 69 6f 6e 20 6f 62  e OpenSession ob
1d5a0 6a 65 63 74 20 61 6e 64 20 72 65 6c 65 61 73 65  ject and release
1d5b0 20 61 6c 6c 20 6f 66 20 69 74 73 20 61 73 73 6f   all of its asso
1d5c0 63 69 61 74 65 64 0a 2a 2a 20 72 65 73 6f 75 72  ciated.** resour
1d5d0 63 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ces..*/.static v
1d5e0 6f 69 64 20 73 65 73 73 69 6f 6e 5f 63 6c 6f 73  oid session_clos
1d5f0 65 28 4f 70 65 6e 53 65 73 73 69 6f 6e 20 2a 70  e(OpenSession *p
1d600 53 65 73 73 69 6f 6e 29 7b 0a 20 20 69 6e 74 20  Session){.  int 
1d610 69 3b 0a 20 20 73 71 6c 69 74 65 33 73 65 73 73  i;.  sqlite3sess
1d620 69 6f 6e 5f 64 65 6c 65 74 65 28 70 53 65 73 73  ion_delete(pSess
1d630 69 6f 6e 2d 3e 70 29 3b 0a 20 20 73 71 6c 69 74  ion->p);.  sqlit
1d640 65 33 5f 66 72 65 65 28 70 53 65 73 73 69 6f 6e  e3_free(pSession
1d650 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 66 6f 72 28  ->zName);.  for(
1d660 69 3d 30 3b 20 69 3c 70 53 65 73 73 69 6f 6e 2d  i=0; i<pSession-
1d670 3e 6e 46 69 6c 74 65 72 3b 20 69 2b 2b 29 7b 0a  >nFilter; i++){.
1d680 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
1d690 28 70 53 65 73 73 69 6f 6e 2d 3e 61 7a 46 69 6c  (pSession->azFil
1d6a0 74 65 72 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 73  ter[i]);.  }.  s
1d6b0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 53 65 73  qlite3_free(pSes
1d6c0 73 69 6f 6e 2d 3e 61 7a 46 69 6c 74 65 72 29 3b  sion->azFilter);
1d6d0 0a 20 20 6d 65 6d 73 65 74 28 70 53 65 73 73 69  .  memset(pSessi
1d6e0 6f 6e 2c 20 30 2c 20 73 69 7a 65 6f 66 28 4f 70  on, 0, sizeof(Op
1d6f0 65 6e 53 65 73 73 69 6f 6e 29 29 3b 0a 7d 0a 23  enSession));.}.#
1d700 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f  endif../*.** Clo
1d710 73 65 20 61 6c 6c 20 4f 70 65 6e 53 65 73 73 69  se all OpenSessi
1d720 6f 6e 20 6f 62 6a 65 63 74 73 20 61 6e 64 20 72  on objects and r
1d730 65 6c 65 61 73 65 20 61 6c 6c 20 61 73 73 6f 63  elease all assoc
1d740 69 61 74 65 64 20 72 65 73 6f 75 72 63 65 73 2e  iated resources.
1d750 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28  .*/.#if defined(
1d760 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 45  SQLITE_ENABLE_SE
1d770 53 53 49 4f 4e 29 0a 73 74 61 74 69 63 20 76 6f  SSION).static vo
1d780 69 64 20 73 65 73 73 69 6f 6e 5f 63 6c 6f 73 65  id session_close
1d790 5f 61 6c 6c 28 53 68 65 6c 6c 53 74 61 74 65 20  _all(ShellState 
1d7a0 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  *p){.  int i;.  
1d7b0 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 53  for(i=0; i<p->nS
1d7c0 65 73 73 69 6f 6e 3b 20 69 2b 2b 29 7b 0a 20 20  ession; i++){.  
1d7d0 20 20 73 65 73 73 69 6f 6e 5f 63 6c 6f 73 65 28    session_close(
1d7e0 26 70 2d 3e 61 53 65 73 73 69 6f 6e 5b 69 5d 29  &p->aSession[i])
1d7f0 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6e 53 65 73 73  ;.  }.  p->nSess
1d800 69 6f 6e 20 3d 20 30 3b 0a 7d 0a 23 65 6c 73 65  ion = 0;.}.#else
1d810 0a 23 20 64 65 66 69 6e 65 20 73 65 73 73 69 6f  .# define sessio
1d820 6e 5f 63 6c 6f 73 65 5f 61 6c 6c 28 58 29 0a 23  n_close_all(X).#
1d830 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70  endif../*.** Imp
1d840 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  lementation of t
1d850 68 65 20 78 46 69 6c 74 65 72 20 66 75 6e 63 74  he xFilter funct
1d860 69 6f 6e 20 66 6f 72 20 61 6e 20 6f 70 65 6e 20  ion for an open 
1d870 73 65 73 73 69 6f 6e 2e 20 20 4f 6d 69 74 0a 2a  session.  Omit.*
1d880 2a 20 61 6e 79 20 74 61 62 6c 65 73 20 6e 61 6d  * any tables nam
1d890 65 64 20 62 79 20 22 2e 73 65 73 73 69 6f 6e 20  ed by ".session 
1d8a0 66 69 6c 74 65 72 22 20 62 75 74 20 6c 65 74 20  filter" but let 
1d8b0 61 6c 6c 20 6f 74 68 65 72 20 74 61 62 6c 65 20  all other table 
1d8c0 74 68 72 6f 75 67 68 2e 0a 2a 2f 0a 23 69 66 20  through..*/.#if 
1d8d0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
1d8e0 4e 41 42 4c 45 5f 53 45 53 53 49 4f 4e 29 0a 73  NABLE_SESSION).s
1d8f0 74 61 74 69 63 20 69 6e 74 20 73 65 73 73 69 6f  tatic int sessio
1d900 6e 5f 66 69 6c 74 65 72 28 76 6f 69 64 20 2a 70  n_filter(void *p
1d910 43 74 78 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  Ctx, const char 
1d920 2a 7a 54 61 62 29 7b 0a 20 20 4f 70 65 6e 53 65  *zTab){.  OpenSe
1d930 73 73 69 6f 6e 20 2a 70 53 65 73 73 69 6f 6e 20  ssion *pSession 
1d940 3d 20 28 4f 70 65 6e 53 65 73 73 69 6f 6e 2a 29  = (OpenSession*)
1d950 70 43 74 78 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  pCtx;.  int i;. 
1d960 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53 65 73   for(i=0; i<pSes
1d970 73 69 6f 6e 2d 3e 6e 46 69 6c 74 65 72 3b 20 69  sion->nFilter; i
1d980 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c  ++){.    if( sql
1d990 69 74 65 33 5f 73 74 72 67 6c 6f 62 28 70 53 65  ite3_strglob(pSe
1d9a0 73 73 69 6f 6e 2d 3e 61 7a 46 69 6c 74 65 72 5b  ssion->azFilter[
1d9b0 69 5d 2c 20 7a 54 61 62 29 3d 3d 30 20 29 20 72  i], zTab)==0 ) r
1d9c0 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72  eturn 0;.  }.  r
1d9d0 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69  eturn 1;.}.#endi
1d9e0 66 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20  f../*.** Try to 
1d9f0 64 65 64 75 63 65 20 74 68 65 20 74 79 70 65 20  deduce the type 
1da00 6f 66 20 66 69 6c 65 20 66 6f 72 20 7a 4e 61 6d  of file for zNam
1da10 65 20 62 61 73 65 64 20 6f 6e 20 69 74 73 20 63  e based on its c
1da20 6f 6e 74 65 6e 74 2e 20 20 52 65 74 75 72 6e 0a  ontent.  Return.
1da30 2a 2a 20 6f 6e 65 20 6f 66 20 74 68 65 20 53 48  ** one of the SH
1da40 45 4c 4c 5f 4f 50 45 4e 5f 2a 20 63 6f 6e 73 74  ELL_OPEN_* const
1da50 61 6e 74 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ants..**.** If t
1da60 68 65 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74  he file does not
1da70 20 65 78 69 73 74 20 6f 72 20 69 73 20 65 6d 70   exist or is emp
1da80 74 79 20 62 75 74 20 69 74 73 20 6e 61 6d 65 20  ty but its name 
1da90 6c 6f 6f 6b 73 20 6c 69 6b 65 20 61 20 5a 49 50  looks like a ZIP
1daa0 0a 2a 2a 20 61 72 63 68 69 76 65 20 61 6e 64 20  .** archive and 
1dab0 74 68 65 20 64 66 6c 74 5a 69 70 20 66 6c 61 67  the dfltZip flag
1dac0 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 61   is true, then a
1dad0 73 73 75 6d 65 20 69 74 20 69 73 20 61 20 5a 49  ssume it is a ZI
1dae0 50 20 61 72 63 68 69 76 65 2e 0a 2a 2a 20 4f 74  P archive..** Ot
1daf0 68 65 72 77 69 73 65 2c 20 61 73 73 75 6d 65 20  herwise, assume 
1db00 61 6e 20 6f 72 64 69 6e 61 72 79 20 64 61 74 61  an ordinary data
1db10 62 61 73 65 20 72 65 67 61 72 64 6c 65 73 73 20  base regardless 
1db20 6f 66 20 74 68 65 20 66 69 6c 65 6e 61 6d 65 20  of the filename 
1db30 69 66 0a 2a 2a 20 74 68 65 20 74 79 70 65 20 63  if.** the type c
1db40 61 6e 6e 6f 74 20 62 65 20 64 65 74 65 72 6d 69  annot be determi
1db50 6e 65 64 20 66 72 6f 6d 20 63 6f 6e 74 65 6e 74  ned from content
1db60 2e 0a 2a 2f 0a 69 6e 74 20 64 65 64 75 63 65 44  ..*/.int deduceD
1db70 61 74 61 62 61 73 65 54 79 70 65 28 63 6f 6e 73  atabaseType(cons
1db80 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 69  t char *zName, i
1db90 6e 74 20 64 66 6c 74 5a 69 70 29 7b 0a 20 20 46  nt dfltZip){.  F
1dba0 49 4c 45 20 2a 66 20 3d 20 66 6f 70 65 6e 28 7a  ILE *f = fopen(z
1dbb0 4e 61 6d 65 2c 20 22 72 62 22 29 3b 0a 20 20 73  Name, "rb");.  s
1dbc0 69 7a 65 5f 74 20 6e 3b 0a 20 20 69 6e 74 20 72  ize_t n;.  int r
1dbd0 63 20 3d 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f 55  c = SHELL_OPEN_U
1dbe0 4e 53 50 45 43 3b 0a 20 20 63 68 61 72 20 7a 42  NSPEC;.  char zB
1dbf0 75 66 5b 31 30 30 5d 3b 0a 20 20 69 66 28 20 66  uf[100];.  if( f
1dc00 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 64  ==0 ){.    if( d
1dc10 66 6c 74 5a 69 70 20 26 26 20 73 71 6c 69 74 65  fltZip && sqlite
1dc20 33 5f 73 74 72 6c 69 6b 65 28 22 25 2e 7a 69 70  3_strlike("%.zip
1dc30 22 2c 7a 4e 61 6d 65 2c 30 29 3d 3d 30 20 29 7b  ",zName,0)==0 ){
1dc40 0a 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  .       return S
1dc50 48 45 4c 4c 5f 4f 50 45 4e 5f 5a 49 50 46 49 4c  HELL_OPEN_ZIPFIL
1dc60 45 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  E;.    }else{.  
1dc70 20 20 20 20 20 72 65 74 75 72 6e 20 53 48 45 4c       return SHEL
1dc80 4c 5f 4f 50 45 4e 5f 4e 4f 52 4d 41 4c 3b 0a 20  L_OPEN_NORMAL;. 
1dc90 20 20 20 7d 0a 20 20 7d 0a 20 20 6e 20 3d 20 66     }.  }.  n = f
1dca0 72 65 61 64 28 7a 42 75 66 2c 20 31 36 2c 20 31  read(zBuf, 16, 1
1dcb0 2c 20 66 29 3b 0a 20 20 69 66 28 20 6e 3d 3d 31  , f);.  if( n==1
1dcc0 20 26 26 20 6d 65 6d 63 6d 70 28 7a 42 75 66 2c   && memcmp(zBuf,
1dcd0 20 22 53 51 4c 69 74 65 20 66 6f 72 6d 61 74 20   "SQLite format 
1dce0 33 22 2c 20 31 36 29 3d 3d 30 20 29 7b 0a 20 20  3", 16)==0 ){.  
1dcf0 20 20 66 63 6c 6f 73 65 28 66 29 3b 0a 20 20 20    fclose(f);.   
1dd00 20 72 65 74 75 72 6e 20 53 48 45 4c 4c 5f 4f 50   return SHELL_OP
1dd10 45 4e 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 7d 0a 20  EN_NORMAL;.  }. 
1dd20 20 66 73 65 65 6b 28 66 2c 20 2d 32 35 2c 20 53   fseek(f, -25, S
1dd30 45 45 4b 5f 45 4e 44 29 3b 0a 20 20 6e 20 3d 20  EEK_END);.  n = 
1dd40 66 72 65 61 64 28 7a 42 75 66 2c 20 32 35 2c 20  fread(zBuf, 25, 
1dd50 31 2c 20 66 29 3b 0a 20 20 69 66 28 20 6e 3d 3d  1, f);.  if( n==
1dd60 31 20 26 26 20 6d 65 6d 63 6d 70 28 7a 42 75 66  1 && memcmp(zBuf
1dd70 2c 20 22 53 74 61 72 74 2d 4f 66 2d 53 51 4c 69  , "Start-Of-SQLi
1dd80 74 65 33 2d 22 2c 20 31 37 29 3d 3d 30 20 29 7b  te3-", 17)==0 ){
1dd90 0a 20 20 20 20 72 63 20 3d 20 53 48 45 4c 4c 5f  .    rc = SHELL_
1dda0 4f 50 45 4e 5f 41 50 50 45 4e 44 56 46 53 3b 0a  OPEN_APPENDVFS;.
1ddb0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 73 65    }else{.    fse
1ddc0 65 6b 28 66 2c 20 2d 32 32 2c 20 53 45 45 4b 5f  ek(f, -22, SEEK_
1ddd0 45 4e 44 29 3b 0a 20 20 20 20 6e 20 3d 20 66 72  END);.    n = fr
1dde0 65 61 64 28 7a 42 75 66 2c 20 32 32 2c 20 31 2c  ead(zBuf, 22, 1,
1ddf0 20 66 29 3b 0a 20 20 20 20 69 66 28 20 6e 3d 3d   f);.    if( n==
1de00 31 20 26 26 20 7a 42 75 66 5b 30 5d 3d 3d 30 78  1 && zBuf[0]==0x
1de10 35 30 20 26 26 20 7a 42 75 66 5b 31 5d 3d 3d 30  50 && zBuf[1]==0
1de20 78 34 62 20 26 26 20 7a 42 75 66 5b 32 5d 3d 3d  x4b && zBuf[2]==
1de30 30 78 30 35 0a 20 20 20 20 20 20 20 26 26 20 7a  0x05.       && z
1de40 42 75 66 5b 33 5d 3d 3d 30 78 30 36 20 29 7b 0a  Buf[3]==0x06 ){.
1de50 20 20 20 20 20 20 72 63 20 3d 20 53 48 45 4c 4c        rc = SHELL
1de60 5f 4f 50 45 4e 5f 5a 49 50 46 49 4c 45 3b 0a 20  _OPEN_ZIPFILE;. 
1de70 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 3d 3d     }else if( n==
1de80 30 20 26 26 20 64 66 6c 74 5a 69 70 20 26 26 20  0 && dfltZip && 
1de90 73 71 6c 69 74 65 33 5f 73 74 72 6c 69 6b 65 28  sqlite3_strlike(
1dea0 22 25 2e 7a 69 70 22 2c 7a 4e 61 6d 65 2c 30 29  "%.zip",zName,0)
1deb0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ==0 ){.      rc 
1dec0 3d 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f 5a 49 50  = SHELL_OPEN_ZIP
1ded0 46 49 4c 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  FILE;.    }.  }.
1dee0 20 20 66 63 6c 6f 73 65 28 66 29 3b 0a 20 20 72    fclose(f);.  r
1def0 65 74 75 72 6e 20 72 63 3b 20 20 0a 7d 0a 0a 23  eturn rc;  .}..#
1df00 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
1df10 42 4c 45 5f 44 45 53 45 52 49 41 4c 49 5a 45 0a  BLE_DESERIALIZE.
1df20 2f 2a 0a 2a 2a 20 52 65 63 6f 6e 73 74 72 75 63  /*.** Reconstruc
1df30 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64  t an in-memory d
1df40 61 74 61 62 61 73 65 20 75 73 69 6e 67 20 74 68  atabase using th
1df50 65 20 6f 75 74 70 75 74 20 66 72 6f 6d 20 74 68  e output from th
1df60 65 20 22 64 62 74 6f 74 78 74 22 0a 2a 2a 20 70  e "dbtotxt".** p
1df70 72 6f 67 72 61 6d 2e 20 20 52 65 61 64 20 63 6f  rogram.  Read co
1df80 6e 74 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 66  ntent from the f
1df90 69 6c 65 20 69 6e 20 70 2d 3e 7a 44 62 46 69 6c  ile in p->zDbFil
1dfa0 65 6e 61 6d 65 2e 20 20 49 66 20 70 2d 3e 7a 44  ename.  If p->zD
1dfb0 62 46 69 6c 65 6e 61 6d 65 0a 2a 2a 20 69 73 20  bFilename.** is 
1dfc0 30 2c 20 74 68 65 6e 20 72 65 61 64 20 66 72 6f  0, then read fro
1dfd0 6d 20 73 74 61 6e 64 61 72 64 20 69 6e 70 75 74  m standard input
1dfe0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 6e 73 69  ..*/.static unsi
1dff0 67 6e 65 64 20 63 68 61 72 20 2a 72 65 61 64 48  gned char *readH
1e000 65 78 44 62 28 53 68 65 6c 6c 53 74 61 74 65 20  exDb(ShellState 
1e010 2a 70 2c 20 69 6e 74 20 2a 70 6e 44 61 74 61 29  *p, int *pnData)
1e020 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  {.  unsigned cha
1e030 72 20 2a 61 20 3d 20 30 3b 0a 20 20 69 6e 74 20  r *a = 0;.  int 
1e040 6e 4c 69 6e 65 3b 0a 20 20 69 6e 74 20 6e 20 3d  nLine;.  int n =
1e050 20 30 3b 0a 20 20 69 6e 74 20 70 67 73 7a 20 3d   0;.  int pgsz =
1e060 20 30 3b 0a 20 20 69 6e 74 20 69 4f 66 66 73 65   0;.  int iOffse
1e070 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6a 2c 20  t = 0;.  int j, 
1e080 6b 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 46  k;.  int rc;.  F
1e090 49 4c 45 20 2a 69 6e 3b 0a 20 20 75 6e 73 69 67  ILE *in;.  unsig
1e0a0 6e 65 64 20 69 6e 74 20 78 5b 31 36 5d 3b 0a 20  ned int x[16];. 
1e0b0 20 63 68 61 72 20 7a 4c 69 6e 65 5b 31 30 30 30   char zLine[1000
1e0c0 5d 3b 0a 20 20 69 66 28 20 70 2d 3e 7a 44 62 46  ];.  if( p->zDbF
1e0d0 69 6c 65 6e 61 6d 65 20 29 7b 0a 20 20 20 20 69  ilename ){.    i
1e0e0 6e 20 3d 20 66 6f 70 65 6e 28 70 2d 3e 7a 44 62  n = fopen(p->zDb
1e0f0 46 69 6c 65 6e 61 6d 65 2c 20 22 72 22 29 3b 0a  Filename, "r");.
1e100 20 20 20 20 69 66 28 20 69 6e 3d 3d 30 20 29 7b      if( in==0 ){
1e110 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e  .      utf8_prin
1e120 74 66 28 73 74 64 65 72 72 2c 20 22 63 61 6e 6e  tf(stderr, "cann
1e130 6f 74 20 6f 70 65 6e 20 5c 22 25 73 5c 22 20 66  ot open \"%s\" f
1e140 6f 72 20 72 65 61 64 69 6e 67 5c 6e 22 2c 20 70  or reading\n", p
1e150 2d 3e 7a 44 62 46 69 6c 65 6e 61 6d 65 29 3b 0a  ->zDbFilename);.
1e160 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
1e170 20 20 20 20 7d 0a 20 20 20 20 6e 4c 69 6e 65 20      }.    nLine 
1e180 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
1e190 20 20 69 6e 20 3d 20 70 2d 3e 69 6e 3b 0a 20 20    in = p->in;.  
1e1a0 20 20 6e 4c 69 6e 65 20 3d 20 70 2d 3e 6c 69 6e    nLine = p->lin
1e1b0 65 6e 6f 3b 0a 20 20 7d 0a 20 20 2a 70 6e 44 61  eno;.  }.  *pnDa
1e1c0 74 61 20 3d 20 30 3b 0a 20 20 6e 4c 69 6e 65 2b  ta = 0;.  nLine+
1e1d0 2b 3b 0a 20 20 69 66 28 20 66 67 65 74 73 28 7a  +;.  if( fgets(z
1e1e0 4c 69 6e 65 2c 20 73 69 7a 65 6f 66 28 7a 4c 69  Line, sizeof(zLi
1e1f0 6e 65 29 2c 20 69 6e 29 3d 3d 30 20 29 20 67 6f  ne), in)==0 ) go
1e200 74 6f 20 72 65 61 64 48 65 78 44 62 5f 65 72 72  to readHexDb_err
1e210 6f 72 3b 0a 20 20 72 63 20 3d 20 73 73 63 61 6e  or;.  rc = sscan
1e220 66 28 7a 4c 69 6e 65 2c 20 22 7c 20 73 69 7a 65  f(zLine, "| size
1e230 20 25 64 20 70 61 67 65 73 69 7a 65 20 25 64 22   %d pagesize %d"
1e240 2c 20 26 6e 2c 20 26 70 67 73 7a 29 3b 0a 20 20  , &n, &pgsz);.  
1e250 69 66 28 20 72 63 21 3d 32 20 29 20 67 6f 74 6f  if( rc!=2 ) goto
1e260 20 72 65 61 64 48 65 78 44 62 5f 65 72 72 6f 72   readHexDb_error
1e270 3b 0a 20 20 69 66 28 20 6e 3c 3d 30 20 29 20 67  ;.  if( n<=0 ) g
1e280 6f 74 6f 20 72 65 61 64 48 65 78 44 62 5f 65 72  oto readHexDb_er
1e290 72 6f 72 3b 0a 20 20 61 20 3d 20 73 71 6c 69 74  ror;.  a = sqlit
1e2a0 65 33 5f 6d 61 6c 6c 6f 63 28 20 6e 20 29 3b 0a  e3_malloc( n );.
1e2b0 20 20 69 66 28 20 61 3d 3d 30 20 29 7b 0a 20 20    if( a==0 ){.  
1e2c0 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74    utf8_printf(st
1e2d0 64 65 72 72 2c 20 22 4f 75 74 20 6f 66 20 6d 65  derr, "Out of me
1e2e0 6d 6f 72 79 21 5c 6e 22 29 3b 0a 20 20 20 20 67  mory!\n");.    g
1e2f0 6f 74 6f 20 72 65 61 64 48 65 78 44 62 5f 65 72  oto readHexDb_er
1e300 72 6f 72 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65  ror;.  }.  memse
1e310 74 28 61 2c 20 30 2c 20 6e 29 3b 0a 20 20 69 66  t(a, 0, n);.  if
1e320 28 20 70 67 73 7a 3c 35 31 32 20 7c 7c 20 70 67  ( pgsz<512 || pg
1e330 73 7a 3e 36 35 35 33 36 20 7c 7c 20 28 70 67 73  sz>65536 || (pgs
1e340 7a 20 26 20 28 70 67 73 7a 2d 31 29 29 21 3d 30  z & (pgsz-1))!=0
1e350 20 29 7b 0a 20 20 20 20 75 74 66 38 5f 70 72 69   ){.    utf8_pri
1e360 6e 74 66 28 73 74 64 65 72 72 2c 20 22 69 6e 76  ntf(stderr, "inv
1e370 61 6c 69 64 20 70 61 67 65 73 69 7a 65 5c 6e 22  alid pagesize\n"
1e380 29 3b 0a 20 20 20 20 67 6f 74 6f 20 72 65 61 64  );.    goto read
1e390 48 65 78 44 62 5f 65 72 72 6f 72 3b 0a 20 20 7d  HexDb_error;.  }
1e3a0 0a 20 20 66 6f 72 28 6e 4c 69 6e 65 2b 2b 3b 20  .  for(nLine++; 
1e3b0 66 67 65 74 73 28 7a 4c 69 6e 65 2c 20 73 69 7a  fgets(zLine, siz
1e3c0 65 6f 66 28 7a 4c 69 6e 65 29 2c 20 69 6e 29 21  eof(zLine), in)!
1e3d0 3d 30 3b 20 6e 4c 69 6e 65 2b 2b 29 7b 0a 20 20  =0; nLine++){.  
1e3e0 20 20 72 63 20 3d 20 73 73 63 61 6e 66 28 7a 4c    rc = sscanf(zL
1e3f0 69 6e 65 2c 20 22 7c 20 70 61 67 65 20 25 64 20  ine, "| page %d 
1e400 6f 66 66 73 65 74 20 25 64 22 2c 20 26 6a 2c 20  offset %d", &j, 
1e410 26 6b 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  &k);.    if( rc=
1e420 3d 32 20 29 7b 0a 20 20 20 20 20 20 69 4f 66 66  =2 ){.      iOff
1e430 73 65 74 20 3d 20 6b 3b 0a 20 20 20 20 20 20 63  set = k;.      c
1e440 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20  ontinue;.    }. 
1e450 20 20 20 69 66 28 20 73 74 72 6e 63 6d 70 28 7a     if( strncmp(z
1e460 4c 69 6e 65 2c 20 22 7c 20 65 6e 64 20 22 2c 20  Line, "| end ", 
1e470 36 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 62  6)==0 ){.      b
1e480 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
1e490 72 63 20 3d 20 73 73 63 61 6e 66 28 7a 4c 69 6e  rc = sscanf(zLin
1e4a0 65 2c 22 7c 20 25 64 3a 20 25 78 20 25 78 20 25  e,"| %d: %x %x %
1e4b0 78 20 25 78 20 25 78 20 25 78 20 25 78 20 25 78  x %x %x %x %x %x
1e4c0 20 25 78 20 25 78 20 25 78 20 25 78 20 25 78 20   %x %x %x %x %x 
1e4d0 25 78 20 25 78 20 25 78 22 2c 0a 20 20 20 20 20  %x %x %x",.     
1e4e0 20 20 20 20 20 20 20 20 20 20 20 26 6a 2c 20 26             &j, &
1e4f0 78 5b 30 5d 2c 20 26 78 5b 31 5d 2c 20 26 78 5b  x[0], &x[1], &x[
1e500 32 5d 2c 20 26 78 5b 33 5d 2c 20 26 78 5b 34 5d  2], &x[3], &x[4]
1e510 2c 20 26 78 5b 35 5d 2c 20 26 78 5b 36 5d 2c 20  , &x[5], &x[6], 
1e520 26 78 5b 37 5d 2c 0a 20 20 20 20 20 20 20 20 20  &x[7],.         
1e530 20 20 20 20 20 20 20 26 78 5b 38 5d 2c 20 26 78         &x[8], &x
1e540 5b 39 5d 2c 20 26 78 5b 31 30 5d 2c 20 26 78 5b  [9], &x[10], &x[
1e550 31 31 5d 2c 20 26 78 5b 31 32 5d 2c 20 26 78 5b  11], &x[12], &x[
1e560 31 33 5d 2c 20 26 78 5b 31 34 5d 2c 20 26 78 5b  13], &x[14], &x[
1e570 31 35 5d 29 3b 0a 20 20 20 20 69 66 28 20 72 63  15]);.    if( rc
1e580 3d 3d 31 37 20 29 7b 0a 20 20 20 20 20 20 6b 20  ==17 ){.      k 
1e590 3d 20 69 4f 66 66 73 65 74 2b 6a 3b 0a 20 20 20  = iOffset+j;.   
1e5a0 20 20 20 69 66 28 20 6b 2b 31 36 3c 3d 6e 20 29     if( k+16<=n )
1e5b0 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 69  {.        int ii
1e5c0 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 69  ;.        for(ii
1e5d0 3d 30 3b 20 69 69 3c 31 36 3b 20 69 69 2b 2b 29  =0; ii<16; ii++)
1e5e0 20 61 5b 6b 2b 69 69 5d 20 3d 20 78 5b 69 69 5d   a[k+ii] = x[ii]
1e5f0 26 30 78 66 66 3b 0a 20 20 20 20 20 20 7d 0a 20  &0xff;.      }. 
1e600 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 6e 44 61     }.  }.  *pnDa
1e610 74 61 20 3d 20 6e 3b 0a 20 20 69 66 28 20 69 6e  ta = n;.  if( in
1e620 21 3d 70 2d 3e 69 6e 20 29 7b 0a 20 20 20 20 66  !=p->in ){.    f
1e630 63 6c 6f 73 65 28 69 6e 29 3b 0a 20 20 7d 65 6c  close(in);.  }el
1e640 73 65 7b 0a 20 20 20 20 70 2d 3e 6c 69 6e 65 6e  se{.    p->linen
1e650 6f 20 3d 20 6e 4c 69 6e 65 3b 0a 20 20 7d 0a 20  o = nLine;.  }. 
1e660 20 72 65 74 75 72 6e 20 61 3b 0a 0a 72 65 61 64   return a;..read
1e670 48 65 78 44 62 5f 65 72 72 6f 72 3a 0a 20 20 69  HexDb_error:.  i
1e680 66 28 20 69 6e 21 3d 73 74 64 69 6e 20 29 7b 0a  f( in!=stdin ){.
1e690 20 20 20 20 66 63 6c 6f 73 65 28 69 6e 29 3b 0a      fclose(in);.
1e6a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77 68 69    }else{.    whi
1e6b0 6c 65 28 20 66 67 65 74 73 28 7a 4c 69 6e 65 2c  le( fgets(zLine,
1e6c0 20 73 69 7a 65 6f 66 28 7a 4c 69 6e 65 29 2c 20   sizeof(zLine), 
1e6d0 70 2d 3e 69 6e 29 21 3d 30 20 29 7b 0a 20 20 20  p->in)!=0 ){.   
1e6e0 20 20 20 6e 4c 69 6e 65 2b 2b 3b 0a 20 20 20 20     nLine++;.    
1e6f0 20 20 69 66 28 73 74 72 6e 63 6d 70 28 7a 4c 69    if(strncmp(zLi
1e700 6e 65 2c 20 22 7c 20 65 6e 64 20 22 2c 20 36 29  ne, "| end ", 6)
1e710 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
1e720 20 7d 0a 20 20 20 20 70 2d 3e 6c 69 6e 65 6e 6f   }.    p->lineno
1e730 20 3d 20 6e 4c 69 6e 65 3b 0a 20 20 7d 0a 20 20   = nLine;.  }.  
1e740 73 71 6c 69 74 65 33 5f 66 72 65 65 28 61 29 3b  sqlite3_free(a);
1e750 0a 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73  .  utf8_printf(s
1e760 74 64 65 72 72 2c 22 45 72 72 6f 72 20 6f 6e 20  tderr,"Error on 
1e770 6c 69 6e 65 20 25 64 20 6f 66 20 2d 2d 68 65 78  line %d of --hex
1e780 64 62 20 69 6e 70 75 74 5c 6e 22 2c 20 6e 4c 69  db input\n", nLi
1e790 6e 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b  ne);.  return 0;
1e7a0 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
1e7b0 49 54 45 5f 45 4e 41 42 4c 45 5f 44 45 53 45 52  ITE_ENABLE_DESER
1e7c0 49 41 4c 49 5a 45 20 2a 2f 0a 0a 2f 2a 20 46 6c  IALIZE */../* Fl
1e7d0 61 67 73 20 66 6f 72 20 6f 70 65 6e 5f 64 62 28  ags for open_db(
1e7e0 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 66  )..**.** The def
1e7f0 61 75 6c 74 20 62 65 68 61 76 69 6f 72 20 6f 66  ault behavior of
1e800 20 6f 70 65 6e 5f 64 62 28 29 20 69 73 20 74 6f   open_db() is to
1e810 20 65 78 69 74 28 31 29 20 69 66 20 74 68 65 20   exit(1) if the 
1e820 64 61 74 61 62 61 73 65 20 66 61 69 6c 73 20 74  database fails t
1e830 6f 0a 2a 2a 20 6f 70 65 6e 2e 20 20 54 68 65 20  o.** open.  The 
1e840 4f 50 45 4e 5f 44 42 5f 4b 45 45 50 41 4c 49 56  OPEN_DB_KEEPALIV
1e850 45 20 66 6c 61 67 20 63 68 61 6e 67 65 73 20 74  E flag changes t
1e860 68 61 74 20 73 6f 20 74 68 61 74 20 69 74 20 70  hat so that it p
1e870 72 69 6e 74 73 20 61 6e 20 65 72 72 6f 72 0a 2a  rints an error.*
1e880 2a 20 62 75 74 20 73 74 69 6c 6c 20 72 65 74 75  * but still retu
1e890 72 6e 73 20 77 69 74 68 6f 75 74 20 63 61 6c 6c  rns without call
1e8a0 69 6e 67 20 65 78 69 74 2e 0a 2a 2a 0a 2a 2a 20  ing exit..**.** 
1e8b0 54 68 65 20 4f 50 45 4e 5f 44 42 5f 5a 49 50 46  The OPEN_DB_ZIPF
1e8c0 49 4c 45 20 66 6c 61 67 20 63 61 75 73 65 73 20  ILE flag causes 
1e8d0 6f 70 65 6e 5f 64 62 28 29 20 74 6f 20 70 72 65  open_db() to pre
1e8e0 66 65 72 20 74 6f 20 6f 70 65 6e 20 66 69 6c 65  fer to open file
1e8f0 73 20 61 73 20 61 0a 2a 2a 20 5a 49 50 20 61 72  s as a.** ZIP ar
1e900 63 68 69 76 65 20 69 66 20 74 68 65 20 66 69 6c  chive if the fil
1e910 65 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74  e does not exist
1e920 20 6f 72 20 69 73 20 65 6d 70 74 79 20 61 6e 64   or is empty and
1e930 20 69 74 73 20 6e 61 6d 65 20 6d 61 74 63 68 65   its name matche
1e940 73 0a 2a 2a 20 74 68 65 20 2a 2e 7a 69 70 20 70  s.** the *.zip p
1e950 61 74 74 65 72 6e 2e 0a 2a 2f 0a 23 64 65 66 69  attern..*/.#defi
1e960 6e 65 20 4f 50 45 4e 5f 44 42 5f 4b 45 45 50 41  ne OPEN_DB_KEEPA
1e970 4c 49 56 45 20 20 20 30 78 30 30 31 20 20 20 2f  LIVE   0x001   /
1e980 2a 20 52 65 74 75 72 6e 20 61 66 74 65 72 20 65  * Return after e
1e990 72 72 6f 72 20 69 66 20 74 72 75 65 20 2a 2f 0a  rror if true */.
1e9a0 23 64 65 66 69 6e 65 20 4f 50 45 4e 5f 44 42 5f  #define OPEN_DB_
1e9b0 5a 49 50 46 49 4c 45 20 20 20 20 20 30 78 30 30  ZIPFILE     0x00
1e9c0 32 20 20 20 2f 2a 20 4f 70 65 6e 20 61 73 20 5a  2   /* Open as Z
1e9d0 49 50 20 69 66 20 6e 61 6d 65 20 6d 61 74 63 68  IP if name match
1e9e0 65 73 20 2a 2e 7a 69 70 20 2a 2f 0a 0a 2f 2a 0a  es *.zip */../*.
1e9f0 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  ** Make sure the
1ea00 20 64 61 74 61 62 61 73 65 20 69 73 20 6f 70 65   database is ope
1ea10 6e 2e 20 20 49 66 20 69 74 20 69 73 20 6e 6f 74  n.  If it is not
1ea20 2c 20 74 68 65 6e 20 6f 70 65 6e 20 69 74 2e 20  , then open it. 
1ea30 20 49 66 0a 2a 2a 20 74 68 65 20 64 61 74 61 62   If.** the datab
1ea40 61 73 65 20 66 61 69 6c 73 20 74 6f 20 6f 70 65  ase fails to ope
1ea50 6e 2c 20 70 72 69 6e 74 20 61 6e 20 65 72 72 6f  n, print an erro
1ea60 72 20 6d 65 73 73 61 67 65 20 61 6e 64 20 65 78  r message and ex
1ea70 69 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  it..*/.static vo
1ea80 69 64 20 6f 70 65 6e 5f 64 62 28 53 68 65 6c 6c  id open_db(Shell
1ea90 53 74 61 74 65 20 2a 70 2c 20 69 6e 74 20 6f 70  State *p, int op
1eaa0 65 6e 46 6c 61 67 73 29 7b 0a 20 20 69 66 28 20  enFlags){.  if( 
1eab0 70 2d 3e 64 62 3d 3d 30 20 29 7b 0a 20 20 20 20  p->db==0 ){.    
1eac0 69 66 28 20 70 2d 3e 6f 70 65 6e 4d 6f 64 65 3d  if( p->openMode=
1ead0 3d 53 48 45 4c 4c 5f 4f 50 45 4e 5f 55 4e 53 50  =SHELL_OPEN_UNSP
1eae0 45 43 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  EC ){.      if( 
1eaf0 70 2d 3e 7a 44 62 46 69 6c 65 6e 61 6d 65 3d 3d  p->zDbFilename==
1eb00 30 20 7c 7c 20 70 2d 3e 7a 44 62 46 69 6c 65 6e  0 || p->zDbFilen
1eb10 61 6d 65 5b 30 5d 3d 3d 30 20 29 7b 0a 20 20 20  ame[0]==0 ){.   
1eb20 20 20 20 20 20 70 2d 3e 6f 70 65 6e 4d 6f 64 65       p->openMode
1eb30 20 3d 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f 4e 4f   = SHELL_OPEN_NO
1eb40 52 4d 41 4c 3b 0a 20 20 20 20 20 20 7d 65 6c 73  RMAL;.      }els
1eb50 65 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6f 70  e{.        p->op
1eb60 65 6e 4d 6f 64 65 20 3d 20 28 75 38 29 64 65 64  enMode = (u8)ded
1eb70 75 63 65 44 61 74 61 62 61 73 65 54 79 70 65 28  uceDatabaseType(
1eb80 70 2d 3e 7a 44 62 46 69 6c 65 6e 61 6d 65 2c 20  p->zDbFilename, 
1eb90 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1eba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 6f                (o
1ebb0 70 65 6e 46 6c 61 67 73 20 26 20 4f 50 45 4e 5f  penFlags & OPEN_
1ebc0 44 42 5f 5a 49 50 46 49 4c 45 29 21 3d 30 29 3b  DB_ZIPFILE)!=0);
1ebd0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1ebe0 20 20 20 73 77 69 74 63 68 28 20 70 2d 3e 6f 70     switch( p->op
1ebf0 65 6e 4d 6f 64 65 20 29 7b 0a 20 20 20 20 20 20  enMode ){.      
1ec00 63 61 73 65 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f  case SHELL_OPEN_
1ec10 41 50 50 45 4e 44 56 46 53 3a 20 7b 0a 20 20 20  APPENDVFS: {.   
1ec20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6f 70 65       sqlite3_ope
1ec30 6e 5f 76 32 28 70 2d 3e 7a 44 62 46 69 6c 65 6e  n_v2(p->zDbFilen
1ec40 61 6d 65 2c 20 26 70 2d 3e 64 62 2c 20 0a 20 20  ame, &p->db, .  
1ec50 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
1ec60 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53  OPEN_READWRITE|S
1ec70 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54  QLITE_OPEN_CREAT
1ec80 45 2c 20 22 61 70 6e 64 76 66 73 22 29 3b 0a 20  E, "apndvfs");. 
1ec90 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
1eca0 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65      }.      case
1ecb0 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f 48 45 58 44   SHELL_OPEN_HEXD
1ecc0 42 3a 0a 20 20 20 20 20 20 63 61 73 65 20 53 48  B:.      case SH
1ecd0 45 4c 4c 5f 4f 50 45 4e 5f 44 45 53 45 52 49 41  ELL_OPEN_DESERIA
1ece0 4c 49 5a 45 3a 20 7b 0a 20 20 20 20 20 20 20 20  LIZE: {.        
1ecf0 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 30 2c 20  sqlite3_open(0, 
1ed00 26 70 2d 3e 64 62 29 3b 0a 20 20 20 20 20 20 20  &p->db);.       
1ed10 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
1ed20 20 20 20 20 20 20 63 61 73 65 20 53 48 45 4c 4c        case SHELL
1ed30 5f 4f 50 45 4e 5f 5a 49 50 46 49 4c 45 3a 20 7b  _OPEN_ZIPFILE: {
1ed40 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1ed50 5f 6f 70 65 6e 28 22 3a 6d 65 6d 6f 72 79 3a 22  _open(":memory:"
1ed60 2c 20 26 70 2d 3e 64 62 29 3b 0a 20 20 20 20 20  , &p->db);.     
1ed70 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
1ed80 7d 0a 20 20 20 20 20 20 63 61 73 65 20 53 48 45  }.      case SHE
1ed90 4c 4c 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59  LL_OPEN_READONLY
1eda0 3a 20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  : {.        sqli
1edb0 74 65 33 5f 6f 70 65 6e 5f 76 32 28 70 2d 3e 7a  te3_open_v2(p->z
1edc0 44 62 46 69 6c 65 6e 61 6d 65 2c 20 26 70 2d 3e  DbFilename, &p->
1edd0 64 62 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  db, SQLITE_OPEN_
1ede0 52 45 41 44 4f 4e 4c 59 2c 20 30 29 3b 0a 20 20  READONLY, 0);.  
1edf0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1ee00 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20     }.      case 
1ee10 53 48 45 4c 4c 5f 4f 50 45 4e 5f 55 4e 53 50 45  SHELL_OPEN_UNSPE
1ee20 43 3a 0a 20 20 20 20 20 20 63 61 73 65 20 53 48  C:.      case SH
1ee30 45 4c 4c 5f 4f 50 45 4e 5f 4e 4f 52 4d 41 4c 3a  ELL_OPEN_NORMAL:
1ee40 20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   {.        sqlit
1ee50 65 33 5f 6f 70 65 6e 28 70 2d 3e 7a 44 62 46 69  e3_open(p->zDbFi
1ee60 6c 65 6e 61 6d 65 2c 20 26 70 2d 3e 64 62 29 3b  lename, &p->db);
1ee70 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
1ee80 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1ee90 20 20 67 6c 6f 62 61 6c 44 62 20 3d 20 70 2d 3e    globalDb = p->
1eea0 64 62 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 64  db;.    if( p->d
1eeb0 62 3d 3d 30 20 7c 7c 20 53 51 4c 49 54 45 5f 4f  b==0 || SQLITE_O
1eec0 4b 21 3d 73 71 6c 69 74 65 33 5f 65 72 72 63 6f  K!=sqlite3_errco
1eed0 64 65 28 70 2d 3e 64 62 29 20 29 7b 0a 20 20 20  de(p->db) ){.   
1eee0 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73     utf8_printf(s
1eef0 74 64 65 72 72 2c 22 45 72 72 6f 72 3a 20 75 6e  tderr,"Error: un
1ef00 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 64 61 74  able to open dat
1ef10 61 62 61 73 65 20 5c 22 25 73 5c 22 3a 20 25 73  abase \"%s\": %s
1ef20 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 70  \n",.          p
1ef30 2d 3e 7a 44 62 46 69 6c 65 6e 61 6d 65 2c 20 73  ->zDbFilename, s
1ef40 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 2d  qlite3_errmsg(p-
1ef50 3e 64 62 29 29 3b 0a 20 20 20 20 20 20 69 66 28  >db));.      if(
1ef60 20 6f 70 65 6e 46 6c 61 67 73 20 26 20 4f 50 45   openFlags & OPE
1ef70 4e 5f 44 42 5f 4b 45 45 50 41 4c 49 56 45 20 29  N_DB_KEEPALIVE )
1ef80 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
1ef90 33 5f 6f 70 65 6e 28 22 3a 6d 65 6d 6f 72 79 3a  3_open(":memory:
1efa0 22 2c 20 26 70 2d 3e 64 62 29 3b 0a 20 20 20 20  ", &p->db);.    
1efb0 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
1efc0 20 20 7d 0a 20 20 20 20 20 20 65 78 69 74 28 31    }.      exit(1
1efd0 29 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  );.    }.#ifndef
1efe0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41   SQLITE_OMIT_LOA
1eff0 44 5f 45 58 54 45 4e 53 49 4f 4e 0a 20 20 20 20  D_EXTENSION.    
1f000 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 6c  sqlite3_enable_l
1f010 6f 61 64 5f 65 78 74 65 6e 73 69 6f 6e 28 70 2d  oad_extension(p-
1f020 3e 64 62 2c 20 31 29 3b 0a 23 65 6e 64 69 66 0a  >db, 1);.#endif.
1f030 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65      sqlite3_file
1f040 69 6f 5f 69 6e 69 74 28 70 2d 3e 64 62 2c 20 30  io_init(p->db, 0
1f050 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
1f060 33 5f 73 68 61 74 68 72 65 65 5f 69 6e 69 74 28  3_shathree_init(
1f070 70 2d 3e 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20  p->db, 0, 0);.  
1f080 20 20 73 71 6c 69 74 65 33 5f 63 6f 6d 70 6c 65    sqlite3_comple
1f090 74 69 6f 6e 5f 69 6e 69 74 28 70 2d 3e 64 62 2c  tion_init(p->db,
1f0a0 20 30 2c 20 30 29 3b 0a 23 69 66 64 65 66 20 53   0, 0);.#ifdef S
1f0b0 51 4c 49 54 45 5f 48 41 56 45 5f 5a 4c 49 42 0a  QLITE_HAVE_ZLIB.
1f0c0 20 20 20 20 73 71 6c 69 74 65 33 5f 7a 69 70 66      sqlite3_zipf
1f0d0 69 6c 65 5f 69 6e 69 74 28 70 2d 3e 64 62 2c 20  ile_init(p->db, 
1f0e0 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  0, 0);.    sqlit
1f0f0 65 33 5f 73 71 6c 61 72 5f 69 6e 69 74 28 70 2d  e3_sqlar_init(p-
1f100 3e 64 62 2c 20 30 2c 20 30 29 3b 0a 23 65 6e 64  >db, 0, 0);.#end
1f110 69 66 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63  if.    sqlite3_c
1f120 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 70  reate_function(p
1f130 2d 3e 64 62 2c 20 22 73 68 65 6c 6c 5f 61 64 64  ->db, "shell_add
1f140 5f 73 63 68 65 6d 61 22 2c 20 33 2c 20 53 51 4c  _schema", 3, SQL
1f150 49 54 45 5f 55 54 46 38 2c 20 30 2c 0a 20 20 20  ITE_UTF8, 0,.   
1f160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f170 20 20 20 20 20 20 20 20 20 73 68 65 6c 6c 41 64           shellAd
1f180 64 53 63 68 65 6d 61 4e 61 6d 65 2c 20 30 2c 20  dSchemaName, 0, 
1f190 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  0);.    sqlite3_
1f1a0 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28  create_function(
1f1b0 70 2d 3e 64 62 2c 20 22 73 68 65 6c 6c 5f 6d 6f  p->db, "shell_mo
1f1c0 64 75 6c 65 5f 73 63 68 65 6d 61 22 2c 20 31 2c  dule_schema", 1,
1f1d0 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c   SQLITE_UTF8, 0,
1f1e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1f1f0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 68 65               she
1f200 6c 6c 4d 6f 64 75 6c 65 53 63 68 65 6d 61 2c 20  llModuleSchema, 
1f210 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  0, 0);.    sqlit
1f220 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
1f230 6f 6e 28 70 2d 3e 64 62 2c 20 22 73 68 65 6c 6c  on(p->db, "shell
1f240 5f 70 75 74 73 6e 6c 22 2c 20 31 2c 20 53 51 4c  _putsnl", 1, SQL
1f250 49 54 45 5f 55 54 46 38 2c 20 70 2c 0a 20 20 20  ITE_UTF8, p,.   
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 20 73 68 65 6c 6c 50 75           shellPu
1f280 74 73 46 75 6e 63 2c 20 30 2c 20 30 29 3b 0a 23  tsFunc, 0, 0);.#
1f290 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f  ifndef SQLITE_NO
1f2a0 48 41 56 45 5f 53 59 53 54 45 4d 0a 20 20 20 20  HAVE_SYSTEM.    
1f2b0 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
1f2c0 75 6e 63 74 69 6f 6e 28 70 2d 3e 64 62 2c 20 22  unction(p->db, "
1f2d0 65 64 69 74 22 2c 20 31 2c 20 53 51 4c 49 54 45  edit", 1, SQLITE
1f2e0 5f 55 54 46 38 2c 20 30 2c 0a 20 20 20 20 20 20  _UTF8, 0,.      
1f2f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f300 20 20 20 20 20 20 65 64 69 74 46 75 6e 63 2c 20        editFunc, 
1f310 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  0, 0);.    sqlit
1f320 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
1f330 6f 6e 28 70 2d 3e 64 62 2c 20 22 65 64 69 74 22  on(p->db, "edit"
1f340 2c 20 32 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  , 2, SQLITE_UTF8
1f350 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20  , 0,.           
1f360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f370 20 65 64 69 74 46 75 6e 63 2c 20 30 2c 20 30 29   editFunc, 0, 0)
1f380 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28  ;.#endif.    if(
1f390 20 70 2d 3e 6f 70 65 6e 4d 6f 64 65 3d 3d 53 48   p->openMode==SH
1f3a0 45 4c 4c 5f 4f 50 45 4e 5f 5a 49 50 46 49 4c 45  ELL_OPEN_ZIPFILE
1f3b0 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a   ){.      char *
1f3c0 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d  zSql = sqlite3_m
1f3d0 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20  printf(.        
1f3e0 20 22 43 52 45 41 54 45 20 56 49 52 54 55 41 4c   "CREATE VIRTUAL
1f3f0 20 54 41 42 4c 45 20 7a 69 70 20 55 53 49 4e 47   TABLE zip USING
1f400 20 7a 69 70 66 69 6c 65 28 25 51 29 3b 22 2c 20   zipfile(%Q);", 
1f410 70 2d 3e 7a 44 62 46 69 6c 65 6e 61 6d 65 29 3b  p->zDbFilename);
1f420 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65  .      sqlite3_e
1f430 78 65 63 28 70 2d 3e 64 62 2c 20 7a 53 71 6c 2c  xec(p->db, zSql,
1f440 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20   0, 0, 0);.     
1f450 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53   sqlite3_free(zS
1f460 71 6c 29 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65  ql);.    }.#ifde
1f470 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
1f480 44 45 53 45 52 49 41 4c 49 5a 45 0a 20 20 20 20  DESERIALIZE.    
1f490 65 6c 73 65 0a 20 20 20 20 69 66 28 20 70 2d 3e  else.    if( p->
1f4a0 6f 70 65 6e 4d 6f 64 65 3d 3d 53 48 45 4c 4c 5f  openMode==SHELL_
1f4b0 4f 50 45 4e 5f 44 45 53 45 52 49 41 4c 49 5a 45  OPEN_DESERIALIZE
1f4c0 20 7c 7c 20 70 2d 3e 6f 70 65 6e 4d 6f 64 65 3d   || p->openMode=
1f4d0 3d 53 48 45 4c 4c 5f 4f 50 45 4e 5f 48 45 58 44  =SHELL_OPEN_HEXD
1f4e0 42 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72  B ){.      int r
1f4f0 63 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 44 61  c;.      int nDa
1f500 74 61 20 3d 20 30 3b 0a 20 20 20 20 20 20 75 6e  ta = 0;.      un
1f510 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 44 61  signed char *aDa
1f520 74 61 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  ta;.      if( p-
1f530 3e 6f 70 65 6e 4d 6f 64 65 3d 3d 53 48 45 4c 4c  >openMode==SHELL
1f540 5f 4f 50 45 4e 5f 44 45 53 45 52 49 41 4c 49 5a  _OPEN_DESERIALIZ
1f550 45 20 29 7b 0a 20 20 20 20 20 20 20 20 61 44 61  E ){.        aDa
1f560 74 61 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63  ta = (unsigned c
1f570 68 61 72 2a 29 72 65 61 64 46 69 6c 65 28 70 2d  har*)readFile(p-
1f580 3e 7a 44 62 46 69 6c 65 6e 61 6d 65 2c 20 26 6e  >zDbFilename, &n
1f590 44 61 74 61 29 3b 0a 20 20 20 20 20 20 7d 65 6c  Data);.      }el
1f5a0 73 65 7b 0a 20 20 20 20 20 20 20 20 61 44 61 74  se{.        aDat
1f5b0 61 20 3d 20 72 65 61 64 48 65 78 44 62 28 70 2c  a = readHexDb(p,
1f5c0 20 26 6e 44 61 74 61 29 3b 0a 20 20 20 20 20 20   &nData);.      
1f5d0 20 20 69 66 28 20 61 44 61 74 61 3d 3d 30 20 29    if( aData==0 )
1f5e0 7b 0a 20 20 20 20 20 20 20 20 20 20 75 74 66 38  {.          utf8
1f5f0 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
1f600 22 45 72 72 6f 72 20 69 6e 20 68 65 78 64 62 20  "Error in hexdb 
1f610 69 6e 70 75 74 5c 6e 22 29 3b 0a 20 20 20 20 20  input\n");.     
1f620 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
1f630 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
1f640 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1f650 33 5f 64 65 73 65 72 69 61 6c 69 7a 65 28 70 2d  3_deserialize(p-
1f660 3e 64 62 2c 20 22 6d 61 69 6e 22 2c 20 61 44 61  >db, "main", aDa
1f670 74 61 2c 20 6e 44 61 74 61 2c 20 6e 44 61 74 61  ta, nData, nData
1f680 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1f690 20 20 20 20 20 53 51 4c 49 54 45 5f 44 45 53 45       SQLITE_DESE
1f6a0 52 49 41 4c 49 5a 45 5f 52 45 53 49 5a 45 41 42  RIALIZE_RESIZEAB
1f6b0 4c 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20  LE |.           
1f6c0 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 44          SQLITE_D
1f6d0 45 53 45 52 49 41 4c 49 5a 45 5f 46 52 45 45 4f  ESERIALIZE_FREEO
1f6e0 4e 43 4c 4f 53 45 29 3b 0a 20 20 20 20 20 20 69  NCLOSE);.      i
1f6f0 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
1f700 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64   utf8_printf(std
1f710 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 73 71 6c  err, "Error: sql
1f720 69 74 65 33 5f 64 65 73 65 72 69 61 6c 69 7a 65  ite3_deserialize
1f730 28 29 20 72 65 74 75 72 6e 73 20 25 64 5c 6e 22  () returns %d\n"
1f740 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20  , rc);.      }. 
1f750 20 20 20 20 20 69 66 28 20 70 2d 3e 73 7a 4d 61       if( p->szMa
1f760 78 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  x>0 ){.        s
1f770 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74  qlite3_file_cont
1f780 72 6f 6c 28 70 2d 3e 64 62 2c 20 22 6d 61 69 6e  rol(p->db, "main
1f790 22 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  ", SQLITE_FCNTL_
1f7a0 53 49 5a 45 5f 4c 49 4d 49 54 2c 20 26 70 2d 3e  SIZE_LIMIT, &p->
1f7b0 73 7a 4d 61 78 29 3b 0a 20 20 20 20 20 20 7d 0a  szMax);.      }.
1f7c0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d      }.#endif.  }
1f7d0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70  .}../*.** Attemp
1f7e0 74 20 74 6f 20 63 6c 6f 73 65 20 74 68 65 20 64  t to close the d
1f7f0 61 74 61 62 61 65 73 20 63 6f 6e 6e 65 63 74 69  atabaes connecti
1f800 6f 6e 2e 20 20 52 65 70 6f 72 74 20 65 72 72 6f  on.  Report erro
1f810 72 73 2e 0a 2a 2f 0a 76 6f 69 64 20 63 6c 6f 73  rs..*/.void clos
1f820 65 5f 64 62 28 73 71 6c 69 74 65 33 20 2a 64 62  e_db(sqlite3 *db
1f830 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 73 71  ){.  int rc = sq
1f840 6c 69 74 65 33 5f 63 6c 6f 73 65 28 64 62 29 3b  lite3_close(db);
1f850 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20  .  if( rc ){.   
1f860 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64   utf8_printf(std
1f870 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 73 71 6c  err, "Error: sql
1f880 69 74 65 33 5f 63 6c 6f 73 65 28 29 20 72 65 74  ite3_close() ret
1f890 75 72 6e 73 20 25 64 3a 20 25 73 5c 6e 22 2c 0a  urns %d: %s\n",.
1f8a0 20 20 20 20 20 20 20 20 72 63 2c 20 73 71 6c 69          rc, sqli
1f8b0 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29 29 3b  te3_errmsg(db));
1f8c0 0a 20 20 7d 20 0a 7d 0a 0a 23 69 66 20 48 41 56  .  } .}..#if HAV
1f8d0 45 5f 52 45 41 44 4c 49 4e 45 20 7c 7c 20 48 41  E_READLINE || HA
1f8e0 56 45 5f 45 44 49 54 4c 49 4e 45 0a 2f 2a 0a 2a  VE_EDITLINE./*.*
1f8f0 2a 20 52 65 61 64 6c 69 6e 65 20 63 6f 6d 70 6c  * Readline compl
1f900 65 74 69 6f 6e 20 63 61 6c 6c 62 61 63 6b 73 0a  etion callbacks.
1f910 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a  */.static char *
1f920 72 65 61 64 6c 69 6e 65 5f 63 6f 6d 70 6c 65 74  readline_complet
1f930 69 6f 6e 5f 67 65 6e 65 72 61 74 6f 72 28 63 6f  ion_generator(co
1f940 6e 73 74 20 63 68 61 72 20 2a 74 65 78 74 2c 20  nst char *text, 
1f950 69 6e 74 20 73 74 61 74 65 29 7b 0a 20 20 73 74  int state){.  st
1f960 61 74 69 63 20 73 71 6c 69 74 65 33 5f 73 74 6d  atic sqlite3_stm
1f970 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20  t *pStmt = 0;.  
1f980 63 68 61 72 20 2a 7a 52 65 74 3b 0a 20 20 69 66  char *zRet;.  if
1f990 28 20 73 74 61 74 65 3d 3d 30 20 29 7b 0a 20 20  ( state==0 ){.  
1f9a0 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20    char *zSql;.  
1f9b0 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69    sqlite3_finali
1f9c0 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 7a  ze(pStmt);.    z
1f9d0 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  Sql = sqlite3_mp
1f9e0 72 69 6e 74 66 28 22 53 45 4c 45 43 54 20 44 49  rintf("SELECT DI
1f9f0 53 54 49 4e 43 54 20 63 61 6e 64 69 64 61 74 65  STINCT candidate
1fa00 20 43 4f 4c 4c 41 54 45 20 6e 6f 63 61 73 65 22   COLLATE nocase"
1fa10 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1fa20 20 20 20 20 20 20 20 20 20 20 20 20 22 20 20 46              "  F
1fa30 52 4f 4d 20 63 6f 6d 70 6c 65 74 69 6f 6e 28 25  ROM completion(%
1fa40 51 29 20 4f 52 44 45 52 20 42 59 20 31 22 2c 20  Q) ORDER BY 1", 
1fa50 74 65 78 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  text);.    sqlit
1fa60 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 67 6c  e3_prepare_v2(gl
1fa70 6f 62 61 6c 44 62 2c 20 7a 53 71 6c 2c 20 2d 31  obalDb, zSql, -1
1fa80 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20  , &pStmt, 0);.  
1fa90 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
1faa0 53 71 6c 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  Sql);.  }.  if( 
1fab0 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74  sqlite3_step(pSt
1fac0 6d 74 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20  mt)==SQLITE_ROW 
1fad0 29 7b 0a 20 20 20 20 7a 52 65 74 20 3d 20 73 74  ){.    zRet = st
1fae0 72 64 75 70 28 28 63 6f 6e 73 74 20 63 68 61 72  rdup((const char
1faf0 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  *)sqlite3_column
1fb00 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 30 29 29  _text(pStmt, 0))
1fb10 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
1fb20 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
1fb30 70 53 74 6d 74 29 3b 0a 20 20 20 20 70 53 74 6d  pStmt);.    pStm
1fb40 74 20 3d 20 30 3b 0a 20 20 20 20 7a 52 65 74 20  t = 0;.    zRet 
1fb50 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
1fb60 6e 20 7a 52 65 74 3b 0a 7d 0a 73 74 61 74 69 63  n zRet;.}.static
1fb70 20 63 68 61 72 20 2a 2a 72 65 61 64 6c 69 6e 65   char **readline
1fb80 5f 63 6f 6d 70 6c 65 74 69 6f 6e 28 63 6f 6e 73  _completion(cons
1fb90 74 20 63 68 61 72 20 2a 7a 54 65 78 74 2c 20 69  t char *zText, i
1fba0 6e 74 20 69 53 74 61 72 74 2c 20 69 6e 74 20 69  nt iStart, int i
1fbb0 45 6e 64 29 7b 0a 20 20 72 6c 5f 61 74 74 65 6d  End){.  rl_attem
1fbc0 70 74 65 64 5f 63 6f 6d 70 6c 65 74 69 6f 6e 5f  pted_completion_
1fbd0 6f 76 65 72 20 3d 20 31 3b 0a 20 20 72 65 74 75  over = 1;.  retu
1fbe0 72 6e 20 72 6c 5f 63 6f 6d 70 6c 65 74 69 6f 6e  rn rl_completion
1fbf0 5f 6d 61 74 63 68 65 73 28 7a 54 65 78 74 2c 20  _matches(zText, 
1fc00 72 65 61 64 6c 69 6e 65 5f 63 6f 6d 70 6c 65 74  readline_complet
1fc10 69 6f 6e 5f 67 65 6e 65 72 61 74 6f 72 29 3b 0a  ion_generator);.
1fc20 7d 0a 0a 23 65 6c 69 66 20 48 41 56 45 5f 4c 49  }..#elif HAVE_LI
1fc30 4e 45 4e 4f 49 53 45 0a 2f 2a 0a 2a 2a 20 4c 69  NENOISE./*.** Li
1fc40 6e 65 6e 6f 69 73 65 20 63 6f 6d 70 6c 65 74 69  nenoise completi
1fc50 6f 6e 20 63 61 6c 6c 62 61 63 6b 0a 2a 2f 0a 73  on callback.*/.s
1fc60 74 61 74 69 63 20 76 6f 69 64 20 6c 69 6e 65 6e  tatic void linen
1fc70 6f 69 73 65 5f 63 6f 6d 70 6c 65 74 69 6f 6e 28  oise_completion(
1fc80 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4c 69 6e  const char *zLin
1fc90 65 2c 20 6c 69 6e 65 6e 6f 69 73 65 43 6f 6d 70  e, linenoiseComp
1fca0 6c 65 74 69 6f 6e 73 20 2a 6c 63 29 7b 0a 20 20  letions *lc){.  
1fcb0 69 6e 74 20 6e 4c 69 6e 65 20 3d 20 73 74 72 6c  int nLine = strl
1fcc0 65 6e 33 30 28 7a 4c 69 6e 65 29 3b 0a 20 20 69  en30(zLine);.  i
1fcd0 6e 74 20 69 2c 20 69 53 74 61 72 74 3b 0a 20 20  nt i, iStart;.  
1fce0 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
1fcf0 74 6d 74 20 3d 20 30 3b 0a 20 20 63 68 61 72 20  tmt = 0;.  char 
1fd00 2a 7a 53 71 6c 3b 0a 20 20 63 68 61 72 20 7a 42  *zSql;.  char zB
1fd10 75 66 5b 31 30 30 30 5d 3b 0a 0a 20 20 69 66 28  uf[1000];..  if(
1fd20 20 6e 4c 69 6e 65 3e 73 69 7a 65 6f 66 28 7a 42   nLine>sizeof(zB
1fd30 75 66 29 2d 33 30 20 29 20 72 65 74 75 72 6e 3b  uf)-30 ) return;
1fd40 0a 20 20 69 66 28 20 7a 4c 69 6e 65 5b 30 5d 3d  .  if( zLine[0]=
1fd50 3d 27 2e 27 20 7c 7c 20 7a 4c 69 6e 65 5b 30 5d  ='.' || zLine[0]
1fd60 3d 3d 27 23 27 29 20 72 65 74 75 72 6e 3b 0a 20  =='#') return;. 
1fd70 20 66 6f 72 28 69 3d 6e 4c 69 6e 65 2d 31 3b 20   for(i=nLine-1; 
1fd80 69 3e 3d 30 20 26 26 20 28 69 73 61 6c 6e 75 6d  i>=0 && (isalnum
1fd90 28 7a 4c 69 6e 65 5b 69 5d 29 20 7c 7c 20 7a 4c  (zLine[i]) || zL
1fda0 69 6e 65 5b 69 5d 3d 3d 27 5f 27 29 3b 20 69 2d  ine[i]=='_'); i-
1fdb0 2d 29 7b 7d 0a 20 20 69 66 28 20 69 3d 3d 6e 4c  -){}.  if( i==nL
1fdc0 69 6e 65 2d 31 20 29 20 72 65 74 75 72 6e 3b 0a  ine-1 ) return;.
1fdd0 20 20 69 53 74 61 72 74 20 3d 20 69 2b 31 3b 0a    iStart = i+1;.
1fde0 20 20 6d 65 6d 63 70 79 28 7a 42 75 66 2c 20 7a    memcpy(zBuf, z
1fdf0 4c 69 6e 65 2c 20 69 53 74 61 72 74 29 3b 0a 20  Line, iStart);. 
1fe00 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f   zSql = sqlite3_
1fe10 6d 70 72 69 6e 74 66 28 22 53 45 4c 45 43 54 20  mprintf("SELECT 
1fe20 44 49 53 54 49 4e 43 54 20 63 61 6e 64 69 64 61  DISTINCT candida
1fe30 74 65 20 43 4f 4c 4c 41 54 45 20 6e 6f 63 61 73  te COLLATE nocas
1fe40 65 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e".             
1fe50 20 20 20 20 20 20 20 20 20 20 20 20 22 20 20 46              "  F
1fe60 52 4f 4d 20 63 6f 6d 70 6c 65 74 69 6f 6e 28 25  ROM completion(%
1fe70 51 2c 25 51 29 20 4f 52 44 45 52 20 42 59 20 31  Q,%Q) ORDER BY 1
1fe80 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
1fe90 20 20 20 20 20 20 20 20 20 20 20 20 26 7a 4c 69              &zLi
1fea0 6e 65 5b 69 53 74 61 72 74 5d 2c 20 7a 4c 69 6e  ne[iStart], zLin
1feb0 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 70 72  e);.  sqlite3_pr
1fec0 65 70 61 72 65 5f 76 32 28 67 6c 6f 62 61 6c 44  epare_v2(globalD
1fed0 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53  b, zSql, -1, &pS
1fee0 74 6d 74 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74  tmt, 0);.  sqlit
1fef0 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20  e3_free(zSql);. 
1ff00 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 67 6c   sqlite3_exec(gl
1ff10 6f 62 61 6c 44 62 2c 20 22 50 52 41 47 4d 41 20  obalDb, "PRAGMA 
1ff20 70 61 67 65 5f 63 6f 75 6e 74 22 2c 20 30 2c 20  page_count", 0, 
1ff30 30 2c 20 30 29 3b 20 2f 2a 20 4c 6f 61 64 20 74  0, 0); /* Load t
1ff40 68 65 20 73 63 68 65 6d 61 20 2a 2f 0a 20 20 77  he schema */.  w
1ff50 68 69 6c 65 28 20 73 71 6c 69 74 65 33 5f 73 74  hile( sqlite3_st
1ff60 65 70 28 70 53 74 6d 74 29 3d 3d 53 51 4c 49 54  ep(pStmt)==SQLIT
1ff70 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 63 6f 6e  E_ROW ){.    con
1ff80 73 74 20 63 68 61 72 20 2a 7a 43 6f 6d 70 6c 65  st char *zComple
1ff90 74 69 6f 6e 20 3d 20 28 63 6f 6e 73 74 20 63 68  tion = (const ch
1ffa0 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75  ar*)sqlite3_colu
1ffb0 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 30  mn_text(pStmt, 0
1ffc0 29 3b 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6d 70  );.    int nComp
1ffd0 6c 65 74 69 6f 6e 20 3d 20 73 71 6c 69 74 65 33  letion = sqlite3
1ffe0 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 28 70 53  _column_bytes(pS
1fff0 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  tmt, 0);.    if(
20000 20 69 53 74 61 72 74 2b 6e 43 6f 6d 70 6c 65 74   iStart+nComplet
20010 69 6f 6e 20 3c 20 73 69 7a 65 6f 66 28 7a 42 75  ion < sizeof(zBu
20020 66 29 2d 31 20 29 7b 0a 20 20 20 20 20 20 6d 65  f)-1 ){.      me
20030 6d 63 70 79 28 7a 42 75 66 2b 69 53 74 61 72 74  mcpy(zBuf+iStart
20040 2c 20 7a 43 6f 6d 70 6c 65 74 69 6f 6e 2c 20 6e  , zCompletion, n
20050 43 6f 6d 70 6c 65 74 69 6f 6e 2b 31 29 3b 0a 20  Completion+1);. 
20060 20 20 20 20 20 6c 69 6e 65 6e 6f 69 73 65 41 64       linenoiseAd
20070 64 43 6f 6d 70 6c 65 74 69 6f 6e 28 6c 63 2c 20  dCompletion(lc, 
20080 7a 42 75 66 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  zBuf);.    }.  }
20090 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c  .  sqlite3_final
200a0 69 7a 65 28 70 53 74 6d 74 29 3b 0a 7d 0a 23 65  ize(pStmt);.}.#e
200b0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 43  ndif../*.** Do C
200c0 2d 6c 61 6e 67 75 61 67 65 20 73 74 79 6c 65 20  -language style 
200d0 64 65 71 75 6f 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a  dequoting..**.**
200e0 20 20 20 20 5c 61 20 20 20 20 2d 3e 20 61 6c 61      \a    -> ala
200f0 72 6d 0a 2a 2a 20 20 20 20 5c 62 20 20 20 20 2d  rm.**    \b    -
20100 3e 20 62 61 63 6b 73 70 61 63 65 0a 2a 2a 20 20  > backspace.**  
20110 20 20 5c 74 20 20 20 20 2d 3e 20 74 61 62 0a 2a    \t    -> tab.*
20120 2a 20 20 20 20 5c 6e 20 20 20 20 2d 3e 20 6e 65  *    \n    -> ne
20130 77 6c 69 6e 65 0a 2a 2a 20 20 20 20 5c 76 20 20  wline.**    \v  
20140 20 20 2d 3e 20 76 65 72 74 69 63 61 6c 20 74 61    -> vertical ta
20150 62 0a 2a 2a 20 20 20 20 5c 66 20 20 20 20 2d 3e  b.**    \f    ->
20160 20 66 6f 72 6d 20 66 65 65 64 0a 2a 2a 20 20 20   form feed.**   
20170 20 5c 72 20 20 20 20 2d 3e 20 63 61 72 72 69 61   \r    -> carria
20180 67 65 20 72 65 74 75 72 6e 0a 2a 2a 20 20 20 20  ge return.**    
20190 5c 73 20 20 20 20 2d 3e 20 73 70 61 63 65 0a 2a  \s    -> space.*
201a0 2a 20 20 20 20 5c 22 20 20 20 20 2d 3e 20 22 0a  *    \"    -> ".
201b0 2a 2a 20 20 20 20 5c 27 20 20 20 20 2d 3e 20 27  **    \'    -> '
201c0 0a 2a 2a 20 20 20 20 5c 5c 20 20 20 20 2d 3e 20  .**    \\    -> 
201d0 62 61 63 6b 73 6c 61 73 68 0a 2a 2a 20 20 20 20  backslash.**    
201e0 5c 4e 4e 4e 20 20 2d 3e 20 61 73 63 69 69 20 63  \NNN  -> ascii c
201f0 68 61 72 61 63 74 65 72 20 4e 4e 4e 20 69 6e 20  haracter NNN in 
20200 6f 63 74 61 6c 0a 2a 2f 0a 73 74 61 74 69 63 20  octal.*/.static 
20210 76 6f 69 64 20 72 65 73 6f 6c 76 65 5f 62 61 63  void resolve_bac
20220 6b 73 6c 61 73 68 65 73 28 63 68 61 72 20 2a 7a  kslashes(char *z
20230 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20  ){.  int i, j;. 
20240 20 63 68 61 72 20 63 3b 0a 20 20 77 68 69 6c 65   char c;.  while
20250 28 20 2a 7a 20 26 26 20 2a 7a 21 3d 27 5c 5c 27  ( *z && *z!='\\'
20260 20 29 20 7a 2b 2b 3b 0a 20 20 66 6f 72 28 69 3d   ) z++;.  for(i=
20270 6a 3d 30 3b 20 28 63 20 3d 20 7a 5b 69 5d 29 21  j=0; (c = z[i])!
20280 3d 30 3b 20 69 2b 2b 2c 20 6a 2b 2b 29 7b 0a 20  =0; i++, j++){. 
20290 20 20 20 69 66 28 20 63 3d 3d 27 5c 5c 27 20 26     if( c=='\\' &
202a0 26 20 7a 5b 69 2b 31 5d 21 3d 30 20 29 7b 0a 20  & z[i+1]!=0 ){. 
202b0 20 20 20 20 20 63 20 3d 20 7a 5b 2b 2b 69 5d 3b       c = z[++i];
202c0 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27 61  .      if( c=='a
202d0 27 20 29 7b 0a 20 20 20 20 20 20 20 20 63 20 3d  ' ){.        c =
202e0 20 27 5c 61 27 3b 0a 20 20 20 20 20 20 7d 65 6c   '\a';.      }el
202f0 73 65 20 69 66 28 20 63 3d 3d 27 62 27 20 29 7b  se if( c=='b' ){
20300 0a 20 20 20 20 20 20 20 20 63 20 3d 20 27 5c 62  .        c = '\b
20310 27 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  ';.      }else i
20320 66 28 20 63 3d 3d 27 74 27 20 29 7b 0a 20 20 20  f( c=='t' ){.   
20330 20 20 20 20 20 63 20 3d 20 27 5c 74 27 3b 0a 20       c = '\t';. 
20340 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63       }else if( c
20350 3d 3d 27 6e 27 20 29 7b 0a 20 20 20 20 20 20 20  =='n' ){.       
20360 20 63 20 3d 20 27 5c 6e 27 3b 0a 20 20 20 20 20   c = '\n';.     
20370 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 76   }else if( c=='v
20380 27 20 29 7b 0a 20 20 20 20 20 20 20 20 63 20 3d  ' ){.        c =
20390 20 27 5c 76 27 3b 0a 20 20 20 20 20 20 7d 65 6c   '\v';.      }el
203a0 73 65 20 69 66 28 20 63 3d 3d 27 66 27 20 29 7b  se if( c=='f' ){
203b0 0a 20 20 20 20 20 20 20 20 63 20 3d 20 27 5c 66  .        c = '\f
203c0 27 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  ';.      }else i
203d0 66 28 20 63 3d 3d 27 72 27 20 29 7b 0a 20 20 20  f( c=='r' ){.   
203e0 20 20 20 20 20 63 20 3d 20 27 5c 72 27 3b 0a 20       c = '\r';. 
203f0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63       }else if( c
20400 3d 3d 27 22 27 20 29 7b 0a 20 20 20 20 20 20 20  =='"' ){.       
20410 20 63 20 3d 20 27 22 27 3b 0a 20 20 20 20 20 20   c = '"';.      
20420 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 5c 27  }else if( c=='\'
20430 27 20 29 7b 0a 20 20 20 20 20 20 20 20 63 20 3d  ' ){.        c =
20440 20 27 5c 27 27 3b 0a 20 20 20 20 20 20 7d 65 6c   '\'';.      }el
20450 73 65 20 69 66 28 20 63 3d 3d 27 5c 5c 27 20 29  se if( c=='\\' )
20460 7b 0a 20 20 20 20 20 20 20 20 63 20 3d 20 27 5c  {.        c = '\
20470 5c 27 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  \';.      }else 
20480 69 66 28 20 63 3e 3d 27 30 27 20 26 26 20 63 3c  if( c>='0' && c<
20490 3d 27 37 27 20 29 7b 0a 20 20 20 20 20 20 20 20  ='7' ){.        
204a0 63 20 2d 3d 20 27 30 27 3b 0a 20 20 20 20 20 20  c -= '0';.      
204b0 20 20 69 66 28 20 7a 5b 69 2b 31 5d 3e 3d 27 30    if( z[i+1]>='0
204c0 27 20 26 26 20 7a 5b 69 2b 31 5d 3c 3d 27 37 27  ' && z[i+1]<='7'
204d0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 2b   ){.          i+
204e0 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d  +;.          c =
204f0 20 28 63 3c 3c 33 29 20 2b 20 7a 5b 69 5d 20 2d   (c<<3) + z[i] -
20500 20 27 30 27 3b 0a 20 20 20 20 20 20 20 20 20 20   '0';.          
20510 69 66 28 20 7a 5b 69 2b 31 5d 3e 3d 27 30 27 20  if( z[i+1]>='0' 
20520 26 26 20 7a 5b 69 2b 31 5d 3c 3d 27 37 27 20 29  && z[i+1]<='7' )
20530 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 2b  {.            i+
20540 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63  +;.            c
20550 20 3d 20 28 63 3c 3c 33 29 20 2b 20 7a 5b 69 5d   = (c<<3) + z[i]
20560 20 2d 20 27 30 27 3b 0a 20 20 20 20 20 20 20 20   - '0';.        
20570 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
20580 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
20590 7a 5b 6a 5d 20 3d 20 63 3b 0a 20 20 7d 0a 20 20  z[j] = c;.  }.  
205a0 69 66 28 20 6a 3c 69 20 29 20 7a 5b 6a 5d 20 3d  if( j<i ) z[j] =
205b0 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 74   0;.}../*.** Int
205c0 65 72 70 72 65 74 20 7a 41 72 67 20 61 73 20 65  erpret zArg as e
205d0 69 74 68 65 72 20 61 6e 20 69 6e 74 65 67 65 72  ither an integer
205e0 20 6f 72 20 61 20 62 6f 6f 6c 65 61 6e 20 76 61   or a boolean va
205f0 6c 75 65 2e 20 20 52 65 74 75 72 6e 20 31 20 6f  lue.  Return 1 o
20600 72 20 30 0a 2a 2a 20 66 6f 72 20 54 52 55 45 20  r 0.** for TRUE 
20610 61 6e 64 20 46 41 4c 53 45 2e 20 20 52 65 74 75  and FALSE.  Retu
20620 72 6e 20 74 68 65 20 69 6e 74 65 67 65 72 20 76  rn the integer v
20630 61 6c 75 65 20 69 66 20 61 70 70 72 6f 70 72 69  alue if appropri
20640 61 74 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ate..*/.static i
20650 6e 74 20 62 6f 6f 6c 65 61 6e 56 61 6c 75 65 28  nt booleanValue(
20660 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 72 67  const char *zArg
20670 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  ){.  int i;.  if
20680 28 20 7a 41 72 67 5b 30 5d 3d 3d 27 30 27 20 26  ( zArg[0]=='0' &
20690 26 20 7a 41 72 67 5b 31 5d 3d 3d 27 78 27 20 29  & zArg[1]=='x' )
206a0 7b 0a 20 20 20 20 66 6f 72 28 69 3d 32 3b 20 68  {.    for(i=2; h
206b0 65 78 44 69 67 69 74 56 61 6c 75 65 28 7a 41 72  exDigitValue(zAr
206c0 67 5b 69 5d 29 3e 3d 30 3b 20 69 2b 2b 29 7b 7d  g[i])>=0; i++){}
206d0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6f  .  }else{.    fo
206e0 72 28 69 3d 30 3b 20 7a 41 72 67 5b 69 5d 3e 3d  r(i=0; zArg[i]>=
206f0 27 30 27 20 26 26 20 7a 41 72 67 5b 69 5d 3c 3d  '0' && zArg[i]<=
20700 27 39 27 3b 20 69 2b 2b 29 7b 7d 0a 20 20 7d 0a  '9'; i++){}.  }.
20710 20 20 69 66 28 20 69 3e 30 20 26 26 20 7a 41 72    if( i>0 && zAr
20720 67 5b 69 5d 3d 3d 30 20 29 20 72 65 74 75 72 6e  g[i]==0 ) return
20730 20 28 69 6e 74 29 28 69 6e 74 65 67 65 72 56 61   (int)(integerVa
20740 6c 75 65 28 7a 41 72 67 29 20 26 20 30 78 66 66  lue(zArg) & 0xff
20750 66 66 66 66 66 66 29 3b 0a 20 20 69 66 28 20 73  ffffff);.  if( s
20760 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28 7a  qlite3_stricmp(z
20770 41 72 67 2c 20 22 6f 6e 22 29 3d 3d 30 20 7c 7c  Arg, "on")==0 ||
20780 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70   sqlite3_stricmp
20790 28 7a 41 72 67 2c 22 79 65 73 22 29 3d 3d 30 20  (zArg,"yes")==0 
207a0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  ){.    return 1;
207b0 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74  .  }.  if( sqlit
207c0 65 33 5f 73 74 72 69 63 6d 70 28 7a 41 72 67 2c  e3_stricmp(zArg,
207d0 20 22 6f 66 66 22 29 3d 3d 30 20 7c 7c 20 73 71   "off")==0 || sq
207e0 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28 7a 41  lite3_stricmp(zA
207f0 72 67 2c 22 6e 6f 22 29 3d 3d 30 20 29 7b 0a 20  rg,"no")==0 ){. 
20800 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
20810 0a 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73  .  utf8_printf(s
20820 74 64 65 72 72 2c 20 22 45 52 52 4f 52 3a 20 4e  tderr, "ERROR: N
20830 6f 74 20 61 20 62 6f 6f 6c 65 61 6e 20 76 61 6c  ot a boolean val
20840 75 65 3a 20 5c 22 25 73 5c 22 2e 20 41 73 73 75  ue: \"%s\". Assu
20850 6d 69 6e 67 20 5c 22 6e 6f 5c 22 2e 5c 6e 22 2c  ming \"no\".\n",
20860 0a 20 20 20 20 20 20 20 20 20 20 7a 41 72 67 29  .          zArg)
20870 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  ;.  return 0;.}.
20880 0a 2f 2a 0a 2a 2a 20 53 65 74 20 6f 72 20 63 6c  ./*.** Set or cl
20890 65 61 72 20 61 20 73 68 65 6c 6c 20 66 6c 61 67  ear a shell flag
208a0 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 61 20   according to a 
208b0 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65 2e 0a 2a  boolean value..*
208c0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65  /.static void se
208d0 74 4f 72 43 6c 65 61 72 46 6c 61 67 28 53 68 65  tOrClearFlag(She
208e0 6c 6c 53 74 61 74 65 20 2a 70 2c 20 75 6e 73 69  llState *p, unsi
208f0 67 6e 65 64 20 6d 46 6c 61 67 2c 20 63 6f 6e 73  gned mFlag, cons
20900 74 20 63 68 61 72 20 2a 7a 41 72 67 29 7b 0a 20  t char *zArg){. 
20910 20 69 66 28 20 62 6f 6f 6c 65 61 6e 56 61 6c 75   if( booleanValu
20920 65 28 7a 41 72 67 29 20 29 7b 0a 20 20 20 20 53  e(zArg) ){.    S
20930 68 65 6c 6c 53 65 74 46 6c 61 67 28 70 2c 20 6d  hellSetFlag(p, m
20940 46 6c 61 67 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Flag);.  }else{.
20950 20 20 20 20 53 68 65 6c 6c 43 6c 65 61 72 46 6c      ShellClearFl
20960 61 67 28 70 2c 20 6d 46 6c 61 67 29 3b 0a 20 20  ag(p, mFlag);.  
20970 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  }.}../*.** Close
20980 20 61 6e 20 6f 75 74 70 75 74 20 66 69 6c 65 2c   an output file,
20990 20 61 73 73 75 6d 69 6e 67 20 69 74 20 69 73 20   assuming it is 
209a0 6e 6f 74 20 73 74 64 65 72 72 20 6f 72 20 73 74  not stderr or st
209b0 64 6f 75 74 0a 2a 2f 0a 73 74 61 74 69 63 20 76  dout.*/.static v
209c0 6f 69 64 20 6f 75 74 70 75 74 5f 66 69 6c 65 5f  oid output_file_
209d0 63 6c 6f 73 65 28 46 49 4c 45 20 2a 66 29 7b 0a  close(FILE *f){.
209e0 20 20 69 66 28 20 66 20 26 26 20 66 21 3d 73 74    if( f && f!=st
209f0 64 6f 75 74 20 26 26 20 66 21 3d 73 74 64 65 72  dout && f!=stder
20a00 72 20 29 20 66 63 6c 6f 73 65 28 66 29 3b 0a 7d  r ) fclose(f);.}
20a10 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 6f  ../*.** Try to o
20a20 70 65 6e 20 61 6e 20 6f 75 74 70 75 74 20 66 69  pen an output fi
20a30 6c 65 2e 20 20 20 54 68 65 20 6e 61 6d 65 73 20  le.   The names 
20a40 22 73 74 64 6f 75 74 22 20 61 6e 64 20 22 73 74  "stdout" and "st
20a50 64 65 72 72 22 20 61 72 65 0a 2a 2a 20 72 65 63  derr" are.** rec
20a60 6f 67 6e 69 7a 65 64 20 61 6e 64 20 64 6f 20 74  ognized and do t
20a70 68 65 20 72 69 67 68 74 20 74 68 69 6e 67 2e 20  he right thing. 
20a80 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65   NULL is returne
20a90 64 20 69 66 20 74 68 65 20 6f 75 74 70 75 74 0a  d if the output.
20aa0 2a 2a 20 66 69 6c 65 6e 61 6d 65 20 69 73 20 22  ** filename is "
20ab0 6f 66 66 22 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  off"..*/.static 
20ac0 46 49 4c 45 20 2a 6f 75 74 70 75 74 5f 66 69 6c  FILE *output_fil
20ad0 65 5f 6f 70 65 6e 28 63 6f 6e 73 74 20 63 68 61  e_open(const cha
20ae0 72 20 2a 7a 46 69 6c 65 2c 20 69 6e 74 20 62 54  r *zFile, int bT
20af0 65 78 74 4d 6f 64 65 29 7b 0a 20 20 46 49 4c 45  extMode){.  FILE
20b00 20 2a 66 3b 0a 20 20 69 66 28 20 73 74 72 63 6d   *f;.  if( strcm
20b10 70 28 7a 46 69 6c 65 2c 22 73 74 64 6f 75 74 22  p(zFile,"stdout"
20b20 29 3d 3d 30 20 29 7b 0a 20 20 20 20 66 20 3d 20  )==0 ){.    f = 
20b30 73 74 64 6f 75 74 3b 0a 20 20 7d 65 6c 73 65 20  stdout;.  }else 
20b40 69 66 28 20 73 74 72 63 6d 70 28 7a 46 69 6c 65  if( strcmp(zFile
20b50 2c 20 22 73 74 64 65 72 72 22 29 3d 3d 30 20 29  , "stderr")==0 )
20b60 7b 0a 20 20 20 20 66 20 3d 20 73 74 64 65 72 72  {.    f = stderr
20b70 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74  ;.  }else if( st
20b80 72 63 6d 70 28 7a 46 69 6c 65 2c 20 22 6f 66 66  rcmp(zFile, "off
20b90 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 66 20 3d  ")==0 ){.    f =
20ba0 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
20bb0 20 66 20 3d 20 66 6f 70 65 6e 28 7a 46 69 6c 65   f = fopen(zFile
20bc0 2c 20 62 54 65 78 74 4d 6f 64 65 20 3f 20 22 77  , bTextMode ? "w
20bd0 22 20 3a 20 22 77 62 22 29 3b 0a 20 20 20 20 69  " : "wb");.    i
20be0 66 28 20 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20  f( f==0 ){.     
20bf0 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64   utf8_printf(std
20c00 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 63 61 6e  err, "Error: can
20c10 6e 6f 74 20 6f 70 65 6e 20 5c 22 25 73 5c 22 5c  not open \"%s\"\
20c20 6e 22 2c 20 7a 46 69 6c 65 29 3b 0a 20 20 20 20  n", zFile);.    
20c30 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 66  }.  }.  return f
20c40 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
20c50 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 0a 2f  ITE_OMIT_TRACE./
20c60 2a 0a 2a 2a 20 41 20 72 6f 75 74 69 6e 65 20 66  *.** A routine f
20c70 6f 72 20 68 61 6e 64 6c 69 6e 67 20 6f 75 74 70  or handling outp
20c80 75 74 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f  ut from sqlite3_
20c90 74 72 61 63 65 28 29 2e 0a 2a 2f 0a 73 74 61 74  trace()..*/.stat
20ca0 69 63 20 69 6e 74 20 73 71 6c 5f 74 72 61 63 65  ic int sql_trace
20cb0 5f 63 61 6c 6c 62 61 63 6b 28 0a 20 20 75 6e 73  _callback(.  uns
20cc0 69 67 6e 65 64 20 6d 54 79 70 65 2c 20 20 20 20  igned mType,    
20cd0 20 20 20 20 20 2f 2a 20 54 68 65 20 74 72 61 63       /* The trac
20ce0 65 20 74 79 70 65 20 2a 2f 0a 20 20 76 6f 69 64  e type */.  void
20cf0 20 2a 70 41 72 67 2c 20 20 20 20 20 20 20 20 20   *pArg,         
20d00 20 20 20 20 2f 2a 20 54 68 65 20 53 68 65 6c 6c      /* The Shell
20d10 53 74 61 74 65 20 70 6f 69 6e 74 65 72 20 2a 2f  State pointer */
20d20 0a 20 20 76 6f 69 64 20 2a 70 50 2c 20 20 20 20  .  void *pP,    
20d30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73             /* Us
20d40 75 61 6c 6c 79 20 61 20 70 6f 69 6e 74 65 72 20  ually a pointer 
20d50 74 6f 20 73 71 6c 69 74 65 5f 73 74 6d 74 20 2a  to sqlite_stmt *
20d60 2f 0a 20 20 76 6f 69 64 20 2a 70 58 20 20 20 20  /.  void *pX    
20d70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
20d80 75 78 69 6c 69 61 72 79 20 6f 75 74 70 75 74 20  uxiliary output 
20d90 2a 2f 0a 29 7b 0a 20 20 53 68 65 6c 6c 53 74 61  */.){.  ShellSta
20da0 74 65 20 2a 70 20 3d 20 28 53 68 65 6c 6c 53 74  te *p = (ShellSt
20db0 61 74 65 2a 29 70 41 72 67 3b 0a 20 20 73 71 6c  ate*)pArg;.  sql
20dc0 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
20dd0 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
20de0 7a 53 71 6c 3b 0a 20 20 69 6e 74 20 6e 53 71 6c  zSql;.  int nSql
20df0 3b 0a 20 20 69 66 28 20 70 2d 3e 74 72 61 63 65  ;.  if( p->trace
20e00 4f 75 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  Out==0 ) return 
20e10 30 3b 0a 20 20 69 66 28 20 6d 54 79 70 65 3d 3d  0;.  if( mType==
20e20 53 51 4c 49 54 45 5f 54 52 41 43 45 5f 43 4c 4f  SQLITE_TRACE_CLO
20e30 53 45 20 29 7b 0a 20 20 20 20 75 74 66 38 5f 70  SE ){.    utf8_p
20e40 72 69 6e 74 66 28 70 2d 3e 74 72 61 63 65 4f 75  rintf(p->traceOu
20e50 74 2c 20 22 2d 2d 20 63 6c 6f 73 69 6e 67 20 64  t, "-- closing d
20e60 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
20e70 6f 6e 5c 6e 22 29 3b 0a 20 20 20 20 72 65 74 75  on\n");.    retu
20e80 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn 0;.  }.  if( 
20e90 6d 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 54 52  mType!=SQLITE_TR
20ea0 41 43 45 5f 52 4f 57 20 26 26 20 28 28 63 6f 6e  ACE_ROW && ((con
20eb0 73 74 20 63 68 61 72 2a 29 70 58 29 5b 30 5d 3d  st char*)pX)[0]=
20ec0 3d 27 2d 27 20 29 7b 0a 20 20 20 20 7a 53 71 6c  ='-' ){.    zSql
20ed0 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29   = (const char*)
20ee0 70 58 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  pX;.  }else{.   
20ef0 20 70 53 74 6d 74 20 3d 20 28 73 71 6c 69 74 65   pStmt = (sqlite
20f00 33 5f 73 74 6d 74 2a 29 70 50 3b 0a 20 20 20 20  3_stmt*)pP;.    
20f10 73 77 69 74 63 68 28 20 70 2d 3e 65 54 72 61 63  switch( p->eTrac
20f20 65 54 79 70 65 20 29 7b 0a 20 20 20 20 20 20 63  eType ){.      c
20f30 61 73 65 20 53 48 45 4c 4c 5f 54 52 41 43 45 5f  ase SHELL_TRACE_
20f40 45 58 50 41 4e 44 45 44 3a 20 7b 0a 20 20 20 20  EXPANDED: {.    
20f50 20 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74      zSql = sqlit
20f60 65 33 5f 65 78 70 61 6e 64 65 64 5f 73 71 6c 28  e3_expanded_sql(
20f70 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 20 20  pStmt);.        
20f80 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 23  break;.      }.#
20f90 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
20fa0 42 4c 45 5f 4e 4f 52 4d 41 4c 49 5a 45 0a 20 20  BLE_NORMALIZE.  
20fb0 20 20 20 20 63 61 73 65 20 53 48 45 4c 4c 5f 54      case SHELL_T
20fc0 52 41 43 45 5f 4e 4f 52 4d 41 4c 49 5a 45 44 3a  RACE_NORMALIZED:
20fd0 20 7b 0a 20 20 20 20 20 20 20 20 7a 53 71 6c 20   {.        zSql 
20fe0 3d 20 73 71 6c 69 74 65 33 5f 6e 6f 72 6d 61 6c  = sqlite3_normal
20ff0 69 7a 65 64 5f 73 71 6c 28 70 53 74 6d 74 29 3b  ized_sql(pStmt);
21000 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
21010 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
21020 20 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a       default: {.
21030 20 20 20 20 20 20 20 20 7a 53 71 6c 20 3d 20 73          zSql = s
21040 71 6c 69 74 65 33 5f 73 71 6c 28 70 53 74 6d 74  qlite3_sql(pStmt
21050 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
21060 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
21070 20 20 7d 0a 20 20 69 66 28 20 7a 53 71 6c 3d 3d    }.  if( zSql==
21080 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
21090 6e 53 71 6c 20 3d 20 73 74 72 6c 65 6e 33 30 28  nSql = strlen30(
210a0 7a 53 71 6c 29 3b 0a 20 20 77 68 69 6c 65 28 20  zSql);.  while( 
210b0 6e 53 71 6c 3e 30 20 26 26 20 7a 53 71 6c 5b 6e  nSql>0 && zSql[n
210c0 53 71 6c 2d 31 5d 3d 3d 27 3b 27 20 29 7b 20 6e  Sql-1]==';' ){ n
210d0 53 71 6c 2d 2d 3b 20 7d 0a 20 20 73 77 69 74 63  Sql--; }.  switc
210e0 68 28 20 6d 54 79 70 65 20 29 7b 0a 20 20 20 20  h( mType ){.    
210f0 63 61 73 65 20 53 51 4c 49 54 45 5f 54 52 41 43  case SQLITE_TRAC
21100 45 5f 52 4f 57 3a 0a 20 20 20 20 63 61 73 65 20  E_ROW:.    case 
21110 53 51 4c 49 54 45 5f 54 52 41 43 45 5f 53 54 4d  SQLITE_TRACE_STM
21120 54 3a 20 7b 0a 20 20 20 20 20 20 75 74 66 38 5f  T: {.      utf8_
21130 70 72 69 6e 74 66 28 70 2d 3e 74 72 61 63 65 4f  printf(p->traceO
21140 75 74 2c 20 22 25 2e 2a 73 3b 5c 6e 22 2c 20 6e  ut, "%.*s;\n", n
21150 53 71 6c 2c 20 7a 53 71 6c 29 3b 0a 20 20 20 20  Sql, zSql);.    
21160 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
21170 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54     case SQLITE_T
21180 52 41 43 45 5f 50 52 4f 46 49 4c 45 3a 20 7b 0a  RACE_PROFILE: {.
21190 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e        sqlite3_in
211a0 74 36 34 20 6e 4e 61 6e 6f 73 65 63 20 3d 20 2a  t64 nNanosec = *
211b0 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 2a 29  (sqlite3_int64*)
211c0 70 58 3b 0a 20 20 20 20 20 20 75 74 66 38 5f 70  pX;.      utf8_p
211d0 72 69 6e 74 66 28 70 2d 3e 74 72 61 63 65 4f 75  rintf(p->traceOu
211e0 74 2c 20 22 25 2e 2a 73 3b 20 2d 2d 20 25 6c 6c  t, "%.*s; -- %ll
211f0 64 20 6e 73 5c 6e 22 2c 20 6e 53 71 6c 2c 20 7a  d ns\n", nSql, z
21200 53 71 6c 2c 20 6e 4e 61 6e 6f 73 65 63 29 3b 0a  Sql, nNanosec);.
21210 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
21220 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
21230 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  0;.}.#endif../*.
21240 2a 2a 20 41 20 6e 6f 2d 6f 70 20 72 6f 75 74 69  ** A no-op routi
21250 6e 65 20 74 68 61 74 20 72 75 6e 73 20 77 69 74  ne that runs wit
21260 68 20 74 68 65 20 22 2e 62 72 65 61 6b 70 6f 69  h the ".breakpoi
21270 6e 74 22 20 64 6f 63 2d 63 6f 6d 6d 61 6e 64 2e  nt" doc-command.
21280 20 20 54 68 69 73 20 69 73 0a 2a 2a 20 61 20 75    This is.** a u
21290 73 65 66 75 6c 20 73 70 6f 74 20 74 6f 20 73 65  seful spot to se
212a0 74 20 61 20 64 65 62 75 67 67 65 72 20 62 72 65  t a debugger bre
212b0 61 6b 70 6f 69 6e 74 2e 0a 2a 2f 0a 73 74 61 74  akpoint..*/.stat
212c0 69 63 20 76 6f 69 64 20 74 65 73 74 5f 62 72 65  ic void test_bre
212d0 61 6b 70 6f 69 6e 74 28 76 6f 69 64 29 7b 0a 20  akpoint(void){. 
212e0 20 73 74 61 74 69 63 20 69 6e 74 20 6e 43 61 6c   static int nCal
212f0 6c 20 3d 20 30 3b 0a 20 20 6e 43 61 6c 6c 2b 2b  l = 0;.  nCall++
21300 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 6f 62  ;.}../*.** An ob
21310 6a 65 63 74 20 75 73 65 64 20 74 6f 20 72 65 61  ject used to rea
21320 64 20 61 20 43 53 56 20 61 6e 64 20 6f 74 68 65  d a CSV and othe
21330 72 20 66 69 6c 65 73 20 66 6f 72 20 69 6d 70 6f  r files for impo
21340 72 74 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73  rt..*/.typedef s
21350 74 72 75 63 74 20 49 6d 70 6f 72 74 43 74 78 20  truct ImportCtx 
21360 49 6d 70 6f 72 74 43 74 78 3b 0a 73 74 72 75 63  ImportCtx;.struc
21370 74 20 49 6d 70 6f 72 74 43 74 78 20 7b 0a 20 20  t ImportCtx {.  
21380 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
21390 65 3b 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74  e;  /* Name of t
213a0 68 65 20 69 6e 70 75 74 20 66 69 6c 65 20 2a 2f  he input file */
213b0 0a 20 20 46 49 4c 45 20 2a 69 6e 3b 20 20 20 20  .  FILE *in;    
213c0 20 20 20 20 20 20 20 2f 2a 20 52 65 61 64 20 74         /* Read t
213d0 68 65 20 43 53 56 20 74 65 78 74 20 66 72 6f 6d  he CSV text from
213e0 20 74 68 69 73 20 69 6e 70 75 74 20 73 74 72 65   this input stre
213f0 61 6d 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 3b  am */.  char *z;
21400 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
21410 63 63 75 6d 75 6c 61 74 65 64 20 74 65 78 74 20  ccumulated text 
21420 66 6f 72 20 61 20 66 69 65 6c 64 20 2a 2f 0a 20  for a field */. 
21430 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20   int n;         
21440 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
21450 66 20 62 79 74 65 73 20 69 6e 20 7a 20 2a 2f 0a  f bytes in z */.
21460 20 20 69 6e 74 20 6e 41 6c 6c 6f 63 3b 20 20 20    int nAlloc;   
21470 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20 61        /* Space a
21480 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 7a 5b 5d  llocated for z[]
21490 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 69 6e 65 3b   */.  int nLine;
214a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
214b0 72 65 6e 74 20 6c 69 6e 65 20 6e 75 6d 62 65 72  rent line number
214c0 20 2a 2f 0a 20 20 69 6e 74 20 62 4e 6f 74 46 69   */.  int bNotFi
214d0 72 73 74 3b 20 20 20 20 20 20 2f 2a 20 54 72 75  rst;      /* Tru
214e0 65 20 69 66 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  e if one or more
214f0 20 62 79 74 65 73 20 61 6c 72 65 61 64 79 20 72   bytes already r
21500 65 61 64 20 2a 2f 0a 20 20 69 6e 74 20 63 54 65  ead */.  int cTe
21510 72 6d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  rm;          /* 
21520 43 68 61 72 61 63 74 65 72 20 74 68 61 74 20 74  Character that t
21530 65 72 6d 69 6e 61 74 65 64 20 74 68 65 20 6d 6f  erminated the mo
21540 73 74 20 72 65 63 65 6e 74 20 66 69 65 6c 64 20  st recent field 
21550 2a 2f 0a 20 20 69 6e 74 20 63 43 6f 6c 53 65 70  */.  int cColSep
21560 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ;        /* The 
21570 63 6f 6c 75 6d 6e 20 73 65 70 61 72 61 74 6f 72  column separator
21580 20 63 68 61 72 61 63 74 65 72 2e 20 20 28 55 73   character.  (Us
21590 75 61 6c 6c 79 20 22 2c 22 29 20 2a 2f 0a 20 20  ually ",") */.  
215a0 69 6e 74 20 63 52 6f 77 53 65 70 3b 20 20 20 20  int cRowSep;    
215b0 20 20 20 20 2f 2a 20 54 68 65 20 72 6f 77 20 73      /* The row s
215c0 65 70 61 72 61 74 6f 72 20 63 68 61 72 61 63 74  eparator charact
215d0 65 72 2e 20 20 28 55 73 75 61 6c 6c 79 20 22 5c  er.  (Usually "\
215e0 6e 22 29 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 41 70  n") */.};../* Ap
215f0 70 65 6e 64 20 61 20 73 69 6e 67 6c 65 20 62 79  pend a single by
21600 74 65 20 74 6f 20 7a 5b 5d 20 2a 2f 0a 73 74 61  te to z[] */.sta
21610 74 69 63 20 76 6f 69 64 20 69 6d 70 6f 72 74 5f  tic void import_
21620 61 70 70 65 6e 64 5f 63 68 61 72 28 49 6d 70 6f  append_char(Impo
21630 72 74 43 74 78 20 2a 70 2c 20 69 6e 74 20 63 29  rtCtx *p, int c)
21640 7b 0a 20 20 69 66 28 20 70 2d 3e 6e 2b 31 3e 3d  {.  if( p->n+1>=
21650 70 2d 3e 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20 20  p->nAlloc ){.   
21660 20 70 2d 3e 6e 41 6c 6c 6f 63 20 2b 3d 20 70 2d   p->nAlloc += p-
21670 3e 6e 41 6c 6c 6f 63 20 2b 20 31 30 30 3b 0a 20  >nAlloc + 100;. 
21680 20 20 20 70 2d 3e 7a 20 3d 20 73 71 6c 69 74 65     p->z = sqlite
21690 33 5f 72 65 61 6c 6c 6f 63 36 34 28 70 2d 3e 7a  3_realloc64(p->z
216a0 2c 20 70 2d 3e 6e 41 6c 6c 6f 63 29 3b 0a 20 20  , p->nAlloc);.  
216b0 20 20 69 66 28 20 70 2d 3e 7a 3d 3d 30 20 29 20    if( p->z==0 ) 
216c0 73 68 65 6c 6c 5f 6f 75 74 5f 6f 66 5f 6d 65 6d  shell_out_of_mem
216d0 6f 72 79 28 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e  ory();.  }.  p->
216e0 7a 5b 70 2d 3e 6e 2b 2b 5d 20 3d 20 28 63 68 61  z[p->n++] = (cha
216f0 72 29 63 3b 0a 7d 0a 0a 2f 2a 20 52 65 61 64 20  r)c;.}../* Read 
21700 61 20 73 69 6e 67 6c 65 20 66 69 65 6c 64 20 6f  a single field o
21710 66 20 43 53 56 20 74 65 78 74 2e 20 20 43 6f 6d  f CSV text.  Com
21720 70 61 74 69 62 6c 65 20 77 69 74 68 20 72 66 63  patible with rfc
21730 34 31 38 30 20 61 6e 64 20 65 78 74 65 6e 64 65  4180 and extende
21740 64 0a 2a 2a 20 77 69 74 68 20 74 68 65 20 6f 70  d.** with the op
21750 74 69 6f 6e 20 6f 66 20 68 61 76 69 6e 67 20 61  tion of having a
21760 20 73 65 70 61 72 61 74 6f 72 20 6f 74 68 65 72   separator other
21770 20 74 68 61 6e 20 22 2c 22 2e 0a 2a 2a 0a 2a 2a   than ","..**.**
21780 20 20 20 2b 20 20 49 6e 70 75 74 20 63 6f 6d 65     +  Input come
21790 73 20 66 72 6f 6d 20 70 2d 3e 69 6e 2e 0a 2a 2a  s from p->in..**
217a0 20 20 20 2b 20 20 53 74 6f 72 65 20 72 65 73 75     +  Store resu
217b0 6c 74 73 20 69 6e 20 70 2d 3e 7a 20 6f 66 20 6c  lts in p->z of l
217c0 65 6e 67 74 68 20 70 2d 3e 6e 2e 20 20 53 70 61  ength p->n.  Spa
217d0 63 65 20 74 6f 20 68 6f 6c 64 20 70 2d 3e 7a 20  ce to hold p->z 
217e0 63 6f 6d 65 73 0a 2a 2a 20 20 20 20 20 20 66 72  comes.**      fr
217f0 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  om sqlite3_mallo
21800 63 36 34 28 29 2e 0a 2a 2a 20 20 20 2b 20 20 55  c64()..**   +  U
21810 73 65 20 70 2d 3e 63 53 65 70 20 61 73 20 74 68  se p->cSep as th
21820 65 20 63 6f 6c 75 6d 6e 20 73 65 70 61 72 61 74  e column separat
21830 6f 72 2e 20 20 54 68 65 20 64 65 66 61 75 6c 74  or.  The default
21840 20 69 73 20 22 2c 22 2e 0a 2a 2a 20 20 20 2b 20   is ","..**   + 
21850 20 55 73 65 20 70 2d 3e 72 53 65 70 20 61 73 20   Use p->rSep as 
21860 74 68 65 20 72 6f 77 20 73 65 70 61 72 61 74 6f  the row separato
21870 72 2e 20 20 54 68 65 20 64 65 66 61 75 6c 74 20  r.  The default 
21880 69 73 20 22 5c 6e 22 2e 0a 2a 2a 20 20 20 2b 20  is "\n"..**   + 
21890 20 4b 65 65 70 20 74 72 61 63 6b 20 6f 66 20 74   Keep track of t
218a0 68 65 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20 69  he line number i
218b0 6e 20 70 2d 3e 6e 4c 69 6e 65 2e 0a 2a 2a 20 20  n p->nLine..**  
218c0 20 2b 20 20 53 74 6f 72 65 20 74 68 65 20 63 68   +  Store the ch
218d0 61 72 61 63 74 65 72 20 74 68 61 74 20 74 65 72  aracter that ter
218e0 6d 69 6e 61 74 65 73 20 74 68 65 20 66 69 65 6c  minates the fiel
218f0 64 20 69 6e 20 70 2d 3e 63 54 65 72 6d 2e 20 20  d in p->cTerm.  
21900 53 74 6f 72 65 0a 2a 2a 20 20 20 20 20 20 45 4f  Store.**      EO
21910 46 20 6f 6e 20 65 6e 64 2d 6f 66 2d 66 69 6c 65  F on end-of-file
21920 2e 0a 2a 2a 20 20 20 2b 20 20 52 65 70 6f 72 74  ..**   +  Report
21930 20 73 79 6e 74 61 78 20 65 72 72 6f 72 73 20 6f   syntax errors o
21940 6e 20 73 74 64 65 72 72 0a 2a 2f 0a 73 74 61 74  n stderr.*/.stat
21950 69 63 20 63 68 61 72 20 2a 53 51 4c 49 54 45 5f  ic char *SQLITE_
21960 43 44 45 43 4c 20 63 73 76 5f 72 65 61 64 5f 6f  CDECL csv_read_o
21970 6e 65 5f 66 69 65 6c 64 28 49 6d 70 6f 72 74 43  ne_field(ImportC
21980 74 78 20 2a 70 29 7b 0a 20 20 69 6e 74 20 63 3b  tx *p){.  int c;
21990 0a 20 20 69 6e 74 20 63 53 65 70 20 3d 20 70 2d  .  int cSep = p-
219a0 3e 63 43 6f 6c 53 65 70 3b 0a 20 20 69 6e 74 20  >cColSep;.  int 
219b0 72 53 65 70 20 3d 20 70 2d 3e 63 52 6f 77 53 65  rSep = p->cRowSe
219c0 70 3b 0a 20 20 70 2d 3e 6e 20 3d 20 30 3b 0a 20  p;.  p->n = 0;. 
219d0 20 63 20 3d 20 66 67 65 74 63 28 70 2d 3e 69 6e   c = fgetc(p->in
219e0 29 3b 0a 20 20 69 66 28 20 63 3d 3d 45 4f 46 20  );.  if( c==EOF 
219f0 7c 7c 20 73 65 65 6e 49 6e 74 65 72 72 75 70 74  || seenInterrupt
21a00 20 29 7b 0a 20 20 20 20 70 2d 3e 63 54 65 72 6d   ){.    p->cTerm
21a10 20 3d 20 45 4f 46 3b 0a 20 20 20 20 72 65 74 75   = EOF;.    retu
21a20 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn 0;.  }.  if( 
21a30 63 3d 3d 27 22 27 20 29 7b 0a 20 20 20 20 69 6e  c=='"' ){.    in
21a40 74 20 70 63 2c 20 70 70 63 3b 0a 20 20 20 20 69  t pc, ppc;.    i
21a50 6e 74 20 73 74 61 72 74 4c 69 6e 65 20 3d 20 70  nt startLine = p
21a60 2d 3e 6e 4c 69 6e 65 3b 0a 20 20 20 20 69 6e 74  ->nLine;.    int
21a70 20 63 51 75 6f 74 65 20 3d 20 63 3b 0a 20 20 20   cQuote = c;.   
21a80 20 70 63 20 3d 20 70 70 63 20 3d 20 30 3b 0a 20   pc = ppc = 0;. 
21a90 20 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20     while( 1 ){. 
21aa0 20 20 20 20 20 63 20 3d 20 66 67 65 74 63 28 70       c = fgetc(p
21ab0 2d 3e 69 6e 29 3b 0a 20 20 20 20 20 20 69 66 28  ->in);.      if(
21ac0 20 63 3d 3d 72 53 65 70 20 29 20 70 2d 3e 6e 4c   c==rSep ) p->nL
21ad0 69 6e 65 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28  ine++;.      if(
21ae0 20 63 3d 3d 63 51 75 6f 74 65 20 29 7b 0a 20 20   c==cQuote ){.  
21af0 20 20 20 20 20 20 69 66 28 20 70 63 3d 3d 63 51        if( pc==cQ
21b00 75 6f 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20  uote ){.        
21b10 20 20 70 63 20 3d 20 30 3b 0a 20 20 20 20 20 20    pc = 0;.      
21b20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
21b30 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
21b40 20 20 20 20 20 20 69 66 28 20 28 63 3d 3d 63 53        if( (c==cS
21b50 65 70 20 26 26 20 70 63 3d 3d 63 51 75 6f 74 65  ep && pc==cQuote
21b60 29 0a 20 20 20 20 20 20 20 7c 7c 20 28 63 3d 3d  ).       || (c==
21b70 72 53 65 70 20 26 26 20 70 63 3d 3d 63 51 75 6f  rSep && pc==cQuo
21b80 74 65 29 0a 20 20 20 20 20 20 20 7c 7c 20 28 63  te).       || (c
21b90 3d 3d 72 53 65 70 20 26 26 20 70 63 3d 3d 27 5c  ==rSep && pc=='\
21ba0 72 27 20 26 26 20 70 70 63 3d 3d 63 51 75 6f 74  r' && ppc==cQuot
21bb0 65 29 0a 20 20 20 20 20 20 20 7c 7c 20 28 63 3d  e).       || (c=
21bc0 3d 45 4f 46 20 26 26 20 70 63 3d 3d 63 51 75 6f  =EOF && pc==cQuo
21bd0 74 65 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20  te).      ){.   
21be0 20 20 20 20 20 64 6f 7b 20 70 2d 3e 6e 2d 2d 3b       do{ p->n--;
21bf0 20 7d 77 68 69 6c 65 28 20 70 2d 3e 7a 5b 70 2d   }while( p->z[p-
21c00 3e 6e 5d 21 3d 63 51 75 6f 74 65 20 29 3b 0a 20  >n]!=cQuote );. 
21c10 20 20 20 20 20 20 20 70 2d 3e 63 54 65 72 6d 20         p->cTerm 
21c20 3d 20 63 3b 0a 20 20 20 20 20 20 20 20 62 72 65  = c;.        bre
21c30 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
21c40 20 20 69 66 28 20 70 63 3d 3d 63 51 75 6f 74 65    if( pc==cQuote
21c50 20 26 26 20 63 21 3d 27 5c 72 27 20 29 7b 0a 20   && c!='\r' ){. 
21c60 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e         utf8_prin
21c70 74 66 28 73 74 64 65 72 72 2c 20 22 25 73 3a 25  tf(stderr, "%s:%
21c80 64 3a 20 75 6e 65 73 63 61 70 65 64 20 25 63 20  d: unescaped %c 
21c90 63 68 61 72 61 63 74 65 72 5c 6e 22 2c 0a 20 20  character\n",.  
21ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d                p-
21cb0 3e 7a 46 69 6c 65 2c 20 70 2d 3e 6e 4c 69 6e 65  >zFile, p->nLine
21cc0 2c 20 63 51 75 6f 74 65 29 3b 0a 20 20 20 20 20  , cQuote);.     
21cd0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d   }.      if( c==
21ce0 45 4f 46 20 29 7b 0a 20 20 20 20 20 20 20 20 75  EOF ){.        u
21cf0 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72  tf8_printf(stder
21d00 72 2c 20 22 25 73 3a 25 64 3a 20 75 6e 74 65 72  r, "%s:%d: unter
21d10 6d 69 6e 61 74 65 64 20 25 63 2d 71 75 6f 74 65  minated %c-quote
21d20 64 20 66 69 65 6c 64 5c 6e 22 2c 0a 20 20 20 20  d field\n",.    
21d30 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 7a              p->z
21d40 46 69 6c 65 2c 20 73 74 61 72 74 4c 69 6e 65 2c  File, startLine,
21d50 20 63 51 75 6f 74 65 29 3b 0a 20 20 20 20 20 20   cQuote);.      
21d60 20 20 70 2d 3e 63 54 65 72 6d 20 3d 20 63 3b 0a    p->cTerm = c;.
21d70 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
21d80 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 6d 70       }.      imp
21d90 6f 72 74 5f 61 70 70 65 6e 64 5f 63 68 61 72 28  ort_append_char(
21da0 70 2c 20 63 29 3b 0a 20 20 20 20 20 20 70 70 63  p, c);.      ppc
21db0 20 3d 20 70 63 3b 0a 20 20 20 20 20 20 70 63 20   = pc;.      pc 
21dc0 3d 20 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  = c;.    }.  }el
21dd0 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  se{.    /* If th
21de0 69 73 20 69 73 20 74 68 65 20 66 69 72 73 74 20  is is the first 
21df0 66 69 65 6c 64 20 62 65 69 6e 67 20 70 61 72 73  field being pars
21e00 65 64 20 61 6e 64 20 69 74 20 62 65 67 69 6e 73  ed and it begins
21e10 20 77 69 74 68 20 74 68 65 0a 20 20 20 20 2a 2a   with the.    **
21e20 20 55 54 46 2d 38 20 42 4f 4d 20 20 28 30 78 45   UTF-8 BOM  (0xE
21e30 46 20 42 42 20 42 46 29 20 74 68 65 6e 20 73 6b  F BB BF) then sk
21e40 69 70 20 74 68 65 20 42 4f 4d 20 2a 2f 0a 20 20  ip the BOM */.  
21e50 20 20 69 66 28 20 28 63 26 30 78 66 66 29 3d 3d    if( (c&0xff)==
21e60 30 78 65 66 20 26 26 20 70 2d 3e 62 4e 6f 74 46  0xef && p->bNotF
21e70 69 72 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  irst==0 ){.     
21e80 20 69 6d 70 6f 72 74 5f 61 70 70 65 6e 64 5f 63   import_append_c
21e90 68 61 72 28 70 2c 20 63 29 3b 0a 20 20 20 20 20  har(p, c);.     
21ea0 20 63 20 3d 20 66 67 65 74 63 28 70 2d 3e 69 6e   c = fgetc(p->in
21eb0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28 63 26  );.      if( (c&
21ec0 30 78 66 66 29 3d 3d 30 78 62 62 20 29 7b 0a 20  0xff)==0xbb ){. 
21ed0 20 20 20 20 20 20 20 69 6d 70 6f 72 74 5f 61 70         import_ap
21ee0 70 65 6e 64 5f 63 68 61 72 28 70 2c 20 63 29 3b  pend_char(p, c);
21ef0 0a 20 20 20 20 20 20 20 20 63 20 3d 20 66 67 65  .        c = fge
21f00 74 63 28 70 2d 3e 69 6e 29 3b 0a 20 20 20 20 20  tc(p->in);.     
21f10 20 20 20 69 66 28 20 28 63 26 30 78 66 66 29 3d     if( (c&0xff)=
21f20 3d 30 78 62 66 20 29 7b 0a 20 20 20 20 20 20 20  =0xbf ){.       
21f30 20 20 20 70 2d 3e 62 4e 6f 74 46 69 72 73 74 20     p->bNotFirst 
21f40 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 70  = 1;.          p
21f50 2d 3e 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ->n = 0;.       
21f60 20 20 20 72 65 74 75 72 6e 20 63 73 76 5f 72 65     return csv_re
21f70 61 64 5f 6f 6e 65 5f 66 69 65 6c 64 28 70 29 3b  ad_one_field(p);
21f80 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
21f90 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 77 68 69   }.    }.    whi
21fa0 6c 65 28 20 63 21 3d 45 4f 46 20 26 26 20 63 21  le( c!=EOF && c!
21fb0 3d 63 53 65 70 20 26 26 20 63 21 3d 72 53 65 70  =cSep && c!=rSep
21fc0 20 29 7b 0a 20 20 20 20 20 20 69 6d 70 6f 72 74   ){.      import
21fd0 5f 61 70 70 65 6e 64 5f 63 68 61 72 28 70 2c 20  _append_char(p, 
21fe0 63 29 3b 0a 20 20 20 20 20 20 63 20 3d 20 66 67  c);.      c = fg
21ff0 65 74 63 28 70 2d 3e 69 6e 29 3b 0a 20 20 20 20  etc(p->in);.    
22000 7d 0a 20 20 20 20 69 66 28 20 63 3d 3d 72 53 65  }.    if( c==rSe
22010 70 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 4c  p ){.      p->nL
22020 69 6e 65 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28  ine++;.      if(
22030 20 70 2d 3e 6e 3e 30 20 26 26 20 70 2d 3e 7a 5b   p->n>0 && p->z[
22040 70 2d 3e 6e 2d 31 5d 3d 3d 27 5c 72 27 20 29 20  p->n-1]=='\r' ) 
22050 70 2d 3e 6e 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20  p->n--;.    }.  
22060 20 20 70 2d 3e 63 54 65 72 6d 20 3d 20 63 3b 0a    p->cTerm = c;.
22070 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 7a 20 29    }.  if( p->z )
22080 20 70 2d 3e 7a 5b 70 2d 3e 6e 5d 20 3d 20 30 3b   p->z[p->n] = 0;
22090 0a 20 20 70 2d 3e 62 4e 6f 74 46 69 72 73 74 20  .  p->bNotFirst 
220a0 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d  = 1;.  return p-
220b0 3e 7a 3b 0a 7d 0a 0a 2f 2a 20 52 65 61 64 20 61  >z;.}../* Read a
220c0 20 73 69 6e 67 6c 65 20 66 69 65 6c 64 20 6f 66   single field of
220d0 20 41 53 43 49 49 20 64 65 6c 69 6d 69 74 65 64   ASCII delimited
220e0 20 74 65 78 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 2b   text..**.**   +
220f0 20 20 49 6e 70 75 74 20 63 6f 6d 65 73 20 66 72    Input comes fr
22100 6f 6d 20 70 2d 3e 69 6e 2e 0a 2a 2a 20 20 20 2b  om p->in..**   +
22110 20 20 53 74 6f 72 65 20 72 65 73 75 6c 74 73 20    Store results 
22120 69 6e 20 70 2d 3e 7a 20 6f 66 20 6c 65 6e 67 74  in p->z of lengt
22130 68 20 70 2d 3e 6e 2e 20 20 53 70 61 63 65 20 74  h p->n.  Space t
22140 6f 20 68 6f 6c 64 20 70 2d 3e 7a 20 63 6f 6d 65  o hold p->z come
22150 73 0a 2a 2a 20 20 20 20 20 20 66 72 6f 6d 20 73  s.**      from s
22160 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28  qlite3_malloc64(
22170 29 2e 0a 2a 2a 20 20 20 2b 20 20 55 73 65 20 70  )..**   +  Use p
22180 2d 3e 63 53 65 70 20 61 73 20 74 68 65 20 63 6f  ->cSep as the co
22190 6c 75 6d 6e 20 73 65 70 61 72 61 74 6f 72 2e 20  lumn separator. 
221a0 20 54 68 65 20 64 65 66 61 75 6c 74 20 69 73 20   The default is 
221b0 22 5c 78 31 46 22 2e 0a 2a 2a 20 20 20 2b 20 20  "\x1F"..**   +  
221c0 55 73 65 20 70 2d 3e 72 53 65 70 20 61 73 20 74  Use p->rSep as t
221d0 68 65 20 72 6f 77 20 73 65 70 61 72 61 74 6f 72  he row separator
221e0 2e 20 20 54 68 65 20 64 65 66 61 75 6c 74 20 69  .  The default i
221f0 73 20 22 5c 78 31 45 22 2e 0a 2a 2a 20 20 20 2b  s "\x1E"..**   +
22200 20 20 4b 65 65 70 20 74 72 61 63 6b 20 6f 66 20    Keep track of 
22210 74 68 65 20 72 6f 77 20 6e 75 6d 62 65 72 20 69  the row number i
22220 6e 20 70 2d 3e 6e 4c 69 6e 65 2e 0a 2a 2a 20 20  n p->nLine..**  
22230 20 2b 20 20 53 74 6f 72 65 20 74 68 65 20 63 68   +  Store the ch
22240 61 72 61 63 74 65 72 20 74 68 61 74 20 74 65 72  aracter that ter
22250 6d 69 6e 61 74 65 73 20 74 68 65 20 66 69 65 6c  minates the fiel
22260 64 20 69 6e 20 70 2d 3e 63 54 65 72 6d 2e 20 20  d in p->cTerm.  
22270 53 74 6f 72 65 0a 2a 2a 20 20 20 20 20 20 45 4f  Store.**      EO
22280 46 20 6f 6e 20 65 6e 64 2d 6f 66 2d 66 69 6c 65  F on end-of-file
22290 2e 0a 2a 2a 20 20 20 2b 20 20 52 65 70 6f 72 74  ..**   +  Report
222a0 20 73 79 6e 74 61 78 20 65 72 72 6f 72 73 20 6f   syntax errors o
222b0 6e 20 73 74 64 65 72 72 0a 2a 2f 0a 73 74 61 74  n stderr.*/.stat
222c0 69 63 20 63 68 61 72 20 2a 53 51 4c 49 54 45 5f  ic char *SQLITE_
222d0 43 44 45 43 4c 20 61 73 63 69 69 5f 72 65 61 64  CDECL ascii_read
222e0 5f 6f 6e 65 5f 66 69 65 6c 64 28 49 6d 70 6f 72  _one_field(Impor
222f0 74 43 74 78 20 2a 70 29 7b 0a 20 20 69 6e 74 20  tCtx *p){.  int 
22300 63 3b 0a 20 20 69 6e 74 20 63 53 65 70 20 3d 20  c;.  int cSep = 
22310 70 2d 3e 63 43 6f 6c 53 65 70 3b 0a 20 20 69 6e  p->cColSep;.  in
22320 74 20 72 53 65 70 20 3d 20 70 2d 3e 63 52 6f 77  t rSep = p->cRow
22330 53 65 70 3b 0a 20 20 70 2d 3e 6e 20 3d 20 30 3b  Sep;.  p->n = 0;
22340 0a 20 20 63 20 3d 20 66 67 65 74 63 28 70 2d 3e  .  c = fgetc(p->
22350 69 6e 29 3b 0a 20 20 69 66 28 20 63 3d 3d 45 4f  in);.  if( c==EO
22360 46 20 7c 7c 20 73 65 65 6e 49 6e 74 65 72 72 75  F || seenInterru
22370 70 74 20 29 7b 0a 20 20 20 20 70 2d 3e 63 54 65  pt ){.    p->cTe
22380 72 6d 20 3d 20 45 4f 46 3b 0a 20 20 20 20 72 65  rm = EOF;.    re
22390 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 77 68  turn 0;.  }.  wh
223a0 69 6c 65 28 20 63 21 3d 45 4f 46 20 26 26 20 63  ile( c!=EOF && c
223b0 21 3d 63 53 65 70 20 26 26 20 63 21 3d 72 53 65  !=cSep && c!=rSe
223c0 70 20 29 7b 0a 20 20 20 20 69 6d 70 6f 72 74 5f  p ){.    import_
223d0 61 70 70 65 6e 64 5f 63 68 61 72 28 70 2c 20 63  append_char(p, c
223e0 29 3b 0a 20 20 20 20 63 20 3d 20 66 67 65 74 63  );.    c = fgetc
223f0 28 70 2d 3e 69 6e 29 3b 0a 20 20 7d 0a 20 20 69  (p->in);.  }.  i
22400 66 28 20 63 3d 3d 72 53 65 70 20 29 7b 0a 20 20  f( c==rSep ){.  
22410 20 20 70 2d 3e 6e 4c 69 6e 65 2b 2b 3b 0a 20 20    p->nLine++;.  
22420 7d 0a 20 20 70 2d 3e 63 54 65 72 6d 20 3d 20 63  }.  p->cTerm = c
22430 3b 0a 20 20 69 66 28 20 70 2d 3e 7a 20 29 20 70  ;.  if( p->z ) p
22440 2d 3e 7a 5b 70 2d 3e 6e 5d 20 3d 20 30 3b 0a 20  ->z[p->n] = 0;. 
22450 20 72 65 74 75 72 6e 20 70 2d 3e 7a 3b 0a 7d 0a   return p->z;.}.
22460 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 74 72  ./*.** Try to tr
22470 61 6e 73 66 65 72 20 64 61 74 61 20 66 6f 72 20  ansfer data for 
22480 74 61 62 6c 65 20 7a 54 61 62 6c 65 2e 20 20 49  table zTable.  I
22490 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20 73 65  f an error is se
224a0 65 6e 20 77 68 69 6c 65 0a 2a 2a 20 6d 6f 76 69  en while.** movi
224b0 6e 67 20 66 6f 72 77 61 72 64 2c 20 74 72 79 20  ng forward, try 
224c0 74 6f 20 67 6f 20 62 61 63 6b 77 61 72 64 73 2e  to go backwards.
224d0 20 20 54 68 65 20 62 61 63 6b 77 61 72 64 73 20    The backwards 
224e0 6d 6f 76 65 6d 65 6e 74 20 77 6f 6e 27 74 0a 2a  movement won't.*
224f0 2a 20 77 6f 72 6b 20 66 6f 72 20 57 49 54 48 4f  * work for WITHO
22500 55 54 20 52 4f 57 49 44 20 74 61 62 6c 65 73 2e  UT ROWID tables.
22510 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
22520 74 72 79 54 6f 43 6c 6f 6e 65 44 61 74 61 28 0a  tryToCloneData(.
22530 20 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 2c    ShellState *p,
22540 0a 20 20 73 71 6c 69 74 65 33 20 2a 6e 65 77 44  .  sqlite3 *newD
22550 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  b,.  const char 
22560 2a 7a 54 61 62 6c 65 0a 29 7b 0a 20 20 73 71 6c  *zTable.){.  sql
22570 69 74 65 33 5f 73 74 6d 74 20 2a 70 51 75 65 72  ite3_stmt *pQuer
22580 79 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  y = 0;.  sqlite3
22590 5f 73 74 6d 74 20 2a 70 49 6e 73 65 72 74 20 3d  _stmt *pInsert =
225a0 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a 51 75 65   0;.  char *zQue
225b0 72 79 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a  ry = 0;.  char *
225c0 7a 49 6e 73 65 72 74 20 3d 20 30 3b 0a 20 20 69  zInsert = 0;.  i
225d0 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 69 2c 20  nt rc;.  int i, 
225e0 6a 2c 20 6e 3b 0a 20 20 69 6e 74 20 6e 54 61 62  j, n;.  int nTab
225f0 6c 65 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a 54  le = strlen30(zT
22600 61 62 6c 65 29 3b 0a 20 20 69 6e 74 20 6b 20 3d  able);.  int k =
22610 20 30 3b 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20   0;.  int cnt = 
22620 30 3b 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 73  0;.  const int s
22630 70 69 6e 52 61 74 65 20 3d 20 31 30 30 30 30 3b  pinRate = 10000;
22640 0a 0a 20 20 7a 51 75 65 72 79 20 3d 20 73 71 6c  ..  zQuery = sql
22650 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 53 45  ite3_mprintf("SE
22660 4c 45 43 54 20 2a 20 46 52 4f 4d 20 5c 22 25 77  LECT * FROM \"%w
22670 5c 22 22 2c 20 7a 54 61 62 6c 65 29 3b 0a 20 20  \"", zTable);.  
22680 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65  rc = sqlite3_pre
22690 70 61 72 65 5f 76 32 28 70 2d 3e 64 62 2c 20 7a  pare_v2(p->db, z
226a0 51 75 65 72 79 2c 20 2d 31 2c 20 26 70 51 75 65  Query, -1, &pQue
226b0 72 79 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63  ry, 0);.  if( rc
226c0 20 29 7b 0a 20 20 20 20 75 74 66 38 5f 70 72 69   ){.    utf8_pri
226d0 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72  ntf(stderr, "Err
226e0 6f 72 20 25 64 3a 20 25 73 20 6f 6e 20 5b 25 73  or %d: %s on [%s
226f0 5d 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  ]\n",.          
22700 20 20 73 71 6c 69 74 65 33 5f 65 78 74 65 6e 64    sqlite3_extend
22710 65 64 5f 65 72 72 63 6f 64 65 28 70 2d 3e 64 62  ed_errcode(p->db
22720 29 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73  ), sqlite3_errms
22730 67 28 70 2d 3e 64 62 29 2c 0a 20 20 20 20 20 20  g(p->db),.      
22740 20 20 20 20 20 20 7a 51 75 65 72 79 29 3b 0a 20        zQuery);. 
22750 20 20 20 67 6f 74 6f 20 65 6e 64 5f 64 61 74 61     goto end_data
22760 5f 78 66 65 72 3b 0a 20 20 7d 0a 20 20 6e 20 3d  _xfer;.  }.  n =
22770 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
22780 63 6f 75 6e 74 28 70 51 75 65 72 79 29 3b 0a 20  count(pQuery);. 
22790 20 7a 49 6e 73 65 72 74 20 3d 20 73 71 6c 69 74   zInsert = sqlit
227a0 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 32 30 30 20  e3_malloc64(200 
227b0 2b 20 6e 54 61 62 6c 65 20 2b 20 6e 2a 33 29 3b  + nTable + n*3);
227c0 0a 20 20 69 66 28 20 7a 49 6e 73 65 72 74 3d 3d  .  if( zInsert==
227d0 30 20 29 20 73 68 65 6c 6c 5f 6f 75 74 5f 6f 66  0 ) shell_out_of
227e0 5f 6d 65 6d 6f 72 79 28 29 3b 0a 20 20 73 71 6c  _memory();.  sql
227f0 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 32 30  ite3_snprintf(20
22800 30 2b 6e 54 61 62 6c 65 2c 7a 49 6e 73 65 72 74  0+nTable,zInsert
22810 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
22820 20 20 20 20 20 22 49 4e 53 45 52 54 20 4f 52 20       "INSERT OR 
22830 49 47 4e 4f 52 45 20 49 4e 54 4f 20 5c 22 25 73  IGNORE INTO \"%s
22840 5c 22 20 56 41 4c 55 45 53 28 3f 22 2c 20 7a 54  \" VALUES(?", zT
22850 61 62 6c 65 29 3b 0a 20 20 69 20 3d 20 73 74 72  able);.  i = str
22860 6c 65 6e 33 30 28 7a 49 6e 73 65 72 74 29 3b 0a  len30(zInsert);.
22870 20 20 66 6f 72 28 6a 3d 31 3b 20 6a 3c 6e 3b 20    for(j=1; j<n; 
22880 6a 2b 2b 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79  j++){.    memcpy
22890 28 7a 49 6e 73 65 72 74 2b 69 2c 20 22 2c 3f 22  (zInsert+i, ",?"
228a0 2c 20 32 29 3b 0a 20 20 20 20 69 20 2b 3d 20 32  , 2);.    i += 2
228b0 3b 0a 20 20 7d 0a 20 20 6d 65 6d 63 70 79 28 7a  ;.  }.  memcpy(z
228c0 49 6e 73 65 72 74 2b 69 2c 20 22 29 3b 22 2c 20  Insert+i, ");", 
228d0 33 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  3);.  rc = sqlit
228e0 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 6e 65  e3_prepare_v2(ne
228f0 77 44 62 2c 20 7a 49 6e 73 65 72 74 2c 20 2d 31  wDb, zInsert, -1
22900 2c 20 26 70 49 6e 73 65 72 74 2c 20 30 29 3b 0a  , &pInsert, 0);.
22910 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
22920 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65  utf8_printf(stde
22930 72 72 2c 20 22 45 72 72 6f 72 20 25 64 3a 20 25  rr, "Error %d: %
22940 73 20 6f 6e 20 5b 25 73 5d 5c 6e 22 2c 0a 20 20  s on [%s]\n",.  
22950 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
22960 33 5f 65 78 74 65 6e 64 65 64 5f 65 72 72 63 6f  3_extended_errco
22970 64 65 28 6e 65 77 44 62 29 2c 20 73 71 6c 69 74  de(newDb), sqlit
22980 65 33 5f 65 72 72 6d 73 67 28 6e 65 77 44 62 29  e3_errmsg(newDb)
22990 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 51  ,.            zQ
229a0 75 65 72 79 29 3b 0a 20 20 20 20 67 6f 74 6f 20  uery);.    goto 
229b0 65 6e 64 5f 64 61 74 61 5f 78 66 65 72 3b 0a 20  end_data_xfer;. 
229c0 20 7d 0a 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c   }.  for(k=0; k<
229d0 32 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 77 68 69  2; k++){.    whi
229e0 6c 65 28 20 28 72 63 20 3d 20 73 71 6c 69 74 65  le( (rc = sqlite
229f0 33 5f 73 74 65 70 28 70 51 75 65 72 79 29 29 3d  3_step(pQuery))=
22a00 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20  =SQLITE_ROW ){. 
22a10 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
22a20 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  n; i++){.       
22a30 20 73 77 69 74 63 68 28 20 73 71 6c 69 74 65 33   switch( sqlite3
22a40 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65 28 70 51 75  _column_type(pQu
22a50 65 72 79 2c 20 69 29 20 29 7b 0a 20 20 20 20 20  ery, i) ){.     
22a60 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
22a70 5f 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 20  _NULL: {.       
22a80 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e       sqlite3_bin
22a90 64 5f 6e 75 6c 6c 28 70 49 6e 73 65 72 74 2c 20  d_null(pInsert, 
22aa0 69 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20  i+1);.          
22ab0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
22ac0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 63     }.          c
22ad0 61 73 65 20 53 51 4c 49 54 45 5f 49 4e 54 45 47  ase SQLITE_INTEG
22ae0 45 52 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20  ER: {.          
22af0 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69    sqlite3_bind_i
22b00 6e 74 36 34 28 70 49 6e 73 65 72 74 2c 20 69 2b  nt64(pInsert, i+
22b10 31 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  1, sqlite3_colum
22b20 6e 5f 69 6e 74 36 34 28 70 51 75 65 72 79 2c 69  n_int64(pQuery,i
22b30 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ));.            
22b40 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
22b50 20 7d 0a 20 20 20 20 20 20 20 20 20 20 63 61 73   }.          cas
22b60 65 20 53 51 4c 49 54 45 5f 46 4c 4f 41 54 3a 20  e SQLITE_FLOAT: 
22b70 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
22b80 6c 69 74 65 33 5f 62 69 6e 64 5f 64 6f 75 62 6c  lite3_bind_doubl
22b90 65 28 70 49 6e 73 65 72 74 2c 20 69 2b 31 2c 20  e(pInsert, i+1, 
22ba0 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64  sqlite3_column_d
22bb0 6f 75 62 6c 65 28 70 51 75 65 72 79 2c 69 29 29  ouble(pQuery,i))
22bc0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72  ;.            br
22bd0 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  eak;.          }
22be0 0a 20 20 20 20 20 20 20 20 20 20 63 61 73 65 20  .          case 
22bf0 53 51 4c 49 54 45 5f 54 45 58 54 3a 20 7b 0a 20  SQLITE_TEXT: {. 
22c00 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
22c10 65 33 5f 62 69 6e 64 5f 74 65 78 74 28 70 49 6e  e3_bind_text(pIn
22c20 73 65 72 74 2c 20 69 2b 31 2c 0a 20 20 20 20 20  sert, i+1,.     
22c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22c40 20 20 20 20 20 20 20 20 28 63 6f 6e 73 74 20 63          (const c
22c50 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c  har*)sqlite3_col
22c60 75 6d 6e 5f 74 65 78 74 28 70 51 75 65 72 79 2c  umn_text(pQuery,
22c70 69 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  i),.            
22c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22c90 20 2d 31 2c 20 53 51 4c 49 54 45 5f 53 54 41 54   -1, SQLITE_STAT
22ca0 49 43 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  IC);.           
22cb0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
22cc0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 63 61    }.          ca
22cd0 73 65 20 53 51 4c 49 54 45 5f 42 4c 4f 42 3a 20  se SQLITE_BLOB: 
22ce0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
22cf0 6c 69 74 65 33 5f 62 69 6e 64 5f 62 6c 6f 62 28  lite3_bind_blob(
22d00 70 49 6e 73 65 72 74 2c 20 69 2b 31 2c 20 73 71  pInsert, i+1, sq
22d10 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f  lite3_column_blo
22d20 62 28 70 51 75 65 72 79 2c 69 29 2c 0a 20 20 20  b(pQuery,i),.   
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 20 20 20 20 20 20 20 20 20                  
22d50 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
22d60 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 28 70 51  _column_bytes(pQ
22d70 75 65 72 79 2c 69 29 2c 0a 20 20 20 20 20 20 20  uery,i),.       
22d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22da0 20 20 20 20 20 53 51 4c 49 54 45 5f 53 54 41 54       SQLITE_STAT
22db0 49 43 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  IC);.           
22dc0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
22dd0 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
22de0 20 20 20 20 7d 20 2f 2a 20 45 6e 64 20 66 6f 72      } /* End for
22df0 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73   */.      rc = s
22e00 71 6c 69 74 65 33 5f 73 74 65 70 28 70 49 6e 73  qlite3_step(pIns
22e10 65 72 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ert);.      if( 
22e20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc!=SQLITE_OK &&
22e30 20 72 63 21 3d 53 51 4c 49 54 45 5f 52 4f 57 20   rc!=SQLITE_ROW 
22e40 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f  && rc!=SQLITE_DO
22e50 4e 45 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74  NE ){.        ut
22e60 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  f8_printf(stderr
22e70 2c 20 22 45 72 72 6f 72 20 25 64 3a 20 25 73 5c  , "Error %d: %s\
22e80 6e 22 2c 20 73 71 6c 69 74 65 33 5f 65 78 74 65  n", sqlite3_exte
22e90 6e 64 65 64 5f 65 72 72 63 6f 64 65 28 6e 65 77  nded_errcode(new
22ea0 44 62 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Db),.           
22eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
22ec0 69 74 65 33 5f 65 72 72 6d 73 67 28 6e 65 77 44  ite3_errmsg(newD
22ed0 62 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  b));.      }.   
22ee0 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74     sqlite3_reset
22ef0 28 70 49 6e 73 65 72 74 29 3b 0a 20 20 20 20 20  (pInsert);.     
22f00 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 69 66   cnt++;.      if
22f10 28 20 28 63 6e 74 25 73 70 69 6e 52 61 74 65 29  ( (cnt%spinRate)
22f20 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ==0 ){.        p
22f30 72 69 6e 74 66 28 22 25 63 5c 62 22 2c 20 22 7c  rintf("%c\b", "|
22f40 2f 2d 5c 5c 22 5b 28 63 6e 74 2f 73 70 69 6e 52  /-\\"[(cnt/spinR
22f50 61 74 65 29 25 34 5d 29 3b 0a 20 20 20 20 20 20  ate)%4]);.      
22f60 20 20 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29    fflush(stdout)
22f70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20  ;.      }.    } 
22f80 2f 2a 20 45 6e 64 20 77 68 69 6c 65 20 2a 2f 0a  /* End while */.
22f90 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
22fa0 54 45 5f 44 4f 4e 45 20 29 20 62 72 65 61 6b 3b  TE_DONE ) break;
22fb0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e  .    sqlite3_fin
22fc0 61 6c 69 7a 65 28 70 51 75 65 72 79 29 3b 0a 20  alize(pQuery);. 
22fd0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
22fe0 7a 51 75 65 72 79 29 3b 0a 20 20 20 20 7a 51 75  zQuery);.    zQu
22ff0 65 72 79 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  ery = sqlite3_mp
23000 72 69 6e 74 66 28 22 53 45 4c 45 43 54 20 2a 20  rintf("SELECT * 
23010 46 52 4f 4d 20 5c 22 25 77 5c 22 20 4f 52 44 45  FROM \"%w\" ORDE
23020 52 20 42 59 20 72 6f 77 69 64 20 44 45 53 43 3b  R BY rowid DESC;
23030 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
23040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23050 7a 54 61 62 6c 65 29 3b 0a 20 20 20 20 72 63 20  zTable);.    rc 
23060 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72  = sqlite3_prepar
23070 65 5f 76 32 28 70 2d 3e 64 62 2c 20 7a 51 75 65  e_v2(p->db, zQue
23080 72 79 2c 20 2d 31 2c 20 26 70 51 75 65 72 79 2c  ry, -1, &pQuery,
23090 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20   0);.    if( rc 
230a0 29 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72  ){.      utf8_pr
230b0 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 57 61  intf(stderr, "Wa
230c0 72 6e 69 6e 67 3a 20 63 61 6e 6e 6f 74 20 73 74  rning: cannot st
230d0 65 70 20 5c 22 25 73 5c 22 20 62 61 63 6b 77 61  ep \"%s\" backwa
230e0 72 64 73 22 2c 20 7a 54 61 62 6c 65 29 3b 0a 20  rds", zTable);. 
230f0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
23100 7d 0a 20 20 7d 20 2f 2a 20 45 6e 64 20 66 6f 72  }.  } /* End for
23110 28 6b 3d 30 2e 2e 2e 29 20 2a 2f 0a 0a 65 6e 64  (k=0...) */..end
23120 5f 64 61 74 61 5f 78 66 65 72 3a 0a 20 20 73 71  _data_xfer:.  sq
23130 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
23140 51 75 65 72 79 29 3b 0a 20 20 73 71 6c 69 74 65  Query);.  sqlite
23150 33 5f 66 69 6e 61 6c 69 7a 65 28 70 49 6e 73 65  3_finalize(pInse
23160 72 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  rt);.  sqlite3_f
23170 72 65 65 28 7a 51 75 65 72 79 29 3b 0a 20 20 73  ree(zQuery);.  s
23180 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 49 6e 73  qlite3_free(zIns
23190 65 72 74 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  ert);.}.../*.** 
231a0 54 72 79 20 74 6f 20 74 72 61 6e 73 66 65 72 20  Try to transfer 
231b0 61 6c 6c 20 72 6f 77 73 20 6f 66 20 74 68 65 20  all rows of the 
231c0 73 63 68 65 6d 61 20 74 68 61 74 20 6d 61 74 63  schema that matc
231d0 68 20 7a 57 68 65 72 65 2e 20 20 46 6f 72 0a 2a  h zWhere.  For.*
231e0 2a 20 65 61 63 68 20 72 6f 77 2c 20 69 6e 76 6f  * each row, invo
231f0 6b 65 20 78 46 6f 72 45 61 63 68 28 29 20 6f 6e  ke xForEach() on
23200 20 74 68 65 20 6f 62 6a 65 63 74 20 64 65 66 69   the object defi
23210 6e 65 64 20 62 79 20 74 68 61 74 20 72 6f 77 2e  ned by that row.
23220 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
23230 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 77  is encountered w
23240 68 69 6c 65 20 6d 6f 76 69 6e 67 20 66 6f 72 77  hile moving forw
23250 61 72 64 20 74 68 72 6f 75 67 68 20 74 68 65 0a  ard through the.
23260 2a 2a 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  ** sqlite_master
23270 20 74 61 62 6c 65 2c 20 74 72 79 20 61 67 61 69   table, try agai
23280 6e 20 6d 6f 76 69 6e 67 20 62 61 63 6b 77 61 72  n moving backwar
23290 64 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ds..*/.static vo
232a0 69 64 20 74 72 79 54 6f 43 6c 6f 6e 65 53 63 68  id tryToCloneSch
232b0 65 6d 61 28 0a 20 20 53 68 65 6c 6c 53 74 61 74  ema(.  ShellStat
232c0 65 20 2a 70 2c 0a 20 20 73 71 6c 69 74 65 33 20  e *p,.  sqlite3 
232d0 2a 6e 65 77 44 62 2c 0a 20 20 63 6f 6e 73 74 20  *newDb,.  const 
232e0 63 68 61 72 20 2a 7a 57 68 65 72 65 2c 0a 20 20  char *zWhere,.  
232f0 76 6f 69 64 20 28 2a 78 46 6f 72 45 61 63 68 29  void (*xForEach)
23300 28 53 68 65 6c 6c 53 74 61 74 65 2a 2c 73 71 6c  (ShellState*,sql
23310 69 74 65 33 2a 2c 63 6f 6e 73 74 20 63 68 61 72  ite3*,const char
23320 2a 29 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  *).){.  sqlite3_
23330 73 74 6d 74 20 2a 70 51 75 65 72 79 20 3d 20 30  stmt *pQuery = 0
23340 3b 0a 20 20 63 68 61 72 20 2a 7a 51 75 65 72 79  ;.  char *zQuery
23350 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a   = 0;.  int rc;.
23360 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64    const unsigned
23370 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20   char *zName;.  
23380 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
23390 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 63 68 61  har *zSql;.  cha
233a0 72 20 2a 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a  r *zErrMsg = 0;.
233b0 0a 20 20 7a 51 75 65 72 79 20 3d 20 73 71 6c 69  .  zQuery = sqli
233c0 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 53 45 4c  te3_mprintf("SEL
233d0 45 43 54 20 6e 61 6d 65 2c 20 73 71 6c 20 46 52  ECT name, sql FR
233e0 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  OM sqlite_master
233f0 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ".              
23400 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20 57               " W
23410 48 45 52 45 20 25 73 22 2c 20 7a 57 68 65 72 65  HERE %s", zWhere
23420 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
23430 33 5f 70 72 65 70 61 72 65 5f 76 32 28 70 2d 3e  3_prepare_v2(p->
23440 64 62 2c 20 7a 51 75 65 72 79 2c 20 2d 31 2c 20  db, zQuery, -1, 
23450 26 70 51 75 65 72 79 2c 20 30 29 3b 0a 20 20 69  &pQuery, 0);.  i
23460 66 28 20 72 63 20 29 7b 0a 20 20 20 20 75 74 66  f( rc ){.    utf
23470 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  8_printf(stderr,
23480 20 22 45 72 72 6f 72 3a 20 28 25 64 29 20 25 73   "Error: (%d) %s
23490 20 6f 6e 20 5b 25 73 5d 5c 6e 22 2c 0a 20 20 20   on [%s]\n",.   
234a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
234b0 20 73 71 6c 69 74 65 33 5f 65 78 74 65 6e 64 65   sqlite3_extende
234c0 64 5f 65 72 72 63 6f 64 65 28 70 2d 3e 64 62 29  d_errcode(p->db)
234d0 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  , sqlite3_errmsg
234e0 28 70 2d 3e 64 62 29 2c 0a 20 20 20 20 20 20 20  (p->db),.       
234f0 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 51 75               zQu
23500 65 72 79 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65  ery);.    goto e
23510 6e 64 5f 73 63 68 65 6d 61 5f 78 66 65 72 3b 0a  nd_schema_xfer;.
23520 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 28 72 63    }.  while( (rc
23530 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28   = sqlite3_step(
23540 70 51 75 65 72 79 29 29 3d 3d 53 51 4c 49 54 45  pQuery))==SQLITE
23550 5f 52 4f 57 20 29 7b 0a 20 20 20 20 7a 4e 61 6d  _ROW ){.    zNam
23560 65 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  e = sqlite3_colu
23570 6d 6e 5f 74 65 78 74 28 70 51 75 65 72 79 2c 20  mn_text(pQuery, 
23580 30 29 3b 0a 20 20 20 20 7a 53 71 6c 20 3d 20 73  0);.    zSql = s
23590 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
235a0 78 74 28 70 51 75 65 72 79 2c 20 31 29 3b 0a 20  xt(pQuery, 1);. 
235b0 20 20 20 70 72 69 6e 74 66 28 22 25 73 2e 2e 2e     printf("%s...
235c0 20 22 2c 20 7a 4e 61 6d 65 29 3b 20 66 66 6c 75   ", zName); fflu
235d0 73 68 28 73 74 64 6f 75 74 29 3b 0a 20 20 20 20  sh(stdout);.    
235e0 73 71 6c 69 74 65 33 5f 65 78 65 63 28 6e 65 77  sqlite3_exec(new
235f0 44 62 2c 20 28 63 6f 6e 73 74 20 63 68 61 72 2a  Db, (const char*
23600 29 7a 53 71 6c 2c 20 30 2c 20 30 2c 20 26 7a 45  )zSql, 0, 0, &zE
23610 72 72 4d 73 67 29 3b 0a 20 20 20 20 69 66 28 20  rrMsg);.    if( 
23620 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20 20  zErrMsg ){.     
23630 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64   utf8_printf(std
23640 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 25 73 5c  err, "Error: %s\
23650 6e 53 51 4c 3a 20 5b 25 73 5d 5c 6e 22 2c 20 7a  nSQL: [%s]\n", z
23660 45 72 72 4d 73 67 2c 20 7a 53 71 6c 29 3b 0a 20  ErrMsg, zSql);. 
23670 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
23680 65 28 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20  e(zErrMsg);.    
23690 20 20 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20    zErrMsg = 0;. 
236a0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 78 46 6f     }.    if( xFo
236b0 72 45 61 63 68 20 29 7b 0a 20 20 20 20 20 20 78  rEach ){.      x
236c0 46 6f 72 45 61 63 68 28 70 2c 20 6e 65 77 44 62  ForEach(p, newDb
236d0 2c 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 7a  , (const char*)z
236e0 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Name);.    }.   
236f0 20 70 72 69 6e 74 66 28 22 64 6f 6e 65 5c 6e 22   printf("done\n"
23700 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21  );.  }.  if( rc!
23710 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a  =SQLITE_DONE ){.
23720 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61      sqlite3_fina
23730 6c 69 7a 65 28 70 51 75 65 72 79 29 3b 0a 20 20  lize(pQuery);.  
23740 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
23750 51 75 65 72 79 29 3b 0a 20 20 20 20 7a 51 75 65  Query);.    zQue
23760 72 79 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  ry = sqlite3_mpr
23770 69 6e 74 66 28 22 53 45 4c 45 43 54 20 6e 61 6d  intf("SELECT nam
23780 65 2c 20 73 71 6c 20 46 52 4f 4d 20 73 71 6c 69  e, sql FROM sqli
23790 74 65 5f 6d 61 73 74 65 72 22 0a 20 20 20 20 20  te_master".     
237a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
237b0 20 20 20 20 20 20 20 20 22 20 57 48 45 52 45 20          " WHERE 
237c0 25 73 20 4f 52 44 45 52 20 42 59 20 72 6f 77 69  %s ORDER BY rowi
237d0 64 20 44 45 53 43 22 2c 20 7a 57 68 65 72 65 29  d DESC", zWhere)
237e0 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
237f0 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 70 2d  e3_prepare_v2(p-
23800 3e 64 62 2c 20 7a 51 75 65 72 79 2c 20 2d 31 2c  >db, zQuery, -1,
23810 20 26 70 51 75 65 72 79 2c 20 30 29 3b 0a 20 20   &pQuery, 0);.  
23820 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
23830 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74    utf8_printf(st
23840 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 28 25  derr, "Error: (%
23850 64 29 20 25 73 20 6f 6e 20 5b 25 73 5d 5c 6e 22  d) %s on [%s]\n"
23860 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
23870 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
23880 65 78 74 65 6e 64 65 64 5f 65 72 72 63 6f 64 65  extended_errcode
23890 28 70 2d 3e 64 62 29 2c 20 73 71 6c 69 74 65 33  (p->db), sqlite3
238a0 5f 65 72 72 6d 73 67 28 70 2d 3e 64 62 29 2c 0a  _errmsg(p->db),.
238b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
238c0 20 20 20 20 20 20 7a 51 75 65 72 79 29 3b 0a 20        zQuery);. 
238d0 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 73 63       goto end_sc
238e0 68 65 6d 61 5f 78 66 65 72 3b 0a 20 20 20 20 7d  hema_xfer;.    }
238f0 0a 20 20 20 20 77 68 69 6c 65 28 20 28 72 63 20  .    while( (rc 
23900 3d 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70  = sqlite3_step(p
23910 51 75 65 72 79 29 29 3d 3d 53 51 4c 49 54 45 5f  Query))==SQLITE_
23920 52 4f 57 20 29 7b 0a 20 20 20 20 20 20 7a 4e 61  ROW ){.      zNa
23930 6d 65 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  me = sqlite3_col
23940 75 6d 6e 5f 74 65 78 74 28 70 51 75 65 72 79 2c  umn_text(pQuery,
23950 20 30 29 3b 0a 20 20 20 20 20 20 7a 53 71 6c 20   0);.      zSql 
23960 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
23970 5f 74 65 78 74 28 70 51 75 65 72 79 2c 20 31 29  _text(pQuery, 1)
23980 3b 0a 20 20 20 20 20 20 70 72 69 6e 74 66 28 22  ;.      printf("
23990 25 73 2e 2e 2e 20 22 2c 20 7a 4e 61 6d 65 29 3b  %s... ", zName);
239a0 20 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29 3b   fflush(stdout);
239b0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65  .      sqlite3_e
239c0 78 65 63 28 6e 65 77 44 62 2c 20 28 63 6f 6e 73  xec(newDb, (cons
239d0 74 20 63 68 61 72 2a 29 7a 53 71 6c 2c 20 30 2c  t char*)zSql, 0,
239e0 20 30 2c 20 26 7a 45 72 72 4d 73 67 29 3b 0a 20   0, &zErrMsg);. 
239f0 20 20 20 20 20 69 66 28 20 7a 45 72 72 4d 73 67       if( zErrMsg
23a00 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38   ){.        utf8
23a10 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
23a20 22 45 72 72 6f 72 3a 20 25 73 5c 6e 53 51 4c 3a  "Error: %s\nSQL:
23a30 20 5b 25 73 5d 5c 6e 22 2c 20 7a 45 72 72 4d 73   [%s]\n", zErrMs
23a40 67 2c 20 7a 53 71 6c 29 3b 0a 20 20 20 20 20 20  g, zSql);.      
23a50 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
23a60 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 20  ErrMsg);.       
23a70 20 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20   zErrMsg = 0;.  
23a80 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
23a90 78 46 6f 72 45 61 63 68 20 29 7b 0a 20 20 20 20  xForEach ){.    
23aa0 20 20 20 20 78 46 6f 72 45 61 63 68 28 70 2c 20      xForEach(p, 
23ab0 6e 65 77 44 62 2c 20 28 63 6f 6e 73 74 20 63 68  newDb, (const ch
23ac0 61 72 2a 29 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ar*)zName);.    
23ad0 20 20 7d 0a 20 20 20 20 20 20 70 72 69 6e 74 66    }.      printf
23ae0 28 22 64 6f 6e 65 5c 6e 22 29 3b 0a 20 20 20 20  ("done\n");.    
23af0 7d 0a 20 20 7d 0a 65 6e 64 5f 73 63 68 65 6d 61  }.  }.end_schema
23b00 5f 78 66 65 72 3a 0a 20 20 73 71 6c 69 74 65 33  _xfer:.  sqlite3
23b10 5f 66 69 6e 61 6c 69 7a 65 28 70 51 75 65 72 79  _finalize(pQuery
23b20 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
23b30 65 28 7a 51 75 65 72 79 29 3b 0a 7d 0a 0a 2f 2a  e(zQuery);.}../*
23b40 0a 2a 2a 20 4f 70 65 6e 20 61 20 6e 65 77 20 64  .** Open a new d
23b50 61 74 61 62 61 73 65 20 66 69 6c 65 20 6e 61 6d  atabase file nam
23b60 65 64 20 22 7a 4e 65 77 44 62 22 2e 20 20 54 72  ed "zNewDb".  Tr
23b70 79 20 74 6f 20 72 65 63 6f 76 65 72 20 61 73 20  y to recover as 
23b80 6d 75 63 68 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  much information
23b90 0a 2a 2a 20 61 73 20 70 6f 73 73 69 62 6c 65 20  .** as possible 
23ba0 6f 75 74 20 6f 66 20 74 68 65 20 6d 61 69 6e 20  out of the main 
23bb0 64 61 74 61 62 61 73 65 20 28 77 68 69 63 68 20  database (which 
23bc0 6d 69 67 68 74 20 62 65 20 63 6f 72 72 75 70 74  might be corrupt
23bd0 29 20 61 6e 64 20 77 72 69 74 65 20 69 74 0a 2a  ) and write it.*
23be0 2a 20 69 6e 74 6f 20 7a 4e 65 77 44 62 2e 0a 2a  * into zNewDb..*
23bf0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74 72  /.static void tr
23c00 79 54 6f 43 6c 6f 6e 65 28 53 68 65 6c 6c 53 74  yToClone(ShellSt
23c10 61 74 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68  ate *p, const ch
23c20 61 72 20 2a 7a 4e 65 77 44 62 29 7b 0a 20 20 69  ar *zNewDb){.  i
23c30 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33  nt rc;.  sqlite3
23c40 20 2a 6e 65 77 44 62 20 3d 20 30 3b 0a 20 20 69   *newDb = 0;.  i
23c50 66 28 20 61 63 63 65 73 73 28 7a 4e 65 77 44 62  f( access(zNewDb
23c60 2c 30 29 3d 3d 30 20 29 7b 0a 20 20 20 20 75 74  ,0)==0 ){.    ut
23c70 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  f8_printf(stderr
23c80 2c 20 22 46 69 6c 65 20 5c 22 25 73 5c 22 20 61  , "File \"%s\" a
23c90 6c 72 65 61 64 79 20 65 78 69 73 74 73 2e 5c 6e  lready exists.\n
23ca0 22 2c 20 7a 4e 65 77 44 62 29 3b 0a 20 20 20 20  ", zNewDb);.    
23cb0 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 72 63  return;.  }.  rc
23cc0 20 3d 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28   = sqlite3_open(
23cd0 7a 4e 65 77 44 62 2c 20 26 6e 65 77 44 62 29 3b  zNewDb, &newDb);
23ce0 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20  .  if( rc ){.   
23cf0 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64   utf8_printf(std
23d00 65 72 72 2c 20 22 43 61 6e 6e 6f 74 20 63 72 65  err, "Cannot cre
23d10 61 74 65 20 6f 75 74 70 75 74 20 64 61 74 61 62  ate output datab
23d20 61 73 65 3a 20 25 73 5c 6e 22 2c 0a 20 20 20 20  ase: %s\n",.    
23d30 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
23d40 65 72 72 6d 73 67 28 6e 65 77 44 62 29 29 3b 0a  errmsg(newDb));.
23d50 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
23d60 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c  ite3_exec(p->db,
23d70 20 22 50 52 41 47 4d 41 20 77 72 69 74 61 62 6c   "PRAGMA writabl
23d80 65 5f 73 63 68 65 6d 61 3d 4f 4e 3b 22 2c 20 30  e_schema=ON;", 0
23d90 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  , 0, 0);.    sql
23da0 69 74 65 33 5f 65 78 65 63 28 6e 65 77 44 62 2c  ite3_exec(newDb,
23db0 20 22 42 45 47 49 4e 20 45 58 43 4c 55 53 49 56   "BEGIN EXCLUSIV
23dc0 45 3b 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  E;", 0, 0, 0);. 
23dd0 20 20 20 74 72 79 54 6f 43 6c 6f 6e 65 53 63 68     tryToCloneSch
23de0 65 6d 61 28 70 2c 20 6e 65 77 44 62 2c 20 22 74  ema(p, newDb, "t
23df0 79 70 65 3d 27 74 61 62 6c 65 27 22 2c 20 74 72  ype='table'", tr
23e00 79 54 6f 43 6c 6f 6e 65 44 61 74 61 29 3b 0a 20  yToCloneData);. 
23e10 20 20 20 74 72 79 54 6f 43 6c 6f 6e 65 53 63 68     tryToCloneSch
23e20 65 6d 61 28 70 2c 20 6e 65 77 44 62 2c 20 22 74  ema(p, newDb, "t
23e30 79 70 65 21 3d 27 74 61 62 6c 65 27 22 2c 20 30  ype!='table'", 0
23e40 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 65  );.    sqlite3_e
23e50 78 65 63 28 6e 65 77 44 62 2c 20 22 43 4f 4d 4d  xec(newDb, "COMM
23e60 49 54 3b 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  IT;", 0, 0, 0);.
23e70 20 20 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63      sqlite3_exec
23e80 28 70 2d 3e 64 62 2c 20 22 50 52 41 47 4d 41 20  (p->db, "PRAGMA 
23e90 77 72 69 74 61 62 6c 65 5f 73 63 68 65 6d 61 3d  writable_schema=
23ea0 4f 46 46 3b 22 2c 20 30 2c 20 30 2c 20 30 29 3b  OFF;", 0, 0, 0);
23eb0 0a 20 20 7d 0a 20 20 63 6c 6f 73 65 5f 64 62 28  .  }.  close_db(
23ec0 6e 65 77 44 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  newDb);.}../*.**
23ed0 20 43 68 61 6e 67 65 20 74 68 65 20 6f 75 74 70   Change the outp
23ee0 75 74 20 66 69 6c 65 20 62 61 63 6b 20 74 6f 20  ut file back to 
23ef0 73 74 64 6f 75 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  stdout..**.** If
23f00 20 74 68 65 20 70 2d 3e 64 6f 58 64 67 4f 70 65   the p->doXdgOpe
23f10 6e 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 74  n flag is set, t
23f20 68 61 74 20 6d 65 61 6e 73 20 74 68 65 20 6f 75  hat means the ou
23f30 74 70 75 74 20 77 61 73 20 62 65 69 6e 67 0a 2a  tput was being.*
23f40 2a 20 72 65 64 69 72 65 63 74 65 64 20 74 6f 20  * redirected to 
23f50 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  a temporary file
23f60 20 6e 61 6d 65 64 20 62 79 20 70 2d 3e 7a 54 65   named by p->zTe
23f70 6d 70 46 69 6c 65 2e 20 20 49 6e 20 74 68 61 74  mpFile.  In that
23f80 20 63 61 73 65 2c 0a 2a 2a 20 6c 61 75 6e 63 68   case,.** launch
23f90 20 73 74 61 72 74 2f 6f 70 65 6e 2f 78 64 67 2d   start/open/xdg-
23fa0 6f 70 65 6e 20 6f 6e 20 74 68 61 74 20 74 65 6d  open on that tem
23fb0 70 6f 72 61 72 79 20 66 69 6c 65 2e 0a 2a 2f 0a  porary file..*/.
23fc0 73 74 61 74 69 63 20 76 6f 69 64 20 6f 75 74 70  static void outp
23fd0 75 74 5f 72 65 73 65 74 28 53 68 65 6c 6c 53 74  ut_reset(ShellSt
23fe0 61 74 65 20 2a 70 29 7b 0a 20 20 69 66 28 20 70  ate *p){.  if( p
23ff0 2d 3e 6f 75 74 66 69 6c 65 5b 30 5d 3d 3d 27 7c  ->outfile[0]=='|
24000 27 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  ' ){.#ifndef SQL
24010 49 54 45 5f 4f 4d 49 54 5f 50 4f 50 45 4e 0a 20  ITE_OMIT_POPEN. 
24020 20 20 20 70 63 6c 6f 73 65 28 70 2d 3e 6f 75 74     pclose(p->out
24030 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 65 6c 73  );.#endif.  }els
24040 65 7b 0a 20 20 20 20 6f 75 74 70 75 74 5f 66 69  e{.    output_fi
24050 6c 65 5f 63 6c 6f 73 65 28 70 2d 3e 6f 75 74 29  le_close(p->out)
24060 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
24070 5f 4e 4f 48 41 56 45 5f 53 59 53 54 45 4d 0a 20  _NOHAVE_SYSTEM. 
24080 20 20 20 69 66 28 20 70 2d 3e 64 6f 58 64 67 4f     if( p->doXdgO
24090 70 65 6e 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e  pen ){.      con
240a0 73 74 20 63 68 61 72 20 2a 7a 58 64 67 4f 70 65  st char *zXdgOpe
240b0 6e 43 6d 64 20 3d 0a 23 69 66 20 64 65 66 69 6e  nCmd =.#if defin
240c0 65 64 28 5f 57 49 4e 33 32 29 0a 20 20 20 20 20  ed(_WIN32).     
240d0 20 22 73 74 61 72 74 22 3b 0a 23 65 6c 69 66 20   "start";.#elif 
240e0 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
240f0 5f 29 0a 20 20 20 20 20 20 22 6f 70 65 6e 22 3b  _).      "open";
24100 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 22 78 64  .#else.      "xd
24110 67 2d 6f 70 65 6e 22 3b 0a 23 65 6e 64 69 66 0a  g-open";.#endif.
24120 20 20 20 20 20 20 63 68 61 72 20 2a 7a 43 6d 64        char *zCmd
24130 3b 0a 20 20 20 20 20 20 7a 43 6d 64 20 3d 20 73  ;.      zCmd = s
24140 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
24150 25 73 20 25 73 22 2c 20 7a 58 64 67 4f 70 65 6e  %s %s", zXdgOpen
24160 43 6d 64 2c 20 70 2d 3e 7a 54 65 6d 70 46 69 6c  Cmd, p->zTempFil
24170 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 79  e);.      if( sy
24180 73 74 65 6d 28 7a 43 6d 64 29 20 29 7b 0a 20 20  stem(zCmd) ){.  
24190 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
241a0 66 28 73 74 64 65 72 72 2c 20 22 46 61 69 6c 65  f(stderr, "Faile
241b0 64 3a 20 5b 25 73 5d 5c 6e 22 2c 20 7a 43 6d 64  d: [%s]\n", zCmd
241c0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
241d0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43   sqlite3_free(zC
241e0 6d 64 29 3b 0a 20 20 20 20 20 20 6f 75 74 70 75  md);.      outpu
241f0 74 4d 6f 64 65 50 6f 70 28 70 29 3b 0a 20 20 20  tModePop(p);.   
24200 20 20 20 70 2d 3e 64 6f 58 64 67 4f 70 65 6e 20     p->doXdgOpen 
24210 3d 20 30 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  = 0;.    }.#endi
24220 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51  f /* !defined(SQ
24230 4c 49 54 45 5f 4e 4f 48 41 56 45 5f 53 59 53 54  LITE_NOHAVE_SYST
24240 45 4d 29 20 2a 2f 0a 20 20 7d 0a 20 20 70 2d 3e  EM) */.  }.  p->
24250 6f 75 74 66 69 6c 65 5b 30 5d 20 3d 20 30 3b 0a  outfile[0] = 0;.
24260 20 20 70 2d 3e 6f 75 74 20 3d 20 73 74 64 6f 75    p->out = stdou
24270 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 75 6e 20  t;.}../*.** Run 
24280 61 6e 20 53 51 4c 20 63 6f 6d 6d 61 6e 64 20 61  an SQL command a
24290 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20 73 69  nd return the si
242a0 6e 67 6c 65 20 69 6e 74 65 67 65 72 20 72 65 73  ngle integer res
242b0 75 6c 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ult..*/.static i
242c0 6e 74 20 64 62 5f 69 6e 74 28 53 68 65 6c 6c 53  nt db_int(ShellS
242d0 74 61 74 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63  tate *p, const c
242e0 68 61 72 20 2a 7a 53 71 6c 29 7b 0a 20 20 73 71  har *zSql){.  sq
242f0 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
24300 74 3b 0a 20 20 69 6e 74 20 72 65 73 20 3d 20 30  t;.  int res = 0
24310 3b 0a 20 20 73 71 6c 69 74 65 33 5f 70 72 65 70  ;.  sqlite3_prep
24320 61 72 65 5f 76 32 28 70 2d 3e 64 62 2c 20 7a 53  are_v2(p->db, zS
24330 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20  ql, -1, &pStmt, 
24340 30 29 3b 0a 20 20 69 66 28 20 70 53 74 6d 74 20  0);.  if( pStmt 
24350 26 26 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28  && sqlite3_step(
24360 70 53 74 6d 74 29 3d 3d 53 51 4c 49 54 45 5f 52  pStmt)==SQLITE_R
24370 4f 57 20 29 7b 0a 20 20 20 20 72 65 73 20 3d 20  OW ){.    res = 
24380 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69  sqlite3_column_i
24390 6e 74 28 70 53 74 6d 74 2c 30 29 3b 0a 20 20 7d  nt(pStmt,0);.  }
243a0 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c  .  sqlite3_final
243b0 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 72 65  ize(pStmt);.  re
243c0 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a  turn res;.}../*.
243d0 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20 32 2d 62  ** Convert a 2-b
243e0 79 74 65 20 6f 72 20 34 2d 62 79 74 65 20 62 69  yte or 4-byte bi
243f0 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72  g-endian integer
24400 20 69 6e 74 6f 20 61 20 6e 61 74 69 76 65 20 69   into a native i
24410 6e 74 65 67 65 72 0a 2a 2f 0a 73 74 61 74 69 63  nteger.*/.static
24420 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 67 65   unsigned int ge
24430 74 32 62 79 74 65 49 6e 74 28 75 6e 73 69 67 6e  t2byteInt(unsign
24440 65 64 20 63 68 61 72 20 2a 61 29 7b 0a 20 20 72  ed char *a){.  r
24450 65 74 75 72 6e 20 28 61 5b 30 5d 3c 3c 38 29 20  eturn (a[0]<<8) 
24460 2b 20 61 5b 31 5d 3b 0a 7d 0a 73 74 61 74 69 63  + a[1];.}.static
24470 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 67 65   unsigned int ge
24480 74 34 62 79 74 65 49 6e 74 28 75 6e 73 69 67 6e  t4byteInt(unsign
24490 65 64 20 63 68 61 72 20 2a 61 29 7b 0a 20 20 72  ed char *a){.  r
244a0 65 74 75 72 6e 20 28 61 5b 30 5d 3c 3c 32 34 29  eturn (a[0]<<24)
244b0 20 2b 20 28 61 5b 31 5d 3c 3c 31 36 29 20 2b 20   + (a[1]<<16) + 
244c0 28 61 5b 32 5d 3c 3c 38 29 20 2b 20 61 5b 33 5d  (a[2]<<8) + a[3]
244d0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65  ;.}../*.** Imple
244e0 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  mentation of the
244f0 20 22 2e 69 6e 66 6f 22 20 63 6f 6d 6d 61 6e 64   ".info" command
24500 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 31  ..**.** Return 1
24510 20 6f 6e 20 65 72 72 6f 72 2c 20 32 20 74 6f 20   on error, 2 to 
24520 65 78 69 74 2c 20 61 6e 64 20 30 20 6f 74 68 65  exit, and 0 othe
24530 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  rwise..*/.static
24540 20 69 6e 74 20 73 68 65 6c 6c 5f 64 62 69 6e 66   int shell_dbinf
24550 6f 5f 63 6f 6d 6d 61 6e 64 28 53 68 65 6c 6c 53  o_command(ShellS
24560 74 61 74 65 20 2a 70 2c 20 69 6e 74 20 6e 41 72  tate *p, int nAr
24570 67 2c 20 63 68 61 72 20 2a 2a 61 7a 41 72 67 29  g, char **azArg)
24580 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  {.  static const
24590 20 73 74 72 75 63 74 20 7b 20 63 6f 6e 73 74 20   struct { const 
245a0 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 69 6e 74  char *zName; int
245b0 20 6f 66 73 74 3b 20 7d 20 61 46 69 65 6c 64 5b   ofst; } aField[
245c0 5d 20 3d 20 7b 0a 20 20 20 20 20 7b 20 22 66 69  ] = {.     { "fi
245d0 6c 65 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65  le change counte
245e0 72 3a 22 2c 20 20 32 34 20 20 7d 2c 0a 20 20 20  r:",  24  },.   
245f0 20 20 7b 20 22 64 61 74 61 62 61 73 65 20 70 61    { "database pa
24600 67 65 20 63 6f 75 6e 74 3a 22 2c 20 20 32 38 20  ge count:",  28 
24610 20 7d 2c 0a 20 20 20 20 20 7b 20 22 66 72 65 65   },.     { "free
24620 6c 69 73 74 20 70 61 67 65 20 63 6f 75 6e 74 3a  list page count:
24630 22 2c 20 20 33 36 20 20 7d 2c 0a 20 20 20 20 20  ",  36  },.     
24640 7b 20 22 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65  { "schema cookie
24650 3a 22 2c 20 20 20 20 20 20 20 20 34 30 20 20 7d  :",        40  }
24660 2c 0a 20 20 20 20 20 7b 20 22 73 63 68 65 6d 61  ,.     { "schema
24670 20 66 6f 72 6d 61 74 3a 22 2c 20 20 20 20 20 20   format:",      
24680 20 20 34 34 20 20 7d 2c 0a 20 20 20 20 20 7b 20    44  },.     { 
24690 22 64 65 66 61 75 6c 74 20 63 61 63 68 65 20 73  "default cache s
246a0 69 7a 65 3a 22 2c 20 20 20 34 38 20 20 7d 2c 0a  ize:",   48  },.
246b0 20 20 20 20 20 7b 20 22 61 75 74 6f 76 61 63 75       { "autovacu
246c0 75 6d 20 74 6f 70 20 72 6f 6f 74 3a 22 2c 20 20  um top root:",  
246d0 35 32 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 69  52  },.     { "i
246e0 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75  ncremental vacuu
246f0 6d 3a 22 2c 20 20 20 36 34 20 20 7d 2c 0a 20 20  m:",   64  },.  
24700 20 20 20 7b 20 22 74 65 78 74 20 65 6e 63 6f 64     { "text encod
24710 69 6e 67 3a 22 2c 20 20 20 20 20 20 20 20 35 36  ing:",        56
24720 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 75 73 65    },.     { "use
24730 72 20 76 65 72 73 69 6f 6e 3a 22 2c 20 20 20 20  r version:",    
24740 20 20 20 20 20 36 30 20 20 7d 2c 0a 20 20 20 20       60  },.    
24750 20 7b 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 20   { "application 
24760 69 64 3a 22 2c 20 20 20 20 20 20 20 36 38 20 20  id:",       68  
24770 7d 2c 0a 20 20 20 20 20 7b 20 22 73 6f 66 74 77  },.     { "softw
24780 61 72 65 20 76 65 72 73 69 6f 6e 3a 22 2c 20 20  are version:",  
24790 20 20 20 39 36 20 20 7d 2c 0a 20 20 7d 3b 0a 20     96  },.  };. 
247a0 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 74   static const st
247b0 72 75 63 74 20 7b 20 63 6f 6e 73 74 20 63 68 61  ruct { const cha
247c0 72 20 2a 7a 4e 61 6d 65 3b 20 63 6f 6e 73 74 20  r *zName; const 
247d0 63 68 61 72 20 2a 7a 53 71 6c 3b 20 7d 20 61 51  char *zSql; } aQ
247e0 75 65 72 79 5b 5d 20 3d 20 7b 0a 20 20 20 20 20  uery[] = {.     
247f0 7b 20 22 6e 75 6d 62 65 72 20 6f 66 20 74 61 62  { "number of tab
24800 6c 65 73 3a 22 2c 0a 20 20 20 20 20 20 20 22 53  les:",.       "S
24810 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46  ELECT count(*) F
24820 52 4f 4d 20 25 73 20 57 48 45 52 45 20 74 79 70  ROM %s WHERE typ
24830 65 3d 27 74 61 62 6c 65 27 22 20 7d 2c 0a 20 20  e='table'" },.  
24840 20 20 20 7b 20 22 6e 75 6d 62 65 72 20 6f 66 20     { "number of 
24850 69 6e 64 65 78 65 73 3a 22 2c 0a 20 20 20 20 20  indexes:",.     
24860 20 20 22 53 45 4c 45 43 54 20 63 6f 75 6e 74 28    "SELECT count(
24870 2a 29 20 46 52 4f 4d 20 25 73 20 57 48 45 52 45  *) FROM %s WHERE
24880 20 74 79 70 65 3d 27 69 6e 64 65 78 27 22 20 7d   type='index'" }
24890 2c 0a 20 20 20 20 20 7b 20 22 6e 75 6d 62 65 72  ,.     { "number
248a0 20 6f 66 20 74 72 69 67 67 65 72 73 3a 22 2c 0a   of triggers:",.
248b0 20 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 63         "SELECT c
248c0 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 25 73 20  ount(*) FROM %s 
248d0 57 48 45 52 45 20 74 79 70 65 3d 27 74 72 69 67  WHERE type='trig
248e0 67 65 72 27 22 20 7d 2c 0a 20 20 20 20 20 7b 20  ger'" },.     { 
248f0 22 6e 75 6d 62 65 72 20 6f 66 20 76 69 65 77 73  "number of views
24900 3a 22 2c 0a 20 20 20 20 20 20 20 22 53 45 4c 45  :",.       "SELE
24910 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d  CT count(*) FROM
24920 20 25 73 20 57 48 45 52 45 20 74 79 70 65 3d 27   %s WHERE type='
24930 76 69 65 77 27 22 20 7d 2c 0a 20 20 20 20 20 7b  view'" },.     {
24940 20 22 73 63 68 65 6d 61 20 73 69 7a 65 3a 22 2c   "schema size:",
24950 0a 20 20 20 20 20 20 20 22 53 45 4c 45 43 54 20  .       "SELECT 
24960 74 6f 74 61 6c 28 6c 65 6e 67 74 68 28 73 71 6c  total(length(sql
24970 29 29 20 46 52 4f 4d 20 25 73 22 20 7d 2c 0a 20  )) FROM %s" },. 
24980 20 7d 3b 0a 20 20 69 6e 74 20 69 2c 20 72 63 3b   };.  int i, rc;
24990 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 44 61 74  .  unsigned iDat
249a0 61 56 65 72 73 69 6f 6e 3b 0a 20 20 63 68 61 72  aVersion;.  char
249b0 20 2a 7a 53 63 68 65 6d 61 54 61 62 3b 0a 20 20   *zSchemaTab;.  
249c0 63 68 61 72 20 2a 7a 44 62 20 3d 20 6e 41 72 67  char *zDb = nArg
249d0 3e 3d 32 20 3f 20 61 7a 41 72 67 5b 31 5d 20 3a  >=2 ? azArg[1] :
249e0 20 22 6d 61 69 6e 22 3b 0a 20 20 73 71 6c 69 74   "main";.  sqlit
249f0 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d  e3_stmt *pStmt =
24a00 20 30 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   0;.  unsigned c
24a10 68 61 72 20 61 48 64 72 5b 31 30 30 5d 3b 0a 20  har aHdr[100];. 
24a20 20 6f 70 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a   open_db(p, 0);.
24a30 20 20 69 66 28 20 70 2d 3e 64 62 3d 3d 30 20 29    if( p->db==0 )
24a40 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 72 63 20   return 1;.  rc 
24a50 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72  = sqlite3_prepar
24a60 65 5f 76 32 28 70 2d 3e 64 62 2c 0a 20 20 20 20  e_v2(p->db,.    
24a70 20 20 20 20 20 20 20 20 20 22 53 45 4c 45 43 54           "SELECT
24a80 20 64 61 74 61 20 46 52 4f 4d 20 73 71 6c 69 74   data FROM sqlit
24a90 65 5f 64 62 70 61 67 65 28 3f 31 29 20 57 48 45  e_dbpage(?1) WHE
24aa0 52 45 20 70 67 6e 6f 3d 31 22 2c 0a 20 20 20 20  RE pgno=1",.    
24ab0 20 20 20 20 20 20 20 20 20 2d 31 2c 20 26 70 53           -1, &pS
24ac0 74 6d 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  tmt, 0);.  if( r
24ad0 63 20 29 7b 0a 20 20 20 20 69 66 28 20 21 73 71  c ){.    if( !sq
24ae0 6c 69 74 65 33 5f 63 6f 6d 70 69 6c 65 6f 70 74  lite3_compileopt
24af0 69 6f 6e 5f 75 73 65 64 28 22 45 4e 41 42 4c 45  ion_used("ENABLE
24b00 5f 44 42 50 41 47 45 5f 56 54 41 42 22 29 20 29  _DBPAGE_VTAB") )
24b10 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69  {.      utf8_pri
24b20 6e 74 66 28 73 74 64 65 72 72 2c 20 22 74 68 65  ntf(stderr, "the
24b30 20 5c 22 2e 64 62 69 6e 66 6f 5c 22 20 63 6f 6d   \".dbinfo\" com
24b40 6d 61 6e 64 20 72 65 71 75 69 72 65 73 20 74 68  mand requires th
24b50 65 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  e ".            
24b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d                "-
24b70 44 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 44  DSQLITE_ENABLE_D
24b80 42 50 41 47 45 5f 56 54 41 42 20 63 6f 6d 70 69  BPAGE_VTAB compi
24b90 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 73 5c  le-time options\
24ba0 6e 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  n");.    }else{.
24bb0 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
24bc0 66 28 73 74 64 65 72 72 2c 20 22 65 72 72 6f 72  f(stderr, "error
24bd0 3a 20 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65 33  : %s\n", sqlite3
24be0 5f 65 72 72 6d 73 67 28 70 2d 3e 64 62 29 29 3b  _errmsg(p->db));
24bf0 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
24c00 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d  e3_finalize(pStm
24c10 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31  t);.    return 1
24c20 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
24c30 62 69 6e 64 5f 74 65 78 74 28 70 53 74 6d 74 2c  bind_text(pStmt,
24c40 20 31 2c 20 7a 44 62 2c 20 2d 31 2c 20 53 51 4c   1, zDb, -1, SQL
24c50 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 69  ITE_STATIC);.  i
24c60 66 28 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28  f( sqlite3_step(
24c70 70 53 74 6d 74 29 3d 3d 53 51 4c 49 54 45 5f 52  pStmt)==SQLITE_R
24c80 4f 57 0a 20 20 20 26 26 20 73 71 6c 69 74 65 33  OW.   && sqlite3
24c90 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 28 70 53  _column_bytes(pS
24ca0 74 6d 74 2c 30 29 3e 31 30 30 0a 20 20 29 7b 0a  tmt,0)>100.  ){.
24cb0 20 20 20 20 6d 65 6d 63 70 79 28 61 48 64 72 2c      memcpy(aHdr,
24cc0 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
24cd0 62 6c 6f 62 28 70 53 74 6d 74 2c 30 29 2c 20 31  blob(pStmt,0), 1
24ce0 30 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  00);.    sqlite3
24cf0 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29  _finalize(pStmt)
24d00 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
24d10 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  aw_printf(stderr
24d20 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 72 65 61  , "unable to rea
24d30 64 20 64 61 74 61 62 61 73 65 20 68 65 61 64 65  d database heade
24d40 72 5c 6e 22 29 3b 0a 20 20 20 20 73 71 6c 69 74  r\n");.    sqlit
24d50 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d  e3_finalize(pStm
24d60 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31  t);.    return 1
24d70 3b 0a 20 20 7d 0a 20 20 69 20 3d 20 67 65 74 32  ;.  }.  i = get2
24d80 62 79 74 65 49 6e 74 28 61 48 64 72 2b 31 36 29  byteInt(aHdr+16)
24d90 3b 0a 20 20 69 66 28 20 69 3d 3d 31 20 29 20 69  ;.  if( i==1 ) i
24da0 20 3d 20 36 35 35 33 36 3b 0a 20 20 75 74 66 38   = 65536;.  utf8
24db0 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
24dc0 22 25 2d 32 30 73 20 25 64 5c 6e 22 2c 20 22 64  "%-20s %d\n", "d
24dd0 61 74 61 62 61 73 65 20 70 61 67 65 20 73 69 7a  atabase page siz
24de0 65 3a 22 2c 20 69 29 3b 0a 20 20 75 74 66 38 5f  e:", i);.  utf8_
24df0 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
24e00 25 2d 32 30 73 20 25 64 5c 6e 22 2c 20 22 77 72  %-20s %d\n", "wr
24e10 69 74 65 20 66 6f 72 6d 61 74 3a 22 2c 20 61 48  ite format:", aH
24e20 64 72 5b 31 38 5d 29 3b 0a 20 20 75 74 66 38 5f  dr[18]);.  utf8_
24e30 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
24e40 25 2d 32 30 73 20 25 64 5c 6e 22 2c 20 22 72 65  %-20s %d\n", "re
24e50 61 64 20 66 6f 72 6d 61 74 3a 22 2c 20 61 48 64  ad format:", aHd
24e60 72 5b 31 39 5d 29 3b 0a 20 20 75 74 66 38 5f 70  r[19]);.  utf8_p
24e70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25  rintf(p->out, "%
24e80 2d 32 30 73 20 25 64 5c 6e 22 2c 20 22 72 65 73  -20s %d\n", "res
24e90 65 72 76 65 64 20 62 79 74 65 73 3a 22 2c 20 61  erved bytes:", a
24ea0 48 64 72 5b 32 30 5d 29 3b 0a 20 20 66 6f 72 28  Hdr[20]);.  for(
24eb0 69 3d 30 3b 20 69 3c 41 72 72 61 79 53 69 7a 65  i=0; i<ArraySize
24ec0 28 61 46 69 65 6c 64 29 3b 20 69 2b 2b 29 7b 0a  (aField); i++){.
24ed0 20 20 20 20 69 6e 74 20 6f 66 73 74 20 3d 20 61      int ofst = a
24ee0 46 69 65 6c 64 5b 69 5d 2e 6f 66 73 74 3b 0a 20  Field[i].ofst;. 
24ef0 20 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20     unsigned int 
24f00 76 61 6c 20 3d 20 67 65 74 34 62 79 74 65 49 6e  val = get4byteIn
24f10 74 28 61 48 64 72 20 2b 20 6f 66 73 74 29 3b 0a  t(aHdr + ofst);.
24f20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
24f30 70 2d 3e 6f 75 74 2c 20 22 25 2d 32 30 73 20 25  p->out, "%-20s %
24f40 75 22 2c 20 61 46 69 65 6c 64 5b 69 5d 2e 7a 4e  u", aField[i].zN
24f50 61 6d 65 2c 20 76 61 6c 29 3b 0a 20 20 20 20 73  ame, val);.    s
24f60 77 69 74 63 68 28 20 6f 66 73 74 20 29 7b 0a 20  witch( ofst ){. 
24f70 20 20 20 20 20 63 61 73 65 20 35 36 3a 20 7b 0a       case 56: {.
24f80 20 20 20 20 20 20 20 20 69 66 28 20 76 61 6c 3d          if( val=
24f90 3d 31 20 29 20 72 61 77 5f 70 72 69 6e 74 66 28  =1 ) raw_printf(
24fa0 70 2d 3e 6f 75 74 2c 20 22 20 28 75 74 66 38 29  p->out, " (utf8)
24fb0 22 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ");.        if( 
24fc0 76 61 6c 3d 3d 32 20 29 20 72 61 77 5f 70 72 69  val==2 ) raw_pri
24fd0 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 20 28 75  ntf(p->out, " (u
24fe0 74 66 31 36 6c 65 29 22 29 3b 0a 20 20 20 20 20  tf16le)");.     
24ff0 20 20 20 69 66 28 20 76 61 6c 3d 3d 33 20 29 20     if( val==3 ) 
25000 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  raw_printf(p->ou
25010 74 2c 20 22 20 28 75 74 66 31 36 62 65 29 22 29  t, " (utf16be)")
25020 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
25030 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70      raw_printf(p
25040 2d 3e 6f 75 74 2c 20 22 5c 6e 22 29 3b 0a 20 20  ->out, "\n");.  
25050 7d 0a 20 20 69 66 28 20 7a 44 62 3d 3d 30 20 29  }.  if( zDb==0 )
25060 7b 0a 20 20 20 20 7a 53 63 68 65 6d 61 54 61 62  {.    zSchemaTab
25070 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
25080 74 66 28 22 6d 61 69 6e 2e 73 71 6c 69 74 65 5f  tf("main.sqlite_
25090 6d 61 73 74 65 72 22 29 3b 0a 20 20 7d 65 6c 73  master");.  }els
250a0 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 44 62  e if( strcmp(zDb
250b0 2c 22 74 65 6d 70 22 29 3d 3d 30 20 29 7b 0a 20  ,"temp")==0 ){. 
250c0 20 20 20 7a 53 63 68 65 6d 61 54 61 62 20 3d 20     zSchemaTab = 
250d0 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
250e0 22 25 73 22 2c 20 22 73 71 6c 69 74 65 5f 74 65  "%s", "sqlite_te
250f0 6d 70 5f 6d 61 73 74 65 72 22 29 3b 0a 20 20 7d  mp_master");.  }
25100 65 6c 73 65 7b 0a 20 20 20 20 7a 53 63 68 65 6d  else{.    zSchem
25110 61 54 61 62 20 3d 20 73 71 6c 69 74 65 33 5f 6d  aTab = sqlite3_m
25120 70 72 69 6e 74 66 28 22 5c 22 25 77 5c 22 2e 73  printf("\"%w\".s
25130 71 6c 69 74 65 5f 6d 61 73 74 65 72 22 2c 20 7a  qlite_master", z
25140 44 62 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69  Db);.  }.  for(i
25150 3d 30 3b 20 69 3c 41 72 72 61 79 53 69 7a 65 28  =0; i<ArraySize(
25160 61 51 75 65 72 79 29 3b 20 69 2b 2b 29 7b 0a 20  aQuery); i++){. 
25170 20 20 20 63 68 61 72 20 2a 7a 53 71 6c 20 3d 20     char *zSql = 
25180 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
25190 61 51 75 65 72 79 5b 69 5d 2e 7a 53 71 6c 2c 20  aQuery[i].zSql, 
251a0 7a 53 63 68 65 6d 61 54 61 62 29 3b 0a 20 20 20  zSchemaTab);.   
251b0 20 69 6e 74 20 76 61 6c 20 3d 20 64 62 5f 69 6e   int val = db_in
251c0 74 28 70 2c 20 7a 53 71 6c 29 3b 0a 20 20 20 20  t(p, zSql);.    
251d0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71  sqlite3_free(zSq
251e0 6c 29 3b 0a 20 20 20 20 75 74 66 38 5f 70 72 69  l);.    utf8_pri
251f0 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 2d 32  ntf(p->out, "%-2
25200 30 73 20 25 64 5c 6e 22 2c 20 61 51 75 65 72 79  0s %d\n", aQuery
25210 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 76 61 6c 29 3b  [i].zName, val);
25220 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66  .  }.  sqlite3_f
25230 72 65 65 28 7a 53 63 68 65 6d 61 54 61 62 29 3b  ree(zSchemaTab);
25240 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f  .  sqlite3_file_
25250 63 6f 6e 74 72 6f 6c 28 70 2d 3e 64 62 2c 20 7a  control(p->db, z
25260 44 62 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  Db, SQLITE_FCNTL
25270 5f 44 41 54 41 5f 56 45 52 53 49 4f 4e 2c 20 26  _DATA_VERSION, &
25280 69 44 61 74 61 56 65 72 73 69 6f 6e 29 3b 0a 20  iDataVersion);. 
25290 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e   utf8_printf(p->
252a0 6f 75 74 2c 20 22 25 2d 32 30 73 20 25 75 5c 6e  out, "%-20s %u\n
252b0 22 2c 20 22 64 61 74 61 20 76 65 72 73 69 6f 6e  ", "data version
252c0 22 2c 20 69 44 61 74 61 56 65 72 73 69 6f 6e 29  ", iDataVersion)
252d0 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  ;.  return 0;.}.
252e0 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 74 68 65  ./*.** Print the
252f0 20 63 75 72 72 65 6e 74 20 73 71 6c 69 74 65 33   current sqlite3
25300 5f 65 72 72 6d 73 67 28 29 20 76 61 6c 75 65 20  _errmsg() value 
25310 74 6f 20 73 74 64 65 72 72 20 61 6e 64 20 72 65  to stderr and re
25320 74 75 72 6e 20 31 2e 0a 2a 2f 0a 73 74 61 74 69  turn 1..*/.stati
25330 63 20 69 6e 74 20 73 68 65 6c 6c 44 61 74 61 62  c int shellDatab
25340 61 73 65 45 72 72 6f 72 28 73 71 6c 69 74 65 33  aseError(sqlite3
25350 20 2a 64 62 29 7b 0a 20 20 63 6f 6e 73 74 20 63   *db){.  const c
25360 68 61 72 20 2a 7a 45 72 72 20 3d 20 73 71 6c 69  har *zErr = sqli
25370 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29 3b 0a  te3_errmsg(db);.
25380 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74    utf8_printf(st
25390 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 25 73  derr, "Error: %s
253a0 5c 6e 22 2c 20 7a 45 72 72 29 3b 0a 20 20 72 65  \n", zErr);.  re
253b0 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 1;.}../*.**
253c0 20 43 6f 6d 70 61 72 65 20 74 68 65 20 70 61 74   Compare the pat
253d0 74 65 72 6e 20 69 6e 20 7a 47 6c 6f 62 5b 5d 20  tern in zGlob[] 
253e0 61 67 61 69 6e 73 74 20 74 68 65 20 74 65 78 74  against the text
253f0 20 69 6e 20 7a 5b 5d 2e 20 20 52 65 74 75 72 6e   in z[].  Return
25400 20 54 52 55 45 0a 2a 2a 20 69 66 20 74 68 65 79   TRUE.** if they
25410 20 6d 61 74 63 68 20 61 6e 64 20 46 41 4c 53 45   match and FALSE
25420 20 28 30 29 20 69 66 20 74 68 65 79 20 64 6f 20   (0) if they do 
25430 6e 6f 74 20 6d 61 74 63 68 2e 0a 2a 2a 0a 2a 2a  not match..**.**
25440 20 47 6c 6f 62 62 69 6e 67 20 72 75 6c 65 73 3a   Globbing rules:
25450 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 27 2a 27 20  .**.**      '*' 
25460 20 20 20 20 20 20 4d 61 74 63 68 65 73 20 61 6e        Matches an
25470 79 20 73 65 71 75 65 6e 63 65 20 6f 66 20 7a 65  y sequence of ze
25480 72 6f 20 6f 72 20 6d 6f 72 65 20 63 68 61 72 61  ro or more chara
25490 63 74 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  cters..**.**    
254a0 20 20 27 3f 27 20 20 20 20 20 20 20 4d 61 74 63    '?'       Matc
254b0 68 65 73 20 65 78 61 63 74 6c 79 20 6f 6e 65 20  hes exactly one 
254c0 63 68 61 72 61 63 74 65 72 2e 0a 2a 2a 0a 2a 2a  character..**.**
254d0 20 20 20 20 20 5b 2e 2e 2e 5d 20 20 20 20 20 20       [...]      
254e0 4d 61 74 63 68 65 73 20 6f 6e 65 20 63 68 61 72  Matches one char
254f0 61 63 74 65 72 20 66 72 6f 6d 20 74 68 65 20 65  acter from the e
25500 6e 63 6c 6f 73 65 64 20 6c 69 73 74 20 6f 66 0a  nclosed list of.
25510 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
25520 20 20 63 68 61 72 61 63 74 65 72 73 2e 0a 2a 2a    characters..**
25530 0a 2a 2a 20 20 20 20 20 5b 5e 2e 2e 2e 5d 20 20  .**     [^...]  
25540 20 20 20 4d 61 74 63 68 65 73 20 6f 6e 65 20 63     Matches one c
25550 68 61 72 61 63 74 65 72 20 6e 6f 74 20 69 6e 20  haracter not in 
25560 74 68 65 20 65 6e 63 6c 6f 73 65 64 20 6c 69 73  the enclosed lis
25570 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 27 23  t..**.**      '#
25580 27 20 20 20 20 20 20 20 4d 61 74 63 68 65 73 20  '       Matches 
25590 61 6e 79 20 73 65 71 75 65 6e 63 65 20 6f 66 20  any sequence of 
255a0 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 64 69 67 69  one or more digi
255b0 74 73 20 77 69 74 68 20 61 6e 0a 2a 2a 20 20 20  ts with an.**   
255c0 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 70 74               opt
255d0 69 6f 6e 61 6c 20 2b 20 6f 72 20 2d 20 73 69 67  ional + or - sig
255e0 6e 20 69 6e 20 66 72 6f 6e 74 0a 2a 2a 0a 2a 2a  n in front.**.**
255f0 20 20 20 20 20 20 27 20 27 20 20 20 20 20 20 20        ' '       
25600 41 6e 79 20 73 70 61 6e 20 6f 66 20 77 68 69 74  Any span of whit
25610 65 73 70 61 63 65 20 6d 61 74 63 68 65 73 20 61  espace matches a
25620 6e 79 20 6f 74 68 65 72 20 73 70 61 6e 20 6f 66  ny other span of
25630 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
25640 20 20 20 77 68 69 74 65 73 70 61 63 65 2e 0a 2a     whitespace..*
25650 2a 0a 2a 2a 20 45 78 74 72 61 20 77 68 69 74 65  *.** Extra white
25660 73 70 61 63 65 20 61 74 20 74 68 65 20 65 6e 64  space at the end
25670 20 6f 66 20 7a 5b 5d 20 69 73 20 69 67 6e 6f 72   of z[] is ignor
25680 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
25690 74 20 74 65 73 74 63 61 73 65 5f 67 6c 6f 62 28  t testcase_glob(
256a0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 47 6c 6f  const char *zGlo
256b0 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  b, const char *z
256c0 29 7b 0a 20 20 69 6e 74 20 63 2c 20 63 32 3b 0a  ){.  int c, c2;.
256d0 20 20 69 6e 74 20 69 6e 76 65 72 74 3b 0a 20 20    int invert;.  
256e0 69 6e 74 20 73 65 65 6e 3b 0a 0a 20 20 77 68 69  int seen;..  whi
256f0 6c 65 28 20 28 63 20 3d 20 28 2a 28 7a 47 6c 6f  le( (c = (*(zGlo
25700 62 2b 2b 29 29 29 21 3d 30 20 29 7b 0a 20 20 20  b++)))!=0 ){.   
25710 20 69 66 28 20 49 73 53 70 61 63 65 28 63 29 20   if( IsSpace(c) 
25720 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21 49 73  ){.      if( !Is
25730 53 70 61 63 65 28 2a 7a 29 20 29 20 72 65 74 75  Space(*z) ) retu
25740 72 6e 20 30 3b 0a 20 20 20 20 20 20 77 68 69 6c  rn 0;.      whil
25750 65 28 20 49 73 53 70 61 63 65 28 2a 7a 47 6c 6f  e( IsSpace(*zGlo
25760 62 29 20 29 20 7a 47 6c 6f 62 2b 2b 3b 0a 20 20  b) ) zGlob++;.  
25770 20 20 20 20 77 68 69 6c 65 28 20 49 73 53 70 61      while( IsSpa
25780 63 65 28 2a 7a 29 20 29 20 7a 2b 2b 3b 0a 20 20  ce(*z) ) z++;.  
25790 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27    }else if( c=='
257a0 2a 27 20 29 7b 0a 20 20 20 20 20 20 77 68 69 6c  *' ){.      whil
257b0 65 28 20 28 63 3d 28 2a 28 7a 47 6c 6f 62 2b 2b  e( (c=(*(zGlob++
257c0 29 29 29 20 3d 3d 20 27 2a 27 20 7c 7c 20 63 3d  ))) == '*' || c=
257d0 3d 27 3f 27 20 29 7b 0a 20 20 20 20 20 20 20 20  ='?' ){.        
257e0 69 66 28 20 63 3d 3d 27 3f 27 20 26 26 20 28 2a  if( c=='?' && (*
257f0 28 7a 2b 2b 29 29 3d 3d 30 20 29 20 72 65 74 75  (z++))==0 ) retu
25800 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rn 0;.      }.  
25810 20 20 20 20 69 66 28 20 63 3d 3d 30 20 29 7b 0a      if( c==0 ){.
25820 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31          return 1
25830 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
25840 28 20 63 3d 3d 27 5b 27 20 29 7b 0a 20 20 20 20  ( c=='[' ){.    
25850 20 20 20 20 77 68 69 6c 65 28 20 2a 7a 20 26 26      while( *z &&
25860 20 74 65 73 74 63 61 73 65 5f 67 6c 6f 62 28 7a   testcase_glob(z
25870 47 6c 6f 62 2d 31 2c 7a 29 3d 3d 30 20 29 7b 0a  Glob-1,z)==0 ){.
25880 20 20 20 20 20 20 20 20 20 20 7a 2b 2b 3b 0a 20            z++;. 
25890 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
258a0 20 72 65 74 75 72 6e 20 28 2a 7a 29 21 3d 30 3b   return (*z)!=0;
258b0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 77  .      }.      w
258c0 68 69 6c 65 28 20 28 63 32 20 3d 20 28 2a 28 7a  hile( (c2 = (*(z
258d0 2b 2b 29 29 29 21 3d 30 20 29 7b 0a 20 20 20 20  ++)))!=0 ){.    
258e0 20 20 20 20 77 68 69 6c 65 28 20 63 32 21 3d 63      while( c2!=c
258f0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 32   ){.          c2
25900 20 3d 20 2a 28 7a 2b 2b 29 3b 0a 20 20 20 20 20   = *(z++);.     
25910 20 20 20 20 20 69 66 28 20 63 32 3d 3d 30 20 29       if( c2==0 )
25920 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20   return 0;.     
25930 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
25940 20 74 65 73 74 63 61 73 65 5f 67 6c 6f 62 28 7a   testcase_glob(z
25950 47 6c 6f 62 2c 7a 29 20 29 20 72 65 74 75 72 6e  Glob,z) ) return
25960 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
25970 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
25980 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 3f 27  }else if( c=='?'
25990 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 2a   ){.      if( (*
259a0 28 7a 2b 2b 29 29 3d 3d 30 20 29 20 72 65 74 75  (z++))==0 ) retu
259b0 72 6e 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20  rn 0;.    }else 
259c0 69 66 28 20 63 3d 3d 27 5b 27 20 29 7b 0a 20 20  if( c=='[' ){.  
259d0 20 20 20 20 69 6e 74 20 70 72 69 6f 72 5f 63 20      int prior_c 
259e0 3d 20 30 3b 0a 20 20 20 20 20 20 73 65 65 6e 20  = 0;.      seen 
259f0 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 76 65 72  = 0;.      inver
25a00 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 63 20 3d  t = 0;.      c =
25a10 20 2a 28 7a 2b 2b 29 3b 0a 20 20 20 20 20 20 69   *(z++);.      i
25a20 66 28 20 63 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( c==0 ) return
25a30 20 30 3b 0a 20 20 20 20 20 20 63 32 20 3d 20 2a   0;.      c2 = *
25a40 28 7a 47 6c 6f 62 2b 2b 29 3b 0a 20 20 20 20 20  (zGlob++);.     
25a50 20 69 66 28 20 63 32 3d 3d 27 5e 27 20 29 7b 0a   if( c2=='^' ){.
25a60 20 20 20 20 20 20 20 20 69 6e 76 65 72 74 20 3d          invert =
25a70 20 31 3b 0a 20 20 20 20 20 20 20 20 63 32 20 3d   1;.        c2 =
25a80 20 2a 28 7a 47 6c 6f 62 2b 2b 29 3b 0a 20 20 20   *(zGlob++);.   
25a90 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63     }.      if( c
25aa0 32 3d 3d 27 5d 27 20 29 7b 0a 20 20 20 20 20 20  2==']' ){.      
25ab0 20 20 69 66 28 20 63 3d 3d 27 5d 27 20 29 20 73    if( c==']' ) s
25ac0 65 65 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  een = 1;.       
25ad0 20 63 32 20 3d 20 2a 28 7a 47 6c 6f 62 2b 2b 29   c2 = *(zGlob++)
25ae0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
25af0 77 68 69 6c 65 28 20 63 32 20 26 26 20 63 32 21  while( c2 && c2!
25b00 3d 27 5d 27 20 29 7b 0a 20 20 20 20 20 20 20 20  =']' ){.        
25b10 69 66 28 20 63 32 3d 3d 27 2d 27 20 26 26 20 7a  if( c2=='-' && z
25b20 47 6c 6f 62 5b 30 5d 21 3d 27 5d 27 20 26 26 20  Glob[0]!=']' && 
25b30 7a 47 6c 6f 62 5b 30 5d 21 3d 30 20 26 26 20 70  zGlob[0]!=0 && p
25b40 72 69 6f 72 5f 63 3e 30 20 29 7b 0a 20 20 20 20  rior_c>0 ){.    
25b50 20 20 20 20 20 20 63 32 20 3d 20 2a 28 7a 47 6c        c2 = *(zGl
25b60 6f 62 2b 2b 29 3b 0a 20 20 20 20 20 20 20 20 20  ob++);.         
25b70 20 69 66 28 20 63 3e 3d 70 72 69 6f 72 5f 63 20   if( c>=prior_c 
25b80 26 26 20 63 3c 3d 63 32 20 29 20 73 65 65 6e 20  && c<=c2 ) seen 
25b90 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 70  = 1;.          p
25ba0 72 69 6f 72 5f 63 20 3d 20 30 3b 0a 20 20 20 20  rior_c = 0;.    
25bb0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
25bc0 20 20 20 20 20 69 66 28 20 63 3d 3d 63 32 20 29       if( c==c2 )
25bd0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 65  {.            se
25be0 65 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  en = 1;.        
25bf0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 72    }.          pr
25c00 69 6f 72 5f 63 20 3d 20 63 32 3b 0a 20 20 20 20  ior_c = c2;.    
25c10 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 63 32      }.        c2
25c20 20 3d 20 2a 28 7a 47 6c 6f 62 2b 2b 29 3b 0a 20   = *(zGlob++);. 
25c30 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
25c40 20 63 32 3d 3d 30 20 7c 7c 20 28 73 65 65 6e 20   c2==0 || (seen 
25c50 5e 20 69 6e 76 65 72 74 29 3d 3d 30 20 29 20 72  ^ invert)==0 ) r
25c60 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 65 6c  eturn 0;.    }el
25c70 73 65 20 69 66 28 20 63 3d 3d 27 23 27 20 29 7b  se if( c=='#' ){
25c80 0a 20 20 20 20 20 20 69 66 28 20 28 7a 5b 30 5d  .      if( (z[0]
25c90 3d 3d 27 2d 27 20 7c 7c 20 7a 5b 30 5d 3d 3d 27  =='-' || z[0]=='
25ca0 2b 27 29 20 26 26 20 49 73 44 69 67 69 74 28 7a  +') && IsDigit(z
25cb0 5b 31 5d 29 20 29 20 7a 2b 2b 3b 0a 20 20 20 20  [1]) ) z++;.    
25cc0 20 20 69 66 28 20 21 49 73 44 69 67 69 74 28 7a    if( !IsDigit(z
25cd0 5b 30 5d 29 20 29 20 72 65 74 75 72 6e 20 30 3b  [0]) ) return 0;
25ce0 0a 20 20 20 20 20 20 7a 2b 2b 3b 0a 20 20 20 20  .      z++;.    
25cf0 20 20 77 68 69 6c 65 28 20 49 73 44 69 67 69 74    while( IsDigit
25d00 28 7a 5b 30 5d 29 20 29 7b 20 7a 2b 2b 3b 20 7d  (z[0]) ){ z++; }
25d10 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
25d20 20 20 69 66 28 20 63 21 3d 28 2a 28 7a 2b 2b 29    if( c!=(*(z++)
25d30 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  ) ) return 0;.  
25d40 20 20 7d 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28    }.  }.  while(
25d50 20 49 73 53 70 61 63 65 28 2a 7a 29 20 29 7b 20   IsSpace(*z) ){ 
25d60 7a 2b 2b 3b 20 7d 0a 20 20 72 65 74 75 72 6e 20  z++; }.  return 
25d70 2a 7a 3d 3d 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  *z==0;.}.../*.**
25d80 20 43 6f 6d 70 61 72 65 20 74 68 65 20 73 74 72   Compare the str
25d90 69 6e 67 20 61 73 20 61 20 63 6f 6d 6d 61 6e 64  ing as a command
25da0 2d 6c 69 6e 65 20 6f 70 74 69 6f 6e 20 77 69 74  -line option wit
25db0 68 20 65 69 74 68 65 72 20 6f 6e 65 20 6f 72 20  h either one or 
25dc0 74 77 6f 0a 2a 2a 20 69 6e 69 74 69 61 6c 20 22  two.** initial "
25dd0 2d 22 20 63 68 61 72 61 63 74 65 72 73 2e 0a 2a  -" characters..*
25de0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6f 70 74  /.static int opt
25df0 69 6f 6e 4d 61 74 63 68 28 63 6f 6e 73 74 20 63  ionMatch(const c
25e00 68 61 72 20 2a 7a 53 74 72 2c 20 63 6f 6e 73 74  har *zStr, const
25e10 20 63 68 61 72 20 2a 7a 4f 70 74 29 7b 0a 20 20   char *zOpt){.  
25e20 69 66 28 20 7a 53 74 72 5b 30 5d 21 3d 27 2d 27  if( zStr[0]!='-'
25e30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7a   ) return 0;.  z
25e40 53 74 72 2b 2b 3b 0a 20 20 69 66 28 20 7a 53 74  Str++;.  if( zSt
25e50 72 5b 30 5d 3d 3d 27 2d 27 20 29 20 7a 53 74 72  r[0]=='-' ) zStr
25e60 2b 2b 3b 0a 20 20 72 65 74 75 72 6e 20 73 74 72  ++;.  return str
25e70 63 6d 70 28 7a 53 74 72 2c 20 7a 4f 70 74 29 3d  cmp(zStr, zOpt)=
25e80 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c  =0;.}../*.** Del
25e90 65 74 65 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a 69  ete a file..*/.i
25ea0 6e 74 20 73 68 65 6c 6c 44 65 6c 65 74 65 46 69  nt shellDeleteFi
25eb0 6c 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  le(const char *z
25ec0 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 69 6e 74  Filename){.  int
25ed0 20 72 63 3b 0a 23 69 66 64 65 66 20 5f 57 49 4e   rc;.#ifdef _WIN
25ee0 33 32 0a 20 20 77 63 68 61 72 5f 74 20 2a 7a 20  32.  wchar_t *z 
25ef0 3d 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f  = sqlite3_win32_
25f00 75 74 66 38 5f 74 6f 5f 75 6e 69 63 6f 64 65 28  utf8_to_unicode(
25f10 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 72 63  zFilename);.  rc
25f20 20 3d 20 5f 77 75 6e 6c 69 6e 6b 28 7a 29 3b 0a   = _wunlink(z);.
25f30 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
25f40 29 3b 0a 23 65 6c 73 65 0a 20 20 72 63 20 3d 20  );.#else.  rc = 
25f50 75 6e 6c 69 6e 6b 28 7a 46 69 6c 65 6e 61 6d 65  unlink(zFilename
25f60 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75  );.#endif.  retu
25f70 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
25f80 54 72 79 20 74 6f 20 64 65 6c 65 74 65 20 74 68  Try to delete th
25f90 65 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  e temporary file
25fa0 20 28 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e   (if there is on
25fb0 65 29 20 61 6e 64 20 66 72 65 65 20 74 68 65 0a  e) and free the.
25fc0 2a 2a 20 6d 65 6d 6f 72 79 20 75 73 65 64 20 74  ** memory used t
25fd0 6f 20 68 6f 6c 64 20 74 68 65 20 6e 61 6d 65 20  o hold the name 
25fe0 6f 66 20 74 68 65 20 74 65 6d 70 20 66 69 6c 65  of the temp file
25ff0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
26000 20 63 6c 65 61 72 54 65 6d 70 46 69 6c 65 28 53   clearTempFile(S
26010 68 65 6c 6c 53 74 61 74 65 20 2a 70 29 7b 0a 20  hellState *p){. 
26020 20 69 66 28 20 70 2d 3e 7a 54 65 6d 70 46 69 6c   if( p->zTempFil
26030 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  e==0 ) return;. 
26040 20 69 66 28 20 70 2d 3e 64 6f 58 64 67 4f 70 65   if( p->doXdgOpe
26050 6e 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  n ) return;.  if
26060 28 20 73 68 65 6c 6c 44 65 6c 65 74 65 46 69 6c  ( shellDeleteFil
26070 65 28 70 2d 3e 7a 54 65 6d 70 46 69 6c 65 29 20  e(p->zTempFile) 
26080 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69  ) return;.  sqli
26090 74 65 33 5f 66 72 65 65 28 70 2d 3e 7a 54 65 6d  te3_free(p->zTem
260a0 70 46 69 6c 65 29 3b 0a 20 20 70 2d 3e 7a 54 65  pFile);.  p->zTe
260b0 6d 70 46 69 6c 65 20 3d 20 30 3b 0a 7d 0a 0a 2f  mpFile = 0;.}../
260c0 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65  *.** Create a ne
260d0 77 20 74 65 6d 70 20 66 69 6c 65 20 6e 61 6d 65  w temp file name
260e0 20 77 69 74 68 20 74 68 65 20 67 69 76 65 6e 20   with the given 
260f0 73 75 66 66 69 78 2e 0a 2a 2f 0a 73 74 61 74 69  suffix..*/.stati
26100 63 20 76 6f 69 64 20 6e 65 77 54 65 6d 70 46 69  c void newTempFi
26110 6c 65 28 53 68 65 6c 6c 53 74 61 74 65 20 2a 70  le(ShellState *p
26120 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53  , const char *zS
26130 75 66 66 69 78 29 7b 0a 20 20 63 6c 65 61 72 54  uffix){.  clearT
26140 65 6d 70 46 69 6c 65 28 70 29 3b 0a 20 20 73 71  empFile(p);.  sq
26150 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 7a 54  lite3_free(p->zT
26160 65 6d 70 46 69 6c 65 29 3b 0a 20 20 70 2d 3e 7a  empFile);.  p->z
26170 54 65 6d 70 46 69 6c 65 20 3d 20 30 3b 0a 20 20  TempFile = 0;.  
26180 69 66 28 20 70 2d 3e 64 62 20 29 7b 0a 20 20 20  if( p->db ){.   
26190 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f   sqlite3_file_co
261a0 6e 74 72 6f 6c 28 70 2d 3e 64 62 2c 20 30 2c 20  ntrol(p->db, 0, 
261b0 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 54 45 4d  SQLITE_FCNTL_TEM
261c0 50 46 49 4c 45 4e 41 4d 45 2c 20 26 70 2d 3e 7a  PFILENAME, &p->z
261d0 54 65 6d 70 46 69 6c 65 29 3b 0a 20 20 7d 0a 20  TempFile);.  }. 
261e0 20 69 66 28 20 70 2d 3e 7a 54 65 6d 70 46 69 6c   if( p->zTempFil
261f0 65 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  e==0 ){.    sqli
26200 74 65 33 5f 75 69 6e 74 36 34 20 72 3b 0a 20 20  te3_uint64 r;.  
26210 20 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d    sqlite3_random
26220 6e 65 73 73 28 73 69 7a 65 6f 66 28 72 29 2c 20  ness(sizeof(r), 
26230 26 72 29 3b 0a 20 20 20 20 70 2d 3e 7a 54 65 6d  &r);.    p->zTem
26240 70 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 5f  pFile = sqlite3_
26250 6d 70 72 69 6e 74 66 28 22 74 65 6d 70 25 6c 6c  mprintf("temp%ll
26260 78 2e 25 73 22 2c 20 72 2c 20 7a 53 75 66 66 69  x.%s", r, zSuffi
26270 78 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  x);.  }else{.   
26280 20 70 2d 3e 7a 54 65 6d 70 46 69 6c 65 20 3d 20   p->zTempFile = 
26290 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
262a0 22 25 7a 2e 25 73 22 2c 20 70 2d 3e 7a 54 65 6d  "%z.%s", p->zTem
262b0 70 46 69 6c 65 2c 20 7a 53 75 66 66 69 78 29 3b  pFile, zSuffix);
262c0 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 7a 54  .  }.  if( p->zT
262d0 65 6d 70 46 69 6c 65 3d 3d 30 20 29 7b 0a 20 20  empFile==0 ){.  
262e0 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64    raw_printf(std
262f0 65 72 72 2c 20 22 6f 75 74 20 6f 66 20 6d 65 6d  err, "out of mem
26300 6f 72 79 5c 6e 22 29 3b 0a 20 20 20 20 65 78 69  ory\n");.    exi
26310 74 28 31 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a  t(1);.  }.}.../*
26320 0a 2a 2a 20 54 68 65 20 69 6d 70 6c 65 6d 65 6e  .** The implemen
26330 74 61 74 69 6f 6e 20 6f 66 20 53 51 4c 20 73 63  tation of SQL sc
26340 61 6c 61 72 20 66 75 6e 63 74 69 6f 6e 20 66 6b  alar function fk
26350 65 79 5f 63 6f 6c 6c 61 74 65 5f 63 6c 61 75 73  ey_collate_claus
26360 65 28 29 2c 20 75 73 65 64 0a 2a 2a 20 62 79 20  e(), used.** by 
26370 74 68 65 20 22 2e 6c 69 6e 74 20 66 6b 65 79 2d  the ".lint fkey-
26380 69 6e 64 65 78 65 73 22 20 63 6f 6d 6d 61 6e 64  indexes" command
26390 2e 20 54 68 69 73 20 73 63 61 6c 61 72 20 66 75  . This scalar fu
263a0 6e 63 74 69 6f 6e 20 69 73 20 61 6c 77 61 79 73  nction is always
263b0 0a 2a 2a 20 63 61 6c 6c 65 64 20 77 69 74 68 20  .** called with 
263c0 66 6f 75 72 20 61 72 67 75 6d 65 6e 74 73 20 2d  four arguments -
263d0 20 74 68 65 20 70 61 72 65 6e 74 20 74 61 62 6c   the parent tabl
263e0 65 20 6e 61 6d 65 2c 20 74 68 65 20 70 61 72 65  e name, the pare
263f0 6e 74 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 2c 0a  nt column name,.
26400 2a 2a 20 74 68 65 20 63 68 69 6c 64 20 74 61 62  ** the child tab
26410 6c 65 20 6e 61 6d 65 20 61 6e 64 20 74 68 65 20  le name and the 
26420 63 68 69 6c 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d  child column nam
26430 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 66 6b 65 79 5f  e..**.**   fkey_
26440 63 6f 6c 6c 61 74 65 5f 63 6c 61 75 73 65 28 27  collate_clause('
26450 70 61 72 65 6e 74 2d 74 61 62 27 2c 20 27 70 61  parent-tab', 'pa
26460 72 65 6e 74 2d 63 6f 6c 27 2c 20 27 63 68 69 6c  rent-col', 'chil
26470 64 2d 74 61 62 27 2c 20 27 63 68 69 6c 64 2d 63  d-tab', 'child-c
26480 6f 6c 27 29 0a 2a 2a 0a 2a 2a 20 49 66 20 65 69  ol').**.** If ei
26490 74 68 65 72 20 6f 66 20 74 68 65 20 6e 61 6d 65  ther of the name
264a0 64 20 74 61 62 6c 65 73 20 6f 72 20 63 6f 6c 75  d tables or colu
264b0 6d 6e 73 20 64 6f 20 6e 6f 74 20 65 78 69 73 74  mns do not exist
264c0 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a  , this function.
264d0 2a 2a 20 72 65 74 75 72 6e 73 20 61 6e 20 65 6d  ** returns an em
264e0 70 74 79 20 73 74 72 69 6e 67 2e 20 41 6e 20 65  pty string. An e
264f0 6d 70 74 79 20 73 74 72 69 6e 67 20 69 73 20 61  mpty string is a
26500 6c 73 6f 20 72 65 74 75 72 6e 65 64 20 69 66 20  lso returned if 
26510 62 6f 74 68 20 74 61 62 6c 65 73 0a 2a 2a 20 61  both tables.** a
26520 6e 64 20 63 6f 6c 75 6d 6e 73 20 65 78 69 73 74  nd columns exist
26530 20 62 75 74 20 68 61 76 65 20 74 68 65 20 73 61   but have the sa
26540 6d 65 20 64 65 66 61 75 6c 74 20 63 6f 6c 6c 61  me default colla
26550 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 2e 20 4f  tion sequence. O
26560 72 2c 0a 2a 2a 20 69 66 20 62 6f 74 68 20 65 78  r,.** if both ex
26570 69 73 74 20 62 75 74 20 74 68 65 20 64 65 66 61  ist but the defa
26580 75 6c 74 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  ult collation se
26590 71 75 65 6e 63 65 73 20 61 72 65 20 64 69 66 66  quences are diff
265a0 65 72 65 6e 74 2c 20 74 68 69 73 0a 2a 2a 20 66  erent, this.** f
265b0 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
265c0 74 68 65 20 73 74 72 69 6e 67 20 22 20 43 4f 4c  the string " COL
265d0 4c 41 54 45 20 3c 70 61 72 65 6e 74 2d 63 6f 6c  LATE <parent-col
265e0 6c 61 74 69 6f 6e 3e 22 2c 20 77 68 65 72 65 0a  lation>", where.
265f0 2a 2a 20 3c 70 61 72 65 6e 74 2d 63 6f 6c 6c 61  ** <parent-colla
26600 74 69 6f 6e 3e 20 69 73 20 74 68 65 20 64 65 66  tion> is the def
26610 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6f 6e 20 73  ault collation s
26620 65 71 75 65 6e 63 65 20 6f 66 20 74 68 65 20 70  equence of the p
26630 61 72 65 6e 74 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f  arent column..*/
26640 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 68 65  .static void she
26650 6c 6c 46 6b 65 79 43 6f 6c 6c 61 74 65 43 6c 61  llFkeyCollateCla
26660 75 73 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 63  use(.  sqlite3_c
26670 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c 0a 20 20  ontext *pCtx,.  
26680 69 6e 74 20 6e 56 61 6c 2c 0a 20 20 73 71 6c 69  int nVal,.  sqli
26690 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70 56 61  te3_value **apVa
266a0 6c 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  l.){.  sqlite3 *
266b0 64 62 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6e  db = sqlite3_con
266c0 74 65 78 74 5f 64 62 5f 68 61 6e 64 6c 65 28 70  text_db_handle(p
266d0 43 74 78 29 3b 0a 20 20 63 6f 6e 73 74 20 63 68  Ctx);.  const ch
266e0 61 72 20 2a 7a 50 61 72 65 6e 74 3b 0a 20 20 63  ar *zParent;.  c
266f0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 72 65  onst char *zPare
26700 6e 74 43 6f 6c 3b 0a 20 20 63 6f 6e 73 74 20 63  ntCol;.  const c
26710 68 61 72 20 2a 7a 50 61 72 65 6e 74 53 65 71 3b  har *zParentSeq;
26720 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
26730 43 68 69 6c 64 3b 0a 20 20 63 6f 6e 73 74 20 63  Child;.  const c
26740 68 61 72 20 2a 7a 43 68 69 6c 64 43 6f 6c 3b 0a  har *zChildCol;.
26750 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43    const char *zC
26760 68 69 6c 64 53 65 71 20 3d 20 30 3b 20 20 2f 2a  hildSeq = 0;  /*
26770 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 6f 20 61   Initialize to a
26780 76 6f 69 64 20 66 61 6c 73 65 2d 70 6f 73 69 74  void false-posit
26790 69 76 65 20 77 61 72 6e 69 6e 67 20 2a 2f 0a 20  ive warning */. 
267a0 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65   int rc;..  asse
267b0 72 74 28 20 6e 56 61 6c 3d 3d 34 20 29 3b 0a 20  rt( nVal==4 );. 
267c0 20 7a 50 61 72 65 6e 74 20 3d 20 28 63 6f 6e 73   zParent = (cons
267d0 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f  t char*)sqlite3_
267e0 76 61 6c 75 65 5f 74 65 78 74 28 61 70 56 61 6c  value_text(apVal
267f0 5b 30 5d 29 3b 0a 20 20 7a 50 61 72 65 6e 74 43  [0]);.  zParentC
26800 6f 6c 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  ol = (const char
26810 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  *)sqlite3_value_
26820 74 65 78 74 28 61 70 56 61 6c 5b 31 5d 29 3b 0a  text(apVal[1]);.
26830 20 20 7a 43 68 69 6c 64 20 3d 20 28 63 6f 6e 73    zChild = (cons
26840 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f  t char*)sqlite3_
26850 76 61 6c 75 65 5f 74 65 78 74 28 61 70 56 61 6c  value_text(apVal
26860 5b 32 5d 29 3b 0a 20 20 7a 43 68 69 6c 64 43 6f  [2]);.  zChildCo
26870 6c 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a  l = (const char*
26880 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  )sqlite3_value_t
26890 65 78 74 28 61 70 56 61 6c 5b 33 5d 29 3b 0a 0a  ext(apVal[3]);..
268a0 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
268b0 5f 74 65 78 74 28 70 43 74 78 2c 20 22 22 2c 20  _text(pCtx, "", 
268c0 2d 31 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49  -1, SQLITE_STATI
268d0 43 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  C);.  rc = sqlit
268e0 65 33 5f 74 61 62 6c 65 5f 63 6f 6c 75 6d 6e 5f  e3_table_column_
268f0 6d 65 74 61 64 61 74 61 28 0a 20 20 20 20 20 20  metadata(.      
26900 64 62 2c 20 22 6d 61 69 6e 22 2c 20 7a 50 61 72  db, "main", zPar
26910 65 6e 74 2c 20 7a 50 61 72 65 6e 74 43 6f 6c 2c  ent, zParentCol,
26920 20 30 2c 20 26 7a 50 61 72 65 6e 74 53 65 71 2c   0, &zParentSeq,
26930 20 30 2c 20 30 2c 20 30 0a 20 20 29 3b 0a 20 20   0, 0, 0.  );.  
26940 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
26950 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  K ){.    rc = sq
26960 6c 69 74 65 33 5f 74 61 62 6c 65 5f 63 6f 6c 75  lite3_table_colu
26970 6d 6e 5f 6d 65 74 61 64 61 74 61 28 0a 20 20 20  mn_metadata(.   
26980 20 20 20 20 20 64 62 2c 20 22 6d 61 69 6e 22 2c       db, "main",
26990 20 7a 43 68 69 6c 64 2c 20 7a 43 68 69 6c 64 43   zChild, zChildC
269a0 6f 6c 2c 20 30 2c 20 26 7a 43 68 69 6c 64 53 65  ol, 0, &zChildSe
269b0 71 2c 20 30 2c 20 30 2c 20 30 0a 20 20 20 20 29  q, 0, 0, 0.    )
269c0 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d  ;.  }..  if( rc=
269d0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 73 71  =SQLITE_OK && sq
269e0 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28 7a 50  lite3_stricmp(zP
269f0 61 72 65 6e 74 53 65 71 2c 20 7a 43 68 69 6c 64  arentSeq, zChild
26a00 53 65 71 29 20 29 7b 0a 20 20 20 20 63 68 61 72  Seq) ){.    char
26a10 20 2a 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70   *z = sqlite3_mp
26a20 72 69 6e 74 66 28 22 20 43 4f 4c 4c 41 54 45 20  rintf(" COLLATE 
26a30 25 73 22 2c 20 7a 50 61 72 65 6e 74 53 65 71 29  %s", zParentSeq)
26a40 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65  ;.    sqlite3_re
26a50 73 75 6c 74 5f 74 65 78 74 28 70 43 74 78 2c 20  sult_text(pCtx, 
26a60 7a 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 54 52  z, -1, SQLITE_TR
26a70 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 73 71  ANSIENT);.    sq
26a80 6c 69 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20  lite3_free(z);. 
26a90 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65   }.}.../*.** The
26aa0 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
26ab0 6f 66 20 64 6f 74 2d 63 6f 6d 6d 61 6e 64 20 22  of dot-command "
26ac0 2e 6c 69 6e 74 20 66 6b 65 79 2d 69 6e 64 65 78  .lint fkey-index
26ad0 65 73 22 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  es"..*/.static i
26ae0 6e 74 20 6c 69 6e 74 46 6b 65 79 49 6e 64 65 78  nt lintFkeyIndex
26af0 65 73 28 0a 20 20 53 68 65 6c 6c 53 74 61 74 65  es(.  ShellState
26b00 20 2a 70 53 74 61 74 65 2c 20 20 20 20 20 20 20   *pState,       
26b10 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74        /* Current
26b20 20 73 68 65 6c 6c 20 74 6f 6f 6c 20 73 74 61 74   shell tool stat
26b30 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 7a  e */.  char **az
26b40 41 72 67 2c 20 20 20 20 20 20 20 20 20 20 20 20  Arg,            
26b50 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20         /* Array 
26b60 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 70 61 73  of arguments pas
26b70 73 65 64 20 74 6f 20 64 6f 74 20 63 6f 6d 6d 61  sed to dot comma
26b80 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 72 67  nd */.  int nArg
26b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26ba0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
26bb0 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20  r of entries in 
26bc0 61 7a 41 72 67 5b 5d 20 2a 2f 0a 29 7b 0a 20 20  azArg[] */.){.  
26bd0 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 53  sqlite3 *db = pS
26be0 74 61 74 65 2d 3e 64 62 3b 20 20 20 20 20 20 20  tate->db;       
26bf0 2f 2a 20 44 61 74 61 62 61 73 65 20 68 61 6e 64  /* Database hand
26c00 6c 65 20 74 6f 20 71 75 65 72 79 20 22 6d 61 69  le to query "mai
26c10 6e 22 20 64 62 20 6f 66 20 2a 2f 0a 20 20 46 49  n" db of */.  FI
26c20 4c 45 20 2a 6f 75 74 20 3d 20 70 53 74 61 74 65  LE *out = pState
26c30 2d 3e 6f 75 74 3b 20 20 20 20 20 20 20 20 2f 2a  ->out;        /*
26c40 20 53 74 72 65 61 6d 20 74 6f 20 77 72 69 74 65   Stream to write
26c50 20 6e 6f 6e 2d 65 72 72 6f 72 20 6f 75 74 70 75   non-error outpu
26c60 74 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 62 56  t to */.  int bV
26c70 65 72 62 6f 73 65 20 3d 20 30 3b 20 20 20 20 20  erbose = 0;     
26c80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
26c90 2d 76 65 72 62 6f 73 65 20 69 73 20 70 72 65 73  -verbose is pres
26ca0 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 62 47 72  ent */.  int bGr
26cb0 6f 75 70 42 79 50 61 72 65 6e 74 20 3d 20 30 3b  oupByParent = 0;
26cc0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 2d           /* If -
26cd0 67 72 6f 75 70 62 79 70 61 72 65 6e 74 20 69 73  groupbyparent is
26ce0 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20 69 6e   present */.  in
26cf0 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
26d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
26d10 20 54 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f   To iterate thro
26d20 75 67 68 20 61 7a 41 72 67 5b 5d 20 2a 2f 0a 20  ugh azArg[] */. 
26d30 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 6e   const char *zIn
26d40 64 65 6e 74 20 3d 20 22 22 3b 20 20 20 20 20 20  dent = "";      
26d50 20 2f 2a 20 48 6f 77 20 6d 75 63 68 20 74 6f 20   /* How much to 
26d60 69 6e 64 65 6e 74 20 43 52 45 41 54 45 20 49 4e  indent CREATE IN
26d70 44 45 58 20 62 79 20 2a 2f 0a 20 20 69 6e 74 20  DEX by */.  int 
26d80 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
26d90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
26da0 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
26db0 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
26dc0 71 6c 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ql = 0;         
26dd0 2f 2a 20 43 6f 6d 70 69 6c 65 64 20 76 65 72 73  /* Compiled vers
26de0 69 6f 6e 20 6f 66 20 53 51 4c 20 73 74 61 74 65  ion of SQL state
26df0 6d 65 6e 74 20 62 65 6c 6f 77 20 2a 2f 0a 0a 20  ment below */.. 
26e00 20 2f 2a 0a 20 20 2a 2a 20 54 68 69 73 20 53 45   /*.  ** This SE
26e10 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 72  LECT statement r
26e20 65 74 75 72 6e 73 20 6f 6e 65 20 72 6f 77 20 66  eturns one row f
26e30 6f 72 20 65 61 63 68 20 66 6f 72 65 69 67 6e 20  or each foreign 
26e40 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 0a 20  key constraint. 
26e50 20 2a 2a 20 69 6e 20 74 68 65 20 73 63 68 65 6d   ** in the schem
26e60 61 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 64 61  a of the main da
26e70 74 61 62 61 73 65 2e 20 54 68 65 20 63 6f 6c 75  tabase. The colu
26e80 6d 6e 20 76 61 6c 75 65 73 20 61 72 65 3a 0a 20  mn values are:. 
26e90 20 2a 2a 0a 20 20 2a 2a 20 30 2e 20 54 68 65 20   **.  ** 0. The 
26ea0 74 65 78 74 20 6f 66 20 61 6e 20 53 51 4c 20 73  text of an SQL s
26eb0 74 61 74 65 6d 65 6e 74 20 73 69 6d 69 6c 61 72  tatement similar
26ec0 20 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20   to:.  **.  **  
26ed0 20 20 20 20 22 45 58 50 4c 41 49 4e 20 51 55 45      "EXPLAIN QUE
26ee0 52 59 20 50 4c 41 4e 20 53 45 4c 45 43 54 20 31  RY PLAN SELECT 1
26ef0 20 46 52 4f 4d 20 63 68 69 6c 64 5f 74 61 62 6c   FROM child_tabl
26f00 65 20 57 48 45 52 45 20 63 68 69 6c 64 5f 6b 65  e WHERE child_ke
26f10 79 3d 3f 22 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  y=?".  **.  **  
26f20 20 20 54 68 69 73 20 53 45 4c 45 43 54 20 69 73    This SELECT is
26f30 20 73 69 6d 69 6c 61 72 20 74 6f 20 74 68 65 20   similar to the 
26f40 6f 6e 65 20 74 68 61 74 20 74 68 65 20 66 6f 72  one that the for
26f50 65 69 67 6e 20 6b 65 79 73 20 69 6d 70 6c 65 6d  eign keys implem
26f60 65 6e 74 61 74 69 6f 6e 0a 20 20 2a 2a 20 20 20  entation.  **   
26f70 20 6e 65 65 64 73 20 74 6f 20 72 75 6e 20 69 6e   needs to run in
26f80 74 65 72 6e 61 6c 6c 79 20 6f 6e 20 63 68 69 6c  ternally on chil
26f90 64 20 74 61 62 6c 65 73 2e 20 49 66 20 74 68 65  d tables. If the
26fa0 72 65 20 69 73 20 61 6e 20 69 6e 64 65 78 20 74  re is an index t
26fb0 68 61 74 20 63 61 6e 0a 20 20 2a 2a 20 20 20 20  hat can.  **    
26fc0 62 65 20 75 73 65 64 20 74 6f 20 6f 70 74 69 6d  be used to optim
26fd0 69 7a 65 20 74 68 69 73 20 71 75 65 72 79 2c 20  ize this query, 
26fe0 74 68 65 6e 20 69 74 20 63 61 6e 20 61 6c 73 6f  then it can also
26ff0 20 62 65 20 75 73 65 64 20 62 79 20 74 68 65 20   be used by the 
27000 46 4b 0a 20 20 2a 2a 20 20 20 20 69 6d 70 6c 65  FK.  **    imple
27010 6d 65 6e 74 61 74 69 6f 6e 20 74 6f 20 6f 70 74  mentation to opt
27020 69 6d 69 7a 65 20 44 45 4c 45 54 45 20 6f 72 20  imize DELETE or 
27030 55 50 44 41 54 45 20 73 74 61 74 65 6d 65 6e 74  UPDATE statement
27040 73 20 6f 6e 20 74 68 65 20 70 61 72 65 6e 74 0a  s on the parent.
27050 20 20 2a 2a 20 20 20 20 74 61 62 6c 65 2e 0a 20    **    table.. 
27060 20 2a 2a 0a 20 20 2a 2a 20 31 2e 20 41 20 47 4c   **.  ** 1. A GL
27070 4f 42 20 70 61 74 74 65 72 6e 20 73 75 69 74 61  OB pattern suita
27080 62 6c 65 20 66 6f 72 20 73 71 6c 69 74 65 33 5f  ble for sqlite3_
27090 73 74 72 67 6c 6f 62 28 29 2e 20 49 66 20 74 68  strglob(). If th
270a0 65 20 70 6c 61 6e 20 6f 75 74 70 75 74 20 62 79  e plan output by
270b0 0a 20 20 2a 2a 20 20 20 20 74 68 65 20 45 58 50  .  **    the EXP
270c0 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 20  LAIN QUERY PLAN 
270d0 63 6f 6d 6d 61 6e 64 20 6d 61 74 63 68 65 73 20  command matches 
270e0 74 68 69 73 20 70 61 74 74 65 72 6e 2c 20 74 68  this pattern, th
270f0 65 6e 20 74 68 65 20 73 63 68 65 6d 61 0a 20 20  en the schema.  
27100 2a 2a 20 20 20 20 63 6f 6e 74 61 69 6e 73 20 61  **    contains a
27110 6e 20 69 6e 64 65 78 20 74 68 61 74 20 63 61 6e  n index that can
27120 20 62 65 20 75 73 65 64 20 74 6f 20 6f 70 74 69   be used to opti
27130 6d 69 7a 65 20 74 68 65 20 71 75 65 72 79 2e 0a  mize the query..
27140 20 20 2a 2a 0a 20 20 2a 2a 20 32 2e 20 48 75 6d    **.  ** 2. Hum
27150 61 6e 20 72 65 61 64 61 62 6c 65 20 74 65 78 74  an readable text
27160 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20   that describes 
27170 74 68 65 20 63 68 69 6c 64 20 74 61 62 6c 65 20  the child table 
27180 61 6e 64 20 63 6f 6c 75 6d 6e 73 2e 20 65 2e 67  and columns. e.g
27190 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  ..  **.  **     
271a0 20 20 22 63 68 69 6c 64 5f 74 61 62 6c 65 28 63    "child_table(c
271b0 68 69 6c 64 5f 6b 65 79 31 2c 20 63 68 69 6c 64  hild_key1, child
271c0 5f 6b 65 79 32 29 22 0a 20 20 2a 2a 0a 20 20 2a  _key2)".  **.  *
271d0 2a 20 33 2e 20 48 75 6d 61 6e 20 72 65 61 64 61  * 3. Human reada
271e0 62 6c 65 20 74 65 78 74 20 74 68 61 74 20 64 65  ble text that de
271f0 73 63 72 69 62 65 73 20 74 68 65 20 70 61 72 65  scribes the pare
27200 6e 74 20 74 61 62 6c 65 20 61 6e 64 20 63 6f 6c  nt table and col
27210 75 6d 6e 73 2e 20 65 2e 67 2e 0a 20 20 2a 2a 0a  umns. e.g..  **.
27220 20 20 2a 2a 20 20 20 20 20 20 20 22 70 61 72 65    **       "pare
27230 6e 74 5f 74 61 62 6c 65 28 70 61 72 65 6e 74 5f  nt_table(parent_
27240 6b 65 79 31 2c 20 70 61 72 65 6e 74 5f 6b 65 79  key1, parent_key
27250 32 29 22 0a 20 20 2a 2a 0a 20 20 2a 2a 20 34 2e  2)".  **.  ** 4.
27260 20 41 20 66 75 6c 6c 20 43 52 45 41 54 45 20 49   A full CREATE I
27270 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74 20 66  NDEX statement f
27280 6f 72 20 61 6e 20 69 6e 64 65 78 20 74 68 61 74  or an index that
27290 20 63 6f 75 6c 64 20 62 65 20 75 73 65 64 20 74   could be used t
272a0 6f 0a 20 20 2a 2a 20 20 20 20 6f 70 74 69 6d 69  o.  **    optimi
272b0 7a 65 20 44 45 4c 45 54 45 20 6f 72 20 55 50 44  ze DELETE or UPD
272c0 41 54 45 20 73 74 61 74 65 6d 65 6e 74 73 20 6f  ATE statements o
272d0 6e 20 74 68 65 20 70 61 72 65 6e 74 20 74 61 62  n the parent tab
272e0 6c 65 2e 20 65 2e 67 2e 0a 20 20 2a 2a 0a 20 20  le. e.g..  **.  
272f0 2a 2a 20 20 20 20 20 20 20 22 43 52 45 41 54 45  **       "CREATE
27300 20 49 4e 44 45 58 20 63 68 69 6c 64 5f 74 61 62   INDEX child_tab
27310 6c 65 5f 63 68 69 6c 64 5f 6b 65 79 20 4f 4e 20  le_child_key ON 
27320 63 68 69 6c 64 5f 74 61 62 6c 65 28 63 68 69 6c  child_table(chil
27330 64 5f 6b 65 79 29 22 0a 20 20 2a 2a 0a 20 20 2a  d_key)".  **.  *
27340 2a 20 35 2e 20 54 68 65 20 6e 61 6d 65 20 6f 66  * 5. The name of
27350 20 74 68 65 20 70 61 72 65 6e 74 20 74 61 62 6c   the parent tabl
27360 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  e..  **.  ** The
27370 73 65 20 73 69 78 20 76 61 6c 75 65 73 20 61 72  se six values ar
27380 65 20 75 73 65 64 20 62 79 20 74 68 65 20 43 20  e used by the C 
27390 6c 6f 67 69 63 20 62 65 6c 6f 77 20 74 6f 20 67  logic below to g
273a0 65 6e 65 72 61 74 65 20 74 68 65 20 72 65 70 6f  enerate the repo
273b0 72 74 2e 0a 20 20 2a 2f 0a 20 20 63 6f 6e 73 74  rt..  */.  const
273c0 20 63 68 61 72 20 2a 7a 53 71 6c 20 3d 0a 20 20   char *zSql =.  
273d0 22 53 45 4c 45 43 54 20 22 0a 20 20 20 20 22 20  "SELECT ".    " 
273e0 20 20 20 20 27 45 58 50 4c 41 49 4e 20 51 55 45      'EXPLAIN QUE
273f0 52 59 20 50 4c 41 4e 20 53 45 4c 45 43 54 20 31  RY PLAN SELECT 1
27400 20 46 52 4f 4d 20 27 20 7c 7c 20 71 75 6f 74 65   FROM ' || quote
27410 28 73 2e 6e 61 6d 65 29 20 7c 7c 20 27 20 57 48  (s.name) || ' WH
27420 45 52 45 20 27 22 0a 20 20 20 20 22 20 20 7c 7c  ERE '".    "  ||
27430 20 67 72 6f 75 70 5f 63 6f 6e 63 61 74 28 71 75   group_concat(qu
27440 6f 74 65 28 73 2e 6e 61 6d 65 29 20 7c 7c 20 27  ote(s.name) || '
27450 2e 27 20 7c 7c 20 71 75 6f 74 65 28 66 2e 5b 66  .' || quote(f.[f
27460 72 6f 6d 5d 29 20 7c 7c 20 27 3d 3f 27 20 22 0a  rom]) || '=?' ".
27470 20 20 20 20 22 20 20 7c 7c 20 66 6b 65 79 5f 63      "  || fkey_c
27480 6f 6c 6c 61 74 65 5f 63 6c 61 75 73 65 28 22 0a  ollate_clause(".
27490 20 20 20 20 22 20 20 20 20 20 20 20 66 2e 5b 74      "       f.[t
274a0 61 62 6c 65 5d 2c 20 43 4f 41 4c 45 53 43 45 28  able], COALESCE(
274b0 66 2e 5b 74 6f 5d 2c 20 70 2e 5b 6e 61 6d 65 5d  f.[to], p.[name]
274c0 29 2c 20 73 2e 6e 61 6d 65 2c 20 66 2e 5b 66 72  ), s.name, f.[fr
274d0 6f 6d 5d 29 2c 27 20 41 4e 44 20 27 29 22 0a 20  om]),' AND ')". 
274e0 20 20 20 22 2c 20 22 0a 20 20 20 20 22 20 20 20     ", ".    "   
274f0 20 20 27 53 45 41 52 43 48 20 54 41 42 4c 45 20    'SEARCH TABLE 
27500 27 20 7c 7c 20 73 2e 6e 61 6d 65 20 7c 7c 20 27  ' || s.name || '
27510 20 55 53 49 4e 47 20 43 4f 56 45 52 49 4e 47 20   USING COVERING 
27520 49 4e 44 45 58 2a 28 27 22 0a 20 20 20 20 22 20  INDEX*('".    " 
27530 20 7c 7c 20 67 72 6f 75 70 5f 63 6f 6e 63 61 74   || group_concat
27540 28 27 2a 3d 3f 27 2c 20 27 20 41 4e 44 20 27 29  ('*=?', ' AND ')
27550 20 7c 7c 20 27 29 27 22 0a 20 20 20 20 22 2c 20   || ')'".    ", 
27560 22 0a 20 20 20 20 22 20 20 20 20 20 73 2e 6e 61  ".    "     s.na
27570 6d 65 20 20 7c 7c 20 27 28 27 20 7c 7c 20 67 72  me  || '(' || gr
27580 6f 75 70 5f 63 6f 6e 63 61 74 28 66 2e 5b 66 72  oup_concat(f.[fr
27590 6f 6d 5d 2c 20 20 27 2c 20 27 29 20 7c 7c 20 27  om],  ', ') || '
275a0 29 27 22 0a 20 20 20 20 22 2c 20 22 0a 20 20 20  )'".    ", ".   
275b0 20 22 20 20 20 20 20 66 2e 5b 74 61 62 6c 65 5d   "     f.[table]
275c0 20 7c 7c 20 27 28 27 20 7c 7c 20 67 72 6f 75 70   || '(' || group
275d0 5f 63 6f 6e 63 61 74 28 43 4f 41 4c 45 53 43 45  _concat(COALESCE
275e0 28 66 2e 5b 74 6f 5d 2c 20 70 2e 5b 6e 61 6d 65  (f.[to], p.[name
275f0 5d 29 29 20 7c 7c 20 27 29 27 22 0a 20 20 20 20  ])) || ')'".    
27600 22 2c 20 22 0a 20 20 20 20 22 20 20 20 20 20 27  ", ".    "     '
27610 43 52 45 41 54 45 20 49 4e 44 45 58 20 27 20 7c  CREATE INDEX ' |
27620 7c 20 71 75 6f 74 65 28 73 2e 6e 61 6d 65 20 7c  | quote(s.name |
27630 7c 27 5f 27 7c 7c 20 67 72 6f 75 70 5f 63 6f 6e  |'_'|| group_con
27640 63 61 74 28 66 2e 5b 66 72 6f 6d 5d 2c 20 27 5f  cat(f.[from], '_
27650 27 29 29 22 0a 20 20 20 20 22 20 20 7c 7c 20 27  '))".    "  || '
27660 20 4f 4e 20 27 20 7c 7c 20 71 75 6f 74 65 28 73   ON ' || quote(s
27670 2e 6e 61 6d 65 29 20 7c 7c 20 27 28 27 22 0a 20  .name) || '('". 
27680 20 20 20 22 20 20 7c 7c 20 67 72 6f 75 70 5f 63     "  || group_c
27690 6f 6e 63 61 74 28 71 75 6f 74 65 28 66 2e 5b 66  oncat(quote(f.[f
276a0 72 6f 6d 5d 29 20 7c 7c 22 0a 20 20 20 20 22 20  rom]) ||".    " 
276b0 20 20 20 20 20 20 20 66 6b 65 79 5f 63 6f 6c 6c         fkey_coll
276c0 61 74 65 5f 63 6c 61 75 73 65 28 22 0a 20 20 20  ate_clause(".   
276d0 20 22 20 20 20 20 20 20 20 20 20 20 66 2e 5b 74   "          f.[t
276e0 61 62 6c 65 5d 2c 20 43 4f 41 4c 45 53 43 45 28  able], COALESCE(
276f0 66 2e 5b 74 6f 5d 2c 20 70 2e 5b 6e 61 6d 65 5d  f.[to], p.[name]
27700 29 2c 20 73 2e 6e 61 6d 65 2c 20 66 2e 5b 66 72  ), s.name, f.[fr
27710 6f 6d 5d 29 2c 20 27 2c 20 27 29 22 0a 20 20 20  om]), ', ')".   
27720 20 22 20 20 7c 7c 20 27 29 3b 27 22 0a 20 20 20   "  || ');'".   
27730 20 22 2c 20 22 0a 20 20 20 20 22 20 20 20 20 20   ", ".    "     
27740 66 2e 5b 74 61 62 6c 65 5d 20 22 0a 20 20 20 20  f.[table] ".    
27750 22 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73  "FROM sqlite_mas
27760 74 65 72 20 41 53 20 73 2c 20 70 72 61 67 6d 61  ter AS s, pragma
27770 5f 66 6f 72 65 69 67 6e 5f 6b 65 79 5f 6c 69 73  _foreign_key_lis
27780 74 28 73 2e 6e 61 6d 65 29 20 41 53 20 66 20 22  t(s.name) AS f "
27790 0a 20 20 20 20 22 4c 45 46 54 20 4a 4f 49 4e 20  .    "LEFT JOIN 
277a0 70 72 61 67 6d 61 5f 74 61 62 6c 65 5f 69 6e 66  pragma_table_inf
277b0 6f 20 41 53 20 70 20 4f 4e 20 28 70 6b 2d 31 3d  o AS p ON (pk-1=
277c0 73 65 71 20 41 4e 44 20 70 2e 61 72 67 3d 66 2e  seq AND p.arg=f.
277d0 5b 74 61 62 6c 65 5d 29 20 22 0a 20 20 20 20 22  [table]) ".    "
277e0 47 52 4f 55 50 20 42 59 20 73 2e 6e 61 6d 65 2c  GROUP BY s.name,
277f0 20 66 2e 69 64 20 22 0a 20 20 20 20 22 4f 52 44   f.id ".    "ORD
27800 45 52 20 42 59 20 28 43 41 53 45 20 57 48 45 4e  ER BY (CASE WHEN
27810 20 3f 20 54 48 45 4e 20 66 2e 5b 74 61 62 6c 65   ? THEN f.[table
27820 5d 20 45 4c 53 45 20 73 2e 6e 61 6d 65 20 45 4e  ] ELSE s.name EN
27830 44 29 22 0a 20 20 3b 0a 20 20 63 6f 6e 73 74 20  D)".  ;.  const 
27840 63 68 61 72 20 2a 7a 47 6c 6f 62 49 50 4b 20 3d  char *zGlobIPK =
27850 20 22 53 45 41 52 43 48 20 54 41 42 4c 45 20 2a   "SEARCH TABLE *
27860 20 55 53 49 4e 47 20 49 4e 54 45 47 45 52 20 50   USING INTEGER P
27870 52 49 4d 41 52 59 20 4b 45 59 20 28 72 6f 77 69  RIMARY KEY (rowi
27880 64 3d 3f 29 22 3b 0a 0a 20 20 66 6f 72 28 69 3d  d=?)";..  for(i=
27890 32 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b  2; i<nArg; i++){
278a0 0a 20 20 20 20 69 6e 74 20 6e 20 3d 20 73 74 72  .    int n = str
278b0 6c 65 6e 33 30 28 61 7a 41 72 67 5b 69 5d 29 3b  len30(azArg[i]);
278c0 0a 20 20 20 20 69 66 28 20 6e 3e 31 20 26 26 20  .    if( n>1 && 
278d0 73 71 6c 69 74 65 33 5f 73 74 72 6e 69 63 6d 70  sqlite3_strnicmp
278e0 28 22 2d 76 65 72 62 6f 73 65 22 2c 20 61 7a 41  ("-verbose", azA
278f0 72 67 5b 69 5d 2c 20 6e 29 3d 3d 30 20 29 7b 0a  rg[i], n)==0 ){.
27900 20 20 20 20 20 20 62 56 65 72 62 6f 73 65 20 3d        bVerbose =
27910 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65 6c   1;.    }.    el
27920 73 65 20 69 66 28 20 6e 3e 31 20 26 26 20 73 71  se if( n>1 && sq
27930 6c 69 74 65 33 5f 73 74 72 6e 69 63 6d 70 28 22  lite3_strnicmp("
27940 2d 67 72 6f 75 70 62 79 70 61 72 65 6e 74 22 2c  -groupbyparent",
27950 20 61 7a 41 72 67 5b 69 5d 2c 20 6e 29 3d 3d 30   azArg[i], n)==0
27960 20 29 7b 0a 20 20 20 20 20 20 62 47 72 6f 75 70   ){.      bGroup
27970 42 79 50 61 72 65 6e 74 20 3d 20 31 3b 0a 20 20  ByParent = 1;.  
27980 20 20 20 20 7a 49 6e 64 65 6e 74 20 3d 20 22 20      zIndent = " 
27990 20 20 20 22 3b 0a 20 20 20 20 7d 0a 20 20 20 20     ";.    }.    
279a0 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 61 77 5f  else{.      raw_
279b0 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
279c0 55 73 61 67 65 3a 20 25 73 20 25 73 20 3f 2d 76  Usage: %s %s ?-v
279d0 65 72 62 6f 73 65 3f 20 3f 2d 67 72 6f 75 70 62  erbose? ?-groupb
279e0 79 70 61 72 65 6e 74 3f 5c 6e 22 2c 0a 20 20 20  yparent?\n",.   
279f0 20 20 20 20 20 20 20 61 7a 41 72 67 5b 30 5d 2c         azArg[0],
27a00 20 61 7a 41 72 67 5b 31 5d 0a 20 20 20 20 20 20   azArg[1].      
27a10 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
27a20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
27a30 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65    }.  }..  /* Re
27a40 67 69 73 74 65 72 20 74 68 65 20 66 6b 65 79 5f  gister the fkey_
27a50 63 6f 6c 6c 61 74 65 5f 63 6c 61 75 73 65 28 29  collate_clause()
27a60 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20 2a 2f   SQL function */
27a70 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
27a80 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28  create_function(
27a90 64 62 2c 20 22 66 6b 65 79 5f 63 6f 6c 6c 61 74  db, "fkey_collat
27aa0 65 5f 63 6c 61 75 73 65 22 2c 20 34 2c 20 53 51  e_clause", 4, SQ
27ab0 4c 49 54 45 5f 55 54 46 38 2c 0a 20 20 20 20 20  LITE_UTF8,.     
27ac0 20 30 2c 20 73 68 65 6c 6c 46 6b 65 79 43 6f 6c   0, shellFkeyCol
27ad0 6c 61 74 65 43 6c 61 75 73 65 2c 20 30 2c 20 30  lateClause, 0, 0
27ae0 0a 20 20 29 3b 0a 0a 0a 20 20 69 66 28 20 72 63  .  );...  if( rc
27af0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
27b00 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
27b10 70 72 65 70 61 72 65 5f 76 32 28 64 62 2c 20 7a  prepare_v2(db, z
27b20 53 71 6c 2c 20 2d 31 2c 20 26 70 53 71 6c 2c 20  Sql, -1, &pSql, 
27b30 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  0);.  }.  if( rc
27b40 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
27b50 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f     sqlite3_bind_
27b60 69 6e 74 28 70 53 71 6c 2c 20 31 2c 20 62 47 72  int(pSql, 1, bGr
27b70 6f 75 70 42 79 50 61 72 65 6e 74 29 3b 0a 20 20  oupByParent);.  
27b80 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  }..  if( rc==SQL
27b90 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e  ITE_OK ){.    in
27ba0 74 20 72 63 32 3b 0a 20 20 20 20 63 68 61 72 20  t rc2;.    char 
27bb0 2a 7a 50 72 65 76 20 3d 20 30 3b 0a 20 20 20 20  *zPrev = 0;.    
27bc0 77 68 69 6c 65 28 20 53 51 4c 49 54 45 5f 52 4f  while( SQLITE_RO
27bd0 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28  W==sqlite3_step(
27be0 70 53 71 6c 29 20 29 7b 0a 20 20 20 20 20 20 69  pSql) ){.      i
27bf0 6e 74 20 72 65 73 20 3d 20 2d 31 3b 0a 20 20 20  nt res = -1;.   
27c00 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20     sqlite3_stmt 
27c10 2a 70 45 78 70 6c 61 69 6e 20 3d 20 30 3b 0a 20  *pExplain = 0;. 
27c20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
27c30 2a 7a 45 51 50 20 3d 20 28 63 6f 6e 73 74 20 63  *zEQP = (const c
27c40 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c  har*)sqlite3_col
27c50 75 6d 6e 5f 74 65 78 74 28 70 53 71 6c 2c 20 30  umn_text(pSql, 0
27c60 29 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  );.      const c
27c70 68 61 72 20 2a 7a 47 6c 6f 62 20 3d 20 28 63 6f  har *zGlob = (co
27c80 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65  nst char*)sqlite
27c90 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53  3_column_text(pS
27ca0 71 6c 2c 20 31 29 3b 0a 20 20 20 20 20 20 63 6f  ql, 1);.      co
27cb0 6e 73 74 20 63 68 61 72 20 2a 7a 46 72 6f 6d 20  nst char *zFrom 
27cc0 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73  = (const char*)s
27cd0 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
27ce0 78 74 28 70 53 71 6c 2c 20 32 29 3b 0a 20 20 20  xt(pSql, 2);.   
27cf0 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
27d00 54 61 72 67 65 74 20 3d 20 28 63 6f 6e 73 74 20  Target = (const 
27d10 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f  char*)sqlite3_co
27d20 6c 75 6d 6e 5f 74 65 78 74 28 70 53 71 6c 2c 20  lumn_text(pSql, 
27d30 33 29 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20  3);.      const 
27d40 63 68 61 72 20 2a 7a 43 49 20 3d 20 28 63 6f 6e  char *zCI = (con
27d50 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33  st char*)sqlite3
27d60 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 71  _column_text(pSq
27d70 6c 2c 20 34 29 3b 0a 20 20 20 20 20 20 63 6f 6e  l, 4);.      con
27d80 73 74 20 63 68 61 72 20 2a 7a 50 61 72 65 6e 74  st char *zParent
27d90 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29   = (const char*)
27da0 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
27db0 65 78 74 28 70 53 71 6c 2c 20 35 29 3b 0a 0a 20  ext(pSql, 5);.. 
27dc0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
27dd0 33 5f 70 72 65 70 61 72 65 5f 76 32 28 64 62 2c  3_prepare_v2(db,
27de0 20 7a 45 51 50 2c 20 2d 31 2c 20 26 70 45 78 70   zEQP, -1, &pExp
27df0 6c 61 69 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20  lain, 0);.      
27e00 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
27e10 4b 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  K ) break;.     
27e20 20 69 66 28 20 53 51 4c 49 54 45 5f 52 4f 57 3d   if( SQLITE_ROW=
27e30 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 45  =sqlite3_step(pE
27e40 78 70 6c 61 69 6e 29 20 29 7b 0a 20 20 20 20 20  xplain) ){.     
27e50 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
27e60 50 6c 61 6e 20 3d 20 28 63 6f 6e 73 74 20 63 68  Plan = (const ch
27e70 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75  ar*)sqlite3_colu
27e80 6d 6e 5f 74 65 78 74 28 70 45 78 70 6c 61 69 6e  mn_text(pExplain
27e90 2c 20 33 29 3b 0a 20 20 20 20 20 20 20 20 72 65  , 3);.        re
27ea0 73 20 3d 20 28 0a 20 20 20 20 20 20 20 20 20 20  s = (.          
27eb0 20 20 20 20 30 3d 3d 73 71 6c 69 74 65 33 5f 73      0==sqlite3_s
27ec0 74 72 67 6c 6f 62 28 7a 47 6c 6f 62 2c 20 7a 50  trglob(zGlob, zP
27ed0 6c 61 6e 29 0a 20 20 20 20 20 20 20 20 20 20 20  lan).           
27ee0 7c 7c 20 30 3d 3d 73 71 6c 69 74 65 33 5f 73 74  || 0==sqlite3_st
27ef0 72 67 6c 6f 62 28 7a 47 6c 6f 62 49 50 4b 2c 20  rglob(zGlobIPK, 
27f00 7a 50 6c 61 6e 29 0a 20 20 20 20 20 20 20 20 29  zPlan).        )
27f10 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
27f20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6e  rc = sqlite3_fin
27f30 61 6c 69 7a 65 28 70 45 78 70 6c 61 69 6e 29 3b  alize(pExplain);
27f40 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
27f50 51 4c 49 54 45 5f 4f 4b 20 29 20 62 72 65 61 6b  QLITE_OK ) break
27f60 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 72 65 73  ;..      if( res
27f70 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 61  <0 ){.        ra
27f80 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  w_printf(stderr,
27f90 20 22 45 72 72 6f 72 3a 20 69 6e 74 65 72 6e 61   "Error: interna
27fa0 6c 20 65 72 72 6f 72 22 29 3b 0a 20 20 20 20 20  l error");.     
27fb0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
27fc0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69  }else{.        i
27fd0 66 28 20 62 47 72 6f 75 70 42 79 50 61 72 65 6e  f( bGroupByParen
27fe0 74 0a 20 20 20 20 20 20 20 20 26 26 20 28 62 56  t.        && (bV
27ff0 65 72 62 6f 73 65 20 7c 7c 20 72 65 73 3d 3d 30  erbose || res==0
28000 29 0a 20 20 20 20 20 20 20 20 26 26 20 28 7a 50  ).        && (zP
28010 72 65 76 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65  rev==0 || sqlite
28020 33 5f 73 74 72 69 63 6d 70 28 7a 50 61 72 65 6e  3_stricmp(zParen
28030 74 2c 20 7a 50 72 65 76 29 29 0a 20 20 20 20 20  t, zPrev)).     
28040 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
28050 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20  raw_printf(out, 
28060 22 2d 2d 20 50 61 72 65 6e 74 20 74 61 62 6c 65  "-- Parent table
28070 20 25 73 5c 6e 22 2c 20 7a 50 61 72 65 6e 74 29   %s\n", zParent)
28080 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
28090 74 65 33 5f 66 72 65 65 28 7a 50 72 65 76 29 3b  te3_free(zPrev);
280a0 0a 20 20 20 20 20 20 20 20 20 20 7a 50 72 65 76  .          zPrev
280b0 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
280c0 74 66 28 22 25 73 22 2c 20 7a 50 61 72 65 6e 74  tf("%s", zParent
280d0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  );.        }..  
280e0 20 20 20 20 20 20 69 66 28 20 72 65 73 3d 3d 30        if( res==0
280f0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 61   ){.          ra
28100 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25  w_printf(out, "%
28110 73 25 73 20 2d 2d 3e 20 25 73 5c 6e 22 2c 20 7a  s%s --> %s\n", z
28120 49 6e 64 65 6e 74 2c 20 7a 43 49 2c 20 7a 54 61  Indent, zCI, zTa
28130 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20 7d  rget);.        }
28140 65 6c 73 65 20 69 66 28 20 62 56 65 72 62 6f 73  else if( bVerbos
28150 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  e ){.          r
28160 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22  aw_printf(out, "
28170 25 73 2f 2a 20 6e 6f 20 65 78 74 72 61 20 69 6e  %s/* no extra in
28180 64 65 78 65 73 20 72 65 71 75 69 72 65 64 20 66  dexes required f
28190 6f 72 20 25 73 20 2d 3e 20 25 73 20 2a 2f 5c 6e  or %s -> %s */\n
281a0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
281b0 20 7a 49 6e 64 65 6e 74 2c 20 7a 46 72 6f 6d 2c   zIndent, zFrom,
281c0 20 7a 54 61 72 67 65 74 0a 20 20 20 20 20 20 20   zTarget.       
281d0 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a     );.        }.
281e0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
281f0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
28200 50 72 65 76 29 3b 0a 0a 20 20 20 20 69 66 28 20  Prev);..    if( 
28210 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
28220 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74  .      raw_print
28230 66 28 73 74 64 65 72 72 2c 20 22 25 73 5c 6e 22  f(stderr, "%s\n"
28240 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  , sqlite3_errmsg
28250 28 64 62 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  (db));.    }..  
28260 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33 5f    rc2 = sqlite3_
28270 66 69 6e 61 6c 69 7a 65 28 70 53 71 6c 29 3b 0a  finalize(pSql);.
28280 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
28290 54 45 5f 4f 4b 20 26 26 20 72 63 32 21 3d 53 51  TE_OK && rc2!=SQ
282a0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
282b0 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 20 20 20   rc = rc2;.     
282c0 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65   raw_printf(stde
282d0 72 72 2c 20 22 25 73 5c 6e 22 2c 20 73 71 6c 69  rr, "%s\n", sqli
282e0 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29 29 3b  te3_errmsg(db));
282f0 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
28300 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73      raw_printf(s
28310 74 64 65 72 72 2c 20 22 25 73 5c 6e 22 2c 20 73  tderr, "%s\n", s
28320 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62  qlite3_errmsg(db
28330 29 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  ));.  }..  retur
28340 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  n rc;.}../*.** I
28350 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
28360 20 22 2e 6c 69 6e 74 22 20 64 6f 74 20 63 6f 6d   ".lint" dot com
28370 6d 61 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  mand..*/.static 
28380 69 6e 74 20 6c 69 6e 74 44 6f 74 43 6f 6d 6d 61  int lintDotComma
28390 6e 64 28 0a 20 20 53 68 65 6c 6c 53 74 61 74 65  nd(.  ShellState
283a0 20 2a 70 53 74 61 74 65 2c 20 20 20 20 20 20 20   *pState,       
283b0 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74        /* Current
283c0 20 73 68 65 6c 6c 20 74 6f 6f 6c 20 73 74 61 74   shell tool stat
283d0 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 7a  e */.  char **az
283e0 41 72 67 2c 20 20 20 20 20 20 20 20 20 20 20 20  Arg,            
283f0 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20         /* Array 
28400 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 70 61 73  of arguments pas
28410 73 65 64 20 74 6f 20 64 6f 74 20 63 6f 6d 6d 61  sed to dot comma
28420 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 72 67  nd */.  int nArg
28430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28440 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
28450 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20  r of entries in 
28460 61 7a 41 72 67 5b 5d 20 2a 2f 0a 29 7b 0a 20 20  azArg[] */.){.  
28470 69 6e 74 20 6e 3b 0a 20 20 6e 20 3d 20 28 6e 41  int n;.  n = (nA
28480 72 67 3e 3d 32 20 3f 20 73 74 72 6c 65 6e 33 30  rg>=2 ? strlen30
28490 28 61 7a 41 72 67 5b 31 5d 29 20 3a 20 30 29 3b  (azArg[1]) : 0);
284a0 0a 20 20 69 66 28 20 6e 3c 31 20 7c 7c 20 73 71  .  if( n<1 || sq
284b0 6c 69 74 65 33 5f 73 74 72 6e 69 63 6d 70 28 61  lite3_strnicmp(a
284c0 7a 41 72 67 5b 31 5d 2c 20 22 66 6b 65 79 2d 69  zArg[1], "fkey-i
284d0 6e 64 65 78 65 73 22 2c 20 6e 29 20 29 20 67 6f  ndexes", n) ) go
284e0 74 6f 20 75 73 61 67 65 3b 0a 20 20 72 65 74 75  to usage;.  retu
284f0 72 6e 20 6c 69 6e 74 46 6b 65 79 49 6e 64 65 78  rn lintFkeyIndex
28500 65 73 28 70 53 74 61 74 65 2c 20 61 7a 41 72 67  es(pState, azArg
28510 2c 20 6e 41 72 67 29 3b 0a 0a 20 75 73 61 67 65  , nArg);.. usage
28520 3a 0a 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73  :.  raw_printf(s
28530 74 64 65 72 72 2c 20 22 55 73 61 67 65 20 25 73  tderr, "Usage %s
28540 20 73 75 62 2d 63 6f 6d 6d 61 6e 64 20 3f 73 77   sub-command ?sw
28550 69 74 63 68 65 73 2e 2e 2e 3f 5c 6e 22 2c 20 61  itches...?\n", a
28560 7a 41 72 67 5b 30 5d 29 3b 0a 20 20 72 61 77 5f  zArg[0]);.  raw_
28570 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
28580 57 68 65 72 65 20 73 75 62 2d 63 6f 6d 6d 61 6e  Where sub-comman
28590 64 73 20 61 72 65 3a 5c 6e 22 29 3b 0a 20 20 72  ds are:\n");.  r
285a0 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  aw_printf(stderr
285b0 2c 20 22 20 20 20 20 66 6b 65 79 2d 69 6e 64 65  , "    fkey-inde
285c0 78 65 73 5c 6e 22 29 3b 0a 20 20 72 65 74 75 72  xes\n");.  retur
285d0 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
285e0 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  }..#if !defined(
285f0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
28600 55 41 4c 54 41 42 4c 45 29 20 26 26 20 64 65 66  UALTABLE) && def
28610 69 6e 65 64 28 53 51 4c 49 54 45 5f 48 41 56 45  ined(SQLITE_HAVE
28620 5f 5a 4c 49 42 29 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  _ZLIB)./********
28630 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28640 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28650 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28660 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28670 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 65  *********.** The
28680 20 22 2e 61 72 63 68 69 76 65 22 20 6f 72 20 22   ".archive" or "
28690 2e 61 72 22 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f  .ar" command..*/
286a0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 68 65  .static void she
286b0 6c 6c 50 72 65 70 61 72 65 28 0a 20 20 73 71 6c  llPrepare(.  sql
286c0 69 74 65 33 20 2a 64 62 2c 20 0a 20 20 69 6e 74  ite3 *db, .  int
286d0 20 2a 70 52 63 2c 20 0a 20 20 63 6f 6e 73 74 20   *pRc, .  const 
286e0 63 68 61 72 20 2a 7a 53 71 6c 2c 20 0a 20 20 73  char *zSql, .  s
286f0 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 2a 70 70  qlite3_stmt **pp
28700 53 74 6d 74 0a 29 7b 0a 20 20 2a 70 70 53 74 6d  Stmt.){.  *ppStm
28710 74 20 3d 20 30 3b 0a 20 20 69 66 28 20 2a 70 52  t = 0;.  if( *pR
28720 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
28730 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c      int rc = sql
28740 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28  ite3_prepare_v2(
28750 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 70 70  db, zSql, -1, pp
28760 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 69 66  Stmt, 0);.    if
28770 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
28780 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69  ){.      raw_pri
28790 6e 74 66 28 73 74 64 65 72 72 2c 20 22 73 71 6c  ntf(stderr, "sql
287a0 20 65 72 72 6f 72 3a 20 25 73 20 28 25 64 29 5c   error: %s (%d)\
287b0 6e 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20 73  n", .          s
287c0 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62  qlite3_errmsg(db
287d0 29 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 63 6f  ), sqlite3_errco
287e0 64 65 28 64 62 29 0a 20 20 20 20 20 20 29 3b 0a  de(db).      );.
287f0 20 20 20 20 20 20 2a 70 52 63 20 3d 20 72 63 3b        *pRc = rc;
28800 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 73 74  .    }.  }.}..st
28810 61 74 69 63 20 76 6f 69 64 20 73 68 65 6c 6c 50  atic void shellP
28820 72 65 70 61 72 65 50 72 69 6e 74 66 28 0a 20 20  reparePrintf(.  
28830 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 0a 20 20  sqlite3 *db, .  
28840 69 6e 74 20 2a 70 52 63 2c 20 0a 20 20 73 71 6c  int *pRc, .  sql
28850 69 74 65 33 5f 73 74 6d 74 20 2a 2a 70 70 53 74  ite3_stmt **ppSt
28860 6d 74 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  mt,.  const char
28870 20 2a 7a 46 6d 74 2c 20 0a 20 20 2e 2e 2e 0a 29   *zFmt, .  ....)
28880 7b 0a 20 20 2a 70 70 53 74 6d 74 20 3d 20 30 3b  {.  *ppStmt = 0;
28890 0a 20 20 69 66 28 20 2a 70 52 63 3d 3d 53 51 4c  .  if( *pRc==SQL
288a0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 76 61  ITE_OK ){.    va
288b0 5f 6c 69 73 74 20 61 70 3b 0a 20 20 20 20 63 68  _list ap;.    ch
288c0 61 72 20 2a 7a 3b 0a 20 20 20 20 76 61 5f 73 74  ar *z;.    va_st
288d0 61 72 74 28 61 70 2c 20 7a 46 6d 74 29 3b 0a 20  art(ap, zFmt);. 
288e0 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 76     z = sqlite3_v
288f0 6d 70 72 69 6e 74 66 28 7a 46 6d 74 2c 20 61 70  mprintf(zFmt, ap
28900 29 3b 0a 20 20 20 20 76 61 5f 65 6e 64 28 61 70  );.    va_end(ap
28910 29 3b 0a 20 20 20 20 69 66 28 20 7a 3d 3d 30 20  );.    if( z==0 
28920 29 7b 0a 20 20 20 20 20 20 2a 70 52 63 20 3d 20  ){.      *pRc = 
28930 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
28940 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
28950 68 65 6c 6c 50 72 65 70 61 72 65 28 64 62 2c 20  hellPrepare(db, 
28960 70 52 63 2c 20 7a 2c 20 70 70 53 74 6d 74 29 3b  pRc, z, ppStmt);
28970 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
28980 72 65 65 28 7a 29 3b 0a 20 20 20 20 7d 0a 20 20  ree(z);.    }.  
28990 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  }.}..static void
289a0 20 73 68 65 6c 6c 46 69 6e 61 6c 69 7a 65 28 0a   shellFinalize(.
289b0 20 20 69 6e 74 20 2a 70 52 63 2c 20 0a 20 20 73    int *pRc, .  s
289c0 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
289d0 6d 74 0a 29 7b 0a 20 20 69 66 28 20 70 53 74 6d  mt.){.  if( pStm
289e0 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  t ){.    sqlite3
289f0 20 2a 64 62 20 3d 20 73 71 6c 69 74 65 33 5f 64   *db = sqlite3_d
28a00 62 5f 68 61 6e 64 6c 65 28 70 53 74 6d 74 29 3b  b_handle(pStmt);
28a10 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73 71  .    int rc = sq
28a20 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
28a30 53 74 6d 74 29 3b 0a 20 20 20 20 69 66 28 20 2a  Stmt);.    if( *
28a40 70 52 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  pRc==SQLITE_OK )
28a50 7b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  {.      if( rc!=
28a60 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
28a70 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
28a80 73 74 64 65 72 72 2c 20 22 53 51 4c 20 65 72 72  stderr, "SQL err
28a90 6f 72 3a 20 25 73 5c 6e 22 2c 20 73 71 6c 69 74  or: %s\n", sqlit
28aa0 65 33 5f 65 72 72 6d 73 67 28 64 62 29 29 3b 0a  e3_errmsg(db));.
28ab0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2a 70        }.      *p
28ac0 52 63 20 3d 20 72 63 3b 0a 20 20 20 20 7d 0a 20  Rc = rc;.    }. 
28ad0 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69   }.}..static voi
28ae0 64 20 73 68 65 6c 6c 52 65 73 65 74 28 0a 20 20  d shellReset(.  
28af0 69 6e 74 20 2a 70 52 63 2c 20 0a 20 20 73 71 6c  int *pRc, .  sql
28b00 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
28b10 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 73  .){.  int rc = s
28b20 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 53 74  qlite3_reset(pSt
28b30 6d 74 29 3b 0a 20 20 69 66 28 20 2a 70 52 63 3d  mt);.  if( *pRc=
28b40 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
28b50 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
28b60 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  _OK ){.      sql
28b70 69 74 65 33 20 2a 64 62 20 3d 20 73 71 6c 69 74  ite3 *db = sqlit
28b80 65 33 5f 64 62 5f 68 61 6e 64 6c 65 28 70 53 74  e3_db_handle(pSt
28b90 6d 74 29 3b 0a 20 20 20 20 20 20 72 61 77 5f 70  mt);.      raw_p
28ba0 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 53  rintf(stderr, "S
28bb0 51 4c 20 65 72 72 6f 72 3a 20 25 73 5c 6e 22 2c  QL error: %s\n",
28bc0 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
28bd0 64 62 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  db));.    }.    
28be0 2a 70 52 63 20 3d 20 72 63 3b 0a 20 20 7d 0a 7d  *pRc = rc;.  }.}
28bf0 0a 2f 2a 0a 2a 2a 20 53 74 72 75 63 74 75 72 65  ./*.** Structure
28c00 20 72 65 70 72 65 73 65 6e 74 69 6e 67 20 61 20   representing a 
28c10 73 69 6e 67 6c 65 20 22 2e 61 72 22 20 63 6f 6d  single ".ar" com
28c20 6d 61 6e 64 2e 0a 2a 2f 0a 74 79 70 65 64 65 66  mand..*/.typedef
28c30 20 73 74 72 75 63 74 20 41 72 43 6f 6d 6d 61 6e   struct ArComman
28c40 64 20 41 72 43 6f 6d 6d 61 6e 64 3b 0a 73 74 72  d ArCommand;.str
28c50 75 63 74 20 41 72 43 6f 6d 6d 61 6e 64 20 7b 0a  uct ArCommand {.
28c60 20 20 75 38 20 65 43 6d 64 3b 20 20 20 20 20 20    u8 eCmd;      
28c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28c80 20 20 2f 2a 20 41 6e 20 41 52 5f 43 4d 44 5f 2a    /* An AR_CMD_*
28c90 20 76 61 6c 75 65 20 2a 2f 0a 20 20 75 38 20 62   value */.  u8 b
28ca0 56 65 72 62 6f 73 65 3b 20 20 20 20 20 20 20 20  Verbose;        
28cb0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
28cc0 72 75 65 20 69 66 20 2d 2d 76 65 72 62 6f 73 65  rue if --verbose
28cd0 20 2a 2f 0a 20 20 75 38 20 62 5a 69 70 3b 20 20   */.  u8 bZip;  
28ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28cf0 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
28d00 20 74 68 65 20 61 72 63 68 69 76 65 20 69 73 20   the archive is 
28d10 61 20 5a 49 50 20 2a 2f 0a 20 20 75 38 20 62 44  a ZIP */.  u8 bD
28d20 72 79 52 75 6e 3b 20 20 20 20 20 20 20 20 20 20  ryRun;          
28d30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
28d40 75 65 20 69 66 20 2d 2d 64 72 79 2d 72 75 6e 20  ue if --dry-run 
28d50 2a 2f 0a 20 20 75 38 20 62 41 70 70 65 6e 64 3b  */.  u8 bAppend;
28d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28d70 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
28d80 2d 2d 61 70 70 65 6e 64 20 2a 2f 0a 20 20 75 38  --append */.  u8
28d90 20 66 72 6f 6d 43 6d 64 4c 69 6e 65 3b 20 20 20   fromCmdLine;   
28da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
28db0 20 52 75 6e 20 66 72 6f 6d 20 2d 41 20 69 6e 73   Run from -A ins
28dc0 74 65 61 64 20 6f 66 20 2e 61 72 63 68 69 76 65  tead of .archive
28dd0 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 72 67 3b 20   */.  int nArg; 
28de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28df0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
28e00 6f 66 20 63 6f 6d 6d 61 6e 64 20 61 72 67 75 6d  of command argum
28e10 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ents */.  char *
28e20 7a 53 72 63 54 61 62 6c 65 3b 20 20 20 20 20 20  zSrcTable;      
28e30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 22 73 71            /* "sq
28e40 6c 61 72 22 2c 20 22 7a 69 70 66 69 6c 65 28 24  lar", "zipfile($
28e50 66 69 6c 65 29 22 20 6f 72 20 22 7a 69 70 22 20  file)" or "zip" 
28e60 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
28e70 2a 7a 46 69 6c 65 3b 20 20 20 20 20 20 20 20 20  *zFile;         
28e80 20 20 20 20 20 2f 2a 20 2d 2d 66 69 6c 65 20 61       /* --file a
28e90 72 67 75 6d 65 6e 74 2c 20 6f 72 20 4e 55 4c 4c  rgument, or NULL
28ea0 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
28eb0 20 2a 7a 44 69 72 3b 20 20 20 20 20 20 20 20 20   *zDir;         
28ec0 20 20 20 20 20 20 2f 2a 20 2d 2d 64 69 72 65 63        /* --direc
28ed0 74 6f 72 79 20 61 72 67 75 6d 65 6e 74 2c 20 6f  tory argument, o
28ee0 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 63 68 61 72  r NULL */.  char
28ef0 20 2a 2a 61 7a 41 72 67 3b 20 20 20 20 20 20 20   **azArg;       
28f00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
28f10 72 72 61 79 20 6f 66 20 63 6f 6d 6d 61 6e 64 20  rray of command 
28f20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 53  arguments */.  S
28f30 68 65 6c 6c 53 74 61 74 65 20 2a 70 3b 20 20 20  hellState *p;   
28f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
28f50 2a 20 53 68 65 6c 6c 20 73 74 61 74 65 20 2a 2f  * Shell state */
28f60 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20  .  sqlite3 *db; 
28f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28f80 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63     /* Database c
28f90 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 61 72  ontaining the ar
28fa0 63 68 69 76 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a  chive */.};../*.
28fb0 2a 2a 20 50 72 69 6e 74 20 61 20 75 73 61 67 65  ** Print a usage
28fc0 20 6d 65 73 73 61 67 65 20 66 6f 72 20 74 68 65   message for the
28fd0 20 2e 61 72 20 63 6f 6d 6d 61 6e 64 20 74 6f 20   .ar command to 
28fe0 73 74 64 65 72 72 20 61 6e 64 20 72 65 74 75 72  stderr and retur
28ff0 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2e 0a  n SQLITE_ERROR..
29000 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 72  */.static int ar
29010 55 73 61 67 65 28 46 49 4c 45 20 2a 66 29 7b 0a  Usage(FILE *f){.
29020 20 20 73 68 6f 77 48 65 6c 70 28 66 2c 22 61 72    showHelp(f,"ar
29030 63 68 69 76 65 22 29 3b 0a 20 20 72 65 74 75 72  chive");.  retur
29040 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
29050 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61  }../*.** Print a
29060 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  n error message 
29070 66 6f 72 20 74 68 65 20 2e 61 72 20 63 6f 6d 6d  for the .ar comm
29080 61 6e 64 20 74 6f 20 73 74 64 65 72 72 20 61 6e  and to stderr an
29090 64 20 72 65 74 75 72 6e 20 0a 2a 2a 20 53 51 4c  d return .** SQL
290a0 49 54 45 5f 45 52 52 4f 52 2e 0a 2a 2f 0a 73 74  ITE_ERROR..*/.st
290b0 61 74 69 63 20 69 6e 74 20 61 72 45 72 72 6f 72  atic int arError
290c0 4d 73 67 28 41 72 43 6f 6d 6d 61 6e 64 20 2a 70  Msg(ArCommand *p
290d0 41 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  Ar, const char *
290e0 7a 46 6d 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61  zFmt, ...){.  va
290f0 5f 6c 69 73 74 20 61 70 3b 0a 20 20 63 68 61 72  _list ap;.  char
29100 20 2a 7a 3b 0a 20 20 76 61 5f 73 74 61 72 74 28   *z;.  va_start(
29110 61 70 2c 20 7a 46 6d 74 29 3b 0a 20 20 7a 20 3d  ap, zFmt);.  z =
29120 20 73 71 6c 69 74 65 33 5f 76 6d 70 72 69 6e 74   sqlite3_vmprint
29130 66 28 7a 46 6d 74 2c 20 61 70 29 3b 0a 20 20 76  f(zFmt, ap);.  v
29140 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 75 74 66  a_end(ap);.  utf
29150 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  8_printf(stderr,
29160 20 22 45 72 72 6f 72 3a 20 25 73 5c 6e 22 2c 20   "Error: %s\n", 
29170 7a 29 3b 0a 20 20 69 66 28 20 70 41 72 2d 3e 66  z);.  if( pAr->f
29180 72 6f 6d 43 6d 64 4c 69 6e 65 20 29 7b 0a 20 20  romCmdLine ){.  
29190 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74    utf8_printf(st
291a0 64 65 72 72 2c 20 22 55 73 65 20 5c 22 2d 41 5c  derr, "Use \"-A\
291b0 22 20 66 6f 72 20 6d 6f 72 65 20 68 65 6c 70 5c  " for more help\
291c0 6e 22 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  n");.  }else{.  
291d0 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74    utf8_printf(st
291e0 64 65 72 72 2c 20 22 55 73 65 20 5c 22 2e 61 72  derr, "Use \".ar
291f0 63 68 69 76 65 20 2d 2d 68 65 6c 70 5c 22 20 66  chive --help\" f
29200 6f 72 20 6d 6f 72 65 20 68 65 6c 70 5c 6e 22 29  or more help\n")
29210 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
29220 66 72 65 65 28 7a 29 3b 0a 20 20 72 65 74 75 72  free(z);.  retur
29230 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
29240 7d 0a 0a 2f 2a 0a 2a 2a 20 56 61 6c 75 65 73 20  }../*.** Values 
29250 66 6f 72 20 41 72 43 6f 6d 6d 61 6e 64 2e 65 43  for ArCommand.eC
29260 6d 64 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 41  md..*/.#define A
29270 52 5f 43 4d 44 5f 43 52 45 41 54 45 20 20 20 20  R_CMD_CREATE    
29280 20 20 20 31 0a 23 64 65 66 69 6e 65 20 41 52 5f     1.#define AR_
29290 43 4d 44 5f 55 50 44 41 54 45 20 20 20 20 20 20  CMD_UPDATE      
292a0 20 32 0a 23 64 65 66 69 6e 65 20 41 52 5f 43 4d   2.#define AR_CM
292b0 44 5f 49 4e 53 45 52 54 20 20 20 20 20 20 20 33  D_INSERT       3
292c0 0a 23 64 65 66 69 6e 65 20 41 52 5f 43 4d 44 5f  .#define AR_CMD_
292d0 45 58 54 52 41 43 54 20 20 20 20 20 20 34 0a 23  EXTRACT      4.#
292e0 64 65 66 69 6e 65 20 41 52 5f 43 4d 44 5f 4c 49  define AR_CMD_LI
292f0 53 54 20 20 20 20 20 20 20 20 20 35 0a 23 64 65  ST         5.#de
29300 66 69 6e 65 20 41 52 5f 43 4d 44 5f 48 45 4c 50  fine AR_CMD_HELP
29310 20 20 20 20 20 20 20 20 20 36 0a 0a 2f 2a 0a 2a           6../*.*
29320 2a 20 4f 74 68 65 72 20 28 6e 6f 6e 2d 63 6f 6d  * Other (non-com
29330 6d 61 6e 64 29 20 73 77 69 74 63 68 65 73 2e 0a  mand) switches..
29340 2a 2f 0a 23 64 65 66 69 6e 65 20 41 52 5f 53 57  */.#define AR_SW
29350 49 54 43 48 5f 56 45 52 42 4f 53 45 20 20 20 20  ITCH_VERBOSE    
29360 20 37 0a 23 64 65 66 69 6e 65 20 41 52 5f 53 57   7.#define AR_SW
29370 49 54 43 48 5f 46 49 4c 45 20 20 20 20 20 20 20  ITCH_FILE       
29380 20 38 0a 23 64 65 66 69 6e 65 20 41 52 5f 53 57   8.#define AR_SW
29390 49 54 43 48 5f 44 49 52 45 43 54 4f 52 59 20 20  ITCH_DIRECTORY  
293a0 20 39 0a 23 64 65 66 69 6e 65 20 41 52 5f 53 57   9.#define AR_SW
293b0 49 54 43 48 5f 41 50 50 45 4e 44 20 20 20 20 20  ITCH_APPEND     
293c0 31 30 0a 23 64 65 66 69 6e 65 20 41 52 5f 53 57  10.#define AR_SW
293d0 49 54 43 48 5f 44 52 59 52 55 4e 20 20 20 20 20  ITCH_DRYRUN     
293e0 31 31 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 61  11..static int a
293f0 72 50 72 6f 63 65 73 73 53 77 69 74 63 68 28 41  rProcessSwitch(A
29400 72 43 6f 6d 6d 61 6e 64 20 2a 70 41 72 2c 20 69  rCommand *pAr, i
29410 6e 74 20 65 53 77 69 74 63 68 2c 20 63 6f 6e 73  nt eSwitch, cons
29420 74 20 63 68 61 72 20 2a 7a 41 72 67 29 7b 0a 20  t char *zArg){. 
29430 20 73 77 69 74 63 68 28 20 65 53 77 69 74 63 68   switch( eSwitch
29440 20 29 7b 0a 20 20 20 20 63 61 73 65 20 41 52 5f   ){.    case AR_
29450 43 4d 44 5f 43 52 45 41 54 45 3a 0a 20 20 20 20  CMD_CREATE:.    
29460 63 61 73 65 20 41 52 5f 43 4d 44 5f 45 58 54 52  case AR_CMD_EXTR
29470 41 43 54 3a 0a 20 20 20 20 63 61 73 65 20 41 52  ACT:.    case AR
29480 5f 43 4d 44 5f 4c 49 53 54 3a 0a 20 20 20 20 63  _CMD_LIST:.    c
29490 61 73 65 20 41 52 5f 43 4d 44 5f 55 50 44 41 54  ase AR_CMD_UPDAT
294a0 45 3a 0a 20 20 20 20 63 61 73 65 20 41 52 5f 43  E:.    case AR_C
294b0 4d 44 5f 49 4e 53 45 52 54 3a 0a 20 20 20 20 63  MD_INSERT:.    c
294c0 61 73 65 20 41 52 5f 43 4d 44 5f 48 45 4c 50 3a  ase AR_CMD_HELP:
294d0 0a 20 20 20 20 20 20 69 66 28 20 70 41 72 2d 3e  .      if( pAr->
294e0 65 43 6d 64 20 29 7b 0a 20 20 20 20 20 20 20 20  eCmd ){.        
294f0 72 65 74 75 72 6e 20 61 72 45 72 72 6f 72 4d 73  return arErrorMs
29500 67 28 70 41 72 2c 20 22 6d 75 6c 74 69 70 6c 65  g(pAr, "multiple
29510 20 63 6f 6d 6d 61 6e 64 20 6f 70 74 69 6f 6e 73   command options
29520 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ");.      }.    
29530 20 20 70 41 72 2d 3e 65 43 6d 64 20 3d 20 65 53    pAr->eCmd = eS
29540 77 69 74 63 68 3b 0a 20 20 20 20 20 20 62 72 65  witch;.      bre
29550 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 41 52  ak;..    case AR
29560 5f 53 57 49 54 43 48 5f 44 52 59 52 55 4e 3a 0a  _SWITCH_DRYRUN:.
29570 20 20 20 20 20 20 70 41 72 2d 3e 62 44 72 79 52        pAr->bDryR
29580 75 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 62 72  un = 1;.      br
29590 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 41 52  eak;.    case AR
295a0 5f 53 57 49 54 43 48 5f 56 45 52 42 4f 53 45 3a  _SWITCH_VERBOSE:
295b0 0a 20 20 20 20 20 20 70 41 72 2d 3e 62 56 65 72  .      pAr->bVer
295c0 62 6f 73 65 20 3d 20 31 3b 0a 20 20 20 20 20 20  bose = 1;.      
295d0 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
295e0 41 52 5f 53 57 49 54 43 48 5f 41 50 50 45 4e 44  AR_SWITCH_APPEND
295f0 3a 0a 20 20 20 20 20 20 70 41 72 2d 3e 62 41 70  :.      pAr->bAp
29600 70 65 6e 64 20 3d 20 31 3b 0a 20 20 20 20 20 20  pend = 1;.      
29610 2f 2a 20 46 61 6c 6c 20 74 68 72 75 20 69 6e 74  /* Fall thru int
29620 6f 20 2d 2d 66 69 6c 65 20 2a 2f 0a 20 20 20 20  o --file */.    
29630 63 61 73 65 20 41 52 5f 53 57 49 54 43 48 5f 46  case AR_SWITCH_F
29640 49 4c 45 3a 0a 20 20 20 20 20 20 70 41 72 2d 3e  ILE:.      pAr->
29650 7a 46 69 6c 65 20 3d 20 7a 41 72 67 3b 0a 20 20  zFile = zArg;.  
29660 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
29670 61 73 65 20 41 52 5f 53 57 49 54 43 48 5f 44 49  ase AR_SWITCH_DI
29680 52 45 43 54 4f 52 59 3a 0a 20 20 20 20 20 20 70  RECTORY:.      p
29690 41 72 2d 3e 7a 44 69 72 20 3d 20 7a 41 72 67 3b  Ar->zDir = zArg;
296a0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
296b0 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  }..  return SQLI
296c0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
296d0 50 61 72 73 65 20 74 68 65 20 63 6f 6d 6d 61 6e  Parse the comman
296e0 64 20 6c 69 6e 65 20 66 6f 72 20 61 6e 20 22 2e  d line for an ".
296f0 61 72 22 20 63 6f 6d 6d 61 6e 64 2e 20 54 68 65  ar" command. The
29700 20 72 65 73 75 6c 74 73 20 61 72 65 20 77 72 69   results are wri
29710 74 74 65 6e 20 69 6e 74 6f 0a 2a 2a 20 73 74 72  tten into.** str
29720 75 63 74 75 72 65 20 28 2a 70 41 72 29 2e 20 53  ucture (*pAr). S
29730 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
29740 72 6e 65 64 20 69 66 20 74 68 65 20 63 6f 6d 6d  rned if the comm
29750 61 6e 64 20 6c 69 6e 65 20 69 73 20 70 61 72 73  and line is pars
29760 65 64 0a 2a 2a 20 73 75 63 63 65 73 73 66 75 6c  ed.** successful
29770 6c 79 2c 20 6f 74 68 65 72 77 69 73 65 20 61 6e  ly, otherwise an
29780 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69   error message i
29790 73 20 77 72 69 74 74 65 6e 20 74 6f 20 73 74 64  s written to std
297a0 65 72 72 20 61 6e 64 20 0a 2a 2a 20 53 51 4c 49  err and .** SQLI
297b0 54 45 5f 45 52 52 4f 52 20 72 65 74 75 72 6e 65  TE_ERROR returne
297c0 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
297d0 20 61 72 50 61 72 73 65 43 6f 6d 6d 61 6e 64 28   arParseCommand(
297e0 0a 20 20 63 68 61 72 20 2a 2a 61 7a 41 72 67 2c  .  char **azArg,
297f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29800 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 61     /* Array of a
29810 72 67 75 6d 65 6e 74 73 20 70 61 73 73 65 64 20  rguments passed 
29820 74 6f 20 64 6f 74 20 63 6f 6d 6d 61 6e 64 20 2a  to dot command *
29830 2f 0a 20 20 69 6e 74 20 6e 41 72 67 2c 20 20 20  /.  int nArg,   
29840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29850 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
29860 20 65 6e 74 72 69 65 73 20 69 6e 20 61 7a 41 72   entries in azAr
29870 67 5b 5d 20 2a 2f 0a 20 20 41 72 43 6f 6d 6d 61  g[] */.  ArComma
29880 6e 64 20 2a 70 41 72 20 20 20 20 20 20 20 20 20  nd *pAr         
29890 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 70 75           /* Popu
298a0 6c 61 74 65 20 74 68 69 73 20 6f 62 6a 65 63 74  late this object
298b0 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20   */.){.  struct 
298c0 41 72 53 77 69 74 63 68 20 7b 0a 20 20 20 20 63  ArSwitch {.    c
298d0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4c 6f 6e 67  onst char *zLong
298e0 3b 0a 20 20 20 20 63 68 61 72 20 63 53 68 6f 72  ;.    char cShor
298f0 74 3b 0a 20 20 20 20 75 38 20 65 53 77 69 74 63  t;.    u8 eSwitc
29900 68 3b 0a 20 20 20 20 75 38 20 62 41 72 67 3b 0a  h;.    u8 bArg;.
29910 20 20 7d 20 61 53 77 69 74 63 68 5b 5d 20 3d 20    } aSwitch[] = 
29920 7b 0a 20 20 20 20 7b 20 22 63 72 65 61 74 65 22  {.    { "create"
29930 2c 20 20 20 20 27 63 27 2c 20 41 52 5f 43 4d 44  ,    'c', AR_CMD
29940 5f 43 52 45 41 54 45 2c 20 20 20 20 20 20 20 30  _CREATE,       0
29950 20 7d 2c 0a 20 20 20 20 7b 20 22 65 78 74 72 61   },.    { "extra
29960 63 74 22 2c 20 20 20 27 78 27 2c 20 41 52 5f 43  ct",   'x', AR_C
29970 4d 44 5f 45 58 54 52 41 43 54 2c 20 20 20 20 20  MD_EXTRACT,     
29980 20 30 20 7d 2c 0a 20 20 20 20 7b 20 22 69 6e 73   0 },.    { "ins
29990 65 72 74 22 2c 20 20 20 20 27 69 27 2c 20 41 52  ert",    'i', AR
299a0 5f 43 4d 44 5f 49 4e 53 45 52 54 2c 20 20 20 20  _CMD_INSERT,    
299b0 20 20 20 30 20 7d 2c 0a 20 20 20 20 7b 20 22 6c     0 },.    { "l
299c0 69 73 74 22 2c 20 20 20 20 20 20 27 74 27 2c 20  ist",      't', 
299d0 41 52 5f 43 4d 44 5f 4c 49 53 54 2c 20 20 20 20  AR_CMD_LIST,    
299e0 20 20 20 20 20 30 20 7d 2c 0a 20 20 20 20 7b 20       0 },.    { 
299f0 22 75 70 64 61 74 65 22 2c 20 20 20 20 27 75 27  "update",    'u'
29a00 2c 20 41 52 5f 43 4d 44 5f 55 50 44 41 54 45 2c  , AR_CMD_UPDATE,
29a10 20 20 20 20 20 20 20 30 20 7d 2c 0a 20 20 20 20         0 },.    
29a20 7b 20 22 68 65 6c 70 22 2c 20 20 20 20 20 20 27  { "help",      '
29a30 68 27 2c 20 41 52 5f 43 4d 44 5f 48 45 4c 50 2c  h', AR_CMD_HELP,
29a40 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 20 20           0 },.  
29a50 20 20 7b 20 22 76 65 72 62 6f 73 65 22 2c 20 20    { "verbose",  
29a60 20 27 76 27 2c 20 41 52 5f 53 57 49 54 43 48 5f   'v', AR_SWITCH_
29a70 56 45 52 42 4f 53 45 2c 20 20 20 30 20 7d 2c 0a  VERBOSE,   0 },.
29a80 20 20 20 20 7b 20 22 66 69 6c 65 22 2c 20 20 20      { "file",   
29a90 20 20 20 27 66 27 2c 20 41 52 5f 53 57 49 54 43     'f', AR_SWITC
29aa0 48 5f 46 49 4c 45 2c 20 20 20 20 20 20 31 20 7d  H_FILE,      1 }
29ab0 2c 0a 20 20 20 20 7b 20 22 61 70 70 65 6e 64 22  ,.    { "append"
29ac0 2c 20 20 20 20 27 61 27 2c 20 41 52 5f 53 57 49  ,    'a', AR_SWI
29ad0 54 43 48 5f 41 50 50 45 4e 44 2c 20 20 20 20 31  TCH_APPEND,    1
29ae0 20 7d 2c 0a 20 20 20 20 7b 20 22 64 69 72 65 63   },.    { "direc
29af0 74 6f 72 79 22 2c 20 27 43 27 2c 20 41 52 5f 53  tory", 'C', AR_S
29b00 57 49 54 43 48 5f 44 49 52 45 43 54 4f 52 59 2c  WITCH_DIRECTORY,
29b10 20 31 20 7d 2c 0a 20 20 20 20 7b 20 22 64 72 79   1 },.    { "dry
29b20 72 75 6e 22 2c 20 20 20 20 27 6e 27 2c 20 41 52  run",    'n', AR
29b30 5f 53 57 49 54 43 48 5f 44 52 59 52 55 4e 2c 20  _SWITCH_DRYRUN, 
29b40 20 20 20 30 20 7d 2c 0a 20 20 7d 3b 0a 20 20 69     0 },.  };.  i
29b50 6e 74 20 6e 53 77 69 74 63 68 20 3d 20 73 69 7a  nt nSwitch = siz
29b60 65 6f 66 28 61 53 77 69 74 63 68 29 20 2f 20 73  eof(aSwitch) / s
29b70 69 7a 65 6f 66 28 73 74 72 75 63 74 20 41 72 53  izeof(struct ArS
29b80 77 69 74 63 68 29 3b 0a 20 20 73 74 72 75 63 74  witch);.  struct
29b90 20 41 72 53 77 69 74 63 68 20 2a 70 45 6e 64 20   ArSwitch *pEnd 
29ba0 3d 20 26 61 53 77 69 74 63 68 5b 6e 53 77 69 74  = &aSwitch[nSwit
29bb0 63 68 5d 3b 0a 0a 20 20 69 66 28 20 6e 41 72 67  ch];..  if( nArg
29bc0 3c 3d 31 20 29 7b 0a 20 20 20 20 75 74 66 38 5f  <=1 ){.    utf8_
29bd0 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
29be0 57 72 6f 6e 67 20 6e 75 6d 62 65 72 20 6f 66 20  Wrong number of 
29bf0 61 72 67 75 6d 65 6e 74 73 2e 20 20 55 73 61 67  arguments.  Usag
29c00 65 3a 5c 6e 22 29 3b 0a 20 20 20 20 72 65 74 75  e:\n");.    retu
29c10 72 6e 20 61 72 55 73 61 67 65 28 73 74 64 65 72  rn arUsage(stder
29c20 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  r);.  }else{.   
29c30 20 63 68 61 72 20 2a 7a 20 3d 20 61 7a 41 72 67   char *z = azArg
29c40 5b 31 5d 3b 0a 20 20 20 20 69 66 28 20 7a 5b 30  [1];.    if( z[0
29c50 5d 21 3d 27 2d 27 20 29 7b 0a 20 20 20 20 20 20  ]!='-' ){.      
29c60 2f 2a 20 54 72 61 64 69 74 69 6f 6e 61 6c 20 73  /* Traditional s
29c70 74 79 6c 65 20 5b 74 61 72 5d 20 69 6e 76 6f 63  tyle [tar] invoc
29c80 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 69  ation */.      i
29c90 6e 74 20 69 3b 0a 20 20 20 20 20 20 69 6e 74 20  nt i;.      int 
29ca0 69 41 72 67 20 3d 20 32 3b 0a 20 20 20 20 20 20  iArg = 2;.      
29cb0 66 6f 72 28 69 3d 30 3b 20 7a 5b 69 5d 3b 20 69  for(i=0; z[i]; i
29cc0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e  ++){.        con
29cd0 73 74 20 63 68 61 72 20 2a 7a 41 72 67 20 3d 20  st char *zArg = 
29ce0 30 3b 0a 20 20 20 20 20 20 20 20 73 74 72 75 63  0;.        struc
29cf0 74 20 41 72 53 77 69 74 63 68 20 2a 70 4f 70 74  t ArSwitch *pOpt
29d00 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 70 4f  ;.        for(pO
29d10 70 74 3d 26 61 53 77 69 74 63 68 5b 30 5d 3b 20  pt=&aSwitch[0]; 
29d20 70 4f 70 74 3c 70 45 6e 64 3b 20 70 4f 70 74 2b  pOpt<pEnd; pOpt+
29d30 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66  +){.          if
29d40 28 20 7a 5b 69 5d 3d 3d 70 4f 70 74 2d 3e 63 53  ( z[i]==pOpt->cS
29d50 68 6f 72 74 20 29 20 62 72 65 61 6b 3b 0a 20 20  hort ) break;.  
29d60 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
29d70 69 66 28 20 70 4f 70 74 3d 3d 70 45 6e 64 20 29  if( pOpt==pEnd )
29d80 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  {.          retu
29d90 72 6e 20 61 72 45 72 72 6f 72 4d 73 67 28 70 41  rn arErrorMsg(pA
29da0 72 2c 20 22 75 6e 72 65 63 6f 67 6e 69 7a 65 64  r, "unrecognized
29db0 20 6f 70 74 69 6f 6e 3a 20 25 63 22 2c 20 7a 5b   option: %c", z[
29dc0 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  i]);.        }. 
29dd0 20 20 20 20 20 20 20 69 66 28 20 70 4f 70 74 2d         if( pOpt-
29de0 3e 62 41 72 67 20 29 7b 0a 20 20 20 20 20 20 20  >bArg ){.       
29df0 20 20 20 69 66 28 20 69 41 72 67 3e 3d 6e 41 72     if( iArg>=nAr
29e00 67 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  g ){.           
29e10 20 72 65 74 75 72 6e 20 61 72 45 72 72 6f 72 4d   return arErrorM
29e20 73 67 28 70 41 72 2c 20 22 6f 70 74 69 6f 6e 20  sg(pAr, "option 
29e30 72 65 71 75 69 72 65 73 20 61 6e 20 61 72 67 75  requires an argu
29e40 6d 65 6e 74 3a 20 25 63 22 2c 7a 5b 69 5d 29 3b  ment: %c",z[i]);
29e50 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
29e60 20 20 20 20 20 20 20 7a 41 72 67 20 3d 20 61 7a         zArg = az
29e70 41 72 67 5b 69 41 72 67 2b 2b 5d 3b 0a 20 20 20  Arg[iArg++];.   
29e80 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
29e90 66 28 20 61 72 50 72 6f 63 65 73 73 53 77 69 74  f( arProcessSwit
29ea0 63 68 28 70 41 72 2c 20 70 4f 70 74 2d 3e 65 53  ch(pAr, pOpt->eS
29eb0 77 69 74 63 68 2c 20 7a 41 72 67 29 20 29 20 72  witch, zArg) ) r
29ec0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
29ed0 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OR;.      }.    
29ee0 20 20 70 41 72 2d 3e 6e 41 72 67 20 3d 20 6e 41    pAr->nArg = nA
29ef0 72 67 2d 69 41 72 67 3b 0a 20 20 20 20 20 20 69  rg-iArg;.      i
29f00 66 28 20 70 41 72 2d 3e 6e 41 72 67 3e 30 20 29  f( pAr->nArg>0 )
29f10 7b 0a 20 20 20 20 20 20 20 20 70 41 72 2d 3e 61  {.        pAr->a
29f20 7a 41 72 67 20 3d 20 26 61 7a 41 72 67 5b 69 41  zArg = &azArg[iA
29f30 72 67 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  rg];.      }.   
29f40 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a   }else{.      /*
29f50 20 4e 6f 6e 2d 74 72 61 64 69 74 69 6f 6e 61 6c   Non-traditional
29f60 20 69 6e 76 6f 63 61 74 69 6f 6e 20 2a 2f 0a 20   invocation */. 
29f70 20 20 20 20 20 69 6e 74 20 69 41 72 67 3b 0a 20       int iArg;. 
29f80 20 20 20 20 20 66 6f 72 28 69 41 72 67 3d 31 3b       for(iArg=1;
29f90 20 69 41 72 67 3c 6e 41 72 67 3b 20 69 41 72 67   iArg<nArg; iArg
29fa0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  ++){.        int
29fb0 20 6e 3b 0a 20 20 20 20 20 20 20 20 7a 20 3d 20   n;.        z = 
29fc0 61 7a 41 72 67 5b 69 41 72 67 5d 3b 0a 20 20 20  azArg[iArg];.   
29fd0 20 20 20 20 20 69 66 28 20 7a 5b 30 5d 21 3d 27       if( z[0]!='
29fe0 2d 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  -' ){.          
29ff0 2f 2a 20 41 6c 6c 20 72 65 6d 61 69 6e 69 6e 67  /* All remaining
2a000 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20 77 6f   command line wo
2a010 72 64 73 20 61 72 65 20 63 6f 6d 6d 61 6e 64 20  rds are command 
2a020 61 72 67 75 6d 65 6e 74 73 2e 20 2a 2f 0a 20 20  arguments. */.  
2a030 20 20 20 20 20 20 20 20 70 41 72 2d 3e 61 7a 41          pAr->azA
2a040 72 67 20 3d 20 26 61 7a 41 72 67 5b 69 41 72 67  rg = &azArg[iArg
2a050 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 70 41 72  ];.          pAr
2a060 2d 3e 6e 41 72 67 20 3d 20 6e 41 72 67 2d 69 41  ->nArg = nArg-iA
2a070 72 67 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72  rg;.          br
2a080 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
2a090 20 20 20 20 20 20 20 6e 20 3d 20 73 74 72 6c 65         n = strle
2a0a0 6e 33 30 28 7a 29 3b 0a 0a 20 20 20 20 20 20 20  n30(z);..       
2a0b0 20 69 66 28 20 7a 5b 31 5d 21 3d 27 2d 27 20 29   if( z[1]!='-' )
2a0c0 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  {.          int 
2a0d0 69 3b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  i;.          /* 
2a0e0 4f 6e 65 20 6f 72 20 6d 6f 72 65 20 73 68 6f 72  One or more shor
2a0f0 74 20 6f 70 74 69 6f 6e 73 20 2a 2f 0a 20 20 20  t options */.   
2a100 20 20 20 20 20 20 20 66 6f 72 28 69 3d 31 3b 20         for(i=1; 
2a110 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  i<n; i++){.     
2a120 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61         const cha
2a130 72 20 2a 7a 41 72 67 20 3d 20 30 3b 0a 20 20 20  r *zArg = 0;.   
2a140 20 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20           struct 
2a150 41 72 53 77 69 74 63 68 20 2a 70 4f 70 74 3b 0a  ArSwitch *pOpt;.
2a160 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 28              for(
2a170 70 4f 70 74 3d 26 61 53 77 69 74 63 68 5b 30 5d  pOpt=&aSwitch[0]
2a180 3b 20 70 4f 70 74 3c 70 45 6e 64 3b 20 70 4f 70  ; pOpt<pEnd; pOp
2a190 74 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  t++){.          
2a1a0 20 20 20 20 69 66 28 20 7a 5b 69 5d 3d 3d 70 4f      if( z[i]==pO
2a1b0 70 74 2d 3e 63 53 68 6f 72 74 20 29 20 62 72 65  pt->cShort ) bre
2a1c0 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ak;.            
2a1d0 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  }.            if
2a1e0 28 20 70 4f 70 74 3d 3d 70 45 6e 64 20 29 7b 0a  ( pOpt==pEnd ){.
2a1f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
2a200 74 75 72 6e 20 61 72 45 72 72 6f 72 4d 73 67 28  turn arErrorMsg(
2a210 70 41 72 2c 20 22 75 6e 72 65 63 6f 67 6e 69 7a  pAr, "unrecogniz
2a220 65 64 20 6f 70 74 69 6f 6e 3a 20 25 63 22 2c 20  ed option: %c", 
2a230 7a 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 20  z[i]);.         
2a240 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
2a250 20 69 66 28 20 70 4f 70 74 2d 3e 62 41 72 67 20   if( pOpt->bArg 
2a260 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
2a270 20 69 66 28 20 69 3c 28 6e 2d 31 29 20 29 7b 0a   if( i<(n-1) ){.
2a280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a290 7a 41 72 67 20 3d 20 26 7a 5b 69 2b 31 5d 3b 0a  zArg = &z[i+1];.
2a2a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a2b0 69 20 3d 20 6e 3b 0a 20 20 20 20 20 20 20 20 20  i = n;.         
2a2c0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2a2d0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
2a2e0 69 41 72 67 3e 3d 28 6e 41 72 67 2d 31 29 20 29  iArg>=(nArg-1) )
2a2f0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
2a300 20 20 20 20 72 65 74 75 72 6e 20 61 72 45 72 72      return arErr
2a310 6f 72 4d 73 67 28 70 41 72 2c 20 22 6f 70 74 69  orMsg(pAr, "opti
2a320 6f 6e 20 72 65 71 75 69 72 65 73 20 61 6e 20 61  on requires an a
2a330 72 67 75 6d 65 6e 74 3a 20 25 63 22 2c 7a 5b 69  rgument: %c",z[i
2a340 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ]);.            
2a350 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2a360 20 20 20 20 20 20 7a 41 72 67 20 3d 20 61 7a 41        zArg = azA
2a370 72 67 5b 2b 2b 69 41 72 67 5d 3b 0a 20 20 20 20  rg[++iArg];.    
2a380 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2a390 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2a3a0 20 20 20 20 20 20 69 66 28 20 61 72 50 72 6f 63        if( arProc
2a3b0 65 73 73 53 77 69 74 63 68 28 70 41 72 2c 20 70  essSwitch(pAr, p
2a3c0 4f 70 74 2d 3e 65 53 77 69 74 63 68 2c 20 7a 41  Opt->eSwitch, zA
2a3d0 72 67 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c  rg) ) return SQL
2a3e0 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  ITE_ERROR;.     
2a3f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
2a400 65 6c 73 65 20 69 66 28 20 7a 5b 32 5d 3d 3d 27  else if( z[2]=='
2a410 5c 30 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20  \0' ){.         
2a420 20 2f 2a 20 41 20 2d 2d 20 6f 70 74 69 6f 6e 2c   /* A -- option,
2a430 20 69 6e 64 69 63 61 74 69 6e 67 20 74 68 61 74   indicating that
2a440 20 61 6c 6c 20 72 65 6d 61 69 6e 69 6e 67 20 63   all remaining c
2a450 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20 77 6f 72 64  ommand line word
2a460 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61  s.          ** a
2a470 72 65 20 63 6f 6d 6d 61 6e 64 20 61 72 67 75 6d  re command argum
2a480 65 6e 74 73 2e 20 20 2a 2f 0a 20 20 20 20 20 20  ents.  */.      
2a490 20 20 20 20 70 41 72 2d 3e 61 7a 41 72 67 20 3d      pAr->azArg =
2a4a0 20 26 61 7a 41 72 67 5b 69 41 72 67 2b 31 5d 3b   &azArg[iArg+1];
2a4b0 0a 20 20 20 20 20 20 20 20 20 20 70 41 72 2d 3e  .          pAr->
2a4c0 6e 41 72 67 20 3d 20 6e 41 72 67 2d 69 41 72 67  nArg = nArg-iArg
2a4d0 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72  -1;.          br
2a4e0 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  eak;.        }el
2a4f0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  se{.          /*
2a500 20 41 20 6c 6f 6e 67 20 6f 70 74 69 6f 6e 20 2a   A long option *
2a510 2f 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73  /.          cons
2a520 74 20 63 68 61 72 20 2a 7a 41 72 67 20 3d 20 30  t char *zArg = 0
2a530 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
2a540 20 41 72 67 75 6d 65 6e 74 20 66 6f 72 20 6f 70   Argument for op
2a550 74 69 6f 6e 2c 20 69 66 20 61 6e 79 20 2a 2f 0a  tion, if any */.
2a560 20 20 20 20 20 20 20 20 20 20 73 74 72 75 63 74            struct
2a570 20 41 72 53 77 69 74 63 68 20 2a 70 4d 61 74 63   ArSwitch *pMatc
2a580 68 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 4d  h = 0;      /* M
2a590 61 74 63 68 69 6e 67 20 6f 70 74 69 6f 6e 20 2a  atching option *
2a5a0 2f 0a 20 20 20 20 20 20 20 20 20 20 73 74 72 75  /.          stru
2a5b0 63 74 20 41 72 53 77 69 74 63 68 20 2a 70 4f 70  ct ArSwitch *pOp
2a5c0 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t;            /*
2a5d0 20 49 74 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20   Iterator */.   
2a5e0 20 20 20 20 20 20 20 66 6f 72 28 70 4f 70 74 3d         for(pOpt=
2a5f0 26 61 53 77 69 74 63 68 5b 30 5d 3b 20 70 4f 70  &aSwitch[0]; pOp
2a600 74 3c 70 45 6e 64 3b 20 70 4f 70 74 2b 2b 29 7b  t<pEnd; pOpt++){
2a610 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e  .            con
2a620 73 74 20 63 68 61 72 20 2a 7a 4c 6f 6e 67 20 3d  st char *zLong =
2a630 20 70 4f 70 74 2d 3e 7a 4c 6f 6e 67 3b 0a 20 20   pOpt->zLong;.  
2a640 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28 6e            if( (n
2a650 2d 32 29 3c 3d 73 74 72 6c 65 6e 33 30 28 7a 4c  -2)<=strlen30(zL
2a660 6f 6e 67 29 20 26 26 20 30 3d 3d 6d 65 6d 63 6d  ong) && 0==memcm
2a670 70 28 26 7a 5b 32 5d 2c 20 7a 4c 6f 6e 67 2c 20  p(&z[2], zLong, 
2a680 6e 2d 32 29 20 29 7b 0a 20 20 20 20 20 20 20 20  n-2) ){.        
2a690 20 20 20 20 20 20 69 66 28 20 70 4d 61 74 63 68        if( pMatch
2a6a0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2a6b0 20 20 20 20 72 65 74 75 72 6e 20 61 72 45 72 72      return arErr
2a6c0 6f 72 4d 73 67 28 70 41 72 2c 20 22 61 6d 62 69  orMsg(pAr, "ambi
2a6d0 67 75 6f 75 73 20 6f 70 74 69 6f 6e 3a 20 25 73  guous option: %s
2a6e0 22 2c 7a 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ",z);.          
2a6f0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2a700 20 20 20 20 20 20 20 20 20 20 20 70 4d 61 74 63             pMatc
2a710 68 20 3d 20 70 4f 70 74 3b 0a 20 20 20 20 20 20  h = pOpt;.      
2a720 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2a730 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2a740 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 69    }..          i
2a750 66 28 20 70 4d 61 74 63 68 3d 3d 30 20 29 7b 0a  f( pMatch==0 ){.
2a760 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
2a770 72 6e 20 61 72 45 72 72 6f 72 4d 73 67 28 70 41  rn arErrorMsg(pA
2a780 72 2c 20 22 75 6e 72 65 63 6f 67 6e 69 7a 65 64  r, "unrecognized
2a790 20 6f 70 74 69 6f 6e 3a 20 25 73 22 2c 20 7a 29   option: %s", z)
2a7a0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
2a7b0 20 20 20 20 20 20 20 20 69 66 28 20 70 4d 61 74          if( pMat
2a7c0 63 68 2d 3e 62 41 72 67 20 29 7b 0a 20 20 20 20  ch->bArg ){.    
2a7d0 20 20 20 20 20 20 20 20 69 66 28 20 69 41 72 67          if( iArg
2a7e0 3e 3d 28 6e 41 72 67 2d 31 29 20 29 7b 0a 20 20  >=(nArg-1) ){.  
2a7f0 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
2a800 72 6e 20 61 72 45 72 72 6f 72 4d 73 67 28 70 41  rn arErrorMsg(pA
2a810 72 2c 20 22 6f 70 74 69 6f 6e 20 72 65 71 75 69  r, "option requi
2a820 72 65 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 3a  res an argument:
2a830 20 25 73 22 2c 20 7a 29 3b 0a 20 20 20 20 20 20   %s", z);.      
2a840 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2a850 20 20 20 20 7a 41 72 67 20 3d 20 61 7a 41 72 67      zArg = azArg
2a860 5b 2b 2b 69 41 72 67 5d 3b 0a 20 20 20 20 20 20  [++iArg];.      
2a870 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2a880 69 66 28 20 61 72 50 72 6f 63 65 73 73 53 77 69  if( arProcessSwi
2a890 74 63 68 28 70 41 72 2c 20 70 4d 61 74 63 68 2d  tch(pAr, pMatch-
2a8a0 3e 65 53 77 69 74 63 68 2c 20 7a 41 72 67 29 20  >eSwitch, zArg) 
2a8b0 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
2a8c0 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 7d  ERROR;.        }
2a8d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
2a8e0 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   }..  return SQL
2a8f0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
2a900 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   This function a
2a910 73 73 75 6d 65 73 20 74 68 61 74 20 61 6c 6c 20  ssumes that all 
2a920 61 72 67 75 6d 65 6e 74 73 20 77 69 74 68 69 6e  arguments within
2a930 20 74 68 65 20 41 72 43 6f 6d 6d 61 6e 64 2e 61   the ArCommand.a
2a940 7a 41 72 67 5b 5d 0a 2a 2a 20 61 72 72 61 79 20  zArg[].** array 
2a950 72 65 66 65 72 20 74 6f 20 61 72 63 68 69 76 65  refer to archive
2a960 20 6d 65 6d 62 65 72 73 2c 20 61 73 20 66 6f 72   members, as for
2a970 20 74 68 65 20 2d 2d 65 78 74 72 61 63 74 20 6f   the --extract o
2a980 72 20 2d 2d 6c 69 73 74 20 63 6f 6d 6d 61 6e 64  r --list command
2a990 73 2e 20 0a 2a 2a 20 49 74 20 63 68 65 63 6b 73  s. .** It checks
2a9a0 20 74 68 61 74 20 65 61 63 68 20 6f 66 20 74 68   that each of th
2a9b0 65 6d 20 61 72 65 20 70 72 65 73 65 6e 74 2e 20  em are present. 
2a9c0 49 66 20 61 6e 79 20 73 70 65 63 69 66 69 65 64  If any specified
2a9d0 20 66 69 6c 65 20 69 73 20 6e 6f 74 0a 2a 2a 20   file is not.** 
2a9e0 70 72 65 73 65 6e 74 20 69 6e 20 74 68 65 20 61  present in the a
2a9f0 72 63 68 69 76 65 2c 20 61 6e 20 65 72 72 6f 72  rchive, an error
2aa00 20 69 73 20 70 72 69 6e 74 65 64 20 74 6f 20 73   is printed to s
2aa10 74 64 65 72 72 20 61 6e 64 20 61 6e 20 65 72 72  tderr and an err
2aa20 6f 72 0a 2a 2a 20 63 6f 64 65 20 72 65 74 75 72  or.** code retur
2aa30 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ned. Otherwise, 
2aa40 69 66 20 61 6c 6c 20 73 70 65 63 69 66 69 65 64  if all specified
2aa50 20 61 72 67 75 6d 65 6e 74 73 20 61 72 65 20 70   arguments are p
2aa60 72 65 73 65 6e 74 20 69 6e 0a 2a 2a 20 74 68 65  resent in.** the
2aa70 20 61 72 63 68 69 76 65 2c 20 53 51 4c 49 54 45   archive, SQLITE
2aa80 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e  _OK is returned.
2aa90 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
2aaa0 74 69 6f 6e 20 73 74 72 69 70 73 20 61 6e 79 20  tion strips any 
2aab0 74 72 61 69 6c 69 6e 67 20 27 2f 27 20 63 68 61  trailing '/' cha
2aac0 72 61 63 74 65 72 73 20 66 72 6f 6d 20 65 61 63  racters from eac
2aad0 68 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 20 54  h argument..** T
2aae0 68 69 73 20 69 73 20 63 6f 6e 73 69 73 74 65 6e  his is consisten
2aaf0 74 20 77 69 74 68 20 74 68 65 20 77 61 79 20 74  t with the way t
2ab00 68 65 20 5b 74 61 72 5d 20 63 6f 6d 6d 61 6e 64  he [tar] command
2ab10 20 73 65 65 6d 73 20 74 6f 20 77 6f 72 6b 20 6f   seems to work o
2ab20 6e 0a 2a 2a 20 4c 69 6e 75 78 2e 0a 2a 2f 0a 73  n.** Linux..*/.s
2ab30 74 61 74 69 63 20 69 6e 74 20 61 72 43 68 65 63  tatic int arChec
2ab40 6b 45 6e 74 72 69 65 73 28 41 72 43 6f 6d 6d 61  kEntries(ArComma
2ab50 6e 64 20 2a 70 41 72 29 7b 0a 20 20 69 6e 74 20  nd *pAr){.  int 
2ab60 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
2ab70 20 20 69 66 28 20 70 41 72 2d 3e 6e 41 72 67 20    if( pAr->nArg 
2ab80 29 7b 0a 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b  ){.    int i, j;
2ab90 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  .    sqlite3_stm
2aba0 74 20 2a 70 54 65 73 74 20 3d 20 30 3b 0a 0a 20  t *pTest = 0;.. 
2abb0 20 20 20 73 68 65 6c 6c 50 72 65 70 61 72 65 50     shellPrepareP
2abc0 72 69 6e 74 66 28 70 41 72 2d 3e 64 62 2c 20 26  rintf(pAr->db, &
2abd0 72 63 2c 20 26 70 54 65 73 74 2c 0a 20 20 20 20  rc, &pTest,.    
2abe0 20 20 20 20 22 53 45 4c 45 43 54 20 6e 61 6d 65      "SELECT name
2abf0 20 46 52 4f 4d 20 25 73 20 57 48 45 52 45 20 6e   FROM %s WHERE n
2ac00 61 6d 65 3d 24 6e 61 6d 65 22 2c 20 0a 20 20 20  ame=$name", .   
2ac10 20 20 20 20 20 70 41 72 2d 3e 7a 53 72 63 54 61       pAr->zSrcTa
2ac20 62 6c 65 0a 20 20 20 20 29 3b 0a 20 20 20 20 6a  ble.    );.    j
2ac30 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f   = sqlite3_bind_
2ac40 70 61 72 61 6d 65 74 65 72 5f 69 6e 64 65 78 28  parameter_index(
2ac50 70 54 65 73 74 2c 20 22 24 6e 61 6d 65 22 29 3b  pTest, "$name");
2ac60 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
2ac70 70 41 72 2d 3e 6e 41 72 67 20 26 26 20 72 63 3d  pAr->nArg && rc=
2ac80 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 2b 2b 29  =SQLITE_OK; i++)
2ac90 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 20  {.      char *z 
2aca0 3d 20 70 41 72 2d 3e 61 7a 41 72 67 5b 69 5d 3b  = pAr->azArg[i];
2acb0 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 73  .      int n = s
2acc0 74 72 6c 65 6e 33 30 28 7a 29 3b 0a 20 20 20 20  trlen30(z);.    
2acd0 20 20 69 6e 74 20 62 4f 6b 20 3d 20 30 3b 0a 20    int bOk = 0;. 
2ace0 20 20 20 20 20 77 68 69 6c 65 28 20 6e 3e 30 20       while( n>0 
2acf0 26 26 20 7a 5b 6e 2d 31 5d 3d 3d 27 2f 27 20 29  && z[n-1]=='/' )
2ad00 20 6e 2d 2d 3b 0a 20 20 20 20 20 20 7a 5b 6e 5d   n--;.      z[n]
2ad10 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 20 20 73   = '\0';.      s
2ad20 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74  qlite3_bind_text
2ad30 28 70 54 65 73 74 2c 20 6a 2c 20 7a 2c 20 2d 31  (pTest, j, z, -1
2ad40 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29  , SQLITE_STATIC)
2ad50 3b 0a 20 20 20 20 20 20 69 66 28 20 53 51 4c 49  ;.      if( SQLI
2ad60 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f  TE_ROW==sqlite3_
2ad70 73 74 65 70 28 70 54 65 73 74 29 20 29 7b 0a 20  step(pTest) ){. 
2ad80 20 20 20 20 20 20 20 62 4f 6b 20 3d 20 31 3b 0a         bOk = 1;.
2ad90 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 68        }.      sh
2ada0 65 6c 6c 52 65 73 65 74 28 26 72 63 2c 20 70 54  ellReset(&rc, pT
2adb0 65 73 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20  est);.      if( 
2adc0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
2add0 20 62 4f 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20   bOk==0 ){.     
2ade0 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73     utf8_printf(s
2adf0 74 64 65 72 72 2c 20 22 6e 6f 74 20 66 6f 75 6e  tderr, "not foun
2ae00 64 20 69 6e 20 61 72 63 68 69 76 65 3a 20 25 73  d in archive: %s
2ae10 5c 6e 22 2c 20 7a 29 3b 0a 20 20 20 20 20 20 20  \n", z);.       
2ae20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
2ae30 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OR;.      }.    
2ae40 7d 0a 20 20 20 20 73 68 65 6c 6c 46 69 6e 61 6c  }.    shellFinal
2ae50 69 7a 65 28 26 72 63 2c 20 70 54 65 73 74 29 3b  ize(&rc, pTest);
2ae60 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
2ae70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 6d 61  ;.}../*.** Forma
2ae80 74 20 61 20 57 48 45 52 45 20 63 6c 61 75 73 65  t a WHERE clause
2ae90 20 74 68 61 74 20 63 61 6e 20 62 65 20 75 73 65   that can be use
2aea0 64 20 61 67 61 69 6e 73 74 20 74 68 65 20 22 73  d against the "s
2aeb0 71 6c 61 72 22 20 74 61 62 6c 65 20 74 6f 0a 2a  qlar" table to.*
2aec0 2a 20 69 64 65 6e 74 69 66 79 20 61 6c 6c 20 61  * identify all a
2aed0 72 63 68 69 76 65 20 6d 65 6d 62 65 72 73 20 74  rchive members t
2aee0 68 61 74 20 6d 61 74 63 68 20 74 68 65 20 63 6f  hat match the co
2aef0 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20  mmand arguments 
2af00 68 65 6c 64 0a 2a 2a 20 69 6e 20 28 2a 70 41 72  held.** in (*pAr
2af10 29 2e 20 4c 65 61 76 65 20 74 68 69 73 20 57 48  ). Leave this WH
2af20 45 52 45 20 63 6c 61 75 73 65 20 69 6e 20 28 2a  ERE clause in (*
2af30 70 7a 57 68 65 72 65 29 20 62 65 66 6f 72 65 20  pzWhere) before 
2af40 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 20 54 68  returning..** Th
2af50 65 20 63 61 6c 6c 65 72 20 69 73 20 72 65 73 70  e caller is resp
2af60 6f 6e 73 69 62 6c 65 20 66 6f 72 20 65 76 65 6e  onsible for even
2af70 74 75 61 6c 6c 79 20 63 61 6c 6c 69 6e 67 20 73  tually calling s
2af80 71 6c 69 74 65 33 5f 66 72 65 65 28 29 20 6f 6e  qlite3_free() on
2af90 0a 2a 2a 20 61 6e 79 20 6e 6f 6e 2d 4e 55 4c 4c  .** any non-NULL
2afa0 20 28 2a 70 7a 57 68 65 72 65 29 20 76 61 6c 75   (*pzWhere) valu
2afb0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
2afc0 64 20 61 72 57 68 65 72 65 43 6c 61 75 73 65 28  d arWhereClause(
2afd0 0a 20 20 69 6e 74 20 2a 70 52 63 2c 20 0a 20 20  .  int *pRc, .  
2afe0 41 72 43 6f 6d 6d 61 6e 64 20 2a 70 41 72 2c 20  ArCommand *pAr, 
2aff0 0a 20 20 63 68 61 72 20 2a 2a 70 7a 57 68 65 72  .  char **pzWher
2b000 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e               
2b010 20 20 20 2f 2a 20 4f 55 54 3a 20 4e 65 77 20 57     /* OUT: New W
2b020 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 29  HERE clause */.)
2b030 7b 0a 20 20 63 68 61 72 20 2a 7a 57 68 65 72 65  {.  char *zWhere
2b040 20 3d 20 30 3b 0a 20 20 69 66 28 20 2a 70 52 63   = 0;.  if( *pRc
2b050 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2b060 20 20 20 69 66 28 20 70 41 72 2d 3e 6e 41 72 67     if( pAr->nArg
2b070 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 57 68  ==0 ){.      zWh
2b080 65 72 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  ere = sqlite3_mp
2b090 72 69 6e 74 66 28 22 31 22 29 3b 0a 20 20 20 20  rintf("1");.    
2b0a0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74  }else{.      int
2b0b0 20 69 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20   i;.      const 
2b0c0 63 68 61 72 20 2a 7a 53 65 70 20 3d 20 22 22 3b  char *zSep = "";
2b0d0 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
2b0e0 69 3c 70 41 72 2d 3e 6e 41 72 67 3b 20 69 2b 2b  i<pAr->nArg; i++
2b0f0 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74  ){.        const
2b100 20 63 68 61 72 20 2a 7a 20 3d 20 70 41 72 2d 3e   char *z = pAr->
2b110 61 7a 41 72 67 5b 69 5d 3b 0a 20 20 20 20 20 20  azArg[i];.      
2b120 20 20 7a 57 68 65 72 65 20 3d 20 73 71 6c 69 74    zWhere = sqlit
2b130 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20 20  e3_mprintf(.    
2b140 20 20 20 20 20 20 22 25 7a 25 73 20 6e 61 6d 65        "%z%s name
2b150 20 3d 20 27 25 71 27 20 4f 52 20 73 75 62 73 74   = '%q' OR subst
2b160 72 28 6e 61 6d 65 2c 31 2c 25 64 29 20 3d 20 27  r(name,1,%d) = '
2b170 25 71 2f 27 22 2c 20 0a 20 20 20 20 20 20 20 20  %q/'", .        
2b180 20 20 7a 57 68 65 72 65 2c 20 7a 53 65 70 2c 20    zWhere, zSep, 
2b190 7a 2c 20 73 74 72 6c 65 6e 33 30 28 7a 29 2b 31  z, strlen30(z)+1
2b1a0 2c 20 7a 0a 20 20 20 20 20 20 20 20 29 3b 0a 20  , z.        );. 
2b1b0 20 20 20 20 20 20 20 69 66 28 20 7a 57 68 65 72         if( zWher
2b1c0 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e==0 ){.        
2b1d0 20 20 2a 70 52 63 20 3d 20 53 51 4c 49 54 45 5f    *pRc = SQLITE_
2b1e0 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 20  NOMEM;.         
2b1f0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
2b200 7d 0a 20 20 20 20 20 20 20 20 7a 53 65 70 20 3d  }.        zSep =
2b210 20 22 20 4f 52 20 22 3b 0a 20 20 20 20 20 20 7d   " OR ";.      }
2b220 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 7a  .    }.  }.  *pz
2b230 57 68 65 72 65 20 3d 20 7a 57 68 65 72 65 3b 0a  Where = zWhere;.
2b240 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65  }../*.** Impleme
2b250 6e 74 61 74 69 6f 6e 20 6f 66 20 2e 61 72 20 22  ntation of .ar "
2b260 6c 69 73 54 22 20 63 6f 6d 6d 61 6e 64 2e 20 0a  lisT" command. .
2b270 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 72  */.static int ar
2b280 4c 69 73 74 43 6f 6d 6d 61 6e 64 28 41 72 43 6f  ListCommand(ArCo
2b290 6d 6d 61 6e 64 20 2a 70 41 72 29 7b 0a 20 20 63  mmand *pAr){.  c
2b2a0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 20  onst char *zSql 
2b2b0 3d 20 22 53 45 4c 45 43 54 20 25 73 20 46 52 4f  = "SELECT %s FRO
2b2c0 4d 20 25 73 20 57 48 45 52 45 20 25 73 22 3b 20  M %s WHERE %s"; 
2b2d0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61  .  const char *a
2b2e0 7a 43 6f 6c 73 5b 5d 20 3d 20 7b 0a 20 20 20 20  zCols[] = {.    
2b2f0 22 6e 61 6d 65 22 2c 0a 20 20 20 20 22 6c 73 6d  "name",.    "lsm
2b300 6f 64 65 28 6d 6f 64 65 29 2c 20 73 7a 2c 20 64  ode(mode), sz, d
2b310 61 74 65 74 69 6d 65 28 6d 74 69 6d 65 2c 20 27  atetime(mtime, '
2b320 75 6e 69 78 65 70 6f 63 68 27 29 2c 20 6e 61 6d  unixepoch'), nam
2b330 65 22 0a 20 20 7d 3b 0a 0a 20 20 63 68 61 72 20  e".  };..  char 
2b340 2a 7a 57 68 65 72 65 20 3d 20 30 3b 0a 20 20 73  *zWhere = 0;.  s
2b350 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 71  qlite3_stmt *pSq
2b360 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b  l = 0;.  int rc;
2b370 0a 0a 20 20 72 63 20 3d 20 61 72 43 68 65 63 6b  ..  rc = arCheck
2b380 45 6e 74 72 69 65 73 28 70 41 72 29 3b 0a 20 20  Entries(pAr);.  
2b390 61 72 57 68 65 72 65 43 6c 61 75 73 65 28 26 72  arWhereClause(&r
2b3a0 63 2c 20 70 41 72 2c 20 26 7a 57 68 65 72 65 29  c, pAr, &zWhere)
2b3b0 3b 0a 0a 20 20 73 68 65 6c 6c 50 72 65 70 61 72  ;..  shellPrepar
2b3c0 65 50 72 69 6e 74 66 28 70 41 72 2d 3e 64 62 2c  ePrintf(pAr->db,
2b3d0 20 26 72 63 2c 20 26 70 53 71 6c 2c 20 7a 53 71   &rc, &pSql, zSq
2b3e0 6c 2c 20 61 7a 43 6f 6c 73 5b 70 41 72 2d 3e 62  l, azCols[pAr->b
2b3f0 56 65 72 62 6f 73 65 5d 2c 0a 20 20 20 20 20 20  Verbose],.      
2b400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
2b410 41 72 2d 3e 7a 53 72 63 54 61 62 6c 65 2c 20 7a  Ar->zSrcTable, z
2b420 57 68 65 72 65 29 3b 0a 20 20 69 66 28 20 70 41  Where);.  if( pA
2b430 72 2d 3e 62 44 72 79 52 75 6e 20 29 7b 0a 20 20  r->bDryRun ){.  
2b440 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 41    utf8_printf(pA
2b450 72 2d 3e 70 2d 3e 6f 75 74 2c 20 22 25 73 5c 6e  r->p->out, "%s\n
2b460 22 2c 20 73 71 6c 69 74 65 33 5f 73 71 6c 28 70  ", sqlite3_sql(p
2b470 53 71 6c 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Sql));.  }else{.
2b480 20 20 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53      while( rc==S
2b490 51 4c 49 54 45 5f 4f 4b 20 26 26 20 53 51 4c 49  QLITE_OK && SQLI
2b4a0 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f  TE_ROW==sqlite3_
2b4b0 73 74 65 70 28 70 53 71 6c 29 20 29 7b 0a 20 20  step(pSql) ){.  
2b4c0 20 20 20 20 69 66 28 20 70 41 72 2d 3e 62 56 65      if( pAr->bVe
2b4d0 72 62 6f 73 65 20 29 7b 0a 20 20 20 20 20 20 20  rbose ){.       
2b4e0 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 41 72   utf8_printf(pAr
2b4f0 2d 3e 70 2d 3e 6f 75 74 2c 20 22 25 73 20 25 20  ->p->out, "%s % 
2b500 31 30 64 20 20 25 73 20 20 25 73 5c 6e 22 2c 0a  10d  %s  %s\n",.
2b510 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
2b520 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28  te3_column_text(
2b530 70 53 71 6c 2c 20 30 29 2c 0a 20 20 20 20 20 20  pSql, 0),.      
2b540 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6f        sqlite3_co
2b550 6c 75 6d 6e 5f 69 6e 74 28 70 53 71 6c 2c 20 31  lumn_int(pSql, 1
2b560 29 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  ), .            
2b570 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
2b580 65 78 74 28 70 53 71 6c 2c 20 32 29 2c 0a 20 20  ext(pSql, 2),.  
2b590 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
2b5a0 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53  3_column_text(pS
2b5b0 71 6c 2c 20 33 29 0a 20 20 20 20 20 20 20 20 29  ql, 3).        )
2b5c0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
2b5d0 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e         utf8_prin
2b5e0 74 66 28 70 41 72 2d 3e 70 2d 3e 6f 75 74 2c 20  tf(pAr->p->out, 
2b5f0 22 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f  "%s\n", sqlite3_
2b600 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 71 6c  column_text(pSql
2b610 2c 20 30 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20  , 0));.      }. 
2b620 20 20 20 7d 0a 20 20 7d 0a 20 20 73 68 65 6c 6c     }.  }.  shell
2b630 46 69 6e 61 6c 69 7a 65 28 26 72 63 2c 20 70 53  Finalize(&rc, pS
2b640 71 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  ql);.  sqlite3_f
2b650 72 65 65 28 7a 57 68 65 72 65 29 3b 0a 20 20 72  ree(zWhere);.  r
2b660 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a  eturn rc;.}.../*
2b670 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69  .** Implementati
2b680 6f 6e 20 6f 66 20 2e 61 72 20 22 65 58 74 72 61  on of .ar "eXtra
2b690 63 74 22 20 63 6f 6d 6d 61 6e 64 2e 20 0a 2a 2f  ct" command. .*/
2b6a0 0a 73 74 61 74 69 63 20 69 6e 74 20 61 72 45 78  .static int arEx
2b6b0 74 72 61 63 74 43 6f 6d 6d 61 6e 64 28 41 72 43  tractCommand(ArC
2b6c0 6f 6d 6d 61 6e 64 20 2a 70 41 72 29 7b 0a 20 20  ommand *pAr){.  
2b6d0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c  const char *zSql
2b6e0 31 20 3d 20 0a 20 20 20 20 22 53 45 4c 45 43 54  1 = .    "SELECT
2b6f0 20 22 0a 20 20 20 20 22 20 28 24 64 69 72 20 7c   ".    " ($dir |
2b700 7c 20 6e 61 6d 65 29 2c 22 0a 20 20 20 20 22 20  | name),".    " 
2b710 77 72 69 74 65 66 69 6c 65 28 28 24 64 69 72 20  writefile(($dir 
2b720 7c 7c 20 6e 61 6d 65 29 2c 20 25 73 2c 20 6d 6f  || name), %s, mo
2b730 64 65 2c 20 6d 74 69 6d 65 29 20 22 0a 20 20 20  de, mtime) ".   
2b740 20 22 46 52 4f 4d 20 25 73 20 57 48 45 52 45 20   "FROM %s WHERE 
2b750 28 25 73 29 20 41 4e 44 20 28 64 61 74 61 20 49  (%s) AND (data I
2b760 53 20 4e 55 4c 4c 20 4f 52 20 24 64 69 72 4f 6e  S NULL OR $dirOn
2b770 6c 79 20 3d 20 30 29 22 0a 20 20 20 20 22 20 41  ly = 0)".    " A
2b780 4e 44 20 6e 61 6d 65 20 4e 4f 54 20 47 4c 4f 42  ND name NOT GLOB
2b790 20 27 2a 2e 2e 5b 2f 5c 5c 5d 2a 27 22 3b 0a 0a   '*..[/\\]*'";..
2b7a0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a    const char *az
2b7b0 45 78 74 72 61 41 72 67 5b 5d 20 3d 20 7b 20 0a  ExtraArg[] = { .
2b7c0 20 20 20 20 22 73 71 6c 61 72 5f 75 6e 63 6f 6d      "sqlar_uncom
2b7d0 70 72 65 73 73 28 64 61 74 61 2c 20 73 7a 29 22  press(data, sz)"
2b7e0 2c 0a 20 20 20 20 22 64 61 74 61 22 0a 20 20 7d  ,.    "data".  }
2b7f0 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  ;..  sqlite3_stm
2b800 74 20 2a 70 53 71 6c 20 3d 20 30 3b 0a 20 20 69  t *pSql = 0;.  i
2b810 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
2b820 4b 3b 0a 20 20 63 68 61 72 20 2a 7a 44 69 72 20  K;.  char *zDir 
2b830 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a 57 68  = 0;.  char *zWh
2b840 65 72 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69  ere = 0;.  int i
2b850 2c 20 6a 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 72  , j;..  /* If ar
2b860 67 75 6d 65 6e 74 73 20 61 72 65 20 73 70 65 63  guments are spec
2b870 69 66 69 65 64 2c 20 63 68 65 63 6b 20 74 68 61  ified, check tha
2b880 74 20 74 68 65 79 20 61 63 74 75 61 6c 6c 79 20  t they actually 
2b890 65 78 69 73 74 20 77 69 74 68 69 6e 0a 20 20 2a  exist within.  *
2b8a0 2a 20 74 68 65 20 61 72 63 68 69 76 65 20 62 65  * the archive be
2b8b0 66 6f 72 65 20 70 72 6f 63 65 65 64 69 6e 67 2e  fore proceeding.
2b8c0 20 41 6e 64 20 66 6f 72 6d 75 6c 61 74 65 20 61   And formulate a
2b8d0 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 6f   WHERE clause to
2b8e0 0a 20 20 2a 2a 20 6d 61 74 63 68 20 74 68 65 6d  .  ** match them
2b8f0 2e 20 20 2a 2f 0a 20 20 72 63 20 3d 20 61 72 43  .  */.  rc = arC
2b900 68 65 63 6b 45 6e 74 72 69 65 73 28 70 41 72 29  heckEntries(pAr)
2b910 3b 0a 20 20 61 72 57 68 65 72 65 43 6c 61 75 73  ;.  arWhereClaus
2b920 65 28 26 72 63 2c 20 70 41 72 2c 20 26 7a 57 68  e(&rc, pAr, &zWh
2b930 65 72 65 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d  ere);..  if( rc=
2b940 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2b950 20 20 69 66 28 20 70 41 72 2d 3e 7a 44 69 72 20    if( pAr->zDir 
2b960 29 7b 0a 20 20 20 20 20 20 7a 44 69 72 20 3d 20  ){.      zDir = 
2b970 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
2b980 22 25 73 2f 22 2c 20 70 41 72 2d 3e 7a 44 69 72  "%s/", pAr->zDir
2b990 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
2b9a0 20 20 20 20 7a 44 69 72 20 3d 20 73 71 6c 69 74      zDir = sqlit
2b9b0 65 33 5f 6d 70 72 69 6e 74 66 28 22 22 29 3b 0a  e3_mprintf("");.
2b9c0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 7a 44      }.    if( zD
2b9d0 69 72 3d 3d 30 20 29 20 72 63 20 3d 20 53 51 4c  ir==0 ) rc = SQL
2b9e0 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a  ITE_NOMEM;.  }..
2b9f0 20 20 73 68 65 6c 6c 50 72 65 70 61 72 65 50 72    shellPreparePr
2ba00 69 6e 74 66 28 70 41 72 2d 3e 64 62 2c 20 26 72  intf(pAr->db, &r
2ba10 63 2c 20 26 70 53 71 6c 2c 20 7a 53 71 6c 31 2c  c, &pSql, zSql1,
2ba20 20 0a 20 20 20 20 20 20 61 7a 45 78 74 72 61 41   .      azExtraA
2ba30 72 67 5b 70 41 72 2d 3e 62 5a 69 70 5d 2c 20 70  rg[pAr->bZip], p
2ba40 41 72 2d 3e 7a 53 72 63 54 61 62 6c 65 2c 20 7a  Ar->zSrcTable, z
2ba50 57 68 65 72 65 0a 20 20 29 3b 0a 0a 20 20 69 66  Where.  );..  if
2ba60 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2ba70 29 7b 0a 20 20 20 20 6a 20 3d 20 73 71 6c 69 74  ){.    j = sqlit
2ba80 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65  e3_bind_paramete
2ba90 72 5f 69 6e 64 65 78 28 70 53 71 6c 2c 20 22 24  r_index(pSql, "$
2baa0 64 69 72 22 29 3b 0a 20 20 20 20 73 71 6c 69 74  dir");.    sqlit
2bab0 65 33 5f 62 69 6e 64 5f 74 65 78 74 28 70 53 71  e3_bind_text(pSq
2bac0 6c 2c 20 6a 2c 20 7a 44 69 72 2c 20 2d 31 2c 20  l, j, zDir, -1, 
2bad0 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a  SQLITE_STATIC);.
2bae0 0a 20 20 20 20 2f 2a 20 52 75 6e 20 74 68 65 20  .    /* Run the 
2baf0 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
2bb00 20 74 77 69 63 65 2e 20 54 68 65 20 66 69 72 73   twice. The firs
2bb10 74 20 74 69 6d 65 2c 20 77 72 69 74 65 66 69 6c  t time, writefil
2bb20 65 28 29 20 69 73 20 63 61 6c 6c 65 64 0a 20 20  e() is called.  
2bb30 20 20 2a 2a 20 66 6f 72 20 61 6c 6c 20 61 72 63    ** for all arc
2bb40 68 69 76 65 20 6d 65 6d 62 65 72 73 20 74 68 61  hive members tha
2bb50 74 20 73 68 6f 75 6c 64 20 62 65 20 65 78 74 72  t should be extr
2bb60 61 63 74 65 64 2e 20 54 68 65 20 73 65 63 6f 6e  acted. The secon
2bb70 64 20 74 69 6d 65 2c 0a 20 20 20 20 2a 2a 20 6f  d time,.    ** o
2bb80 6e 6c 79 20 66 6f 72 20 74 68 65 20 64 69 72 65  nly for the dire
2bb90 63 74 6f 72 69 65 73 2e 20 54 68 69 73 20 69 73  ctories. This is
2bba0 20 62 65 63 61 75 73 65 20 74 68 65 20 74 69 6d   because the tim
2bbb0 65 73 74 61 6d 70 73 20 66 6f 72 0a 20 20 20 20  estamps for.    
2bbc0 2a 2a 20 65 78 74 72 61 63 74 65 64 20 64 69 72  ** extracted dir
2bbd0 65 63 74 6f 72 69 65 73 20 6d 75 73 74 20 62 65  ectories must be
2bbe0 20 72 65 73 65 74 20 61 66 74 65 72 20 74 68 65   reset after the
2bbf0 79 20 61 72 65 20 70 6f 70 75 6c 61 74 65 64 20  y are populated 
2bc00 28 61 73 0a 20 20 20 20 2a 2a 20 70 6f 70 75 6c  (as.    ** popul
2bc10 61 74 69 6e 67 20 74 68 65 6d 20 63 68 61 6e 67  ating them chang
2bc20 65 73 20 74 68 65 20 74 69 6d 65 73 74 61 6d 70  es the timestamp
2bc30 29 2e 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69  ).  */.    for(i
2bc40 3d 30 3b 20 69 3c 32 3b 20 69 2b 2b 29 7b 0a 20  =0; i<2; i++){. 
2bc50 20 20 20 20 20 6a 20 3d 20 73 71 6c 69 74 65 33       j = sqlite3
2bc60 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f  _bind_parameter_
2bc70 69 6e 64 65 78 28 70 53 71 6c 2c 20 22 24 64 69  index(pSql, "$di
2bc80 72 4f 6e 6c 79 22 29 3b 0a 20 20 20 20 20 20 73  rOnly");.      s
2bc90 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28  qlite3_bind_int(
2bca0 70 53 71 6c 2c 20 6a 2c 20 69 29 3b 0a 20 20 20  pSql, j, i);.   
2bcb0 20 20 20 69 66 28 20 70 41 72 2d 3e 62 44 72 79     if( pAr->bDry
2bcc0 52 75 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 75  Run ){.        u
2bcd0 74 66 38 5f 70 72 69 6e 74 66 28 70 41 72 2d 3e  tf8_printf(pAr->
2bce0 70 2d 3e 6f 75 74 2c 20 22 25 73 5c 6e 22 2c 20  p->out, "%s\n", 
2bcf0 73 71 6c 69 74 65 33 5f 73 71 6c 28 70 53 71 6c  sqlite3_sql(pSql
2bd00 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ));.      }else{
2bd10 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20  .        while( 
2bd20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
2bd30 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c   SQLITE_ROW==sql
2bd40 69 74 65 33 5f 73 74 65 70 28 70 53 71 6c 29 20  ite3_step(pSql) 
2bd50 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
2bd60 20 69 3d 3d 30 20 26 26 20 70 41 72 2d 3e 62 56   i==0 && pAr->bV
2bd70 65 72 62 6f 73 65 20 29 7b 0a 20 20 20 20 20 20  erbose ){.      
2bd80 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
2bd90 66 28 70 41 72 2d 3e 70 2d 3e 6f 75 74 2c 20 22  f(pAr->p->out, "
2bda0 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f 63  %s\n", sqlite3_c
2bdb0 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 71 6c 2c  olumn_text(pSql,
2bdc0 20 30 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20   0));.          
2bdd0 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
2bde0 20 20 7d 0a 20 20 20 20 20 20 73 68 65 6c 6c 52    }.      shellR
2bdf0 65 73 65 74 28 26 72 63 2c 20 70 53 71 6c 29 3b  eset(&rc, pSql);
2be00 0a 20 20 20 20 7d 0a 20 20 20 20 73 68 65 6c 6c  .    }.    shell
2be10 46 69 6e 61 6c 69 7a 65 28 26 72 63 2c 20 70 53  Finalize(&rc, pS
2be20 71 6c 29 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69  ql);.  }..  sqli
2be30 74 65 33 5f 66 72 65 65 28 7a 44 69 72 29 3b 0a  te3_free(zDir);.
2be40 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
2be50 57 68 65 72 65 29 3b 0a 20 20 72 65 74 75 72 6e  Where);.  return
2be60 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 75   rc;.}../*.** Ru
2be70 6e 20 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d  n the SQL statem
2be80 65 6e 74 20 69 6e 20 7a 53 71 6c 2e 20 20 4f 72  ent in zSql.  Or
2be90 20 69 66 20 64 6f 69 6e 67 20 61 20 2d 2d 64 72   if doing a --dr
2bea0 79 72 75 6e 2c 20 6d 65 72 65 6c 79 20 70 72 69  yrun, merely pri
2beb0 6e 74 20 69 74 20 6f 75 74 2e 0a 2a 2f 0a 73 74  nt it out..*/.st
2bec0 61 74 69 63 20 69 6e 74 20 61 72 45 78 65 63 53  atic int arExecS
2bed0 71 6c 28 41 72 43 6f 6d 6d 61 6e 64 20 2a 70 41  ql(ArCommand *pA
2bee0 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  r, const char *z
2bef0 53 71 6c 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  Sql){.  int rc;.
2bf00 20 20 69 66 28 20 70 41 72 2d 3e 62 44 72 79 52    if( pAr->bDryR
2bf10 75 6e 20 29 7b 0a 20 20 20 20 75 74 66 38 5f 70  un ){.    utf8_p
2bf20 72 69 6e 74 66 28 70 41 72 2d 3e 70 2d 3e 6f 75  rintf(pAr->p->ou
2bf30 74 2c 20 22 25 73 5c 6e 22 2c 20 7a 53 71 6c 29  t, "%s\n", zSql)
2bf40 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  ;.    rc = SQLIT
2bf50 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  E_OK;.  }else{. 
2bf60 20 20 20 63 68 61 72 20 2a 7a 45 72 72 20 3d 20     char *zErr = 
2bf70 30 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  0;.    rc = sqli
2bf80 74 65 33 5f 65 78 65 63 28 70 41 72 2d 3e 64 62  te3_exec(pAr->db
2bf90 2c 20 7a 53 71 6c 2c 20 30 2c 20 30 2c 20 26 7a  , zSql, 0, 0, &z
2bfa0 45 72 72 29 3b 0a 20 20 20 20 69 66 28 20 7a 45  Err);.    if( zE
2bfb0 72 72 20 29 7b 0a 20 20 20 20 20 20 75 74 66 38  rr ){.      utf8
2bfc0 5f 70 72 69 6e 74 66 28 73 74 64 6f 75 74 2c 20  _printf(stdout, 
2bfd0 22 45 52 52 4f 52 3a 20 25 73 5c 6e 22 2c 20 7a  "ERROR: %s\n", z
2bfe0 45 72 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Err);.      sqli
2bff0 74 65 33 5f 66 72 65 65 28 7a 45 72 72 29 3b 0a  te3_free(zErr);.
2c000 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
2c010 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  rn rc;.}.../*.**
2c020 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   Implementation 
2c030 6f 66 20 2e 61 72 20 22 63 72 65 61 74 65 22 2c  of .ar "create",
2c040 20 22 69 6e 73 65 72 74 22 2c 20 61 6e 64 20 22   "insert", and "
2c050 75 70 64 61 74 65 22 20 63 6f 6d 6d 61 6e 64 73  update" commands
2c060 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 63 72 65 61  ..**.**     crea
2c070 74 65 20 20 20 20 2d 3e 20 20 20 20 20 43 72 65  te    ->     Cre
2c080 61 74 65 20 61 20 6e 65 77 20 53 51 4c 20 61 72  ate a new SQL ar
2c090 63 68 69 76 65 0a 2a 2a 20 20 20 20 20 69 6e 73  chive.**     ins
2c0a0 65 72 74 20 20 20 20 2d 3e 20 20 20 20 20 49 6e  ert    ->     In
2c0b0 73 65 72 74 20 6f 72 20 72 65 69 6e 73 65 72 74  sert or reinsert
2c0c0 20 61 6c 6c 20 66 69 6c 65 73 20 6c 69 73 74 65   all files liste
2c0d0 64 0a 2a 2a 20 20 20 20 20 75 70 64 61 74 65 20  d.**     update 
2c0e0 20 20 20 2d 3e 20 20 20 20 20 49 6e 73 65 72 74     ->     Insert
2c0f0 20 66 69 6c 65 73 20 74 68 61 74 20 68 61 76 65   files that have
2c100 20 63 68 61 6e 67 65 64 20 6f 72 20 74 68 61 74   changed or that
2c110 20 77 65 72 65 20 6e 6f 74 0a 2a 2a 20 20 20 20   were not.**    
2c120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c130 20 20 70 72 65 76 69 6f 75 73 6c 79 20 69 6e 20    previously in 
2c140 74 68 65 20 61 72 63 68 69 76 65 0a 2a 2a 0a 2a  the archive.**.*
2c150 2a 20 43 72 65 61 74 65 20 74 68 65 20 22 73 71  * Create the "sq
2c160 6c 61 72 22 20 74 61 62 6c 65 20 69 6e 20 74 68  lar" table in th
2c170 65 20 64 61 74 61 62 61 73 65 20 69 66 20 69 74  e database if it
2c180 20 64 6f 65 73 20 6e 6f 74 20 61 6c 72 65 61 64   does not alread
2c190 79 20 65 78 69 73 74 2e 0a 2a 2a 20 54 68 65 6e  y exist..** Then
2c1a0 20 61 64 64 20 65 61 63 68 20 66 69 6c 65 20 69   add each file i
2c1b0 6e 20 74 68 65 20 61 7a 46 69 6c 65 5b 5d 20 61  n the azFile[] a
2c1c0 72 72 61 79 20 74 6f 20 74 68 65 20 61 72 63 68  rray to the arch
2c1d0 69 76 65 2e 20 44 69 72 65 63 74 6f 72 69 65 73  ive. Directories
2c1e0 0a 2a 2a 20 61 72 65 20 61 64 64 65 64 20 72 65  .** are added re
2c1f0 63 75 72 73 69 76 65 6c 79 2e 20 49 66 20 61 72  cursively. If ar
2c200 67 75 6d 65 6e 74 20 62 56 65 72 62 6f 73 65 20  gument bVerbose 
2c210 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 61 20 6d  is non-zero, a m
2c220 65 73 73 61 67 65 20 69 73 0a 2a 2a 20 70 72 69  essage is.** pri
2c230 6e 74 65 64 20 6f 6e 20 73 74 64 6f 75 74 20 66  nted on stdout f
2c240 6f 72 20 65 61 63 68 20 66 69 6c 65 20 61 72 63  or each file arc
2c250 68 69 76 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  hived..**.** The
2c260 20 63 72 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20   create command 
2c270 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 75  is the same as u
2c280 70 64 61 74 65 2c 20 65 78 63 65 70 74 20 74 68  pdate, except th
2c290 61 74 20 69 74 20 64 72 6f 70 73 0a 2a 2a 20 61  at it drops.** a
2c2a0 6e 79 20 65 78 69 73 74 69 6e 67 20 22 73 71 6c  ny existing "sql
2c2b0 61 72 22 20 74 61 62 6c 65 20 62 65 66 6f 72 65  ar" table before
2c2c0 20 62 65 67 69 6e 6e 69 6e 67 2e 20 20 54 68 65   beginning.  The
2c2d0 20 22 69 6e 73 65 72 74 22 20 63 6f 6d 6d 61 6e   "insert" comman
2c2e0 64 0a 2a 2a 20 61 6c 77 61 79 73 20 6f 76 65 72  d.** always over
2c2f0 77 72 69 74 65 73 20 65 76 65 72 79 20 66 69 6c  writes every fil
2c300 65 20 6e 61 6d 65 64 20 6f 6e 20 74 68 65 20 63  e named on the c
2c310 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 2c 20 77 68 65  ommand-line, whe
2c320 72 65 20 61 73 0a 2a 2a 20 22 75 70 64 61 74 65  re as.** "update
2c330 22 20 6f 6e 6c 79 20 6f 76 65 72 77 72 69 74 65  " only overwrite
2c340 73 20 69 66 20 74 68 65 20 73 69 7a 65 20 6f 72  s if the size or
2c350 20 6d 74 69 6d 65 20 6f 72 20 6d 6f 64 65 20 68   mtime or mode h
2c360 61 73 20 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 73  as changed..*/.s
2c370 74 61 74 69 63 20 69 6e 74 20 61 72 43 72 65 61  tatic int arCrea
2c380 74 65 4f 72 55 70 64 61 74 65 43 6f 6d 6d 61 6e  teOrUpdateComman
2c390 64 28 0a 20 20 41 72 43 6f 6d 6d 61 6e 64 20 2a  d(.  ArCommand *
2c3a0 70 41 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  pAr,            
2c3b0 20 20 20 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20       /* Command 
2c3c0 61 72 67 75 6d 65 6e 74 73 20 61 6e 64 20 6f 70  arguments and op
2c3d0 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 62  tions */.  int b
2c3e0 55 70 64 61 74 65 2c 20 20 20 20 20 20 20 20 20  Update,         
2c3f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 74 72             /* tr
2c400 75 65 20 66 6f 72 20 61 20 2d 2d 63 72 65 61 74  ue for a --creat
2c410 65 2e 20 2a 2f 0a 20 20 69 6e 74 20 62 4f 6e 6c  e. */.  int bOnl
2c420 79 49 66 43 68 61 6e 67 65 64 20 20 20 20 20 20  yIfChanged      
2c430 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 6c 79 20          /* Only 
2c440 75 70 64 61 74 65 20 69 66 20 66 69 6c 65 20 68  update if file h
2c450 61 73 20 63 68 61 6e 67 65 64 20 2a 2f 0a 29 7b  as changed */.){
2c460 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
2c470 43 72 65 61 74 65 20 3d 20 0a 20 20 20 20 20 20  Create = .      
2c480 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 49 46  "CREATE TABLE IF
2c490 20 4e 4f 54 20 45 58 49 53 54 53 20 73 71 6c 61   NOT EXISTS sqla
2c4a0 72 28 5c 6e 22 0a 20 20 20 20 20 20 22 20 20 6e  r(\n".      "  n
2c4b0 61 6d 65 20 54 45 58 54 20 50 52 49 4d 41 52 59  ame TEXT PRIMARY
2c4c0 20 4b 45 59 2c 20 20 2d 2d 20 6e 61 6d 65 20 6f   KEY,  -- name o
2c4d0 66 20 74 68 65 20 66 69 6c 65 5c 6e 22 0a 20 20  f the file\n".  
2c4e0 20 20 20 20 22 20 20 6d 6f 64 65 20 49 4e 54 2c      "  mode INT,
2c4f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2d                 -
2c500 2d 20 61 63 63 65 73 73 20 70 65 72 6d 69 73 73  - access permiss
2c510 69 6f 6e 73 5c 6e 22 0a 20 20 20 20 20 20 22 20  ions\n".      " 
2c520 20 6d 74 69 6d 65 20 49 4e 54 2c 20 20 20 20 20   mtime INT,     
2c530 20 20 20 20 20 20 20 20 20 2d 2d 20 6c 61 73 74           -- last
2c540 20 6d 6f 64 69 66 69 63 61 74 69 6f 6e 20 74 69   modification ti
2c550 6d 65 5c 6e 22 0a 20 20 20 20 20 20 22 20 20 73  me\n".      "  s
2c560 7a 20 49 4e 54 2c 20 20 20 20 20 20 20 20 20 20  z INT,          
2c570 20 20 20 20 20 20 20 2d 2d 20 6f 72 69 67 69 6e         -- origin
2c580 61 6c 20 66 69 6c 65 20 73 69 7a 65 5c 6e 22 0a  al file size\n".
2c590 20 20 20 20 20 20 22 20 20 64 61 74 61 20 42 4c        "  data BL
2c5a0 4f 42 20 20 20 20 20 20 20 20 20 20 20 20 20 20  OB              
2c5b0 20 2d 2d 20 63 6f 6d 70 72 65 73 73 65 64 20 63   -- compressed c
2c5c0 6f 6e 74 65 6e 74 5c 6e 22 0a 20 20 20 20 20 20  ontent\n".      
2c5d0 22 29 22 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  ")";.  const cha
2c5e0 72 20 2a 7a 44 72 6f 70 20 3d 20 22 44 52 4f 50  r *zDrop = "DROP
2c5f0 20 54 41 42 4c 45 20 49 46 20 45 58 49 53 54 53   TABLE IF EXISTS
2c600 20 73 71 6c 61 72 22 3b 0a 20 20 63 6f 6e 73 74   sqlar";.  const
2c610 20 63 68 61 72 20 2a 7a 49 6e 73 65 72 74 46 6d   char *zInsertFm
2c620 74 5b 32 5d 20 3d 20 7b 0a 20 20 20 20 20 22 52  t[2] = {.     "R
2c630 45 50 4c 41 43 45 20 49 4e 54 4f 20 25 73 28 6e  EPLACE INTO %s(n
2c640 61 6d 65 2c 6d 6f 64 65 2c 6d 74 69 6d 65 2c 73  ame,mode,mtime,s
2c650 7a 2c 64 61 74 61 29 5c 6e 22 0a 20 20 20 20 20  z,data)\n".     
2c660 22 20 20 53 45 4c 45 43 54 5c 6e 22 0a 20 20 20  "  SELECT\n".   
2c670 20 20 22 20 20 20 20 25 73 2c 5c 6e 22 0a 20 20    "    %s,\n".  
2c680 20 20 20 22 20 20 20 20 6d 6f 64 65 2c 5c 6e 22     "    mode,\n"
2c690 0a 20 20 20 20 20 22 20 20 20 20 6d 74 69 6d 65  .     "    mtime
2c6a0 2c 5c 6e 22 0a 20 20 20 20 20 22 20 20 20 20 43  ,\n".     "    C
2c6b0 41 53 45 20 73 75 62 73 74 72 28 6c 73 6d 6f 64  ASE substr(lsmod
2c6c0 65 28 6d 6f 64 65 29 2c 31 2c 31 29 5c 6e 22 0a  e(mode),1,1)\n".
2c6d0 20 20 20 20 20 22 20 20 20 20 20 20 57 48 45 4e       "      WHEN
2c6e0 20 27 2d 27 20 54 48 45 4e 20 6c 65 6e 67 74 68   '-' THEN length
2c6f0 28 64 61 74 61 29 5c 6e 22 0a 20 20 20 20 20 22  (data)\n".     "
2c700 20 20 20 20 20 20 57 48 45 4e 20 27 64 27 20 54        WHEN 'd' T
2c710 48 45 4e 20 30 5c 6e 22 0a 20 20 20 20 20 22 20  HEN 0\n".     " 
2c720 20 20 20 20 20 45 4c 53 45 20 2d 31 20 45 4e 44       ELSE -1 END
2c730 2c 5c 6e 22 0a 20 20 20 20 20 22 20 20 20 20 73  ,\n".     "    s
2c740 71 6c 61 72 5f 63 6f 6d 70 72 65 73 73 28 64 61  qlar_compress(da
2c750 74 61 29 5c 6e 22 0a 20 20 20 20 20 22 20 20 46  ta)\n".     "  F
2c760 52 4f 4d 20 66 73 64 69 72 28 25 51 2c 25 51 29  ROM fsdir(%Q,%Q)
2c770 20 41 53 20 64 69 73 6b 5c 6e 22 0a 20 20 20 20   AS disk\n".    
2c780 20 22 20 20 57 48 45 52 45 20 6c 73 6d 6f 64 65   "  WHERE lsmode
2c790 28 6d 6f 64 65 29 20 4e 4f 54 20 4c 49 4b 45 20  (mode) NOT LIKE 
2c7a0 27 3f 25 25 27 25 73 3b 22 0a 20 20 20 20 20 2c  '?%%'%s;".     ,
2c7b0 0a 20 20 20 20 20 22 52 45 50 4c 41 43 45 20 49  .     "REPLACE I
2c7c0 4e 54 4f 20 25 73 28 6e 61 6d 65 2c 6d 6f 64 65  NTO %s(name,mode
2c7d0 2c 6d 74 69 6d 65 2c 64 61 74 61 29 5c 6e 22 0a  ,mtime,data)\n".
2c7e0 20 20 20 20 20 22 20 20 53 45 4c 45 43 54 5c 6e       "  SELECT\n
2c7f0 22 0a 20 20 20 20 20 22 20 20 20 20 25 73 2c 5c  ".     "    %s,\
2c800 6e 22 0a 20 20 20 20 20 22 20 20 20 20 6d 6f 64  n".     "    mod
2c810 65 2c 5c 6e 22 0a 20 20 20 20 20 22 20 20 20 20  e,\n".     "    
2c820 6d 74 69 6d 65 2c 5c 6e 22 0a 20 20 20 20 20 22  mtime,\n".     "
2c830 20 20 20 20 64 61 74 61 5c 6e 22 0a 20 20 20 20      data\n".    
2c840 20 22 20 20 46 52 4f 4d 20 66 73 64 69 72 28 25   "  FROM fsdir(%
2c850 51 2c 25 51 29 20 41 53 20 64 69 73 6b 5c 6e 22  Q,%Q) AS disk\n"
2c860 0a 20 20 20 20 20 22 20 20 57 48 45 52 45 20 6c  .     "  WHERE l
2c870 73 6d 6f 64 65 28 6d 6f 64 65 29 20 4e 4f 54 20  smode(mode) NOT 
2c880 4c 49 4b 45 20 27 3f 25 25 27 25 73 3b 22 0a 20  LIKE '?%%'%s;". 
2c890 20 7d 3b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20   };.  int i;    
2c8a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c8b0 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 69 74 65        /* For ite
2c8c0 72 61 74 69 6e 67 20 74 68 72 6f 75 67 68 20 61  rating through a
2c8d0 7a 46 69 6c 65 5b 5d 20 2a 2f 0a 20 20 69 6e 74  zFile[] */.  int
2c8e0 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
2c8f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2c900 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
2c910 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61   const char *zTa
2c920 62 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  b = 0;          
2c930 20 2f 2a 20 53 51 4c 20 74 61 62 6c 65 20 69 6e   /* SQL table in
2c940 74 6f 20 77 68 69 63 68 20 74 6f 20 69 6e 73 65  to which to inse
2c950 72 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 53  rt */.  char *zS
2c960 71 6c 3b 0a 20 20 63 68 61 72 20 7a 54 65 6d 70  ql;.  char zTemp
2c970 5b 35 30 5d 3b 0a 20 20 63 68 61 72 20 2a 7a 45  [50];.  char *zE
2c980 78 69 73 74 73 20 3d 20 30 3b 0a 0a 20 20 61 72  xists = 0;..  ar
2c990 45 78 65 63 53 71 6c 28 70 41 72 2c 20 22 50 52  ExecSql(pAr, "PR
2c9a0 41 47 4d 41 20 70 61 67 65 5f 73 69 7a 65 3d 35  AGMA page_size=5
2c9b0 31 32 22 29 3b 0a 20 20 72 63 20 3d 20 61 72 45  12");.  rc = arE
2c9c0 78 65 63 53 71 6c 28 70 41 72 2c 20 22 53 41 56  xecSql(pAr, "SAV
2c9d0 45 50 4f 49 4e 54 20 61 72 3b 22 29 3b 0a 20 20  EPOINT ar;");.  
2c9e0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2c9f0 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
2ca00 20 7a 54 65 6d 70 5b 30 5d 20 3d 20 30 3b 20 0a   zTemp[0] = 0; .
2ca10 20 20 69 66 28 20 70 41 72 2d 3e 62 5a 69 70 20    if( pAr->bZip 
2ca20 29 7b 0a 20 20 20 20 2f 2a 20 49 6e 69 74 69 61  ){.    /* Initia
2ca30 6c 69 7a 65 20 74 68 65 20 7a 69 70 66 69 6c 65  lize the zipfile
2ca40 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2c 20   virtual table, 
2ca50 69 66 20 6e 65 63 65 73 73 61 72 79 20 2a 2f 0a  if necessary */.
2ca60 20 20 20 20 69 66 28 20 70 41 72 2d 3e 7a 46 69      if( pAr->zFi
2ca70 6c 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  le ){.      sqli
2ca80 74 65 33 5f 75 69 6e 74 36 34 20 72 3b 0a 20 20  te3_uint64 r;.  
2ca90 20 20 20 20 73 71 6c 69 74 65 33 5f 72 61 6e 64      sqlite3_rand
2caa0 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28 72 29  omness(sizeof(r)
2cab0 2c 26 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ,&r);.      sqli
2cac0 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
2cad0 65 6f 66 28 7a 54 65 6d 70 29 2c 7a 54 65 6d 70  eof(zTemp),zTemp
2cae0 2c 22 7a 69 70 25 30 31 36 6c 6c 78 22 2c 72 29  ,"zip%016llx",r)
2caf0 3b 0a 20 20 20 20 20 20 7a 54 61 62 20 3d 20 7a  ;.      zTab = z
2cb00 54 65 6d 70 3b 0a 20 20 20 20 20 20 7a 53 71 6c  Temp;.      zSql
2cb10 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
2cb20 74 66 28 0a 20 20 20 20 20 20 20 20 20 22 43 52  tf(.         "CR
2cb30 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42  EATE VIRTUAL TAB
2cb40 4c 45 20 74 65 6d 70 2e 25 73 20 55 53 49 4e 47  LE temp.%s USING
2cb50 20 7a 69 70 66 69 6c 65 28 25 51 29 22 2c 0a 20   zipfile(%Q)",. 
2cb60 20 20 20 20 20 20 20 20 7a 54 61 62 2c 20 70 41          zTab, pA
2cb70 72 2d 3e 7a 46 69 6c 65 0a 20 20 20 20 20 20 29  r->zFile.      )
2cb80 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 61 72 45  ;.      rc = arE
2cb90 78 65 63 53 71 6c 28 70 41 72 2c 20 7a 53 71 6c  xecSql(pAr, zSql
2cba0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
2cbb0 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20  _free(zSql);.   
2cbc0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 54   }else{.      zT
2cbd0 61 62 20 3d 20 22 7a 69 70 22 3b 0a 20 20 20 20  ab = "zip";.    
2cbe0 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  }.  }else{.    /
2cbf0 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  * Initialize the
2cc00 20 74 61 62 6c 65 20 66 6f 72 20 61 6e 20 53 51   table for an SQ
2cc10 4c 41 52 20 2a 2f 0a 20 20 20 20 7a 54 61 62 20  LAR */.    zTab 
2cc20 3d 20 22 73 71 6c 61 72 22 3b 0a 20 20 20 20 69  = "sqlar";.    i
2cc30 66 28 20 62 55 70 64 61 74 65 3d 3d 30 20 29 7b  f( bUpdate==0 ){
2cc40 0a 20 20 20 20 20 20 72 63 20 3d 20 61 72 45 78  .      rc = arEx
2cc50 65 63 53 71 6c 28 70 41 72 2c 20 7a 44 72 6f 70  ecSql(pAr, zDrop
2cc60 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
2cc70 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
2cc80 6f 20 65 6e 64 5f 61 72 5f 74 72 61 6e 73 61 63  o end_ar_transac
2cc90 74 69 6f 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20  tion;.    }.    
2cca0 72 63 20 3d 20 61 72 45 78 65 63 53 71 6c 28 70  rc = arExecSql(p
2ccb0 41 72 2c 20 7a 43 72 65 61 74 65 29 3b 0a 20 20  Ar, zCreate);.  
2ccc0 7d 0a 20 20 69 66 28 20 62 4f 6e 6c 79 49 66 43  }.  if( bOnlyIfC
2ccd0 68 61 6e 67 65 64 20 29 7b 0a 20 20 20 20 7a 45  hanged ){.    zE
2cce0 78 69 73 74 73 20 3d 20 73 71 6c 69 74 65 33 5f  xists = sqlite3_
2ccf0 6d 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20 22  mprintf(.      "
2cd00 20 41 4e 44 20 4e 4f 54 20 45 58 49 53 54 53 28   AND NOT EXISTS(
2cd10 22 0a 20 20 20 20 20 20 20 20 20 20 22 53 45 4c  ".          "SEL
2cd20 45 43 54 20 31 20 46 52 4f 4d 20 25 73 20 41 53  ECT 1 FROM %s AS
2cd30 20 6d 65 6d 22 0a 20 20 20 20 20 20 20 20 20 20   mem".          
2cd40 22 20 57 48 45 52 45 20 6d 65 6d 2e 6e 61 6d 65  " WHERE mem.name
2cd50 3d 64 69 73 6b 2e 6e 61 6d 65 22 0a 20 20 20 20  =disk.name".    
2cd60 20 20 20 20 20 20 22 20 41 4e 44 20 6d 65 6d 2e        " AND mem.
2cd70 6d 74 69 6d 65 3d 64 69 73 6b 2e 6d 74 69 6d 65  mtime=disk.mtime
2cd80 22 0a 20 20 20 20 20 20 20 20 20 20 22 20 41 4e  ".          " AN
2cd90 44 20 6d 65 6d 2e 6d 6f 64 65 3d 64 69 73 6b 2e  D mem.mode=disk.
2cda0 6d 6f 64 65 29 22 2c 20 7a 54 61 62 29 3b 0a 20  mode)", zTab);. 
2cdb0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 45 78 69   }else{.    zExi
2cdc0 73 74 73 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  sts = sqlite3_mp
2cdd0 72 69 6e 74 66 28 22 22 29 3b 0a 20 20 7d 0a 20  rintf("");.  }. 
2cde0 20 69 66 28 20 7a 45 78 69 73 74 73 3d 3d 30 20   if( zExists==0 
2cdf0 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f  ) rc = SQLITE_NO
2ce00 4d 45 4d 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  MEM;.  for(i=0; 
2ce10 69 3c 70 41 72 2d 3e 6e 41 72 67 20 26 26 20 72  i<pAr->nArg && r
2ce20 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 2b  c==SQLITE_OK; i+
2ce30 2b 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 53  +){.    char *zS
2ce40 71 6c 32 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  ql2 = sqlite3_mp
2ce50 72 69 6e 74 66 28 7a 49 6e 73 65 72 74 46 6d 74  rintf(zInsertFmt
2ce60 5b 70 41 72 2d 3e 62 5a 69 70 5d 2c 20 7a 54 61  [pAr->bZip], zTa
2ce70 62 2c 0a 20 20 20 20 20 20 20 20 70 41 72 2d 3e  b,.        pAr->
2ce80 62 56 65 72 62 6f 73 65 20 3f 20 22 73 68 65 6c  bVerbose ? "shel
2ce90 6c 5f 70 75 74 73 6e 6c 28 6e 61 6d 65 29 22 20  l_putsnl(name)" 
2cea0 3a 20 22 6e 61 6d 65 22 2c 0a 20 20 20 20 20 20  : "name",.      
2ceb0 20 20 70 41 72 2d 3e 61 7a 41 72 67 5b 69 5d 2c    pAr->azArg[i],
2cec0 20 70 41 72 2d 3e 7a 44 69 72 2c 20 7a 45 78 69   pAr->zDir, zExi
2ced0 73 74 73 29 3b 0a 20 20 20 20 72 63 20 3d 20 61  sts);.    rc = a
2cee0 72 45 78 65 63 53 71 6c 28 70 41 72 2c 20 7a 53  rExecSql(pAr, zS
2cef0 71 6c 32 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ql2);.    sqlite
2cf00 33 5f 66 72 65 65 28 7a 53 71 6c 32 29 3b 0a 20  3_free(zSql2);. 
2cf10 20 7d 0a 65 6e 64 5f 61 72 5f 74 72 61 6e 73 61   }.end_ar_transa
2cf20 63 74 69 6f 6e 3a 0a 20 20 69 66 28 20 72 63 21  ction:.  if( rc!
2cf30 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2cf40 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70    sqlite3_exec(p
2cf50 41 72 2d 3e 64 62 2c 20 22 52 4f 4c 4c 42 41 43  Ar->db, "ROLLBAC
2cf60 4b 20 54 4f 20 61 72 3b 20 52 45 4c 45 41 53 45  K TO ar; RELEASE
2cf70 20 61 72 3b 22 2c 20 30 2c 20 30 2c 20 30 29 3b   ar;", 0, 0, 0);
2cf80 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
2cf90 20 3d 20 61 72 45 78 65 63 53 71 6c 28 70 41 72   = arExecSql(pAr
2cfa0 2c 20 22 52 45 4c 45 41 53 45 20 61 72 3b 22 29  , "RELEASE ar;")
2cfb0 3b 0a 20 20 20 20 69 66 28 20 70 41 72 2d 3e 62  ;.    if( pAr->b
2cfc0 5a 69 70 20 26 26 20 70 41 72 2d 3e 7a 46 69 6c  Zip && pAr->zFil
2cfd0 65 20 29 7b 0a 20 20 20 20 20 20 7a 53 71 6c 20  e ){.      zSql 
2cfe0 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
2cff0 66 28 22 44 52 4f 50 20 54 41 42 4c 45 20 25 73  f("DROP TABLE %s
2d000 22 2c 20 7a 54 65 6d 70 29 3b 0a 20 20 20 20 20  ", zTemp);.     
2d010 20 61 72 45 78 65 63 53 71 6c 28 70 41 72 2c 20   arExecSql(pAr, 
2d020 7a 53 71 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c  zSql);.      sql
2d030 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b  ite3_free(zSql);
2d040 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
2d050 69 74 65 33 5f 66 72 65 65 28 7a 45 78 69 73 74  ite3_free(zExist
2d060 73 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  s);.  return rc;
2d070 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d  .}../*.** Implem
2d080 65 6e 74 61 74 69 6f 6e 20 6f 66 20 22 2e 61 72  entation of ".ar
2d090 22 20 64 6f 74 20 63 6f 6d 6d 61 6e 64 2e 0a 2a  " dot command..*
2d0a0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 72 44  /.static int arD
2d0b0 6f 74 43 6f 6d 6d 61 6e 64 28 0a 20 20 53 68 65  otCommand(.  She
2d0c0 6c 6c 53 74 61 74 65 20 2a 70 53 74 61 74 65 2c  llState *pState,
2d0d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2d0e0 43 75 72 72 65 6e 74 20 73 68 65 6c 6c 20 74 6f  Current shell to
2d0f0 6f 6c 20 73 74 61 74 65 20 2a 2f 0a 20 20 69 6e  ol state */.  in
2d100 74 20 66 72 6f 6d 43 6d 64 4c 69 6e 65 2c 20 20  t fromCmdLine,  
2d110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2d120 20 54 72 75 65 20 69 66 20 2d 41 20 63 6f 6d 6d   True if -A comm
2d130 61 6e 64 2d 6c 69 6e 65 20 6f 70 74 69 6f 6e 2c  and-line option,
2d140 20 6e 6f 74 20 2e 61 72 20 63 6d 64 20 2a 2f 0a   not .ar cmd */.
2d150 20 20 63 68 61 72 20 2a 2a 61 7a 41 72 67 2c 20    char **azArg, 
2d160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d170 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 61 72    /* Array of ar
2d180 67 75 6d 65 6e 74 73 20 70 61 73 73 65 64 20 74  guments passed t
2d190 6f 20 64 6f 74 20 63 6f 6d 6d 61 6e 64 20 2a 2f  o dot command */
2d1a0 0a 20 20 69 6e 74 20 6e 41 72 67 20 20 20 20 20  .  int nArg     
2d1b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d1c0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
2d1d0 65 6e 74 72 69 65 73 20 69 6e 20 61 7a 41 72 67  entries in azArg
2d1e0 5b 5d 20 2a 2f 0a 29 7b 0a 20 20 41 72 43 6f 6d  [] */.){.  ArCom
2d1f0 6d 61 6e 64 20 63 6d 64 3b 0a 20 20 69 6e 74 20  mand cmd;.  int 
2d200 72 63 3b 0a 20 20 6d 65 6d 73 65 74 28 26 63 6d  rc;.  memset(&cm
2d210 64 2c 20 30 2c 20 73 69 7a 65 6f 66 28 63 6d 64  d, 0, sizeof(cmd
2d220 29 29 3b 0a 20 20 63 6d 64 2e 66 72 6f 6d 43 6d  ));.  cmd.fromCm
2d230 64 4c 69 6e 65 20 3d 20 66 72 6f 6d 43 6d 64 4c  dLine = fromCmdL
2d240 69 6e 65 3b 0a 20 20 72 63 20 3d 20 61 72 50 61  ine;.  rc = arPa
2d250 72 73 65 43 6f 6d 6d 61 6e 64 28 61 7a 41 72 67  rseCommand(azArg
2d260 2c 20 6e 41 72 67 2c 20 26 63 6d 64 29 3b 0a 20  , nArg, &cmd);. 
2d270 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2d280 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 65 44  OK ){.    int eD
2d290 62 54 79 70 65 20 3d 20 53 48 45 4c 4c 5f 4f 50  bType = SHELL_OP
2d2a0 45 4e 5f 55 4e 53 50 45 43 3b 0a 20 20 20 20 63  EN_UNSPEC;.    c
2d2b0 6d 64 2e 70 20 3d 20 70 53 74 61 74 65 3b 0a 20  md.p = pState;. 
2d2c0 20 20 20 63 6d 64 2e 64 62 20 3d 20 70 53 74 61     cmd.db = pSta
2d2d0 74 65 2d 3e 64 62 3b 0a 20 20 20 20 69 66 28 20  te->db;.    if( 
2d2e0 63 6d 64 2e 7a 46 69 6c 65 20 29 7b 0a 20 20 20  cmd.zFile ){.   
2d2f0 20 20 20 65 44 62 54 79 70 65 20 3d 20 64 65 64     eDbType = ded
2d300 75 63 65 44 61 74 61 62 61 73 65 54 79 70 65 28  uceDatabaseType(
2d310 63 6d 64 2e 7a 46 69 6c 65 2c 20 31 29 3b 0a 20  cmd.zFile, 1);. 
2d320 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2d330 65 44 62 54 79 70 65 20 3d 20 70 53 74 61 74 65  eDbType = pState
2d340 2d 3e 6f 70 65 6e 4d 6f 64 65 3b 0a 20 20 20 20  ->openMode;.    
2d350 7d 0a 20 20 20 20 69 66 28 20 65 44 62 54 79 70  }.    if( eDbTyp
2d360 65 3d 3d 53 48 45 4c 4c 5f 4f 50 45 4e 5f 5a 49  e==SHELL_OPEN_ZI
2d370 50 46 49 4c 45 20 29 7b 0a 20 20 20 20 20 20 69  PFILE ){.      i
2d380 66 28 20 63 6d 64 2e 65 43 6d 64 3d 3d 41 52 5f  f( cmd.eCmd==AR_
2d390 43 4d 44 5f 45 58 54 52 41 43 54 20 7c 7c 20 63  CMD_EXTRACT || c
2d3a0 6d 64 2e 65 43 6d 64 3d 3d 41 52 5f 43 4d 44 5f  md.eCmd==AR_CMD_
2d3b0 4c 49 53 54 20 29 7b 0a 20 20 20 20 20 20 20 20  LIST ){.        
2d3c0 69 66 28 20 63 6d 64 2e 7a 46 69 6c 65 3d 3d 30  if( cmd.zFile==0
2d3d0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6d   ){.          cm
2d3e0 64 2e 7a 53 72 63 54 61 62 6c 65 20 3d 20 73 71  d.zSrcTable = sq
2d3f0 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 7a  lite3_mprintf("z
2d400 69 70 22 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  ip");.        }e
2d410 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 63  lse{.          c
2d420 6d 64 2e 7a 53 72 63 54 61 62 6c 65 20 3d 20 73  md.zSrcTable = s
2d430 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
2d440 7a 69 70 66 69 6c 65 28 25 51 29 22 2c 20 63 6d  zipfile(%Q)", cm
2d450 64 2e 7a 46 69 6c 65 29 3b 0a 20 20 20 20 20 20  d.zFile);.      
2d460 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
2d470 20 20 63 6d 64 2e 62 5a 69 70 20 3d 20 31 3b 0a    cmd.bZip = 1;.
2d480 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 6d      }else if( cm
2d490 64 2e 7a 46 69 6c 65 20 29 7b 0a 20 20 20 20 20  d.zFile ){.     
2d4a0 20 69 6e 74 20 66 6c 61 67 73 3b 0a 20 20 20 20   int flags;.    
2d4b0 20 20 69 66 28 20 63 6d 64 2e 62 41 70 70 65 6e    if( cmd.bAppen
2d4c0 64 20 29 20 65 44 62 54 79 70 65 20 3d 20 53 48  d ) eDbType = SH
2d4d0 45 4c 4c 5f 4f 50 45 4e 5f 41 50 50 45 4e 44 56  ELL_OPEN_APPENDV
2d4e0 46 53 3b 0a 20 20 20 20 20 20 69 66 28 20 63 6d  FS;.      if( cm
2d4f0 64 2e 65 43 6d 64 3d 3d 41 52 5f 43 4d 44 5f 43  d.eCmd==AR_CMD_C
2d500 52 45 41 54 45 20 7c 7c 20 63 6d 64 2e 65 43 6d  REATE || cmd.eCm
2d510 64 3d 3d 41 52 5f 43 4d 44 5f 49 4e 53 45 52 54  d==AR_CMD_INSERT
2d520 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20   .           || 
2d530 63 6d 64 2e 65 43 6d 64 3d 3d 41 52 5f 43 4d 44  cmd.eCmd==AR_CMD
2d540 5f 55 50 44 41 54 45 20 29 7b 0a 20 20 20 20 20  _UPDATE ){.     
2d550 20 20 20 66 6c 61 67 73 20 3d 20 53 51 4c 49 54     flags = SQLIT
2d560 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
2d570 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45  |SQLITE_OPEN_CRE
2d580 41 54 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ATE;.      }else
2d590 7b 0a 20 20 20 20 20 20 20 20 66 6c 61 67 73 20  {.        flags 
2d5a0 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  = SQLITE_OPEN_RE
2d5b0 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 7d 0a  ADONLY;.      }.
2d5c0 20 20 20 20 20 20 63 6d 64 2e 64 62 20 3d 20 30        cmd.db = 0
2d5d0 3b 0a 20 20 20 20 20 20 69 66 28 20 63 6d 64 2e  ;.      if( cmd.
2d5e0 62 44 72 79 52 75 6e 20 29 7b 0a 20 20 20 20 20  bDryRun ){.     
2d5f0 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70     utf8_printf(p
2d600 53 74 61 74 65 2d 3e 6f 75 74 2c 20 22 2d 2d 20  State->out, "-- 
2d610 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 27 25  open database '%
2d620 73 27 25 73 5c 6e 22 2c 20 63 6d 64 2e 7a 46 69  s'%s\n", cmd.zFi
2d630 6c 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  le,.            
2d640 20 65 44 62 54 79 70 65 3d 3d 53 48 45 4c 4c 5f   eDbType==SHELL_
2d650 4f 50 45 4e 5f 41 50 50 45 4e 44 56 46 53 20 3f  OPEN_APPENDVFS ?
2d660 20 22 20 75 73 69 6e 67 20 27 61 70 6e 64 76 66   " using 'apndvf
2d670 73 27 22 20 3a 20 22 22 29 3b 0a 20 20 20 20 20  s'" : "");.     
2d680 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71   }.      rc = sq
2d690 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28 63 6d  lite3_open_v2(cm
2d6a0 64 2e 7a 46 69 6c 65 2c 20 26 63 6d 64 2e 64 62  d.zFile, &cmd.db
2d6b0 2c 20 66 6c 61 67 73 2c 20 0a 20 20 20 20 20 20  , flags, .      
2d6c0 20 20 20 20 20 20 20 65 44 62 54 79 70 65 3d 3d         eDbType==
2d6d0 53 48 45 4c 4c 5f 4f 50 45 4e 5f 41 50 50 45 4e  SHELL_OPEN_APPEN
2d6e0 44 56 46 53 20 3f 20 22 61 70 6e 64 76 66 73 22  DVFS ? "apndvfs"
2d6f0 20 3a 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28   : 0);.      if(
2d700 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2d710 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70  {.        utf8_p
2d720 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 63  rintf(stderr, "c
2d730 61 6e 6e 6f 74 20 6f 70 65 6e 20 66 69 6c 65 3a  annot open file:
2d740 20 25 73 20 28 25 73 29 5c 6e 22 2c 20 0a 20 20   %s (%s)\n", .  
2d750 20 20 20 20 20 20 20 20 20 20 63 6d 64 2e 7a 46            cmd.zF
2d760 69 6c 65 2c 20 73 71 6c 69 74 65 33 5f 65 72 72  ile, sqlite3_err
2d770 6d 73 67 28 63 6d 64 2e 64 62 29 0a 20 20 20 20  msg(cmd.db).    
2d780 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 67      );.        g
2d790 6f 74 6f 20 65 6e 64 5f 61 72 5f 63 6f 6d 6d 61  oto end_ar_comma
2d7a0 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  nd;.      }.    
2d7b0 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 69 6f    sqlite3_fileio
2d7c0 5f 69 6e 69 74 28 63 6d 64 2e 64 62 2c 20 30 2c  _init(cmd.db, 0,
2d7d0 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
2d7e0 65 33 5f 73 71 6c 61 72 5f 69 6e 69 74 28 63 6d  e3_sqlar_init(cm
2d7f0 64 2e 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20 20  d.db, 0, 0);.   
2d800 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74     sqlite3_creat
2d810 65 5f 66 75 6e 63 74 69 6f 6e 28 63 6d 64 2e 64  e_function(cmd.d
2d820 62 2c 20 22 73 68 65 6c 6c 5f 70 75 74 73 6e 6c  b, "shell_putsnl
2d830 22 2c 20 31 2c 20 53 51 4c 49 54 45 5f 55 54 46  ", 1, SQLITE_UTF
2d840 38 2c 20 63 6d 64 2e 70 2c 0a 20 20 20 20 20 20  8, cmd.p,.      
2d850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d860 20 20 20 20 20 20 20 20 73 68 65 6c 6c 50 75 74          shellPut
2d870 73 46 75 6e 63 2c 20 30 2c 20 30 29 3b 0a 0a 20  sFunc, 0, 0);.. 
2d880 20 20 20 7d 0a 20 20 20 20 69 66 28 20 63 6d 64     }.    if( cmd
2d890 2e 7a 53 72 63 54 61 62 6c 65 3d 3d 30 20 26 26  .zSrcTable==0 &&
2d8a0 20 63 6d 64 2e 62 5a 69 70 3d 3d 30 20 26 26 20   cmd.bZip==0 && 
2d8b0 63 6d 64 2e 65 43 6d 64 21 3d 41 52 5f 43 4d 44  cmd.eCmd!=AR_CMD
2d8c0 5f 48 45 4c 50 20 29 7b 0a 20 20 20 20 20 20 69  _HELP ){.      i
2d8d0 66 28 20 63 6d 64 2e 65 43 6d 64 21 3d 41 52 5f  f( cmd.eCmd!=AR_
2d8e0 43 4d 44 5f 43 52 45 41 54 45 0a 20 20 20 20 20  CMD_CREATE.     
2d8f0 20 20 26 26 20 73 71 6c 69 74 65 33 5f 74 61 62    && sqlite3_tab
2d900 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d 65 74 61 64 61  le_column_metada
2d910 74 61 28 63 6d 64 2e 64 62 2c 30 2c 22 73 71 6c  ta(cmd.db,0,"sql
2d920 61 72 22 2c 22 6e 61 6d 65 22 2c 30 2c 30 2c 30  ar","name",0,0,0
2d930 2c 30 2c 30 29 0a 20 20 20 20 20 20 29 7b 0a 20  ,0,0).      ){. 
2d940 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e         utf8_prin
2d950 74 66 28 73 74 64 65 72 72 2c 20 22 64 61 74 61  tf(stderr, "data
2d960 62 61 73 65 20 64 6f 65 73 20 6e 6f 74 20 63 6f  base does not co
2d970 6e 74 61 69 6e 20 61 6e 20 27 73 71 6c 61 72 27  ntain an 'sqlar'
2d980 20 74 61 62 6c 65 5c 6e 22 29 3b 0a 20 20 20 20   table\n");.    
2d990 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
2d9a0 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 67  ERROR;.        g
2d9b0 6f 74 6f 20 65 6e 64 5f 61 72 5f 63 6f 6d 6d 61  oto end_ar_comma
2d9c0 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  nd;.      }.    
2d9d0 20 20 63 6d 64 2e 7a 53 72 63 54 61 62 6c 65 20    cmd.zSrcTable 
2d9e0 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
2d9f0 66 28 22 73 71 6c 61 72 22 29 3b 0a 20 20 20 20  f("sqlar");.    
2da00 7d 0a 0a 20 20 20 20 73 77 69 74 63 68 28 20 63  }..    switch( c
2da10 6d 64 2e 65 43 6d 64 20 29 7b 0a 20 20 20 20 20  md.eCmd ){.     
2da20 20 63 61 73 65 20 41 52 5f 43 4d 44 5f 43 52 45   case AR_CMD_CRE
2da30 41 54 45 3a 0a 20 20 20 20 20 20 20 20 72 63 20  ATE:.        rc 
2da40 3d 20 61 72 43 72 65 61 74 65 4f 72 55 70 64 61  = arCreateOrUpda
2da50 74 65 43 6f 6d 6d 61 6e 64 28 26 63 6d 64 2c 20  teCommand(&cmd, 
2da60 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 62  0, 0);.        b
2da70 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20 63 61 73  reak;..      cas
2da80 65 20 41 52 5f 43 4d 44 5f 45 58 54 52 41 43 54  e AR_CMD_EXTRACT
2da90 3a 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 61  :.        rc = a
2daa0 72 45 78 74 72 61 63 74 43 6f 6d 6d 61 6e 64 28  rExtractCommand(
2dab0 26 63 6d 64 29 3b 0a 20 20 20 20 20 20 20 20 62  &cmd);.        b
2dac0 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20 63 61 73  reak;..      cas
2dad0 65 20 41 52 5f 43 4d 44 5f 4c 49 53 54 3a 0a 20  e AR_CMD_LIST:. 
2dae0 20 20 20 20 20 20 20 72 63 20 3d 20 61 72 4c 69         rc = arLi
2daf0 73 74 43 6f 6d 6d 61 6e 64 28 26 63 6d 64 29 3b  stCommand(&cmd);
2db00 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
2db10 0a 20 20 20 20 20 20 63 61 73 65 20 41 52 5f 43  .      case AR_C
2db20 4d 44 5f 48 45 4c 50 3a 0a 20 20 20 20 20 20 20  MD_HELP:.       
2db30 20 61 72 55 73 61 67 65 28 70 53 74 61 74 65 2d   arUsage(pState-
2db40 3e 6f 75 74 29 3b 0a 20 20 20 20 20 20 20 20 62  >out);.        b
2db50 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20 63 61 73  reak;..      cas
2db60 65 20 41 52 5f 43 4d 44 5f 49 4e 53 45 52 54 3a  e AR_CMD_INSERT:
2db70 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 61 72  .        rc = ar
2db80 43 72 65 61 74 65 4f 72 55 70 64 61 74 65 43 6f  CreateOrUpdateCo
2db90 6d 6d 61 6e 64 28 26 63 6d 64 2c 20 31 2c 20 30  mmand(&cmd, 1, 0
2dba0 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
2dbb0 3b 0a 0a 20 20 20 20 20 20 64 65 66 61 75 6c 74  ;..      default
2dbc0 3a 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  :.        assert
2dbd0 28 20 63 6d 64 2e 65 43 6d 64 3d 3d 41 52 5f 43  ( cmd.eCmd==AR_C
2dbe0 4d 44 5f 55 50 44 41 54 45 20 29 3b 0a 20 20 20  MD_UPDATE );.   
2dbf0 20 20 20 20 20 72 63 20 3d 20 61 72 43 72 65 61       rc = arCrea
2dc00 74 65 4f 72 55 70 64 61 74 65 43 6f 6d 6d 61 6e  teOrUpdateComman
2dc10 64 28 26 63 6d 64 2c 20 31 2c 20 31 29 3b 0a 20  d(&cmd, 1, 1);. 
2dc20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
2dc30 20 20 7d 0a 20 20 7d 0a 65 6e 64 5f 61 72 5f 63    }.  }.end_ar_c
2dc40 6f 6d 6d 61 6e 64 3a 0a 20 20 69 66 28 20 63 6d  ommand:.  if( cm
2dc50 64 2e 64 62 21 3d 70 53 74 61 74 65 2d 3e 64 62  d.db!=pState->db
2dc60 20 29 7b 0a 20 20 20 20 63 6c 6f 73 65 5f 64 62   ){.    close_db
2dc70 28 63 6d 64 2e 64 62 29 3b 0a 20 20 7d 0a 20 20  (cmd.db);.  }.  
2dc80 73 71 6c 69 74 65 33 5f 66 72 65 65 28 63 6d 64  sqlite3_free(cmd
2dc90 2e 7a 53 72 63 54 61 62 6c 65 29 3b 0a 0a 20 20  .zSrcTable);..  
2dca0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 2f 2a 20  return rc;.}./* 
2dcb0 45 6e 64 20 6f 66 20 74 68 65 20 22 2e 61 72 63  End of the ".arc
2dcc0 68 69 76 65 22 20 6f 72 20 22 2e 61 72 22 20 63  hive" or ".ar" c
2dcd0 6f 6d 6d 61 6e 64 20 6c 6f 67 69 63 0a 2a 2a 2a  ommand logic.***
2dce0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2dcf0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2dd00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2dd10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2dd20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
2dd30 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69  .#endif /* !defi
2dd40 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
2dd50 56 49 52 54 55 41 4c 54 41 42 4c 45 29 20 26 26  VIRTUALTABLE) &&
2dd60 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
2dd70 48 41 56 45 5f 5a 4c 49 42 29 20 2a 2f 0a 0a 0a  HAVE_ZLIB) */...
2dd80 2f 2a 0a 2a 2a 20 49 66 20 61 6e 20 69 6e 70 75  /*.** If an inpu
2dd90 74 20 6c 69 6e 65 20 62 65 67 69 6e 73 20 77 69  t line begins wi
2dda0 74 68 20 22 2e 22 20 74 68 65 6e 20 69 6e 76 6f  th "." then invo
2ddb0 6b 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ke this routine 
2ddc0 74 6f 0a 2a 2a 20 70 72 6f 63 65 73 73 20 74 68  to.** process th
2ddd0 61 74 20 6c 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 52  at line..**.** R
2dde0 65 74 75 72 6e 20 31 20 6f 6e 20 65 72 72 6f 72  eturn 1 on error
2ddf0 2c 20 32 20 74 6f 20 65 78 69 74 2c 20 61 6e 64  , 2 to exit, and
2de00 20 30 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f   0 otherwise..*/
2de10 0a 73 74 61 74 69 63 20 69 6e 74 20 64 6f 5f 6d  .static int do_m
2de20 65 74 61 5f 63 6f 6d 6d 61 6e 64 28 63 68 61 72  eta_command(char
2de30 20 2a 7a 4c 69 6e 65 2c 20 53 68 65 6c 6c 53 74   *zLine, ShellSt
2de40 61 74 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 68  ate *p){.  int h
2de50 20 3d 20 31 3b 0a 20 20 69 6e 74 20 6e 41 72 67   = 1;.  int nArg
2de60 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 2c 20 63   = 0;.  int n, c
2de70 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a  ;.  int rc = 0;.
2de80 20 20 63 68 61 72 20 2a 61 7a 41 72 67 5b 35 30    char *azArg[50
2de90 5d 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  ];..#ifndef SQLI
2dea0 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
2deb0 41 42 4c 45 0a 20 20 69 66 28 20 70 2d 3e 65 78  ABLE.  if( p->ex
2dec0 70 65 72 74 2e 70 45 78 70 65 72 74 20 29 7b 0a  pert.pExpert ){.
2ded0 20 20 20 20 65 78 70 65 72 74 46 69 6e 69 73 68      expertFinish
2dee0 28 70 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 23  (p, 1, 0);.  }.#
2def0 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 50 61 72 73  endif..  /* Pars
2df00 65 20 74 68 65 20 69 6e 70 75 74 20 6c 69 6e 65  e the input line
2df10 20 69 6e 74 6f 20 74 6f 6b 65 6e 73 2e 0a 20 20   into tokens..  
2df20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 7a 4c 69 6e  */.  while( zLin
2df30 65 5b 68 5d 20 26 26 20 6e 41 72 67 3c 41 72 72  e[h] && nArg<Arr
2df40 61 79 53 69 7a 65 28 61 7a 41 72 67 29 20 29 7b  aySize(azArg) ){
2df50 0a 20 20 20 20 77 68 69 6c 65 28 20 49 73 53 70  .    while( IsSp
2df60 61 63 65 28 7a 4c 69 6e 65 5b 68 5d 29 20 29 7b  ace(zLine[h]) ){
2df70 20 68 2b 2b 3b 20 7d 0a 20 20 20 20 69 66 28 20   h++; }.    if( 
2df80 7a 4c 69 6e 65 5b 68 5d 3d 3d 30 20 29 20 62 72  zLine[h]==0 ) br
2df90 65 61 6b 3b 0a 20 20 20 20 69 66 28 20 7a 4c 69  eak;.    if( zLi
2dfa0 6e 65 5b 68 5d 3d 3d 27 5c 27 27 20 7c 7c 20 7a  ne[h]=='\'' || z
2dfb0 4c 69 6e 65 5b 68 5d 3d 3d 27 22 27 20 29 7b 0a  Line[h]=='"' ){.
2dfc0 20 20 20 20 20 20 69 6e 74 20 64 65 6c 69 6d 20        int delim 
2dfd0 3d 20 7a 4c 69 6e 65 5b 68 2b 2b 5d 3b 0a 20 20  = zLine[h++];.  
2dfe0 20 20 20 20 61 7a 41 72 67 5b 6e 41 72 67 2b 2b      azArg[nArg++
2dff0 5d 20 3d 20 26 7a 4c 69 6e 65 5b 68 5d 3b 0a 20  ] = &zLine[h];. 
2e000 20 20 20 20 20 77 68 69 6c 65 28 20 7a 4c 69 6e       while( zLin
2e010 65 5b 68 5d 20 26 26 20 7a 4c 69 6e 65 5b 68 5d  e[h] && zLine[h]
2e020 21 3d 64 65 6c 69 6d 20 29 7b 0a 20 20 20 20 20  !=delim ){.     
2e030 20 20 20 69 66 28 20 7a 4c 69 6e 65 5b 68 5d 3d     if( zLine[h]=
2e040 3d 27 5c 5c 27 20 26 26 20 64 65 6c 69 6d 3d 3d  ='\\' && delim==
2e050 27 22 27 20 26 26 20 7a 4c 69 6e 65 5b 68 2b 31  '"' && zLine[h+1
2e060 5d 21 3d 30 20 29 20 68 2b 2b 3b 0a 20 20 20 20  ]!=0 ) h++;.    
2e070 20 20 20 20 68 2b 2b 3b 0a 20 20 20 20 20 20 7d      h++;.      }
2e080 0a 20 20 20 20 20 20 69 66 28 20 7a 4c 69 6e 65  .      if( zLine
2e090 5b 68 5d 3d 3d 64 65 6c 69 6d 20 29 7b 0a 20 20  [h]==delim ){.  
2e0a0 20 20 20 20 20 20 7a 4c 69 6e 65 5b 68 2b 2b 5d        zLine[h++]
2e0b0 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
2e0c0 20 20 20 20 69 66 28 20 64 65 6c 69 6d 3d 3d 27      if( delim=='
2e0d0 22 27 20 29 20 72 65 73 6f 6c 76 65 5f 62 61 63  "' ) resolve_bac
2e0e0 6b 73 6c 61 73 68 65 73 28 61 7a 41 72 67 5b 6e  kslashes(azArg[n
2e0f0 41 72 67 2d 31 5d 29 3b 0a 20 20 20 20 7d 65 6c  Arg-1]);.    }el
2e100 73 65 7b 0a 20 20 20 20 20 20 61 7a 41 72 67 5b  se{.      azArg[
2e110 6e 41 72 67 2b 2b 5d 20 3d 20 26 7a 4c 69 6e 65  nArg++] = &zLine
2e120 5b 68 5d 3b 0a 20 20 20 20 20 20 77 68 69 6c 65  [h];.      while
2e130 28 20 7a 4c 69 6e 65 5b 68 5d 20 26 26 20 21 49  ( zLine[h] && !I
2e140 73 53 70 61 63 65 28 7a 4c 69 6e 65 5b 68 5d 29  sSpace(zLine[h])
2e150 20 29 7b 20 68 2b 2b 3b 20 7d 0a 20 20 20 20 20   ){ h++; }.     
2e160 20 69 66 28 20 7a 4c 69 6e 65 5b 68 5d 20 29 20   if( zLine[h] ) 
2e170 7a 4c 69 6e 65 5b 68 2b 2b 5d 20 3d 20 30 3b 0a  zLine[h++] = 0;.
2e180 20 20 20 20 20 20 72 65 73 6f 6c 76 65 5f 62 61        resolve_ba
2e190 63 6b 73 6c 61 73 68 65 73 28 61 7a 41 72 67 5b  ckslashes(azArg[
2e1a0 6e 41 72 67 2d 31 5d 29 3b 0a 20 20 20 20 7d 0a  nArg-1]);.    }.
2e1b0 20 20 7d 0a 0a 20 20 2f 2a 20 50 72 6f 63 65 73    }..  /* Proces
2e1c0 73 20 74 68 65 20 69 6e 70 75 74 20 6c 69 6e 65  s the input line
2e1d0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e 41 72  ..  */.  if( nAr
2e1e0 67 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  g==0 ) return 0;
2e1f0 20 2f 2a 20 6e 6f 20 74 6f 6b 65 6e 73 2c 20 6e   /* no tokens, n
2e200 6f 20 65 72 72 6f 72 20 2a 2f 0a 20 20 6e 20 3d  o error */.  n =
2e210 20 73 74 72 6c 65 6e 33 30 28 61 7a 41 72 67 5b   strlen30(azArg[
2e220 30 5d 29 3b 0a 20 20 63 20 3d 20 61 7a 41 72 67  0]);.  c = azArg
2e230 5b 30 5d 5b 30 5d 3b 0a 20 20 63 6c 65 61 72 54  [0][0];.  clearT
2e240 65 6d 70 46 69 6c 65 28 70 29 3b 0a 0a 23 69 66  empFile(p);..#if
2e250 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
2e260 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20  _AUTHORIZATION. 
2e270 20 69 66 28 20 63 3d 3d 27 61 27 20 26 26 20 73   if( c=='a' && s
2e280 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c  trncmp(azArg[0],
2e290 20 22 61 75 74 68 22 2c 20 6e 29 3d 3d 30 20 29   "auth", n)==0 )
2e2a0 7b 0a 20 20 20 20 69 66 28 20 6e 41 72 67 21 3d  {.    if( nArg!=
2e2b0 32 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70  2 ){.      raw_p
2e2c0 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55  rintf(stderr, "U
2e2d0 73 61 67 65 3a 20 2e 61 75 74 68 20 4f 4e 7c 4f  sage: .auth ON|O
2e2e0 46 46 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 63  FF\n");.      rc
2e2f0 20 3d 20 31 3b 0a 20 20 20 20 20 20 67 6f 74 6f   = 1;.      goto
2e300 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78   meta_command_ex
2e310 69 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6f 70  it;.    }.    op
2e320 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a 20 20 20  en_db(p, 0);.   
2e330 20 69 66 28 20 62 6f 6f 6c 65 61 6e 56 61 6c 75   if( booleanValu
2e340 65 28 61 7a 41 72 67 5b 31 5d 29 20 29 7b 0a 20  e(azArg[1]) ){. 
2e350 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 65 74       sqlite3_set
2e360 5f 61 75 74 68 6f 72 69 7a 65 72 28 70 2d 3e 64  _authorizer(p->d
2e370 62 2c 20 73 68 65 6c 6c 41 75 74 68 2c 20 70 29  b, shellAuth, p)
2e380 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
2e390 20 20 20 73 71 6c 69 74 65 33 5f 73 65 74 5f 61     sqlite3_set_a
2e3a0 75 74 68 6f 72 69 7a 65 72 28 70 2d 3e 64 62 2c  uthorizer(p->db,
2e3b0 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20   0, 0);.    }.  
2e3c0 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 0a 23 69  }else.#endif..#i
2e3d0 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
2e3e0 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
2e3f0 42 4c 45 29 20 26 26 20 64 65 66 69 6e 65 64 28  BLE) && defined(
2e400 53 51 4c 49 54 45 5f 48 41 56 45 5f 5a 4c 49 42  SQLITE_HAVE_ZLIB
2e410 29 0a 20 20 69 66 28 20 63 3d 3d 27 61 27 20 26  ).  if( c=='a' &
2e420 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b  & strncmp(azArg[
2e430 30 5d 2c 20 22 61 72 63 68 69 76 65 22 2c 20 6e  0], "archive", n
2e440 29 3d 3d 30 20 29 7b 0a 20 20 20 20 6f 70 65 6e  )==0 ){.    open
2e450 5f 64 62 28 70 2c 20 30 29 3b 0a 20 20 20 20 72  _db(p, 0);.    r
2e460 63 20 3d 20 61 72 44 6f 74 43 6f 6d 6d 61 6e 64  c = arDotCommand
2e470 28 70 2c 20 30 2c 20 61 7a 41 72 67 2c 20 6e 41  (p, 0, azArg, nA
2e480 72 67 29 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e  rg);.  }else.#en
2e490 64 69 66 0a 0a 20 20 69 66 28 20 28 63 3d 3d 27  dif..  if( (c=='
2e4a0 62 27 20 26 26 20 6e 3e 3d 33 20 26 26 20 73 74  b' && n>=3 && st
2e4b0 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20  rncmp(azArg[0], 
2e4c0 22 62 61 63 6b 75 70 22 2c 20 6e 29 3d 3d 30 29  "backup", n)==0)
2e4d0 0a 20 20 20 7c 7c 20 28 63 3d 3d 27 73 27 20 26  .   || (c=='s' &
2e4e0 26 20 6e 3e 3d 33 20 26 26 20 73 74 72 6e 63 6d  & n>=3 && strncm
2e4f0 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 73 61 76  p(azArg[0], "sav
2e500 65 22 2c 20 6e 29 3d 3d 30 29 0a 20 20 29 7b 0a  e", n)==0).  ){.
2e510 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
2e520 7a 44 65 73 74 46 69 6c 65 20 3d 20 30 3b 0a 20  zDestFile = 0;. 
2e530 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
2e540 44 62 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69  Db = 0;.    sqli
2e550 74 65 33 20 2a 70 44 65 73 74 3b 0a 20 20 20 20  te3 *pDest;.    
2e560 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 20 2a  sqlite3_backup *
2e570 70 42 61 63 6b 75 70 3b 0a 20 20 20 20 69 6e 74  pBackup;.    int
2e580 20 6a 3b 0a 20 20 20 20 69 6e 74 20 62 41 73 79   j;.    int bAsy
2e590 6e 63 20 3d 20 30 3b 0a 20 20 20 20 63 6f 6e 73  nc = 0;.    cons
2e5a0 74 20 63 68 61 72 20 2a 7a 56 66 73 20 3d 20 30  t char *zVfs = 0
2e5b0 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 31 3b 20 6a  ;.    for(j=1; j
2e5c0 3c 6e 41 72 67 3b 20 6a 2b 2b 29 7b 0a 20 20 20  <nArg; j++){.   
2e5d0 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
2e5e0 20 3d 20 61 7a 41 72 67 5b 6a 5d 3b 0a 20 20 20   = azArg[j];.   
2e5f0 20 20 20 69 66 28 20 7a 5b 30 5d 3d 3d 27 2d 27     if( z[0]=='-'
2e600 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
2e610 7a 5b 31 5d 3d 3d 27 2d 27 20 29 20 7a 2b 2b 3b  z[1]=='-' ) z++;
2e620 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 74 72  .        if( str
2e630 63 6d 70 28 7a 2c 20 22 2d 61 70 70 65 6e 64 22  cmp(z, "-append"
2e640 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
2e650 20 20 7a 56 66 73 20 3d 20 22 61 70 6e 64 76 66    zVfs = "apndvf
2e660 73 22 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  s";.        }els
2e670 65 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 74  e.        if( st
2e680 72 63 6d 70 28 7a 2c 20 22 2d 61 73 79 6e 63 22  rcmp(z, "-async"
2e690 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
2e6a0 20 20 62 41 73 79 6e 63 20 3d 20 31 3b 0a 20 20    bAsync = 1;.  
2e6b0 20 20 20 20 20 20 7d 65 6c 73 65 0a 20 20 20 20        }else.    
2e6c0 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20      {.          
2e6d0 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65  utf8_printf(stde
2e6e0 72 72 2c 20 22 75 6e 6b 6e 6f 77 6e 20 6f 70 74  rr, "unknown opt
2e6f0 69 6f 6e 3a 20 25 73 5c 6e 22 2c 20 61 7a 41 72  ion: %s\n", azAr
2e700 67 5b 6a 5d 29 3b 0a 20 20 20 20 20 20 20 20 20  g[j]);.         
2e710 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
2e720 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
2e730 20 69 66 28 20 7a 44 65 73 74 46 69 6c 65 3d 3d   if( zDestFile==
2e740 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 44 65  0 ){.        zDe
2e750 73 74 46 69 6c 65 20 3d 20 61 7a 41 72 67 5b 6a  stFile = azArg[j
2e760 5d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  ];.      }else i
2e770 66 28 20 7a 44 62 3d 3d 30 20 29 7b 0a 20 20 20  f( zDb==0 ){.   
2e780 20 20 20 20 20 7a 44 62 20 3d 20 7a 44 65 73 74       zDb = zDest
2e790 46 69 6c 65 3b 0a 20 20 20 20 20 20 20 20 7a 44  File;.        zD
2e7a0 65 73 74 46 69 6c 65 20 3d 20 61 7a 41 72 67 5b  estFile = azArg[
2e7b0 6a 5d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  j];.      }else{
2e7c0 0a 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69  .        raw_pri
2e7d0 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55 73 61  ntf(stderr, "Usa
2e7e0 67 65 3a 20 2e 62 61 63 6b 75 70 20 3f 44 42 3f  ge: .backup ?DB?
2e7f0 20 3f 4f 50 54 49 4f 4e 53 3f 20 46 49 4c 45 4e   ?OPTIONS? FILEN
2e800 41 4d 45 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20  AME\n");.       
2e810 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
2e820 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
2e830 20 7a 44 65 73 74 46 69 6c 65 3d 3d 30 20 29 7b   zDestFile==0 ){
2e840 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74  .      raw_print
2e850 66 28 73 74 64 65 72 72 2c 20 22 6d 69 73 73 69  f(stderr, "missi
2e860 6e 67 20 46 49 4c 45 4e 41 4d 45 20 61 72 67 75  ng FILENAME argu
2e870 6d 65 6e 74 20 6f 6e 20 2e 62 61 63 6b 75 70 5c  ment on .backup\
2e880 6e 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  n");.      retur
2e890 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  n 1;.    }.    i
2e8a0 66 28 20 7a 44 62 3d 3d 30 20 29 20 7a 44 62 20  f( zDb==0 ) zDb 
2e8b0 3d 20 22 6d 61 69 6e 22 3b 0a 20 20 20 20 72 63  = "main";.    rc
2e8c0 20 3d 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f   = sqlite3_open_
2e8d0 76 32 28 7a 44 65 73 74 46 69 6c 65 2c 20 26 70  v2(zDestFile, &p
2e8e0 44 65 73 74 2c 20 0a 20 20 20 20 20 20 20 20 20  Dest, .         
2e8f0 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
2e900 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53  OPEN_READWRITE|S
2e910 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54  QLITE_OPEN_CREAT
2e920 45 2c 20 7a 56 66 73 29 3b 0a 20 20 20 20 69 66  E, zVfs);.    if
2e930 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2e940 29 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72  ){.      utf8_pr
2e950 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72  intf(stderr, "Er
2e960 72 6f 72 3a 20 63 61 6e 6e 6f 74 20 6f 70 65 6e  ror: cannot open
2e970 20 5c 22 25 73 5c 22 5c 6e 22 2c 20 7a 44 65 73   \"%s\"\n", zDes
2e980 74 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 63 6c  tFile);.      cl
2e990 6f 73 65 5f 64 62 28 70 44 65 73 74 29 3b 0a 20  ose_db(pDest);. 
2e9a0 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
2e9b0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 62 41 73     }.    if( bAs
2e9c0 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ync ){.      sql
2e9d0 69 74 65 33 5f 65 78 65 63 28 70 44 65 73 74 2c  ite3_exec(pDest,
2e9e0 20 22 50 52 41 47 4d 41 20 73 79 6e 63 68 72 6f   "PRAGMA synchro
2e9f0 6e 6f 75 73 3d 4f 46 46 3b 20 50 52 41 47 4d 41  nous=OFF; PRAGMA
2ea00 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 4f 46   journal_mode=OF
2ea10 46 3b 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  F;",.           
2ea20 20 20 20 20 20 20 20 20 30 2c 20 30 2c 20 30 29          0, 0, 0)
2ea30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6f 70 65 6e  ;.    }.    open
2ea40 5f 64 62 28 70 2c 20 30 29 3b 0a 20 20 20 20 70  _db(p, 0);.    p
2ea50 42 61 63 6b 75 70 20 3d 20 73 71 6c 69 74 65 33  Backup = sqlite3
2ea60 5f 62 61 63 6b 75 70 5f 69 6e 69 74 28 70 44 65  _backup_init(pDe
2ea70 73 74 2c 20 22 6d 61 69 6e 22 2c 20 70 2d 3e 64  st, "main", p->d
2ea80 62 2c 20 7a 44 62 29 3b 0a 20 20 20 20 69 66 28  b, zDb);.    if(
2ea90 20 70 42 61 63 6b 75 70 3d 3d 30 20 29 7b 0a 20   pBackup==0 ){. 
2eaa0 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
2eab0 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a  (stderr, "Error:
2eac0 20 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f   %s\n", sqlite3_
2ead0 65 72 72 6d 73 67 28 70 44 65 73 74 29 29 3b 0a  errmsg(pDest));.
2eae0 20 20 20 20 20 20 63 6c 6f 73 65 5f 64 62 28 70        close_db(p
2eaf0 44 65 73 74 29 3b 0a 20 20 20 20 20 20 72 65 74  Dest);.      ret
2eb00 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 1;.    }.   
2eb10 20 77 68 69 6c 65 28 20 20 28 72 63 20 3d 20 73   while(  (rc = s
2eb20 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 5f 73 74  qlite3_backup_st
2eb30 65 70 28 70 42 61 63 6b 75 70 2c 31 30 30 29 29  ep(pBackup,100))
2eb40 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 7d 0a  ==SQLITE_OK ){}.
2eb50 20 20 20 20 73 71 6c 69 74 65 33 5f 62 61 63 6b      sqlite3_back
2eb60 75 70 5f 66 69 6e 69 73 68 28 70 42 61 63 6b 75  up_finish(pBacku
2eb70 70 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  p);.    if( rc==
2eb80 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20  SQLITE_DONE ){. 
2eb90 20 20 20 20 20 72 63 20 3d 20 30 3b 0a 20 20 20       rc = 0;.   
2eba0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 75 74   }else{.      ut
2ebb0 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  f8_printf(stderr
2ebc0 2c 20 22 45 72 72 6f 72 3a 20 25 73 5c 6e 22 2c  , "Error: %s\n",
2ebd0 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
2ebe0 70 44 65 73 74 29 29 3b 0a 20 20 20 20 20 20 72  pDest));.      r
2ebf0 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  c = 1;.    }.   
2ec00 20 63 6c 6f 73 65 5f 64 62 28 70 44 65 73 74 29   close_db(pDest)
2ec10 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28  ;.  }else..  if(
2ec20 20 63 3d 3d 27 62 27 20 26 26 20 6e 3e 3d 33 20   c=='b' && n>=3 
2ec30 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67  && strncmp(azArg
2ec40 5b 30 5d 2c 20 22 62 61 69 6c 22 2c 20 6e 29 3d  [0], "bail", n)=
2ec50 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 41  =0 ){.    if( nA
2ec60 72 67 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 62  rg==2 ){.      b
2ec70 61 69 6c 5f 6f 6e 5f 65 72 72 6f 72 20 3d 20 62  ail_on_error = b
2ec80 6f 6f 6c 65 61 6e 56 61 6c 75 65 28 61 7a 41 72  ooleanValue(azAr
2ec90 67 5b 31 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65  g[1]);.    }else
2eca0 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e  {.      raw_prin
2ecb0 74 66 28 73 74 64 65 72 72 2c 20 22 55 73 61 67  tf(stderr, "Usag
2ecc0 65 3a 20 2e 62 61 69 6c 20 6f 6e 7c 6f 66 66 5c  e: .bail on|off\
2ecd0 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  n");.      rc = 
2ece0 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  1;.    }.  }else
2ecf0 0a 0a 20 20 69 66 28 20 63 3d 3d 27 62 27 20 26  ..  if( c=='b' &
2ed00 26 20 6e 3e 3d 33 20 26 26 20 73 74 72 6e 63 6d  & n>=3 && strncm
2ed10 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 62 69 6e  p(azArg[0], "bin
2ed20 61 72 79 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20  ary", n)==0 ){. 
2ed30 20 20 20 69 66 28 20 6e 41 72 67 3d 3d 32 20 29     if( nArg==2 )
2ed40 7b 0a 20 20 20 20 20 20 69 66 28 20 62 6f 6f 6c  {.      if( bool
2ed50 65 61 6e 56 61 6c 75 65 28 61 7a 41 72 67 5b 31  eanValue(azArg[1
2ed60 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 65  ]) ){.        se
2ed70 74 42 69 6e 61 72 79 4d 6f 64 65 28 70 2d 3e 6f  tBinaryMode(p->o
2ed80 75 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 65  ut, 1);.      }e
2ed90 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 65 74  lse{.        set
2eda0 54 65 78 74 4d 6f 64 65 28 70 2d 3e 6f 75 74 2c  TextMode(p->out,
2edb0 20 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   1);.      }.   
2edc0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 61   }else{.      ra
2edd0 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  w_printf(stderr,
2ede0 20 22 55 73 61 67 65 3a 20 2e 62 69 6e 61 72 79   "Usage: .binary
2edf0 20 6f 6e 7c 6f 66 66 5c 6e 22 29 3b 0a 20 20 20   on|off\n");.   
2ee00 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d     rc = 1;.    }
2ee10 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20  .  }else..  if( 
2ee20 63 3d 3d 27 63 27 20 26 26 20 73 74 72 63 6d 70  c=='c' && strcmp
2ee30 28 61 7a 41 72 67 5b 30 5d 2c 22 63 64 22 29 3d  (azArg[0],"cd")=
2ee40 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 41  =0 ){.    if( nA
2ee50 72 67 3d 3d 32 20 29 7b 0a 23 69 66 20 64 65 66  rg==2 ){.#if def
2ee60 69 6e 65 64 28 5f 57 49 4e 33 32 29 20 7c 7c 20  ined(_WIN32) || 
2ee70 64 65 66 69 6e 65 64 28 57 49 4e 33 32 29 0a 20  defined(WIN32). 
2ee80 20 20 20 20 20 77 63 68 61 72 5f 74 20 2a 7a 20       wchar_t *z 
2ee90 3d 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f  = sqlite3_win32_
2eea0 75 74 66 38 5f 74 6f 5f 75 6e 69 63 6f 64 65 28  utf8_to_unicode(
2eeb0 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20 20  azArg[1]);.     
2eec0 20 72 63 20 3d 20 21 53 65 74 43 75 72 72 65 6e   rc = !SetCurren
2eed0 74 44 69 72 65 63 74 6f 72 79 57 28 7a 29 3b 0a  tDirectoryW(z);.
2eee0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
2eef0 65 65 28 7a 29 3b 0a 23 65 6c 73 65 0a 20 20 20  ee(z);.#else.   
2ef00 20 20 20 72 63 20 3d 20 63 68 64 69 72 28 61 7a     rc = chdir(az
2ef10 41 72 67 5b 31 5d 29 3b 0a 23 65 6e 64 69 66 0a  Arg[1]);.#endif.
2ef20 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
2ef30 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69          utf8_pri
2ef40 6e 74 66 28 73 74 64 65 72 72 2c 20 22 43 61 6e  ntf(stderr, "Can
2ef50 6e 6f 74 20 63 68 61 6e 67 65 20 74 6f 20 64 69  not change to di
2ef60 72 65 63 74 6f 72 79 20 5c 22 25 73 5c 22 5c 6e  rectory \"%s\"\n
2ef70 22 2c 20 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20  ", azArg[1]);.  
2ef80 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
2ef90 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
2efa0 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74  .      raw_print
2efb0 66 28 73 74 64 65 72 72 2c 20 22 55 73 61 67 65  f(stderr, "Usage
2efc0 3a 20 2e 63 64 20 44 49 52 45 43 54 4f 52 59 5c  : .cd DIRECTORY\
2efd0 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  n");.      rc = 
2efe0 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  1;.    }.  }else
2eff0 0a 0a 20 20 2f 2a 20 54 68 65 20 75 6e 64 6f 63  ..  /* The undoc
2f000 75 6d 65 6e 74 65 64 20 22 2e 62 72 65 61 6b 70  umented ".breakp
2f010 6f 69 6e 74 22 20 63 6f 6d 6d 61 6e 64 20 63 61  oint" command ca
2f020 75 73 65 73 20 61 20 63 61 6c 6c 20 74 6f 20 74  uses a call to t
2f030 68 65 20 6e 6f 2d 6f 70 0a 20 20 2a 2a 20 72 6f  he no-op.  ** ro
2f040 75 74 69 6e 65 20 6e 61 6d 65 64 20 74 65 73 74  utine named test
2f050 5f 62 72 65 61 6b 70 6f 69 6e 74 28 29 2e 0a 20  _breakpoint().. 
2f060 20 2a 2f 0a 20 20 69 66 28 20 63 3d 3d 27 62 27   */.  if( c=='b'
2f070 20 26 26 20 6e 3e 3d 33 20 26 26 20 73 74 72 6e   && n>=3 && strn
2f080 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 62  cmp(azArg[0], "b
2f090 72 65 61 6b 70 6f 69 6e 74 22 2c 20 6e 29 3d 3d  reakpoint", n)==
2f0a0 30 20 29 7b 0a 20 20 20 20 74 65 73 74 5f 62 72  0 ){.    test_br
2f0b0 65 61 6b 70 6f 69 6e 74 28 29 3b 0a 20 20 7d 65  eakpoint();.  }e
2f0c0 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 63  lse..  if( c=='c
2f0d0 27 20 26 26 20 6e 3e 3d 33 20 26 26 20 73 74 72  ' && n>=3 && str
2f0e0 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22  ncmp(azArg[0], "
2f0f0 63 68 61 6e 67 65 73 22 2c 20 6e 29 3d 3d 30 20  changes", n)==0 
2f100 29 7b 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3d  ){.    if( nArg=
2f110 3d 32 20 29 7b 0a 20 20 20 20 20 20 73 65 74 4f  =2 ){.      setO
2f120 72 43 6c 65 61 72 46 6c 61 67 28 70 2c 20 53 48  rClearFlag(p, SH
2f130 46 4c 47 5f 43 6f 75 6e 74 43 68 61 6e 67 65 73  FLG_CountChanges
2f140 2c 20 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20  , azArg[1]);.   
2f150 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 61   }else{.      ra
2f160 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  w_printf(stderr,
2f170 20 22 55 73 61 67 65 3a 20 2e 63 68 61 6e 67 65   "Usage: .change
2f180 73 20 6f 6e 7c 6f 66 66 5c 6e 22 29 3b 0a 20 20  s on|off\n");.  
2f190 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
2f1a0 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 2f 2a 20  }.  }else..  /* 
2f1b0 43 61 6e 63 65 6c 20 6f 75 74 70 75 74 20 72 65  Cancel output re
2f1c0 64 69 72 65 63 74 69 6f 6e 2c 20 69 66 20 69 74  direction, if it
2f1d0 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 73 65   is currently se
2f1e0 74 20 28 62 79 20 2e 74 65 73 74 63 61 73 65 29  t (by .testcase)
2f1f0 0a 20 20 2a 2a 20 54 68 65 6e 20 72 65 61 64 20  .  ** Then read 
2f200 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74  the content of t
2f210 68 65 20 74 65 73 74 63 61 73 65 2d 6f 75 74 2e  he testcase-out.
2f220 74 78 74 20 66 69 6c 65 20 61 6e 64 20 63 6f 6d  txt file and com
2f230 70 61 72 65 20 61 67 61 69 6e 73 74 0a 20 20 2a  pare against.  *
2f240 2a 20 61 7a 41 72 67 5b 31 5d 2e 20 20 49 66 20  * azArg[1].  If 
2f250 74 68 65 72 65 20 61 72 65 20 64 69 66 66 65 72  there are differ
2f260 65 6e 63 65 73 2c 20 72 65 70 6f 72 74 20 61 6e  ences, report an
2f270 20 65 72 72 6f 72 20 61 6e 64 20 65 78 69 74 2e   error and exit.
2f280 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63 3d 3d 27  .  */.  if( c=='
2f290 63 27 20 26 26 20 6e 3e 3d 33 20 26 26 20 73 74  c' && n>=3 && st
2f2a0 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20  rncmp(azArg[0], 
2f2b0 22 63 68 65 63 6b 22 2c 20 6e 29 3d 3d 30 20 29  "check", n)==0 )
2f2c0 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 52 65 73  {.    char *zRes
2f2d0 20 3d 20 30 3b 0a 20 20 20 20 6f 75 74 70 75 74   = 0;.    output
2f2e0 5f 72 65 73 65 74 28 70 29 3b 0a 20 20 20 20 69  _reset(p);.    i
2f2f0 66 28 20 6e 41 72 67 21 3d 32 20 29 7b 0a 20 20  f( nArg!=2 ){.  
2f300 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73      raw_printf(s
2f310 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e  tderr, "Usage: .
2f320 63 68 65 63 6b 20 47 4c 4f 42 2d 50 41 54 54 45  check GLOB-PATTE
2f330 52 4e 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 63  RN\n");.      rc
2f340 20 3d 20 32 3b 0a 20 20 20 20 7d 65 6c 73 65 20   = 2;.    }else 
2f350 69 66 28 20 28 7a 52 65 73 20 3d 20 72 65 61 64  if( (zRes = read
2f360 46 69 6c 65 28 22 74 65 73 74 63 61 73 65 2d 6f  File("testcase-o
2f370 75 74 2e 74 78 74 22 2c 20 30 29 29 3d 3d 30 20  ut.txt", 0))==0 
2f380 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69  ){.      raw_pri
2f390 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72  ntf(stderr, "Err
2f3a0 6f 72 3a 20 63 61 6e 6e 6f 74 20 72 65 61 64 20  or: cannot read 
2f3b0 27 74 65 73 74 63 61 73 65 2d 6f 75 74 2e 74 78  'testcase-out.tx
2f3c0 74 27 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 63  t'\n");.      rc
2f3d0 20 3d 20 32 3b 0a 20 20 20 20 7d 65 6c 73 65 20   = 2;.    }else 
2f3e0 69 66 28 20 74 65 73 74 63 61 73 65 5f 67 6c 6f  if( testcase_glo
2f3f0 62 28 61 7a 41 72 67 5b 31 5d 2c 7a 52 65 73 29  b(azArg[1],zRes)
2f400 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 75 74 66  ==0 ){.      utf
2f410 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  8_printf(stderr,
2f420 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2f430 20 20 22 74 65 73 74 63 61 73 65 2d 25 73 20 46    "testcase-%s F
2f440 41 49 4c 45 44 5c 6e 20 45 78 70 65 63 74 65 64  AILED\n Expected
2f450 3a 20 5b 25 73 5d 5c 6e 20 20 20 20 20 20 47 6f  : [%s]\n      Go
2f460 74 3a 20 5b 25 73 5d 5c 6e 22 2c 0a 20 20 20 20  t: [%s]\n",.    
2f470 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e               p->
2f480 7a 54 65 73 74 63 61 73 65 2c 20 61 7a 41 72 67  zTestcase, azArg
2f490 5b 31 5d 2c 20 7a 52 65 73 29 3b 0a 20 20 20 20  [1], zRes);.    
2f4a0 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 65    rc = 1;.    }e
2f4b0 6c 73 65 7b 0a 20 20 20 20 20 20 75 74 66 38 5f  lse{.      utf8_
2f4c0 70 72 69 6e 74 66 28 73 74 64 6f 75 74 2c 20 22  printf(stdout, "
2f4d0 74 65 73 74 63 61 73 65 2d 25 73 20 6f 6b 5c 6e  testcase-%s ok\n
2f4e0 22 2c 20 70 2d 3e 7a 54 65 73 74 63 61 73 65 29  ", p->zTestcase)
2f4f0 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 43 68 65 63  ;.      p->nChec
2f500 6b 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  k++;.    }.    s
2f510 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 52 65 73  qlite3_free(zRes
2f520 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66  );.  }else..  if
2f530 28 20 63 3d 3d 27 63 27 20 26 26 20 73 74 72 6e  ( c=='c' && strn
2f540 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 63  cmp(azArg[0], "c
2f550 6c 6f 6e 65 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a  lone", n)==0 ){.
2f560 20 20 20 20 69 66 28 20 6e 41 72 67 3d 3d 32 20      if( nArg==2 
2f570 29 7b 0a 20 20 20 20 20 20 74 72 79 54 6f 43 6c  ){.      tryToCl
2f580 6f 6e 65 28 70 2c 20 61 7a 41 72 67 5b 31 5d 29  one(p, azArg[1])
2f590 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
2f5a0 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74     raw_printf(st
2f5b0 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 63  derr, "Usage: .c
2f5c0 6c 6f 6e 65 20 46 49 4c 45 4e 41 4d 45 5c 6e 22  lone FILENAME\n"
2f5d0 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b  );.      rc = 1;
2f5e0 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a  .    }.  }else..
2f5f0 20 20 69 66 28 20 63 3d 3d 27 64 27 20 26 26 20    if( c=='d' && 
2f600 6e 3e 31 20 26 26 20 73 74 72 6e 63 6d 70 28 61  n>1 && strncmp(a
2f610 7a 41 72 67 5b 30 5d 2c 20 22 64 61 74 61 62 61  zArg[0], "databa
2f620 73 65 73 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20  ses", n)==0 ){. 
2f630 20 20 20 53 68 65 6c 6c 53 74 61 74 65 20 64 61     ShellState da
2f640 74 61 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 45  ta;.    char *zE
2f650 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 20 20 6f  rrMsg = 0;.    o
2f660 70 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a 20 20  pen_db(p, 0);.  
2f670 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61 2c 20    memcpy(&data, 
2f680 70 2c 20 73 69 7a 65 6f 66 28 64 61 74 61 29 29  p, sizeof(data))
2f690 3b 0a 20 20 20 20 64 61 74 61 2e 73 68 6f 77 48  ;.    data.showH
2f6a0 65 61 64 65 72 20 3d 20 30 3b 0a 20 20 20 20 64  eader = 0;.    d
2f6b0 61 74 61 2e 63 4d 6f 64 65 20 3d 20 64 61 74 61  ata.cMode = data
2f6c0 2e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 4c 69 73  .mode = MODE_Lis
2f6d0 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  t;.    sqlite3_s
2f6e0 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 64  nprintf(sizeof(d
2f6f0 61 74 61 2e 63 6f 6c 53 65 70 61 72 61 74 6f 72  ata.colSeparator
2f700 29 2c 64 61 74 61 2e 63 6f 6c 53 65 70 61 72 61  ),data.colSepara
2f710 74 6f 72 2c 22 3a 20 22 29 3b 0a 20 20 20 20 64  tor,": ");.    d
2f720 61 74 61 2e 63 6e 74 20 3d 20 30 3b 0a 20 20 20  ata.cnt = 0;.   
2f730 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d   sqlite3_exec(p-
2f740 3e 64 62 2c 20 22 53 45 4c 45 43 54 20 6e 61 6d  >db, "SELECT nam
2f750 65 2c 20 66 69 6c 65 20 46 52 4f 4d 20 70 72 61  e, file FROM pra
2f760 67 6d 61 5f 64 61 74 61 62 61 73 65 5f 6c 69 73  gma_database_lis
2f770 74 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  t",.            
2f780 20 20 20 20 20 63 61 6c 6c 62 61 63 6b 2c 20 26       callback, &
2f790 64 61 74 61 2c 20 26 7a 45 72 72 4d 73 67 29 3b  data, &zErrMsg);
2f7a0 0a 20 20 20 20 69 66 28 20 7a 45 72 72 4d 73 67  .    if( zErrMsg
2f7b0 20 29 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70   ){.      utf8_p
2f7c0 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 45 72  rintf(stderr,"Er
2f7d0 72 6f 72 3a 20 25 73 5c 6e 22 2c 20 7a 45 72 72  ror: %s\n", zErr
2f7e0 4d 73 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Msg);.      sqli
2f7f0 74 65 33 5f 66 72 65 65 28 7a 45 72 72 4d 73 67  te3_free(zErrMsg
2f800 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b  );.      rc = 1;
2f810 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a  .    }.  }else..
2f820 20 20 69 66 28 20 63 3d 3d 27 64 27 20 26 26 20    if( c=='d' && 
2f830 6e 3e 3d 33 20 26 26 20 73 74 72 6e 63 6d 70 28  n>=3 && strncmp(
2f840 61 7a 41 72 67 5b 30 5d 2c 20 22 64 62 63 6f 6e  azArg[0], "dbcon
2f850 66 69 67 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20  fig", n)==0 ){. 
2f860 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
2f870 73 74 72 75 63 74 20 44 62 43 6f 6e 66 69 67 43  struct DbConfigC
2f880 68 6f 69 63 65 73 20 7b 0a 20 20 20 20 20 20 63  hoices {.      c
2f890 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
2f8a0 3b 0a 20 20 20 20 20 20 69 6e 74 20 6f 70 3b 0a  ;.      int op;.
2f8b0 20 20 20 20 7d 20 61 44 62 43 6f 6e 66 69 67 5b      } aDbConfig[
2f8c0 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 20 7b 20  ] = {.        { 
2f8d0 22 65 6e 61 62 6c 65 5f 66 6b 65 79 22 2c 20 20  "enable_fkey",  
2f8e0 20 20 20 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e      SQLITE_DBCON
2f8f0 46 49 47 5f 45 4e 41 42 4c 45 5f 46 4b 45 59 20  FIG_ENABLE_FKEY 
2f900 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
2f910 20 20 20 20 20 20 7b 20 22 65 6e 61 62 6c 65 5f        { "enable_
2f920 74 72 69 67 67 65 72 22 2c 20 20 20 53 51 4c 49  trigger",   SQLI
2f930 54 45 5f 44 42 43 4f 4e 46 49 47 5f 45 4e 41 42  TE_DBCONFIG_ENAB
2f940 4c 45 5f 54 52 49 47 47 45 52 20 20 20 20 20 20  LE_TRIGGER      
2f950 20 20 20 7d 2c 0a 20 20 20 20 20 20 20 20 7b 20     },.        { 
2f960 22 66 74 73 33 5f 74 6f 6b 65 6e 69 7a 65 72 22  "fts3_tokenizer"
2f970 2c 20 20 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e  ,   SQLITE_DBCON
2f980 46 49 47 5f 45 4e 41 42 4c 45 5f 46 54 53 33 5f  FIG_ENABLE_FTS3_
2f990 54 4f 4b 45 4e 49 5a 45 52 20 20 7d 2c 0a 20 20  TOKENIZER  },.  
2f9a0 20 20 20 20 20 20 7b 20 22 6c 6f 61 64 5f 65 78        { "load_ex
2f9b0 74 65 6e 73 69 6f 6e 22 2c 20 20 20 53 51 4c 49  tension",   SQLI
2f9c0 54 45 5f 44 42 43 4f 4e 46 49 47 5f 45 4e 41 42  TE_DBCONFIG_ENAB
2f9d0 4c 45 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f  LE_LOAD_EXTENSIO
2f9e0 4e 20 20 7d 2c 0a 20 20 20 20 20 20 20 20 7b 20  N  },.        { 
2f9f0 22 6e 6f 5f 63 6b 70 74 5f 6f 6e 5f 63 6c 6f 73  "no_ckpt_on_clos
2fa00 65 22 2c 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e  e", SQLITE_DBCON
2fa10 46 49 47 5f 4e 4f 5f 43 4b 50 54 5f 4f 4e 5f 43  FIG_NO_CKPT_ON_C
2fa20 4c 4f 53 45 20 20 20 20 20 20 20 7d 2c 0a 20 20  LOSE       },.  
2fa30 20 20 20 20 20 20 7b 20 22 65 6e 61 62 6c 65 5f        { "enable_
2fa40 71 70 73 67 22 2c 20 20 20 20 20 20 53 51 4c 49  qpsg",      SQLI
2fa50 54 45 5f 44 42 43 4f 4e 46 49 47 5f 45 4e 41 42  TE_DBCONFIG_ENAB
2fa60 4c 45 5f 51 50 53 47 20 20 20 20 20 20 20 20 20  LE_QPSG         
2fa70 20 20 20 7d 2c 0a 20 20 20 20 20 20 20 20 7b 20     },.        { 
2fa80 22 74 72 69 67 67 65 72 5f 65 71 70 22 2c 20 20  "trigger_eqp",  
2fa90 20 20 20 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e      SQLITE_DBCON
2faa0 46 49 47 5f 54 52 49 47 47 45 52 5f 45 51 50 20  FIG_TRIGGER_EQP 
2fab0 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
2fac0 20 20 20 20 20 20 7b 20 22 72 65 73 65 74 5f 64        { "reset_d
2fad0 61 74 61 62 61 73 65 22 2c 20 20 20 53 51 4c 49  atabase",   SQLI
2fae0 54 45 5f 44 42 43 4f 4e 46 49 47 5f 52 45 53 45  TE_DBCONFIG_RESE
2faf0 54 5f 44 41 54 41 42 41 53 45 20 20 20 20 20 20  T_DATABASE      
2fb00 20 20 20 7d 2c 0a 20 20 20 20 20 20 20 20 7b 20     },.        { 
2fb10 22 64 65 66 65 6e 73 69 76 65 22 2c 20 20 20 20  "defensive",    
2fb20 20 20 20 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e      SQLITE_DBCON
2fb30 46 49 47 5f 44 45 46 45 4e 53 49 56 45 20 20 20  FIG_DEFENSIVE   
2fb40 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
2fb50 20 20 7d 3b 0a 20 20 20 20 69 6e 74 20 69 69 2c    };.    int ii,
2fb60 20 76 3b 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28   v;.    open_db(
2fb70 70 2c 20 30 29 3b 0a 20 20 20 20 66 6f 72 28 69  p, 0);.    for(i
2fb80 69 3d 30 3b 20 69 69 3c 41 72 72 61 79 53 69 7a  i=0; ii<ArraySiz
2fb90 65 28 61 44 62 43 6f 6e 66 69 67 29 3b 20 69 69  e(aDbConfig); ii
2fba0 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e  ++){.      if( n
2fbb0 41 72 67 3e 31 20 26 26 20 73 74 72 63 6d 70 28  Arg>1 && strcmp(
2fbc0 61 7a 41 72 67 5b 31 5d 2c 20 61 44 62 43 6f 6e  azArg[1], aDbCon
2fbd0 66 69 67 5b 69 69 5d 2e 7a 4e 61 6d 65 29 21 3d  fig[ii].zName)!=
2fbe0 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
2fbf0 20 20 20 20 69 66 28 20 6e 41 72 67 3e 3d 33 20      if( nArg>=3 
2fc00 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
2fc10 65 33 5f 64 62 5f 63 6f 6e 66 69 67 28 70 2d 3e  e3_db_config(p->
2fc20 64 62 2c 20 61 44 62 43 6f 6e 66 69 67 5b 69 69  db, aDbConfig[ii
2fc30 5d 2e 6f 70 2c 20 62 6f 6f 6c 65 61 6e 56 61 6c  ].op, booleanVal
2fc40 75 65 28 61 7a 41 72 67 5b 32 5d 29 2c 20 30 29  ue(azArg[2]), 0)
2fc50 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2fc60 73 71 6c 69 74 65 33 5f 64 62 5f 63 6f 6e 66 69  sqlite3_db_confi
2fc70 67 28 70 2d 3e 64 62 2c 20 61 44 62 43 6f 6e 66  g(p->db, aDbConf
2fc80 69 67 5b 69 69 5d 2e 6f 70 2c 20 2d 31 2c 20 26  ig[ii].op, -1, &
2fc90 76 29 3b 0a 20 20 20 20 20 20 75 74 66 38 5f 70  v);.      utf8_p
2fca0 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25  rintf(p->out, "%
2fcb0 31 38 73 20 25 73 5c 6e 22 2c 20 61 44 62 43 6f  18s %s\n", aDbCo
2fcc0 6e 66 69 67 5b 69 69 5d 2e 7a 4e 61 6d 65 2c 20  nfig[ii].zName, 
2fcd0 76 20 3f 20 22 6f 6e 22 20 3a 20 22 6f 66 66 22  v ? "on" : "off"
2fce0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 41 72  );.      if( nAr
2fcf0 67 3e 31 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  g>1 ) break;.   
2fd00 20 7d 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3e   }.    if( nArg>
2fd10 31 20 26 26 20 69 69 3d 3d 41 72 72 61 79 53 69  1 && ii==ArraySi
2fd20 7a 65 28 61 44 62 43 6f 6e 66 69 67 29 20 29 7b  ze(aDbConfig) ){
2fd30 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e  .      utf8_prin
2fd40 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f  tf(stderr, "Erro
2fd50 72 3a 20 75 6e 6b 6e 6f 77 6e 20 64 62 63 6f 6e  r: unknown dbcon
2fd60 66 69 67 20 5c 22 25 73 5c 22 5c 6e 22 2c 20 61  fig \"%s\"\n", a
2fd70 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20 20 20  zArg[1]);.      
2fd80 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65  utf8_printf(stde
2fd90 72 72 2c 20 22 45 6e 74 65 72 20 5c 22 2e 64 62  rr, "Enter \".db
2fda0 63 6f 6e 66 69 67 5c 22 20 77 69 74 68 20 6e 6f  config\" with no
2fdb0 20 61 72 67 75 6d 65 6e 74 73 20 66 6f 72 20 61   arguments for a
2fdc0 20 6c 69 73 74 5c 6e 22 29 3b 0a 20 20 20 20 7d   list\n");.    }
2fdd0 20 20 20 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69     .  }else..  i
2fde0 66 28 20 63 3d 3d 27 64 27 20 26 26 20 6e 3e 3d  f( c=='d' && n>=
2fdf0 33 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41  3 && strncmp(azA
2fe00 72 67 5b 30 5d 2c 20 22 64 62 69 6e 66 6f 22 2c  rg[0], "dbinfo",
2fe10 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63   n)==0 ){.    rc
2fe20 20 3d 20 73 68 65 6c 6c 5f 64 62 69 6e 66 6f 5f   = shell_dbinfo_
2fe30 63 6f 6d 6d 61 6e 64 28 70 2c 20 6e 41 72 67 2c  command(p, nArg,
2fe40 20 61 7a 41 72 67 29 3b 0a 20 20 7d 65 6c 73 65   azArg);.  }else
2fe50 0a 0a 20 20 69 66 28 20 63 3d 3d 27 64 27 20 26  ..  if( c=='d' &
2fe60 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b  & strncmp(azArg[
2fe70 30 5d 2c 20 22 64 75 6d 70 22 2c 20 6e 29 3d 3d  0], "dump", n)==
2fe80 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  0 ){.    const c
2fe90 68 61 72 20 2a 7a 4c 69 6b 65 20 3d 20 30 3b 0a  har *zLike = 0;.
2fea0 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69      int i;.    i
2feb0 6e 74 20 73 61 76 65 64 53 68 6f 77 48 65 61 64  nt savedShowHead
2fec0 65 72 20 3d 20 70 2d 3e 73 68 6f 77 48 65 61 64  er = p->showHead
2fed0 65 72 3b 0a 20 20 20 20 69 6e 74 20 73 61 76 65  er;.    int save
2fee0 64 53 68 65 6c 6c 46 6c 61 67 73 20 3d 20 70 2d  dShellFlags = p-
2fef0 3e 73 68 65 6c 6c 46 6c 67 73 3b 0a 20 20 20 20  >shellFlgs;.    
2ff00 53 68 65 6c 6c 43 6c 65 61 72 46 6c 61 67 28 70  ShellClearFlag(p
2ff10 2c 20 53 48 46 4c 47 5f 50 72 65 73 65 72 76 65  , SHFLG_Preserve
2ff20 52 6f 77 69 64 7c 53 48 46 4c 47 5f 4e 65 77 6c  Rowid|SHFLG_Newl
2ff30 69 6e 65 73 7c 53 48 46 4c 47 5f 45 63 68 6f 29  ines|SHFLG_Echo)
2ff40 3b 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69  ;.    for(i=1; i
2ff50 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nArg; i++){.   
2ff60 20 20 20 69 66 28 20 61 7a 41 72 67 5b 69 5d 5b     if( azArg[i][
2ff70 30 5d 3d 3d 27 2d 27 20 29 7b 0a 20 20 20 20 20  0]=='-' ){.     
2ff80 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
2ff90 20 3d 20 61 7a 41 72 67 5b 69 5d 2b 31 3b 0a 20   = azArg[i]+1;. 
2ffa0 20 20 20 20 20 20 20 69 66 28 20 7a 5b 30 5d 3d         if( z[0]=
2ffb0 3d 27 2d 27 20 29 20 7a 2b 2b 3b 0a 20 20 20 20  ='-' ) z++;.    
2ffc0 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a      if( strcmp(z
2ffd0 2c 22 70 72 65 73 65 72 76 65 2d 72 6f 77 69 64  ,"preserve-rowid
2ffe0 73 22 29 3d 3d 30 20 29 7b 0a 23 69 66 64 65 66  s")==0 ){.#ifdef
2fff0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
30000 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 20 20  TUALTABLE.      
30010 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73      raw_printf(s
30020 74 64 65 72 72 2c 20 22 54 68 65 20 2d 2d 70 72  tderr, "The --pr
30030 65 73 65 72 76 65 2d 72 6f 77 69 64 73 20 6f 70  eserve-rowids op
30040 74 69 6f 6e 20 69 73 20 6e 6f 74 20 63 6f 6d 70  tion is not comp
30050 61 74 69 62 6c 65 22 0a 20 20 20 20 20 20 20 20  atible".        
30060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30070 20 20 20 20 20 22 20 77 69 74 68 20 53 51 4c 49       " with SQLI
30080 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
30090 41 42 4c 45 5c 6e 22 29 3b 0a 20 20 20 20 20 20  ABLE\n");.      
300a0 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
300b0 20 20 20 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f        goto meta_
300c0 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 23 65  command_exit;.#e
300d0 6c 73 65 0a 20 20 20 20 20 20 20 20 20 20 53 68  lse.          Sh
300e0 65 6c 6c 53 65 74 46 6c 61 67 28 70 2c 20 53 48  ellSetFlag(p, SH
300f0 46 4c 47 5f 50 72 65 73 65 72 76 65 52 6f 77 69  FLG_PreserveRowi
30100 64 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  d);.#endif.     
30110 20 20 20 7d 65 6c 73 65 0a 20 20 20 20 20 20 20     }else.       
30120 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 22 6e   if( strcmp(z,"n
30130 65 77 6c 69 6e 65 73 22 29 3d 3d 30 20 29 7b 0a  ewlines")==0 ){.
30140 20 20 20 20 20 20 20 20 20 20 53 68 65 6c 6c 53            ShellS
30150 65 74 46 6c 61 67 28 70 2c 20 53 48 46 4c 47 5f  etFlag(p, SHFLG_
30160 4e 65 77 6c 69 6e 65 73 29 3b 0a 20 20 20 20 20  Newlines);.     
30170 20 20 20 7d 65 6c 73 65 0a 20 20 20 20 20 20 20     }else.       
30180 20 7b 0a 20 20 20 20 20 20 20 20 20 20 72 61 77   {.          raw
30190 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
301a0 22 55 6e 6b 6e 6f 77 6e 20 6f 70 74 69 6f 6e 20  "Unknown option 
301b0 5c 22 25 73 5c 22 20 6f 6e 20 5c 22 2e 64 75 6d  \"%s\" on \".dum
301c0 70 5c 22 5c 6e 22 2c 20 61 7a 41 72 67 5b 69 5d  p\"\n", azArg[i]
301d0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  );.          rc 
301e0 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 67  = 1;.          g
301f0 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64  oto meta_command
30200 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 20 20 7d  _exit;.        }
30210 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
30220 20 7a 4c 69 6b 65 20 29 7b 0a 20 20 20 20 20 20   zLike ){.      
30230 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64    raw_printf(std
30240 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 64 75  err, "Usage: .du
30250 6d 70 20 3f 2d 2d 70 72 65 73 65 72 76 65 2d 72  mp ?--preserve-r
30260 6f 77 69 64 73 3f 20 22 0a 20 20 20 20 20 20 20  owids? ".       
30270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30280 20 20 20 20 22 3f 2d 2d 6e 65 77 6c 69 6e 65 73      "?--newlines
30290 3f 20 3f 4c 49 4b 45 2d 50 41 54 54 45 52 4e 3f  ? ?LIKE-PATTERN?
302a0 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 72 63  \n");.        rc
302b0 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 67 6f   = 1;.        go
302c0 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f  to meta_command_
302d0 65 78 69 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73  exit;.      }els
302e0 65 7b 0a 20 20 20 20 20 20 20 20 7a 4c 69 6b 65  e{.        zLike
302f0 20 3d 20 61 7a 41 72 67 5b 69 5d 3b 0a 20 20 20   = azArg[i];.   
30300 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 6f     }.    }.    o
30310 70 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a 20 20  pen_db(p, 0);.  
30320 20 20 2f 2a 20 57 68 65 6e 20 70 6c 61 79 69 6e    /* When playin
30330 67 20 62 61 63 6b 20 61 20 22 64 75 6d 70 22 2c  g back a "dump",
30340 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6d 69 67   the content mig
30350 68 74 20 61 70 70 65 61 72 20 69 6e 20 61 6e 20  ht appear in an 
30360 6f 72 64 65 72 0a 20 20 20 20 2a 2a 20 77 68 69  order.    ** whi
30370 63 68 20 63 61 75 73 65 73 20 69 6d 6d 65 64 69  ch causes immedi
30380 61 74 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20  ate foreign key 
30390 63 6f 6e 73 74 72 61 69 6e 74 73 20 74 6f 20 62  constraints to b
303a0 65 20 76 69 6f 6c 61 74 65 64 2e 0a 20 20 20 20  e violated..    
303b0 2a 2a 20 53 6f 20 64 69 73 61 62 6c 65 20 66 6f  ** So disable fo
303c0 72 65 69 67 6e 2d 6b 65 79 20 63 6f 6e 73 74 72  reign-key constr
303d0 61 69 6e 74 20 65 6e 66 6f 72 63 65 6d 65 6e 74  aint enforcement
303e0 20 74 6f 20 70 72 65 76 65 6e 74 20 70 72 6f 62   to prevent prob
303f0 6c 65 6d 73 2e 20 2a 2f 0a 20 20 20 20 72 61 77  lems. */.    raw
30400 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
30410 22 50 52 41 47 4d 41 20 66 6f 72 65 69 67 6e 5f  "PRAGMA foreign_
30420 6b 65 79 73 3d 4f 46 46 3b 5c 6e 22 29 3b 0a 20  keys=OFF;\n");. 
30430 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d     raw_printf(p-
30440 3e 6f 75 74 2c 20 22 42 45 47 49 4e 20 54 52 41  >out, "BEGIN TRA
30450 4e 53 41 43 54 49 4f 4e 3b 5c 6e 22 29 3b 0a 20  NSACTION;\n");. 
30460 20 20 20 70 2d 3e 77 72 69 74 61 62 6c 65 53 63     p->writableSc
30470 68 65 6d 61 20 3d 20 30 3b 0a 20 20 20 20 70 2d  hema = 0;.    p-
30480 3e 73 68 6f 77 48 65 61 64 65 72 20 3d 20 30 3b  >showHeader = 0;
30490 0a 20 20 20 20 2f 2a 20 53 65 74 20 77 72 69 74  .    /* Set writ
304a0 61 62 6c 65 5f 73 63 68 65 6d 61 3d 4f 4e 20 73  able_schema=ON s
304b0 69 6e 63 65 20 64 6f 69 6e 67 20 73 6f 20 66 6f  ince doing so fo
304c0 72 63 65 73 20 53 51 4c 69 74 65 20 74 6f 20 69  rces SQLite to i
304d0 6e 69 74 69 61 6c 69 7a 65 0a 20 20 20 20 2a 2a  nitialize.    **
304e0 20 61 73 20 6d 75 63 68 20 6f 66 20 74 68 65 20   as much of the 
304f0 73 63 68 65 6d 61 20 61 73 20 69 74 20 63 61 6e  schema as it can
30500 20 65 76 65 6e 20 69 66 20 74 68 65 20 73 71 6c   even if the sql
30510 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65  ite_master table
30520 20 69 73 0a 20 20 20 20 2a 2a 20 63 6f 72 72 75   is.    ** corru
30530 70 74 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  pt. */.    sqlit
30540 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20 22  e3_exec(p->db, "
30550 53 41 56 45 50 4f 49 4e 54 20 64 75 6d 70 3b 20  SAVEPOINT dump; 
30560 50 52 41 47 4d 41 20 77 72 69 74 61 62 6c 65 5f  PRAGMA writable_
30570 73 63 68 65 6d 61 3d 4f 4e 22 2c 20 30 2c 20 30  schema=ON", 0, 0
30580 2c 20 30 29 3b 0a 20 20 20 20 70 2d 3e 6e 45 72  , 0);.    p->nEr
30590 72 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 7a  r = 0;.    if( z
305a0 4c 69 6b 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Like==0 ){.     
305b0 20 72 75 6e 5f 73 63 68 65 6d 61 5f 64 75 6d 70   run_schema_dump
305c0 5f 71 75 65 72 79 28 70 2c 0a 20 20 20 20 20 20  _query(p,.      
305d0 20 20 22 53 45 4c 45 43 54 20 6e 61 6d 65 2c 20    "SELECT name, 
305e0 74 79 70 65 2c 20 73 71 6c 20 46 52 4f 4d 20 73  type, sql FROM s
305f0 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 22 0a 20  qlite_master ". 
30600 20 20 20 20 20 20 20 22 57 48 45 52 45 20 73 71         "WHERE sq
30610 6c 20 4e 4f 54 20 4e 55 4c 4c 20 41 4e 44 20 74  l NOT NULL AND t
30620 79 70 65 3d 3d 27 74 61 62 6c 65 27 20 41 4e 44  ype=='table' AND
30630 20 6e 61 6d 65 21 3d 27 73 71 6c 69 74 65 5f 73   name!='sqlite_s
30640 65 71 75 65 6e 63 65 27 22 0a 20 20 20 20 20 20  equence'".      
30650 29 3b 0a 20 20 20 20 20 20 72 75 6e 5f 73 63 68  );.      run_sch
30660 65 6d 61 5f 64 75 6d 70 5f 71 75 65 72 79 28 70  ema_dump_query(p
30670 2c 0a 20 20 20 20 20 20 20 20 22 53 45 4c 45 43  ,.        "SELEC
30680 54 20 6e 61 6d 65 2c 20 74 79 70 65 2c 20 73 71  T name, type, sq
30690 6c 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61  l FROM sqlite_ma
306a0 73 74 65 72 20 22 0a 20 20 20 20 20 20 20 20 22  ster ".        "
306b0 57 48 45 52 45 20 6e 61 6d 65 3d 3d 27 73 71 6c  WHERE name=='sql
306c0 69 74 65 5f 73 65 71 75 65 6e 63 65 27 22 0a 20  ite_sequence'". 
306d0 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 72 75       );.      ru
306e0 6e 5f 74 61 62 6c 65 5f 64 75 6d 70 5f 71 75 65  n_table_dump_que
306f0 72 79 28 70 2c 0a 20 20 20 20 20 20 20 20 22 53  ry(p,.        "S
30700 45 4c 45 43 54 20 73 71 6c 20 46 52 4f 4d 20 73  ELECT sql FROM s
30710 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 22 0a 20  qlite_master ". 
30720 20 20 20 20 20 20 20 22 57 48 45 52 45 20 73 71         "WHERE sq
30730 6c 20 4e 4f 54 20 4e 55 4c 4c 20 41 4e 44 20 74  l NOT NULL AND t
30740 79 70 65 20 49 4e 20 28 27 69 6e 64 65 78 27 2c  ype IN ('index',
30750 27 74 72 69 67 67 65 72 27 2c 27 76 69 65 77 27  'trigger','view'
30760 29 22 2c 20 30 0a 20 20 20 20 20 20 29 3b 0a 20  )", 0.      );. 
30770 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
30780 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 20 20  char *zSql;.    
30790 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33    zSql = sqlite3
307a0 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20  _mprintf(.      
307b0 20 20 22 53 45 4c 45 43 54 20 6e 61 6d 65 2c 20    "SELECT name, 
307c0 74 79 70 65 2c 20 73 71 6c 20 46 52 4f 4d 20 73  type, sql FROM s
307d0 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 22 0a 20  qlite_master ". 
307e0 20 20 20 20 20 20 20 22 57 48 45 52 45 20 74 62         "WHERE tb
307f0 6c 5f 6e 61 6d 65 20 4c 49 4b 45 20 25 51 20 41  l_name LIKE %Q A
30800 4e 44 20 74 79 70 65 3d 3d 27 74 61 62 6c 65 27  ND type=='table'
30810 22 0a 20 20 20 20 20 20 20 20 22 20 20 41 4e 44  ".        "  AND
30820 20 73 71 6c 20 4e 4f 54 20 4e 55 4c 4c 22 2c 20   sql NOT NULL", 
30830 7a 4c 69 6b 65 29 3b 0a 20 20 20 20 20 20 72 75  zLike);.      ru
30840 6e 5f 73 63 68 65 6d 61 5f 64 75 6d 70 5f 71 75  n_schema_dump_qu
30850 65 72 79 28 70 2c 7a 53 71 6c 29 3b 0a 20 20 20  ery(p,zSql);.   
30860 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
30870 7a 53 71 6c 29 3b 0a 20 20 20 20 20 20 7a 53 71  zSql);.      zSq
30880 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  l = sqlite3_mpri
30890 6e 74 66 28 0a 20 20 20 20 20 20 20 20 22 53 45  ntf(.        "SE
308a0 4c 45 43 54 20 73 71 6c 20 46 52 4f 4d 20 73 71  LECT sql FROM sq
308b0 6c 69 74 65 5f 6d 61 73 74 65 72 20 22 0a 20 20  lite_master ".  
308c0 20 20 20 20 20 20 22 57 48 45 52 45 20 73 71 6c        "WHERE sql
308d0 20 4e 4f 54 20 4e 55 4c 4c 22 0a 20 20 20 20 20   NOT NULL".     
308e0 20 20 20 22 20 20 41 4e 44 20 74 79 70 65 20 49     "  AND type I
308f0 4e 20 28 27 69 6e 64 65 78 27 2c 27 74 72 69 67  N ('index','trig
30900 67 65 72 27 2c 27 76 69 65 77 27 29 22 0a 20 20  ger','view')".  
30910 20 20 20 20 20 20 22 20 20 41 4e 44 20 74 62 6c        "  AND tbl
30920 5f 6e 61 6d 65 20 4c 49 4b 45 20 25 51 22 2c 20  _name LIKE %Q", 
30930 7a 4c 69 6b 65 29 3b 0a 20 20 20 20 20 20 72 75  zLike);.      ru
30940 6e 5f 74 61 62 6c 65 5f 64 75 6d 70 5f 71 75 65  n_table_dump_que
30950 72 79 28 70 2c 20 7a 53 71 6c 2c 20 30 29 3b 0a  ry(p, zSql, 0);.
30960 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
30970 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20 7d 0a  ee(zSql);.    }.
30980 20 20 20 20 69 66 28 20 70 2d 3e 77 72 69 74 61      if( p->writa
30990 62 6c 65 53 63 68 65 6d 61 20 29 7b 0a 20 20 20  bleSchema ){.   
309a0 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d     raw_printf(p-
309b0 3e 6f 75 74 2c 20 22 50 52 41 47 4d 41 20 77 72  >out, "PRAGMA wr
309c0 69 74 61 62 6c 65 5f 73 63 68 65 6d 61 3d 4f 46  itable_schema=OF
309d0 46 3b 5c 6e 22 29 3b 0a 20 20 20 20 20 20 70 2d  F;\n");.      p-
309e0 3e 77 72 69 74 61 62 6c 65 53 63 68 65 6d 61 20  >writableSchema 
309f0 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  = 0;.    }.    s
30a00 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64  qlite3_exec(p->d
30a10 62 2c 20 22 50 52 41 47 4d 41 20 77 72 69 74 61  b, "PRAGMA writa
30a20 62 6c 65 5f 73 63 68 65 6d 61 3d 4f 46 46 3b 22  ble_schema=OFF;"
30a30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
30a40 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e  sqlite3_exec(p->
30a50 64 62 2c 20 22 52 45 4c 45 41 53 45 20 64 75 6d  db, "RELEASE dum
30a60 70 3b 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  p;", 0, 0, 0);. 
30a70 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d     raw_printf(p-
30a80 3e 6f 75 74 2c 20 70 2d 3e 6e 45 72 72 20 3f 20  >out, p->nErr ? 
30a90 22 52 4f 4c 4c 42 41 43 4b 3b 20 2d 2d 20 64 75  "ROLLBACK; -- du
30aa0 65 20 74 6f 20 65 72 72 6f 72 73 5c 6e 22 20 3a  e to errors\n" :
30ab0 20 22 43 4f 4d 4d 49 54 3b 5c 6e 22 29 3b 0a 20   "COMMIT;\n");. 
30ac0 20 20 20 70 2d 3e 73 68 6f 77 48 65 61 64 65 72     p->showHeader
30ad0 20 3d 20 73 61 76 65 64 53 68 6f 77 48 65 61 64   = savedShowHead
30ae0 65 72 3b 0a 20 20 20 20 70 2d 3e 73 68 65 6c 6c  er;.    p->shell
30af0 46 6c 67 73 20 3d 20 73 61 76 65 64 53 68 65 6c  Flgs = savedShel
30b00 6c 46 6c 61 67 73 3b 0a 20 20 7d 65 6c 73 65 0a  lFlags;.  }else.
30b10 0a 20 20 69 66 28 20 63 3d 3d 27 65 27 20 26 26  .  if( c=='e' &&
30b20 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30   strncmp(azArg[0
30b30 5d 2c 20 22 65 63 68 6f 22 2c 20 6e 29 3d 3d 30  ], "echo", n)==0
30b40 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 41 72 67   ){.    if( nArg
30b50 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 73 65 74  ==2 ){.      set
30b60 4f 72 43 6c 65 61 72 46 6c 61 67 28 70 2c 20 53  OrClearFlag(p, S
30b70 48 46 4c 47 5f 45 63 68 6f 2c 20 61 7a 41 72 67  HFLG_Echo, azArg
30b80 5b 31 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  [1]);.    }else{
30b90 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74  .      raw_print
30ba0 66 28 73 74 64 65 72 72 2c 20 22 55 73 61 67 65  f(stderr, "Usage
30bb0 3a 20 2e 65 63 68 6f 20 6f 6e 7c 6f 66 66 5c 6e  : .echo on|off\n
30bc0 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31  ");.      rc = 1
30bd0 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a  ;.    }.  }else.
30be0 0a 20 20 69 66 28 20 63 3d 3d 27 65 27 20 26 26  .  if( c=='e' &&
30bf0 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30   strncmp(azArg[0
30c00 5d 2c 20 22 65 71 70 22 2c 20 6e 29 3d 3d 30 20  ], "eqp", n)==0 
30c10 29 7b 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3d  ){.    if( nArg=
30c20 3d 32 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 61  =2 ){.      p->a
30c30 75 74 6f 45 51 50 74 65 73 74 20 3d 20 30 3b 0a  utoEQPtest = 0;.
30c40 20 20 20 20 20 20 69 66 28 20 70 2d 3e 61 75 74        if( p->aut
30c50 6f 45 51 50 74 72 61 63 65 20 29 7b 0a 20 20 20  oEQPtrace ){.   
30c60 20 20 20 20 20 69 66 28 20 70 2d 3e 64 62 20 29       if( p->db )
30c70 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d   sqlite3_exec(p-
30c80 3e 64 62 2c 20 22 50 52 41 47 4d 41 20 76 64 62  >db, "PRAGMA vdb
30c90 65 5f 74 72 61 63 65 3d 4f 46 46 3b 22 2c 20 30  e_trace=OFF;", 0
30ca0 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  , 0, 0);.       
30cb0 20 70 2d 3e 61 75 74 6f 45 51 50 74 72 61 63 65   p->autoEQPtrace
30cc0 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
30cd0 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 61      if( strcmp(a
30ce0 7a 41 72 67 5b 31 5d 2c 22 66 75 6c 6c 22 29 3d  zArg[1],"full")=
30cf0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d  =0 ){.        p-
30d00 3e 61 75 74 6f 45 51 50 20 3d 20 41 55 54 4f 45  >autoEQP = AUTOE
30d10 51 50 5f 66 75 6c 6c 3b 0a 20 20 20 20 20 20 7d  QP_full;.      }
30d20 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
30d30 61 7a 41 72 67 5b 31 5d 2c 22 74 72 69 67 67 65  azArg[1],"trigge
30d40 72 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  r")==0 ){.      
30d50 20 20 70 2d 3e 61 75 74 6f 45 51 50 20 3d 20 41    p->autoEQP = A
30d60 55 54 4f 45 51 50 5f 74 72 69 67 67 65 72 3b 0a  UTOEQP_trigger;.
30d70 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
30d80 42 55 47 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  BUG.      }else 
30d90 69 66 28 20 73 74 72 63 6d 70 28 61 7a 41 72 67  if( strcmp(azArg
30da0 5b 31 5d 2c 22 74 65 73 74 22 29 3d 3d 30 20 29  [1],"test")==0 )
30db0 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 75 74  {.        p->aut
30dc0 6f 45 51 50 20 3d 20 41 55 54 4f 45 51 50 5f 6f  oEQP = AUTOEQP_o
30dd0 6e 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 75  n;.        p->au
30de0 74 6f 45 51 50 74 65 73 74 20 3d 20 31 3b 0a 20  toEQPtest = 1;. 
30df0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73       }else if( s
30e00 74 72 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 22  trcmp(azArg[1],"
30e10 74 72 61 63 65 22 29 3d 3d 30 20 29 7b 0a 20 20  trace")==0 ){.  
30e20 20 20 20 20 20 20 70 2d 3e 61 75 74 6f 45 51 50        p->autoEQP
30e30 20 3d 20 41 55 54 4f 45 51 50 5f 66 75 6c 6c 3b   = AUTOEQP_full;
30e40 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 75 74 6f  .        p->auto
30e50 45 51 50 74 72 61 63 65 20 3d 20 31 3b 0a 20 20  EQPtrace = 1;.  
30e60 20 20 20 20 20 20 6f 70 65 6e 5f 64 62 28 70 2c        open_db(p,
30e70 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c   0);.        sql
30e80 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c  ite3_exec(p->db,
30e90 20 22 53 45 4c 45 43 54 20 6e 61 6d 65 20 46 52   "SELECT name FR
30ea0 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  OM sqlite_master
30eb0 20 4c 49 4d 49 54 20 31 22 2c 20 30 2c 20 30 2c   LIMIT 1", 0, 0,
30ec0 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c   0);.        sql
30ed0 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c  ite3_exec(p->db,
30ee0 20 22 50 52 41 47 4d 41 20 76 64 62 65 5f 74 72   "PRAGMA vdbe_tr
30ef0 61 63 65 3d 4f 4e 3b 22 2c 20 30 2c 20 30 2c 20  ace=ON;", 0, 0, 
30f00 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  0);.#endif.     
30f10 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
30f20 70 2d 3e 61 75 74 6f 45 51 50 20 3d 20 28 75 38  p->autoEQP = (u8
30f30 29 62 6f 6f 6c 65 61 6e 56 61 6c 75 65 28 61 7a  )booleanValue(az
30f40 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20 20 20 7d  Arg[1]);.      }
30f50 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
30f60 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64    raw_printf(std
30f70 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 65 71  err, "Usage: .eq
30f80 70 20 6f 66 66 7c 6f 6e 7c 74 72 61 63 65 7c 74  p off|on|trace|t
30f90 72 69 67 67 65 72 7c 66 75 6c 6c 5c 6e 22 29 3b  rigger|full\n");
30fa0 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20  .      rc = 1;. 
30fb0 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20     }.  }else..  
30fc0 69 66 28 20 63 3d 3d 27 65 27 20 26 26 20 73 74  if( c=='e' && st
30fd0 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20  rncmp(azArg[0], 
30fe0 22 65 78 69 74 22 2c 20 6e 29 3d 3d 30 20 29 7b  "exit", n)==0 ){
30ff0 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3e 31 20  .    if( nArg>1 
31000 26 26 20 28 72 63 20 3d 20 28 69 6e 74 29 69 6e  && (rc = (int)in
31010 74 65 67 65 72 56 61 6c 75 65 28 61 7a 41 72 67  tegerValue(azArg
31020 5b 31 5d 29 29 21 3d 30 20 29 20 65 78 69 74 28  [1]))!=0 ) exit(
31030 72 63 29 3b 0a 20 20 20 20 72 63 20 3d 20 32 3b  rc);.    rc = 2;
31040 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 2f 2a 20 54  .  }else..  /* T
31050 68 65 20 22 2e 65 78 70 6c 61 69 6e 22 20 63 6f  he ".explain" co
31060 6d 6d 61 6e 64 20 69 73 20 61 75 74 6f 6d 61 74  mmand is automat
31070 69 63 20 6e 6f 77 2e 20 20 49 74 20 69 73 20 6c  ic now.  It is l
31080 61 72 67 65 6c 79 20 70 6f 69 6e 74 6c 65 73 73  argely pointless
31090 2e 20 20 49 74 0a 20 20 2a 2a 20 72 65 74 61 69  .  It.  ** retai
310a0 6e 65 64 20 70 75 72 65 6c 79 20 66 6f 72 20 62  ned purely for b
310b0 61 63 6b 77 61 72 64 73 20 63 6f 6d 70 61 74 69  ackwards compati
310c0 62 69 6c 69 74 79 20 2a 2f 0a 20 20 69 66 28 20  bility */.  if( 
310d0 63 3d 3d 27 65 27 20 26 26 20 73 74 72 6e 63 6d  c=='e' && strncm
310e0 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 65 78 70  p(azArg[0], "exp
310f0 6c 61 69 6e 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a  lain", n)==0 ){.
31100 20 20 20 20 69 6e 74 20 76 61 6c 20 3d 20 31 3b      int val = 1;
31110 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3e 3d 32  .    if( nArg>=2
31120 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 74   ){.      if( st
31130 72 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 22 61  rcmp(azArg[1],"a
31140 75 74 6f 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  uto")==0 ){.    
31150 20 20 20 20 76 61 6c 20 3d 20 39 39 3b 0a 20 20      val = 99;.  
31160 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
31170 20 20 20 76 61 6c 20 3d 20 20 62 6f 6f 6c 65 61     val =  boolea
31180 6e 56 61 6c 75 65 28 61 7a 41 72 67 5b 31 5d 29  nValue(azArg[1])
31190 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
311a0 20 20 20 20 69 66 28 20 76 61 6c 3d 3d 31 20 26      if( val==1 &
311b0 26 20 70 2d 3e 6d 6f 64 65 21 3d 4d 4f 44 45 5f  & p->mode!=MODE_
311c0 45 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20 20  Explain ){.     
311d0 20 70 2d 3e 6e 6f 72 6d 61 6c 4d 6f 64 65 20 3d   p->normalMode =
311e0 20 70 2d 3e 6d 6f 64 65 3b 0a 20 20 20 20 20 20   p->mode;.      
311f0 70 2d 3e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 45  p->mode = MODE_E
31200 78 70 6c 61 69 6e 3b 0a 20 20 20 20 20 20 70 2d  xplain;.      p-
31210 3e 61 75 74 6f 45 78 70 6c 61 69 6e 20 3d 20 30  >autoExplain = 0
31220 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
31230 76 61 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  val==0 ){.      
31240 69 66 28 20 70 2d 3e 6d 6f 64 65 3d 3d 4d 4f 44  if( p->mode==MOD
31250 45 5f 45 78 70 6c 61 69 6e 20 29 20 70 2d 3e 6d  E_Explain ) p->m
31260 6f 64 65 20 3d 20 70 2d 3e 6e 6f 72 6d 61 6c 4d  ode = p->normalM
31270 6f 64 65 3b 0a 20 20 20 20 20 20 70 2d 3e 61 75  ode;.      p->au
31280 74 6f 45 78 70 6c 61 69 6e 20 3d 20 30 3b 0a 20  toExplain = 0;. 
31290 20 20 20 7d 65 6c 73 65 20 69 66 28 20 76 61 6c     }else if( val
312a0 3d 3d 39 39 20 29 7b 0a 20 20 20 20 20 20 69 66  ==99 ){.      if
312b0 28 20 70 2d 3e 6d 6f 64 65 3d 3d 4d 4f 44 45 5f  ( p->mode==MODE_
312c0 45 78 70 6c 61 69 6e 20 29 20 70 2d 3e 6d 6f 64  Explain ) p->mod
312d0 65 20 3d 20 70 2d 3e 6e 6f 72 6d 61 6c 4d 6f 64  e = p->normalMod
312e0 65 3b 0a 20 20 20 20 20 20 70 2d 3e 61 75 74 6f  e;.      p->auto
312f0 45 78 70 6c 61 69 6e 20 3d 20 31 3b 0a 20 20 20  Explain = 1;.   
31300 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 23 69 66 6e   }.  }else..#ifn
31310 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
31320 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 69  VIRTUALTABLE.  i
31330 66 28 20 63 3d 3d 27 65 27 20 26 26 20 73 74 72  f( c=='e' && str
31340 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22  ncmp(azArg[0], "
31350 65 78 70 65 72 74 22 2c 20 6e 29 3d 3d 30 20 29  expert", n)==0 )
31360 7b 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28 70 2c  {.    open_db(p,
31370 20 30 29 3b 0a 20 20 20 20 65 78 70 65 72 74 44   0);.    expertD
31380 6f 74 43 6f 6d 6d 61 6e 64 28 70 2c 20 61 7a 41  otCommand(p, azA
31390 72 67 2c 20 6e 41 72 67 29 3b 0a 20 20 7d 65 6c  rg, nArg);.  }el
313a0 73 65 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28  se.#endif..  if(
313b0 20 63 3d 3d 27 66 27 20 26 26 20 73 74 72 6e 63   c=='f' && strnc
313c0 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 66 75  mp(azArg[0], "fu
313d0 6c 6c 73 63 68 65 6d 61 22 2c 20 6e 29 3d 3d 30  llschema", n)==0
313e0 20 29 7b 0a 20 20 20 20 53 68 65 6c 6c 53 74 61   ){.    ShellSta
313f0 74 65 20 64 61 74 61 3b 0a 20 20 20 20 63 68 61  te data;.    cha
31400 72 20 2a 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a  r *zErrMsg = 0;.
31410 20 20 20 20 69 6e 74 20 64 6f 53 74 61 74 73 20      int doStats 
31420 3d 20 30 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  = 0;.    memcpy(
31430 26 64 61 74 61 2c 20 70 2c 20 73 69 7a 65 6f 66  &data, p, sizeof
31440 28 64 61 74 61 29 29 3b 0a 20 20 20 20 64 61 74  (data));.    dat
31450 61 2e 73 68 6f 77 48 65 61 64 65 72 20 3d 20 30  a.showHeader = 0
31460 3b 0a 20 20 20 20 64 61 74 61 2e 63 4d 6f 64 65  ;.    data.cMode
31470 20 3d 20 64 61 74 61 2e 6d 6f 64 65 20 3d 20 4d   = data.mode = M
31480 4f 44 45 5f 53 65 6d 69 3b 0a 20 20 20 20 69 66  ODE_Semi;.    if
31490 28 20 6e 41 72 67 3d 3d 32 20 26 26 20 6f 70 74  ( nArg==2 && opt
314a0 69 6f 6e 4d 61 74 63 68 28 61 7a 41 72 67 5b 31  ionMatch(azArg[1
314b0 5d 2c 20 22 69 6e 64 65 6e 74 22 29 20 29 7b 0a  ], "indent") ){.
314c0 20 20 20 20 20 20 64 61 74 61 2e 63 4d 6f 64 65        data.cMode
314d0 20 3d 20 64 61 74 61 2e 6d 6f 64 65 20 3d 20 4d   = data.mode = M
314e0 4f 44 45 5f 50 72 65 74 74 79 3b 0a 20 20 20 20  ODE_Pretty;.    
314f0 20 20 6e 41 72 67 20 3d 20 31 3b 0a 20 20 20 20    nArg = 1;.    
31500 7d 0a 20 20 20 20 69 66 28 20 6e 41 72 67 21 3d  }.    if( nArg!=
31510 31 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70  1 ){.      raw_p
31520 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55  rintf(stderr, "U
31530 73 61 67 65 3a 20 2e 66 75 6c 6c 73 63 68 65 6d  sage: .fullschem
31540 61 20 3f 2d 2d 69 6e 64 65 6e 74 3f 5c 6e 22 29  a ?--indent?\n")
31550 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a  ;.      rc = 1;.
31560 20 20 20 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f        goto meta_
31570 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20  command_exit;.  
31580 20 20 7d 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28    }.    open_db(
31590 70 2c 20 30 29 3b 0a 20 20 20 20 72 63 20 3d 20  p, 0);.    rc = 
315a0 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e  sqlite3_exec(p->
315b0 64 62 2c 0a 20 20 20 20 20 20 20 22 53 45 4c 45  db,.       "SELE
315c0 43 54 20 73 71 6c 20 46 52 4f 4d 22 0a 20 20 20  CT sql FROM".   
315d0 20 20 20 20 22 20 20 28 53 45 4c 45 43 54 20 73      "  (SELECT s
315e0 71 6c 20 73 71 6c 2c 20 74 79 70 65 20 74 79 70  ql sql, type typ
315f0 65 2c 20 74 62 6c 5f 6e 61 6d 65 20 74 62 6c 5f  e, tbl_name tbl_
31600 6e 61 6d 65 2c 20 6e 61 6d 65 20 6e 61 6d 65 2c  name, name name,
31610 20 72 6f 77 69 64 20 78 22 0a 20 20 20 20 20 20   rowid x".      
31620 20 22 20 20 20 20 20 46 52 4f 4d 20 73 71 6c 69   "     FROM sqli
31630 74 65 5f 6d 61 73 74 65 72 20 55 4e 49 4f 4e 20  te_master UNION 
31640 41 4c 4c 22 0a 20 20 20 20 20 20 20 22 20 20 20  ALL".       "   
31650 53 45 4c 45 43 54 20 73 71 6c 2c 20 74 79 70 65  SELECT sql, type
31660 2c 20 74 62 6c 5f 6e 61 6d 65 2c 20 6e 61 6d 65  , tbl_name, name
31670 2c 20 72 6f 77 69 64 20 46 52 4f 4d 20 73 71 6c  , rowid FROM sql
31680 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72 29  ite_temp_master)
31690 20 22 0a 20 20 20 20 20 20 20 22 57 48 45 52 45   ".       "WHERE
316a0 20 74 79 70 65 21 3d 27 6d 65 74 61 27 20 41 4e   type!='meta' AN
316b0 44 20 73 71 6c 20 4e 4f 54 4e 55 4c 4c 20 41 4e  D sql NOTNULL AN
316c0 44 20 6e 61 6d 65 20 4e 4f 54 20 4c 49 4b 45 20  D name NOT LIKE 
316d0 27 73 71 6c 69 74 65 5f 25 27 20 22 0a 20 20 20  'sqlite_%' ".   
316e0 20 20 20 20 22 4f 52 44 45 52 20 42 59 20 72 6f      "ORDER BY ro
316f0 77 69 64 22 2c 0a 20 20 20 20 20 20 20 63 61 6c  wid",.       cal
31700 6c 62 61 63 6b 2c 20 26 64 61 74 61 2c 20 26 7a  lback, &data, &z
31710 45 72 72 4d 73 67 0a 20 20 20 20 29 3b 0a 20 20  ErrMsg.    );.  
31720 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
31730 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  _OK ){.      sql
31740 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
31750 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
31760 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28  ite3_prepare_v2(
31770 70 2d 3e 64 62 2c 0a 20 20 20 20 20 20 20 20 20  p->db,.         
31780 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 72 6f        "SELECT ro
31790 77 69 64 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f  wid FROM sqlite_
317a0 6d 61 73 74 65 72 22 0a 20 20 20 20 20 20 20 20  master".        
317b0 20 20 20 20 20 20 20 22 20 57 48 45 52 45 20 6e         " WHERE n
317c0 61 6d 65 20 47 4c 4f 42 20 27 73 71 6c 69 74 65  ame GLOB 'sqlite
317d0 5f 73 74 61 74 5b 31 33 34 5d 27 22 2c 0a 20 20  _stat[134]'",.  
317e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 31 2c               -1,
317f0 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20   &pStmt, 0);.   
31800 20 20 20 64 6f 53 74 61 74 73 20 3d 20 73 71 6c     doStats = sql
31810 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29  ite3_step(pStmt)
31820 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 3b 0a 20 20  ==SQLITE_ROW;.  
31830 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61      sqlite3_fina
31840 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20  lize(pStmt);.   
31850 20 7d 0a 20 20 20 20 69 66 28 20 64 6f 53 74 61   }.    if( doSta
31860 74 73 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  ts==0 ){.      r
31870 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  aw_printf(p->out
31880 2c 20 22 2f 2a 20 4e 6f 20 53 54 41 54 20 74 61  , "/* No STAT ta
31890 62 6c 65 73 20 61 76 61 69 6c 61 62 6c 65 20 2a  bles available *
318a0 2f 5c 6e 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65  /\n");.    }else
318b0 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e  {.      raw_prin
318c0 74 66 28 70 2d 3e 6f 75 74 2c 20 22 41 4e 41 4c  tf(p->out, "ANAL
318d0 59 5a 45 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  YZE sqlite_maste
318e0 72 3b 5c 6e 22 29 3b 0a 20 20 20 20 20 20 73 71  r;\n");.      sq
318f0 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62  lite3_exec(p->db
31900 2c 20 22 53 45 4c 45 43 54 20 27 41 4e 41 4c 59  , "SELECT 'ANALY
31910 5a 45 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  ZE sqlite_master
31920 27 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  '",.            
31930 20 20 20 20 20 20 20 63 61 6c 6c 62 61 63 6b 2c         callback,
31940 20 26 64 61 74 61 2c 20 26 7a 45 72 72 4d 73 67   &data, &zErrMsg
31950 29 3b 0a 20 20 20 20 20 20 64 61 74 61 2e 63 4d  );.      data.cM
31960 6f 64 65 20 3d 20 64 61 74 61 2e 6d 6f 64 65 20  ode = data.mode 
31970 3d 20 4d 4f 44 45 5f 49 6e 73 65 72 74 3b 0a 20  = MODE_Insert;. 
31980 20 20 20 20 20 64 61 74 61 2e 7a 44 65 73 74 54       data.zDestT
31990 61 62 6c 65 20 3d 20 22 73 71 6c 69 74 65 5f 73  able = "sqlite_s
319a0 74 61 74 31 22 3b 0a 20 20 20 20 20 20 73 68 65  tat1";.      she
319b0 6c 6c 5f 65 78 65 63 28 26 64 61 74 61 2c 20 22  ll_exec(&data, "
319c0 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 73 71  SELECT * FROM sq
319d0 6c 69 74 65 5f 73 74 61 74 31 22 2c 20 26 7a 45  lite_stat1", &zE
319e0 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 64 61  rrMsg);.      da
319f0 74 61 2e 7a 44 65 73 74 54 61 62 6c 65 20 3d 20  ta.zDestTable = 
31a00 22 73 71 6c 69 74 65 5f 73 74 61 74 33 22 3b 0a  "sqlite_stat3";.
31a10 20 20 20 20 20 20 73 68 65 6c 6c 5f 65 78 65 63        shell_exec
31a20 28 26 64 61 74 61 2c 20 22 53 45 4c 45 43 54 20  (&data, "SELECT 
31a30 2a 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 73 74  * FROM sqlite_st
31a40 61 74 33 22 2c 20 26 7a 45 72 72 4d 73 67 29 3b  at3", &zErrMsg);
31a50 0a 20 20 20 20 20 20 64 61 74 61 2e 7a 44 65 73  .      data.zDes
31a60 74 54 61 62 6c 65 20 3d 20 22 73 71 6c 69 74 65  tTable = "sqlite
31a70 5f 73 74 61 74 34 22 3b 0a 20 20 20 20 20 20 73  _stat4";.      s
31a80 68 65 6c 6c 5f 65 78 65 63 28 26 64 61 74 61 2c  hell_exec(&data,
31a90 20 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20   "SELECT * FROM 
31aa0 73 71 6c 69 74 65 5f 73 74 61 74 34 22 2c 20 26  sqlite_stat4", &
31ab0 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20  zErrMsg);.      
31ac0 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  raw_printf(p->ou
31ad0 74 2c 20 22 41 4e 41 4c 59 5a 45 20 73 71 6c 69  t, "ANALYZE sqli
31ae0 74 65 5f 6d 61 73 74 65 72 3b 5c 6e 22 29 3b 0a  te_master;\n");.
31af0 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20      }.  }else.. 
31b00 20 69 66 28 20 63 3d 3d 27 68 27 20 26 26 20 73   if( c=='h' && s
31b10 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c  trncmp(azArg[0],
31b20 20 22 68 65 61 64 65 72 73 22 2c 20 6e 29 3d 3d   "headers", n)==
31b30 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 41 72  0 ){.    if( nAr
31b40 67 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 70 2d  g==2 ){.      p-
31b50 3e 73 68 6f 77 48 65 61 64 65 72 20 3d 20 62 6f  >showHeader = bo
31b60 6f 6c 65 61 6e 56 61 6c 75 65 28 61 7a 41 72 67  oleanValue(azArg
31b70 5b 31 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  [1]);.    }else{
31b80 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74  .      raw_print
31b90 66 28 73 74 64 65 72 72 2c 20 22 55 73 61 67 65  f(stderr, "Usage
31ba0 3a 20 2e 68 65 61 64 65 72 73 20 6f 6e 7c 6f 66  : .headers on|of
31bb0 66 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20  f\n");.      rc 
31bc0 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  = 1;.    }.  }el
31bd0 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 68 27  se..  if( c=='h'
31be0 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72   && strncmp(azAr
31bf0 67 5b 30 5d 2c 20 22 68 65 6c 70 22 2c 20 6e 29  g[0], "help", n)
31c00 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6e  ==0 ){.    if( n
31c10 41 72 67 3e 3d 32 20 29 7b 0a 20 20 20 20 20 20  Arg>=2 ){.      
31c20 6e 20 3d 20 73 68 6f 77 48 65 6c 70 28 70 2d 3e  n = showHelp(p->
31c30 6f 75 74 2c 20 61 7a 41 72 67 5b 31 5d 29 3b 0a  out, azArg[1]);.
31c40 20 20 20 20 20 20 69 66 28 20 6e 3d 3d 30 20 29        if( n==0 )
31c50 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70  {.        utf8_p
31c60 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 4e  rintf(p->out, "N
31c70 6f 74 68 69 6e 67 20 6d 61 74 63 68 65 73 20 27  othing matches '
31c80 25 73 27 5c 6e 22 2c 20 61 7a 41 72 67 5b 31 5d  %s'\n", azArg[1]
31c90 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
31ca0 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 68 6f 77  else{.      show
31cb0 48 65 6c 70 28 70 2d 3e 6f 75 74 2c 20 30 29 3b  Help(p->out, 0);
31cc0 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a  .    }.  }else..
31cd0 20 20 69 66 28 20 63 3d 3d 27 69 27 20 26 26 20    if( c=='i' && 
31ce0 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d  strncmp(azArg[0]
31cf0 2c 20 22 69 6d 70 6f 72 74 22 2c 20 6e 29 3d 3d  , "import", n)==
31d00 30 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  0 ){.    char *z
31d10 54 61 62 6c 65 3b 20 20 20 20 20 20 20 20 20 20  Table;          
31d20 20 20 20 20 20 2f 2a 20 49 6e 73 65 72 74 20 64       /* Insert d
31d30 61 74 61 20 69 6e 74 6f 20 74 68 69 73 20 74 61  ata into this ta
31d40 62 6c 65 20 2a 2f 0a 20 20 20 20 63 68 61 72 20  ble */.    char 
31d50 2a 7a 46 69 6c 65 3b 20 20 20 20 20 20 20 20 20  *zFile;         
31d60 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
31d70 66 20 66 69 6c 65 20 74 6f 20 65 78 74 72 61 20  f file to extra 
31d80 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 2a 2f 0a  content from */.
31d90 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74      sqlite3_stmt
31da0 20 2a 70 53 74 6d 74 20 3d 20 4e 55 4c 4c 3b 20   *pStmt = NULL; 
31db0 2f 2a 20 41 20 73 74 61 74 65 6d 65 6e 74 20 2a  /* A statement *
31dc0 2f 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6c 3b 20  /.    int nCol; 
31dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31de0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
31df0 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 74 61  olumns in the ta
31e00 62 6c 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  ble */.    int n
31e10 42 79 74 65 3b 20 20 20 20 20 20 20 20 20 20 20  Byte;           
31e20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
31e30 20 6f 66 20 62 79 74 65 73 20 69 6e 20 61 6e 20   of bytes in an 
31e40 53 51 4c 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20  SQL string */.  
31e50 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20    int i, j;     
31e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
31e70 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a   Loop counters *
31e80 2f 0a 20 20 20 20 69 6e 74 20 6e 65 65 64 43 6f  /.    int needCo
31e90 6d 6d 69 74 3b 20 20 20 20 20 20 20 20 20 20 20  mmit;           
31ea0 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 43 4f 4d    /* True to COM
31eb0 4d 49 54 20 6f 72 20 52 4f 4c 4c 42 41 43 4b 20  MIT or ROLLBACK 
31ec0 61 74 20 65 6e 64 20 2a 2f 0a 20 20 20 20 69 6e  at end */.    in
31ed0 74 20 6e 53 65 70 3b 20 20 20 20 20 20 20 20 20  t nSep;         
31ee0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
31ef0 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20  ber of bytes in 
31f00 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 5b  p->colSeparator[
31f10 5d 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a  ] */.    char *z
31f20 53 71 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Sql;            
31f30 20 20 20 20 20 2f 2a 20 41 6e 20 53 51 4c 20 73       /* An SQL s
31f40 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20  tatement */.    
31f50 49 6d 70 6f 72 74 43 74 78 20 73 43 74 78 3b 20  ImportCtx sCtx; 
31f60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
31f70 65 61 64 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f  eader context */
31f80 0a 20 20 20 20 63 68 61 72 20 2a 28 53 51 4c 49  .    char *(SQLI
31f90 54 45 5f 43 44 45 43 4c 20 2a 78 52 65 61 64 29  TE_CDECL *xRead)
31fa0 28 49 6d 70 6f 72 74 43 74 78 2a 29 3b 20 2f 2a  (ImportCtx*); /*
31fb0 20 46 75 6e 63 20 74 6f 20 72 65 61 64 20 6f 6e   Func to read on
31fc0 65 20 76 61 6c 75 65 20 2a 2f 0a 20 20 20 20 69  e value */.    i
31fd0 6e 74 20 28 53 51 4c 49 54 45 5f 43 44 45 43 4c  nt (SQLITE_CDECL
31fe0 20 2a 78 43 6c 6f 73 65 72 29 28 46 49 4c 45 2a   *xCloser)(FILE*
31ff0 29 3b 20 20 20 20 20 20 2f 2a 20 46 75 6e 63 20  );      /* Func 
32000 74 6f 20 63 6c 6f 73 65 20 66 69 6c 65 20 2a 2f  to close file */
32010 0a 0a 20 20 20 20 69 66 28 20 6e 41 72 67 21 3d  ..    if( nArg!=
32020 33 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70  3 ){.      raw_p
32030 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55  rintf(stderr, "U
32040 73 61 67 65 3a 20 2e 69 6d 70 6f 72 74 20 46 49  sage: .import FI
32050 4c 45 20 54 41 42 4c 45 5c 6e 22 29 3b 0a 20 20  LE TABLE\n");.  
32060 20 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f      goto meta_co
32070 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20  mmand_exit;.    
32080 7d 0a 20 20 20 20 7a 46 69 6c 65 20 3d 20 61 7a  }.    zFile = az
32090 41 72 67 5b 31 5d 3b 0a 20 20 20 20 7a 54 61 62  Arg[1];.    zTab
320a0 6c 65 20 3d 20 61 7a 41 72 67 5b 32 5d 3b 0a 20  le = azArg[2];. 
320b0 20 20 20 73 65 65 6e 49 6e 74 65 72 72 75 70 74     seenInterrupt
320c0 20 3d 20 30 3b 0a 20 20 20 20 6d 65 6d 73 65 74   = 0;.    memset
320d0 28 26 73 43 74 78 2c 20 30 2c 20 73 69 7a 65 6f  (&sCtx, 0, sizeo
320e0 66 28 73 43 74 78 29 29 3b 0a 20 20 20 20 6f 70  f(sCtx));.    op
320f0 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a 20 20 20  en_db(p, 0);.   
32100 20 6e 53 65 70 20 3d 20 73 74 72 6c 65 6e 33 30   nSep = strlen30
32110 28 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72  (p->colSeparator
32120 29 3b 0a 20 20 20 20 69 66 28 20 6e 53 65 70 3d  );.    if( nSep=
32130 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f  =0 ){.      raw_
32140 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 0a 20  printf(stderr,. 
32150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32160 22 45 72 72 6f 72 3a 20 6e 6f 6e 2d 6e 75 6c 6c  "Error: non-null
32170 20 63 6f 6c 75 6d 6e 20 73 65 70 61 72 61 74 6f   column separato
32180 72 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 69  r required for i
32190 6d 70 6f 72 74 5c 6e 22 29 3b 0a 20 20 20 20 20  mport\n");.     
321a0 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
321b0 0a 20 20 20 20 69 66 28 20 6e 53 65 70 3e 31 20  .    if( nSep>1 
321c0 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69  ){.      raw_pri
321d0 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72  ntf(stderr, "Err
321e0 6f 72 3a 20 6d 75 6c 74 69 2d 63 68 61 72 61 63  or: multi-charac
321f0 74 65 72 20 63 6f 6c 75 6d 6e 20 73 65 70 61 72  ter column separ
32200 61 74 6f 72 73 20 6e 6f 74 20 61 6c 6c 6f 77 65  ators not allowe
32210 64 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  d".             
32220 20 20 20 20 20 20 20 20 20 22 20 66 6f 72 20 69           " for i
32230 6d 70 6f 72 74 5c 6e 22 29 3b 0a 20 20 20 20 20  mport\n");.     
32240 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
32250 0a 20 20 20 20 6e 53 65 70 20 3d 20 73 74 72 6c  .    nSep = strl
32260 65 6e 33 30 28 70 2d 3e 72 6f 77 53 65 70 61 72  en30(p->rowSepar
32270 61 74 6f 72 29 3b 0a 20 20 20 20 69 66 28 20 6e  ator);.    if( n
32280 53 65 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Sep==0 ){.      
32290 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72  raw_printf(stder
322a0 72 2c 20 22 45 72 72 6f 72 3a 20 6e 6f 6e 2d 6e  r, "Error: non-n
322b0 75 6c 6c 20 72 6f 77 20 73 65 70 61 72 61 74 6f  ull row separato
322c0 72 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 69  r required for i
322d0 6d 70 6f 72 74 5c 6e 22 29 3b 0a 20 20 20 20 20  mport\n");.     
322e0 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
322f0 0a 20 20 20 20 69 66 28 20 6e 53 65 70 3d 3d 32  .    if( nSep==2
32300 20 26 26 20 70 2d 3e 6d 6f 64 65 3d 3d 4d 4f 44   && p->mode==MOD
32310 45 5f 43 73 76 20 26 26 20 73 74 72 63 6d 70 28  E_Csv && strcmp(
32320 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 2c  p->rowSeparator,
32330 20 53 45 50 5f 43 72 4c 66 29 3d 3d 30 20 29 7b   SEP_CrLf)==0 ){
32340 0a 20 20 20 20 20 20 2f 2a 20 57 68 65 6e 20 69  .      /* When i
32350 6d 70 6f 72 74 69 6e 67 20 43 53 56 20 28 6f 6e  mporting CSV (on
32360 6c 79 29 2c 20 69 66 20 74 68 65 20 72 6f 77 20  ly), if the row 
32370 73 65 70 61 72 61 74 6f 72 20 69 73 20 73 65 74  separator is set
32380 20 74 6f 20 74 68 65 0a 20 20 20 20 20 20 2a 2a   to the.      **
32390 20 64 65 66 61 75 6c 74 20 6f 75 74 70 75 74 20   default output 
323a0 72 6f 77 20 73 65 70 61 72 61 74 6f 72 2c 20 63  row separator, c
323b0 68 61 6e 67 65 20 69 74 20 74 6f 20 74 68 65 20  hange it to the 
323c0 64 65 66 61 75 6c 74 20 69 6e 70 75 74 0a 20 20  default input.  
323d0 20 20 20 20 2a 2a 20 72 6f 77 20 73 65 70 61 72      ** row separ
323e0 61 74 6f 72 2e 20 20 54 68 69 73 20 61 76 6f 69  ator.  This avoi
323f0 64 73 20 68 61 76 69 6e 67 20 74 6f 20 6d 61 69  ds having to mai
32400 6e 74 61 69 6e 20 64 69 66 66 65 72 65 6e 74 20  ntain different 
32410 69 6e 70 75 74 0a 20 20 20 20 20 20 2a 2a 20 61  input.      ** a
32420 6e 64 20 6f 75 74 70 75 74 20 72 6f 77 20 73 65  nd output row se
32430 70 61 72 61 74 6f 72 73 2e 20 2a 2f 0a 20 20 20  parators. */.   
32440 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
32450 6e 74 66 28 73 69 7a 65 6f 66 28 70 2d 3e 72 6f  ntf(sizeof(p->ro
32460 77 53 65 70 61 72 61 74 6f 72 29 2c 20 70 2d 3e  wSeparator), p->
32470 72 6f 77 53 65 70 61 72 61 74 6f 72 2c 20 53 45  rowSeparator, SE
32480 50 5f 52 6f 77 29 3b 0a 20 20 20 20 20 20 6e 53  P_Row);.      nS
32490 65 70 20 3d 20 73 74 72 6c 65 6e 33 30 28 70 2d  ep = strlen30(p-
324a0 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 29 3b 0a  >rowSeparator);.
324b0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 53      }.    if( nS
324c0 65 70 3e 31 20 29 7b 0a 20 20 20 20 20 20 72 61  ep>1 ){.      ra
324d0 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  w_printf(stderr,
324e0 20 22 45 72 72 6f 72 3a 20 6d 75 6c 74 69 2d 63   "Error: multi-c
324f0 68 61 72 61 63 74 65 72 20 72 6f 77 20 73 65 70  haracter row sep
32500 61 72 61 74 6f 72 73 20 6e 6f 74 20 61 6c 6c 6f  arators not allo
32510 77 65 64 22 0a 20 20 20 20 20 20 20 20 20 20 20  wed".           
32520 20 20 20 20 20 20 20 20 20 20 20 22 20 66 6f 72             " for
32530 20 69 6d 70 6f 72 74 5c 6e 22 29 3b 0a 20 20 20   import\n");.   
32540 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
32550 20 7d 0a 20 20 20 20 73 43 74 78 2e 7a 46 69 6c   }.    sCtx.zFil
32560 65 20 3d 20 7a 46 69 6c 65 3b 0a 20 20 20 20 73  e = zFile;.    s
32570 43 74 78 2e 6e 4c 69 6e 65 20 3d 20 31 3b 0a 20  Ctx.nLine = 1;. 
32580 20 20 20 69 66 28 20 73 43 74 78 2e 7a 46 69 6c     if( sCtx.zFil
32590 65 5b 30 5d 3d 3d 27 7c 27 20 29 7b 0a 23 69 66  e[0]=='|' ){.#if
325a0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
325b0 50 4f 50 45 4e 0a 20 20 20 20 20 20 72 61 77 5f  POPEN.      raw_
325c0 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
325d0 45 72 72 6f 72 3a 20 70 69 70 65 73 20 61 72 65  Error: pipes are
325e0 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 20 69   not supported i
325f0 6e 20 74 68 69 73 20 4f 53 5c 6e 22 29 3b 0a 20  n this OS\n");. 
32600 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 23       return 1;.#
32610 65 6c 73 65 0a 20 20 20 20 20 20 73 43 74 78 2e  else.      sCtx.
32620 69 6e 20 3d 20 70 6f 70 65 6e 28 73 43 74 78 2e  in = popen(sCtx.
32630 7a 46 69 6c 65 2b 31 2c 20 22 72 22 29 3b 0a 20  zFile+1, "r");. 
32640 20 20 20 20 20 73 43 74 78 2e 7a 46 69 6c 65 20       sCtx.zFile 
32650 3d 20 22 3c 70 69 70 65 3e 22 3b 0a 20 20 20 20  = "<pipe>";.    
32660 20 20 78 43 6c 6f 73 65 72 20 3d 20 70 63 6c 6f    xCloser = pclo
32670 73 65 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d  se;.#endif.    }
32680 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 43 74 78  else{.      sCtx
32690 2e 69 6e 20 3d 20 66 6f 70 65 6e 28 73 43 74 78  .in = fopen(sCtx
326a0 2e 7a 46 69 6c 65 2c 20 22 72 62 22 29 3b 0a 20  .zFile, "rb");. 
326b0 20 20 20 20 20 78 43 6c 6f 73 65 72 20 3d 20 66       xCloser = f
326c0 63 6c 6f 73 65 3b 0a 20 20 20 20 7d 0a 20 20 20  close;.    }.   
326d0 20 69 66 28 20 70 2d 3e 6d 6f 64 65 3d 3d 4d 4f   if( p->mode==MO
326e0 44 45 5f 41 73 63 69 69 20 29 7b 0a 20 20 20 20  DE_Ascii ){.    
326f0 20 20 78 52 65 61 64 20 3d 20 61 73 63 69 69 5f    xRead = ascii_
32700 72 65 61 64 5f 6f 6e 65 5f 66 69 65 6c 64 3b 0a  read_one_field;.
32710 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
32720 20 78 52 65 61 64 20 3d 20 63 73 76 5f 72 65 61   xRead = csv_rea
32730 64 5f 6f 6e 65 5f 66 69 65 6c 64 3b 0a 20 20 20  d_one_field;.   
32740 20 7d 0a 20 20 20 20 69 66 28 20 73 43 74 78 2e   }.    if( sCtx.
32750 69 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 75  in==0 ){.      u
32760 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72  tf8_printf(stder
32770 72 2c 20 22 45 72 72 6f 72 3a 20 63 61 6e 6e 6f  r, "Error: canno
32780 74 20 6f 70 65 6e 20 5c 22 25 73 5c 22 5c 6e 22  t open \"%s\"\n"
32790 2c 20 7a 46 69 6c 65 29 3b 0a 20 20 20 20 20 20  , zFile);.      
327a0 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
327b0 20 20 20 20 73 43 74 78 2e 63 43 6f 6c 53 65 70      sCtx.cColSep
327c0 20 3d 20 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74   = p->colSeparat
327d0 6f 72 5b 30 5d 3b 0a 20 20 20 20 73 43 74 78 2e  or[0];.    sCtx.
327e0 63 52 6f 77 53 65 70 20 3d 20 70 2d 3e 72 6f 77  cRowSep = p->row
327f0 53 65 70 61 72 61 74 6f 72 5b 30 5d 3b 0a 20 20  Separator[0];.  
32800 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33    zSql = sqlite3
32810 5f 6d 70 72 69 6e 74 66 28 22 53 45 4c 45 43 54  _mprintf("SELECT
32820 20 2a 20 46 52 4f 4d 20 25 73 22 2c 20 7a 54 61   * FROM %s", zTa
32830 62 6c 65 29 3b 0a 20 20 20 20 69 66 28 20 7a 53  ble);.    if( zS
32840 71 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 78  ql==0 ){.      x
32850 43 6c 6f 73 65 72 28 73 43 74 78 2e 69 6e 29 3b  Closer(sCtx.in);
32860 0a 20 20 20 20 20 20 73 68 65 6c 6c 5f 6f 75 74  .      shell_out
32870 5f 6f 66 5f 6d 65 6d 6f 72 79 28 29 3b 0a 20 20  _of_memory();.  
32880 20 20 7d 0a 20 20 20 20 6e 42 79 74 65 20 3d 20    }.    nByte = 
32890 73 74 72 6c 65 6e 33 30 28 7a 53 71 6c 29 3b 0a  strlen30(zSql);.
328a0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
328b0 5f 70 72 65 70 61 72 65 5f 76 32 28 70 2d 3e 64  _prepare_v2(p->d
328c0 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53  b, zSql, -1, &pS
328d0 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 69 6d 70  tmt, 0);.    imp
328e0 6f 72 74 5f 61 70 70 65 6e 64 5f 63 68 61 72 28  ort_append_char(
328f0 26 73 43 74 78 2c 20 30 29 3b 20 20 20 20 2f 2a  &sCtx, 0);    /*
32900 20 54 6f 20 65 6e 73 75 72 65 20 73 43 74 78 2e   To ensure sCtx.
32910 7a 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 2a  z is allocated *
32920 2f 0a 20 20 20 20 69 66 28 20 72 63 20 26 26 20  /.    if( rc && 
32930 73 71 6c 69 74 65 33 5f 73 74 72 67 6c 6f 62 28  sqlite3_strglob(
32940 22 6e 6f 20 73 75 63 68 20 74 61 62 6c 65 3a 20  "no such table: 
32950 2a 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d  *", sqlite3_errm
32960 73 67 28 70 2d 3e 64 62 29 29 3d 3d 30 20 29 7b  sg(p->db))==0 ){
32970 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 43 72  .      char *zCr
32980 65 61 74 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d  eate = sqlite3_m
32990 70 72 69 6e 74 66 28 22 43 52 45 41 54 45 20 54  printf("CREATE T
329a0 41 42 4c 45 20 25 73 22 2c 20 7a 54 61 62 6c 65  ABLE %s", zTable
329b0 29 3b 0a 20 20 20 20 20 20 63 68 61 72 20 63 53  );.      char cS
329c0 65 70 20 3d 20 27 28 27 3b 0a 20 20 20 20 20 20  ep = '(';.      
329d0 77 68 69 6c 65 28 20 78 52 65 61 64 28 26 73 43  while( xRead(&sC
329e0 74 78 29 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  tx) ){.        z
329f0 43 72 65 61 74 65 20 3d 20 73 71 6c 69 74 65 33  Create = sqlite3
32a00 5f 6d 70 72 69 6e 74 66 28 22 25 7a 25 63 5c 6e  _mprintf("%z%c\n
32a10 20 20 5c 22 25 77 5c 22 20 54 45 58 54 22 2c 20    \"%w\" TEXT", 
32a20 7a 43 72 65 61 74 65 2c 20 63 53 65 70 2c 20 73  zCreate, cSep, s
32a30 43 74 78 2e 7a 29 3b 0a 20 20 20 20 20 20 20 20  Ctx.z);.        
32a40 63 53 65 70 20 3d 20 27 2c 27 3b 0a 20 20 20 20  cSep = ',';.    
32a50 20 20 20 20 69 66 28 20 73 43 74 78 2e 63 54 65      if( sCtx.cTe
32a60 72 6d 21 3d 73 43 74 78 2e 63 43 6f 6c 53 65 70  rm!=sCtx.cColSep
32a70 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
32a80 7d 0a 20 20 20 20 20 20 69 66 28 20 63 53 65 70  }.      if( cSep
32a90 3d 3d 27 28 27 20 29 7b 0a 20 20 20 20 20 20 20  =='(' ){.       
32aa0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43   sqlite3_free(zC
32ab0 72 65 61 74 65 29 3b 0a 20 20 20 20 20 20 20 20  reate);.        
32ac0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 73 43 74  sqlite3_free(sCt
32ad0 78 2e 7a 29 3b 0a 20 20 20 20 20 20 20 20 78 43  x.z);.        xC
32ae0 6c 6f 73 65 72 28 73 43 74 78 2e 69 6e 29 3b 0a  loser(sCtx.in);.
32af0 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69          utf8_pri
32b00 6e 74 66 28 73 74 64 65 72 72 2c 22 25 73 3a 20  ntf(stderr,"%s: 
32b10 65 6d 70 74 79 20 66 69 6c 65 5c 6e 22 2c 20 73  empty file\n", s
32b20 43 74 78 2e 7a 46 69 6c 65 29 3b 0a 20 20 20 20  Ctx.zFile);.    
32b30 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
32b40 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 43 72 65      }.      zCre
32b50 61 74 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  ate = sqlite3_mp
32b60 72 69 6e 74 66 28 22 25 7a 5c 6e 29 22 2c 20 7a  rintf("%z\n)", z
32b70 43 72 65 61 74 65 29 3b 0a 20 20 20 20 20 20 72  Create);.      r
32b80 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63  c = sqlite3_exec
32b90 28 70 2d 3e 64 62 2c 20 7a 43 72 65 61 74 65 2c  (p->db, zCreate,
32ba0 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20   0, 0, 0);.     
32bb0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43   sqlite3_free(zC
32bc0 72 65 61 74 65 29 3b 0a 20 20 20 20 20 20 69 66  reate);.      if
32bd0 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
32be0 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65  utf8_printf(stde
32bf0 72 72 2c 20 22 43 52 45 41 54 45 20 54 41 42 4c  rr, "CREATE TABL
32c00 45 20 25 73 28 2e 2e 2e 29 20 66 61 69 6c 65 64  E %s(...) failed
32c10 3a 20 25 73 5c 6e 22 2c 20 7a 54 61 62 6c 65 2c  : %s\n", zTable,
32c20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
32c30 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
32c40 70 2d 3e 64 62 29 29 3b 0a 20 20 20 20 20 20 20  p->db));.       
32c50 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 73 43   sqlite3_free(sC
32c60 74 78 2e 7a 29 3b 0a 20 20 20 20 20 20 20 20 78  tx.z);.        x
32c70 43 6c 6f 73 65 72 28 73 43 74 78 2e 69 6e 29 3b  Closer(sCtx.in);
32c80 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
32c90 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  1;.      }.     
32ca0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72   rc = sqlite3_pr
32cb0 65 70 61 72 65 5f 76 32 28 70 2d 3e 64 62 2c 20  epare_v2(p->db, 
32cc0 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74  zSql, -1, &pStmt
32cd0 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 0);.    }.    
32ce0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71  sqlite3_free(zSq
32cf0 6c 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  l);.    if( rc )
32d00 7b 0a 20 20 20 20 20 20 69 66 20 28 70 53 74 6d  {.      if (pStm
32d10 74 29 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c  t) sqlite3_final
32d20 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20  ize(pStmt);.    
32d30 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74    utf8_printf(st
32d40 64 65 72 72 2c 22 45 72 72 6f 72 3a 20 25 73 5c  derr,"Error: %s\
32d50 6e 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d  n", sqlite3_errm
32d60 73 67 28 70 2d 3e 64 62 29 29 3b 0a 20 20 20 20  sg(p->db));.    
32d70 20 20 78 43 6c 6f 73 65 72 28 73 43 74 78 2e 69    xCloser(sCtx.i
32d80 6e 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  n);.      return
32d90 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 43   1;.    }.    nC
32da0 6f 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  ol = sqlite3_col
32db0 75 6d 6e 5f 63 6f 75 6e 74 28 70 53 74 6d 74 29  umn_count(pStmt)
32dc0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69  ;.    sqlite3_fi
32dd0 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20  nalize(pStmt);. 
32de0 20 20 20 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20     pStmt = 0;.  
32df0 20 20 69 66 28 20 6e 43 6f 6c 3d 3d 30 20 29 20    if( nCol==0 ) 
32e00 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20 6e 6f 20  return 0; /* no 
32e10 63 6f 6c 75 6d 6e 73 2c 20 6e 6f 20 65 72 72 6f  columns, no erro
32e20 72 20 2a 2f 0a 20 20 20 20 7a 53 71 6c 20 3d 20  r */.    zSql = 
32e30 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34  sqlite3_malloc64
32e40 28 20 6e 42 79 74 65 2a 32 20 2b 20 32 30 20 2b  ( nByte*2 + 20 +
32e50 20 6e 43 6f 6c 2a 32 20 29 3b 0a 20 20 20 20 69   nCol*2 );.    i
32e60 66 28 20 7a 53 71 6c 3d 3d 30 20 29 7b 0a 20 20  f( zSql==0 ){.  
32e70 20 20 20 20 78 43 6c 6f 73 65 72 28 73 43 74 78      xCloser(sCtx
32e80 2e 69 6e 29 3b 0a 20 20 20 20 20 20 73 68 65 6c  .in);.      shel
32e90 6c 5f 6f 75 74 5f 6f 66 5f 6d 65 6d 6f 72 79 28  l_out_of_memory(
32ea0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
32eb0 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 42  ite3_snprintf(nB
32ec0 79 74 65 2b 32 30 2c 20 7a 53 71 6c 2c 20 22 49  yte+20, zSql, "I
32ed0 4e 53 45 52 54 20 49 4e 54 4f 20 5c 22 25 77 5c  NSERT INTO \"%w\
32ee0 22 20 56 41 4c 55 45 53 28 3f 22 2c 20 7a 54 61  " VALUES(?", zTa
32ef0 62 6c 65 29 3b 0a 20 20 20 20 6a 20 3d 20 73 74  ble);.    j = st
32f00 72 6c 65 6e 33 30 28 7a 53 71 6c 29 3b 0a 20 20  rlen30(zSql);.  
32f10 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 43 6f    for(i=1; i<nCo
32f20 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 7a  l; i++){.      z
32f30 53 71 6c 5b 6a 2b 2b 5d 20 3d 20 27 2c 27 3b 0a  Sql[j++] = ',';.
32f40 20 20 20 20 20 20 7a 53 71 6c 5b 6a 2b 2b 5d 20        zSql[j++] 
32f50 3d 20 27 3f 27 3b 0a 20 20 20 20 7d 0a 20 20 20  = '?';.    }.   
32f60 20 7a 53 71 6c 5b 6a 2b 2b 5d 20 3d 20 27 29 27   zSql[j++] = ')'
32f70 3b 0a 20 20 20 20 7a 53 71 6c 5b 6a 5d 20 3d 20  ;.    zSql[j] = 
32f80 30 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  0;.    rc = sqli
32f90 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 70  te3_prepare_v2(p
32fa0 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20  ->db, zSql, -1, 
32fb0 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20  &pStmt, 0);.    
32fc0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71  sqlite3_free(zSq
32fd0 6c 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  l);.    if( rc )
32fe0 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69  {.      utf8_pri
32ff0 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72  ntf(stderr, "Err
33000 6f 72 3a 20 25 73 5c 6e 22 2c 20 73 71 6c 69 74  or: %s\n", sqlit
33010 65 33 5f 65 72 72 6d 73 67 28 70 2d 3e 64 62 29  e3_errmsg(p->db)
33020 29 3b 0a 20 20 20 20 20 20 69 66 20 28 70 53 74  );.      if (pSt
33030 6d 74 29 20 73 71 6c 69 74 65 33 5f 66 69 6e 61  mt) sqlite3_fina
33040 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20  lize(pStmt);.   
33050 20 20 20 78 43 6c 6f 73 65 72 28 73 43 74 78 2e     xCloser(sCtx.
33060 69 6e 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  in);.      retur
33070 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e  n 1;.    }.    n
33080 65 65 64 43 6f 6d 6d 69 74 20 3d 20 73 71 6c 69  eedCommit = sqli
33090 74 65 33 5f 67 65 74 5f 61 75 74 6f 63 6f 6d 6d  te3_get_autocomm
330a0 69 74 28 70 2d 3e 64 62 29 3b 0a 20 20 20 20 69  it(p->db);.    i
330b0 66 28 20 6e 65 65 64 43 6f 6d 6d 69 74 20 29 20  f( needCommit ) 
330c0 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e  sqlite3_exec(p->
330d0 64 62 2c 20 22 42 45 47 49 4e 22 2c 20 30 2c 20  db, "BEGIN", 0, 
330e0 30 2c 20 30 29 3b 0a 20 20 20 20 64 6f 7b 0a 20  0, 0);.    do{. 
330f0 20 20 20 20 20 69 6e 74 20 73 74 61 72 74 4c 69       int startLi
33100 6e 65 20 3d 20 73 43 74 78 2e 6e 4c 69 6e 65 3b  ne = sCtx.nLine;
33110 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
33120 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  i<nCol; i++){.  
33130 20 20 20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20        char *z = 
33140 78 52 65 61 64 28 26 73 43 74 78 29 3b 0a 20 20  xRead(&sCtx);.  
33150 20 20 20 20 20 20 2f 2a 0a 20 20 20 20 20 20 20        /*.       
33160 20 2a 2a 20 44 69 64 20 77 65 20 72 65 61 63 68   ** Did we reach
33170 20 65 6e 64 2d 6f 66 2d 66 69 6c 65 20 62 65 66   end-of-file bef
33180 6f 72 65 20 66 69 6e 64 69 6e 67 20 61 6e 79 20  ore finding any 
33190 63 6f 6c 75 6d 6e 73 3f 0a 20 20 20 20 20 20 20  columns?.       
331a0 20 2a 2a 20 49 66 20 73 6f 2c 20 73 74 6f 70 20   ** If so, stop 
331b0 69 6e 73 74 65 61 64 20 6f 66 20 4e 55 4c 4c 20  instead of NULL 
331c0 66 69 6c 6c 69 6e 67 20 74 68 65 20 72 65 6d 61  filling the rema
331d0 69 6e 69 6e 67 20 63 6f 6c 75 6d 6e 73 2e 0a 20  ining columns.. 
331e0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
331f0 20 20 69 66 28 20 7a 3d 3d 30 20 26 26 20 69 3d    if( z==0 && i=
33200 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
33210 20 20 20 20 2f 2a 0a 20 20 20 20 20 20 20 20 2a      /*.        *
33220 2a 20 44 69 64 20 77 65 20 72 65 61 63 68 20 65  * Did we reach e
33230 6e 64 2d 6f 66 2d 66 69 6c 65 20 4f 52 20 65 6e  nd-of-file OR en
33240 64 2d 6f 66 2d 6c 69 6e 65 20 62 65 66 6f 72 65  d-of-line before
33250 20 66 69 6e 64 69 6e 67 20 61 6e 79 0a 20 20 20   finding any.   
33260 20 20 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 73 20       ** columns 
33270 69 6e 20 41 53 43 49 49 20 6d 6f 64 65 3f 20 20  in ASCII mode?  
33280 49 66 20 73 6f 2c 20 73 74 6f 70 20 69 6e 73 74  If so, stop inst
33290 65 61 64 20 6f 66 20 4e 55 4c 4c 20 66 69 6c 6c  ead of NULL fill
332a0 69 6e 67 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  ing.        ** t
332b0 68 65 20 72 65 6d 61 69 6e 69 6e 67 20 63 6f 6c  he remaining col
332c0 75 6d 6e 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f  umns..        */
332d0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e  .        if( p->
332e0 6d 6f 64 65 3d 3d 4d 4f 44 45 5f 41 73 63 69 69  mode==MODE_Ascii
332f0 20 26 26 20 28 7a 3d 3d 30 20 7c 7c 20 7a 5b 30   && (z==0 || z[0
33300 5d 3d 3d 30 29 20 26 26 20 69 3d 3d 30 20 29 20  ]==0) && i==0 ) 
33310 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 73  break;.        s
33320 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74  qlite3_bind_text
33330 28 70 53 74 6d 74 2c 20 69 2b 31 2c 20 7a 2c 20  (pStmt, i+1, z, 
33340 2d 31 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53  -1, SQLITE_TRANS
33350 49 45 4e 54 29 3b 0a 20 20 20 20 20 20 20 20 69  IENT);.        i
33360 66 28 20 69 3c 6e 43 6f 6c 2d 31 20 26 26 20 73  f( i<nCol-1 && s
33370 43 74 78 2e 63 54 65 72 6d 21 3d 73 43 74 78 2e  Ctx.cTerm!=sCtx.
33380 63 43 6f 6c 53 65 70 20 29 7b 0a 20 20 20 20 20  cColSep ){.     
33390 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
333a0 28 73 74 64 65 72 72 2c 20 22 25 73 3a 25 64 3a  (stderr, "%s:%d:
333b0 20 65 78 70 65 63 74 65 64 20 25 64 20 63 6f 6c   expected %d col
333c0 75 6d 6e 73 20 62 75 74 20 66 6f 75 6e 64 20 25  umns but found %
333d0 64 20 2d 20 22 0a 20 20 20 20 20 20 20 20 20 20  d - ".          
333e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
333f0 22 66 69 6c 6c 69 6e 67 20 74 68 65 20 72 65 73  "filling the res
33400 74 20 77 69 74 68 20 4e 55 4c 4c 5c 6e 22 2c 0a  t with NULL\n",.
33410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33420 20 20 20 20 20 20 20 20 20 20 73 43 74 78 2e 7a            sCtx.z
33430 46 69 6c 65 2c 20 73 74 61 72 74 4c 69 6e 65 2c  File, startLine,
33440 20 6e 43 6f 6c 2c 20 69 2b 31 29 3b 0a 20 20 20   nCol, i+1);.   
33450 20 20 20 20 20 20 20 69 20 2b 3d 20 32 3b 0a 20         i += 2;. 
33460 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20           while( 
33470 69 3c 3d 6e 43 6f 6c 20 29 7b 20 73 71 6c 69 74  i<=nCol ){ sqlit
33480 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c 28 70 53 74  e3_bind_null(pSt
33490 6d 74 2c 20 69 29 3b 20 69 2b 2b 3b 20 7d 0a 20  mt, i); i++; }. 
334a0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
334b0 0a 20 20 20 20 20 20 69 66 28 20 73 43 74 78 2e  .      if( sCtx.
334c0 63 54 65 72 6d 3d 3d 73 43 74 78 2e 63 43 6f 6c  cTerm==sCtx.cCol
334d0 53 65 70 20 29 7b 0a 20 20 20 20 20 20 20 20 64  Sep ){.        d
334e0 6f 7b 0a 20 20 20 20 20 20 20 20 20 20 78 52 65  o{.          xRe
334f0 61 64 28 26 73 43 74 78 29 3b 0a 20 20 20 20 20  ad(&sCtx);.     
33500 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20       i++;.      
33510 20 20 7d 77 68 69 6c 65 28 20 73 43 74 78 2e 63    }while( sCtx.c
33520 54 65 72 6d 3d 3d 73 43 74 78 2e 63 43 6f 6c 53  Term==sCtx.cColS
33530 65 70 20 29 3b 0a 20 20 20 20 20 20 20 20 75 74  ep );.        ut
33540 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  f8_printf(stderr
33550 2c 20 22 25 73 3a 25 64 3a 20 65 78 70 65 63 74  , "%s:%d: expect
33560 65 64 20 25 64 20 63 6f 6c 75 6d 6e 73 20 62 75  ed %d columns bu
33570 74 20 66 6f 75 6e 64 20 25 64 20 2d 20 22 0a 20  t found %d - ". 
33580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33590 20 20 20 20 20 20 20 22 65 78 74 72 61 73 20 69         "extras i
335a0 67 6e 6f 72 65 64 5c 6e 22 2c 0a 20 20 20 20 20  gnored\n",.     
335b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
335c0 20 20 20 73 43 74 78 2e 7a 46 69 6c 65 2c 20 73     sCtx.zFile, s
335d0 74 61 72 74 4c 69 6e 65 2c 20 6e 43 6f 6c 2c 20  tartLine, nCol, 
335e0 69 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  i);.      }.    
335f0 20 20 69 66 28 20 69 3e 3d 6e 43 6f 6c 20 29 7b    if( i>=nCol ){
33600 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
33610 5f 73 74 65 70 28 70 53 74 6d 74 29 3b 0a 20 20  _step(pStmt);.  
33620 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
33630 65 33 5f 72 65 73 65 74 28 70 53 74 6d 74 29 3b  e3_reset(pStmt);
33640 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
33650 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
33660 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69          utf8_pri
33670 6e 74 66 28 73 74 64 65 72 72 2c 20 22 25 73 3a  ntf(stderr, "%s:
33680 25 64 3a 20 49 4e 53 45 52 54 20 66 61 69 6c 65  %d: INSERT faile
33690 64 3a 20 25 73 5c 6e 22 2c 20 73 43 74 78 2e 7a  d: %s\n", sCtx.z
336a0 46 69 6c 65 2c 0a 20 20 20 20 20 20 20 20 20 20  File,.          
336b0 20 20 20 20 20 20 20 20 20 20 20 20 73 74 61 72              star
336c0 74 4c 69 6e 65 2c 20 73 71 6c 69 74 65 33 5f 65  tLine, sqlite3_e
336d0 72 72 6d 73 67 28 70 2d 3e 64 62 29 29 3b 0a 20  rrmsg(p->db));. 
336e0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
336f0 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 73 43 74  .    }while( sCt
33700 78 2e 63 54 65 72 6d 21 3d 45 4f 46 20 29 3b 0a  x.cTerm!=EOF );.
33710 0a 20 20 20 20 78 43 6c 6f 73 65 72 28 73 43 74  .    xCloser(sCt
33720 78 2e 69 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74  x.in);.    sqlit
33730 65 33 5f 66 72 65 65 28 73 43 74 78 2e 7a 29 3b  e3_free(sCtx.z);
33740 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e  .    sqlite3_fin
33750 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20  alize(pStmt);.  
33760 20 20 69 66 28 20 6e 65 65 64 43 6f 6d 6d 69 74    if( needCommit
33770 20 29 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28   ) sqlite3_exec(
33780 70 2d 3e 64 62 2c 20 22 43 4f 4d 4d 49 54 22 2c  p->db, "COMMIT",
33790 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 65 6c   0, 0, 0);.  }el
337a0 73 65 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  se..#ifndef SQLI
337b0 54 45 5f 55 4e 54 45 53 54 41 42 4c 45 0a 20 20  TE_UNTESTABLE.  
337c0 69 66 28 20 63 3d 3d 27 69 27 20 26 26 20 73 74  if( c=='i' && st
337d0 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20  rncmp(azArg[0], 
337e0 22 69 6d 70 6f 73 74 65 72 22 2c 20 6e 29 3d 3d  "imposter", n)==
337f0 30 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  0 ){.    char *z
33800 53 71 6c 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a  Sql;.    char *z
33810 43 6f 6c 6c 69 73 74 20 3d 20 30 3b 0a 20 20 20  Collist = 0;.   
33820 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
33830 53 74 6d 74 3b 0a 20 20 20 20 69 6e 74 20 74 6e  Stmt;.    int tn
33840 75 6d 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20  um = 0;.    int 
33850 69 3b 0a 20 20 20 20 69 66 28 20 21 28 6e 41 72  i;.    if( !(nAr
33860 67 3d 3d 33 20 7c 7c 20 28 6e 41 72 67 3d 3d 32  g==3 || (nArg==2
33870 20 26 26 20 73 71 6c 69 74 65 33 5f 73 74 72 69   && sqlite3_stri
33880 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 22 6f 66  cmp(azArg[1],"of
33890 66 22 29 3d 3d 30 29 29 20 29 7b 0a 20 20 20 20  f")==0)) ){.    
338a0 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74    utf8_printf(st
338b0 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 69  derr, "Usage: .i
338c0 6d 70 6f 73 74 65 72 20 49 4e 44 45 58 20 49 4d  mposter INDEX IM
338d0 50 4f 53 54 45 52 5c 6e 22 0a 20 20 20 20 20 20  POSTER\n".      
338e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
338f0 20 20 20 20 22 20 20 20 20 20 20 20 2e 69 6d 70      "       .imp
33900 6f 73 74 65 72 20 6f 66 66 5c 6e 22 29 3b 0a 20  oster off\n");. 
33910 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20       rc = 1;.   
33920 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d     goto meta_com
33930 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20 7d  mand_exit;.    }
33940 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28 70 2c 20  .    open_db(p, 
33950 30 29 3b 0a 20 20 20 20 69 66 28 20 6e 41 72 67  0);.    if( nArg
33960 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==2 ){.      sql
33970 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f  ite3_test_contro
33980 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  l(SQLITE_TESTCTR
33990 4c 5f 49 4d 50 4f 53 54 45 52 2c 20 70 2d 3e 64  L_IMPOSTER, p->d
339a0 62 2c 20 22 6d 61 69 6e 22 2c 20 30 2c 20 31 29  b, "main", 0, 1)
339b0 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 65 74  ;.      goto met
339c0 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a  a_command_exit;.
339d0 20 20 20 20 7d 0a 20 20 20 20 7a 53 71 6c 20 3d      }.    zSql =
339e0 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
339f0 28 22 53 45 4c 45 43 54 20 72 6f 6f 74 70 61 67  ("SELECT rootpag
33a00 65 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61  e FROM sqlite_ma
33a10 73 74 65 72 22 0a 20 20 20 20 20 20 20 20 20 20  ster".          
33a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33a30 20 22 20 57 48 45 52 45 20 6e 61 6d 65 3d 27 25   " WHERE name='%
33a40 71 27 20 41 4e 44 20 74 79 70 65 3d 27 69 6e 64  q' AND type='ind
33a50 65 78 27 22 2c 20 61 7a 41 72 67 5b 31 5d 29 3b  ex'", azArg[1]);
33a60 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 70 72 65  .    sqlite3_pre
33a70 70 61 72 65 5f 76 32 28 70 2d 3e 64 62 2c 20 7a  pare_v2(p->db, z
33a80 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c  Sql, -1, &pStmt,
33a90 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
33aa0 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20  _free(zSql);.   
33ab0 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74 65   if( sqlite3_ste
33ac0 70 28 70 53 74 6d 74 29 3d 3d 53 51 4c 49 54 45  p(pStmt)==SQLITE
33ad0 5f 52 4f 57 20 29 7b 0a 20 20 20 20 20 20 74 6e  _ROW ){.      tn
33ae0 75 6d 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  um = sqlite3_col
33af0 75 6d 6e 5f 69 6e 74 28 70 53 74 6d 74 2c 20 30  umn_int(pStmt, 0
33b00 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
33b10 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53  ite3_finalize(pS
33b20 74 6d 74 29 3b 0a 20 20 20 20 69 66 28 20 74 6e  tmt);.    if( tn
33b30 75 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 75  um==0 ){.      u
33b40 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72  tf8_printf(stder
33b50 72 2c 20 22 6e 6f 20 73 75 63 68 20 69 6e 64 65  r, "no such inde
33b60 78 3a 20 5c 22 25 73 5c 22 5c 6e 22 2c 20 61 7a  x: \"%s\"\n", az
33b70 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20 20 20 72  Arg[1]);.      r
33b80 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 67 6f 74  c = 1;.      got
33b90 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65  o meta_command_e
33ba0 78 69 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a  xit;.    }.    z
33bb0 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  Sql = sqlite3_mp
33bc0 72 69 6e 74 66 28 22 50 52 41 47 4d 41 20 69 6e  rintf("PRAGMA in
33bd0 64 65 78 5f 78 69 6e 66 6f 3d 27 25 71 27 22 2c  dex_xinfo='%q'",
33be0 20 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20   azArg[1]);.    
33bf0 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65  rc = sqlite3_pre
33c00 70 61 72 65 5f 76 32 28 70 2d 3e 64 62 2c 20 7a  pare_v2(p->db, z
33c10 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c  Sql, -1, &pStmt,
33c20 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
33c30 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20  _free(zSql);.   
33c40 20 69 20 3d 20 30 3b 0a 20 20 20 20 77 68 69 6c   i = 0;.    whil
33c50 65 28 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28  e( sqlite3_step(
33c60 70 53 74 6d 74 29 3d 3d 53 51 4c 49 54 45 5f 52  pStmt)==SQLITE_R
33c70 4f 57 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72  OW ){.      char
33c80 20 7a 4c 61 62 65 6c 5b 32 30 5d 3b 0a 20 20 20   zLabel[20];.   
33c90 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
33ca0 43 6f 6c 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  Col = (const cha
33cb0 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  r*)sqlite3_colum
33cc0 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 32 29 3b  n_text(pStmt,2);
33cd0 0a 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20  .      i++;.    
33ce0 20 20 69 66 28 20 7a 43 6f 6c 3d 3d 30 20 29 7b    if( zCol==0 ){
33cf0 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c  .        if( sql
33d00 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28  ite3_column_int(
33d10 70 53 74 6d 74 2c 31 29 3d 3d 2d 31 20 29 7b 0a  pStmt,1)==-1 ){.
33d20 20 20 20 20 20 20 20 20 20 20 7a 43 6f 6c 20 3d            zCol =
33d30 20 22 5f 52 4f 57 49 44 5f 22 3b 0a 20 20 20 20   "_ROWID_";.    
33d40 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
33d50 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
33d60 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 4c 61  rintf(sizeof(zLa
33d70 62 65 6c 29 2c 7a 4c 61 62 65 6c 2c 22 65 78 70  bel),zLabel,"exp
33d80 72 25 64 22 2c 69 29 3b 0a 20 20 20 20 20 20 20  r%d",i);.       
33d90 20 20 20 7a 43 6f 6c 20 3d 20 7a 4c 61 62 65 6c     zCol = zLabel
33da0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
33db0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 7a 43    }.      if( zC
33dc0 6f 6c 6c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20  ollist==0 ){.   
33dd0 20 20 20 20 20 7a 43 6f 6c 6c 69 73 74 20 3d 20       zCollist = 
33de0 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
33df0 22 5c 22 25 77 5c 22 22 2c 20 7a 43 6f 6c 29 3b  "\"%w\"", zCol);
33e00 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
33e10 20 20 20 20 20 20 7a 43 6f 6c 6c 69 73 74 20 3d        zCollist =
33e20 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
33e30 28 22 25 7a 2c 5c 22 25 77 5c 22 22 2c 20 7a 43  ("%z,\"%w\"", zC
33e40 6f 6c 6c 69 73 74 2c 20 7a 43 6f 6c 29 3b 0a 20  ollist, zCol);. 
33e50 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
33e60 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
33e70 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 7a 53  e(pStmt);.    zS
33e80 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  ql = sqlite3_mpr
33e90 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20 20 20  intf(.          
33ea0 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 5c 22  "CREATE TABLE \"
33eb0 25 77 5c 22 28 25 73 2c 50 52 49 4d 41 52 59 20  %w\"(%s,PRIMARY 
33ec0 4b 45 59 28 25 73 29 29 57 49 54 48 4f 55 54 20  KEY(%s))WITHOUT 
33ed0 52 4f 57 49 44 22 2c 0a 20 20 20 20 20 20 20 20  ROWID",.        
33ee0 20 20 61 7a 41 72 67 5b 32 5d 2c 20 7a 43 6f 6c    azArg[2], zCol
33ef0 6c 69 73 74 2c 20 7a 43 6f 6c 6c 69 73 74 29 3b  list, zCollist);
33f00 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
33f10 65 28 7a 43 6f 6c 6c 69 73 74 29 3b 0a 20 20 20  e(zCollist);.   
33f20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 74 65   rc = sqlite3_te
33f30 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54  st_control(SQLIT
33f40 45 5f 54 45 53 54 43 54 52 4c 5f 49 4d 50 4f 53  E_TESTCTRL_IMPOS
33f50 54 45 52 2c 20 70 2d 3e 64 62 2c 20 22 6d 61 69  TER, p->db, "mai
33f60 6e 22 2c 20 31 2c 20 74 6e 75 6d 29 3b 0a 20 20  n", 1, tnum);.  
33f70 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
33f80 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  _OK ){.      rc 
33f90 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70  = sqlite3_exec(p
33fa0 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 30 2c 20 30  ->db, zSql, 0, 0
33fb0 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
33fc0 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c  te3_test_control
33fd0 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c  (SQLITE_TESTCTRL
33fe0 5f 49 4d 50 4f 53 54 45 52 2c 20 70 2d 3e 64 62  _IMPOSTER, p->db
33ff0 2c 20 22 6d 61 69 6e 22 2c 20 30 2c 20 30 29 3b  , "main", 0, 0);
34000 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b  .      if( rc ){
34010 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72  .        utf8_pr
34020 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72  intf(stderr, "Er
34030 72 6f 72 20 69 6e 20 5b 25 73 5d 3a 20 25 73 5c  ror in [%s]: %s\
34040 6e 22 2c 20 7a 53 71 6c 2c 20 73 71 6c 69 74 65  n", zSql, sqlite
34050 33 5f 65 72 72 6d 73 67 28 70 2d 3e 64 62 29 29  3_errmsg(p->db))
34060 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
34070 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e         utf8_prin
34080 74 66 28 73 74 64 6f 75 74 2c 20 22 25 73 3b 5c  tf(stdout, "%s;\
34090 6e 22 2c 20 7a 53 71 6c 29 3b 0a 20 20 20 20 20  n", zSql);.     
340a0 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74     raw_printf(st
340b0 64 6f 75 74 2c 0a 20 20 20 20 20 20 20 20 20 20  dout,.          
340c0 20 22 57 41 52 4e 49 4e 47 3a 20 77 72 69 74 69   "WARNING: writi
340d0 6e 67 20 74 6f 20 61 6e 20 69 6d 70 6f 73 74 65  ng to an imposte
340e0 72 20 74 61 62 6c 65 20 77 69 6c 6c 20 63 6f 72  r table will cor
340f0 72 75 70 74 20 74 68 65 20 69 6e 64 65 78 21 5c  rupt the index!\
34100 6e 22 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20  n".        );.  
34110 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
34120 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74  .      raw_print
34130 66 28 73 74 64 65 72 72 2c 20 22 53 51 4c 49 54  f(stderr, "SQLIT
34140 45 5f 54 45 53 54 43 54 52 4c 5f 49 4d 50 4f 53  E_TESTCTRL_IMPOS
34150 54 45 52 20 72 65 74 75 72 6e 73 20 25 64 5c 6e  TER returns %d\n
34160 22 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 72 63  ", rc);.      rc
34170 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 1;.    }.    
34180 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71  sqlite3_free(zSq
34190 6c 29 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64  l);.  }else.#end
341a0 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53  if /* !defined(S
341b0 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 45 53 54 5f  QLITE_OMIT_TEST_
341c0 43 4f 4e 54 52 4f 4c 29 20 2a 2f 0a 0a 23 69 66  CONTROL) */..#if
341d0 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
341e0 45 5f 49 4f 54 52 41 43 45 0a 20 20 69 66 28 20  E_IOTRACE.  if( 
341f0 63 3d 3d 27 69 27 20 26 26 20 73 74 72 6e 63 6d  c=='i' && strncm
34200 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 69 6f 74  p(azArg[0], "iot
34210 72 61 63 65 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a  race", n)==0 ){.
34220 20 20 20 20 53 51 4c 49 54 45 5f 41 50 49 20 65      SQLITE_API e
34230 78 74 65 72 6e 20 76 6f 69 64 20 28 53 51 4c 49  xtern void (SQLI
34240 54 45 5f 43 44 45 43 4c 20 2a 73 71 6c 69 74 65  TE_CDECL *sqlite
34250 33 49 6f 54 72 61 63 65 29 28 63 6f 6e 73 74 20  3IoTrace)(const 
34260 63 68 61 72 2a 2c 20 2e 2e 2e 29 3b 0a 20 20 20  char*, ...);.   
34270 20 69 66 28 20 69 6f 74 72 61 63 65 20 26 26 20   if( iotrace && 
34280 69 6f 74 72 61 63 65 21 3d 73 74 64 6f 75 74 20  iotrace!=stdout 
34290 29 20 66 63 6c 6f 73 65 28 69 6f 74 72 61 63 65  ) fclose(iotrace
342a0 29 3b 0a 20 20 20 20 69 6f 74 72 61 63 65 20 3d  );.    iotrace =
342b0 20 30 3b 0a 20 20 20 20 69 66 28 20 6e 41 72 67   0;.    if( nArg
342c0 3c 32 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  <2 ){.      sqli
342d0 74 65 33 49 6f 54 72 61 63 65 20 3d 20 30 3b 0a  te3IoTrace = 0;.
342e0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74      }else if( st
342f0 72 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 20 22  rcmp(azArg[1], "
34300 2d 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  -")==0 ){.      
34310 73 71 6c 69 74 65 33 49 6f 54 72 61 63 65 20 3d  sqlite3IoTrace =
34320 20 69 6f 74 72 61 63 65 50 72 69 6e 74 66 3b 0a   iotracePrintf;.
34330 20 20 20 20 20 20 69 6f 74 72 61 63 65 20 3d 20        iotrace = 
34340 73 74 64 6f 75 74 3b 0a 20 20 20 20 7d 65 6c 73  stdout;.    }els
34350 65 7b 0a 20 20 20 20 20 20 69 6f 74 72 61 63 65  e{.      iotrace
34360 20 3d 20 66 6f 70 65 6e 28 61 7a 41 72 67 5b 31   = fopen(azArg[1
34370 5d 2c 20 22 77 22 29 3b 0a 20 20 20 20 20 20 69  ], "w");.      i
34380 66 28 20 69 6f 74 72 61 63 65 3d 3d 30 20 29 7b  f( iotrace==0 ){
34390 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72  .        utf8_pr
343a0 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72  intf(stderr, "Er
343b0 72 6f 72 3a 20 63 61 6e 6e 6f 74 20 6f 70 65 6e  ror: cannot open
343c0 20 5c 22 25 73 5c 22 5c 6e 22 2c 20 61 7a 41 72   \"%s\"\n", azAr
343d0 67 5b 31 5d 29 3b 0a 20 20 20 20 20 20 20 20 73  g[1]);.        s
343e0 71 6c 69 74 65 33 49 6f 54 72 61 63 65 20 3d 20  qlite3IoTrace = 
343f0 30 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  0;.        rc = 
34400 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  1;.      }else{.
34410 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 49          sqlite3I
34420 6f 54 72 61 63 65 20 3d 20 69 6f 74 72 61 63 65  oTrace = iotrace
34430 50 72 69 6e 74 66 3b 0a 20 20 20 20 20 20 7d 0a  Printf;.      }.
34440 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 23 65      }.  }else.#e
34450 6e 64 69 66 0a 0a 20 20 69 66 28 20 63 3d 3d 27  ndif..  if( c=='
34460 6c 27 20 26 26 20 6e 3e 3d 35 20 26 26 20 73 74  l' && n>=5 && st
34470 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20  rncmp(azArg[0], 
34480 22 6c 69 6d 69 74 73 22 2c 20 6e 29 3d 3d 30 20  "limits", n)==0 
34490 29 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f  ){.    static co
344a0 6e 73 74 20 73 74 72 75 63 74 20 7b 0a 20 20 20  nst struct {.   
344b0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
344c0 7a 4c 69 6d 69 74 4e 61 6d 65 3b 20 20 20 2f 2a  zLimitName;   /*
344d0 20 4e 61 6d 65 20 6f 66 20 61 20 6c 69 6d 69 74   Name of a limit
344e0 20 2a 2f 0a 20 20 20 20 20 20 20 69 6e 74 20 6c   */.       int l
344f0 69 6d 69 74 43 6f 64 65 3b 20 20 20 20 20 20 20  imitCode;       
34500 20 20 20 20 20 2f 2a 20 49 6e 74 65 67 65 72 20       /* Integer 
34510 63 6f 64 65 20 66 6f 72 20 74 68 61 74 20 6c 69  code for that li
34520 6d 69 74 20 2a 2f 0a 20 20 20 20 7d 20 61 4c 69  mit */.    } aLi
34530 6d 69 74 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20  mit[] = {.      
34540 7b 20 22 6c 65 6e 67 74 68 22 2c 20 20 20 20 20  { "length",     
34550 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
34560 45 5f 4c 49 4d 49 54 5f 4c 45 4e 47 54 48 20 20  E_LIMIT_LENGTH  
34570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34580 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 73 71    },.      { "sq
34590 6c 5f 6c 65 6e 67 74 68 22 2c 20 20 20 20 20 20  l_length",      
345a0 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d        SQLITE_LIM
345b0 49 54 5f 53 51 4c 5f 4c 45 4e 47 54 48 20 20 20  IT_SQL_LENGTH   
345c0 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
345d0 20 20 20 20 20 20 7b 20 22 63 6f 6c 75 6d 6e 22        { "column"
345e0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
345f0 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f   SQLITE_LIMIT_CO
34600 4c 55 4d 4e 20 20 20 20 20 20 20 20 20 20 20 20  LUMN            
34610 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20          },.     
34620 20 7b 20 22 65 78 70 72 5f 64 65 70 74 68 22 2c   { "expr_depth",
34630 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
34640 54 45 5f 4c 49 4d 49 54 5f 45 58 50 52 5f 44 45  TE_LIMIT_EXPR_DE
34650 50 54 48 20 20 20 20 20 20 20 20 20 20 20 20 20  PTH             
34660 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 63     },.      { "c
34670 6f 6d 70 6f 75 6e 64 5f 73 65 6c 65 63 74 22 2c  ompound_select",
34680 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4c 49         SQLITE_LI
34690 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c  MIT_COMPOUND_SEL
346a0 45 43 54 20 20 20 20 20 20 20 20 20 20 20 7d 2c  ECT           },
346b0 0a 20 20 20 20 20 20 7b 20 22 76 64 62 65 5f 6f  .      { "vdbe_o
346c0 70 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  p",             
346d0 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56    SQLITE_LIMIT_V
346e0 44 42 45 5f 4f 50 20 20 20 20 20 20 20 20 20 20  DBE_OP          
346f0 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
34700 20 20 7b 20 22 66 75 6e 63 74 69 6f 6e 5f 61 72    { "function_ar
34710 67 22 2c 20 20 20 20 20 20 20 20 20 20 53 51 4c  g",          SQL
34720 49 54 45 5f 4c 49 4d 49 54 5f 46 55 4e 43 54 49  ITE_LIMIT_FUNCTI
34730 4f 4e 5f 41 52 47 20 20 20 20 20 20 20 20 20 20  ON_ARG          
34740 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22      },.      { "
34750 61 74 74 61 63 68 65 64 22 2c 20 20 20 20 20 20  attached",      
34760 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4c          SQLITE_L
34770 49 4d 49 54 5f 41 54 54 41 43 48 45 44 20 20 20  IMIT_ATTACHED   
34780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
34790 2c 0a 20 20 20 20 20 20 7b 20 22 6c 69 6b 65 5f  ,.      { "like_
347a0 70 61 74 74 65 72 6e 5f 6c 65 6e 67 74 68 22 2c  pattern_length",
347b0 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f     SQLITE_LIMIT_
347c0 4c 49 4b 45 5f 50 41 54 54 45 52 4e 5f 4c 45 4e  LIKE_PATTERN_LEN
347d0 47 54 48 20 20 20 20 20 20 20 7d 2c 0a 20 20 20  GTH       },.   
347e0 20 20 20 7b 20 22 76 61 72 69 61 62 6c 65 5f 6e     { "variable_n
347f0 75 6d 62 65 72 22 2c 20 20 20 20 20 20 20 53 51  umber",       SQ
34800 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41  LITE_LIMIT_VARIA
34810 42 4c 45 5f 4e 55 4d 42 45 52 20 20 20 20 20 20  BLE_NUMBER      
34820 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20       },.      { 
34830 22 74 72 69 67 67 65 72 5f 64 65 70 74 68 22 2c  "trigger_depth",
34840 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
34850 4c 49 4d 49 54 5f 54 52 49 47 47 45 52 5f 44 45  LIMIT_TRIGGER_DE
34860 50 54 48 20 20 20 20 20 20 20 20 20 20 20 20 20  PTH             
34870 7d 2c 0a 20 20 20 20 20 20 7b 20 22 77 6f 72 6b  },.      { "work
34880 65 72 5f 74 68 72 65 61 64 73 22 2c 20 20 20 20  er_threads",    
34890 20 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54      SQLITE_LIMIT
348a0 5f 57 4f 52 4b 45 52 5f 54 48 52 45 41 44 53 20  _WORKER_THREADS 
348b0 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
348c0 20 20 7d 3b 0a 20 20 20 20 69 6e 74 20 69 2c 20    };.    int i, 
348d0 6e 32 3b 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28  n2;.    open_db(
348e0 70 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 6e  p, 0);.    if( n
348f0 41 72 67 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  Arg==1 ){.      
34900 66 6f 72 28 69 3d 30 3b 20 69 3c 41 72 72 61 79  for(i=0; i<Array
34910 53 69 7a 65 28 61 4c 69 6d 69 74 29 3b 20 69 2b  Size(aLimit); i+
34920 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 72 69 6e  +){.        prin
34930 74 66 28 22 25 32 30 73 20 25 64 5c 6e 22 2c 20  tf("%20s %d\n", 
34940 61 4c 69 6d 69 74 5b 69 5d 2e 7a 4c 69 6d 69 74  aLimit[i].zLimit
34950 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20  Name,.          
34960 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 69 6d       sqlite3_lim
34970 69 74 28 70 2d 3e 64 62 2c 20 61 4c 69 6d 69 74  it(p->db, aLimit
34980 5b 69 5d 2e 6c 69 6d 69 74 43 6f 64 65 2c 20 2d  [i].limitCode, -
34990 31 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  1));.      }.   
349a0 20 7d 65 6c 73 65 20 69 66 28 20 6e 41 72 67 3e   }else if( nArg>
349b0 33 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70  3 ){.      raw_p
349c0 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55  rintf(stderr, "U
349d0 73 61 67 65 3a 20 2e 6c 69 6d 69 74 20 4e 41 4d  sage: .limit NAM
349e0 45 20 3f 4e 45 57 2d 56 41 4c 55 45 3f 5c 6e 22  E ?NEW-VALUE?\n"
349f0 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b  );.      rc = 1;
34a00 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 65 74 61  .      goto meta
34a10 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20  _command_exit;. 
34a20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
34a30 69 6e 74 20 69 4c 69 6d 69 74 20 3d 20 2d 31 3b  int iLimit = -1;
34a40 0a 20 20 20 20 20 20 6e 32 20 3d 20 73 74 72 6c  .      n2 = strl
34a50 65 6e 33 30 28 61 7a 41 72 67 5b 31 5d 29 3b 0a  en30(azArg[1]);.
34a60 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
34a70 3c 41 72 72 61 79 53 69 7a 65 28 61 4c 69 6d 69  <ArraySize(aLimi
34a80 74 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  t); i++){.      
34a90 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74    if( sqlite3_st
34aa0 72 6e 69 63 6d 70 28 61 4c 69 6d 69 74 5b 69 5d  rnicmp(aLimit[i]
34ab0 2e 7a 4c 69 6d 69 74 4e 61 6d 65 2c 20 61 7a 41  .zLimitName, azA
34ac0 72 67 5b 31 5d 2c 20 6e 32 29 3d 3d 30 20 29 7b  rg[1], n2)==0 ){
34ad0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69  .          if( i
34ae0 4c 69 6d 69 74 3c 30 20 29 7b 0a 20 20 20 20 20  Limit<0 ){.     
34af0 20 20 20 20 20 20 20 69 4c 69 6d 69 74 20 3d 20         iLimit = 
34b00 69 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  i;.          }el
34b10 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
34b20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65  utf8_printf(stde
34b30 72 72 2c 20 22 61 6d 62 69 67 75 6f 75 73 20 6c  rr, "ambiguous l
34b40 69 6d 69 74 3a 20 5c 22 25 73 5c 22 5c 6e 22 2c  imit: \"%s\"\n",
34b50 20 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20   azArg[1]);.    
34b60 20 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a          rc = 1;.
34b70 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f              goto
34b80 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78   meta_command_ex
34b90 69 74 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  it;.          }.
34ba0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
34bb0 7d 0a 20 20 20 20 20 20 69 66 28 20 69 4c 69 6d  }.      if( iLim
34bc0 69 74 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20  it<0 ){.        
34bd0 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65  utf8_printf(stde
34be0 72 72 2c 20 22 75 6e 6b 6e 6f 77 6e 20 6c 69 6d  rr, "unknown lim
34bf0 69 74 3a 20 5c 22 25 73 5c 22 5c 6e 22 0a 20 20  it: \"%s\"\n".  
34c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34c10 20 20 20 20 20 20 22 65 6e 74 65 72 20 5c 22 2e        "enter \".
34c20 6c 69 6d 69 74 73 5c 22 20 77 69 74 68 20 6e 6f  limits\" with no
34c30 20 61 72 67 75 6d 65 6e 74 73 20 66 6f 72 20 61   arguments for a
34c40 20 6c 69 73 74 2e 5c 6e 22 2c 0a 20 20 20 20 20   list.\n",.     
34c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34c60 20 20 20 20 61 7a 41 72 67 5b 31 5d 29 3b 0a 20      azArg[1]);. 
34c70 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20         rc = 1;. 
34c80 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 65 74 61         goto meta
34c90 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20  _command_exit;. 
34ca0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
34cb0 20 6e 41 72 67 3d 3d 33 20 29 7b 0a 20 20 20 20   nArg==3 ){.    
34cc0 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 69 6d 69      sqlite3_limi
34cd0 74 28 70 2d 3e 64 62 2c 20 61 4c 69 6d 69 74 5b  t(p->db, aLimit[
34ce0 69 4c 69 6d 69 74 5d 2e 6c 69 6d 69 74 43 6f 64  iLimit].limitCod
34cf0 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
34d00 20 20 20 20 20 20 20 20 20 28 69 6e 74 29 69 6e           (int)in
34d10 74 65 67 65 72 56 61 6c 75 65 28 61 7a 41 72 67  tegerValue(azArg
34d20 5b 32 5d 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20  [2]));.      }. 
34d30 20 20 20 20 20 70 72 69 6e 74 66 28 22 25 32 30       printf("%20
34d40 73 20 25 64 5c 6e 22 2c 20 61 4c 69 6d 69 74 5b  s %d\n", aLimit[
34d50 69 4c 69 6d 69 74 5d 2e 7a 4c 69 6d 69 74 4e 61  iLimit].zLimitNa
34d60 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  me,.            
34d70 20 73 71 6c 69 74 65 33 5f 6c 69 6d 69 74 28 70   sqlite3_limit(p
34d80 2d 3e 64 62 2c 20 61 4c 69 6d 69 74 5b 69 4c 69  ->db, aLimit[iLi
34d90 6d 69 74 5d 2e 6c 69 6d 69 74 43 6f 64 65 2c 20  mit].limitCode, 
34da0 2d 31 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  -1));.    }.  }e
34db0 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 6c  lse..  if( c=='l
34dc0 27 20 26 26 20 6e 3e 32 20 26 26 20 73 74 72 6e  ' && n>2 && strn
34dd0 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 6c  cmp(azArg[0], "l
34de0 69 6e 74 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20  int", n)==0 ){. 
34df0 20 20 20 6f 70 65 6e 5f 64 62 28 70 2c 20 30 29     open_db(p, 0)
34e00 3b 0a 20 20 20 20 6c 69 6e 74 44 6f 74 43 6f 6d  ;.    lintDotCom
34e10 6d 61 6e 64 28 70 2c 20 61 7a 41 72 67 2c 20 6e  mand(p, azArg, n
34e20 41 72 67 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a 23  Arg);.  }else..#
34e30 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
34e40 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f  IT_LOAD_EXTENSIO
34e50 4e 0a 20 20 69 66 28 20 63 3d 3d 27 6c 27 20 26  N.  if( c=='l' &
34e60 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b  & strncmp(azArg[
34e70 30 5d 2c 20 22 6c 6f 61 64 22 2c 20 6e 29 3d 3d  0], "load", n)==
34e80 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  0 ){.    const c
34e90 68 61 72 20 2a 7a 46 69 6c 65 2c 20 2a 7a 50 72  har *zFile, *zPr
34ea0 6f 63 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 45  oc;.    char *zE
34eb0 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 20 20 69  rrMsg = 0;.    i
34ec0 66 28 20 6e 41 72 67 3c 32 20 29 7b 0a 20 20 20  f( nArg<2 ){.   
34ed0 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74     raw_printf(st
34ee0 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 6c  derr, "Usage: .l
34ef0 6f 61 64 20 46 49 4c 45 20 3f 45 4e 54 52 59 50  oad FILE ?ENTRYP
34f00 4f 49 4e 54 3f 5c 6e 22 29 3b 0a 20 20 20 20 20  OINT?\n");.     
34f10 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 67   rc = 1;.      g
34f20 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64  oto meta_command
34f30 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a 20 20 20  _exit;.    }.   
34f40 20 7a 46 69 6c 65 20 3d 20 61 7a 41 72 67 5b 31   zFile = azArg[1
34f50 5d 3b 0a 20 20 20 20 7a 50 72 6f 63 20 3d 20 6e  ];.    zProc = n
34f60 41 72 67 3e 3d 33 20 3f 20 61 7a 41 72 67 5b 32  Arg>=3 ? azArg[2
34f70 5d 20 3a 20 30 3b 0a 20 20 20 20 6f 70 65 6e 5f  ] : 0;.    open_
34f80 64 62 28 70 2c 20 30 29 3b 0a 20 20 20 20 72 63  db(p, 0);.    rc
34f90 20 3d 20 73 71 6c 69 74 65 33 5f 6c 6f 61 64 5f   = sqlite3_load_
34fa0 65 78 74 65 6e 73 69 6f 6e 28 70 2d 3e 64 62 2c  extension(p->db,
34fb0 20 7a 46 69 6c 65 2c 20 7a 50 72 6f 63 2c 20 26   zFile, zProc, &
34fc0 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 69 66  zErrMsg);.    if
34fd0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
34fe0 29 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72  ){.      utf8_pr
34ff0 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72  intf(stderr, "Er
35000 72 6f 72 3a 20 25 73 5c 6e 22 2c 20 7a 45 72 72  ror: %s\n", zErr
35010 4d 73 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Msg);.      sqli
35020 74 65 33 5f 66 72 65 65 28 7a 45 72 72 4d 73 67  te3_free(zErrMsg
35030 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b  );.      rc = 1;
35040 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 23  .    }.  }else.#
35050 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 63 3d 3d  endif..  if( c==
35060 27 6c 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61  'l' && strncmp(a
35070 7a 41 72 67 5b 30 5d 2c 20 22 6c 6f 67 22 2c 20  zArg[0], "log", 
35080 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  n)==0 ){.    if(
35090 20 6e 41 72 67 21 3d 32 20 29 7b 0a 20 20 20 20   nArg!=2 ){.    
350a0 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64    raw_printf(std
350b0 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 6c 6f  err, "Usage: .lo
350c0 67 20 46 49 4c 45 4e 41 4d 45 5c 6e 22 29 3b 0a  g FILENAME\n");.
350d0 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
350e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63    }else{.      c
350f0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
35100 20 3d 20 61 7a 41 72 67 5b 31 5d 3b 0a 20 20 20   = azArg[1];.   
35110 20 20 20 6f 75 74 70 75 74 5f 66 69 6c 65 5f 63     output_file_c
35120 6c 6f 73 65 28 70 2d 3e 70 4c 6f 67 29 3b 0a 20  lose(p->pLog);. 
35130 20 20 20 20 20 70 2d 3e 70 4c 6f 67 20 3d 20 6f       p->pLog = o
35140 75 74 70 75 74 5f 66 69 6c 65 5f 6f 70 65 6e 28  utput_file_open(
35150 7a 46 69 6c 65 2c 20 30 29 3b 0a 20 20 20 20 7d  zFile, 0);.    }
35160 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20  .  }else..  if( 
35170 63 3d 3d 27 6d 27 20 26 26 20 73 74 72 6e 63 6d  c=='m' && strncm
35180 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 6d 6f 64  p(azArg[0], "mod
35190 65 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20  e", n)==0 ){.   
351a0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 6f   const char *zMo
351b0 64 65 20 3d 20 6e 41 72 67 3e 3d 32 20 3f 20 61  de = nArg>=2 ? a
351c0 7a 41 72 67 5b 31 5d 20 3a 20 22 22 3b 0a 20 20  zArg[1] : "";.  
351d0 20 20 69 6e 74 20 6e 32 20 3d 20 73 74 72 6c 65    int n2 = strle
351e0 6e 33 30 28 7a 4d 6f 64 65 29 3b 0a 20 20 20 20  n30(zMode);.    
351f0 69 6e 74 20 63 32 20 3d 20 7a 4d 6f 64 65 5b 30  int c2 = zMode[0
35200 5d 3b 0a 20 20 20 20 69 66 28 20 63 32 3d 3d 27  ];.    if( c2=='
35210 6c 27 20 26 26 20 6e 32 3e 32 20 26 26 20 73 74  l' && n2>2 && st
35220 72 6e 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 22  rncmp(azArg[1],"
35230 6c 69 6e 65 73 22 2c 6e 32 29 3d 3d 30 20 29 7b  lines",n2)==0 ){
35240 0a 20 20 20 20 20 20 70 2d 3e 6d 6f 64 65 20 3d  .      p->mode =
35250 20 4d 4f 44 45 5f 4c 69 6e 65 3b 0a 20 20 20 20   MODE_Line;.    
35260 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
35270 74 66 28 73 69 7a 65 6f 66 28 70 2d 3e 72 6f 77  tf(sizeof(p->row
35280 53 65 70 61 72 61 74 6f 72 29 2c 20 70 2d 3e 72  Separator), p->r
35290 6f 77 53 65 70 61 72 61 74 6f 72 2c 20 53 45 50  owSeparator, SEP
352a0 5f 52 6f 77 29 3b 0a 20 20 20 20 7d 65 6c 73 65  _Row);.    }else
352b0 20 69 66 28 20 63 32 3d 3d 27 63 27 20 26 26 20   if( c2=='c' && 
352c0 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 31 5d  strncmp(azArg[1]
352d0 2c 22 63 6f 6c 75 6d 6e 73 22 2c 6e 32 29 3d 3d  ,"columns",n2)==
352e0 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6d 6f  0 ){.      p->mo
352f0 64 65 20 3d 20 4d 4f 44 45 5f 43 6f 6c 75 6d 6e  de = MODE_Column
35300 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
35310 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
35320 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 29  p->rowSeparator)
35330 2c 20 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f  , p->rowSeparato
35340 72 2c 20 53 45 50 5f 52 6f 77 29 3b 0a 20 20 20  r, SEP_Row);.   
35350 20 7d 65 6c 73 65 20 69 66 28 20 63 32 3d 3d 27   }else if( c2=='
35360 6c 27 20 26 26 20 6e 32 3e 32 20 26 26 20 73 74  l' && n2>2 && st
35370 72 6e 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 22  rncmp(azArg[1],"
35380 6c 69 73 74 22 2c 6e 32 29 3d 3d 30 20 29 7b 0a  list",n2)==0 ){.
35390 20 20 20 20 20 20 70 2d 3e 6d 6f 64 65 20 3d 20        p->mode = 
353a0 4d 4f 44 45 5f 4c 69 73 74 3b 0a 20 20 20 20 20  MODE_List;.     
353b0 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
353c0 66 28 73 69 7a 65 6f 66 28 70 2d 3e 63 6f 6c 53  f(sizeof(p->colS
353d0 65 70 61 72 61 74 6f 72 29 2c 20 70 2d 3e 63 6f  eparator), p->co
353e0 6c 53 65 70 61 72 61 74 6f 72 2c 20 53 45 50 5f  lSeparator, SEP_
353f0 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 73  Column);.      s
35400 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
35410 73 69 7a 65 6f 66 28 70 2d 3e 72 6f 77 53 65 70  sizeof(p->rowSep
35420 61 72 61 74 6f 72 29 2c 20 70 2d 3e 72 6f 77 53  arator), p->rowS
35430 65 70 61 72 61 74 6f 72 2c 20 53 45 50 5f 52 6f  eparator, SEP_Ro
35440 77 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  w);.    }else if
35450 28 20 63 32 3d 3d 27 68 27 20 26 26 20 73 74 72  ( c2=='h' && str
35460 6e 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 22 68  ncmp(azArg[1],"h
35470 74 6d 6c 22 2c 6e 32 29 3d 3d 30 20 29 7b 0a 20  tml",n2)==0 ){. 
35480 20 20 20 20 20 70 2d 3e 6d 6f 64 65 20 3d 20 4d       p->mode = M
35490 4f 44 45 5f 48 74 6d 6c 3b 0a 20 20 20 20 7d 65  ODE_Html;.    }e
354a0 6c 73 65 20 69 66 28 20 63 32 3d 3d 27 74 27 20  lse if( c2=='t' 
354b0 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67  && strncmp(azArg
354c0 5b 31 5d 2c 22 74 63 6c 22 2c 6e 32 29 3d 3d 30  [1],"tcl",n2)==0
354d0 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6d 6f 64   ){.      p->mod
354e0 65 20 3d 20 4d 4f 44 45 5f 54 63 6c 3b 0a 20 20  e = MODE_Tcl;.  
354f0 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
35500 69 6e 74 66 28 73 69 7a 65 6f 66 28 70 2d 3e 63  intf(sizeof(p->c
35510 6f 6c 53 65 70 61 72 61 74 6f 72 29 2c 20 70 2d  olSeparator), p-
35520 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 2c 20 53  >colSeparator, S
35530 45 50 5f 53 70 61 63 65 29 3b 0a 20 20 20 20 20  EP_Space);.     
35540 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
35550 66 28 73 69 7a 65 6f 66 28 70 2d 3e 72 6f 77 53  f(sizeof(p->rowS
35560 65 70 61 72 61 74 6f 72 29 2c 20 70 2d 3e 72 6f  eparator), p->ro
35570 77 53 65 70 61 72 61 74 6f 72 2c 20 53 45 50 5f  wSeparator, SEP_
35580 52 6f 77 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  Row);.    }else 
35590 69 66 28 20 63 32 3d 3d 27 63 27 20 26 26 20 73  if( c2=='c' && s
355a0 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c  trncmp(azArg[1],
355b0 22 63 73 76 22 2c 6e 32 29 3d 3d 30 20 29 7b 0a  "csv",n2)==0 ){.
355c0 20 20 20 20 20 20 70 2d 3e 6d 6f 64 65 20 3d 20        p->mode = 
355d0 4d 4f 44 45 5f 43 73 76 3b 0a 20 20 20 20 20 20  MODE_Csv;.      
355e0 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
355f0 28 73 69 7a 65 6f 66 28 70 2d 3e 63 6f 6c 53 65  (sizeof(p->colSe
35600 70 61 72 61 74 6f 72 29 2c 20 70 2d 3e 63 6f 6c  parator), p->col
35610 53 65 70 61 72 61 74 6f 72 2c 20 53 45 50 5f 43  Separator, SEP_C
35620 6f 6d 6d 61 29 3b 0a 20 20 20 20 20 20 73 71 6c  omma);.      sql
35630 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
35640 7a 65 6f 66 28 70 2d 3e 72 6f 77 53 65 70 61 72  zeof(p->rowSepar
35650 61 74 6f 72 29 2c 20 70 2d 3e 72 6f 77 53 65 70  ator), p->rowSep
35660 61 72 61 74 6f 72 2c 20 53 45 50 5f 43 72 4c 66  arator, SEP_CrLf
35670 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
35680 20 63 32 3d 3d 27 74 27 20 26 26 20 73 74 72 6e   c2=='t' && strn
35690 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 22 74 61  cmp(azArg[1],"ta
356a0 62 73 22 2c 6e 32 29 3d 3d 30 20 29 7b 0a 20 20  bs",n2)==0 ){.  
356b0 20 20 20 20 70 2d 3e 6d 6f 64 65 20 3d 20 4d 4f      p->mode = MO
356c0 44 45 5f 4c 69 73 74 3b 0a 20 20 20 20 20 20 73  DE_List;.      s
356d0 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
356e0 73 69 7a 65 6f 66 28 70 2d 3e 63 6f 6c 53 65 70  sizeof(p->colSep
356f0 61 72 61 74 6f 72 29 2c 20 70 2d 3e 63 6f 6c 53  arator), p->colS
35700 65 70 61 72 61 74 6f 72 2c 20 53 45 50 5f 54 61  eparator, SEP_Ta
35710 62 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  b);.    }else if
35720 28 20 63 32 3d 3d 27 69 27 20 26 26 20 73 74 72  ( c2=='i' && str
35730 6e 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 22 69  ncmp(azArg[1],"i
35740 6e 73 65 72 74 22 2c 6e 32 29 3d 3d 30 20 29 7b  nsert",n2)==0 ){
35750 0a 20 20 20 20 20 20 70 2d 3e 6d 6f 64 65 20 3d  .      p->mode =
35760 20 4d 4f 44 45 5f 49 6e 73 65 72 74 3b 0a 20 20   MODE_Insert;.  
35770 20 20 20 20 73 65 74 5f 74 61 62 6c 65 5f 6e 61      set_table_na
35780 6d 65 28 70 2c 20 6e 41 72 67 3e 3d 33 20 3f 20  me(p, nArg>=3 ? 
35790 61 7a 41 72 67 5b 32 5d 20 3a 20 22 74 61 62 6c  azArg[2] : "tabl
357a0 65 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  e");.    }else i
357b0 66 28 20 63 32 3d 3d 27 71 27 20 26 26 20 73 74  f( c2=='q' && st
357c0 72 6e 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 22  rncmp(azArg[1],"
357d0 71 75 6f 74 65 22 2c 6e 32 29 3d 3d 30 20 29 7b  quote",n2)==0 ){
357e0 0a 20 20 20 20 20 20 70 2d 3e 6d 6f 64 65 20 3d  .      p->mode =
357f0 20 4d 4f 44 45 5f 51 75 6f 74 65 3b 0a 20 20 20   MODE_Quote;.   
35800 20 7d 65 6c 73 65 20 69 66 28 20 63 32 3d 3d 27   }else if( c2=='
35810 61 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a  a' && strncmp(az
35820 41 72 67 5b 31 5d 2c 22 61 73 63 69 69 22 2c 6e  Arg[1],"ascii",n
35830 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  2)==0 ){.      p
35840 2d 3e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 41 73  ->mode = MODE_As
35850 63 69 69 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  cii;.      sqlit
35860 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
35870 6f 66 28 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74  of(p->colSeparat
35880 6f 72 29 2c 20 70 2d 3e 63 6f 6c 53 65 70 61 72  or), p->colSepar
35890 61 74 6f 72 2c 20 53 45 50 5f 55 6e 69 74 29 3b  ator, SEP_Unit);
358a0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
358b0 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 70  nprintf(sizeof(p
358c0 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 29 2c  ->rowSeparator),
358d0 20 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72   p->rowSeparator
358e0 2c 20 53 45 50 5f 52 65 63 6f 72 64 29 3b 0a 20  , SEP_Record);. 
358f0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 41 72     }else if( nAr
35900 67 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 72 61  g==1 ){.      ra
35910 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  w_printf(p->out,
35920 20 22 63 75 72 72 65 6e 74 20 6f 75 74 70 75 74   "current output
35930 20 6d 6f 64 65 3a 20 25 73 5c 6e 22 2c 20 6d 6f   mode: %s\n", mo
35940 64 65 44 65 73 63 72 5b 70 2d 3e 6d 6f 64 65 5d  deDescr[p->mode]
35950 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
35960 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73      raw_printf(s
35970 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 6d  tderr, "Error: m
35980 6f 64 65 20 73 68 6f 75 6c 64 20 62 65 20 6f 6e  ode should be on
35990 65 20 6f 66 3a 20 22 0a 20 20 20 20 20 20 20 20  e of: ".        
359a0 20 22 61 73 63 69 69 20 63 6f 6c 75 6d 6e 20 63   "ascii column c
359b0 73 76 20 68 74 6d 6c 20 69 6e 73 65 72 74 20 6c  sv html insert l
359c0 69 6e 65 20 6c 69 73 74 20 71 75 6f 74 65 20 74  ine list quote t
359d0 61 62 73 20 74 63 6c 5c 6e 22 29 3b 0a 20 20 20  abs tcl\n");.   
359e0 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d     rc = 1;.    }
359f0 0a 20 20 20 20 70 2d 3e 63 4d 6f 64 65 20 3d 20  .    p->cMode = 
35a00 70 2d 3e 6d 6f 64 65 3b 0a 20 20 7d 65 6c 73 65  p->mode;.  }else
35a10 0a 0a 20 20 69 66 28 20 63 3d 3d 27 6e 27 20 26  ..  if( c=='n' &
35a20 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b  & strncmp(azArg[
35a30 30 5d 2c 20 22 6e 75 6c 6c 76 61 6c 75 65 22 2c  0], "nullvalue",
35a40 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66   n)==0 ){.    if
35a50 28 20 6e 41 72 67 3d 3d 32 20 29 7b 0a 20 20 20  ( nArg==2 ){.   
35a60 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
35a70 6e 74 66 28 73 69 7a 65 6f 66 28 70 2d 3e 6e 75  ntf(sizeof(p->nu
35a80 6c 6c 56 61 6c 75 65 29 2c 20 70 2d 3e 6e 75 6c  llValue), p->nul
35a90 6c 56 61 6c 75 65 2c 0a 20 20 20 20 20 20 20 20  lValue,.        
35aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
35ab0 25 2e 2a 73 22 2c 20 28 69 6e 74 29 41 72 72 61  %.*s", (int)Arra
35ac0 79 53 69 7a 65 28 70 2d 3e 6e 75 6c 6c 56 61 6c  ySize(p->nullVal
35ad0 75 65 29 2d 31 2c 20 61 7a 41 72 67 5b 31 5d 29  ue)-1, azArg[1])
35ae0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
35af0 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74     raw_printf(st
35b00 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 6e  derr, "Usage: .n
35b10 75 6c 6c 76 61 6c 75 65 20 53 54 52 49 4e 47 5c  ullvalue STRING\
35b20 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  n");.      rc = 
35b30 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  1;.    }.  }else
35b40 0a 0a 20 20 69 66 28 20 63 3d 3d 27 6f 27 20 26  ..  if( c=='o' &
35b50 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b  & strncmp(azArg[
35b60 30 5d 2c 20 22 6f 70 65 6e 22 2c 20 6e 29 3d 3d  0], "open", n)==
35b70 30 20 26 26 20 6e 3e 3d 32 20 29 7b 0a 20 20 20  0 && n>=2 ){.   
35b80 20 63 68 61 72 20 2a 7a 4e 65 77 46 69 6c 65 6e   char *zNewFilen
35b90 61 6d 65 3b 20 20 2f 2a 20 4e 61 6d 65 20 6f 66  ame;  /* Name of
35ba0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
35bb0 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20  le to open */.  
35bc0 20 20 69 6e 74 20 69 4e 61 6d 65 20 3d 20 31 3b    int iName = 1;
35bd0 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
35be0 69 6e 20 61 7a 41 72 67 5b 5d 20 6f 66 20 74 68  in azArg[] of th
35bf0 65 20 66 69 6c 65 6e 61 6d 65 20 2a 2f 0a 20 20  e filename */.  
35c00 20 20 69 6e 74 20 6e 65 77 46 6c 61 67 20 3d 20    int newFlag = 
35c10 30 3b 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74  0;     /* True t
35c20 6f 20 64 65 6c 65 74 65 20 66 69 6c 65 20 62 65  o delete file be
35c30 66 6f 72 65 20 6f 70 65 6e 69 6e 67 20 2a 2f 0a  fore opening */.
35c40 20 20 20 20 2f 2a 20 43 6c 6f 73 65 20 74 68 65      /* Close the
35c50 20 65 78 69 73 74 69 6e 67 20 64 61 74 61 62 61   existing databa
35c60 73 65 20 2a 2f 0a 20 20 20 20 73 65 73 73 69 6f  se */.    sessio
35c70 6e 5f 63 6c 6f 73 65 5f 61 6c 6c 28 70 29 3b 0a  n_close_all(p);.
35c80 20 20 20 20 63 6c 6f 73 65 5f 64 62 28 70 2d 3e      close_db(p->
35c90 64 62 29 3b 0a 20 20 20 20 70 2d 3e 64 62 20 3d  db);.    p->db =
35ca0 20 30 3b 0a 20 20 20 20 70 2d 3e 7a 44 62 46 69   0;.    p->zDbFi
35cb0 6c 65 6e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20  lename = 0;.    
35cc0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e  sqlite3_free(p->
35cd0 7a 46 72 65 65 4f 6e 43 6c 6f 73 65 29 3b 0a 20  zFreeOnClose);. 
35ce0 20 20 20 70 2d 3e 7a 46 72 65 65 4f 6e 43 6c 6f     p->zFreeOnClo
35cf0 73 65 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 6f  se = 0;.    p->o
35d00 70 65 6e 4d 6f 64 65 20 3d 20 53 48 45 4c 4c 5f  penMode = SHELL_
35d10 4f 50 45 4e 5f 55 4e 53 50 45 43 3b 0a 20 20 20  OPEN_UNSPEC;.   
35d20 20 70 2d 3e 73 7a 4d 61 78 20 3d 20 30 3b 0a 20   p->szMax = 0;. 
35d30 20 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20     /* Check for 
35d40 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20 61 72 67  command-line arg
35d50 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 66 6f  uments */.    fo
35d60 72 28 69 4e 61 6d 65 3d 31 3b 20 69 4e 61 6d 65  r(iName=1; iName
35d70 3c 6e 41 72 67 20 26 26 20 61 7a 41 72 67 5b 69  <nArg && azArg[i
35d80 4e 61 6d 65 5d 5b 30 5d 3d 3d 27 2d 27 3b 20 69  Name][0]=='-'; i
35d90 4e 61 6d 65 2b 2b 29 7b 0a 20 20 20 20 20 20 63  Name++){.      c
35da0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 61  onst char *z = a
35db0 7a 41 72 67 5b 69 4e 61 6d 65 5d 3b 0a 20 20 20  zArg[iName];.   
35dc0 20 20 20 69 66 28 20 6f 70 74 69 6f 6e 4d 61 74     if( optionMat
35dd0 63 68 28 7a 2c 22 6e 65 77 22 29 20 29 7b 0a 20  ch(z,"new") ){. 
35de0 20 20 20 20 20 20 20 6e 65 77 46 6c 61 67 20 3d         newFlag =
35df0 20 31 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   1;.#ifdef SQLIT
35e00 45 5f 48 41 56 45 5f 5a 4c 49 42 0a 20 20 20 20  E_HAVE_ZLIB.    
35e10 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 74 69    }else if( opti
35e20 6f 6e 4d 61 74 63 68 28 7a 2c 20 22 7a 69 70 22  onMatch(z, "zip"
35e30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e  ) ){.        p->
35e40 6f 70 65 6e 4d 6f 64 65 20 3d 20 53 48 45 4c 4c  openMode = SHELL
35e50 5f 4f 50 45 4e 5f 5a 49 50 46 49 4c 45 3b 0a 23  _OPEN_ZIPFILE;.#
35e60 65 6e 64 69 66 0a 20 20 20 20 20 20 7d 65 6c 73  endif.      }els
35e70 65 20 69 66 28 20 6f 70 74 69 6f 6e 4d 61 74 63  e if( optionMatc
35e80 68 28 7a 2c 20 22 61 70 70 65 6e 64 22 29 20 29  h(z, "append") )
35e90 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6f 70 65  {.        p->ope
35ea0 6e 4d 6f 64 65 20 3d 20 53 48 45 4c 4c 5f 4f 50  nMode = SHELL_OP
35eb0 45 4e 5f 41 50 50 45 4e 44 56 46 53 3b 0a 20 20  EN_APPENDVFS;.  
35ec0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70      }else if( op
35ed0 74 69 6f 6e 4d 61 74 63 68 28 7a 2c 20 22 72 65  tionMatch(z, "re
35ee0 61 64 6f 6e 6c 79 22 29 20 29 7b 0a 20 20 20 20  adonly") ){.    
35ef0 20 20 20 20 70 2d 3e 6f 70 65 6e 4d 6f 64 65 20      p->openMode 
35f00 3d 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f 52 45 41  = SHELL_OPEN_REA
35f10 44 4f 4e 4c 59 3b 0a 23 69 66 64 65 66 20 53 51  DONLY;.#ifdef SQ
35f20 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 44 45 53 45  LITE_ENABLE_DESE
35f30 52 49 41 4c 49 5a 45 0a 20 20 20 20 20 20 7d 65  RIALIZE.      }e
35f40 6c 73 65 20 69 66 28 20 6f 70 74 69 6f 6e 4d 61  lse if( optionMa
35f50 74 63 68 28 7a 2c 20 22 64 65 73 65 72 69 61 6c  tch(z, "deserial
35f60 69 7a 65 22 29 20 29 7b 0a 20 20 20 20 20 20 20  ize") ){.       
35f70 20 70 2d 3e 6f 70 65 6e 4d 6f 64 65 20 3d 20 53   p->openMode = S
35f80 48 45 4c 4c 5f 4f 50 45 4e 5f 44 45 53 45 52 49  HELL_OPEN_DESERI
35f90 41 4c 49 5a 45 3b 0a 20 20 20 20 20 20 7d 65 6c  ALIZE;.      }el
35fa0 73 65 20 69 66 28 20 6f 70 74 69 6f 6e 4d 61 74  se if( optionMat
35fb0 63 68 28 7a 2c 20 22 68 65 78 64 62 22 29 20 29  ch(z, "hexdb") )
35fc0 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6f 70 65  {.        p->ope
35fd0 6e 4d 6f 64 65 20 3d 20 53 48 45 4c 4c 5f 4f 50  nMode = SHELL_OP
35fe0 45 4e 5f 48 45 58 44 42 3b 0a 20 20 20 20 20 20  EN_HEXDB;.      
35ff0 7d 65 6c 73 65 20 69 66 28 20 6f 70 74 69 6f 6e  }else if( option
36000 4d 61 74 63 68 28 7a 2c 20 22 6d 61 78 73 69 7a  Match(z, "maxsiz
36010 65 22 29 20 26 26 20 69 4e 61 6d 65 2b 31 3c 6e  e") && iName+1<n
36020 41 72 67 20 29 7b 0a 20 20 20 20 20 20 20 20 70  Arg ){.        p
36030 2d 3e 73 7a 4d 61 78 20 3d 20 69 6e 74 65 67 65  ->szMax = intege
36040 72 56 61 6c 75 65 28 61 7a 41 72 67 5b 2b 2b 69  rValue(azArg[++i
36050 4e 61 6d 65 5d 29 3b 0a 23 65 6e 64 69 66 20 2f  Name]);.#endif /
36060 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  * SQLITE_ENABLE_
36070 44 45 53 45 52 49 41 4c 49 5a 45 20 2a 2f 0a 20  DESERIALIZE */. 
36080 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 7a       }else if( z
36090 5b 30 5d 3d 3d 27 2d 27 20 29 7b 0a 20 20 20 20  [0]=='-' ){.    
360a0 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
360b0 73 74 64 65 72 72 2c 20 22 75 6e 6b 6e 6f 77 6e  stderr, "unknown
360c0 20 6f 70 74 69 6f 6e 3a 20 25 73 5c 6e 22 2c 20   option: %s\n", 
360d0 7a 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  z);.        rc =
360e0 20 31 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   1;.        goto
360f0 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78   meta_command_ex
36100 69 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  it;.      }.    
36110 7d 0a 20 20 20 20 2f 2a 20 49 66 20 61 20 66 69  }.    /* If a fi
36120 6c 65 6e 61 6d 65 20 69 73 20 73 70 65 63 69 66  lename is specif
36130 69 65 64 2c 20 74 72 79 20 74 6f 20 6f 70 65 6e  ied, try to open
36140 20 69 74 20 66 69 72 73 74 20 2a 2f 0a 20 20 20   it first */.   
36150 20 7a 4e 65 77 46 69 6c 65 6e 61 6d 65 20 3d 20   zNewFilename = 
36160 6e 41 72 67 3e 69 4e 61 6d 65 20 3f 20 73 71 6c  nArg>iName ? sql
36170 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73  ite3_mprintf("%s
36180 22 2c 20 61 7a 41 72 67 5b 69 4e 61 6d 65 5d 29  ", azArg[iName])
36190 20 3a 20 30 3b 0a 20 20 20 20 69 66 28 20 7a 4e   : 0;.    if( zN
361a0 65 77 46 69 6c 65 6e 61 6d 65 20 7c 7c 20 70 2d  ewFilename || p-
361b0 3e 6f 70 65 6e 4d 6f 64 65 3d 3d 53 48 45 4c 4c  >openMode==SHELL
361c0 5f 4f 50 45 4e 5f 48 45 58 44 42 20 29 7b 0a 20  _OPEN_HEXDB ){. 
361d0 20 20 20 20 20 69 66 28 20 6e 65 77 46 6c 61 67       if( newFlag
361e0 20 29 20 73 68 65 6c 6c 44 65 6c 65 74 65 46 69   ) shellDeleteFi
361f0 6c 65 28 7a 4e 65 77 46 69 6c 65 6e 61 6d 65 29  le(zNewFilename)
36200 3b 0a 20 20 20 20 20 20 70 2d 3e 7a 44 62 46 69  ;.      p->zDbFi
36210 6c 65 6e 61 6d 65 20 3d 20 7a 4e 65 77 46 69 6c  lename = zNewFil
36220 65 6e 61 6d 65 3b 0a 20 20 20 20 20 20 6f 70 65  ename;.      ope
36230 6e 5f 64 62 28 70 2c 20 4f 50 45 4e 5f 44 42 5f  n_db(p, OPEN_DB_
36240 4b 45 45 50 41 4c 49 56 45 29 3b 0a 20 20 20 20  KEEPALIVE);.    
36250 20 20 69 66 28 20 70 2d 3e 64 62 3d 3d 30 20 29    if( p->db==0 )
36260 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70  {.        utf8_p
36270 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45  rintf(stderr, "E
36280 72 72 6f 72 3a 20 63 61 6e 6e 6f 74 20 6f 70 65  rror: cannot ope
36290 6e 20 27 25 73 27 5c 6e 22 2c 20 7a 4e 65 77 46  n '%s'\n", zNewF
362a0 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ilename);.      
362b0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
362c0 4e 65 77 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  NewFilename);.  
362d0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
362e0 20 20 20 70 2d 3e 7a 46 72 65 65 4f 6e 43 6c 6f     p->zFreeOnClo
362f0 73 65 20 3d 20 7a 4e 65 77 46 69 6c 65 6e 61 6d  se = zNewFilenam
36300 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  e;.      }.    }
36310 0a 20 20 20 20 69 66 28 20 70 2d 3e 64 62 3d 3d  .    if( p->db==
36320 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 73  0 ){.      /* As
36330 20 61 20 66 61 6c 6c 2d 62 61 63 6b 20 6f 70 65   a fall-back ope
36340 6e 20 61 20 54 45 4d 50 20 64 61 74 61 62 61 73  n a TEMP databas
36350 65 20 2a 2f 0a 20 20 20 20 20 20 70 2d 3e 7a 44  e */.      p->zD
36360 62 46 69 6c 65 6e 61 6d 65 20 3d 20 30 3b 0a 20  bFilename = 0;. 
36370 20 20 20 20 20 6f 70 65 6e 5f 64 62 28 70 2c 20       open_db(p, 
36380 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  0);.    }.  }els
36390 65 0a 0a 20 20 69 66 28 20 28 63 3d 3d 27 6f 27  e..  if( (c=='o'
363a0 0a 20 20 20 20 20 20 20 20 26 26 20 28 73 74 72  .        && (str
363b0 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22  ncmp(azArg[0], "
363c0 6f 75 74 70 75 74 22 2c 20 6e 29 3d 3d 30 7c 7c  output", n)==0||
363d0 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d  strncmp(azArg[0]
363e0 2c 20 22 6f 6e 63 65 22 2c 20 6e 29 3d 3d 30 29  , "once", n)==0)
363f0 29 0a 20 20 20 7c 7c 20 28 63 3d 3d 27 65 27 20  ).   || (c=='e' 
36400 26 26 20 6e 3d 3d 35 20 26 26 20 73 74 72 63 6d  && n==5 && strcm
36410 70 28 61 7a 41 72 67 5b 30 5d 2c 22 65 78 63 65  p(azArg[0],"exce
36420 6c 22 29 3d 3d 30 29 0a 20 20 29 7b 0a 20 20 20  l")==0).  ){.   
36430 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69   const char *zFi
36440 6c 65 20 3d 20 6e 41 72 67 3e 3d 32 20 3f 20 61  le = nArg>=2 ? a
36450 7a 41 72 67 5b 31 5d 20 3a 20 22 73 74 64 6f 75  zArg[1] : "stdou
36460 74 22 3b 0a 20 20 20 20 69 6e 74 20 62 54 78 74  t";.    int bTxt
36470 4d 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 69 66  Mode = 0;.    if
36480 28 20 61 7a 41 72 67 5b 30 5d 5b 30 5d 3d 3d 27  ( azArg[0][0]=='
36490 65 27 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  e' ){.      /* T
364a0 72 61 6e 73 66 6f 72 6d 20 74 68 65 20 22 2e 65  ransform the ".e
364b0 78 63 65 6c 22 20 63 6f 6d 6d 61 6e 64 20 69 6e  xcel" command in
364c0 74 6f 20 22 2e 6f 6e 63 65 20 2d 78 22 20 2a 2f  to ".once -x" */
364d0 0a 20 20 20 20 20 20 6e 41 72 67 20 3d 20 32 3b  .      nArg = 2;
364e0 0a 20 20 20 20 20 20 61 7a 41 72 67 5b 30 5d 20  .      azArg[0] 
364f0 3d 20 22 6f 6e 63 65 22 3b 0a 20 20 20 20 20 20  = "once";.      
36500 7a 46 69 6c 65 20 3d 20 61 7a 41 72 67 5b 31 5d  zFile = azArg[1]
36510 20 3d 20 22 2d 78 22 3b 0a 20 20 20 20 20 20 6e   = "-x";.      n
36520 20 3d 20 34 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 4;.    }.    
36530 69 66 28 20 6e 41 72 67 3e 32 20 29 7b 0a 20 20  if( nArg>2 ){.  
36540 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
36550 73 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20  stderr, "Usage: 
36560 2e 25 73 20 5b 2d 65 7c 2d 78 7c 46 49 4c 45 5d  .%s [-e|-x|FILE]
36570 5c 6e 22 2c 20 61 7a 41 72 67 5b 30 5d 29 3b 0a  \n", azArg[0]);.
36580 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
36590 20 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f      goto meta_co
365a0 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20  mmand_exit;.    
365b0 7d 0a 20 20 20 20 69 66 28 20 6e 3e 31 20 26 26  }.    if( n>1 &&
365c0 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30   strncmp(azArg[0
365d0 5d 2c 20 22 6f 6e 63 65 22 2c 20 6e 29 3d 3d 30  ], "once", n)==0
365e0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 41   ){.      if( nA
365f0 72 67 3c 32 20 29 7b 0a 20 20 20 20 20 20 20 20  rg<2 ){.        
36600 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72  raw_printf(stder
36610 72 2c 20 22 55 73 61 67 65 3a 20 2e 6f 6e 63 65  r, "Usage: .once
36620 20 28 2d 65 7c 2d 78 7c 46 49 4c 45 29 5c 6e 22   (-e|-x|FILE)\n"
36630 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
36640 31 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  1;.        goto 
36650 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69  meta_command_exi
36660 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  t;.      }.     
36670 20 70 2d 3e 6f 75 74 43 6f 75 6e 74 20 3d 20 32   p->outCount = 2
36680 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
36690 20 20 20 70 2d 3e 6f 75 74 43 6f 75 6e 74 20 3d     p->outCount =
366a0 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6f 75   0;.    }.    ou
366b0 74 70 75 74 5f 72 65 73 65 74 28 70 29 3b 0a 20  tput_reset(p);. 
366c0 20 20 20 69 66 28 20 7a 46 69 6c 65 5b 30 5d 3d     if( zFile[0]=
366d0 3d 27 2d 27 20 26 26 20 7a 46 69 6c 65 5b 31 5d  ='-' && zFile[1]
366e0 3d 3d 27 2d 27 20 29 20 7a 46 69 6c 65 2b 2b 3b  =='-' ) zFile++;
366f0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
36700 4e 4f 48 41 56 45 5f 53 59 53 54 45 4d 0a 20 20  NOHAVE_SYSTEM.  
36710 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 46 69    if( strcmp(zFi
36720 6c 65 2c 20 22 2d 65 22 29 3d 3d 30 20 7c 7c 20  le, "-e")==0 || 
36730 73 74 72 63 6d 70 28 7a 46 69 6c 65 2c 20 22 2d  strcmp(zFile, "-
36740 78 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  x")==0 ){.      
36750 70 2d 3e 64 6f 58 64 67 4f 70 65 6e 20 3d 20 31  p->doXdgOpen = 1
36760 3b 0a 20 20 20 20 20 20 6f 75 74 70 75 74 4d 6f  ;.      outputMo
36770 64 65 50 75 73 68 28 70 29 3b 0a 20 20 20 20 20  dePush(p);.     
36780 20 69 66 28 20 7a 46 69 6c 65 5b 31 5d 3d 3d 27   if( zFile[1]=='
36790 78 27 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 65  x' ){.        ne
367a0 77 54 65 6d 70 46 69 6c 65 28 70 2c 20 22 63 73  wTempFile(p, "cs
367b0 76 22 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  v");.        p->
367c0 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 43 73 76 3b  mode = MODE_Csv;
367d0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
367e0 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66  _snprintf(sizeof
367f0 28 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72  (p->colSeparator
36800 29 2c 20 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74  ), p->colSeparat
36810 6f 72 2c 20 53 45 50 5f 43 6f 6d 6d 61 29 3b 0a  or, SEP_Comma);.
36820 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
36830 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
36840 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 29  p->rowSeparator)
36850 2c 20 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f  , p->rowSeparato
36860 72 2c 20 53 45 50 5f 43 72 4c 66 29 3b 0a 20 20  r, SEP_CrLf);.  
36870 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
36880 20 20 20 6e 65 77 54 65 6d 70 46 69 6c 65 28 70     newTempFile(p
36890 2c 20 22 74 78 74 22 29 3b 0a 20 20 20 20 20 20  , "txt");.      
368a0 20 20 62 54 78 74 4d 6f 64 65 20 3d 20 31 3b 0a    bTxtMode = 1;.
368b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 46        }.      zF
368c0 69 6c 65 20 3d 20 70 2d 3e 7a 54 65 6d 70 46 69  ile = p->zTempFi
368d0 6c 65 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  le;.    }.#endif
368e0 20 2f 2a 20 53 51 4c 49 54 45 5f 4e 4f 48 41 56   /* SQLITE_NOHAV
368f0 45 5f 53 59 53 54 45 4d 20 2a 2f 0a 20 20 20 20  E_SYSTEM */.    
36900 69 66 28 20 7a 46 69 6c 65 5b 30 5d 3d 3d 27 7c  if( zFile[0]=='|
36910 27 20 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  ' ){.#ifdef SQLI
36920 54 45 5f 4f 4d 49 54 5f 50 4f 50 45 4e 0a 20 20  TE_OMIT_POPEN.  
36930 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73      raw_printf(s
36940 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 70  tderr, "Error: p
36950 69 70 65 73 20 61 72 65 20 6e 6f 74 20 73 75 70  ipes are not sup
36960 70 6f 72 74 65 64 20 69 6e 20 74 68 69 73 20 4f  ported in this O
36970 53 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20  S\n");.      rc 
36980 3d 20 31 3b 0a 20 20 20 20 20 20 70 2d 3e 6f 75  = 1;.      p->ou
36990 74 20 3d 20 73 74 64 6f 75 74 3b 0a 23 65 6c 73  t = stdout;.#els
369a0 65 0a 20 20 20 20 20 20 70 2d 3e 6f 75 74 20 3d  e.      p->out =
369b0 20 70 6f 70 65 6e 28 7a 46 69 6c 65 20 2b 20 31   popen(zFile + 1
369c0 2c 20 22 77 22 29 3b 0a 20 20 20 20 20 20 69 66  , "w");.      if
369d0 28 20 70 2d 3e 6f 75 74 3d 3d 30 20 29 7b 0a 20  ( p->out==0 ){. 
369e0 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e         utf8_prin
369f0 74 66 28 73 74 64 65 72 72 2c 22 45 72 72 6f 72  tf(stderr,"Error
36a00 3a 20 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 70 69  : cannot open pi
36a10 70 65 20 5c 22 25 73 5c 22 5c 6e 22 2c 20 7a 46  pe \"%s\"\n", zF
36a20 69 6c 65 20 2b 20 31 29 3b 0a 20 20 20 20 20 20  ile + 1);.      
36a30 20 20 70 2d 3e 6f 75 74 20 3d 20 73 74 64 6f 75    p->out = stdou
36a40 74 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  t;.        rc = 
36a50 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  1;.      }else{.
36a60 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
36a70 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
36a80 70 2d 3e 6f 75 74 66 69 6c 65 29 2c 20 70 2d 3e  p->outfile), p->
36a90 6f 75 74 66 69 6c 65 2c 20 22 25 73 22 2c 20 7a  outfile, "%s", z
36aa0 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 7d 0a 23  File);.      }.#
36ab0 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 7b  endif.    }else{
36ac0 0a 20 20 20 20 20 20 70 2d 3e 6f 75 74 20 3d 20  .      p->out = 
36ad0 6f 75 74 70 75 74 5f 66 69 6c 65 5f 6f 70 65 6e  output_file_open
36ae0 28 7a 46 69 6c 65 2c 20 62 54 78 74 4d 6f 64 65  (zFile, bTxtMode
36af0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  );.      if( p->
36b00 6f 75 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  out==0 ){.      
36b10 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 46 69    if( strcmp(zFi
36b20 6c 65 2c 22 6f 66 66 22 29 21 3d 30 20 29 7b 0a  le,"off")!=0 ){.
36b30 20 20 20 20 20 20 20 20 20 20 75 74 66 38 5f 70            utf8_p
36b40 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 45 72  rintf(stderr,"Er
36b50 72 6f 72 3a 20 63 61 6e 6e 6f 74 20 77 72 69 74  ror: cannot writ
36b60 65 20 74 6f 20 5c 22 25 73 5c 22 5c 6e 22 2c 20  e to \"%s\"\n", 
36b70 7a 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 20 20  zFile);.        
36b80 7d 0a 20 20 20 20 20 20 20 20 70 2d 3e 6f 75 74  }.        p->out
36b90 20 3d 20 73 74 64 6f 75 74 3b 0a 20 20 20 20 20   = stdout;.     
36ba0 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20     rc = 1;.     
36bb0 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20   } else {.      
36bc0 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
36bd0 74 66 28 73 69 7a 65 6f 66 28 70 2d 3e 6f 75 74  tf(sizeof(p->out
36be0 66 69 6c 65 29 2c 20 70 2d 3e 6f 75 74 66 69 6c  file), p->outfil
36bf0 65 2c 20 22 25 73 22 2c 20 7a 46 69 6c 65 29 3b  e, "%s", zFile);
36c00 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
36c10 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d   }else..  if( c=
36c20 3d 27 70 27 20 26 26 20 6e 3e 3d 33 20 26 26 20  ='p' && n>=3 && 
36c30 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d  strncmp(azArg[0]
36c40 2c 20 22 70 61 72 61 6d 65 74 65 72 22 2c 20 6e  , "parameter", n
36c50 29 3d 3d 30 20 29 7b 0a 20 20 20 20 6f 70 65 6e  )==0 ){.    open
36c60 5f 64 62 28 70 2c 30 29 3b 0a 20 20 20 20 69 66  _db(p,0);.    if
36c70 28 20 6e 41 72 67 3c 3d 31 20 29 20 67 6f 74 6f  ( nArg<=1 ) goto
36c80 20 70 61 72 61 6d 65 74 65 72 5f 73 79 6e 74 61   parameter_synta
36c90 78 5f 65 72 72 6f 72 3b 0a 0a 20 20 20 20 2f 2a  x_error;..    /*
36ca0 20 2e 70 61 72 61 6d 65 74 65 72 20 63 6c 65 61   .parameter clea
36cb0 72 0a 20 20 20 20 2a 2a 20 43 6c 65 61 72 20 61  r.    ** Clear a
36cc0 6c 6c 20 62 69 6e 64 20 70 61 72 61 6d 65 74 65  ll bind paramete
36cd0 72 73 20 62 79 20 64 72 6f 70 70 69 6e 67 20 74  rs by dropping t
36ce0 68 65 20 54 45 4d 50 20 74 61 62 6c 65 20 74 68  he TEMP table th
36cf0 61 74 20 68 6f 6c 64 73 20 74 68 65 6d 2e 0a 20  at holds them.. 
36d00 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 41     */.    if( nA
36d10 72 67 3d 3d 32 20 26 26 20 73 74 72 63 6d 70 28  rg==2 && strcmp(
36d20 61 7a 41 72 67 5b 31 5d 2c 22 63 6c 65 61 72 22  azArg[1],"clear"
36d30 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e  )==0 ){.      in
36d40 74 20 77 72 53 63 68 65 6d 61 20 3d 20 30 3b 0a  t wrSchema = 0;.
36d50 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 64 62        sqlite3_db
36d60 5f 63 6f 6e 66 69 67 28 70 2d 3e 64 62 2c 20 53  _config(p->db, S
36d70 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f 57  QLITE_DBCONFIG_W
36d80 52 49 54 41 42 4c 45 5f 53 43 48 45 4d 41 2c 20  RITABLE_SCHEMA, 
36d90 2d 31 2c 20 26 77 72 53 63 68 65 6d 61 29 3b 0a  -1, &wrSchema);.
36da0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 64 62        sqlite3_db
36db0 5f 63 6f 6e 66 69 67 28 70 2d 3e 64 62 2c 20 53  _config(p->db, S
36dc0 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f 57  QLITE_DBCONFIG_W
36dd0 52 49 54 41 42 4c 45 5f 53 43 48 45 4d 41 2c 20  RITABLE_SCHEMA, 
36de0 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  1, 0);.      sql
36df0 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c  ite3_exec(p->db,
36e00 20 22 44 52 4f 50 20 54 41 42 4c 45 20 49 46 20   "DROP TABLE IF 
36e10 45 58 49 53 54 53 20 74 65 6d 70 2e 73 71 6c 69  EXISTS temp.sqli
36e20 74 65 5f 70 61 72 61 6d 65 74 65 72 73 3b 22 2c  te_parameters;",
36e30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
36e40 20 20 20 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20      0, 0, 0);.  
36e50 20 20 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 63      sqlite3_db_c
36e60 6f 6e 66 69 67 28 70 2d 3e 64 62 2c 20 53 51 4c  onfig(p->db, SQL
36e70 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f 57 52 49  ITE_DBCONFIG_WRI
36e80 54 41 42 4c 45 5f 53 43 48 45 4d 41 2c 20 77 72  TABLE_SCHEMA, wr
36e90 53 63 68 65 6d 61 2c 20 30 29 3b 0a 20 20 20 20  Schema, 0);.    
36ea0 7d 65 6c 73 65 0a 0a 20 20 20 20 2f 2a 20 2e 70  }else..    /* .p
36eb0 61 72 61 6d 65 74 65 72 20 6c 69 73 74 0a 20 20  arameter list.  
36ec0 20 20 2a 2a 20 4c 69 73 74 20 61 6c 6c 20 62 69    ** List all bi
36ed0 6e 64 20 70 61 72 61 6d 65 74 65 72 73 2e 0a 20  nd parameters.. 
36ee0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 41     */.    if( nA
36ef0 72 67 3d 3d 32 20 26 26 20 73 74 72 63 6d 70 28  rg==2 && strcmp(
36f00 61 7a 41 72 67 5b 31 5d 2c 22 6c 69 73 74 22 29  azArg[1],"list")
36f10 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
36f20 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
36f30 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 20   = 0;.      int 
36f40 72 78 3b 0a 20 20 20 20 20 20 69 6e 74 20 6c 65  rx;.      int le
36f50 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 78 20  n = 0;.      rx 
36f60 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72  = sqlite3_prepar
36f70 65 5f 76 32 28 70 2d 3e 64 62 2c 0a 20 20 20 20  e_v2(p->db,.    
36f80 20 20 20 20 20 20 20 20 20 22 53 45 4c 45 43 54           "SELECT
36f90 20 6d 61 78 28 6c 65 6e 67 74 68 28 6b 65 79 29   max(length(key)
36fa0 29 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) ".            
36fb0 20 22 46 52 4f 4d 20 74 65 6d 70 2e 73 71 6c 69   "FROM temp.sqli
36fc0 74 65 5f 70 61 72 61 6d 65 74 65 72 73 3b 22 2c  te_parameters;",
36fd0 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b   -1, &pStmt, 0);
36fe0 0a 20 20 20 20 20 20 69 66 28 20 72 78 3d 3d 53  .      if( rx==S
36ff0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 73 71 6c 69  QLITE_OK && sqli
37000 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3d  te3_step(pStmt)=
37010 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20  =SQLITE_ROW ){. 
37020 20 20 20 20 20 20 20 6c 65 6e 20 3d 20 73 71 6c         len = sql
37030 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28  ite3_column_int(
37040 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 20  pStmt, 0);.     
37050 20 20 20 69 66 28 20 6c 65 6e 3e 34 30 20 29 20     if( len>40 ) 
37060 6c 65 6e 20 3d 20 34 30 3b 0a 20 20 20 20 20 20  len = 40;.      
37070 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  }.      sqlite3_
37080 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b  finalize(pStmt);
37090 0a 20 20 20 20 20 20 70 53 74 6d 74 20 3d 20 30  .      pStmt = 0
370a0 3b 0a 20 20 20 20 20 20 69 66 28 20 6c 65 6e 20  ;.      if( len 
370b0 29 7b 0a 20 20 20 20 20 20 20 20 72 78 20 3d 20  ){.        rx = 
370c0 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f  sqlite3_prepare_
370d0 76 32 28 70 2d 3e 64 62 2c 0a 20 20 20 20 20 20  v2(p->db,.      
370e0 20 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 6b         "SELECT k
370f0 65 79 2c 20 71 75 6f 74 65 28 76 61 6c 75 65 29  ey, quote(value)
37100 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   ".             
37110 22 46 52 4f 4d 20 74 65 6d 70 2e 73 71 6c 69 74  "FROM temp.sqlit
37120 65 5f 70 61 72 61 6d 65 74 65 72 73 3b 22 2c 20  e_parameters;", 
37130 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a  -1, &pStmt, 0);.
37140 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 73          while( s
37150 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d  qlite3_step(pStm
37160 74 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29  t)==SQLITE_ROW )
37170 7b 0a 20 20 20 20 20 20 20 20 20 20 75 74 66 38  {.          utf8
37180 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
37190 22 25 2d 2a 73 20 25 73 5c 6e 22 2c 20 6c 65 6e  "%-*s %s\n", len
371a0 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  , sqlite3_column
371b0 5f 74 65 78 74 28 70 53 74 6d 74 2c 30 29 2c 0a  _text(pStmt,0),.
371c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
371d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6f        sqlite3_co
371e0 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c  lumn_text(pStmt,
371f0 31 29 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  1));.        }. 
37200 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
37210 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a  inalize(pStmt);.
37220 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
37230 65 0a 0a 20 20 20 20 2f 2a 20 2e 70 61 72 61 6d  e..    /* .param
37240 65 74 65 72 20 69 6e 69 74 0a 20 20 20 20 2a 2a  eter init.    **
37250 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 54   Make sure the T
37260 45 4d 50 20 74 61 62 6c 65 20 75 73 65 64 20 74  EMP table used t
37270 6f 20 68 6f 6c 64 20 62 69 6e 64 20 70 61 72 61  o hold bind para
37280 6d 65 74 65 72 73 20 65 78 69 73 74 73 2e 0a 20  meters exists.. 
37290 20 20 20 2a 2a 20 43 72 65 61 74 65 20 69 74 20     ** Create it 
372a0 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 20 20  if necessary..  
372b0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 41 72    */.    if( nAr
372c0 67 3d 3d 32 20 26 26 20 73 74 72 63 6d 70 28 61  g==2 && strcmp(a
372d0 7a 41 72 67 5b 31 5d 2c 22 69 6e 69 74 22 29 3d  zArg[1],"init")=
372e0 3d 30 20 29 7b 0a 20 20 20 20 20 20 62 69 6e 64  =0 ){.      bind
372f0 5f 74 61 62 6c 65 5f 69 6e 69 74 28 70 29 3b 0a  _table_init(p);.
37300 20 20 20 20 7d 65 6c 73 65 0a 0a 20 20 20 20 2f      }else..    /
37310 2a 20 2e 70 61 72 61 6d 65 74 65 72 20 73 65 74  * .parameter set
37320 20 4e 41 4d 45 20 56 41 4c 55 45 0a 20 20 20 20   NAME VALUE.    
37330 2a 2a 20 53 65 74 20 6f 72 20 72 65 73 65 74 20  ** Set or reset 
37340 61 20 62 69 6e 64 20 70 61 72 61 6d 65 74 65 72  a bind parameter
37350 2e 20 20 4e 41 4d 45 20 73 68 6f 75 6c 64 20 62  .  NAME should b
37360 65 20 74 68 65 20 66 75 6c 6c 20 70 61 72 61 6d  e the full param
37370 65 74 65 72 0a 20 20 20 20 2a 2a 20 6e 61 6d 65  eter.    ** name
37380 20 65 78 61 63 74 6c 79 20 61 73 20 69 74 20 61   exactly as it a
37390 70 70 65 61 72 73 20 69 6e 20 74 68 65 20 71 75  ppears in the qu
373a0 65 72 79 2e 20 20 28 65 78 3a 20 24 61 62 63 2c  ery.  (ex: $abc,
373b0 20 40 64 65 66 29 2e 20 20 54 68 65 0a 20 20 20   @def).  The.   
373c0 20 2a 2a 20 56 41 4c 55 45 20 63 61 6e 20 62 65   ** VALUE can be
373d0 20 69 6e 20 65 69 74 68 65 72 20 53 51 4c 20 6c   in either SQL l
373e0 69 74 65 72 61 6c 20 6e 6f 74 61 74 69 6f 6e 2c  iteral notation,
373f0 20 6f 72 20 69 66 20 6e 6f 74 20 69 74 20 77 69   or if not it wi
37400 6c 6c 20 62 65 0a 20 20 20 20 2a 2a 20 75 6e 64  ll be.    ** und
37410 65 72 73 74 6f 6f 64 20 74 6f 20 62 65 20 61 20  erstood to be a 
37420 74 65 78 74 20 73 74 72 69 6e 67 2e 0a 20 20 20  text string..   
37430 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 41 72 67   */.    if( nArg
37440 3d 3d 34 20 26 26 20 73 74 72 63 6d 70 28 61 7a  ==4 && strcmp(az
37450 41 72 67 5b 31 5d 2c 22 73 65 74 22 29 3d 3d 30  Arg[1],"set")==0
37460 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 78   ){.      int rx
37470 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 53  ;.      char *zS
37480 71 6c 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ql;.      sqlite
37490 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20  3_stmt *pStmt;. 
374a0 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
374b0 2a 7a 4b 65 79 20 3d 20 61 7a 41 72 67 5b 32 5d  *zKey = azArg[2]
374c0 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  ;.      const ch
374d0 61 72 20 2a 7a 56 61 6c 75 65 20 3d 20 61 7a 41  ar *zValue = azA
374e0 72 67 5b 33 5d 3b 0a 20 20 20 20 20 20 62 69 6e  rg[3];.      bin
374f0 64 5f 74 61 62 6c 65 5f 69 6e 69 74 28 70 29 3b  d_table_init(p);
37500 0a 20 20 20 20 20 20 7a 53 71 6c 20 3d 20 73 71  .      zSql = sq
37510 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20  lite3_mprintf(. 
37520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37530 20 22 52 45 50 4c 41 43 45 20 49 4e 54 4f 20 74   "REPLACE INTO t
37540 65 6d 70 2e 73 71 6c 69 74 65 5f 70 61 72 61 6d  emp.sqlite_param
37550 65 74 65 72 73 28 6b 65 79 2c 76 61 6c 75 65 29  eters(key,value)
37560 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ".              
37570 20 20 20 20 22 56 41 4c 55 45 53 28 25 51 2c 25      "VALUES(%Q,%
37580 73 29 3b 22 2c 20 7a 4b 65 79 2c 20 7a 56 61 6c  s);", zKey, zVal
37590 75 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a  ue);.      if( z
375a0 53 71 6c 3d 3d 30 20 29 20 73 68 65 6c 6c 5f 6f  Sql==0 ) shell_o
375b0 75 74 5f 6f 66 5f 6d 65 6d 6f 72 79 28 29 3b 0a  ut_of_memory();.
375c0 20 20 20 20 20 20 70 53 74 6d 74 20 3d 20 30 3b        pStmt = 0;
375d0 0a 20 20 20 20 20 20 72 78 20 3d 20 73 71 6c 69  .      rx = sqli
375e0 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 70  te3_prepare_v2(p
375f0 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20  ->db, zSql, -1, 
37600 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20  &pStmt, 0);.    
37610 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
37620 53 71 6c 29 3b 0a 20 20 20 20 20 20 69 66 28 20  Sql);.      if( 
37630 72 78 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rx!=SQLITE_OK ){
37640 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
37650 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29  _finalize(pStmt)
37660 3b 0a 20 20 20 20 20 20 20 20 70 53 74 6d 74 20  ;.        pStmt 
37670 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7a 53 71  = 0;.        zSq
37680 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  l = sqlite3_mpri
37690 6e 74 66 28 0a 20 20 20 20 20 20 20 20 20 20 20  ntf(.           
376a0 20 20 20 20 20 20 20 20 22 52 45 50 4c 41 43 45          "REPLACE
376b0 20 49 4e 54 4f 20 74 65 6d 70 2e 73 71 6c 69 74   INTO temp.sqlit
376c0 65 5f 70 61 72 61 6d 65 74 65 72 73 28 6b 65 79  e_parameters(key
376d0 2c 76 61 6c 75 65 29 22 0a 20 20 20 20 20 20 20  ,value)".       
376e0 20 20 20 20 20 20 20 20 20 20 20 20 22 56 41 4c              "VAL
376f0 55 45 53 28 25 51 2c 25 51 29 3b 22 2c 20 7a 4b  UES(%Q,%Q);", zK
37700 65 79 2c 20 7a 56 61 6c 75 65 29 3b 0a 20 20 20  ey, zValue);.   
37710 20 20 20 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30       if( zSql==0
37720 20 29 20 73 68 65 6c 6c 5f 6f 75 74 5f 6f 66 5f   ) shell_out_of_
37730 6d 65 6d 6f 72 79 28 29 3b 0a 20 20 20 20 20 20  memory();.      
37740 20 20 72 78 20 3d 20 73 71 6c 69 74 65 33 5f 70    rx = sqlite3_p
37750 72 65 70 61 72 65 5f 76 32 28 70 2d 3e 64 62 2c  repare_v2(p->db,
37760 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d   zSql, -1, &pStm
37770 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73  t, 0);.        s
37780 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c  qlite3_free(zSql
37790 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
377a0 78 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  x!=SQLITE_OK ){.
377b0 20 20 20 20 20 20 20 20 20 20 75 74 66 38 5f 70            utf8_p
377c0 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 45  rintf(p->out, "E
377d0 72 72 6f 72 3a 20 25 73 5c 6e 22 2c 20 73 71 6c  rror: %s\n", sql
377e0 69 74 65 33 5f 65 72 72 6d 73 67 28 70 2d 3e 64  ite3_errmsg(p->d
377f0 62 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  b));.          s
37800 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(