/ Hex Artifact Content
Login

Artifact 6a9d8a56700d136addc14d1cd25863b8112e5c12e1877f373750bda476ff6314:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 63 6f 64  ile contains cod
0190: 65 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74  e to implement t
01a0: 68 65 20 22 73 71 6c 69 74 65 22 20 63 6f 6d 6d  he "sqlite" comm
01b0: 61 6e 64 20 6c 69 6e 65 0a 2a 2a 20 75 74 69 6c  and line.** util
01c0: 69 74 79 20 66 6f 72 20 61 63 63 65 73 73 69 6e  ity for accessin
01d0: 67 20 53 51 4c 69 74 65 20 64 61 74 61 62 61 73  g SQLite databas
01e0: 65 73 2e 0a 2a 2f 0a 23 69 66 20 28 64 65 66 69  es..*/.#if (defi
01f0: 6e 65 64 28 5f 57 49 4e 33 32 29 20 7c 7c 20 64  ned(_WIN32) || d
0200: 65 66 69 6e 65 64 28 57 49 4e 33 32 29 29 20 26  efined(WIN32)) &
0210: 26 20 21 64 65 66 69 6e 65 64 28 5f 43 52 54 5f  & !defined(_CRT_
0220: 53 45 43 55 52 45 5f 4e 4f 5f 57 41 52 4e 49 4e  SECURE_NO_WARNIN
0230: 47 53 29 0a 2f 2a 20 54 68 69 73 20 6e 65 65 64  GS)./* This need
0240: 73 20 74 6f 20 63 6f 6d 65 20 62 65 66 6f 72 65  s to come before
0250: 20 61 6e 79 20 69 6e 63 6c 75 64 65 73 20 66 6f   any includes fo
0260: 72 20 4d 53 56 43 20 63 6f 6d 70 69 6c 65 72 20  r MSVC compiler 
0270: 2a 2f 0a 23 64 65 66 69 6e 65 20 5f 43 52 54 5f  */.#define _CRT_
0280: 53 45 43 55 52 45 5f 4e 4f 5f 57 41 52 4e 49 4e  SECURE_NO_WARNIN
0290: 47 53 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  GS.#endif../*.**
02a0: 20 57 61 72 6e 69 6e 67 20 70 72 61 67 6d 61 73   Warning pragmas
02b0: 20 63 6f 70 69 65 64 20 66 72 6f 6d 20 6d 73 76   copied from msv
02c0: 63 2e 68 20 69 6e 20 74 68 65 20 63 6f 72 65 2e  c.h in the core.
02d0: 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28  .*/.#if defined(
02e0: 5f 4d 53 43 5f 56 45 52 29 0a 23 70 72 61 67 6d  _MSC_VER).#pragm
02f0: 61 20 77 61 72 6e 69 6e 67 28 64 69 73 61 62 6c  a warning(disabl
0300: 65 20 3a 20 34 30 35 34 29 0a 23 70 72 61 67 6d  e : 4054).#pragm
0310: 61 20 77 61 72 6e 69 6e 67 28 64 69 73 61 62 6c  a warning(disabl
0320: 65 20 3a 20 34 30 35 35 29 0a 23 70 72 61 67 6d  e : 4055).#pragm
0330: 61 20 77 61 72 6e 69 6e 67 28 64 69 73 61 62 6c  a warning(disabl
0340: 65 20 3a 20 34 31 30 30 29 0a 23 70 72 61 67 6d  e : 4100).#pragm
0350: 61 20 77 61 72 6e 69 6e 67 28 64 69 73 61 62 6c  a warning(disabl
0360: 65 20 3a 20 34 31 32 37 29 0a 23 70 72 61 67 6d  e : 4127).#pragm
0370: 61 20 77 61 72 6e 69 6e 67 28 64 69 73 61 62 6c  a warning(disabl
0380: 65 20 3a 20 34 31 33 30 29 0a 23 70 72 61 67 6d  e : 4130).#pragm
0390: 61 20 77 61 72 6e 69 6e 67 28 64 69 73 61 62 6c  a warning(disabl
03a0: 65 20 3a 20 34 31 35 32 29 0a 23 70 72 61 67 6d  e : 4152).#pragm
03b0: 61 20 77 61 72 6e 69 6e 67 28 64 69 73 61 62 6c  a warning(disabl
03c0: 65 20 3a 20 34 31 38 39 29 0a 23 70 72 61 67 6d  e : 4189).#pragm
03d0: 61 20 77 61 72 6e 69 6e 67 28 64 69 73 61 62 6c  a warning(disabl
03e0: 65 20 3a 20 34 32 30 36 29 0a 23 70 72 61 67 6d  e : 4206).#pragm
03f0: 61 20 77 61 72 6e 69 6e 67 28 64 69 73 61 62 6c  a warning(disabl
0400: 65 20 3a 20 34 32 31 30 29 0a 23 70 72 61 67 6d  e : 4210).#pragm
0410: 61 20 77 61 72 6e 69 6e 67 28 64 69 73 61 62 6c  a warning(disabl
0420: 65 20 3a 20 34 32 33 32 29 0a 23 70 72 61 67 6d  e : 4232).#pragm
0430: 61 20 77 61 72 6e 69 6e 67 28 64 69 73 61 62 6c  a warning(disabl
0440: 65 20 3a 20 34 32 34 34 29 0a 23 70 72 61 67 6d  e : 4244).#pragm
0450: 61 20 77 61 72 6e 69 6e 67 28 64 69 73 61 62 6c  a warning(disabl
0460: 65 20 3a 20 34 33 30 35 29 0a 23 70 72 61 67 6d  e : 4305).#pragm
0470: 61 20 77 61 72 6e 69 6e 67 28 64 69 73 61 62 6c  a warning(disabl
0480: 65 20 3a 20 34 33 30 36 29 0a 23 70 72 61 67 6d  e : 4306).#pragm
0490: 61 20 77 61 72 6e 69 6e 67 28 64 69 73 61 62 6c  a warning(disabl
04a0: 65 20 3a 20 34 37 30 32 29 0a 23 70 72 61 67 6d  e : 4702).#pragm
04b0: 61 20 77 61 72 6e 69 6e 67 28 64 69 73 61 62 6c  a warning(disabl
04c0: 65 20 3a 20 34 37 30 36 29 0a 23 65 6e 64 69 66  e : 4706).#endif
04d0: 20 2f 2a 20 64 65 66 69 6e 65 64 28 5f 4d 53 43   /* defined(_MSC
04e0: 5f 56 45 52 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  _VER) */../*.** 
04f0: 4e 6f 20 73 75 70 70 6f 72 74 20 66 6f 72 20 6c  No support for l
0500: 6f 61 64 61 62 6c 65 20 65 78 74 65 6e 73 69 6f  oadable extensio
0510: 6e 73 20 69 6e 20 56 78 57 6f 72 6b 73 2e 0a 2a  ns in VxWorks..*
0520: 2f 0a 23 69 66 20 28 64 65 66 69 6e 65 64 28 5f  /.#if (defined(_
0530: 5f 52 54 50 5f 5f 29 20 7c 7c 20 64 65 66 69 6e  _RTP__) || defin
0540: 65 64 28 5f 57 52 53 5f 4b 45 52 4e 45 4c 29 29  ed(_WRS_KERNEL))
0550: 20 26 26 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54   && !SQLITE_OMIT
0560: 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 0a  _LOAD_EXTENSION.
0570: 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f  # define SQLITE_
0580: 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53  OMIT_LOAD_EXTENS
0590: 49 4f 4e 20 31 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ION 1.#endif../*
05a0: 0a 2a 2a 20 45 6e 61 62 6c 65 20 6c 61 72 67 65  .** Enable large
05b0: 2d 66 69 6c 65 20 73 75 70 70 6f 72 74 20 66 6f  -file support fo
05c0: 72 20 66 6f 70 65 6e 28 29 20 61 6e 64 20 66 72  r fopen() and fr
05d0: 69 65 6e 64 73 20 6f 6e 20 75 6e 69 78 2e 0a 2a  iends on unix..*
05e0: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
05f0: 5f 44 49 53 41 42 4c 45 5f 4c 46 53 0a 23 20 64  _DISABLE_LFS.# d
0600: 65 66 69 6e 65 20 5f 4c 41 52 47 45 5f 46 49 4c  efine _LARGE_FIL
0610: 45 20 20 20 20 20 20 20 31 0a 23 20 69 66 6e 64  E       1.# ifnd
0620: 65 66 20 5f 46 49 4c 45 5f 4f 46 46 53 45 54 5f  ef _FILE_OFFSET_
0630: 42 49 54 53 0a 23 20 20 20 64 65 66 69 6e 65 20  BITS.#   define 
0640: 5f 46 49 4c 45 5f 4f 46 46 53 45 54 5f 42 49 54  _FILE_OFFSET_BIT
0650: 53 20 36 34 0a 23 20 65 6e 64 69 66 0a 23 20 64  S 64.# endif.# d
0660: 65 66 69 6e 65 20 5f 4c 41 52 47 45 46 49 4c 45  efine _LARGEFILE
0670: 5f 53 4f 55 52 43 45 20 31 0a 23 65 6e 64 69 66  _SOURCE 1.#endif
0680: 0a 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 64 6c  ..#include <stdl
0690: 69 62 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c  ib.h>.#include <
06a0: 73 74 72 69 6e 67 2e 68 3e 0a 23 69 6e 63 6c 75  string.h>.#inclu
06b0: 64 65 20 3c 73 74 64 69 6f 2e 68 3e 0a 23 69 6e  de <stdio.h>.#in
06c0: 63 6c 75 64 65 20 3c 61 73 73 65 72 74 2e 68 3e  clude <assert.h>
06d0: 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74  .#include "sqlit
06e0: 65 33 2e 68 22 0a 74 79 70 65 64 65 66 20 73 71  e3.h".typedef sq
06f0: 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 36 34 3b  lite3_int64 i64;
0700: 0a 74 79 70 65 64 65 66 20 73 71 6c 69 74 65 33  .typedef sqlite3
0710: 5f 75 69 6e 74 36 34 20 75 36 34 3b 0a 74 79 70  _uint64 u64;.typ
0720: 65 64 65 66 20 75 6e 73 69 67 6e 65 64 20 63 68  edef unsigned ch
0730: 61 72 20 75 38 3b 0a 23 69 66 20 53 51 4c 49 54  ar u8;.#if SQLIT
0740: 45 5f 55 53 45 52 5f 41 55 54 48 45 4e 54 49 43  E_USER_AUTHENTIC
0750: 41 54 49 4f 4e 0a 23 20 69 6e 63 6c 75 64 65 20  ATION.# include 
0760: 22 73 71 6c 69 74 65 33 75 73 65 72 61 75 74 68  "sqlite3userauth
0770: 2e 68 22 0a 23 65 6e 64 69 66 0a 23 69 6e 63 6c  .h".#endif.#incl
0780: 75 64 65 20 3c 63 74 79 70 65 2e 68 3e 0a 23 69  ude <ctype.h>.#i
0790: 6e 63 6c 75 64 65 20 3c 73 74 64 61 72 67 2e 68  nclude <stdarg.h
07a0: 3e 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  >..#if !defined(
07b0: 5f 57 49 4e 33 32 29 20 26 26 20 21 64 65 66 69  _WIN32) && !defi
07c0: 6e 65 64 28 57 49 4e 33 32 29 0a 23 20 69 6e 63  ned(WIN32).# inc
07d0: 6c 75 64 65 20 3c 73 69 67 6e 61 6c 2e 68 3e 0a  lude <signal.h>.
07e0: 23 20 69 66 20 21 64 65 66 69 6e 65 64 28 5f 5f  # if !defined(__
07f0: 52 54 50 5f 5f 29 20 26 26 20 21 64 65 66 69 6e  RTP__) && !defin
0800: 65 64 28 5f 57 52 53 5f 4b 45 52 4e 45 4c 29 0a  ed(_WRS_KERNEL).
0810: 23 20 20 69 6e 63 6c 75 64 65 20 3c 70 77 64 2e  #  include <pwd.
0820: 68 3e 0a 23 20 65 6e 64 69 66 0a 23 65 6e 64 69  h>.# endif.#endi
0830: 66 0a 23 69 66 20 28 21 64 65 66 69 6e 65 64 28  f.#if (!defined(
0840: 5f 57 49 4e 33 32 29 20 26 26 20 21 64 65 66 69  _WIN32) && !defi
0850: 6e 65 64 28 57 49 4e 33 32 29 29 20 7c 7c 20 64  ned(WIN32)) || d
0860: 65 66 69 6e 65 64 28 5f 5f 4d 49 4e 47 57 33 32  efined(__MINGW32
0870: 5f 5f 29 0a 23 20 69 6e 63 6c 75 64 65 20 3c 75  __).# include <u
0880: 6e 69 73 74 64 2e 68 3e 0a 23 20 69 6e 63 6c 75  nistd.h>.# inclu
0890: 64 65 20 3c 64 69 72 65 6e 74 2e 68 3e 0a 23 20  de <dirent.h>.# 
08a0: 64 65 66 69 6e 65 20 47 45 54 50 49 44 20 67 65  define GETPID ge
08b0: 74 70 69 64 0a 23 20 69 66 20 64 65 66 69 6e 65  tpid.# if define
08c0: 64 28 5f 5f 4d 49 4e 47 57 33 32 5f 5f 29 0a 23  d(__MINGW32__).#
08d0: 20 20 64 65 66 69 6e 65 20 44 49 52 45 4e 54 20    define DIRENT 
08e0: 64 69 72 65 6e 74 0a 23 20 20 69 66 6e 64 65 66  dirent.#  ifndef
08f0: 20 53 5f 49 53 4c 4e 4b 0a 23 20 20 20 64 65 66   S_ISLNK.#   def
0900: 69 6e 65 20 53 5f 49 53 4c 4e 4b 28 6d 6f 64 65  ine S_ISLNK(mode
0910: 29 20 28 30 29 0a 23 20 20 65 6e 64 69 66 0a 23  ) (0).#  endif.#
0920: 20 65 6e 64 69 66 0a 23 65 6c 73 65 0a 23 20 64   endif.#else.# d
0930: 65 66 69 6e 65 20 47 45 54 50 49 44 20 28 69 6e  efine GETPID (in
0940: 74 29 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63  t)GetCurrentProc
0950: 65 73 73 49 64 0a 23 65 6e 64 69 66 0a 23 69 6e  essId.#endif.#in
0960: 63 6c 75 64 65 20 3c 73 79 73 2f 74 79 70 65 73  clude <sys/types
0970: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79  .h>.#include <sy
0980: 73 2f 73 74 61 74 2e 68 3e 0a 0a 23 69 66 20 48  s/stat.h>..#if H
0990: 41 56 45 5f 52 45 41 44 4c 49 4e 45 0a 23 20 69  AVE_READLINE.# i
09a0: 6e 63 6c 75 64 65 20 3c 72 65 61 64 6c 69 6e 65  nclude <readline
09b0: 2f 72 65 61 64 6c 69 6e 65 2e 68 3e 0a 23 20 69  /readline.h>.# i
09c0: 6e 63 6c 75 64 65 20 3c 72 65 61 64 6c 69 6e 65  nclude <readline
09d0: 2f 68 69 73 74 6f 72 79 2e 68 3e 0a 23 65 6e 64  /history.h>.#end
09e0: 69 66 0a 0a 23 69 66 20 48 41 56 45 5f 45 44 49  if..#if HAVE_EDI
09f0: 54 4c 49 4e 45 0a 23 20 69 6e 63 6c 75 64 65 20  TLINE.# include 
0a00: 3c 65 64 69 74 6c 69 6e 65 2f 72 65 61 64 6c 69  <editline/readli
0a10: 6e 65 2e 68 3e 0a 23 65 6e 64 69 66 0a 0a 23 69  ne.h>.#endif..#i
0a20: 66 20 48 41 56 45 5f 45 44 49 54 4c 49 4e 45 20  f HAVE_EDITLINE 
0a30: 7c 7c 20 48 41 56 45 5f 52 45 41 44 4c 49 4e 45  || HAVE_READLINE
0a40: 0a 0a 23 20 64 65 66 69 6e 65 20 73 68 65 6c 6c  ..# define shell
0a50: 5f 61 64 64 5f 68 69 73 74 6f 72 79 28 58 29 20  _add_history(X) 
0a60: 61 64 64 5f 68 69 73 74 6f 72 79 28 58 29 0a 23  add_history(X).#
0a70: 20 64 65 66 69 6e 65 20 73 68 65 6c 6c 5f 72 65   define shell_re
0a80: 61 64 5f 68 69 73 74 6f 72 79 28 58 29 20 72 65  ad_history(X) re
0a90: 61 64 5f 68 69 73 74 6f 72 79 28 58 29 0a 23 20  ad_history(X).# 
0aa0: 64 65 66 69 6e 65 20 73 68 65 6c 6c 5f 77 72 69  define shell_wri
0ab0: 74 65 5f 68 69 73 74 6f 72 79 28 58 29 20 77 72  te_history(X) wr
0ac0: 69 74 65 5f 68 69 73 74 6f 72 79 28 58 29 0a 23  ite_history(X).#
0ad0: 20 64 65 66 69 6e 65 20 73 68 65 6c 6c 5f 73 74   define shell_st
0ae0: 69 66 6c 65 5f 68 69 73 74 6f 72 79 28 58 29 20  ifle_history(X) 
0af0: 73 74 69 66 6c 65 5f 68 69 73 74 6f 72 79 28 58  stifle_history(X
0b00: 29 0a 23 20 64 65 66 69 6e 65 20 73 68 65 6c 6c  ).# define shell
0b10: 5f 72 65 61 64 6c 69 6e 65 28 58 29 20 72 65 61  _readline(X) rea
0b20: 64 6c 69 6e 65 28 58 29 0a 0a 23 65 6c 69 66 20  dline(X)..#elif 
0b30: 48 41 56 45 5f 4c 49 4e 45 4e 4f 49 53 45 0a 0a  HAVE_LINENOISE..
0b40: 23 20 69 6e 63 6c 75 64 65 20 22 6c 69 6e 65 6e  # include "linen
0b50: 6f 69 73 65 2e 68 22 0a 23 20 64 65 66 69 6e 65  oise.h".# define
0b60: 20 73 68 65 6c 6c 5f 61 64 64 5f 68 69 73 74 6f   shell_add_histo
0b70: 72 79 28 58 29 20 6c 69 6e 65 6e 6f 69 73 65 48  ry(X) linenoiseH
0b80: 69 73 74 6f 72 79 41 64 64 28 58 29 0a 23 20 64  istoryAdd(X).# d
0b90: 65 66 69 6e 65 20 73 68 65 6c 6c 5f 72 65 61 64  efine shell_read
0ba0: 5f 68 69 73 74 6f 72 79 28 58 29 20 6c 69 6e 65  _history(X) line
0bb0: 6e 6f 69 73 65 48 69 73 74 6f 72 79 4c 6f 61 64  noiseHistoryLoad
0bc0: 28 58 29 0a 23 20 64 65 66 69 6e 65 20 73 68 65  (X).# define she
0bd0: 6c 6c 5f 77 72 69 74 65 5f 68 69 73 74 6f 72 79  ll_write_history
0be0: 28 58 29 20 6c 69 6e 65 6e 6f 69 73 65 48 69 73  (X) linenoiseHis
0bf0: 74 6f 72 79 53 61 76 65 28 58 29 0a 23 20 64 65  torySave(X).# de
0c00: 66 69 6e 65 20 73 68 65 6c 6c 5f 73 74 69 66 6c  fine shell_stifl
0c10: 65 5f 68 69 73 74 6f 72 79 28 58 29 20 6c 69 6e  e_history(X) lin
0c20: 65 6e 6f 69 73 65 48 69 73 74 6f 72 79 53 65 74  enoiseHistorySet
0c30: 4d 61 78 4c 65 6e 28 58 29 0a 23 20 64 65 66 69  MaxLen(X).# defi
0c40: 6e 65 20 73 68 65 6c 6c 5f 72 65 61 64 6c 69 6e  ne shell_readlin
0c50: 65 28 58 29 20 6c 69 6e 65 6e 6f 69 73 65 28 58  e(X) linenoise(X
0c60: 29 0a 0a 23 65 6c 73 65 0a 0a 23 20 64 65 66 69  )..#else..# defi
0c70: 6e 65 20 73 68 65 6c 6c 5f 72 65 61 64 5f 68 69  ne shell_read_hi
0c80: 73 74 6f 72 79 28 58 29 0a 23 20 64 65 66 69 6e  story(X).# defin
0c90: 65 20 73 68 65 6c 6c 5f 77 72 69 74 65 5f 68 69  e shell_write_hi
0ca0: 73 74 6f 72 79 28 58 29 0a 23 20 64 65 66 69 6e  story(X).# defin
0cb0: 65 20 73 68 65 6c 6c 5f 73 74 69 66 6c 65 5f 68  e shell_stifle_h
0cc0: 69 73 74 6f 72 79 28 58 29 0a 0a 23 20 64 65 66  istory(X)..# def
0cd0: 69 6e 65 20 53 48 45 4c 4c 5f 55 53 45 5f 4c 4f  ine SHELL_USE_LO
0ce0: 43 41 4c 5f 47 45 54 4c 49 4e 45 20 31 0a 23 65  CAL_GETLINE 1.#e
0cf0: 6e 64 69 66 0a 0a 0a 23 69 66 20 64 65 66 69 6e  ndif...#if defin
0d00: 65 64 28 5f 57 49 4e 33 32 29 20 7c 7c 20 64 65  ed(_WIN32) || de
0d10: 66 69 6e 65 64 28 57 49 4e 33 32 29 0a 23 20 69  fined(WIN32).# i
0d20: 6e 63 6c 75 64 65 20 3c 69 6f 2e 68 3e 0a 23 20  nclude <io.h>.# 
0d30: 69 6e 63 6c 75 64 65 20 3c 66 63 6e 74 6c 2e 68  include <fcntl.h
0d40: 3e 0a 23 20 64 65 66 69 6e 65 20 69 73 61 74 74  >.# define isatt
0d50: 79 28 68 29 20 5f 69 73 61 74 74 79 28 68 29 0a  y(h) _isatty(h).
0d60: 23 20 69 66 6e 64 65 66 20 61 63 63 65 73 73 0a  # ifndef access.
0d70: 23 20 20 64 65 66 69 6e 65 20 61 63 63 65 73 73  #  define access
0d80: 28 66 2c 6d 29 20 5f 61 63 63 65 73 73 28 28 66  (f,m) _access((f
0d90: 29 2c 28 6d 29 29 0a 23 20 65 6e 64 69 66 0a 23  ),(m)).# endif.#
0da0: 20 69 66 6e 64 65 66 20 75 6e 6c 69 6e 6b 0a 23   ifndef unlink.#
0db0: 20 20 64 65 66 69 6e 65 20 75 6e 6c 69 6e 6b 20    define unlink 
0dc0: 5f 75 6e 6c 69 6e 6b 0a 23 20 65 6e 64 69 66 0a  _unlink.# endif.
0dd0: 23 20 75 6e 64 65 66 20 70 6f 70 65 6e 0a 23 20  # undef popen.# 
0de0: 64 65 66 69 6e 65 20 70 6f 70 65 6e 20 5f 70 6f  define popen _po
0df0: 70 65 6e 0a 23 20 75 6e 64 65 66 20 70 63 6c 6f  pen.# undef pclo
0e00: 73 65 0a 23 20 64 65 66 69 6e 65 20 70 63 6c 6f  se.# define pclo
0e10: 73 65 20 5f 70 63 6c 6f 73 65 0a 23 65 6c 73 65  se _pclose.#else
0e20: 0a 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 69  . /* Make sure i
0e30: 73 61 74 74 79 28 29 20 68 61 73 20 61 20 70 72  satty() has a pr
0e40: 6f 74 6f 74 79 70 65 2e 20 2a 2f 0a 20 65 78 74  ototype. */. ext
0e50: 65 72 6e 20 69 6e 74 20 69 73 61 74 74 79 28 69  ern int isatty(i
0e60: 6e 74 29 3b 0a 0a 23 20 69 66 20 21 64 65 66 69  nt);..# if !defi
0e70: 6e 65 64 28 5f 5f 52 54 50 5f 5f 29 20 26 26 20  ned(__RTP__) && 
0e80: 21 64 65 66 69 6e 65 64 28 5f 57 52 53 5f 4b 45  !defined(_WRS_KE
0e90: 52 4e 45 4c 29 0a 20 20 2f 2a 20 70 6f 70 65 6e  RNEL).  /* popen
0ea0: 20 61 6e 64 20 70 63 6c 6f 73 65 20 61 72 65 20   and pclose are 
0eb0: 6e 6f 74 20 43 38 39 20 66 75 6e 63 74 69 6f 6e  not C89 function
0ec0: 73 20 61 6e 64 20 73 6f 20 61 72 65 0a 20 20 2a  s and so are.  *
0ed0: 2a 20 73 6f 6d 65 74 69 6d 65 73 20 6f 6d 69 74  * sometimes omit
0ee0: 74 65 64 20 66 72 6f 6d 20 74 68 65 20 3c 73 74  ted from the <st
0ef0: 64 69 6f 2e 68 3e 20 68 65 61 64 65 72 20 2a 2f  dio.h> header */
0f00: 0a 20 20 20 65 78 74 65 72 6e 20 46 49 4c 45 20  .   extern FILE 
0f10: 2a 70 6f 70 65 6e 28 63 6f 6e 73 74 20 63 68 61  *popen(const cha
0f20: 72 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29 3b  r*,const char*);
0f30: 0a 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 70  .   extern int p
0f40: 63 6c 6f 73 65 28 46 49 4c 45 2a 29 3b 0a 23 20  close(FILE*);.# 
0f50: 65 6c 73 65 0a 23 20 20 64 65 66 69 6e 65 20 53  else.#  define S
0f60: 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 4f 50 45 4e  QLITE_OMIT_POPEN
0f70: 20 31 0a 23 20 65 6e 64 69 66 0a 23 65 6e 64 69   1.# endif.#endi
0f80: 66 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f  f..#if defined(_
0f90: 57 49 4e 33 32 5f 57 43 45 29 0a 2f 2a 20 57 69  WIN32_WCE)./* Wi
0fa0: 6e 64 6f 77 73 20 43 45 20 28 61 72 6d 2d 77 69  ndows CE (arm-wi
0fb0: 6e 63 65 2d 6d 69 6e 67 77 33 32 63 65 2d 67 63  nce-mingw32ce-gc
0fc0: 63 29 20 64 6f 65 73 20 6e 6f 74 20 70 72 6f 76  c) does not prov
0fd0: 69 64 65 20 69 73 61 74 74 79 28 29 0a 20 2a 20  ide isatty(). * 
0fe0: 74 68 75 73 20 77 65 20 61 6c 77 61 79 73 20 61  thus we always a
0ff0: 73 73 75 6d 65 20 74 68 61 74 20 77 65 20 68 61  ssume that we ha
1000: 76 65 20 61 20 63 6f 6e 73 6f 6c 65 2e 20 54 68  ve a console. Th
1010: 61 74 20 63 61 6e 20 62 65 0a 20 2a 20 6f 76 65  at can be. * ove
1020: 72 72 69 64 64 65 6e 20 77 69 74 68 20 74 68 65  rridden with the
1030: 20 2d 62 61 74 63 68 20 63 6f 6d 6d 61 6e 64 20   -batch command 
1040: 6c 69 6e 65 20 6f 70 74 69 6f 6e 2e 0a 20 2a 2f  line option.. */
1050: 0a 23 64 65 66 69 6e 65 20 69 73 61 74 74 79 28  .#define isatty(
1060: 78 29 20 31 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20  x) 1.#endif../* 
1070: 63 74 79 70 65 20 6d 61 63 72 6f 73 20 74 68 61  ctype macros tha
1080: 74 20 77 6f 72 6b 20 77 69 74 68 20 73 69 67 6e  t work with sign
1090: 65 64 20 63 68 61 72 61 63 74 65 72 73 20 2a 2f  ed characters */
10a0: 0a 23 64 65 66 69 6e 65 20 49 73 53 70 61 63 65  .#define IsSpace
10b0: 28 58 29 20 20 69 73 73 70 61 63 65 28 28 75 6e  (X)  isspace((un
10c0: 73 69 67 6e 65 64 20 63 68 61 72 29 58 29 0a 23  signed char)X).#
10d0: 64 65 66 69 6e 65 20 49 73 44 69 67 69 74 28 58  define IsDigit(X
10e0: 29 20 20 69 73 64 69 67 69 74 28 28 75 6e 73 69  )  isdigit((unsi
10f0: 67 6e 65 64 20 63 68 61 72 29 58 29 0a 23 64 65  gned char)X).#de
1100: 66 69 6e 65 20 54 6f 4c 6f 77 65 72 28 58 29 20  fine ToLower(X) 
1110: 20 28 63 68 61 72 29 74 6f 6c 6f 77 65 72 28 28   (char)tolower((
1120: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 29 58 29  unsigned char)X)
1130: 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 57  ..#if defined(_W
1140: 49 4e 33 32 29 20 7c 7c 20 64 65 66 69 6e 65 64  IN32) || defined
1150: 28 57 49 4e 33 32 29 0a 23 69 6e 63 6c 75 64 65  (WIN32).#include
1160: 20 3c 77 69 6e 64 6f 77 73 2e 68 3e 0a 0a 2f 2a   <windows.h>../*
1170: 20 73 74 72 69 6e 67 20 63 6f 6e 76 65 72 73 69   string conversi
1180: 6f 6e 20 72 6f 75 74 69 6e 65 73 20 6f 6e 6c 79  on routines only
1190: 20 6e 65 65 64 65 64 20 6f 6e 20 57 69 6e 33 32   needed on Win32
11a0: 20 2a 2f 0a 65 78 74 65 72 6e 20 63 68 61 72 20   */.extern char 
11b0: 2a 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 75  *sqlite3_win32_u
11c0: 6e 69 63 6f 64 65 5f 74 6f 5f 75 74 66 38 28 4c  nicode_to_utf8(L
11d0: 50 43 57 53 54 52 29 3b 0a 65 78 74 65 72 6e 20  PCWSTR);.extern 
11e0: 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 77 69  char *sqlite3_wi
11f0: 6e 33 32 5f 6d 62 63 73 5f 74 6f 5f 75 74 66 38  n32_mbcs_to_utf8
1200: 5f 76 32 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  _v2(const char *
1210: 2c 20 69 6e 74 29 3b 0a 65 78 74 65 72 6e 20 63  , int);.extern c
1220: 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 77 69 6e  har *sqlite3_win
1230: 33 32 5f 75 74 66 38 5f 74 6f 5f 6d 62 63 73 5f  32_utf8_to_mbcs_
1240: 76 32 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 2c  v2(const char *,
1250: 20 69 6e 74 29 3b 0a 65 78 74 65 72 6e 20 4c 50   int);.extern LP
1260: 57 53 54 52 20 73 71 6c 69 74 65 33 5f 77 69 6e  WSTR sqlite3_win
1270: 33 32 5f 75 74 66 38 5f 74 6f 5f 75 6e 69 63 6f  32_utf8_to_unico
1280: 64 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  de(const char *z
1290: 54 65 78 74 29 3b 0a 23 65 6e 64 69 66 0a 0a 2f  Text);.#endif../
12a0: 2a 20 4f 6e 20 57 69 6e 64 6f 77 73 2c 20 77 65  * On Windows, we
12b0: 20 6e 6f 72 6d 61 6c 6c 79 20 72 75 6e 20 77 69   normally run wi
12c0: 74 68 20 6f 75 74 70 75 74 20 6d 6f 64 65 20 6f  th output mode o
12d0: 66 20 54 45 58 54 20 73 6f 20 74 68 61 74 20 5c  f TEXT so that \
12e0: 6e 20 63 68 61 72 61 63 74 65 72 73 0a 2a 2a 20  n characters.** 
12f0: 61 72 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  are automaticall
1300: 79 20 74 72 61 6e 73 6c 61 74 65 64 20 69 6e 74  y translated int
1310: 6f 20 5c 72 5c 6e 2e 20 20 48 6f 77 65 76 65 72  o \r\n.  However
1320: 2c 20 74 68 69 73 20 62 65 68 61 76 69 6f 72 20  , this behavior 
1330: 6e 65 65 64 73 0a 2a 2a 20 74 6f 20 62 65 20 64  needs.** to be d
1340: 69 73 61 62 6c 65 64 20 69 6e 20 73 6f 6d 65 20  isabled in some 
1350: 63 61 73 65 73 20 28 65 78 3a 20 77 68 65 6e 20  cases (ex: when 
1360: 67 65 6e 65 72 61 74 69 6e 67 20 43 53 56 20 6f  generating CSV o
1370: 75 74 70 75 74 20 61 6e 64 20 77 68 65 6e 0a 2a  utput and when.*
1380: 2a 20 72 65 6e 64 65 72 69 6e 67 20 71 75 6f 74  * rendering quot
1390: 65 64 20 73 74 72 69 6e 67 73 20 74 68 61 74 20  ed strings that 
13a0: 63 6f 6e 74 61 69 6e 20 5c 6e 20 63 68 61 72 61  contain \n chara
13b0: 63 74 65 72 73 29 2e 20 20 54 68 65 20 66 6f 6c  cters).  The fol
13c0: 6c 6f 77 69 6e 67 0a 2a 2a 20 72 6f 75 74 69 6e  lowing.** routin
13d0: 65 73 20 74 61 6b 65 20 63 61 72 65 20 6f 66 20  es take care of 
13e0: 74 68 61 74 2e 0a 2a 2f 0a 23 69 66 20 64 65 66  that..*/.#if def
13f0: 69 6e 65 64 28 5f 57 49 4e 33 32 29 20 7c 7c 20  ined(_WIN32) || 
1400: 64 65 66 69 6e 65 64 28 57 49 4e 33 32 29 0a 73  defined(WIN32).s
1410: 74 61 74 69 63 20 76 6f 69 64 20 73 65 74 42 69  tatic void setBi
1420: 6e 61 72 79 4d 6f 64 65 28 46 49 4c 45 20 2a 66  naryMode(FILE *f
1430: 69 6c 65 2c 20 69 6e 74 20 69 73 4f 75 74 70 75  ile, int isOutpu
1440: 74 29 7b 0a 20 20 69 66 28 20 69 73 4f 75 74 70  t){.  if( isOutp
1450: 75 74 20 29 20 66 66 6c 75 73 68 28 66 69 6c 65  ut ) fflush(file
1460: 29 3b 0a 20 20 5f 73 65 74 6d 6f 64 65 28 5f 66  );.  _setmode(_f
1470: 69 6c 65 6e 6f 28 66 69 6c 65 29 2c 20 5f 4f 5f  ileno(file), _O_
1480: 42 49 4e 41 52 59 29 3b 0a 7d 0a 73 74 61 74 69  BINARY);.}.stati
1490: 63 20 76 6f 69 64 20 73 65 74 54 65 78 74 4d 6f  c void setTextMo
14a0: 64 65 28 46 49 4c 45 20 2a 66 69 6c 65 2c 20 69  de(FILE *file, i
14b0: 6e 74 20 69 73 4f 75 74 70 75 74 29 7b 0a 20 20  nt isOutput){.  
14c0: 69 66 28 20 69 73 4f 75 74 70 75 74 20 29 20 66  if( isOutput ) f
14d0: 66 6c 75 73 68 28 66 69 6c 65 29 3b 0a 20 20 5f  flush(file);.  _
14e0: 73 65 74 6d 6f 64 65 28 5f 66 69 6c 65 6e 6f 28  setmode(_fileno(
14f0: 66 69 6c 65 29 2c 20 5f 4f 5f 54 45 58 54 29 3b  file), _O_TEXT);
1500: 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  .}.#else.# defin
1510: 65 20 73 65 74 42 69 6e 61 72 79 4d 6f 64 65 28  e setBinaryMode(
1520: 58 2c 59 29 0a 23 20 64 65 66 69 6e 65 20 73 65  X,Y).# define se
1530: 74 54 65 78 74 4d 6f 64 65 28 58 2c 59 29 0a 23  tTextMode(X,Y).#
1540: 65 6e 64 69 66 0a 0a 0a 2f 2a 20 54 72 75 65 20  endif.../* True 
1550: 69 66 20 74 68 65 20 74 69 6d 65 72 20 69 73 20  if the timer is 
1560: 65 6e 61 62 6c 65 64 20 2a 2f 0a 73 74 61 74 69  enabled */.stati
1570: 63 20 69 6e 74 20 65 6e 61 62 6c 65 54 69 6d 65  c int enableTime
1580: 72 20 3d 20 30 3b 0a 0a 2f 2a 20 52 65 74 75 72  r = 0;../* Retur
1590: 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 77 61  n the current wa
15a0: 6c 6c 2d 63 6c 6f 63 6b 20 74 69 6d 65 20 2a 2f  ll-clock time */
15b0: 0a 73 74 61 74 69 63 20 73 71 6c 69 74 65 33 5f  .static sqlite3_
15c0: 69 6e 74 36 34 20 74 69 6d 65 4f 66 44 61 79 28  int64 timeOfDay(
15d0: 76 6f 69 64 29 7b 0a 20 20 73 74 61 74 69 63 20  void){.  static 
15e0: 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 63 6c 6f  sqlite3_vfs *clo
15f0: 63 6b 56 66 73 20 3d 20 30 3b 0a 20 20 73 71 6c  ckVfs = 0;.  sql
1600: 69 74 65 33 5f 69 6e 74 36 34 20 74 3b 0a 20 20  ite3_int64 t;.  
1610: 69 66 28 20 63 6c 6f 63 6b 56 66 73 3d 3d 30 20  if( clockVfs==0 
1620: 29 20 63 6c 6f 63 6b 56 66 73 20 3d 20 73 71 6c  ) clockVfs = sql
1630: 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 30 29  ite3_vfs_find(0)
1640: 3b 0a 20 20 69 66 28 20 63 6c 6f 63 6b 56 66 73  ;.  if( clockVfs
1650: 2d 3e 69 56 65 72 73 69 6f 6e 3e 3d 32 20 26 26  ->iVersion>=2 &&
1660: 20 63 6c 6f 63 6b 56 66 73 2d 3e 78 43 75 72 72   clockVfs->xCurr
1670: 65 6e 74 54 69 6d 65 49 6e 74 36 34 21 3d 30 20  entTimeInt64!=0 
1680: 29 7b 0a 20 20 20 20 63 6c 6f 63 6b 56 66 73 2d  ){.    clockVfs-
1690: 3e 78 43 75 72 72 65 6e 74 54 69 6d 65 49 6e 74  >xCurrentTimeInt
16a0: 36 34 28 63 6c 6f 63 6b 56 66 73 2c 20 26 74 29  64(clockVfs, &t)
16b0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64  ;.  }else{.    d
16c0: 6f 75 62 6c 65 20 72 3b 0a 20 20 20 20 63 6c 6f  ouble r;.    clo
16d0: 63 6b 56 66 73 2d 3e 78 43 75 72 72 65 6e 74 54  ckVfs->xCurrentT
16e0: 69 6d 65 28 63 6c 6f 63 6b 56 66 73 2c 20 26 72  ime(clockVfs, &r
16f0: 29 3b 0a 20 20 20 20 74 20 3d 20 28 73 71 6c 69  );.    t = (sqli
1700: 74 65 33 5f 69 6e 74 36 34 29 28 72 2a 38 36 34  te3_int64)(r*864
1710: 30 30 30 30 30 2e 30 29 3b 0a 20 20 7d 0a 20 20  00000.0);.  }.  
1720: 72 65 74 75 72 6e 20 74 3b 0a 7d 0a 0a 23 69 66  return t;.}..#if
1730: 20 21 64 65 66 69 6e 65 64 28 5f 57 49 4e 33 32   !defined(_WIN32
1740: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 57 49  ) && !defined(WI
1750: 4e 33 32 29 20 26 26 20 21 64 65 66 69 6e 65 64  N32) && !defined
1760: 28 5f 5f 6d 69 6e 75 78 29 0a 23 69 6e 63 6c 75  (__minux).#inclu
1770: 64 65 20 3c 73 79 73 2f 74 69 6d 65 2e 68 3e 0a  de <sys/time.h>.
1780: 23 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 72 65  #include <sys/re
1790: 73 6f 75 72 63 65 2e 68 3e 0a 0a 2f 2a 20 56 78  source.h>../* Vx
17a0: 57 6f 72 6b 73 20 64 6f 65 73 20 6e 6f 74 20 73  Works does not s
17b0: 75 70 70 6f 72 74 20 67 65 74 72 75 73 61 67 65  upport getrusage
17c0: 28 29 20 61 73 20 66 61 72 20 61 73 20 77 65 20  () as far as we 
17d0: 63 61 6e 20 64 65 74 65 72 6d 69 6e 65 20 2a 2f  can determine */
17e0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 57 52  .#if defined(_WR
17f0: 53 5f 4b 45 52 4e 45 4c 29 20 7c 7c 20 64 65 66  S_KERNEL) || def
1800: 69 6e 65 64 28 5f 5f 52 54 50 5f 5f 29 0a 73 74  ined(__RTP__).st
1810: 72 75 63 74 20 72 75 73 61 67 65 20 7b 0a 20 20  ruct rusage {.  
1820: 73 74 72 75 63 74 20 74 69 6d 65 76 61 6c 20 72  struct timeval r
1830: 75 5f 75 74 69 6d 65 3b 20 2f 2a 20 75 73 65 72  u_utime; /* user
1840: 20 43 50 55 20 74 69 6d 65 20 75 73 65 64 20 2a   CPU time used *
1850: 2f 0a 20 20 73 74 72 75 63 74 20 74 69 6d 65 76  /.  struct timev
1860: 61 6c 20 72 75 5f 73 74 69 6d 65 3b 20 2f 2a 20  al ru_stime; /* 
1870: 73 79 73 74 65 6d 20 43 50 55 20 74 69 6d 65 20  system CPU time 
1880: 75 73 65 64 20 2a 2f 0a 7d 3b 0a 23 64 65 66 69  used */.};.#defi
1890: 6e 65 20 67 65 74 72 75 73 61 67 65 28 41 2c 42  ne getrusage(A,B
18a0: 29 20 6d 65 6d 73 65 74 28 42 2c 30 2c 73 69 7a  ) memset(B,0,siz
18b0: 65 6f 66 28 2a 42 29 29 0a 23 65 6e 64 69 66 0a  eof(*B)).#endif.
18c0: 0a 2f 2a 20 53 61 76 65 64 20 72 65 73 6f 75 72  ./* Saved resour
18d0: 63 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66  ce information f
18e0: 6f 72 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  or the beginning
18f0: 20 6f 66 20 61 6e 20 6f 70 65 72 61 74 69 6f 6e   of an operation
1900: 20 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63   */.static struc
1910: 74 20 72 75 73 61 67 65 20 73 42 65 67 69 6e 3b  t rusage sBegin;
1920: 20 20 2f 2a 20 43 50 55 20 74 69 6d 65 20 61 74    /* CPU time at
1930: 20 73 74 61 72 74 20 2a 2f 0a 73 74 61 74 69 63   start */.static
1940: 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69   sqlite3_int64 i
1950: 42 65 67 69 6e 3b 20 20 2f 2a 20 57 61 6c 6c 2d  Begin;  /* Wall-
1960: 63 6c 6f 63 6b 20 74 69 6d 65 20 61 74 20 73 74  clock time at st
1970: 61 72 74 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 42 65  art */../*.** Be
1980: 67 69 6e 20 74 69 6d 69 6e 67 20 61 6e 20 6f 70  gin timing an op
1990: 65 72 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69  eration.*/.stati
19a0: 63 20 76 6f 69 64 20 62 65 67 69 6e 54 69 6d 65  c void beginTime
19b0: 72 28 76 6f 69 64 29 7b 0a 20 20 69 66 28 20 65  r(void){.  if( e
19c0: 6e 61 62 6c 65 54 69 6d 65 72 20 29 7b 0a 20 20  nableTimer ){.  
19d0: 20 20 67 65 74 72 75 73 61 67 65 28 52 55 53 41    getrusage(RUSA
19e0: 47 45 5f 53 45 4c 46 2c 20 26 73 42 65 67 69 6e  GE_SELF, &sBegin
19f0: 29 3b 0a 20 20 20 20 69 42 65 67 69 6e 20 3d 20  );.    iBegin = 
1a00: 74 69 6d 65 4f 66 44 61 79 28 29 3b 0a 20 20 7d  timeOfDay();.  }
1a10: 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 74 68  .}../* Return th
1a20: 65 20 64 69 66 66 65 72 65 6e 63 65 20 6f 66 20  e difference of 
1a30: 74 77 6f 20 74 69 6d 65 5f 73 74 72 75 63 74 73  two time_structs
1a40: 20 69 6e 20 73 65 63 6f 6e 64 73 20 2a 2f 0a 73   in seconds */.s
1a50: 74 61 74 69 63 20 64 6f 75 62 6c 65 20 74 69 6d  tatic double tim
1a60: 65 44 69 66 66 28 73 74 72 75 63 74 20 74 69 6d  eDiff(struct tim
1a70: 65 76 61 6c 20 2a 70 53 74 61 72 74 2c 20 73 74  eval *pStart, st
1a80: 72 75 63 74 20 74 69 6d 65 76 61 6c 20 2a 70 45  ruct timeval *pE
1a90: 6e 64 29 7b 0a 20 20 72 65 74 75 72 6e 20 28 70  nd){.  return (p
1aa0: 45 6e 64 2d 3e 74 76 5f 75 73 65 63 20 2d 20 70  End->tv_usec - p
1ab0: 53 74 61 72 74 2d 3e 74 76 5f 75 73 65 63 29 2a  Start->tv_usec)*
1ac0: 30 2e 30 30 30 30 30 31 20 2b 0a 20 20 20 20 20  0.000001 +.     
1ad0: 20 20 20 20 28 64 6f 75 62 6c 65 29 28 70 45 6e      (double)(pEn
1ae0: 64 2d 3e 74 76 5f 73 65 63 20 2d 20 70 53 74 61  d->tv_sec - pSta
1af0: 72 74 2d 3e 74 76 5f 73 65 63 29 3b 0a 7d 0a 0a  rt->tv_sec);.}..
1b00: 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 74 68 65 20  /*.** Print the 
1b10: 74 69 6d 69 6e 67 20 72 65 73 75 6c 74 73 2e 0a  timing results..
1b20: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65  */.static void e
1b30: 6e 64 54 69 6d 65 72 28 76 6f 69 64 29 7b 0a 20  ndTimer(void){. 
1b40: 20 69 66 28 20 65 6e 61 62 6c 65 54 69 6d 65 72   if( enableTimer
1b50: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
1b60: 69 6e 74 36 34 20 69 45 6e 64 20 3d 20 74 69 6d  int64 iEnd = tim
1b70: 65 4f 66 44 61 79 28 29 3b 0a 20 20 20 20 73 74  eOfDay();.    st
1b80: 72 75 63 74 20 72 75 73 61 67 65 20 73 45 6e 64  ruct rusage sEnd
1b90: 3b 0a 20 20 20 20 67 65 74 72 75 73 61 67 65 28  ;.    getrusage(
1ba0: 52 55 53 41 47 45 5f 53 45 4c 46 2c 20 26 73 45  RUSAGE_SELF, &sE
1bb0: 6e 64 29 3b 0a 20 20 20 20 70 72 69 6e 74 66 28  nd);.    printf(
1bc0: 22 52 75 6e 20 54 69 6d 65 3a 20 72 65 61 6c 20  "Run Time: real 
1bd0: 25 2e 33 66 20 75 73 65 72 20 25 66 20 73 79 73  %.3f user %f sys
1be0: 20 25 66 5c 6e 22 2c 0a 20 20 20 20 20 20 20 28   %f\n",.       (
1bf0: 69 45 6e 64 20 2d 20 69 42 65 67 69 6e 29 2a 30  iEnd - iBegin)*0
1c00: 2e 30 30 31 2c 0a 20 20 20 20 20 20 20 74 69 6d  .001,.       tim
1c10: 65 44 69 66 66 28 26 73 42 65 67 69 6e 2e 72 75  eDiff(&sBegin.ru
1c20: 5f 75 74 69 6d 65 2c 20 26 73 45 6e 64 2e 72 75  _utime, &sEnd.ru
1c30: 5f 75 74 69 6d 65 29 2c 0a 20 20 20 20 20 20 20  _utime),.       
1c40: 74 69 6d 65 44 69 66 66 28 26 73 42 65 67 69 6e  timeDiff(&sBegin
1c50: 2e 72 75 5f 73 74 69 6d 65 2c 20 26 73 45 6e 64  .ru_stime, &sEnd
1c60: 2e 72 75 5f 73 74 69 6d 65 29 29 3b 0a 20 20 7d  .ru_stime));.  }
1c70: 0a 7d 0a 0a 23 64 65 66 69 6e 65 20 42 45 47 49  .}..#define BEGI
1c80: 4e 5f 54 49 4d 45 52 20 62 65 67 69 6e 54 69 6d  N_TIMER beginTim
1c90: 65 72 28 29 0a 23 64 65 66 69 6e 65 20 45 4e 44  er().#define END
1ca0: 5f 54 49 4d 45 52 20 65 6e 64 54 69 6d 65 72 28  _TIMER endTimer(
1cb0: 29 0a 23 64 65 66 69 6e 65 20 48 41 53 5f 54 49  ).#define HAS_TI
1cc0: 4d 45 52 20 31 0a 0a 23 65 6c 69 66 20 28 64 65  MER 1..#elif (de
1cd0: 66 69 6e 65 64 28 5f 57 49 4e 33 32 29 20 7c 7c  fined(_WIN32) ||
1ce0: 20 64 65 66 69 6e 65 64 28 57 49 4e 33 32 29 29   defined(WIN32))
1cf0: 0a 0a 2f 2a 20 53 61 76 65 64 20 72 65 73 6f 75  ../* Saved resou
1d00: 72 63 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  rce information 
1d10: 66 6f 72 20 74 68 65 20 62 65 67 69 6e 6e 69 6e  for the beginnin
1d20: 67 20 6f 66 20 61 6e 20 6f 70 65 72 61 74 69 6f  g of an operatio
1d30: 6e 20 2a 2f 0a 73 74 61 74 69 63 20 48 41 4e 44  n */.static HAND
1d40: 4c 45 20 68 50 72 6f 63 65 73 73 3b 0a 73 74 61  LE hProcess;.sta
1d50: 74 69 63 20 46 49 4c 45 54 49 4d 45 20 66 74 4b  tic FILETIME ftK
1d60: 65 72 6e 65 6c 42 65 67 69 6e 3b 0a 73 74 61 74  ernelBegin;.stat
1d70: 69 63 20 46 49 4c 45 54 49 4d 45 20 66 74 55 73  ic FILETIME ftUs
1d80: 65 72 42 65 67 69 6e 3b 0a 73 74 61 74 69 63 20  erBegin;.static 
1d90: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 66 74  sqlite3_int64 ft
1da0: 57 61 6c 6c 42 65 67 69 6e 3b 0a 74 79 70 65 64  WallBegin;.typed
1db0: 65 66 20 42 4f 4f 4c 20 28 57 49 4e 41 50 49 20  ef BOOL (WINAPI 
1dc0: 2a 47 45 54 50 52 4f 43 54 49 4d 45 53 29 28 48  *GETPROCTIMES)(H
1dd0: 41 4e 44 4c 45 2c 20 4c 50 46 49 4c 45 54 49 4d  ANDLE, LPFILETIM
1de0: 45 2c 20 4c 50 46 49 4c 45 54 49 4d 45 2c 0a 20  E, LPFILETIME,. 
1df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e10: 20 20 20 4c 50 46 49 4c 45 54 49 4d 45 2c 20 4c     LPFILETIME, L
1e20: 50 46 49 4c 45 54 49 4d 45 29 3b 0a 73 74 61 74  PFILETIME);.stat
1e30: 69 63 20 47 45 54 50 52 4f 43 54 49 4d 45 53 20  ic GETPROCTIMES 
1e40: 67 65 74 50 72 6f 63 65 73 73 54 69 6d 65 73 41  getProcessTimesA
1e50: 64 64 72 20 3d 20 4e 55 4c 4c 3b 0a 0a 2f 2a 0a  ddr = NULL;../*.
1e60: 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  ** Check to see 
1e70: 69 66 20 77 65 20 68 61 76 65 20 74 69 6d 65 72  if we have timer
1e80: 20 73 75 70 70 6f 72 74 2e 20 20 52 65 74 75 72   support.  Retur
1e90: 6e 20 31 20 69 66 20 6e 65 63 65 73 73 61 72 79  n 1 if necessary
1ea0: 0a 2a 2a 20 73 75 70 70 6f 72 74 20 66 6f 75 6e  .** support foun
1eb0: 64 20 28 6f 72 20 66 6f 75 6e 64 20 70 72 65 76  d (or found prev
1ec0: 69 6f 75 73 6c 79 29 2e 0a 2a 2f 0a 73 74 61 74  iously)..*/.stat
1ed0: 69 63 20 69 6e 74 20 68 61 73 54 69 6d 65 72 28  ic int hasTimer(
1ee0: 76 6f 69 64 29 7b 0a 20 20 69 66 28 20 67 65 74  void){.  if( get
1ef0: 50 72 6f 63 65 73 73 54 69 6d 65 73 41 64 64 72  ProcessTimesAddr
1f00: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31   ){.    return 1
1f10: 3b 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20  ;.  } else {.   
1f20: 20 2f 2a 20 47 65 74 50 72 6f 63 65 73 73 54 69   /* GetProcessTi
1f30: 6d 65 73 28 29 20 69 73 6e 27 74 20 73 75 70 70  mes() isn't supp
1f40: 6f 72 74 65 64 20 69 6e 20 57 49 4e 39 35 20 61  orted in WIN95 a
1f50: 6e 64 20 73 6f 6d 65 20 6f 74 68 65 72 20 57 69  nd some other Wi
1f60: 6e 64 6f 77 73 0a 20 20 20 20 2a 2a 20 76 65 72  ndows.    ** ver
1f70: 73 69 6f 6e 73 2e 20 53 65 65 20 69 66 20 74 68  sions. See if th
1f80: 65 20 76 65 72 73 69 6f 6e 20 77 65 20 61 72 65  e version we are
1f90: 20 72 75 6e 6e 69 6e 67 20 6f 6e 20 68 61 73 20   running on has 
1fa0: 69 74 2c 20 61 6e 64 20 69 66 20 69 74 0a 20 20  it, and if it.  
1fb0: 20 20 2a 2a 20 64 6f 65 73 2c 20 73 61 76 65 20    ** does, save 
1fc0: 6f 66 66 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  off a pointer to
1fd0: 20 69 74 20 61 6e 64 20 74 68 65 20 63 75 72 72   it and the curr
1fe0: 65 6e 74 20 70 72 6f 63 65 73 73 20 68 61 6e 64  ent process hand
1ff0: 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 68  le..    */.    h
2000: 50 72 6f 63 65 73 73 20 3d 20 47 65 74 43 75 72  Process = GetCur
2010: 72 65 6e 74 50 72 6f 63 65 73 73 28 29 3b 0a 20  rentProcess();. 
2020: 20 20 20 69 66 28 20 68 50 72 6f 63 65 73 73 20     if( hProcess 
2030: 29 7b 0a 20 20 20 20 20 20 48 49 4e 53 54 41 4e  ){.      HINSTAN
2040: 43 45 20 68 69 6e 73 74 4c 69 62 20 3d 20 4c 6f  CE hinstLib = Lo
2050: 61 64 4c 69 62 72 61 72 79 28 54 45 58 54 28 22  adLibrary(TEXT("
2060: 4b 65 72 6e 65 6c 33 32 2e 64 6c 6c 22 29 29 3b  Kernel32.dll"));
2070: 0a 20 20 20 20 20 20 69 66 28 20 4e 55 4c 4c 20  .      if( NULL 
2080: 21 3d 20 68 69 6e 73 74 4c 69 62 20 29 7b 0a 20  != hinstLib ){. 
2090: 20 20 20 20 20 20 20 67 65 74 50 72 6f 63 65 73         getProces
20a0: 73 54 69 6d 65 73 41 64 64 72 20 3d 0a 20 20 20  sTimesAddr =.   
20b0: 20 20 20 20 20 20 20 20 20 28 47 45 54 50 52 4f           (GETPRO
20c0: 43 54 49 4d 45 53 29 20 47 65 74 50 72 6f 63 41  CTIMES) GetProcA
20d0: 64 64 72 65 73 73 28 68 69 6e 73 74 4c 69 62 2c  ddress(hinstLib,
20e0: 20 22 47 65 74 50 72 6f 63 65 73 73 54 69 6d 65   "GetProcessTime
20f0: 73 22 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  s");.        if(
2100: 20 4e 55 4c 4c 20 21 3d 20 67 65 74 50 72 6f 63   NULL != getProc
2110: 65 73 73 54 69 6d 65 73 41 64 64 72 20 29 7b 0a  essTimesAddr ){.
2120: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
2130: 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   1;.        }.  
2140: 20 20 20 20 20 20 46 72 65 65 4c 69 62 72 61 72        FreeLibrar
2150: 79 28 68 69 6e 73 74 4c 69 62 29 3b 0a 20 20 20  y(hinstLib);.   
2160: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
2170: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
2180: 0a 2a 2a 20 42 65 67 69 6e 20 74 69 6d 69 6e 67  .** Begin timing
2190: 20 61 6e 20 6f 70 65 72 61 74 69 6f 6e 0a 2a 2f   an operation.*/
21a0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62 65 67  .static void beg
21b0: 69 6e 54 69 6d 65 72 28 76 6f 69 64 29 7b 0a 20  inTimer(void){. 
21c0: 20 69 66 28 20 65 6e 61 62 6c 65 54 69 6d 65 72   if( enableTimer
21d0: 20 26 26 20 67 65 74 50 72 6f 63 65 73 73 54 69   && getProcessTi
21e0: 6d 65 73 41 64 64 72 20 29 7b 0a 20 20 20 20 46  mesAddr ){.    F
21f0: 49 4c 45 54 49 4d 45 20 66 74 43 72 65 61 74 69  ILETIME ftCreati
2200: 6f 6e 2c 20 66 74 45 78 69 74 3b 0a 20 20 20 20  on, ftExit;.    
2210: 67 65 74 50 72 6f 63 65 73 73 54 69 6d 65 73 41  getProcessTimesA
2220: 64 64 72 28 68 50 72 6f 63 65 73 73 2c 26 66 74  ddr(hProcess,&ft
2230: 43 72 65 61 74 69 6f 6e 2c 26 66 74 45 78 69 74  Creation,&ftExit
2240: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2250: 20 20 20 20 20 20 20 20 20 20 26 66 74 4b 65 72            &ftKer
2260: 6e 65 6c 42 65 67 69 6e 2c 26 66 74 55 73 65 72  nelBegin,&ftUser
2270: 42 65 67 69 6e 29 3b 0a 20 20 20 20 66 74 57 61  Begin);.    ftWa
2280: 6c 6c 42 65 67 69 6e 20 3d 20 74 69 6d 65 4f 66  llBegin = timeOf
2290: 44 61 79 28 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  Day();.  }.}../*
22a0: 20 52 65 74 75 72 6e 20 74 68 65 20 64 69 66 66   Return the diff
22b0: 65 72 65 6e 63 65 20 6f 66 20 74 77 6f 20 46 49  erence of two FI
22c0: 4c 45 54 49 4d 45 20 73 74 72 75 63 74 73 20 69  LETIME structs i
22d0: 6e 20 73 65 63 6f 6e 64 73 20 2a 2f 0a 73 74 61  n seconds */.sta
22e0: 74 69 63 20 64 6f 75 62 6c 65 20 74 69 6d 65 44  tic double timeD
22f0: 69 66 66 28 46 49 4c 45 54 49 4d 45 20 2a 70 53  iff(FILETIME *pS
2300: 74 61 72 74 2c 20 46 49 4c 45 54 49 4d 45 20 2a  tart, FILETIME *
2310: 70 45 6e 64 29 7b 0a 20 20 73 71 6c 69 74 65 5f  pEnd){.  sqlite_
2320: 69 6e 74 36 34 20 69 36 34 53 74 61 72 74 20 3d  int64 i64Start =
2330: 20 2a 28 28 73 71 6c 69 74 65 5f 69 6e 74 36 34   *((sqlite_int64
2340: 20 2a 29 20 70 53 74 61 72 74 29 3b 0a 20 20 73   *) pStart);.  s
2350: 71 6c 69 74 65 5f 69 6e 74 36 34 20 69 36 34 45  qlite_int64 i64E
2360: 6e 64 20 3d 20 2a 28 28 73 71 6c 69 74 65 5f 69  nd = *((sqlite_i
2370: 6e 74 36 34 20 2a 29 20 70 45 6e 64 29 3b 0a 20  nt64 *) pEnd);. 
2380: 20 72 65 74 75 72 6e 20 28 64 6f 75 62 6c 65 29   return (double)
2390: 20 28 28 69 36 34 45 6e 64 20 2d 20 69 36 34 53   ((i64End - i64S
23a0: 74 61 72 74 29 20 2f 20 31 30 30 30 30 30 30 30  tart) / 10000000
23b0: 2e 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72  .0);.}../*.** Pr
23c0: 69 6e 74 20 74 68 65 20 74 69 6d 69 6e 67 20 72  int the timing r
23d0: 65 73 75 6c 74 73 2e 0a 2a 2f 0a 73 74 61 74 69  esults..*/.stati
23e0: 63 20 76 6f 69 64 20 65 6e 64 54 69 6d 65 72 28  c void endTimer(
23f0: 76 6f 69 64 29 7b 0a 20 20 69 66 28 20 65 6e 61  void){.  if( ena
2400: 62 6c 65 54 69 6d 65 72 20 26 26 20 67 65 74 50  bleTimer && getP
2410: 72 6f 63 65 73 73 54 69 6d 65 73 41 64 64 72 29  rocessTimesAddr)
2420: 7b 0a 20 20 20 20 46 49 4c 45 54 49 4d 45 20 66  {.    FILETIME f
2430: 74 43 72 65 61 74 69 6f 6e 2c 20 66 74 45 78 69  tCreation, ftExi
2440: 74 2c 20 66 74 4b 65 72 6e 65 6c 45 6e 64 2c 20  t, ftKernelEnd, 
2450: 66 74 55 73 65 72 45 6e 64 3b 0a 20 20 20 20 73  ftUserEnd;.    s
2460: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 66 74 57  qlite3_int64 ftW
2470: 61 6c 6c 45 6e 64 20 3d 20 74 69 6d 65 4f 66 44  allEnd = timeOfD
2480: 61 79 28 29 3b 0a 20 20 20 20 67 65 74 50 72 6f  ay();.    getPro
2490: 63 65 73 73 54 69 6d 65 73 41 64 64 72 28 68 50  cessTimesAddr(hP
24a0: 72 6f 63 65 73 73 2c 26 66 74 43 72 65 61 74 69  rocess,&ftCreati
24b0: 6f 6e 2c 26 66 74 45 78 69 74 2c 26 66 74 4b 65  on,&ftExit,&ftKe
24c0: 72 6e 65 6c 45 6e 64 2c 26 66 74 55 73 65 72 45  rnelEnd,&ftUserE
24d0: 6e 64 29 3b 0a 20 20 20 20 70 72 69 6e 74 66 28  nd);.    printf(
24e0: 22 52 75 6e 20 54 69 6d 65 3a 20 72 65 61 6c 20  "Run Time: real 
24f0: 25 2e 33 66 20 75 73 65 72 20 25 66 20 73 79 73  %.3f user %f sys
2500: 20 25 66 5c 6e 22 2c 0a 20 20 20 20 20 20 20 28   %f\n",.       (
2510: 66 74 57 61 6c 6c 45 6e 64 20 2d 20 66 74 57 61  ftWallEnd - ftWa
2520: 6c 6c 42 65 67 69 6e 29 2a 30 2e 30 30 31 2c 0a  llBegin)*0.001,.
2530: 20 20 20 20 20 20 20 74 69 6d 65 44 69 66 66 28         timeDiff(
2540: 26 66 74 55 73 65 72 42 65 67 69 6e 2c 20 26 66  &ftUserBegin, &f
2550: 74 55 73 65 72 45 6e 64 29 2c 0a 20 20 20 20 20  tUserEnd),.     
2560: 20 20 74 69 6d 65 44 69 66 66 28 26 66 74 4b 65    timeDiff(&ftKe
2570: 72 6e 65 6c 42 65 67 69 6e 2c 20 26 66 74 4b 65  rnelBegin, &ftKe
2580: 72 6e 65 6c 45 6e 64 29 29 3b 0a 20 20 7d 0a 7d  rnelEnd));.  }.}
2590: 0a 0a 23 64 65 66 69 6e 65 20 42 45 47 49 4e 5f  ..#define BEGIN_
25a0: 54 49 4d 45 52 20 62 65 67 69 6e 54 69 6d 65 72  TIMER beginTimer
25b0: 28 29 0a 23 64 65 66 69 6e 65 20 45 4e 44 5f 54  ().#define END_T
25c0: 49 4d 45 52 20 65 6e 64 54 69 6d 65 72 28 29 0a  IMER endTimer().
25d0: 23 64 65 66 69 6e 65 20 48 41 53 5f 54 49 4d 45  #define HAS_TIME
25e0: 52 20 68 61 73 54 69 6d 65 72 28 29 0a 0a 23 65  R hasTimer()..#e
25f0: 6c 73 65 0a 23 64 65 66 69 6e 65 20 42 45 47 49  lse.#define BEGI
2600: 4e 5f 54 49 4d 45 52 0a 23 64 65 66 69 6e 65 20  N_TIMER.#define 
2610: 45 4e 44 5f 54 49 4d 45 52 0a 23 64 65 66 69 6e  END_TIMER.#defin
2620: 65 20 48 41 53 5f 54 49 4d 45 52 20 30 0a 23 65  e HAS_TIMER 0.#e
2630: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 55 73 65 64  ndif../*.** Used
2640: 20 74 6f 20 70 72 65 76 65 6e 74 20 77 61 72 6e   to prevent warn
2650: 69 6e 67 73 20 61 62 6f 75 74 20 75 6e 75 73 65  ings about unuse
2660: 64 20 70 61 72 61 6d 65 74 65 72 73 0a 2a 2f 0a  d parameters.*/.
2670: 23 64 65 66 69 6e 65 20 55 4e 55 53 45 44 5f 50  #define UNUSED_P
2680: 41 52 41 4d 45 54 45 52 28 78 29 20 28 76 6f 69  ARAMETER(x) (voi
2690: 64 29 28 78 29 0a 0a 2f 2a 0a 2a 2a 20 4e 75 6d  d)(x)../*.** Num
26a0: 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20  ber of elements 
26b0: 69 6e 20 61 6e 20 61 72 72 61 79 0a 2a 2f 0a 23  in an array.*/.#
26c0: 64 65 66 69 6e 65 20 41 72 72 61 79 53 69 7a 65  define ArraySize
26d0: 28 58 29 20 20 28 69 6e 74 29 28 73 69 7a 65 6f  (X)  (int)(sizeo
26e0: 66 28 58 29 2f 73 69 7a 65 6f 66 28 58 5b 30 5d  f(X)/sizeof(X[0]
26f0: 29 29 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  ))../*.** If the
2700: 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 6c 61 67 20   following flag 
2710: 69 73 20 73 65 74 2c 20 74 68 65 6e 20 63 6f 6d  is set, then com
2720: 6d 61 6e 64 20 65 78 65 63 75 74 69 6f 6e 20 73  mand execution s
2730: 74 6f 70 73 0a 2a 2a 20 61 74 20 61 6e 20 65 72  tops.** at an er
2740: 72 6f 72 20 69 66 20 77 65 20 61 72 65 20 6e 6f  ror if we are no
2750: 74 20 69 6e 74 65 72 61 63 74 69 76 65 2e 0a 2a  t interactive..*
2760: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 61 69  /.static int bai
2770: 6c 5f 6f 6e 5f 65 72 72 6f 72 20 3d 20 30 3b 0a  l_on_error = 0;.
2780: 0a 2f 2a 0a 2a 2a 20 54 68 72 65 61 74 20 73 74  ./*.** Threat st
2790: 64 69 6e 20 61 73 20 61 6e 20 69 6e 74 65 72 61  din as an intera
27a0: 63 74 69 76 65 20 69 6e 70 75 74 20 69 66 20 74  ctive input if t
27b0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72  he following var
27c0: 69 61 62 6c 65 0a 2a 2a 20 69 73 20 74 72 75 65  iable.** is true
27d0: 2e 20 20 4f 74 68 65 72 77 69 73 65 2c 20 61 73  .  Otherwise, as
27e0: 73 75 6d 65 20 73 74 64 69 6e 20 69 73 20 63 6f  sume stdin is co
27f0: 6e 6e 65 63 74 65 64 20 74 6f 20 61 20 66 69 6c  nnected to a fil
2800: 65 20 6f 72 20 70 69 70 65 2e 0a 2a 2f 0a 73 74  e or pipe..*/.st
2810: 61 74 69 63 20 69 6e 74 20 73 74 64 69 6e 5f 69  atic int stdin_i
2820: 73 5f 69 6e 74 65 72 61 63 74 69 76 65 20 3d 20  s_interactive = 
2830: 31 3b 0a 0a 2f 2a 0a 2a 2a 20 4f 6e 20 57 69 6e  1;../*.** On Win
2840: 64 6f 77 73 20 73 79 73 74 65 6d 73 20 77 65 20  dows systems we 
2850: 68 61 76 65 20 74 6f 20 6b 6e 6f 77 20 69 66 20  have to know if 
2860: 73 74 61 6e 64 61 72 64 20 6f 75 74 70 75 74 20  standard output 
2870: 69 73 20 61 20 63 6f 6e 73 6f 6c 65 0a 2a 2a 20  is a console.** 
2880: 69 6e 20 6f 72 64 65 72 20 74 6f 20 74 72 61 6e  in order to tran
2890: 73 6c 61 74 65 20 55 54 46 2d 38 20 69 6e 74 6f  slate UTF-8 into
28a0: 20 4d 42 43 53 2e 20 20 54 68 65 20 66 6f 6c 6c   MBCS.  The foll
28b0: 6f 77 69 6e 67 20 76 61 72 69 61 62 6c 65 20 69  owing variable i
28c0: 73 0a 2a 2a 20 74 72 75 65 20 69 66 20 74 72 61  s.** true if tra
28d0: 6e 73 6c 61 74 69 6f 6e 20 69 73 20 72 65 71 75  nslation is requ
28e0: 69 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ired..*/.static 
28f0: 69 6e 74 20 73 74 64 6f 75 74 5f 69 73 5f 63 6f  int stdout_is_co
2900: 6e 73 6f 6c 65 20 3d 20 31 3b 0a 0a 2f 2a 0a 2a  nsole = 1;../*.*
2910: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
2920: 69 73 20 74 68 65 20 6f 70 65 6e 20 53 51 4c 69  is the open SQLi
2930: 74 65 20 64 61 74 61 62 61 73 65 2e 20 20 57 65  te database.  We
2940: 20 6d 61 6b 65 20 61 20 70 6f 69 6e 74 65 72 0a   make a pointer.
2950: 2a 2a 20 74 6f 20 74 68 69 73 20 64 61 74 61 62  ** to this datab
2960: 61 73 65 20 61 20 73 74 61 74 69 63 20 76 61 72  ase a static var
2970: 69 61 62 6c 65 20 73 6f 20 74 68 61 74 20 69 74  iable so that it
2980: 20 63 61 6e 20 62 65 20 61 63 63 65 73 73 65 64   can be accessed
2990: 0a 2a 2a 20 62 79 20 74 68 65 20 53 49 47 49 4e  .** by the SIGIN
29a0: 54 20 68 61 6e 64 6c 65 72 20 74 6f 20 69 6e 74  T handler to int
29b0: 65 72 72 75 70 74 20 64 61 74 61 62 61 73 65 20  errupt database 
29c0: 70 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2f 0a 73  processing..*/.s
29d0: 74 61 74 69 63 20 73 71 6c 69 74 65 33 20 2a 67  tatic sqlite3 *g
29e0: 6c 6f 62 61 6c 44 62 20 3d 20 30 3b 0a 0a 2f 2a  lobalDb = 0;../*
29f0: 0a 2a 2a 20 54 72 75 65 20 69 66 20 61 6e 20 69  .** True if an i
2a00: 6e 74 65 72 72 75 70 74 20 28 43 6f 6e 74 72 6f  nterrupt (Contro
2a10: 6c 2d 43 29 20 68 61 73 20 62 65 65 6e 20 72 65  l-C) has been re
2a20: 63 65 69 76 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  ceived..*/.stati
2a30: 63 20 76 6f 6c 61 74 69 6c 65 20 69 6e 74 20 73  c volatile int s
2a40: 65 65 6e 49 6e 74 65 72 72 75 70 74 20 3d 20 30  eenInterrupt = 0
2a50: 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73  ;../*.** This is
2a60: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 6f 75 72   the name of our
2a70: 20 70 72 6f 67 72 61 6d 2e 20 49 74 20 69 73 20   program. It is 
2a80: 73 65 74 20 69 6e 20 6d 61 69 6e 28 29 2c 20 75  set in main(), u
2a90: 73 65 64 0a 2a 2a 20 69 6e 20 61 20 6e 75 6d 62  sed.** in a numb
2aa0: 65 72 20 6f 66 20 6f 74 68 65 72 20 70 6c 61 63  er of other plac
2ab0: 65 73 2c 20 6d 6f 73 74 6c 79 20 66 6f 72 20 65  es, mostly for e
2ac0: 72 72 6f 72 20 6d 65 73 73 61 67 65 73 2e 0a 2a  rror messages..*
2ad0: 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 41  /.static char *A
2ae0: 72 67 76 30 3b 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f  rgv0;../*.** Pro
2af0: 6d 70 74 20 73 74 72 69 6e 67 73 2e 20 49 6e 69  mpt strings. Ini
2b00: 74 69 61 6c 69 7a 65 64 20 69 6e 20 6d 61 69 6e  tialized in main
2b10: 2e 20 53 65 74 74 61 62 6c 65 20 77 69 74 68 0a  . Settable with.
2b20: 2a 2a 20 20 20 2e 70 72 6f 6d 70 74 20 6d 61 69  **   .prompt mai
2b30: 6e 20 63 6f 6e 74 69 6e 75 65 0a 2a 2f 0a 73 74  n continue.*/.st
2b40: 61 74 69 63 20 63 68 61 72 20 6d 61 69 6e 50 72  atic char mainPr
2b50: 6f 6d 70 74 5b 32 30 5d 3b 20 20 20 20 20 2f 2a  ompt[20];     /*
2b60: 20 46 69 72 73 74 20 6c 69 6e 65 20 70 72 6f 6d   First line prom
2b70: 70 74 2e 20 64 65 66 61 75 6c 74 3a 20 22 73 71  pt. default: "sq
2b80: 6c 69 74 65 3e 20 22 2a 2f 0a 73 74 61 74 69 63  lite> "*/.static
2b90: 20 63 68 61 72 20 63 6f 6e 74 69 6e 75 65 50 72   char continuePr
2ba0: 6f 6d 70 74 5b 32 30 5d 3b 20 2f 2a 20 43 6f 6e  ompt[20]; /* Con
2bb0: 74 69 6e 75 61 74 69 6f 6e 20 70 72 6f 6d 70 74  tinuation prompt
2bc0: 2e 20 64 65 66 61 75 6c 74 3a 20 22 20 20 20 2e  . default: "   .
2bd0: 2e 2e 3e 20 22 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  ..> " */../*.** 
2be0: 52 65 6e 64 65 72 20 6f 75 74 70 75 74 20 6c 69  Render output li
2bf0: 6b 65 20 66 70 72 69 6e 74 66 28 29 2e 20 20 45  ke fprintf().  E
2c00: 78 63 65 70 74 2c 20 69 66 20 74 68 65 20 6f 75  xcept, if the ou
2c10: 74 70 75 74 20 69 73 20 67 6f 69 6e 67 20 74 6f  tput is going to
2c20: 20 74 68 65 0a 2a 2a 20 63 6f 6e 73 6f 6c 65 20   the.** console 
2c30: 61 6e 64 20 69 66 20 74 68 69 73 20 69 73 20 72  and if this is r
2c40: 75 6e 6e 69 6e 67 20 6f 6e 20 61 20 57 69 6e 64  unning on a Wind
2c50: 6f 77 73 20 6d 61 63 68 69 6e 65 2c 20 74 72 61  ows machine, tra
2c60: 6e 73 6c 61 74 65 20 74 68 65 0a 2a 2a 20 6f 75  nslate the.** ou
2c70: 74 70 75 74 20 66 72 6f 6d 20 55 54 46 2d 38 20  tput from UTF-8 
2c80: 69 6e 74 6f 20 4d 42 43 53 2e 0a 2a 2f 0a 23 69  into MBCS..*/.#i
2c90: 66 20 64 65 66 69 6e 65 64 28 5f 57 49 4e 33 32  f defined(_WIN32
2ca0: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 57 49 4e  ) || defined(WIN
2cb0: 33 32 29 0a 76 6f 69 64 20 75 74 66 38 5f 70 72  32).void utf8_pr
2cc0: 69 6e 74 66 28 46 49 4c 45 20 2a 6f 75 74 2c 20  intf(FILE *out, 
2cd0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72  const char *zFor
2ce0: 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f  mat, ...){.  va_
2cf0: 6c 69 73 74 20 61 70 3b 0a 20 20 76 61 5f 73 74  list ap;.  va_st
2d00: 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29  art(ap, zFormat)
2d10: 3b 0a 20 20 69 66 28 20 73 74 64 6f 75 74 5f 69  ;.  if( stdout_i
2d20: 73 5f 63 6f 6e 73 6f 6c 65 20 26 26 20 28 6f 75  s_console && (ou
2d30: 74 3d 3d 73 74 64 6f 75 74 20 7c 7c 20 6f 75 74  t==stdout || out
2d40: 3d 3d 73 74 64 65 72 72 29 20 29 7b 0a 20 20 20  ==stderr) ){.   
2d50: 20 63 68 61 72 20 2a 7a 31 20 3d 20 73 71 6c 69   char *z1 = sqli
2d60: 74 65 33 5f 76 6d 70 72 69 6e 74 66 28 7a 46 6f  te3_vmprintf(zFo
2d70: 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 20 20 63  rmat, ap);.    c
2d80: 68 61 72 20 2a 7a 32 20 3d 20 73 71 6c 69 74 65  har *z2 = sqlite
2d90: 33 5f 77 69 6e 33 32 5f 75 74 66 38 5f 74 6f 5f  3_win32_utf8_to_
2da0: 6d 62 63 73 5f 76 32 28 7a 31 2c 20 30 29 3b 0a  mbcs_v2(z1, 0);.
2db0: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
2dc0: 28 7a 31 29 3b 0a 20 20 20 20 66 70 75 74 73 28  (z1);.    fputs(
2dd0: 7a 32 2c 20 6f 75 74 29 3b 0a 20 20 20 20 73 71  z2, out);.    sq
2de0: 6c 69 74 65 33 5f 66 72 65 65 28 7a 32 29 3b 0a  lite3_free(z2);.
2df0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 76 66 70    }else{.    vfp
2e00: 72 69 6e 74 66 28 6f 75 74 2c 20 7a 46 6f 72 6d  rintf(out, zForm
2e10: 61 74 2c 20 61 70 29 3b 0a 20 20 7d 0a 20 20 76  at, ap);.  }.  v
2e20: 61 5f 65 6e 64 28 61 70 29 3b 0a 7d 0a 23 65 6c  a_end(ap);.}.#el
2e30: 69 66 20 21 64 65 66 69 6e 65 64 28 75 74 66 38  if !defined(utf8
2e40: 5f 70 72 69 6e 74 66 29 0a 23 20 64 65 66 69 6e  _printf).# defin
2e50: 65 20 75 74 66 38 5f 70 72 69 6e 74 66 20 66 70  e utf8_printf fp
2e60: 72 69 6e 74 66 0a 23 65 6e 64 69 66 0a 0a 2f 2a  rintf.#endif../*
2e70: 0a 2a 2a 20 52 65 6e 64 65 72 20 6f 75 74 70 75  .** Render outpu
2e80: 74 20 6c 69 6b 65 20 66 70 72 69 6e 74 66 28 29  t like fprintf()
2e90: 2e 20 20 54 68 69 73 20 73 68 6f 75 6c 64 20 6e  .  This should n
2ea0: 6f 74 20 62 65 20 75 73 65 64 20 6f 6e 20 61 6e  ot be used on an
2eb0: 79 74 68 69 6e 67 20 74 68 61 74 0a 2a 2a 20 69  ything that.** i
2ec0: 6e 63 6c 75 64 65 73 20 73 74 72 69 6e 67 20 66  ncludes string f
2ed0: 6f 72 6d 61 74 74 69 6e 67 20 28 65 2e 67 2e 20  ormatting (e.g. 
2ee0: 22 25 73 22 29 2e 0a 2a 2f 0a 23 69 66 20 21 64  "%s")..*/.#if !d
2ef0: 65 66 69 6e 65 64 28 72 61 77 5f 70 72 69 6e 74  efined(raw_print
2f00: 66 29 0a 23 20 64 65 66 69 6e 65 20 72 61 77 5f  f).# define raw_
2f10: 70 72 69 6e 74 66 20 66 70 72 69 6e 74 66 0a 23  printf fprintf.#
2f20: 65 6e 64 69 66 0a 0a 2f 2a 20 49 6e 64 69 63 61  endif../* Indica
2f30: 74 65 20 6f 75 74 2d 6f 66 2d 6d 65 6d 6f 72 79  te out-of-memory
2f40: 20 61 6e 64 20 65 78 69 74 2e 20 2a 2f 0a 73 74   and exit. */.st
2f50: 61 74 69 63 20 76 6f 69 64 20 73 68 65 6c 6c 5f  atic void shell_
2f60: 6f 75 74 5f 6f 66 5f 6d 65 6d 6f 72 79 28 76 6f  out_of_memory(vo
2f70: 69 64 29 7b 0a 20 20 72 61 77 5f 70 72 69 6e 74  id){.  raw_print
2f80: 66 28 73 74 64 65 72 72 2c 22 45 72 72 6f 72 3a  f(stderr,"Error:
2f90: 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 5c 6e   out of memory\n
2fa0: 22 29 3b 0a 20 20 65 78 69 74 28 31 29 3b 0a 7d  ");.  exit(1);.}
2fb0: 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 49 2f  ../*.** Write I/
2fc0: 4f 20 74 72 61 63 65 73 20 74 6f 20 74 68 65 20  O traces to the 
2fd0: 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 65 61 6d  following stream
2fe0: 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
2ff0: 54 45 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41 43  TE_ENABLE_IOTRAC
3000: 45 0a 73 74 61 74 69 63 20 46 49 4c 45 20 2a 69  E.static FILE *i
3010: 6f 74 72 61 63 65 20 3d 20 30 3b 0a 23 65 6e 64  otrace = 0;.#end
3020: 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  if../*.** This r
3030: 6f 75 74 69 6e 65 20 77 6f 72 6b 73 20 6c 69 6b  outine works lik
3040: 65 20 70 72 69 6e 74 66 20 69 6e 20 74 68 61 74  e printf in that
3050: 20 69 74 73 20 66 69 72 73 74 20 61 72 67 75 6d   its first argum
3060: 65 6e 74 20 69 73 20 61 0a 2a 2a 20 66 6f 72 6d  ent is a.** form
3070: 61 74 20 73 74 72 69 6e 67 20 61 6e 64 20 73 75  at string and su
3080: 62 73 65 71 75 65 6e 74 20 61 72 67 75 6d 65 6e  bsequent argumen
3090: 74 73 20 61 72 65 20 76 61 6c 75 65 73 20 74 6f  ts are values to
30a0: 20 62 65 20 73 75 62 73 74 69 74 75 74 65 64 0a   be substituted.
30b0: 2a 2a 20 69 6e 20 70 6c 61 63 65 20 6f 66 20 25  ** in place of %
30c0: 20 66 69 65 6c 64 73 2e 20 20 54 68 65 20 72 65   fields.  The re
30d0: 73 75 6c 74 20 6f 66 20 66 6f 72 6d 61 74 74 69  sult of formatti
30e0: 6e 67 20 74 68 69 73 20 73 74 72 69 6e 67 0a 2a  ng this string.*
30f0: 2a 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20  * is written to 
3100: 69 6f 74 72 61 63 65 2e 0a 2a 2f 0a 23 69 66 64  iotrace..*/.#ifd
3110: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
3120: 5f 49 4f 54 52 41 43 45 0a 73 74 61 74 69 63 20  _IOTRACE.static 
3130: 76 6f 69 64 20 53 51 4c 49 54 45 5f 43 44 45 43  void SQLITE_CDEC
3140: 4c 20 69 6f 74 72 61 63 65 50 72 69 6e 74 66 28  L iotracePrintf(
3150: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72  const char *zFor
3160: 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f  mat, ...){.  va_
3170: 6c 69 73 74 20 61 70 3b 0a 20 20 63 68 61 72 20  list ap;.  char 
3180: 2a 7a 3b 0a 20 20 69 66 28 20 69 6f 74 72 61 63  *z;.  if( iotrac
3190: 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  e==0 ) return;. 
31a0: 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46   va_start(ap, zF
31b0: 6f 72 6d 61 74 29 3b 0a 20 20 7a 20 3d 20 73 71  ormat);.  z = sq
31c0: 6c 69 74 65 33 5f 76 6d 70 72 69 6e 74 66 28 7a  lite3_vmprintf(z
31d0: 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 76  Format, ap);.  v
31e0: 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 75 74 66  a_end(ap);.  utf
31f0: 38 5f 70 72 69 6e 74 66 28 69 6f 74 72 61 63 65  8_printf(iotrace
3200: 2c 20 22 25 73 22 2c 20 7a 29 3b 0a 20 20 73 71  , "%s", z);.  sq
3210: 6c 69 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a 7d  lite3_free(z);.}
3220: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4f  .#endif../*.** O
3230: 75 74 70 75 74 20 73 74 72 69 6e 67 20 7a 55 74  utput string zUt
3240: 66 20 74 6f 20 73 74 72 65 61 6d 20 70 4f 75 74  f to stream pOut
3250: 20 61 73 20 77 20 63 68 61 72 61 63 74 65 72 73   as w characters
3260: 2e 20 20 49 66 20 77 20 69 73 20 6e 65 67 61 74  .  If w is negat
3270: 69 76 65 2c 0a 2a 2a 20 74 68 65 6e 20 72 69 67  ive,.** then rig
3280: 68 74 2d 6a 75 73 74 69 66 79 20 74 68 65 20 74  ht-justify the t
3290: 65 78 74 2e 20 20 57 20 69 73 20 74 68 65 20 77  ext.  W is the w
32a0: 69 64 74 68 20 69 6e 20 55 54 46 2d 38 20 63 68  idth in UTF-8 ch
32b0: 61 72 61 63 74 65 72 73 2c 20 6e 6f 74 0a 2a 2a  aracters, not.**
32c0: 20 69 6e 20 62 79 74 65 73 2e 20 20 54 68 69 73   in bytes.  This
32d0: 20 69 73 20 64 69 66 66 65 72 65 6e 74 20 66 72   is different fr
32e0: 6f 6d 20 74 68 65 20 25 2a 2e 2a 73 20 73 70 65  om the %*.*s spe
32f0: 63 69 66 69 63 61 74 69 6f 6e 20 69 6e 20 70 72  cification in pr
3300: 69 6e 74 66 0a 2a 2a 20 73 69 6e 63 65 20 77 69  intf.** since wi
3310: 74 68 20 25 2a 2e 2a 73 20 74 68 65 20 77 69 64  th %*.*s the wid
3320: 74 68 20 69 73 20 6d 65 61 73 75 72 65 64 20 69  th is measured i
3330: 6e 20 62 79 74 65 73 2c 20 6e 6f 74 20 63 68 61  n bytes, not cha
3340: 72 61 63 74 65 72 73 2e 0a 2a 2f 0a 73 74 61 74  racters..*/.stat
3350: 69 63 20 76 6f 69 64 20 75 74 66 38 5f 77 69 64  ic void utf8_wid
3360: 74 68 5f 70 72 69 6e 74 28 46 49 4c 45 20 2a 70  th_print(FILE *p
3370: 4f 75 74 2c 20 69 6e 74 20 77 2c 20 63 6f 6e 73  Out, int w, cons
3380: 74 20 63 68 61 72 20 2a 7a 55 74 66 29 7b 0a 20  t char *zUtf){. 
3390: 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 3b   int i;.  int n;
33a0: 0a 20 20 69 6e 74 20 61 77 20 3d 20 77 3c 30 20  .  int aw = w<0 
33b0: 3f 20 2d 77 20 3a 20 77 3b 0a 20 20 63 68 61 72  ? -w : w;.  char
33c0: 20 7a 42 75 66 5b 31 30 30 30 5d 3b 0a 20 20 69   zBuf[1000];.  i
33d0: 66 28 20 61 77 3e 28 69 6e 74 29 73 69 7a 65 6f  f( aw>(int)sizeo
33e0: 66 28 7a 42 75 66 29 2f 33 20 29 20 61 77 20 3d  f(zBuf)/3 ) aw =
33f0: 20 28 69 6e 74 29 73 69 7a 65 6f 66 28 7a 42 75   (int)sizeof(zBu
3400: 66 29 2f 33 3b 0a 20 20 66 6f 72 28 69 3d 6e 3d  f)/3;.  for(i=n=
3410: 30 3b 20 7a 55 74 66 5b 69 5d 3b 20 69 2b 2b 29  0; zUtf[i]; i++)
3420: 7b 0a 20 20 20 20 69 66 28 20 28 7a 55 74 66 5b  {.    if( (zUtf[
3430: 69 5d 26 30 78 63 30 29 21 3d 30 78 38 30 20 29  i]&0xc0)!=0x80 )
3440: 7b 0a 20 20 20 20 20 20 6e 2b 2b 3b 0a 20 20 20  {.      n++;.   
3450: 20 20 20 69 66 28 20 6e 3d 3d 61 77 20 29 7b 0a     if( n==aw ){.
3460: 20 20 20 20 20 20 20 20 64 6f 7b 20 69 2b 2b 3b          do{ i++;
3470: 20 7d 77 68 69 6c 65 28 20 28 7a 55 74 66 5b 69   }while( (zUtf[i
3480: 5d 26 30 78 63 30 29 3d 3d 30 78 38 30 20 29 3b  ]&0xc0)==0x80 );
3490: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
34a0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
34b0: 7d 0a 20 20 69 66 28 20 6e 3e 3d 61 77 20 29 7b  }.  if( n>=aw ){
34c0: 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66  .    utf8_printf
34d0: 28 70 4f 75 74 2c 20 22 25 2e 2a 73 22 2c 20 69  (pOut, "%.*s", i
34e0: 2c 20 7a 55 74 66 29 3b 0a 20 20 7d 65 6c 73 65  , zUtf);.  }else
34f0: 20 69 66 28 20 77 3c 30 20 29 7b 0a 20 20 20 20   if( w<0 ){.    
3500: 75 74 66 38 5f 70 72 69 6e 74 66 28 70 4f 75 74  utf8_printf(pOut
3510: 2c 20 22 25 2a 73 25 73 22 2c 20 61 77 2d 6e 2c  , "%*s%s", aw-n,
3520: 20 22 22 2c 20 7a 55 74 66 29 3b 0a 20 20 7d 65   "", zUtf);.  }e
3530: 6c 73 65 7b 0a 20 20 20 20 75 74 66 38 5f 70 72  lse{.    utf8_pr
3540: 69 6e 74 66 28 70 4f 75 74 2c 20 22 25 73 25 2a  intf(pOut, "%s%*
3550: 73 22 2c 20 7a 55 74 66 2c 20 61 77 2d 6e 2c 20  s", zUtf, aw-n, 
3560: 22 22 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a  "");.  }.}.../*.
3570: 2a 2a 20 44 65 74 65 72 6d 69 6e 65 73 20 69 66  ** Determines if
3580: 20 61 20 73 74 72 69 6e 67 20 69 73 20 61 20 6e   a string is a n
3590: 75 6d 62 65 72 20 6f 66 20 6e 6f 74 2e 0a 2a 2f  umber of not..*/
35a0: 0a 73 74 61 74 69 63 20 69 6e 74 20 69 73 4e 75  .static int isNu
35b0: 6d 62 65 72 28 63 6f 6e 73 74 20 63 68 61 72 20  mber(const char 
35c0: 2a 7a 2c 20 69 6e 74 20 2a 72 65 61 6c 6e 75 6d  *z, int *realnum
35d0: 29 7b 0a 20 20 69 66 28 20 2a 7a 3d 3d 27 2d 27  ){.  if( *z=='-'
35e0: 20 7c 7c 20 2a 7a 3d 3d 27 2b 27 20 29 20 7a 2b   || *z=='+' ) z+
35f0: 2b 3b 0a 20 20 69 66 28 20 21 49 73 44 69 67 69  +;.  if( !IsDigi
3600: 74 28 2a 7a 29 20 29 7b 0a 20 20 20 20 72 65 74  t(*z) ){.    ret
3610: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a 2b 2b  urn 0;.  }.  z++
3620: 3b 0a 20 20 69 66 28 20 72 65 61 6c 6e 75 6d 20  ;.  if( realnum 
3630: 29 20 2a 72 65 61 6c 6e 75 6d 20 3d 20 30 3b 0a  ) *realnum = 0;.
3640: 20 20 77 68 69 6c 65 28 20 49 73 44 69 67 69 74    while( IsDigit
3650: 28 2a 7a 29 20 29 7b 20 7a 2b 2b 3b 20 7d 0a 20  (*z) ){ z++; }. 
3660: 20 69 66 28 20 2a 7a 3d 3d 27 2e 27 20 29 7b 0a   if( *z=='.' ){.
3670: 20 20 20 20 7a 2b 2b 3b 0a 20 20 20 20 69 66 28      z++;.    if(
3680: 20 21 49 73 44 69 67 69 74 28 2a 7a 29 20 29 20   !IsDigit(*z) ) 
3690: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 77 68  return 0;.    wh
36a0: 69 6c 65 28 20 49 73 44 69 67 69 74 28 2a 7a 29  ile( IsDigit(*z)
36b0: 20 29 7b 20 7a 2b 2b 3b 20 7d 0a 20 20 20 20 69   ){ z++; }.    i
36c0: 66 28 20 72 65 61 6c 6e 75 6d 20 29 20 2a 72 65  f( realnum ) *re
36d0: 61 6c 6e 75 6d 20 3d 20 31 3b 0a 20 20 7d 0a 20  alnum = 1;.  }. 
36e0: 20 69 66 28 20 2a 7a 3d 3d 27 65 27 20 7c 7c 20   if( *z=='e' || 
36f0: 2a 7a 3d 3d 27 45 27 20 29 7b 0a 20 20 20 20 7a  *z=='E' ){.    z
3700: 2b 2b 3b 0a 20 20 20 20 69 66 28 20 2a 7a 3d 3d  ++;.    if( *z==
3710: 27 2b 27 20 7c 7c 20 2a 7a 3d 3d 27 2d 27 20 29  '+' || *z=='-' )
3720: 20 7a 2b 2b 3b 0a 20 20 20 20 69 66 28 20 21 49   z++;.    if( !I
3730: 73 44 69 67 69 74 28 2a 7a 29 20 29 20 72 65 74  sDigit(*z) ) ret
3740: 75 72 6e 20 30 3b 0a 20 20 20 20 77 68 69 6c 65  urn 0;.    while
3750: 28 20 49 73 44 69 67 69 74 28 2a 7a 29 20 29 7b  ( IsDigit(*z) ){
3760: 20 7a 2b 2b 3b 20 7d 0a 20 20 20 20 69 66 28 20   z++; }.    if( 
3770: 72 65 61 6c 6e 75 6d 20 29 20 2a 72 65 61 6c 6e  realnum ) *realn
3780: 75 6d 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65  um = 1;.  }.  re
3790: 74 75 72 6e 20 2a 7a 3d 3d 30 3b 0a 7d 0a 0a 2f  turn *z==0;.}../
37a0: 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 61 20 73  *.** Compute a s
37b0: 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 74 68 61  tring length tha
37c0: 74 20 69 73 20 6c 69 6d 69 74 65 64 20 74 6f 20  t is limited to 
37d0: 77 68 61 74 20 63 61 6e 20 62 65 20 73 74 6f 72  what can be stor
37e0: 65 64 20 69 6e 0a 2a 2a 20 6c 6f 77 65 72 20 33  ed in.** lower 3
37f0: 30 20 62 69 74 73 20 6f 66 20 61 20 33 32 2d 62  0 bits of a 32-b
3800: 69 74 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65  it signed intege
3810: 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
3820: 20 73 74 72 6c 65 6e 33 30 28 63 6f 6e 73 74 20   strlen30(const 
3830: 63 68 61 72 20 2a 7a 29 7b 0a 20 20 63 6f 6e 73  char *z){.  cons
3840: 74 20 63 68 61 72 20 2a 7a 32 20 3d 20 7a 3b 0a  t char *z2 = z;.
3850: 20 20 77 68 69 6c 65 28 20 2a 7a 32 20 29 7b 20    while( *z2 ){ 
3860: 7a 32 2b 2b 3b 20 7d 0a 20 20 72 65 74 75 72 6e  z2++; }.  return
3870: 20 30 78 33 66 66 66 66 66 66 66 20 26 20 28 69   0x3fffffff & (i
3880: 6e 74 29 28 7a 32 20 2d 20 7a 29 3b 0a 7d 0a 0a  nt)(z2 - z);.}..
3890: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
38a0: 20 6c 65 6e 67 74 68 20 6f 66 20 61 20 73 74 72   length of a str
38b0: 69 6e 67 20 69 6e 20 63 68 61 72 61 63 74 65 72  ing in character
38c0: 73 2e 20 20 4d 75 6c 74 69 62 79 74 65 20 55 54  s.  Multibyte UT
38d0: 46 38 20 63 68 61 72 61 63 74 65 72 73 0a 2a 2a  F8 characters.**
38e0: 20 63 6f 75 6e 74 20 61 73 20 61 20 73 69 6e 67   count as a sing
38f0: 6c 65 20 63 68 61 72 61 63 74 65 72 2e 0a 2a 2f  le character..*/
3900: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 74 72 6c  .static int strl
3910: 65 6e 43 68 61 72 28 63 6f 6e 73 74 20 63 68 61  enChar(const cha
3920: 72 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 6e 20 3d  r *z){.  int n =
3930: 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 2a 7a 20   0;.  while( *z 
3940: 29 7b 0a 20 20 20 20 69 66 28 20 28 30 78 63 30  ){.    if( (0xc0
3950: 26 2a 28 7a 2b 2b 29 29 21 3d 30 78 38 30 20 29  &*(z++))!=0x80 )
3960: 20 6e 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75   n++;.  }.  retu
3970: 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  rn n;.}../*.** T
3980: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 61 64  his routine read
3990: 73 20 61 20 6c 69 6e 65 20 6f 66 20 74 65 78 74  s a line of text
39a0: 20 66 72 6f 6d 20 46 49 4c 45 20 69 6e 2c 20 73   from FILE in, s
39b0: 74 6f 72 65 73 0a 2a 2a 20 74 68 65 20 74 65 78  tores.** the tex
39c0: 74 20 69 6e 20 6d 65 6d 6f 72 79 20 6f 62 74 61  t in memory obta
39d0: 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63  ined from malloc
39e0: 28 29 20 61 6e 64 20 72 65 74 75 72 6e 73 20 61  () and returns a
39f0: 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74   pointer.** to t
3a00: 68 65 20 74 65 78 74 2e 20 20 4e 55 4c 4c 20 69  he text.  NULL i
3a10: 73 20 72 65 74 75 72 6e 65 64 20 61 74 20 65 6e  s returned at en
3a20: 64 20 6f 66 20 66 69 6c 65 2c 20 6f 72 20 69 66  d of file, or if
3a30: 20 6d 61 6c 6c 6f 63 28 29 0a 2a 2a 20 66 61 69   malloc().** fai
3a40: 6c 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 4c 69  ls..**.** If zLi
3a50: 6e 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 74  ne is not NULL t
3a60: 68 65 6e 20 69 74 20 69 73 20 61 20 6d 61 6c 6c  hen it is a mall
3a70: 6f 63 65 64 20 62 75 66 66 65 72 20 72 65 74 75  oced buffer retu
3a80: 72 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20 61 20 70  rned from.** a p
3a90: 72 65 76 69 6f 75 73 20 63 61 6c 6c 20 74 6f 20  revious call to 
3aa0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74 68 61  this routine tha
3ab0: 74 20 6d 61 79 20 62 65 20 72 65 75 73 65 64 2e  t may be reused.
3ac0: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20  .*/.static char 
3ad0: 2a 6c 6f 63 61 6c 5f 67 65 74 6c 69 6e 65 28 63  *local_getline(c
3ae0: 68 61 72 20 2a 7a 4c 69 6e 65 2c 20 46 49 4c 45  har *zLine, FILE
3af0: 20 2a 69 6e 29 7b 0a 20 20 69 6e 74 20 6e 4c 69   *in){.  int nLi
3b00: 6e 65 20 3d 20 7a 4c 69 6e 65 3d 3d 30 20 3f 20  ne = zLine==0 ? 
3b10: 30 20 3a 20 31 30 30 3b 0a 20 20 69 6e 74 20 6e  0 : 100;.  int n
3b20: 20 3d 20 30 3b 0a 0a 20 20 77 68 69 6c 65 28 20   = 0;..  while( 
3b30: 31 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 2b 31  1 ){.    if( n+1
3b40: 30 30 3e 6e 4c 69 6e 65 20 29 7b 0a 20 20 20 20  00>nLine ){.    
3b50: 20 20 6e 4c 69 6e 65 20 3d 20 6e 4c 69 6e 65 2a    nLine = nLine*
3b60: 32 20 2b 20 31 30 30 3b 0a 20 20 20 20 20 20 7a  2 + 100;.      z
3b70: 4c 69 6e 65 20 3d 20 72 65 61 6c 6c 6f 63 28 7a  Line = realloc(z
3b80: 4c 69 6e 65 2c 20 6e 4c 69 6e 65 29 3b 0a 20 20  Line, nLine);.  
3b90: 20 20 20 20 69 66 28 20 7a 4c 69 6e 65 3d 3d 30      if( zLine==0
3ba0: 20 29 20 73 68 65 6c 6c 5f 6f 75 74 5f 6f 66 5f   ) shell_out_of_
3bb0: 6d 65 6d 6f 72 79 28 29 3b 0a 20 20 20 20 7d 0a  memory();.    }.
3bc0: 20 20 20 20 69 66 28 20 66 67 65 74 73 28 26 7a      if( fgets(&z
3bd0: 4c 69 6e 65 5b 6e 5d 2c 20 6e 4c 69 6e 65 20 2d  Line[n], nLine -
3be0: 20 6e 2c 20 69 6e 29 3d 3d 30 20 29 7b 0a 20 20   n, in)==0 ){.  
3bf0: 20 20 20 20 69 66 28 20 6e 3d 3d 30 20 29 7b 0a      if( n==0 ){.
3c00: 20 20 20 20 20 20 20 20 66 72 65 65 28 7a 4c 69          free(zLi
3c10: 6e 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  ne);.        ret
3c20: 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  urn 0;.      }. 
3c30: 20 20 20 20 20 7a 4c 69 6e 65 5b 6e 5d 20 3d 20       zLine[n] = 
3c40: 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  0;.      break;.
3c50: 20 20 20 20 7d 0a 20 20 20 20 77 68 69 6c 65 28      }.    while(
3c60: 20 7a 4c 69 6e 65 5b 6e 5d 20 29 20 6e 2b 2b 3b   zLine[n] ) n++;
3c70: 0a 20 20 20 20 69 66 28 20 6e 3e 30 20 26 26 20  .    if( n>0 && 
3c80: 7a 4c 69 6e 65 5b 6e 2d 31 5d 3d 3d 27 5c 6e 27  zLine[n-1]=='\n'
3c90: 20 29 7b 0a 20 20 20 20 20 20 6e 2d 2d 3b 0a 20   ){.      n--;. 
3ca0: 20 20 20 20 20 69 66 28 20 6e 3e 30 20 26 26 20       if( n>0 && 
3cb0: 7a 4c 69 6e 65 5b 6e 2d 31 5d 3d 3d 27 5c 72 27  zLine[n-1]=='\r'
3cc0: 20 29 20 6e 2d 2d 3b 0a 20 20 20 20 20 20 7a 4c   ) n--;.      zL
3cd0: 69 6e 65 5b 6e 5d 20 3d 20 30 3b 0a 20 20 20 20  ine[n] = 0;.    
3ce0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
3cf0: 20 7d 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f   }.#if defined(_
3d00: 57 49 4e 33 32 29 20 7c 7c 20 64 65 66 69 6e 65  WIN32) || define
3d10: 64 28 57 49 4e 33 32 29 0a 20 20 2f 2a 20 46 6f  d(WIN32).  /* Fo
3d20: 72 20 69 6e 74 65 72 61 63 74 69 76 65 20 69 6e  r interactive in
3d30: 70 75 74 20 6f 6e 20 57 69 6e 64 6f 77 73 20 73  put on Windows s
3d40: 79 73 74 65 6d 73 2c 20 74 72 61 6e 73 6c 61 74  ystems, translat
3d50: 65 20 74 68 65 0a 20 20 2a 2a 20 6d 75 6c 74 69  e the.  ** multi
3d60: 2d 62 79 74 65 20 63 68 61 72 61 63 74 65 72 73  -byte characters
3d70: 65 74 20 63 68 61 72 61 63 74 65 72 73 20 69 6e  et characters in
3d80: 74 6f 20 55 54 46 2d 38 2e 20 2a 2f 0a 20 20 69  to UTF-8. */.  i
3d90: 66 28 20 73 74 64 69 6e 5f 69 73 5f 69 6e 74 65  f( stdin_is_inte
3da0: 72 61 63 74 69 76 65 20 26 26 20 69 6e 3d 3d 73  ractive && in==s
3db0: 74 64 69 6e 20 29 7b 0a 20 20 20 20 63 68 61 72  tdin ){.    char
3dc0: 20 2a 7a 54 72 61 6e 73 20 3d 20 73 71 6c 69 74   *zTrans = sqlit
3dd0: 65 33 5f 77 69 6e 33 32 5f 6d 62 63 73 5f 74 6f  e3_win32_mbcs_to
3de0: 5f 75 74 66 38 5f 76 32 28 7a 4c 69 6e 65 2c 20  _utf8_v2(zLine, 
3df0: 30 29 3b 0a 20 20 20 20 69 66 28 20 7a 54 72 61  0);.    if( zTra
3e00: 6e 73 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  ns ){.      int 
3e10: 6e 54 72 61 6e 73 20 3d 20 73 74 72 6c 65 6e 33  nTrans = strlen3
3e20: 30 28 7a 54 72 61 6e 73 29 2b 31 3b 0a 20 20 20  0(zTrans)+1;.   
3e30: 20 20 20 69 66 28 20 6e 54 72 61 6e 73 3e 6e 4c     if( nTrans>nL
3e40: 69 6e 65 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  ine ){.        z
3e50: 4c 69 6e 65 20 3d 20 72 65 61 6c 6c 6f 63 28 7a  Line = realloc(z
3e60: 4c 69 6e 65 2c 20 6e 54 72 61 6e 73 29 3b 0a 20  Line, nTrans);. 
3e70: 20 20 20 20 20 20 20 69 66 28 20 7a 4c 69 6e 65         if( zLine
3e80: 3d 3d 30 20 29 20 73 68 65 6c 6c 5f 6f 75 74 5f  ==0 ) shell_out_
3e90: 6f 66 5f 6d 65 6d 6f 72 79 28 29 3b 0a 20 20 20  of_memory();.   
3ea0: 20 20 20 7d 0a 20 20 20 20 20 20 6d 65 6d 63 70     }.      memcp
3eb0: 79 28 7a 4c 69 6e 65 2c 20 7a 54 72 61 6e 73 2c  y(zLine, zTrans,
3ec0: 20 6e 54 72 61 6e 73 29 3b 0a 20 20 20 20 20 20   nTrans);.      
3ed0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 54 72  sqlite3_free(zTr
3ee0: 61 6e 73 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ans);.    }.  }.
3ef0: 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65  #endif /* define
3f00: 64 28 5f 57 49 4e 33 32 29 20 7c 7c 20 64 65 66  d(_WIN32) || def
3f10: 69 6e 65 64 28 57 49 4e 33 32 29 20 2a 2f 0a 20  ined(WIN32) */. 
3f20: 20 72 65 74 75 72 6e 20 7a 4c 69 6e 65 3b 0a 7d   return zLine;.}
3f30: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 72 69 65 76 65  ../*.** Retrieve
3f40: 20 61 20 73 69 6e 67 6c 65 20 6c 69 6e 65 20 6f   a single line o
3f50: 66 20 69 6e 70 75 74 20 74 65 78 74 2e 0a 2a 2a  f input text..**
3f60: 0a 2a 2a 20 49 66 20 69 6e 3d 3d 30 20 74 68 65  .** If in==0 the
3f70: 6e 20 72 65 61 64 20 66 72 6f 6d 20 73 74 61 6e  n read from stan
3f80: 64 61 72 64 20 69 6e 70 75 74 20 61 6e 64 20 70  dard input and p
3f90: 72 6f 6d 70 74 20 62 65 66 6f 72 65 20 65 61 63  rompt before eac
3fa0: 68 20 6c 69 6e 65 2e 0a 2a 2a 20 49 66 20 69 73  h line..** If is
3fb0: 43 6f 6e 74 69 6e 75 61 74 69 6f 6e 20 69 73 20  Continuation is 
3fc0: 74 72 75 65 2c 20 74 68 65 6e 20 61 20 63 6f 6e  true, then a con
3fd0: 74 69 6e 75 61 74 69 6f 6e 20 70 72 6f 6d 70 74  tinuation prompt
3fe0: 20 69 73 20 61 70 70 72 6f 70 72 69 61 74 65 2e   is appropriate.
3ff0: 0a 2a 2a 20 49 66 20 69 73 43 6f 6e 74 69 6e 75  .** If isContinu
4000: 61 74 69 6f 6e 20 69 73 20 7a 65 72 6f 2c 20 74  ation is zero, t
4010: 68 65 6e 20 74 68 65 20 6d 61 69 6e 20 70 72 6f  hen the main pro
4020: 6d 70 74 20 73 68 6f 75 6c 64 20 62 65 20 75 73  mpt should be us
4030: 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 50 72  ed..**.** If zPr
4040: 69 6f 72 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20  ior is not NULL 
4050: 74 68 65 6e 20 69 74 20 69 73 20 61 20 62 75 66  then it is a buf
4060: 66 65 72 20 66 72 6f 6d 20 61 20 70 72 69 6f 72  fer from a prior
4070: 20 63 61 6c 6c 20 74 6f 20 74 68 69 73 0a 2a 2a   call to this.**
4080: 20 72 6f 75 74 69 6e 65 20 74 68 61 74 20 63 61   routine that ca
4090: 6e 20 62 65 20 72 65 75 73 65 64 2e 0a 2a 2a 0a  n be reused..**.
40a0: 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 20 69 73  ** The result is
40b0: 20 73 74 6f 72 65 64 20 69 6e 20 73 70 61 63 65   stored in space
40c0: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d   obtained from m
40d0: 61 6c 6c 6f 63 28 29 20 61 6e 64 20 6d 75 73 74  alloc() and must
40e0: 20 65 69 74 68 65 72 0a 2a 2a 20 62 65 20 66 72   either.** be fr
40f0: 65 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65  eed by the calle
4100: 72 20 6f 72 20 65 6c 73 65 20 70 61 73 73 65 64  r or else passed
4110: 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 69 73 20   back into this 
4120: 72 6f 75 74 69 6e 65 20 76 69 61 20 74 68 65 0a  routine via the.
4130: 2a 2a 20 7a 50 72 69 6f 72 20 61 72 67 75 6d 65  ** zPrior argume
4140: 6e 74 20 66 6f 72 20 72 65 75 73 65 2e 0a 2a 2f  nt for reuse..*/
4150: 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 6f 6e  .static char *on
4160: 65 5f 69 6e 70 75 74 5f 6c 69 6e 65 28 46 49 4c  e_input_line(FIL
4170: 45 20 2a 69 6e 2c 20 63 68 61 72 20 2a 7a 50 72  E *in, char *zPr
4180: 69 6f 72 2c 20 69 6e 74 20 69 73 43 6f 6e 74 69  ior, int isConti
4190: 6e 75 61 74 69 6f 6e 29 7b 0a 20 20 63 68 61 72  nuation){.  char
41a0: 20 2a 7a 50 72 6f 6d 70 74 3b 0a 20 20 63 68 61   *zPrompt;.  cha
41b0: 72 20 2a 7a 52 65 73 75 6c 74 3b 0a 20 20 69 66  r *zResult;.  if
41c0: 28 20 69 6e 21 3d 30 20 29 7b 0a 20 20 20 20 7a  ( in!=0 ){.    z
41d0: 52 65 73 75 6c 74 20 3d 20 6c 6f 63 61 6c 5f 67  Result = local_g
41e0: 65 74 6c 69 6e 65 28 7a 50 72 69 6f 72 2c 20 69  etline(zPrior, i
41f0: 6e 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  n);.  }else{.   
4200: 20 7a 50 72 6f 6d 70 74 20 3d 20 69 73 43 6f 6e   zPrompt = isCon
4210: 74 69 6e 75 61 74 69 6f 6e 20 3f 20 63 6f 6e 74  tinuation ? cont
4220: 69 6e 75 65 50 72 6f 6d 70 74 20 3a 20 6d 61 69  inuePrompt : mai
4230: 6e 50 72 6f 6d 70 74 3b 0a 23 69 66 20 53 48 45  nPrompt;.#if SHE
4240: 4c 4c 5f 55 53 45 5f 4c 4f 43 41 4c 5f 47 45 54  LL_USE_LOCAL_GET
4250: 4c 49 4e 45 0a 20 20 20 20 70 72 69 6e 74 66 28  LINE.    printf(
4260: 22 25 73 22 2c 20 7a 50 72 6f 6d 70 74 29 3b 0a  "%s", zPrompt);.
4270: 20 20 20 20 66 66 6c 75 73 68 28 73 74 64 6f 75      fflush(stdou
4280: 74 29 3b 0a 20 20 20 20 7a 52 65 73 75 6c 74 20  t);.    zResult 
4290: 3d 20 6c 6f 63 61 6c 5f 67 65 74 6c 69 6e 65 28  = local_getline(
42a0: 7a 50 72 69 6f 72 2c 20 73 74 64 69 6e 29 3b 0a  zPrior, stdin);.
42b0: 23 65 6c 73 65 0a 20 20 20 20 66 72 65 65 28 7a  #else.    free(z
42c0: 50 72 69 6f 72 29 3b 0a 20 20 20 20 7a 52 65 73  Prior);.    zRes
42d0: 75 6c 74 20 3d 20 73 68 65 6c 6c 5f 72 65 61 64  ult = shell_read
42e0: 6c 69 6e 65 28 7a 50 72 6f 6d 70 74 29 3b 0a 20  line(zPrompt);. 
42f0: 20 20 20 69 66 28 20 7a 52 65 73 75 6c 74 20 26     if( zResult &
4300: 26 20 2a 7a 52 65 73 75 6c 74 20 29 20 73 68 65  & *zResult ) she
4310: 6c 6c 5f 61 64 64 5f 68 69 73 74 6f 72 79 28 7a  ll_add_history(z
4320: 52 65 73 75 6c 74 29 3b 0a 23 65 6e 64 69 66 0a  Result);.#endif.
4330: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 52 65    }.  return zRe
4340: 73 75 6c 74 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  sult;.}.../*.** 
4350: 52 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75 65  Return the value
4360: 20 6f 66 20 61 20 68 65 78 61 64 65 63 69 6d 61   of a hexadecima
4370: 6c 20 64 69 67 69 74 2e 20 20 52 65 74 75 72 6e  l digit.  Return
4380: 20 2d 31 20 69 66 20 74 68 65 20 69 6e 70 75 74   -1 if the input
4390: 0a 2a 2a 20 69 73 20 6e 6f 74 20 61 20 68 65 78  .** is not a hex
43a0: 20 64 69 67 69 74 2e 0a 2a 2f 0a 73 74 61 74 69   digit..*/.stati
43b0: 63 20 69 6e 74 20 68 65 78 44 69 67 69 74 56 61  c int hexDigitVa
43c0: 6c 75 65 28 63 68 61 72 20 63 29 7b 0a 20 20 69  lue(char c){.  i
43d0: 66 28 20 63 3e 3d 27 30 27 20 26 26 20 63 3c 3d  f( c>='0' && c<=
43e0: 27 39 27 20 29 20 72 65 74 75 72 6e 20 63 20 2d  '9' ) return c -
43f0: 20 27 30 27 3b 0a 20 20 69 66 28 20 63 3e 3d 27   '0';.  if( c>='
4400: 61 27 20 26 26 20 63 3c 3d 27 66 27 20 29 20 72  a' && c<='f' ) r
4410: 65 74 75 72 6e 20 63 20 2d 20 27 61 27 20 2b 20  eturn c - 'a' + 
4420: 31 30 3b 0a 20 20 69 66 28 20 63 3e 3d 27 41 27  10;.  if( c>='A'
4430: 20 26 26 20 63 3c 3d 27 46 27 20 29 20 72 65 74   && c<='F' ) ret
4440: 75 72 6e 20 63 20 2d 20 27 41 27 20 2b 20 31 30  urn c - 'A' + 10
4450: 3b 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d  ;.  return -1;.}
4460: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72 70 72 65  ../*.** Interpre
4470: 74 20 7a 41 72 67 20 61 73 20 61 6e 20 69 6e 74  t zArg as an int
4480: 65 67 65 72 20 76 61 6c 75 65 2c 20 70 6f 73 73  eger value, poss
4490: 69 62 6c 79 20 77 69 74 68 20 73 75 66 66 69 78  ibly with suffix
44a0: 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 71  es..*/.static sq
44b0: 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 6e 74 65  lite3_int64 inte
44c0: 67 65 72 56 61 6c 75 65 28 63 6f 6e 73 74 20 63  gerValue(const c
44d0: 68 61 72 20 2a 7a 41 72 67 29 7b 0a 20 20 73 71  har *zArg){.  sq
44e0: 6c 69 74 65 33 5f 69 6e 74 36 34 20 76 20 3d 20  lite3_int64 v = 
44f0: 30 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73  0;.  static cons
4500: 74 20 73 74 72 75 63 74 20 7b 20 63 68 61 72 20  t struct { char 
4510: 2a 7a 53 75 66 66 69 78 3b 20 69 6e 74 20 69 4d  *zSuffix; int iM
4520: 75 6c 74 3b 20 7d 20 61 4d 75 6c 74 5b 5d 20 3d  ult; } aMult[] =
4530: 20 7b 0a 20 20 20 20 7b 20 22 4b 69 42 22 2c 20   {.    { "KiB", 
4540: 31 30 32 34 20 7d 2c 0a 20 20 20 20 7b 20 22 4d  1024 },.    { "M
4550: 69 42 22 2c 20 31 30 32 34 2a 31 30 32 34 20 7d  iB", 1024*1024 }
4560: 2c 0a 20 20 20 20 7b 20 22 47 69 42 22 2c 20 31  ,.    { "GiB", 1
4570: 30 32 34 2a 31 30 32 34 2a 31 30 32 34 20 7d 2c  024*1024*1024 },
4580: 0a 20 20 20 20 7b 20 22 4b 42 22 2c 20 20 31 30  .    { "KB",  10
4590: 30 30 20 7d 2c 0a 20 20 20 20 7b 20 22 4d 42 22  00 },.    { "MB"
45a0: 2c 20 20 31 30 30 30 30 30 30 20 7d 2c 0a 20 20  ,  1000000 },.  
45b0: 20 20 7b 20 22 47 42 22 2c 20 20 31 30 30 30 30    { "GB",  10000
45c0: 30 30 30 30 30 20 7d 2c 0a 20 20 20 20 7b 20 22  00000 },.    { "
45d0: 4b 22 2c 20 20 20 31 30 30 30 20 7d 2c 0a 20 20  K",   1000 },.  
45e0: 20 20 7b 20 22 4d 22 2c 20 20 20 31 30 30 30 30    { "M",   10000
45f0: 30 30 20 7d 2c 0a 20 20 20 20 7b 20 22 47 22 2c  00 },.    { "G",
4600: 20 20 20 31 30 30 30 30 30 30 30 30 30 20 7d 2c     1000000000 },
4610: 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  .  };.  int i;. 
4620: 20 69 6e 74 20 69 73 4e 65 67 20 3d 20 30 3b 0a   int isNeg = 0;.
4630: 20 20 69 66 28 20 7a 41 72 67 5b 30 5d 3d 3d 27    if( zArg[0]=='
4640: 2d 27 20 29 7b 0a 20 20 20 20 69 73 4e 65 67 20  -' ){.    isNeg 
4650: 3d 20 31 3b 0a 20 20 20 20 7a 41 72 67 2b 2b 3b  = 1;.    zArg++;
4660: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 41 72  .  }else if( zAr
4670: 67 5b 30 5d 3d 3d 27 2b 27 20 29 7b 0a 20 20 20  g[0]=='+' ){.   
4680: 20 7a 41 72 67 2b 2b 3b 0a 20 20 7d 0a 20 20 69   zArg++;.  }.  i
4690: 66 28 20 7a 41 72 67 5b 30 5d 3d 3d 27 30 27 20  f( zArg[0]=='0' 
46a0: 26 26 20 7a 41 72 67 5b 31 5d 3d 3d 27 78 27 20  && zArg[1]=='x' 
46b0: 29 7b 0a 20 20 20 20 69 6e 74 20 78 3b 0a 20 20  ){.    int x;.  
46c0: 20 20 7a 41 72 67 20 2b 3d 20 32 3b 0a 20 20 20    zArg += 2;.   
46d0: 20 77 68 69 6c 65 28 20 28 78 20 3d 20 68 65 78   while( (x = hex
46e0: 44 69 67 69 74 56 61 6c 75 65 28 7a 41 72 67 5b  DigitValue(zArg[
46f0: 30 5d 29 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20  0]))>=0 ){.     
4700: 20 76 20 3d 20 28 76 3c 3c 34 29 20 2b 20 78 3b   v = (v<<4) + x;
4710: 0a 20 20 20 20 20 20 7a 41 72 67 2b 2b 3b 0a 20  .      zArg++;. 
4720: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
4730: 20 20 77 68 69 6c 65 28 20 49 73 44 69 67 69 74    while( IsDigit
4740: 28 7a 41 72 67 5b 30 5d 29 20 29 7b 0a 20 20 20  (zArg[0]) ){.   
4750: 20 20 20 76 20 3d 20 76 2a 31 30 20 2b 20 7a 41     v = v*10 + zA
4760: 72 67 5b 30 5d 20 2d 20 27 30 27 3b 0a 20 20 20  rg[0] - '0';.   
4770: 20 20 20 7a 41 72 67 2b 2b 3b 0a 20 20 20 20 7d     zArg++;.    }
4780: 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20  .  }.  for(i=0; 
4790: 69 3c 41 72 72 61 79 53 69 7a 65 28 61 4d 75 6c  i<ArraySize(aMul
47a0: 74 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  t); i++){.    if
47b0: 28 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d  ( sqlite3_stricm
47c0: 70 28 61 4d 75 6c 74 5b 69 5d 2e 7a 53 75 66 66  p(aMult[i].zSuff
47d0: 69 78 2c 20 7a 41 72 67 29 3d 3d 30 20 29 7b 0a  ix, zArg)==0 ){.
47e0: 20 20 20 20 20 20 76 20 2a 3d 20 61 4d 75 6c 74        v *= aMult
47f0: 5b 69 5d 2e 69 4d 75 6c 74 3b 0a 20 20 20 20 20  [i].iMult;.     
4800: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
4810: 7d 0a 20 20 72 65 74 75 72 6e 20 69 73 4e 65 67  }.  return isNeg
4820: 3f 20 2d 76 20 3a 20 76 3b 0a 7d 0a 0a 2f 2a 0a  ? -v : v;.}../*.
4830: 2a 2a 20 41 20 76 61 72 69 61 62 6c 65 20 6c 65  ** A variable le
4840: 6e 67 74 68 20 73 74 72 69 6e 67 20 74 6f 20 77  ngth string to w
4850: 68 69 63 68 20 6f 6e 65 20 63 61 6e 20 61 70 70  hich one can app
4860: 65 6e 64 20 74 65 78 74 2e 0a 2a 2f 0a 74 79 70  end text..*/.typ
4870: 65 64 65 66 20 73 74 72 75 63 74 20 53 68 65 6c  edef struct Shel
4880: 6c 54 65 78 74 20 53 68 65 6c 6c 54 65 78 74 3b  lText ShellText;
4890: 0a 73 74 72 75 63 74 20 53 68 65 6c 6c 54 65 78  .struct ShellTex
48a0: 74 20 7b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20  t {.  char *z;. 
48b0: 20 69 6e 74 20 6e 3b 0a 20 20 69 6e 74 20 6e 41   int n;.  int nA
48c0: 6c 6c 6f 63 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  lloc;.};../*.** 
48d0: 49 6e 69 74 69 61 6c 69 7a 65 20 61 6e 64 20 64  Initialize and d
48e0: 65 73 74 72 6f 79 20 61 20 53 68 65 6c 6c 54 65  estroy a ShellTe
48f0: 78 74 20 6f 62 6a 65 63 74 0a 2a 2f 0a 73 74 61  xt object.*/.sta
4900: 74 69 63 20 76 6f 69 64 20 69 6e 69 74 54 65 78  tic void initTex
4910: 74 28 53 68 65 6c 6c 54 65 78 74 20 2a 70 29 7b  t(ShellText *p){
4920: 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20  .  memset(p, 0, 
4930: 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 7d 0a 73  sizeof(*p));.}.s
4940: 74 61 74 69 63 20 76 6f 69 64 20 66 72 65 65 54  tatic void freeT
4950: 65 78 74 28 53 68 65 6c 6c 54 65 78 74 20 2a 70  ext(ShellText *p
4960: 29 7b 0a 20 20 66 72 65 65 28 70 2d 3e 7a 29 3b  ){.  free(p->z);
4970: 0a 20 20 69 6e 69 74 54 65 78 74 28 70 29 3b 0a  .  initText(p);.
4980: 7d 0a 0a 2f 2a 20 7a 49 6e 20 69 73 20 65 69 74  }../* zIn is eit
4990: 68 65 72 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  her a pointer to
49a0: 20 61 20 4e 55 4c 4c 2d 74 65 72 6d 69 6e 61 74   a NULL-terminat
49b0: 65 64 20 73 74 72 69 6e 67 20 69 6e 20 6d 65 6d  ed string in mem
49c0: 6f 72 79 20 6f 62 74 61 69 6e 65 64 0a 2a 2a 20  ory obtained.** 
49d0: 66 72 6f 6d 20 6d 61 6c 6c 6f 63 28 29 2c 20 6f  from malloc(), o
49e0: 72 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72  r a NULL pointer
49f0: 2e 20 54 68 65 20 73 74 72 69 6e 67 20 70 6f 69  . The string poi
4a00: 6e 74 65 64 20 74 6f 20 62 79 20 7a 41 70 70 65  nted to by zAppe
4a10: 6e 64 20 69 73 0a 2a 2a 20 61 64 64 65 64 20 74  nd is.** added t
4a20: 6f 20 7a 49 6e 2c 20 61 6e 64 20 74 68 65 20 72  o zIn, and the r
4a30: 65 73 75 6c 74 20 72 65 74 75 72 6e 65 64 20 69  esult returned i
4a40: 6e 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65  n memory obtaine
4a50: 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 28 29 2e  d from malloc().
4a60: 0a 2a 2a 20 7a 49 6e 2c 20 69 66 20 69 74 20 77  .** zIn, if it w
4a70: 61 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69 73 20  as not NULL, is 
4a80: 66 72 65 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  freed..**.** If 
4a90: 74 68 65 20 74 68 69 72 64 20 61 72 67 75 6d 65  the third argume
4aa0: 6e 74 2c 20 71 75 6f 74 65 2c 20 69 73 20 6e 6f  nt, quote, is no
4ab0: 74 20 27 5c 30 27 2c 20 74 68 65 6e 20 69 74 20  t '\0', then it 
4ac0: 69 73 20 75 73 65 64 20 61 73 20 61 0a 2a 2a 20  is used as a.** 
4ad0: 71 75 6f 74 65 20 63 68 61 72 61 63 74 65 72 20  quote character 
4ae0: 66 6f 72 20 7a 41 70 70 65 6e 64 2e 0a 2a 2f 0a  for zAppend..*/.
4af0: 73 74 61 74 69 63 20 76 6f 69 64 20 61 70 70 65  static void appe
4b00: 6e 64 54 65 78 74 28 53 68 65 6c 6c 54 65 78 74  ndText(ShellText
4b10: 20 2a 70 2c 20 63 68 61 72 20 63 6f 6e 73 74 20   *p, char const 
4b20: 2a 7a 41 70 70 65 6e 64 2c 20 63 68 61 72 20 71  *zAppend, char q
4b30: 75 6f 74 65 29 7b 0a 20 20 69 6e 74 20 6c 65 6e  uote){.  int len
4b40: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  ;.  int i;.  int
4b50: 20 6e 41 70 70 65 6e 64 20 3d 20 73 74 72 6c 65   nAppend = strle
4b60: 6e 33 30 28 7a 41 70 70 65 6e 64 29 3b 0a 0a 20  n30(zAppend);.. 
4b70: 20 6c 65 6e 20 3d 20 6e 41 70 70 65 6e 64 2b 70   len = nAppend+p
4b80: 2d 3e 6e 2b 31 3b 0a 20 20 69 66 28 20 71 75 6f  ->n+1;.  if( quo
4b90: 74 65 20 29 7b 0a 20 20 20 20 6c 65 6e 20 2b 3d  te ){.    len +=
4ba0: 20 32 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   2;.    for(i=0;
4bb0: 20 69 3c 6e 41 70 70 65 6e 64 3b 20 69 2b 2b 29   i<nAppend; i++)
4bc0: 7b 0a 20 20 20 20 20 20 69 66 28 20 7a 41 70 70  {.      if( zApp
4bd0: 65 6e 64 5b 69 5d 3d 3d 71 75 6f 74 65 20 29 20  end[i]==quote ) 
4be0: 6c 65 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d  len++;.    }.  }
4bf0: 0a 0a 20 20 69 66 28 20 70 2d 3e 6e 2b 6c 65 6e  ..  if( p->n+len
4c00: 3e 3d 70 2d 3e 6e 41 6c 6c 6f 63 20 29 7b 0a 20  >=p->nAlloc ){. 
4c10: 20 20 20 70 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 70     p->nAlloc = p
4c20: 2d 3e 6e 41 6c 6c 6f 63 2a 32 20 2b 20 6c 65 6e  ->nAlloc*2 + len
4c30: 20 2b 20 32 30 3b 0a 20 20 20 20 70 2d 3e 7a 20   + 20;.    p->z 
4c40: 3d 20 72 65 61 6c 6c 6f 63 28 70 2d 3e 7a 2c 20  = realloc(p->z, 
4c50: 70 2d 3e 6e 41 6c 6c 6f 63 29 3b 0a 20 20 20 20  p->nAlloc);.    
4c60: 69 66 28 20 70 2d 3e 7a 3d 3d 30 20 29 20 73 68  if( p->z==0 ) sh
4c70: 65 6c 6c 5f 6f 75 74 5f 6f 66 5f 6d 65 6d 6f 72  ell_out_of_memor
4c80: 79 28 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  y();.  }..  if( 
4c90: 71 75 6f 74 65 20 29 7b 0a 20 20 20 20 63 68 61  quote ){.    cha
4ca0: 72 20 2a 7a 43 73 72 20 3d 20 70 2d 3e 7a 2b 70  r *zCsr = p->z+p
4cb0: 2d 3e 6e 3b 0a 20 20 20 20 2a 7a 43 73 72 2b 2b  ->n;.    *zCsr++
4cc0: 20 3d 20 71 75 6f 74 65 3b 0a 20 20 20 20 66 6f   = quote;.    fo
4cd0: 72 28 69 3d 30 3b 20 69 3c 6e 41 70 70 65 6e 64  r(i=0; i<nAppend
4ce0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 2a 7a  ; i++){.      *z
4cf0: 43 73 72 2b 2b 20 3d 20 7a 41 70 70 65 6e 64 5b  Csr++ = zAppend[
4d00: 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 41  i];.      if( zA
4d10: 70 70 65 6e 64 5b 69 5d 3d 3d 71 75 6f 74 65 20  ppend[i]==quote 
4d20: 29 20 2a 7a 43 73 72 2b 2b 20 3d 20 71 75 6f 74  ) *zCsr++ = quot
4d30: 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a 7a 43  e;.    }.    *zC
4d40: 73 72 2b 2b 20 3d 20 71 75 6f 74 65 3b 0a 20 20  sr++ = quote;.  
4d50: 20 20 70 2d 3e 6e 20 3d 20 28 69 6e 74 29 28 7a    p->n = (int)(z
4d60: 43 73 72 20 2d 20 70 2d 3e 7a 29 3b 0a 20 20 20  Csr - p->z);.   
4d70: 20 2a 7a 43 73 72 20 3d 20 27 5c 30 27 3b 0a 20   *zCsr = '\0';. 
4d80: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6d 65 6d 63   }else{.    memc
4d90: 70 79 28 70 2d 3e 7a 2b 70 2d 3e 6e 2c 20 7a 41  py(p->z+p->n, zA
4da0: 70 70 65 6e 64 2c 20 6e 41 70 70 65 6e 64 29 3b  ppend, nAppend);
4db0: 0a 20 20 20 20 70 2d 3e 6e 20 2b 3d 20 6e 41 70  .    p->n += nAp
4dc0: 70 65 6e 64 3b 0a 20 20 20 20 70 2d 3e 7a 5b 70  pend;.    p->z[p
4dd0: 2d 3e 6e 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 7d  ->n] = '\0';.  }
4de0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70  .}../*.** Attemp
4df0: 74 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69  t to determine i
4e00: 66 20 69 64 65 6e 74 69 66 69 65 72 20 7a 4e 61  f identifier zNa
4e10: 6d 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20 71  me needs to be q
4e20: 75 6f 74 65 64 2c 20 65 69 74 68 65 72 0a 2a 2a  uoted, either.**
4e30: 20 62 65 63 61 75 73 65 20 69 74 20 63 6f 6e 74   because it cont
4e40: 61 69 6e 73 20 6e 6f 6e 2d 61 6c 70 68 61 6e 75  ains non-alphanu
4e50: 6d 65 72 69 63 20 63 68 61 72 61 63 74 65 72 73  meric characters
4e60: 2c 20 6f 72 20 62 65 63 61 75 73 65 20 69 74 20  , or because it 
4e70: 69 73 20 61 6e 0a 2a 2a 20 53 51 4c 69 74 65 20  is an.** SQLite 
4e80: 6b 65 79 77 6f 72 64 2e 20 20 42 65 20 63 6f 6e  keyword.  Be con
4e90: 73 65 72 76 61 74 69 76 65 20 69 6e 20 74 68 69  servative in thi
4ea0: 73 20 65 73 74 69 6d 61 74 65 3a 20 20 57 68 65  s estimate:  Whe
4eb0: 6e 20 69 6e 20 64 6f 75 62 74 20 61 73 73 75 6d  n in doubt assum
4ec0: 65 0a 2a 2a 20 74 68 61 74 20 71 75 6f 74 69 6e  e.** that quotin
4ed0: 67 20 69 73 20 72 65 71 75 69 72 65 64 2e 0a 2a  g is required..*
4ee0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 27 22 27 20  *.** Return '"' 
4ef0: 69 66 20 71 75 6f 74 69 6e 67 20 69 73 20 72 65  if quoting is re
4f00: 71 75 69 72 65 64 2e 20 20 52 65 74 75 72 6e 20  quired.  Return 
4f10: 30 20 69 66 20 6e 6f 20 71 75 6f 74 69 6e 67 20  0 if no quoting 
4f20: 69 73 20 72 65 71 75 69 72 65 64 2e 0a 2a 2f 0a  is required..*/.
4f30: 73 74 61 74 69 63 20 63 68 61 72 20 71 75 6f 74  static char quot
4f40: 65 43 68 61 72 28 63 6f 6e 73 74 20 63 68 61 72  eChar(const char
4f50: 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20   *zName){.  int 
4f60: 69 3b 0a 20 20 69 66 28 20 21 69 73 61 6c 70 68  i;.  if( !isalph
4f70: 61 28 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  a((unsigned char
4f80: 29 7a 4e 61 6d 65 5b 30 5d 29 20 26 26 20 7a 4e  )zName[0]) && zN
4f90: 61 6d 65 5b 30 5d 21 3d 27 5f 27 20 29 20 72 65  ame[0]!='_' ) re
4fa0: 74 75 72 6e 20 27 22 27 3b 0a 20 20 66 6f 72 28  turn '"';.  for(
4fb0: 69 3d 30 3b 20 7a 4e 61 6d 65 5b 69 5d 3b 20 69  i=0; zName[i]; i
4fc0: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 21 69 73  ++){.    if( !is
4fd0: 61 6c 6e 75 6d 28 28 75 6e 73 69 67 6e 65 64 20  alnum((unsigned 
4fe0: 63 68 61 72 29 7a 4e 61 6d 65 5b 69 5d 29 20 26  char)zName[i]) &
4ff0: 26 20 7a 4e 61 6d 65 5b 69 5d 21 3d 27 5f 27 20  & zName[i]!='_' 
5000: 29 20 72 65 74 75 72 6e 20 27 22 27 3b 0a 20 20  ) return '"';.  
5010: 7d 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  }.  return sqlit
5020: 65 33 5f 6b 65 79 77 6f 72 64 5f 63 68 65 63 6b  e3_keyword_check
5030: 28 7a 4e 61 6d 65 2c 20 69 29 20 3f 20 27 22 27  (zName, i) ? '"'
5040: 20 3a 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43   : 0;.}../*.** C
5050: 6f 6e 73 74 72 75 63 74 20 61 20 66 61 6b 65 20  onstruct a fake 
5060: 6f 62 6a 65 63 74 20 6e 61 6d 65 20 61 6e 64 20  object name and 
5070: 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 74 6f 20 64  column list to d
5080: 65 73 63 72 69 62 65 20 74 68 65 20 73 74 72 75  escribe the stru
5090: 63 74 75 72 65 0a 2a 2a 20 6f 66 20 74 68 65 20  cture.** of the 
50a0: 76 69 65 77 2c 20 76 69 72 74 75 61 6c 20 74 61  view, virtual ta
50b0: 62 6c 65 2c 20 6f 72 20 74 61 62 6c 65 20 76 61  ble, or table va
50c0: 6c 75 65 64 20 66 75 6e 63 74 69 6f 6e 20 7a 53  lued function zS
50d0: 63 68 65 6d 61 2e 7a 4e 61 6d 65 2e 0a 2a 2f 0a  chema.zName..*/.
50e0: 73 74 61 74 69 63 20 63 68 61 72 20 2a 73 68 65  static char *she
50f0: 6c 6c 46 61 6b 65 53 63 68 65 6d 61 28 0a 20 20  llFakeSchema(.  
5100: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20  sqlite3 *db,    
5110: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64          /* The d
5120: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
5130: 6f 6e 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  on containing th
5140: 65 20 76 74 61 62 20 2a 2f 0a 20 20 63 6f 6e 73  e vtab */.  cons
5150: 74 20 63 68 61 72 20 2a 7a 53 63 68 65 6d 61 2c  t char *zSchema,
5160: 20 20 20 20 2f 2a 20 53 63 68 65 6d 61 20 6f 66      /* Schema of
5170: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68 6f   the database ho
5180: 6c 64 69 6e 67 20 74 68 65 20 76 74 61 62 20 2a  lding the vtab *
5190: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
51a0: 7a 4e 61 6d 65 20 20 20 20 20 20 20 2f 2a 20 54  zName       /* T
51b0: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 76  he name of the v
51c0: 69 72 74 75 61 6c 20 74 61 62 6c 65 20 2a 2f 0a  irtual table */.
51d0: 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  ){.  sqlite3_stm
51e0: 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20  t *pStmt = 0;.  
51f0: 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 53 68  char *zSql;.  Sh
5200: 65 6c 6c 54 65 78 74 20 73 3b 0a 20 20 63 68 61  ellText s;.  cha
5210: 72 20 63 51 75 6f 74 65 3b 0a 20 20 63 68 61 72  r cQuote;.  char
5220: 20 2a 7a 44 69 76 20 3d 20 22 28 22 3b 0a 20 20   *zDiv = "(";.  
5230: 69 6e 74 20 6e 52 6f 77 20 3d 20 30 3b 0a 0a 20  int nRow = 0;.. 
5240: 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f   zSql = sqlite3_
5250: 6d 70 72 69 6e 74 66 28 22 50 52 41 47 4d 41 20  mprintf("PRAGMA 
5260: 5c 22 25 77 5c 22 2e 74 61 62 6c 65 5f 69 6e 66  \"%w\".table_inf
5270: 6f 3d 25 51 3b 22 2c 0a 20 20 20 20 20 20 20 20  o=%Q;",.        
5280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5290: 20 7a 53 63 68 65 6d 61 20 3f 20 7a 53 63 68 65   zSchema ? zSche
52a0: 6d 61 20 3a 20 22 6d 61 69 6e 22 2c 20 7a 4e 61  ma : "main", zNa
52b0: 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 70  me);.  sqlite3_p
52c0: 72 65 70 61 72 65 5f 76 32 28 64 62 2c 20 7a 53  repare_v2(db, zS
52d0: 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20  ql, -1, &pStmt, 
52e0: 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  0);.  sqlite3_fr
52f0: 65 65 28 7a 53 71 6c 29 3b 0a 20 20 69 6e 69 74  ee(zSql);.  init
5300: 54 65 78 74 28 26 73 29 3b 0a 20 20 69 66 28 20  Text(&s);.  if( 
5310: 7a 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 63  zSchema ){.    c
5320: 51 75 6f 74 65 20 3d 20 71 75 6f 74 65 43 68 61  Quote = quoteCha
5330: 72 28 7a 53 63 68 65 6d 61 29 3b 0a 20 20 20 20  r(zSchema);.    
5340: 69 66 28 20 63 51 75 6f 74 65 20 26 26 20 73 71  if( cQuote && sq
5350: 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28 7a 53  lite3_stricmp(zS
5360: 63 68 65 6d 61 2c 22 74 65 6d 70 22 29 3d 3d 30  chema,"temp")==0
5370: 20 29 20 63 51 75 6f 74 65 20 3d 20 30 3b 0a 20   ) cQuote = 0;. 
5380: 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73     appendText(&s
5390: 2c 20 7a 53 63 68 65 6d 61 2c 20 63 51 75 6f 74  , zSchema, cQuot
53a0: 65 29 3b 0a 20 20 20 20 61 70 70 65 6e 64 54 65  e);.    appendTe
53b0: 78 74 28 26 73 2c 20 22 2e 22 2c 20 30 29 3b 0a  xt(&s, ".", 0);.
53c0: 20 20 7d 0a 20 20 63 51 75 6f 74 65 20 3d 20 71    }.  cQuote = q
53d0: 75 6f 74 65 43 68 61 72 28 7a 4e 61 6d 65 29 3b  uoteChar(zName);
53e0: 0a 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73  .  appendText(&s
53f0: 2c 20 7a 4e 61 6d 65 2c 20 63 51 75 6f 74 65 29  , zName, cQuote)
5400: 3b 0a 20 20 77 68 69 6c 65 28 20 73 71 6c 69 74  ;.  while( sqlit
5410: 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3d 3d  e3_step(pStmt)==
5420: 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20  SQLITE_ROW ){.  
5430: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43    const char *zC
5440: 6f 6c 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  ol = (const char
5450: 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  *)sqlite3_column
5460: 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 31 29 3b  _text(pStmt, 1);
5470: 0a 20 20 20 20 6e 52 6f 77 2b 2b 3b 0a 20 20 20  .    nRow++;.   
5480: 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 2c 20   appendText(&s, 
5490: 7a 44 69 76 2c 20 30 29 3b 0a 20 20 20 20 7a 44  zDiv, 0);.    zD
54a0: 69 76 20 3d 20 22 2c 22 3b 0a 20 20 20 20 63 51  iv = ",";.    cQ
54b0: 75 6f 74 65 20 3d 20 71 75 6f 74 65 43 68 61 72  uote = quoteChar
54c0: 28 7a 43 6f 6c 29 3b 0a 20 20 20 20 61 70 70 65  (zCol);.    appe
54d0: 6e 64 54 65 78 74 28 26 73 2c 20 7a 43 6f 6c 2c  ndText(&s, zCol,
54e0: 20 63 51 75 6f 74 65 29 3b 0a 20 20 7d 0a 20 20   cQuote);.  }.  
54f0: 61 70 70 65 6e 64 54 65 78 74 28 26 73 2c 20 22  appendText(&s, "
5500: 29 22 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65  )", 0);.  sqlite
5510: 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74  3_finalize(pStmt
5520: 29 3b 0a 20 20 69 66 28 20 6e 52 6f 77 3d 3d 30  );.  if( nRow==0
5530: 20 29 7b 0a 20 20 20 20 66 72 65 65 54 65 78 74   ){.    freeText
5540: 28 26 73 29 3b 0a 20 20 20 20 73 2e 7a 20 3d 20  (&s);.    s.z = 
5550: 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
5560: 73 2e 7a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 51  s.z;.}../*.** SQ
5570: 4c 20 66 75 6e 63 74 69 6f 6e 3a 20 20 73 68 65  L function:  she
5580: 6c 6c 5f 6d 6f 64 75 6c 65 5f 73 63 68 65 6d 61  ll_module_schema
5590: 28 58 29 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  (X).**.** Return
55a0: 20 61 20 66 61 6b 65 20 73 63 68 65 6d 61 20 66   a fake schema f
55b0: 6f 72 20 74 68 65 20 74 61 62 6c 65 2d 76 61 6c  or the table-val
55c0: 75 65 64 20 66 75 6e 63 74 69 6f 6e 20 6f 72 20  ued function or 
55d0: 65 70 6f 6e 79 6d 6f 75 73 20 76 69 72 74 75 61  eponymous virtua
55e0: 6c 0a 2a 2a 20 74 61 62 6c 65 20 58 2e 0a 2a 2f  l.** table X..*/
55f0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 68 65  .static void she
5600: 6c 6c 4d 6f 64 75 6c 65 53 63 68 65 6d 61 28 0a  llModuleSchema(.
5610: 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78    sqlite3_contex
5620: 74 20 2a 70 43 74 78 2c 0a 20 20 69 6e 74 20 6e  t *pCtx,.  int n
5630: 56 61 6c 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76  Val,.  sqlite3_v
5640: 61 6c 75 65 20 2a 2a 61 70 56 61 6c 0a 29 7b 0a  alue **apVal.){.
5650: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
5660: 61 6d 65 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  ame = (const cha
5670: 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  r*)sqlite3_value
5680: 5f 74 65 78 74 28 61 70 56 61 6c 5b 30 5d 29 3b  _text(apVal[0]);
5690: 0a 20 20 63 68 61 72 20 2a 7a 46 61 6b 65 20 3d  .  char *zFake =
56a0: 20 73 68 65 6c 6c 46 61 6b 65 53 63 68 65 6d 61   shellFakeSchema
56b0: 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
56c0: 5f 64 62 5f 68 61 6e 64 6c 65 28 70 43 74 78 29  _db_handle(pCtx)
56d0: 2c 20 30 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 55  , 0, zName);.  U
56e0: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
56f0: 6e 56 61 6c 29 3b 0a 20 20 69 66 28 20 7a 46 61  nVal);.  if( zFa
5700: 6b 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ke ){.    sqlite
5710: 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 70 43  3_result_text(pC
5720: 74 78 2c 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  tx, sqlite3_mpri
5730: 6e 74 66 28 22 2f 2a 20 25 73 20 2a 2f 22 2c 20  ntf("/* %s */", 
5740: 7a 46 61 6b 65 29 2c 0a 20 20 20 20 20 20 20 20  zFake),.        
5750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5760: 2d 31 2c 20 73 71 6c 69 74 65 33 5f 66 72 65 65  -1, sqlite3_free
5770: 29 3b 0a 20 20 20 20 66 72 65 65 28 7a 46 61 6b  );.    free(zFak
5780: 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  e);.  }.}../*.**
5790: 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 3a 20 20   SQL function:  
57a0: 73 68 65 6c 6c 5f 61 64 64 5f 73 63 68 65 6d 61  shell_add_schema
57b0: 28 53 2c 58 29 0a 2a 2a 0a 2a 2a 20 41 64 64 20  (S,X).**.** Add 
57c0: 74 68 65 20 73 63 68 65 6d 61 20 6e 61 6d 65 20  the schema name 
57d0: 58 20 74 6f 20 74 68 65 20 43 52 45 41 54 45 20  X to the CREATE 
57e0: 73 74 61 74 65 6d 65 6e 74 20 69 6e 20 53 20 61  statement in S a
57f0: 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20 72 65  nd return the re
5800: 73 75 6c 74 2e 0a 2a 2a 20 45 78 61 6d 70 6c 65  sult..** Example
5810: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 43 52 45 41  s:.**.**    CREA
5820: 54 45 20 54 41 42 4c 45 20 74 31 28 78 29 20 20  TE TABLE t1(x)  
5830: 20 2d 3e 20 20 20 43 52 45 41 54 45 20 54 41 42   ->   CREATE TAB
5840: 4c 45 20 78 79 7a 2e 74 31 28 78 29 3b 0a 2a 2a  LE xyz.t1(x);.**
5850: 0a 2a 2a 20 41 6c 73 6f 20 77 6f 72 6b 73 20 6f  .** Also works o
5860: 6e 0a 2a 2a 0a 2a 2a 20 20 20 20 43 52 45 41 54  n.**.**    CREAT
5870: 45 20 49 4e 44 45 58 0a 2a 2a 20 20 20 20 43 52  E INDEX.**    CR
5880: 45 41 54 45 20 55 4e 49 51 55 45 20 49 4e 44 45  EATE UNIQUE INDE
5890: 58 0a 2a 2a 20 20 20 20 43 52 45 41 54 45 20 56  X.**    CREATE V
58a0: 49 45 57 0a 2a 2a 20 20 20 20 43 52 45 41 54 45  IEW.**    CREATE
58b0: 20 54 52 49 47 47 45 52 0a 2a 2a 20 20 20 20 43   TRIGGER.**    C
58c0: 52 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41  REATE VIRTUAL TA
58d0: 42 4c 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 55  BLE.**.** This U
58e0: 44 46 20 69 73 20 75 73 65 64 20 62 79 20 74 68  DF is used by th
58f0: 65 20 2e 73 63 68 65 6d 61 20 63 6f 6d 6d 61 6e  e .schema comman
5900: 64 20 74 6f 20 69 6e 73 65 72 74 20 74 68 65 20  d to insert the 
5910: 73 63 68 65 6d 61 20 6e 61 6d 65 20 6f 66 0a 2a  schema name of.*
5920: 2a 20 61 74 74 61 63 68 65 64 20 64 61 74 61 62  * attached datab
5930: 61 73 65 73 20 69 6e 74 6f 20 74 68 65 20 6d 69  ases into the mi
5940: 64 64 6c 65 20 6f 66 20 74 68 65 20 73 71 6c 69  ddle of the sqli
5950: 74 65 5f 6d 61 73 74 65 72 2e 73 71 6c 20 66 69  te_master.sql fi
5960: 65 6c 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  eld..*/.static v
5970: 6f 69 64 20 73 68 65 6c 6c 41 64 64 53 63 68 65  oid shellAddSche
5980: 6d 61 4e 61 6d 65 28 0a 20 20 73 71 6c 69 74 65  maName(.  sqlite
5990: 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c  3_context *pCtx,
59a0: 0a 20 20 69 6e 74 20 6e 56 61 6c 2c 0a 20 20 73  .  int nVal,.  s
59b0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
59c0: 70 56 61 6c 0a 29 7b 0a 20 20 73 74 61 74 69 63  pVal.){.  static
59d0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 50 72   const char *aPr
59e0: 65 66 69 78 5b 5d 20 3d 20 7b 0a 20 20 20 20 20  efix[] = {.     
59f0: 22 54 41 42 4c 45 22 2c 0a 20 20 20 20 20 22 49  "TABLE",.     "I
5a00: 4e 44 45 58 22 2c 0a 20 20 20 20 20 22 55 4e 49  NDEX",.     "UNI
5a10: 51 55 45 20 49 4e 44 45 58 22 2c 0a 20 20 20 20  QUE INDEX",.    
5a20: 20 22 56 49 45 57 22 2c 0a 20 20 20 20 20 22 54   "VIEW",.     "T
5a30: 52 49 47 47 45 52 22 2c 0a 20 20 20 20 20 22 56  RIGGER",.     "V
5a40: 49 52 54 55 41 4c 20 54 41 42 4c 45 22 0a 20 20  IRTUAL TABLE".  
5a50: 7d 3b 0a 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a  };.  int i = 0;.
5a60: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49    const char *zI
5a70: 6e 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a  n = (const char*
5a80: 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  )sqlite3_value_t
5a90: 65 78 74 28 61 70 56 61 6c 5b 30 5d 29 3b 0a 20  ext(apVal[0]);. 
5aa0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 63   const char *zSc
5ab0: 68 65 6d 61 20 3d 20 28 63 6f 6e 73 74 20 63 68  hema = (const ch
5ac0: 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75  ar*)sqlite3_valu
5ad0: 65 5f 74 65 78 74 28 61 70 56 61 6c 5b 31 5d 29  e_text(apVal[1])
5ae0: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
5af0: 7a 4e 61 6d 65 20 3d 20 28 63 6f 6e 73 74 20 63  zName = (const c
5b00: 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c  har*)sqlite3_val
5b10: 75 65 5f 74 65 78 74 28 61 70 56 61 6c 5b 32 5d  ue_text(apVal[2]
5b20: 29 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  );.  sqlite3 *db
5b30: 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65   = sqlite3_conte
5b40: 78 74 5f 64 62 5f 68 61 6e 64 6c 65 28 70 43 74  xt_db_handle(pCt
5b50: 78 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  x);.  UNUSED_PAR
5b60: 41 4d 45 54 45 52 28 6e 56 61 6c 29 3b 0a 20 20  AMETER(nVal);.  
5b70: 69 66 28 20 7a 49 6e 21 3d 30 20 26 26 20 73 74  if( zIn!=0 && st
5b80: 72 6e 63 6d 70 28 7a 49 6e 2c 20 22 43 52 45 41  rncmp(zIn, "CREA
5b90: 54 45 20 22 2c 20 37 29 3d 3d 30 20 29 7b 0a 20  TE ", 7)==0 ){. 
5ba0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 28 69     for(i=0; i<(i
5bb0: 6e 74 29 28 73 69 7a 65 6f 66 28 61 50 72 65 66  nt)(sizeof(aPref
5bc0: 69 78 29 2f 73 69 7a 65 6f 66 28 61 50 72 65 66  ix)/sizeof(aPref
5bd0: 69 78 5b 30 5d 29 29 3b 20 69 2b 2b 29 7b 0a 20  ix[0])); i++){. 
5be0: 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 73 74 72       int n = str
5bf0: 6c 65 6e 33 30 28 61 50 72 65 66 69 78 5b 69 5d  len30(aPrefix[i]
5c00: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 74 72  );.      if( str
5c10: 6e 63 6d 70 28 7a 49 6e 2b 37 2c 20 61 50 72 65  ncmp(zIn+7, aPre
5c20: 66 69 78 5b 69 5d 2c 20 6e 29 3d 3d 30 20 26 26  fix[i], n)==0 &&
5c30: 20 7a 49 6e 5b 6e 2b 37 5d 3d 3d 27 20 27 20 29   zIn[n+7]==' ' )
5c40: 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a  {.        char *
5c50: 7a 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 63  z = 0;.        c
5c60: 68 61 72 20 2a 7a 46 61 6b 65 20 3d 20 30 3b 0a  har *zFake = 0;.
5c70: 20 20 20 20 20 20 20 20 69 66 28 20 7a 53 63 68          if( zSch
5c80: 65 6d 61 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ema ){.         
5c90: 20 63 68 61 72 20 63 51 75 6f 74 65 20 3d 20 71   char cQuote = q
5ca0: 75 6f 74 65 43 68 61 72 28 7a 53 63 68 65 6d 61  uoteChar(zSchema
5cb0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
5cc0: 20 63 51 75 6f 74 65 20 26 26 20 73 71 6c 69 74   cQuote && sqlit
5cd0: 65 33 5f 73 74 72 69 63 6d 70 28 7a 53 63 68 65  e3_stricmp(zSche
5ce0: 6d 61 2c 22 74 65 6d 70 22 29 21 3d 30 20 29 7b  ma,"temp")!=0 ){
5cf0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 20 3d  .            z =
5d00: 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
5d10: 28 22 25 2e 2a 73 20 5c 22 25 77 5c 22 2e 25 73  ("%.*s \"%w\".%s
5d20: 22 2c 20 6e 2b 37 2c 20 7a 49 6e 2c 20 7a 53 63  ", n+7, zIn, zSc
5d30: 68 65 6d 61 2c 20 7a 49 6e 2b 6e 2b 38 29 3b 0a  hema, zIn+n+8);.
5d40: 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
5d50: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 20 3d  .            z =
5d60: 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
5d70: 28 22 25 2e 2a 73 20 25 73 2e 25 73 22 2c 20 6e  ("%.*s %s.%s", n
5d80: 2b 37 2c 20 7a 49 6e 2c 20 7a 53 63 68 65 6d 61  +7, zIn, zSchema
5d90: 2c 20 7a 49 6e 2b 6e 2b 38 29 3b 0a 20 20 20 20  , zIn+n+8);.    
5da0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
5db0: 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 4e  }.        if( zN
5dc0: 61 6d 65 0a 20 20 20 20 20 20 20 20 20 26 26 20  ame.         && 
5dd0: 61 50 72 65 66 69 78 5b 69 5d 5b 30 5d 3d 3d 27  aPrefix[i][0]=='
5de0: 56 27 0a 20 20 20 20 20 20 20 20 20 26 26 20 28  V'.         && (
5df0: 7a 46 61 6b 65 20 3d 20 73 68 65 6c 6c 46 61 6b  zFake = shellFak
5e00: 65 53 63 68 65 6d 61 28 64 62 2c 20 7a 53 63 68  eSchema(db, zSch
5e10: 65 6d 61 2c 20 7a 4e 61 6d 65 29 29 21 3d 30 0a  ema, zName))!=0.
5e20: 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
5e30: 20 20 20 20 20 69 66 28 20 7a 3d 3d 30 20 29 7b       if( z==0 ){
5e40: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 20 3d  .            z =
5e50: 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
5e60: 28 22 25 73 5c 6e 2f 2a 20 25 73 20 2a 2f 22 2c  ("%s\n/* %s */",
5e70: 20 7a 49 6e 2c 20 7a 46 61 6b 65 29 3b 0a 20 20   zIn, zFake);.  
5e80: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
5e90: 20 20 20 20 20 20 20 20 20 20 20 7a 20 3d 20 73             z = s
5ea0: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
5eb0: 25 7a 5c 6e 2f 2a 20 25 73 20 2a 2f 22 2c 20 7a  %z\n/* %s */", z
5ec0: 2c 20 7a 46 61 6b 65 29 3b 0a 20 20 20 20 20 20  , zFake);.      
5ed0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
5ee0: 66 72 65 65 28 7a 46 61 6b 65 29 3b 0a 20 20 20  free(zFake);.   
5ef0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
5f00: 66 28 20 7a 20 29 7b 0a 20 20 20 20 20 20 20 20  f( z ){.        
5f10: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
5f20: 5f 74 65 78 74 28 70 43 74 78 2c 20 7a 2c 20 2d  _text(pCtx, z, -
5f30: 31 2c 20 73 71 6c 69 74 65 33 5f 66 72 65 65 29  1, sqlite3_free)
5f40: 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ;.          retu
5f50: 72 6e 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  rn;.        }.  
5f60: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
5f70: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
5f80: 5f 76 61 6c 75 65 28 70 43 74 78 2c 20 61 70 56  _value(pCtx, apV
5f90: 61 6c 5b 30 5d 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  al[0]);.}../*.**
5fa0: 20 54 68 65 20 73 6f 75 72 63 65 20 63 6f 64 65   The source code
5fb0: 20 66 6f 72 20 73 65 76 65 72 61 6c 20 72 75 6e   for several run
5fc0: 2d 74 69 6d 65 20 6c 6f 61 64 61 62 6c 65 20 65  -time loadable e
5fd0: 78 74 65 6e 73 69 6f 6e 73 20 69 73 20 69 6e 73  xtensions is ins
5fe0: 65 72 74 65 64 0a 2a 2a 20 62 65 6c 6f 77 20 62  erted.** below b
5ff0: 79 20 74 68 65 20 2e 2e 2f 74 6f 6f 6c 2f 6d 6b  y the ../tool/mk
6000: 73 68 65 6c 6c 63 2e 74 63 6c 20 73 63 72 69 70  shellc.tcl scrip
6010: 74 2e 20 20 42 65 66 6f 72 65 20 70 72 6f 63 65  t.  Before proce
6020: 73 73 69 6e 67 20 74 68 61 74 20 69 6e 63 6c 75  ssing that inclu
6030: 64 65 64 0a 2a 2a 20 63 6f 64 65 2c 20 77 65 20  ded.** code, we 
6040: 6e 65 65 64 20 74 6f 20 6f 76 65 72 72 69 64 65  need to override
6050: 20 73 6f 6d 65 20 6d 61 63 72 6f 73 20 74 6f 20   some macros to 
6060: 6d 61 6b 65 20 74 68 65 20 69 6e 63 6c 75 64 65  make the include
6070: 64 20 70 72 6f 67 72 61 6d 20 63 6f 64 65 0a 2a  d program code.*
6080: 2a 20 77 6f 72 6b 20 68 65 72 65 20 69 6e 20 74  * work here in t
6090: 68 65 20 6d 69 64 64 6c 65 20 6f 66 20 74 68 69  he middle of thi
60a0: 73 20 72 65 67 75 6c 61 72 20 70 72 6f 67 72 61  s regular progra
60b0: 6d 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 53 51  m..*/.#define SQ
60c0: 4c 49 54 45 5f 45 58 54 45 4e 53 49 4f 4e 5f 49  LITE_EXTENSION_I
60d0: 4e 49 54 31 0a 23 64 65 66 69 6e 65 20 53 51 4c  NIT1.#define SQL
60e0: 49 54 45 5f 45 58 54 45 4e 53 49 4f 4e 5f 49 4e  ITE_EXTENSION_IN
60f0: 49 54 32 28 58 29 20 28 76 6f 69 64 29 28 58 29  IT2(X) (void)(X)
6100: 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 57  ..#if defined(_W
6110: 49 4e 33 32 29 20 26 26 20 64 65 66 69 6e 65 64  IN32) && defined
6120: 28 5f 4d 53 43 5f 56 45 52 29 0a 49 4e 43 4c 55  (_MSC_VER).INCLU
6130: 44 45 20 74 65 73 74 5f 77 69 6e 64 69 72 65 6e  DE test_windiren
6140: 74 2e 68 0a 49 4e 43 4c 55 44 45 20 74 65 73 74  t.h.INCLUDE test
6150: 5f 77 69 6e 64 69 72 65 6e 74 2e 63 0a 23 64 65  _windirent.c.#de
6160: 66 69 6e 65 20 64 69 72 65 6e 74 20 44 49 52 45  fine dirent DIRE
6170: 4e 54 0a 23 65 6e 64 69 66 0a 49 4e 43 4c 55 44  NT.#endif.INCLUD
6180: 45 20 2e 2e 2f 65 78 74 2f 6d 69 73 63 2f 73 68  E ../ext/misc/sh
6190: 61 74 68 72 65 65 2e 63 0a 49 4e 43 4c 55 44 45  athree.c.INCLUDE
61a0: 20 2e 2e 2f 65 78 74 2f 6d 69 73 63 2f 66 69 6c   ../ext/misc/fil
61b0: 65 69 6f 2e 63 0a 49 4e 43 4c 55 44 45 20 2e 2e  eio.c.INCLUDE ..
61c0: 2f 65 78 74 2f 6d 69 73 63 2f 63 6f 6d 70 6c 65  /ext/misc/comple
61d0: 74 69 6f 6e 2e 63 0a 49 4e 43 4c 55 44 45 20 2e  tion.c.INCLUDE .
61e0: 2e 2f 65 78 74 2f 6d 69 73 63 2f 61 70 70 65 6e  ./ext/misc/appen
61f0: 64 76 66 73 2e 63 0a 23 69 66 64 65 66 20 53 51  dvfs.c.#ifdef SQ
6200: 4c 49 54 45 5f 48 41 56 45 5f 5a 4c 49 42 0a 49  LITE_HAVE_ZLIB.I
6210: 4e 43 4c 55 44 45 20 2e 2e 2f 65 78 74 2f 6d 69  NCLUDE ../ext/mi
6220: 73 63 2f 7a 69 70 66 69 6c 65 2e 63 0a 49 4e 43  sc/zipfile.c.INC
6230: 4c 55 44 45 20 2e 2e 2f 65 78 74 2f 6d 69 73 63  LUDE ../ext/misc
6240: 2f 73 71 6c 61 72 2e 63 0a 23 65 6e 64 69 66 0a  /sqlar.c.#endif.
6250: 49 4e 43 4c 55 44 45 20 2e 2e 2f 65 78 74 2f 65  INCLUDE ../ext/e
6260: 78 70 65 72 74 2f 73 71 6c 69 74 65 33 65 78 70  xpert/sqlite3exp
6270: 65 72 74 2e 68 0a 49 4e 43 4c 55 44 45 20 2e 2e  ert.h.INCLUDE ..
6280: 2f 65 78 74 2f 65 78 70 65 72 74 2f 73 71 6c 69  /ext/expert/sqli
6290: 74 65 33 65 78 70 65 72 74 2e 63 0a 0a 23 69 66  te3expert.c..#if
62a0: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
62b0: 45 4e 41 42 4c 45 5f 53 45 53 53 49 4f 4e 29 0a  ENABLE_SESSION).
62c0: 2f 2a 0a 2a 2a 20 53 74 61 74 65 20 69 6e 66 6f  /*.** State info
62d0: 72 6d 61 74 69 6f 6e 20 66 6f 72 20 61 20 73 69  rmation for a si
62e0: 6e 67 6c 65 20 6f 70 65 6e 20 73 65 73 73 69 6f  ngle open sessio
62f0: 6e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  n.*/.typedef str
6300: 75 63 74 20 4f 70 65 6e 53 65 73 73 69 6f 6e 20  uct OpenSession 
6310: 4f 70 65 6e 53 65 73 73 69 6f 6e 3b 0a 73 74 72  OpenSession;.str
6320: 75 63 74 20 4f 70 65 6e 53 65 73 73 69 6f 6e 20  uct OpenSession 
6330: 7b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b  {.  char *zName;
6340: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
6350: 53 79 6d 62 6f 6c 69 63 20 6e 61 6d 65 20 66 6f  Symbolic name fo
6360: 72 20 74 68 69 73 20 73 65 73 73 69 6f 6e 20 2a  r this session *
6370: 2f 0a 20 20 69 6e 74 20 6e 46 69 6c 74 65 72 3b  /.  int nFilter;
6380: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
6390: 4e 75 6d 62 65 72 20 6f 66 20 78 46 69 6c 74 65  Number of xFilte
63a0: 72 20 72 65 6a 65 63 74 69 6f 6e 20 47 4c 4f 42  r rejection GLOB
63b0: 20 70 61 74 74 65 72 6e 73 20 2a 2f 0a 20 20 63   patterns */.  c
63c0: 68 61 72 20 2a 2a 61 7a 46 69 6c 74 65 72 3b 20  har **azFilter; 
63d0: 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79          /* Array
63e0: 20 6f 66 20 78 46 69 6c 74 65 72 20 72 65 6a 65   of xFilter reje
63f0: 63 74 69 6f 6e 20 47 4c 4f 42 20 70 61 74 74 65  ction GLOB patte
6400: 72 6e 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  rns */.  sqlite3
6410: 5f 73 65 73 73 69 6f 6e 20 2a 70 3b 20 20 20 20  _session *p;    
6420: 20 20 2f 2a 20 54 68 65 20 6f 70 65 6e 20 73 65    /* The open se
6430: 73 73 69 6f 6e 20 2a 2f 0a 7d 3b 0a 23 65 6e 64  ssion */.};.#end
6440: 69 66 0a 0a 2f 2a 0a 2a 2a 20 53 68 65 6c 6c 20  if../*.** Shell 
6450: 6f 75 74 70 75 74 20 6d 6f 64 65 20 69 6e 66 6f  output mode info
6460: 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 62 65 66  rmation from bef
6470: 6f 72 65 20 22 2e 65 78 70 6c 61 69 6e 20 6f 6e  ore ".explain on
6480: 22 2c 0a 2a 2a 20 73 61 76 65 64 20 73 6f 20 74  ",.** saved so t
6490: 68 61 74 20 69 74 20 63 61 6e 20 62 65 20 72 65  hat it can be re
64a0: 73 74 6f 72 65 64 20 62 79 20 22 2e 65 78 70 6c  stored by ".expl
64b0: 61 69 6e 20 6f 66 66 22 0a 2a 2f 0a 74 79 70 65  ain off".*/.type
64c0: 64 65 66 20 73 74 72 75 63 74 20 53 61 76 65 64  def struct Saved
64d0: 4d 6f 64 65 49 6e 66 6f 20 53 61 76 65 64 4d 6f  ModeInfo SavedMo
64e0: 64 65 49 6e 66 6f 3b 0a 73 74 72 75 63 74 20 53  deInfo;.struct S
64f0: 61 76 65 64 4d 6f 64 65 49 6e 66 6f 20 7b 0a 20  avedModeInfo {. 
6500: 20 69 6e 74 20 76 61 6c 69 64 3b 20 20 20 20 20   int valid;     
6510: 20 20 20 20 20 2f 2a 20 49 73 20 74 68 65 72 65       /* Is there
6520: 20 6c 65 67 69 74 20 64 61 74 61 20 69 6e 20 68   legit data in h
6530: 65 72 65 3f 20 2a 2f 0a 20 20 69 6e 74 20 6d 6f  ere? */.  int mo
6540: 64 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  de;           /*
6550: 20 4d 6f 64 65 20 70 72 69 6f 72 20 74 6f 20 22   Mode prior to "
6560: 2e 65 78 70 6c 61 69 6e 20 6f 6e 22 20 2a 2f 0a  .explain on" */.
6570: 20 20 69 6e 74 20 73 68 6f 77 48 65 61 64 65 72    int showHeader
6580: 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 22 2e 68  ;     /* The ".h
6590: 65 61 64 65 72 22 20 73 65 74 74 69 6e 67 20 70  eader" setting p
65a0: 72 69 6f 72 20 74 6f 20 22 2e 65 78 70 6c 61 69  rior to ".explai
65b0: 6e 20 6f 6e 22 20 2a 2f 0a 20 20 69 6e 74 20 63  n on" */.  int c
65c0: 6f 6c 57 69 64 74 68 5b 31 30 30 5d 3b 20 20 2f  olWidth[100];  /
65d0: 2a 20 43 6f 6c 75 6d 6e 20 77 69 64 74 68 73 20  * Column widths 
65e0: 70 72 69 6f 72 20 74 6f 20 22 2e 65 78 70 6c 61  prior to ".expla
65f0: 69 6e 20 6f 6e 22 20 2a 2f 0a 7d 3b 0a 0a 74 79  in on" */.};..ty
6600: 70 65 64 65 66 20 73 74 72 75 63 74 20 45 78 70  pedef struct Exp
6610: 65 72 74 49 6e 66 6f 20 45 78 70 65 72 74 49 6e  ertInfo ExpertIn
6620: 66 6f 3b 0a 73 74 72 75 63 74 20 45 78 70 65 72  fo;.struct Exper
6630: 74 49 6e 66 6f 20 7b 0a 20 20 73 71 6c 69 74 65  tInfo {.  sqlite
6640: 33 65 78 70 65 72 74 20 2a 70 45 78 70 65 72 74  3expert *pExpert
6650: 3b 0a 20 20 69 6e 74 20 62 56 65 72 62 6f 73 65  ;.  int bVerbose
6660: 3b 0a 7d 3b 0a 0a 2f 2a 20 41 20 73 69 6e 67 6c  ;.};../* A singl
6670: 65 20 6c 69 6e 65 20 69 6e 20 74 68 65 20 45 51  e line in the EQ
6680: 50 20 6f 75 74 70 75 74 20 2a 2f 0a 74 79 70 65  P output */.type
6690: 64 65 66 20 73 74 72 75 63 74 20 45 51 50 47 72  def struct EQPGr
66a0: 61 70 68 52 6f 77 20 45 51 50 47 72 61 70 68 52  aphRow EQPGraphR
66b0: 6f 77 3b 0a 73 74 72 75 63 74 20 45 51 50 47 72  ow;.struct EQPGr
66c0: 61 70 68 52 6f 77 20 7b 0a 20 20 69 6e 74 20 69  aphRow {.  int i
66d0: 45 71 70 49 64 3b 20 20 20 20 20 20 20 20 20 20  EqpId;          
66e0: 20 2f 2a 20 49 44 20 66 6f 72 20 74 68 69 73 20   /* ID for this 
66f0: 72 6f 77 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61  row */.  int iPa
6700: 72 65 6e 74 49 64 3b 20 20 20 20 20 20 20 20 2f  rentId;        /
6710: 2a 20 49 44 20 6f 66 20 74 68 65 20 70 61 72 65  * ID of the pare
6720: 6e 74 20 72 6f 77 20 2a 2f 0a 20 20 45 51 50 47  nt row */.  EQPG
6730: 72 61 70 68 52 6f 77 20 2a 70 4e 65 78 74 3b 20  raphRow *pNext; 
6740: 20 20 2f 2a 20 4e 65 78 74 20 72 6f 77 20 69 6e    /* Next row in
6750: 20 73 65 71 75 65 6e 63 65 20 2a 2f 0a 20 20 63   sequence */.  c
6760: 68 61 72 20 7a 54 65 78 74 5b 31 5d 3b 20 20 20  har zText[1];   
6770: 20 20 20 20 20 2f 2a 20 54 65 78 74 20 74 6f 20       /* Text to 
6780: 64 69 73 70 6c 61 79 20 66 6f 72 20 74 68 69 73  display for this
6790: 20 72 6f 77 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 41   row */.};../* A
67a0: 6c 6c 20 45 51 50 20 6f 75 74 70 75 74 20 69 73  ll EQP output is
67b0: 20 63 6f 6c 6c 65 63 74 65 64 20 69 6e 74 6f 20   collected into 
67c0: 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  an instance of t
67d0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 2a 2f 0a  he following */.
67e0: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 45  typedef struct E
67f0: 51 50 47 72 61 70 68 20 45 51 50 47 72 61 70 68  QPGraph EQPGraph
6800: 3b 0a 73 74 72 75 63 74 20 45 51 50 47 72 61 70  ;.struct EQPGrap
6810: 68 20 7b 0a 20 20 45 51 50 47 72 61 70 68 52 6f  h {.  EQPGraphRo
6820: 77 20 2a 70 52 6f 77 3b 20 20 20 20 2f 2a 20 4c  w *pRow;    /* L
6830: 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 61 6c  inked list of al
6840: 6c 20 72 6f 77 73 20 6f 66 20 74 68 65 20 45 51  l rows of the EQ
6850: 50 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20 45 51  P output */.  EQ
6860: 50 47 72 61 70 68 52 6f 77 20 2a 70 4c 61 73 74  PGraphRow *pLast
6870: 3b 20 20 20 2f 2a 20 4c 61 73 74 20 65 6c 65 6d  ;   /* Last elem
6880: 65 6e 74 20 6f 66 20 74 68 65 20 70 52 6f 77 20  ent of the pRow 
6890: 6c 69 73 74 20 2a 2f 0a 20 20 63 68 61 72 20 7a  list */.  char z
68a0: 50 72 65 66 69 78 5b 31 30 30 5d 3b 20 20 20 20  Prefix[100];    
68b0: 2f 2a 20 47 72 61 70 68 20 70 72 65 66 69 78 20  /* Graph prefix 
68c0: 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 53 74 61  */.};../*.** Sta
68d0: 74 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61  te information a
68e0: 62 6f 75 74 20 74 68 65 20 64 61 74 61 62 61 73  bout the databas
68f0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20  e connection is 
6900: 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 61 6e 0a  contained in an.
6910: 2a 2a 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  ** instance of t
6920: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72  he following str
6930: 75 63 74 75 72 65 2e 0a 2a 2f 0a 74 79 70 65 64  ucture..*/.typed
6940: 65 66 20 73 74 72 75 63 74 20 53 68 65 6c 6c 53  ef struct ShellS
6950: 74 61 74 65 20 53 68 65 6c 6c 53 74 61 74 65 3b  tate ShellState;
6960: 0a 73 74 72 75 63 74 20 53 68 65 6c 6c 53 74 61  .struct ShellSta
6970: 74 65 20 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  te {.  sqlite3 *
6980: 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  db;           /*
6990: 20 54 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f   The database */
69a0: 0a 20 20 75 38 20 61 75 74 6f 45 78 70 6c 61 69  .  u8 autoExplai
69b0: 6e 3b 20 20 20 20 20 20 20 20 2f 2a 20 41 75 74  n;        /* Aut
69c0: 6f 6d 61 74 69 63 61 6c 6c 79 20 74 75 72 6e 20  omatically turn 
69d0: 6f 6e 20 2e 65 78 70 6c 61 69 6e 20 6d 6f 64 65  on .explain mode
69e0: 20 2a 2f 0a 20 20 75 38 20 61 75 74 6f 45 51 50   */.  u8 autoEQP
69f0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
6a00: 52 75 6e 20 45 58 50 4c 41 49 4e 20 51 55 45 52  Run EXPLAIN QUER
6a10: 59 20 50 4c 41 4e 20 70 72 69 6f 72 20 74 6f 20  Y PLAN prior to 
6a20: 73 65 61 63 68 20 53 51 4c 20 73 74 6d 74 20 2a  seach SQL stmt *
6a30: 2f 0a 20 20 75 38 20 61 75 74 6f 45 51 50 74 65  /.  u8 autoEQPte
6a40: 73 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 61 75  st;        /* au
6a50: 74 6f 45 51 50 20 69 73 20 69 6e 20 74 65 73 74  toEQP is in test
6a60: 20 6d 6f 64 65 20 2a 2f 0a 20 20 75 38 20 73 74   mode */.  u8 st
6a70: 61 74 73 4f 6e 3b 20 20 20 20 20 20 20 20 20 20  atsOn;          
6a80: 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 64 69 73    /* True to dis
6a90: 70 6c 61 79 20 6d 65 6d 6f 72 79 20 73 74 61 74  play memory stat
6aa0: 73 20 62 65 66 6f 72 65 20 65 61 63 68 20 66 69  s before each fi
6ab0: 6e 61 6c 69 7a 65 20 2a 2f 0a 20 20 75 38 20 73  nalize */.  u8 s
6ac0: 63 61 6e 73 74 61 74 73 4f 6e 3b 20 20 20 20 20  canstatsOn;     
6ad0: 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 64 69     /* True to di
6ae0: 73 70 6c 61 79 20 73 63 61 6e 20 73 74 61 74 73  splay scan stats
6af0: 20 62 65 66 6f 72 65 20 65 61 63 68 20 66 69 6e   before each fin
6b00: 61 6c 69 7a 65 20 2a 2f 0a 20 20 75 38 20 6f 70  alize */.  u8 op
6b10: 65 6e 4d 6f 64 65 3b 20 20 20 20 20 20 20 20 20  enMode;         
6b20: 20 20 2f 2a 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f    /* SHELL_OPEN_
6b30: 4e 4f 52 4d 41 4c 2c 20 5f 41 50 50 45 4e 44 56  NORMAL, _APPENDV
6b40: 46 53 2c 20 6f 72 20 5f 5a 49 50 46 49 4c 45 20  FS, or _ZIPFILE 
6b50: 2a 2f 0a 20 20 75 38 20 64 6f 58 64 67 4f 70 65  */.  u8 doXdgOpe
6b60: 6e 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  n;          /* I
6b70: 6e 76 6f 6b 65 20 73 74 61 72 74 2f 6f 70 65 6e  nvoke start/open
6b80: 2f 78 64 67 2d 6f 70 65 6e 20 69 6e 20 6f 75 74  /xdg-open in out
6b90: 70 75 74 5f 72 65 73 65 74 28 29 20 2a 2f 0a 20  put_reset() */. 
6ba0: 20 75 38 20 6e 45 71 70 4c 65 76 65 6c 3b 20 20   u8 nEqpLevel;  
6bb0: 20 20 20 20 20 20 20 20 2f 2a 20 44 65 70 74 68          /* Depth
6bc0: 20 6f 66 20 74 68 65 20 45 51 50 20 6f 75 74 70   of the EQP outp
6bd0: 75 74 20 67 72 61 70 68 20 2a 2f 0a 20 20 75 6e  ut graph */.  un
6be0: 73 69 67 6e 65 64 20 6d 45 71 70 4c 69 6e 65 73  signed mEqpLines
6bf0: 3b 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20  ;    /* Mask of 
6c00: 76 65 72 69 74 69 63 61 6c 20 6c 69 6e 65 73 20  veritical lines 
6c10: 69 6e 20 74 68 65 20 45 51 50 20 6f 75 74 70 75  in the EQP outpu
6c20: 74 20 67 72 61 70 68 20 2a 2f 0a 20 20 69 6e 74  t graph */.  int
6c30: 20 6f 75 74 43 6f 75 6e 74 3b 20 20 20 20 20 20   outCount;      
6c40: 20 20 20 20 2f 2a 20 52 65 76 65 72 74 20 74 6f      /* Revert to
6c50: 20 73 74 64 6f 75 74 20 77 68 65 6e 20 72 65 61   stdout when rea
6c60: 63 68 69 6e 67 20 7a 65 72 6f 20 2a 2f 0a 20 20  ching zero */.  
6c70: 69 6e 74 20 63 6e 74 3b 20 20 20 20 20 20 20 20  int cnt;        
6c80: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
6c90: 20 6f 66 20 72 65 63 6f 72 64 73 20 64 69 73 70   of records disp
6ca0: 6c 61 79 65 64 20 73 6f 20 66 61 72 20 2a 2f 0a  layed so far */.
6cb0: 20 20 46 49 4c 45 20 2a 6f 75 74 3b 20 20 20 20    FILE *out;    
6cc0: 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
6cd0: 65 20 72 65 73 75 6c 74 73 20 68 65 72 65 20 2a  e results here *
6ce0: 2f 0a 20 20 46 49 4c 45 20 2a 74 72 61 63 65 4f  /.  FILE *traceO
6cf0: 75 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 4f 75  ut;        /* Ou
6d00: 74 70 75 74 20 66 6f 72 20 73 71 6c 69 74 65 33  tput for sqlite3
6d10: 5f 74 72 61 63 65 28 29 20 2a 2f 0a 20 20 69 6e  _trace() */.  in
6d20: 74 20 6e 45 72 72 3b 20 20 20 20 20 20 20 20 20  t nErr;         
6d30: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
6d40: 66 20 65 72 72 6f 72 73 20 73 65 65 6e 20 2a 2f  f errors seen */
6d50: 0a 20 20 69 6e 74 20 6d 6f 64 65 3b 20 20 20 20  .  int mode;    
6d60: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20            /* An 
6d70: 6f 75 74 70 75 74 20 6d 6f 64 65 20 73 65 74 74  output mode sett
6d80: 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 6d 6f 64  ing */.  int mod
6d90: 65 50 72 69 6f 72 3b 20 20 20 20 20 20 20 20 20  ePrior;         
6da0: 2f 2a 20 53 61 76 65 64 20 6d 6f 64 65 20 2a 2f  /* Saved mode */
6db0: 0a 20 20 69 6e 74 20 63 4d 6f 64 65 3b 20 20 20  .  int cMode;   
6dc0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 74 65 6d            /* tem
6dd0: 70 6f 72 61 72 79 20 6f 75 74 70 75 74 20 6d 6f  porary output mo
6de0: 64 65 20 66 6f 72 20 74 68 65 20 63 75 72 72 65  de for the curre
6df0: 6e 74 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e  nt query */.  in
6e00: 74 20 6e 6f 72 6d 61 6c 4d 6f 64 65 3b 20 20 20  t normalMode;   
6e10: 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 6d       /* Output m
6e20: 6f 64 65 20 62 65 66 6f 72 65 20 22 2e 65 78 70  ode before ".exp
6e30: 6c 61 69 6e 20 6f 6e 22 20 2a 2f 0a 20 20 69 6e  lain on" */.  in
6e40: 74 20 77 72 69 74 61 62 6c 65 53 63 68 65 6d 61  t writableSchema
6e50: 3b 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20  ;    /* True if 
6e60: 50 52 41 47 4d 41 20 77 72 69 74 61 62 6c 65 5f  PRAGMA writable_
6e70: 73 63 68 65 6d 61 3d 4f 4e 20 2a 2f 0a 20 20 69  schema=ON */.  i
6e80: 6e 74 20 73 68 6f 77 48 65 61 64 65 72 3b 20 20  nt showHeader;  
6e90: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f        /* True to
6ea0: 20 73 68 6f 77 20 63 6f 6c 75 6d 6e 20 6e 61 6d   show column nam
6eb0: 65 73 20 69 6e 20 4c 69 73 74 20 6f 72 20 43 6f  es in List or Co
6ec0: 6c 75 6d 6e 20 6d 6f 64 65 20 2a 2f 0a 20 20 69  lumn mode */.  i
6ed0: 6e 74 20 6e 43 68 65 63 6b 3b 20 20 20 20 20 20  nt nCheck;      
6ee0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
6ef0: 6f 66 20 22 2e 63 68 65 63 6b 22 20 63 6f 6d 6d  of ".check" comm
6f00: 61 6e 64 73 20 72 75 6e 20 2a 2f 0a 20 20 75 6e  ands run */.  un
6f10: 73 69 67 6e 65 64 20 73 68 65 6c 6c 46 6c 67 73  signed shellFlgs
6f20: 3b 20 20 20 20 2f 2a 20 56 61 72 69 6f 75 73 20  ;    /* Various 
6f30: 66 6c 61 67 73 20 2a 2f 0a 20 20 63 68 61 72 20  flags */.  char 
6f40: 2a 7a 44 65 73 74 54 61 62 6c 65 3b 20 20 20 20  *zDestTable;    
6f50: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 64 65 73    /* Name of des
6f60: 74 69 6e 61 74 69 6f 6e 20 74 61 62 6c 65 20 77  tination table w
6f70: 68 65 6e 20 4d 4f 44 45 5f 49 6e 73 65 72 74 20  hen MODE_Insert 
6f80: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 54 65 6d 70  */.  char *zTemp
6f90: 46 69 6c 65 3b 20 20 20 20 20 20 20 2f 2a 20 54  File;       /* T
6fa0: 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 74 68  emporary file th
6fb0: 61 74 20 6d 69 67 68 74 20 6e 65 65 64 20 64 65  at might need de
6fc0: 6c 65 74 69 6e 67 20 2a 2f 0a 20 20 63 68 61 72  leting */.  char
6fd0: 20 7a 54 65 73 74 63 61 73 65 5b 33 30 5d 3b 20   zTestcase[30]; 
6fe0: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 63 75     /* Name of cu
6ff0: 72 72 65 6e 74 20 74 65 73 74 20 63 61 73 65 20  rrent test case 
7000: 2a 2f 0a 20 20 63 68 61 72 20 63 6f 6c 53 65 70  */.  char colSep
7010: 61 72 61 74 6f 72 5b 32 30 5d 3b 20 2f 2a 20 43  arator[20]; /* C
7020: 6f 6c 75 6d 6e 20 73 65 70 61 72 61 74 6f 72 20  olumn separator 
7030: 63 68 61 72 61 63 74 65 72 20 66 6f 72 20 73 65  character for se
7040: 76 65 72 61 6c 20 6d 6f 64 65 73 20 2a 2f 0a 20  veral modes */. 
7050: 20 63 68 61 72 20 72 6f 77 53 65 70 61 72 61 74   char rowSeparat
7060: 6f 72 5b 32 30 5d 3b 20 2f 2a 20 52 6f 77 20 73  or[20]; /* Row s
7070: 65 70 61 72 61 74 6f 72 20 63 68 61 72 61 63 74  eparator charact
7080: 65 72 20 66 6f 72 20 4d 4f 44 45 5f 41 73 63 69  er for MODE_Asci
7090: 69 20 2a 2f 0a 20 20 63 68 61 72 20 63 6f 6c 53  i */.  char colS
70a0: 65 70 50 72 69 6f 72 5b 32 30 5d 3b 20 20 2f 2a  epPrior[20];  /*
70b0: 20 53 61 76 65 64 20 63 6f 6c 75 6d 6e 20 73 65   Saved column se
70c0: 70 61 72 61 74 6f 72 20 2a 2f 0a 20 20 63 68 61  parator */.  cha
70d0: 72 20 72 6f 77 53 65 70 50 72 69 6f 72 5b 32 30  r rowSepPrior[20
70e0: 5d 3b 20 20 2f 2a 20 53 61 76 65 64 20 72 6f 77  ];  /* Saved row
70f0: 20 73 65 70 61 72 61 74 6f 72 20 2a 2f 0a 20 20   separator */.  
7100: 69 6e 74 20 63 6f 6c 57 69 64 74 68 5b 31 30 30  int colWidth[100
7110: 5d 3b 20 20 20 20 20 2f 2a 20 52 65 71 75 65 73  ];     /* Reques
7120: 74 65 64 20 77 69 64 74 68 20 6f 66 20 65 61 63  ted width of eac
7130: 68 20 63 6f 6c 75 6d 6e 20 77 68 65 6e 20 69 6e  h column when in
7140: 20 63 6f 6c 75 6d 6e 20 6d 6f 64 65 2a 2f 0a 20   column mode*/. 
7150: 20 69 6e 74 20 61 63 74 75 61 6c 57 69 64 74 68   int actualWidth
7160: 5b 31 30 30 5d 3b 20 20 2f 2a 20 41 63 74 75 61  [100];  /* Actua
7170: 6c 20 77 69 64 74 68 20 6f 66 20 65 61 63 68 20  l width of each 
7180: 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 63 68 61 72  column */.  char
7190: 20 6e 75 6c 6c 56 61 6c 75 65 5b 32 30 5d 3b 20   nullValue[20]; 
71a0: 20 20 20 2f 2a 20 54 68 65 20 74 65 78 74 20 74     /* The text t
71b0: 6f 20 70 72 69 6e 74 20 77 68 65 6e 20 61 20 4e  o print when a N
71c0: 55 4c 4c 20 63 6f 6d 65 73 20 62 61 63 6b 20 66  ULL comes back f
71d0: 72 6f 6d 0a 20 20 20 20 20 20 20 20 20 20 20 20  rom.            
71e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20               ** 
71f0: 74 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  the database */.
7200: 20 20 63 68 61 72 20 6f 75 74 66 69 6c 65 5b 46    char outfile[F
7210: 49 4c 45 4e 41 4d 45 5f 4d 41 58 5d 3b 20 2f 2a  ILENAME_MAX]; /*
7220: 20 46 69 6c 65 6e 61 6d 65 20 66 6f 72 20 2a 6f   Filename for *o
7230: 75 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ut */.  const ch
7240: 61 72 20 2a 7a 44 62 46 69 6c 65 6e 61 6d 65 3b  ar *zDbFilename;
7250: 20 20 20 20 2f 2a 20 6e 61 6d 65 20 6f 66 20 74      /* name of t
7260: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
7270: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 46 72 65   */.  char *zFre
7280: 65 4f 6e 43 6c 6f 73 65 3b 20 20 20 20 20 20 20  eOnClose;       
7290: 20 20 2f 2a 20 46 69 6c 65 6e 61 6d 65 20 74 6f    /* Filename to
72a0: 20 66 72 65 65 20 77 68 65 6e 20 63 6c 6f 73 69   free when closi
72b0: 6e 67 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ng */.  const ch
72c0: 61 72 20 2a 7a 56 66 73 3b 20 20 20 20 20 20 20  ar *zVfs;       
72d0: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 56      /* Name of V
72e0: 46 53 20 74 6f 20 75 73 65 20 2a 2f 0a 20 20 73  FS to use */.  s
72f0: 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
7300: 6d 74 3b 20 20 20 2f 2a 20 43 75 72 72 65 6e 74  mt;   /* Current
7310: 20 73 74 61 74 65 6d 65 6e 74 20 69 66 20 61 6e   statement if an
7320: 79 2e 20 2a 2f 0a 20 20 46 49 4c 45 20 2a 70 4c  y. */.  FILE *pL
7330: 6f 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  og;            /
7340: 2a 20 57 72 69 74 65 20 6c 6f 67 20 6f 75 74 70  * Write log outp
7350: 75 74 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74  ut here */.  int
7360: 20 2a 61 69 49 6e 64 65 6e 74 3b 20 20 20 20 20   *aiIndent;     
7370: 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20      /* Array of 
7380: 69 6e 64 65 6e 74 73 20 75 73 65 64 20 69 6e 20  indents used in 
7390: 4d 4f 44 45 5f 45 78 70 6c 61 69 6e 20 2a 2f 0a  MODE_Explain */.
73a0: 20 20 69 6e 74 20 6e 49 6e 64 65 6e 74 3b 20 20    int nIndent;  
73b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
73c0: 20 6f 66 20 61 72 72 61 79 20 61 69 49 6e 64 65   of array aiInde
73d0: 6e 74 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 69 49  nt[] */.  int iI
73e0: 6e 64 65 6e 74 3b 20 20 20 20 20 20 20 20 20 20  ndent;          
73f0: 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 75 72   /* Index of cur
7400: 72 65 6e 74 20 6f 70 20 69 6e 20 61 69 49 6e 64  rent op in aiInd
7410: 65 6e 74 5b 5d 20 2a 2f 0a 20 20 45 51 50 47 72  ent[] */.  EQPGr
7420: 61 70 68 20 73 47 72 61 70 68 3b 20 20 20 20 20  aph sGraph;     
7430: 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e    /* Information
7440: 20 66 6f 72 20 74 68 65 20 67 72 61 70 68 69 63   for the graphic
7450: 61 6c 20 45 58 50 4c 41 49 4e 20 51 55 45 52 59  al EXPLAIN QUERY
7460: 20 50 4c 41 4e 20 2a 2f 0a 23 69 66 20 64 65 66   PLAN */.#if def
7470: 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
7480: 4c 45 5f 53 45 53 53 49 4f 4e 29 0a 20 20 69 6e  LE_SESSION).  in
7490: 74 20 6e 53 65 73 73 69 6f 6e 3b 20 20 20 20 20  t nSession;     
74a0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
74b0: 72 20 6f 66 20 61 63 74 69 76 65 20 73 65 73 73  r of active sess
74c0: 69 6f 6e 73 20 2a 2f 0a 20 20 4f 70 65 6e 53 65  ions */.  OpenSe
74d0: 73 73 69 6f 6e 20 61 53 65 73 73 69 6f 6e 5b 34  ssion aSession[4
74e0: 5d 3b 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20  ];  /* Array of 
74f0: 73 65 73 73 69 6f 6e 73 2e 20 20 5b 30 5d 20 69  sessions.  [0] i
7500: 73 20 69 6e 20 66 6f 63 75 73 2e 20 2a 2f 0a 23  s in focus. */.#
7510: 65 6e 64 69 66 0a 20 20 45 78 70 65 72 74 49 6e  endif.  ExpertIn
7520: 66 6f 20 65 78 70 65 72 74 3b 20 20 20 20 20 20  fo expert;      
7530: 20 20 2f 2a 20 56 61 6c 69 64 20 69 66 20 70 72    /* Valid if pr
7540: 65 76 69 6f 75 73 20 63 6f 6d 6d 61 6e 64 20 77  evious command w
7550: 61 73 20 22 2e 65 78 70 65 72 74 20 4f 50 54 2e  as ".expert OPT.
7560: 2e 2e 22 20 2a 2f 0a 7d 3b 0a 0a 0a 2f 2a 20 41  .." */.};.../* A
7570: 6c 6c 6f 77 65 64 20 76 61 6c 75 65 73 20 66 6f  llowed values fo
7580: 72 20 53 68 65 6c 6c 53 74 61 74 65 2e 61 75 74  r ShellState.aut
7590: 6f 45 51 50 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  oEQP.*/.#define 
75a0: 41 55 54 4f 45 51 50 5f 6f 66 66 20 20 20 20 20  AUTOEQP_off     
75b0: 20 30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20   0           /* 
75c0: 41 75 74 6f 6d 61 74 69 63 20 45 58 50 4c 41 49  Automatic EXPLAI
75d0: 4e 20 51 55 45 52 59 20 50 4c 41 4e 20 69 73 20  N QUERY PLAN is 
75e0: 6f 66 66 20 2a 2f 0a 23 64 65 66 69 6e 65 20 41  off */.#define A
75f0: 55 54 4f 45 51 50 5f 6f 6e 20 20 20 20 20 20 20  UTOEQP_on       
7600: 31 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  1           /* A
7610: 75 74 6f 6d 61 74 69 63 20 45 51 50 20 69 73 20  utomatic EQP is 
7620: 6f 6e 20 2a 2f 0a 23 64 65 66 69 6e 65 20 41 55  on */.#define AU
7630: 54 4f 45 51 50 5f 74 72 69 67 67 65 72 20 20 32  TOEQP_trigger  2
7640: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e             /* On
7650: 20 61 6e 64 20 61 6c 73 6f 20 73 68 6f 77 20 70   and also show p
7660: 6c 61 6e 73 20 66 6f 72 20 74 72 69 67 67 65 72  lans for trigger
7670: 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20 41 55 54  s */.#define AUT
7680: 4f 45 51 50 5f 66 75 6c 6c 20 20 20 20 20 33 20  OEQP_full     3 
7690: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 68 6f            /* Sho
76a0: 77 20 66 75 6c 6c 20 45 58 50 4c 41 49 4e 20 2a  w full EXPLAIN *
76b0: 2f 0a 0a 2f 2a 20 41 6c 6c 6f 77 65 64 20 76 61  /../* Allowed va
76c0: 6c 75 65 73 20 66 6f 72 20 53 68 65 6c 6c 53 74  lues for ShellSt
76d0: 61 74 65 2e 6f 70 65 6e 4d 6f 64 65 0a 2a 2f 0a  ate.openMode.*/.
76e0: 23 64 65 66 69 6e 65 20 53 48 45 4c 4c 5f 4f 50  #define SHELL_OP
76f0: 45 4e 5f 55 4e 53 50 45 43 20 20 20 20 20 20 30  EN_UNSPEC      0
7700: 20 20 20 20 20 20 2f 2a 20 4e 6f 20 6f 70 65 6e        /* No open
7710: 2d 6d 6f 64 65 20 73 70 65 63 69 66 69 65 64 20  -mode specified 
7720: 2a 2f 0a 23 64 65 66 69 6e 65 20 53 48 45 4c 4c  */.#define SHELL
7730: 5f 4f 50 45 4e 5f 4e 4f 52 4d 41 4c 20 20 20 20  _OPEN_NORMAL    
7740: 20 20 31 20 20 20 20 20 20 2f 2a 20 4e 6f 72 6d    1      /* Norm
7750: 61 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  al database file
7760: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 53 48 45 4c   */.#define SHEL
7770: 4c 5f 4f 50 45 4e 5f 41 50 50 45 4e 44 56 46 53  L_OPEN_APPENDVFS
7780: 20 20 20 32 20 20 20 20 20 20 2f 2a 20 55 73 65     2      /* Use
7790: 20 61 70 70 65 6e 64 76 66 73 20 2a 2f 0a 23 64   appendvfs */.#d
77a0: 65 66 69 6e 65 20 53 48 45 4c 4c 5f 4f 50 45 4e  efine SHELL_OPEN
77b0: 5f 5a 49 50 46 49 4c 45 20 20 20 20 20 33 20 20  _ZIPFILE     3  
77c0: 20 20 20 20 2f 2a 20 55 73 65 20 74 68 65 20 7a      /* Use the z
77d0: 69 70 66 69 6c 65 20 76 69 72 74 75 61 6c 20 74  ipfile virtual t
77e0: 61 62 6c 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20  able */.#define 
77f0: 53 48 45 4c 4c 5f 4f 50 45 4e 5f 52 45 41 44 4f  SHELL_OPEN_READO
7800: 4e 4c 59 20 20 20 20 34 20 20 20 20 20 20 2f 2a  NLY    4      /*
7810: 20 4f 70 65 6e 20 61 20 6e 6f 72 6d 61 6c 20 64   Open a normal d
7820: 61 74 61 62 61 73 65 20 72 65 61 64 2d 6f 6e 6c  atabase read-onl
7830: 79 20 2a 2f 0a 23 64 65 66 69 6e 65 20 53 48 45  y */.#define SHE
7840: 4c 4c 5f 4f 50 45 4e 5f 44 45 53 45 52 49 41 4c  LL_OPEN_DESERIAL
7850: 49 5a 45 20 35 20 20 20 20 20 20 2f 2a 20 4f 70  IZE 5      /* Op
7860: 65 6e 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  en using sqlite3
7870: 5f 64 65 73 65 72 69 61 6c 69 7a 65 28 29 20 2a  _deserialize() *
7880: 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 73 65 20 61  /../*.** These a
7890: 72 65 20 74 68 65 20 61 6c 6c 6f 77 65 64 20 73  re the allowed s
78a0: 68 65 6c 6c 46 6c 67 73 20 76 61 6c 75 65 73 0a  hellFlgs values.
78b0: 2a 2f 0a 23 64 65 66 69 6e 65 20 53 48 46 4c 47  */.#define SHFLG
78c0: 5f 50 61 67 65 63 61 63 68 65 20 20 20 20 20 20  _Pagecache      
78d0: 30 78 30 30 30 30 30 30 30 31 20 2f 2a 20 54 68  0x00000001 /* Th
78e0: 65 20 2d 2d 70 61 67 65 63 61 63 68 65 20 6f 70  e --pagecache op
78f0: 74 69 6f 6e 20 69 73 20 75 73 65 64 20 2a 2f 0a  tion is used */.
7900: 23 64 65 66 69 6e 65 20 53 48 46 4c 47 5f 4c 6f  #define SHFLG_Lo
7910: 6f 6b 61 73 69 64 65 20 20 20 20 20 20 30 78 30  okaside      0x0
7920: 30 30 30 30 30 30 32 20 2f 2a 20 4c 6f 6f 6b 61  0000002 /* Looka
7930: 73 69 64 65 20 6d 65 6d 6f 72 79 20 69 73 20 75  side memory is u
7940: 73 65 64 20 2a 2f 0a 23 64 65 66 69 6e 65 20 53  sed */.#define S
7950: 48 46 4c 47 5f 42 61 63 6b 73 6c 61 73 68 20 20  HFLG_Backslash  
7960: 20 20 20 20 30 78 30 30 30 30 30 30 30 34 20 2f      0x00000004 /
7970: 2a 20 54 68 65 20 2d 2d 62 61 63 6b 73 6c 61 73  * The --backslas
7980: 68 20 6f 70 74 69 6f 6e 20 69 73 20 75 73 65 64  h option is used
7990: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 53 48 46 4c   */.#define SHFL
79a0: 47 5f 50 72 65 73 65 72 76 65 52 6f 77 69 64 20  G_PreserveRowid 
79b0: 20 30 78 30 30 30 30 30 30 30 38 20 2f 2a 20 2e   0x00000008 /* .
79c0: 64 75 6d 70 20 70 72 65 73 65 72 76 65 73 20 72  dump preserves r
79d0: 6f 77 69 64 20 76 61 6c 75 65 73 20 2a 2f 0a 23  owid values */.#
79e0: 64 65 66 69 6e 65 20 53 48 46 4c 47 5f 4e 65 77  define SHFLG_New
79f0: 6c 69 6e 65 73 20 20 20 20 20 20 20 30 78 30 30  lines       0x00
7a00: 30 30 30 30 31 30 20 2f 2a 20 2e 64 75 6d 70 20  000010 /* .dump 
7a10: 2d 2d 6e 65 77 6c 69 6e 65 20 66 6c 61 67 20 2a  --newline flag *
7a20: 2f 0a 23 64 65 66 69 6e 65 20 53 48 46 4c 47 5f  /.#define SHFLG_
7a30: 43 6f 75 6e 74 43 68 61 6e 67 65 73 20 20 20 30  CountChanges   0
7a40: 78 30 30 30 30 30 30 32 30 20 2f 2a 20 2e 63 68  x00000020 /* .ch
7a50: 61 6e 67 65 73 20 73 65 74 74 69 6e 67 20 2a 2f  anges setting */
7a60: 0a 23 64 65 66 69 6e 65 20 53 48 46 4c 47 5f 45  .#define SHFLG_E
7a70: 63 68 6f 20 20 20 20 20 20 20 20 20 20 20 30 78  cho           0x
7a80: 30 30 30 30 30 30 34 30 20 2f 2a 20 2e 65 63 68  00000040 /* .ech
7a90: 6f 20 6f 72 20 2d 2d 65 63 68 6f 20 73 65 74 74  o or --echo sett
7aa0: 69 6e 67 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 4d 61  ing */../*.** Ma
7ab0: 63 72 6f 73 20 66 6f 72 20 74 65 73 74 69 6e 67  cros for testing
7ac0: 20 61 6e 64 20 73 65 74 74 69 6e 67 20 73 68 65   and setting she
7ad0: 6c 6c 46 6c 67 73 0a 2a 2f 0a 23 64 65 66 69 6e  llFlgs.*/.#defin
7ae0: 65 20 53 68 65 6c 6c 48 61 73 46 6c 61 67 28 50  e ShellHasFlag(P
7af0: 2c 58 29 20 20 20 20 28 28 28 50 29 2d 3e 73 68  ,X)    (((P)->sh
7b00: 65 6c 6c 46 6c 67 73 20 26 20 28 58 29 29 21 3d  ellFlgs & (X))!=
7b10: 30 29 0a 23 64 65 66 69 6e 65 20 53 68 65 6c 6c  0).#define Shell
7b20: 53 65 74 46 6c 61 67 28 50 2c 58 29 20 20 20 20  SetFlag(P,X)    
7b30: 28 28 50 29 2d 3e 73 68 65 6c 6c 46 6c 67 73 7c  ((P)->shellFlgs|
7b40: 3d 28 58 29 29 0a 23 64 65 66 69 6e 65 20 53 68  =(X)).#define Sh
7b50: 65 6c 6c 43 6c 65 61 72 46 6c 61 67 28 50 2c 58  ellClearFlag(P,X
7b60: 29 20 20 28 28 50 29 2d 3e 73 68 65 6c 6c 46 6c  )  ((P)->shellFl
7b70: 67 73 26 3d 28 7e 28 58 29 29 29 0a 0a 2f 2a 0a  gs&=(~(X)))../*.
7b80: 2a 2a 20 54 68 65 73 65 20 61 72 65 20 74 68 65  ** These are the
7b90: 20 61 6c 6c 6f 77 65 64 20 6d 6f 64 65 73 2e 0a   allowed modes..
7ba0: 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 4f 44 45 5f  */.#define MODE_
7bb0: 4c 69 6e 65 20 20 20 20 20 30 20 20 2f 2a 20 4f  Line     0  /* O
7bc0: 6e 65 20 63 6f 6c 75 6d 6e 20 70 65 72 20 6c 69  ne column per li
7bd0: 6e 65 2e 20 20 42 6c 61 6e 6b 20 6c 69 6e 65 20  ne.  Blank line 
7be0: 62 65 74 77 65 65 6e 20 72 65 63 6f 72 64 73 20  between records 
7bf0: 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 4f 44 45 5f  */.#define MODE_
7c00: 43 6f 6c 75 6d 6e 20 20 20 31 20 20 2f 2a 20 4f  Column   1  /* O
7c10: 6e 65 20 72 65 63 6f 72 64 20 70 65 72 20 6c 69  ne record per li
7c20: 6e 65 20 69 6e 20 6e 65 61 74 20 63 6f 6c 75 6d  ne in neat colum
7c30: 6e 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 4f  ns */.#define MO
7c40: 44 45 5f 4c 69 73 74 20 20 20 20 20 32 20 20 2f  DE_List     2  /
7c50: 2a 20 4f 6e 65 20 72 65 63 6f 72 64 20 70 65 72  * One record per
7c60: 20 6c 69 6e 65 20 77 69 74 68 20 61 20 73 65 70   line with a sep
7c70: 61 72 61 74 6f 72 20 2a 2f 0a 23 64 65 66 69 6e  arator */.#defin
7c80: 65 20 4d 4f 44 45 5f 53 65 6d 69 20 20 20 20 20  e MODE_Semi     
7c90: 33 20 20 2f 2a 20 53 61 6d 65 20 61 73 20 4d 4f  3  /* Same as MO
7ca0: 44 45 5f 4c 69 73 74 20 62 75 74 20 61 70 70 65  DE_List but appe
7cb0: 6e 64 20 22 3b 22 20 74 6f 20 65 61 63 68 20 6c  nd ";" to each l
7cc0: 69 6e 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4d  ine */.#define M
7cd0: 4f 44 45 5f 48 74 6d 6c 20 20 20 20 20 34 20 20  ODE_Html     4  
7ce0: 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 6e 20 58  /* Generate an X
7cf0: 48 54 4d 4c 20 74 61 62 6c 65 20 2a 2f 0a 23 64  HTML table */.#d
7d00: 65 66 69 6e 65 20 4d 4f 44 45 5f 49 6e 73 65 72  efine MODE_Inser
7d10: 74 20 20 20 35 20 20 2f 2a 20 47 65 6e 65 72 61  t   5  /* Genera
7d20: 74 65 20 53 51 4c 20 22 69 6e 73 65 72 74 22 20  te SQL "insert" 
7d30: 73 74 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 23 64  statements */.#d
7d40: 65 66 69 6e 65 20 4d 4f 44 45 5f 51 75 6f 74 65  efine MODE_Quote
7d50: 20 20 20 20 36 20 20 2f 2a 20 51 75 6f 74 65 20      6  /* Quote 
7d60: 76 61 6c 75 65 73 20 61 73 20 66 6f 72 20 53 51  values as for SQ
7d70: 4c 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 4f 44  L */.#define MOD
7d80: 45 5f 54 63 6c 20 20 20 20 20 20 37 20 20 2f 2a  E_Tcl      7  /*
7d90: 20 47 65 6e 65 72 61 74 65 20 41 4e 53 49 2d 43   Generate ANSI-C
7da0: 20 6f 72 20 54 43 4c 20 71 75 6f 74 65 64 20 65   or TCL quoted e
7db0: 6c 65 6d 65 6e 74 73 20 2a 2f 0a 23 64 65 66 69  lements */.#defi
7dc0: 6e 65 20 4d 4f 44 45 5f 43 73 76 20 20 20 20 20  ne MODE_Csv     
7dd0: 20 38 20 20 2f 2a 20 51 75 6f 74 65 20 73 74 72   8  /* Quote str
7de0: 69 6e 67 73 2c 20 6e 75 6d 62 65 72 73 20 61 72  ings, numbers ar
7df0: 65 20 70 6c 61 69 6e 20 2a 2f 0a 23 64 65 66 69  e plain */.#defi
7e00: 6e 65 20 4d 4f 44 45 5f 45 78 70 6c 61 69 6e 20  ne MODE_Explain 
7e10: 20 39 20 20 2f 2a 20 4c 69 6b 65 20 4d 4f 44 45   9  /* Like MODE
7e20: 5f 43 6f 6c 75 6d 6e 2c 20 62 75 74 20 64 6f 20  _Column, but do 
7e30: 6e 6f 74 20 74 72 75 6e 63 61 74 65 20 64 61 74  not truncate dat
7e40: 61 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 4f 44  a */.#define MOD
7e50: 45 5f 41 73 63 69 69 20 20 20 31 30 20 20 2f 2a  E_Ascii   10  /*
7e60: 20 55 73 65 20 41 53 43 49 49 20 75 6e 69 74 20   Use ASCII unit 
7e70: 61 6e 64 20 72 65 63 6f 72 64 20 73 65 70 61 72  and record separ
7e80: 61 74 6f 72 73 20 28 30 78 31 46 2f 30 78 31 45  ators (0x1F/0x1E
7e90: 29 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 4f 44  ) */.#define MOD
7ea0: 45 5f 50 72 65 74 74 79 20 20 31 31 20 20 2f 2a  E_Pretty  11  /*
7eb0: 20 50 72 65 74 74 79 2d 70 72 69 6e 74 20 73 63   Pretty-print sc
7ec0: 68 65 6d 61 73 20 2a 2f 0a 23 64 65 66 69 6e 65  hemas */.#define
7ed0: 20 4d 4f 44 45 5f 45 51 50 20 20 20 20 20 31 32   MODE_EQP     12
7ee0: 20 20 2f 2a 20 43 6f 6e 76 65 72 74 73 20 45 58    /* Converts EX
7ef0: 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e  PLAIN QUERY PLAN
7f00: 20 6f 75 74 70 75 74 20 69 6e 74 6f 20 61 20 67   output into a g
7f10: 72 61 70 68 20 2a 2f 0a 0a 73 74 61 74 69 63 20  raph */..static 
7f20: 63 6f 6e 73 74 20 63 68 61 72 20 2a 6d 6f 64 65  const char *mode
7f30: 44 65 73 63 72 5b 5d 20 3d 20 7b 0a 20 20 22 6c  Descr[] = {.  "l
7f40: 69 6e 65 22 2c 0a 20 20 22 63 6f 6c 75 6d 6e 22  ine",.  "column"
7f50: 2c 0a 20 20 22 6c 69 73 74 22 2c 0a 20 20 22 73  ,.  "list",.  "s
7f60: 65 6d 69 22 2c 0a 20 20 22 68 74 6d 6c 22 2c 0a  emi",.  "html",.
7f70: 20 20 22 69 6e 73 65 72 74 22 2c 0a 20 20 22 71    "insert",.  "q
7f80: 75 6f 74 65 22 2c 0a 20 20 22 74 63 6c 22 2c 0a  uote",.  "tcl",.
7f90: 20 20 22 63 73 76 22 2c 0a 20 20 22 65 78 70 6c    "csv",.  "expl
7fa0: 61 69 6e 22 2c 0a 20 20 22 61 73 63 69 69 22 2c  ain",.  "ascii",
7fb0: 0a 20 20 22 70 72 65 74 74 79 70 72 69 6e 74 22  .  "prettyprint"
7fc0: 2c 0a 20 20 22 65 71 70 22 0a 7d 3b 0a 0a 2f 2a  ,.  "eqp".};../*
7fd0: 0a 2a 2a 20 54 68 65 73 65 20 61 72 65 20 74 68  .** These are th
7fe0: 65 20 63 6f 6c 75 6d 6e 2f 72 6f 77 2f 6c 69 6e  e column/row/lin
7ff0: 65 20 73 65 70 61 72 61 74 6f 72 73 20 75 73 65  e separators use
8000: 64 20 62 79 20 74 68 65 20 76 61 72 69 6f 75 73  d by the various
8010: 0a 2a 2a 20 69 6d 70 6f 72 74 2f 65 78 70 6f 72  .** import/expor
8020: 74 20 6d 6f 64 65 73 2e 0a 2a 2f 0a 23 64 65 66  t modes..*/.#def
8030: 69 6e 65 20 53 45 50 5f 43 6f 6c 75 6d 6e 20 20  ine SEP_Column  
8040: 20 20 22 7c 22 0a 23 64 65 66 69 6e 65 20 53 45    "|".#define SE
8050: 50 5f 52 6f 77 20 20 20 20 20 20 20 22 5c 6e 22  P_Row       "\n"
8060: 0a 23 64 65 66 69 6e 65 20 53 45 50 5f 54 61 62  .#define SEP_Tab
8070: 20 20 20 20 20 20 20 22 5c 74 22 0a 23 64 65 66         "\t".#def
8080: 69 6e 65 20 53 45 50 5f 53 70 61 63 65 20 20 20  ine SEP_Space   
8090: 20 20 22 20 22 0a 23 64 65 66 69 6e 65 20 53 45    " ".#define SE
80a0: 50 5f 43 6f 6d 6d 61 20 20 20 20 20 22 2c 22 0a  P_Comma     ",".
80b0: 23 64 65 66 69 6e 65 20 53 45 50 5f 43 72 4c 66  #define SEP_CrLf
80c0: 20 20 20 20 20 20 22 5c 72 5c 6e 22 0a 23 64 65        "\r\n".#de
80d0: 66 69 6e 65 20 53 45 50 5f 55 6e 69 74 20 20 20  fine SEP_Unit   
80e0: 20 20 20 22 5c 78 31 46 22 0a 23 64 65 66 69 6e     "\x1F".#defin
80f0: 65 20 53 45 50 5f 52 65 63 6f 72 64 20 20 20 20  e SEP_Record    
8100: 22 5c 78 31 45 22 0a 0a 2f 2a 0a 2a 2a 20 41 20  "\x1E"../*.** A 
8110: 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20 74 68 65  callback for the
8120: 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 29 20 69   sqlite3_log() i
8130: 6e 74 65 72 66 61 63 65 2e 0a 2a 2f 0a 73 74 61  nterface..*/.sta
8140: 74 69 63 20 76 6f 69 64 20 73 68 65 6c 6c 4c 6f  tic void shellLo
8150: 67 28 76 6f 69 64 20 2a 70 41 72 67 2c 20 69 6e  g(void *pArg, in
8160: 74 20 69 45 72 72 43 6f 64 65 2c 20 63 6f 6e 73  t iErrCode, cons
8170: 74 20 63 68 61 72 20 2a 7a 4d 73 67 29 7b 0a 20  t char *zMsg){. 
8180: 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 20 3d   ShellState *p =
8190: 20 28 53 68 65 6c 6c 53 74 61 74 65 2a 29 70 41   (ShellState*)pA
81a0: 72 67 3b 0a 20 20 69 66 28 20 70 2d 3e 70 4c 6f  rg;.  if( p->pLo
81b0: 67 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  g==0 ) return;. 
81c0: 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e   utf8_printf(p->
81d0: 70 4c 6f 67 2c 20 22 28 25 64 29 20 25 73 5c 6e  pLog, "(%d) %s\n
81e0: 22 2c 20 69 45 72 72 43 6f 64 65 2c 20 7a 4d 73  ", iErrCode, zMs
81f0: 67 29 3b 0a 20 20 66 66 6c 75 73 68 28 70 2d 3e  g);.  fflush(p->
8200: 70 4c 6f 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  pLog);.}../*.** 
8210: 53 51 4c 20 66 75 6e 63 74 69 6f 6e 3a 20 20 73  SQL function:  s
8220: 68 65 6c 6c 5f 70 75 74 73 6e 6c 28 58 29 0a 2a  hell_putsnl(X).*
8230: 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20 74  *.** Write the t
8240: 65 78 74 20 58 20 74 6f 20 74 68 65 20 73 63 72  ext X to the scr
8250: 65 65 6e 20 28 6f 72 20 77 68 61 74 65 76 65 72  een (or whatever
8260: 20 6f 75 74 70 75 74 20 69 73 20 62 65 69 6e 67   output is being
8270: 20 64 69 72 65 63 74 65 64 29 0a 2a 2a 20 61 64   directed).** ad
8280: 64 69 6e 67 20 61 20 6e 65 77 6c 69 6e 65 20 61  ding a newline a
8290: 74 20 74 68 65 20 65 6e 64 2c 20 61 6e 64 20 74  t the end, and t
82a0: 68 65 6e 20 72 65 74 75 72 6e 20 58 2e 0a 2a 2f  hen return X..*/
82b0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 68 65  .static void she
82c0: 6c 6c 50 75 74 73 46 75 6e 63 28 0a 20 20 73 71  llPutsFunc(.  sq
82d0: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70  lite3_context *p
82e0: 43 74 78 2c 0a 20 20 69 6e 74 20 6e 56 61 6c 2c  Ctx,.  int nVal,
82f0: 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
8300: 20 2a 2a 61 70 56 61 6c 0a 29 7b 0a 20 20 53 68   **apVal.){.  Sh
8310: 65 6c 6c 53 74 61 74 65 20 2a 70 20 3d 20 28 53  ellState *p = (S
8320: 68 65 6c 6c 53 74 61 74 65 2a 29 73 71 6c 69 74  hellState*)sqlit
8330: 65 33 5f 75 73 65 72 5f 64 61 74 61 28 70 43 74  e3_user_data(pCt
8340: 78 29 3b 0a 20 20 28 76 6f 69 64 29 6e 56 61 6c  x);.  (void)nVal
8350: 3b 0a 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28  ;.  utf8_printf(
8360: 70 2d 3e 6f 75 74 2c 20 22 25 73 5c 6e 22 2c 20  p->out, "%s\n", 
8370: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
8380: 78 74 28 61 70 56 61 6c 5b 30 5d 29 29 3b 0a 20  xt(apVal[0]));. 
8390: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
83a0: 76 61 6c 75 65 28 70 43 74 78 2c 20 61 70 56 61  value(pCtx, apVa
83b0: 6c 5b 30 5d 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  l[0]);.}../*.** 
83c0: 53 51 4c 20 66 75 6e 63 74 69 6f 6e 3a 20 20 20  SQL function:   
83d0: 65 64 69 74 28 56 41 4c 55 45 29 0a 2a 2a 20 20  edit(VALUE).**  
83e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65                 e
83f0: 64 69 74 28 56 41 4c 55 45 2c 45 44 49 54 4f 52  dit(VALUE,EDITOR
8400: 29 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 73 74  ).**.** These st
8410: 65 70 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28  eps:.**.**     (
8420: 31 29 20 57 72 69 74 65 20 56 41 4c 55 45 20 69  1) Write VALUE i
8430: 6e 74 6f 20 61 20 74 65 6d 70 6f 72 61 72 79 20  nto a temporary 
8440: 66 69 6c 65 2e 0a 2a 2a 20 20 20 20 20 28 32 29  file..**     (2)
8450: 20 52 75 6e 20 70 72 6f 67 72 61 6d 20 45 44 49   Run program EDI
8460: 54 4f 52 20 6f 6e 20 74 68 61 74 20 74 65 6d 70  TOR on that temp
8470: 6f 72 61 72 79 20 66 69 6c 65 2e 0a 2a 2a 20 20  orary file..**  
8480: 20 20 20 28 33 29 20 52 65 61 64 20 74 68 65 20     (3) Read the 
8490: 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 62  temporary file b
84a0: 61 63 6b 20 61 6e 64 20 72 65 74 75 72 6e 20 69  ack and return i
84b0: 74 73 20 63 6f 6e 74 65 6e 74 20 61 73 20 74 68  ts content as th
84c0: 65 20 72 65 73 75 6c 74 2e 0a 2a 2a 20 20 20 20  e result..**    
84d0: 20 28 34 29 20 44 65 6c 65 74 65 20 74 68 65 20   (4) Delete the 
84e0: 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 0a 2a  temporary file.*
84f0: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 45 44 49 54  *.** If the EDIT
8500: 4f 52 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6f  OR argument is o
8510: 6d 69 74 74 65 64 2c 20 75 73 65 20 74 68 65 20  mitted, use the 
8520: 76 61 6c 75 65 20 69 6e 20 74 68 65 20 56 49 53  value in the VIS
8530: 55 41 4c 0a 2a 2a 20 65 6e 76 69 72 6f 6e 6d 65  UAL.** environme
8540: 6e 74 20 76 61 72 69 61 62 6c 65 2e 20 20 49 66  nt variable.  If
8550: 20 73 74 69 6c 6c 20 74 68 65 72 65 20 69 73 20   still there is 
8560: 6e 6f 20 45 44 49 54 4f 52 2c 20 74 68 72 6f 75  no EDITOR, throu
8570: 67 68 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a  gh an error..**.
8580: 2a 2a 20 41 6c 73 6f 20 74 68 72 6f 77 20 61 6e  ** Also throw an
8590: 20 65 72 72 6f 72 20 69 66 20 74 68 65 20 45 44   error if the ED
85a0: 49 54 4f 52 20 70 72 6f 67 72 61 6d 20 72 65 74  ITOR program ret
85b0: 75 72 6e 73 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20  urns a non-zero 
85c0: 65 78 69 74 20 63 6f 64 65 2e 0a 2a 2f 0a 23 69  exit code..*/.#i
85d0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f 48  fndef SQLITE_NOH
85e0: 41 56 45 5f 53 59 53 54 45 4d 0a 73 74 61 74 69  AVE_SYSTEM.stati
85f0: 63 20 76 6f 69 64 20 65 64 69 74 46 75 6e 63 28  c void editFunc(
8600: 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  .  sqlite3_conte
8610: 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69  xt *context,.  i
8620: 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74  nt argc,.  sqlit
8630: 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a  e3_value **argv.
8640: 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ){.  const char 
8650: 2a 7a 45 64 69 74 6f 72 3b 0a 20 20 63 68 61 72  *zEditor;.  char
8660: 20 2a 7a 54 65 6d 70 46 69 6c 65 20 3d 20 30 3b   *zTempFile = 0;
8670: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
8680: 20 20 63 68 61 72 20 2a 7a 43 6d 64 20 3d 20 30    char *zCmd = 0
8690: 3b 0a 20 20 69 6e 74 20 62 42 69 6e 3b 0a 20 20  ;.  int bBin;.  
86a0: 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 68 61  int rc;.  int ha
86b0: 73 43 52 4e 4c 20 3d 20 30 3b 0a 20 20 46 49 4c  sCRNL = 0;.  FIL
86c0: 45 20 2a 66 20 3d 20 30 3b 0a 20 20 73 71 6c 69  E *f = 0;.  sqli
86d0: 74 65 33 5f 69 6e 74 36 34 20 73 7a 3b 0a 20 20  te3_int64 sz;.  
86e0: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 78 3b  sqlite3_int64 x;
86f0: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
8700: 20 2a 70 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20   *p = 0;..  if( 
8710: 61 72 67 63 3d 3d 32 20 29 7b 0a 20 20 20 20 7a  argc==2 ){.    z
8720: 45 64 69 74 6f 72 20 3d 20 28 63 6f 6e 73 74 20  Editor = (const 
8730: 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61  char*)sqlite3_va
8740: 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 31 5d  lue_text(argv[1]
8750: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
8760: 7a 45 64 69 74 6f 72 20 3d 20 67 65 74 65 6e 76  zEditor = getenv
8770: 28 22 56 49 53 55 41 4c 22 29 3b 0a 20 20 7d 0a  ("VISUAL");.  }.
8780: 20 20 69 66 28 20 7a 45 64 69 74 6f 72 3d 3d 30    if( zEditor==0
8790: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
87a0: 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e  result_error(con
87b0: 74 65 78 74 2c 20 22 6e 6f 20 65 64 69 74 6f 72  text, "no editor
87c0: 20 66 6f 72 20 65 64 69 74 28 29 22 2c 20 2d 31   for edit()", -1
87d0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
87e0: 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33   }.  if( sqlite3
87f0: 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 72 67 76  _value_type(argv
8800: 5b 30 5d 29 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c  [0])==SQLITE_NUL
8810: 4c 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  L ){.    sqlite3
8820: 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f  _result_error(co
8830: 6e 74 65 78 74 2c 20 22 4e 55 4c 4c 20 69 6e 70  ntext, "NULL inp
8840: 75 74 20 74 6f 20 65 64 69 74 28 29 22 2c 20 2d  ut to edit()", -
8850: 31 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  1);.    return;.
8860: 20 20 7d 0a 20 20 64 62 20 3d 20 73 71 6c 69 74    }.  db = sqlit
8870: 65 33 5f 63 6f 6e 74 65 78 74 5f 64 62 5f 68 61  e3_context_db_ha
8880: 6e 64 6c 65 28 63 6f 6e 74 65 78 74 29 3b 0a 20  ndle(context);. 
8890: 20 7a 54 65 6d 70 46 69 6c 65 20 3d 20 30 3b 0a   zTempFile = 0;.
88a0: 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63    sqlite3_file_c
88b0: 6f 6e 74 72 6f 6c 28 64 62 2c 20 30 2c 20 53 51  ontrol(db, 0, SQ
88c0: 4c 49 54 45 5f 46 43 4e 54 4c 5f 54 45 4d 50 46  LITE_FCNTL_TEMPF
88d0: 49 4c 45 4e 41 4d 45 2c 20 26 7a 54 65 6d 70 46  ILENAME, &zTempF
88e0: 69 6c 65 29 3b 0a 20 20 69 66 28 20 7a 54 65 6d  ile);.  if( zTem
88f0: 70 46 69 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20  pFile==0 ){.    
8900: 73 71 6c 69 74 65 33 5f 75 69 6e 74 36 34 20 72  sqlite3_uint64 r
8910: 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65   = 0;.    sqlite
8920: 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a  3_randomness(siz
8930: 65 6f 66 28 72 29 2c 20 26 72 29 3b 0a 20 20 20  eof(r), &r);.   
8940: 20 7a 54 65 6d 70 46 69 6c 65 20 3d 20 73 71 6c   zTempFile = sql
8950: 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 74 65  ite3_mprintf("te
8960: 6d 70 25 6c 6c 78 22 2c 20 72 29 3b 0a 20 20 20  mp%llx", r);.   
8970: 20 69 66 28 20 7a 54 65 6d 70 46 69 6c 65 3d 3d   if( zTempFile==
8980: 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
8990: 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f  e3_result_error_
89a0: 6e 6f 6d 65 6d 28 63 6f 6e 74 65 78 74 29 3b 0a  nomem(context);.
89b0: 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
89c0: 20 20 7d 0a 20 20 7d 0a 20 20 62 42 69 6e 20 3d    }.  }.  bBin =
89d0: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74   sqlite3_value_t
89e0: 79 70 65 28 61 72 67 76 5b 30 5d 29 3d 3d 53 51  ype(argv[0])==SQ
89f0: 4c 49 54 45 5f 42 4c 4f 42 3b 0a 20 20 2f 2a 20  LITE_BLOB;.  /* 
8a00: 57 68 65 6e 20 77 72 69 74 69 6e 67 20 74 68 65  When writing the
8a10: 20 66 69 6c 65 20 74 6f 20 62 65 20 65 64 69 74   file to be edit
8a20: 65 64 2c 20 64 6f 20 5c 6e 20 74 6f 20 5c 72 5c  ed, do \n to \r\
8a30: 6e 20 63 6f 6e 76 65 72 73 69 6f 6e 73 20 6f 6e  n conversions on
8a40: 20 73 79 73 74 65 6d 73 0a 20 20 2a 2a 20 74 68   systems.  ** th
8a50: 61 74 20 77 61 6e 74 20 5c 72 5c 6e 20 6c 69 6e  at want \r\n lin
8a60: 65 20 65 6e 64 69 6e 67 73 20 2a 2f 0a 20 20 66  e endings */.  f
8a70: 20 3d 20 66 6f 70 65 6e 28 7a 54 65 6d 70 46 69   = fopen(zTempFi
8a80: 6c 65 2c 20 62 42 69 6e 20 3f 20 22 77 62 22 20  le, bBin ? "wb" 
8a90: 3a 20 22 77 22 29 3b 0a 20 20 69 66 28 20 66 3d  : "w");.  if( f=
8aa0: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
8ab0: 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 63  3_result_error(c
8ac0: 6f 6e 74 65 78 74 2c 20 22 65 64 69 74 28 29 20  ontext, "edit() 
8ad0: 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 74 65 6d 70  cannot open temp
8ae0: 20 66 69 6c 65 22 2c 20 2d 31 29 3b 0a 20 20 20   file", -1);.   
8af0: 20 67 6f 74 6f 20 65 64 69 74 5f 66 75 6e 63 5f   goto edit_func_
8b00: 65 6e 64 3b 0a 20 20 7d 0a 20 20 73 7a 20 3d 20  end;.  }.  sz = 
8b10: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79  sqlite3_value_by
8b20: 74 65 73 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20  tes(argv[0]);.  
8b30: 69 66 28 20 62 42 69 6e 20 29 7b 0a 20 20 20 20  if( bBin ){.    
8b40: 78 20 3d 20 66 77 72 69 74 65 28 73 71 6c 69 74  x = fwrite(sqlit
8b50: 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 28 61 72  e3_value_blob(ar
8b60: 67 76 5b 30 5d 29 2c 20 31 2c 20 73 7a 2c 20 66  gv[0]), 1, sz, f
8b70: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
8b80: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20  const char *z = 
8b90: 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c  (const char*)sql
8ba0: 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
8bb0: 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 2f 2a  argv[0]);.    /*
8bc0: 20 52 65 6d 65 6d 62 65 72 20 77 68 65 74 68 65   Remember whethe
8bd0: 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 76 61 6c  r or not the val
8be0: 75 65 20 6f 72 69 67 69 6e 61 6c 6c 79 20 63 6f  ue originally co
8bf0: 6e 74 61 69 6e 65 64 20 5c 72 5c 6e 20 2a 2f 0a  ntained \r\n */.
8c00: 20 20 20 20 69 66 28 20 7a 20 26 26 20 73 74 72      if( z && str
8c10: 73 74 72 28 7a 2c 22 5c 72 5c 6e 22 29 21 3d 30  str(z,"\r\n")!=0
8c20: 20 29 20 68 61 73 43 52 4e 4c 20 3d 20 31 3b 0a   ) hasCRNL = 1;.
8c30: 20 20 20 20 78 20 3d 20 66 77 72 69 74 65 28 73      x = fwrite(s
8c40: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
8c50: 74 28 61 72 67 76 5b 30 5d 29 2c 20 31 2c 20 73  t(argv[0]), 1, s
8c60: 7a 2c 20 66 29 3b 0a 20 20 7d 0a 20 20 66 63 6c  z, f);.  }.  fcl
8c70: 6f 73 65 28 66 29 3b 0a 20 20 66 20 3d 20 30 3b  ose(f);.  f = 0;
8c80: 0a 20 20 69 66 28 20 78 21 3d 73 7a 20 29 7b 0a  .  if( x!=sz ){.
8c90: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
8ca0: 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78 74  lt_error(context
8cb0: 2c 20 22 65 64 69 74 28 29 20 63 6f 75 6c 64 20  , "edit() could 
8cc0: 6e 6f 74 20 77 72 69 74 65 20 74 68 65 20 77 68  not write the wh
8cd0: 6f 6c 65 20 66 69 6c 65 22 2c 20 2d 31 29 3b 0a  ole file", -1);.
8ce0: 20 20 20 20 67 6f 74 6f 20 65 64 69 74 5f 66 75      goto edit_fu
8cf0: 6e 63 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 7a 43  nc_end;.  }.  zC
8d00: 6d 64 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  md = sqlite3_mpr
8d10: 69 6e 74 66 28 22 25 73 20 5c 22 25 73 5c 22 22  intf("%s \"%s\""
8d20: 2c 20 7a 45 64 69 74 6f 72 2c 20 7a 54 65 6d 70  , zEditor, zTemp
8d30: 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 7a 43 6d  File);.  if( zCm
8d40: 64 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  d==0 ){.    sqli
8d50: 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72  te3_result_error
8d60: 5f 6e 6f 6d 65 6d 28 63 6f 6e 74 65 78 74 29 3b  _nomem(context);
8d70: 0a 20 20 20 20 67 6f 74 6f 20 65 64 69 74 5f 66  .    goto edit_f
8d80: 75 6e 63 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 72  unc_end;.  }.  r
8d90: 63 20 3d 20 73 79 73 74 65 6d 28 7a 43 6d 64 29  c = system(zCmd)
8da0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
8db0: 28 7a 43 6d 64 29 3b 0a 20 20 69 66 28 20 72 63  (zCmd);.  if( rc
8dc0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
8dd0: 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e  result_error(con
8de0: 74 65 78 74 2c 20 22 45 44 49 54 4f 52 20 72 65  text, "EDITOR re
8df0: 74 75 72 6e 65 64 20 6e 6f 6e 2d 7a 65 72 6f 22  turned non-zero"
8e00: 2c 20 2d 31 29 3b 0a 20 20 20 20 67 6f 74 6f 20  , -1);.    goto 
8e10: 65 64 69 74 5f 66 75 6e 63 5f 65 6e 64 3b 0a 20  edit_func_end;. 
8e20: 20 7d 0a 20 20 66 20 3d 20 66 6f 70 65 6e 28 7a   }.  f = fopen(z
8e30: 54 65 6d 70 46 69 6c 65 2c 20 22 72 62 22 29 3b  TempFile, "rb");
8e40: 0a 20 20 69 66 28 20 66 3d 3d 30 20 29 7b 0a 20  .  if( f==0 ){. 
8e50: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
8e60: 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c  t_error(context,
8e70: 0a 20 20 20 20 20 20 22 65 64 69 74 28 29 20 63  .      "edit() c
8e80: 61 6e 6e 6f 74 20 72 65 6f 70 65 6e 20 74 65 6d  annot reopen tem
8e90: 70 20 66 69 6c 65 20 61 66 74 65 72 20 65 64 69  p file after edi
8ea0: 74 22 2c 20 2d 31 29 3b 0a 20 20 20 20 67 6f 74  t", -1);.    got
8eb0: 6f 20 65 64 69 74 5f 66 75 6e 63 5f 65 6e 64 3b  o edit_func_end;
8ec0: 0a 20 20 7d 0a 20 20 66 73 65 65 6b 28 66 2c 20  .  }.  fseek(f, 
8ed0: 30 2c 20 53 45 45 4b 5f 45 4e 44 29 3b 0a 20 20  0, SEEK_END);.  
8ee0: 73 7a 20 3d 20 66 74 65 6c 6c 28 66 29 3b 0a 20  sz = ftell(f);. 
8ef0: 20 72 65 77 69 6e 64 28 66 29 3b 0a 20 20 70 20   rewind(f);.  p 
8f00: 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  = sqlite3_malloc
8f10: 36 34 28 20 73 7a 2b 28 62 42 69 6e 3d 3d 30 29  64( sz+(bBin==0)
8f20: 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29   );.  if( p==0 )
8f30: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65  {.    sqlite3_re
8f40: 73 75 6c 74 5f 65 72 72 6f 72 5f 6e 6f 6d 65 6d  sult_error_nomem
8f50: 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 67  (context);.    g
8f60: 6f 74 6f 20 65 64 69 74 5f 66 75 6e 63 5f 65 6e  oto edit_func_en
8f70: 64 3b 0a 20 20 7d 0a 20 20 78 20 3d 20 66 72 65  d;.  }.  x = fre
8f80: 61 64 28 70 2c 20 31 2c 20 73 7a 2c 20 66 29 3b  ad(p, 1, sz, f);
8f90: 0a 20 20 66 63 6c 6f 73 65 28 66 29 3b 0a 20 20  .  fclose(f);.  
8fa0: 66 20 3d 20 30 3b 0a 20 20 69 66 28 20 78 21 3d  f = 0;.  if( x!=
8fb0: 73 7a 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  sz ){.    sqlite
8fc0: 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 63  3_result_error(c
8fd0: 6f 6e 74 65 78 74 2c 20 22 63 6f 75 6c 64 20 6e  ontext, "could n
8fe0: 6f 74 20 72 65 61 64 20 62 61 63 6b 20 74 68 65  ot read back the
8ff0: 20 77 68 6f 6c 65 20 66 69 6c 65 22 2c 20 2d 31   whole file", -1
9000: 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 64 69 74  );.    goto edit
9010: 5f 66 75 6e 63 5f 65 6e 64 3b 0a 20 20 7d 0a 20  _func_end;.  }. 
9020: 20 69 66 28 20 62 42 69 6e 20 29 7b 0a 20 20 20   if( bBin ){.   
9030: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
9040: 62 6c 6f 62 36 34 28 63 6f 6e 74 65 78 74 2c 20  blob64(context, 
9050: 70 2c 20 73 7a 2c 20 73 71 6c 69 74 65 33 5f 66  p, sz, sqlite3_f
9060: 72 65 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ree);.  }else{. 
9070: 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34     sqlite3_int64
9080: 20 69 2c 20 6a 3b 0a 20 20 20 20 69 66 28 20 68   i, j;.    if( h
9090: 61 73 43 52 4e 4c 20 29 7b 0a 20 20 20 20 20 20  asCRNL ){.      
90a0: 2f 2a 20 49 66 20 74 68 65 20 6f 72 69 67 69 6e  /* If the origin
90b0: 61 6c 20 63 6f 6e 74 61 69 6e 73 20 5c 72 5c 6e  al contains \r\n
90c0: 20 74 68 65 6e 20 64 6f 20 6e 6f 20 63 6f 6e 76   then do no conv
90d0: 65 72 73 69 6f 6e 73 20 62 61 63 6b 20 74 6f 20  ersions back to 
90e0: 5c 6e 20 2a 2f 0a 20 20 20 20 20 20 6a 20 3d 20  \n */.      j = 
90f0: 73 7a 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  sz;.    }else{. 
9100: 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 66       /* If the f
9110: 69 6c 65 20 64 69 64 20 6e 6f 74 20 6f 72 69 67  ile did not orig
9120: 69 6e 61 6c 6c 79 20 63 6f 6e 74 61 69 6e 20 5c  inally contain \
9130: 72 5c 6e 20 74 68 65 6e 20 63 6f 6e 76 65 72 74  r\n then convert
9140: 20 61 6e 79 20 6e 65 77 0a 20 20 20 20 20 20 2a   any new.      *
9150: 2a 20 5c 72 5c 6e 20 62 61 63 6b 20 69 6e 74 6f  * \r\n back into
9160: 20 5c 6e 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72   \n */.      for
9170: 28 69 3d 6a 3d 30 3b 20 69 3c 73 7a 3b 20 69 2b  (i=j=0; i<sz; i+
9180: 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
9190: 70 5b 69 5d 3d 3d 27 5c 72 27 20 26 26 20 70 5b  p[i]=='\r' && p[
91a0: 69 2b 31 5d 3d 3d 27 5c 6e 27 20 29 20 69 2b 2b  i+1]=='\n' ) i++
91b0: 3b 0a 20 20 20 20 20 20 20 20 70 5b 6a 2b 2b 5d  ;.        p[j++]
91c0: 20 3d 20 70 5b 69 5d 3b 0a 20 20 20 20 20 20 7d   = p[i];.      }
91d0: 0a 20 20 20 20 20 20 73 7a 20 3d 20 6a 3b 0a 20  .      sz = j;. 
91e0: 20 20 20 20 20 70 5b 73 7a 5d 20 3d 20 30 3b 0a       p[sz] = 0;.
91f0: 20 20 20 20 7d 20 0a 20 20 20 20 73 71 6c 69 74      } .    sqlit
9200: 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 36 34  e3_result_text64
9210: 28 63 6f 6e 74 65 78 74 2c 20 28 63 6f 6e 73 74  (context, (const
9220: 20 63 68 61 72 2a 29 70 2c 20 73 7a 2c 0a 20 20   char*)p, sz,.  
9230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9240: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
9250: 66 72 65 65 2c 20 53 51 4c 49 54 45 5f 55 54 46  free, SQLITE_UTF
9260: 38 29 3b 0a 20 20 7d 0a 20 20 70 20 3d 20 30 3b  8);.  }.  p = 0;
9270: 0a 0a 65 64 69 74 5f 66 75 6e 63 5f 65 6e 64 3a  ..edit_func_end:
9280: 0a 20 20 69 66 28 20 66 20 29 20 66 63 6c 6f 73  .  if( f ) fclos
9290: 65 28 66 29 3b 0a 20 20 75 6e 6c 69 6e 6b 28 7a  e(f);.  unlink(z
92a0: 54 65 6d 70 46 69 6c 65 29 3b 0a 20 20 73 71 6c  TempFile);.  sql
92b0: 69 74 65 33 5f 66 72 65 65 28 7a 54 65 6d 70 46  ite3_free(zTempF
92c0: 69 6c 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  ile);.  sqlite3_
92d0: 66 72 65 65 28 70 29 3b 0a 7d 0a 23 65 6e 64 69  free(p);.}.#endi
92e0: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4e 4f 48 41  f /* SQLITE_NOHA
92f0: 56 45 5f 53 59 53 54 45 4d 20 2a 2f 0a 0a 2f 2a  VE_SYSTEM */../*
9300: 0a 2a 2a 20 53 61 76 65 20 6f 72 20 72 65 73 74  .** Save or rest
9310: 6f 72 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ore the current 
9320: 6f 75 74 70 75 74 20 6d 6f 64 65 0a 2a 2f 0a 73  output mode.*/.s
9330: 74 61 74 69 63 20 76 6f 69 64 20 6f 75 74 70 75  tatic void outpu
9340: 74 4d 6f 64 65 50 75 73 68 28 53 68 65 6c 6c 53  tModePush(ShellS
9350: 74 61 74 65 20 2a 70 29 7b 0a 20 20 70 2d 3e 6d  tate *p){.  p->m
9360: 6f 64 65 50 72 69 6f 72 20 3d 20 70 2d 3e 6d 6f  odePrior = p->mo
9370: 64 65 3b 0a 20 20 6d 65 6d 63 70 79 28 70 2d 3e  de;.  memcpy(p->
9380: 63 6f 6c 53 65 70 50 72 69 6f 72 2c 20 70 2d 3e  colSepPrior, p->
9390: 63 6f 6c 53 65 70 61 72 61 74 6f 72 2c 20 73 69  colSeparator, si
93a0: 7a 65 6f 66 28 70 2d 3e 63 6f 6c 53 65 70 61 72  zeof(p->colSepar
93b0: 61 74 6f 72 29 29 3b 0a 20 20 6d 65 6d 63 70 79  ator));.  memcpy
93c0: 28 70 2d 3e 72 6f 77 53 65 70 50 72 69 6f 72 2c  (p->rowSepPrior,
93d0: 20 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72   p->rowSeparator
93e0: 2c 20 73 69 7a 65 6f 66 28 70 2d 3e 72 6f 77 53  , sizeof(p->rowS
93f0: 65 70 61 72 61 74 6f 72 29 29 3b 0a 7d 0a 73 74  eparator));.}.st
9400: 61 74 69 63 20 76 6f 69 64 20 6f 75 74 70 75 74  atic void output
9410: 4d 6f 64 65 50 6f 70 28 53 68 65 6c 6c 53 74 61  ModePop(ShellSta
9420: 74 65 20 2a 70 29 7b 0a 20 20 70 2d 3e 6d 6f 64  te *p){.  p->mod
9430: 65 20 3d 20 70 2d 3e 6d 6f 64 65 50 72 69 6f 72  e = p->modePrior
9440: 3b 0a 20 20 6d 65 6d 63 70 79 28 70 2d 3e 63 6f  ;.  memcpy(p->co
9450: 6c 53 65 70 61 72 61 74 6f 72 2c 20 70 2d 3e 63  lSeparator, p->c
9460: 6f 6c 53 65 70 50 72 69 6f 72 2c 20 73 69 7a 65  olSepPrior, size
9470: 6f 66 28 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74  of(p->colSeparat
9480: 6f 72 29 29 3b 0a 20 20 6d 65 6d 63 70 79 28 70  or));.  memcpy(p
9490: 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 2c 20  ->rowSeparator, 
94a0: 70 2d 3e 72 6f 77 53 65 70 50 72 69 6f 72 2c 20  p->rowSepPrior, 
94b0: 73 69 7a 65 6f 66 28 70 2d 3e 72 6f 77 53 65 70  sizeof(p->rowSep
94c0: 61 72 61 74 6f 72 29 29 3b 0a 7d 0a 0a 2f 2a 0a  arator));.}../*.
94d0: 2a 2a 20 4f 75 74 70 75 74 20 74 68 65 20 67 69  ** Output the gi
94e0: 76 65 6e 20 73 74 72 69 6e 67 20 61 73 20 61 20  ven string as a 
94f0: 68 65 78 2d 65 6e 63 6f 64 65 64 20 62 6c 6f 62  hex-encoded blob
9500: 20 28 65 67 2e 20 58 27 31 32 33 34 27 20 29 0a   (eg. X'1234' ).
9510: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6f  */.static void o
9520: 75 74 70 75 74 5f 68 65 78 5f 62 6c 6f 62 28 46  utput_hex_blob(F
9530: 49 4c 45 20 2a 6f 75 74 2c 20 63 6f 6e 73 74 20  ILE *out, const 
9540: 76 6f 69 64 20 2a 70 42 6c 6f 62 2c 20 69 6e 74  void *pBlob, int
9550: 20 6e 42 6c 6f 62 29 7b 0a 20 20 69 6e 74 20 69   nBlob){.  int i
9560: 3b 0a 20 20 63 68 61 72 20 2a 7a 42 6c 6f 62 20  ;.  char *zBlob 
9570: 3d 20 28 63 68 61 72 20 2a 29 70 42 6c 6f 62 3b  = (char *)pBlob;
9580: 0a 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75  .  raw_printf(ou
9590: 74 2c 22 58 27 22 29 3b 0a 20 20 66 6f 72 28 69  t,"X'");.  for(i
95a0: 3d 30 3b 20 69 3c 6e 42 6c 6f 62 3b 20 69 2b 2b  =0; i<nBlob; i++
95b0: 29 7b 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75  ){ raw_printf(ou
95c0: 74 2c 22 25 30 32 78 22 2c 7a 42 6c 6f 62 5b 69  t,"%02x",zBlob[i
95d0: 5d 26 30 78 66 66 29 3b 20 7d 0a 20 20 72 61 77  ]&0xff); }.  raw
95e0: 5f 70 72 69 6e 74 66 28 6f 75 74 2c 22 27 22 29  _printf(out,"'")
95f0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20  ;.}../*.** Find 
9600: 61 20 73 74 72 69 6e 67 20 74 68 61 74 20 69 73  a string that is
9610: 20 6e 6f 74 20 66 6f 75 6e 64 20 61 6e 79 77 68   not found anywh
9620: 65 72 65 20 69 6e 20 7a 5b 5d 2e 20 20 52 65 74  ere in z[].  Ret
9630: 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a  urn a pointer.**
9640: 20 74 6f 20 74 68 61 74 20 73 74 72 69 6e 67 2e   to that string.
9650: 0a 2a 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 75 73  .**.** Try to us
9660: 65 20 7a 41 20 61 6e 64 20 7a 42 20 66 69 72 73  e zA and zB firs
9670: 74 2e 20 20 49 66 20 62 6f 74 68 20 6f 66 20 74  t.  If both of t
9680: 68 6f 73 65 20 61 72 65 20 61 6c 72 65 61 64 79  hose are already
9690: 20 66 6f 75 6e 64 20 69 6e 20 7a 5b 5d 0a 2a 2a   found in z[].**
96a0: 20 74 68 65 6e 20 6d 61 6b 65 20 75 70 20 73 6f   then make up so
96b0: 6d 65 20 73 74 72 69 6e 67 20 61 6e 64 20 73 74  me string and st
96c0: 6f 72 65 20 69 74 20 69 6e 20 74 68 65 20 62 75  ore it in the bu
96d0: 66 66 65 72 20 7a 42 75 66 2e 0a 2a 2f 0a 73 74  ffer zBuf..*/.st
96e0: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
96f0: 2a 75 6e 75 73 65 64 5f 73 74 72 69 6e 67 28 0a  *unused_string(.
9700: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c    const char *z,
9710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9720: 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 6d 75      /* Result mu
9730: 73 74 20 6e 6f 74 20 61 70 70 65 61 72 20 61 6e  st not appear an
9740: 79 77 68 65 72 65 20 69 6e 20 7a 20 2a 2f 0a 20  ywhere in z */. 
9750: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 2c   const char *zA,
9760: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 42 2c   const char *zB,
9770: 20 20 20 2f 2a 20 54 72 79 20 74 68 65 73 65 20     /* Try these 
9780: 66 69 72 73 74 20 2a 2f 0a 20 20 63 68 61 72 20  first */.  char 
9790: 2a 7a 42 75 66 20 20 20 20 20 20 20 20 20 20 20  *zBuf           
97a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
97b0: 53 70 61 63 65 20 74 6f 20 73 74 6f 72 65 20 61  Space to store a
97c0: 20 67 65 6e 65 72 61 74 65 64 20 73 74 72 69 6e   generated strin
97d0: 67 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e  g */.){.  unsign
97e0: 65 64 20 69 20 3d 20 30 3b 0a 20 20 69 66 28 20  ed i = 0;.  if( 
97f0: 73 74 72 73 74 72 28 7a 2c 20 7a 41 29 3d 3d 30  strstr(z, zA)==0
9800: 20 29 20 72 65 74 75 72 6e 20 7a 41 3b 0a 20 20   ) return zA;.  
9810: 69 66 28 20 73 74 72 73 74 72 28 7a 2c 20 7a 42  if( strstr(z, zB
9820: 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 7a 42  )==0 ) return zB
9830: 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 73 71 6c 69  ;.  do{.    sqli
9840: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 32 30 2c  te3_snprintf(20,
9850: 7a 42 75 66 2c 22 28 25 73 25 75 29 22 2c 20 7a  zBuf,"(%s%u)", z
9860: 41 2c 20 69 2b 2b 29 3b 0a 20 20 7d 77 68 69 6c  A, i++);.  }whil
9870: 65 28 20 73 74 72 73 74 72 28 7a 2c 7a 42 75 66  e( strstr(z,zBuf
9880: 29 21 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e  )!=0 );.  return
9890: 20 7a 42 75 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   zBuf;.}../*.** 
98a0: 4f 75 74 70 75 74 20 74 68 65 20 67 69 76 65 6e  Output the given
98b0: 20 73 74 72 69 6e 67 20 61 73 20 61 20 71 75 6f   string as a quo
98c0: 74 65 64 20 73 74 72 69 6e 67 20 75 73 69 6e 67  ted string using
98d0: 20 53 51 4c 20 71 75 6f 74 69 6e 67 20 63 6f 6e   SQL quoting con
98e0: 76 65 6e 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20  ventions..**.** 
98f0: 53 65 65 20 61 6c 73 6f 3a 20 6f 75 74 70 75 74  See also: output
9900: 5f 71 75 6f 74 65 64 5f 65 73 63 61 70 65 64 5f  _quoted_escaped_
9910: 73 74 72 69 6e 67 28 29 0a 2a 2f 0a 73 74 61 74  string().*/.stat
9920: 69 63 20 76 6f 69 64 20 6f 75 74 70 75 74 5f 71  ic void output_q
9930: 75 6f 74 65 64 5f 73 74 72 69 6e 67 28 46 49 4c  uoted_string(FIL
9940: 45 20 2a 6f 75 74 2c 20 63 6f 6e 73 74 20 63 68  E *out, const ch
9950: 61 72 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 69 3b  ar *z){.  int i;
9960: 0a 20 20 63 68 61 72 20 63 3b 0a 20 20 73 65 74  .  char c;.  set
9970: 42 69 6e 61 72 79 4d 6f 64 65 28 6f 75 74 2c 20  BinaryMode(out, 
9980: 31 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 28  1);.  for(i=0; (
9990: 63 20 3d 20 7a 5b 69 5d 29 21 3d 30 20 26 26 20  c = z[i])!=0 && 
99a0: 63 21 3d 27 5c 27 27 3b 20 69 2b 2b 29 7b 7d 0a  c!='\''; i++){}.
99b0: 20 20 69 66 28 20 63 3d 3d 30 20 29 7b 0a 20 20    if( c==0 ){.  
99c0: 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 6f 75    utf8_printf(ou
99d0: 74 2c 22 27 25 73 27 22 2c 7a 29 3b 0a 20 20 7d  t,"'%s'",z);.  }
99e0: 65 6c 73 65 7b 0a 20 20 20 20 72 61 77 5f 70 72  else{.    raw_pr
99f0: 69 6e 74 66 28 6f 75 74 2c 20 22 27 22 29 3b 0a  intf(out, "'");.
9a00: 20 20 20 20 77 68 69 6c 65 28 20 2a 7a 20 29 7b      while( *z ){
9a10: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
9a20: 28 63 20 3d 20 7a 5b 69 5d 29 21 3d 30 20 26 26  (c = z[i])!=0 &&
9a30: 20 63 21 3d 27 5c 27 27 3b 20 69 2b 2b 29 7b 7d   c!='\''; i++){}
9a40: 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27 5c  .      if( c=='\
9a50: 27 27 20 29 20 69 2b 2b 3b 0a 20 20 20 20 20 20  '' ) i++;.      
9a60: 69 66 28 20 69 20 29 7b 0a 20 20 20 20 20 20 20  if( i ){.       
9a70: 20 75 74 66 38 5f 70 72 69 6e 74 66 28 6f 75 74   utf8_printf(out
9a80: 2c 20 22 25 2e 2a 73 22 2c 20 69 2c 20 7a 29 3b  , "%.*s", i, z);
9a90: 0a 20 20 20 20 20 20 20 20 7a 20 2b 3d 20 69 3b  .        z += i;
9aa0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
9ab0: 66 28 20 63 3d 3d 27 5c 27 27 20 29 7b 0a 20 20  f( c=='\'' ){.  
9ac0: 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
9ad0: 28 6f 75 74 2c 20 22 27 22 29 3b 0a 20 20 20 20  (out, "'");.    
9ae0: 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
9af0: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
9b00: 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  c==0 ){.        
9b10: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
9b20: 20 20 20 20 20 7a 2b 2b 3b 0a 20 20 20 20 7d 0a       z++;.    }.
9b30: 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f      raw_printf(o
9b40: 75 74 2c 20 22 27 22 29 3b 0a 20 20 7d 0a 20 20  ut, "'");.  }.  
9b50: 73 65 74 54 65 78 74 4d 6f 64 65 28 6f 75 74 2c  setTextMode(out,
9b60: 20 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 75   1);.}../*.** Ou
9b70: 74 70 75 74 20 74 68 65 20 67 69 76 65 6e 20 73  tput the given s
9b80: 74 72 69 6e 67 20 61 73 20 61 20 71 75 6f 74 65  tring as a quote
9b90: 64 20 73 74 72 69 6e 67 20 75 73 69 6e 67 20 53  d string using S
9ba0: 51 4c 20 71 75 6f 74 69 6e 67 20 63 6f 6e 76 65  QL quoting conve
9bb0: 6e 74 69 6f 6e 73 2e 0a 2a 2a 20 41 64 64 69 74  ntions..** Addit
9bc0: 69 6f 6e 61 6c 6c 6c 79 20 2c 20 65 73 63 61 70  ionallly , escap
9bd0: 65 20 74 68 65 20 22 5c 6e 22 20 61 6e 64 20 22  e the "\n" and "
9be0: 5c 72 22 20 63 68 61 72 61 63 74 65 72 73 20 73  \r" characters s
9bf0: 6f 20 74 68 61 74 20 74 68 65 79 20 64 6f 20 6e  o that they do n
9c00: 6f 74 0a 2a 2a 20 67 65 74 20 63 6f 72 72 75 70  ot.** get corrup
9c10: 74 65 64 20 62 79 20 65 6e 64 2d 6f 66 2d 6c 69  ted by end-of-li
9c20: 6e 65 20 74 72 61 6e 73 6c 61 74 69 6f 6e 20 66  ne translation f
9c30: 61 63 69 6c 69 74 69 65 73 20 69 6e 20 73 6f 6d  acilities in som
9c40: 65 20 6f 70 65 72 61 74 69 6e 67 0a 2a 2a 20 73  e operating.** s
9c50: 79 73 74 65 6d 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  ystems..**.** Th
9c60: 69 73 20 69 73 20 6c 69 6b 65 20 6f 75 74 70 75  is is like outpu
9c70: 74 5f 71 75 6f 74 65 64 5f 73 74 72 69 6e 67 28  t_quoted_string(
9c80: 29 20 62 75 74 20 77 69 74 68 20 74 68 65 20 61  ) but with the a
9c90: 64 64 69 74 69 6f 6e 20 6f 66 20 74 68 65 20 5c  ddition of the \
9ca0: 72 5c 6e 0a 2a 2a 20 65 73 63 61 70 65 20 6d 65  r\n.** escape me
9cb0: 63 68 61 6e 69 73 6d 2e 0a 2a 2f 0a 73 74 61 74  chanism..*/.stat
9cc0: 69 63 20 76 6f 69 64 20 6f 75 74 70 75 74 5f 71  ic void output_q
9cd0: 75 6f 74 65 64 5f 65 73 63 61 70 65 64 5f 73 74  uoted_escaped_st
9ce0: 72 69 6e 67 28 46 49 4c 45 20 2a 6f 75 74 2c 20  ring(FILE *out, 
9cf0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a  const char *z){.
9d00: 20 20 69 6e 74 20 69 3b 0a 20 20 63 68 61 72 20    int i;.  char 
9d10: 63 3b 0a 20 20 73 65 74 42 69 6e 61 72 79 4d 6f  c;.  setBinaryMo
9d20: 64 65 28 6f 75 74 2c 20 31 29 3b 0a 20 20 66 6f  de(out, 1);.  fo
9d30: 72 28 69 3d 30 3b 20 28 63 20 3d 20 7a 5b 69 5d  r(i=0; (c = z[i]
9d40: 29 21 3d 30 20 26 26 20 63 21 3d 27 5c 27 27 20  )!=0 && c!='\'' 
9d50: 26 26 20 63 21 3d 27 5c 6e 27 20 26 26 20 63 21  && c!='\n' && c!
9d60: 3d 27 5c 72 27 3b 20 69 2b 2b 29 7b 7d 0a 20 20  ='\r'; i++){}.  
9d70: 69 66 28 20 63 3d 3d 30 20 29 7b 0a 20 20 20 20  if( c==0 ){.    
9d80: 75 74 66 38 5f 70 72 69 6e 74 66 28 6f 75 74 2c  utf8_printf(out,
9d90: 22 27 25 73 27 22 2c 7a 29 3b 0a 20 20 7d 65 6c  "'%s'",z);.  }el
9da0: 73 65 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  se{.    const ch
9db0: 61 72 20 2a 7a 4e 4c 20 3d 20 30 3b 0a 20 20 20  ar *zNL = 0;.   
9dc0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 52   const char *zCR
9dd0: 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 6e 4e   = 0;.    int nN
9de0: 4c 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 6e  L = 0;.    int n
9df0: 43 52 20 3d 20 30 3b 0a 20 20 20 20 63 68 61 72  CR = 0;.    char
9e00: 20 7a 42 75 66 31 5b 32 30 5d 2c 20 7a 42 75 66   zBuf1[20], zBuf
9e10: 32 5b 32 30 5d 3b 0a 20 20 20 20 66 6f 72 28 69  2[20];.    for(i
9e20: 3d 30 3b 20 7a 5b 69 5d 3b 20 69 2b 2b 29 7b 0a  =0; z[i]; i++){.
9e30: 20 20 20 20 20 20 69 66 28 20 7a 5b 69 5d 3d 3d        if( z[i]==
9e40: 27 5c 6e 27 20 29 20 6e 4e 4c 2b 2b 3b 0a 20 20  '\n' ) nNL++;.  
9e50: 20 20 20 20 69 66 28 20 7a 5b 69 5d 3d 3d 27 5c      if( z[i]=='\
9e60: 72 27 20 29 20 6e 43 52 2b 2b 3b 0a 20 20 20 20  r' ) nCR++;.    
9e70: 7d 0a 20 20 20 20 69 66 28 20 6e 4e 4c 20 29 7b  }.    if( nNL ){
9e80: 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74  .      raw_print
9e90: 66 28 6f 75 74 2c 20 22 72 65 70 6c 61 63 65 28  f(out, "replace(
9ea0: 22 29 3b 0a 20 20 20 20 20 20 7a 4e 4c 20 3d 20  ");.      zNL = 
9eb0: 75 6e 75 73 65 64 5f 73 74 72 69 6e 67 28 7a 2c  unused_string(z,
9ec0: 20 22 5c 5c 6e 22 2c 20 22 5c 5c 30 31 32 22 2c   "\\n", "\\012",
9ed0: 20 7a 42 75 66 31 29 3b 0a 20 20 20 20 7d 0a 20   zBuf1);.    }. 
9ee0: 20 20 20 69 66 28 20 6e 43 52 20 29 7b 0a 20 20     if( nCR ){.  
9ef0: 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f      raw_printf(o
9f00: 75 74 2c 20 22 72 65 70 6c 61 63 65 28 22 29 3b  ut, "replace(");
9f10: 0a 20 20 20 20 20 20 7a 43 52 20 3d 20 75 6e 75  .      zCR = unu
9f20: 73 65 64 5f 73 74 72 69 6e 67 28 7a 2c 20 22 5c  sed_string(z, "\
9f30: 5c 72 22 2c 20 22 5c 5c 30 31 35 22 2c 20 7a 42  \r", "\\015", zB
9f40: 75 66 32 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  uf2);.    }.    
9f50: 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20  raw_printf(out, 
9f60: 22 27 22 29 3b 0a 20 20 20 20 77 68 69 6c 65 28  "'");.    while(
9f70: 20 2a 7a 20 29 7b 0a 20 20 20 20 20 20 66 6f 72   *z ){.      for
9f80: 28 69 3d 30 3b 20 28 63 20 3d 20 7a 5b 69 5d 29  (i=0; (c = z[i])
9f90: 21 3d 30 20 26 26 20 63 21 3d 27 5c 6e 27 20 26  !=0 && c!='\n' &
9fa0: 26 20 63 21 3d 27 5c 72 27 20 26 26 20 63 21 3d  & c!='\r' && c!=
9fb0: 27 5c 27 27 3b 20 69 2b 2b 29 7b 7d 0a 20 20 20  '\''; i++){}.   
9fc0: 20 20 20 69 66 28 20 63 3d 3d 27 5c 27 27 20 29     if( c=='\'' )
9fd0: 20 69 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20   i++;.      if( 
9fe0: 69 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66  i ){.        utf
9ff0: 38 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25  8_printf(out, "%
a000: 2e 2a 73 22 2c 20 69 2c 20 7a 29 3b 0a 20 20 20  .*s", i, z);.   
a010: 20 20 20 20 20 7a 20 2b 3d 20 69 3b 0a 20 20 20       z += i;.   
a020: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63     }.      if( c
a030: 3d 3d 27 5c 27 27 20 29 7b 0a 20 20 20 20 20 20  =='\'' ){.      
a040: 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74    raw_printf(out
a050: 2c 20 22 27 22 29 3b 0a 20 20 20 20 20 20 20 20  , "'");.        
a060: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
a070: 7d 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d 30  }.      if( c==0
a080: 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61   ){.        brea
a090: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
a0a0: 20 7a 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20   z++;.      if( 
a0b0: 63 3d 3d 27 5c 6e 27 20 29 7b 0a 20 20 20 20 20  c=='\n' ){.     
a0c0: 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75     raw_printf(ou
a0d0: 74 2c 20 22 25 73 22 2c 20 7a 4e 4c 29 3b 0a 20  t, "%s", zNL);. 
a0e0: 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
a0f0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
a100: 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22  aw_printf(out, "
a110: 25 73 22 2c 20 7a 43 52 29 3b 0a 20 20 20 20 7d  %s", zCR);.    }
a120: 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28  .    raw_printf(
a130: 6f 75 74 2c 20 22 27 22 29 3b 0a 20 20 20 20 69  out, "'");.    i
a140: 66 28 20 6e 43 52 20 29 7b 0a 20 20 20 20 20 20  f( nCR ){.      
a150: 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20  raw_printf(out, 
a160: 22 2c 27 25 73 27 2c 63 68 61 72 28 31 33 29 29  ",'%s',char(13))
a170: 22 2c 20 7a 43 52 29 3b 0a 20 20 20 20 7d 0a 20  ", zCR);.    }. 
a180: 20 20 20 69 66 28 20 6e 4e 4c 20 29 7b 0a 20 20     if( nNL ){.  
a190: 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f      raw_printf(o
a1a0: 75 74 2c 20 22 2c 27 25 73 27 2c 63 68 61 72 28  ut, ",'%s',char(
a1b0: 31 30 29 29 22 2c 20 7a 4e 4c 29 3b 0a 20 20 20  10))", zNL);.   
a1c0: 20 7d 0a 20 20 7d 0a 20 20 73 65 74 54 65 78 74   }.  }.  setText
a1d0: 4d 6f 64 65 28 6f 75 74 2c 20 31 29 3b 0a 7d 0a  Mode(out, 1);.}.
a1e0: 0a 2f 2a 0a 2a 2a 20 4f 75 74 70 75 74 20 74 68  ./*.** Output th
a1f0: 65 20 67 69 76 65 6e 20 73 74 72 69 6e 67 20 61  e given string a
a200: 73 20 61 20 71 75 6f 74 65 64 20 61 63 63 6f 72  s a quoted accor
a210: 64 69 6e 67 20 74 6f 20 43 20 6f 72 20 54 43 4c  ding to C or TCL
a220: 20 71 75 6f 74 69 6e 67 20 72 75 6c 65 73 2e 0a   quoting rules..
a230: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6f  */.static void o
a240: 75 74 70 75 74 5f 63 5f 73 74 72 69 6e 67 28 46  utput_c_string(F
a250: 49 4c 45 20 2a 6f 75 74 2c 20 63 6f 6e 73 74 20  ILE *out, const 
a260: 63 68 61 72 20 2a 7a 29 7b 0a 20 20 75 6e 73 69  char *z){.  unsi
a270: 67 6e 65 64 20 69 6e 74 20 63 3b 0a 20 20 66 70  gned int c;.  fp
a280: 75 74 63 28 27 22 27 2c 20 6f 75 74 29 3b 0a 20  utc('"', out);. 
a290: 20 77 68 69 6c 65 28 20 28 63 20 3d 20 2a 28 7a   while( (c = *(z
a2a0: 2b 2b 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 69  ++))!=0 ){.    i
a2b0: 66 28 20 63 3d 3d 27 5c 5c 27 20 29 7b 0a 20 20  f( c=='\\' ){.  
a2c0: 20 20 20 20 66 70 75 74 63 28 63 2c 20 6f 75 74      fputc(c, out
a2d0: 29 3b 0a 20 20 20 20 20 20 66 70 75 74 63 28 63  );.      fputc(c
a2e0: 2c 20 6f 75 74 29 3b 0a 20 20 20 20 7d 65 6c 73  , out);.    }els
a2f0: 65 20 69 66 28 20 63 3d 3d 27 22 27 20 29 7b 0a  e if( c=='"' ){.
a300: 20 20 20 20 20 20 66 70 75 74 63 28 27 5c 5c 27        fputc('\\'
a310: 2c 20 6f 75 74 29 3b 0a 20 20 20 20 20 20 66 70  , out);.      fp
a320: 75 74 63 28 27 22 27 2c 20 6f 75 74 29 3b 0a 20  utc('"', out);. 
a330: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d     }else if( c==
a340: 27 5c 74 27 20 29 7b 0a 20 20 20 20 20 20 66 70  '\t' ){.      fp
a350: 75 74 63 28 27 5c 5c 27 2c 20 6f 75 74 29 3b 0a  utc('\\', out);.
a360: 20 20 20 20 20 20 66 70 75 74 63 28 27 74 27 2c        fputc('t',
a370: 20 6f 75 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65   out);.    }else
a380: 20 69 66 28 20 63 3d 3d 27 5c 6e 27 20 29 7b 0a   if( c=='\n' ){.
a390: 20 20 20 20 20 20 66 70 75 74 63 28 27 5c 5c 27        fputc('\\'
a3a0: 2c 20 6f 75 74 29 3b 0a 20 20 20 20 20 20 66 70  , out);.      fp
a3b0: 75 74 63 28 27 6e 27 2c 20 6f 75 74 29 3b 0a 20  utc('n', out);. 
a3c0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d     }else if( c==
a3d0: 27 5c 72 27 20 29 7b 0a 20 20 20 20 20 20 66 70  '\r' ){.      fp
a3e0: 75 74 63 28 27 5c 5c 27 2c 20 6f 75 74 29 3b 0a  utc('\\', out);.
a3f0: 20 20 20 20 20 20 66 70 75 74 63 28 27 72 27 2c        fputc('r',
a400: 20 6f 75 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65   out);.    }else
a410: 20 69 66 28 20 21 69 73 70 72 69 6e 74 28 63 26   if( !isprint(c&
a420: 30 78 66 66 29 20 29 7b 0a 20 20 20 20 20 20 72  0xff) ){.      r
a430: 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22  aw_printf(out, "
a440: 5c 5c 25 30 33 6f 22 2c 20 63 26 30 78 66 66 29  \\%03o", c&0xff)
a450: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
a460: 20 20 20 66 70 75 74 63 28 63 2c 20 6f 75 74 29     fputc(c, out)
a470: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 70  ;.    }.  }.  fp
a480: 75 74 63 28 27 22 27 2c 20 6f 75 74 29 3b 0a 7d  utc('"', out);.}
a490: 0a 0a 2f 2a 0a 2a 2a 20 4f 75 74 70 75 74 20 74  ../*.** Output t
a4a0: 68 65 20 67 69 76 65 6e 20 73 74 72 69 6e 67 20  he given string 
a4b0: 77 69 74 68 20 63 68 61 72 61 63 74 65 72 73 20  with characters 
a4c0: 74 68 61 74 20 61 72 65 20 73 70 65 63 69 61 6c  that are special
a4d0: 20 74 6f 0a 2a 2a 20 48 54 4d 4c 20 65 73 63 61   to.** HTML esca
a4e0: 70 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ped..*/.static v
a4f0: 6f 69 64 20 6f 75 74 70 75 74 5f 68 74 6d 6c 5f  oid output_html_
a500: 73 74 72 69 6e 67 28 46 49 4c 45 20 2a 6f 75 74  string(FILE *out
a510: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29  , const char *z)
a520: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  {.  int i;.  if(
a530: 20 7a 3d 3d 30 20 29 20 7a 20 3d 20 22 22 3b 0a   z==0 ) z = "";.
a540: 20 20 77 68 69 6c 65 28 20 2a 7a 20 29 7b 0a 20    while( *z ){. 
a550: 20 20 20 66 6f 72 28 69 3d 30 3b 20 20 20 7a 5b     for(i=0;   z[
a560: 69 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 26  i].            &
a570: 26 20 7a 5b 69 5d 21 3d 27 3c 27 0a 20 20 20 20  & z[i]!='<'.    
a580: 20 20 20 20 20 20 20 20 26 26 20 7a 5b 69 5d 21          && z[i]!
a590: 3d 27 26 27 0a 20 20 20 20 20 20 20 20 20 20 20  ='&'.           
a5a0: 20 26 26 20 7a 5b 69 5d 21 3d 27 3e 27 0a 20 20   && z[i]!='>'.  
a5b0: 20 20 20 20 20 20 20 20 20 20 26 26 20 7a 5b 69            && z[i
a5c0: 5d 21 3d 27 5c 22 27 0a 20 20 20 20 20 20 20 20  ]!='\"'.        
a5d0: 20 20 20 20 26 26 20 7a 5b 69 5d 21 3d 27 5c 27      && z[i]!='\'
a5e0: 27 3b 0a 20 20 20 20 20 20 20 20 69 2b 2b 29 7b  ';.        i++){
a5f0: 7d 0a 20 20 20 20 69 66 28 20 69 3e 30 20 29 7b  }.    if( i>0 ){
a600: 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e  .      utf8_prin
a610: 74 66 28 6f 75 74 2c 22 25 2e 2a 73 22 2c 69 2c  tf(out,"%.*s",i,
a620: 7a 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  z);.    }.    if
a630: 28 20 7a 5b 69 5d 3d 3d 27 3c 27 20 29 7b 0a 20  ( z[i]=='<' ){. 
a640: 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
a650: 6f 75 74 2c 22 26 6c 74 3b 22 29 3b 0a 20 20 20  out,"&lt;");.   
a660: 20 7d 65 6c 73 65 20 69 66 28 20 7a 5b 69 5d 3d   }else if( z[i]=
a670: 3d 27 26 27 20 29 7b 0a 20 20 20 20 20 20 72 61  ='&' ){.      ra
a680: 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 22 26 61  w_printf(out,"&a
a690: 6d 70 3b 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65  mp;");.    }else
a6a0: 20 69 66 28 20 7a 5b 69 5d 3d 3d 27 3e 27 20 29   if( z[i]=='>' )
a6b0: 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e  {.      raw_prin
a6c0: 74 66 28 6f 75 74 2c 22 26 67 74 3b 22 29 3b 0a  tf(out,"&gt;");.
a6d0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 5b      }else if( z[
a6e0: 69 5d 3d 3d 27 5c 22 27 20 29 7b 0a 20 20 20 20  i]=='\"' ){.    
a6f0: 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74    raw_printf(out
a700: 2c 22 26 71 75 6f 74 3b 22 29 3b 0a 20 20 20 20  ,"&quot;");.    
a710: 7d 65 6c 73 65 20 69 66 28 20 7a 5b 69 5d 3d 3d  }else if( z[i]==
a720: 27 5c 27 27 20 29 7b 0a 20 20 20 20 20 20 72 61  '\'' ){.      ra
a730: 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 22 26 23  w_printf(out,"&#
a740: 33 39 3b 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65  39;");.    }else
a750: 7b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  {.      break;. 
a760: 20 20 20 7d 0a 20 20 20 20 7a 20 2b 3d 20 69 20     }.    z += i 
a770: 2b 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  + 1;.  }.}../*.*
a780: 2a 20 49 66 20 61 20 66 69 65 6c 64 20 63 6f 6e  * If a field con
a790: 74 61 69 6e 73 20 61 6e 79 20 63 68 61 72 61 63  tains any charac
a7a0: 74 65 72 20 69 64 65 6e 74 69 66 69 65 64 20 62  ter identified b
a7b0: 79 20 61 20 31 20 69 6e 20 74 68 65 20 66 6f 6c  y a 1 in the fol
a7c0: 6c 6f 77 69 6e 67 0a 2a 2a 20 61 72 72 61 79 2c  lowing.** array,
a7d0: 20 74 68 65 6e 20 74 68 65 20 73 74 72 69 6e 67   then the string
a7e0: 20 6d 75 73 74 20 62 65 20 71 75 6f 74 65 64 20   must be quoted 
a7f0: 66 6f 72 20 43 53 56 2e 0a 2a 2f 0a 73 74 61 74  for CSV..*/.stat
a800: 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 6e 65  ic const char ne
a810: 65 64 43 73 76 51 75 6f 74 65 5b 5d 20 3d 20 7b  edCsvQuote[] = {
a820: 0a 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  .  1, 1, 1, 1, 1
a830: 2c 20 31 2c 20 31 2c 20 31 2c 20 20 20 31 2c 20  , 1, 1, 1,   1, 
a840: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
a850: 2c 20 31 2c 0a 20 20 31 2c 20 31 2c 20 31 2c 20  , 1,.  1, 1, 1, 
a860: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 20  1, 1, 1, 1, 1,  
a870: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
a880: 31 2c 20 31 2c 20 31 2c 0a 20 20 31 2c 20 30 2c  1, 1, 1,.  1, 0,
a890: 20 31 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   1, 0, 0, 0, 0, 
a8a0: 31 2c 20 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c  1,   0, 0, 0, 0,
a8b0: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 0a 20 20 30   0, 0, 0, 0,.  0
a8c0: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
a8d0: 20 30 2c 20 30 2c 20 20 20 30 2c 20 30 2c 20 30   0, 0,   0, 0, 0
a8e0: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
a8f0: 0a 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  .  0, 0, 0, 0, 0
a900: 2c 20 30 2c 20 30 2c 20 30 2c 20 20 20 30 2c 20  , 0, 0, 0,   0, 
a910: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
a920: 2c 20 30 2c 0a 20 20 30 2c 20 30 2c 20 30 2c 20  , 0,.  0, 0, 0, 
a930: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 20  0, 0, 0, 0, 0,  
a940: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
a950: 30 2c 20 30 2c 20 30 2c 0a 20 20 30 2c 20 30 2c  0, 0, 0,.  0, 0,
a960: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
a970: 30 2c 20 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c  0,   0, 0, 0, 0,
a980: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 0a 20 20 30   0, 0, 0, 0,.  0
a990: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
a9a0: 20 30 2c 20 30 2c 20 20 20 30 2c 20 30 2c 20 30   0, 0,   0, 0, 0
a9b0: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 31 2c  , 0, 0, 0, 0, 1,
a9c0: 0a 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  .  1, 1, 1, 1, 1
a9d0: 2c 20 31 2c 20 31 2c 20 31 2c 20 20 20 31 2c 20  , 1, 1, 1,   1, 
a9e0: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
a9f0: 2c 20 31 2c 0a 20 20 31 2c 20 31 2c 20 31 2c 20  , 1,.  1, 1, 1, 
aa00: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 20  1, 1, 1, 1, 1,  
aa10: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
aa20: 31 2c 20 31 2c 20 31 2c 0a 20 20 31 2c 20 31 2c  1, 1, 1,.  1, 1,
aa30: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
aa40: 31 2c 20 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c  1,   1, 1, 1, 1,
aa50: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 0a 20 20 31   1, 1, 1, 1,.  1
aa60: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c  , 1, 1, 1, 1, 1,
aa70: 20 31 2c 20 31 2c 20 20 20 31 2c 20 31 2c 20 31   1, 1,   1, 1, 1
aa80: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c  , 1, 1, 1, 1, 1,
aa90: 0a 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  .  1, 1, 1, 1, 1
aaa0: 2c 20 31 2c 20 31 2c 20 31 2c 20 20 20 31 2c 20  , 1, 1, 1,   1, 
aab0: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
aac0: 2c 20 31 2c 0a 20 20 31 2c 20 31 2c 20 31 2c 20  , 1,.  1, 1, 1, 
aad0: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 20  1, 1, 1, 1, 1,  
aae0: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
aaf0: 31 2c 20 31 2c 20 31 2c 0a 20 20 31 2c 20 31 2c  1, 1, 1,.  1, 1,
ab00: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
ab10: 31 2c 20 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c  1,   1, 1, 1, 1,
ab20: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 0a 20 20 31   1, 1, 1, 1,.  1
ab30: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c  , 1, 1, 1, 1, 1,
ab40: 20 31 2c 20 31 2c 20 20 20 31 2c 20 31 2c 20 31   1, 1,   1, 1, 1
ab50: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c  , 1, 1, 1, 1, 1,
ab60: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 4f 75 74 70 75  .};../*.** Outpu
ab70: 74 20 61 20 73 69 6e 67 6c 65 20 74 65 72 6d 20  t a single term 
ab80: 6f 66 20 43 53 56 2e 20 20 41 63 74 75 61 6c 6c  of CSV.  Actuall
ab90: 79 2c 20 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74  y, p->colSeparat
aba0: 6f 72 20 69 73 20 75 73 65 64 20 66 6f 72 0a 2a  or is used for.*
abb0: 2a 20 74 68 65 20 73 65 70 61 72 61 74 6f 72 2c  * the separator,
abc0: 20 77 68 69 63 68 20 6d 61 79 20 6f 72 20 6d 61   which may or ma
abd0: 79 20 6e 6f 74 20 62 65 20 61 20 63 6f 6d 6d 61  y not be a comma
abe0: 2e 20 20 70 2d 3e 6e 75 6c 6c 56 61 6c 75 65 20  .  p->nullValue 
abf0: 69 73 0a 2a 2a 20 74 68 65 20 6e 75 6c 6c 20 76  is.** the null v
ac00: 61 6c 75 65 2e 20 20 53 74 72 69 6e 67 73 20 61  alue.  Strings a
ac10: 72 65 20 71 75 6f 74 65 64 20 69 66 20 6e 65 63  re quoted if nec
ac20: 65 73 73 61 72 79 2e 20 20 54 68 65 20 73 65 70  essary.  The sep
ac30: 61 72 61 74 6f 72 0a 2a 2a 20 69 73 20 6f 6e 6c  arator.** is onl
ac40: 79 20 69 73 73 75 65 64 20 69 66 20 62 53 65 70  y issued if bSep
ac50: 20 69 73 20 74 72 75 65 2e 0a 2a 2f 0a 73 74 61   is true..*/.sta
ac60: 74 69 63 20 76 6f 69 64 20 6f 75 74 70 75 74 5f  tic void output_
ac70: 63 73 76 28 53 68 65 6c 6c 53 74 61 74 65 20 2a  csv(ShellState *
ac80: 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  p, const char *z
ac90: 2c 20 69 6e 74 20 62 53 65 70 29 7b 0a 20 20 46  , int bSep){.  F
aca0: 49 4c 45 20 2a 6f 75 74 20 3d 20 70 2d 3e 6f 75  ILE *out = p->ou
acb0: 74 3b 0a 20 20 69 66 28 20 7a 3d 3d 30 20 29 7b  t;.  if( z==0 ){
acc0: 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66  .    utf8_printf
acd0: 28 6f 75 74 2c 22 25 73 22 2c 70 2d 3e 6e 75 6c  (out,"%s",p->nul
ace0: 6c 56 61 6c 75 65 29 3b 0a 20 20 7d 65 6c 73 65  lValue);.  }else
acf0: 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
ad00: 20 69 6e 74 20 6e 53 65 70 20 3d 20 73 74 72 6c   int nSep = strl
ad10: 65 6e 33 30 28 70 2d 3e 63 6f 6c 53 65 70 61 72  en30(p->colSepar
ad20: 61 74 6f 72 29 3b 0a 20 20 20 20 66 6f 72 28 69  ator);.    for(i
ad30: 3d 30 3b 20 7a 5b 69 5d 3b 20 69 2b 2b 29 7b 0a  =0; z[i]; i++){.
ad40: 20 20 20 20 20 20 69 66 28 20 6e 65 65 64 43 73        if( needCs
ad50: 76 51 75 6f 74 65 5b 28 28 75 6e 73 69 67 6e 65  vQuote[((unsigne
ad60: 64 20 63 68 61 72 2a 29 7a 29 5b 69 5d 5d 0a 20  d char*)z)[i]]. 
ad70: 20 20 20 20 20 20 20 20 7c 7c 20 28 7a 5b 69 5d          || (z[i]
ad80: 3d 3d 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f  ==p->colSeparato
ad90: 72 5b 30 5d 20 26 26 0a 20 20 20 20 20 20 20 20  r[0] &&.        
ada0: 20 20 20 20 20 28 6e 53 65 70 3d 3d 31 20 7c 7c       (nSep==1 ||
adb0: 20 6d 65 6d 63 6d 70 28 7a 2c 20 70 2d 3e 63 6f   memcmp(z, p->co
adc0: 6c 53 65 70 61 72 61 74 6f 72 2c 20 6e 53 65 70  lSeparator, nSep
add0: 29 3d 3d 30 29 29 20 29 7b 0a 20 20 20 20 20 20  )==0)) ){.      
ade0: 20 20 69 20 3d 20 30 3b 0a 20 20 20 20 20 20 20    i = 0;.       
adf0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
ae00: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3d      }.    if( i=
ae10: 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72  =0 ){.      char
ae20: 20 2a 7a 51 75 6f 74 65 64 20 3d 20 73 71 6c 69   *zQuoted = sqli
ae30: 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 5c 22 25  te3_mprintf("\"%
ae40: 77 5c 22 22 2c 20 7a 29 3b 0a 20 20 20 20 20 20  w\"", z);.      
ae50: 75 74 66 38 5f 70 72 69 6e 74 66 28 6f 75 74 2c  utf8_printf(out,
ae60: 20 22 25 73 22 2c 20 7a 51 75 6f 74 65 64 29 3b   "%s", zQuoted);
ae70: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
ae80: 72 65 65 28 7a 51 75 6f 74 65 64 29 3b 0a 20 20  ree(zQuoted);.  
ae90: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 75    }else{.      u
aea0: 74 66 38 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20  tf8_printf(out, 
aeb0: 22 25 73 22 2c 20 7a 29 3b 0a 20 20 20 20 7d 0a  "%s", z);.    }.
aec0: 20 20 7d 0a 20 20 69 66 28 20 62 53 65 70 20 29    }.  if( bSep )
aed0: 7b 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74  {.    utf8_print
aee0: 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20  f(p->out, "%s", 
aef0: 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 29  p->colSeparator)
af00: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ;.  }.}../*.** T
af10: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 75 6e 73  his routine runs
af20: 20 77 68 65 6e 20 74 68 65 20 75 73 65 72 20 70   when the user p
af30: 72 65 73 73 65 73 20 43 74 72 6c 2d 43 0a 2a 2f  resses Ctrl-C.*/
af40: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69 6e 74  .static void int
af50: 65 72 72 75 70 74 5f 68 61 6e 64 6c 65 72 28 69  errupt_handler(i
af60: 6e 74 20 4e 6f 74 55 73 65 64 29 7b 0a 20 20 55  nt NotUsed){.  U
af70: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
af80: 4e 6f 74 55 73 65 64 29 3b 0a 20 20 73 65 65 6e  NotUsed);.  seen
af90: 49 6e 74 65 72 72 75 70 74 2b 2b 3b 0a 20 20 69  Interrupt++;.  i
afa0: 66 28 20 73 65 65 6e 49 6e 74 65 72 72 75 70 74  f( seenInterrupt
afb0: 3e 32 20 29 20 65 78 69 74 28 31 29 3b 0a 20 20  >2 ) exit(1);.  
afc0: 69 66 28 20 67 6c 6f 62 61 6c 44 62 20 29 20 73  if( globalDb ) s
afd0: 71 6c 69 74 65 33 5f 69 6e 74 65 72 72 75 70 74  qlite3_interrupt
afe0: 28 67 6c 6f 62 61 6c 44 62 29 3b 0a 7d 0a 0a 23  (globalDb);.}..#
aff0: 69 66 20 28 64 65 66 69 6e 65 64 28 5f 57 49 4e  if (defined(_WIN
b000: 33 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 57  32) || defined(W
b010: 49 4e 33 32 29 29 20 26 26 20 21 64 65 66 69 6e  IN32)) && !defin
b020: 65 64 28 5f 57 49 4e 33 32 5f 57 43 45 29 0a 2f  ed(_WIN32_WCE)./
b030: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
b040: 65 20 72 75 6e 73 20 66 6f 72 20 63 6f 6e 73 6f  e runs for conso
b050: 6c 65 20 65 76 65 6e 74 73 20 28 65 2e 67 2e 20  le events (e.g. 
b060: 43 74 72 6c 2d 43 29 20 6f 6e 20 57 69 6e 33 32  Ctrl-C) on Win32
b070: 0a 2a 2f 0a 73 74 61 74 69 63 20 42 4f 4f 4c 20  .*/.static BOOL 
b080: 57 49 4e 41 50 49 20 43 6f 6e 73 6f 6c 65 43 74  WINAPI ConsoleCt
b090: 72 6c 48 61 6e 64 6c 65 72 28 0a 20 20 44 57 4f  rlHandler(.  DWO
b0a0: 52 44 20 64 77 43 74 72 6c 54 79 70 65 20 2f 2a  RD dwCtrlType /*
b0b0: 20 4f 6e 65 20 6f 66 20 74 68 65 20 43 54 52 4c   One of the CTRL
b0c0: 5f 2a 5f 45 56 45 4e 54 20 63 6f 6e 73 74 61 6e  _*_EVENT constan
b0d0: 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 64  ts */.){.  if( d
b0e0: 77 43 74 72 6c 54 79 70 65 3d 3d 43 54 52 4c 5f  wCtrlType==CTRL_
b0f0: 43 5f 45 56 45 4e 54 20 29 7b 0a 20 20 20 20 69  C_EVENT ){.    i
b100: 6e 74 65 72 72 75 70 74 5f 68 61 6e 64 6c 65 72  nterrupt_handler
b110: 28 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  (0);.    return 
b120: 54 52 55 45 3b 0a 20 20 7d 0a 20 20 72 65 74 75  TRUE;.  }.  retu
b130: 72 6e 20 46 41 4c 53 45 3b 0a 7d 0a 23 65 6e 64  rn FALSE;.}.#end
b140: 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  if..#ifndef SQLI
b150: 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a  TE_OMIT_AUTHORIZ
b160: 41 54 49 4f 4e 0a 2f 2a 0a 2a 2a 20 57 68 65 6e  ATION./*.** When
b170: 20 74 68 65 20 22 2e 61 75 74 68 20 4f 4e 22 20   the ".auth ON" 
b180: 69 73 20 73 65 74 2c 20 74 68 65 20 66 6f 6c 6c  is set, the foll
b190: 6f 77 69 6e 67 20 61 75 74 68 6f 72 69 7a 65 72  owing authorizer
b1a0: 20 63 61 6c 6c 62 61 63 6b 20 69 73 0a 2a 2a 20   callback is.** 
b1b0: 69 6e 76 6f 6b 65 64 2e 20 20 49 74 20 61 6c 77  invoked.  It alw
b1c0: 61 79 73 20 72 65 74 75 72 6e 73 20 53 51 4c 49  ays returns SQLI
b1d0: 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63  TE_OK..*/.static
b1e0: 20 69 6e 74 20 73 68 65 6c 6c 41 75 74 68 28 0a   int shellAuth(.
b1f0: 20 20 76 6f 69 64 20 2a 70 43 6c 69 65 6e 74 44    void *pClientD
b200: 61 74 61 2c 0a 20 20 69 6e 74 20 6f 70 2c 0a 20  ata,.  int op,. 
b210: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 31   const char *zA1
b220: 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
b230: 7a 41 32 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61  zA2,.  const cha
b240: 72 20 2a 7a 41 33 2c 0a 20 20 63 6f 6e 73 74 20  r *zA3,.  const 
b250: 63 68 61 72 20 2a 7a 41 34 0a 29 7b 0a 20 20 53  char *zA4.){.  S
b260: 68 65 6c 6c 53 74 61 74 65 20 2a 70 20 3d 20 28  hellState *p = (
b270: 53 68 65 6c 6c 53 74 61 74 65 2a 29 70 43 6c 69  ShellState*)pCli
b280: 65 6e 74 44 61 74 61 3b 0a 20 20 73 74 61 74 69  entData;.  stati
b290: 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a  c const char *az
b2a0: 41 63 74 69 6f 6e 5b 5d 20 3d 20 7b 20 30 2c 0a  Action[] = { 0,.
b2b0: 20 20 20 20 20 22 43 52 45 41 54 45 5f 49 4e 44       "CREATE_IND
b2c0: 45 58 22 2c 20 20 20 20 20 20 20 20 20 22 43 52  EX",         "CR
b2d0: 45 41 54 45 5f 54 41 42 4c 45 22 2c 20 20 20 20  EATE_TABLE",    
b2e0: 20 20 20 20 20 22 43 52 45 41 54 45 5f 54 45 4d       "CREATE_TEM
b2f0: 50 5f 49 4e 44 45 58 22 2c 0a 20 20 20 20 20 22  P_INDEX",.     "
b300: 43 52 45 41 54 45 5f 54 45 4d 50 5f 54 41 42 4c  CREATE_TEMP_TABL
b310: 45 22 2c 20 20 20 20 22 43 52 45 41 54 45 5f 54  E",    "CREATE_T
b320: 45 4d 50 5f 54 52 49 47 47 45 52 22 2c 20 20 22  EMP_TRIGGER",  "
b330: 43 52 45 41 54 45 5f 54 45 4d 50 5f 56 49 45 57  CREATE_TEMP_VIEW
b340: 22 2c 0a 20 20 20 20 20 22 43 52 45 41 54 45 5f  ",.     "CREATE_
b350: 54 52 49 47 47 45 52 22 2c 20 20 20 20 20 20 20  TRIGGER",       
b360: 22 43 52 45 41 54 45 5f 56 49 45 57 22 2c 20 20  "CREATE_VIEW",  
b370: 20 20 20 20 20 20 20 20 22 44 45 4c 45 54 45 22          "DELETE"
b380: 2c 0a 20 20 20 20 20 22 44 52 4f 50 5f 49 4e 44  ,.     "DROP_IND
b390: 45 58 22 2c 20 20 20 20 20 20 20 20 20 20 20 22  EX",           "
b3a0: 44 52 4f 50 5f 54 41 42 4c 45 22 2c 20 20 20 20  DROP_TABLE",    
b3b0: 20 20 20 20 20 20 20 22 44 52 4f 50 5f 54 45 4d         "DROP_TEM
b3c0: 50 5f 49 4e 44 45 58 22 2c 0a 20 20 20 20 20 22  P_INDEX",.     "
b3d0: 44 52 4f 50 5f 54 45 4d 50 5f 54 41 42 4c 45 22  DROP_TEMP_TABLE"
b3e0: 2c 20 20 20 20 20 20 22 44 52 4f 50 5f 54 45 4d  ,      "DROP_TEM
b3f0: 50 5f 54 52 49 47 47 45 52 22 2c 20 20 20 20 22  P_TRIGGER",    "
b400: 44 52 4f 50 5f 54 45 4d 50 5f 56 49 45 57 22 2c  DROP_TEMP_VIEW",
b410: 0a 20 20 20 20 20 22 44 52 4f 50 5f 54 52 49 47  .     "DROP_TRIG
b420: 47 45 52 22 2c 20 20 20 20 20 20 20 20 20 22 44  GER",         "D
b430: 52 4f 50 5f 56 49 45 57 22 2c 20 20 20 20 20 20  ROP_VIEW",      
b440: 20 20 20 20 20 20 22 49 4e 53 45 52 54 22 2c 0a        "INSERT",.
b450: 20 20 20 20 20 22 50 52 41 47 4d 41 22 2c 20 20       "PRAGMA",  
b460: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 52 45               "RE
b470: 41 44 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  AD",            
b480: 20 20 20 20 20 22 53 45 4c 45 43 54 22 2c 0a 20       "SELECT",. 
b490: 20 20 20 20 22 54 52 41 4e 53 41 43 54 49 4f 4e      "TRANSACTION
b4a0: 22 2c 20 20 20 20 20 20 20 20 20 20 22 55 50 44  ",          "UPD
b4b0: 41 54 45 22 2c 20 20 20 20 20 20 20 20 20 20 20  ATE",           
b4c0: 20 20 20 20 22 41 54 54 41 43 48 22 2c 0a 20 20      "ATTACH",.  
b4d0: 20 20 20 22 44 45 54 41 43 48 22 2c 20 20 20 20     "DETACH",    
b4e0: 20 20 20 20 20 20 20 20 20 20 20 22 41 4c 54 45             "ALTE
b4f0: 52 5f 54 41 42 4c 45 22 2c 20 20 20 20 20 20 20  R_TABLE",       
b500: 20 20 20 22 52 45 49 4e 44 45 58 22 2c 0a 20 20     "REINDEX",.  
b510: 20 20 20 22 41 4e 41 4c 59 5a 45 22 2c 20 20 20     "ANALYZE",   
b520: 20 20 20 20 20 20 20 20 20 20 20 22 43 52 45 41             "CREA
b530: 54 45 5f 56 54 41 42 4c 45 22 2c 20 20 20 20 20  TE_VTABLE",     
b540: 20 20 20 22 44 52 4f 50 5f 56 54 41 42 4c 45 22     "DROP_VTABLE"
b550: 2c 0a 20 20 20 20 20 22 46 55 4e 43 54 49 4f 4e  ,.     "FUNCTION
b560: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 22  ",             "
b570: 53 41 56 45 50 4f 49 4e 54 22 2c 20 20 20 20 20  SAVEPOINT",     
b580: 20 20 20 20 20 20 20 22 52 45 43 55 52 53 49 56         "RECURSIV
b590: 45 22 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69 3b  E".  };.  int i;
b5a0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61  .  const char *a
b5b0: 7a 5b 34 5d 3b 0a 20 20 61 7a 5b 30 5d 20 3d 20  z[4];.  az[0] = 
b5c0: 7a 41 31 3b 0a 20 20 61 7a 5b 31 5d 20 3d 20 7a  zA1;.  az[1] = z
b5d0: 41 32 3b 0a 20 20 61 7a 5b 32 5d 20 3d 20 7a 41  A2;.  az[2] = zA
b5e0: 33 3b 0a 20 20 61 7a 5b 33 5d 20 3d 20 7a 41 34  3;.  az[3] = zA4
b5f0: 3b 0a 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28  ;.  utf8_printf(
b600: 70 2d 3e 6f 75 74 2c 20 22 61 75 74 68 6f 72 69  p->out, "authori
b610: 7a 65 72 3a 20 25 73 22 2c 20 61 7a 41 63 74 69  zer: %s", azActi
b620: 6f 6e 5b 6f 70 5d 29 3b 0a 20 20 66 6f 72 28 69  on[op]);.  for(i
b630: 3d 30 3b 20 69 3c 34 3b 20 69 2b 2b 29 7b 0a 20  =0; i<4; i++){. 
b640: 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d     raw_printf(p-
b650: 3e 6f 75 74 2c 20 22 20 22 29 3b 0a 20 20 20 20  >out, " ");.    
b660: 69 66 28 20 61 7a 5b 69 5d 20 29 7b 0a 20 20 20  if( az[i] ){.   
b670: 20 20 20 6f 75 74 70 75 74 5f 63 5f 73 74 72 69     output_c_stri
b680: 6e 67 28 70 2d 3e 6f 75 74 2c 20 61 7a 5b 69 5d  ng(p->out, az[i]
b690: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
b6a0: 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70      raw_printf(p
b6b0: 2d 3e 6f 75 74 2c 20 22 4e 55 4c 4c 22 29 3b 0a  ->out, "NULL");.
b6c0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 61 77 5f      }.  }.  raw_
b6d0: 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
b6e0: 5c 6e 22 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  \n");.  return S
b6f0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64  QLITE_OK;.}.#end
b700: 69 66 0a 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20  if../*.** Print 
b710: 61 20 73 63 68 65 6d 61 20 73 74 61 74 65 6d 65  a schema stateme
b720: 6e 74 2e 20 20 50 61 72 74 20 6f 66 20 4d 4f 44  nt.  Part of MOD
b730: 45 5f 53 65 6d 69 20 61 6e 64 20 4d 4f 44 45 5f  E_Semi and MODE_
b740: 50 72 65 74 74 79 20 6f 75 74 70 75 74 2e 0a 2a  Pretty output..*
b750: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
b760: 65 20 63 6f 6e 76 65 72 74 73 20 73 6f 6d 65 20  e converts some 
b770: 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
b780: 74 65 6d 65 6e 74 73 20 66 6f 72 20 73 68 61 64  tements for shad
b790: 6f 77 20 74 61 62 6c 65 73 0a 2a 2a 20 69 6e 20  ow tables.** in 
b7a0: 46 54 53 33 2f 34 2f 35 20 69 6e 74 6f 20 43 52  FTS3/4/5 into CR
b7b0: 45 41 54 45 20 54 41 42 4c 45 20 49 46 20 4e 4f  EATE TABLE IF NO
b7c0: 54 20 45 58 49 53 54 53 20 73 74 61 74 65 6d 65  T EXISTS stateme
b7d0: 6e 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  nts..*/.static v
b7e0: 6f 69 64 20 70 72 69 6e 74 53 63 68 65 6d 61 4c  oid printSchemaL
b7f0: 69 6e 65 28 46 49 4c 45 20 2a 6f 75 74 2c 20 63  ine(FILE *out, c
b800: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 63 6f  onst char *z, co
b810: 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 69 6c 29  nst char *zTail)
b820: 7b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f  {.  if( sqlite3_
b830: 73 74 72 67 6c 6f 62 28 22 43 52 45 41 54 45 20  strglob("CREATE 
b840: 54 41 42 4c 45 20 5b 27 5c 22 5d 2a 22 2c 20 7a  TABLE ['\"]*", z
b850: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 75 74 66 38  )==0 ){.    utf8
b860: 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 43 52  _printf(out, "CR
b870: 45 41 54 45 20 54 41 42 4c 45 20 49 46 20 4e 4f  EATE TABLE IF NO
b880: 54 20 45 58 49 53 54 53 20 25 73 25 73 22 2c 20  T EXISTS %s%s", 
b890: 7a 2b 31 33 2c 20 7a 54 61 69 6c 29 3b 0a 20 20  z+13, zTail);.  
b8a0: 7d 65 6c 73 65 7b 0a 20 20 20 20 75 74 66 38 5f  }else{.    utf8_
b8b0: 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 73 25  printf(out, "%s%
b8c0: 73 22 2c 20 7a 2c 20 7a 54 61 69 6c 29 3b 0a 20  s", z, zTail);. 
b8d0: 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64   }.}.static void
b8e0: 20 70 72 69 6e 74 53 63 68 65 6d 61 4c 69 6e 65   printSchemaLine
b8f0: 4e 28 46 49 4c 45 20 2a 6f 75 74 2c 20 63 68 61  N(FILE *out, cha
b900: 72 20 2a 7a 2c 20 69 6e 74 20 6e 2c 20 63 6f 6e  r *z, int n, con
b910: 73 74 20 63 68 61 72 20 2a 7a 54 61 69 6c 29 7b  st char *zTail){
b920: 0a 20 20 63 68 61 72 20 63 20 3d 20 7a 5b 6e 5d  .  char c = z[n]
b930: 3b 0a 20 20 7a 5b 6e 5d 20 3d 20 30 3b 0a 20 20  ;.  z[n] = 0;.  
b940: 70 72 69 6e 74 53 63 68 65 6d 61 4c 69 6e 65 28  printSchemaLine(
b950: 6f 75 74 2c 20 7a 2c 20 7a 54 61 69 6c 29 3b 0a  out, z, zTail);.
b960: 20 20 7a 5b 6e 5d 20 3d 20 63 3b 0a 7d 0a 0a 2f    z[n] = c;.}../
b970: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65  *.** Return true
b980: 20 69 66 20 73 74 72 69 6e 67 20 7a 5b 5d 20 68   if string z[] h
b990: 61 73 20 6e 6f 74 68 69 6e 67 20 62 75 74 20 77  as nothing but w
b9a0: 68 69 74 65 73 70 61 63 65 20 61 6e 64 20 63 6f  hitespace and co
b9b0: 6d 6d 65 6e 74 73 20 74 6f 20 74 68 65 0a 2a 2a  mments to the.**
b9c0: 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69 72 73   end of the firs
b9d0: 74 20 6c 69 6e 65 2e 0a 2a 2f 0a 73 74 61 74 69  t line..*/.stati
b9e0: 63 20 69 6e 74 20 77 73 54 6f 45 6f 6c 28 63 6f  c int wsToEol(co
b9f0: 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20  nst char *z){.  
ba00: 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30  int i;.  for(i=0
ba10: 3b 20 7a 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20  ; z[i]; i++){.  
ba20: 20 20 69 66 28 20 7a 5b 69 5d 3d 3d 27 5c 6e 27    if( z[i]=='\n'
ba30: 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20   ) return 1;.   
ba40: 20 69 66 28 20 49 73 53 70 61 63 65 28 7a 5b 69   if( IsSpace(z[i
ba50: 5d 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  ]) ) continue;. 
ba60: 20 20 20 69 66 28 20 7a 5b 69 5d 3d 3d 27 2d 27     if( z[i]=='-'
ba70: 20 26 26 20 7a 5b 69 2b 31 5d 3d 3d 27 2d 27 20   && z[i+1]=='-' 
ba80: 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20  ) return 1;.    
ba90: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
baa0: 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a  return 1;.}../*.
bab0: 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 65 6e 74  ** Add a new ent
bac0: 72 79 20 74 6f 20 74 68 65 20 45 58 50 4c 41 49  ry to the EXPLAI
bad0: 4e 20 51 55 45 52 59 20 50 4c 41 4e 20 64 61 74  N QUERY PLAN dat
bae0: 61 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  a.*/.static void
baf0: 20 65 71 70 5f 61 70 70 65 6e 64 28 53 68 65 6c   eqp_append(Shel
bb00: 6c 53 74 61 74 65 20 2a 70 2c 20 69 6e 74 20 69  lState *p, int i
bb10: 45 71 70 49 64 2c 20 69 6e 74 20 70 32 2c 20 63  EqpId, int p2, c
bb20: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 65 78 74  onst char *zText
bb30: 29 7b 0a 20 20 45 51 50 47 72 61 70 68 52 6f 77  ){.  EQPGraphRow
bb40: 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20 6e 54   *pNew;.  int nT
bb50: 65 78 74 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a  ext = strlen30(z
bb60: 54 65 78 74 29 3b 0a 20 20 69 66 28 20 70 2d 3e  Text);.  if( p->
bb70: 61 75 74 6f 45 51 50 74 65 73 74 20 29 7b 0a 20  autoEQPtest ){. 
bb80: 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70     utf8_printf(p
bb90: 2d 3e 6f 75 74 2c 20 22 25 64 2c 25 64 2c 25 73  ->out, "%d,%d,%s
bba0: 5c 6e 22 2c 20 69 45 71 70 49 64 2c 20 70 32 2c  \n", iEqpId, p2,
bbb0: 20 7a 54 65 78 74 29 3b 0a 20 20 7d 0a 20 20 70   zText);.  }.  p
bbc0: 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61  New = sqlite3_ma
bbd0: 6c 6c 6f 63 36 34 28 20 73 69 7a 65 6f 66 28 2a  lloc64( sizeof(*
bbe0: 70 4e 65 77 29 20 2b 20 6e 54 65 78 74 20 29 3b  pNew) + nText );
bbf0: 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29  .  if( pNew==0 )
bc00: 20 73 68 65 6c 6c 5f 6f 75 74 5f 6f 66 5f 6d 65   shell_out_of_me
bc10: 6d 6f 72 79 28 29 3b 0a 20 20 70 4e 65 77 2d 3e  mory();.  pNew->
bc20: 69 45 71 70 49 64 20 3d 20 69 45 71 70 49 64 3b  iEqpId = iEqpId;
bc30: 0a 20 20 70 4e 65 77 2d 3e 69 50 61 72 65 6e 74  .  pNew->iParent
bc40: 49 64 20 3d 20 70 32 3b 0a 20 20 6d 65 6d 63 70  Id = p2;.  memcp
bc50: 79 28 70 4e 65 77 2d 3e 7a 54 65 78 74 2c 20 7a  y(pNew->zText, z
bc60: 54 65 78 74 2c 20 6e 54 65 78 74 2b 31 29 3b 0a  Text, nText+1);.
bc70: 20 20 70 4e 65 77 2d 3e 70 4e 65 78 74 20 3d 20    pNew->pNext = 
bc80: 30 3b 0a 20 20 69 66 28 20 70 2d 3e 73 47 72 61  0;.  if( p->sGra
bc90: 70 68 2e 70 4c 61 73 74 20 29 7b 0a 20 20 20 20  ph.pLast ){.    
bca0: 70 2d 3e 73 47 72 61 70 68 2e 70 4c 61 73 74 2d  p->sGraph.pLast-
bcb0: 3e 70 4e 65 78 74 20 3d 20 70 4e 65 77 3b 0a 20  >pNext = pNew;. 
bcc0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 2d 3e 73   }else{.    p->s
bcd0: 47 72 61 70 68 2e 70 52 6f 77 20 3d 20 70 4e 65  Graph.pRow = pNe
bce0: 77 3b 0a 20 20 7d 0a 20 20 70 2d 3e 73 47 72 61  w;.  }.  p->sGra
bcf0: 70 68 2e 70 4c 61 73 74 20 3d 20 70 4e 65 77 3b  ph.pLast = pNew;
bd00: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61  .}../*.** Free a
bd10: 6e 64 20 72 65 73 65 74 20 74 68 65 20 45 58 50  nd reset the EXP
bd20: 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 20  LAIN QUERY PLAN 
bd30: 64 61 74 61 20 74 68 61 74 20 68 61 73 20 62 65  data that has be
bd40: 65 6e 20 63 6f 6c 6c 65 63 74 65 64 0a 2a 2a 20  en collected.** 
bd50: 69 6e 20 70 2d 3e 73 47 72 61 70 68 2e 0a 2a 2f  in p->sGraph..*/
bd60: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 71 70  .static void eqp
bd70: 5f 72 65 73 65 74 28 53 68 65 6c 6c 53 74 61 74  _reset(ShellStat
bd80: 65 20 2a 70 29 7b 0a 20 20 45 51 50 47 72 61 70  e *p){.  EQPGrap
bd90: 68 52 6f 77 20 2a 70 52 6f 77 2c 20 2a 70 4e 65  hRow *pRow, *pNe
bda0: 78 74 3b 0a 20 20 66 6f 72 28 70 52 6f 77 20 3d  xt;.  for(pRow =
bdb0: 20 70 2d 3e 73 47 72 61 70 68 2e 70 52 6f 77 3b   p->sGraph.pRow;
bdc0: 20 70 52 6f 77 3b 20 70 52 6f 77 20 3d 20 70 4e   pRow; pRow = pN
bdd0: 65 78 74 29 7b 0a 20 20 20 20 70 4e 65 78 74 20  ext){.    pNext 
bde0: 3d 20 70 52 6f 77 2d 3e 70 4e 65 78 74 3b 0a 20  = pRow->pNext;. 
bdf0: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
be00: 70 52 6f 77 29 3b 0a 20 20 7d 0a 20 20 6d 65 6d  pRow);.  }.  mem
be10: 73 65 74 28 26 70 2d 3e 73 47 72 61 70 68 2c 20  set(&p->sGraph, 
be20: 30 2c 20 73 69 7a 65 6f 66 28 70 2d 3e 73 47 72  0, sizeof(p->sGr
be30: 61 70 68 29 29 3b 0a 7d 0a 0a 2f 2a 20 52 65 74  aph));.}../* Ret
be40: 75 72 6e 20 74 68 65 20 6e 65 78 74 20 45 58 50  urn the next EXP
be50: 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 20  LAIN QUERY PLAN 
be60: 6c 69 6e 65 20 77 69 74 68 20 69 45 71 70 49 64  line with iEqpId
be70: 20 74 68 61 74 20 6f 63 63 75 72 73 20 61 66 74   that occurs aft
be80: 65 72 0a 2a 2a 20 70 4f 6c 64 2c 20 6f 72 20 72  er.** pOld, or r
be90: 65 74 75 72 6e 20 74 68 65 20 66 69 72 73 74 20  eturn the first 
bea0: 73 75 63 68 20 6c 69 6e 65 20 69 66 20 70 4f 6c  such line if pOl
beb0: 64 20 69 73 20 4e 55 4c 4c 0a 2a 2f 0a 73 74 61  d is NULL.*/.sta
bec0: 74 69 63 20 45 51 50 47 72 61 70 68 52 6f 77 20  tic EQPGraphRow 
bed0: 2a 65 71 70 5f 6e 65 78 74 5f 72 6f 77 28 53 68  *eqp_next_row(Sh
bee0: 65 6c 6c 53 74 61 74 65 20 2a 70 2c 20 69 6e 74  ellState *p, int
bef0: 20 69 45 71 70 49 64 2c 20 45 51 50 47 72 61 70   iEqpId, EQPGrap
bf00: 68 52 6f 77 20 2a 70 4f 6c 64 29 7b 0a 20 20 45  hRow *pOld){.  E
bf10: 51 50 47 72 61 70 68 52 6f 77 20 2a 70 52 6f 77  QPGraphRow *pRow
bf20: 20 3d 20 70 4f 6c 64 20 3f 20 70 4f 6c 64 2d 3e   = pOld ? pOld->
bf30: 70 4e 65 78 74 20 3a 20 70 2d 3e 73 47 72 61 70  pNext : p->sGrap
bf40: 68 2e 70 52 6f 77 3b 0a 20 20 77 68 69 6c 65 28  h.pRow;.  while(
bf50: 20 70 52 6f 77 20 26 26 20 70 52 6f 77 2d 3e 69   pRow && pRow->i
bf60: 50 61 72 65 6e 74 49 64 21 3d 69 45 71 70 49 64  ParentId!=iEqpId
bf70: 20 29 20 70 52 6f 77 20 3d 20 70 52 6f 77 2d 3e   ) pRow = pRow->
bf80: 70 4e 65 78 74 3b 0a 20 20 72 65 74 75 72 6e 20  pNext;.  return 
bf90: 70 52 6f 77 3b 0a 7d 0a 0a 2f 2a 20 52 65 6e 64  pRow;.}../* Rend
bfa0: 65 72 20 61 20 73 69 6e 67 6c 65 20 6c 65 76 65  er a single leve
bfb0: 6c 20 6f 66 20 74 68 65 20 67 72 61 70 68 20 74  l of the graph t
bfc0: 68 61 74 20 68 61 73 20 69 45 71 70 49 64 20 61  hat has iEqpId a
bfd0: 73 20 69 74 73 20 70 61 72 65 6e 74 2e 20 20 43  s its parent.  C
bfe0: 61 6c 6c 65 64 0a 2a 2a 20 72 65 63 75 72 73 69  alled.** recursi
bff0: 76 65 6c 79 20 74 6f 20 72 65 6e 64 65 72 20 73  vely to render s
c000: 75 62 6c 65 76 65 6c 73 2e 0a 2a 2f 0a 73 74 61  ublevels..*/.sta
c010: 74 69 63 20 76 6f 69 64 20 65 71 70 5f 72 65 6e  tic void eqp_ren
c020: 64 65 72 5f 6c 65 76 65 6c 28 53 68 65 6c 6c 53  der_level(ShellS
c030: 74 61 74 65 20 2a 70 2c 20 69 6e 74 20 69 45 71  tate *p, int iEq
c040: 70 49 64 29 7b 0a 20 20 45 51 50 47 72 61 70 68  pId){.  EQPGraph
c050: 52 6f 77 20 2a 70 52 6f 77 2c 20 2a 70 4e 65 78  Row *pRow, *pNex
c060: 74 3b 0a 20 20 69 6e 74 20 6e 20 3d 20 73 74 72  t;.  int n = str
c070: 6c 65 6e 33 30 28 70 2d 3e 73 47 72 61 70 68 2e  len30(p->sGraph.
c080: 7a 50 72 65 66 69 78 29 3b 0a 20 20 63 68 61 72  zPrefix);.  char
c090: 20 2a 7a 3b 0a 20 20 66 6f 72 28 70 52 6f 77 20   *z;.  for(pRow 
c0a0: 3d 20 65 71 70 5f 6e 65 78 74 5f 72 6f 77 28 70  = eqp_next_row(p
c0b0: 2c 20 69 45 71 70 49 64 2c 20 30 29 3b 20 70 52  , iEqpId, 0); pR
c0c0: 6f 77 3b 20 70 52 6f 77 20 3d 20 70 4e 65 78 74  ow; pRow = pNext
c0d0: 29 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 65  ){.    pNext = e
c0e0: 71 70 5f 6e 65 78 74 5f 72 6f 77 28 70 2c 20 69  qp_next_row(p, i
c0f0: 45 71 70 49 64 2c 20 70 52 6f 77 29 3b 0a 20 20  EqpId, pRow);.  
c100: 20 20 7a 20 3d 20 70 52 6f 77 2d 3e 7a 54 65 78    z = pRow->zTex
c110: 74 3b 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e  t;.    utf8_prin
c120: 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 25 73  tf(p->out, "%s%s
c130: 25 73 5c 6e 22 2c 20 70 2d 3e 73 47 72 61 70 68  %s\n", p->sGraph
c140: 2e 7a 50 72 65 66 69 78 2c 20 70 4e 65 78 74 20  .zPrefix, pNext 
c150: 3f 20 22 7c 2d 2d 22 20 3a 20 22 60 2d 2d 22 2c  ? "|--" : "`--",
c160: 20 7a 29 3b 0a 20 20 20 20 69 66 28 20 6e 3c 28   z);.    if( n<(
c170: 69 6e 74 29 73 69 7a 65 6f 66 28 70 2d 3e 73 47  int)sizeof(p->sG
c180: 72 61 70 68 2e 7a 50 72 65 66 69 78 29 2d 37 20  raph.zPrefix)-7 
c190: 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  ){.      memcpy(
c1a0: 26 70 2d 3e 73 47 72 61 70 68 2e 7a 50 72 65 66  &p->sGraph.zPref
c1b0: 69 78 5b 6e 5d 2c 20 70 4e 65 78 74 20 3f 20 22  ix[n], pNext ? "
c1c0: 7c 20 20 22 20 3a 20 22 20 20 20 22 2c 20 34 29  |  " : "   ", 4)
c1d0: 3b 0a 20 20 20 20 20 20 65 71 70 5f 72 65 6e 64  ;.      eqp_rend
c1e0: 65 72 5f 6c 65 76 65 6c 28 70 2c 20 70 52 6f 77  er_level(p, pRow
c1f0: 2d 3e 69 45 71 70 49 64 29 3b 0a 20 20 20 20 20  ->iEqpId);.     
c200: 20 70 2d 3e 73 47 72 61 70 68 2e 7a 50 72 65 66   p->sGraph.zPref
c210: 69 78 5b 6e 5d 20 3d 20 30 3b 0a 20 20 20 20 7d  ix[n] = 0;.    }
c220: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69  .  }.}../*.** Di
c230: 73 70 6c 61 79 20 61 6e 64 20 72 65 73 65 74 20  splay and reset 
c240: 74 68 65 20 45 58 50 4c 41 49 4e 20 51 55 45 52  the EXPLAIN QUER
c250: 59 20 50 4c 41 4e 20 64 61 74 61 0a 2a 2f 0a 73  Y PLAN data.*/.s
c260: 74 61 74 69 63 20 76 6f 69 64 20 65 71 70 5f 72  tatic void eqp_r
c270: 65 6e 64 65 72 28 53 68 65 6c 6c 53 74 61 74 65  ender(ShellState
c280: 20 2a 70 29 7b 0a 20 20 45 51 50 47 72 61 70 68   *p){.  EQPGraph
c290: 52 6f 77 20 2a 70 52 6f 77 20 3d 20 70 2d 3e 73  Row *pRow = p->s
c2a0: 47 72 61 70 68 2e 70 52 6f 77 3b 0a 20 20 69 66  Graph.pRow;.  if
c2b0: 28 20 70 52 6f 77 20 29 7b 0a 20 20 20 20 69 66  ( pRow ){.    if
c2c0: 28 20 70 52 6f 77 2d 3e 7a 54 65 78 74 5b 30 5d  ( pRow->zText[0]
c2d0: 3d 3d 27 2d 27 20 29 7b 0a 20 20 20 20 20 20 69  =='-' ){.      i
c2e0: 66 28 20 70 52 6f 77 2d 3e 70 4e 65 78 74 3d 3d  f( pRow->pNext==
c2f0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 65 71 70  0 ){.        eqp
c300: 5f 72 65 73 65 74 28 70 29 3b 0a 20 20 20 20 20  _reset(p);.     
c310: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20     return;.     
c320: 20 7d 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72   }.      utf8_pr
c330: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73  intf(p->out, "%s
c340: 5c 6e 22 2c 20 70 52 6f 77 2d 3e 7a 54 65 78 74  \n", pRow->zText
c350: 2b 33 29 3b 0a 20 20 20 20 20 20 70 2d 3e 73 47  +3);.      p->sG
c360: 72 61 70 68 2e 70 52 6f 77 20 3d 20 70 52 6f 77  raph.pRow = pRow
c370: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 73  ->pNext;.      s
c380: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 52 6f 77  qlite3_free(pRow
c390: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
c3a0: 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
c3b0: 70 2d 3e 6f 75 74 2c 20 22 51 55 45 52 59 20 50  p->out, "QUERY P
c3c0: 4c 41 4e 5c 6e 22 29 3b 0a 20 20 20 20 7d 0a 20  LAN\n");.    }. 
c3d0: 20 20 20 70 2d 3e 73 47 72 61 70 68 2e 7a 50 72     p->sGraph.zPr
c3e0: 65 66 69 78 5b 30 5d 20 3d 20 30 3b 0a 20 20 20  efix[0] = 0;.   
c3f0: 20 65 71 70 5f 72 65 6e 64 65 72 5f 6c 65 76 65   eqp_render_leve
c400: 6c 28 70 2c 20 30 29 3b 0a 20 20 20 20 65 71 70  l(p, 0);.    eqp
c410: 5f 72 65 73 65 74 28 70 29 3b 0a 20 20 7d 0a 7d  _reset(p);.  }.}
c420: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ../*.** This is 
c430: 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 72 6f 75  the callback rou
c440: 74 69 6e 65 20 74 68 61 74 20 74 68 65 20 73 68  tine that the sh
c450: 65 6c 6c 0a 2a 2a 20 69 6e 76 6f 6b 65 73 20 66  ell.** invokes f
c460: 6f 72 20 65 61 63 68 20 72 6f 77 20 6f 66 20 61  or each row of a
c470: 20 71 75 65 72 79 20 72 65 73 75 6c 74 2e 0a 2a   query result..*
c480: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 68 65  /.static int she
c490: 6c 6c 5f 63 61 6c 6c 62 61 63 6b 28 0a 20 20 76  ll_callback(.  v
c4a0: 6f 69 64 20 2a 70 41 72 67 2c 0a 20 20 69 6e 74  oid *pArg,.  int
c4b0: 20 6e 41 72 67 2c 20 20 20 20 20 20 20 20 2f 2a   nArg,        /*
c4c0: 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 73 75 6c   Number of resul
c4d0: 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 63  t columns */.  c
c4e0: 68 61 72 20 2a 2a 61 7a 41 72 67 2c 20 20 20 20  har **azArg,    
c4f0: 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68 20  /* Text of each 
c500: 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 20 2a 2f  result column */
c510: 0a 20 20 63 68 61 72 20 2a 2a 61 7a 43 6f 6c 2c  .  char **azCol,
c520: 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 61      /* Column na
c530: 6d 65 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 69  mes */.  int *ai
c540: 54 79 70 65 20 20 20 20 20 20 2f 2a 20 43 6f 6c  Type      /* Col
c550: 75 6d 6e 20 74 79 70 65 73 20 2a 2f 0a 29 7b 0a  umn types */.){.
c560: 20 20 69 6e 74 20 69 3b 0a 20 20 53 68 65 6c 6c    int i;.  Shell
c570: 53 74 61 74 65 20 2a 70 20 3d 20 28 53 68 65 6c  State *p = (Shel
c580: 6c 53 74 61 74 65 2a 29 70 41 72 67 3b 0a 0a 20  lState*)pArg;.. 
c590: 20 69 66 28 20 61 7a 41 72 67 3d 3d 30 20 29 20   if( azArg==0 ) 
c5a0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 73 77 69 74  return 0;.  swit
c5b0: 63 68 28 20 70 2d 3e 63 4d 6f 64 65 20 29 7b 0a  ch( p->cMode ){.
c5c0: 20 20 20 20 63 61 73 65 20 4d 4f 44 45 5f 4c 69      case MODE_Li
c5d0: 6e 65 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  ne: {.      int 
c5e0: 77 20 3d 20 35 3b 0a 20 20 20 20 20 20 69 66 28  w = 5;.      if(
c5f0: 20 61 7a 41 72 67 3d 3d 30 20 29 20 62 72 65 61   azArg==0 ) brea
c600: 6b 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  k;.      for(i=0
c610: 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a  ; i<nArg; i++){.
c620: 20 20 20 20 20 20 20 20 69 6e 74 20 6c 65 6e 20          int len 
c630: 3d 20 73 74 72 6c 65 6e 33 30 28 61 7a 43 6f 6c  = strlen30(azCol
c640: 5b 69 5d 20 3f 20 61 7a 43 6f 6c 5b 69 5d 20 3a  [i] ? azCol[i] :
c650: 20 22 22 29 3b 0a 20 20 20 20 20 20 20 20 69 66   "");.        if
c660: 28 20 6c 65 6e 3e 77 20 29 20 77 20 3d 20 6c 65  ( len>w ) w = le
c670: 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  n;.      }.     
c680: 20 69 66 28 20 70 2d 3e 63 6e 74 2b 2b 3e 30 20   if( p->cnt++>0 
c690: 29 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d  ) utf8_printf(p-
c6a0: 3e 6f 75 74 2c 20 22 25 73 22 2c 20 70 2d 3e 72  >out, "%s", p->r
c6b0: 6f 77 53 65 70 61 72 61 74 6f 72 29 3b 0a 20 20  owSeparator);.  
c6c0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
c6d0: 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Arg; i++){.     
c6e0: 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70     utf8_printf(p
c6f0: 2d 3e 6f 75 74 2c 22 25 2a 73 20 3d 20 25 73 25  ->out,"%*s = %s%
c700: 73 22 2c 20 77 2c 20 61 7a 43 6f 6c 5b 69 5d 2c  s", w, azCol[i],
c710: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
c720: 20 61 7a 41 72 67 5b 69 5d 20 3f 20 61 7a 41 72   azArg[i] ? azAr
c730: 67 5b 69 5d 20 3a 20 70 2d 3e 6e 75 6c 6c 56 61  g[i] : p->nullVa
c740: 6c 75 65 2c 20 70 2d 3e 72 6f 77 53 65 70 61 72  lue, p->rowSepar
c750: 61 74 6f 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ator);.      }. 
c760: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
c770: 7d 0a 20 20 20 20 63 61 73 65 20 4d 4f 44 45 5f  }.    case MODE_
c780: 45 78 70 6c 61 69 6e 3a 0a 20 20 20 20 63 61 73  Explain:.    cas
c790: 65 20 4d 4f 44 45 5f 43 6f 6c 75 6d 6e 3a 20 7b  e MODE_Column: {
c7a0: 0a 20 20 20 20 20 20 73 74 61 74 69 63 20 63 6f  .      static co
c7b0: 6e 73 74 20 69 6e 74 20 61 45 78 70 6c 61 69 6e  nst int aExplain
c7c0: 57 69 64 74 68 73 5b 5d 20 3d 20 7b 34 2c 20 31  Widths[] = {4, 1
c7d0: 33 2c 20 34 2c 20 34 2c 20 34 2c 20 31 33 2c 20  3, 4, 4, 4, 13, 
c7e0: 32 2c 20 31 33 7d 3b 0a 20 20 20 20 20 20 63 6f  2, 13};.      co
c7f0: 6e 73 74 20 69 6e 74 20 2a 63 6f 6c 57 69 64 74  nst int *colWidt
c800: 68 3b 0a 20 20 20 20 20 20 69 6e 74 20 73 68 6f  h;.      int sho
c810: 77 48 64 72 3b 0a 20 20 20 20 20 20 63 68 61 72  wHdr;.      char
c820: 20 2a 72 6f 77 53 65 70 3b 0a 20 20 20 20 20 20   *rowSep;.      
c830: 69 66 28 20 70 2d 3e 63 4d 6f 64 65 3d 3d 4d 4f  if( p->cMode==MO
c840: 44 45 5f 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20  DE_Column ){.   
c850: 20 20 20 20 20 63 6f 6c 57 69 64 74 68 20 3d 20       colWidth = 
c860: 70 2d 3e 63 6f 6c 57 69 64 74 68 3b 0a 20 20 20  p->colWidth;.   
c870: 20 20 20 20 20 73 68 6f 77 48 64 72 20 3d 20 70       showHdr = p
c880: 2d 3e 73 68 6f 77 48 65 61 64 65 72 3b 0a 20 20  ->showHeader;.  
c890: 20 20 20 20 20 20 72 6f 77 53 65 70 20 3d 20 70        rowSep = p
c8a0: 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 3b 0a  ->rowSeparator;.
c8b0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
c8c0: 20 20 20 20 20 63 6f 6c 57 69 64 74 68 20 3d 20       colWidth = 
c8d0: 61 45 78 70 6c 61 69 6e 57 69 64 74 68 73 3b 0a  aExplainWidths;.
c8e0: 20 20 20 20 20 20 20 20 73 68 6f 77 48 64 72 20          showHdr 
c8f0: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 72 6f 77  = 1;.        row
c900: 53 65 70 20 3d 20 53 45 50 5f 52 6f 77 3b 0a 20  Sep = SEP_Row;. 
c910: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
c920: 20 70 2d 3e 63 6e 74 2b 2b 3d 3d 30 20 29 7b 0a   p->cnt++==0 ){.
c930: 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
c940: 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20   i<nArg; i++){. 
c950: 20 20 20 20 20 20 20 20 20 69 6e 74 20 77 2c 20           int w, 
c960: 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  n;.          if(
c970: 20 69 3c 41 72 72 61 79 53 69 7a 65 28 70 2d 3e   i<ArraySize(p->
c980: 63 6f 6c 57 69 64 74 68 29 20 29 7b 0a 20 20 20  colWidth) ){.   
c990: 20 20 20 20 20 20 20 20 20 77 20 3d 20 63 6f 6c           w = col
c9a0: 57 69 64 74 68 5b 69 5d 3b 0a 20 20 20 20 20 20  Width[i];.      
c9b0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
c9c0: 20 20 20 20 20 20 20 77 20 3d 20 30 3b 0a 20 20         w = 0;.  
c9d0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
c9e0: 20 20 20 20 69 66 28 20 77 3d 3d 30 20 29 7b 0a      if( w==0 ){.
c9f0: 20 20 20 20 20 20 20 20 20 20 20 20 77 20 3d 20              w = 
ca00: 73 74 72 6c 65 6e 43 68 61 72 28 61 7a 43 6f 6c  strlenChar(azCol
ca10: 5b 69 5d 20 3f 20 61 7a 43 6f 6c 5b 69 5d 20 3a  [i] ? azCol[i] :
ca20: 20 22 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20   "");.          
ca30: 20 20 69 66 28 20 77 3c 31 30 20 29 20 77 20 3d    if( w<10 ) w =
ca40: 20 31 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20   10;.           
ca50: 20 6e 20 3d 20 73 74 72 6c 65 6e 43 68 61 72 28   n = strlenChar(
ca60: 61 7a 41 72 67 20 26 26 20 61 7a 41 72 67 5b 69  azArg && azArg[i
ca70: 5d 20 3f 20 61 7a 41 72 67 5b 69 5d 20 3a 20 70  ] ? azArg[i] : p
ca80: 2d 3e 6e 75 6c 6c 56 61 6c 75 65 29 3b 0a 20 20  ->nullValue);.  
ca90: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 77 3c            if( w<
caa0: 6e 20 29 20 77 20 3d 20 6e 3b 0a 20 20 20 20 20  n ) w = n;.     
cab0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
cac0: 20 69 66 28 20 69 3c 41 72 72 61 79 53 69 7a 65   if( i<ArraySize
cad0: 28 70 2d 3e 61 63 74 75 61 6c 57 69 64 74 68 29  (p->actualWidth)
cae0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
caf0: 70 2d 3e 61 63 74 75 61 6c 57 69 64 74 68 5b 69  p->actualWidth[i
cb00: 5d 20 3d 20 77 3b 0a 20 20 20 20 20 20 20 20 20  ] = w;.         
cb10: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28   }.          if(
cb20: 20 73 68 6f 77 48 64 72 20 29 7b 0a 20 20 20 20   showHdr ){.    
cb30: 20 20 20 20 20 20 20 20 75 74 66 38 5f 77 69 64          utf8_wid
cb40: 74 68 5f 70 72 69 6e 74 28 70 2d 3e 6f 75 74 2c  th_print(p->out,
cb50: 20 77 2c 20 61 7a 43 6f 6c 5b 69 5d 29 3b 0a 20   w, azCol[i]);. 
cb60: 20 20 20 20 20 20 20 20 20 20 20 75 74 66 38 5f             utf8_
cb70: 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
cb80: 25 73 22 2c 20 69 3d 3d 6e 41 72 67 2d 31 20 3f  %s", i==nArg-1 ?
cb90: 20 72 6f 77 53 65 70 20 3a 20 22 20 20 22 29 3b   rowSep : "  ");
cba0: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
cbb0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
cbc0: 66 28 20 73 68 6f 77 48 64 72 20 29 7b 0a 20 20  f( showHdr ){.  
cbd0: 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
cbe0: 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20   i<nArg; i++){. 
cbf0: 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 77             int w
cc00: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
cc10: 28 20 69 3c 41 72 72 61 79 53 69 7a 65 28 70 2d  ( i<ArraySize(p-
cc20: 3e 61 63 74 75 61 6c 57 69 64 74 68 29 20 29 7b  >actualWidth) ){
cc30: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
cc40: 77 20 3d 20 70 2d 3e 61 63 74 75 61 6c 57 69 64  w = p->actualWid
cc50: 74 68 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 20  th[i];.         
cc60: 20 20 20 20 20 20 69 66 28 20 77 3c 30 20 29 20        if( w<0 ) 
cc70: 77 20 3d 20 2d 77 3b 0a 20 20 20 20 20 20 20 20  w = -w;.        
cc80: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
cc90: 20 20 20 20 20 20 20 20 20 20 77 20 3d 20 31 30            w = 10
cca0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
ccb0: 20 20 20 20 20 20 20 20 20 20 20 20 75 74 66 38              utf8
ccc0: 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22  _printf(p->out,"
ccd0: 25 2d 2a 2e 2a 73 25 73 22 2c 77 2c 77 2c 0a 20  %-*.*s%s",w,w,. 
cce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ccf0: 20 20 22 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d    "-------------
cd00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cd10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cd20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 22 0a 20  -------------". 
cd30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cd40: 20 20 22 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d    "-------------
cd50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cd60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cd70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 22 2c 0a  -------------",.
cd80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cd90: 20 20 20 20 69 3d 3d 6e 41 72 67 2d 31 20 3f 20      i==nArg-1 ? 
cda0: 72 6f 77 53 65 70 20 3a 20 22 20 20 22 29 3b 0a  rowSep : "  ");.
cdb0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
cdc0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
cdd0: 20 20 20 20 69 66 28 20 61 7a 41 72 67 3d 3d 30      if( azArg==0
cde0: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
cdf0: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b  for(i=0; i<nArg;
ce00: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   i++){.        i
ce10: 6e 74 20 77 3b 0a 20 20 20 20 20 20 20 20 69 66  nt w;.        if
ce20: 28 20 69 3c 41 72 72 61 79 53 69 7a 65 28 70 2d  ( i<ArraySize(p-
ce30: 3e 61 63 74 75 61 6c 57 69 64 74 68 29 20 29 7b  >actualWidth) ){
ce40: 0a 20 20 20 20 20 20 20 20 20 20 20 77 20 3d 20  .           w = 
ce50: 70 2d 3e 61 63 74 75 61 6c 57 69 64 74 68 5b 69  p->actualWidth[i
ce60: 5d 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  ];.        }else
ce70: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 77 20 3d  {.           w =
ce80: 20 31 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   10;.        }. 
ce90: 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 63 4d         if( p->cM
cea0: 6f 64 65 3d 3d 4d 4f 44 45 5f 45 78 70 6c 61 69  ode==MODE_Explai
ceb0: 6e 20 26 26 20 61 7a 41 72 67 5b 69 5d 20 26 26  n && azArg[i] &&
cec0: 20 73 74 72 6c 65 6e 43 68 61 72 28 61 7a 41 72   strlenChar(azAr
ced0: 67 5b 69 5d 29 3e 77 20 29 7b 0a 20 20 20 20 20  g[i])>w ){.     
cee0: 20 20 20 20 20 77 20 3d 20 73 74 72 6c 65 6e 43       w = strlenC
cef0: 68 61 72 28 61 7a 41 72 67 5b 69 5d 29 3b 0a 20  har(azArg[i]);. 
cf00: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
cf10: 20 69 66 28 20 69 3d 3d 31 20 26 26 20 70 2d 3e   if( i==1 && p->
cf20: 61 69 49 6e 64 65 6e 74 20 26 26 20 70 2d 3e 70  aiIndent && p->p
cf30: 53 74 6d 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Stmt ){.        
cf40: 20 20 69 66 28 20 70 2d 3e 69 49 6e 64 65 6e 74    if( p->iIndent
cf50: 3c 70 2d 3e 6e 49 6e 64 65 6e 74 20 29 7b 0a 20  <p->nIndent ){. 
cf60: 20 20 20 20 20 20 20 20 20 20 20 75 74 66 38 5f             utf8_
cf70: 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
cf80: 25 2a 2e 73 22 2c 20 70 2d 3e 61 69 49 6e 64 65  %*.s", p->aiInde
cf90: 6e 74 5b 70 2d 3e 69 49 6e 64 65 6e 74 5d 2c 20  nt[p->iIndent], 
cfa0: 22 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  "");.          }
cfb0: 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 69 49  .          p->iI
cfc0: 6e 64 65 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20  ndent++;.       
cfd0: 20 7d 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f   }.        utf8_
cfe0: 77 69 64 74 68 5f 70 72 69 6e 74 28 70 2d 3e 6f  width_print(p->o
cff0: 75 74 2c 20 77 2c 20 61 7a 41 72 67 5b 69 5d 20  ut, w, azArg[i] 
d000: 3f 20 61 7a 41 72 67 5b 69 5d 20 3a 20 70 2d 3e  ? azArg[i] : p->
d010: 6e 75 6c 6c 56 61 6c 75 65 29 3b 0a 20 20 20 20  nullValue);.    
d020: 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
d030: 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20 69 3d  p->out, "%s", i=
d040: 3d 6e 41 72 67 2d 31 20 3f 20 72 6f 77 53 65 70  =nArg-1 ? rowSep
d050: 20 3a 20 22 20 20 22 29 3b 0a 20 20 20 20 20 20   : "  ");.      
d060: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
d070: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 4d 4f     }.    case MO
d080: 44 45 5f 53 65 6d 69 3a 20 7b 20 20 20 2f 2a 20  DE_Semi: {   /* 
d090: 2e 73 63 68 65 6d 61 20 61 6e 64 20 2e 66 75 6c  .schema and .ful
d0a0: 6c 73 63 68 65 6d 61 20 6f 75 74 70 75 74 20 2a  lschema output *
d0b0: 2f 0a 20 20 20 20 20 20 70 72 69 6e 74 53 63 68  /.      printSch
d0c0: 65 6d 61 4c 69 6e 65 28 70 2d 3e 6f 75 74 2c 20  emaLine(p->out, 
d0d0: 61 7a 41 72 67 5b 30 5d 2c 20 22 3b 5c 6e 22 29  azArg[0], ";\n")
d0e0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
d0f0: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 4d 4f     }.    case MO
d100: 44 45 5f 50 72 65 74 74 79 3a 20 7b 20 20 2f 2a  DE_Pretty: {  /*
d110: 20 2e 73 63 68 65 6d 61 20 61 6e 64 20 2e 66 75   .schema and .fu
d120: 6c 6c 73 63 68 65 6d 61 20 77 69 74 68 20 2d 2d  llschema with --
d130: 69 6e 64 65 6e 74 20 2a 2f 0a 20 20 20 20 20 20  indent */.      
d140: 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20 20 20 69  char *z;.      i
d150: 6e 74 20 6a 3b 0a 20 20 20 20 20 20 69 6e 74 20  nt j;.      int 
d160: 6e 50 61 72 65 6e 20 3d 20 30 3b 0a 20 20 20 20  nParen = 0;.    
d170: 20 20 63 68 61 72 20 63 45 6e 64 20 3d 20 30 3b    char cEnd = 0;
d180: 0a 20 20 20 20 20 20 63 68 61 72 20 63 3b 0a 20  .      char c;. 
d190: 20 20 20 20 20 69 6e 74 20 6e 4c 69 6e 65 20 3d       int nLine =
d1a0: 20 30 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   0;.      assert
d1b0: 28 20 6e 41 72 67 3d 3d 31 20 29 3b 0a 20 20 20  ( nArg==1 );.   
d1c0: 20 20 20 69 66 28 20 61 7a 41 72 67 5b 30 5d 3d     if( azArg[0]=
d1d0: 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
d1e0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74    if( sqlite3_st
d1f0: 72 6c 69 6b 65 28 22 43 52 45 41 54 45 20 56 49  rlike("CREATE VI
d200: 45 57 25 22 2c 20 61 7a 41 72 67 5b 30 5d 2c 20  EW%", azArg[0], 
d210: 30 29 3d 3d 30 0a 20 20 20 20 20 20 20 7c 7c 20  0)==0.       || 
d220: 73 71 6c 69 74 65 33 5f 73 74 72 6c 69 6b 65 28  sqlite3_strlike(
d230: 22 43 52 45 41 54 45 20 54 52 49 47 25 22 2c 20  "CREATE TRIG%", 
d240: 61 7a 41 72 67 5b 30 5d 2c 20 30 29 3d 3d 30 0a  azArg[0], 0)==0.
d250: 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
d260: 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e   utf8_printf(p->
d270: 6f 75 74 2c 20 22 25 73 3b 5c 6e 22 2c 20 61 7a  out, "%s;\n", az
d280: 41 72 67 5b 30 5d 29 3b 0a 20 20 20 20 20 20 20  Arg[0]);.       
d290: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
d2a0: 20 20 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65        z = sqlite
d2b0: 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 22 2c 20  3_mprintf("%s", 
d2c0: 61 7a 41 72 67 5b 30 5d 29 3b 0a 20 20 20 20 20  azArg[0]);.     
d2d0: 20 6a 20 3d 20 30 3b 0a 20 20 20 20 20 20 66 6f   j = 0;.      fo
d2e0: 72 28 69 3d 30 3b 20 49 73 53 70 61 63 65 28 7a  r(i=0; IsSpace(z
d2f0: 5b 69 5d 29 3b 20 69 2b 2b 29 7b 7d 0a 20 20 20  [i]); i++){}.   
d300: 20 20 20 66 6f 72 28 3b 20 28 63 20 3d 20 7a 5b     for(; (c = z[
d310: 69 5d 29 21 3d 30 3b 20 69 2b 2b 29 7b 0a 20 20  i])!=0; i++){.  
d320: 20 20 20 20 20 20 69 66 28 20 49 73 53 70 61 63        if( IsSpac
d330: 65 28 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20  e(c) ){.        
d340: 20 20 69 66 28 20 7a 5b 6a 2d 31 5d 3d 3d 27 5c    if( z[j-1]=='\
d350: 72 27 20 29 20 7a 5b 6a 2d 31 5d 20 3d 20 27 5c  r' ) z[j-1] = '\
d360: 6e 27 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  n';.          if
d370: 28 20 49 73 53 70 61 63 65 28 7a 5b 6a 2d 31 5d  ( IsSpace(z[j-1]
d380: 29 20 7c 7c 20 7a 5b 6a 2d 31 5d 3d 3d 27 28 27  ) || z[j-1]=='('
d390: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
d3a0: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28       }else if( (
d3b0: 63 3d 3d 27 28 27 20 7c 7c 20 63 3d 3d 27 29 27  c=='(' || c==')'
d3c0: 29 20 26 26 20 6a 3e 30 20 26 26 20 49 73 53 70  ) && j>0 && IsSp
d3d0: 61 63 65 28 7a 5b 6a 2d 31 5d 29 20 29 7b 0a 20  ace(z[j-1]) ){. 
d3e0: 20 20 20 20 20 20 20 20 20 6a 2d 2d 3b 0a 20 20           j--;.  
d3f0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
d400: 7a 5b 6a 2b 2b 5d 20 3d 20 63 3b 0a 20 20 20 20  z[j++] = c;.    
d410: 20 20 7d 0a 20 20 20 20 20 20 77 68 69 6c 65 28    }.      while(
d420: 20 6a 3e 30 20 26 26 20 49 73 53 70 61 63 65 28   j>0 && IsSpace(
d430: 7a 5b 6a 2d 31 5d 29 20 29 7b 20 6a 2d 2d 3b 20  z[j-1]) ){ j--; 
d440: 7d 0a 20 20 20 20 20 20 7a 5b 6a 5d 20 3d 20 30  }.      z[j] = 0
d450: 3b 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 6c  ;.      if( strl
d460: 65 6e 33 30 28 7a 29 3e 3d 37 39 20 29 7b 0a 20  en30(z)>=79 ){. 
d470: 20 20 20 20 20 20 20 66 6f 72 28 69 3d 6a 3d 30         for(i=j=0
d480: 3b 20 28 63 20 3d 20 7a 5b 69 5d 29 21 3d 30 3b  ; (c = z[i])!=0;
d490: 20 69 2b 2b 29 7b 20 20 2f 2a 20 43 6f 70 79 20   i++){  /* Copy 
d4a0: 63 68 61 6e 67 65 73 20 66 72 6f 6d 20 7a 5b 69  changes from z[i
d4b0: 5d 20 62 61 63 6b 20 74 6f 20 7a 5b 6a 5d 20 2a  ] back to z[j] *
d4c0: 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  /.          if( 
d4d0: 63 3d 3d 63 45 6e 64 20 29 7b 0a 20 20 20 20 20  c==cEnd ){.     
d4e0: 20 20 20 20 20 20 20 63 45 6e 64 20 3d 20 30 3b         cEnd = 0;
d4f0: 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
d500: 20 69 66 28 20 63 3d 3d 27 22 27 20 7c 7c 20 63   if( c=='"' || c
d510: 3d 3d 27 5c 27 27 20 7c 7c 20 63 3d 3d 27 60 27  =='\'' || c=='`'
d520: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
d530: 63 45 6e 64 20 3d 20 63 3b 0a 20 20 20 20 20 20  cEnd = c;.      
d540: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d      }else if( c=
d550: 3d 27 5b 27 20 29 7b 0a 20 20 20 20 20 20 20 20  ='[' ){.        
d560: 20 20 20 20 63 45 6e 64 20 3d 20 27 5d 27 3b 0a      cEnd = ']';.
d570: 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20            }else 
d580: 69 66 28 20 63 3d 3d 27 2d 27 20 26 26 20 7a 5b  if( c=='-' && z[
d590: 69 2b 31 5d 3d 3d 27 2d 27 20 29 7b 0a 20 20 20  i+1]=='-' ){.   
d5a0: 20 20 20 20 20 20 20 20 20 63 45 6e 64 20 3d 20           cEnd = 
d5b0: 27 5c 6e 27 3b 0a 20 20 20 20 20 20 20 20 20 20  '\n';.          
d5c0: 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 28 27  }else if( c=='('
d5d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
d5e0: 6e 50 61 72 65 6e 2b 2b 3b 0a 20 20 20 20 20 20  nParen++;.      
d5f0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d      }else if( c=
d600: 3d 27 29 27 20 29 7b 0a 20 20 20 20 20 20 20 20  =')' ){.        
d610: 20 20 20 20 6e 50 61 72 65 6e 2d 2d 3b 0a 20 20      nParen--;.  
d620: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6e 4c            if( nL
d630: 69 6e 65 3e 30 20 26 26 20 6e 50 61 72 65 6e 3d  ine>0 && nParen=
d640: 3d 30 20 26 26 20 6a 3e 30 20 29 7b 0a 20 20 20  =0 && j>0 ){.   
d650: 20 20 20 20 20 20 20 20 20 20 20 70 72 69 6e 74             print
d660: 53 63 68 65 6d 61 4c 69 6e 65 4e 28 70 2d 3e 6f  SchemaLineN(p->o
d670: 75 74 2c 20 7a 2c 20 6a 2c 20 22 5c 6e 22 29 3b  ut, z, j, "\n");
d680: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6a  .              j
d690: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
d6a0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a    }.          }.
d6b0: 20 20 20 20 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d            z[j++]
d6c0: 20 3d 20 63 3b 0a 20 20 20 20 20 20 20 20 20 20   = c;.          
d6d0: 69 66 28 20 6e 50 61 72 65 6e 3d 3d 31 20 26 26  if( nParen==1 &&
d6e0: 20 63 45 6e 64 3d 3d 30 0a 20 20 20 20 20 20 20   cEnd==0.       
d6f0: 20 20 20 20 26 26 20 28 63 3d 3d 27 28 27 20 7c      && (c=='(' |
d700: 7c 20 63 3d 3d 27 5c 6e 27 20 7c 7c 20 28 63 3d  | c=='\n' || (c=
d710: 3d 27 2c 27 20 26 26 20 21 77 73 54 6f 45 6f 6c  =',' && !wsToEol
d720: 28 7a 2b 69 2b 31 29 29 29 0a 20 20 20 20 20 20  (z+i+1))).      
d730: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
d740: 20 20 20 69 66 28 20 63 3d 3d 27 5c 6e 27 20 29     if( c=='\n' )
d750: 20 6a 2d 2d 3b 0a 20 20 20 20 20 20 20 20 20 20   j--;.          
d760: 20 20 70 72 69 6e 74 53 63 68 65 6d 61 4c 69 6e    printSchemaLin
d770: 65 4e 28 70 2d 3e 6f 75 74 2c 20 7a 2c 20 6a 2c  eN(p->out, z, j,
d780: 20 22 5c 6e 20 20 22 29 3b 0a 20 20 20 20 20 20   "\n  ");.      
d790: 20 20 20 20 20 20 6a 20 3d 20 30 3b 0a 20 20 20        j = 0;.   
d7a0: 20 20 20 20 20 20 20 20 20 6e 4c 69 6e 65 2b 2b           nLine++
d7b0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 77 68  ;.            wh
d7c0: 69 6c 65 28 20 49 73 53 70 61 63 65 28 7a 5b 69  ile( IsSpace(z[i
d7d0: 2b 31 5d 29 20 29 7b 20 69 2b 2b 3b 20 7d 0a 20  +1]) ){ i++; }. 
d7e0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
d7f0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7a 5b 6a     }.        z[j
d800: 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  ] = 0;.      }. 
d810: 20 20 20 20 20 70 72 69 6e 74 53 63 68 65 6d 61       printSchema
d820: 4c 69 6e 65 28 70 2d 3e 6f 75 74 2c 20 7a 2c 20  Line(p->out, z, 
d830: 22 3b 5c 6e 22 29 3b 0a 20 20 20 20 20 20 73 71  ";\n");.      sq
d840: 6c 69 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20  lite3_free(z);. 
d850: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
d860: 7d 0a 20 20 20 20 63 61 73 65 20 4d 4f 44 45 5f  }.    case MODE_
d870: 4c 69 73 74 3a 20 7b 0a 20 20 20 20 20 20 69 66  List: {.      if
d880: 28 20 70 2d 3e 63 6e 74 2b 2b 3d 3d 30 20 26 26  ( p->cnt++==0 &&
d890: 20 70 2d 3e 73 68 6f 77 48 65 61 64 65 72 20 29   p->showHeader )
d8a0: 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  {.        for(i=
d8b0: 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b  0; i<nArg; i++){
d8c0: 0a 20 20 20 20 20 20 20 20 20 20 75 74 66 38 5f  .          utf8_
d8d0: 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 25  printf(p->out,"%
d8e0: 73 25 73 22 2c 61 7a 43 6f 6c 5b 69 5d 2c 0a 20  s%s",azCol[i],. 
d8f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d900: 20 69 3d 3d 6e 41 72 67 2d 31 20 3f 20 70 2d 3e   i==nArg-1 ? p->
d910: 72 6f 77 53 65 70 61 72 61 74 6f 72 20 3a 20 70  rowSeparator : p
d920: 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 29 3b  ->colSeparator);
d930: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
d940: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 61 7a 41   }.      if( azA
d950: 72 67 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  rg==0 ) break;. 
d960: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
d970: 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nArg; i++){.    
d980: 20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20 61 7a      char *z = az
d990: 41 72 67 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20  Arg[i];.        
d9a0: 69 66 28 20 7a 3d 3d 30 20 29 20 7a 20 3d 20 70  if( z==0 ) z = p
d9b0: 2d 3e 6e 75 6c 6c 56 61 6c 75 65 3b 0a 20 20 20  ->nullValue;.   
d9c0: 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
d9d0: 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20 7a  (p->out, "%s", z
d9e0: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  );.        if( i
d9f0: 3c 6e 41 72 67 2d 31 20 29 7b 0a 20 20 20 20 20  <nArg-1 ){.     
da00: 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
da10: 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20 70  (p->out, "%s", p
da20: 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 29 3b  ->colSeparator);
da30: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
da40: 20 20 20 20 20 20 20 20 20 20 75 74 66 38 5f 70            utf8_p
da50: 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25  rintf(p->out, "%
da60: 73 22 2c 20 70 2d 3e 72 6f 77 53 65 70 61 72 61  s", p->rowSepara
da70: 74 6f 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  tor);.        }.
da80: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
da90: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
daa0: 61 73 65 20 4d 4f 44 45 5f 48 74 6d 6c 3a 20 7b  ase MODE_Html: {
dab0: 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 63 6e  .      if( p->cn
dac0: 74 2b 2b 3d 3d 30 20 26 26 20 70 2d 3e 73 68 6f  t++==0 && p->sho
dad0: 77 48 65 61 64 65 72 20 29 7b 0a 20 20 20 20 20  wHeader ){.     
dae0: 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d     raw_printf(p-
daf0: 3e 6f 75 74 2c 22 3c 54 52 3e 22 29 3b 0a 20 20  >out,"<TR>");.  
db00: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
db10: 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nArg; i++){.   
db20: 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74         raw_print
db30: 66 28 70 2d 3e 6f 75 74 2c 22 3c 54 48 3e 22 29  f(p->out,"<TH>")
db40: 3b 0a 20 20 20 20 20 20 20 20 20 20 6f 75 74 70  ;.          outp
db50: 75 74 5f 68 74 6d 6c 5f 73 74 72 69 6e 67 28 70  ut_html_string(p
db60: 2d 3e 6f 75 74 2c 20 61 7a 43 6f 6c 5b 69 5d 29  ->out, azCol[i])
db70: 3b 0a 20 20 20 20 20 20 20 20 20 20 72 61 77 5f  ;.          raw_
db80: 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 3c  printf(p->out,"<
db90: 2f 54 48 3e 5c 6e 22 29 3b 0a 20 20 20 20 20 20  /TH>\n");.      
dba0: 20 20 7d 0a 20 20 20 20 20 20 20 20 72 61 77 5f    }.        raw_
dbb0: 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 3c  printf(p->out,"<
dbc0: 2f 54 52 3e 5c 6e 22 29 3b 0a 20 20 20 20 20 20  /TR>\n");.      
dbd0: 7d 0a 20 20 20 20 20 20 69 66 28 20 61 7a 41 72  }.      if( azAr
dbe0: 67 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  g==0 ) break;.  
dbf0: 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70      raw_printf(p
dc00: 2d 3e 6f 75 74 2c 22 3c 54 52 3e 22 29 3b 0a 20  ->out,"<TR>");. 
dc10: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
dc20: 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nArg; i++){.    
dc30: 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70      raw_printf(p
dc40: 2d 3e 6f 75 74 2c 22 3c 54 44 3e 22 29 3b 0a 20  ->out,"<TD>");. 
dc50: 20 20 20 20 20 20 20 6f 75 74 70 75 74 5f 68 74         output_ht
dc60: 6d 6c 5f 73 74 72 69 6e 67 28 70 2d 3e 6f 75 74  ml_string(p->out
dc70: 2c 20 61 7a 41 72 67 5b 69 5d 20 3f 20 61 7a 41  , azArg[i] ? azA
dc80: 72 67 5b 69 5d 20 3a 20 70 2d 3e 6e 75 6c 6c 56  rg[i] : p->nullV
dc90: 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 20 20 72  alue);.        r
dca0: 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  aw_printf(p->out
dcb0: 2c 22 3c 2f 54 44 3e 5c 6e 22 29 3b 0a 20 20 20  ,"</TD>\n");.   
dcc0: 20 20 20 7d 0a 20 20 20 20 20 20 72 61 77 5f 70     }.      raw_p
dcd0: 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 3c 2f  rintf(p->out,"</
dce0: 54 52 3e 5c 6e 22 29 3b 0a 20 20 20 20 20 20 62  TR>\n");.      b
dcf0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
dd00: 63 61 73 65 20 4d 4f 44 45 5f 54 63 6c 3a 20 7b  case MODE_Tcl: {
dd10: 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 63 6e  .      if( p->cn
dd20: 74 2b 2b 3d 3d 30 20 26 26 20 70 2d 3e 73 68 6f  t++==0 && p->sho
dd30: 77 48 65 61 64 65 72 20 29 7b 0a 20 20 20 20 20  wHeader ){.     
dd40: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41     for(i=0; i<nA
dd50: 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  rg; i++){.      
dd60: 20 20 20 20 6f 75 74 70 75 74 5f 63 5f 73 74 72      output_c_str
dd70: 69 6e 67 28 70 2d 3e 6f 75 74 2c 61 7a 43 6f 6c  ing(p->out,azCol
dd80: 5b 69 5d 20 3f 20 61 7a 43 6f 6c 5b 69 5d 20 3a  [i] ? azCol[i] :
dd90: 20 22 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20   "");.          
dda0: 69 66 28 69 3c 6e 41 72 67 2d 31 29 20 75 74 66  if(i<nArg-1) utf
ddb0: 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  8_printf(p->out,
ddc0: 20 22 25 73 22 2c 20 70 2d 3e 63 6f 6c 53 65 70   "%s", p->colSep
ddd0: 61 72 61 74 6f 72 29 3b 0a 20 20 20 20 20 20 20  arator);.       
dde0: 20 7d 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f   }.        utf8_
ddf0: 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
de00: 25 73 22 2c 20 70 2d 3e 72 6f 77 53 65 70 61 72  %s", p->rowSepar
de10: 61 74 6f 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ator);.      }. 
de20: 20 20 20 20 20 69 66 28 20 61 7a 41 72 67 3d 3d       if( azArg==
de30: 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  0 ) break;.     
de40: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67   for(i=0; i<nArg
de50: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
de60: 6f 75 74 70 75 74 5f 63 5f 73 74 72 69 6e 67 28  output_c_string(
de70: 70 2d 3e 6f 75 74 2c 20 61 7a 41 72 67 5b 69 5d  p->out, azArg[i]
de80: 20 3f 20 61 7a 41 72 67 5b 69 5d 20 3a 20 70 2d   ? azArg[i] : p-
de90: 3e 6e 75 6c 6c 56 61 6c 75 65 29 3b 0a 20 20 20  >nullValue);.   
dea0: 20 20 20 20 20 69 66 28 69 3c 6e 41 72 67 2d 31       if(i<nArg-1
deb0: 29 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d  ) utf8_printf(p-
dec0: 3e 6f 75 74 2c 20 22 25 73 22 2c 20 70 2d 3e 63  >out, "%s", p->c
ded0: 6f 6c 53 65 70 61 72 61 74 6f 72 29 3b 0a 20 20  olSeparator);.  
dee0: 20 20 20 20 7d 0a 20 20 20 20 20 20 75 74 66 38      }.      utf8
def0: 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
df00: 22 25 73 22 2c 20 70 2d 3e 72 6f 77 53 65 70 61  "%s", p->rowSepa
df10: 72 61 74 6f 72 29 3b 0a 20 20 20 20 20 20 62 72  rator);.      br
df20: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
df30: 61 73 65 20 4d 4f 44 45 5f 43 73 76 3a 20 7b 0a  ase MODE_Csv: {.
df40: 20 20 20 20 20 20 73 65 74 42 69 6e 61 72 79 4d        setBinaryM
df50: 6f 64 65 28 70 2d 3e 6f 75 74 2c 20 31 29 3b 0a  ode(p->out, 1);.
df60: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 63 6e 74        if( p->cnt
df70: 2b 2b 3d 3d 30 20 26 26 20 70 2d 3e 73 68 6f 77  ++==0 && p->show
df80: 48 65 61 64 65 72 20 29 7b 0a 20 20 20 20 20 20  Header ){.      
df90: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72    for(i=0; i<nAr
dfa0: 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  g; i++){.       
dfb0: 20 20 20 6f 75 74 70 75 74 5f 63 73 76 28 70 2c     output_csv(p,
dfc0: 20 61 7a 43 6f 6c 5b 69 5d 20 3f 20 61 7a 43 6f   azCol[i] ? azCo
dfd0: 6c 5b 69 5d 20 3a 20 22 22 2c 20 69 3c 6e 41 72  l[i] : "", i<nAr
dfe0: 67 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  g-1);.        }.
dff0: 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69          utf8_pri
e000: 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22  ntf(p->out, "%s"
e010: 2c 20 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f  , p->rowSeparato
e020: 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
e030: 20 20 69 66 28 20 6e 41 72 67 3e 30 20 29 7b 0a    if( nArg>0 ){.
e040: 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
e050: 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20   i<nArg; i++){. 
e060: 20 20 20 20 20 20 20 20 20 6f 75 74 70 75 74 5f           output_
e070: 63 73 76 28 70 2c 20 61 7a 41 72 67 5b 69 5d 2c  csv(p, azArg[i],
e080: 20 69 3c 6e 41 72 67 2d 31 29 3b 0a 20 20 20 20   i<nArg-1);.    
e090: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 75 74      }.        ut
e0a0: 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  f8_printf(p->out
e0b0: 2c 20 22 25 73 22 2c 20 70 2d 3e 72 6f 77 53 65  , "%s", p->rowSe
e0c0: 70 61 72 61 74 6f 72 29 3b 0a 20 20 20 20 20 20  parator);.      
e0d0: 7d 0a 20 20 20 20 20 20 73 65 74 54 65 78 74 4d  }.      setTextM
e0e0: 6f 64 65 28 70 2d 3e 6f 75 74 2c 20 31 29 3b 0a  ode(p->out, 1);.
e0f0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
e100: 20 7d 0a 20 20 20 20 63 61 73 65 20 4d 4f 44 45   }.    case MODE
e110: 5f 49 6e 73 65 72 74 3a 20 7b 0a 20 20 20 20 20  _Insert: {.     
e120: 20 69 66 28 20 61 7a 41 72 67 3d 3d 30 20 29 20   if( azArg==0 ) 
e130: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 75 74 66  break;.      utf
e140: 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  8_printf(p->out,
e150: 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 25 73 22  "INSERT INTO %s"
e160: 2c 70 2d 3e 7a 44 65 73 74 54 61 62 6c 65 29 3b  ,p->zDestTable);
e170: 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 73 68  .      if( p->sh
e180: 6f 77 48 65 61 64 65 72 20 29 7b 0a 20 20 20 20  owHeader ){.    
e190: 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70      raw_printf(p
e1a0: 2d 3e 6f 75 74 2c 22 28 22 29 3b 0a 20 20 20 20  ->out,"(");.    
e1b0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
e1c0: 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Arg; i++){.     
e1d0: 20 20 20 20 20 69 66 28 20 69 3e 30 20 29 20 72       if( i>0 ) r
e1e0: 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  aw_printf(p->out
e1f0: 2c 20 22 2c 22 29 3b 0a 20 20 20 20 20 20 20 20  , ",");.        
e200: 20 20 69 66 28 20 71 75 6f 74 65 43 68 61 72 28    if( quoteChar(
e210: 61 7a 43 6f 6c 5b 69 5d 29 20 29 7b 0a 20 20 20  azCol[i]) ){.   
e220: 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a           char *z
e230: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
e240: 74 66 28 22 5c 22 25 77 5c 22 22 2c 20 61 7a 43  tf("\"%w\"", azC
e250: 6f 6c 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20  ol[i]);.        
e260: 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
e270: 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20 7a 29  p->out, "%s", z)
e280: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  ;.            sq
e290: 6c 69 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20  lite3_free(z);. 
e2a0: 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
e2b0: 20 20 20 20 20 20 20 20 20 20 20 20 72 61 77 5f              raw_
e2c0: 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
e2d0: 25 73 22 2c 20 61 7a 43 6f 6c 5b 69 5d 29 3b 0a  %s", azCol[i]);.
e2e0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
e2f0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 61      }.        ra
e300: 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  w_printf(p->out,
e310: 22 29 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ")");.      }.  
e320: 20 20 20 20 70 2d 3e 63 6e 74 2b 2b 3b 0a 20 20      p->cnt++;.  
e330: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
e340: 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Arg; i++){.     
e350: 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d     raw_printf(p-
e360: 3e 6f 75 74 2c 20 69 3e 30 20 3f 20 22 2c 22 20  >out, i>0 ? "," 
e370: 3a 20 22 20 56 41 4c 55 45 53 28 22 29 3b 0a 20  : " VALUES(");. 
e380: 20 20 20 20 20 20 20 69 66 28 20 28 61 7a 41 72         if( (azAr
e390: 67 5b 69 5d 3d 3d 30 29 20 7c 7c 20 28 61 69 54  g[i]==0) || (aiT
e3a0: 79 70 65 20 26 26 20 61 69 54 79 70 65 5b 69 5d  ype && aiType[i]
e3b0: 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 29 20 29  ==SQLITE_NULL) )
e3c0: 7b 0a 20 20 20 20 20 20 20 20 20 20 75 74 66 38  {.          utf8
e3d0: 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22  _printf(p->out,"
e3e0: 4e 55 4c 4c 22 29 3b 0a 20 20 20 20 20 20 20 20  NULL");.        
e3f0: 7d 65 6c 73 65 20 69 66 28 20 61 69 54 79 70 65  }else if( aiType
e400: 20 26 26 20 61 69 54 79 70 65 5b 69 5d 3d 3d 53   && aiType[i]==S
e410: 51 4c 49 54 45 5f 54 45 58 54 20 29 7b 0a 20 20  QLITE_TEXT ){.  
e420: 20 20 20 20 20 20 20 20 69 66 28 20 53 68 65 6c          if( Shel
e430: 6c 48 61 73 46 6c 61 67 28 70 2c 20 53 48 46 4c  lHasFlag(p, SHFL
e440: 47 5f 4e 65 77 6c 69 6e 65 73 29 20 29 7b 0a 20  G_Newlines) ){. 
e450: 20 20 20 20 20 20 20 20 20 20 20 6f 75 74 70 75             outpu
e460: 74 5f 71 75 6f 74 65 64 5f 73 74 72 69 6e 67 28  t_quoted_string(
e470: 70 2d 3e 6f 75 74 2c 20 61 7a 41 72 67 5b 69 5d  p->out, azArg[i]
e480: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  );.          }el
e490: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
e4a0: 6f 75 74 70 75 74 5f 71 75 6f 74 65 64 5f 65 73  output_quoted_es
e4b0: 63 61 70 65 64 5f 73 74 72 69 6e 67 28 70 2d 3e  caped_string(p->
e4c0: 6f 75 74 2c 20 61 7a 41 72 67 5b 69 5d 29 3b 0a  out, azArg[i]);.
e4d0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
e4e0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 61 69      }else if( ai
e4f0: 54 79 70 65 20 26 26 20 61 69 54 79 70 65 5b 69  Type && aiType[i
e500: 5d 3d 3d 53 51 4c 49 54 45 5f 49 4e 54 45 47 45  ]==SQLITE_INTEGE
e510: 52 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75  R ){.          u
e520: 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  tf8_printf(p->ou
e530: 74 2c 22 25 73 22 2c 20 61 7a 41 72 67 5b 69 5d  t,"%s", azArg[i]
e540: 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
e550: 20 69 66 28 20 61 69 54 79 70 65 20 26 26 20 61   if( aiType && a
e560: 69 54 79 70 65 5b 69 5d 3d 3d 53 51 4c 49 54 45  iType[i]==SQLITE
e570: 5f 46 4c 4f 41 54 20 29 7b 0a 20 20 20 20 20 20  _FLOAT ){.      
e580: 20 20 20 20 63 68 61 72 20 7a 5b 35 30 5d 3b 0a      char z[50];.
e590: 20 20 20 20 20 20 20 20 20 20 64 6f 75 62 6c 65            double
e5a0: 20 72 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c   r = sqlite3_col
e5b0: 75 6d 6e 5f 64 6f 75 62 6c 65 28 70 2d 3e 70 53  umn_double(p->pS
e5c0: 74 6d 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 20  tmt, i);.       
e5d0: 20 20 20 73 71 6c 69 74 65 33 5f 75 69 6e 74 36     sqlite3_uint6
e5e0: 34 20 75 72 3b 0a 20 20 20 20 20 20 20 20 20 20  4 ur;.          
e5f0: 6d 65 6d 63 70 79 28 26 75 72 2c 26 72 2c 73 69  memcpy(&ur,&r,si
e600: 7a 65 6f 66 28 72 29 29 3b 0a 20 20 20 20 20 20  zeof(r));.      
e610: 20 20 20 20 69 66 28 20 75 72 3d 3d 30 78 37 66      if( ur==0x7f
e620: 66 30 30 30 30 30 30 30 30 30 30 30 30 30 4c 4c  f0000000000000LL
e630: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
e640: 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  raw_printf(p->ou
e650: 74 2c 20 22 31 65 39 39 39 22 29 3b 0a 20 20 20  t, "1e999");.   
e660: 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
e670: 20 75 72 3d 3d 30 78 66 66 66 30 30 30 30 30 30   ur==0xfff000000
e680: 30 30 30 30 30 30 30 4c 4c 20 29 7b 0a 20 20 20  0000000LL ){.   
e690: 20 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69           raw_pri
e6a0: 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 2d 31 65  ntf(p->out, "-1e
e6b0: 39 39 39 22 29 3b 0a 20 20 20 20 20 20 20 20 20  999");.         
e6c0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
e6d0: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
e6e0: 69 6e 74 66 28 35 30 2c 7a 2c 22 25 21 2e 32 30  intf(50,z,"%!.20
e6f0: 67 22 2c 20 72 29 3b 0a 20 20 20 20 20 20 20 20  g", r);.        
e700: 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70      raw_printf(p
e710: 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20 7a 29 3b  ->out, "%s", z);
e720: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
e730: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 61       }else if( a
e740: 69 54 79 70 65 20 26 26 20 61 69 54 79 70 65 5b  iType && aiType[
e750: 69 5d 3d 3d 53 51 4c 49 54 45 5f 42 4c 4f 42 20  i]==SQLITE_BLOB 
e760: 26 26 20 70 2d 3e 70 53 74 6d 74 20 29 7b 0a 20  && p->pStmt ){. 
e770: 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 76           const v
e780: 6f 69 64 20 2a 70 42 6c 6f 62 20 3d 20 73 71 6c  oid *pBlob = sql
e790: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62  ite3_column_blob
e7a0: 28 70 2d 3e 70 53 74 6d 74 2c 20 69 29 3b 0a 20  (p->pStmt, i);. 
e7b0: 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e 42 6c           int nBl
e7c0: 6f 62 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  ob = sqlite3_col
e7d0: 75 6d 6e 5f 62 79 74 65 73 28 70 2d 3e 70 53 74  umn_bytes(p->pSt
e7e0: 6d 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20  mt, i);.        
e7f0: 20 20 6f 75 74 70 75 74 5f 68 65 78 5f 62 6c 6f    output_hex_blo
e800: 62 28 70 2d 3e 6f 75 74 2c 20 70 42 6c 6f 62 2c  b(p->out, pBlob,
e810: 20 6e 42 6c 6f 62 29 3b 0a 20 20 20 20 20 20 20   nBlob);.       
e820: 20 7d 65 6c 73 65 20 69 66 28 20 69 73 4e 75 6d   }else if( isNum
e830: 62 65 72 28 61 7a 41 72 67 5b 69 5d 2c 20 30 29  ber(azArg[i], 0)
e840: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 74   ){.          ut
e850: 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  f8_printf(p->out
e860: 2c 22 25 73 22 2c 20 61 7a 41 72 67 5b 69 5d 29  ,"%s", azArg[i])
e870: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
e880: 69 66 28 20 53 68 65 6c 6c 48 61 73 46 6c 61 67  if( ShellHasFlag
e890: 28 70 2c 20 53 48 46 4c 47 5f 4e 65 77 6c 69 6e  (p, SHFLG_Newlin
e8a0: 65 73 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  es) ){.         
e8b0: 20 6f 75 74 70 75 74 5f 71 75 6f 74 65 64 5f 73   output_quoted_s
e8c0: 74 72 69 6e 67 28 70 2d 3e 6f 75 74 2c 20 61 7a  tring(p->out, az
e8d0: 41 72 67 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20  Arg[i]);.       
e8e0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
e8f0: 20 20 6f 75 74 70 75 74 5f 71 75 6f 74 65 64 5f    output_quoted_
e900: 65 73 63 61 70 65 64 5f 73 74 72 69 6e 67 28 70  escaped_string(p
e910: 2d 3e 6f 75 74 2c 20 61 7a 41 72 67 5b 69 5d 29  ->out, azArg[i])
e920: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
e930: 20 20 7d 0a 20 20 20 20 20 20 72 61 77 5f 70 72    }.      raw_pr
e940: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 29 3b 5c  intf(p->out,");\
e950: 6e 22 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  n");.      break
e960: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
e970: 20 4d 4f 44 45 5f 51 75 6f 74 65 3a 20 7b 0a 20   MODE_Quote: {. 
e980: 20 20 20 20 20 69 66 28 20 61 7a 41 72 67 3d 3d       if( azArg==
e990: 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  0 ) break;.     
e9a0: 20 69 66 28 20 70 2d 3e 63 6e 74 3d 3d 30 20 26   if( p->cnt==0 &
e9b0: 26 20 70 2d 3e 73 68 6f 77 48 65 61 64 65 72 20  & p->showHeader 
e9c0: 29 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  ){.        for(i
e9d0: 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29  =0; i<nArg; i++)
e9e0: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
e9f0: 69 3e 30 20 29 20 72 61 77 5f 70 72 69 6e 74 66  i>0 ) raw_printf
ea00: 28 70 2d 3e 6f 75 74 2c 20 22 2c 22 29 3b 0a 20  (p->out, ",");. 
ea10: 20 20 20 20 20 20 20 20 20 6f 75 74 70 75 74 5f           output_
ea20: 71 75 6f 74 65 64 5f 73 74 72 69 6e 67 28 70 2d  quoted_string(p-
ea30: 3e 6f 75 74 2c 20 61 7a 43 6f 6c 5b 69 5d 29 3b  >out, azCol[i]);
ea40: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
ea50: 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d     raw_printf(p-
ea60: 3e 6f 75 74 2c 22 5c 6e 22 29 3b 0a 20 20 20 20  >out,"\n");.    
ea70: 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e 63 6e 74    }.      p->cnt
ea80: 2b 2b 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  ++;.      for(i=
ea90: 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b  0; i<nArg; i++){
eaa0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 3e 30  .        if( i>0
eab0: 20 29 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d   ) raw_printf(p-
eac0: 3e 6f 75 74 2c 20 22 2c 22 29 3b 0a 20 20 20 20  >out, ",");.    
ead0: 20 20 20 20 69 66 28 20 28 61 7a 41 72 67 5b 69      if( (azArg[i
eae0: 5d 3d 3d 30 29 20 7c 7c 20 28 61 69 54 79 70 65  ]==0) || (aiType
eaf0: 20 26 26 20 61 69 54 79 70 65 5b 69 5d 3d 3d 53   && aiType[i]==S
eb00: 51 4c 49 54 45 5f 4e 55 4c 4c 29 20 29 7b 0a 20  QLITE_NULL) ){. 
eb10: 20 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72           utf8_pr
eb20: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 4e 55 4c  intf(p->out,"NUL
eb30: 4c 22 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  L");.        }el
eb40: 73 65 20 69 66 28 20 61 69 54 79 70 65 20 26 26  se if( aiType &&
eb50: 20 61 69 54 79 70 65 5b 69 5d 3d 3d 53 51 4c 49   aiType[i]==SQLI
eb60: 54 45 5f 54 45 58 54 20 29 7b 0a 20 20 20 20 20  TE_TEXT ){.     
eb70: 20 20 20 20 20 6f 75 74 70 75 74 5f 71 75 6f 74       output_quot
eb80: 65 64 5f 73 74 72 69 6e 67 28 70 2d 3e 6f 75 74  ed_string(p->out
eb90: 2c 20 61 7a 41 72 67 5b 69 5d 29 3b 0a 20 20 20  , azArg[i]);.   
eba0: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 61       }else if( a
ebb0: 69 54 79 70 65 20 26 26 20 61 69 54 79 70 65 5b  iType && aiType[
ebc0: 69 5d 3d 3d 53 51 4c 49 54 45 5f 49 4e 54 45 47  i]==SQLITE_INTEG
ebd0: 45 52 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ER ){.          
ebe0: 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f  utf8_printf(p->o
ebf0: 75 74 2c 22 25 73 22 2c 20 61 7a 41 72 67 5b 69  ut,"%s", azArg[i
ec00: 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ]);.        }els
ec10: 65 20 69 66 28 20 61 69 54 79 70 65 20 26 26 20  e if( aiType && 
ec20: 61 69 54 79 70 65 5b 69 5d 3d 3d 53 51 4c 49 54  aiType[i]==SQLIT
ec30: 45 5f 46 4c 4f 41 54 20 29 7b 0a 20 20 20 20 20  E_FLOAT ){.     
ec40: 20 20 20 20 20 63 68 61 72 20 7a 5b 35 30 5d 3b       char z[50];
ec50: 0a 20 20 20 20 20 20 20 20 20 20 64 6f 75 62 6c  .          doubl
ec60: 65 20 72 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  e r = sqlite3_co
ec70: 6c 75 6d 6e 5f 64 6f 75 62 6c 65 28 70 2d 3e 70  lumn_double(p->p
ec80: 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20 20 20 20  Stmt, i);.      
ec90: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
eca0: 69 6e 74 66 28 35 30 2c 7a 2c 22 25 21 2e 32 30  intf(50,z,"%!.20
ecb0: 67 22 2c 20 72 29 3b 0a 20 20 20 20 20 20 20 20  g", r);.        
ecc0: 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e    raw_printf(p->
ecd0: 6f 75 74 2c 20 22 25 73 22 2c 20 7a 29 3b 0a 20  out, "%s", z);. 
ece0: 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
ecf0: 20 61 69 54 79 70 65 20 26 26 20 61 69 54 79 70   aiType && aiTyp
ed00: 65 5b 69 5d 3d 3d 53 51 4c 49 54 45 5f 42 4c 4f  e[i]==SQLITE_BLO
ed10: 42 20 26 26 20 70 2d 3e 70 53 74 6d 74 20 29 7b  B && p->pStmt ){
ed20: 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74  .          const
ed30: 20 76 6f 69 64 20 2a 70 42 6c 6f 62 20 3d 20 73   void *pBlob = s
ed40: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c  qlite3_column_bl
ed50: 6f 62 28 70 2d 3e 70 53 74 6d 74 2c 20 69 29 3b  ob(p->pStmt, i);
ed60: 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e  .          int n
ed70: 42 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33 5f 63  Blob = sqlite3_c
ed80: 6f 6c 75 6d 6e 5f 62 79 74 65 73 28 70 2d 3e 70  olumn_bytes(p->p
ed90: 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20 20 20 20  Stmt, i);.      
eda0: 20 20 20 20 6f 75 74 70 75 74 5f 68 65 78 5f 62      output_hex_b
edb0: 6c 6f 62 28 70 2d 3e 6f 75 74 2c 20 70 42 6c 6f  lob(p->out, pBlo
edc0: 62 2c 20 6e 42 6c 6f 62 29 3b 0a 20 20 20 20 20  b, nBlob);.     
edd0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69 73 4e     }else if( isN
ede0: 75 6d 62 65 72 28 61 7a 41 72 67 5b 69 5d 2c 20  umber(azArg[i], 
edf0: 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  0) ){.          
ee00: 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f  utf8_printf(p->o
ee10: 75 74 2c 22 25 73 22 2c 20 61 7a 41 72 67 5b 69  ut,"%s", azArg[i
ee20: 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ]);.        }els
ee30: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 6f 75 74  e{.          out
ee40: 70 75 74 5f 71 75 6f 74 65 64 5f 73 74 72 69 6e  put_quoted_strin
ee50: 67 28 70 2d 3e 6f 75 74 2c 20 61 7a 41 72 67 5b  g(p->out, azArg[
ee60: 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  i]);.        }. 
ee70: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 61 77       }.      raw
ee80: 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22  _printf(p->out,"
ee90: 5c 6e 22 29 3b 0a 20 20 20 20 20 20 62 72 65 61  \n");.      brea
eea0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
eeb0: 65 20 4d 4f 44 45 5f 41 73 63 69 69 3a 20 7b 0a  e MODE_Ascii: {.
eec0: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 63 6e 74        if( p->cnt
eed0: 2b 2b 3d 3d 30 20 26 26 20 70 2d 3e 73 68 6f 77  ++==0 && p->show
eee0: 48 65 61 64 65 72 20 29 7b 0a 20 20 20 20 20 20  Header ){.      
eef0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72    for(i=0; i<nAr
ef00: 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  g; i++){.       
ef10: 20 20 20 69 66 28 20 69 3e 30 20 29 20 75 74 66     if( i>0 ) utf
ef20: 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  8_printf(p->out,
ef30: 20 22 25 73 22 2c 20 70 2d 3e 63 6f 6c 53 65 70   "%s", p->colSep
ef40: 61 72 61 74 6f 72 29 3b 0a 20 20 20 20 20 20 20  arator);.       
ef50: 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70     utf8_printf(p
ef60: 2d 3e 6f 75 74 2c 22 25 73 22 2c 61 7a 43 6f 6c  ->out,"%s",azCol
ef70: 5b 69 5d 20 3f 20 61 7a 43 6f 6c 5b 69 5d 20 3a  [i] ? azCol[i] :
ef80: 20 22 22 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a   "");.        }.
ef90: 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69          utf8_pri
efa0: 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22  ntf(p->out, "%s"
efb0: 2c 20 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f  , p->rowSeparato
efc0: 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
efd0: 20 20 69 66 28 20 61 7a 41 72 67 3d 3d 30 20 29    if( azArg==0 )
efe0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 66 6f   break;.      fo
eff0: 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69  r(i=0; i<nArg; i
f000: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
f010: 20 69 3e 30 20 29 20 75 74 66 38 5f 70 72 69 6e   i>0 ) utf8_prin
f020: 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c  tf(p->out, "%s",
f030: 20 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72   p->colSeparator
f040: 29 3b 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f  );.        utf8_
f050: 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 25  printf(p->out,"%
f060: 73 22 2c 61 7a 41 72 67 5b 69 5d 20 3f 20 61 7a  s",azArg[i] ? az
f070: 41 72 67 5b 69 5d 20 3a 20 70 2d 3e 6e 75 6c 6c  Arg[i] : p->null
f080: 56 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 7d 0a  Value);.      }.
f090: 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
f0a0: 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20  f(p->out, "%s", 
f0b0: 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 29  p->rowSeparator)
f0c0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
f0d0: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 4d 4f     }.    case MO
f0e0: 44 45 5f 45 51 50 3a 20 7b 0a 20 20 20 20 20 20  DE_EQP: {.      
f0f0: 65 71 70 5f 61 70 70 65 6e 64 28 70 2c 20 61 74  eqp_append(p, at
f100: 6f 69 28 61 7a 41 72 67 5b 30 5d 29 2c 20 61 74  oi(azArg[0]), at
f110: 6f 69 28 61 7a 41 72 67 5b 31 5d 29 2c 20 61 7a  oi(azArg[1]), az
f120: 41 72 67 5b 33 5d 29 3b 0a 20 20 20 20 20 20 62  Arg[3]);.      b
f130: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
f140: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
f150: 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65  *.** This is the
f160: 20 63 61 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e   callback routin
f170: 65 20 74 68 61 74 20 74 68 65 20 53 51 4c 69 74  e that the SQLit
f180: 65 20 6c 69 62 72 61 72 79 0a 2a 2a 20 69 6e 76  e library.** inv
f190: 6f 6b 65 73 20 66 6f 72 20 65 61 63 68 20 72 6f  okes for each ro
f1a0: 77 20 6f 66 20 61 20 71 75 65 72 79 20 72 65 73  w of a query res
f1b0: 75 6c 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ult..*/.static i
f1c0: 6e 74 20 63 61 6c 6c 62 61 63 6b 28 76 6f 69 64  nt callback(void
f1d0: 20 2a 70 41 72 67 2c 20 69 6e 74 20 6e 41 72 67   *pArg, int nArg
f1e0: 2c 20 63 68 61 72 20 2a 2a 61 7a 41 72 67 2c 20  , char **azArg, 
f1f0: 63 68 61 72 20 2a 2a 61 7a 43 6f 6c 29 7b 0a 20  char **azCol){. 
f200: 20 2f 2a 20 73 69 6e 63 65 20 77 65 20 64 6f 6e   /* since we don
f210: 27 74 20 68 61 76 65 20 74 79 70 65 20 69 6e 66  't have type inf
f220: 6f 2c 20 63 61 6c 6c 20 74 68 65 20 73 68 65 6c  o, call the shel
f230: 6c 5f 63 61 6c 6c 62 61 63 6b 20 77 69 74 68 20  l_callback with 
f240: 61 20 4e 55 4c 4c 20 76 61 6c 75 65 20 2a 2f 0a  a NULL value */.
f250: 20 20 72 65 74 75 72 6e 20 73 68 65 6c 6c 5f 63    return shell_c
f260: 61 6c 6c 62 61 63 6b 28 70 41 72 67 2c 20 6e 41  allback(pArg, nA
f270: 72 67 2c 20 61 7a 41 72 67 2c 20 61 7a 43 6f 6c  rg, azArg, azCol
f280: 2c 20 4e 55 4c 4c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  , NULL);.}../*.*
f290: 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 63 61  * This is the ca
f2a0: 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65 20 66  llback routine f
f2b0: 72 6f 6d 20 73 71 6c 69 74 65 33 5f 65 78 65 63  rom sqlite3_exec
f2c0: 28 29 20 74 68 61 74 20 61 70 70 65 6e 64 73 20  () that appends 
f2d0: 61 6c 6c 0a 2a 2a 20 6f 75 74 70 75 74 20 6f 6e  all.** output on
f2e0: 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 61 20  to the end of a 
f2f0: 53 68 65 6c 6c 54 65 78 74 20 6f 62 6a 65 63 74  ShellText object
f300: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
f310: 63 61 70 74 75 72 65 4f 75 74 70 75 74 43 61 6c  captureOutputCal
f320: 6c 62 61 63 6b 28 76 6f 69 64 20 2a 70 41 72 67  lback(void *pArg
f330: 2c 20 69 6e 74 20 6e 41 72 67 2c 20 63 68 61 72  , int nArg, char
f340: 20 2a 2a 61 7a 41 72 67 2c 20 63 68 61 72 20 2a   **azArg, char *
f350: 2a 61 7a 29 7b 0a 20 20 53 68 65 6c 6c 54 65 78  *az){.  ShellTex
f360: 74 20 2a 70 20 3d 20 28 53 68 65 6c 6c 54 65 78  t *p = (ShellTex
f370: 74 2a 29 70 41 72 67 3b 0a 20 20 69 6e 74 20 69  t*)pArg;.  int i
f380: 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
f390: 45 54 45 52 28 61 7a 29 3b 0a 20 20 69 66 28 20  ETER(az);.  if( 
f3a0: 61 7a 41 72 67 3d 3d 30 20 29 20 72 65 74 75 72  azArg==0 ) retur
f3b0: 6e 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 20  n 0;.  if( p->n 
f3c0: 29 20 61 70 70 65 6e 64 54 65 78 74 28 70 2c 20  ) appendText(p, 
f3d0: 22 7c 22 2c 20 30 29 3b 0a 20 20 66 6f 72 28 69  "|", 0);.  for(i
f3e0: 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29  =0; i<nArg; i++)
f3f0: 7b 0a 20 20 20 20 69 66 28 20 69 20 29 20 61 70  {.    if( i ) ap
f400: 70 65 6e 64 54 65 78 74 28 70 2c 20 22 2c 22 2c  pendText(p, ",",
f410: 20 30 29 3b 0a 20 20 20 20 69 66 28 20 61 7a 41   0);.    if( azA
f420: 72 67 5b 69 5d 20 29 20 61 70 70 65 6e 64 54 65  rg[i] ) appendTe
f430: 78 74 28 70 2c 20 61 7a 41 72 67 5b 69 5d 2c 20  xt(p, azArg[i], 
f440: 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  0);.  }.  return
f450: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e   0;.}../*.** Gen
f460: 65 72 61 74 65 20 61 6e 20 61 70 70 72 6f 70 72  erate an appropr
f470: 69 61 74 65 20 53 45 4c 46 54 45 53 54 20 74 61  iate SELFTEST ta
f480: 62 6c 65 20 69 6e 20 74 68 65 20 6d 61 69 6e 20  ble in the main 
f490: 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 73 74 61  database..*/.sta
f4a0: 74 69 63 20 76 6f 69 64 20 63 72 65 61 74 65 53  tic void createS
f4b0: 65 6c 66 74 65 73 74 54 61 62 6c 65 28 53 68 65  elftestTable(She
f4c0: 6c 6c 53 74 61 74 65 20 2a 70 29 7b 0a 20 20 63  llState *p){.  c
f4d0: 68 61 72 20 2a 7a 45 72 72 4d 73 67 20 3d 20 30  har *zErrMsg = 0
f4e0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63  ;.  sqlite3_exec
f4f0: 28 70 2d 3e 64 62 2c 0a 20 20 20 20 22 53 41 56  (p->db,.    "SAV
f500: 45 50 4f 49 4e 54 20 73 65 6c 66 74 65 73 74 5f  EPOINT selftest_
f510: 69 6e 69 74 3b 5c 6e 22 0a 20 20 20 20 22 43 52  init;\n".    "CR
f520: 45 41 54 45 20 54 41 42 4c 45 20 49 46 20 4e 4f  EATE TABLE IF NO
f530: 54 20 45 58 49 53 54 53 20 73 65 6c 66 74 65 73  T EXISTS selftes
f540: 74 28 5c 6e 22 0a 20 20 20 20 22 20 20 74 6e 6f  t(\n".    "  tno
f550: 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
f560: 20 4b 45 59 2c 5c 6e 22 20 20 20 2f 2a 20 54 65   KEY,\n"   /* Te
f570: 73 74 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 20  st number */.   
f580: 20 22 20 20 6f 70 20 54 45 58 54 2c 5c 6e 22 20   "  op TEXT,\n" 
f590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f5a0: 20 20 2f 2a 20 4f 70 65 72 61 74 6f 72 3a 20 20    /* Operator:  
f5b0: 6d 65 6d 6f 20 72 75 6e 20 2a 2f 0a 20 20 20 20  memo run */.    
f5c0: 22 20 20 63 6d 64 20 54 45 58 54 2c 5c 6e 22 20  "  cmd TEXT,\n" 
f5d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f5e0: 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 74 65 78 74   /* Command text
f5f0: 20 2a 2f 0a 20 20 20 20 22 20 20 61 6e 73 20 54   */.    "  ans T
f600: 45 58 54 5c 6e 22 20 20 20 20 20 20 20 20 20 20  EXT\n"          
f610: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 73 69           /* Desi
f620: 72 65 64 20 61 6e 73 77 65 72 20 2a 2f 0a 20 20  red answer */.  
f630: 20 20 22 29 3b 22 0a 20 20 20 20 22 43 52 45 41    ");".    "CREA
f640: 54 45 20 54 45 4d 50 20 54 41 42 4c 45 20 5b 5f  TE TEMP TABLE [_
f650: 73 68 65 6c 6c 24 73 65 6c 66 5d 28 6f 70 2c 63  shell$self](op,c
f660: 6d 64 2c 61 6e 73 29 3b 5c 6e 22 0a 20 20 20 20  md,ans);\n".    
f670: 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 5b 5f 73  "INSERT INTO [_s
f680: 68 65 6c 6c 24 73 65 6c 66 5d 28 72 6f 77 69 64  hell$self](rowid
f690: 2c 6f 70 2c 63 6d 64 29 5c 6e 22 0a 20 20 20 20  ,op,cmd)\n".    
f6a0: 22 20 20 56 41 4c 55 45 53 28 63 6f 61 6c 65 73  "  VALUES(coales
f6b0: 63 65 28 28 53 45 4c 45 43 54 20 28 6d 61 78 28  ce((SELECT (max(
f6c0: 74 6e 6f 29 2b 31 30 30 29 2f 31 30 20 46 52 4f  tno)+100)/10 FRO
f6d0: 4d 20 73 65 6c 66 74 65 73 74 29 2c 31 30 29 2c  M selftest),10),
f6e0: 5c 6e 22 0a 20 20 20 20 22 20 20 20 20 20 20 20  \n".    "       
f6f0: 20 20 27 6d 65 6d 6f 27 2c 27 54 65 73 74 73 20    'memo','Tests 
f700: 67 65 6e 65 72 61 74 65 64 20 62 79 20 2d 2d 69  generated by --i
f710: 6e 69 74 27 29 3b 5c 6e 22 0a 20 20 20 20 22 49  nit');\n".    "I
f720: 4e 53 45 52 54 20 49 4e 54 4f 20 5b 5f 73 68 65  NSERT INTO [_she
f730: 6c 6c 24 73 65 6c 66 5d 5c 6e 22 0a 20 20 20 20  ll$self]\n".    
f740: 22 20 20 53 45 4c 45 43 54 20 27 72 75 6e 27 2c  "  SELECT 'run',
f750: 5c 6e 22 0a 20 20 20 20 22 20 20 20 20 27 53 45  \n".    "    'SE
f760: 4c 45 43 54 20 68 65 78 28 73 68 61 33 5f 71 75  LECT hex(sha3_qu
f770: 65 72 79 28 27 27 53 45 4c 45 43 54 20 74 79 70  ery(''SELECT typ
f780: 65 2c 6e 61 6d 65 2c 74 62 6c 5f 6e 61 6d 65 2c  e,name,tbl_name,
f790: 73 71 6c 20 22 0a 20 20 20 20 20 20 20 20 20 20  sql ".          
f7a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f7b0: 20 20 20 20 20 20 20 22 46 52 4f 4d 20 73 71 6c         "FROM sql
f7c0: 69 74 65 5f 6d 61 73 74 65 72 20 4f 52 44 45 52  ite_master ORDER
f7d0: 20 42 59 20 32 27 27 2c 32 32 34 29 29 27 2c 5c   BY 2'',224))',\
f7e0: 6e 22 0a 20 20 20 20 22 20 20 20 20 68 65 78 28  n".    "    hex(
f7f0: 73 68 61 33 5f 71 75 65 72 79 28 27 53 45 4c 45  sha3_query('SELE
f800: 43 54 20 74 79 70 65 2c 6e 61 6d 65 2c 74 62 6c  CT type,name,tbl
f810: 5f 6e 61 6d 65 2c 73 71 6c 20 22 0a 20 20 20 20  _name,sql ".    
f820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f830: 20 20 20 20 20 20 22 46 52 4f 4d 20 73 71 6c 69        "FROM sqli
f840: 74 65 5f 6d 61 73 74 65 72 20 4f 52 44 45 52 20  te_master ORDER 
f850: 42 59 20 32 27 2c 32 32 34 29 29 3b 5c 6e 22 0a  BY 2',224));\n".
f860: 20 20 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f      "INSERT INTO
f870: 20 5b 5f 73 68 65 6c 6c 24 73 65 6c 66 5d 5c 6e   [_shell$self]\n
f880: 22 0a 20 20 20 20 22 20 20 53 45 4c 45 43 54 20  ".    "  SELECT 
f890: 27 72 75 6e 27 2c 22 0a 20 20 20 20 22 20 20 20  'run',".    "   
f8a0: 20 27 53 45 4c 45 43 54 20 68 65 78 28 73 68 61   'SELECT hex(sha
f8b0: 33 5f 71 75 65 72 79 28 27 27 53 45 4c 45 43 54  3_query(''SELECT
f8c0: 20 2a 20 46 52 4f 4d 20 5c 22 27 20 7c 7c 22 0a   * FROM \"' ||".
f8d0: 20 20 20 20 22 20 20 20 20 20 20 20 20 70 72 69      "        pri
f8e0: 6e 74 66 28 27 25 77 27 2c 6e 61 6d 65 29 20 7c  ntf('%w',name) |
f8f0: 7c 20 27 5c 22 20 4e 4f 54 20 49 4e 44 45 58 45  | '\" NOT INDEXE
f900: 44 27 27 2c 32 32 34 29 29 27 2c 5c 6e 22 0a 20  D'',224))',\n". 
f910: 20 20 20 22 20 20 20 20 68 65 78 28 73 68 61 33     "    hex(sha3
f920: 5f 71 75 65 72 79 28 70 72 69 6e 74 66 28 27 53  _query(printf('S
f930: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 5c 22 25  ELECT * FROM \"%
f940: 77 5c 22 20 4e 4f 54 20 49 4e 44 45 58 45 44 27  w\" NOT INDEXED'
f950: 2c 6e 61 6d 65 29 2c 32 32 34 29 29 5c 6e 22 0a  ,name),224))\n".
f960: 20 20 20 20 22 20 20 46 52 4f 4d 20 28 5c 6e 22      "  FROM (\n"
f970: 0a 20 20 20 20 22 20 20 20 20 53 45 4c 45 43 54  .    "    SELECT
f980: 20 6e 61 6d 65 20 46 52 4f 4d 20 73 71 6c 69 74   name FROM sqlit
f990: 65 5f 6d 61 73 74 65 72 5c 6e 22 0a 20 20 20 20  e_master\n".    
f9a0: 22 20 20 20 20 20 57 48 45 52 45 20 74 79 70 65  "     WHERE type
f9b0: 3d 27 74 61 62 6c 65 27 5c 6e 22 0a 20 20 20 20  ='table'\n".    
f9c0: 22 20 20 20 20 20 20 20 41 4e 44 20 6e 61 6d 65  "       AND name
f9d0: 3c 3e 27 73 65 6c 66 74 65 73 74 27 5c 6e 22 0a  <>'selftest'\n".
f9e0: 20 20 20 20 22 20 20 20 20 20 20 20 41 4e 44 20      "       AND 
f9f0: 63 6f 61 6c 65 73 63 65 28 72 6f 6f 74 70 61 67  coalesce(rootpag
fa00: 65 2c 30 29 3e 30 5c 6e 22 0a 20 20 20 20 22 20  e,0)>0\n".    " 
fa10: 20 29 5c 6e 22 0a 20 20 20 20 22 20 4f 52 44 45   )\n".    " ORDE
fa20: 52 20 42 59 20 6e 61 6d 65 3b 5c 6e 22 0a 20 20  R BY name;\n".  
fa30: 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 5b    "INSERT INTO [
fa40: 5f 73 68 65 6c 6c 24 73 65 6c 66 5d 5c 6e 22 0a  _shell$self]\n".
fa50: 20 20 20 20 22 20 20 56 41 4c 55 45 53 28 27 72      "  VALUES('r
fa60: 75 6e 27 2c 27 50 52 41 47 4d 41 20 69 6e 74 65  un','PRAGMA inte
fa70: 67 72 69 74 79 5f 63 68 65 63 6b 27 2c 27 6f 6b  grity_check','ok
fa80: 27 29 3b 5c 6e 22 0a 20 20 20 20 22 49 4e 53 45  ');\n".    "INSE
fa90: 52 54 20 49 4e 54 4f 20 73 65 6c 66 74 65 73 74  RT INTO selftest
faa0: 28 74 6e 6f 2c 6f 70 2c 63 6d 64 2c 61 6e 73 29  (tno,op,cmd,ans)
fab0: 22 0a 20 20 20 20 22 20 20 53 45 4c 45 43 54 20  ".    "  SELECT 
fac0: 72 6f 77 69 64 2a 31 30 2c 6f 70 2c 63 6d 64 2c  rowid*10,op,cmd,
fad0: 61 6e 73 20 46 52 4f 4d 20 5b 5f 73 68 65 6c 6c  ans FROM [_shell
fae0: 24 73 65 6c 66 5d 3b 5c 6e 22 0a 20 20 20 20 22  $self];\n".    "
faf0: 44 52 4f 50 20 54 41 42 4c 45 20 5b 5f 73 68 65  DROP TABLE [_she
fb00: 6c 6c 24 73 65 6c 66 5d 3b 22 0a 20 20 20 20 2c  ll$self];".    ,
fb10: 30 2c 30 2c 26 7a 45 72 72 4d 73 67 29 3b 0a 20  0,0,&zErrMsg);. 
fb20: 20 69 66 28 20 7a 45 72 72 4d 73 67 20 29 7b 0a   if( zErrMsg ){.
fb30: 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
fb40: 73 74 64 65 72 72 2c 20 22 53 45 4c 46 54 45 53  stderr, "SELFTES
fb50: 54 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e  T initialization
fb60: 20 66 61 69 6c 75 72 65 3a 20 25 73 5c 6e 22 2c   failure: %s\n",
fb70: 20 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 73   zErrMsg);.    s
fb80: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 45 72 72  qlite3_free(zErr
fb90: 4d 73 67 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  Msg);.  }.  sqli
fba0: 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20  te3_exec(p->db, 
fbb0: 22 52 45 4c 45 41 53 45 20 73 65 6c 66 74 65 73  "RELEASE selftes
fbc0: 74 5f 69 6e 69 74 22 2c 30 2c 30 2c 30 29 3b 0a  t_init",0,0,0);.
fbd0: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  }.../*.** Set th
fbe0: 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 74 61  e destination ta
fbf0: 62 6c 65 20 66 69 65 6c 64 20 6f 66 20 74 68 65  ble field of the
fc00: 20 53 68 65 6c 6c 53 74 61 74 65 20 73 74 72 75   ShellState stru
fc10: 63 74 75 72 65 20 74 6f 0a 2a 2a 20 74 68 65 20  cture to.** the 
fc20: 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c  name of the tabl
fc30: 65 20 67 69 76 65 6e 2e 20 20 45 73 63 61 70 65  e given.  Escape
fc40: 20 61 6e 79 20 71 75 6f 74 65 20 63 68 61 72 61   any quote chara
fc50: 63 74 65 72 73 20 69 6e 20 74 68 65 0a 2a 2a 20  cters in the.** 
fc60: 74 61 62 6c 65 20 6e 61 6d 65 2e 0a 2a 2f 0a 73  table name..*/.s
fc70: 74 61 74 69 63 20 76 6f 69 64 20 73 65 74 5f 74  tatic void set_t
fc80: 61 62 6c 65 5f 6e 61 6d 65 28 53 68 65 6c 6c 53  able_name(ShellS
fc90: 74 61 74 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63  tate *p, const c
fca0: 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69  har *zName){.  i
fcb0: 6e 74 20 69 2c 20 6e 3b 0a 20 20 63 68 61 72 20  nt i, n;.  char 
fcc0: 63 51 75 6f 74 65 3b 0a 20 20 63 68 61 72 20 2a  cQuote;.  char *
fcd0: 7a 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 7a 44 65  z;..  if( p->zDe
fce0: 73 74 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 66  stTable ){.    f
fcf0: 72 65 65 28 70 2d 3e 7a 44 65 73 74 54 61 62 6c  ree(p->zDestTabl
fd00: 65 29 3b 0a 20 20 20 20 70 2d 3e 7a 44 65 73 74  e);.    p->zDest
fd10: 54 61 62 6c 65 20 3d 20 30 3b 0a 20 20 7d 0a 20  Table = 0;.  }. 
fd20: 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20   if( zName==0 ) 
fd30: 72 65 74 75 72 6e 3b 0a 20 20 63 51 75 6f 74 65  return;.  cQuote
fd40: 20 3d 20 71 75 6f 74 65 43 68 61 72 28 7a 4e 61   = quoteChar(zNa
fd50: 6d 65 29 3b 0a 20 20 6e 20 3d 20 73 74 72 6c 65  me);.  n = strle
fd60: 6e 33 30 28 7a 4e 61 6d 65 29 3b 0a 20 20 69 66  n30(zName);.  if
fd70: 28 20 63 51 75 6f 74 65 20 29 20 6e 20 2b 3d 20  ( cQuote ) n += 
fd80: 6e 2b 32 3b 0a 20 20 7a 20 3d 20 70 2d 3e 7a 44  n+2;.  z = p->zD
fd90: 65 73 74 54 61 62 6c 65 20 3d 20 6d 61 6c 6c 6f  estTable = mallo
fda0: 63 28 20 6e 2b 31 20 29 3b 0a 20 20 69 66 28 20  c( n+1 );.  if( 
fdb0: 7a 3d 3d 30 20 29 20 73 68 65 6c 6c 5f 6f 75 74  z==0 ) shell_out
fdc0: 5f 6f 66 5f 6d 65 6d 6f 72 79 28 29 3b 0a 20 20  _of_memory();.  
fdd0: 6e 20 3d 20 30 3b 0a 20 20 69 66 28 20 63 51 75  n = 0;.  if( cQu
fde0: 6f 74 65 20 29 20 7a 5b 6e 2b 2b 5d 20 3d 20 63  ote ) z[n++] = c
fdf0: 51 75 6f 74 65 3b 0a 20 20 66 6f 72 28 69 3d 30  Quote;.  for(i=0
fe00: 3b 20 7a 4e 61 6d 65 5b 69 5d 3b 20 69 2b 2b 29  ; zName[i]; i++)
fe10: 7b 0a 20 20 20 20 7a 5b 6e 2b 2b 5d 20 3d 20 7a  {.    z[n++] = z
fe20: 4e 61 6d 65 5b 69 5d 3b 0a 20 20 20 20 69 66 28  Name[i];.    if(
fe30: 20 7a 4e 61 6d 65 5b 69 5d 3d 3d 63 51 75 6f 74   zName[i]==cQuot
fe40: 65 20 29 20 7a 5b 6e 2b 2b 5d 20 3d 20 63 51 75  e ) z[n++] = cQu
fe50: 6f 74 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 63  ote;.  }.  if( c
fe60: 51 75 6f 74 65 20 29 20 7a 5b 6e 2b 2b 5d 20 3d  Quote ) z[n++] =
fe70: 20 63 51 75 6f 74 65 3b 0a 20 20 7a 5b 6e 5d 20   cQuote;.  z[n] 
fe80: 3d 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 45  = 0;.}.../*.** E
fe90: 78 65 63 75 74 65 20 61 20 71 75 65 72 79 20 73  xecute a query s
fea0: 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20 77 69  tatement that wi
feb0: 6c 6c 20 67 65 6e 65 72 61 74 65 20 53 51 4c 20  ll generate SQL 
fec0: 6f 75 74 70 75 74 2e 20 20 50 72 69 6e 74 0a 2a  output.  Print.*
fed0: 2a 20 74 68 65 20 72 65 73 75 6c 74 20 63 6f 6c  * the result col
fee0: 75 6d 6e 73 2c 20 63 6f 6d 6d 61 2d 73 65 70 61  umns, comma-sepa
fef0: 72 61 74 65 64 2c 20 6f 6e 20 61 20 6c 69 6e 65  rated, on a line
ff00: 20 61 6e 64 20 74 68 65 6e 20 61 64 64 20 61 0a   and then add a.
ff10: 2a 2a 20 73 65 6d 69 63 6f 6c 6f 6e 20 74 65 72  ** semicolon ter
ff20: 6d 69 6e 61 74 6f 72 20 74 6f 20 74 68 65 20 65  minator to the e
ff30: 6e 64 20 6f 66 20 74 68 61 74 20 6c 69 6e 65 2e  nd of that line.
ff40: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 75  .**.** If the nu
ff50: 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
ff60: 69 73 20 31 20 61 6e 64 20 74 68 61 74 20 63 6f  is 1 and that co
ff70: 6c 75 6d 6e 20 63 6f 6e 74 61 69 6e 73 20 74 65  lumn contains te
ff80: 78 74 20 22 2d 2d 22 0a 2a 2a 20 74 68 65 6e 20  xt "--".** then 
ff90: 77 72 69 74 65 20 74 68 65 20 73 65 6d 69 63 6f  write the semico
ffa0: 6c 6f 6e 20 6f 6e 20 61 20 73 65 70 61 72 61 74  lon on a separat
ffb0: 65 20 6c 69 6e 65 2e 20 20 54 68 61 74 20 77 61  e line.  That wa
ffc0: 79 2c 20 69 66 20 61 0a 2a 2a 20 22 2d 2d 22 20  y, if a.** "--" 
ffd0: 63 6f 6d 6d 65 6e 74 20 6f 63 63 75 72 73 20 61  comment occurs a
ffe0: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
fff0: 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 20   statement, the 
10000 63 6f 6d 6d 65 6e 74 0a 2a 2a 20 77 6f 6e 27 74  comment.** won't
10010 20 63 6f 6e 73 75 6d 65 20 74 68 65 20 73 65 6d   consume the sem
10020 69 63 6f 6c 6f 6e 20 74 65 72 6d 69 6e 61 74 6f  icolon terminato
10030 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
10040 20 72 75 6e 5f 74 61 62 6c 65 5f 64 75 6d 70 5f   run_table_dump_
10050 71 75 65 72 79 28 0a 20 20 53 68 65 6c 6c 53 74  query(.  ShellSt
10060 61 74 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ate *p,         
10070 20 20 2f 2a 20 51 75 65 72 79 20 63 6f 6e 74 65    /* Query conte
10080 78 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  xt */.  const ch
10090 61 72 20 2a 7a 53 65 6c 65 63 74 2c 20 20 20 20  ar *zSelect,    
100a0 20 2f 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65   /* SELECT state
100b0 6d 65 6e 74 20 74 6f 20 65 78 74 72 61 63 74 20  ment to extract 
100c0 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 63 6f 6e  content */.  con
100d0 73 74 20 63 68 61 72 20 2a 7a 46 69 72 73 74 52  st char *zFirstR
100e0 6f 77 20 20 20 20 2f 2a 20 50 72 69 6e 74 20 62  ow    /* Print b
100f0 65 66 6f 72 65 20 66 69 72 73 74 20 72 6f 77 2c  efore first row,
10100 20 69 66 20 6e 6f 74 20 4e 55 4c 4c 20 2a 2f 0a   if not NULL */.
10110 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  ){.  sqlite3_stm
10120 74 20 2a 70 53 65 6c 65 63 74 3b 0a 20 20 69 6e  t *pSelect;.  in
10130 74 20 72 63 3b 0a 20 20 69 6e 74 20 6e 52 65 73  t rc;.  int nRes
10140 75 6c 74 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  ult;.  int i;.  
10150 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20  const char *z;. 
10160 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72   rc = sqlite3_pr
10170 65 70 61 72 65 5f 76 32 28 70 2d 3e 64 62 2c 20  epare_v2(p->db, 
10180 7a 53 65 6c 65 63 74 2c 20 2d 31 2c 20 26 70 53  zSelect, -1, &pS
10190 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20 69 66 28  elect, 0);.  if(
101a0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
101b0 7c 20 21 70 53 65 6c 65 63 74 20 29 7b 0a 20 20  | !pSelect ){.  
101c0 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d    utf8_printf(p-
101d0 3e 6f 75 74 2c 20 22 2f 2a 2a 2a 2a 20 45 52 52  >out, "/**** ERR
101e0 4f 52 3a 20 28 25 64 29 20 25 73 20 2a 2a 2a 2a  OR: (%d) %s ****
101f0 2a 2f 5c 6e 22 2c 20 72 63 2c 0a 20 20 20 20 20  */\n", rc,.     
10200 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
10210 65 33 5f 65 72 72 6d 73 67 28 70 2d 3e 64 62 29  e3_errmsg(p->db)
10220 29 3b 0a 20 20 20 20 69 66 28 20 28 72 63 26 30  );.    if( (rc&0
10230 78 66 66 29 21 3d 53 51 4c 49 54 45 5f 43 4f 52  xff)!=SQLITE_COR
10240 52 55 50 54 20 29 20 70 2d 3e 6e 45 72 72 2b 2b  RUPT ) p->nErr++
10250 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  ;.    return rc;
10260 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69  .  }.  rc = sqli
10270 74 65 33 5f 73 74 65 70 28 70 53 65 6c 65 63 74  te3_step(pSelect
10280 29 3b 0a 20 20 6e 52 65 73 75 6c 74 20 3d 20 73  );.  nResult = s
10290 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f  qlite3_column_co
102a0 75 6e 74 28 70 53 65 6c 65 63 74 29 3b 0a 20 20  unt(pSelect);.  
102b0 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54  while( rc==SQLIT
102c0 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 69 66 28  E_ROW ){.    if(
102d0 20 7a 46 69 72 73 74 52 6f 77 20 29 7b 0a 20 20   zFirstRow ){.  
102e0 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
102f0 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20 7a 46  p->out, "%s", zF
10300 69 72 73 74 52 6f 77 29 3b 0a 20 20 20 20 20 20  irstRow);.      
10310 7a 46 69 72 73 74 52 6f 77 20 3d 20 30 3b 0a 20  zFirstRow = 0;. 
10320 20 20 20 7d 0a 20 20 20 20 7a 20 3d 20 28 63 6f     }.    z = (co
10330 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65  nst char*)sqlite
10340 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53  3_column_text(pS
10350 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20 20 20 75  elect, 0);.    u
10360 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  tf8_printf(p->ou
10370 74 2c 20 22 25 73 22 2c 20 7a 29 3b 0a 20 20 20  t, "%s", z);.   
10380 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 52 65 73   for(i=1; i<nRes
10390 75 6c 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  ult; i++){.     
103a0 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e   utf8_printf(p->
103b0 6f 75 74 2c 20 22 2c 25 73 22 2c 20 73 71 6c 69  out, ",%s", sqli
103c0 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28  te3_column_text(
103d0 70 53 65 6c 65 63 74 2c 20 69 29 29 3b 0a 20 20  pSelect, i));.  
103e0 20 20 7d 0a 20 20 20 20 69 66 28 20 7a 3d 3d 30    }.    if( z==0
103f0 20 29 20 7a 20 3d 20 22 22 3b 0a 20 20 20 20 77   ) z = "";.    w
10400 68 69 6c 65 28 20 7a 5b 30 5d 20 26 26 20 28 7a  hile( z[0] && (z
10410 5b 30 5d 21 3d 27 2d 27 20 7c 7c 20 7a 5b 31 5d  [0]!='-' || z[1]
10420 21 3d 27 2d 27 29 20 29 20 7a 2b 2b 3b 0a 20 20  !='-') ) z++;.  
10430 20 20 69 66 28 20 7a 5b 30 5d 20 29 7b 0a 20 20    if( z[0] ){.  
10440 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70      raw_printf(p
10450 2d 3e 6f 75 74 2c 20 22 5c 6e 3b 5c 6e 22 29 3b  ->out, "\n;\n");
10460 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
10470 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e    raw_printf(p->
10480 6f 75 74 2c 20 22 3b 5c 6e 22 29 3b 0a 20 20 20  out, ";\n");.   
10490 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69   }.    rc = sqli
104a0 74 65 33 5f 73 74 65 70 28 70 53 65 6c 65 63 74  te3_step(pSelect
104b0 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71  );.  }.  rc = sq
104c0 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
104d0 53 65 6c 65 63 74 29 3b 0a 20 20 69 66 28 20 72  Select);.  if( r
104e0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
104f0 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
10500 70 2d 3e 6f 75 74 2c 20 22 2f 2a 2a 2a 2a 20 45  p->out, "/**** E
10510 52 52 4f 52 3a 20 28 25 64 29 20 25 73 20 2a 2a  RROR: (%d) %s **
10520 2a 2a 2a 2f 5c 6e 22 2c 20 72 63 2c 0a 20 20 20  ***/\n", rc,.   
10530 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
10540 69 74 65 33 5f 65 72 72 6d 73 67 28 70 2d 3e 64  ite3_errmsg(p->d
10550 62 29 29 3b 0a 20 20 20 20 69 66 28 20 28 72 63  b));.    if( (rc
10560 26 30 78 66 66 29 21 3d 53 51 4c 49 54 45 5f 43  &0xff)!=SQLITE_C
10570 4f 52 52 55 50 54 20 29 20 70 2d 3e 6e 45 72 72  ORRUPT ) p->nErr
10580 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ++;.  }.  return
10590 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c   rc;.}../*.** Al
105a0 6c 6f 63 61 74 65 20 73 70 61 63 65 20 61 6e 64  locate space and
105b0 20 73 61 76 65 20 6f 66 66 20 63 75 72 72 65 6e   save off curren
105c0 74 20 65 72 72 6f 72 20 73 74 72 69 6e 67 2e 0a  t error string..
105d0 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a  */.static char *
105e0 73 61 76 65 5f 65 72 72 5f 6d 73 67 28 0a 20 20  save_err_msg(.  
105f0 73 71 6c 69 74 65 33 20 2a 64 62 20 20 20 20 20  sqlite3 *db     
10600 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
10610 73 65 20 74 6f 20 71 75 65 72 79 20 2a 2f 0a 29  se to query */.)
10620 7b 0a 20 20 69 6e 74 20 6e 45 72 72 4d 73 67 20  {.  int nErrMsg 
10630 3d 20 31 2b 73 74 72 6c 65 6e 33 30 28 73 71 6c  = 1+strlen30(sql
10640 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29 29  ite3_errmsg(db))
10650 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 4d 73  ;.  char *zErrMs
10660 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  g = sqlite3_mall
10670 6f 63 36 34 28 6e 45 72 72 4d 73 67 29 3b 0a 20  oc64(nErrMsg);. 
10680 20 69 66 28 20 7a 45 72 72 4d 73 67 20 29 7b 0a   if( zErrMsg ){.
10690 20 20 20 20 6d 65 6d 63 70 79 28 7a 45 72 72 4d      memcpy(zErrM
106a0 73 67 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d  sg, sqlite3_errm
106b0 73 67 28 64 62 29 2c 20 6e 45 72 72 4d 73 67 29  sg(db), nErrMsg)
106c0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a  ;.  }.  return z
106d0 45 72 72 4d 73 67 3b 0a 7d 0a 0a 23 69 66 64 65  ErrMsg;.}..#ifde
106e0 66 20 5f 5f 6c 69 6e 75 78 5f 5f 0a 2f 2a 0a 2a  f __linux__./*.*
106f0 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 64 69 73  * Attempt to dis
10700 70 6c 61 79 20 49 2f 4f 20 73 74 61 74 73 20 6f  play I/O stats o
10710 6e 20 4c 69 6e 75 78 20 75 73 69 6e 67 20 2f 70  n Linux using /p
10720 72 6f 63 2f 50 49 44 2f 69 6f 0a 2a 2f 0a 73 74  roc/PID/io.*/.st
10730 61 74 69 63 20 76 6f 69 64 20 64 69 73 70 6c 61  atic void displa
10740 79 4c 69 6e 75 78 49 6f 53 74 61 74 73 28 46 49  yLinuxIoStats(FI
10750 4c 45 20 2a 6f 75 74 29 7b 0a 20 20 46 49 4c 45  LE *out){.  FILE
10760 20 2a 69 6e 3b 0a 20 20 63 68 61 72 20 7a 5b 32   *in;.  char z[2
10770 30 30 5d 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73  00];.  sqlite3_s
10780 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a  nprintf(sizeof(z
10790 29 2c 20 7a 2c 20 22 2f 70 72 6f 63 2f 25 64 2f  ), z, "/proc/%d/
107a0 69 6f 22 2c 20 67 65 74 70 69 64 28 29 29 3b 0a  io", getpid());.
107b0 20 20 69 6e 20 3d 20 66 6f 70 65 6e 28 7a 2c 20    in = fopen(z, 
107c0 22 72 62 22 29 3b 0a 20 20 69 66 28 20 69 6e 3d  "rb");.  if( in=
107d0 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 77  =0 ) return;.  w
107e0 68 69 6c 65 28 20 66 67 65 74 73 28 7a 2c 20 73  hile( fgets(z, s
107f0 69 7a 65 6f 66 28 7a 29 2c 20 69 6e 29 21 3d 30  izeof(z), in)!=0
10800 20 29 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63   ){.    static c
10810 6f 6e 73 74 20 73 74 72 75 63 74 20 7b 0a 20 20  onst struct {.  
10820 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
10830 7a 50 61 74 74 65 72 6e 3b 0a 20 20 20 20 20 20  zPattern;.      
10840 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 65 73  const char *zDes
10850 63 3b 0a 20 20 20 20 7d 20 61 54 72 61 6e 73 5b  c;.    } aTrans[
10860 5d 20 3d 20 7b 0a 20 20 20 20 20 20 7b 20 22 72  ] = {.      { "r
10870 63 68 61 72 3a 20 22 2c 20 20 20 20 20 20 20 20  char: ",        
10880 20 20 20 20 20 20 20 20 20 20 22 42 79 74 65 73            "Bytes
10890 20 72 65 63 65 69 76 65 64 20 62 79 20 72 65 61   received by rea
108a0 64 28 29 3a 22 20 7d 2c 0a 20 20 20 20 20 20 7b  d():" },.      {
108b0 20 22 77 63 68 61 72 3a 20 22 2c 20 20 20 20 20   "wchar: ",     
108c0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 42 79               "By
108d0 74 65 73 20 73 65 6e 74 20 74 6f 20 77 72 69 74  tes sent to writ
108e0 65 28 29 3a 22 20 20 20 20 7d 2c 0a 20 20 20 20  e():"    },.    
108f0 20 20 7b 20 22 73 79 73 63 72 3a 20 22 2c 20 20    { "syscr: ",  
10900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10910 22 52 65 61 64 28 29 20 73 79 73 74 65 6d 20 63  "Read() system c
10920 61 6c 6c 73 3a 22 20 20 20 20 20 20 7d 2c 0a 20  alls:"      },. 
10930 20 20 20 20 20 7b 20 22 73 79 73 63 77 3a 20 22       { "syscw: "
10940 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
10950 20 20 20 22 57 72 69 74 65 28 29 20 73 79 73 74     "Write() syst
10960 65 6d 20 63 61 6c 6c 73 3a 22 20 20 20 20 20 7d  em calls:"     }
10970 2c 0a 20 20 20 20 20 20 7b 20 22 72 65 61 64 5f  ,.      { "read_
10980 62 79 74 65 73 3a 20 22 2c 20 20 20 20 20 20 20  bytes: ",       
10990 20 20 20 20 20 20 22 42 79 74 65 73 20 72 65 61        "Bytes rea
109a0 64 20 66 72 6f 6d 20 73 74 6f 72 61 67 65 3a 22  d from storage:"
109b0 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 77 72    },.      { "wr
109c0 69 74 65 5f 62 79 74 65 73 3a 20 22 2c 20 20 20  ite_bytes: ",   
109d0 20 20 20 20 20 20 20 20 20 22 42 79 74 65 73 20           "Bytes 
109e0 77 72 69 74 74 65 6e 20 74 6f 20 73 74 6f 72 61  written to stora
109f0 67 65 3a 22 20 7d 2c 0a 20 20 20 20 20 20 7b 20  ge:" },.      { 
10a00 22 63 61 6e 63 65 6c 6c 65 64 5f 77 72 69 74 65  "cancelled_write
10a10 5f 62 79 74 65 73 3a 20 22 2c 20 20 22 43 61 6e  _bytes: ",  "Can
10a20 63 65 6c 6c 65 64 20 77 72 69 74 65 20 62 79 74  celled write byt
10a30 65 73 3a 22 20 20 20 20 7d 2c 0a 20 20 20 20 7d  es:"    },.    }
10a40 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  ;.    int i;.   
10a50 20 66 6f 72 28 69 3d 30 3b 20 69 3c 41 72 72 61   for(i=0; i<Arra
10a60 79 53 69 7a 65 28 61 54 72 61 6e 73 29 3b 20 69  ySize(aTrans); i
10a70 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  ++){.      int n
10a80 20 3d 20 73 74 72 6c 65 6e 33 30 28 61 54 72 61   = strlen30(aTra
10a90 6e 73 5b 69 5d 2e 7a 50 61 74 74 65 72 6e 29 3b  ns[i].zPattern);
10aa0 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 6e 63  .      if( strnc
10ab0 6d 70 28 61 54 72 61 6e 73 5b 69 5d 2e 7a 50 61  mp(aTrans[i].zPa
10ac0 74 74 65 72 6e 2c 20 7a 2c 20 6e 29 3d 3d 30 20  ttern, z, n)==0 
10ad0 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f  ){.        utf8_
10ae0 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 2d 33  printf(out, "%-3
10af0 36 73 20 25 73 22 2c 20 61 54 72 61 6e 73 5b 69  6s %s", aTrans[i
10b00 5d 2e 7a 44 65 73 63 2c 20 26 7a 5b 6e 5d 29 3b  ].zDesc, &z[n]);
10b10 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
10b20 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
10b30 7d 0a 20 20 66 63 6c 6f 73 65 28 69 6e 29 3b 0a  }.  fclose(in);.
10b40 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
10b50 44 69 73 70 6c 61 79 20 61 20 73 69 6e 67 6c 65  Display a single
10b60 20 6c 69 6e 65 20 6f 66 20 73 74 61 74 75 73 20   line of status 
10b70 75 73 69 6e 67 20 36 34 2d 62 69 74 20 76 61 6c  using 64-bit val
10b80 75 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ues..*/.static v
10b90 6f 69 64 20 64 69 73 70 6c 61 79 53 74 61 74 4c  oid displayStatL
10ba0 69 6e 65 28 0a 20 20 53 68 65 6c 6c 53 74 61 74  ine(.  ShellStat
10bb0 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  e *p,           
10bc0 20 2f 2a 20 54 68 65 20 73 68 65 6c 6c 20 63 6f   /* The shell co
10bd0 6e 74 65 78 74 20 2a 2f 0a 20 20 63 68 61 72 20  ntext */.  char 
10be0 2a 7a 4c 61 62 65 6c 2c 20 20 20 20 20 20 20 20  *zLabel,        
10bf0 20 20 20 20 20 2f 2a 20 4c 61 62 65 6c 20 66 6f       /* Label fo
10c00 72 20 74 68 69 73 20 6f 6e 65 20 6c 69 6e 65 20  r this one line 
10c10 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 46 6f 72 6d  */.  char *zForm
10c20 61 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  at,            /
10c30 2a 20 46 6f 72 6d 61 74 20 66 6f 72 20 74 68 65  * Format for the
10c40 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20 69 6e 74   result */.  int
10c50 20 69 53 74 61 74 75 73 43 74 72 6c 2c 20 20 20   iStatusCtrl,   
10c60 20 20 20 20 20 20 20 2f 2a 20 57 68 69 63 68 20         /* Which 
10c70 73 74 61 74 75 73 20 74 6f 20 64 69 73 70 6c 61  status to displa
10c80 79 20 2a 2f 0a 20 20 69 6e 74 20 62 52 65 73 65  y */.  int bRese
10c90 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
10ca0 20 2f 2a 20 54 72 75 65 20 74 6f 20 72 65 73 65   /* True to rese
10cb0 74 20 74 68 65 20 73 74 61 74 73 20 2a 2f 0a 29  t the stats */.)
10cc0 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  {.  sqlite3_int6
10cd0 34 20 69 43 75 72 20 3d 20 2d 31 3b 0a 20 20 73  4 iCur = -1;.  s
10ce0 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 48 69  qlite3_int64 iHi
10cf0 77 74 72 20 3d 20 2d 31 3b 0a 20 20 69 6e 74 20  wtr = -1;.  int 
10d00 69 2c 20 6e 50 65 72 63 65 6e 74 3b 0a 20 20 63  i, nPercent;.  c
10d10 68 61 72 20 7a 4c 69 6e 65 5b 32 30 30 5d 3b 0a  har zLine[200];.
10d20 20 20 73 71 6c 69 74 65 33 5f 73 74 61 74 75 73    sqlite3_status
10d30 36 34 28 69 53 74 61 74 75 73 43 74 72 6c 2c 20  64(iStatusCtrl, 
10d40 26 69 43 75 72 2c 20 26 69 48 69 77 74 72 2c 20  &iCur, &iHiwtr, 
10d50 62 52 65 73 65 74 29 3b 0a 20 20 66 6f 72 28 69  bReset);.  for(i
10d60 3d 30 2c 20 6e 50 65 72 63 65 6e 74 3d 30 3b 20  =0, nPercent=0; 
10d70 7a 46 6f 72 6d 61 74 5b 69 5d 3b 20 69 2b 2b 29  zFormat[i]; i++)
10d80 7b 0a 20 20 20 20 69 66 28 20 7a 46 6f 72 6d 61  {.    if( zForma
10d90 74 5b 69 5d 3d 3d 27 25 27 20 29 20 6e 50 65 72  t[i]=='%' ) nPer
10da0 63 65 6e 74 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66  cent++;.  }.  if
10db0 28 20 6e 50 65 72 63 65 6e 74 3e 31 20 29 7b 0a  ( nPercent>1 ){.
10dc0 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
10dd0 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 4c 69 6e  intf(sizeof(zLin
10de0 65 29 2c 20 7a 4c 69 6e 65 2c 20 7a 46 6f 72 6d  e), zLine, zForm
10df0 61 74 2c 20 69 43 75 72 2c 20 69 48 69 77 74 72  at, iCur, iHiwtr
10e00 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
10e10 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
10e20 28 73 69 7a 65 6f 66 28 7a 4c 69 6e 65 29 2c 20  (sizeof(zLine), 
10e30 7a 4c 69 6e 65 2c 20 7a 46 6f 72 6d 61 74 2c 20  zLine, zFormat, 
10e40 69 48 69 77 74 72 29 3b 0a 20 20 7d 0a 20 20 72  iHiwtr);.  }.  r
10e50 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  aw_printf(p->out
10e60 2c 20 22 25 2d 33 36 73 20 25 73 5c 6e 22 2c 20  , "%-36s %s\n", 
10e70 7a 4c 61 62 65 6c 2c 20 7a 4c 69 6e 65 29 3b 0a  zLabel, zLine);.
10e80 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 70 6c 61 79  }../*.** Display
10e90 20 6d 65 6d 6f 72 79 20 73 74 61 74 73 2e 0a 2a   memory stats..*
10ea0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 69 73  /.static int dis
10eb0 70 6c 61 79 5f 73 74 61 74 73 28 0a 20 20 73 71  play_stats(.  sq
10ec0 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20  lite3 *db,      
10ed0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
10ee0 61 62 61 73 65 20 74 6f 20 71 75 65 72 79 20 2a  abase to query *
10ef0 2f 0a 20 20 53 68 65 6c 6c 53 74 61 74 65 20 2a  /.  ShellState *
10f00 70 41 72 67 2c 20 20 20 20 20 20 20 20 20 20 20  pArg,           
10f10 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 53 68  /* Pointer to Sh
10f20 65 6c 6c 53 74 61 74 65 20 2a 2f 0a 20 20 69 6e  ellState */.  in
10f30 74 20 62 52 65 73 65 74 20 20 20 20 20 20 20 20  t bReset        
10f40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
10f50 65 20 74 6f 20 72 65 73 65 74 20 74 68 65 20 73  e to reset the s
10f60 74 61 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  tats */.){.  int
10f70 20 69 43 75 72 3b 0a 20 20 69 6e 74 20 69 48 69   iCur;.  int iHi
10f80 77 74 72 3b 0a 20 20 46 49 4c 45 20 2a 6f 75 74  wtr;.  FILE *out
10f90 3b 0a 20 20 69 66 28 20 70 41 72 67 3d 3d 30 20  ;.  if( pArg==0 
10fa0 7c 7c 20 70 41 72 67 2d 3e 6f 75 74 3d 3d 30 20  || pArg->out==0 
10fb0 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 6f 75  ) return 0;.  ou
10fc0 74 20 3d 20 70 41 72 67 2d 3e 6f 75 74 3b 0a 0a  t = pArg->out;..
10fd0 20 20 69 66 28 20 70 41 72 67 2d 3e 70 53 74 6d    if( pArg->pStm
10fe0 74 20 26 26 20 28 70 41 72 67 2d 3e 73 74 61 74  t && (pArg->stat
10ff0 73 4f 6e 20 26 20 32 29 20 29 7b 0a 20 20 20 20  sOn & 2) ){.    
11000 69 6e 74 20 6e 43 6f 6c 2c 20 69 2c 20 78 3b 0a  int nCol, i, x;.
11010 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74      sqlite3_stmt
11020 20 2a 70 53 74 6d 74 20 3d 20 70 41 72 67 2d 3e   *pStmt = pArg->
11030 70 53 74 6d 74 3b 0a 20 20 20 20 63 68 61 72 20  pStmt;.    char 
11040 7a 5b 31 30 30 5d 3b 0a 20 20 20 20 6e 43 6f 6c  z[100];.    nCol
11050 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
11060 6e 5f 63 6f 75 6e 74 28 70 53 74 6d 74 29 3b 0a  n_count(pStmt);.
11070 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f      raw_printf(o
11080 75 74 2c 20 22 25 2d 33 36 73 20 25 64 5c 6e 22  ut, "%-36s %d\n"
11090 2c 20 22 4e 75 6d 62 65 72 20 6f 66 20 6f 75 74  , "Number of out
110a0 70 75 74 20 63 6f 6c 75 6d 6e 73 3a 22 2c 20 6e  put columns:", n
110b0 43 6f 6c 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  Col);.    for(i=
110c0 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b  0; i<nCol; i++){
110d0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
110e0 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a  nprintf(sizeof(z
110f0 29 2c 7a 2c 22 43 6f 6c 75 6d 6e 20 25 64 20 25  ),z,"Column %d %
11100 6e 6e 61 6d 65 3a 22 2c 20 69 2c 20 26 78 29 3b  nname:", i, &x);
11110 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e  .      utf8_prin
11120 74 66 28 6f 75 74 2c 20 22 25 2d 33 36 73 20 25  tf(out, "%-36s %
11130 73 5c 6e 22 2c 20 7a 2c 20 73 71 6c 69 74 65 33  s\n", z, sqlite3
11140 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 28 70 53 74  _column_name(pSt
11150 6d 74 2c 69 29 29 3b 0a 23 69 66 6e 64 65 66 20  mt,i));.#ifndef 
11160 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 43 4c  SQLITE_OMIT_DECL
11170 54 59 50 45 0a 20 20 20 20 20 20 73 71 6c 69 74  TYPE.      sqlit
11180 65 33 5f 73 6e 70 72 69 6e 74 66 28 33 30 2c 20  e3_snprintf(30, 
11190 7a 2b 78 2c 20 22 64 65 63 6c 61 72 65 64 20 74  z+x, "declared t
111a0 79 70 65 3a 22 29 3b 0a 20 20 20 20 20 20 75 74  ype:");.      ut
111b0 66 38 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22  f8_printf(out, "
111c0 25 2d 33 36 73 20 25 73 5c 6e 22 2c 20 7a 2c 20  %-36s %s\n", z, 
111d0 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64  sqlite3_column_d
111e0 65 63 6c 74 79 70 65 28 70 53 74 6d 74 2c 20 69  ecltype(pStmt, i
111f0 29 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64 65  ));.#endif.#ifde
11200 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
11210 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 0a  COLUMN_METADATA.
11220 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
11230 70 72 69 6e 74 66 28 33 30 2c 20 7a 2b 78 2c 20  printf(30, z+x, 
11240 22 64 61 74 61 62 61 73 65 20 6e 61 6d 65 3a 22  "database name:"
11250 29 3b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72  );.      utf8_pr
11260 69 6e 74 66 28 6f 75 74 2c 20 22 25 2d 33 36 73  intf(out, "%-36s
11270 20 25 73 5c 6e 22 2c 20 7a 2c 20 73 71 6c 69 74   %s\n", z, sqlit
11280 65 33 5f 63 6f 6c 75 6d 6e 5f 64 61 74 61 62 61  e3_column_databa
11290 73 65 5f 6e 61 6d 65 28 70 53 74 6d 74 2c 69 29  se_name(pStmt,i)
112a0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
112b0 5f 73 6e 70 72 69 6e 74 66 28 33 30 2c 20 7a 2b  _snprintf(30, z+
112c0 78 2c 20 22 74 61 62 6c 65 20 6e 61 6d 65 3a 22  x, "table name:"
112d0 29 3b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72  );.      utf8_pr
112e0 69 6e 74 66 28 6f 75 74 2c 20 22 25 2d 33 36 73  intf(out, "%-36s
112f0 20 25 73 5c 6e 22 2c 20 7a 2c 20 73 71 6c 69 74   %s\n", z, sqlit
11300 65 33 5f 63 6f 6c 75 6d 6e 5f 74 61 62 6c 65 5f  e3_column_table_
11310 6e 61 6d 65 28 70 53 74 6d 74 2c 69 29 29 3b 0a  name(pStmt,i));.
11320 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
11330 70 72 69 6e 74 66 28 33 30 2c 20 7a 2b 78 2c 20  printf(30, z+x, 
11340 22 6f 72 69 67 69 6e 20 6e 61 6d 65 3a 22 29 3b  "origin name:");
11350 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e  .      utf8_prin
11360 74 66 28 6f 75 74 2c 20 22 25 2d 33 36 73 20 25  tf(out, "%-36s %
11370 73 5c 6e 22 2c 20 7a 2c 20 73 71 6c 69 74 65 33  s\n", z, sqlite3
11380 5f 63 6f 6c 75 6d 6e 5f 6f 72 69 67 69 6e 5f 6e  _column_origin_n
11390 61 6d 65 28 70 53 74 6d 74 2c 69 29 29 3b 0a 23  ame(pStmt,i));.#
113a0 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d 0a  endif.    }.  }.
113b0 0a 20 20 64 69 73 70 6c 61 79 53 74 61 74 4c 69  .  displayStatLi
113c0 6e 65 28 70 41 72 67 2c 20 22 4d 65 6d 6f 72 79  ne(pArg, "Memory
113d0 20 55 73 65 64 3a 22 2c 0a 20 20 20 20 20 22 25   Used:",.     "%
113e0 6c 6c 64 20 28 6d 61 78 20 25 6c 6c 64 29 20 62  lld (max %lld) b
113f0 79 74 65 73 22 2c 20 53 51 4c 49 54 45 5f 53 54  ytes", SQLITE_ST
11400 41 54 55 53 5f 4d 45 4d 4f 52 59 5f 55 53 45 44  ATUS_MEMORY_USED
11410 2c 20 62 52 65 73 65 74 29 3b 0a 20 20 64 69 73  , bReset);.  dis
11420 70 6c 61 79 53 74 61 74 4c 69 6e 65 28 70 41 72  playStatLine(pAr
11430 67 2c 20 22 4e 75 6d 62 65 72 20 6f 66 20 4f 75  g, "Number of Ou
11440 74 73 74 61 6e 64 69 6e 67 20 41 6c 6c 6f 63 61  tstanding Alloca
11450 74 69 6f 6e 73 3a 22 2c 0a 20 20 20 20 20 22 25  tions:",.     "%
11460 6c 6c 64 20 28 6d 61 78 20 25 6c 6c 64 29 22 2c  lld (max %lld)",
11470 20 53 51 4c 49 54 45 5f 53 54 41 54 55 53 5f 4d   SQLITE_STATUS_M
11480 41 4c 4c 4f 43 5f 43 4f 55 4e 54 2c 20 62 52 65  ALLOC_COUNT, bRe
11490 73 65 74 29 3b 0a 20 20 69 66 28 20 70 41 72 67  set);.  if( pArg
114a0 2d 3e 73 68 65 6c 6c 46 6c 67 73 20 26 20 53 48  ->shellFlgs & SH
114b0 46 4c 47 5f 50 61 67 65 63 61 63 68 65 20 29 7b  FLG_Pagecache ){
114c0 0a 20 20 20 20 64 69 73 70 6c 61 79 53 74 61 74  .    displayStat
114d0 4c 69 6e 65 28 70 41 72 67 2c 20 22 4e 75 6d 62  Line(pArg, "Numb
114e0 65 72 20 6f 66 20 50 63 61 63 68 65 20 50 61 67  er of Pcache Pag
114f0 65 73 20 55 73 65 64 3a 22 2c 0a 20 20 20 20 20  es Used:",.     
11500 20 20 22 25 6c 6c 64 20 28 6d 61 78 20 25 6c 6c    "%lld (max %ll
11510 64 29 20 70 61 67 65 73 22 2c 20 53 51 4c 49 54  d) pages", SQLIT
11520 45 5f 53 54 41 54 55 53 5f 50 41 47 45 43 41 43  E_STATUS_PAGECAC
11530 48 45 5f 55 53 45 44 2c 20 62 52 65 73 65 74 29  HE_USED, bReset)
11540 3b 0a 20 20 7d 0a 20 20 64 69 73 70 6c 61 79 53  ;.  }.  displayS
11550 74 61 74 4c 69 6e 65 28 70 41 72 67 2c 20 22 4e  tatLine(pArg, "N
11560 75 6d 62 65 72 20 6f 66 20 50 63 61 63 68 65 20  umber of Pcache 
11570 4f 76 65 72 66 6c 6f 77 20 42 79 74 65 73 3a 22  Overflow Bytes:"
11580 2c 0a 20 20 20 20 20 22 25 6c 6c 64 20 28 6d 61  ,.     "%lld (ma
11590 78 20 25 6c 6c 64 29 20 62 79 74 65 73 22 2c 20  x %lld) bytes", 
115a0 53 51 4c 49 54 45 5f 53 54 41 54 55 53 5f 50 41  SQLITE_STATUS_PA
115b0 47 45 43 41 43 48 45 5f 4f 56 45 52 46 4c 4f 57  GECACHE_OVERFLOW
115c0 2c 20 62 52 65 73 65 74 29 3b 0a 20 20 64 69 73  , bReset);.  dis
115d0 70 6c 61 79 53 74 61 74 4c 69 6e 65 28 70 41 72  playStatLine(pAr
115e0 67 2c 20 22 4c 61 72 67 65 73 74 20 41 6c 6c 6f  g, "Largest Allo
115f0 63 61 74 69 6f 6e 3a 22 2c 0a 20 20 20 20 20 22  cation:",.     "
11600 25 6c 6c 64 20 62 79 74 65 73 22 2c 20 53 51 4c  %lld bytes", SQL
11610 49 54 45 5f 53 54 41 54 55 53 5f 4d 41 4c 4c 4f  ITE_STATUS_MALLO
11620 43 5f 53 49 5a 45 2c 20 62 52 65 73 65 74 29 3b  C_SIZE, bReset);
11630 0a 20 20 64 69 73 70 6c 61 79 53 74 61 74 4c 69  .  displayStatLi
11640 6e 65 28 70 41 72 67 2c 20 22 4c 61 72 67 65 73  ne(pArg, "Larges
11650 74 20 50 63 61 63 68 65 20 41 6c 6c 6f 63 61 74  t Pcache Allocat
11660 69 6f 6e 3a 22 2c 0a 20 20 20 20 20 22 25 6c 6c  ion:",.     "%ll
11670 64 20 62 79 74 65 73 22 2c 20 53 51 4c 49 54 45  d bytes", SQLITE
11680 5f 53 54 41 54 55 53 5f 50 41 47 45 43 41 43 48  _STATUS_PAGECACH
11690 45 5f 53 49 5a 45 2c 20 62 52 65 73 65 74 29 3b  E_SIZE, bReset);
116a0 0a 23 69 66 64 65 66 20 59 59 54 52 41 43 4b 4d  .#ifdef YYTRACKM
116b0 41 58 53 54 41 43 4b 44 45 50 54 48 0a 20 20 64  AXSTACKDEPTH.  d
116c0 69 73 70 6c 61 79 53 74 61 74 4c 69 6e 65 28 70  isplayStatLine(p
116d0 41 72 67 2c 20 22 44 65 65 70 65 73 74 20 50 61  Arg, "Deepest Pa
116e0 72 73 65 72 20 53 74 61 63 6b 3a 22 2c 0a 20 20  rser Stack:",.  
116f0 20 20 20 22 25 6c 6c 64 20 28 6d 61 78 20 25 6c     "%lld (max %l
11700 6c 64 29 22 2c 20 53 51 4c 49 54 45 5f 53 54 41  ld)", SQLITE_STA
11710 54 55 53 5f 50 41 52 53 45 52 5f 53 54 41 43 4b  TUS_PARSER_STACK
11720 2c 20 62 52 65 73 65 74 29 3b 0a 23 65 6e 64 69  , bReset);.#endi
11730 66 0a 0a 20 20 69 66 28 20 64 62 20 29 7b 0a 20  f..  if( db ){. 
11740 20 20 20 69 66 28 20 70 41 72 67 2d 3e 73 68 65     if( pArg->she
11750 6c 6c 46 6c 67 73 20 26 20 53 48 46 4c 47 5f 4c  llFlgs & SHFLG_L
11760 6f 6f 6b 61 73 69 64 65 20 29 7b 0a 20 20 20 20  ookaside ){.    
11770 20 20 69 48 69 77 74 72 20 3d 20 69 43 75 72 20    iHiwtr = iCur 
11780 3d 20 2d 31 3b 0a 20 20 20 20 20 20 73 71 6c 69  = -1;.      sqli
11790 74 65 33 5f 64 62 5f 73 74 61 74 75 73 28 64 62  te3_db_status(db
117a0 2c 20 53 51 4c 49 54 45 5f 44 42 53 54 41 54 55  , SQLITE_DBSTATU
117b0 53 5f 4c 4f 4f 4b 41 53 49 44 45 5f 55 53 45 44  S_LOOKASIDE_USED
117c0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
117d0 20 20 20 20 20 20 20 20 20 20 26 69 43 75 72 2c            &iCur,
117e0 20 26 69 48 69 77 74 72 2c 20 62 52 65 73 65 74   &iHiwtr, bReset
117f0 29 3b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69  );.      raw_pri
11800 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c 0a 20  ntf(pArg->out,. 
11810 20 20 20 20 20 20 20 20 20 20 20 20 20 22 4c 6f               "Lo
11820 6f 6b 61 73 69 64 65 20 53 6c 6f 74 73 20 55 73  okaside Slots Us
11830 65 64 3a 20 20 20 20 20 20 20 20 20 20 20 20 20  ed:             
11840 20 20 20 25 64 20 28 6d 61 78 20 25 64 29 5c 6e     %d (max %d)\n
11850 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
11860 20 69 43 75 72 2c 20 69 48 69 77 74 72 29 3b 0a   iCur, iHiwtr);.
11870 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 64 62        sqlite3_db
11880 5f 73 74 61 74 75 73 28 64 62 2c 20 53 51 4c 49  _status(db, SQLI
11890 54 45 5f 44 42 53 54 41 54 55 53 5f 4c 4f 4f 4b  TE_DBSTATUS_LOOK
118a0 41 53 49 44 45 5f 48 49 54 2c 0a 20 20 20 20 20  ASIDE_HIT,.     
118b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
118c0 20 20 20 26 69 43 75 72 2c 20 26 69 48 69 77 74     &iCur, &iHiwt
118d0 72 2c 20 62 52 65 73 65 74 29 3b 0a 20 20 20 20  r, bReset);.    
118e0 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 41 72    raw_printf(pAr
118f0 67 2d 3e 6f 75 74 2c 20 22 53 75 63 63 65 73 73  g->out, "Success
11900 66 75 6c 20 6c 6f 6f 6b 61 73 69 64 65 20 61 74  ful lookaside at
11910 74 65 6d 70 74 73 3a 20 20 20 20 20 20 20 25 64  tempts:       %d
11920 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
11930 20 20 20 69 48 69 77 74 72 29 3b 0a 20 20 20 20     iHiwtr);.    
11940 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 73 74 61    sqlite3_db_sta
11950 74 75 73 28 64 62 2c 20 53 51 4c 49 54 45 5f 44  tus(db, SQLITE_D
11960 42 53 54 41 54 55 53 5f 4c 4f 4f 4b 41 53 49 44  BSTATUS_LOOKASID
11970 45 5f 4d 49 53 53 5f 53 49 5a 45 2c 0a 20 20 20  E_MISS_SIZE,.   
11980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11990 20 20 20 20 20 26 69 43 75 72 2c 20 26 69 48 69       &iCur, &iHi
119a0 77 74 72 2c 20 62 52 65 73 65 74 29 3b 0a 20 20  wtr, bReset);.  
119b0 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70      raw_printf(p
119c0 41 72 67 2d 3e 6f 75 74 2c 20 22 4c 6f 6f 6b 61  Arg->out, "Looka
119d0 73 69 64 65 20 66 61 69 6c 75 72 65 73 20 64 75  side failures du
119e0 65 20 74 6f 20 73 69 7a 65 3a 20 20 20 20 20 20  e to size:      
119f0 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %d\n",.         
11a00 20 20 20 20 20 69 48 69 77 74 72 29 3b 0a 20 20       iHiwtr);.  
11a10 20 20 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 73      sqlite3_db_s
11a20 74 61 74 75 73 28 64 62 2c 20 53 51 4c 49 54 45  tatus(db, SQLITE
11a30 5f 44 42 53 54 41 54 55 53 5f 4c 4f 4f 4b 41 53  _DBSTATUS_LOOKAS
11a40 49 44 45 5f 4d 49 53 53 5f 46 55 4c 4c 2c 0a 20  IDE_MISS_FULL,. 
11a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11a60 20 20 20 20 20 20 20 26 69 43 75 72 2c 20 26 69         &iCur, &i
11a70 48 69 77 74 72 2c 20 62 52 65 73 65 74 29 3b 0a  Hiwtr, bReset);.
11a80 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
11a90 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22 4c 6f 6f  (pArg->out, "Loo
11aa0 6b 61 73 69 64 65 20 66 61 69 6c 75 72 65 73 20  kaside failures 
11ab0 64 75 65 20 74 6f 20 4f 4f 4d 3a 20 20 20 20 20  due to OOM:     
11ac0 20 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20    %d\n",.       
11ad0 20 20 20 20 20 20 20 69 48 69 77 74 72 29 3b 0a         iHiwtr);.
11ae0 20 20 20 20 7d 0a 20 20 20 20 69 48 69 77 74 72      }.    iHiwtr
11af0 20 3d 20 69 43 75 72 20 3d 20 2d 31 3b 0a 20 20   = iCur = -1;.  
11b00 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 73 74 61    sqlite3_db_sta
11b10 74 75 73 28 64 62 2c 20 53 51 4c 49 54 45 5f 44  tus(db, SQLITE_D
11b20 42 53 54 41 54 55 53 5f 43 41 43 48 45 5f 55 53  BSTATUS_CACHE_US
11b30 45 44 2c 20 26 69 43 75 72 2c 20 26 69 48 69 77  ED, &iCur, &iHiw
11b40 74 72 2c 20 62 52 65 73 65 74 29 3b 0a 20 20 20  tr, bReset);.   
11b50 20 72 61 77 5f 70 72 69 6e 74 66 28 70 41 72 67   raw_printf(pArg
11b60 2d 3e 6f 75 74 2c 20 22 50 61 67 65 72 20 48 65  ->out, "Pager He
11b70 61 70 20 55 73 61 67 65 3a 20 20 20 20 20 20 20  ap Usage:       
11b80 20 20 20 20 20 20 20 20 20 20 20 20 20 25 64 20               %d 
11b90 62 79 74 65 73 5c 6e 22 2c 0a 20 20 20 20 20 20  bytes\n",.      
11ba0 20 20 20 20 20 20 69 43 75 72 29 3b 0a 20 20 20        iCur);.   
11bb0 20 69 48 69 77 74 72 20 3d 20 69 43 75 72 20 3d   iHiwtr = iCur =
11bc0 20 2d 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   -1;.    sqlite3
11bd0 5f 64 62 5f 73 74 61 74 75 73 28 64 62 2c 20 53  _db_status(db, S
11be0 51 4c 49 54 45 5f 44 42 53 54 41 54 55 53 5f 43  QLITE_DBSTATUS_C
11bf0 41 43 48 45 5f 48 49 54 2c 20 26 69 43 75 72 2c  ACHE_HIT, &iCur,
11c00 20 26 69 48 69 77 74 72 2c 20 31 29 3b 0a 20 20   &iHiwtr, 1);.  
11c10 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 41 72    raw_printf(pAr
11c20 67 2d 3e 6f 75 74 2c 20 22 50 61 67 65 20 63 61  g->out, "Page ca
11c30 63 68 65 20 68 69 74 73 3a 20 20 20 20 20 20 20  che hits:       
11c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 25 64                %d
11c50 5c 6e 22 2c 20 69 43 75 72 29 3b 0a 20 20 20 20  \n", iCur);.    
11c60 69 48 69 77 74 72 20 3d 20 69 43 75 72 20 3d 20  iHiwtr = iCur = 
11c70 2d 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  -1;.    sqlite3_
11c80 64 62 5f 73 74 61 74 75 73 28 64 62 2c 20 53 51  db_status(db, SQ
11c90 4c 49 54 45 5f 44 42 53 54 41 54 55 53 5f 43 41  LITE_DBSTATUS_CA
11ca0 43 48 45 5f 4d 49 53 53 2c 20 26 69 43 75 72 2c  CHE_MISS, &iCur,
11cb0 20 26 69 48 69 77 74 72 2c 20 31 29 3b 0a 20 20   &iHiwtr, 1);.  
11cc0 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 41 72    raw_printf(pAr
11cd0 67 2d 3e 6f 75 74 2c 20 22 50 61 67 65 20 63 61  g->out, "Page ca
11ce0 63 68 65 20 6d 69 73 73 65 73 3a 20 20 20 20 20  che misses:     
11cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 25 64                %d
11d00 5c 6e 22 2c 20 69 43 75 72 29 3b 0a 20 20 20 20  \n", iCur);.    
11d10 69 48 69 77 74 72 20 3d 20 69 43 75 72 20 3d 20  iHiwtr = iCur = 
11d20 2d 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  -1;.    sqlite3_
11d30 64 62 5f 73 74 61 74 75 73 28 64 62 2c 20 53 51  db_status(db, SQ
11d40 4c 49 54 45 5f 44 42 53 54 41 54 55 53 5f 43 41  LITE_DBSTATUS_CA
11d50 43 48 45 5f 57 52 49 54 45 2c 20 26 69 43 75 72  CHE_WRITE, &iCur
11d60 2c 20 26 69 48 69 77 74 72 2c 20 31 29 3b 0a 20  , &iHiwtr, 1);. 
11d70 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 41     raw_printf(pA
11d80 72 67 2d 3e 6f 75 74 2c 20 22 50 61 67 65 20 63  rg->out, "Page c
11d90 61 63 68 65 20 77 72 69 74 65 73 3a 20 20 20 20  ache writes:    
11da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 25                 %
11db0 64 5c 6e 22 2c 20 69 43 75 72 29 3b 0a 20 20 20  d\n", iCur);.   
11dc0 20 69 48 69 77 74 72 20 3d 20 69 43 75 72 20 3d   iHiwtr = iCur =
11dd0 20 2d 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   -1;.    sqlite3
11de0 5f 64 62 5f 73 74 61 74 75 73 28 64 62 2c 20 53  _db_status(db, S
11df0 51 4c 49 54 45 5f 44 42 53 54 41 54 55 53 5f 43  QLITE_DBSTATUS_C
11e00 41 43 48 45 5f 53 50 49 4c 4c 2c 20 26 69 43 75  ACHE_SPILL, &iCu
11e10 72 2c 20 26 69 48 69 77 74 72 2c 20 31 29 3b 0a  r, &iHiwtr, 1);.
11e20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70      raw_printf(p
11e30 41 72 67 2d 3e 6f 75 74 2c 20 22 50 61 67 65 20  Arg->out, "Page 
11e40 63 61 63 68 65 20 73 70 69 6c 6c 73 3a 20 20 20  cache spills:   
11e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11e60 25 64 5c 6e 22 2c 20 69 43 75 72 29 3b 0a 20 20  %d\n", iCur);.  
11e70 20 20 69 48 69 77 74 72 20 3d 20 69 43 75 72 20    iHiwtr = iCur 
11e80 3d 20 2d 31 3b 0a 20 20 20 20 73 71 6c 69 74 65  = -1;.    sqlite
11e90 33 5f 64 62 5f 73 74 61 74 75 73 28 64 62 2c 20  3_db_status(db, 
11ea0 53 51 4c 49 54 45 5f 44 42 53 54 41 54 55 53 5f  SQLITE_DBSTATUS_
11eb0 53 43 48 45 4d 41 5f 55 53 45 44 2c 20 26 69 43  SCHEMA_USED, &iC
11ec0 75 72 2c 20 26 69 48 69 77 74 72 2c 20 62 52 65  ur, &iHiwtr, bRe
11ed0 73 65 74 29 3b 0a 20 20 20 20 72 61 77 5f 70 72  set);.    raw_pr
11ee0 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20  intf(pArg->out, 
11ef0 22 53 63 68 65 6d 61 20 48 65 61 70 20 55 73 61  "Schema Heap Usa
11f00 67 65 3a 20 20 20 20 20 20 20 20 20 20 20 20 20  ge:             
11f10 20 20 20 20 20 20 25 64 20 62 79 74 65 73 5c 6e        %d bytes\n
11f20 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ",.            i
11f30 43 75 72 29 3b 0a 20 20 20 20 69 48 69 77 74 72  Cur);.    iHiwtr
11f40 20 3d 20 69 43 75 72 20 3d 20 2d 31 3b 0a 20 20   = iCur = -1;.  
11f50 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 73 74 61    sqlite3_db_sta
11f60 74 75 73 28 64 62 2c 20 53 51 4c 49 54 45 5f 44  tus(db, SQLITE_D
11f70 42 53 54 41 54 55 53 5f 53 54 4d 54 5f 55 53 45  BSTATUS_STMT_USE
11f80 44 2c 20 26 69 43 75 72 2c 20 26 69 48 69 77 74  D, &iCur, &iHiwt
11f90 72 2c 20 62 52 65 73 65 74 29 3b 0a 20 20 20 20  r, bReset);.    
11fa0 72 61 77 5f 70 72 69 6e 74 66 28 70 41 72 67 2d  raw_printf(pArg-
11fb0 3e 6f 75 74 2c 20 22 53 74 61 74 65 6d 65 6e 74  >out, "Statement
11fc0 20 48 65 61 70 2f 4c 6f 6f 6b 61 73 69 64 65 20   Heap/Lookaside 
11fd0 55 73 61 67 65 3a 20 20 20 20 20 20 25 64 20 62  Usage:      %d b
11fe0 79 74 65 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20  ytes\n",.       
11ff0 20 20 20 20 20 69 43 75 72 29 3b 0a 20 20 7d 0a       iCur);.  }.
12000 0a 20 20 69 66 28 20 70 41 72 67 2d 3e 70 53 74  .  if( pArg->pSt
12010 6d 74 20 29 7b 0a 20 20 20 20 69 43 75 72 20 3d  mt ){.    iCur =
12020 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 74   sqlite3_stmt_st
12030 61 74 75 73 28 70 41 72 67 2d 3e 70 53 74 6d 74  atus(pArg->pStmt
12040 2c 20 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41  , SQLITE_STMTSTA
12050 54 55 53 5f 46 55 4c 4c 53 43 41 4e 5f 53 54 45  TUS_FULLSCAN_STE
12060 50 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  P,.             
12070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12080 20 20 62 52 65 73 65 74 29 3b 0a 20 20 20 20 72    bReset);.    r
12090 61 77 5f 70 72 69 6e 74 66 28 70 41 72 67 2d 3e  aw_printf(pArg->
120a0 6f 75 74 2c 20 22 46 75 6c 6c 73 63 61 6e 20 53  out, "Fullscan S
120b0 74 65 70 73 3a 20 20 20 20 20 20 20 20 20 20 20  teps:           
120c0 20 20 20 20 20 20 20 20 20 20 20 25 64 5c 6e 22             %d\n"
120d0 2c 20 69 43 75 72 29 3b 0a 20 20 20 20 69 43 75  , iCur);.    iCu
120e0 72 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  r = sqlite3_stmt
120f0 5f 73 74 61 74 75 73 28 70 41 72 67 2d 3e 70 53  _status(pArg->pS
12100 74 6d 74 2c 20 53 51 4c 49 54 45 5f 53 54 4d 54  tmt, SQLITE_STMT
12110 53 54 41 54 55 53 5f 53 4f 52 54 2c 20 62 52 65  STATUS_SORT, bRe
12120 73 65 74 29 3b 0a 20 20 20 20 72 61 77 5f 70 72  set);.    raw_pr
12130 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20  intf(pArg->out, 
12140 22 53 6f 72 74 20 4f 70 65 72 61 74 69 6f 6e 73  "Sort Operations
12150 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  :               
12160 20 20 20 20 20 20 25 64 5c 6e 22 2c 20 69 43 75        %d\n", iCu
12170 72 29 3b 0a 20 20 20 20 69 43 75 72 20 3d 20 73  r);.    iCur = s
12180 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 74 61 74  qlite3_stmt_stat
12190 75 73 28 70 41 72 67 2d 3e 70 53 74 6d 74 2c 20  us(pArg->pStmt, 
121a0 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55  SQLITE_STMTSTATU
121b0 53 5f 41 55 54 4f 49 4e 44 45 58 2c 62 52 65 73  S_AUTOINDEX,bRes
121c0 65 74 29 3b 0a 20 20 20 20 72 61 77 5f 70 72 69  et);.    raw_pri
121d0 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22  ntf(pArg->out, "
121e0 41 75 74 6f 69 6e 64 65 78 20 49 6e 73 65 72 74  Autoindex Insert
121f0 73 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s:              
12200 20 20 20 20 20 25 64 5c 6e 22 2c 20 69 43 75 72       %d\n", iCur
12210 29 3b 0a 20 20 20 20 69 43 75 72 20 3d 20 73 71  );.    iCur = sq
12220 6c 69 74 65 33 5f 73 74 6d 74 5f 73 74 61 74 75  lite3_stmt_statu
12230 73 28 70 41 72 67 2d 3e 70 53 74 6d 74 2c 20 53  s(pArg->pStmt, S
12240 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53  QLITE_STMTSTATUS
12250 5f 56 4d 5f 53 54 45 50 2c 20 62 52 65 73 65 74  _VM_STEP, bReset
12260 29 3b 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74  );.    raw_print
12270 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22 56 69  f(pArg->out, "Vi
12280 72 74 75 61 6c 20 4d 61 63 68 69 6e 65 20 53 74  rtual Machine St
12290 65 70 73 3a 20 20 20 20 20 20 20 20 20 20 20 20  eps:            
122a0 20 20 20 25 64 5c 6e 22 2c 20 69 43 75 72 29 3b     %d\n", iCur);
122b0 0a 20 20 20 20 69 43 75 72 20 3d 20 73 71 6c 69  .    iCur = sqli
122c0 74 65 33 5f 73 74 6d 74 5f 73 74 61 74 75 73 28  te3_stmt_status(
122d0 70 41 72 67 2d 3e 70 53 74 6d 74 2c 20 53 51 4c  pArg->pStmt, SQL
122e0 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 52  ITE_STMTSTATUS_R
122f0 45 50 52 45 50 41 52 45 2c 20 62 52 65 73 65 74  EPREPARE, bReset
12300 29 3b 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74  );.    raw_print
12310 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22 52 65  f(pArg->out, "Re
12320 70 72 65 70 61 72 65 20 6f 70 65 72 61 74 69 6f  prepare operatio
12330 6e 73 3a 20 20 20 20 20 20 20 20 20 20 20 20 20  ns:             
12340 20 20 20 25 64 5c 6e 22 2c 20 69 43 75 72 29 3b     %d\n", iCur);
12350 0a 20 20 20 20 69 43 75 72 20 3d 20 73 71 6c 69  .    iCur = sqli
12360 74 65 33 5f 73 74 6d 74 5f 73 74 61 74 75 73 28  te3_stmt_status(
12370 70 41 72 67 2d 3e 70 53 74 6d 74 2c 20 53 51 4c  pArg->pStmt, SQL
12380 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 52  ITE_STMTSTATUS_R
12390 55 4e 2c 20 62 52 65 73 65 74 29 3b 0a 20 20 20  UN, bReset);.   
123a0 20 72 61 77 5f 70 72 69 6e 74 66 28 70 41 72 67   raw_printf(pArg
123b0 2d 3e 6f 75 74 2c 20 22 4e 75 6d 62 65 72 20 6f  ->out, "Number o
123c0 66 20 74 69 6d 65 73 20 72 75 6e 3a 20 20 20 20  f times run:    
123d0 20 20 20 20 20 20 20 20 20 20 20 20 20 25 64 5c               %d\
123e0 6e 22 2c 20 69 43 75 72 29 3b 0a 20 20 20 20 69  n", iCur);.    i
123f0 43 75 72 20 3d 20 73 71 6c 69 74 65 33 5f 73 74  Cur = sqlite3_st
12400 6d 74 5f 73 74 61 74 75 73 28 70 41 72 67 2d 3e  mt_status(pArg->
12410 70 53 74 6d 74 2c 20 53 51 4c 49 54 45 5f 53 54  pStmt, SQLITE_ST
12420 4d 54 53 54 41 54 55 53 5f 4d 45 4d 55 53 45 44  MTSTATUS_MEMUSED
12430 2c 20 62 52 65 73 65 74 29 3b 0a 20 20 20 20 72  , bReset);.    r
12440 61 77 5f 70 72 69 6e 74 66 28 70 41 72 67 2d 3e  aw_printf(pArg->
12450 6f 75 74 2c 20 22 4d 65 6d 6f 72 79 20 75 73 65  out, "Memory use
12460 64 20 62 79 20 70 72 65 70 61 72 65 64 20 73 74  d by prepared st
12470 6d 74 3a 20 20 20 20 20 20 20 20 25 64 5c 6e 22  mt:        %d\n"
12480 2c 20 69 43 75 72 29 3b 0a 20 20 7d 0a 0a 23 69  , iCur);.  }..#i
12490 66 64 65 66 20 5f 5f 6c 69 6e 75 78 5f 5f 0a 20  fdef __linux__. 
124a0 20 64 69 73 70 6c 61 79 4c 69 6e 75 78 49 6f 53   displayLinuxIoS
124b0 74 61 74 73 28 70 41 72 67 2d 3e 6f 75 74 29 3b  tats(pArg->out);
124c0 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 44 6f  .#endif..  /* Do
124d0 20 6e 6f 74 20 72 65 6d 6f 76 65 20 74 68 69 73   not remove this
124e0 20 6d 61 63 68 69 6e 65 20 72 65 61 64 61 62 6c   machine readabl
124f0 65 20 63 6f 6d 6d 65 6e 74 3a 20 65 78 74 72 61  e comment: extra
12500 2d 73 74 61 74 73 2d 6f 75 74 70 75 74 2d 68 65  -stats-output-he
12510 72 65 20 2a 2f 0a 0a 20 20 72 65 74 75 72 6e 20  re */..  return 
12520 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 70  0;.}../*.** Disp
12530 6c 61 79 20 73 63 61 6e 20 73 74 61 74 73 2e 0a  lay scan stats..
12540 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64  */.static void d
12550 69 73 70 6c 61 79 5f 73 63 61 6e 73 74 61 74 73  isplay_scanstats
12560 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
12570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12580 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
12590 74 6f 20 71 75 65 72 79 20 2a 2f 0a 20 20 53 68  to query */.  Sh
125a0 65 6c 6c 53 74 61 74 65 20 2a 70 41 72 67 20 20  ellState *pArg  
125b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
125c0 20 50 6f 69 6e 74 65 72 20 74 6f 20 53 68 65 6c   Pointer to Shel
125d0 6c 53 74 61 74 65 20 2a 2f 0a 29 7b 0a 23 69 66  lState */.){.#if
125e0 6e 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  ndef SQLITE_ENAB
125f0 4c 45 5f 53 54 4d 54 5f 53 43 41 4e 53 54 41 54  LE_STMT_SCANSTAT
12600 55 53 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  US.  UNUSED_PARA
12610 4d 45 54 45 52 28 64 62 29 3b 0a 20 20 55 4e 55  METER(db);.  UNU
12620 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 41  SED_PARAMETER(pA
12630 72 67 29 3b 0a 23 65 6c 73 65 0a 20 20 69 6e 74  rg);.#else.  int
12640 20 69 2c 20 6b 2c 20 6e 2c 20 6d 78 3b 0a 20 20   i, k, n, mx;.  
12650 72 61 77 5f 70 72 69 6e 74 66 28 70 41 72 67 2d  raw_printf(pArg-
12660 3e 6f 75 74 2c 20 22 2d 2d 2d 2d 2d 2d 2d 2d 20  >out, "-------- 
12670 73 63 61 6e 73 74 61 74 73 20 2d 2d 2d 2d 2d 2d  scanstats ------
12680 2d 2d 5c 6e 22 29 3b 0a 20 20 6d 78 20 3d 20 30  --\n");.  mx = 0
12690 3b 0a 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 3d  ;.  for(k=0; k<=
126a0 6d 78 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 64 6f  mx; k++){.    do
126b0 75 62 6c 65 20 72 45 73 74 4c 6f 6f 70 20 3d 20  uble rEstLoop = 
126c0 31 2e 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d 6e  1.0;.    for(i=n
126d0 3d 30 3b 20 31 3b 20 69 2b 2b 29 7b 0a 20 20 20  =0; 1; i++){.   
126e0 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20     sqlite3_stmt 
126f0 2a 70 20 3d 20 70 41 72 67 2d 3e 70 53 74 6d 74  *p = pArg->pStmt
12700 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
12710 69 6e 74 36 34 20 6e 4c 6f 6f 70 2c 20 6e 56 69  int64 nLoop, nVi
12720 73 69 74 3b 0a 20 20 20 20 20 20 64 6f 75 62 6c  sit;.      doubl
12730 65 20 72 45 73 74 3b 0a 20 20 20 20 20 20 69 6e  e rEst;.      in
12740 74 20 69 53 69 64 3b 0a 20 20 20 20 20 20 63 6f  t iSid;.      co
12750 6e 73 74 20 63 68 61 72 20 2a 7a 45 78 70 6c 61  nst char *zExpla
12760 69 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71  in;.      if( sq
12770 6c 69 74 65 33 5f 73 74 6d 74 5f 73 63 61 6e 73  lite3_stmt_scans
12780 74 61 74 75 73 28 70 2c 20 69 2c 20 53 51 4c 49  tatus(p, i, SQLI
12790 54 45 5f 53 43 41 4e 53 54 41 54 5f 4e 4c 4f 4f  TE_SCANSTAT_NLOO
127a0 50 2c 20 28 76 6f 69 64 2a 29 26 6e 4c 6f 6f 70  P, (void*)&nLoop
127b0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65  ) ){.        bre
127c0 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
127d0 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73    sqlite3_stmt_s
127e0 63 61 6e 73 74 61 74 75 73 28 70 2c 20 69 2c 20  canstatus(p, i, 
127f0 53 51 4c 49 54 45 5f 53 43 41 4e 53 54 41 54 5f  SQLITE_SCANSTAT_
12800 53 45 4c 45 43 54 49 44 2c 20 28 76 6f 69 64 2a  SELECTID, (void*
12810 29 26 69 53 69 64 29 3b 0a 20 20 20 20 20 20 69  )&iSid);.      i
12820 66 28 20 69 53 69 64 3e 6d 78 20 29 20 6d 78 20  f( iSid>mx ) mx 
12830 3d 20 69 53 69 64 3b 0a 20 20 20 20 20 20 69 66  = iSid;.      if
12840 28 20 69 53 69 64 21 3d 6b 20 29 20 63 6f 6e 74  ( iSid!=k ) cont
12850 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20  inue;.      if( 
12860 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  n==0 ){.        
12870 72 45 73 74 4c 6f 6f 70 20 3d 20 28 64 6f 75 62  rEstLoop = (doub
12880 6c 65 29 6e 4c 6f 6f 70 3b 0a 20 20 20 20 20 20  le)nLoop;.      
12890 20 20 69 66 28 20 6b 3e 30 20 29 20 72 61 77 5f    if( k>0 ) raw_
128a0 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74  printf(pArg->out
128b0 2c 20 22 2d 2d 2d 2d 2d 2d 2d 2d 20 73 75 62 71  , "-------- subq
128c0 75 65 72 79 20 25 64 20 2d 2d 2d 2d 2d 2d 2d 5c  uery %d -------\
128d0 6e 22 2c 20 6b 29 3b 0a 20 20 20 20 20 20 7d 0a  n", k);.      }.
128e0 20 20 20 20 20 20 6e 2b 2b 3b 0a 20 20 20 20 20        n++;.     
128f0 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 63   sqlite3_stmt_sc
12900 61 6e 73 74 61 74 75 73 28 70 2c 20 69 2c 20 53  anstatus(p, i, S
12910 51 4c 49 54 45 5f 53 43 41 4e 53 54 41 54 5f 4e  QLITE_SCANSTAT_N
12920 56 49 53 49 54 2c 20 28 76 6f 69 64 2a 29 26 6e  VISIT, (void*)&n
12930 56 69 73 69 74 29 3b 0a 20 20 20 20 20 20 73 71  Visit);.      sq
12940 6c 69 74 65 33 5f 73 74 6d 74 5f 73 63 61 6e 73  lite3_stmt_scans
12950 74 61 74 75 73 28 70 2c 20 69 2c 20 53 51 4c 49  tatus(p, i, SQLI
12960 54 45 5f 53 43 41 4e 53 54 41 54 5f 45 53 54 2c  TE_SCANSTAT_EST,
12970 20 28 76 6f 69 64 2a 29 26 72 45 73 74 29 3b 0a   (void*)&rEst);.
12980 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74        sqlite3_st
12990 6d 74 5f 73 63 61 6e 73 74 61 74 75 73 28 70 2c  mt_scanstatus(p,
129a0 20 69 2c 20 53 51 4c 49 54 45 5f 53 43 41 4e 53   i, SQLITE_SCANS
129b0 54 41 54 5f 45 58 50 4c 41 49 4e 2c 20 28 76 6f  TAT_EXPLAIN, (vo
129c0 69 64 2a 29 26 7a 45 78 70 6c 61 69 6e 29 3b 0a  id*)&zExplain);.
129d0 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
129e0 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22 4c 6f  f(pArg->out, "Lo
129f0 6f 70 20 25 32 64 3a 20 25 73 5c 6e 22 2c 20 6e  op %2d: %s\n", n
12a00 2c 20 7a 45 78 70 6c 61 69 6e 29 3b 0a 20 20 20  , zExplain);.   
12a10 20 20 20 72 45 73 74 4c 6f 6f 70 20 2a 3d 20 72     rEstLoop *= r
12a20 45 73 74 3b 0a 20 20 20 20 20 20 72 61 77 5f 70  Est;.      raw_p
12a30 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c  rintf(pArg->out,
12a40 0a 20 20 20 20 20 20 20 20 20 20 22 20 20 20 20  .          "    
12a50 20 20 20 20 20 6e 4c 6f 6f 70 3d 25 2d 38 6c 6c       nLoop=%-8ll
12a60 64 20 6e 52 6f 77 3d 25 2d 38 6c 6c 64 20 65 73  d nRow=%-8lld es
12a70 74 52 6f 77 3d 25 2d 38 6c 6c 64 20 65 73 74 52  tRow=%-8lld estR
12a80 6f 77 2f 4c 6f 6f 70 3d 25 2d 38 67 5c 6e 22 2c  ow/Loop=%-8g\n",
12a90 0a 20 20 20 20 20 20 20 20 20 20 6e 4c 6f 6f 70  .          nLoop
12aa0 2c 20 6e 56 69 73 69 74 2c 20 28 73 71 6c 69 74  , nVisit, (sqlit
12ab0 65 33 5f 69 6e 74 36 34 29 28 72 45 73 74 4c 6f  e3_int64)(rEstLo
12ac0 6f 70 2b 30 2e 35 29 2c 20 72 45 73 74 0a 20 20  op+0.5), rEst.  
12ad0 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d      );.    }.  }
12ae0 0a 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 41  .  raw_printf(pA
12af0 72 67 2d 3e 6f 75 74 2c 20 22 2d 2d 2d 2d 2d 2d  rg->out, "------
12b00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12b10 2d 2d 2d 2d 2d 5c 6e 22 29 3b 0a 23 65 6e 64 69  -----\n");.#endi
12b20 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d  f.}../*.** Param
12b30 65 74 65 72 20 61 7a 41 72 72 61 79 20 70 6f 69  eter azArray poi
12b40 6e 74 73 20 74 6f 20 61 20 7a 65 72 6f 2d 74 65  nts to a zero-te
12b50 72 6d 69 6e 61 74 65 64 20 61 72 72 61 79 20 6f  rminated array o
12b60 66 20 73 74 72 69 6e 67 73 2e 20 7a 53 74 72 0a  f strings. zStr.
12b70 2a 2a 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 73  ** points to a s
12b80 69 6e 67 6c 65 20 6e 75 6c 2d 74 65 72 6d 69 6e  ingle nul-termin
12b90 61 74 65 64 20 73 74 72 69 6e 67 2e 20 52 65 74  ated string. Ret
12ba0 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20  urn non-zero if 
12bb0 7a 53 74 72 0a 2a 2a 20 69 73 20 65 71 75 61 6c  zStr.** is equal
12bc0 2c 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 73  , according to s
12bd0 74 72 63 6d 70 28 29 2c 20 74 6f 20 61 6e 79 20  trcmp(), to any 
12be0 6f 66 20 74 68 65 20 73 74 72 69 6e 67 73 20 69  of the strings i
12bf0 6e 20 74 68 65 20 61 72 72 61 79 2e 0a 2a 2a 20  n the array..** 
12c00 4f 74 68 65 72 77 69 73 65 2c 20 72 65 74 75 72  Otherwise, retur
12c10 6e 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69  n zero..*/.stati
12c20 63 20 69 6e 74 20 73 74 72 5f 69 6e 5f 61 72 72  c int str_in_arr
12c30 61 79 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  ay(const char *z
12c40 53 74 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  Str, const char 
12c50 2a 2a 61 7a 41 72 72 61 79 29 7b 0a 20 20 69 6e  **azArray){.  in
12c60 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  t i;.  for(i=0; 
12c70 61 7a 41 72 72 61 79 5b 69 5d 3b 20 69 2b 2b 29  azArray[i]; i++)
12c80 7b 0a 20 20 20 20 69 66 28 20 30 3d 3d 73 74 72  {.    if( 0==str
12c90 63 6d 70 28 7a 53 74 72 2c 20 61 7a 41 72 72 61  cmp(zStr, azArra
12ca0 79 5b 69 5d 29 20 29 20 72 65 74 75 72 6e 20 31  y[i]) ) return 1
12cb0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
12cc0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 63 6f  ;.}../*.** If co
12cd0 6d 70 69 6c 65 64 20 73 74 61 74 65 6d 65 6e 74  mpiled statement
12ce0 20 70 53 71 6c 20 61 70 70 65 61 72 73 20 74 6f   pSql appears to
12cf0 20 62 65 20 61 6e 20 45 58 50 4c 41 49 4e 20 73   be an EXPLAIN s
12d00 74 61 74 65 6d 65 6e 74 2c 20 61 6c 6c 6f 63 61  tatement, alloca
12d10 74 65 0a 2a 2a 20 61 6e 64 20 70 6f 70 75 6c 61  te.** and popula
12d20 74 65 20 74 68 65 20 53 68 65 6c 6c 53 74 61 74  te the ShellStat
12d30 65 2e 61 69 49 6e 64 65 6e 74 5b 5d 20 61 72 72  e.aiIndent[] arr
12d40 61 79 20 77 69 74 68 20 74 68 65 20 6e 75 6d 62  ay with the numb
12d50 65 72 20 6f 66 0a 2a 2a 20 73 70 61 63 65 73 20  er of.** spaces 
12d60 65 61 63 68 20 6f 70 63 6f 64 65 20 73 68 6f 75  each opcode shou
12d70 6c 64 20 62 65 20 69 6e 64 65 6e 74 65 64 20 62  ld be indented b
12d80 65 66 6f 72 65 20 69 74 20 69 73 20 6f 75 74 70  efore it is outp
12d90 75 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e  ut..**.** The in
12da0 64 65 6e 74 69 6e 67 20 72 75 6c 65 73 20 61 72  denting rules ar
12db0 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20 46  e:.**.**     * F
12dc0 6f 72 20 65 61 63 68 20 22 4e 65 78 74 22 2c 20  or each "Next", 
12dd0 22 50 72 65 76 22 2c 20 22 56 4e 65 78 74 22 20  "Prev", "VNext" 
12de0 6f 72 20 22 56 50 72 65 76 22 20 69 6e 73 74 72  or "VPrev" instr
12df0 75 63 74 69 6f 6e 2c 20 69 6e 64 65 6e 74 0a 2a  uction, indent.*
12e00 2a 20 20 20 20 20 20 20 61 6c 6c 20 6f 70 63 6f  *       all opco
12e10 64 65 73 20 74 68 61 74 20 6f 63 63 75 72 20 62  des that occur b
12e20 65 74 77 65 65 6e 20 74 68 65 20 70 32 20 6a 75  etween the p2 ju
12e30 6d 70 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 61  mp destination a
12e40 6e 64 20 74 68 65 20 6f 70 63 6f 64 65 0a 2a 2a  nd the opcode.**
12e50 20 20 20 20 20 20 20 69 74 73 65 6c 66 20 62 79         itself by
12e60 20 32 20 73 70 61 63 65 73 2e 0a 2a 2a 0a 2a 2a   2 spaces..**.**
12e70 20 20 20 20 20 2a 20 46 6f 72 20 65 61 63 68 20       * For each 
12e80 22 47 6f 74 6f 22 2c 20 69 66 20 74 68 65 20 6a  "Goto", if the j
12e90 75 6d 70 20 64 65 73 74 69 6e 61 74 69 6f 6e 20  ump destination 
12ea0 69 73 20 65 61 72 6c 69 65 72 20 69 6e 20 74 68  is earlier in th
12eb0 65 20 70 72 6f 67 72 61 6d 0a 2a 2a 20 20 20 20  e program.**    
12ec0 20 20 20 61 6e 64 20 65 6e 64 73 20 6f 6e 20 6f     and ends on o
12ed0 6e 65 20 6f 66 3a 0a 2a 2a 20 20 20 20 20 20 20  ne of:.**       
12ee0 20 20 20 59 69 65 6c 64 20 20 53 65 65 6b 47 74     Yield  SeekGt
12ef0 20 20 53 65 65 6b 4c 74 20 20 52 6f 77 53 65 74    SeekLt  RowSet
12f00 52 65 61 64 20 20 52 65 77 69 6e 64 0a 2a 2a 20  Read  Rewind.** 
12f10 20 20 20 20 20 20 6f 72 20 69 66 20 74 68 65 20        or if the 
12f20 50 31 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  P1 parameter is 
12f30 6f 6e 65 20 69 6e 73 74 65 61 64 20 6f 66 20 7a  one instead of z
12f40 65 72 6f 2c 0a 2a 2a 20 20 20 20 20 20 20 74 68  ero,.**       th
12f50 65 6e 20 69 6e 64 65 6e 74 20 61 6c 6c 20 6f 70  en indent all op
12f60 63 6f 64 65 73 20 62 65 74 77 65 65 6e 20 74 68  codes between th
12f70 65 20 65 61 72 6c 69 65 72 20 69 6e 73 74 72 75  e earlier instru
12f80 63 74 69 6f 6e 0a 2a 2a 20 20 20 20 20 20 20 61  ction.**       a
12f90 6e 64 20 22 47 6f 74 6f 22 20 62 79 20 32 20 73  nd "Goto" by 2 s
12fa0 70 61 63 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  paces..*/.static
12fb0 20 76 6f 69 64 20 65 78 70 6c 61 69 6e 5f 64 61   void explain_da
12fc0 74 61 5f 70 72 65 70 61 72 65 28 53 68 65 6c 6c  ta_prepare(Shell
12fd0 53 74 61 74 65 20 2a 70 2c 20 73 71 6c 69 74 65  State *p, sqlite
12fe0 33 5f 73 74 6d 74 20 2a 70 53 71 6c 29 7b 0a 20  3_stmt *pSql){. 
12ff0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71   const char *zSq
13000 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
13010 20 2f 2a 20 54 68 65 20 74 65 78 74 20 6f 66 20   /* The text of 
13020 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  the SQL statemen
13030 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  t */.  const cha
13040 72 20 2a 7a 3b 20 20 20 20 20 20 20 20 20 20 20  r *z;           
13050 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74         /* Used t
13060 6f 20 63 68 65 63 6b 20 69 66 20 74 68 69 73 20  o check if this 
13070 69 73 20 61 6e 20 45 58 50 4c 41 49 4e 20 2a 2f  is an EXPLAIN */
13080 0a 20 20 69 6e 74 20 2a 61 62 59 69 65 6c 64 20  .  int *abYield 
13090 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
130a0 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6f 70     /* True if op
130b0 20 69 73 20 61 6e 20 4f 50 5f 59 69 65 6c 64 20   is an OP_Yield 
130c0 2a 2f 0a 20 20 69 6e 74 20 6e 41 6c 6c 6f 63 20  */.  int nAlloc 
130d0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
130e0 20 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65       /* Allocate
130f0 64 20 73 69 7a 65 20 6f 66 20 70 2d 3e 61 69 49  d size of p->aiI
13100 6e 64 65 6e 74 5b 5d 2c 20 61 62 59 69 65 6c 64  ndent[], abYield
13110 20 2a 2f 0a 20 20 69 6e 74 20 69 4f 70 3b 20 20   */.  int iOp;  
13120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13130 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
13140 66 20 6f 70 65 72 61 74 69 6f 6e 20 69 6e 20 70  f operation in p
13150 2d 3e 61 69 49 6e 64 65 6e 74 5b 5d 20 2a 2f 0a  ->aiIndent[] */.
13160 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61  .  const char *a
13170 7a 4e 65 78 74 5b 5d 20 3d 20 7b 20 22 4e 65 78  zNext[] = { "Nex
13180 74 22 2c 20 22 50 72 65 76 22 2c 20 22 56 50 72  t", "Prev", "VPr
13190 65 76 22 2c 20 22 56 4e 65 78 74 22 2c 20 22 53  ev", "VNext", "S
131a0 6f 72 74 65 72 4e 65 78 74 22 2c 20 30 20 7d 3b  orterNext", 0 };
131b0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61  .  const char *a
131c0 7a 59 69 65 6c 64 5b 5d 20 3d 20 7b 20 22 59 69  zYield[] = { "Yi
131d0 65 6c 64 22 2c 20 22 53 65 65 6b 4c 54 22 2c 20  eld", "SeekLT", 
131e0 22 53 65 65 6b 47 54 22 2c 20 22 52 6f 77 53 65  "SeekGT", "RowSe
131f0 74 52 65 61 64 22 2c 0a 20 20 20 20 20 20 20 20  tRead",.        
13200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13210 20 20 20 20 22 52 65 77 69 6e 64 22 2c 20 30 20      "Rewind", 0 
13220 7d 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  };.  const char 
13230 2a 61 7a 47 6f 74 6f 5b 5d 20 3d 20 7b 20 22 47  *azGoto[] = { "G
13240 6f 74 6f 22 2c 20 30 20 7d 3b 0a 0a 20 20 2f 2a  oto", 0 };..  /*
13250 20 54 72 79 20 74 6f 20 66 69 67 75 72 65 20 6f   Try to figure o
13260 75 74 20 69 66 20 74 68 69 73 20 69 73 20 72 65  ut if this is re
13270 61 6c 6c 79 20 61 6e 20 45 58 50 4c 41 49 4e 20  ally an EXPLAIN 
13280 73 74 61 74 65 6d 65 6e 74 2e 20 49 66 20 74 68  statement. If th
13290 69 73 0a 20 20 2a 2a 20 63 61 6e 6e 6f 74 20 62  is.  ** cannot b
132a0 65 20 76 65 72 69 66 69 65 64 2c 20 72 65 74 75  e verified, retu
132b0 72 6e 20 65 61 72 6c 79 2e 20 20 2a 2f 0a 20 20  rn early.  */.  
132c0 69 66 28 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  if( sqlite3_colu
132d0 6d 6e 5f 63 6f 75 6e 74 28 70 53 71 6c 29 21 3d  mn_count(pSql)!=
132e0 38 20 29 7b 0a 20 20 20 20 70 2d 3e 63 4d 6f 64  8 ){.    p->cMod
132f0 65 20 3d 20 70 2d 3e 6d 6f 64 65 3b 0a 20 20 20  e = p->mode;.   
13300 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 7a   return;.  }.  z
13310 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 73 71  Sql = sqlite3_sq
13320 6c 28 70 53 71 6c 29 3b 0a 20 20 69 66 28 20 7a  l(pSql);.  if( z
13330 53 71 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  Sql==0 ) return;
13340 0a 20 20 66 6f 72 28 7a 3d 7a 53 71 6c 3b 20 2a  .  for(z=zSql; *
13350 7a 3d 3d 27 20 27 20 7c 7c 20 2a 7a 3d 3d 27 5c  z==' ' || *z=='\
13360 74 27 20 7c 7c 20 2a 7a 3d 3d 27 5c 6e 27 20 7c  t' || *z=='\n' |
13370 7c 20 2a 7a 3d 3d 27 5c 66 27 20 7c 7c 20 2a 7a  | *z=='\f' || *z
13380 3d 3d 27 5c 72 27 3b 20 7a 2b 2b 29 3b 0a 20 20  =='\r'; z++);.  
13390 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72 6e  if( sqlite3_strn
133a0 69 63 6d 70 28 7a 2c 20 22 65 78 70 6c 61 69 6e  icmp(z, "explain
133b0 22 2c 20 37 29 20 29 7b 0a 20 20 20 20 70 2d 3e  ", 7) ){.    p->
133c0 63 4d 6f 64 65 20 3d 20 70 2d 3e 6d 6f 64 65 3b  cMode = p->mode;
133d0 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
133e0 0a 0a 20 20 66 6f 72 28 69 4f 70 3d 30 3b 20 53  ..  for(iOp=0; S
133f0 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74  QLITE_ROW==sqlit
13400 65 33 5f 73 74 65 70 28 70 53 71 6c 29 3b 20 69  e3_step(pSql); i
13410 4f 70 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 69  Op++){.    int i
13420 3b 0a 20 20 20 20 69 6e 74 20 69 41 64 64 72 20  ;.    int iAddr 
13430 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
13440 5f 69 6e 74 28 70 53 71 6c 2c 20 30 29 3b 0a 20  _int(pSql, 0);. 
13450 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
13460 4f 70 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  Op = (const char
13470 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  *)sqlite3_column
13480 5f 74 65 78 74 28 70 53 71 6c 2c 20 31 29 3b 0a  _text(pSql, 1);.
13490 0a 20 20 20 20 2f 2a 20 53 65 74 20 70 32 20 74  .    /* Set p2 t
134a0 6f 20 74 68 65 20 50 32 20 66 69 65 6c 64 20 6f  o the P2 field o
134b0 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 6f 70  f the current op
134c0 63 6f 64 65 2e 20 54 68 65 6e 2c 20 61 73 73 75  code. Then, assu
134d0 6d 69 6e 67 20 74 68 61 74 0a 20 20 20 20 2a 2a  ming that.    **
134e0 20 70 32 20 69 73 20 61 6e 20 69 6e 73 74 72 75   p2 is an instru
134f0 63 74 69 6f 6e 20 61 64 64 72 65 73 73 2c 20 73  ction address, s
13500 65 74 20 76 61 72 69 61 62 6c 65 20 70 32 6f 70  et variable p2op
13510 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20 6f 66   to the index of
13520 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 69 6e 73   that.    ** ins
13530 74 72 75 63 74 69 6f 6e 20 69 6e 20 74 68 65 20  truction in the 
13540 61 69 49 6e 64 65 6e 74 5b 5d 20 61 72 72 61 79  aiIndent[] array
13550 2e 20 70 32 20 61 6e 64 20 70 32 6f 70 20 6d 61  . p2 and p2op ma
13560 79 20 62 65 20 64 69 66 66 65 72 65 6e 74 20 69  y be different i
13570 66 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 75 72  f.    ** the cur
13580 72 65 6e 74 20 69 6e 73 74 72 75 63 74 69 6f 6e  rent instruction
13590 20 69 73 20 70 61 72 74 20 6f 66 20 61 20 73 75   is part of a su
135a0 62 2d 70 72 6f 67 72 61 6d 20 67 65 6e 65 72 61  b-program genera
135b0 74 65 64 20 62 79 20 61 6e 0a 20 20 20 20 2a 2a  ted by an.    **
135c0 20 53 51 4c 20 74 72 69 67 67 65 72 20 6f 72 20   SQL trigger or 
135d0 66 6f 72 65 69 67 6e 20 6b 65 79 2e 20 20 2a 2f  foreign key.  */
135e0 0a 20 20 20 20 69 6e 74 20 70 32 20 3d 20 73 71  .    int p2 = sq
135f0 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74  lite3_column_int
13600 28 70 53 71 6c 2c 20 33 29 3b 0a 20 20 20 20 69  (pSql, 3);.    i
13610 6e 74 20 70 32 6f 70 20 3d 20 28 70 32 20 2b 20  nt p2op = (p2 + 
13620 28 69 4f 70 2d 69 41 64 64 72 29 29 3b 0a 0a 20  (iOp-iAddr));.. 
13630 20 20 20 2f 2a 20 47 72 6f 77 20 74 68 65 20 70     /* Grow the p
13640 2d 3e 61 69 49 6e 64 65 6e 74 20 61 72 72 61 79  ->aiIndent array
13650 20 61 73 20 72 65 71 75 69 72 65 64 20 2a 2f 0a   as required */.
13660 20 20 20 20 69 66 28 20 69 4f 70 3e 3d 6e 41 6c      if( iOp>=nAl
13670 6c 6f 63 20 29 7b 0a 20 20 20 20 20 20 69 66 28  loc ){.      if(
13680 20 69 4f 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20   iOp==0 ){.     
13690 20 20 20 2f 2a 20 44 6f 20 66 75 72 74 68 65 72     /* Do further
136a0 20 76 65 72 66 69 63 61 74 69 6f 6e 20 74 68 61   verfication tha
136b0 74 20 74 68 69 73 20 69 73 20 65 78 70 6c 61 69  t this is explai
136c0 6e 20 6f 75 74 70 75 74 2e 20 20 41 62 6f 72 74  n output.  Abort
136d0 20 69 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 69   if.        ** i
136e0 74 20 69 73 20 6e 6f 74 20 2a 2f 0a 20 20 20 20  t is not */.    
136f0 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
13700 20 63 68 61 72 20 2a 65 78 70 6c 61 69 6e 43 6f   char *explainCo
13710 6c 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20  ls[] = {.       
13720 20 20 20 20 22 61 64 64 72 22 2c 20 22 6f 70 63      "addr", "opc
13730 6f 64 65 22 2c 20 22 70 31 22 2c 20 22 70 32 22  ode", "p1", "p2"
13740 2c 20 22 70 33 22 2c 20 22 70 34 22 2c 20 22 70  , "p3", "p4", "p
13750 35 22 2c 20 22 63 6f 6d 6d 65 6e 74 22 20 7d 3b  5", "comment" };
13760 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6a 6a 3b  .        int jj;
13770 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a 6a 3d  .        for(jj=
13780 30 3b 20 6a 6a 3c 41 72 72 61 79 53 69 7a 65 28  0; jj<ArraySize(
13790 65 78 70 6c 61 69 6e 43 6f 6c 73 29 3b 20 6a 6a  explainCols); jj
137a0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  ++){.          i
137b0 66 28 20 73 74 72 63 6d 70 28 73 71 6c 69 74 65  f( strcmp(sqlite
137c0 33 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 28 70 53  3_column_name(pS
137d0 71 6c 2c 6a 6a 29 2c 65 78 70 6c 61 69 6e 43 6f  ql,jj),explainCo
137e0 6c 73 5b 6a 6a 5d 29 21 3d 30 20 29 7b 0a 20 20  ls[jj])!=0 ){.  
137f0 20 20 20 20 20 20 20 20 20 20 70 2d 3e 63 4d 6f            p->cMo
13800 64 65 20 3d 20 70 2d 3e 6d 6f 64 65 3b 0a 20 20  de = p->mode;.  
13810 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
13820 33 5f 72 65 73 65 74 28 70 53 71 6c 29 3b 0a 20  3_reset(pSql);. 
13830 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
13840 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  n;.          }. 
13850 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
13860 0a 20 20 20 20 20 20 6e 41 6c 6c 6f 63 20 2b 3d  .      nAlloc +=
13870 20 31 30 30 3b 0a 20 20 20 20 20 20 70 2d 3e 61   100;.      p->a
13880 69 49 6e 64 65 6e 74 20 3d 20 28 69 6e 74 2a 29  iIndent = (int*)
13890 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 36  sqlite3_realloc6
138a0 34 28 70 2d 3e 61 69 49 6e 64 65 6e 74 2c 20 6e  4(p->aiIndent, n
138b0 41 6c 6c 6f 63 2a 73 69 7a 65 6f 66 28 69 6e 74  Alloc*sizeof(int
138c0 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  ));.      if( p-
138d0 3e 61 69 49 6e 64 65 6e 74 3d 3d 30 20 29 20 73  >aiIndent==0 ) s
138e0 68 65 6c 6c 5f 6f 75 74 5f 6f 66 5f 6d 65 6d 6f  hell_out_of_memo
138f0 72 79 28 29 3b 0a 20 20 20 20 20 20 61 62 59 69  ry();.      abYi
13900 65 6c 64 20 3d 20 28 69 6e 74 2a 29 73 71 6c 69  eld = (int*)sqli
13910 74 65 33 5f 72 65 61 6c 6c 6f 63 36 34 28 61 62  te3_realloc64(ab
13920 59 69 65 6c 64 2c 20 6e 41 6c 6c 6f 63 2a 73 69  Yield, nAlloc*si
13930 7a 65 6f 66 28 69 6e 74 29 29 3b 0a 20 20 20 20  zeof(int));.    
13940 20 20 69 66 28 20 61 62 59 69 65 6c 64 3d 3d 30    if( abYield==0
13950 20 29 20 73 68 65 6c 6c 5f 6f 75 74 5f 6f 66 5f   ) shell_out_of_
13960 6d 65 6d 6f 72 79 28 29 3b 0a 20 20 20 20 7d 0a  memory();.    }.
13970 20 20 20 20 61 62 59 69 65 6c 64 5b 69 4f 70 5d      abYield[iOp]
13980 20 3d 20 73 74 72 5f 69 6e 5f 61 72 72 61 79 28   = str_in_array(
13990 7a 4f 70 2c 20 61 7a 59 69 65 6c 64 29 3b 0a 20  zOp, azYield);. 
139a0 20 20 20 70 2d 3e 61 69 49 6e 64 65 6e 74 5b 69     p->aiIndent[i
139b0 4f 70 5d 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e  Op] = 0;.    p->
139c0 6e 49 6e 64 65 6e 74 20 3d 20 69 4f 70 2b 31 3b  nIndent = iOp+1;
139d0 0a 0a 20 20 20 20 69 66 28 20 73 74 72 5f 69 6e  ..    if( str_in
139e0 5f 61 72 72 61 79 28 7a 4f 70 2c 20 61 7a 4e 65  _array(zOp, azNe
139f0 78 74 29 20 29 7b 0a 20 20 20 20 20 20 66 6f 72  xt) ){.      for
13a00 28 69 3d 70 32 6f 70 3b 20 69 3c 69 4f 70 3b 20  (i=p2op; i<iOp; 
13a10 69 2b 2b 29 20 70 2d 3e 61 69 49 6e 64 65 6e 74  i++) p->aiIndent
13a20 5b 69 5d 20 2b 3d 20 32 3b 0a 20 20 20 20 7d 0a  [i] += 2;.    }.
13a30 20 20 20 20 69 66 28 20 73 74 72 5f 69 6e 5f 61      if( str_in_a
13a40 72 72 61 79 28 7a 4f 70 2c 20 61 7a 47 6f 74 6f  rray(zOp, azGoto
13a50 29 20 26 26 20 70 32 6f 70 3c 70 2d 3e 6e 49 6e  ) && p2op<p->nIn
13a60 64 65 6e 74 0a 20 20 20 20 20 26 26 20 28 61 62  dent.     && (ab
13a70 59 69 65 6c 64 5b 70 32 6f 70 5d 20 7c 7c 20 73  Yield[p2op] || s
13a80 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e  qlite3_column_in
13a90 74 28 70 53 71 6c 2c 20 32 29 29 0a 20 20 20 20  t(pSql, 2)).    
13aa0 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 70  ){.      for(i=p
13ab0 32 6f 70 3b 20 69 3c 69 4f 70 3b 20 69 2b 2b 29  2op; i<iOp; i++)
13ac0 20 70 2d 3e 61 69 49 6e 64 65 6e 74 5b 69 5d 20   p->aiIndent[i] 
13ad0 2b 3d 20 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  += 2;.    }.  }.
13ae0 0a 20 20 70 2d 3e 69 49 6e 64 65 6e 74 20 3d 20  .  p->iIndent = 
13af0 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  0;.  sqlite3_fre
13b00 65 28 61 62 59 69 65 6c 64 29 3b 0a 20 20 73 71  e(abYield);.  sq
13b10 6c 69 74 65 33 5f 72 65 73 65 74 28 70 53 71 6c  lite3_reset(pSql
13b20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65  );.}../*.** Free
13b30 20 74 68 65 20 61 72 72 61 79 20 61 6c 6c 6f 63   the array alloc
13b40 61 74 65 64 20 62 79 20 65 78 70 6c 61 69 6e 5f  ated by explain_
13b50 64 61 74 61 5f 70 72 65 70 61 72 65 28 29 2e 0a  data_prepare()..
13b60 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65  */.static void e
13b70 78 70 6c 61 69 6e 5f 64 61 74 61 5f 64 65 6c 65  xplain_data_dele
13b80 74 65 28 53 68 65 6c 6c 53 74 61 74 65 20 2a 70  te(ShellState *p
13b90 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  ){.  sqlite3_fre
13ba0 65 28 70 2d 3e 61 69 49 6e 64 65 6e 74 29 3b 0a  e(p->aiIndent);.
13bb0 20 20 70 2d 3e 61 69 49 6e 64 65 6e 74 20 3d 20    p->aiIndent = 
13bc0 30 3b 0a 20 20 70 2d 3e 6e 49 6e 64 65 6e 74 20  0;.  p->nIndent 
13bd0 3d 20 30 3b 0a 20 20 70 2d 3e 69 49 6e 64 65 6e  = 0;.  p->iInden
13be0 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  t = 0;.}../*.** 
13bf0 44 69 73 61 62 6c 65 20 61 6e 64 20 72 65 73 74  Disable and rest
13c00 6f 72 65 20 2e 77 68 65 72 65 74 72 61 63 65 20  ore .wheretrace 
13c10 61 6e 64 20 2e 73 65 6c 65 63 74 74 72 61 63 65  and .selecttrace
13c20 20 73 65 74 74 69 6e 67 73 2e 0a 2a 2f 0a 23 69   settings..*/.#i
13c30 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
13c40 5f 44 45 42 55 47 29 20 26 26 20 64 65 66 69 6e  _DEBUG) && defin
13c50 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
13c60 5f 53 45 4c 45 43 54 54 52 41 43 45 29 0a 65 78  _SELECTTRACE).ex
13c70 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33  tern int sqlite3
13c80 53 65 6c 65 63 74 54 72 61 63 65 3b 0a 73 74 61  SelectTrace;.sta
13c90 74 69 63 20 69 6e 74 20 73 61 76 65 64 53 65 6c  tic int savedSel
13ca0 65 63 74 54 72 61 63 65 3b 0a 23 65 6e 64 69 66  ectTrace;.#endif
13cb0 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
13cc0 49 54 45 5f 44 45 42 55 47 29 20 26 26 20 64 65  ITE_DEBUG) && de
13cd0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
13ce0 42 4c 45 5f 57 48 45 52 45 54 52 41 43 45 29 0a  BLE_WHERETRACE).
13cf0 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74  extern int sqlit
13d00 65 33 57 68 65 72 65 54 72 61 63 65 3b 0a 73 74  e3WhereTrace;.st
13d10 61 74 69 63 20 69 6e 74 20 73 61 76 65 64 57 68  atic int savedWh
13d20 65 72 65 54 72 61 63 65 3b 0a 23 65 6e 64 69 66  ereTrace;.#endif
13d30 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64 69 73  .static void dis
13d40 61 62 6c 65 5f 64 65 62 75 67 5f 74 72 61 63 65  able_debug_trace
13d50 5f 6d 6f 64 65 73 28 76 6f 69 64 29 7b 0a 23 69  _modes(void){.#i
13d60 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
13d70 5f 44 45 42 55 47 29 20 26 26 20 64 65 66 69 6e  _DEBUG) && defin
13d80 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
13d90 5f 53 45 4c 45 43 54 54 52 41 43 45 29 0a 20 20  _SELECTTRACE).  
13da0 73 61 76 65 64 53 65 6c 65 63 74 54 72 61 63 65  savedSelectTrace
13db0 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
13dc0 54 72 61 63 65 3b 0a 20 20 73 71 6c 69 74 65 33  Trace;.  sqlite3
13dd0 53 65 6c 65 63 74 54 72 61 63 65 20 3d 20 30 3b  SelectTrace = 0;
13de0 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69  .#endif.#if defi
13df0 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47  ned(SQLITE_DEBUG
13e00 29 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c  ) && defined(SQL
13e10 49 54 45 5f 45 4e 41 42 4c 45 5f 57 48 45 52 45  ITE_ENABLE_WHERE
13e20 54 52 41 43 45 29 0a 20 20 73 61 76 65 64 57 68  TRACE).  savedWh
13e30 65 72 65 54 72 61 63 65 20 3d 20 73 71 6c 69 74  ereTrace = sqlit
13e40 65 33 57 68 65 72 65 54 72 61 63 65 3b 0a 20 20  e3WhereTrace;.  
13e50 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63  sqlite3WhereTrac
13e60 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 7d 0a  e = 0;.#endif.}.
13e70 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 73 74  static void rest
13e80 6f 72 65 5f 64 65 62 75 67 5f 74 72 61 63 65 5f  ore_debug_trace_
13e90 6d 6f 64 65 73 28 76 6f 69 64 29 7b 0a 23 69 66  modes(void){.#if
13ea0 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
13eb0 44 45 42 55 47 29 20 26 26 20 64 65 66 69 6e 65  DEBUG) && define
13ec0 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  d(SQLITE_ENABLE_
13ed0 53 45 4c 45 43 54 54 52 41 43 45 29 0a 20 20 73  SELECTTRACE).  s
13ee0 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61 63  qlite3SelectTrac
13ef0 65 20 3d 20 73 61 76 65 64 53 65 6c 65 63 74 54  e = savedSelectT
13f00 72 61 63 65 3b 0a 23 65 6e 64 69 66 0a 23 69 66  race;.#endif.#if
13f10 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
13f20 44 45 42 55 47 29 20 26 26 20 64 65 66 69 6e 65  DEBUG) && define
13f30 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  d(SQLITE_ENABLE_
13f40 57 48 45 52 45 54 52 41 43 45 29 0a 20 20 73 71  WHERETRACE).  sq
13f50 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65 20  lite3WhereTrace 
13f60 3d 20 73 61 76 65 64 57 68 65 72 65 54 72 61 63  = savedWhereTrac
13f70 65 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a  e;.#endif.}../*.
13f80 2a 2a 20 52 75 6e 20 61 20 70 72 65 70 61 72 65  ** Run a prepare
13f90 64 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2f 0a 73  d statement.*/.s
13fa0 74 61 74 69 63 20 76 6f 69 64 20 65 78 65 63 5f  tatic void exec_
13fb0 70 72 65 70 61 72 65 64 5f 73 74 6d 74 28 0a 20  prepared_stmt(. 
13fc0 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 41 72   ShellState *pAr
13fd0 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g,              
13fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13ff0 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
14000 53 68 65 6c 6c 53 74 61 74 65 20 2a 2f 0a 20 20  ShellState */.  
14010 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
14020 74 6d 74 20 20 20 20 20 20 20 20 20 20 20 20 20  tmt             
14030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14040 20 2f 2a 20 53 74 61 74 6d 65 6e 74 20 74 6f 20   /* Statment to 
14050 72 75 6e 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  run */.){.  int 
14060 72 63 3b 0a 0a 20 20 2f 2a 20 70 65 72 66 6f 72  rc;..  /* perfor
14070 6d 20 74 68 65 20 66 69 72 73 74 20 73 74 65 70  m the first step
14080 2e 20 20 74 68 69 73 20 77 69 6c 6c 20 74 65 6c  .  this will tel
14090 6c 20 75 73 20 69 66 20 77 65 0a 20 20 2a 2a 20  l us if we.  ** 
140a0 68 61 76 65 20 61 20 72 65 73 75 6c 74 20 73 65  have a result se
140b0 74 20 6f 72 20 6e 6f 74 20 61 6e 64 20 68 6f 77  t or not and how
140c0 20 77 69 64 65 20 69 74 20 69 73 2e 0a 20 20 2a   wide it is..  *
140d0 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  /.  rc = sqlite3
140e0 5f 73 74 65 70 28 70 53 74 6d 74 29 3b 0a 20 20  _step(pStmt);.  
140f0 2f 2a 20 69 66 20 77 65 20 68 61 76 65 20 61 20  /* if we have a 
14100 72 65 73 75 6c 74 20 73 65 74 2e 2e 2e 20 2a 2f  result set... */
14110 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 52 4f  .  if( SQLITE_RO
14120 57 20 3d 3d 20 72 63 20 29 7b 0a 20 20 20 20 2f  W == rc ){.    /
14130 2a 20 61 6c 6c 6f 63 61 74 65 20 73 70 61 63 65  * allocate space
14140 20 66 6f 72 20 63 6f 6c 20 6e 61 6d 65 20 70 74   for col name pt
14150 72 2c 20 76 61 6c 75 65 20 70 74 72 2c 20 61 6e  r, value ptr, an
14160 64 20 74 79 70 65 20 2a 2f 0a 20 20 20 20 69 6e  d type */.    in
14170 74 20 6e 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33  t nCol = sqlite3
14180 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 70 53  _column_count(pS
14190 74 6d 74 29 3b 0a 20 20 20 20 76 6f 69 64 20 2a  tmt);.    void *
141a0 70 44 61 74 61 20 3d 20 73 71 6c 69 74 65 33 5f  pData = sqlite3_
141b0 6d 61 6c 6c 6f 63 36 34 28 33 2a 6e 43 6f 6c 2a  malloc64(3*nCol*
141c0 73 69 7a 65 6f 66 28 63 6f 6e 73 74 20 63 68 61  sizeof(const cha
141d0 72 2a 29 20 2b 20 31 29 3b 0a 20 20 20 20 69 66  r*) + 1);.    if
141e0 28 20 21 70 44 61 74 61 20 29 7b 0a 20 20 20 20  ( !pData ){.    
141f0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
14200 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  MEM;.    }else{.
14210 20 20 20 20 20 20 63 68 61 72 20 2a 2a 61 7a 43        char **azC
14220 6f 6c 73 20 3d 20 28 63 68 61 72 20 2a 2a 29 70  ols = (char **)p
14230 44 61 74 61 3b 20 20 20 20 20 20 2f 2a 20 4e 61  Data;      /* Na
14240 6d 65 73 20 6f 66 20 72 65 73 75 6c 74 20 63 6f  mes of result co
14250 6c 75 6d 6e 73 20 2a 2f 0a 20 20 20 20 20 20 63  lumns */.      c
14260 68 61 72 20 2a 2a 61 7a 56 61 6c 73 20 3d 20 26  har **azVals = &
14270 61 7a 43 6f 6c 73 5b 6e 43 6f 6c 5d 3b 20 20 20  azCols[nCol];   
14280 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 73 20 2a      /* Results *
14290 2f 0a 20 20 20 20 20 20 69 6e 74 20 2a 61 69 54  /.      int *aiT
142a0 79 70 65 73 20 3d 20 28 69 6e 74 20 2a 29 26 61  ypes = (int *)&a
142b0 7a 56 61 6c 73 5b 6e 43 6f 6c 5d 3b 20 2f 2a 20  zVals[nCol]; /* 
142c0 52 65 73 75 6c 74 20 74 79 70 65 73 20 2a 2f 0a  Result types */.
142d0 20 20 20 20 20 20 69 6e 74 20 69 2c 20 78 3b 0a        int i, x;.
142e0 20 20 20 20 20 20 61 73 73 65 72 74 28 73 69 7a        assert(siz
142f0 65 6f 66 28 69 6e 74 29 20 3c 3d 20 73 69 7a 65  eof(int) <= size
14300 6f 66 28 63 68 61 72 20 2a 29 29 3b 0a 20 20 20  of(char *));.   
14310 20 20 20 2f 2a 20 73 61 76 65 20 6f 66 66 20 70     /* save off p
14320 74 72 73 20 74 6f 20 63 6f 6c 75 6d 6e 20 6e 61  trs to column na
14330 6d 65 73 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72  mes */.      for
14340 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b  (i=0; i<nCol; i+
14350 2b 29 7b 0a 20 20 20 20 20 20 20 20 61 7a 43 6f  +){.        azCo
14360 6c 73 5b 69 5d 20 3d 20 28 63 68 61 72 20 2a 29  ls[i] = (char *)
14370 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6e  sqlite3_column_n
14380 61 6d 65 28 70 53 74 6d 74 2c 20 69 29 3b 0a 20  ame(pStmt, i);. 
14390 20 20 20 20 20 7d 0a 20 20 20 20 20 20 64 6f 7b       }.      do{
143a0 0a 20 20 20 20 20 20 20 20 2f 2a 20 65 78 74 72  .        /* extr
143b0 61 63 74 20 74 68 65 20 64 61 74 61 20 61 6e 64  act the data and
143c0 20 64 61 74 61 20 74 79 70 65 73 20 2a 2f 0a 20   data types */. 
143d0 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20         for(i=0; 
143e0 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  i<nCol; i++){.  
143f0 20 20 20 20 20 20 20 20 61 69 54 79 70 65 73 5b          aiTypes[
14400 69 5d 20 3d 20 78 20 3d 20 73 71 6c 69 74 65 33  i] = x = sqlite3
14410 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65 28 70 53 74  _column_type(pSt
14420 6d 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20  mt, i);.        
14430 20 20 69 66 28 20 78 3d 3d 53 51 4c 49 54 45 5f    if( x==SQLITE_
14440 42 4c 4f 42 20 26 26 20 70 41 72 67 20 26 26 20  BLOB && pArg && 
14450 70 41 72 67 2d 3e 63 4d 6f 64 65 3d 3d 4d 4f 44  pArg->cMode==MOD
14460 45 5f 49 6e 73 65 72 74 20 29 7b 0a 20 20 20 20  E_Insert ){.    
14470 20 20 20 20 20 20 20 20 61 7a 56 61 6c 73 5b 69          azVals[i
14480 5d 20 3d 20 22 22 3b 0a 20 20 20 20 20 20 20 20  ] = "";.        
14490 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
144a0 20 20 20 20 20 61 7a 56 61 6c 73 5b 69 5d 20 3d       azVals[i] =
144b0 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f   (char*)sqlite3_
144c0 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d  column_text(pStm
144d0 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20 20  t, i);.         
144e0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28   }.          if(
144f0 20 21 61 7a 56 61 6c 73 5b 69 5d 20 26 26 20 28   !azVals[i] && (
14500 61 69 54 79 70 65 73 5b 69 5d 21 3d 53 51 4c 49  aiTypes[i]!=SQLI
14510 54 45 5f 4e 55 4c 4c 29 20 29 7b 0a 20 20 20 20  TE_NULL) ){.    
14520 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
14530 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
14540 20 20 20 20 20 20 20 62 72 65 61 6b 3b 20 2f 2a         break; /*
14550 20 66 72 6f 6d 20 66 6f 72 20 2a 2f 0a 20 20 20   from for */.   
14560 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
14570 20 7d 20 2f 2a 20 65 6e 64 20 66 6f 72 20 2a 2f   } /* end for */
14580 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 69 66 20  ..        /* if 
14590 64 61 74 61 20 61 6e 64 20 74 79 70 65 73 20 65  data and types e
145a0 78 74 72 61 63 74 65 64 20 73 75 63 63 65 73 73  xtracted success
145b0 66 75 6c 6c 79 2e 2e 2e 20 2a 2f 0a 20 20 20 20  fully... */.    
145c0 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 52      if( SQLITE_R
145d0 4f 57 20 3d 3d 20 72 63 20 29 7b 0a 20 20 20 20  OW == rc ){.    
145e0 20 20 20 20 20 20 2f 2a 20 63 61 6c 6c 20 74 68        /* call th
145f0 65 20 73 75 70 70 6c 69 65 64 20 63 61 6c 6c 62  e supplied callb
14600 61 63 6b 20 77 69 74 68 20 74 68 65 20 72 65 73  ack with the res
14610 75 6c 74 20 72 6f 77 20 64 61 74 61 20 2a 2f 0a  ult row data */.
14620 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73 68            if( sh
14630 65 6c 6c 5f 63 61 6c 6c 62 61 63 6b 28 70 41 72  ell_callback(pAr
14640 67 2c 20 6e 43 6f 6c 2c 20 61 7a 56 61 6c 73 2c  g, nCol, azVals,
14650 20 61 7a 43 6f 6c 73 2c 20 61 69 54 79 70 65 73   azCols, aiTypes
14660 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
14670 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 41 42 4f   rc = SQLITE_ABO
14680 52 54 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  RT;.          }e
14690 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
146a0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 73 74   rc = sqlite3_st
146b0 65 70 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20  ep(pStmt);.     
146c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
146d0 0a 20 20 20 20 20 20 7d 20 77 68 69 6c 65 28 20  .      } while( 
146e0 53 51 4c 49 54 45 5f 52 4f 57 20 3d 3d 20 72 63  SQLITE_ROW == rc
146f0 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
14700 33 5f 66 72 65 65 28 70 44 61 74 61 29 3b 0a 20  3_free(pData);. 
14710 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e     }.  }.}..#ifn
14720 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
14730 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 0a  VIRTUALTABLE./*.
14740 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
14750 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 70 72   is called to pr
14760 6f 63 65 73 73 20 53 51 4c 20 69 66 20 74 68 65  ocess SQL if the
14770 20 70 72 65 76 69 6f 75 73 20 73 68 65 6c 6c 20   previous shell 
14780 63 6f 6d 6d 61 6e 64 0a 2a 2a 20 77 61 73 20 22  command.** was "
14790 2e 65 78 70 65 72 74 22 2e 20 49 74 20 70 61 73  .expert". It pas
147a0 73 65 73 20 74 68 65 20 53 51 4c 20 69 6e 20 74  ses the SQL in t
147b0 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
147c0 6e 74 20 64 69 72 65 63 74 6c 79 20 74 6f 0a 2a  nt directly to.*
147d0 2a 20 74 68 65 20 73 71 6c 69 74 65 33 65 78 70  * the sqlite3exp
147e0 65 72 74 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a  ert object..**.*
147f0 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  * If successful,
14800 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
14810 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73  turned. Otherwis
14820 65 2c 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72  e, an SQLite err
14830 6f 72 0a 2a 2a 20 63 6f 64 65 2e 20 49 6e 20 74  or.** code. In t
14840 68 69 73 20 63 61 73 65 2c 20 28 2a 70 7a 45 72  his case, (*pzEr
14850 72 29 20 6d 61 79 20 62 65 20 73 65 74 20 74 6f  r) may be set to
14860 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75 66 66   point to a buff
14870 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 0a 2a 2a  er containing.**
14880 20 61 6e 20 45 6e 67 6c 69 73 68 20 6c 61 6e 67   an English lang
14890 75 61 67 65 20 65 72 72 6f 72 20 6d 65 73 73 61  uage error messa
148a0 67 65 2e 20 49 74 20 69 73 20 74 68 65 20 72 65  ge. It is the re
148b0 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20  sponsibility of 
148c0 74 68 65 0a 2a 2a 20 63 61 6c 6c 65 72 20 74 6f  the.** caller to
148d0 20 65 76 65 6e 74 75 61 6c 6c 79 20 66 72 65 65   eventually free
148e0 20 74 68 69 73 20 62 75 66 66 65 72 20 75 73 69   this buffer usi
148f0 6e 67 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  ng sqlite3_free(
14900 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
14910 20 65 78 70 65 72 74 48 61 6e 64 6c 65 53 51 4c   expertHandleSQL
14920 28 0a 20 20 53 68 65 6c 6c 53 74 61 74 65 20 2a  (.  ShellState *
14930 70 53 74 61 74 65 2c 20 0a 20 20 63 6f 6e 73 74  pState, .  const
14940 20 63 68 61 72 20 2a 7a 53 71 6c 2c 20 0a 20 20   char *zSql, .  
14950 63 68 61 72 20 2a 2a 70 7a 45 72 72 0a 29 7b 0a  char **pzErr.){.
14960 20 20 61 73 73 65 72 74 28 20 70 53 74 61 74 65    assert( pState
14970 2d 3e 65 78 70 65 72 74 2e 70 45 78 70 65 72 74  ->expert.pExpert
14980 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 7a   );.  assert( pz
14990 45 72 72 3d 3d 30 20 7c 7c 20 2a 70 7a 45 72 72  Err==0 || *pzErr
149a0 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  ==0 );.  return 
149b0 73 71 6c 69 74 65 33 5f 65 78 70 65 72 74 5f 73  sqlite3_expert_s
149c0 71 6c 28 70 53 74 61 74 65 2d 3e 65 78 70 65 72  ql(pState->exper
149d0 74 2e 70 45 78 70 65 72 74 2c 20 7a 53 71 6c 2c  t.pExpert, zSql,
149e0 20 70 7a 45 72 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a   pzErr);.}../*.*
149f0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
14a00 69 73 20 63 61 6c 6c 65 64 20 65 69 74 68 65 72  is called either
14a10 20 74 6f 20 73 69 6c 65 6e 74 6c 79 20 63 6c 65   to silently cle
14a20 61 6e 20 75 70 20 74 68 65 20 6f 62 6a 65 63 74  an up the object
14a30 0a 2a 2a 20 63 72 65 61 74 65 64 20 62 79 20 74  .** created by t
14a40 68 65 20 22 2e 65 78 70 65 72 74 22 20 63 6f 6d  he ".expert" com
14a50 6d 61 6e 64 20 28 69 66 20 62 43 61 6e 63 65 6c  mand (if bCancel
14a60 3d 3d 31 29 2c 20 6f 72 20 74 6f 20 67 65 6e 65  ==1), or to gene
14a70 72 61 74 65 20 61 20 0a 2a 2a 20 72 65 70 6f 72  rate a .** repor
14a80 74 20 66 72 6f 6d 20 69 74 20 61 6e 64 20 74 68  t from it and th
14a90 65 6e 20 63 6c 65 61 6e 20 69 74 20 75 70 20 28  en clean it up (
14aa0 69 66 20 62 43 61 6e 63 65 6c 3d 3d 30 29 2e 0a  if bCancel==0)..
14ab0 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73  **.** If success
14ac0 66 75 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69  ful, SQLITE_OK i
14ad0 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65  s returned. Othe
14ae0 72 77 69 73 65 2c 20 61 6e 20 53 51 4c 69 74 65  rwise, an SQLite
14af0 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 2e 20   error.** code. 
14b00 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 28 2a  In this case, (*
14b10 70 7a 45 72 72 29 20 6d 61 79 20 62 65 20 73 65  pzErr) may be se
14b20 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61 20  t to point to a 
14b30 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e  buffer containin
14b40 67 0a 2a 2a 20 61 6e 20 45 6e 67 6c 69 73 68 20  g.** an English 
14b50 6c 61 6e 67 75 61 67 65 20 65 72 72 6f 72 20 6d  language error m
14b60 65 73 73 61 67 65 2e 20 49 74 20 69 73 20 74 68  essage. It is th
14b70 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79  e responsibility
14b80 20 6f 66 20 74 68 65 0a 2a 2a 20 63 61 6c 6c 65   of the.** calle
14b90 72 20 74 6f 20 65 76 65 6e 74 75 61 6c 6c 79 20  r to eventually 
14ba0 66 72 65 65 20 74 68 69 73 20 62 75 66 66 65 72  free this buffer
14bb0 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 5f 66   using sqlite3_f
14bc0 72 65 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  ree()..*/.static
14bd0 20 69 6e 74 20 65 78 70 65 72 74 46 69 6e 69 73   int expertFinis
14be0 68 28 0a 20 20 53 68 65 6c 6c 53 74 61 74 65 20  h(.  ShellState 
14bf0 2a 70 53 74 61 74 65 2c 0a 20 20 69 6e 74 20 62  *pState,.  int b
14c00 43 61 6e 63 65 6c 2c 0a 20 20 63 68 61 72 20 2a  Cancel,.  char *
14c10 2a 70 7a 45 72 72 0a 29 7b 0a 20 20 69 6e 74 20  *pzErr.){.  int 
14c20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
14c30 20 20 73 71 6c 69 74 65 33 65 78 70 65 72 74 20    sqlite3expert 
14c40 2a 70 20 3d 20 70 53 74 61 74 65 2d 3e 65 78 70  *p = pState->exp
14c50 65 72 74 2e 70 45 78 70 65 72 74 3b 0a 20 20 61  ert.pExpert;.  a
14c60 73 73 65 72 74 28 20 70 20 29 3b 0a 20 20 61 73  ssert( p );.  as
14c70 73 65 72 74 28 20 62 43 61 6e 63 65 6c 20 7c 7c  sert( bCancel ||
14c80 20 70 7a 45 72 72 3d 3d 30 20 7c 7c 20 2a 70 7a   pzErr==0 || *pz
14c90 45 72 72 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20  Err==0 );.  if( 
14ca0 62 43 61 6e 63 65 6c 3d 3d 30 20 29 7b 0a 20 20  bCancel==0 ){.  
14cb0 20 20 46 49 4c 45 20 2a 6f 75 74 20 3d 20 70 53    FILE *out = pS
14cc0 74 61 74 65 2d 3e 6f 75 74 3b 0a 20 20 20 20 69  tate->out;.    i
14cd0 6e 74 20 62 56 65 72 62 6f 73 65 20 3d 20 70 53  nt bVerbose = pS
14ce0 74 61 74 65 2d 3e 65 78 70 65 72 74 2e 62 56 65  tate->expert.bVe
14cf0 72 62 6f 73 65 3b 0a 0a 20 20 20 20 72 63 20 3d  rbose;..    rc =
14d00 20 73 71 6c 69 74 65 33 5f 65 78 70 65 72 74 5f   sqlite3_expert_
14d10 61 6e 61 6c 79 7a 65 28 70 2c 20 70 7a 45 72 72  analyze(p, pzErr
14d20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
14d30 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
14d40 20 20 69 6e 74 20 6e 51 75 65 72 79 20 3d 20 73    int nQuery = s
14d50 71 6c 69 74 65 33 5f 65 78 70 65 72 74 5f 63 6f  qlite3_expert_co
14d60 75 6e 74 28 70 29 3b 0a 20 20 20 20 20 20 69 6e  unt(p);.      in
14d70 74 20 69 3b 0a 0a 20 20 20 20 20 20 69 66 28 20  t i;..      if( 
14d80 62 56 65 72 62 6f 73 65 20 29 7b 0a 20 20 20 20  bVerbose ){.    
14d90 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
14da0 7a 43 61 6e 64 20 3d 20 73 71 6c 69 74 65 33 5f  zCand = sqlite3_
14db0 65 78 70 65 72 74 5f 72 65 70 6f 72 74 28 70 2c  expert_report(p,
14dc0 30 2c 45 58 50 45 52 54 5f 52 45 50 4f 52 54 5f  0,EXPERT_REPORT_
14dd0 43 41 4e 44 49 44 41 54 45 53 29 3b 0a 20 20 20  CANDIDATES);.   
14de0 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
14df0 6f 75 74 2c 20 22 2d 2d 20 43 61 6e 64 69 64 61  out, "-- Candida
14e00 74 65 73 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  tes ------------
14e10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14e20 2d 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 72  -\n");.        r
14e30 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22  aw_printf(out, "
14e40 25 73 5c 6e 22 2c 20 7a 43 61 6e 64 29 3b 0a 20  %s\n", zCand);. 
14e50 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72       }.      for
14e60 28 69 3d 30 3b 20 69 3c 6e 51 75 65 72 79 3b 20  (i=0; i<nQuery; 
14e70 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 6f  i++){.        co
14e80 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 20 3d  nst char *zSql =
14e90 20 73 71 6c 69 74 65 33 5f 65 78 70 65 72 74 5f   sqlite3_expert_
14ea0 72 65 70 6f 72 74 28 70 2c 20 69 2c 20 45 58 50  report(p, i, EXP
14eb0 45 52 54 5f 52 45 50 4f 52 54 5f 53 51 4c 29 3b  ERT_REPORT_SQL);
14ec0 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63  .        const c
14ed0 68 61 72 20 2a 7a 49 64 78 20 3d 20 73 71 6c 69  har *zIdx = sqli
14ee0 74 65 33 5f 65 78 70 65 72 74 5f 72 65 70 6f 72  te3_expert_repor
14ef0 74 28 70 2c 20 69 2c 20 45 58 50 45 52 54 5f 52  t(p, i, EXPERT_R
14f00 45 50 4f 52 54 5f 49 4e 44 45 58 45 53 29 3b 0a  EPORT_INDEXES);.
14f10 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68          const ch
14f20 61 72 20 2a 7a 45 51 50 20 3d 20 73 71 6c 69 74  ar *zEQP = sqlit
14f30 65 33 5f 65 78 70 65 72 74 5f 72 65 70 6f 72 74  e3_expert_report
14f40 28 70 2c 20 69 2c 20 45 58 50 45 52 54 5f 52 45  (p, i, EXPERT_RE
14f50 50 4f 52 54 5f 50 4c 41 4e 29 3b 0a 20 20 20 20  PORT_PLAN);.    
14f60 20 20 20 20 69 66 28 20 7a 49 64 78 3d 3d 30 20      if( zIdx==0 
14f70 29 20 7a 49 64 78 20 3d 20 22 28 6e 6f 20 6e 65  ) zIdx = "(no ne
14f80 77 20 69 6e 64 65 78 65 73 29 5c 6e 22 3b 0a 20  w indexes)\n";. 
14f90 20 20 20 20 20 20 20 69 66 28 20 62 56 65 72 62         if( bVerb
14fa0 6f 73 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ose ){.         
14fb0 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c   raw_printf(out,
14fc0 20 22 2d 2d 20 51 75 65 72 79 20 25 64 20 2d 2d   "-- Query %d --
14fd0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14fe0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 5c 6e  --------------\n
14ff0 22 2c 69 2b 31 29 3b 0a 20 20 20 20 20 20 20 20  ",i+1);.        
15000 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74    raw_printf(out
15010 2c 20 22 25 73 5c 6e 5c 6e 22 2c 20 7a 53 71 6c  , "%s\n\n", zSql
15020 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
15030 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
15040 6f 75 74 2c 20 22 25 73 5c 6e 22 2c 20 7a 49 64  out, "%s\n", zId
15050 78 29 3b 0a 20 20 20 20 20 20 20 20 72 61 77 5f  x);.        raw_
15060 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 73 5c  printf(out, "%s\
15070 6e 22 2c 20 7a 45 51 50 29 3b 0a 20 20 20 20 20  n", zEQP);.     
15080 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73   }.    }.  }.  s
15090 71 6c 69 74 65 33 5f 65 78 70 65 72 74 5f 64 65  qlite3_expert_de
150a0 73 74 72 6f 79 28 70 29 3b 0a 20 20 70 53 74 61  stroy(p);.  pSta
150b0 74 65 2d 3e 65 78 70 65 72 74 2e 70 45 78 70 65  te->expert.pExpe
150c0 72 74 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e  rt = 0;.  return
150d0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d   rc;.}../*.** Im
150e0 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
150f0 22 2e 65 78 70 65 72 74 22 20 64 6f 74 20 63 6f  ".expert" dot co
15100 6d 6d 61 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  mmand..*/.static
15110 20 69 6e 74 20 65 78 70 65 72 74 44 6f 74 43 6f   int expertDotCo
15120 6d 6d 61 6e 64 28 0a 20 20 53 68 65 6c 6c 53 74  mmand(.  ShellSt
15130 61 74 65 20 2a 70 53 74 61 74 65 2c 20 20 20 20  ate *pState,    
15140 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72           /* Curr
15150 65 6e 74 20 73 68 65 6c 6c 20 74 6f 6f 6c 20 73  ent shell tool s
15160 74 61 74 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  tate */.  char *
15170 2a 61 7a 41 72 67 2c 20 20 20 20 20 20 20 20 20  *azArg,         
15180 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72            /* Arr
15190 61 79 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  ay of arguments 
151a0 70 61 73 73 65 64 20 74 6f 20 64 6f 74 20 63 6f  passed to dot co
151b0 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6e  mmand */.  int n
151c0 41 72 67 20 20 20 20 20 20 20 20 20 20 20 20 20  Arg             
151d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
151e0 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20  mber of entries 
151f0 69 6e 20 61 7a 41 72 67 5b 5d 20 2a 2f 0a 29 7b  in azArg[] */.){
15200 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
15210 54 45 5f 4f 4b 3b 0a 20 20 63 68 61 72 20 2a 7a  TE_OK;.  char *z
15220 45 72 72 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69  Err = 0;.  int i
15230 3b 0a 20 20 69 6e 74 20 69 53 61 6d 70 6c 65 20  ;.  int iSample 
15240 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  = 0;..  assert( 
15250 70 53 74 61 74 65 2d 3e 65 78 70 65 72 74 2e 70  pState->expert.p
15260 45 78 70 65 72 74 3d 3d 30 20 29 3b 0a 20 20 6d  Expert==0 );.  m
15270 65 6d 73 65 74 28 26 70 53 74 61 74 65 2d 3e 65  emset(&pState->e
15280 78 70 65 72 74 2c 20 30 2c 20 73 69 7a 65 6f 66  xpert, 0, sizeof
15290 28 45 78 70 65 72 74 49 6e 66 6f 29 29 3b 0a 0a  (ExpertInfo));..
152a0 20 20 66 6f 72 28 69 3d 31 3b 20 72 63 3d 3d 53    for(i=1; rc==S
152b0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 6e 41  QLITE_OK && i<nA
152c0 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 68  rg; i++){.    ch
152d0 61 72 20 2a 7a 20 3d 20 61 7a 41 72 67 5b 69 5d  ar *z = azArg[i]
152e0 3b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20  ;.    int n;.   
152f0 20 69 66 28 20 7a 5b 30 5d 3d 3d 27 2d 27 20 26   if( z[0]=='-' &
15300 26 20 7a 5b 31 5d 3d 3d 27 2d 27 20 29 20 7a 2b  & z[1]=='-' ) z+
15310 2b 3b 0a 20 20 20 20 6e 20 3d 20 73 74 72 6c 65  +;.    n = strle
15320 6e 33 30 28 7a 29 3b 0a 20 20 20 20 69 66 28 20  n30(z);.    if( 
15330 6e 3e 3d 32 20 26 26 20 30 3d 3d 73 74 72 6e 63  n>=2 && 0==strnc
15340 6d 70 28 7a 2c 20 22 2d 76 65 72 62 6f 73 65 22  mp(z, "-verbose"
15350 2c 20 6e 29 20 29 7b 0a 20 20 20 20 20 20 70 53  , n) ){.      pS
15360 74 61 74 65 2d 3e 65 78 70 65 72 74 2e 62 56 65  tate->expert.bVe
15370 72 62 6f 73 65 20 3d 20 31 3b 0a 20 20 20 20 7d  rbose = 1;.    }
15380 0a 20 20 20 20 65 6c 73 65 20 69 66 28 20 6e 3e  .    else if( n>
15390 3d 32 20 26 26 20 30 3d 3d 73 74 72 6e 63 6d 70  =2 && 0==strncmp
153a0 28 7a 2c 20 22 2d 73 61 6d 70 6c 65 22 2c 20 6e  (z, "-sample", n
153b0 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69  ) ){.      if( i
153c0 3d 3d 28 6e 41 72 67 2d 31 29 20 29 7b 0a 20 20  ==(nArg-1) ){.  
153d0 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
153e0 28 73 74 64 65 72 72 2c 20 22 6f 70 74 69 6f 6e  (stderr, "option
153f0 20 72 65 71 75 69 72 65 73 20 61 6e 20 61 72 67   requires an arg
15400 75 6d 65 6e 74 3a 20 25 73 5c 6e 22 2c 20 7a 29  ument: %s\n", z)
15410 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  ;.        rc = S
15420 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
15430 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
15440 20 20 69 53 61 6d 70 6c 65 20 3d 20 28 69 6e 74    iSample = (int
15450 29 69 6e 74 65 67 65 72 56 61 6c 75 65 28 61 7a  )integerValue(az
15460 41 72 67 5b 2b 2b 69 5d 29 3b 0a 20 20 20 20 20  Arg[++i]);.     
15470 20 20 20 69 66 28 20 69 53 61 6d 70 6c 65 3c 30     if( iSample<0
15480 20 7c 7c 20 69 53 61 6d 70 6c 65 3e 31 30 30 20   || iSample>100 
15490 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 61 77  ){.          raw
154a0 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
154b0 22 76 61 6c 75 65 20 6f 75 74 20 6f 66 20 72 61  "value out of ra
154c0 6e 67 65 3a 20 25 73 5c 6e 22 2c 20 61 7a 41 72  nge: %s\n", azAr
154d0 67 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 20  g[i]);.         
154e0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
154f0 4f 52 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  OR;.        }.  
15500 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
15510 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 61 77 5f  else{.      raw_
15520 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
15530 75 6e 6b 6e 6f 77 6e 20 6f 70 74 69 6f 6e 3a 20  unknown option: 
15540 25 73 5c 6e 22 2c 20 7a 29 3b 0a 20 20 20 20 20  %s\n", z);.     
15550 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
15560 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  OR;.    }.  }.. 
15570 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
15580 4f 4b 20 29 7b 0a 20 20 20 20 70 53 74 61 74 65  OK ){.    pState
15590 2d 3e 65 78 70 65 72 74 2e 70 45 78 70 65 72 74  ->expert.pExpert
155a0 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 70 65 72   = sqlite3_exper
155b0 74 5f 6e 65 77 28 70 53 74 61 74 65 2d 3e 64 62  t_new(pState->db
155c0 2c 20 26 7a 45 72 72 29 3b 0a 20 20 20 20 69 66  , &zErr);.    if
155d0 28 20 70 53 74 61 74 65 2d 3e 65 78 70 65 72 74  ( pState->expert
155e0 2e 70 45 78 70 65 72 74 3d 3d 30 20 29 7b 0a 20  .pExpert==0 ){. 
155f0 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
15600 73 74 64 65 72 72 2c 20 22 73 71 6c 69 74 65 33  stderr, "sqlite3
15610 5f 65 78 70 65 72 74 5f 6e 65 77 3a 20 25 73 5c  _expert_new: %s\
15620 6e 22 2c 20 7a 45 72 72 29 3b 0a 20 20 20 20 20  n", zErr);.     
15630 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
15640 4f 52 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  OR;.    }else{. 
15650 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65 78 70       sqlite3_exp
15660 65 72 74 5f 63 6f 6e 66 69 67 28 0a 20 20 20 20  ert_config(.    
15670 20 20 20 20 20 20 70 53 74 61 74 65 2d 3e 65 78        pState->ex
15680 70 65 72 74 2e 70 45 78 70 65 72 74 2c 20 45 58  pert.pExpert, EX
15690 50 45 52 54 5f 43 4f 4e 46 49 47 5f 53 41 4d 50  PERT_CONFIG_SAMP
156a0 4c 45 2c 20 69 53 61 6d 70 6c 65 0a 20 20 20 20  LE, iSample.    
156b0 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a    );.    }.  }..
156c0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23    return rc;.}.#
156d0 65 6e 64 69 66 20 2f 2a 20 69 66 6e 64 65 66 20  endif /* ifndef 
156e0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
156f0 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 2f 2a 0a  UALTABLE */../*.
15700 2a 2a 20 45 78 65 63 75 74 65 20 61 20 73 74 61  ** Execute a sta
15710 74 65 6d 65 6e 74 20 6f 72 20 73 65 74 20 6f 66  tement or set of
15720 20 73 74 61 74 65 6d 65 6e 74 73 2e 20 20 50 72   statements.  Pr
15730 69 6e 74 0a 2a 2a 20 61 6e 79 20 72 65 73 75 6c  int.** any resul
15740 74 20 72 6f 77 73 2f 63 6f 6c 75 6d 6e 73 20 64  t rows/columns d
15750 65 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65 20  epending on the 
15760 63 75 72 72 65 6e 74 20 6d 6f 64 65 0a 2a 2a 20  current mode.** 
15770 73 65 74 20 76 69 61 20 74 68 65 20 73 75 70 70  set via the supp
15780 6c 69 65 64 20 63 61 6c 6c 62 61 63 6b 2e 0a 2a  lied callback..*
15790 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 76 65 72  *.** This is ver
157a0 79 20 73 69 6d 69 6c 61 72 20 74 6f 20 53 51 4c  y similar to SQL
157b0 69 74 65 27 73 20 62 75 69 6c 74 2d 69 6e 20 73  ite's built-in s
157c0 71 6c 69 74 65 33 5f 65 78 65 63 28 29 0a 2a 2a  qlite3_exec().**
157d0 20 66 75 6e 63 74 69 6f 6e 20 65 78 63 65 70 74   function except
157e0 20 69 74 20 74 61 6b 65 73 20 61 20 73 6c 69 67   it takes a slig
157f0 68 74 6c 79 20 64 69 66 66 65 72 65 6e 74 20 63  htly different c
15800 61 6c 6c 62 61 63 6b 0a 2a 2a 20 61 6e 64 20 63  allback.** and c
15810 61 6c 6c 62 61 63 6b 20 64 61 74 61 20 61 72 67  allback data arg
15820 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  ument..*/.static
15830 20 69 6e 74 20 73 68 65 6c 6c 5f 65 78 65 63 28   int shell_exec(
15840 0a 20 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 70  .  ShellState *p
15850 41 72 67 2c 20 20 20 20 20 20 20 20 20 20 20 20  Arg,            
15860 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15870 50 6f 69 6e 74 65 72 20 74 6f 20 53 68 65 6c 6c  Pointer to Shell
15880 53 74 61 74 65 20 2a 2f 0a 20 20 63 6f 6e 73 74  State */.  const
15890 20 63 68 61 72 20 2a 7a 53 71 6c 2c 20 20 20 20   char *zSql,    
158a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
158b0 20 20 20 20 20 2f 2a 20 53 51 4c 20 74 6f 20 62       /* SQL to b
158c0 65 20 65 76 61 6c 75 61 74 65 64 20 2a 2f 0a 20  e evaluated */. 
158d0 20 63 68 61 72 20 2a 2a 70 7a 45 72 72 4d 73 67   char **pzErrMsg
158e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
158f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 72             /* Er
15900 72 6f 72 20 6d 73 67 20 77 72 69 74 74 65 6e 20  ror msg written 
15910 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  here */.){.  sql
15920 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
15930 20 3d 20 4e 55 4c 4c 3b 20 20 20 20 20 2f 2a 20   = NULL;     /* 
15940 53 74 61 74 65 6d 65 6e 74 20 74 6f 20 65 78 65  Statement to exe
15950 63 75 74 65 2e 20 2a 2f 0a 20 20 69 6e 74 20 72  cute. */.  int r
15960 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
15970 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
15980 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 69  turn Code */.  i
15990 6e 74 20 72 63 32 3b 0a 20 20 63 6f 6e 73 74 20  nt rc2;.  const 
159a0 63 68 61 72 20 2a 7a 4c 65 66 74 6f 76 65 72 3b  char *zLeftover;
159b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 69            /* Tai
159c0 6c 20 6f 66 20 75 6e 70 72 6f 63 65 73 73 65 64  l of unprocessed
159d0 20 53 51 4c 20 2a 2f 0a 20 20 73 71 6c 69 74 65   SQL */.  sqlite
159e0 33 20 2a 64 62 20 3d 20 70 41 72 67 2d 3e 64 62  3 *db = pArg->db
159f0 3b 0a 0a 20 20 69 66 28 20 70 7a 45 72 72 4d 73  ;..  if( pzErrMs
15a00 67 20 29 7b 0a 20 20 20 20 2a 70 7a 45 72 72 4d  g ){.    *pzErrM
15a10 73 67 20 3d 20 4e 55 4c 4c 3b 0a 20 20 7d 0a 0a  sg = NULL;.  }..
15a20 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
15a30 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
15a40 0a 20 20 69 66 28 20 70 41 72 67 2d 3e 65 78 70  .  if( pArg->exp
15a50 65 72 74 2e 70 45 78 70 65 72 74 20 29 7b 0a 20  ert.pExpert ){. 
15a60 20 20 20 72 63 20 3d 20 65 78 70 65 72 74 48 61     rc = expertHa
15a70 6e 64 6c 65 53 51 4c 28 70 41 72 67 2c 20 7a 53  ndleSQL(pArg, zS
15a80 71 6c 2c 20 70 7a 45 72 72 4d 73 67 29 3b 0a 20  ql, pzErrMsg);. 
15a90 20 20 20 72 65 74 75 72 6e 20 65 78 70 65 72 74     return expert
15aa0 46 69 6e 69 73 68 28 70 41 72 67 2c 20 28 72 63  Finish(pArg, (rc
15ab0 21 3d 53 51 4c 49 54 45 5f 4f 4b 29 2c 20 70 7a  !=SQLITE_OK), pz
15ac0 45 72 72 4d 73 67 29 3b 0a 20 20 7d 0a 23 65 6e  ErrMsg);.  }.#en
15ad0 64 69 66 0a 0a 20 20 77 68 69 6c 65 28 20 7a 53  dif..  while( zS
15ae0 71 6c 5b 30 5d 20 26 26 20 28 53 51 4c 49 54 45  ql[0] && (SQLITE
15af0 5f 4f 4b 20 3d 3d 20 72 63 29 20 29 7b 0a 20 20  _OK == rc) ){.  
15b00 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63    static const c
15b10 68 61 72 20 2a 7a 53 74 6d 74 53 71 6c 3b 0a 20  har *zStmtSql;. 
15b20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
15b30 70 72 65 70 61 72 65 5f 76 32 28 64 62 2c 20 7a  prepare_v2(db, z
15b40 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c  Sql, -1, &pStmt,
15b50 20 26 7a 4c 65 66 74 6f 76 65 72 29 3b 0a 20 20   &zLeftover);.  
15b60 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 20    if( SQLITE_OK 
15b70 21 3d 20 72 63 20 29 7b 0a 20 20 20 20 20 20 69  != rc ){.      i
15b80 66 28 20 70 7a 45 72 72 4d 73 67 20 29 7b 0a 20  f( pzErrMsg ){. 
15b90 20 20 20 20 20 20 20 2a 70 7a 45 72 72 4d 73 67         *pzErrMsg
15ba0 20 3d 20 73 61 76 65 5f 65 72 72 5f 6d 73 67 28   = save_err_msg(
15bb0 64 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  db);.      }.   
15bc0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66   }else{.      if
15bd0 28 20 21 70 53 74 6d 74 20 29 7b 0a 20 20 20 20  ( !pStmt ){.    
15be0 20 20 20 20 2f 2a 20 74 68 69 73 20 68 61 70 70      /* this happ
15bf0 65 6e 73 20 66 6f 72 20 61 20 63 6f 6d 6d 65 6e  ens for a commen
15c00 74 20 6f 72 20 77 68 69 74 65 2d 73 70 61 63 65  t or white-space
15c10 20 2a 2f 0a 20 20 20 20 20 20 20 20 7a 53 71 6c   */.        zSql
15c20 20 3d 20 7a 4c 65 66 74 6f 76 65 72 3b 0a 20 20   = zLeftover;.  
15c30 20 20 20 20 20 20 77 68 69 6c 65 28 20 49 73 53        while( IsS
15c40 70 61 63 65 28 7a 53 71 6c 5b 30 5d 29 20 29 20  pace(zSql[0]) ) 
15c50 7a 53 71 6c 2b 2b 3b 0a 20 20 20 20 20 20 20 20  zSql++;.        
15c60 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
15c70 7d 0a 20 20 20 20 20 20 7a 53 74 6d 74 53 71 6c  }.      zStmtSql
15c80 20 3d 20 73 71 6c 69 74 65 33 5f 73 71 6c 28 70   = sqlite3_sql(p
15c90 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 69 66 28  Stmt);.      if(
15ca0 20 7a 53 74 6d 74 53 71 6c 3d 3d 30 20 29 20 7a   zStmtSql==0 ) z
15cb0 53 74 6d 74 53 71 6c 20 3d 20 22 22 3b 0a 20 20  StmtSql = "";.  
15cc0 20 20 20 20 77 68 69 6c 65 28 20 49 73 53 70 61      while( IsSpa
15cd0 63 65 28 7a 53 74 6d 74 53 71 6c 5b 30 5d 29 20  ce(zStmtSql[0]) 
15ce0 29 20 7a 53 74 6d 74 53 71 6c 2b 2b 3b 0a 0a 20  ) zStmtSql++;.. 
15cf0 20 20 20 20 20 2f 2a 20 73 61 76 65 20 6f 66 66       /* save off
15d00 20 74 68 65 20 70 72 65 70 61 72 65 64 20 73 74   the prepared st
15d10 61 74 6d 65 6e 74 20 68 61 6e 64 6c 65 20 61 6e  atment handle an
15d20 64 20 72 65 73 65 74 20 72 6f 77 20 63 6f 75 6e  d reset row coun
15d30 74 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70  t */.      if( p
15d40 41 72 67 20 29 7b 0a 20 20 20 20 20 20 20 20 70  Arg ){.        p
15d50 41 72 67 2d 3e 70 53 74 6d 74 20 3d 20 70 53 74  Arg->pStmt = pSt
15d60 6d 74 3b 0a 20 20 20 20 20 20 20 20 70 41 72 67  mt;.        pArg
15d70 2d 3e 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 20  ->cnt = 0;.     
15d80 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 65 63 68   }..      /* ech
15d90 6f 20 74 68 65 20 73 71 6c 20 73 74 61 74 65 6d  o the sql statem
15da0 65 6e 74 20 69 66 20 65 63 68 6f 20 6f 6e 20 2a  ent if echo on *
15db0 2f 0a 20 20 20 20 20 20 69 66 28 20 70 41 72 67  /.      if( pArg
15dc0 20 26 26 20 53 68 65 6c 6c 48 61 73 46 6c 61 67   && ShellHasFlag
15dd0 28 70 41 72 67 2c 20 53 48 46 4c 47 5f 45 63 68  (pArg, SHFLG_Ech
15de0 6f 29 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74  o) ){.        ut
15df0 66 38 5f 70 72 69 6e 74 66 28 70 41 72 67 2d 3e  f8_printf(pArg->
15e00 6f 75 74 2c 20 22 25 73 5c 6e 22 2c 20 7a 53 74  out, "%s\n", zSt
15e10 6d 74 53 71 6c 20 3f 20 7a 53 74 6d 74 53 71 6c  mtSql ? zStmtSql
15e20 20 3a 20 7a 53 71 6c 29 3b 0a 20 20 20 20 20 20   : zSql);.      
15e30 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 53 68 6f 77  }..      /* Show
15e40 20 74 68 65 20 45 58 50 4c 41 49 4e 20 51 55 45   the EXPLAIN QUE
15e50 52 59 20 50 4c 41 4e 20 69 66 20 2e 65 71 70 20  RY PLAN if .eqp 
15e60 69 73 20 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 69  is on */.      i
15e70 66 28 20 70 41 72 67 20 26 26 20 70 41 72 67 2d  f( pArg && pArg-
15e80 3e 61 75 74 6f 45 51 50 20 26 26 20 73 71 6c 69  >autoEQP && sqli
15e90 74 65 33 5f 73 74 72 6c 69 6b 65 28 22 45 58 50  te3_strlike("EXP
15ea0 4c 41 49 4e 25 22 2c 7a 53 74 6d 74 53 71 6c 2c  LAIN%",zStmtSql,
15eb0 30 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  0)!=0 ){.       
15ec0 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
15ed0 45 78 70 6c 61 69 6e 3b 0a 20 20 20 20 20 20 20  Explain;.       
15ee0 20 63 68 61 72 20 2a 7a 45 51 50 3b 0a 20 20 20   char *zEQP;.   
15ef0 20 20 20 20 20 69 6e 74 20 74 72 69 67 67 65 72       int trigger
15f00 45 51 50 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  EQP = 0;.       
15f10 20 64 69 73 61 62 6c 65 5f 64 65 62 75 67 5f 74   disable_debug_t
15f20 72 61 63 65 5f 6d 6f 64 65 73 28 29 3b 0a 20 20  race_modes();.  
15f30 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 64 62        sqlite3_db
15f40 5f 63 6f 6e 66 69 67 28 64 62 2c 20 53 51 4c 49  _config(db, SQLI
15f50 54 45 5f 44 42 43 4f 4e 46 49 47 5f 54 52 49 47  TE_DBCONFIG_TRIG
15f60 47 45 52 5f 45 51 50 2c 20 2d 31 2c 20 26 74 72  GER_EQP, -1, &tr
15f70 69 67 67 65 72 45 51 50 29 3b 0a 20 20 20 20 20  iggerEQP);.     
15f80 20 20 20 69 66 28 20 70 41 72 67 2d 3e 61 75 74     if( pArg->aut
15f90 6f 45 51 50 3e 3d 41 55 54 4f 45 51 50 5f 74 72  oEQP>=AUTOEQP_tr
15fa0 69 67 67 65 72 20 29 7b 0a 20 20 20 20 20 20 20  igger ){.       
15fb0 20 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 63 6f     sqlite3_db_co
15fc0 6e 66 69 67 28 64 62 2c 20 53 51 4c 49 54 45 5f  nfig(db, SQLITE_
15fd0 44 42 43 4f 4e 46 49 47 5f 54 52 49 47 47 45 52  DBCONFIG_TRIGGER
15fe0 5f 45 51 50 2c 20 31 2c 20 30 29 3b 0a 20 20 20  _EQP, 1, 0);.   
15ff0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7a       }.        z
16000 45 51 50 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  EQP = sqlite3_mp
16010 72 69 6e 74 66 28 22 45 58 50 4c 41 49 4e 20 51  rintf("EXPLAIN Q
16020 55 45 52 59 20 50 4c 41 4e 20 25 73 22 2c 20 7a  UERY PLAN %s", z
16030 53 74 6d 74 53 71 6c 29 3b 0a 20 20 20 20 20 20  StmtSql);.      
16040 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70    rc = sqlite3_p
16050 72 65 70 61 72 65 5f 76 32 28 64 62 2c 20 7a 45  repare_v2(db, zE
16060 51 50 2c 20 2d 31 2c 20 26 70 45 78 70 6c 61 69  QP, -1, &pExplai
16070 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69  n, 0);.        i
16080 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
16090 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 77 68   ){.          wh
160a0 69 6c 65 28 20 73 71 6c 69 74 65 33 5f 73 74 65  ile( sqlite3_ste
160b0 70 28 70 45 78 70 6c 61 69 6e 29 3d 3d 53 51 4c  p(pExplain)==SQL
160c0 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 20  ITE_ROW ){.     
160d0 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61         const cha
160e0 72 20 2a 7a 45 51 50 4c 69 6e 65 20 3d 20 28 63  r *zEQPLine = (c
160f0 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74  onst char*)sqlit
16100 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70  e3_column_text(p
16110 45 78 70 6c 61 69 6e 2c 33 29 3b 0a 20 20 20 20  Explain,3);.    
16120 20 20 20 20 20 20 20 20 69 6e 74 20 69 45 71 70          int iEqp
16130 49 64 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  Id = sqlite3_col
16140 75 6d 6e 5f 69 6e 74 28 70 45 78 70 6c 61 69 6e  umn_int(pExplain
16150 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
16160 20 20 69 6e 74 20 69 50 61 72 65 6e 74 49 64 20    int iParentId 
16170 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
16180 5f 69 6e 74 28 70 45 78 70 6c 61 69 6e 2c 20 31  _int(pExplain, 1
16190 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
161a0 66 28 20 7a 45 51 50 4c 69 6e 65 5b 30 5d 3d 3d  f( zEQPLine[0]==
161b0 27 2d 27 20 29 20 65 71 70 5f 72 65 6e 64 65 72  '-' ) eqp_render
161c0 28 70 41 72 67 29 3b 0a 20 20 20 20 20 20 20 20  (pArg);.        
161d0 20 20 20 20 65 71 70 5f 61 70 70 65 6e 64 28 70      eqp_append(p
161e0 41 72 67 2c 20 69 45 71 70 49 64 2c 20 69 50 61  Arg, iEqpId, iPa
161f0 72 65 6e 74 49 64 2c 20 7a 45 51 50 4c 69 6e 65  rentId, zEQPLine
16200 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
16210 20 20 20 20 20 20 20 20 20 65 71 70 5f 72 65 6e           eqp_ren
16220 64 65 72 28 70 41 72 67 29 3b 0a 20 20 20 20 20  der(pArg);.     
16230 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c     }.        sql
16240 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 45  ite3_finalize(pE
16250 78 70 6c 61 69 6e 29 3b 0a 20 20 20 20 20 20 20  xplain);.       
16260 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 45   sqlite3_free(zE
16270 51 50 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  QP);.        if(
16280 20 70 41 72 67 2d 3e 61 75 74 6f 45 51 50 3e 3d   pArg->autoEQP>=
16290 41 55 54 4f 45 51 50 5f 66 75 6c 6c 20 29 7b 0a  AUTOEQP_full ){.
162a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 73            /* Als
162b0 6f 20 64 6f 20 61 6e 20 45 58 50 4c 41 49 4e 20  o do an EXPLAIN 
162c0 66 6f 72 20 22 2e 65 71 70 20 66 75 6c 6c 22 20  for ".eqp full" 
162d0 6d 6f 64 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  mode */.        
162e0 20 20 7a 45 51 50 20 3d 20 73 71 6c 69 74 65 33    zEQP = sqlite3
162f0 5f 6d 70 72 69 6e 74 66 28 22 45 58 50 4c 41 49  _mprintf("EXPLAI
16300 4e 20 25 73 22 2c 20 7a 53 74 6d 74 53 71 6c 29  N %s", zStmtSql)
16310 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
16320 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
16330 5f 76 32 28 64 62 2c 20 7a 45 51 50 2c 20 2d 31  _v2(db, zEQP, -1
16340 2c 20 26 70 45 78 70 6c 61 69 6e 2c 20 30 29 3b  , &pExplain, 0);
16350 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
16360 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
16370 20 20 20 20 20 20 20 20 20 20 20 20 70 41 72 67              pArg
16380 2d 3e 63 4d 6f 64 65 20 3d 20 4d 4f 44 45 5f 45  ->cMode = MODE_E
16390 78 70 6c 61 69 6e 3b 0a 20 20 20 20 20 20 20 20  xplain;.        
163a0 20 20 20 20 65 78 70 6c 61 69 6e 5f 64 61 74 61      explain_data
163b0 5f 70 72 65 70 61 72 65 28 70 41 72 67 2c 20 70  _prepare(pArg, p
163c0 45 78 70 6c 61 69 6e 29 3b 0a 20 20 20 20 20 20  Explain);.      
163d0 20 20 20 20 20 20 65 78 65 63 5f 70 72 65 70 61        exec_prepa
163e0 72 65 64 5f 73 74 6d 74 28 70 41 72 67 2c 20 70  red_stmt(pArg, p
163f0 45 78 70 6c 61 69 6e 29 3b 0a 20 20 20 20 20 20  Explain);.      
16400 20 20 20 20 20 20 65 78 70 6c 61 69 6e 5f 64 61        explain_da
16410 74 61 5f 64 65 6c 65 74 65 28 70 41 72 67 29 3b  ta_delete(pArg);
16420 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
16430 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
16440 69 6e 61 6c 69 7a 65 28 70 45 78 70 6c 61 69 6e  inalize(pExplain
16450 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
16460 69 74 65 33 5f 66 72 65 65 28 7a 45 51 50 29 3b  ite3_free(zEQP);
16470 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
16480 20 20 20 69 66 28 20 70 41 72 67 2d 3e 61 75 74     if( pArg->aut
16490 6f 45 51 50 3e 3d 41 55 54 4f 45 51 50 5f 74 72  oEQP>=AUTOEQP_tr
164a0 69 67 67 65 72 20 26 26 20 74 72 69 67 67 65 72  igger && trigger
164b0 45 51 50 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  EQP==0 ){.      
164c0 20 20 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 63      sqlite3_db_c
164d0 6f 6e 66 69 67 28 64 62 2c 20 53 51 4c 49 54 45  onfig(db, SQLITE
164e0 5f 44 42 43 4f 4e 46 49 47 5f 54 52 49 47 47 45  _DBCONFIG_TRIGGE
164f0 52 5f 45 51 50 2c 20 30 2c 20 30 29 3b 0a 20 20  R_EQP, 0, 0);.  
16500 20 20 20 20 20 20 20 20 2f 2a 20 52 65 70 72 65          /* Repre
16510 70 61 72 65 20 70 53 74 6d 74 20 62 65 66 6f 72  pare pStmt befor
16520 65 20 72 65 61 63 74 69 76 69 6e 67 20 74 72 61  e reactiving tra
16530 63 65 20 6d 6f 64 65 73 20 2a 2f 0a 20 20 20 20  ce modes */.    
16540 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69        sqlite3_fi
16550 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20  nalize(pStmt);. 
16560 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
16570 5f 70 72 65 70 61 72 65 5f 76 32 28 64 62 2c 20  _prepare_v2(db, 
16580 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74  zSql, -1, &pStmt
16590 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
165a0 69 66 28 20 70 41 72 67 20 29 20 70 41 72 67 2d  if( pArg ) pArg-
165b0 3e 70 53 74 6d 74 20 3d 20 70 53 74 6d 74 3b 0a  >pStmt = pStmt;.
165c0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
165d0 20 20 72 65 73 74 6f 72 65 5f 64 65 62 75 67 5f    restore_debug_
165e0 74 72 61 63 65 5f 6d 6f 64 65 73 28 29 3b 0a 20  trace_modes();. 
165f0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66       }..      if
16600 28 20 70 41 72 67 20 29 7b 0a 20 20 20 20 20 20  ( pArg ){.      
16610 20 20 70 41 72 67 2d 3e 63 4d 6f 64 65 20 3d 20    pArg->cMode = 
16620 70 41 72 67 2d 3e 6d 6f 64 65 3b 0a 20 20 20 20  pArg->mode;.    
16630 20 20 20 20 69 66 28 20 70 41 72 67 2d 3e 61 75      if( pArg->au
16640 74 6f 45 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20  toExplain ){.   
16650 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
16660 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28  e3_column_count(
16670 70 53 74 6d 74 29 3d 3d 38 0a 20 20 20 20 20 20  pStmt)==8.      
16680 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 5f       && sqlite3_
16690 73 74 72 6c 69 6b 65 28 22 45 58 50 4c 41 49 4e  strlike("EXPLAIN
166a0 25 22 2c 20 7a 53 74 6d 74 53 71 6c 2c 30 29 3d  %", zStmtSql,0)=
166b0 3d 30 0a 20 20 20 20 20 20 20 20 20 20 29 7b 0a  =0.          ){.
166c0 20 20 20 20 20 20 20 20 20 20 20 20 70 41 72 67              pArg
166d0 2d 3e 63 4d 6f 64 65 20 3d 20 4d 4f 44 45 5f 45  ->cMode = MODE_E
166e0 78 70 6c 61 69 6e 3b 0a 20 20 20 20 20 20 20 20  xplain;.        
166f0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66    }.          if
16700 28 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  ( sqlite3_column
16710 5f 63 6f 75 6e 74 28 70 53 74 6d 74 29 3d 3d 34  _count(pStmt)==4
16720 0a 20 20 20 20 20 20 20 20 20 20 20 26 26 20 73  .           && s
16730 71 6c 69 74 65 33 5f 73 74 72 6c 69 6b 65 28 22  qlite3_strlike("
16740 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c  EXPLAIN QUERY PL
16750 41 4e 25 22 2c 20 7a 53 74 6d 74 53 71 6c 2c 30  AN%", zStmtSql,0
16760 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
16770 20 20 20 20 70 41 72 67 2d 3e 63 4d 6f 64 65 20      pArg->cMode 
16780 3d 20 4d 4f 44 45 5f 45 51 50 3b 0a 20 20 20 20  = MODE_EQP;.    
16790 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
167a0 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66  }..        /* If
167b0 20 74 68 65 20 73 68 65 6c 6c 20 69 73 20 63 75   the shell is cu
167c0 72 72 65 6e 74 6c 79 20 69 6e 20 22 2e 65 78 70  rrently in ".exp
167d0 6c 61 69 6e 22 20 6d 6f 64 65 2c 20 67 61 74 68  lain" mode, gath
167e0 65 72 20 74 68 65 20 65 78 74 72 61 0a 20 20 20  er the extra.   
167f0 20 20 20 20 20 2a 2a 20 64 61 74 61 20 72 65 71       ** data req
16800 75 69 72 65 64 20 74 6f 20 61 64 64 20 69 6e 64  uired to add ind
16810 65 6e 74 73 20 74 6f 20 74 68 65 20 6f 75 74 70  ents to the outp
16820 75 74 2e 2a 2f 0a 20 20 20 20 20 20 20 20 69 66  ut.*/.        if
16830 28 20 70 41 72 67 2d 3e 63 4d 6f 64 65 3d 3d 4d  ( pArg->cMode==M
16840 4f 44 45 5f 45 78 70 6c 61 69 6e 20 29 7b 0a 20  ODE_Explain ){. 
16850 20 20 20 20 20 20 20 20 20 65 78 70 6c 61 69 6e           explain
16860 5f 64 61 74 61 5f 70 72 65 70 61 72 65 28 70 41  _data_prepare(pA
16870 72 67 2c 20 70 53 74 6d 74 29 3b 0a 20 20 20 20  rg, pStmt);.    
16880 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20      }.      }.. 
16890 20 20 20 20 20 65 78 65 63 5f 70 72 65 70 61 72       exec_prepar
168a0 65 64 5f 73 74 6d 74 28 70 41 72 67 2c 20 70 53  ed_stmt(pArg, pS
168b0 74 6d 74 29 3b 0a 20 20 20 20 20 20 65 78 70 6c  tmt);.      expl
168c0 61 69 6e 5f 64 61 74 61 5f 64 65 6c 65 74 65 28  ain_data_delete(
168d0 70 41 72 67 29 3b 0a 20 20 20 20 20 20 65 71 70  pArg);.      eqp
168e0 5f 72 65 6e 64 65 72 28 70 41 72 67 29 3b 0a 0a  _render(pArg);..
168f0 20 20 20 20 20 20 2f 2a 20 70 72 69 6e 74 20 75        /* print u
16900 73 61 67 65 20 73 74 61 74 73 20 69 66 20 73 74  sage stats if st
16910 61 74 73 20 6f 6e 20 2a 2f 0a 20 20 20 20 20 20  ats on */.      
16920 69 66 28 20 70 41 72 67 20 26 26 20 70 41 72 67  if( pArg && pArg
16930 2d 3e 73 74 61 74 73 4f 6e 20 29 7b 0a 20 20 20  ->statsOn ){.   
16940 20 20 20 20 20 64 69 73 70 6c 61 79 5f 73 74 61       display_sta
16950 74 73 28 64 62 2c 20 70 41 72 67 2c 20 30 29 3b  ts(db, pArg, 0);
16960 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
16970 2f 2a 20 70 72 69 6e 74 20 6c 6f 6f 70 2d 63 6f  /* print loop-co
16980 75 6e 74 65 72 73 20 69 66 20 72 65 71 75 69 72  unters if requir
16990 65 64 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  ed */.      if( 
169a0 70 41 72 67 20 26 26 20 70 41 72 67 2d 3e 73 63  pArg && pArg->sc
169b0 61 6e 73 74 61 74 73 4f 6e 20 29 7b 0a 20 20 20  anstatsOn ){.   
169c0 20 20 20 20 20 64 69 73 70 6c 61 79 5f 73 63 61       display_sca
169d0 6e 73 74 61 74 73 28 64 62 2c 20 70 41 72 67 29  nstats(db, pArg)
169e0 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
169f0 20 2f 2a 20 46 69 6e 61 6c 69 7a 65 20 74 68 65   /* Finalize the
16a00 20 73 74 61 74 65 6d 65 6e 74 20 6a 75 73 74 20   statement just 
16a10 65 78 65 63 75 74 65 64 2e 20 49 66 20 74 68 69  executed. If thi
16a20 73 20 66 61 69 6c 73 2c 20 73 61 76 65 20 61 0a  s fails, save a.
16a30 20 20 20 20 20 20 2a 2a 20 63 6f 70 79 20 6f 66        ** copy of
16a40 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61   the error messa
16a50 67 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 73  ge. Otherwise, s
16a60 65 74 20 7a 53 71 6c 20 74 6f 20 70 6f 69 6e 74  et zSql to point
16a70 20 74 6f 20 74 68 65 0a 20 20 20 20 20 20 2a 2a   to the.      **
16a80 20 6e 65 78 74 20 73 74 61 74 65 6d 65 6e 74 20   next statement 
16a90 74 6f 20 65 78 65 63 75 74 65 2e 20 2a 2f 0a 20  to execute. */. 
16aa0 20 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74       rc2 = sqlit
16ab0 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d  e3_finalize(pStm
16ac0 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  t);.      if( rc
16ad0 21 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29  !=SQLITE_NOMEM )
16ae0 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 20 20 20   rc = rc2;.     
16af0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
16b00 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 53  OK ){.        zS
16b10 71 6c 20 3d 20 7a 4c 65 66 74 6f 76 65 72 3b 0a  ql = zLeftover;.
16b20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 49          while( I
16b30 73 53 70 61 63 65 28 7a 53 71 6c 5b 30 5d 29 20  sSpace(zSql[0]) 
16b40 29 20 7a 53 71 6c 2b 2b 3b 0a 20 20 20 20 20 20  ) zSql++;.      
16b50 7d 65 6c 73 65 20 69 66 28 20 70 7a 45 72 72 4d  }else if( pzErrM
16b60 73 67 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70  sg ){.        *p
16b70 7a 45 72 72 4d 73 67 20 3d 20 73 61 76 65 5f 65  zErrMsg = save_e
16b80 72 72 5f 6d 73 67 28 64 62 29 3b 0a 20 20 20 20  rr_msg(db);.    
16b90 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 63 6c    }..      /* cl
16ba0 65 61 72 20 73 61 76 65 64 20 73 74 6d 74 20 68  ear saved stmt h
16bb0 61 6e 64 6c 65 20 2a 2f 0a 20 20 20 20 20 20 69  andle */.      i
16bc0 66 28 20 70 41 72 67 20 29 7b 0a 20 20 20 20 20  f( pArg ){.     
16bd0 20 20 20 70 41 72 67 2d 3e 70 53 74 6d 74 20 3d     pArg->pStmt =
16be0 20 4e 55 4c 4c 3b 0a 20 20 20 20 20 20 7d 0a 20   NULL;.      }. 
16bf0 20 20 20 7d 0a 20 20 7d 20 2f 2a 20 65 6e 64 20     }.  } /* end 
16c00 77 68 69 6c 65 20 2a 2f 0a 0a 20 20 72 65 74 75  while */..  retu
16c10 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
16c20 52 65 6c 65 61 73 65 20 6d 65 6d 6f 72 79 20 70  Release memory p
16c30 72 65 76 69 6f 75 73 6c 79 20 61 6c 6c 6f 63 61  reviously alloca
16c40 74 65 64 20 62 79 20 74 61 62 6c 65 43 6f 6c 75  ted by tableColu
16c50 6d 6e 4c 69 73 74 28 29 2e 0a 2a 2f 0a 73 74 61  mnList()..*/.sta
16c60 74 69 63 20 76 6f 69 64 20 66 72 65 65 43 6f 6c  tic void freeCol
16c70 75 6d 6e 4c 69 73 74 28 63 68 61 72 20 2a 2a 61  umnList(char **a
16c80 7a 43 6f 6c 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  zCol){.  int i;.
16c90 20 20 66 6f 72 28 69 3d 31 3b 20 61 7a 43 6f 6c    for(i=1; azCol
16ca0 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  [i]; i++){.    s
16cb0 71 6c 69 74 65 33 5f 66 72 65 65 28 61 7a 43 6f  qlite3_free(azCo
16cc0 6c 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 2f 2a 20  l[i]);.  }.  /* 
16cd0 61 7a 43 6f 6c 5b 30 5d 20 69 73 20 61 20 73 74  azCol[0] is a st
16ce0 61 74 69 63 20 73 74 72 69 6e 67 20 2a 2f 0a 20  atic string */. 
16cf0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 61 7a   sqlite3_free(az
16d00 43 6f 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  Col);.}../*.** R
16d10 65 74 75 72 6e 20 61 20 6c 69 73 74 20 6f 66 20  eturn a list of 
16d20 70 6f 69 6e 74 65 72 73 20 74 6f 20 73 74 72 69  pointers to stri
16d30 6e 67 73 20 77 68 69 63 68 20 61 72 65 20 74 68  ngs which are th
16d40 65 20 6e 61 6d 65 73 20 6f 66 20 61 6c 6c 0a 2a  e names of all.*
16d50 2a 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 61 62  * columns in tab
16d60 6c 65 20 7a 54 61 62 2e 20 20 20 54 68 65 20 6d  le zTab.   The m
16d70 65 6d 6f 72 79 20 74 6f 20 68 6f 6c 64 20 74 68  emory to hold th
16d80 65 20 6e 61 6d 65 73 20 69 73 20 64 79 6e 61 6d  e names is dynam
16d90 69 63 61 6c 6c 79 0a 2a 2a 20 61 6c 6c 6f 63 61  ically.** alloca
16da0 74 65 64 20 61 6e 64 20 6d 75 73 74 20 62 65 20  ted and must be 
16db0 72 65 6c 65 61 73 65 64 20 62 79 20 74 68 65 20  released by the 
16dc0 63 61 6c 6c 65 72 20 75 73 69 6e 67 20 61 20 73  caller using a s
16dd0 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 0a 2a  ubsequent call.*
16de0 2a 20 74 6f 20 66 72 65 65 43 6f 6c 75 6d 6e 4c  * to freeColumnL
16df0 69 73 74 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ist()..**.** The
16e00 20 61 7a 43 6f 6c 5b 30 5d 20 65 6e 74 72 79 20   azCol[0] entry 
16e10 69 73 20 75 73 75 61 6c 6c 79 20 4e 55 4c 4c 2e  is usually NULL.
16e20 20 20 48 6f 77 65 76 65 72 2c 20 69 66 20 7a 54    However, if zT
16e30 61 62 20 63 6f 6e 74 61 69 6e 73 20 61 20 72 6f  ab contains a ro
16e40 77 69 64 0a 2a 2a 20 76 61 6c 75 65 20 74 68 61  wid.** value tha
16e50 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 70 72  t needs to be pr
16e60 65 73 65 72 76 65 64 2c 20 74 68 65 6e 20 61 7a  eserved, then az
16e70 43 6f 6c 5b 30 5d 20 69 73 20 66 69 6c 6c 65 64  Col[0] is filled
16e80 20 69 6e 20 77 69 74 68 20 74 68 65 0a 2a 2a 20   in with the.** 
16e90 6e 61 6d 65 20 6f 66 20 74 68 65 20 72 6f 77 69  name of the rowi
16ea0 64 20 63 6f 6c 75 6d 6e 2e 0a 2a 2a 0a 2a 2a 20  d column..**.** 
16eb0 54 68 65 20 66 69 72 73 74 20 72 65 67 75 6c 61  The first regula
16ec0 72 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20  r column in the 
16ed0 74 61 62 6c 65 20 69 73 20 61 7a 43 6f 6c 5b 31  table is azCol[1
16ee0 5d 2e 20 20 54 68 65 20 6c 69 73 74 20 69 73 20  ].  The list is 
16ef0 74 65 72 6d 69 6e 61 74 65 64 0a 2a 2a 20 62 79  terminated.** by
16f00 20 61 6e 20 65 6e 74 72 79 20 77 69 74 68 20 61   an entry with a
16f10 7a 43 6f 6c 5b 69 5d 3d 3d 30 2e 0a 2a 2f 0a 73  zCol[i]==0..*/.s
16f20 74 61 74 69 63 20 63 68 61 72 20 2a 2a 74 61 62  tatic char **tab
16f30 6c 65 43 6f 6c 75 6d 6e 4c 69 73 74 28 53 68 65  leColumnList(She
16f40 6c 6c 53 74 61 74 65 20 2a 70 2c 20 63 6f 6e 73  llState *p, cons
16f50 74 20 63 68 61 72 20 2a 7a 54 61 62 29 7b 0a 20  t char *zTab){. 
16f60 20 63 68 61 72 20 2a 2a 61 7a 43 6f 6c 20 3d 20   char **azCol = 
16f70 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  0;.  sqlite3_stm
16f80 74 20 2a 70 53 74 6d 74 3b 0a 20 20 63 68 61 72  t *pStmt;.  char
16f90 20 2a 7a 53 71 6c 3b 0a 20 20 69 6e 74 20 6e 43   *zSql;.  int nC
16fa0 6f 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 41  ol = 0;.  int nA
16fb0 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 69 6e 74 20  lloc = 0;.  int 
16fc0 6e 50 4b 20 3d 20 30 3b 20 20 20 20 20 20 20 2f  nPK = 0;       /
16fd0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 50 52 49 4d  * Number of PRIM
16fe0 41 52 59 20 4b 45 59 20 63 6f 6c 75 6d 6e 73 20  ARY KEY columns 
16ff0 73 65 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 73  seen */.  int is
17000 49 50 4b 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20  IPK = 0;     /* 
17010 54 72 75 65 20 69 66 20 6f 6e 65 20 50 52 49 4d  True if one PRIM
17020 41 52 59 20 4b 45 59 20 63 6f 6c 75 6d 6e 20 6f  ARY KEY column o
17030 66 20 74 79 70 65 20 49 4e 54 45 47 45 52 20 2a  f type INTEGER *
17040 2f 0a 20 20 69 6e 74 20 70 72 65 73 65 72 76 65  /.  int preserve
17050 52 6f 77 69 64 20 3d 20 53 68 65 6c 6c 48 61 73  Rowid = ShellHas
17060 46 6c 61 67 28 70 2c 20 53 48 46 4c 47 5f 50 72  Flag(p, SHFLG_Pr
17070 65 73 65 72 76 65 52 6f 77 69 64 29 3b 0a 20 20  eserveRowid);.  
17080 69 6e 74 20 72 63 3b 0a 0a 20 20 7a 53 71 6c 20  int rc;..  zSql 
17090 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
170a0 66 28 22 50 52 41 47 4d 41 20 74 61 62 6c 65 5f  f("PRAGMA table_
170b0 69 6e 66 6f 3d 25 51 22 2c 20 7a 54 61 62 29 3b  info=%Q", zTab);
170c0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
170d0 70 72 65 70 61 72 65 5f 76 32 28 70 2d 3e 64 62  prepare_v2(p->db
170e0 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74  , zSql, -1, &pSt
170f0 6d 74 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65  mt, 0);.  sqlite
17100 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20  3_free(zSql);.  
17110 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
17120 30 3b 0a 20 20 77 68 69 6c 65 28 20 73 71 6c 69  0;.  while( sqli
17130 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3d  te3_step(pStmt)=
17140 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20  =SQLITE_ROW ){. 
17150 20 20 20 69 66 28 20 6e 43 6f 6c 3e 3d 6e 41 6c     if( nCol>=nAl
17160 6c 6f 63 2d 32 20 29 7b 0a 20 20 20 20 20 20 6e  loc-2 ){.      n
17170 41 6c 6c 6f 63 20 3d 20 6e 41 6c 6c 6f 63 2a 32  Alloc = nAlloc*2
17180 20 2b 20 6e 43 6f 6c 20 2b 20 31 30 3b 0a 20 20   + nCol + 10;.  
17190 20 20 20 20 61 7a 43 6f 6c 20 3d 20 73 71 6c 69      azCol = sqli
171a0 74 65 33 5f 72 65 61 6c 6c 6f 63 28 61 7a 43 6f  te3_realloc(azCo
171b0 6c 2c 20 6e 41 6c 6c 6f 63 2a 73 69 7a 65 6f 66  l, nAlloc*sizeof
171c0 28 61 7a 43 6f 6c 5b 30 5d 29 29 3b 0a 20 20 20  (azCol[0]));.   
171d0 20 20 20 69 66 28 20 61 7a 43 6f 6c 3d 3d 30 20     if( azCol==0 
171e0 29 20 73 68 65 6c 6c 5f 6f 75 74 5f 6f 66 5f 6d  ) shell_out_of_m
171f0 65 6d 6f 72 79 28 29 3b 0a 20 20 20 20 7d 0a 20  emory();.    }. 
17200 20 20 20 61 7a 43 6f 6c 5b 2b 2b 6e 43 6f 6c 5d     azCol[++nCol]
17210 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
17220 74 66 28 22 25 73 22 2c 20 73 71 6c 69 74 65 33  tf("%s", sqlite3
17230 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74  _column_text(pSt
17240 6d 74 2c 20 31 29 29 3b 0a 20 20 20 20 69 66 28  mt, 1));.    if(
17250 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
17260 69 6e 74 28 70 53 74 6d 74 2c 20 35 29 20 29 7b  int(pStmt, 5) ){
17270 0a 20 20 20 20 20 20 6e 50 4b 2b 2b 3b 0a 20 20  .      nPK++;.  
17280 20 20 20 20 69 66 28 20 6e 50 4b 3d 3d 31 0a 20      if( nPK==1. 
17290 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33        && sqlite3
172a0 5f 73 74 72 69 63 6d 70 28 28 63 6f 6e 73 74 20  _stricmp((const 
172b0 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f  char*)sqlite3_co
172c0 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c  lumn_text(pStmt,
172d0 32 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  2),.            
172e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 49                "I
172f0 4e 54 45 47 45 52 22 29 3d 3d 30 0a 20 20 20 20  NTEGER")==0.    
17300 20 20 29 7b 0a 20 20 20 20 20 20 20 20 69 73 49    ){.        isI
17310 50 4b 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65  PK = 1;.      }e
17320 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 73 49  lse{.        isI
17330 50 4b 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  PK = 0;.      }.
17340 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
17350 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74  te3_finalize(pSt
17360 6d 74 29 3b 0a 20 20 69 66 28 20 61 7a 43 6f 6c  mt);.  if( azCol
17370 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
17380 20 20 61 7a 43 6f 6c 5b 30 5d 20 3d 20 30 3b 0a    azCol[0] = 0;.
17390 20 20 61 7a 43 6f 6c 5b 6e 43 6f 6c 2b 31 5d 20    azCol[nCol+1] 
173a0 3d 20 30 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 64  = 0;..  /* The d
173b0 65 63 69 73 69 6f 6e 20 6f 66 20 77 68 65 74 68  ecision of wheth
173c0 65 72 20 6f 72 20 6e 6f 74 20 61 20 72 6f 77 69  er or not a rowi
173d0 64 20 72 65 61 6c 6c 79 20 6e 65 65 64 73 20 74  d really needs t
173e0 6f 20 62 65 20 70 72 65 73 65 72 76 65 64 0a 20  o be preserved. 
173f0 20 2a 2a 20 69 73 20 74 72 69 63 6b 79 2e 20 20   ** is tricky.  
17400 57 65 20 6e 65 76 65 72 20 6e 65 65 64 20 74 6f  We never need to
17410 20 70 72 65 73 65 72 76 65 20 61 20 72 6f 77 69   preserve a rowi
17420 64 20 66 6f 72 20 61 20 57 49 54 48 4f 55 54 20  d for a WITHOUT 
17430 52 4f 57 49 44 20 74 61 62 6c 65 0a 20 20 2a 2a  ROWID table.  **
17440 20 6f 72 20 61 20 74 61 62 6c 65 20 77 69 74 68   or a table with
17450 20 61 6e 20 49 4e 54 45 47 45 52 20 50 52 49 4d   an INTEGER PRIM
17460 41 52 59 20 4b 45 59 2e 20 20 57 65 20 61 72 65  ARY KEY.  We are
17470 20 75 6e 61 62 6c 65 20 74 6f 20 70 72 65 73 65   unable to prese
17480 72 76 65 0a 20 20 2a 2a 20 72 6f 77 69 64 73 20  rve.  ** rowids 
17490 6f 6e 20 74 61 62 6c 65 73 20 77 68 65 72 65 20  on tables where 
174a0 74 68 65 20 72 6f 77 69 64 20 69 73 20 69 6e 61  the rowid is ina
174b0 63 63 65 73 73 69 62 6c 65 20 62 65 63 61 75 73  ccessible becaus
174c0 65 20 74 68 65 72 65 20 61 72 65 20 6f 74 68 65  e there are othe
174d0 72 0a 20 20 2a 2a 20 63 6f 6c 75 6d 6e 73 20 69  r.  ** columns i
174e0 6e 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65  n the table name
174f0 64 20 22 72 6f 77 69 64 22 2c 20 22 5f 72 6f 77  d "rowid", "_row
17500 69 64 5f 22 2c 20 61 6e 64 20 22 6f 69 64 22 2e  id_", and "oid".
17510 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 72 65 73  .  */.  if( pres
17520 65 72 76 65 52 6f 77 69 64 20 26 26 20 69 73 49  erveRowid && isI
17530 50 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  PK ){.    /* If 
17540 61 20 73 69 6e 67 6c 65 20 50 52 49 4d 41 52 59  a single PRIMARY
17550 20 4b 45 59 20 63 6f 6c 75 6d 6e 20 77 69 74 68   KEY column with
17560 20 74 79 70 65 20 49 4e 54 45 47 45 52 20 77 61   type INTEGER wa
17570 73 20 73 65 65 6e 2c 20 74 68 65 6e 20 69 74 0a  s seen, then it.
17580 20 20 20 20 2a 2a 20 6d 69 67 68 74 20 62 65 20      ** might be 
17590 61 6e 20 61 6c 69 73 65 20 66 6f 72 20 74 68 65  an alise for the
175a0 20 52 4f 57 49 44 2e 20 20 42 75 74 20 69 74 20   ROWID.  But it 
175b0 6d 69 67 68 74 20 61 6c 73 6f 20 62 65 20 61 20  might also be a 
175c0 57 49 54 48 4f 55 54 20 52 4f 57 49 44 0a 20 20  WITHOUT ROWID.  
175d0 20 20 2a 2a 20 74 61 62 6c 65 20 6f 72 20 61 20    ** table or a 
175e0 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
175f0 4b 45 59 20 44 45 53 43 20 63 6f 6c 75 6d 6e 2c  KEY DESC column,
17600 20 6e 65 69 74 68 65 72 20 6f 66 20 77 68 69 63   neither of whic
17610 68 20 61 72 65 0a 20 20 20 20 2a 2a 20 52 4f 57  h are.    ** ROW
17620 49 44 20 61 6c 69 61 73 65 73 2e 20 20 54 6f 20  ID aliases.  To 
17630 64 69 73 74 69 6e 67 75 69 73 68 20 74 68 65 73  distinguish thes
17640 65 20 63 61 73 65 73 2c 20 63 68 65 63 6b 20 74  e cases, check t
17650 6f 20 73 65 65 20 69 66 0a 20 20 20 20 2a 2a 20  o see if.    ** 
17660 74 68 65 72 65 20 69 73 20 61 20 22 70 6b 22 20  there is a "pk" 
17670 65 6e 74 72 79 20 69 6e 20 22 50 52 41 47 4d 41  entry in "PRAGMA
17680 20 69 6e 64 65 78 5f 6c 69 73 74 22 2e 20 20 54   index_list".  T
17690 68 65 72 65 20 77 69 6c 6c 20 62 65 0a 20 20 20  here will be.   
176a0 20 2a 2a 20 6e 6f 20 22 70 6b 22 20 69 6e 64 65   ** no "pk" inde
176b0 78 20 69 66 20 74 68 65 20 50 52 49 4d 41 52 59  x if the PRIMARY
176c0 20 4b 45 59 20 72 65 61 6c 6c 79 20 69 73 20 61   KEY really is a
176d0 6e 20 61 6c 69 61 73 20 66 6f 72 20 74 68 65 20  n alias for the 
176e0 52 4f 57 49 44 2e 0a 20 20 20 20 2a 2f 0a 20 20  ROWID..    */.  
176f0 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33    zSql = sqlite3
17700 5f 6d 70 72 69 6e 74 66 28 22 53 45 4c 45 43 54  _mprintf("SELECT
17710 20 31 20 46 52 4f 4d 20 70 72 61 67 6d 61 5f 69   1 FROM pragma_i
17720 6e 64 65 78 5f 6c 69 73 74 28 25 51 29 22 0a 20  ndex_list(%Q)". 
17730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17740 20 20 20 20 20 20 20 20 20 20 22 20 57 48 45 52            " WHER
17750 45 20 6f 72 69 67 69 6e 3d 27 70 6b 27 22 2c 20  E origin='pk'", 
17760 7a 54 61 62 29 3b 0a 20 20 20 20 72 63 20 3d 20  zTab);.    rc = 
17770 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f  sqlite3_prepare_
17780 76 32 28 70 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20  v2(p->db, zSql, 
17790 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a  -1, &pStmt, 0);.
177a0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
177b0 28 7a 53 71 6c 29 3b 0a 20 20 20 20 69 66 28 20  (zSql);.    if( 
177c0 72 63 20 29 7b 0a 20 20 20 20 20 20 66 72 65 65  rc ){.      free
177d0 43 6f 6c 75 6d 6e 4c 69 73 74 28 61 7a 43 6f 6c  ColumnList(azCol
177e0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
177f0 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  0;.    }.    rc 
17800 3d 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70  = sqlite3_step(p
17810 53 74 6d 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  Stmt);.    sqlit
17820 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d  e3_finalize(pStm
17830 74 29 3b 0a 20 20 20 20 70 72 65 73 65 72 76 65  t);.    preserve
17840 52 6f 77 69 64 20 3d 20 72 63 3d 3d 53 51 4c 49  Rowid = rc==SQLI
17850 54 45 5f 52 4f 57 3b 0a 20 20 7d 0a 20 20 69 66  TE_ROW;.  }.  if
17860 28 20 70 72 65 73 65 72 76 65 52 6f 77 69 64 20  ( preserveRowid 
17870 29 7b 0a 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 70  ){.    /* Only p
17880 72 65 73 65 72 76 65 20 74 68 65 20 72 6f 77 69  reserve the rowi
17890 64 20 69 66 20 77 65 20 63 61 6e 20 66 69 6e 64  d if we can find
178a0 20 61 20 6e 61 6d 65 20 74 6f 20 75 73 65 20 66   a name to use f
178b0 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 72 6f  or the.    ** ro
178c0 77 69 64 20 2a 2f 0a 20 20 20 20 73 74 61 74 69  wid */.    stati
178d0 63 20 63 68 61 72 20 2a 61 7a 52 6f 77 69 64 5b  c char *azRowid[
178e0 5d 20 3d 20 7b 20 22 72 6f 77 69 64 22 2c 20 22  ] = { "rowid", "
178f0 5f 72 6f 77 69 64 5f 22 2c 20 22 6f 69 64 22 20  _rowid_", "oid" 
17900 7d 3b 0a 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b  };.    int i, j;
17910 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c  .    for(j=0; j<
17920 33 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 66  3; j++){.      f
17930 6f 72 28 69 3d 31 3b 20 69 3c 3d 6e 43 6f 6c 3b  or(i=1; i<=nCol;
17940 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   i++){.        i
17950 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63  f( sqlite3_stric
17960 6d 70 28 61 7a 52 6f 77 69 64 5b 6a 5d 2c 61 7a  mp(azRowid[j],az
17970 43 6f 6c 5b 69 5d 29 3d 3d 30 20 29 20 62 72 65  Col[i])==0 ) bre
17980 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
17990 20 20 69 66 28 20 69 3e 6e 43 6f 6c 20 29 7b 0a    if( i>nCol ){.
179a0 20 20 20 20 20 20 20 20 2f 2a 20 41 74 20 74 68          /* At th
179b0 69 73 20 70 6f 69 6e 74 2c 20 77 65 20 6b 6e 6f  is point, we kno
179c0 77 20 74 68 61 74 20 61 7a 52 6f 77 69 64 5b 6a  w that azRowid[j
179d0 5d 20 69 73 20 6e 6f 74 20 74 68 65 20 6e 61 6d  ] is not the nam
179e0 65 20 6f 66 20 61 6e 79 0a 20 20 20 20 20 20 20  e of any.       
179f0 20 2a 2a 20 6f 72 64 69 6e 61 72 79 20 63 6f 6c   ** ordinary col
17a00 75 6d 6e 20 69 6e 20 74 68 65 20 74 61 62 6c 65  umn in the table
17a10 2e 20 20 56 65 72 69 66 79 20 74 68 61 74 20 61  .  Verify that a
17a20 7a 52 6f 77 69 64 5b 6a 5d 20 69 73 20 61 20 76  zRowid[j] is a v
17a30 61 6c 69 64 0a 20 20 20 20 20 20 20 20 2a 2a 20  alid.        ** 
17a40 6e 61 6d 65 20 66 6f 72 20 74 68 65 20 72 6f 77  name for the row
17a50 69 64 20 62 65 66 6f 72 65 20 61 64 64 69 6e 67  id before adding
17a60 20 69 74 20 74 6f 20 61 7a 43 6f 6c 5b 30 5d 2e   it to azCol[0].
17a70 20 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 0a    WITHOUT ROWID.
17a80 20 20 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65          ** table
17a90 73 20 77 69 6c 6c 20 66 61 69 6c 20 74 68 69 73  s will fail this
17aa0 20 6c 61 73 74 20 63 68 65 63 6b 20 2a 2f 0a 20   last check */. 
17ab0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
17ac0 74 65 33 5f 74 61 62 6c 65 5f 63 6f 6c 75 6d 6e  te3_table_column
17ad0 5f 6d 65 74 61 64 61 74 61 28 70 2d 3e 64 62 2c  _metadata(p->db,
17ae0 30 2c 7a 54 61 62 2c 61 7a 52 6f 77 69 64 5b 6a  0,zTab,azRowid[j
17af0 5d 2c 30 2c 30 2c 30 2c 30 2c 30 29 3b 0a 20 20  ],0,0,0,0,0);.  
17b00 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
17b10 4c 49 54 45 5f 4f 4b 20 29 20 61 7a 43 6f 6c 5b  LITE_OK ) azCol[
17b20 30 5d 20 3d 20 61 7a 52 6f 77 69 64 5b 6a 5d 3b  0] = azRowid[j];
17b30 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
17b40 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
17b50 7d 0a 20 20 72 65 74 75 72 6e 20 61 7a 43 6f 6c  }.  return azCol
17b60 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 6f 67 67 6c  ;.}../*.** Toggl
17b70 65 20 74 68 65 20 72 65 76 65 72 73 65 5f 75 6e  e the reverse_un
17b80 6f 72 64 65 72 65 64 5f 73 65 6c 65 63 74 73 20  ordered_selects 
17b90 73 65 74 74 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74  setting..*/.stat
17ba0 69 63 20 76 6f 69 64 20 74 6f 67 67 6c 65 53 65  ic void toggleSe
17bb0 6c 65 63 74 4f 72 64 65 72 28 73 71 6c 69 74 65  lectOrder(sqlite
17bc0 33 20 2a 64 62 29 7b 0a 20 20 73 71 6c 69 74 65  3 *db){.  sqlite
17bd0 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20  3_stmt *pStmt = 
17be0 30 3b 0a 20 20 69 6e 74 20 69 53 65 74 74 69 6e  0;.  int iSettin
17bf0 67 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 7a 53  g = 0;.  char zS
17c00 74 6d 74 5b 31 30 30 5d 3b 0a 20 20 73 71 6c 69  tmt[100];.  sqli
17c10 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 64  te3_prepare_v2(d
17c20 62 2c 20 22 50 52 41 47 4d 41 20 72 65 76 65 72  b, "PRAGMA rever
17c30 73 65 5f 75 6e 6f 72 64 65 72 65 64 5f 73 65 6c  se_unordered_sel
17c40 65 63 74 73 22 2c 20 2d 31 2c 20 26 70 53 74 6d  ects", -1, &pStm
17c50 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 73 71 6c  t, 0);.  if( sql
17c60 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29  ite3_step(pStmt)
17c70 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a  ==SQLITE_ROW ){.
17c80 20 20 20 20 69 53 65 74 74 69 6e 67 20 3d 20 73      iSetting = s
17c90 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e  qlite3_column_in
17ca0 74 28 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 7d  t(pStmt, 0);.  }
17cb0 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c  .  sqlite3_final
17cc0 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 73 71  ize(pStmt);.  sq
17cd0 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
17ce0 69 7a 65 6f 66 28 7a 53 74 6d 74 29 2c 20 7a 53  izeof(zStmt), zS
17cf0 74 6d 74 2c 0a 20 20 20 20 20 20 20 22 50 52 41  tmt,.       "PRA
17d00 47 4d 41 20 72 65 76 65 72 73 65 5f 75 6e 6f 72  GMA reverse_unor
17d10 64 65 72 65 64 5f 73 65 6c 65 63 74 73 28 25 64  dered_selects(%d
17d20 29 22 2c 20 21 69 53 65 74 74 69 6e 67 29 3b 0a  )", !iSetting);.
17d30 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 64    sqlite3_exec(d
17d40 62 2c 20 7a 53 74 6d 74 2c 20 30 2c 20 30 2c 20  b, zStmt, 0, 0, 
17d50 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  0);.}../*.** Thi
17d60 73 20 69 73 20 61 20 64 69 66 66 65 72 65 6e 74  s is a different
17d70 20 63 61 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e   callback routin
17d80 65 20 75 73 65 64 20 66 6f 72 20 64 75 6d 70 69  e used for dumpi
17d90 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  ng the database.
17da0 0a 2a 2a 20 45 61 63 68 20 72 6f 77 20 72 65 63  .** Each row rec
17db0 65 69 76 65 64 20 62 79 20 74 68 69 73 20 63 61  eived by this ca
17dc0 6c 6c 62 61 63 6b 20 63 6f 6e 73 69 73 74 73 20  llback consists 
17dd0 6f 66 20 61 20 74 61 62 6c 65 20 6e 61 6d 65 2c  of a table name,
17de0 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 74 79  .** the table ty
17df0 70 65 20 28 22 69 6e 64 65 78 22 20 6f 72 20 22  pe ("index" or "
17e00 74 61 62 6c 65 22 29 20 61 6e 64 20 53 51 4c 20  table") and SQL 
17e10 74 6f 20 63 72 65 61 74 65 20 74 68 65 20 74 61  to create the ta
17e20 62 6c 65 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ble..** This rou
17e30 74 69 6e 65 20 73 68 6f 75 6c 64 20 70 72 69 6e  tine should prin
17e40 74 20 74 65 78 74 20 73 75 66 66 69 63 69 65 6e  t text sufficien
17e50 74 20 74 6f 20 72 65 63 72 65 61 74 65 20 74 68  t to recreate th
17e60 65 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74  e table..*/.stat
17e70 69 63 20 69 6e 74 20 64 75 6d 70 5f 63 61 6c 6c  ic int dump_call
17e80 62 61 63 6b 28 76 6f 69 64 20 2a 70 41 72 67 2c  back(void *pArg,
17e90 20 69 6e 74 20 6e 41 72 67 2c 20 63 68 61 72 20   int nArg, char 
17ea0 2a 2a 61 7a 41 72 67 2c 20 63 68 61 72 20 2a 2a  **azArg, char **
17eb0 61 7a 4e 6f 74 55 73 65 64 29 7b 0a 20 20 69 6e  azNotUsed){.  in
17ec0 74 20 72 63 3b 0a 20 20 63 6f 6e 73 74 20 63 68  t rc;.  const ch
17ed0 61 72 20 2a 7a 54 61 62 6c 65 3b 0a 20 20 63 6f  ar *zTable;.  co
17ee0 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65 3b  nst char *zType;
17ef0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
17f00 53 71 6c 3b 0a 20 20 53 68 65 6c 6c 53 74 61 74  Sql;.  ShellStat
17f10 65 20 2a 70 20 3d 20 28 53 68 65 6c 6c 53 74 61  e *p = (ShellSta
17f20 74 65 20 2a 29 70 41 72 67 3b 0a 0a 20 20 55 4e  te *)pArg;..  UN
17f30 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 61  USED_PARAMETER(a
17f40 7a 4e 6f 74 55 73 65 64 29 3b 0a 20 20 69 66 28  zNotUsed);.  if(
17f50 20 6e 41 72 67 21 3d 33 20 7c 7c 20 61 7a 41 72   nArg!=3 || azAr
17f60 67 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  g==0 ) return 0;
17f70 0a 20 20 7a 54 61 62 6c 65 20 3d 20 61 7a 41 72  .  zTable = azAr
17f80 67 5b 30 5d 3b 0a 20 20 7a 54 79 70 65 20 3d 20  g[0];.  zType = 
17f90 61 7a 41 72 67 5b 31 5d 3b 0a 20 20 7a 53 71 6c  azArg[1];.  zSql
17fa0 20 3d 20 61 7a 41 72 67 5b 32 5d 3b 0a 0a 20 20   = azArg[2];..  
17fb0 69 66 28 20 73 74 72 63 6d 70 28 7a 54 61 62 6c  if( strcmp(zTabl
17fc0 65 2c 20 22 73 71 6c 69 74 65 5f 73 65 71 75 65  e, "sqlite_seque
17fd0 6e 63 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  nce")==0 ){.    
17fe0 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  raw_printf(p->ou
17ff0 74 2c 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20  t, "DELETE FROM 
18000 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 3b  sqlite_sequence;
18010 5c 6e 22 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66  \n");.  }else if
18020 28 20 73 71 6c 69 74 65 33 5f 73 74 72 67 6c 6f  ( sqlite3_strglo
18030 62 28 22 73 71 6c 69 74 65 5f 73 74 61 74 3f 22  b("sqlite_stat?"
18040 2c 20 7a 54 61 62 6c 65 29 3d 3d 30 20 29 7b 0a  , zTable)==0 ){.
18050 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70      raw_printf(p
18060 2d 3e 6f 75 74 2c 20 22 41 4e 41 4c 59 5a 45 20  ->out, "ANALYZE 
18070 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 3b 5c 6e  sqlite_master;\n
18080 22 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  ");.  }else if( 
18090 73 74 72 6e 63 6d 70 28 7a 54 61 62 6c 65 2c 20  strncmp(zTable, 
180a0 22 73 71 6c 69 74 65 5f 22 2c 20 37 29 3d 3d 30  "sqlite_", 7)==0
180b0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
180c0 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74  ;.  }else if( st
180d0 72 6e 63 6d 70 28 7a 53 71 6c 2c 20 22 43 52 45  rncmp(zSql, "CRE
180e0 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c  ATE VIRTUAL TABL
180f0 45 22 2c 20 32 30 29 3d 3d 30 20 29 7b 0a 20 20  E", 20)==0 ){.  
18100 20 20 63 68 61 72 20 2a 7a 49 6e 73 3b 0a 20 20    char *zIns;.  
18110 20 20 69 66 28 20 21 70 2d 3e 77 72 69 74 61 62    if( !p->writab
18120 6c 65 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20  leSchema ){.    
18130 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e    raw_printf(p->
18140 6f 75 74 2c 20 22 50 52 41 47 4d 41 20 77 72 69  out, "PRAGMA wri
18150 74 61 62 6c 65 5f 73 63 68 65 6d 61 3d 4f 4e 3b  table_schema=ON;
18160 5c 6e 22 29 3b 0a 20 20 20 20 20 20 70 2d 3e 77  \n");.      p->w
18170 72 69 74 61 62 6c 65 53 63 68 65 6d 61 20 3d 20  ritableSchema = 
18180 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 49 6e  1;.    }.    zIn
18190 73 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  s = sqlite3_mpri
181a0 6e 74 66 28 0a 20 20 20 20 20 20 20 22 49 4e 53  ntf(.       "INS
181b0 45 52 54 20 49 4e 54 4f 20 73 71 6c 69 74 65 5f  ERT INTO sqlite_
181c0 6d 61 73 74 65 72 28 74 79 70 65 2c 6e 61 6d 65  master(type,name
181d0 2c 74 62 6c 5f 6e 61 6d 65 2c 72 6f 6f 74 70 61  ,tbl_name,rootpa
181e0 67 65 2c 73 71 6c 29 22 0a 20 20 20 20 20 20 20  ge,sql)".       
181f0 22 56 41 4c 55 45 53 28 27 74 61 62 6c 65 27 2c  "VALUES('table',
18200 27 25 71 27 2c 27 25 71 27 2c 30 2c 27 25 71 27  '%q','%q',0,'%q'
18210 29 3b 22 2c 0a 20 20 20 20 20 20 20 7a 54 61 62  );",.       zTab
18220 6c 65 2c 20 7a 54 61 62 6c 65 2c 20 7a 53 71 6c  le, zTable, zSql
18230 29 3b 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e  );.    utf8_prin
18240 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 5c 6e  tf(p->out, "%s\n
18250 22 2c 20 7a 49 6e 73 29 3b 0a 20 20 20 20 73 71  ", zIns);.    sq
18260 6c 69 74 65 33 5f 66 72 65 65 28 7a 49 6e 73 29  lite3_free(zIns)
18270 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
18280 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 72 69    }else{.    pri
18290 6e 74 53 63 68 65 6d 61 4c 69 6e 65 28 70 2d 3e  ntSchemaLine(p->
182a0 6f 75 74 2c 20 7a 53 71 6c 2c 20 22 3b 5c 6e 22  out, zSql, ";\n"
182b0 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 73 74  );.  }..  if( st
182c0 72 63 6d 70 28 7a 54 79 70 65 2c 20 22 74 61 62  rcmp(zType, "tab
182d0 6c 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 53  le")==0 ){.    S
182e0 68 65 6c 6c 54 65 78 74 20 73 53 65 6c 65 63 74  hellText sSelect
182f0 3b 0a 20 20 20 20 53 68 65 6c 6c 54 65 78 74 20  ;.    ShellText 
18300 73 54 61 62 6c 65 3b 0a 20 20 20 20 63 68 61 72  sTable;.    char
18310 20 2a 2a 61 7a 43 6f 6c 3b 0a 20 20 20 20 69 6e   **azCol;.    in
18320 74 20 69 3b 0a 20 20 20 20 63 68 61 72 20 2a 73  t i;.    char *s
18330 61 76 65 64 44 65 73 74 54 61 62 6c 65 3b 0a 20  avedDestTable;. 
18340 20 20 20 69 6e 74 20 73 61 76 65 64 4d 6f 64 65     int savedMode
18350 3b 0a 0a 20 20 20 20 61 7a 43 6f 6c 20 3d 20 74  ;..    azCol = t
18360 61 62 6c 65 43 6f 6c 75 6d 6e 4c 69 73 74 28 70  ableColumnList(p
18370 2c 20 7a 54 61 62 6c 65 29 3b 0a 20 20 20 20 69  , zTable);.    i
18380 66 28 20 61 7a 43 6f 6c 3d 3d 30 20 29 7b 0a 20  f( azCol==0 ){. 
18390 20 20 20 20 20 70 2d 3e 6e 45 72 72 2b 2b 3b 0a       p->nErr++;.
183a0 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
183b0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 6c      }..    /* Al
183c0 77 61 79 73 20 71 75 6f 74 65 20 74 68 65 20 74  ways quote the t
183d0 61 62 6c 65 20 6e 61 6d 65 2c 20 65 76 65 6e 20  able name, even 
183e0 69 66 20 69 74 20 61 70 70 65 61 72 73 20 74 6f  if it appears to
183f0 20 62 65 20 70 75 72 65 20 61 73 63 69 69 2c 0a   be pure ascii,.
18400 20 20 20 20 2a 2a 20 69 6e 20 63 61 73 65 20 69      ** in case i
18410 74 20 69 73 20 61 20 6b 65 79 77 6f 72 64 2e 20  t is a keyword. 
18420 45 78 3a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  Ex:  INSERT INTO
18430 20 22 74 61 62 6c 65 22 20 2e 2e 2e 20 2a 2f 0a   "table" ... */.
18440 20 20 20 20 69 6e 69 74 54 65 78 74 28 26 73 54      initText(&sT
18450 61 62 6c 65 29 3b 0a 20 20 20 20 61 70 70 65 6e  able);.    appen
18460 64 54 65 78 74 28 26 73 54 61 62 6c 65 2c 20 7a  dText(&sTable, z
18470 54 61 62 6c 65 2c 20 71 75 6f 74 65 43 68 61 72  Table, quoteChar
18480 28 7a 54 61 62 6c 65 29 29 3b 0a 20 20 20 20 2f  (zTable));.    /
18490 2a 20 49 66 20 70 72 65 73 65 72 76 69 6e 67 20  * If preserving 
184a0 74 68 65 20 72 6f 77 69 64 2c 20 61 64 64 20 61  the rowid, add a
184b0 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 61 66 74   column list aft
184c0 65 72 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d  er the table nam
184d0 65 2e 0a 20 20 20 20 2a 2a 20 49 6e 20 6f 74 68  e..    ** In oth
184e0 65 72 20 77 6f 72 64 73 3a 20 20 22 49 4e 53 45  er words:  "INSE
184f0 52 54 20 49 4e 54 4f 20 74 61 62 28 72 6f 77 69  RT INTO tab(rowi
18500 64 2c 61 2c 62 2c 63 2c 2e 2e 2e 29 20 56 41 4c  d,a,b,c,...) VAL
18510 55 45 53 28 2e 2e 2e 29 22 0a 20 20 20 20 2a 2a  UES(...)".    **
18520 20 69 6e 73 74 65 61 64 20 6f 66 20 74 68 65 20   instead of the 
18530 75 73 75 61 6c 20 22 49 4e 53 45 52 54 20 49 4e  usual "INSERT IN
18540 54 4f 20 74 61 62 20 56 41 4c 55 45 53 28 2e 2e  TO tab VALUES(..
18550 2e 29 22 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  .)"..    */.    
18560 69 66 28 20 61 7a 43 6f 6c 5b 30 5d 20 29 7b 0a  if( azCol[0] ){.
18570 20 20 20 20 20 20 61 70 70 65 6e 64 54 65 78 74        appendText
18580 28 26 73 54 61 62 6c 65 2c 20 22 28 22 2c 20 30  (&sTable, "(", 0
18590 29 3b 0a 20 20 20 20 20 20 61 70 70 65 6e 64 54  );.      appendT
185a0 65 78 74 28 26 73 54 61 62 6c 65 2c 20 61 7a 43  ext(&sTable, azC
185b0 6f 6c 5b 30 5d 2c 20 30 29 3b 0a 20 20 20 20 20  ol[0], 0);.     
185c0 20 66 6f 72 28 69 3d 31 3b 20 61 7a 43 6f 6c 5b   for(i=1; azCol[
185d0 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  i]; i++){.      
185e0 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 54    appendText(&sT
185f0 61 62 6c 65 2c 20 22 2c 22 2c 20 30 29 3b 0a 20  able, ",", 0);. 
18600 20 20 20 20 20 20 20 61 70 70 65 6e 64 54 65 78         appendTex
18610 74 28 26 73 54 61 62 6c 65 2c 20 61 7a 43 6f 6c  t(&sTable, azCol
18620 5b 69 5d 2c 20 71 75 6f 74 65 43 68 61 72 28 61  [i], quoteChar(a
18630 7a 43 6f 6c 5b 69 5d 29 29 3b 0a 20 20 20 20 20  zCol[i]));.     
18640 20 7d 0a 20 20 20 20 20 20 61 70 70 65 6e 64 54   }.      appendT
18650 65 78 74 28 26 73 54 61 62 6c 65 2c 20 22 29 22  ext(&sTable, ")"
18660 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  , 0);.    }..   
18670 20 2f 2a 20 42 75 69 6c 64 20 61 6e 20 61 70 70   /* Build an app
18680 72 6f 70 72 69 61 74 65 20 53 45 4c 45 43 54 20  ropriate SELECT 
18690 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20  statement */.   
186a0 20 69 6e 69 74 54 65 78 74 28 26 73 53 65 6c 65   initText(&sSele
186b0 63 74 29 3b 0a 20 20 20 20 61 70 70 65 6e 64 54  ct);.    appendT
186c0 65 78 74 28 26 73 53 65 6c 65 63 74 2c 20 22 53  ext(&sSelect, "S
186d0 45 4c 45 43 54 20 22 2c 20 30 29 3b 0a 20 20 20  ELECT ", 0);.   
186e0 20 69 66 28 20 61 7a 43 6f 6c 5b 30 5d 20 29 7b   if( azCol[0] ){
186f0 0a 20 20 20 20 20 20 61 70 70 65 6e 64 54 65 78  .      appendTex
18700 74 28 26 73 53 65 6c 65 63 74 2c 20 61 7a 43 6f  t(&sSelect, azCo
18710 6c 5b 30 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20  l[0], 0);.      
18720 61 70 70 65 6e 64 54 65 78 74 28 26 73 53 65 6c  appendText(&sSel
18730 65 63 74 2c 20 22 2c 22 2c 20 30 29 3b 0a 20 20  ect, ",", 0);.  
18740 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b    }.    for(i=1;
18750 20 61 7a 43 6f 6c 5b 69 5d 3b 20 69 2b 2b 29 7b   azCol[i]; i++){
18760 0a 20 20 20 20 20 20 61 70 70 65 6e 64 54 65 78  .      appendTex
18770 74 28 26 73 53 65 6c 65 63 74 2c 20 61 7a 43 6f  t(&sSelect, azCo
18780 6c 5b 69 5d 2c 20 71 75 6f 74 65 43 68 61 72 28  l[i], quoteChar(
18790 61 7a 43 6f 6c 5b 69 5d 29 29 3b 0a 20 20 20 20  azCol[i]));.    
187a0 20 20 69 66 28 20 61 7a 43 6f 6c 5b 69 2b 31 5d    if( azCol[i+1]
187b0 20 29 7b 0a 20 20 20 20 20 20 20 20 61 70 70 65   ){.        appe
187c0 6e 64 54 65 78 74 28 26 73 53 65 6c 65 63 74 2c  ndText(&sSelect,
187d0 20 22 2c 22 2c 20 30 29 3b 0a 20 20 20 20 20 20   ",", 0);.      
187e0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66 72 65 65  }.    }.    free
187f0 43 6f 6c 75 6d 6e 4c 69 73 74 28 61 7a 43 6f 6c  ColumnList(azCol
18800 29 3b 0a 20 20 20 20 61 70 70 65 6e 64 54 65 78  );.    appendTex
18810 74 28 26 73 53 65 6c 65 63 74 2c 20 22 20 46 52  t(&sSelect, " FR
18820 4f 4d 20 22 2c 20 30 29 3b 0a 20 20 20 20 61 70  OM ", 0);.    ap
18830 70 65 6e 64 54 65 78 74 28 26 73 53 65 6c 65 63  pendText(&sSelec
18840 74 2c 20 7a 54 61 62 6c 65 2c 20 71 75 6f 74 65  t, zTable, quote
18850 43 68 61 72 28 7a 54 61 62 6c 65 29 29 3b 0a 0a  Char(zTable));..
18860 20 20 20 20 73 61 76 65 64 44 65 73 74 54 61 62      savedDestTab
18870 6c 65 20 3d 20 70 2d 3e 7a 44 65 73 74 54 61 62  le = p->zDestTab
18880 6c 65 3b 0a 20 20 20 20 73 61 76 65 64 4d 6f 64  le;.    savedMod
18890 65 20 3d 20 70 2d 3e 6d 6f 64 65 3b 0a 20 20 20  e = p->mode;.   
188a0 20 70 2d 3e 7a 44 65 73 74 54 61 62 6c 65 20 3d   p->zDestTable =
188b0 20 73 54 61 62 6c 65 2e 7a 3b 0a 20 20 20 20 70   sTable.z;.    p
188c0 2d 3e 6d 6f 64 65 20 3d 20 70 2d 3e 63 4d 6f 64  ->mode = p->cMod
188d0 65 20 3d 20 4d 4f 44 45 5f 49 6e 73 65 72 74 3b  e = MODE_Insert;
188e0 0a 20 20 20 20 72 63 20 3d 20 73 68 65 6c 6c 5f  .    rc = shell_
188f0 65 78 65 63 28 70 2c 20 73 53 65 6c 65 63 74 2e  exec(p, sSelect.
18900 7a 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 28  z, 0);.    if( (
18910 72 63 26 30 78 66 66 29 3d 3d 53 51 4c 49 54 45  rc&0xff)==SQLITE
18920 5f 43 4f 52 52 55 50 54 20 29 7b 0a 20 20 20 20  _CORRUPT ){.    
18930 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e    raw_printf(p->
18940 6f 75 74 2c 20 22 2f 2a 2a 2a 2a 2a 2a 20 43 4f  out, "/****** CO
18950 52 52 55 50 54 49 4f 4e 20 45 52 52 4f 52 20 2a  RRUPTION ERROR *
18960 2a 2a 2a 2a 2a 2a 2f 5c 6e 22 29 3b 0a 20 20 20  ******/\n");.   
18970 20 20 20 74 6f 67 67 6c 65 53 65 6c 65 63 74 4f     toggleSelectO
18980 72 64 65 72 28 70 2d 3e 64 62 29 3b 0a 20 20 20  rder(p->db);.   
18990 20 20 20 73 68 65 6c 6c 5f 65 78 65 63 28 70 2c     shell_exec(p,
189a0 20 73 53 65 6c 65 63 74 2e 7a 2c 20 30 29 3b 0a   sSelect.z, 0);.
189b0 20 20 20 20 20 20 74 6f 67 67 6c 65 53 65 6c 65        toggleSele
189c0 63 74 4f 72 64 65 72 28 70 2d 3e 64 62 29 3b 0a  ctOrder(p->db);.
189d0 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 7a 44 65      }.    p->zDe
189e0 73 74 54 61 62 6c 65 20 3d 20 73 61 76 65 64 44  stTable = savedD
189f0 65 73 74 54 61 62 6c 65 3b 0a 20 20 20 20 70 2d  estTable;.    p-
18a00 3e 6d 6f 64 65 20 3d 20 73 61 76 65 64 4d 6f 64  >mode = savedMod
18a10 65 3b 0a 20 20 20 20 66 72 65 65 54 65 78 74 28  e;.    freeText(
18a20 26 73 54 61 62 6c 65 29 3b 0a 20 20 20 20 66 72  &sTable);.    fr
18a30 65 65 54 65 78 74 28 26 73 53 65 6c 65 63 74 29  eeText(&sSelect)
18a40 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 70  ;.    if( rc ) p
18a50 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 7d 0a 20 20  ->nErr++;.  }.  
18a60 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
18a70 2a 2a 20 52 75 6e 20 7a 51 75 65 72 79 2e 20 20  ** Run zQuery.  
18a80 55 73 65 20 64 75 6d 70 5f 63 61 6c 6c 62 61 63  Use dump_callbac
18a90 6b 28 29 20 61 73 20 74 68 65 20 63 61 6c 6c 62  k() as the callb
18aa0 61 63 6b 20 72 6f 75 74 69 6e 65 20 73 6f 20 74  ack routine so t
18ab0 68 61 74 0a 2a 2a 20 74 68 65 20 63 6f 6e 74 65  hat.** the conte
18ac0 6e 74 73 20 6f 66 20 74 68 65 20 71 75 65 72 79  nts of the query
18ad0 20 61 72 65 20 6f 75 74 70 75 74 20 61 73 20 53   are output as S
18ae0 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a  QL statements..*
18af0 2a 0a 2a 2a 20 49 66 20 77 65 20 67 65 74 20 61  *.** If we get a
18b00 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20   SQLITE_CORRUPT 
18b10 65 72 72 6f 72 2c 20 72 65 72 75 6e 20 74 68 65  error, rerun the
18b20 20 71 75 65 72 79 20 61 66 74 65 72 20 61 70 70   query after app
18b30 65 6e 64 69 6e 67 0a 2a 2a 20 22 4f 52 44 45 52  ending.** "ORDER
18b40 20 42 59 20 72 6f 77 69 64 20 44 45 53 43 22 20   BY rowid DESC" 
18b50 74 6f 20 74 68 65 20 65 6e 64 2e 0a 2a 2f 0a 73  to the end..*/.s
18b60 74 61 74 69 63 20 69 6e 74 20 72 75 6e 5f 73 63  tatic int run_sc
18b70 68 65 6d 61 5f 64 75 6d 70 5f 71 75 65 72 79 28  hema_dump_query(
18b80 0a 20 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 70  .  ShellState *p
18b90 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
18ba0 7a 51 75 65 72 79 0a 29 7b 0a 20 20 69 6e 74 20  zQuery.){.  int 
18bb0 72 63 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72  rc;.  char *zErr
18bc0 20 3d 20 30 3b 0a 20 20 72 63 20 3d 20 73 71 6c   = 0;.  rc = sql
18bd0 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c  ite3_exec(p->db,
18be0 20 7a 51 75 65 72 79 2c 20 64 75 6d 70 5f 63 61   zQuery, dump_ca
18bf0 6c 6c 62 61 63 6b 2c 20 70 2c 20 26 7a 45 72 72  llback, p, &zErr
18c00 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
18c10 49 54 45 5f 43 4f 52 52 55 50 54 20 29 7b 0a 20  ITE_CORRUPT ){. 
18c20 20 20 20 63 68 61 72 20 2a 7a 51 32 3b 0a 20 20     char *zQ2;.  
18c30 20 20 69 6e 74 20 6c 65 6e 20 3d 20 73 74 72 6c    int len = strl
18c40 65 6e 33 30 28 7a 51 75 65 72 79 29 3b 0a 20 20  en30(zQuery);.  
18c50 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e    raw_printf(p->
18c60 6f 75 74 2c 20 22 2f 2a 2a 2a 2a 2a 2a 20 43 4f  out, "/****** CO
18c70 52 52 55 50 54 49 4f 4e 20 45 52 52 4f 52 20 2a  RRUPTION ERROR *
18c80 2a 2a 2a 2a 2a 2a 2f 5c 6e 22 29 3b 0a 20 20 20  ******/\n");.   
18c90 20 69 66 28 20 7a 45 72 72 20 29 7b 0a 20 20 20   if( zErr ){.   
18ca0 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70     utf8_printf(p
18cb0 2d 3e 6f 75 74 2c 20 22 2f 2a 2a 2a 2a 2a 2a 20  ->out, "/****** 
18cc0 25 73 20 2a 2a 2a 2a 2a 2a 2f 5c 6e 22 2c 20 7a  %s ******/\n", z
18cd0 45 72 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Err);.      sqli
18ce0 74 65 33 5f 66 72 65 65 28 7a 45 72 72 29 3b 0a  te3_free(zErr);.
18cf0 20 20 20 20 20 20 7a 45 72 72 20 3d 20 30 3b 0a        zErr = 0;.
18d00 20 20 20 20 7d 0a 20 20 20 20 7a 51 32 20 3d 20      }.    zQ2 = 
18d10 6d 61 6c 6c 6f 63 28 20 6c 65 6e 2b 31 30 30 20  malloc( len+100 
18d20 29 3b 0a 20 20 20 20 69 66 28 20 7a 51 32 3d 3d  );.    if( zQ2==
18d30 30 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  0 ) return rc;. 
18d40 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
18d50 6e 74 66 28 6c 65 6e 2b 31 30 30 2c 20 7a 51 32  ntf(len+100, zQ2
18d60 2c 20 22 25 73 20 4f 52 44 45 52 20 42 59 20 72  , "%s ORDER BY r
18d70 6f 77 69 64 20 44 45 53 43 22 2c 20 7a 51 75 65  owid DESC", zQue
18d80 72 79 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  ry);.    rc = sq
18d90 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62  lite3_exec(p->db
18da0 2c 20 7a 51 32 2c 20 64 75 6d 70 5f 63 61 6c 6c  , zQ2, dump_call
18db0 62 61 63 6b 2c 20 70 2c 20 26 7a 45 72 72 29 3b  back, p, &zErr);
18dc0 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20  .    if( rc ){. 
18dd0 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
18de0 28 70 2d 3e 6f 75 74 2c 20 22 2f 2a 2a 2a 2a 2a  (p->out, "/*****
18df0 2a 20 45 52 52 4f 52 3a 20 25 73 20 2a 2a 2a 2a  * ERROR: %s ****
18e00 2a 2a 2f 5c 6e 22 2c 20 7a 45 72 72 29 3b 0a 20  **/\n", zErr);. 
18e10 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
18e20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
18e30 55 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  UPT;.    }.    s
18e40 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 45 72 72  qlite3_free(zErr
18e50 29 3b 0a 20 20 20 20 66 72 65 65 28 7a 51 32 29  );.    free(zQ2)
18e60 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
18e70 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 65 78 74  c;.}../*.** Text
18e80 20 6f 66 20 68 65 6c 70 20 6d 65 73 73 61 67 65   of help message
18e90 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 68 65 6c  s..**.** The hel
18ea0 70 20 74 65 78 74 20 66 6f 72 20 65 61 63 68 20  p text for each 
18eb0 69 6e 64 69 76 69 64 75 61 6c 20 63 6f 6d 6d 61  individual comma
18ec0 6e 64 20 62 65 67 69 6e 73 20 77 69 74 68 20 61  nd begins with a
18ed0 20 6c 69 6e 65 20 74 68 61 74 20 73 74 61 72 74   line that start
18ee0 73 0a 2a 2a 20 77 69 74 68 20 22 2e 22 2e 20 20  s.** with ".".  
18ef0 53 75 62 73 65 71 75 65 6e 74 20 6c 69 6e 65 73  Subsequent lines
18f00 20 61 72 65 20 73 75 70 70 6c 69 6d 65 6e 74 61   are supplimenta
18f10 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a  l information..*
18f20 2a 0a 2a 2a 20 54 68 65 72 65 20 6d 75 73 74 20  *.** There must 
18f30 62 65 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 73  be two or more s
18f40 70 61 63 65 73 20 62 65 74 77 65 65 6e 20 74 68  paces between th
18f50 65 20 65 6e 64 20 6f 66 20 74 68 65 20 63 6f 6d  e end of the com
18f60 6d 61 6e 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20  mand and the.** 
18f70 73 74 61 72 74 20 6f 66 20 74 68 65 20 64 65 73  start of the des
18f80 63 72 69 70 74 69 6f 6e 20 6f 66 20 77 68 61 74  cription of what
18f90 20 74 68 61 74 20 63 6f 6d 6d 61 6e 64 20 64 6f   that command do
18fa0 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f  es..*/.static co
18fb0 6e 73 74 20 63 68 61 72 20 2a 28 61 7a 48 65 6c  nst char *(azHel
18fc0 70 5b 5d 29 20 3d 20 7b 0a 23 69 66 20 64 65 66  p[]) = {.#if def
18fd0 69 6e 65 64 28 53 51 4c 49 54 45 5f 48 41 56 45  ined(SQLITE_HAVE
18fe0 5f 5a 4c 49 42 29 20 26 26 20 21 64 65 66 69 6e  _ZLIB) && !defin
18ff0 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
19000 49 52 54 55 41 4c 54 41 42 4c 45 29 0a 20 20 22  IRTUALTABLE).  "
19010 2e 61 72 63 68 69 76 65 20 2e 2e 2e 20 20 20 20  .archive ...    
19020 20 20 20 20 20 20 20 20 20 4d 61 6e 61 67 65 20           Manage 
19030 53 51 4c 20 61 72 63 68 69 76 65 73 22 2c 0a 20  SQL archives",. 
19040 20 22 20 20 20 45 61 63 68 20 63 6f 6d 6d 61 6e   "   Each comman
19050 64 20 6d 75 73 74 20 68 61 76 65 20 65 78 61 63  d must have exac
19060 74 6c 79 20 6f 6e 65 20 6f 66 20 74 68 65 20 66  tly one of the f
19070 6f 6c 6c 6f 77 69 6e 67 20 6f 70 74 69 6f 6e 73  ollowing options
19080 3a 22 2c 0a 20 20 22 20 20 20 20 20 2d 63 2c 20  :",.  "     -c, 
19090 2d 2d 63 72 65 61 74 65 20 20 20 20 20 20 20 20  --create        
190a0 20 20 20 20 20 20 20 43 72 65 61 74 65 20 61 20         Create a 
190b0 6e 65 77 20 61 72 63 68 69 76 65 22 2c 0a 20 20  new archive",.  
190c0 22 20 20 20 20 20 2d 75 2c 20 2d 2d 75 70 64 61  "     -u, --upda
190d0 74 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20  te              
190e0 20 55 70 64 61 74 65 20 6f 72 20 61 64 64 20 66   Update or add f
190f0 69 6c 65 73 20 74 6f 20 61 6e 20 65 78 69 73 74  iles to an exist
19100 69 6e 67 20 61 72 63 68 69 76 65 22 2c 0a 20 20  ing archive",.  
19110 22 20 20 20 20 20 2d 74 2c 20 2d 2d 6c 69 73 74  "     -t, --list
19120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19130 20 4c 69 73 74 20 63 6f 6e 74 65 6e 74 73 20 6f   List contents o
19140 66 20 61 72 63 68 69 76 65 22 2c 0a 20 20 22 20  f archive",.  " 
19150 20 20 20 20 2d 78 2c 20 2d 2d 65 78 74 72 61 63      -x, --extrac
19160 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 45  t              E
19170 78 74 72 61 63 74 20 66 69 6c 65 73 20 66 72 6f  xtract files fro
19180 6d 20 61 72 63 68 69 76 65 22 2c 0a 20 20 22 20  m archive",.  " 
19190 20 20 4f 70 74 69 6f 6e 61 6c 20 61 72 67 75 6d    Optional argum
191a0 65 6e 74 73 3a 22 2c 0a 20 20 22 20 20 20 20 20  ents:",.  "     
191b0 2d 76 2c 20 2d 2d 76 65 72 62 6f 73 65 20 20 20  -v, --verbose   
191c0 20 20 20 20 20 20 20 20 20 20 20 50 72 69 6e 74             Print
191d0 20 65 61 63 68 20 66 69 6c 65 6e 61 6d 65 20 61   each filename a
191e0 73 20 69 74 20 69 73 20 70 72 6f 63 65 73 73 65  s it is processe
191f0 64 22 2c 0a 20 20 22 20 20 20 20 20 2d 66 20 46  d",.  "     -f F
19200 49 4c 45 2c 20 2d 2d 66 69 6c 65 20 46 49 4c 45  ILE, --file FILE
19210 20 20 20 20 20 20 20 4f 70 65 72 61 74 65 20 6f         Operate o
19220 6e 20 61 72 63 68 69 76 65 20 46 49 4c 45 20 28  n archive FILE (
19230 64 65 66 61 75 6c 74 20 69 73 20 63 75 72 72 65  default is curre
19240 6e 74 20 64 62 29 22 2c 0a 20 20 22 20 20 20 20  nt db)",.  "    
19250 20 2d 61 20 46 49 4c 45 2c 20 2d 2d 61 70 70 65   -a FILE, --appe
19260 6e 64 20 46 49 4c 45 20 20 20 20 20 4f 70 65 72  nd FILE     Oper
19270 61 74 65 20 6f 6e 20 46 49 4c 45 20 6f 70 65 6e  ate on FILE open
19280 65 64 20 75 73 69 6e 67 20 74 68 65 20 61 70 6e  ed using the apn
19290 64 76 66 73 20 56 46 53 22 2c 0a 20 20 22 20 20  dvfs VFS",.  "  
192a0 20 20 20 2d 43 20 44 49 52 2c 20 2d 2d 64 69 72     -C DIR, --dir
192b0 65 63 74 6f 72 79 20 44 49 52 20 20 20 20 43 68  ectory DIR    Ch
192c0 61 6e 67 65 20 74 6f 20 64 69 72 65 63 74 6f 72  ange to director
192d0 79 20 44 49 52 20 74 6f 20 72 65 61 64 2f 65 78  y DIR to read/ex
192e0 74 72 61 63 74 20 66 69 6c 65 73 22 2c 0a 20 20  tract files",.  
192f0 22 20 20 20 20 20 2d 6e 2c 20 2d 2d 64 72 79 72  "     -n, --dryr
19300 75 6e 20 20 20 20 20 20 20 20 20 20 20 20 20 20  un              
19310 20 53 68 6f 77 20 74 68 65 20 53 51 4c 20 74 68   Show the SQL th
19320 61 74 20 77 6f 75 6c 64 20 68 61 76 65 20 6f 63  at would have oc
19330 63 75 72 72 65 64 22 2c 0a 20 20 22 20 20 20 45  curred",.  "   E
19340 78 61 6d 70 6c 65 73 3a 22 2c 0a 20 20 22 20 20  xamples:",.  "  
19350 20 20 20 2e 61 72 20 2d 63 66 20 61 72 63 68 69     .ar -cf archi
19360 76 65 2e 73 61 72 20 66 6f 6f 20 62 61 72 20 20  ve.sar foo bar  
19370 23 20 43 72 65 61 74 65 20 61 72 63 68 69 76 65  # Create archive
19380 2e 73 61 72 20 66 72 6f 6d 20 66 69 6c 65 73 20  .sar from files 
19390 66 6f 6f 20 61 6e 64 20 62 61 72 22 2c 0a 20 20  foo and bar",.  
193a0 22 20 20 20 20 20 2e 61 72 20 2d 74 66 20 61 72  "     .ar -tf ar
193b0 63 68 69 76 65 2e 73 61 72 20 20 20 20 20 20 20  chive.sar       
193c0 20 20 20 23 20 4c 69 73 74 20 6d 65 6d 62 65 72     # List member
193d0 73 20 6f 66 20 61 72 63 68 69 76 65 2e 73 61 72  s of archive.sar
193e0 22 2c 0a 20 20 22 20 20 20 20 20 2e 61 72 20 2d  ",.  "     .ar -
193f0 78 76 66 20 61 72 63 68 69 76 65 2e 73 61 72 20  xvf archive.sar 
19400 20 20 20 20 20 20 20 20 23 20 56 65 72 62 6f 73          # Verbos
19410 65 6c 79 20 65 78 74 72 61 63 74 20 66 69 6c 65  ely extract file
19420 73 20 66 72 6f 6d 20 61 72 63 68 69 76 65 2e 73  s from archive.s
19430 61 72 22 2c 0a 20 20 22 20 20 20 53 65 65 20 61  ar",.  "   See a
19440 6c 73 6f 3a 22 2c 0a 20 20 22 20 20 20 20 20 20  lso:",.  "      
19450 68 74 74 70 3a 2f 2f 73 71 6c 69 74 65 2e 6f 72  http://sqlite.or
19460 67 2f 63 6c 69 2e 68 74 6d 6c 23 73 71 6c 61 72  g/cli.html#sqlar
19470 5f 61 72 63 68 69 76 65 5f 73 75 70 70 6f 72 74  _archive_support
19480 22 2c 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65  ",.#endif.#ifnde
19490 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
194a0 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 22 2e  THORIZATION.  ".
194b0 61 75 74 68 20 4f 4e 7c 4f 46 46 20 20 20 20 20  auth ON|OFF     
194c0 20 20 20 20 20 20 20 20 53 68 6f 77 20 61 75 74          Show aut
194d0 68 6f 72 69 7a 65 72 20 63 61 6c 6c 62 61 63 6b  horizer callback
194e0 73 22 2c 0a 23 65 6e 64 69 66 0a 20 20 22 2e 62  s",.#endif.  ".b
194f0 61 63 6b 75 70 20 3f 44 42 3f 20 46 49 4c 45 20  ackup ?DB? FILE 
19500 20 20 20 20 20 20 20 42 61 63 6b 75 70 20 44 42         Backup DB
19510 20 28 64 65 66 61 75 6c 74 20 5c 22 6d 61 69 6e   (default \"main
19520 5c 22 29 20 74 6f 20 46 49 4c 45 22 2c 0a 20 20  \") to FILE",.  
19530 22 20 20 20 20 20 20 20 2d 2d 61 70 70 65 6e 64  "       --append
19540 20 20 20 20 20 20 20 20 20 20 20 20 55 73 65 20              Use 
19550 74 68 65 20 61 70 70 65 6e 64 76 66 73 22 2c 0a  the appendvfs",.
19560 20 20 22 2e 62 61 69 6c 20 6f 6e 7c 6f 66 66 20    ".bail on|off 
19570 20 20 20 20 20 20 20 20 20 20 20 20 53 74 6f 70              Stop
19580 20 61 66 74 65 72 20 68 69 74 74 69 6e 67 20 61   after hitting a
19590 6e 20 65 72 72 6f 72 2e 20 20 44 65 66 61 75 6c  n error.  Defaul
195a0 74 20 4f 46 46 22 2c 0a 20 20 22 2e 62 69 6e 61  t OFF",.  ".bina
195b0 72 79 20 6f 6e 7c 6f 66 66 20 20 20 20 20 20 20  ry on|off       
195c0 20 20 20 20 54 75 72 6e 20 62 69 6e 61 72 79 20      Turn binary 
195d0 6f 75 74 70 75 74 20 6f 6e 20 6f 72 20 6f 66 66  output on or off
195e0 2e 20 20 44 65 66 61 75 6c 74 20 4f 46 46 22 2c  .  Default OFF",
195f0 0a 20 20 22 2e 63 64 20 44 49 52 45 43 54 4f 52  .  ".cd DIRECTOR
19600 59 20 20 20 20 20 20 20 20 20 20 20 20 43 68 61  Y            Cha
19610 6e 67 65 20 74 68 65 20 77 6f 72 6b 69 6e 67 20  nge the working 
19620 64 69 72 65 63 74 6f 72 79 20 74 6f 20 44 49 52  directory to DIR
19630 45 43 54 4f 52 59 22 2c 0a 20 20 22 2e 63 68 61  ECTORY",.  ".cha
19640 6e 67 65 73 20 6f 6e 7c 6f 66 66 20 20 20 20 20  nges on|off     
19650 20 20 20 20 20 53 68 6f 77 20 6e 75 6d 62 65 72       Show number
19660 20 6f 66 20 72 6f 77 73 20 63 68 61 6e 67 65 64   of rows changed
19670 20 62 79 20 53 51 4c 22 2c 0a 20 20 22 2e 63 68   by SQL",.  ".ch
19680 65 63 6b 20 47 4c 4f 42 20 20 20 20 20 20 20 20  eck GLOB        
19690 20 20 20 20 20 20 46 61 69 6c 20 69 66 20 6f 75        Fail if ou
196a0 74 70 75 74 20 73 69 6e 63 65 20 2e 74 65 73 74  tput since .test
196b0 63 61 73 65 20 64 6f 65 73 20 6e 6f 74 20 6d 61  case does not ma
196c0 74 63 68 22 2c 0a 20 20 22 2e 63 6c 6f 6e 65 20  tch",.  ".clone 
196d0 4e 45 57 44 42 20 20 20 20 20 20 20 20 20 20 20  NEWDB           
196e0 20 20 43 6c 6f 6e 65 20 64 61 74 61 20 69 6e 74    Clone data int
196f0 6f 20 4e 45 57 44 42 20 66 72 6f 6d 20 74 68 65  o NEWDB from the
19700 20 65 78 69 73 74 69 6e 67 20 64 61 74 61 62 61   existing databa
19710 73 65 22 2c 0a 20 20 22 2e 64 61 74 61 62 61 73  se",.  ".databas
19720 65 73 20 20 20 20 20 20 20 20 20 20 20 20 20 20  es              
19730 20 4c 69 73 74 20 6e 61 6d 65 73 20 61 6e 64 20   List names and 
19740 66 69 6c 65 73 20 6f 66 20 61 74 74 61 63 68 65  files of attache
19750 64 20 64 61 74 61 62 61 73 65 73 22 2c 0a 20 20  d databases",.  
19760 22 2e 64 62 63 6f 6e 66 69 67 20 3f 6f 70 3f 20  ".dbconfig ?op? 
19770 3f 76 61 6c 3f 20 20 20 20 20 4c 69 73 74 20 6f  ?val?     List o
19780 72 20 63 68 61 6e 67 65 20 73 71 6c 69 74 65 33  r change sqlite3
19790 5f 64 62 5f 63 6f 6e 66 69 67 28 29 20 6f 70 74  _db_config() opt
197a0 69 6f 6e 73 22 2c 0a 20 20 22 2e 64 62 69 6e 66  ions",.  ".dbinf
197b0 6f 20 3f 44 42 3f 20 20 20 20 20 20 20 20 20 20  o ?DB?          
197c0 20 20 20 53 68 6f 77 20 73 74 61 74 75 73 20 69     Show status i
197d0 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74  nformation about
197e0 20 74 68 65 20 64 61 74 61 62 61 73 65 22 2c 0a   the database",.
197f0 20 20 22 2e 64 75 6d 70 20 3f 54 41 42 4c 45 3f    ".dump ?TABLE?
19800 20 2e 2e 2e 20 20 20 20 20 20 20 20 52 65 6e 64   ...        Rend
19810 65 72 20 61 6c 6c 20 64 61 74 61 62 61 73 65 20  er all database 
19820 63 6f 6e 74 65 6e 74 20 61 73 20 53 51 4c 22 2c  content as SQL",
19830 0a 20 20 22 20 20 20 4f 70 74 69 6f 6e 73 3a 22  .  "   Options:"
19840 2c 0a 20 20 22 20 20 20 20 20 2d 2d 70 72 65 73  ,.  "     --pres
19850 65 72 76 65 2d 72 6f 77 69 64 73 20 20 20 20 20  erve-rowids     
19860 20 49 6e 63 6c 75 64 65 20 52 4f 57 49 44 20 76   Include ROWID v
19870 61 6c 75 65 73 20 69 6e 20 74 68 65 20 6f 75 74  alues in the out
19880 70 75 74 22 2c 0a 20 20 22 20 20 20 20 20 2d 2d  put",.  "     --
19890 6e 65 77 6c 69 6e 65 73 20 20 20 20 20 20 20 20  newlines        
198a0 20 20 20 20 20 41 6c 6c 6f 77 20 75 6e 65 73 63       Allow unesc
198b0 61 70 65 64 20 6e 65 77 6c 69 6e 65 20 63 68 61  aped newline cha
198c0 72 61 63 74 65 72 73 20 69 6e 20 6f 75 74 70 75  racters in outpu
198d0 74 22 2c 0a 20 20 22 20 20 20 54 41 42 4c 45 20  t",.  "   TABLE 
198e0 69 73 20 4c 49 4b 45 20 70 61 74 74 65 72 6e 20  is LIKE pattern 
198f0 66 6f 72 20 74 68 65 20 74 61 62 6c 65 73 20 74  for the tables t
19900 6f 20 64 75 6d 70 22 2c 0a 20 20 22 2e 65 63 68  o dump",.  ".ech
19910 6f 20 6f 6e 7c 6f 66 66 20 20 20 20 20 20 20 20  o on|off        
19920 20 20 20 20 20 54 75 72 6e 20 63 6f 6d 6d 61 6e       Turn comman
19930 64 20 65 63 68 6f 20 6f 6e 20 6f 72 20 6f 66 66  d echo on or off
19940 22 2c 0a 20 20 22 2e 65 71 70 20 6f 6e 7c 6f 66  ",.  ".eqp on|of
19950 66 7c 66 75 6c 6c 20 20 20 20 20 20 20 20 20 45  f|full         E
19960 6e 61 62 6c 65 20 6f 72 20 64 69 73 61 62 6c 65  nable or disable
19970 20 61 75 74 6f 6d 61 74 69 63 20 45 58 50 4c 41   automatic EXPLA
19980 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 22 2c 0a  IN QUERY PLAN",.
19990 20 20 22 2e 65 78 63 65 6c 20 20 20 20 20 20 20    ".excel       
199a0 20 20 20 20 20 20 20 20 20 20 20 20 44 69 73 70              Disp
199b0 6c 61 79 20 74 68 65 20 6f 75 74 70 75 74 20 6f  lay the output o
199c0 66 20 6e 65 78 74 20 63 6f 6d 6d 61 6e 64 20 69  f next command i
199d0 6e 20 61 20 73 70 72 65 61 64 73 68 65 65 74 22  n a spreadsheet"
199e0 2c 0a 20 20 22 2e 65 78 69 74 20 3f 43 4f 44 45  ,.  ".exit ?CODE
199f0 3f 20 20 20 20 20 20 20 20 20 20 20 20 20 45 78  ?             Ex
19a00 69 74 20 74 68 69 73 20 70 72 6f 67 72 61 6d 20  it this program 
19a10 77 69 74 68 20 72 65 74 75 72 6e 2d 63 6f 64 65  with return-code
19a20 20 43 4f 44 45 22 2c 0a 20 20 22 2e 65 78 70 65   CODE",.  ".expe
19a30 72 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  rt              
19a40 20 20 20 20 45 58 50 45 52 49 4d 45 4e 54 41 4c      EXPERIMENTAL
19a50 2e 20 53 75 67 67 65 73 74 20 69 6e 64 65 78 65  . Suggest indexe
19a60 73 20 66 6f 72 20 73 70 65 63 69 66 69 65 64 20  s for specified 
19a70 71 75 65 72 69 65 73 22 2c 0a 2f 2a 20 42 65 63  queries",./* Bec
19a80 61 75 73 65 20 65 78 70 6c 61 69 6e 20 6d 6f 64  ause explain mod
19a90 65 20 63 6f 6d 65 73 20 6f 6e 20 61 75 74 6f 6d  e comes on autom
19aa0 61 74 69 63 61 6c 6c 79 20 6e 6f 77 2c 20 74 68  atically now, th
19ab0 65 20 22 2e 65 78 70 6c 61 69 6e 22 20 6d 6f 64  e ".explain" mod
19ac0 65 0a 2a 2a 20 69 73 20 72 65 6d 6f 76 65 64 20  e.** is removed 
19ad0 66 72 6f 6d 20 74 68 65 20 68 65 6c 70 20 73 63  from the help sc
19ae0 72 65 65 6e 2e 20 20 49 74 20 69 73 20 73 74 69  reen.  It is sti
19af0 6c 6c 20 73 75 70 70 6f 72 74 65 64 20 66 6f 72  ll supported for
19b00 20 6c 65 67 61 63 79 2c 20 68 6f 77 65 76 65 72   legacy, however
19b10 20 2a 2f 0a 2f 2a 22 2e 65 78 70 6c 61 69 6e 20   */./*".explain 
19b20 3f 6f 6e 7c 6f 66 66 7c 61 75 74 6f 3f 20 20 20  ?on|off|auto?   
19b30 54 75 72 6e 20 45 58 50 4c 41 49 4e 20 6f 75 74  Turn EXPLAIN out
19b40 70 75 74 20 6d 6f 64 65 20 6f 6e 20 6f 72 20 6f  put mode on or o
19b50 66 66 20 6f 72 20 74 6f 20 61 75 74 6f 6d 61 74  ff or to automat
19b60 69 63 22 2c 2a 2f 0a 20 20 22 2e 66 75 6c 6c 73  ic",*/.  ".fulls
19b70 63 68 65 6d 61 20 3f 2d 2d 69 6e 64 65 6e 74 3f  chema ?--indent?
19b80 20 20 20 53 68 6f 77 20 73 63 68 65 6d 61 20 61     Show schema a
19b90 6e 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  nd the content o
19ba0 66 20 73 71 6c 69 74 65 5f 73 74 61 74 20 74 61  f sqlite_stat ta
19bb0 62 6c 65 73 22 2c 0a 20 20 22 2e 68 65 61 64 65  bles",.  ".heade
19bc0 72 73 20 6f 6e 7c 6f 66 66 20 20 20 20 20 20 20  rs on|off       
19bd0 20 20 20 54 75 72 6e 20 64 69 73 70 6c 61 79 20     Turn display 
19be0 6f 66 20 68 65 61 64 65 72 73 20 6f 6e 20 6f 72  of headers on or
19bf0 20 6f 66 66 22 2c 0a 20 20 22 2e 68 65 6c 70 20   off",.  ".help 
19c00 3f 2d 61 6c 6c 3f 20 3f 50 41 54 54 45 52 4e 3f  ?-all? ?PATTERN?
19c10 20 20 20 53 68 6f 77 20 68 65 6c 70 20 74 65 78     Show help tex
19c20 74 20 66 6f 72 20 50 41 54 54 45 52 4e 22 2c 0a  t for PATTERN",.
19c30 20 20 22 2e 69 6d 70 6f 72 74 20 46 49 4c 45 20    ".import FILE 
19c40 54 41 42 4c 45 20 20 20 20 20 20 20 49 6d 70 6f  TABLE       Impo
19c50 72 74 20 64 61 74 61 20 66 72 6f 6d 20 46 49 4c  rt data from FIL
19c60 45 20 69 6e 74 6f 20 54 41 42 4c 45 22 2c 0a 23  E into TABLE",.#
19c70 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
19c80 49 54 5f 54 45 53 54 5f 43 4f 4e 54 52 4f 4c 0a  IT_TEST_CONTROL.
19c90 20 20 22 2e 69 6d 70 6f 73 74 65 72 20 49 4e 44    ".imposter IND
19ca0 45 58 20 54 41 42 4c 45 20 20 20 20 43 72 65 61  EX TABLE    Crea
19cb0 74 65 20 69 6d 70 6f 73 74 65 72 20 74 61 62 6c  te imposter tabl
19cc0 65 20 54 41 42 4c 45 20 6f 6e 20 69 6e 64 65 78  e TABLE on index
19cd0 20 49 4e 44 45 58 22 2c 0a 23 65 6e 64 69 66 0a   INDEX",.#endif.
19ce0 20 20 22 2e 69 6e 64 65 78 65 73 20 3f 54 41 42    ".indexes ?TAB
19cf0 4c 45 3f 20 20 20 20 20 20 20 20 20 53 68 6f 77  LE?         Show
19d00 20 6e 61 6d 65 73 20 6f 66 20 69 6e 64 65 78 65   names of indexe
19d10 73 22 2c 0a 20 20 22 20 20 20 20 20 20 20 20 20  s",.  "         
19d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19d30 20 20 49 66 20 54 41 42 4c 45 20 69 73 20 73 70    If TABLE is sp
19d40 65 63 69 66 69 65 64 2c 20 6f 6e 6c 79 20 73 68  ecified, only sh
19d50 6f 77 20 69 6e 64 65 78 65 73 20 66 6f 72 22 2c  ow indexes for",
19d60 0a 20 20 22 20 20 20 20 20 20 20 20 20 20 20 20  .  "            
19d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
19d80 61 62 6c 65 73 20 6d 61 74 63 68 69 6e 67 20 54  ables matching T
19d90 41 42 4c 45 20 75 73 69 6e 67 20 74 68 65 20 4c  ABLE using the L
19da0 49 4b 45 20 6f 70 65 72 61 74 6f 72 2e 22 2c 0a  IKE operator.",.
19db0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
19dc0 41 42 4c 45 5f 49 4f 54 52 41 43 45 0a 20 20 22  ABLE_IOTRACE.  "
19dd0 2e 69 6f 74 72 61 63 65 20 46 49 4c 45 20 20 20  .iotrace FILE   
19de0 20 20 20 20 20 20 20 20 20 45 6e 61 62 6c 65 20           Enable 
19df0 49 2f 4f 20 64 69 61 67 6e 6f 73 74 69 63 20 6c  I/O diagnostic l
19e00 6f 67 67 69 6e 67 20 74 6f 20 46 49 4c 45 22 2c  ogging to FILE",
19e10 0a 23 65 6e 64 69 66 0a 20 20 22 2e 6c 69 6d 69  .#endif.  ".limi
19e20 74 20 3f 4c 49 4d 49 54 3f 20 3f 56 41 4c 3f 20  t ?LIMIT? ?VAL? 
19e30 20 20 20 20 44 69 73 70 6c 61 79 20 6f 72 20 63      Display or c
19e40 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65 20  hange the value 
19e50 6f 66 20 61 6e 20 53 51 4c 49 54 45 5f 4c 49 4d  of an SQLITE_LIM
19e60 49 54 22 2c 0a 20 20 22 2e 6c 69 6e 74 20 4f 50  IT",.  ".lint OP
19e70 54 49 4f 4e 53 20 20 20 20 20 20 20 20 20 20 20  TIONS           
19e80 20 52 65 70 6f 72 74 20 70 6f 74 65 6e 74 69 61   Report potentia
19e90 6c 20 73 63 68 65 6d 61 20 69 73 73 75 65 73 2e  l schema issues.
19ea0 22 2c 0a 20 20 22 20 20 20 20 20 4f 70 74 69 6f  ",.  "     Optio
19eb0 6e 73 3a 22 2c 0a 20 20 22 20 20 20 20 20 20 20  ns:",.  "       
19ec0 20 66 6b 65 79 2d 69 6e 64 65 78 65 73 20 20 20   fkey-indexes   
19ed0 20 20 46 69 6e 64 20 6d 69 73 73 69 6e 67 20 66    Find missing f
19ee0 6f 72 65 69 67 6e 20 6b 65 79 20 69 6e 64 65 78  oreign key index
19ef0 65 73 22 2c 0a 23 69 66 6e 64 65 66 20 53 51 4c  es",.#ifndef SQL
19f00 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58  ITE_OMIT_LOAD_EX
19f10 54 45 4e 53 49 4f 4e 0a 20 20 22 2e 6c 6f 61 64  TENSION.  ".load
19f20 20 46 49 4c 45 20 3f 45 4e 54 52 59 3f 20 20 20   FILE ?ENTRY?   
19f30 20 20 20 20 4c 6f 61 64 20 61 6e 20 65 78 74 65      Load an exte
19f40 6e 73 69 6f 6e 20 6c 69 62 72 61 72 79 22 2c 0a  nsion library",.
19f50 23 65 6e 64 69 66 0a 20 20 22 2e 6c 6f 67 20 46  #endif.  ".log F
19f60 49 4c 45 7c 6f 66 66 20 20 20 20 20 20 20 20 20  ILE|off         
19f70 20 20 20 54 75 72 6e 20 6c 6f 67 67 69 6e 67 20     Turn logging 
19f80 6f 6e 20 6f 72 20 6f 66 66 2e 20 20 46 49 4c 45  on or off.  FILE
19f90 20 63 61 6e 20 62 65 20 73 74 64 65 72 72 2f 73   can be stderr/s
19fa0 74 64 6f 75 74 22 2c 0a 20 20 22 2e 6d 6f 64 65  tdout",.  ".mode
19fb0 20 4d 4f 44 45 20 3f 54 41 42 4c 45 3f 20 20 20   MODE ?TABLE?   
19fc0 20 20 20 20 53 65 74 20 6f 75 74 70 75 74 20 6d      Set output m
19fd0 6f 64 65 22 2c 0a 20 20 22 20 20 20 4d 4f 44 45  ode",.  "   MODE
19fe0 20 69 73 20 6f 6e 65 20 6f 66 3a 22 2c 0a 20 20   is one of:",.  
19ff0 22 20 20 20 20 20 61 73 63 69 69 20 20 20 20 43  "     ascii    C
1a000 6f 6c 75 6d 6e 73 2f 72 6f 77 73 20 64 65 6c 69  olumns/rows deli
1a010 6d 69 74 65 64 20 62 79 20 30 78 31 46 20 61 6e  mited by 0x1F an
1a020 64 20 30 78 31 45 22 2c 0a 20 20 22 20 20 20 20  d 0x1E",.  "    
1a030 20 63 73 76 20 20 20 20 20 20 43 6f 6d 6d 61 2d   csv      Comma-
1a040 73 65 70 61 72 61 74 65 64 20 76 61 6c 75 65 73  separated values
1a050 22 2c 0a 20 20 22 20 20 20 20 20 63 6f 6c 75 6d  ",.  "     colum
1a060 6e 20 20 20 4c 65 66 74 2d 61 6c 69 67 6e 65 64  n   Left-aligned
1a070 20 63 6f 6c 75 6d 6e 73 2e 20 20 28 53 65 65 20   columns.  (See 
1a080 2e 77 69 64 74 68 29 22 2c 0a 20 20 22 20 20 20  .width)",.  "   
1a090 20 20 68 74 6d 6c 20 20 20 20 20 48 54 4d 4c 20    html     HTML 
1a0a0 3c 74 61 62 6c 65 3e 20 63 6f 64 65 22 2c 0a 20  <table> code",. 
1a0b0 20 22 20 20 20 20 20 69 6e 73 65 72 74 20 20 20   "     insert   
1a0c0 53 51 4c 20 69 6e 73 65 72 74 20 73 74 61 74 65  SQL insert state
1a0d0 6d 65 6e 74 73 20 66 6f 72 20 54 41 42 4c 45 22  ments for TABLE"
1a0e0 2c 0a 20 20 22 20 20 20 20 20 6c 69 6e 65 20 20  ,.  "     line  
1a0f0 20 20 20 4f 6e 65 20 76 61 6c 75 65 20 70 65 72     One value per
1a100 20 6c 69 6e 65 22 2c 0a 20 20 22 20 20 20 20 20   line",.  "     
1a110 6c 69 73 74 20 20 20 20 20 56 61 6c 75 65 73 20  list     Values 
1a120 64 65 6c 69 6d 69 74 65 64 20 62 79 20 5c 22 7c  delimited by \"|
1a130 5c 22 22 2c 0a 20 20 22 20 20 20 20 20 71 75 6f  \"",.  "     quo
1a140 74 65 20 20 20 20 45 73 63 61 70 65 20 61 6e 73  te    Escape ans
1a150 77 65 72 73 20 61 73 20 66 6f 72 20 53 51 4c 22  wers as for SQL"
1a160 2c 0a 20 20 22 20 20 20 20 20 74 61 62 73 20 20  ,.  "     tabs  
1a170 20 20 20 54 61 62 2d 73 65 70 61 72 61 74 65 64     Tab-separated
1a180 20 76 61 6c 75 65 73 22 2c 0a 20 20 22 20 20 20   values",.  "   
1a190 20 20 74 63 6c 20 20 20 20 20 20 54 43 4c 20 6c    tcl      TCL l
1a1a0 69 73 74 20 65 6c 65 6d 65 6e 74 73 22 2c 0a 20  ist elements",. 
1a1b0 20 22 2e 6e 75 6c 6c 76 61 6c 75 65 20 53 54 52   ".nullvalue STR
1a1c0 49 4e 47 20 20 20 20 20 20 20 20 55 73 65 20 53  ING        Use S
1a1d0 54 52 49 4e 47 20 69 6e 20 70 6c 61 63 65 20 6f  TRING in place o
1a1e0 66 20 4e 55 4c 4c 20 76 61 6c 75 65 73 22 2c 0a  f NULL values",.
1a1f0 20 20 22 2e 6f 6e 63 65 20 28 2d 65 7c 2d 78 7c    ".once (-e|-x|
1a200 46 49 4c 45 29 20 20 20 20 20 20 20 4f 75 74 70  FILE)       Outp
1a210 75 74 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20  ut for the next 
1a220 53 51 4c 20 63 6f 6d 6d 61 6e 64 20 6f 6e 6c 79  SQL command only
1a230 20 74 6f 20 46 49 4c 45 22 2c 0a 20 20 22 20 20   to FILE",.  "  
1a240 20 20 20 49 66 20 46 49 4c 45 20 62 65 67 69 6e     If FILE begin
1a250 73 20 77 69 74 68 20 27 7c 27 20 74 68 65 6e 20  s with '|' then 
1a260 6f 70 65 6e 20 61 73 20 61 20 70 69 70 65 22 2c  open as a pipe",
1a270 0a 20 20 22 20 20 20 20 20 4f 74 68 65 72 20 6f  .  "     Other o
1a280 70 74 69 6f 6e 73 3a 22 2c 0a 20 20 22 20 20 20  ptions:",.  "   
1a290 20 20 20 20 2d 65 20 20 20 20 49 6e 76 6f 6b 65      -e    Invoke
1a2a0 20 73 79 73 74 65 6d 20 74 65 78 74 20 65 64 69   system text edi
1a2b0 74 6f 72 22 2c 0a 20 20 22 20 20 20 20 20 20 20  tor",.  "       
1a2c0 2d 78 20 20 20 20 4f 70 65 6e 20 69 6e 20 61 20  -x    Open in a 
1a2d0 73 70 72 65 61 64 73 68 65 65 74 22 2c 0a 20 20  spreadsheet",.  
1a2e0 22 2e 6f 70 65 6e 20 3f 4f 50 54 49 4f 4e 53 3f  ".open ?OPTIONS?
1a2f0 20 3f 46 49 4c 45 3f 20 20 20 43 6c 6f 73 65 20   ?FILE?   Close 
1a300 65 78 69 73 74 69 6e 67 20 64 61 74 61 62 61 73  existing databas
1a310 65 20 61 6e 64 20 72 65 6f 70 65 6e 20 46 49 4c  e and reopen FIL
1a320 45 22 2c 0a 20 20 22 20 20 20 20 20 4f 70 74 69  E",.  "     Opti
1a330 6f 6e 73 3a 22 2c 0a 20 20 22 20 20 20 20 20 20  ons:",.  "      
1a340 20 20 2d 2d 61 70 70 65 6e 64 20 20 20 20 20 20    --append      
1a350 20 20 55 73 65 20 61 70 70 65 6e 64 76 66 73 20    Use appendvfs 
1a360 74 6f 20 61 70 70 65 6e 64 20 64 61 74 61 62 61  to append databa
1a370 73 65 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66  se to the end of
1a380 20 46 49 4c 45 22 2c 0a 23 69 66 64 65 66 20 53   FILE",.#ifdef S
1a390 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 44 45 53  QLITE_ENABLE_DES
1a3a0 45 52 49 41 4c 49 5a 45 0a 20 20 22 20 20 20 20  ERIALIZE.  "    
1a3b0 20 20 20 20 2d 2d 64 65 73 65 72 69 61 6c 69 7a      --deserializ
1a3c0 65 20 20 20 4c 6f 61 64 20 69 6e 74 6f 20 6d 65  e   Load into me
1a3d0 6d 6f 72 79 20 75 73 65 69 6e 67 20 73 71 6c 69  mory useing sqli
1a3e0 74 65 33 5f 64 65 73 65 72 69 61 6c 69 7a 65 28  te3_deserialize(
1a3f0 29 22 2c 0a 23 65 6e 64 69 66 0a 20 20 22 20 20  )",.#endif.  "  
1a400 20 20 20 20 20 20 2d 2d 6e 65 77 20 20 20 20 20        --new     
1a410 20 20 20 20 20 20 49 6e 69 74 69 61 6c 69 7a 65        Initialize
1a420 20 46 49 4c 45 20 74 6f 20 61 6e 20 65 6d 70 74   FILE to an empt
1a430 79 20 64 61 74 61 62 61 73 65 22 2c 0a 20 20 22  y database",.  "
1a440 20 20 20 20 20 20 20 20 2d 2d 72 65 61 64 6f 6e          --readon
1a450 6c 79 20 20 20 20 20 20 4f 70 65 6e 20 46 49 4c  ly      Open FIL
1a460 45 20 72 65 61 64 6f 6e 6c 79 22 2c 0a 20 20 22  E readonly",.  "
1a470 20 20 20 20 20 20 20 20 2d 2d 7a 69 70 20 20 20          --zip   
1a480 20 20 20 20 20 20 20 20 46 49 4c 45 20 69 73 20          FILE is 
1a490 61 20 5a 49 50 20 61 72 63 68 69 76 65 22 2c 0a  a ZIP archive",.
1a4a0 20 20 22 2e 6f 75 74 70 75 74 20 3f 46 49 4c 45    ".output ?FILE
1a4b0 3f 20 20 20 20 20 20 20 20 20 20 20 53 65 6e 64  ?           Send
1a4c0 20 6f 75 74 70 75 74 20 74 6f 20 46 49 4c 45 20   output to FILE 
1a4d0 6f 72 20 73 74 64 6f 75 74 20 69 66 20 46 49 4c  or stdout if FIL
1a4e0 45 20 69 73 20 6f 6d 69 74 74 65 64 22 2c 0a 20  E is omitted",. 
1a4f0 20 22 20 20 20 20 20 49 66 20 46 49 4c 45 20 62   "     If FILE b
1a500 65 67 69 6e 73 20 77 69 74 68 20 27 7c 27 20 74  egins with '|' t
1a510 68 65 6e 20 6f 70 65 6e 20 69 74 20 61 73 20 61  hen open it as a
1a520 20 70 69 70 65 2e 22 2c 0a 20 20 22 2e 70 72 69   pipe.",.  ".pri
1a530 6e 74 20 53 54 52 49 4e 47 2e 2e 2e 20 20 20 20  nt STRING...    
1a540 20 20 20 20 20 50 72 69 6e 74 20 6c 69 74 65 72       Print liter
1a550 61 6c 20 53 54 52 49 4e 47 22 2c 0a 20 20 22 2e  al STRING",.  ".
1a560 70 72 6f 6d 70 74 20 4d 41 49 4e 20 43 4f 4e 54  prompt MAIN CONT
1a570 49 4e 55 45 20 20 20 20 52 65 70 6c 61 63 65 20  INUE    Replace 
1a580 74 68 65 20 73 74 61 6e 64 61 72 64 20 70 72 6f  the standard pro
1a590 6d 70 74 73 22 2c 0a 20 20 22 2e 71 75 69 74 20  mpts",.  ".quit 
1a5a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a5b0 20 20 20 45 78 69 74 20 74 68 69 73 20 70 72 6f     Exit this pro
1a5c0 67 72 61 6d 22 2c 0a 20 20 22 2e 72 65 61 64 20  gram",.  ".read 
1a5d0 46 49 4c 45 20 20 20 20 20 20 20 20 20 20 20 20  FILE            
1a5e0 20 20 20 52 65 61 64 20 69 6e 70 75 74 20 66 72     Read input fr
1a5f0 6f 6d 20 46 49 4c 45 22 2c 0a 20 20 22 2e 72 65  om FILE",.  ".re
1a600 73 74 6f 72 65 20 3f 44 42 3f 20 46 49 4c 45 20  store ?DB? FILE 
1a610 20 20 20 20 20 20 52 65 73 74 6f 72 65 20 63 6f        Restore co
1a620 6e 74 65 6e 74 20 6f 66 20 44 42 20 28 64 65 66  ntent of DB (def
1a630 61 75 6c 74 20 5c 22 6d 61 69 6e 5c 22 29 20 66  ault \"main\") f
1a640 72 6f 6d 20 46 49 4c 45 22 2c 0a 20 20 22 2e 73  rom FILE",.  ".s
1a650 61 76 65 20 46 49 4c 45 20 20 20 20 20 20 20 20  ave FILE        
1a660 20 20 20 20 20 20 20 57 72 69 74 65 20 69 6e 2d         Write in-
1a670 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20  memory database 
1a680 69 6e 74 6f 20 46 49 4c 45 22 2c 0a 20 20 22 2e  into FILE",.  ".
1a690 73 63 61 6e 73 74 61 74 73 20 6f 6e 7c 6f 66 66  scanstats on|off
1a6a0 20 20 20 20 20 20 20 20 54 75 72 6e 20 73 71 6c          Turn sql
1a6b0 69 74 65 33 5f 73 74 6d 74 5f 73 63 61 6e 73 74  ite3_stmt_scanst
1a6c0 61 74 75 73 28 29 20 6d 65 74 72 69 63 73 20 6f  atus() metrics o
1a6d0 6e 20 6f 72 20 6f 66 66 22 2c 0a 20 20 22 2e 73  n or off",.  ".s
1a6e0 63 68 65 6d 61 20 3f 50 41 54 54 45 52 4e 3f 20  chema ?PATTERN? 
1a6f0 20 20 20 20 20 20 20 53 68 6f 77 20 74 68 65 20         Show the 
1a700 43 52 45 41 54 45 20 73 74 61 74 65 6d 65 6e 74  CREATE statement
1a710 73 20 6d 61 74 63 68 69 6e 67 20 50 41 54 54 45  s matching PATTE
1a720 52 4e 22 2c 0a 20 20 22 20 20 20 20 20 4f 70 74  RN",.  "     Opt
1a730 69 6f 6e 73 3a 22 2c 0a 20 20 22 20 20 20 20 20  ions:",.  "     
1a740 20 20 20 20 2d 2d 69 6e 64 65 6e 74 20 20 20 20      --indent    
1a750 20 20 20 20 20 20 20 20 54 72 79 20 74 6f 20 70          Try to p
1a760 72 65 74 74 79 2d 70 72 69 6e 74 20 74 68 65 20  retty-print the 
1a770 73 63 68 65 6d 61 22 2c 0a 20 20 22 2e 73 65 6c  schema",.  ".sel
1a780 66 74 65 73 74 20 3f 4f 50 54 49 4f 4e 53 3f 20  ftest ?OPTIONS? 
1a790 20 20 20 20 20 52 75 6e 20 74 65 73 74 73 20 64       Run tests d
1a7a0 65 66 69 6e 65 64 20 69 6e 20 74 68 65 20 53 45  efined in the SE
1a7b0 4c 46 54 45 53 54 20 74 61 62 6c 65 22 2c 0a 20  LFTEST table",. 
1a7c0 20 22 20 20 20 20 4f 70 74 69 6f 6e 73 3a 22 2c   "    Options:",
1a7d0 0a 20 20 22 20 20 20 20 20 20 20 2d 2d 69 6e 69  .  "       --ini
1a7e0 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
1a7f0 43 72 65 61 74 65 20 61 20 6e 65 77 20 53 45 4c  Create a new SEL
1a800 46 54 45 53 54 20 74 61 62 6c 65 22 2c 0a 20 20  FTEST table",.  
1a810 22 20 20 20 20 20 20 20 2d 76 20 20 20 20 20 20  "       -v      
1a820 20 20 20 20 20 20 20 20 20 20 20 20 20 56 65 72               Ver
1a830 62 6f 73 65 20 6f 75 74 70 75 74 22 2c 0a 20 20  bose output",.  
1a840 22 2e 73 65 70 61 72 61 74 6f 72 20 43 4f 4c 20  ".separator COL 
1a850 3f 52 4f 57 3f 20 20 20 20 20 43 68 61 6e 67 65  ?ROW?     Change
1a860 20 74 68 65 20 63 6f 6c 75 6d 6e 20 61 6e 64 20   the column and 
1a870 72 6f 77 20 73 65 70 61 72 61 74 6f 72 73 22 2c  row separators",
1a880 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
1a890 49 54 45 5f 45 4e 41 42 4c 45 5f 53 45 53 53 49  ITE_ENABLE_SESSI
1a8a0 4f 4e 29 0a 20 20 22 2e 73 65 73 73 69 6f 6e 20  ON).  ".session 
1a8b0 3f 4e 41 4d 45 3f 20 43 4d 44 20 2e 2e 2e 20 20  ?NAME? CMD ...  
1a8c0 43 72 65 61 74 65 20 6f 72 20 63 6f 6e 74 72 6f  Create or contro
1a8d0 6c 20 73 65 73 73 69 6f 6e 73 22 2c 0a 20 20 22  l sessions",.  "
1a8e0 20 20 20 53 75 62 63 6f 6d 6d 61 6e 64 73 3a 22     Subcommands:"
1a8f0 2c 0a 20 20 22 20 20 20 20 20 61 74 74 61 63 68  ,.  "     attach
1a900 20 54 41 42 4c 45 20 20 20 20 20 20 20 20 20 20   TABLE          
1a910 20 20 20 41 74 74 61 63 68 20 54 41 42 4c 45 22     Attach TABLE"
1a920 2c 0a 20 20 22 20 20 20 20 20 63 68 61 6e 67 65  ,.  "     change
1a930 73 65 74 20 46 49 4c 45 20 20 20 20 20 20 20 20  set FILE        
1a940 20 20 20 57 72 69 74 65 20 61 20 63 68 61 6e 67     Write a chang
1a950 65 73 65 74 20 69 6e 74 6f 20 46 49 4c 45 22 2c  eset into FILE",
1a960 0a 20 20 22 20 20 20 20 20 63 6c 6f 73 65 20 20  .  "     close  
1a970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a980 20 20 43 6c 6f 73 65 20 6f 6e 65 20 73 65 73 73    Close one sess
1a990 69 6f 6e 22 2c 0a 20 20 22 20 20 20 20 20 65 6e  ion",.  "     en
1a9a0 61 62 6c 65 20 3f 42 4f 4f 4c 45 41 4e 3f 20 20  able ?BOOLEAN?  
1a9b0 20 20 20 20 20 20 20 53 65 74 20 6f 72 20 71 75         Set or qu
1a9c0 65 72 79 20 74 68 65 20 65 6e 61 62 6c 65 20 62  ery the enable b
1a9d0 69 74 22 2c 0a 20 20 22 20 20 20 20 20 66 69 6c  it",.  "     fil
1a9e0 74 65 72 20 47 4c 4f 42 2e 2e 2e 20 20 20 20 20  ter GLOB...     
1a9f0 20 20 20 20 20 20 52 65 6a 65 63 74 20 74 61 62        Reject tab
1aa00 6c 65 73 20 6d 61 74 63 68 69 6e 67 20 47 4c 4f  les matching GLO
1aa10 42 73 22 2c 0a 20 20 22 20 20 20 20 20 69 6e 64  Bs",.  "     ind
1aa20 69 72 65 63 74 20 3f 42 4f 4f 4c 45 41 4e 3f 20  irect ?BOOLEAN? 
1aa30 20 20 20 20 20 20 4d 61 72 6b 20 6f 72 20 71 75        Mark or qu
1aa40 65 72 79 20 74 68 65 20 69 6e 64 69 72 65 63 74  ery the indirect
1aa50 20 73 74 61 74 75 73 22 2c 0a 20 20 22 20 20 20   status",.  "   
1aa60 20 20 69 73 65 6d 70 74 79 20 20 20 20 20 20 20    isempty       
1aa70 20 20 20 20 20 20 20 20 20 20 20 51 75 65 72 79             Query
1aa80 20 77 68 65 74 68 65 72 20 74 68 65 20 73 65 73   whether the ses
1aa90 73 69 6f 6e 20 69 73 20 65 6d 70 74 79 22 2c 0a  sion is empty",.
1aaa0 20 20 22 20 20 20 20 20 6c 69 73 74 20 20 20 20    "     list    
1aab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aac0 20 4c 69 73 74 20 63 75 72 72 65 6e 74 6c 79 20   List currently 
1aad0 6f 70 65 6e 20 73 65 73 73 69 6f 6e 20 6e 61 6d  open session nam
1aae0 65 73 22 2c 0a 20 20 22 20 20 20 20 20 6f 70 65  es",.  "     ope
1aaf0 6e 20 44 42 20 4e 41 4d 45 20 20 20 20 20 20 20  n DB NAME       
1ab00 20 20 20 20 20 20 4f 70 65 6e 20 61 20 6e 65 77        Open a new
1ab10 20 73 65 73 73 69 6f 6e 20 6f 6e 20 44 42 22 2c   session on DB",
1ab20 0a 20 20 22 20 20 20 20 20 70 61 74 63 68 73 65  .  "     patchse
1ab30 74 20 46 49 4c 45 20 20 20 20 20 20 20 20 20 20  t FILE          
1ab40 20 20 57 72 69 74 65 20 61 20 70 61 74 63 68 73    Write a patchs
1ab50 65 74 20 69 6e 74 6f 20 46 49 4c 45 22 2c 0a 20  et into FILE",. 
1ab60 20 22 20 20 20 49 66 20 3f 4e 41 4d 45 3f 20 69   "   If ?NAME? i
1ab70 73 20 6f 6d 69 74 74 65 64 2c 20 74 68 65 20 66  s omitted, the f
1ab80 69 72 73 74 20 64 65 66 69 6e 65 64 20 73 65 73  irst defined ses
1ab90 73 69 6f 6e 20 69 73 20 75 73 65 64 2e 22 2c 0a  sion is used.",.
1aba0 23 65 6e 64 69 66 0a 20 20 22 2e 73 68 61 33 73  #endif.  ".sha3s
1abb0 75 6d 20 2e 2e 2e 20 20 20 20 20 20 20 20 20 20  um ...          
1abc0 20 20 20 43 6f 6d 70 75 74 65 20 61 20 53 48 41     Compute a SHA
1abd0 33 20 68 61 73 68 20 6f 66 20 64 61 74 61 62 61  3 hash of databa
1abe0 73 65 20 63 6f 6e 74 65 6e 74 22 2c 0a 20 20 22  se content",.  "
1abf0 20 20 20 20 4f 70 74 69 6f 6e 73 3a 22 2c 0a 20      Options:",. 
1ac00 20 22 20 20 20 20 20 20 2d 2d 73 63 68 65 6d 61   "      --schema
1ac10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 41 6c                Al
1ac20 73 6f 20 68 61 73 68 20 74 68 65 20 73 71 6c 69  so hash the sqli
1ac30 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 22  te_master table"
1ac40 2c 0a 20 20 22 20 20 20 20 20 20 2d 2d 73 68 61  ,.  "      --sha
1ac50 33 2d 32 32 34 20 20 20 20 20 20 20 20 20 20 20  3-224           
1ac60 20 55 73 65 20 74 68 65 20 73 68 61 33 2d 32 32   Use the sha3-22
1ac70 34 20 61 6c 67 6f 72 69 74 68 6d 22 2c 0a 20 20  4 algorithm",.  
1ac80 22 20 20 20 20 20 20 2d 2d 73 68 61 33 2d 32 35  "      --sha3-25
1ac90 36 20 20 20 20 20 20 20 20 20 20 20 20 55 73 65  6            Use
1aca0 20 74 68 65 20 73 68 61 33 2d 32 35 36 20 61 6c   the sha3-256 al
1acb0 67 6f 72 69 74 68 6d 2e 20 20 54 68 69 73 20 69  gorithm.  This i
1acc0 73 20 74 68 65 20 64 65 66 61 75 6c 74 2e 22 2c  s the default.",
1acd0 0a 20 20 22 20 20 20 20 20 20 2d 2d 73 68 61 33  .  "      --sha3
1ace0 2d 33 38 34 20 20 20 20 20 20 20 20 20 20 20 20  -384            
1acf0 55 73 65 20 74 68 65 20 73 68 61 33 2d 33 38 34  Use the sha3-384
1ad00 20 61 6c 67 6f 72 69 74 68 6d 22 2c 0a 20 20 22   algorithm",.  "
1ad10 20 20 20 20 20 20 2d 2d 73 68 61 33 2d 35 31 32        --sha3-512
1ad20 20 20 20 20 20 20 20 20 20 20 20 20 55 73 65 20              Use 
1ad30 74 68 65 20 73 68 61 33 2d 35 31 32 20 61 6c 67  the sha3-512 alg
1ad40 6f 72 69 74 68 6d 22 2c 0a 20 20 22 20 20 20 20  orithm",.  "    
1ad50 41 6e 79 20 6f 74 68 65 72 20 61 72 67 75 6d 65  Any other argume
1ad60 6e 74 20 69 73 20 61 20 4c 49 4b 45 20 70 61 74  nt is a LIKE pat
1ad70 74 65 72 6e 20 66 6f 72 20 74 61 62 6c 65 73 20  tern for tables 
1ad80 74 6f 20 68 61 73 68 22 2c 0a 23 69 66 6e 64 65  to hash",.#ifnde
1ad90 66 20 53 51 4c 49 54 45 5f 4e 4f 48 41 56 45 5f  f SQLITE_NOHAVE_
1ada0 53 59 53 54 45 4d 0a 20 20 22 2e 73 68 65 6c 6c  SYSTEM.  ".shell
1adb0 20 43 4d 44 20 41 52 47 53 2e 2e 2e 20 20 20 20   CMD ARGS...    
1adc0 20 20 20 52 75 6e 20 43 4d 44 20 41 52 47 53 2e     Run CMD ARGS.
1add0 2e 2e 20 69 6e 20 61 20 73 79 73 74 65 6d 20 73  .. in a system s
1ade0 68 65 6c 6c 22 2c 0a 23 65 6e 64 69 66 0a 20 20  hell",.#endif.  
1adf0 22 2e 73 68 6f 77 20 20 20 20 20 20 20 20 20 20  ".show          
1ae00 20 20 20 20 20 20 20 20 20 20 53 68 6f 77 20 74            Show t
1ae10 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65  he current value
1ae20 73 20 66 6f 72 20 76 61 72 69 6f 75 73 20 73 65  s for various se
1ae30 74 74 69 6e 67 73 22 2c 0a 20 20 22 2e 73 74 61  ttings",.  ".sta
1ae40 74 73 20 3f 6f 6e 7c 6f 66 66 3f 20 20 20 20 20  ts ?on|off?     
1ae50 20 20 20 20 20 53 68 6f 77 20 73 74 61 74 73 20       Show stats 
1ae60 6f 72 20 74 75 72 6e 20 73 74 61 74 73 20 6f 6e  or turn stats on
1ae70 20 6f 72 20 6f 66 66 22 2c 0a 23 69 66 6e 64 65   or off",.#ifnde
1ae80 66 20 53 51 4c 49 54 45 5f 4e 4f 48 41 56 45 5f  f SQLITE_NOHAVE_
1ae90 53 59 53 54 45 4d 0a 20 20 22 2e 73 79 73 74 65  SYSTEM.  ".syste
1aea0 6d 20 43 4d 44 20 41 52 47 53 2e 2e 2e 20 20 20  m CMD ARGS...   
1aeb0 20 20 20 52 75 6e 20 43 4d 44 20 41 52 47 53 2e     Run CMD ARGS.
1aec0 2e 2e 20 69 6e 20 61 20 73 79 73 74 65 6d 20 73  .. in a system s
1aed0 68 65 6c 6c 22 2c 0a 23 65 6e 64 69 66 0a 20 20  hell",.#endif.  
1aee0 22 2e 74 61 62 6c 65 73 20 3f 54 41 42 4c 45 3f  ".tables ?TABLE?
1aef0 20 20 20 20 20 20 20 20 20 20 4c 69 73 74 20 6e            List n
1af00 61 6d 65 73 20 6f 66 20 74 61 62 6c 65 73 20 6d  ames of tables m
1af10 61 74 63 68 69 6e 67 20 4c 49 4b 45 20 70 61 74  atching LIKE pat
1af20 74 65 72 6e 20 54 41 42 4c 45 22 2c 0a 20 20 22  tern TABLE",.  "
1af30 2e 74 65 73 74 63 61 73 65 20 4e 41 4d 45 20 20  .testcase NAME  
1af40 20 20 20 20 20 20 20 20 20 42 65 67 69 6e 20 72           Begin r
1af50 65 64 69 72 65 63 74 69 6e 67 20 6f 75 74 70 75  edirecting outpu
1af60 74 20 74 6f 20 27 74 65 73 74 63 61 73 65 2d 6f  t to 'testcase-o
1af70 75 74 2e 74 78 74 27 22 2c 0a 20 20 22 2e 74 69  ut.txt'",.  ".ti
1af80 6d 65 6f 75 74 20 4d 53 20 20 20 20 20 20 20 20  meout MS        
1af90 20 20 20 20 20 20 54 72 79 20 6f 70 65 6e 69 6e        Try openin
1afa0 67 20 6c 6f 63 6b 65 64 20 74 61 62 6c 65 73 20  g locked tables 
1afb0 66 6f 72 20 4d 53 20 6d 69 6c 6c 69 73 65 63 6f  for MS milliseco
1afc0 6e 64 73 22 2c 0a 20 20 22 2e 74 69 6d 65 72 20  nds",.  ".timer 
1afd0 6f 6e 7c 6f 66 66 20 20 20 20 20 20 20 20 20 20  on|off          
1afe0 20 20 54 75 72 6e 20 53 51 4c 20 74 69 6d 65 72    Turn SQL timer
1aff0 20 6f 6e 20 6f 72 20 6f 66 66 22 2c 0a 20 20 22   on or off",.  "
1b000 2e 74 72 61 63 65 20 46 49 4c 45 7c 6f 66 66 20  .trace FILE|off 
1b010 20 20 20 20 20 20 20 20 20 4f 75 74 70 75 74 20           Output 
1b020 65 61 63 68 20 53 51 4c 20 73 74 61 74 65 6d 65  each SQL stateme
1b030 6e 74 20 61 73 20 69 74 20 69 73 20 72 75 6e 22  nt as it is run"
1b040 2c 0a 20 20 22 2e 76 66 73 69 6e 66 6f 20 3f 41  ,.  ".vfsinfo ?A
1b050 55 58 3f 20 20 20 20 20 20 20 20 20 20 20 49 6e  UX?           In
1b060 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20  formation about 
1b070 74 68 65 20 74 6f 70 2d 6c 65 76 65 6c 20 56 46  the top-level VF
1b080 53 22 2c 0a 20 20 22 2e 76 66 73 6c 69 73 74 20  S",.  ".vfslist 
1b090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b0a0 4c 69 73 74 20 61 6c 6c 20 61 76 61 69 6c 61 62  List all availab
1b0b0 6c 65 20 56 46 53 65 73 22 2c 0a 20 20 22 2e 76  le VFSes",.  ".v
1b0c0 66 73 6e 61 6d 65 20 3f 41 55 58 3f 20 20 20 20  fsname ?AUX?    
1b0d0 20 20 20 20 20 20 20 50 72 69 6e 74 20 74 68 65         Print the
1b0e0 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 56 46 53   name of the VFS
1b0f0 20 73 74 61 63 6b 22 2c 0a 20 20 22 2e 77 69 64   stack",.  ".wid
1b100 74 68 20 4e 55 4d 31 20 4e 55 4d 32 20 2e 2e 2e  th NUM1 NUM2 ...
1b110 20 20 20 20 20 53 65 74 20 63 6f 6c 75 6d 6e 20       Set column 
1b120 77 69 64 74 68 73 20 66 6f 72 20 5c 22 63 6f 6c  widths for \"col
1b130 75 6d 6e 5c 22 20 6d 6f 64 65 22 2c 0a 20 20 22  umn\" mode",.  "
1b140 20 20 20 20 20 4e 65 67 61 74 69 76 65 20 76 61       Negative va
1b150 6c 75 65 73 20 72 69 67 68 74 2d 6a 75 73 74 69  lues right-justi
1b160 66 79 22 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 4f  fy",.};../*.** O
1b170 75 74 70 75 74 20 68 65 6c 70 20 74 65 78 74 2e  utput help text.
1b180 0a 2a 2a 0a 2a 2a 20 7a 50 61 74 74 65 72 6e 20  .**.** zPattern 
1b190 64 65 73 63 72 69 62 65 73 20 74 68 65 20 73 65  describes the se
1b1a0 74 20 6f 66 20 63 6f 6d 6d 61 6e 64 73 20 66 6f  t of commands fo
1b1b0 72 20 77 68 69 63 68 20 68 65 6c 70 20 74 65 78  r which help tex
1b1c0 74 20 69 73 20 70 72 6f 76 69 64 65 64 2e 0a 2a  t is provided..*
1b1d0 2a 20 49 66 20 7a 50 61 74 74 65 72 6e 20 69 73  * If zPattern is
1b1e0 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 73 68 6f 77   NULL, then show
1b1f0 20 61 6c 6c 20 63 6f 6d 6d 61 6e 64 73 2c 20 62   all commands, b
1b200 75 74 20 6f 6e 6c 79 20 67 69 76 65 20 61 20 6f  ut only give a o
1b210 6e 65 2d 6c 69 6e 65 0a 2a 2a 20 64 65 73 63 72  ne-line.** descr
1b220 69 70 74 69 6f 6e 20 6f 66 20 65 61 63 68 2e 0a  iption of each..
1b230 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  **.** Return the
1b240 20 6e 75 6d 62 65 72 20 6f 66 20 6d 61 74 63 68   number of match
1b250 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  es..*/.static in
1b260 74 20 73 68 6f 77 48 65 6c 70 28 46 49 4c 45 20  t showHelp(FILE 
1b270 2a 6f 75 74 2c 20 63 6f 6e 73 74 20 63 68 61 72  *out, const char
1b280 20 2a 7a 50 61 74 74 65 72 6e 29 7b 0a 20 20 69   *zPattern){.  i
1b290 6e 74 20 69 20 3d 20 30 3b 0a 20 20 69 6e 74 20  nt i = 0;.  int 
1b2a0 6a 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 20 3d  j = 0;.  int n =
1b2b0 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a 50 61 74   0;.  char *zPat
1b2c0 3b 0a 20 20 69 66 28 20 7a 50 61 74 74 65 72 6e  ;.  if( zPattern
1b2d0 3d 3d 30 0a 20 20 20 7c 7c 20 7a 50 61 74 74 65  ==0.   || zPatte
1b2e0 72 6e 5b 30 5d 3d 3d 27 30 27 0a 20 20 20 7c 7c  rn[0]=='0'.   ||
1b2f0 20 73 74 72 63 6d 70 28 7a 50 61 74 74 65 72 6e   strcmp(zPattern
1b300 2c 22 2d 61 22 29 3d 3d 30 0a 20 20 20 7c 7c 20  ,"-a")==0.   || 
1b310 73 74 72 63 6d 70 28 7a 50 61 74 74 65 72 6e 2c  strcmp(zPattern,
1b320 22 2d 61 6c 6c 22 29 3d 3d 30 0a 20 20 29 7b 0a  "-all")==0.  ){.
1b330 20 20 20 20 2f 2a 20 53 68 6f 77 20 61 6c 6c 20      /* Show all 
1b340 63 6f 6d 6d 61 6e 64 73 2c 20 62 75 74 20 6f 6e  commands, but on
1b350 6c 79 20 6f 6e 65 20 6c 69 6e 65 20 70 65 72 20  ly one line per 
1b360 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 69  command */.    i
1b370 66 28 20 7a 50 61 74 74 65 72 6e 3d 3d 30 20 29  f( zPattern==0 )
1b380 20 7a 50 61 74 74 65 72 6e 20 3d 20 22 22 3b 0a   zPattern = "";.
1b390 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 41      for(i=0; i<A
1b3a0 72 72 61 79 53 69 7a 65 28 61 7a 48 65 6c 70 29  rraySize(azHelp)
1b3b0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
1b3c0 28 20 61 7a 48 65 6c 70 5b 69 5d 5b 30 5d 3d 3d  ( azHelp[i][0]==
1b3d0 27 2e 27 20 7c 7c 20 7a 50 61 74 74 65 72 6e 5b  '.' || zPattern[
1b3e0 30 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74  0] ){.        ut
1b3f0 66 38 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22  f8_printf(out, "
1b400 25 73 5c 6e 22 2c 20 61 7a 48 65 6c 70 5b 69 5d  %s\n", azHelp[i]
1b410 29 3b 0a 20 20 20 20 20 20 20 20 6e 2b 2b 3b 0a  );.        n++;.
1b420 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1b430 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 4c 6f  }else{.    /* Lo
1b440 6f 6b 20 66 6f 72 20 63 6f 6d 6d 61 6e 64 73 20  ok for commands 
1b450 74 68 61 74 20 66 6f 72 20 77 68 69 63 68 20 7a  that for which z
1b460 50 61 74 74 65 72 6e 20 69 73 20 61 6e 20 65 78  Pattern is an ex
1b470 61 63 74 20 70 72 65 66 69 78 20 2a 2f 0a 20 20  act prefix */.  
1b480 20 20 7a 50 61 74 20 3d 20 73 71 6c 69 74 65 33    zPat = sqlite3
1b490 5f 6d 70 72 69 6e 74 66 28 22 2e 25 73 2a 22 2c  _mprintf(".%s*",
1b4a0 20 7a 50 61 74 74 65 72 6e 29 3b 0a 20 20 20 20   zPattern);.    
1b4b0 66 6f 72 28 69 3d 30 3b 20 69 3c 41 72 72 61 79  for(i=0; i<Array
1b4c0 53 69 7a 65 28 61 7a 48 65 6c 70 29 3b 20 69 2b  Size(azHelp); i+
1b4d0 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71  +){.      if( sq
1b4e0 6c 69 74 65 33 5f 73 74 72 67 6c 6f 62 28 7a 50  lite3_strglob(zP
1b4f0 61 74 2c 20 61 7a 48 65 6c 70 5b 69 5d 29 3d 3d  at, azHelp[i])==
1b500 30 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66  0 ){.        utf
1b510 38 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25  8_printf(out, "%
1b520 73 5c 6e 22 2c 20 61 7a 48 65 6c 70 5b 69 5d 29  s\n", azHelp[i])
1b530 3b 0a 20 20 20 20 20 20 20 20 6a 20 3d 20 69 2b  ;.        j = i+
1b540 31 3b 0a 20 20 20 20 20 20 20 20 6e 2b 2b 3b 0a  1;.        n++;.
1b550 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1b560 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
1b570 50 61 74 29 3b 0a 20 20 20 20 69 66 28 20 6e 20  Pat);.    if( n 
1b580 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 3d 3d  ){.      if( n==
1b590 31 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  1 ){.        /* 
1b5a0 77 68 65 6e 20 7a 50 61 74 74 65 72 6e 20 69 73  when zPattern is
1b5b0 20 61 20 70 72 65 66 69 78 20 6f 66 20 65 78 61   a prefix of exa
1b5c0 63 74 6c 79 20 6f 6e 65 20 63 6f 6d 6d 61 6e 64  ctly one command
1b5d0 2c 20 74 68 65 6e 20 69 6e 63 6c 75 64 65 20 74  , then include t
1b5e0 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 65  he.        ** de
1b5f0 74 61 69 6c 73 20 6f 66 20 74 68 61 74 20 63 6f  tails of that co
1b600 6d 6d 61 6e 64 2c 20 77 68 69 63 68 20 73 68 6f  mmand, which sho
1b610 75 6c 64 20 62 65 67 69 6e 20 61 74 20 6f 66 66  uld begin at off
1b620 73 65 74 20 6a 20 2a 2f 0a 20 20 20 20 20 20 20  set j */.       
1b630 20 77 68 69 6c 65 28 20 6a 3c 41 72 72 61 79 53   while( j<ArrayS
1b640 69 7a 65 28 61 7a 48 65 6c 70 29 2d 31 20 26 26  ize(azHelp)-1 &&
1b650 20 61 7a 48 65 6c 70 5b 6a 5d 5b 30 5d 21 3d 27   azHelp[j][0]!='
1b660 2e 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  .' ){.          
1b670 75 74 66 38 5f 70 72 69 6e 74 66 28 6f 75 74 2c  utf8_printf(out,
1b680 20 22 25 73 5c 6e 22 2c 20 61 7a 48 65 6c 70 5b   "%s\n", azHelp[
1b690 6a 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6a  j]);.          j
1b6a0 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ++;.        }.  
1b6b0 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75      }.      retu
1b6c0 72 6e 20 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn n;.    }.    
1b6d0 2f 2a 20 4c 6f 6f 6b 20 66 6f 72 20 63 6f 6d 6d  /* Look for comm
1b6e0 61 6e 64 73 20 74 68 61 74 20 63 6f 6e 74 61 69  ands that contai
1b6f0 6e 20 7a 50 61 74 74 65 72 6e 20 61 6e 79 77 68  n zPattern anywh
1b700 65 72 65 2e 20 20 53 68 6f 77 20 74 68 65 20 63  ere.  Show the c
1b710 6f 6d 70 6c 65 74 65 0a 20 20 20 20 2a 2a 20 74  omplete.    ** t
1b720 65 78 74 20 6f 66 20 61 6c 6c 20 63 6f 6d 6d 61  ext of all comma
1b730 6e 64 73 20 74 68 61 74 20 6d 61 74 63 68 2e 20  nds that match. 
1b740 2a 2f 0a 20 20 20 20 7a 50 61 74 20 3d 20 73 71  */.    zPat = sq
1b750 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25  lite3_mprintf("%
1b760 25 25 73 25 25 22 2c 20 7a 50 61 74 74 65 72 6e  %%s%%", zPattern
1b770 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  );.    for(i=0; 
1b780 69 3c 41 72 72 61 79 53 69 7a 65 28 61 7a 48 65  i<ArraySize(azHe
1b790 6c 70 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  lp); i++){.     
1b7a0 20 69 66 28 20 61 7a 48 65 6c 70 5b 69 5d 5b 30   if( azHelp[i][0
1b7b0 5d 3d 3d 27 2e 27 20 29 20 6a 20 3d 20 69 3b 0a  ]=='.' ) j = i;.
1b7c0 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
1b7d0 33 5f 73 74 72 6c 69 6b 65 28 7a 50 61 74 2c 20  3_strlike(zPat, 
1b7e0 61 7a 48 65 6c 70 5b 69 5d 2c 20 30 29 3d 3d 30  azHelp[i], 0)==0
1b7f0 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38   ){.        utf8
1b800 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 73  _printf(out, "%s
1b810 5c 6e 22 2c 20 61 7a 48 65 6c 70 5b 6a 5d 29 3b  \n", azHelp[j]);
1b820 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20  .        while( 
1b830 6a 3c 41 72 72 61 79 53 69 7a 65 28 61 7a 48 65  j<ArraySize(azHe
1b840 6c 70 29 2d 31 20 26 26 20 61 7a 48 65 6c 70 5b  lp)-1 && azHelp[
1b850 6a 2b 31 5d 5b 30 5d 21 3d 27 2e 27 20 29 7b 0a  j+1][0]!='.' ){.
1b860 20 20 20 20 20 20 20 20 20 20 6a 2b 2b 3b 0a 20            j++;. 
1b870 20 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72           utf8_pr
1b880 69 6e 74 66 28 6f 75 74 2c 20 22 25 73 5c 6e 22  intf(out, "%s\n"
1b890 2c 20 61 7a 48 65 6c 70 5b 6a 5d 29 3b 0a 20 20  , azHelp[j]);.  
1b8a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1b8b0 69 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20 6e  i = j;.        n
1b8c0 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ++;.      }.    
1b8d0 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  }.    sqlite3_fr
1b8e0 65 65 28 7a 50 61 74 29 3b 0a 20 20 7d 0a 20 20  ee(zPat);.  }.  
1b8f0 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 20  return n;.}../* 
1b900 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63  Forward referenc
1b910 65 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  e */.static int 
1b920 70 72 6f 63 65 73 73 5f 69 6e 70 75 74 28 53 68  process_input(Sh
1b930 65 6c 6c 53 74 61 74 65 20 2a 70 2c 20 46 49 4c  ellState *p, FIL
1b940 45 20 2a 69 6e 29 3b 0a 0a 2f 2a 0a 2a 2a 20 52  E *in);../*.** R
1b950 65 61 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  ead the content 
1b960 6f 66 20 66 69 6c 65 20 7a 4e 61 6d 65 20 69 6e  of file zName in
1b970 74 6f 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e  to memory obtain
1b980 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f  ed from sqlite3_
1b990 6d 61 6c 6c 6f 63 36 34 28 29 0a 2a 2a 20 61 6e  malloc64().** an
1b9a0 64 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  d return a point
1b9b0 65 72 20 74 6f 20 74 68 65 20 62 75 66 66 65 72  er to the buffer
1b9c0 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 69 73 20  . The caller is 
1b9d0 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20  responsible for 
1b9e0 66 72 65 65 69 6e 67 0a 2a 2a 20 74 68 65 20 6d  freeing.** the m
1b9f0 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  emory..**.** If 
1ba00 70 61 72 61 6d 65 74 65 72 20 70 6e 42 79 74 65  parameter pnByte
1ba10 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 28 2a   is not NULL, (*
1ba20 70 6e 42 79 74 65 29 20 69 73 20 73 65 74 20 74  pnByte) is set t
1ba30 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  o the number of 
1ba40 62 79 74 65 73 0a 2a 2a 20 72 65 61 64 2e 0a 2a  bytes.** read..*
1ba50 2a 0a 2a 2a 20 46 6f 72 20 63 6f 6e 76 65 6e 69  *.** For conveni
1ba60 65 6e 63 65 2c 20 61 20 6e 75 6c 2d 74 65 72 6d  ence, a nul-term
1ba70 69 6e 61 74 6f 72 20 62 79 74 65 20 69 73 20 61  inator byte is a
1ba80 6c 77 61 79 73 20 61 70 70 65 6e 64 65 64 20 74  lways appended t
1ba90 6f 20 74 68 65 20 64 61 74 61 20 72 65 61 64 0a  o the data read.
1baa0 2a 2a 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65  ** from the file
1bab0 20 62 65 66 6f 72 65 20 74 68 65 20 62 75 66 66   before the buff
1bac0 65 72 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  er is returned. 
1bad0 54 68 69 73 20 62 79 74 65 20 69 73 20 6e 6f 74  This byte is not
1bae0 20 69 6e 63 6c 75 64 65 64 20 69 6e 0a 2a 2a 20   included in.** 
1baf0 74 68 65 20 66 69 6e 61 6c 20 76 61 6c 75 65 20  the final value 
1bb00 6f 66 20 28 2a 70 6e 42 79 74 65 29 2c 20 69 66  of (*pnByte), if
1bb10 20 61 70 70 6c 69 63 61 62 6c 65 2e 0a 2a 2a 0a   applicable..**.
1bb20 2a 2a 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72  ** NULL is retur
1bb30 6e 65 64 20 69 66 20 61 6e 79 20 65 72 72 6f 72  ned if any error
1bb40 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2e   is encountered.
1bb50 20 54 68 65 20 66 69 6e 61 6c 20 76 61 6c 75 65   The final value
1bb60 20 6f 66 20 2a 70 6e 42 79 74 65 0a 2a 2a 20 69   of *pnByte.** i
1bb70 73 20 75 6e 64 65 66 69 6e 65 64 20 69 6e 20 74  s undefined in t
1bb80 68 69 73 20 63 61 73 65 2e 0a 2a 2f 0a 73 74 61  his case..*/.sta
1bb90 74 69 63 20 63 68 61 72 20 2a 72 65 61 64 46 69  tic char *readFi
1bba0 6c 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  le(const char *z
1bbb0 4e 61 6d 65 2c 20 69 6e 74 20 2a 70 6e 42 79 74  Name, int *pnByt
1bbc0 65 29 7b 0a 20 20 46 49 4c 45 20 2a 69 6e 20 3d  e){.  FILE *in =
1bbd0 20 66 6f 70 65 6e 28 7a 4e 61 6d 65 2c 20 22 72   fopen(zName, "r
1bbe0 62 22 29 3b 0a 20 20 6c 6f 6e 67 20 6e 49 6e 3b  b");.  long nIn;
1bbf0 0a 20 20 73 69 7a 65 5f 74 20 6e 52 65 61 64 3b  .  size_t nRead;
1bc00 0a 20 20 63 68 61 72 20 2a 70 42 75 66 3b 0a 20  .  char *pBuf;. 
1bc10 20 69 66 28 20 69 6e 3d 3d 30 20 29 20 72 65 74   if( in==0 ) ret
1bc20 75 72 6e 20 30 3b 0a 20 20 66 73 65 65 6b 28 69  urn 0;.  fseek(i
1bc30 6e 2c 20 30 2c 20 53 45 45 4b 5f 45 4e 44 29 3b  n, 0, SEEK_END);
1bc40 0a 20 20 6e 49 6e 20 3d 20 66 74 65 6c 6c 28 69  .  nIn = ftell(i
1bc50 6e 29 3b 0a 20 20 72 65 77 69 6e 64 28 69 6e 29  n);.  rewind(in)
1bc60 3b 0a 20 20 70 42 75 66 20 3d 20 73 71 6c 69 74  ;.  pBuf = sqlit
1bc70 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 20 6e 49 6e  e3_malloc64( nIn
1bc80 2b 31 20 29 3b 0a 20 20 69 66 28 20 70 42 75 66  +1 );.  if( pBuf
1bc90 3d 3d 30 20 29 7b 20 66 63 6c 6f 73 65 28 69 6e  ==0 ){ fclose(in
1bca0 29 3b 20 72 65 74 75 72 6e 20 30 3b 20 7d 0a 20  ); return 0; }. 
1bcb0 20 6e 52 65 61 64 20 3d 20 66 72 65 61 64 28 70   nRead = fread(p
1bcc0 42 75 66 2c 20 6e 49 6e 2c 20 31 2c 20 69 6e 29  Buf, nIn, 1, in)
1bcd0 3b 0a 20 20 66 63 6c 6f 73 65 28 69 6e 29 3b 0a  ;.  fclose(in);.
1bce0 20 20 69 66 28 20 6e 52 65 61 64 21 3d 31 20 29    if( nRead!=1 )
1bcf0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  {.    sqlite3_fr
1bd00 65 65 28 70 42 75 66 29 3b 0a 20 20 20 20 72 65  ee(pBuf);.    re
1bd10 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 42  turn 0;.  }.  pB
1bd20 75 66 5b 6e 49 6e 5d 20 3d 20 30 3b 0a 20 20 69  uf[nIn] = 0;.  i
1bd30 66 28 20 70 6e 42 79 74 65 20 29 20 2a 70 6e 42  f( pnByte ) *pnB
1bd40 79 74 65 20 3d 20 6e 49 6e 3b 0a 20 20 72 65 74  yte = nIn;.  ret
1bd50 75 72 6e 20 70 42 75 66 3b 0a 7d 0a 0a 23 69 66  urn pBuf;.}..#if
1bd60 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
1bd70 45 4e 41 42 4c 45 5f 53 45 53 53 49 4f 4e 29 0a  ENABLE_SESSION).
1bd80 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 73 69  /*.** Close a si
1bd90 6e 67 6c 65 20 4f 70 65 6e 53 65 73 73 69 6f 6e  ngle OpenSession
1bda0 20 6f 62 6a 65 63 74 20 61 6e 64 20 72 65 6c 65   object and rele
1bdb0 61 73 65 20 61 6c 6c 20 6f 66 20 69 74 73 20 61  ase all of its a
1bdc0 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20 72 65 73  ssociated.** res
1bdd0 6f 75 72 63 65 73 2e 0a 2a 2f 0a 73 74 61 74 69  ources..*/.stati
1bde0 63 20 76 6f 69 64 20 73 65 73 73 69 6f 6e 5f 63  c void session_c
1bdf0 6c 6f 73 65 28 4f 70 65 6e 53 65 73 73 69 6f 6e  lose(OpenSession
1be00 20 2a 70 53 65 73 73 69 6f 6e 29 7b 0a 20 20 69   *pSession){.  i
1be10 6e 74 20 69 3b 0a 20 20 73 71 6c 69 74 65 33 73  nt i;.  sqlite3s
1be20 65 73 73 69 6f 6e 5f 64 65 6c 65 74 65 28 70 53  ession_delete(pS
1be30 65 73 73 69 6f 6e 2d 3e 70 29 3b 0a 20 20 73 71  ession->p);.  sq
1be40 6c 69 74 65 33 5f 66 72 65 65 28 70 53 65 73 73  lite3_free(pSess
1be50 69 6f 6e 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 66  ion->zName);.  f
1be60 6f 72 28 69 3d 30 3b 20 69 3c 70 53 65 73 73 69  or(i=0; i<pSessi
1be70 6f 6e 2d 3e 6e 46 69 6c 74 65 72 3b 20 69 2b 2b  on->nFilter; i++
1be80 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  ){.    sqlite3_f
1be90 72 65 65 28 70 53 65 73 73 69 6f 6e 2d 3e 61 7a  ree(pSession->az
1bea0 46 69 6c 74 65 72 5b 69 5d 29 3b 0a 20 20 7d 0a  Filter[i]);.  }.
1beb0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
1bec0 53 65 73 73 69 6f 6e 2d 3e 61 7a 46 69 6c 74 65  Session->azFilte
1bed0 72 29 3b 0a 20 20 6d 65 6d 73 65 74 28 70 53 65  r);.  memset(pSe
1bee0 73 73 69 6f 6e 2c 20 30 2c 20 73 69 7a 65 6f 66  ssion, 0, sizeof
1bef0 28 4f 70 65 6e 53 65 73 73 69 6f 6e 29 29 3b 0a  (OpenSession));.
1bf00 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
1bf10 43 6c 6f 73 65 20 61 6c 6c 20 4f 70 65 6e 53 65  Close all OpenSe
1bf20 73 73 69 6f 6e 20 6f 62 6a 65 63 74 73 20 61 6e  ssion objects an
1bf30 64 20 72 65 6c 65 61 73 65 20 61 6c 6c 20 61 73  d release all as
1bf40 73 6f 63 69 61 74 65 64 20 72 65 73 6f 75 72 63  sociated resourc
1bf50 65 73 2e 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e  es..*/.#if defin
1bf60 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
1bf70 5f 53 45 53 53 49 4f 4e 29 0a 73 74 61 74 69 63  _SESSION).static
1bf80 20 76 6f 69 64 20 73 65 73 73 69 6f 6e 5f 63 6c   void session_cl
1bf90 6f 73 65 5f 61 6c 6c 28 53 68 65 6c 6c 53 74 61  ose_all(ShellSta
1bfa0 74 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b  te *p){.  int i;
1bfb0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d  .  for(i=0; i<p-
1bfc0 3e 6e 53 65 73 73 69 6f 6e 3b 20 69 2b 2b 29 7b  >nSession; i++){
1bfd0 0a 20 20 20 20 73 65 73 73 69 6f 6e 5f 63 6c 6f  .    session_clo
1bfe0 73 65 28 26 70 2d 3e 61 53 65 73 73 69 6f 6e 5b  se(&p->aSession[
1bff0 69 5d 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6e 53  i]);.  }.  p->nS
1c000 65 73 73 69 6f 6e 20 3d 20 30 3b 0a 7d 0a 23 65  ession = 0;.}.#e
1c010 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 73 65 73  lse.# define ses
1c020 73 69 6f 6e 5f 63 6c 6f 73 65 5f 61 6c 6c 28 58  sion_close_all(X
1c030 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
1c040 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  Implementation o
1c050 66 20 74 68 65 20 78 46 69 6c 74 65 72 20 66 75  f the xFilter fu
1c060 6e 63 74 69 6f 6e 20 66 6f 72 20 61 6e 20 6f 70  nction for an op
1c070 65 6e 20 73 65 73 73 69 6f 6e 2e 20 20 4f 6d 69  en session.  Omi
1c080 74 0a 2a 2a 20 61 6e 79 20 74 61 62 6c 65 73 20  t.** any tables 
1c090 6e 61 6d 65 64 20 62 79 20 22 2e 73 65 73 73 69  named by ".sessi
1c0a0 6f 6e 20 66 69 6c 74 65 72 22 20 62 75 74 20 6c  on filter" but l
1c0b0 65 74 20 61 6c 6c 20 6f 74 68 65 72 20 74 61 62  et all other tab
1c0c0 6c 65 20 74 68 72 6f 75 67 68 2e 0a 2a 2f 0a 23  le through..*/.#
1c0d0 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
1c0e0 45 5f 45 4e 41 42 4c 45 5f 53 45 53 53 49 4f 4e  E_ENABLE_SESSION
1c0f0 29 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 73  ).static int ses
1c100 73 69 6f 6e 5f 66 69 6c 74 65 72 28 76 6f 69 64  sion_filter(void
1c110 20 2a 70 43 74 78 2c 20 63 6f 6e 73 74 20 63 68   *pCtx, const ch
1c120 61 72 20 2a 7a 54 61 62 29 7b 0a 20 20 4f 70 65  ar *zTab){.  Ope
1c130 6e 53 65 73 73 69 6f 6e 20 2a 70 53 65 73 73 69  nSession *pSessi
1c140 6f 6e 20 3d 20 28 4f 70 65 6e 53 65 73 73 69 6f  on = (OpenSessio
1c150 6e 2a 29 70 43 74 78 3b 0a 20 20 69 6e 74 20 69  n*)pCtx;.  int i
1c160 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
1c170 53 65 73 73 69 6f 6e 2d 3e 6e 46 69 6c 74 65 72  Session->nFilter
1c180 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
1c190 73 71 6c 69 74 65 33 5f 73 74 72 67 6c 6f 62 28  sqlite3_strglob(
1c1a0 70 53 65 73 73 69 6f 6e 2d 3e 61 7a 46 69 6c 74  pSession->azFilt
1c1b0 65 72 5b 69 5d 2c 20 7a 54 61 62 29 3d 3d 30 20  er[i], zTab)==0 
1c1c0 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a  ) return 0;.  }.
1c1d0 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65    return 1;.}.#e
1c1e0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20  ndif../*.** Try 
1c1f0 74 6f 20 64 65 64 75 63 65 20 74 68 65 20 74 79  to deduce the ty
1c200 70 65 20 6f 66 20 66 69 6c 65 20 66 6f 72 20 7a  pe of file for z
1c210 4e 61 6d 65 20 62 61 73 65 64 20 6f 6e 20 69 74  Name based on it
1c220 73 20 63 6f 6e 74 65 6e 74 2e 20 20 52 65 74 75  s content.  Retu
1c230 72 6e 0a 2a 2a 20 6f 6e 65 20 6f 66 20 74 68 65  rn.** one of the
1c240 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f 2a 20 63 6f   SHELL_OPEN_* co
1c250 6e 73 74 61 6e 74 73 2e 0a 2a 2a 0a 2a 2a 20 49  nstants..**.** I
1c260 66 20 74 68 65 20 66 69 6c 65 20 64 6f 65 73 20  f the file does 
1c270 6e 6f 74 20 65 78 69 73 74 20 6f 72 20 69 73 20  not exist or is 
1c280 65 6d 70 74 79 20 62 75 74 20 69 74 73 20 6e 61  empty but its na
1c290 6d 65 20 6c 6f 6f 6b 73 20 6c 69 6b 65 20 61 20  me looks like a 
1c2a0 5a 49 50 0a 2a 2a 20 61 72 63 68 69 76 65 20 61  ZIP.** archive a
1c2b0 6e 64 20 74 68 65 20 64 66 6c 74 5a 69 70 20 66  nd the dfltZip f
1c2c0 6c 61 67 20 69 73 20 74 72 75 65 2c 20 74 68 65  lag is true, the
1c2d0 6e 20 61 73 73 75 6d 65 20 69 74 20 69 73 20 61  n assume it is a
1c2e0 20 5a 49 50 20 61 72 63 68 69 76 65 2e 0a 2a 2a   ZIP archive..**
1c2f0 20 4f 74 68 65 72 77 69 73 65 2c 20 61 73 73 75   Otherwise, assu
1c300 6d 65 20 61 6e 20 6f 72 64 69 6e 61 72 79 20 64  me an ordinary d
1c310 61 74 61 62 61 73 65 20 72 65 67 61 72 64 6c 65  atabase regardle
1c320 73 73 20 6f 66 20 74 68 65 20 66 69 6c 65 6e 61  ss of the filena
1c330 6d 65 20 69 66 0a 2a 2a 20 74 68 65 20 74 79 70  me if.** the typ
1c340 65 20 63 61 6e 6e 6f 74 20 62 65 20 64 65 74 65  e cannot be dete
1c350 72 6d 69 6e 65 64 20 66 72 6f 6d 20 63 6f 6e 74  rmined from cont
1c360 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 64 65 64 75  ent..*/.int dedu
1c370 63 65 44 61 74 61 62 61 73 65 54 79 70 65 28 63  ceDatabaseType(c
1c380 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
1c390 2c 20 69 6e 74 20 64 66 6c 74 5a 69 70 29 7b 0a  , int dfltZip){.
1c3a0 20 20 46 49 4c 45 20 2a 66 20 3d 20 66 6f 70 65    FILE *f = fope
1c3b0 6e 28 7a 4e 61 6d 65 2c 20 22 72 62 22 29 3b 0a  n(zName, "rb");.
1c3c0 20 20 73 69 7a 65 5f 74 20 6e 3b 0a 20 20 69 6e    size_t n;.  in
1c3d0 74 20 72 63 20 3d 20 53 48 45 4c 4c 5f 4f 50 45  t rc = SHELL_OPE
1c3e0 4e 5f 55 4e 53 50 45 43 3b 0a 20 20 63 68 61 72  N_UNSPEC;.  char
1c3f0 20 7a 42 75 66 5b 31 30 30 5d 3b 0a 20 20 69 66   zBuf[100];.  if
1c400 28 20 66 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66  ( f==0 ){.    if
1c410 28 20 64 66 6c 74 5a 69 70 20 26 26 20 73 71 6c  ( dfltZip && sql
1c420 69 74 65 33 5f 73 74 72 6c 69 6b 65 28 22 25 2e  ite3_strlike("%.
1c430 7a 69 70 22 2c 7a 4e 61 6d 65 2c 30 29 3d 3d 30  zip",zName,0)==0
1c440 20 29 7b 0a 20 20 20 20 20 20 20 72 65 74 75 72   ){.       retur
1c450 6e 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f 5a 49 50  n SHELL_OPEN_ZIP
1c460 46 49 4c 45 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  FILE;.    }else{
1c470 0a 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  .       return S
1c480 48 45 4c 4c 5f 4f 50 45 4e 5f 4e 4f 52 4d 41 4c  HELL_OPEN_NORMAL
1c490 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 6e 20  ;.    }.  }.  n 
1c4a0 3d 20 66 72 65 61 64 28 7a 42 75 66 2c 20 31 36  = fread(zBuf, 16
1c4b0 2c 20 31 2c 20 66 29 3b 0a 20 20 69 66 28 20 6e  , 1, f);.  if( n
1c4c0 3d 3d 31 20 26 26 20 6d 65 6d 63 6d 70 28 7a 42  ==1 && memcmp(zB
1c4d0 75 66 2c 20 22 53 51 4c 69 74 65 20 66 6f 72 6d  uf, "SQLite form
1c4e0 61 74 20 33 22 2c 20 31 36 29 3d 3d 30 20 29 7b  at 3", 16)==0 ){
1c4f0 0a 20 20 20 20 66 63 6c 6f 73 65 28 66 29 3b 0a  .    fclose(f);.
1c500 20 20 20 20 72 65 74 75 72 6e 20 53 48 45 4c 4c      return SHELL
1c510 5f 4f 50 45 4e 5f 4e 4f 52 4d 41 4c 3b 0a 20 20  _OPEN_NORMAL;.  
1c520 7d 0a 20 20 66 73 65 65 6b 28 66 2c 20 2d 32 35  }.  fseek(f, -25
1c530 2c 20 53 45 45 4b 5f 45 4e 44 29 3b 0a 20 20 6e  , SEEK_END);.  n
1c540 20 3d 20 66 72 65 61 64 28 7a 42 75 66 2c 20 32   = fread(zBuf, 2
1c550 35 2c 20 31 2c 20 66 29 3b 0a 20 20 69 66 28 20  5, 1, f);.  if( 
1c560 6e 3d 3d 31 20 26 26 20 6d 65 6d 63 6d 70 28 7a  n==1 && memcmp(z
1c570 42 75 66 2c 20 22 53 74 61 72 74 2d 4f 66 2d 53  Buf, "Start-Of-S
1c580 51 4c 69 74 65 33 2d 22 2c 20 31 37 29 3d 3d 30  QLite3-", 17)==0
1c590 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 48 45   ){.    rc = SHE
1c5a0 4c 4c 5f 4f 50 45 4e 5f 41 50 50 45 4e 44 56 46  LL_OPEN_APPENDVF
1c5b0 53 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  S;.  }else{.    
1c5c0 66 73 65 65 6b 28 66 2c 20 2d 32 32 2c 20 53 45  fseek(f, -22, SE
1c5d0 45 4b 5f 45 4e 44 29 3b 0a 20 20 20 20 6e 20 3d  EK_END);.    n =
1c5e0 20 66 72 65 61 64 28 7a 42 75 66 2c 20 32 32 2c   fread(zBuf, 22,
1c5f0 20 31 2c 20 66 29 3b 0a 20 20 20 20 69 66 28 20   1, f);.    if( 
1c600 6e 3d 3d 31 20 26 26 20 7a 42 75 66 5b 30 5d 3d  n==1 && zBuf[0]=
1c610 3d 30 78 35 30 20 26 26 20 7a 42 75 66 5b 31 5d  =0x50 && zBuf[1]
1c620 3d 3d 30 78 34 62 20 26 26 20 7a 42 75 66 5b 32  ==0x4b && zBuf[2
1c630 5d 3d 3d 30 78 30 35 0a 20 20 20 20 20 20 20 26  ]==0x05.       &
1c640 26 20 7a 42 75 66 5b 33 5d 3d 3d 30 78 30 36 20  & zBuf[3]==0x06 
1c650 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 48  ){.      rc = SH
1c660 45 4c 4c 5f 4f 50 45 4e 5f 5a 49 50 46 49 4c 45  ELL_OPEN_ZIPFILE
1c670 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
1c680 6e 3d 3d 30 20 26 26 20 64 66 6c 74 5a 69 70 20  n==0 && dfltZip 
1c690 26 26 20 73 71 6c 69 74 65 33 5f 73 74 72 6c 69  && sqlite3_strli
1c6a0 6b 65 28 22 25 2e 7a 69 70 22 2c 7a 4e 61 6d 65  ke("%.zip",zName
1c6b0 2c 30 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ,0)==0 ){.      
1c6c0 72 63 20 3d 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f  rc = SHELL_OPEN_
1c6d0 5a 49 50 46 49 4c 45 3b 0a 20 20 20 20 7d 0a 20  ZIPFILE;.    }. 
1c6e0 20 7d 0a 20 20 66 63 6c 6f 73 65 28 66 29 3b 0a   }.  fclose(f);.
1c6f0 20 20 72 65 74 75 72 6e 20 72 63 3b 20 20 0a 7d    return rc;  .}
1c700 0a 0a 2f 2a 20 46 6c 61 67 73 20 66 6f 72 20 6f  ../* Flags for o
1c710 70 65 6e 5f 64 62 28 29 2e 0a 2a 2a 0a 2a 2a 20  pen_db()..**.** 
1c720 54 68 65 20 64 65 66 61 75 6c 74 20 62 65 68 61  The default beha
1c730 76 69 6f 72 20 6f 66 20 6f 70 65 6e 5f 64 62 28  vior of open_db(
1c740 29 20 69 73 20 74 6f 20 65 78 69 74 28 31 29 20  ) is to exit(1) 
1c750 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  if the database 
1c760 66 61 69 6c 73 20 74 6f 0a 2a 2a 20 6f 70 65 6e  fails to.** open
1c770 2e 20 20 54 68 65 20 4f 50 45 4e 5f 44 42 5f 4b  .  The OPEN_DB_K
1c780 45 45 50 41 4c 49 56 45 20 66 6c 61 67 20 63 68  EEPALIVE flag ch
1c790 61 6e 67 65 73 20 74 68 61 74 20 73 6f 20 74 68  anges that so th
1c7a0 61 74 20 69 74 20 70 72 69 6e 74 73 20 61 6e 20  at it prints an 
1c7b0 65 72 72 6f 72 0a 2a 2a 20 62 75 74 20 73 74 69  error.** but sti
1c7c0 6c 6c 20 72 65 74 75 72 6e 73 20 77 69 74 68 6f  ll returns witho
1c7d0 75 74 20 63 61 6c 6c 69 6e 67 20 65 78 69 74 2e  ut calling exit.
1c7e0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 4f 50 45 4e 5f  .**.** The OPEN_
1c7f0 44 42 5f 5a 49 50 46 49 4c 45 20 66 6c 61 67 20  DB_ZIPFILE flag 
1c800 63 61 75 73 65 73 20 6f 70 65 6e 5f 64 62 28 29  causes open_db()
1c810 20 74 6f 20 70 72 65 66 65 72 20 74 6f 20 6f 70   to prefer to op
1c820 65 6e 20 66 69 6c 65 73 20 61 73 20 61 0a 2a 2a  en files as a.**
1c830 20 5a 49 50 20 61 72 63 68 69 76 65 20 69 66 20   ZIP archive if 
1c840 74 68 65 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f  the file does no
1c850 74 20 65 78 69 73 74 20 6f 72 20 69 73 20 65 6d  t exist or is em
1c860 70 74 79 20 61 6e 64 20 69 74 73 20 6e 61 6d 65  pty and its name
1c870 20 6d 61 74 63 68 65 73 0a 2a 2a 20 74 68 65 20   matches.** the 
1c880 2a 2e 7a 69 70 20 70 61 74 74 65 72 6e 2e 0a 2a  *.zip pattern..*
1c890 2f 0a 23 64 65 66 69 6e 65 20 4f 50 45 4e 5f 44  /.#define OPEN_D
1c8a0 42 5f 4b 45 45 50 41 4c 49 56 45 20 20 20 30 78  B_KEEPALIVE   0x
1c8b0 30 30 31 20 20 20 2f 2a 20 52 65 74 75 72 6e 20  001   /* Return 
1c8c0 61 66 74 65 72 20 65 72 72 6f 72 20 69 66 20 74  after error if t
1c8d0 72 75 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4f  rue */.#define O
1c8e0 50 45 4e 5f 44 42 5f 5a 49 50 46 49 4c 45 20 20  PEN_DB_ZIPFILE  
1c8f0 20 20 20 30 78 30 30 32 20 20 20 2f 2a 20 4f 70     0x002   /* Op
1c900 65 6e 20 61 73 20 5a 49 50 20 69 66 20 6e 61 6d  en as ZIP if nam
1c910 65 20 6d 61 74 63 68 65 73 20 2a 2e 7a 69 70 20  e matches *.zip 
1c920 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73  */../*.** Make s
1c930 75 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ure the database
1c940 20 69 73 20 6f 70 65 6e 2e 20 20 49 66 20 69 74   is open.  If it
1c950 20 69 73 20 6e 6f 74 2c 20 74 68 65 6e 20 6f 70   is not, then op
1c960 65 6e 20 69 74 2e 20 20 49 66 0a 2a 2a 20 74 68  en it.  If.** th
1c970 65 20 64 61 74 61 62 61 73 65 20 66 61 69 6c 73  e database fails
1c980 20 74 6f 20 6f 70 65 6e 2c 20 70 72 69 6e 74 20   to open, print 
1c990 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
1c9a0 20 61 6e 64 20 65 78 69 74 2e 0a 2a 2f 0a 73 74   and exit..*/.st
1c9b0 61 74 69 63 20 76 6f 69 64 20 6f 70 65 6e 5f 64  atic void open_d
1c9c0 62 28 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 2c  b(ShellState *p,
1c9d0 20 69 6e 74 20 6f 70 65 6e 46 6c 61 67 73 29 7b   int openFlags){
1c9e0 0a 20 20 69 66 28 20 70 2d 3e 64 62 3d 3d 30 20  .  if( p->db==0 
1c9f0 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6f 70  ){.    if( p->op
1ca00 65 6e 4d 6f 64 65 3d 3d 53 48 45 4c 4c 5f 4f 50  enMode==SHELL_OP
1ca10 45 4e 5f 55 4e 53 50 45 43 20 29 7b 0a 20 20 20  EN_UNSPEC ){.   
1ca20 20 20 20 69 66 28 20 70 2d 3e 7a 44 62 46 69 6c     if( p->zDbFil
1ca30 65 6e 61 6d 65 3d 3d 30 20 7c 7c 20 70 2d 3e 7a  ename==0 || p->z
1ca40 44 62 46 69 6c 65 6e 61 6d 65 5b 30 5d 3d 3d 30  DbFilename[0]==0
1ca50 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6f   ){.        p->o
1ca60 70 65 6e 4d 6f 64 65 20 3d 20 53 48 45 4c 4c 5f  penMode = SHELL_
1ca70 4f 50 45 4e 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 20  OPEN_NORMAL;.   
1ca80 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1ca90 20 20 70 2d 3e 6f 70 65 6e 4d 6f 64 65 20 3d 20    p->openMode = 
1caa0 28 75 38 29 64 65 64 75 63 65 44 61 74 61 62 61  (u8)deduceDataba
1cab0 73 65 54 79 70 65 28 70 2d 3e 7a 44 62 46 69 6c  seType(p->zDbFil
1cac0 65 6e 61 6d 65 2c 20 0a 20 20 20 20 20 20 20 20  ename, .        
1cad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cae0 20 20 20 20 20 28 6f 70 65 6e 46 6c 61 67 73 20       (openFlags 
1caf0 26 20 4f 50 45 4e 5f 44 42 5f 5a 49 50 46 49 4c  & OPEN_DB_ZIPFIL
1cb00 45 29 21 3d 30 29 3b 0a 20 20 20 20 20 20 7d 0a  E)!=0);.      }.
1cb10 20 20 20 20 7d 0a 20 20 20 20 73 77 69 74 63 68      }.    switch
1cb20 28 20 70 2d 3e 6f 70 65 6e 4d 6f 64 65 20 29 7b  ( p->openMode ){
1cb30 0a 20 20 20 20 20 20 63 61 73 65 20 53 48 45 4c  .      case SHEL
1cb40 4c 5f 4f 50 45 4e 5f 41 50 50 45 4e 44 56 46 53  L_OPEN_APPENDVFS
1cb50 3a 20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  : {.        sqli
1cb60 74 65 33 5f 6f 70 65 6e 5f 76 32 28 70 2d 3e 7a  te3_open_v2(p->z
1cb70 44 62 46 69 6c 65 6e 61 6d 65 2c 20 26 70 2d 3e  DbFilename, &p->
1cb80 64 62 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  db, .           
1cb90 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
1cba0 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45  WRITE|SQLITE_OPE
1cbb0 4e 5f 43 52 45 41 54 45 2c 20 22 61 70 6e 64 76  N_CREATE, "apndv
1cbc0 66 73 22 29 3b 0a 20 20 20 20 20 20 20 20 62 72  fs");.        br
1cbd0 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
1cbe0 20 20 20 63 61 73 65 20 53 48 45 4c 4c 5f 4f 50     case SHELL_OP
1cbf0 45 4e 5f 44 45 53 45 52 49 41 4c 49 5a 45 3a 20  EN_DESERIALIZE: 
1cc00 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
1cc10 33 5f 6f 70 65 6e 28 30 2c 20 26 70 2d 3e 64 62  3_open(0, &p->db
1cc20 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
1cc30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1cc40 63 61 73 65 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f  case SHELL_OPEN_
1cc50 5a 49 50 46 49 4c 45 3a 20 7b 0a 20 20 20 20 20  ZIPFILE: {.     
1cc60 20 20 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28     sqlite3_open(
1cc70 22 3a 6d 65 6d 6f 72 79 3a 22 2c 20 26 70 2d 3e  ":memory:", &p->
1cc80 64 62 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  db);.        bre
1cc90 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
1cca0 20 20 63 61 73 65 20 53 48 45 4c 4c 5f 4f 50 45    case SHELL_OPE
1ccb0 4e 5f 52 45 41 44 4f 4e 4c 59 3a 20 7b 0a 20 20  N_READONLY: {.  
1ccc0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6f 70        sqlite3_op
1ccd0 65 6e 5f 76 32 28 70 2d 3e 7a 44 62 46 69 6c 65  en_v2(p->zDbFile
1cce0 6e 61 6d 65 2c 20 26 70 2d 3e 64 62 2c 20 53 51  name, &p->db, SQ
1ccf0 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e  LITE_OPEN_READON
1cd00 4c 59 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  LY, 0);.        
1cd10 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
1cd20 20 20 20 20 20 63 61 73 65 20 53 48 45 4c 4c 5f       case SHELL_
1cd30 4f 50 45 4e 5f 55 4e 53 50 45 43 3a 0a 20 20 20  OPEN_UNSPEC:.   
1cd40 20 20 20 63 61 73 65 20 53 48 45 4c 4c 5f 4f 50     case SHELL_OP
1cd50 45 4e 5f 4e 4f 52 4d 41 4c 3a 20 7b 0a 20 20 20  EN_NORMAL: {.   
1cd60 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6f 70 65       sqlite3_ope
1cd70 6e 28 70 2d 3e 7a 44 62 46 69 6c 65 6e 61 6d 65  n(p->zDbFilename
1cd80 2c 20 26 70 2d 3e 64 62 29 3b 0a 20 20 20 20 20  , &p->db);.     
1cd90 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
1cda0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 67 6c 6f 62  }.    }.    glob
1cdb0 61 6c 44 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20  alDb = p->db;.  
1cdc0 20 20 69 66 28 20 70 2d 3e 64 62 3d 3d 30 20 7c    if( p->db==0 |
1cdd0 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c  | SQLITE_OK!=sql
1cde0 69 74 65 33 5f 65 72 72 63 6f 64 65 28 70 2d 3e  ite3_errcode(p->
1cdf0 64 62 29 20 29 7b 0a 20 20 20 20 20 20 75 74 66  db) ){.      utf
1ce00 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  8_printf(stderr,
1ce10 22 45 72 72 6f 72 3a 20 75 6e 61 62 6c 65 20 74  "Error: unable t
1ce20 6f 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20  o open database 
1ce30 5c 22 25 73 5c 22 3a 20 25 73 5c 6e 22 2c 0a 20  \"%s\": %s\n",. 
1ce40 20 20 20 20 20 20 20 20 20 70 2d 3e 7a 44 62 46           p->zDbF
1ce50 69 6c 65 6e 61 6d 65 2c 20 73 71 6c 69 74 65 33  ilename, sqlite3
1ce60 5f 65 72 72 6d 73 67 28 70 2d 3e 64 62 29 29 3b  _errmsg(p->db));
1ce70 0a 20 20 20 20 20 20 69 66 28 20 6f 70 65 6e 46  .      if( openF
1ce80 6c 61 67 73 20 26 20 4f 50 45 4e 5f 44 42 5f 4b  lags & OPEN_DB_K
1ce90 45 45 50 41 4c 49 56 45 20 29 20 72 65 74 75 72  EEPALIVE ) retur
1cea0 6e 3b 0a 20 20 20 20 20 20 65 78 69 74 28 31 29  n;.      exit(1)
1ceb0 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20  ;.    }.#ifndef 
1cec0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44  SQLITE_OMIT_LOAD
1ced0 5f 45 58 54 45 4e 53 49 4f 4e 0a 20 20 20 20 73  _EXTENSION.    s
1cee0 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 6c 6f  qlite3_enable_lo
1cef0 61 64 5f 65 78 74 65 6e 73 69 6f 6e 28 70 2d 3e  ad_extension(p->
1cf00 64 62 2c 20 31 29 3b 0a 23 65 6e 64 69 66 0a 20  db, 1);.#endif. 
1cf10 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 69     sqlite3_filei
1cf20 6f 5f 69 6e 69 74 28 70 2d 3e 64 62 2c 20 30 2c  o_init(p->db, 0,
1cf30 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
1cf40 5f 73 68 61 74 68 72 65 65 5f 69 6e 69 74 28 70  _shathree_init(p
1cf50 2d 3e 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20 20  ->db, 0, 0);.   
1cf60 20 73 71 6c 69 74 65 33 5f 63 6f 6d 70 6c 65 74   sqlite3_complet
1cf70 69 6f 6e 5f 69 6e 69 74 28 70 2d 3e 64 62 2c 20  ion_init(p->db, 
1cf80 30 2c 20 30 29 3b 0a 23 69 66 64 65 66 20 53 51  0, 0);.#ifdef SQ
1cf90 4c 49 54 45 5f 48 41 56 45 5f 5a 4c 49 42 0a 20  LITE_HAVE_ZLIB. 
1cfa0 20 20 20 73 71 6c 69 74 65 33 5f 7a 69 70 66 69     sqlite3_zipfi
1cfb0 6c 65 5f 69 6e 69 74 28 70 2d 3e 64 62 2c 20 30  le_init(p->db, 0
1cfc0 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
1cfd0 33 5f 73 71 6c 61 72 5f 69 6e 69 74 28 70 2d 3e  3_sqlar_init(p->
1cfe0 64 62 2c 20 30 2c 20 30 29 3b 0a 23 65 6e 64 69  db, 0, 0);.#endi
1cff0 66 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72  f.    sqlite3_cr
1d000 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 70 2d  eate_function(p-
1d010 3e 64 62 2c 20 22 73 68 65 6c 6c 5f 61 64 64 5f  >db, "shell_add_
1d020 73 63 68 65 6d 61 22 2c 20 33 2c 20 53 51 4c 49  schema", 3, SQLI
1d030 54 45 5f 55 54 46 38 2c 20 30 2c 0a 20 20 20 20  TE_UTF8, 0,.    
1d040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d050 20 20 20 20 20 20 20 20 73 68 65 6c 6c 41 64 64          shellAdd
1d060 53 63 68 65 6d 61 4e 61 6d 65 2c 20 30 2c 20 30  SchemaName, 0, 0
1d070 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63  );.    sqlite3_c
1d080 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 70  reate_function(p
1d090 2d 3e 64 62 2c 20 22 73 68 65 6c 6c 5f 6d 6f 64  ->db, "shell_mod
1d0a0 75 6c 65 5f 73 63 68 65 6d 61 22 2c 20 31 2c 20  ule_schema", 1, 
1d0b0 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 0a  SQLITE_UTF8, 0,.
1d0c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d0d0 20 20 20 20 20 20 20 20 20 20 20 20 73 68 65 6c              shel
1d0e0 6c 4d 6f 64 75 6c 65 53 63 68 65 6d 61 2c 20 30  lModuleSchema, 0
1d0f0 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
1d100 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
1d110 6e 28 70 2d 3e 64 62 2c 20 22 73 68 65 6c 6c 5f  n(p->db, "shell_
1d120 70 75 74 73 6e 6c 22 2c 20 31 2c 20 53 51 4c 49  putsnl", 1, SQLI
1d130 54 45 5f 55 54 46 38 2c 20 70 2c 0a 20 20 20 20  TE_UTF8, p,.    
1d140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d150 20 20 20 20 20 20 20 20 73 68 65 6c 6c 50 75 74          shellPut
1d160 73 46 75 6e 63 2c 20 30 2c 20 30 29 3b 0a 23 69  sFunc, 0, 0);.#i
1d170 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f 48  fndef SQLITE_NOH
1d180 41 56 45 5f 53 59 53 54 45 4d 0a 20 20 20 20 73  AVE_SYSTEM.    s
1d190 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
1d1a0 6e 63 74 69 6f 6e 28 70 2d 3e 64 62 2c 20 22 65  nction(p->db, "e
1d1b0 64 69 74 22 2c 20 31 2c 20 53 51 4c 49 54 45 5f  dit", 1, SQLITE_
1d1c0 55 54 46 38 2c 20 30 2c 0a 20 20 20 20 20 20 20  UTF8, 0,.       
1d1d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d1e0 20 20 20 20 20 65 64 69 74 46 75 6e 63 2c 20 30       editFunc, 0
1d1f0 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
1d200 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
1d210 6e 28 70 2d 3e 64 62 2c 20 22 65 64 69 74 22 2c  n(p->db, "edit",
1d220 20 32 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c   2, SQLITE_UTF8,
1d230 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   0,.            
1d240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d250 65 64 69 74 46 75 6e 63 2c 20 30 2c 20 30 29 3b  editFunc, 0, 0);
1d260 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20  .#endif.    if( 
1d270 70 2d 3e 6f 70 65 6e 4d 6f 64 65 3d 3d 53 48 45  p->openMode==SHE
1d280 4c 4c 5f 4f 50 45 4e 5f 5a 49 50 46 49 4c 45 20  LL_OPEN_ZIPFILE 
1d290 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  ){.      char *z
1d2a0 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  Sql = sqlite3_mp
1d2b0 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20 20  rintf(.         
1d2c0 22 43 52 45 41 54 45 20 56 49 52 54 55 41 4c 20  "CREATE VIRTUAL 
1d2d0 54 41 42 4c 45 20 7a 69 70 20 55 53 49 4e 47 20  TABLE zip USING 
1d2e0 7a 69 70 66 69 6c 65 28 25 51 29 3b 22 2c 20 70  zipfile(%Q);", p
1d2f0 2d 3e 7a 44 62 46 69 6c 65 6e 61 6d 65 29 3b 0a  ->zDbFilename);.
1d300 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65 78        sqlite3_ex
1d310 65 63 28 70 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20  ec(p->db, zSql, 
1d320 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  0, 0, 0);.      
1d330 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71  sqlite3_free(zSq
1d340 6c 29 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66  l);.    }.#ifdef
1d350 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 44   SQLITE_ENABLE_D
1d360 45 53 45 52 49 41 4c 49 5a 45 0a 20 20 20 20 65  ESERIALIZE.    e
1d370 6c 73 65 20 69 66 28 20 70 2d 3e 6f 70 65 6e 4d  lse if( p->openM
1d380 6f 64 65 3d 3d 53 48 45 4c 4c 5f 4f 50 45 4e 5f  ode==SHELL_OPEN_
1d390 44 45 53 45 52 49 41 4c 49 5a 45 20 29 7b 0a 20  DESERIALIZE ){. 
1d3a0 20 20 20 20 20 69 6e 74 20 6e 44 61 74 61 20 3d       int nData =
1d3b0 20 30 3b 0a 20 20 20 20 20 20 75 6e 73 69 67 6e   0;.      unsign
1d3c0 65 64 20 63 68 61 72 20 2a 61 44 61 74 61 20 3d  ed char *aData =
1d3d0 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a   (unsigned char*
1d3e0 29 72 65 61 64 46 69 6c 65 28 70 2d 3e 7a 44 62  )readFile(p->zDb
1d3f0 46 69 6c 65 6e 61 6d 65 2c 20 26 6e 44 61 74 61  Filename, &nData
1d400 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 20  );.      int rc 
1d410 3d 20 73 71 6c 69 74 65 33 5f 64 65 73 65 72 69  = sqlite3_deseri
1d420 61 6c 69 7a 65 28 70 2d 3e 64 62 2c 20 22 6d 61  alize(p->db, "ma
1d430 69 6e 22 2c 20 61 44 61 74 61 2c 20 6e 44 61 74  in", aData, nDat
1d440 61 2c 20 6e 44 61 74 61 2c 0a 20 20 20 20 20 20  a, nData,.      
1d450 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
1d460 49 54 45 5f 44 45 53 45 52 49 41 4c 49 5a 45 5f  ITE_DESERIALIZE_
1d470 52 45 53 49 5a 45 41 42 4c 45 20 7c 0a 20 20 20  RESIZEABLE |.   
1d480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d490 53 51 4c 49 54 45 5f 44 45 53 45 52 49 41 4c 49  SQLITE_DESERIALI
1d4a0 5a 45 5f 46 52 45 45 4f 4e 43 4c 4f 53 45 29 3b  ZE_FREEONCLOSE);
1d4b0 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b  .      if( rc ){
1d4c0 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72  .        utf8_pr
1d4d0 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72  intf(stderr, "Er
1d4e0 72 6f 72 3a 20 73 71 6c 69 74 65 33 5f 64 65 73  ror: sqlite3_des
1d4f0 65 72 69 61 6c 69 7a 65 28 29 20 72 65 74 75 72  erialize() retur
1d500 6e 73 20 25 64 5c 6e 22 2c 20 72 63 29 3b 0a 20  ns %d\n", rc);. 
1d510 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e       }.    }.#en
1d520 64 69 66 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  dif.  }.}../*.**
1d530 20 41 74 74 65 6d 70 74 20 74 6f 20 63 6c 6f 73   Attempt to clos
1d540 65 20 74 68 65 20 64 61 74 61 62 61 65 73 20 63  e the databaes c
1d550 6f 6e 6e 65 63 74 69 6f 6e 2e 20 20 52 65 70 6f  onnection.  Repo
1d560 72 74 20 65 72 72 6f 72 73 2e 0a 2a 2f 0a 76 6f  rt errors..*/.vo
1d570 69 64 20 63 6c 6f 73 65 5f 64 62 28 73 71 6c 69  id close_db(sqli
1d580 74 65 33 20 2a 64 62 29 7b 0a 20 20 69 6e 74 20  te3 *db){.  int 
1d590 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 6c 6f  rc = sqlite3_clo
1d5a0 73 65 28 64 62 29 3b 0a 20 20 69 66 28 20 72 63  se(db);.  if( rc
1d5b0 20 29 7b 0a 20 20 20 20 75 74 66 38 5f 70 72 69   ){.    utf8_pri
1d5c0 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72  ntf(stderr, "Err
1d5d0 6f 72 3a 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73  or: sqlite3_clos
1d5e0 65 28 29 20 72 65 74 75 72 6e 73 20 25 64 3a 20  e() returns %d: 
1d5f0 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 72  %s\n",.        r
1d600 63 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73  c, sqlite3_errms
1d610 67 28 64 62 29 29 3b 0a 20 20 7d 20 0a 7d 0a 0a  g(db));.  } .}..
1d620 23 69 66 20 48 41 56 45 5f 52 45 41 44 4c 49 4e  #if HAVE_READLIN
1d630 45 20 7c 7c 20 48 41 56 45 5f 45 44 49 54 4c 49  E || HAVE_EDITLI
1d640 4e 45 0a 2f 2a 0a 2a 2a 20 52 65 61 64 6c 69 6e  NE./*.** Readlin
1d650 65 20 63 6f 6d 70 6c 65 74 69 6f 6e 20 63 61 6c  e completion cal
1d660 6c 62 61 63 6b 73 0a 2a 2f 0a 73 74 61 74 69 63  lbacks.*/.static
1d670 20 63 68 61 72 20 2a 72 65 61 64 6c 69 6e 65 5f   char *readline_
1d680 63 6f 6d 70 6c 65 74 69 6f 6e 5f 67 65 6e 65 72  completion_gener
1d690 61 74 6f 72 28 63 6f 6e 73 74 20 63 68 61 72 20  ator(const char 
1d6a0 2a 74 65 78 74 2c 20 69 6e 74 20 73 74 61 74 65  *text, int state
1d6b0 29 7b 0a 20 20 73 74 61 74 69 63 20 73 71 6c 69  ){.  static sqli
1d6c0 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20  te3_stmt *pStmt 
1d6d0 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a 52 65  = 0;.  char *zRe
1d6e0 74 3b 0a 20 20 69 66 28 20 73 74 61 74 65 3d 3d  t;.  if( state==
1d6f0 30 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  0 ){.    char *z
1d700 53 71 6c 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Sql;.    sqlite3
1d710 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29  _finalize(pStmt)
1d720 3b 0a 20 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c  ;.    zSql = sql
1d730 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 53 45  ite3_mprintf("SE
1d740 4c 45 43 54 20 44 49 53 54 49 4e 43 54 20 63 61  LECT DISTINCT ca
1d750 6e 64 69 64 61 74 65 20 43 4f 4c 4c 41 54 45 20  ndidate COLLATE 
1d760 6e 6f 63 61 73 65 22 0a 20 20 20 20 20 20 20 20  nocase".        
1d770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d780 20 20 20 22 20 20 46 52 4f 4d 20 63 6f 6d 70 6c     "  FROM compl
1d790 65 74 69 6f 6e 28 25 51 29 20 4f 52 44 45 52 20  etion(%Q) ORDER 
1d7a0 42 59 20 31 22 2c 20 74 65 78 74 29 3b 0a 20 20  BY 1", text);.  
1d7b0 20 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72    sqlite3_prepar
1d7c0 65 5f 76 32 28 67 6c 6f 62 61 6c 44 62 2c 20 7a  e_v2(globalDb, z
1d7d0 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c  Sql, -1, &pStmt,
1d7e0 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
1d7f0 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 7d  _free(zSql);.  }
1d800 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73  .  if( sqlite3_s
1d810 74 65 70 28 70 53 74 6d 74 29 3d 3d 53 51 4c 49  tep(pStmt)==SQLI
1d820 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 7a 52  TE_ROW ){.    zR
1d830 65 74 20 3d 20 73 74 72 64 75 70 28 28 63 6f 6e  et = strdup((con
1d840 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33  st char*)sqlite3
1d850 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74  _column_text(pSt
1d860 6d 74 2c 20 30 29 29 3b 0a 20 20 7d 65 6c 73 65  mt, 0));.  }else
1d870 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69  {.    sqlite3_fi
1d880 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20  nalize(pStmt);. 
1d890 20 20 20 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20     pStmt = 0;.  
1d8a0 20 20 7a 52 65 74 20 3d 20 30 3b 0a 20 20 7d 0a    zRet = 0;.  }.
1d8b0 20 20 72 65 74 75 72 6e 20 7a 52 65 74 3b 0a 7d    return zRet;.}
1d8c0 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 2a 72  .static char **r
1d8d0 65 61 64 6c 69 6e 65 5f 63 6f 6d 70 6c 65 74 69  eadline_completi
1d8e0 6f 6e 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  on(const char *z
1d8f0 54 65 78 74 2c 20 69 6e 74 20 69 53 74 61 72 74  Text, int iStart
1d900 2c 20 69 6e 74 20 69 45 6e 64 29 7b 0a 20 20 72  , int iEnd){.  r
1d910 6c 5f 61 74 74 65 6d 70 74 65 64 5f 63 6f 6d 70  l_attempted_comp
1d920 6c 65 74 69 6f 6e 5f 6f 76 65 72 20 3d 20 31 3b  letion_over = 1;
1d930 0a 20 20 72 65 74 75 72 6e 20 72 6c 5f 63 6f 6d  .  return rl_com
1d940 70 6c 65 74 69 6f 6e 5f 6d 61 74 63 68 65 73 28  pletion_matches(
1d950 7a 54 65 78 74 2c 20 72 65 61 64 6c 69 6e 65 5f  zText, readline_
1d960 63 6f 6d 70 6c 65 74 69 6f 6e 5f 67 65 6e 65 72  completion_gener
1d970 61 74 6f 72 29 3b 0a 7d 0a 0a 23 65 6c 69 66 20  ator);.}..#elif 
1d980 48 41 56 45 5f 4c 49 4e 45 4e 4f 49 53 45 0a 2f  HAVE_LINENOISE./
1d990 2a 0a 2a 2a 20 4c 69 6e 65 6e 6f 69 73 65 20 63  *.** Linenoise c
1d9a0 6f 6d 70 6c 65 74 69 6f 6e 20 63 61 6c 6c 62 61  ompletion callba
1d9b0 63 6b 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  ck.*/.static voi
1d9c0 64 20 6c 69 6e 65 6e 6f 69 73 65 5f 63 6f 6d 70  d linenoise_comp
1d9d0 6c 65 74 69 6f 6e 28 63 6f 6e 73 74 20 63 68 61  letion(const cha
1d9e0 72 20 2a 7a 4c 69 6e 65 2c 20 6c 69 6e 65 6e 6f  r *zLine, lineno
1d9f0 69 73 65 43 6f 6d 70 6c 65 74 69 6f 6e 73 20 2a  iseCompletions *
1da00 6c 63 29 7b 0a 20 20 69 6e 74 20 6e 4c 69 6e 65  lc){.  int nLine
1da10 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a 4c 69 6e   = strlen30(zLin
1da20 65 29 3b 0a 20 20 69 6e 74 20 69 2c 20 69 53 74  e);.  int i, iSt
1da30 61 72 74 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73  art;.  sqlite3_s
1da40 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a  tmt *pStmt = 0;.
1da50 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20    char *zSql;.  
1da60 63 68 61 72 20 7a 42 75 66 5b 31 30 30 30 5d 3b  char zBuf[1000];
1da70 0a 0a 20 20 69 66 28 20 6e 4c 69 6e 65 3e 73 69  ..  if( nLine>si
1da80 7a 65 6f 66 28 7a 42 75 66 29 2d 33 30 20 29 20  zeof(zBuf)-30 ) 
1da90 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 7a 4c  return;.  if( zL
1daa0 69 6e 65 5b 30 5d 3d 3d 27 2e 27 20 7c 7c 20 7a  ine[0]=='.' || z
1dab0 4c 69 6e 65 5b 30 5d 3d 3d 27 23 27 29 20 72 65  Line[0]=='#') re
1dac0 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 6e 4c  turn;.  for(i=nL
1dad0 69 6e 65 2d 31 3b 20 69 3e 3d 30 20 26 26 20 28  ine-1; i>=0 && (
1dae0 69 73 61 6c 6e 75 6d 28 7a 4c 69 6e 65 5b 69 5d  isalnum(zLine[i]
1daf0 29 20 7c 7c 20 7a 4c 69 6e 65 5b 69 5d 3d 3d 27  ) || zLine[i]=='
1db00 5f 27 29 3b 20 69 2d 2d 29 7b 7d 0a 20 20 69 66  _'); i--){}.  if
1db10 28 20 69 3d 3d 6e 4c 69 6e 65 2d 31 20 29 20 72  ( i==nLine-1 ) r
1db20 65 74 75 72 6e 3b 0a 20 20 69 53 74 61 72 74 20  eturn;.  iStart 
1db30 3d 20 69 2b 31 3b 0a 20 20 6d 65 6d 63 70 79 28  = i+1;.  memcpy(
1db40 7a 42 75 66 2c 20 7a 4c 69 6e 65 2c 20 69 53 74  zBuf, zLine, iSt
1db50 61 72 74 29 3b 0a 20 20 7a 53 71 6c 20 3d 20 73  art);.  zSql = s
1db60 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
1db70 53 45 4c 45 43 54 20 44 49 53 54 49 4e 43 54 20  SELECT DISTINCT 
1db80 63 61 6e 64 69 64 61 74 65 20 43 4f 4c 4c 41 54  candidate COLLAT
1db90 45 20 6e 6f 63 61 73 65 22 0a 20 20 20 20 20 20  E nocase".      
1dba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dbb0 20 20 20 22 20 20 46 52 4f 4d 20 63 6f 6d 70 6c     "  FROM compl
1dbc0 65 74 69 6f 6e 28 25 51 2c 25 51 29 20 4f 52 44  etion(%Q,%Q) ORD
1dbd0 45 52 20 42 59 20 31 22 2c 0a 20 20 20 20 20 20  ER BY 1",.      
1dbe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dbf0 20 20 20 26 7a 4c 69 6e 65 5b 69 53 74 61 72 74     &zLine[iStart
1dc00 5d 2c 20 7a 4c 69 6e 65 29 3b 0a 20 20 73 71 6c  ], zLine);.  sql
1dc10 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28  ite3_prepare_v2(
1dc20 67 6c 6f 62 61 6c 44 62 2c 20 7a 53 71 6c 2c 20  globalDb, zSql, 
1dc30 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a  -1, &pStmt, 0);.
1dc40 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
1dc50 53 71 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  Sql);.  sqlite3_
1dc60 65 78 65 63 28 67 6c 6f 62 61 6c 44 62 2c 20 22  exec(globalDb, "
1dc70 50 52 41 47 4d 41 20 70 61 67 65 5f 63 6f 75 6e  PRAGMA page_coun
1dc80 74 22 2c 20 30 2c 20 30 2c 20 30 29 3b 20 2f 2a  t", 0, 0, 0); /*
1dc90 20 4c 6f 61 64 20 74 68 65 20 73 63 68 65 6d 61   Load the schema
1dca0 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 73 71 6c   */.  while( sql
1dcb0 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29  ite3_step(pStmt)
1dcc0 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a  ==SQLITE_ROW ){.
1dcd0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
1dce0 7a 43 6f 6d 70 6c 65 74 69 6f 6e 20 3d 20 28 63  zCompletion = (c
1dcf0 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74  onst char*)sqlit
1dd00 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70  e3_column_text(p
1dd10 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 69 6e  Stmt, 0);.    in
1dd20 74 20 6e 43 6f 6d 70 6c 65 74 69 6f 6e 20 3d 20  t nCompletion = 
1dd30 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62  sqlite3_column_b
1dd40 79 74 65 73 28 70 53 74 6d 74 2c 20 30 29 3b 0a  ytes(pStmt, 0);.
1dd50 20 20 20 20 69 66 28 20 69 53 74 61 72 74 2b 6e      if( iStart+n
1dd60 43 6f 6d 70 6c 65 74 69 6f 6e 20 3c 20 73 69 7a  Completion < siz
1dd70 65 6f 66 28 7a 42 75 66 29 2d 31 20 29 7b 0a 20  eof(zBuf)-1 ){. 
1dd80 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 42 75 66       memcpy(zBuf
1dd90 2b 69 53 74 61 72 74 2c 20 7a 43 6f 6d 70 6c 65  +iStart, zComple
1dda0 74 69 6f 6e 2c 20 6e 43 6f 6d 70 6c 65 74 69 6f  tion, nCompletio
1ddb0 6e 2b 31 29 3b 0a 20 20 20 20 20 20 6c 69 6e 65  n+1);.      line
1ddc0 6e 6f 69 73 65 41 64 64 43 6f 6d 70 6c 65 74 69  noiseAddCompleti
1ddd0 6f 6e 28 6c 63 2c 20 7a 42 75 66 29 3b 0a 20 20  on(lc, zBuf);.  
1dde0 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
1ddf0 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74  3_finalize(pStmt
1de00 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  );.}.#endif../*.
1de10 2a 2a 20 44 6f 20 43 2d 6c 61 6e 67 75 61 67 65  ** Do C-language
1de20 20 73 74 79 6c 65 20 64 65 71 75 6f 74 69 6e 67   style dequoting
1de30 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 5c 61 20 20 20  ..**.**    \a   
1de40 20 2d 3e 20 61 6c 61 72 6d 0a 2a 2a 20 20 20 20   -> alarm.**    
1de50 5c 62 20 20 20 20 2d 3e 20 62 61 63 6b 73 70 61  \b    -> backspa
1de60 63 65 0a 2a 2a 20 20 20 20 5c 74 20 20 20 20 2d  ce.**    \t    -
1de70 3e 20 74 61 62 0a 2a 2a 20 20 20 20 5c 6e 20 20  > tab.**    \n  
1de80 20 20 2d 3e 20 6e 65 77 6c 69 6e 65 0a 2a 2a 20    -> newline.** 
1de90 20 20 20 5c 76 20 20 20 20 2d 3e 20 76 65 72 74     \v    -> vert
1dea0 69 63 61 6c 20 74 61 62 0a 2a 2a 20 20 20 20 5c  ical tab.**    \
1deb0 66 20 20 20 20 2d 3e 20 66 6f 72 6d 20 66 65 65  f    -> form fee
1dec0 64 0a 2a 2a 20 20 20 20 5c 72 20 20 20 20 2d 3e  d.**    \r    ->
1ded0 20 63 61 72 72 69 61 67 65 20 72 65 74 75 72 6e   carriage return
1dee0 0a 2a 2a 20 20 20 20 5c 73 20 20 20 20 2d 3e 20  .**    \s    -> 
1def0 73 70 61 63 65 0a 2a 2a 20 20 20 20 5c 22 20 20  space.**    \"  
1df00 20 20 2d 3e 20 22 0a 2a 2a 20 20 20 20 5c 27 20    -> ".**    \' 
1df10 20 20 20 2d 3e 20 27 0a 2a 2a 20 20 20 20 5c 5c     -> '.**    \\
1df20 20 20 20 20 2d 3e 20 62 61 63 6b 73 6c 61 73 68      -> backslash
1df30 0a 2a 2a 20 20 20 20 5c 4e 4e 4e 20 20 2d 3e 20  .**    \NNN  -> 
1df40 61 73 63 69 69 20 63 68 61 72 61 63 74 65 72 20  ascii character 
1df50 4e 4e 4e 20 69 6e 20 6f 63 74 61 6c 0a 2a 2f 0a  NNN in octal.*/.
1df60 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 73 6f  static void reso
1df70 6c 76 65 5f 62 61 63 6b 73 6c 61 73 68 65 73 28  lve_backslashes(
1df80 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69 6e 74 20  char *z){.  int 
1df90 69 2c 20 6a 3b 0a 20 20 63 68 61 72 20 63 3b 0a  i, j;.  char c;.
1dfa0 20 20 77 68 69 6c 65 28 20 2a 7a 20 26 26 20 2a    while( *z && *
1dfb0 7a 21 3d 27 5c 5c 27 20 29 20 7a 2b 2b 3b 0a 20  z!='\\' ) z++;. 
1dfc0 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 28 63 20 3d   for(i=j=0; (c =
1dfd0 20 7a 5b 69 5d 29 21 3d 30 3b 20 69 2b 2b 2c 20   z[i])!=0; i++, 
1dfe0 6a 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 63 3d  j++){.    if( c=
1dff0 3d 27 5c 5c 27 20 26 26 20 7a 5b 69 2b 31 5d 21  ='\\' && z[i+1]!
1e000 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 20 3d 20  =0 ){.      c = 
1e010 7a 5b 2b 2b 69 5d 3b 0a 20 20 20 20 20 20 69 66  z[++i];.      if
1e020 28 20 63 3d 3d 27 61 27 20 29 7b 0a 20 20 20 20  ( c=='a' ){.    
1e030 20 20 20 20 63 20 3d 20 27 5c 61 27 3b 0a 20 20      c = '\a';.  
1e040 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d      }else if( c=
1e050 3d 27 62 27 20 29 7b 0a 20 20 20 20 20 20 20 20  ='b' ){.        
1e060 63 20 3d 20 27 5c 62 27 3b 0a 20 20 20 20 20 20  c = '\b';.      
1e070 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 74 27  }else if( c=='t'
1e080 20 29 7b 0a 20 20 20 20 20 20 20 20 63 20 3d 20   ){.        c = 
1e090 27 5c 74 27 3b 0a 20 20 20 20 20 20 7d 65 6c 73  '\t';.      }els
1e0a0 65 20 69 66 28 20 63 3d 3d 27 6e 27 20 29 7b 0a  e if( c=='n' ){.
1e0b0 20 20 20 20 20 20 20 20 63 20 3d 20 27 5c 6e 27          c = '\n'
1e0c0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
1e0d0 28 20 63 3d 3d 27 76 27 20 29 7b 0a 20 20 20 20  ( c=='v' ){.    
1e0e0 20 20 20 20 63 20 3d 20 27 5c 76 27 3b 0a 20 20      c = '\v';.  
1e0f0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d      }else if( c=
1e100 3d 27 66 27 20 29 7b 0a 20 20 20 20 20 20 20 20  ='f' ){.        
1e110 63 20 3d 20 27 5c 66 27 3b 0a 20 20 20 20 20 20  c = '\f';.      
1e120 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 72 27  }else if( c=='r'
1e130 20 29 7b 0a 20 20 20 20 20 20 20 20 63 20 3d 20   ){.        c = 
1e140 27 5c 72 27 3b 0a 20 20 20 20 20 20 7d 65 6c 73  '\r';.      }els
1e150 65 20 69 66 28 20 63 3d 3d 27 22 27 20 29 7b 0a  e if( c=='"' ){.
1e160 20 20 20 20 20 20 20 20 63 20 3d 20 27 22 27 3b          c = '"';
1e170 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
1e180 20 63 3d 3d 27 5c 27 27 20 29 7b 0a 20 20 20 20   c=='\'' ){.    
1e190 20 20 20 20 63 20 3d 20 27 5c 27 27 3b 0a 20 20      c = '\'';.  
1e1a0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d      }else if( c=
1e1b0 3d 27 5c 5c 27 20 29 7b 0a 20 20 20 20 20 20 20  ='\\' ){.       
1e1c0 20 63 20 3d 20 27 5c 5c 27 3b 0a 20 20 20 20 20   c = '\\';.     
1e1d0 20 7d 65 6c 73 65 20 69 66 28 20 63 3e 3d 27 30   }else if( c>='0
1e1e0 27 20 26 26 20 63 3c 3d 27 37 27 20 29 7b 0a 20  ' && c<='7' ){. 
1e1f0 20 20 20 20 20 20 20 63 20 2d 3d 20 27 30 27 3b         c -= '0';
1e200 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 5b 69  .        if( z[i
1e210 2b 31 5d 3e 3d 27 30 27 20 26 26 20 7a 5b 69 2b  +1]>='0' && z[i+
1e220 31 5d 3c 3d 27 37 27 20 29 7b 0a 20 20 20 20 20  1]<='7' ){.     
1e230 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20       i++;.      
1e240 20 20 20 20 63 20 3d 20 28 63 3c 3c 33 29 20 2b      c = (c<<3) +
1e250 20 7a 5b 69 5d 20 2d 20 27 30 27 3b 0a 20 20 20   z[i] - '0';.   
1e260 20 20 20 20 20 20 20 69 66 28 20 7a 5b 69 2b 31         if( z[i+1
1e270 5d 3e 3d 27 30 27 20 26 26 20 7a 5b 69 2b 31 5d  ]>='0' && z[i+1]
1e280 3c 3d 27 37 27 20 29 7b 0a 20 20 20 20 20 20 20  <='7' ){.       
1e290 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20       i++;.      
1e2a0 20 20 20 20 20 20 63 20 3d 20 28 63 3c 3c 33 29        c = (c<<3)
1e2b0 20 2b 20 7a 5b 69 5d 20 2d 20 27 30 27 3b 0a 20   + z[i] - '0';. 
1e2c0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1e2d0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
1e2e0 20 7d 0a 20 20 20 20 7a 5b 6a 5d 20 3d 20 63 3b   }.    z[j] = c;
1e2f0 0a 20 20 7d 0a 20 20 69 66 28 20 6a 3c 69 20 29  .  }.  if( j<i )
1e300 20 7a 5b 6a 5d 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a   z[j] = 0;.}../*
1e310 0a 2a 2a 20 49 6e 74 65 72 70 72 65 74 20 7a 41  .** Interpret zA
1e320 72 67 20 61 73 20 65 69 74 68 65 72 20 61 6e 20  rg as either an 
1e330 69 6e 74 65 67 65 72 20 6f 72 20 61 20 62 6f 6f  integer or a boo
1e340 6c 65 61 6e 20 76 61 6c 75 65 2e 20 20 52 65 74  lean value.  Ret
1e350 75 72 6e 20 31 20 6f 72 20 30 0a 2a 2a 20 66 6f  urn 1 or 0.** fo
1e360 72 20 54 52 55 45 20 61 6e 64 20 46 41 4c 53 45  r TRUE and FALSE
1e370 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e  .  Return the in
1e380 74 65 67 65 72 20 76 61 6c 75 65 20 69 66 20 61  teger value if a
1e390 70 70 72 6f 70 72 69 61 74 65 2e 0a 2a 2f 0a 73  ppropriate..*/.s
1e3a0 74 61 74 69 63 20 69 6e 74 20 62 6f 6f 6c 65 61  tatic int boolea
1e3b0 6e 56 61 6c 75 65 28 63 6f 6e 73 74 20 63 68 61  nValue(const cha
1e3c0 72 20 2a 7a 41 72 67 29 7b 0a 20 20 69 6e 74 20  r *zArg){.  int 
1e3d0 69 3b 0a 20 20 69 66 28 20 7a 41 72 67 5b 30 5d  i;.  if( zArg[0]
1e3e0 3d 3d 27 30 27 20 26 26 20 7a 41 72 67 5b 31 5d  =='0' && zArg[1]
1e3f0 3d 3d 27 78 27 20 29 7b 0a 20 20 20 20 66 6f 72  =='x' ){.    for
1e400 28 69 3d 32 3b 20 68 65 78 44 69 67 69 74 56 61  (i=2; hexDigitVa
1e410 6c 75 65 28 7a 41 72 67 5b 69 5d 29 3e 3d 30 3b  lue(zArg[i])>=0;
1e420 20 69 2b 2b 29 7b 7d 0a 20 20 7d 65 6c 73 65 7b   i++){}.  }else{
1e430 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 7a 41  .    for(i=0; zA
1e440 72 67 5b 69 5d 3e 3d 27 30 27 20 26 26 20 7a 41  rg[i]>='0' && zA
1e450 72 67 5b 69 5d 3c 3d 27 39 27 3b 20 69 2b 2b 29  rg[i]<='9'; i++)
1e460 7b 7d 0a 20 20 7d 0a 20 20 69 66 28 20 69 3e 30  {}.  }.  if( i>0
1e470 20 26 26 20 7a 41 72 67 5b 69 5d 3d 3d 30 20 29   && zArg[i]==0 )
1e480 20 72 65 74 75 72 6e 20 28 69 6e 74 29 28 69 6e   return (int)(in
1e490 74 65 67 65 72 56 61 6c 75 65 28 7a 41 72 67 29  tegerValue(zArg)
1e4a0 20 26 20 30 78 66 66 66 66 66 66 66 66 29 3b 0a   & 0xffffffff);.
1e4b0 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74    if( sqlite3_st
1e4c0 72 69 63 6d 70 28 7a 41 72 67 2c 20 22 6f 6e 22  ricmp(zArg, "on"
1e4d0 29 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 5f  )==0 || sqlite3_
1e4e0 73 74 72 69 63 6d 70 28 7a 41 72 67 2c 22 79 65  stricmp(zArg,"ye
1e4f0 73 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  s")==0 ){.    re
1e500 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66  turn 1;.  }.  if
1e510 28 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d  ( sqlite3_stricm
1e520 70 28 7a 41 72 67 2c 20 22 6f 66 66 22 29 3d 3d  p(zArg, "off")==
1e530 30 20 7c 7c 20 73 71 6c 69 74 65 33 5f 73 74 72  0 || sqlite3_str
1e540 69 63 6d 70 28 7a 41 72 67 2c 22 6e 6f 22 29 3d  icmp(zArg,"no")=
1e550 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
1e560 20 30 3b 0a 20 20 7d 0a 20 20 75 74 66 38 5f 70   0;.  }.  utf8_p
1e570 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45  rintf(stderr, "E
1e580 52 52 4f 52 3a 20 4e 6f 74 20 61 20 62 6f 6f 6c  RROR: Not a bool
1e590 65 61 6e 20 76 61 6c 75 65 3a 20 5c 22 25 73 5c  ean value: \"%s\
1e5a0 22 2e 20 41 73 73 75 6d 69 6e 67 20 5c 22 6e 6f  ". Assuming \"no
1e5b0 5c 22 2e 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  \".\n",.        
1e5c0 20 20 7a 41 72 67 29 3b 0a 20 20 72 65 74 75 72    zArg);.  retur
1e5d0 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  n 0;.}../*.** Se
1e5e0 74 20 6f 72 20 63 6c 65 61 72 20 61 20 73 68 65  t or clear a she
1e5f0 6c 6c 20 66 6c 61 67 20 61 63 63 6f 72 64 69 6e  ll flag accordin
1e600 67 20 74 6f 20 61 20 62 6f 6f 6c 65 61 6e 20 76  g to a boolean v
1e610 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  alue..*/.static 
1e620 76 6f 69 64 20 73 65 74 4f 72 43 6c 65 61 72 46  void setOrClearF
1e630 6c 61 67 28 53 68 65 6c 6c 53 74 61 74 65 20 2a  lag(ShellState *
1e640 70 2c 20 75 6e 73 69 67 6e 65 64 20 6d 46 6c 61  p, unsigned mFla
1e650 67 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  g, const char *z
1e660 41 72 67 29 7b 0a 20 20 69 66 28 20 62 6f 6f 6c  Arg){.  if( bool
1e670 65 61 6e 56 61 6c 75 65 28 7a 41 72 67 29 20 29  eanValue(zArg) )
1e680 7b 0a 20 20 20 20 53 68 65 6c 6c 53 65 74 46 6c  {.    ShellSetFl
1e690 61 67 28 70 2c 20 6d 46 6c 61 67 29 3b 0a 20 20  ag(p, mFlag);.  
1e6a0 7d 65 6c 73 65 7b 0a 20 20 20 20 53 68 65 6c 6c  }else{.    Shell
1e6b0 43 6c 65 61 72 46 6c 61 67 28 70 2c 20 6d 46 6c  ClearFlag(p, mFl
1e6c0 61 67 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ag);.  }.}../*.*
1e6d0 2a 20 43 6c 6f 73 65 20 61 6e 20 6f 75 74 70 75  * Close an outpu
1e6e0 74 20 66 69 6c 65 2c 20 61 73 73 75 6d 69 6e 67  t file, assuming
1e6f0 20 69 74 20 69 73 20 6e 6f 74 20 73 74 64 65 72   it is not stder
1e700 72 20 6f 72 20 73 74 64 6f 75 74 0a 2a 2f 0a 73  r or stdout.*/.s
1e710 74 61 74 69 63 20 76 6f 69 64 20 6f 75 74 70 75  tatic void outpu
1e720 74 5f 66 69 6c 65 5f 63 6c 6f 73 65 28 46 49 4c  t_file_close(FIL
1e730 45 20 2a 66 29 7b 0a 20 20 69 66 28 20 66 20 26  E *f){.  if( f &
1e740 26 20 66 21 3d 73 74 64 6f 75 74 20 26 26 20 66  & f!=stdout && f
1e750 21 3d 73 74 64 65 72 72 20 29 20 66 63 6c 6f 73  !=stderr ) fclos
1e760 65 28 66 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  e(f);.}../*.** T
1e770 72 79 20 74 6f 20 6f 70 65 6e 20 61 6e 20 6f 75  ry to open an ou
1e780 74 70 75 74 20 66 69 6c 65 2e 20 20 20 54 68 65  tput file.   The
1e790 20 6e 61 6d 65 73 20 22 73 74 64 6f 75 74 22 20   names "stdout" 
1e7a0 61 6e 64 20 22 73 74 64 65 72 72 22 20 61 72 65  and "stderr" are
1e7b0 0a 2a 2a 20 72 65 63 6f 67 6e 69 7a 65 64 20 61  .** recognized a
1e7c0 6e 64 20 64 6f 20 74 68 65 20 72 69 67 68 74 20  nd do the right 
1e7d0 74 68 69 6e 67 2e 20 20 4e 55 4c 4c 20 69 73 20  thing.  NULL is 
1e7e0 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65 20  returned if the 
1e7f0 6f 75 74 70 75 74 0a 2a 2a 20 66 69 6c 65 6e 61  output.** filena
1e800 6d 65 20 69 73 20 22 6f 66 66 22 2e 0a 2a 2f 0a  me is "off"..*/.
1e810 73 74 61 74 69 63 20 46 49 4c 45 20 2a 6f 75 74  static FILE *out
1e820 70 75 74 5f 66 69 6c 65 5f 6f 70 65 6e 28 63 6f  put_file_open(co
1e830 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 2c  nst char *zFile,
1e840 20 69 6e 74 20 62 54 65 78 74 4d 6f 64 65 29 7b   int bTextMode){
1e850 0a 20 20 46 49 4c 45 20 2a 66 3b 0a 20 20 69 66  .  FILE *f;.  if
1e860 28 20 73 74 72 63 6d 70 28 7a 46 69 6c 65 2c 22  ( strcmp(zFile,"
1e870 73 74 64 6f 75 74 22 29 3d 3d 30 20 29 7b 0a 20  stdout")==0 ){. 
1e880 20 20 20 66 20 3d 20 73 74 64 6f 75 74 3b 0a 20     f = stdout;. 
1e890 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d   }else if( strcm
1e8a0 70 28 7a 46 69 6c 65 2c 20 22 73 74 64 65 72 72  p(zFile, "stderr
1e8b0 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 66 20 3d  ")==0 ){.    f =
1e8c0 20 73 74 64 65 72 72 3b 0a 20 20 7d 65 6c 73 65   stderr;.  }else
1e8d0 20 69 66 28 20 73 74 72 63 6d 70 28 7a 46 69 6c   if( strcmp(zFil
1e8e0 65 2c 20 22 6f 66 66 22 29 3d 3d 30 20 29 7b 0a  e, "off")==0 ){.
1e8f0 20 20 20 20 66 20 3d 20 30 3b 0a 20 20 7d 65 6c      f = 0;.  }el
1e900 73 65 7b 0a 20 20 20 20 66 20 3d 20 66 6f 70 65  se{.    f = fope
1e910 6e 28 7a 46 69 6c 65 2c 20 62 54 65 78 74 4d 6f  n(zFile, bTextMo
1e920 64 65 20 3f 20 22 77 22 20 3a 20 22 77 62 22 29  de ? "w" : "wb")
1e930 3b 0a 20 20 20 20 69 66 28 20 66 3d 3d 30 20 29  ;.    if( f==0 )
1e940 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69  {.      utf8_pri
1e950 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72  ntf(stderr, "Err
1e960 6f 72 3a 20 63 61 6e 6e 6f 74 20 6f 70 65 6e 20  or: cannot open 
1e970 5c 22 25 73 5c 22 5c 6e 22 2c 20 7a 46 69 6c 65  \"%s\"\n", zFile
1e980 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
1e990 65 74 75 72 6e 20 66 3b 0a 7d 0a 0a 23 69 66 20  eturn f;.}..#if 
1e9a0 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
1e9b0 4f 4d 49 54 5f 54 52 41 43 45 29 20 26 26 20 21  OMIT_TRACE) && !
1e9c0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
1e9d0 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49  MIT_FLOATING_POI
1e9e0 4e 54 29 0a 2f 2a 0a 2a 2a 20 41 20 72 6f 75 74  NT)./*.** A rout
1e9f0 69 6e 65 20 66 6f 72 20 68 61 6e 64 6c 69 6e 67  ine for handling
1ea00 20 6f 75 74 70 75 74 20 66 72 6f 6d 20 73 71 6c   output from sql
1ea10 69 74 65 33 5f 74 72 61 63 65 28 29 2e 0a 2a 2f  ite3_trace()..*/
1ea20 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 5f  .static int sql_
1ea30 74 72 61 63 65 5f 63 61 6c 6c 62 61 63 6b 28 0a  trace_callback(.
1ea40 20 20 75 6e 73 69 67 6e 65 64 20 6d 54 79 70 65    unsigned mType
1ea50 2c 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 2c 0a  ,.  void *pArg,.
1ea60 20 20 76 6f 69 64 20 2a 70 50 2c 0a 20 20 76 6f    void *pP,.  vo
1ea70 69 64 20 2a 70 58 0a 29 7b 0a 20 20 46 49 4c 45  id *pX.){.  FILE
1ea80 20 2a 66 20 3d 20 28 46 49 4c 45 2a 29 70 41 72   *f = (FILE*)pAr
1ea90 67 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  g;.  UNUSED_PARA
1eaa0 4d 45 54 45 52 28 6d 54 79 70 65 29 3b 0a 20 20  METER(mType);.  
1eab0 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
1eac0 28 70 50 29 3b 0a 20 20 69 66 28 20 66 20 29 7b  (pP);.  if( f ){
1ead0 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
1eae0 2a 7a 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  *z = (const char
1eaf0 2a 29 70 58 3b 0a 20 20 20 20 69 6e 74 20 69 20  *)pX;.    int i 
1eb00 3d 20 73 74 72 6c 65 6e 33 30 28 7a 29 3b 0a 20  = strlen30(z);. 
1eb10 20 20 20 77 68 69 6c 65 28 20 69 3e 30 20 26 26     while( i>0 &&
1eb20 20 7a 5b 69 2d 31 5d 3d 3d 27 3b 27 20 29 7b 20   z[i-1]==';' ){ 
1eb30 69 2d 2d 3b 20 7d 0a 20 20 20 20 75 74 66 38 5f  i--; }.    utf8_
1eb40 70 72 69 6e 74 66 28 66 2c 20 22 25 2e 2a 73 3b  printf(f, "%.*s;
1eb50 5c 6e 22 2c 20 69 2c 20 7a 29 3b 0a 20 20 7d 0a  \n", i, z);.  }.
1eb60 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65    return 0;.}.#e
1eb70 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 20 6e 6f  ndif../*.** A no
1eb80 2d 6f 70 20 72 6f 75 74 69 6e 65 20 74 68 61 74  -op routine that
1eb90 20 72 75 6e 73 20 77 69 74 68 20 74 68 65 20 22   runs with the "
1eba0 2e 62 72 65 61 6b 70 6f 69 6e 74 22 20 64 6f 63  .breakpoint" doc
1ebb0 2d 63 6f 6d 6d 61 6e 64 2e 20 20 54 68 69 73 20  -command.  This 
1ebc0 69 73 0a 2a 2a 20 61 20 75 73 65 66 75 6c 20 73  is.** a useful s
1ebd0 70 6f 74 20 74 6f 20 73 65 74 20 61 20 64 65 62  pot to set a deb
1ebe0 75 67 67 65 72 20 62 72 65 61 6b 70 6f 69 6e 74  ugger breakpoint
1ebf0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1ec00 20 74 65 73 74 5f 62 72 65 61 6b 70 6f 69 6e 74   test_breakpoint
1ec10 28 76 6f 69 64 29 7b 0a 20 20 73 74 61 74 69 63  (void){.  static
1ec20 20 69 6e 74 20 6e 43 61 6c 6c 20 3d 20 30 3b 0a   int nCall = 0;.
1ec30 20 20 6e 43 61 6c 6c 2b 2b 3b 0a 7d 0a 0a 2f 2a    nCall++;.}../*
1ec40 0a 2a 2a 20 41 6e 20 6f 62 6a 65 63 74 20 75 73  .** An object us
1ec50 65 64 20 74 6f 20 72 65 61 64 20 61 20 43 53 56  ed to read a CSV
1ec60 20 61 6e 64 20 6f 74 68 65 72 20 66 69 6c 65 73   and other files
1ec70 20 66 6f 72 20 69 6d 70 6f 72 74 2e 0a 2a 2f 0a   for import..*/.
1ec80 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 49  typedef struct I
1ec90 6d 70 6f 72 74 43 74 78 20 49 6d 70 6f 72 74 43  mportCtx ImportC
1eca0 74 78 3b 0a 73 74 72 75 63 74 20 49 6d 70 6f 72  tx;.struct Impor
1ecb0 74 43 74 78 20 7b 0a 20 20 63 6f 6e 73 74 20 63  tCtx {.  const c
1ecc0 68 61 72 20 2a 7a 46 69 6c 65 3b 20 20 2f 2a 20  har *zFile;  /* 
1ecd0 4e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e 70 75  Name of the inpu
1ece0 74 20 66 69 6c 65 20 2a 2f 0a 20 20 46 49 4c 45  t file */.  FILE
1ecf0 20 2a 69 6e 3b 20 20 20 20 20 20 20 20 20 20 20   *in;           
1ed00 2f 2a 20 52 65 61 64 20 74 68 65 20 43 53 56 20  /* Read the CSV 
1ed10 74 65 78 74 20 66 72 6f 6d 20 74 68 69 73 20 69  text from this i
1ed20 6e 70 75 74 20 73 74 72 65 61 6d 20 2a 2f 0a 20  nput stream */. 
1ed30 20 63 68 61 72 20 2a 7a 3b 20 20 20 20 20 20 20   char *z;       
1ed40 20 20 20 20 20 2f 2a 20 41 63 63 75 6d 75 6c 61       /* Accumula
1ed50 74 65 64 20 74 65 78 74 20 66 6f 72 20 61 20 66  ted text for a f
1ed60 69 65 6c 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b  ield */.  int n;
1ed70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1ed80 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
1ed90 20 69 6e 20 7a 20 2a 2f 0a 20 20 69 6e 74 20 6e   in z */.  int n
1eda0 41 6c 6c 6f 63 3b 20 20 20 20 20 20 20 20 20 2f  Alloc;         /
1edb0 2a 20 53 70 61 63 65 20 61 6c 6c 6f 63 61 74 65  * Space allocate
1edc0 64 20 66 6f 72 20 7a 5b 5d 20 2a 2f 0a 20 20 69  d for z[] */.  i
1edd0 6e 74 20 6e 4c 69 6e 65 3b 20 20 20 20 20 20 20  nt nLine;       
1ede0 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 6c 69     /* Current li
1edf0 6e 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69  ne number */.  i
1ee00 6e 74 20 62 4e 6f 74 46 69 72 73 74 3b 20 20 20  nt bNotFirst;   
1ee10 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6f 6e     /* True if on
1ee20 65 20 6f 72 20 6d 6f 72 65 20 62 79 74 65 73 20  e or more bytes 
1ee30 61 6c 72 65 61 64 79 20 72 65 61 64 20 2a 2f 0a  already read */.
1ee40 20 20 69 6e 74 20 63 54 65 72 6d 3b 20 20 20 20    int cTerm;    
1ee50 20 20 20 20 20 20 2f 2a 20 43 68 61 72 61 63 74        /* Charact
1ee60 65 72 20 74 68 61 74 20 74 65 72 6d 69 6e 61 74  er that terminat
1ee70 65 64 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  ed the most rece
1ee80 6e 74 20 66 69 65 6c 64 20 2a 2f 0a 20 20 69 6e  nt field */.  in
1ee90 74 20 63 43 6f 6c 53 65 70 3b 20 20 20 20 20 20  t cColSep;      
1eea0 20 20 2f 2a 20 54 68 65 20 63 6f 6c 75 6d 6e 20    /* The column 
1eeb0 73 65 70 61 72 61 74 6f 72 20 63 68 61 72 61 63  separator charac
1eec0 74 65 72 2e 20 20 28 55 73 75 61 6c 6c 79 20 22  ter.  (Usually "
1eed0 2c 22 29 20 2a 2f 0a 20 20 69 6e 74 20 63 52 6f  ,") */.  int cRo
1eee0 77 53 65 70 3b 20 20 20 20 20 20 20 20 2f 2a 20  wSep;        /* 
1eef0 54 68 65 20 72 6f 77 20 73 65 70 61 72 61 74 6f  The row separato
1ef00 72 20 63 68 61 72 61 63 74 65 72 2e 20 20 28 55  r character.  (U
1ef10 73 75 61 6c 6c 79 20 22 5c 6e 22 29 20 2a 2f 0a  sually "\n") */.
1ef20 7d 3b 0a 0a 2f 2a 20 41 70 70 65 6e 64 20 61 20  };../* Append a 
1ef30 73 69 6e 67 6c 65 20 62 79 74 65 20 74 6f 20 7a  single byte to z
1ef40 5b 5d 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  [] */.static voi
1ef50 64 20 69 6d 70 6f 72 74 5f 61 70 70 65 6e 64 5f  d import_append_
1ef60 63 68 61 72 28 49 6d 70 6f 72 74 43 74 78 20 2a  char(ImportCtx *
1ef70 70 2c 20 69 6e 74 20 63 29 7b 0a 20 20 69 66 28  p, int c){.  if(
1ef80 20 70 2d 3e 6e 2b 31 3e 3d 70 2d 3e 6e 41 6c 6c   p->n+1>=p->nAll
1ef90 6f 63 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 41 6c  oc ){.    p->nAl
1efa0 6c 6f 63 20 2b 3d 20 70 2d 3e 6e 41 6c 6c 6f 63  loc += p->nAlloc
1efb0 20 2b 20 31 30 30 3b 0a 20 20 20 20 70 2d 3e 7a   + 100;.    p->z
1efc0 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c   = sqlite3_reall
1efd0 6f 63 36 34 28 70 2d 3e 7a 2c 20 70 2d 3e 6e 41  oc64(p->z, p->nA
1efe0 6c 6c 6f 63 29 3b 0a 20 20 20 20 69 66 28 20 70  lloc);.    if( p
1eff0 2d 3e 7a 3d 3d 30 20 29 20 73 68 65 6c 6c 5f 6f  ->z==0 ) shell_o
1f000 75 74 5f 6f 66 5f 6d 65 6d 6f 72 79 28 29 3b 0a  ut_of_memory();.
1f010 20 20 7d 0a 20 20 70 2d 3e 7a 5b 70 2d 3e 6e 2b    }.  p->z[p->n+
1f020 2b 5d 20 3d 20 28 63 68 61 72 29 63 3b 0a 7d 0a  +] = (char)c;.}.
1f030 0a 2f 2a 20 52 65 61 64 20 61 20 73 69 6e 67 6c  ./* Read a singl
1f040 65 20 66 69 65 6c 64 20 6f 66 20 43 53 56 20 74  e field of CSV t
1f050 65 78 74 2e 20 20 43 6f 6d 70 61 74 69 62 6c 65  ext.  Compatible
1f060 20 77 69 74 68 20 72 66 63 34 31 38 30 20 61 6e   with rfc4180 an
1f070 64 20 65 78 74 65 6e 64 65 64 0a 2a 2a 20 77 69  d extended.** wi
1f080 74 68 20 74 68 65 20 6f 70 74 69 6f 6e 20 6f 66  th the option of
1f090 20 68 61 76 69 6e 67 20 61 20 73 65 70 61 72 61   having a separa
1f0a0 74 6f 72 20 6f 74 68 65 72 20 74 68 61 6e 20 22  tor other than "
1f0b0 2c 22 2e 0a 2a 2a 0a 2a 2a 20 20 20 2b 20 20 49  ,"..**.**   +  I
1f0c0 6e 70 75 74 20 63 6f 6d 65 73 20 66 72 6f 6d 20  nput comes from 
1f0d0 70 2d 3e 69 6e 2e 0a 2a 2a 20 20 20 2b 20 20 53  p->in..**   +  S
1f0e0 74 6f 72 65 20 72 65 73 75 6c 74 73 20 69 6e 20  tore results in 
1f0f0 70 2d 3e 7a 20 6f 66 20 6c 65 6e 67 74 68 20 70  p->z of length p
1f100 2d 3e 6e 2e 20 20 53 70 61 63 65 20 74 6f 20 68  ->n.  Space to h
1f110 6f 6c 64 20 70 2d 3e 7a 20 63 6f 6d 65 73 0a 2a  old p->z comes.*
1f120 2a 20 20 20 20 20 20 66 72 6f 6d 20 73 71 6c 69  *      from sqli
1f130 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 29 2e 0a  te3_malloc64()..
1f140 2a 2a 20 20 20 2b 20 20 55 73 65 20 70 2d 3e 63  **   +  Use p->c
1f150 53 65 70 20 61 73 20 74 68 65 20 63 6f 6c 75 6d  Sep as the colum
1f160 6e 20 73 65 70 61 72 61 74 6f 72 2e 20 20 54 68  n separator.  Th
1f170 65 20 64 65 66 61 75 6c 74 20 69 73 20 22 2c 22  e default is ","
1f180 2e 0a 2a 2a 20 20 20 2b 20 20 55 73 65 20 70 2d  ..**   +  Use p-
1f190 3e 72 53 65 70 20 61 73 20 74 68 65 20 72 6f 77  >rSep as the row
1f1a0 20 73 65 70 61 72 61 74 6f 72 2e 20 20 54 68 65   separator.  The
1f1b0 20 64 65 66 61 75 6c 74 20 69 73 20 22 5c 6e 22   default is "\n"
1f1c0 2e 0a 2a 2a 20 20 20 2b 20 20 4b 65 65 70 20 74  ..**   +  Keep t
1f1d0 72 61 63 6b 20 6f 66 20 74 68 65 20 6c 69 6e 65  rack of the line
1f1e0 20 6e 75 6d 62 65 72 20 69 6e 20 70 2d 3e 6e 4c   number in p->nL
1f1f0 69 6e 65 2e 0a 2a 2a 20 20 20 2b 20 20 53 74 6f  ine..**   +  Sto
1f200 72 65 20 74 68 65 20 63 68 61 72 61 63 74 65 72  re the character
1f210 20 74 68 61 74 20 74 65 72 6d 69 6e 61 74 65 73   that terminates
1f220 20 74 68 65 20 66 69 65 6c 64 20 69 6e 20 70 2d   the field in p-
1f230 3e 63 54 65 72 6d 2e 20 20 53 74 6f 72 65 0a 2a  >cTerm.  Store.*
1f240 2a 20 20 20 20 20 20 45 4f 46 20 6f 6e 20 65 6e  *      EOF on en
1f250 64 2d 6f 66 2d 66 69 6c 65 2e 0a 2a 2a 20 20 20  d-of-file..**   
1f260 2b 20 20 52 65 70 6f 72 74 20 73 79 6e 74 61 78  +  Report syntax
1f270 20 65 72 72 6f 72 73 20 6f 6e 20 73 74 64 65 72   errors on stder
1f280 72 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  r.*/.static char
1f290 20 2a 53 51 4c 49 54 45 5f 43 44 45 43 4c 20 63   *SQLITE_CDECL c
1f2a0 73 76 5f 72 65 61 64 5f 6f 6e 65 5f 66 69 65 6c  sv_read_one_fiel
1f2b0 64 28 49 6d 70 6f 72 74 43 74 78 20 2a 70 29 7b  d(ImportCtx *p){
1f2c0 0a 20 20 69 6e 74 20 63 3b 0a 20 20 69 6e 74 20  .  int c;.  int 
1f2d0 63 53 65 70 20 3d 20 70 2d 3e 63 43 6f 6c 53 65  cSep = p->cColSe
1f2e0 70 3b 0a 20 20 69 6e 74 20 72 53 65 70 20 3d 20  p;.  int rSep = 
1f2f0 70 2d 3e 63 52 6f 77 53 65 70 3b 0a 20 20 70 2d  p->cRowSep;.  p-
1f300 3e 6e 20 3d 20 30 3b 0a 20 20 63 20 3d 20 66 67  >n = 0;.  c = fg
1f310 65 74 63 28 70 2d 3e 69 6e 29 3b 0a 20 20 69 66  etc(p->in);.  if
1f320 28 20 63 3d 3d 45 4f 46 20 7c 7c 20 73 65 65 6e  ( c==EOF || seen
1f330 49 6e 74 65 72 72 75 70 74 20 29 7b 0a 20 20 20  Interrupt ){.   
1f340 20 70 2d 3e 63 54 65 72 6d 20 3d 20 45 4f 46 3b   p->cTerm = EOF;
1f350 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
1f360 20 7d 0a 20 20 69 66 28 20 63 3d 3d 27 22 27 20   }.  if( c=='"' 
1f370 29 7b 0a 20 20 20 20 69 6e 74 20 70 63 2c 20 70  ){.    int pc, p
1f380 70 63 3b 0a 20 20 20 20 69 6e 74 20 73 74 61 72  pc;.    int star
1f390 74 4c 69 6e 65 20 3d 20 70 2d 3e 6e 4c 69 6e 65  tLine = p->nLine
1f3a0 3b 0a 20 20 20 20 69 6e 74 20 63 51 75 6f 74 65  ;.    int cQuote
1f3b0 20 3d 20 63 3b 0a 20 20 20 20 70 63 20 3d 20 70   = c;.    pc = p
1f3c0 70 63 20 3d 20 30 3b 0a 20 20 20 20 77 68 69 6c  pc = 0;.    whil
1f3d0 65 28 20 31 20 29 7b 0a 20 20 20 20 20 20 63 20  e( 1 ){.      c 
1f3e0 3d 20 66 67 65 74 63 28 70 2d 3e 69 6e 29 3b 0a  = fgetc(p->in);.
1f3f0 20 20 20 20 20 20 69 66 28 20 63 3d 3d 72 53 65        if( c==rSe
1f400 70 20 29 20 70 2d 3e 6e 4c 69 6e 65 2b 2b 3b 0a  p ) p->nLine++;.
1f410 20 20 20 20 20 20 69 66 28 20 63 3d 3d 63 51 75        if( c==cQu
1f420 6f 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ote ){.        i
1f430 66 28 20 70 63 3d 3d 63 51 75 6f 74 65 20 29 7b  f( pc==cQuote ){
1f440 0a 20 20 20 20 20 20 20 20 20 20 70 63 20 3d 20  .          pc = 
1f450 30 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e  0;.          con
1f460 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 7d  tinue;.        }
1f470 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
1f480 66 28 20 28 63 3d 3d 63 53 65 70 20 26 26 20 70  f( (c==cSep && p
1f490 63 3d 3d 63 51 75 6f 74 65 29 0a 20 20 20 20 20  c==cQuote).     
1f4a0 20 20 7c 7c 20 28 63 3d 3d 72 53 65 70 20 26 26    || (c==rSep &&
1f4b0 20 70 63 3d 3d 63 51 75 6f 74 65 29 0a 20 20 20   pc==cQuote).   
1f4c0 20 20 20 20 7c 7c 20 28 63 3d 3d 72 53 65 70 20      || (c==rSep 
1f4d0 26 26 20 70 63 3d 3d 27 5c 72 27 20 26 26 20 70  && pc=='\r' && p
1f4e0 70 63 3d 3d 63 51 75 6f 74 65 29 0a 20 20 20 20  pc==cQuote).    
1f4f0 20 20 20 7c 7c 20 28 63 3d 3d 45 4f 46 20 26 26     || (c==EOF &&
1f500 20 70 63 3d 3d 63 51 75 6f 74 65 29 0a 20 20 20   pc==cQuote).   
1f510 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 64 6f     ){.        do
1f520 7b 20 70 2d 3e 6e 2d 2d 3b 20 7d 77 68 69 6c 65  { p->n--; }while
1f530 28 20 70 2d 3e 7a 5b 70 2d 3e 6e 5d 21 3d 63 51  ( p->z[p->n]!=cQ
1f540 75 6f 74 65 20 29 3b 0a 20 20 20 20 20 20 20 20  uote );.        
1f550 70 2d 3e 63 54 65 72 6d 20 3d 20 63 3b 0a 20 20  p->cTerm = c;.  
1f560 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1f570 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
1f580 63 3d 3d 63 51 75 6f 74 65 20 26 26 20 63 21 3d  c==cQuote && c!=
1f590 27 5c 72 27 20 29 7b 0a 20 20 20 20 20 20 20 20  '\r' ){.        
1f5a0 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65  utf8_printf(stde
1f5b0 72 72 2c 20 22 25 73 3a 25 64 3a 20 75 6e 65 73  rr, "%s:%d: unes
1f5c0 63 61 70 65 64 20 25 63 20 63 68 61 72 61 63 74  caped %c charact
1f5d0 65 72 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  er\n",.         
1f5e0 20 20 20 20 20 20 20 70 2d 3e 7a 46 69 6c 65 2c         p->zFile,
1f5f0 20 70 2d 3e 6e 4c 69 6e 65 2c 20 63 51 75 6f 74   p->nLine, cQuot
1f600 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
1f610 20 20 69 66 28 20 63 3d 3d 45 4f 46 20 29 7b 0a    if( c==EOF ){.
1f620 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69          utf8_pri
1f630 6e 74 66 28 73 74 64 65 72 72 2c 20 22 25 73 3a  ntf(stderr, "%s:
1f640 25 64 3a 20 75 6e 74 65 72 6d 69 6e 61 74 65 64  %d: unterminated
1f650 20 25 63 2d 71 75 6f 74 65 64 20 66 69 65 6c 64   %c-quoted field
1f660 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
1f670 20 20 20 20 20 70 2d 3e 7a 46 69 6c 65 2c 20 73       p->zFile, s
1f680 74 61 72 74 4c 69 6e 65 2c 20 63 51 75 6f 74 65  tartLine, cQuote
1f690 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 63 54  );.        p->cT
1f6a0 65 72 6d 20 3d 20 63 3b 0a 20 20 20 20 20 20 20  erm = c;.       
1f6b0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
1f6c0 20 20 20 20 20 20 69 6d 70 6f 72 74 5f 61 70 70        import_app
1f6d0 65 6e 64 5f 63 68 61 72 28 70 2c 20 63 29 3b 0a  end_char(p, c);.
1f6e0 20 20 20 20 20 20 70 70 63 20 3d 20 70 63 3b 0a        ppc = pc;.
1f6f0 20 20 20 20 20 20 70 63 20 3d 20 63 3b 0a 20 20        pc = c;.  
1f700 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
1f710 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 74   /* If this is t
1f720 68 65 20 66 69 72 73 74 20 66 69 65 6c 64 20 62  he first field b
1f730 65 69 6e 67 20 70 61 72 73 65 64 20 61 6e 64 20  eing parsed and 
1f740 69 74 20 62 65 67 69 6e 73 20 77 69 74 68 20 74  it begins with t
1f750 68 65 0a 20 20 20 20 2a 2a 20 55 54 46 2d 38 20  he.    ** UTF-8 
1f760 42 4f 4d 20 20 28 30 78 45 46 20 42 42 20 42 46  BOM  (0xEF BB BF
1f770 29 20 74 68 65 6e 20 73 6b 69 70 20 74 68 65 20  ) then skip the 
1f780 42 4f 4d 20 2a 2f 0a 20 20 20 20 69 66 28 20 28  BOM */.    if( (
1f790 63 26 30 78 66 66 29 3d 3d 30 78 65 66 20 26 26  c&0xff)==0xef &&
1f7a0 20 70 2d 3e 62 4e 6f 74 46 69 72 73 74 3d 3d 30   p->bNotFirst==0
1f7b0 20 29 7b 0a 20 20 20 20 20 20 69 6d 70 6f 72 74   ){.      import
1f7c0 5f 61 70 70 65 6e 64 5f 63 68 61 72 28 70 2c 20  _append_char(p, 
1f7d0 63 29 3b 0a 20 20 20 20 20 20 63 20 3d 20 66 67  c);.      c = fg
1f7e0 65 74 63 28 70 2d 3e 69 6e 29 3b 0a 20 20 20 20  etc(p->in);.    
1f7f0 20 20 69 66 28 20 28 63 26 30 78 66 66 29 3d 3d    if( (c&0xff)==
1f800 30 78 62 62 20 29 7b 0a 20 20 20 20 20 20 20 20  0xbb ){.        
1f810 69 6d 70 6f 72 74 5f 61 70 70 65 6e 64 5f 63 68  import_append_ch
1f820 61 72 28 70 2c 20 63 29 3b 0a 20 20 20 20 20 20  ar(p, c);.      
1f830 20 20 63 20 3d 20 66 67 65 74 63 28 70 2d 3e 69    c = fgetc(p->i
1f840 6e 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  n);.        if( 
1f850 28 63 26 30 78 66 66 29 3d 3d 30 78 62 66 20 29  (c&0xff)==0xbf )
1f860 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 62  {.          p->b
1f870 4e 6f 74 46 69 72 73 74 20 3d 20 31 3b 0a 20 20  NotFirst = 1;.  
1f880 20 20 20 20 20 20 20 20 70 2d 3e 6e 20 3d 20 30          p->n = 0
1f890 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ;.          retu
1f8a0 72 6e 20 63 73 76 5f 72 65 61 64 5f 6f 6e 65 5f  rn csv_read_one_
1f8b0 66 69 65 6c 64 28 70 29 3b 0a 20 20 20 20 20 20  field(p);.      
1f8c0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
1f8d0 7d 0a 20 20 20 20 77 68 69 6c 65 28 20 63 21 3d  }.    while( c!=
1f8e0 45 4f 46 20 26 26 20 63 21 3d 63 53 65 70 20 26  EOF && c!=cSep &
1f8f0 26 20 63 21 3d 72 53 65 70 20 29 7b 0a 20 20 20  & c!=rSep ){.   
1f900 20 20 20 69 6d 70 6f 72 74 5f 61 70 70 65 6e 64     import_append
1f910 5f 63 68 61 72 28 70 2c 20 63 29 3b 0a 20 20 20  _char(p, c);.   
1f920 20 20 20 63 20 3d 20 66 67 65 74 63 28 70 2d 3e     c = fgetc(p->
1f930 69 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  in);.    }.    i
1f940 66 28 20 63 3d 3d 72 53 65 70 20 29 7b 0a 20 20  f( c==rSep ){.  
1f950 20 20 20 20 70 2d 3e 6e 4c 69 6e 65 2b 2b 3b 0a      p->nLine++;.
1f960 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6e 3e 30        if( p->n>0
1f970 20 26 26 20 70 2d 3e 7a 5b 70 2d 3e 6e 2d 31 5d   && p->z[p->n-1]
1f980 3d 3d 27 5c 72 27 20 29 20 70 2d 3e 6e 2d 2d 3b  =='\r' ) p->n--;
1f990 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 63 54  .    }.    p->cT
1f9a0 65 72 6d 20 3d 20 63 3b 0a 20 20 7d 0a 20 20 69  erm = c;.  }.  i
1f9b0 66 28 20 70 2d 3e 7a 20 29 20 70 2d 3e 7a 5b 70  f( p->z ) p->z[p
1f9c0 2d 3e 6e 5d 20 3d 20 30 3b 0a 20 20 70 2d 3e 62  ->n] = 0;.  p->b
1f9d0 4e 6f 74 46 69 72 73 74 20 3d 20 31 3b 0a 20 20  NotFirst = 1;.  
1f9e0 72 65 74 75 72 6e 20 70 2d 3e 7a 3b 0a 7d 0a 0a  return p->z;.}..
1f9f0 2f 2a 20 52 65 61 64 20 61 20 73 69 6e 67 6c 65  /* Read a single
1fa00 20 66 69 65 6c 64 20 6f 66 20 41 53 43 49 49 20   field of ASCII 
1fa10 64 65 6c 69 6d 69 74 65 64 20 74 65 78 74 2e 0a  delimited text..
1fa20 2a 2a 0a 2a 2a 20 20 20 2b 20 20 49 6e 70 75 74  **.**   +  Input
1fa30 20 63 6f 6d 65 73 20 66 72 6f 6d 20 70 2d 3e 69   comes from p->i
1fa40 6e 2e 0a 2a 2a 20 20 20 2b 20 20 53 74 6f 72 65  n..**   +  Store
1fa50 20 72 65 73 75 6c 74 73 20 69 6e 20 70 2d 3e 7a   results in p->z
1fa60 20 6f 66 20 6c 65 6e 67 74 68 20 70 2d 3e 6e 2e   of length p->n.
1fa70 20 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20    Space to hold 
1fa80 70 2d 3e 7a 20 63 6f 6d 65 73 0a 2a 2a 20 20 20  p->z comes.**   
1fa90 20 20 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f     from sqlite3_
1faa0 6d 61 6c 6c 6f 63 36 34 28 29 2e 0a 2a 2a 20 20  malloc64()..**  
1fab0 20 2b 20 20 55 73 65 20 70 2d 3e 63 53 65 70 20   +  Use p->cSep 
1fac0 61 73 20 74 68 65 20 63 6f 6c 75 6d 6e 20 73 65  as the column se
1fad0 70 61 72 61 74 6f 72 2e 20 20 54 68 65 20 64 65  parator.  The de
1fae0 66 61 75 6c 74 20 69 73 20 22 5c 78 31 46 22 2e  fault is "\x1F".
1faf0 0a 2a 2a 20 20 20 2b 20 20 55 73 65 20 70 2d 3e  .**   +  Use p->
1fb00 72 53 65 70 20 61 73 20 74 68 65 20 72 6f 77 20  rSep as the row 
1fb10 73 65 70 61 72 61 74 6f 72 2e 20 20 54 68 65 20  separator.  The 
1fb20 64 65 66 61 75 6c 74 20 69 73 20 22 5c 78 31 45  default is "\x1E
1fb30 22 2e 0a 2a 2a 20 20 20 2b 20 20 4b 65 65 70 20  "..**   +  Keep 
1fb40 74 72 61 63 6b 20 6f 66 20 74 68 65 20 72 6f 77  track of the row
1fb50 20 6e 75 6d 62 65 72 20 69 6e 20 70 2d 3e 6e 4c   number in p->nL
1fb60 69 6e 65 2e 0a 2a 2a 20 20 20 2b 20 20 53 74 6f  ine..**   +  Sto
1fb70 72 65 20 74 68 65 20 63 68 61 72 61 63 74 65 72  re the character
1fb80 20 74 68 61 74 20 74 65 72 6d 69 6e 61 74 65 73   that terminates
1fb90 20 74 68 65 20 66 69 65 6c 64 20 69 6e 20 70 2d   the field in p-
1fba0 3e 63 54 65 72 6d 2e 20 20 53 74 6f 72 65 0a 2a  >cTerm.  Store.*
1fbb0 2a 20 20 20 20 20 20 45 4f 46 20 6f 6e 20 65 6e  *      EOF on en
1fbc0 64 2d 6f 66 2d 66 69 6c 65 2e 0a 2a 2a 20 20 20  d-of-file..**   
1fbd0 2b 20 20 52 65 70 6f 72 74 20 73 79 6e 74 61 78  +  Report syntax
1fbe0 20 65 72 72 6f 72 73 20 6f 6e 20 73 74 64 65 72   errors on stder
1fbf0 72 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  r.*/.static char
1fc00 20 2a 53 51 4c 49 54 45 5f 43 44 45 43 4c 20 61   *SQLITE_CDECL a
1fc10 73 63 69 69 5f 72 65 61 64 5f 6f 6e 65 5f 66 69  scii_read_one_fi
1fc20 65 6c 64 28 49 6d 70 6f 72 74 43 74 78 20 2a 70  eld(ImportCtx *p
1fc30 29 7b 0a 20 20 69 6e 74 20 63 3b 0a 20 20 69 6e  ){.  int c;.  in
1fc40 74 20 63 53 65 70 20 3d 20 70 2d 3e 63 43 6f 6c  t cSep = p->cCol
1fc50 53 65 70 3b 0a 20 20 69 6e 74 20 72 53 65 70 20  Sep;.  int rSep 
1fc60 3d 20 70 2d 3e 63 52 6f 77 53 65 70 3b 0a 20 20  = p->cRowSep;.  
1fc70 70 2d 3e 6e 20 3d 20 30 3b 0a 20 20 63 20 3d 20  p->n = 0;.  c = 
1fc80 66 67 65 74 63 28 70 2d 3e 69 6e 29 3b 0a 20 20  fgetc(p->in);.  
1fc90 69 66 28 20 63 3d 3d 45 4f 46 20 7c 7c 20 73 65  if( c==EOF || se
1fca0 65 6e 49 6e 74 65 72 72 75 70 74 20 29 7b 0a 20  enInterrupt ){. 
1fcb0 20 20 20 70 2d 3e 63 54 65 72 6d 20 3d 20 45 4f     p->cTerm = EO
1fcc0 46 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  F;.    return 0;
1fcd0 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 63 21  .  }.  while( c!
1fce0 3d 45 4f 46 20 26 26 20 63 21 3d 63 53 65 70 20  =EOF && c!=cSep 
1fcf0 26 26 20 63 21 3d 72 53 65 70 20 29 7b 0a 20 20  && c!=rSep ){.  
1fd00 20 20 69 6d 70 6f 72 74 5f 61 70 70 65 6e 64 5f    import_append_
1fd10 63 68 61 72 28 70 2c 20 63 29 3b 0a 20 20 20 20  char(p, c);.    
1fd20 63 20 3d 20 66 67 65 74 63 28 70 2d 3e 69 6e 29  c = fgetc(p->in)
1fd30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 63 3d 3d 72  ;.  }.  if( c==r
1fd40 53 65 70 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 4c  Sep ){.    p->nL
1fd50 69 6e 65 2b 2b 3b 0a 20 20 7d 0a 20 20 70 2d 3e  ine++;.  }.  p->
1fd60 63 54 65 72 6d 20 3d 20 63 3b 0a 20 20 69 66 28  cTerm = c;.  if(
1fd70 20 70 2d 3e 7a 20 29 20 70 2d 3e 7a 5b 70 2d 3e   p->z ) p->z[p->
1fd80 6e 5d 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e  n] = 0;.  return
1fd90 20 70 2d 3e 7a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   p->z;.}../*.** 
1fda0 54 72 79 20 74 6f 20 74 72 61 6e 73 66 65 72 20  Try to transfer 
1fdb0 64 61 74 61 20 66 6f 72 20 74 61 62 6c 65 20 7a  data for table z
1fdc0 54 61 62 6c 65 2e 20 20 49 66 20 61 6e 20 65 72  Table.  If an er
1fdd0 72 6f 72 20 69 73 20 73 65 65 6e 20 77 68 69 6c  ror is seen whil
1fde0 65 0a 2a 2a 20 6d 6f 76 69 6e 67 20 66 6f 72 77  e.** moving forw
1fdf0 61 72 64 2c 20 74 72 79 20 74 6f 20 67 6f 20 62  ard, try to go b
1fe00 61 63 6b 77 61 72 64 73 2e 20 20 54 68 65 20 62  ackwards.  The b
1fe10 61 63 6b 77 61 72 64 73 20 6d 6f 76 65 6d 65 6e  ackwards movemen
1fe20 74 20 77 6f 6e 27 74 0a 2a 2a 20 77 6f 72 6b 20  t won't.** work 
1fe30 66 6f 72 20 57 49 54 48 4f 55 54 20 52 4f 57 49  for WITHOUT ROWI
1fe40 44 20 74 61 62 6c 65 73 2e 0a 2a 2f 0a 73 74 61  D tables..*/.sta
1fe50 74 69 63 20 76 6f 69 64 20 74 72 79 54 6f 43 6c  tic void tryToCl
1fe60 6f 6e 65 44 61 74 61 28 0a 20 20 53 68 65 6c 6c  oneData(.  Shell
1fe70 53 74 61 74 65 20 2a 70 2c 0a 20 20 73 71 6c 69  State *p,.  sqli
1fe80 74 65 33 20 2a 6e 65 77 44 62 2c 0a 20 20 63 6f  te3 *newDb,.  co
1fe90 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62 6c 65  nst char *zTable
1fea0 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  .){.  sqlite3_st
1feb0 6d 74 20 2a 70 51 75 65 72 79 20 3d 20 30 3b 0a  mt *pQuery = 0;.
1fec0 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
1fed0 70 49 6e 73 65 72 74 20 3d 20 30 3b 0a 20 20 63  pInsert = 0;.  c
1fee0 68 61 72 20 2a 7a 51 75 65 72 79 20 3d 20 30 3b  har *zQuery = 0;
1fef0 0a 20 20 63 68 61 72 20 2a 7a 49 6e 73 65 72 74  .  char *zInsert
1ff00 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a   = 0;.  int rc;.
1ff10 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6e 3b 0a 20    int i, j, n;. 
1ff20 20 69 6e 74 20 6e 54 61 62 6c 65 20 3d 20 73 74   int nTable = st
1ff30 72 6c 65 6e 33 30 28 7a 54 61 62 6c 65 29 3b 0a  rlen30(zTable);.
1ff40 20 20 69 6e 74 20 6b 20 3d 20 30 3b 0a 20 20 69    int k = 0;.  i
1ff50 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 63 6f  nt cnt = 0;.  co
1ff60 6e 73 74 20 69 6e 74 20 73 70 69 6e 52 61 74 65  nst int spinRate
1ff70 20 3d 20 31 30 30 30 30 3b 0a 0a 20 20 7a 51 75   = 10000;..  zQu
1ff80 65 72 79 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  ery = sqlite3_mp
1ff90 72 69 6e 74 66 28 22 53 45 4c 45 43 54 20 2a 20  rintf("SELECT * 
1ffa0 46 52 4f 4d 20 5c 22 25 77 5c 22 22 2c 20 7a 54  FROM \"%w\"", zT
1ffb0 61 62 6c 65 29 3b 0a 20 20 72 63 20 3d 20 73 71  able);.  rc = sq
1ffc0 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32  lite3_prepare_v2
1ffd0 28 70 2d 3e 64 62 2c 20 7a 51 75 65 72 79 2c 20  (p->db, zQuery, 
1ffe0 2d 31 2c 20 26 70 51 75 65 72 79 2c 20 30 29 3b  -1, &pQuery, 0);
1fff0 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20  .  if( rc ){.   
20000 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64   utf8_printf(std
20010 65 72 72 2c 20 22 45 72 72 6f 72 20 25 64 3a 20  err, "Error %d: 
20020 25 73 20 6f 6e 20 5b 25 73 5d 5c 6e 22 2c 0a 20  %s on [%s]\n",. 
20030 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
20040 65 33 5f 65 78 74 65 6e 64 65 64 5f 65 72 72 63  e3_extended_errc
20050 6f 64 65 28 70 2d 3e 64 62 29 2c 20 73 71 6c 69  ode(p->db), sqli
20060 74 65 33 5f 65 72 72 6d 73 67 28 70 2d 3e 64 62  te3_errmsg(p->db
20070 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a  ),.            z
20080 51 75 65 72 79 29 3b 0a 20 20 20 20 67 6f 74 6f  Query);.    goto
20090 20 65 6e 64 5f 64 61 74 61 5f 78 66 65 72 3b 0a   end_data_xfer;.
200a0 20 20 7d 0a 20 20 6e 20 3d 20 73 71 6c 69 74 65    }.  n = sqlite
200b0 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 70  3_column_count(p
200c0 51 75 65 72 79 29 3b 0a 20 20 7a 49 6e 73 65 72  Query);.  zInser
200d0 74 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  t = sqlite3_mall
200e0 6f 63 36 34 28 32 30 30 20 2b 20 6e 54 61 62 6c  oc64(200 + nTabl
200f0 65 20 2b 20 6e 2a 33 29 3b 0a 20 20 69 66 28 20  e + n*3);.  if( 
20100 7a 49 6e 73 65 72 74 3d 3d 30 20 29 20 73 68 65  zInsert==0 ) she
20110 6c 6c 5f 6f 75 74 5f 6f 66 5f 6d 65 6d 6f 72 79  ll_out_of_memory
20120 28 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e  ();.  sqlite3_sn
20130 70 72 69 6e 74 66 28 32 30 30 2b 6e 54 61 62 6c  printf(200+nTabl
20140 65 2c 7a 49 6e 73 65 72 74 2c 0a 20 20 20 20 20  e,zInsert,.     
20150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 49                "I
20160 4e 53 45 52 54 20 4f 52 20 49 47 4e 4f 52 45 20  NSERT OR IGNORE 
20170 49 4e 54 4f 20 5c 22 25 73 5c 22 20 56 41 4c 55  INTO \"%s\" VALU
20180 45 53 28 3f 22 2c 20 7a 54 61 62 6c 65 29 3b 0a  ES(?", zTable);.
20190 20 20 69 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a    i = strlen30(z
201a0 49 6e 73 65 72 74 29 3b 0a 20 20 66 6f 72 28 6a  Insert);.  for(j
201b0 3d 31 3b 20 6a 3c 6e 3b 20 6a 2b 2b 29 7b 0a 20  =1; j<n; j++){. 
201c0 20 20 20 6d 65 6d 63 70 79 28 7a 49 6e 73 65 72     memcpy(zInser
201d0 74 2b 69 2c 20 22 2c 3f 22 2c 20 32 29 3b 0a 20  t+i, ",?", 2);. 
201e0 20 20 20 69 20 2b 3d 20 32 3b 0a 20 20 7d 0a 20     i += 2;.  }. 
201f0 20 6d 65 6d 63 70 79 28 7a 49 6e 73 65 72 74 2b   memcpy(zInsert+
20200 69 2c 20 22 29 3b 22 2c 20 33 29 3b 0a 20 20 72  i, ");", 3);.  r
20210 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70  c = sqlite3_prep
20220 61 72 65 5f 76 32 28 6e 65 77 44 62 2c 20 7a 49  are_v2(newDb, zI
20230 6e 73 65 72 74 2c 20 2d 31 2c 20 26 70 49 6e 73  nsert, -1, &pIns
20240 65 72 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  ert, 0);.  if( r
20250 63 20 29 7b 0a 20 20 20 20 75 74 66 38 5f 70 72  c ){.    utf8_pr
20260 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72  intf(stderr, "Er
20270 72 6f 72 20 25 64 3a 20 25 73 20 6f 6e 20 5b 25  ror %d: %s on [%
20280 73 5d 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  s]\n",.         
20290 20 20 20 73 71 6c 69 74 65 33 5f 65 78 74 65 6e     sqlite3_exten
202a0 64 65 64 5f 65 72 72 63 6f 64 65 28 6e 65 77 44  ded_errcode(newD
202b0 62 29 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d  b), sqlite3_errm
202c0 73 67 28 6e 65 77 44 62 29 2c 0a 20 20 20 20 20  sg(newDb),.     
202d0 20 20 20 20 20 20 20 7a 51 75 65 72 79 29 3b 0a         zQuery);.
202e0 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 64 61 74      goto end_dat
202f0 61 5f 78 66 65 72 3b 0a 20 20 7d 0a 20 20 66 6f  a_xfer;.  }.  fo
20300 72 28 6b 3d 30 3b 20 6b 3c 32 3b 20 6b 2b 2b 29  r(k=0; k<2; k++)
20310 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 28 72 63  {.    while( (rc
20320 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28   = sqlite3_step(
20330 70 51 75 65 72 79 29 29 3d 3d 53 51 4c 49 54 45  pQuery))==SQLITE
20340 5f 52 4f 57 20 29 7b 0a 20 20 20 20 20 20 66 6f  _ROW ){.      fo
20350 72 28 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29  r(i=0; i<n; i++)
20360 7b 0a 20 20 20 20 20 20 20 20 73 77 69 74 63 68  {.        switch
20370 28 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  ( sqlite3_column
20380 5f 74 79 70 65 28 70 51 75 65 72 79 2c 20 69 29  _type(pQuery, i)
20390 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 61   ){.          ca
203a0 73 65 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 3a 20  se SQLITE_NULL: 
203b0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
203c0 6c 69 74 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c 28  lite3_bind_null(
203d0 70 49 6e 73 65 72 74 2c 20 69 2b 31 29 3b 0a 20  pInsert, i+1);. 
203e0 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
203f0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
20400 20 20 20 20 20 20 20 20 63 61 73 65 20 53 51 4c          case SQL
20410 49 54 45 5f 49 4e 54 45 47 45 52 3a 20 7b 0a 20  ITE_INTEGER: {. 
20420 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
20430 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 49  e3_bind_int64(pI
20440 6e 73 65 72 74 2c 20 69 2b 31 2c 20 73 71 6c 69  nsert, i+1, sqli
20450 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34  te3_column_int64
20460 28 70 51 75 65 72 79 2c 69 29 29 3b 0a 20 20 20  (pQuery,i));.   
20470 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
20480 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
20490 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
204a0 45 5f 46 4c 4f 41 54 3a 20 7b 0a 20 20 20 20 20  E_FLOAT: {.     
204b0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62         sqlite3_b
204c0 69 6e 64 5f 64 6f 75 62 6c 65 28 70 49 6e 73 65  ind_double(pInse
204d0 72 74 2c 20 69 2b 31 2c 20 73 71 6c 69 74 65 33  rt, i+1, sqlite3
204e0 5f 63 6f 6c 75 6d 6e 5f 64 6f 75 62 6c 65 28 70  _column_double(p
204f0 51 75 65 72 79 2c 69 29 29 3b 0a 20 20 20 20 20  Query,i));.     
20500 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
20510 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
20520 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
20530 54 45 58 54 3a 20 7b 0a 20 20 20 20 20 20 20 20  TEXT: {.        
20540 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64      sqlite3_bind
20550 5f 74 65 78 74 28 70 49 6e 73 65 72 74 2c 20 69  _text(pInsert, i
20560 2b 31 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  +1,.            
20570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20580 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71   (const char*)sq
20590 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
205a0 74 28 70 51 75 65 72 79 2c 69 29 2c 0a 20 20 20  t(pQuery,i),.   
205b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
205c0 20 20 20 20 20 20 20 20 20 20 2d 31 2c 20 53 51            -1, SQ
205d0 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20  LITE_STATIC);.  
205e0 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
205f0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
20600 20 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49         case SQLI
20610 54 45 5f 42 4c 4f 42 3a 20 7b 0a 20 20 20 20 20  TE_BLOB: {.     
20620 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62         sqlite3_b
20630 69 6e 64 5f 62 6c 6f 62 28 70 49 6e 73 65 72 74  ind_blob(pInsert
20640 2c 20 69 2b 31 2c 20 73 71 6c 69 74 65 33 5f 63  , i+1, sqlite3_c
20650 6f 6c 75 6d 6e 5f 62 6c 6f 62 28 70 51 75 65 72  olumn_blob(pQuer
20660 79 2c 69 29 2c 0a 20 20 20 20 20 20 20 20 20 20  y,i),.          
20670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20690 20 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e    sqlite3_column
206a0 5f 62 79 74 65 73 28 70 51 75 65 72 79 2c 69 29  _bytes(pQuery,i)
206b0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
206c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
206d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
206e0 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20  LITE_STATIC);.  
206f0 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
20700 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
20710 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 20 2f       }.      } /
20720 2a 20 45 6e 64 20 66 6f 72 20 2a 2f 0a 20 20 20  * End for */.   
20730 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
20740 73 74 65 70 28 70 49 6e 73 65 72 74 29 3b 0a 20  step(pInsert);. 
20750 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
20760 49 54 45 5f 4f 4b 20 26 26 20 72 63 21 3d 53 51  ITE_OK && rc!=SQ
20770 4c 49 54 45 5f 52 4f 57 20 26 26 20 72 63 21 3d  LITE_ROW && rc!=
20780 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20  SQLITE_DONE ){. 
20790 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e         utf8_prin
207a0 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f  tf(stderr, "Erro
207b0 72 20 25 64 3a 20 25 73 5c 6e 22 2c 20 73 71 6c  r %d: %s\n", sql
207c0 69 74 65 33 5f 65 78 74 65 6e 64 65 64 5f 65 72  ite3_extended_er
207d0 72 63 6f 64 65 28 6e 65 77 44 62 29 2c 0a 20 20  rcode(newDb),.  
207e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
207f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65 72        sqlite3_er
20800 72 6d 73 67 28 6e 65 77 44 62 29 29 3b 0a 20 20  rmsg(newDb));.  
20810 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
20820 74 65 33 5f 72 65 73 65 74 28 70 49 6e 73 65 72  te3_reset(pInser
20830 74 29 3b 0a 20 20 20 20 20 20 63 6e 74 2b 2b 3b  t);.      cnt++;
20840 0a 20 20 20 20 20 20 69 66 28 20 28 63 6e 74 25  .      if( (cnt%
20850 73 70 69 6e 52 61 74 65 29 3d 3d 30 20 29 7b 0a  spinRate)==0 ){.
20860 20 20 20 20 20 20 20 20 70 72 69 6e 74 66 28 22          printf("
20870 25 63 5c 62 22 2c 20 22 7c 2f 2d 5c 5c 22 5b 28  %c\b", "|/-\\"[(
20880 63 6e 74 2f 73 70 69 6e 52 61 74 65 29 25 34 5d  cnt/spinRate)%4]
20890 29 3b 0a 20 20 20 20 20 20 20 20 66 66 6c 75 73  );.        fflus
208a0 68 28 73 74 64 6f 75 74 29 3b 0a 20 20 20 20 20  h(stdout);.     
208b0 20 7d 0a 20 20 20 20 7d 20 2f 2a 20 45 6e 64 20   }.    } /* End 
208c0 77 68 69 6c 65 20 2a 2f 0a 20 20 20 20 69 66 28  while */.    if(
208d0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45   rc==SQLITE_DONE
208e0 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 73 71   ) break;.    sq
208f0 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
20900 51 75 65 72 79 29 3b 0a 20 20 20 20 73 71 6c 69  Query);.    sqli
20910 74 65 33 5f 66 72 65 65 28 7a 51 75 65 72 79 29  te3_free(zQuery)
20920 3b 0a 20 20 20 20 7a 51 75 65 72 79 20 3d 20 73  ;.    zQuery = s
20930 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
20940 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 5c 22  SELECT * FROM \"
20950 25 77 5c 22 20 4f 52 44 45 52 20 42 59 20 72 6f  %w\" ORDER BY ro
20960 77 69 64 20 44 45 53 43 3b 22 2c 0a 20 20 20 20  wid DESC;",.    
20970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20980 20 20 20 20 20 20 20 20 20 7a 54 61 62 6c 65 29           zTable)
20990 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
209a0 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 70 2d  e3_prepare_v2(p-
209b0 3e 64 62 2c 20 7a 51 75 65 72 79 2c 20 2d 31 2c  >db, zQuery, -1,
209c0 20 26 70 51 75 65 72 79 2c 20 30 29 3b 0a 20 20   &pQuery, 0);.  
209d0 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
209e0 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74    utf8_printf(st
209f0 64 65 72 72 2c 20 22 57 61 72 6e 69 6e 67 3a 20  derr, "Warning: 
20a00 63 61 6e 6e 6f 74 20 73 74 65 70 20 5c 22 25 73  cannot step \"%s
20a10 5c 22 20 62 61 63 6b 77 61 72 64 73 22 2c 20 7a  \" backwards", z
20a20 54 61 62 6c 65 29 3b 0a 20 20 20 20 20 20 62 72  Table);.      br
20a30 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 2f  eak;.    }.  } /
20a40 2a 20 45 6e 64 20 66 6f 72 28 6b 3d 30 2e 2e 2e  * End for(k=0...
20a50 29 20 2a 2f 0a 0a 65 6e 64 5f 64 61 74 61 5f 78  ) */..end_data_x
20a60 66 65 72 3a 0a 20 20 73 71 6c 69 74 65 33 5f 66  fer:.  sqlite3_f
20a70 69 6e 61 6c 69 7a 65 28 70 51 75 65 72 79 29 3b  inalize(pQuery);
20a80 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c  .  sqlite3_final
20a90 69 7a 65 28 70 49 6e 73 65 72 74 29 3b 0a 20 20  ize(pInsert);.  
20aa0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 51 75  sqlite3_free(zQu
20ab0 65 72 79 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  ery);.  sqlite3_
20ac0 66 72 65 65 28 7a 49 6e 73 65 72 74 29 3b 0a 7d  free(zInsert);.}
20ad0 0a 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20  .../*.** Try to 
20ae0 74 72 61 6e 73 66 65 72 20 61 6c 6c 20 72 6f 77  transfer all row
20af0 73 20 6f 66 20 74 68 65 20 73 63 68 65 6d 61 20  s of the schema 
20b00 74 68 61 74 20 6d 61 74 63 68 20 7a 57 68 65 72  that match zWher
20b10 65 2e 20 20 46 6f 72 0a 2a 2a 20 65 61 63 68 20  e.  For.** each 
20b20 72 6f 77 2c 20 69 6e 76 6f 6b 65 20 78 46 6f 72  row, invoke xFor
20b30 45 61 63 68 28 29 20 6f 6e 20 74 68 65 20 6f 62  Each() on the ob
20b40 6a 65 63 74 20 64 65 66 69 6e 65 64 20 62 79 20  ject defined by 
20b50 74 68 61 74 20 72 6f 77 2e 0a 2a 2a 20 49 66 20  that row..** If 
20b60 61 6e 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f  an error is enco
20b70 75 6e 74 65 72 65 64 20 77 68 69 6c 65 20 6d 6f  untered while mo
20b80 76 69 6e 67 20 66 6f 72 77 61 72 64 20 74 68 72  ving forward thr
20b90 6f 75 67 68 20 74 68 65 0a 2a 2a 20 73 71 6c 69  ough the.** sqli
20ba0 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 2c  te_master table,
20bb0 20 74 72 79 20 61 67 61 69 6e 20 6d 6f 76 69 6e   try again movin
20bc0 67 20 62 61 63 6b 77 61 72 64 73 2e 0a 2a 2f 0a  g backwards..*/.
20bd0 73 74 61 74 69 63 20 76 6f 69 64 20 74 72 79 54  static void tryT
20be0 6f 43 6c 6f 6e 65 53 63 68 65 6d 61 28 0a 20 20  oCloneSchema(.  
20bf0 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 2c 0a 20  ShellState *p,. 
20c00 20 73 71 6c 69 74 65 33 20 2a 6e 65 77 44 62 2c   sqlite3 *newDb,
20c10 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
20c20 57 68 65 72 65 2c 0a 20 20 76 6f 69 64 20 28 2a  Where,.  void (*
20c30 78 46 6f 72 45 61 63 68 29 28 53 68 65 6c 6c 53  xForEach)(ShellS
20c40 74 61 74 65 2a 2c 73 71 6c 69 74 65 33 2a 2c 63  tate*,sqlite3*,c
20c50 6f 6e 73 74 20 63 68 61 72 2a 29 0a 29 7b 0a 20  onst char*).){. 
20c60 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
20c70 51 75 65 72 79 20 3d 20 30 3b 0a 20 20 63 68 61  Query = 0;.  cha
20c80 72 20 2a 7a 51 75 65 72 79 20 3d 20 30 3b 0a 20  r *zQuery = 0;. 
20c90 20 69 6e 74 20 72 63 3b 0a 20 20 63 6f 6e 73 74   int rc;.  const
20ca0 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
20cb0 7a 4e 61 6d 65 3b 0a 20 20 63 6f 6e 73 74 20 75  zName;.  const u
20cc0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 53  nsigned char *zS
20cd0 71 6c 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72  ql;.  char *zErr
20ce0 4d 73 67 20 3d 20 30 3b 0a 0a 20 20 7a 51 75 65  Msg = 0;..  zQue
20cf0 72 79 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  ry = sqlite3_mpr
20d00 69 6e 74 66 28 22 53 45 4c 45 43 54 20 6e 61 6d  intf("SELECT nam
20d10 65 2c 20 73 71 6c 20 46 52 4f 4d 20 73 71 6c 69  e, sql FROM sqli
20d20 74 65 5f 6d 61 73 74 65 72 22 0a 20 20 20 20 20  te_master".     
20d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20d40 20 20 20 20 20 20 22 20 57 48 45 52 45 20 25 73        " WHERE %s
20d50 22 2c 20 7a 57 68 65 72 65 29 3b 0a 20 20 72 63  ", zWhere);.  rc
20d60 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61   = sqlite3_prepa
20d70 72 65 5f 76 32 28 70 2d 3e 64 62 2c 20 7a 51 75  re_v2(p->db, zQu
20d80 65 72 79 2c 20 2d 31 2c 20 26 70 51 75 65 72 79  ery, -1, &pQuery
20d90 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 20 29  , 0);.  if( rc )
20da0 7b 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74  {.    utf8_print
20db0 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72  f(stderr, "Error
20dc0 3a 20 28 25 64 29 20 25 73 20 6f 6e 20 5b 25 73  : (%d) %s on [%s
20dd0 5d 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  ]\n",.          
20de0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
20df0 33 5f 65 78 74 65 6e 64 65 64 5f 65 72 72 63 6f  3_extended_errco
20e00 64 65 28 70 2d 3e 64 62 29 2c 20 73 71 6c 69 74  de(p->db), sqlit
20e10 65 33 5f 65 72 72 6d 73 67 28 70 2d 3e 64 62 29  e3_errmsg(p->db)
20e20 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
20e30 20 20 20 20 20 20 7a 51 75 65 72 79 29 3b 0a 20        zQuery);. 
20e40 20 20 20 67 6f 74 6f 20 65 6e 64 5f 73 63 68 65     goto end_sche
20e50 6d 61 5f 78 66 65 72 3b 0a 20 20 7d 0a 20 20 77  ma_xfer;.  }.  w
20e60 68 69 6c 65 28 20 28 72 63 20 3d 20 73 71 6c 69  hile( (rc = sqli
20e70 74 65 33 5f 73 74 65 70 28 70 51 75 65 72 79 29  te3_step(pQuery)
20e80 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b  )==SQLITE_ROW ){
20e90 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c  .    zName = sql
20ea0 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  ite3_column_text
20eb0 28 70 51 75 65 72 79 2c 20 30 29 3b 0a 20 20 20  (pQuery, 0);.   
20ec0 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f   zSql = sqlite3_
20ed0 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 51 75 65  column_text(pQue
20ee0 72 79 2c 20 31 29 3b 0a 20 20 20 20 70 72 69 6e  ry, 1);.    prin
20ef0 74 66 28 22 25 73 2e 2e 2e 20 22 2c 20 7a 4e 61  tf("%s... ", zNa
20f00 6d 65 29 3b 20 66 66 6c 75 73 68 28 73 74 64 6f  me); fflush(stdo
20f10 75 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ut);.    sqlite3
20f20 5f 65 78 65 63 28 6e 65 77 44 62 2c 20 28 63 6f  _exec(newDb, (co
20f30 6e 73 74 20 63 68 61 72 2a 29 7a 53 71 6c 2c 20  nst char*)zSql, 
20f40 30 2c 20 30 2c 20 26 7a 45 72 72 4d 73 67 29 3b  0, 0, &zErrMsg);
20f50 0a 20 20 20 20 69 66 28 20 7a 45 72 72 4d 73 67  .    if( zErrMsg
20f60 20 29 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70   ){.      utf8_p
20f70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45  rintf(stderr, "E
20f80 72 72 6f 72 3a 20 25 73 5c 6e 53 51 4c 3a 20 5b  rror: %s\nSQL: [
20f90 25 73 5d 5c 6e 22 2c 20 7a 45 72 72 4d 73 67 2c  %s]\n", zErrMsg,
20fa0 20 7a 53 71 6c 29 3b 0a 20 20 20 20 20 20 73 71   zSql);.      sq
20fb0 6c 69 74 65 33 5f 66 72 65 65 28 7a 45 72 72 4d  lite3_free(zErrM
20fc0 73 67 29 3b 0a 20 20 20 20 20 20 7a 45 72 72 4d  sg);.      zErrM
20fd0 73 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  sg = 0;.    }.  
20fe0 20 20 69 66 28 20 78 46 6f 72 45 61 63 68 20 29    if( xForEach )
20ff0 7b 0a 20 20 20 20 20 20 78 46 6f 72 45 61 63 68  {.      xForEach
21000 28 70 2c 20 6e 65 77 44 62 2c 20 28 63 6f 6e 73  (p, newDb, (cons
21010 74 20 63 68 61 72 2a 29 7a 4e 61 6d 65 29 3b 0a  t char*)zName);.
21020 20 20 20 20 7d 0a 20 20 20 20 70 72 69 6e 74 66      }.    printf
21030 28 22 64 6f 6e 65 5c 6e 22 29 3b 0a 20 20 7d 0a  ("done\n");.  }.
21040 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
21050 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 73 71 6c  _DONE ){.    sql
21060 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 51  ite3_finalize(pQ
21070 75 65 72 79 29 3b 0a 20 20 20 20 73 71 6c 69 74  uery);.    sqlit
21080 65 33 5f 66 72 65 65 28 7a 51 75 65 72 79 29 3b  e3_free(zQuery);
21090 0a 20 20 20 20 7a 51 75 65 72 79 20 3d 20 73 71  .    zQuery = sq
210a0 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 53  lite3_mprintf("S
210b0 45 4c 45 43 54 20 6e 61 6d 65 2c 20 73 71 6c 20  ELECT name, sql 
210c0 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74  FROM sqlite_mast
210d0 65 72 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  er".            
210e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
210f0 20 22 20 57 48 45 52 45 20 25 73 20 4f 52 44 45   " WHERE %s ORDE
21100 52 20 42 59 20 72 6f 77 69 64 20 44 45 53 43 22  R BY rowid DESC"
21110 2c 20 7a 57 68 65 72 65 29 3b 0a 20 20 20 20 72  , zWhere);.    r
21120 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70  c = sqlite3_prep
21130 61 72 65 5f 76 32 28 70 2d 3e 64 62 2c 20 7a 51  are_v2(p->db, zQ
21140 75 65 72 79 2c 20 2d 31 2c 20 26 70 51 75 65 72  uery, -1, &pQuer
21150 79 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72  y, 0);.    if( r
21160 63 20 29 7b 0a 20 20 20 20 20 20 75 74 66 38 5f  c ){.      utf8_
21170 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
21180 45 72 72 6f 72 3a 20 28 25 64 29 20 25 73 20 6f  Error: (%d) %s o
21190 6e 20 5b 25 73 5d 5c 6e 22 2c 0a 20 20 20 20 20  n [%s]\n",.     
211a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
211b0 20 73 71 6c 69 74 65 33 5f 65 78 74 65 6e 64 65   sqlite3_extende
211c0 64 5f 65 72 72 63 6f 64 65 28 70 2d 3e 64 62 29  d_errcode(p->db)
211d0 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  , sqlite3_errmsg
211e0 28 70 2d 3e 64 62 29 2c 0a 20 20 20 20 20 20 20  (p->db),.       
211f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a                 z
21200 51 75 65 72 79 29 3b 0a 20 20 20 20 20 20 67 6f  Query);.      go
21210 74 6f 20 65 6e 64 5f 73 63 68 65 6d 61 5f 78 66  to end_schema_xf
21220 65 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 77 68  er;.    }.    wh
21230 69 6c 65 28 20 28 72 63 20 3d 20 73 71 6c 69 74  ile( (rc = sqlit
21240 65 33 5f 73 74 65 70 28 70 51 75 65 72 79 29 29  e3_step(pQuery))
21250 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a  ==SQLITE_ROW ){.
21260 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71        zName = sq
21270 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
21280 74 28 70 51 75 65 72 79 2c 20 30 29 3b 0a 20 20  t(pQuery, 0);.  
21290 20 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74      zSql = sqlit
212a0 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70  e3_column_text(p
212b0 51 75 65 72 79 2c 20 31 29 3b 0a 20 20 20 20 20  Query, 1);.     
212c0 20 70 72 69 6e 74 66 28 22 25 73 2e 2e 2e 20 22   printf("%s... "
212d0 2c 20 7a 4e 61 6d 65 29 3b 20 66 66 6c 75 73 68  , zName); fflush
212e0 28 73 74 64 6f 75 74 29 3b 0a 20 20 20 20 20 20  (stdout);.      
212f0 73 71 6c 69 74 65 33 5f 65 78 65 63 28 6e 65 77  sqlite3_exec(new
21300 44 62 2c 20 28 63 6f 6e 73 74 20 63 68 61 72 2a  Db, (const char*
21310 29 7a 53 71 6c 2c 20 30 2c 20 30 2c 20 26 7a 45  )zSql, 0, 0, &zE
21320 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 69 66  rrMsg);.      if
21330 28 20 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20  ( zErrMsg ){.   
21340 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
21350 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a  (stderr, "Error:
21360 20 25 73 5c 6e 53 51 4c 3a 20 5b 25 73 5d 5c 6e   %s\nSQL: [%s]\n
21370 22 2c 20 7a 45 72 72 4d 73 67 2c 20 7a 53 71 6c  ", zErrMsg, zSql
21380 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
21390 65 33 5f 66 72 65 65 28 7a 45 72 72 4d 73 67 29  e3_free(zErrMsg)
213a0 3b 0a 20 20 20 20 20 20 20 20 7a 45 72 72 4d 73  ;.        zErrMs
213b0 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  g = 0;.      }. 
213c0 20 20 20 20 20 69 66 28 20 78 46 6f 72 45 61 63       if( xForEac
213d0 68 20 29 7b 0a 20 20 20 20 20 20 20 20 78 46 6f  h ){.        xFo
213e0 72 45 61 63 68 28 70 2c 20 6e 65 77 44 62 2c 20  rEach(p, newDb, 
213f0 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 7a 4e 61  (const char*)zNa
21400 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  me);.      }.   
21410 20 20 20 70 72 69 6e 74 66 28 22 64 6f 6e 65 5c     printf("done\
21420 6e 22 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 65  n");.    }.  }.e
21430 6e 64 5f 73 63 68 65 6d 61 5f 78 66 65 72 3a 0a  nd_schema_xfer:.
21440 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69    sqlite3_finali
21450 7a 65 28 70 51 75 65 72 79 29 3b 0a 20 20 73 71  ze(pQuery);.  sq
21460 6c 69 74 65 33 5f 66 72 65 65 28 7a 51 75 65 72  lite3_free(zQuer
21470 79 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65  y);.}../*.** Ope
21480 6e 20 61 20 6e 65 77 20 64 61 74 61 62 61 73 65  n a new database
21490 20 66 69 6c 65 20 6e 61 6d 65 64 20 22 7a 4e 65   file named "zNe
214a0 77 44 62 22 2e 20 20 54 72 79 20 74 6f 20 72 65  wDb".  Try to re
214b0 63 6f 76 65 72 20 61 73 20 6d 75 63 68 20 69 6e  cover as much in
214c0 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 61 73 20  formation.** as 
214d0 70 6f 73 73 69 62 6c 65 20 6f 75 74 20 6f 66 20  possible out of 
214e0 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73  the main databas
214f0 65 20 28 77 68 69 63 68 20 6d 69 67 68 74 20 62  e (which might b
21500 65 20 63 6f 72 72 75 70 74 29 20 61 6e 64 20 77  e corrupt) and w
21510 72 69 74 65 20 69 74 0a 2a 2a 20 69 6e 74 6f 20  rite it.** into 
21520 7a 4e 65 77 44 62 2e 0a 2a 2f 0a 73 74 61 74 69  zNewDb..*/.stati
21530 63 20 76 6f 69 64 20 74 72 79 54 6f 43 6c 6f 6e  c void tryToClon
21540 65 28 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 2c  e(ShellState *p,
21550 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 65   const char *zNe
21560 77 44 62 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  wDb){.  int rc;.
21570 20 20 73 71 6c 69 74 65 33 20 2a 6e 65 77 44 62    sqlite3 *newDb
21580 20 3d 20 30 3b 0a 20 20 69 66 28 20 61 63 63 65   = 0;.  if( acce
21590 73 73 28 7a 4e 65 77 44 62 2c 30 29 3d 3d 30 20  ss(zNewDb,0)==0 
215a0 29 7b 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e  ){.    utf8_prin
215b0 74 66 28 73 74 64 65 72 72 2c 20 22 46 69 6c 65  tf(stderr, "File
215c0 20 5c 22 25 73 5c 22 20 61 6c 72 65 61 64 79 20   \"%s\" already 
215d0 65 78 69 73 74 73 2e 5c 6e 22 2c 20 7a 4e 65 77  exists.\n", zNew
215e0 44 62 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  Db);.    return;
215f0 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69  .  }.  rc = sqli
21600 74 65 33 5f 6f 70 65 6e 28 7a 4e 65 77 44 62 2c  te3_open(zNewDb,
21610 20 26 6e 65 77 44 62 29 3b 0a 20 20 69 66 28 20   &newDb);.  if( 
21620 72 63 20 29 7b 0a 20 20 20 20 75 74 66 38 5f 70  rc ){.    utf8_p
21630 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 43  rintf(stderr, "C
21640 61 6e 6e 6f 74 20 63 72 65 61 74 65 20 6f 75 74  annot create out
21650 70 75 74 20 64 61 74 61 62 61 73 65 3a 20 25 73  put database: %s
21660 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
21670 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
21680 6e 65 77 44 62 29 29 3b 0a 20 20 7d 65 6c 73 65  newDb));.  }else
21690 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 65 78  {.    sqlite3_ex
216a0 65 63 28 70 2d 3e 64 62 2c 20 22 50 52 41 47 4d  ec(p->db, "PRAGM
216b0 41 20 77 72 69 74 61 62 6c 65 5f 73 63 68 65 6d  A writable_schem
216c0 61 3d 4f 4e 3b 22 2c 20 30 2c 20 30 2c 20 30 29  a=ON;", 0, 0, 0)
216d0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 65 78  ;.    sqlite3_ex
216e0 65 63 28 6e 65 77 44 62 2c 20 22 42 45 47 49 4e  ec(newDb, "BEGIN
216f0 20 45 58 43 4c 55 53 49 56 45 3b 22 2c 20 30 2c   EXCLUSIVE;", 0,
21700 20 30 2c 20 30 29 3b 0a 20 20 20 20 74 72 79 54   0, 0);.    tryT
21710 6f 43 6c 6f 6e 65 53 63 68 65 6d 61 28 70 2c 20  oCloneSchema(p, 
21720 6e 65 77 44 62 2c 20 22 74 79 70 65 3d 27 74 61  newDb, "type='ta
21730 62 6c 65 27 22 2c 20 74 72 79 54 6f 43 6c 6f 6e  ble'", tryToClon
21740 65 44 61 74 61 29 3b 0a 20 20 20 20 74 72 79 54  eData);.    tryT
21750 6f 43 6c 6f 6e 65 53 63 68 65 6d 61 28 70 2c 20  oCloneSchema(p, 
21760 6e 65 77 44 62 2c 20 22 74 79 70 65 21 3d 27 74  newDb, "type!='t
21770 61 62 6c 65 27 22 2c 20 30 29 3b 0a 20 20 20 20  able'", 0);.    
21780 73 71 6c 69 74 65 33 5f 65 78 65 63 28 6e 65 77  sqlite3_exec(new
21790 44 62 2c 20 22 43 4f 4d 4d 49 54 3b 22 2c 20 30  Db, "COMMIT;", 0
217a0 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  , 0, 0);.    sql
217b0 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c  ite3_exec(p->db,
217c0 20 22 50 52 41 47 4d 41 20 77 72 69 74 61 62 6c   "PRAGMA writabl
217d0 65 5f 73 63 68 65 6d 61 3d 4f 46 46 3b 22 2c 20  e_schema=OFF;", 
217e0 30 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  0, 0, 0);.  }.  
217f0 63 6c 6f 73 65 5f 64 62 28 6e 65 77 44 62 29 3b  close_db(newDb);
21800 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
21810 20 74 68 65 20 6f 75 74 70 75 74 20 66 69 6c 65   the output file
21820 20 62 61 63 6b 20 74 6f 20 73 74 64 6f 75 74 2e   back to stdout.
21830 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 2d  .**.** If the p-
21840 3e 64 6f 58 64 67 4f 70 65 6e 20 66 6c 61 67 20  >doXdgOpen flag 
21850 69 73 20 73 65 74 2c 20 74 68 61 74 20 6d 65 61  is set, that mea
21860 6e 73 20 74 68 65 20 6f 75 74 70 75 74 20 77 61  ns the output wa
21870 73 20 62 65 69 6e 67 0a 2a 2a 20 72 65 64 69 72  s being.** redir
21880 65 63 74 65 64 20 74 6f 20 61 20 74 65 6d 70 6f  ected to a tempo
21890 72 61 72 79 20 66 69 6c 65 20 6e 61 6d 65 64 20  rary file named 
218a0 62 79 20 70 2d 3e 7a 54 65 6d 70 46 69 6c 65 2e  by p->zTempFile.
218b0 20 20 49 6e 20 74 68 61 74 20 63 61 73 65 2c 0a    In that case,.
218c0 2a 2a 20 6c 61 75 6e 63 68 20 73 74 61 72 74 2f  ** launch start/
218d0 6f 70 65 6e 2f 78 64 67 2d 6f 70 65 6e 20 6f 6e  open/xdg-open on
218e0 20 74 68 61 74 20 74 65 6d 70 6f 72 61 72 79 20   that temporary 
218f0 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  file..*/.static 
21900 76 6f 69 64 20 6f 75 74 70 75 74 5f 72 65 73 65  void output_rese
21910 74 28 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 29  t(ShellState *p)
21920 7b 0a 20 20 69 66 28 20 70 2d 3e 6f 75 74 66 69  {.  if( p->outfi
21930 6c 65 5b 30 5d 3d 3d 27 7c 27 20 29 7b 0a 23 69  le[0]=='|' ){.#i
21940 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
21950 54 5f 50 4f 50 45 4e 0a 20 20 20 20 70 63 6c 6f  T_POPEN.    pclo
21960 73 65 28 70 2d 3e 6f 75 74 29 3b 0a 23 65 6e 64  se(p->out);.#end
21970 69 66 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  if.  }else{.    
21980 6f 75 74 70 75 74 5f 66 69 6c 65 5f 63 6c 6f 73  output_file_clos
21990 65 28 70 2d 3e 6f 75 74 29 3b 0a 23 69 66 6e 64  e(p->out);.#ifnd
219a0 65 66 20 53 51 4c 49 54 45 5f 4e 4f 48 41 56 45  ef SQLITE_NOHAVE
219b0 5f 53 59 53 54 45 4d 0a 20 20 20 20 69 66 28 20  _SYSTEM.    if( 
219c0 70 2d 3e 64 6f 58 64 67 4f 70 65 6e 20 29 7b 0a  p->doXdgOpen ){.
219d0 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
219e0 20 2a 7a 58 64 67 4f 70 65 6e 43 6d 64 20 3d 0a   *zXdgOpenCmd =.
219f0 23 69 66 20 64 65 66 69 6e 65 64 28 5f 57 49 4e  #if defined(_WIN
21a00 33 32 29 0a 20 20 20 20 20 20 22 73 74 61 72 74  32).      "start
21a10 22 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64  ";.#elif defined
21a20 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20 20 20 20  (__APPLE__).    
21a30 20 20 22 6f 70 65 6e 22 3b 0a 23 65 6c 73 65 0a    "open";.#else.
21a40 20 20 20 20 20 20 22 78 64 67 2d 6f 70 65 6e 22        "xdg-open"
21a50 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 63  ;.#endif.      c
21a60 68 61 72 20 2a 7a 43 6d 64 3b 0a 20 20 20 20 20  har *zCmd;.     
21a70 20 7a 43 6d 64 20 3d 20 73 71 6c 69 74 65 33 5f   zCmd = sqlite3_
21a80 6d 70 72 69 6e 74 66 28 22 25 73 20 25 73 22 2c  mprintf("%s %s",
21a90 20 7a 58 64 67 4f 70 65 6e 43 6d 64 2c 20 70 2d   zXdgOpenCmd, p-
21aa0 3e 7a 54 65 6d 70 46 69 6c 65 29 3b 0a 20 20 20  >zTempFile);.   
21ab0 20 20 20 69 66 28 20 73 79 73 74 65 6d 28 7a 43     if( system(zC
21ac0 6d 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20 75  md) ){.        u
21ad0 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72  tf8_printf(stder
21ae0 72 2c 20 22 46 61 69 6c 65 64 3a 20 5b 25 73 5d  r, "Failed: [%s]
21af0 5c 6e 22 2c 20 7a 43 6d 64 29 3b 0a 20 20 20 20  \n", zCmd);.    
21b00 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
21b10 33 5f 66 72 65 65 28 7a 43 6d 64 29 3b 0a 20 20  3_free(zCmd);.  
21b20 20 20 20 20 6f 75 74 70 75 74 4d 6f 64 65 50 6f      outputModePo
21b30 70 28 70 29 3b 0a 20 20 20 20 20 20 70 2d 3e 64  p(p);.      p->d
21b40 6f 58 64 67 4f 70 65 6e 20 3d 20 30 3b 0a 20 20  oXdgOpen = 0;.  
21b50 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64    }.#endif /* !d
21b60 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4e 4f  efined(SQLITE_NO
21b70 48 41 56 45 5f 53 59 53 54 45 4d 29 20 2a 2f 0a  HAVE_SYSTEM) */.
21b80 20 20 7d 0a 20 20 70 2d 3e 6f 75 74 66 69 6c 65    }.  p->outfile
21b90 5b 30 5d 20 3d 20 30 3b 0a 20 20 70 2d 3e 6f 75  [0] = 0;.  p->ou
21ba0 74 20 3d 20 73 74 64 6f 75 74 3b 0a 7d 0a 0a 2f  t = stdout;.}../
21bb0 2a 0a 2a 2a 20 52 75 6e 20 61 6e 20 53 51 4c 20  *.** Run an SQL 
21bc0 63 6f 6d 6d 61 6e 64 20 61 6e 64 20 72 65 74 75  command and retu
21bd0 72 6e 20 74 68 65 20 73 69 6e 67 6c 65 20 69 6e  rn the single in
21be0 74 65 67 65 72 20 72 65 73 75 6c 74 2e 0a 2a 2f  teger result..*/
21bf0 0a 73 74 61 74 69 63 20 69 6e 74 20 64 62 5f 69  .static int db_i
21c00 6e 74 28 53 68 65 6c 6c 53 74 61 74 65 20 2a 70  nt(ShellState *p
21c10 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53  , const char *zS
21c20 71 6c 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73  ql){.  sqlite3_s
21c30 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e  tmt *pStmt;.  in
21c40 74 20 72 65 73 20 3d 20 30 3b 0a 20 20 73 71 6c  t res = 0;.  sql
21c50 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28  ite3_prepare_v2(
21c60 70 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c  p->db, zSql, -1,
21c70 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 69   &pStmt, 0);.  i
21c80 66 28 20 70 53 74 6d 74 20 26 26 20 73 71 6c 69  f( pStmt && sqli
21c90 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3d  te3_step(pStmt)=
21ca0 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20  =SQLITE_ROW ){. 
21cb0 20 20 20 72 65 73 20 3d 20 73 71 6c 69 74 65 33     res = sqlite3
21cc0 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 74 6d  _column_int(pStm
21cd0 74 2c 30 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  t,0);.  }.  sqli
21ce0 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74  te3_finalize(pSt
21cf0 6d 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 65  mt);.  return re
21d00 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76  s;.}../*.** Conv
21d10 65 72 74 20 61 20 32 2d 62 79 74 65 20 6f 72 20  ert a 2-byte or 
21d20 34 2d 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61  4-byte big-endia
21d30 6e 20 69 6e 74 65 67 65 72 20 69 6e 74 6f 20 61  n integer into a
21d40 20 6e 61 74 69 76 65 20 69 6e 74 65 67 65 72 0a   native integer.
21d50 2a 2f 0a 73 74 61 74 69 63 20 75 6e 73 69 67 6e  */.static unsign
21d60 65 64 20 69 6e 74 20 67 65 74 32 62 79 74 65 49  ed int get2byteI
21d70 6e 74 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  nt(unsigned char
21d80 20 2a 61 29 7b 0a 20 20 72 65 74 75 72 6e 20 28   *a){.  return (
21d90 61 5b 30 5d 3c 3c 38 29 20 2b 20 61 5b 31 5d 3b  a[0]<<8) + a[1];
21da0 0a 7d 0a 73 74 61 74 69 63 20 75 6e 73 69 67 6e  .}.static unsign
21db0 65 64 20 69 6e 74 20 67 65 74 34 62 79 74 65 49  ed int get4byteI
21dc0 6e 74 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  nt(unsigned char
21dd0 20 2a 61 29 7b 0a 20 20 72 65 74 75 72 6e 20 28   *a){.  return (
21de0 61 5b 30 5d 3c 3c 32 34 29 20 2b 20 28 61 5b 31  a[0]<<24) + (a[1
21df0 5d 3c 3c 31 36 29 20 2b 20 28 61 5b 32 5d 3c 3c  ]<<16) + (a[2]<<
21e00 38 29 20 2b 20 61 5b 33 5d 3b 0a 7d 0a 0a 2f 2a  8) + a[3];.}../*
21e10 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69  .** Implementati
21e20 6f 6e 20 6f 66 20 74 68 65 20 22 2e 69 6e 66 6f  on of the ".info
21e30 22 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a  " command..**.**
21e40 20 52 65 74 75 72 6e 20 31 20 6f 6e 20 65 72 72   Return 1 on err
21e50 6f 72 2c 20 32 20 74 6f 20 65 78 69 74 2c 20 61  or, 2 to exit, a
21e60 6e 64 20 30 20 6f 74 68 65 72 77 69 73 65 2e 0a  nd 0 otherwise..
21e70 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 68  */.static int sh
21e80 65 6c 6c 5f 64 62 69 6e 66 6f 5f 63 6f 6d 6d 61  ell_dbinfo_comma
21e90 6e 64 28 53 68 65 6c 6c 53 74 61 74 65 20 2a 70  nd(ShellState *p
21ea0 2c 20 69 6e 74 20 6e 41 72 67 2c 20 63 68 61 72  , int nArg, char
21eb0 20 2a 2a 61 7a 41 72 67 29 7b 0a 20 20 73 74 61   **azArg){.  sta
21ec0 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74  tic const struct
21ed0 20 7b 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a   { const char *z
21ee0 4e 61 6d 65 3b 20 69 6e 74 20 6f 66 73 74 3b 20  Name; int ofst; 
21ef0 7d 20 61 46 69 65 6c 64 5b 5d 20 3d 20 7b 0a 20  } aField[] = {. 
21f00 20 20 20 20 7b 20 22 66 69 6c 65 20 63 68 61 6e      { "file chan
21f10 67 65 20 63 6f 75 6e 74 65 72 3a 22 2c 20 20 32  ge counter:",  2
21f20 34 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 64 61  4  },.     { "da
21f30 74 61 62 61 73 65 20 70 61 67 65 20 63 6f 75 6e  tabase page coun
21f40 74 3a 22 2c 20 20 32 38 20 20 7d 2c 0a 20 20 20  t:",  28  },.   
21f50 20 20 7b 20 22 66 72 65 65 6c 69 73 74 20 70 61    { "freelist pa
21f60 67 65 20 63 6f 75 6e 74 3a 22 2c 20 20 33 36 20  ge count:",  36 
21f70 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 63 68 65   },.     { "sche
21f80 6d 61 20 63 6f 6f 6b 69 65 3a 22 2c 20 20 20 20  ma cookie:",    
21f90 20 20 20 20 34 30 20 20 7d 2c 0a 20 20 20 20 20      40  },.     
21fa0 7b 20 22 73 63 68 65 6d 61 20 66 6f 72 6d 61 74  { "schema format
21fb0 3a 22 2c 20 20 20 20 20 20 20 20 34 34 20 20 7d  :",        44  }
21fc0 2c 0a 20 20 20 20 20 7b 20 22 64 65 66 61 75 6c  ,.     { "defaul
21fd0 74 20 63 61 63 68 65 20 73 69 7a 65 3a 22 2c 20  t cache size:", 
21fe0 20 20 34 38 20 20 7d 2c 0a 20 20 20 20 20 7b 20    48  },.     { 
21ff0 22 61 75 74 6f 76 61 63 75 75 6d 20 74 6f 70 20  "autovacuum top 
22000 72 6f 6f 74 3a 22 2c 20 20 35 32 20 20 7d 2c 0a  root:",  52  },.
22010 20 20 20 20 20 7b 20 22 69 6e 63 72 65 6d 65 6e       { "incremen
22020 74 61 6c 20 76 61 63 75 75 6d 3a 22 2c 20 20 20  tal vacuum:",   
22030 36 34 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 74  64  },.     { "t
22040 65 78 74 20 65 6e 63 6f 64 69 6e 67 3a 22 2c 20  ext encoding:", 
22050 20 20 20 20 20 20 20 35 36 20 20 7d 2c 0a 20 20         56  },.  
22060 20 20 20 7b 20 22 75 73 65 72 20 76 65 72 73 69     { "user versi
22070 6f 6e 3a 22 2c 20 20 20 20 20 20 20 20 20 36 30  on:",         60
22080 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 61 70 70    },.     { "app
22090 6c 69 63 61 74 69 6f 6e 20 69 64 3a 22 2c 20 20  lication id:",  
220a0 20 20 20 20 20 36 38 20 20 7d 2c 0a 20 20 20 20       68  },.    
220b0 20 7b 20 22 73 6f 66 74 77 61 72 65 20 76 65 72   { "software ver
220c0 73 69 6f 6e 3a 22 2c 20 20 20 20 20 39 36 20 20  sion:",     96  
220d0 7d 2c 0a 20 20 7d 3b 0a 20 20 73 74 61 74 69 63  },.  };.  static
220e0 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20 7b 20   const struct { 
220f0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
22100 65 3b 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  e; const char *z
22110 53 71 6c 3b 20 7d 20 61 51 75 65 72 79 5b 5d 20  Sql; } aQuery[] 
22120 3d 20 7b 0a 20 20 20 20 20 7b 20 22 6e 75 6d 62  = {.     { "numb
22130 65 72 20 6f 66 20 74 61 62 6c 65 73 3a 22 2c 0a  er of tables:",.
22140 20 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 63         "SELECT c
22150 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 25 73 20  ount(*) FROM %s 
22160 57 48 45 52 45 20 74 79 70 65 3d 27 74 61 62 6c  WHERE type='tabl
22170 65 27 22 20 7d 2c 0a 20 20 20 20 20 7b 20 22 6e  e'" },.     { "n
22180 75 6d 62 65 72 20 6f 66 20 69 6e 64 65 78 65 73  umber of indexes
22190 3a 22 2c 0a 20 20 20 20 20 20 20 22 53 45 4c 45  :",.       "SELE
221a0 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d  CT count(*) FROM
221b0 20 25 73 20 57 48 45 52 45 20 74 79 70 65 3d 27   %s WHERE type='
221c0 69 6e 64 65 78 27 22 20 7d 2c 0a 20 20 20 20 20  index'" },.     
221d0 7b 20 22 6e 75 6d 62 65 72 20 6f 66 20 74 72 69  { "number of tri
221e0 67 67 65 72 73 3a 22 2c 0a 20 20 20 20 20 20 20  ggers:",.       
221f0 22 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29  "SELECT count(*)
22200 20 46 52 4f 4d 20 25 73 20 57 48 45 52 45 20 74   FROM %s WHERE t
22210 79 70 65 3d 27 74 72 69 67 67 65 72 27 22 20 7d  ype='trigger'" }
22220 2c 0a 20 20 20 20 20 7b 20 22 6e 75 6d 62 65 72  ,.     { "number
22230 20 6f 66 20 76 69 65 77 73 3a 22 2c 0a 20 20 20   of views:",.   
22240 20 20 20 20 22 53 45 4c 45 43 54 20 63 6f 75 6e      "SELECT coun
22250 74 28 2a 29 20 46 52 4f 4d 20 25 73 20 57 48 45  t(*) FROM %s WHE
22260 52 45 20 74 79 70 65 3d 27 76 69 65 77 27 22 20  RE type='view'" 
22270 7d 2c 0a 20 20 20 20 20 7b 20 22 73 63 68 65 6d  },.     { "schem
22280 61 20 73 69 7a 65 3a 22 2c 0a 20 20 20 20 20 20  a size:",.      
22290 20 22 53 45 4c 45 43 54 20 74 6f 74 61 6c 28 6c   "SELECT total(l
222a0 65 6e 67 74 68 28 73 71 6c 29 29 20 46 52 4f 4d  ength(sql)) FROM
222b0 20 25 73 22 20 7d 2c 0a 20 20 7d 3b 0a 20 20 69   %s" },.  };.  i
222c0 6e 74 20 69 3b 0a 20 20 75 6e 73 69 67 6e 65 64  nt i;.  unsigned
222d0 20 69 44 61 74 61 56 65 72 73 69 6f 6e 3b 0a 20   iDataVersion;. 
222e0 20 63 68 61 72 20 2a 7a 53 63 68 65 6d 61 54 61   char *zSchemaTa
222f0 62 3b 0a 20 20 63 68 61 72 20 2a 7a 44 62 20 3d  b;.  char *zDb =
22300 20 6e 41 72 67 3e 3d 32 20 3f 20 61 7a 41 72 67   nArg>=2 ? azArg
22310 5b 31 5d 20 3a 20 22 6d 61 69 6e 22 3b 0a 20 20  [1] : "main";.  
22320 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
22330 74 6d 74 20 3d 20 30 3b 0a 20 20 75 6e 73 69 67  tmt = 0;.  unsig
22340 6e 65 64 20 63 68 61 72 20 61 48 64 72 5b 31 30  ned char aHdr[10
22350 30 5d 3b 0a 20 20 6f 70 65 6e 5f 64 62 28 70 2c  0];.  open_db(p,
22360 20 30 29 3b 0a 20 20 69 66 28 20 70 2d 3e 64 62   0);.  if( p->db
22370 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  ==0 ) return 1;.
22380 20 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72    sqlite3_prepar
22390 65 5f 76 32 28 70 2d 3e 64 62 2c 22 53 45 4c 45  e_v2(p->db,"SELE
223a0 43 54 20 64 61 74 61 20 46 52 4f 4d 20 73 71 6c  CT data FROM sql
223b0 69 74 65 5f 64 62 70 61 67 65 28 3f 31 29 20 57  ite_dbpage(?1) W
223c0 48 45 52 45 20 70 67 6e 6f 3d 31 22 2c 0a 20 20  HERE pgno=1",.  
223d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
223e0 20 20 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30     -1, &pStmt, 0
223f0 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 62 69 6e  );.  sqlite3_bin
22400 64 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 31 2c  d_text(pStmt, 1,
22410 20 7a 44 62 2c 20 2d 31 2c 20 53 51 4c 49 54 45   zDb, -1, SQLITE
22420 5f 53 54 41 54 49 43 29 3b 0a 20 20 69 66 28 20  _STATIC);.  if( 
22430 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74  sqlite3_step(pSt
22440 6d 74 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 0a  mt)==SQLITE_ROW.
22450 20 20 20 26 26 20 73 71 6c 69 74 65 33 5f 63 6f     && sqlite3_co
22460 6c 75 6d 6e 5f 62 79 74 65 73 28 70 53 74 6d 74  lumn_bytes(pStmt
22470 2c 30 29 3e 31 30 30 0a 20 20 29 7b 0a 20 20 20  ,0)>100.  ){.   
22480 20 6d 65 6d 63 70 79 28 61 48 64 72 2c 20 73 71   memcpy(aHdr, sq
22490 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f  lite3_column_blo
224a0 62 28 70 53 74 6d 74 2c 30 29 2c 20 31 30 30 29  b(pStmt,0), 100)
224b0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69  ;.    sqlite3_fi
224c0 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20  nalize(pStmt);. 
224d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 61 77 5f   }else{.    raw_
224e0 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
224f0 75 6e 61 62 6c 65 20 74 6f 20 72 65 61 64 20 64  unable to read d
22500 61 74 61 62 61 73 65 20 68 65 61 64 65 72 5c 6e  atabase header\n
22510 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  ");.    sqlite3_
22520 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b  finalize(pStmt);
22530 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20  .    return 1;. 
22540 20 7d 0a 20 20 69 20 3d 20 67 65 74 32 62 79 74   }.  i = get2byt
22550 65 49 6e 74 28 61 48 64 72 2b 31 36 29 3b 0a 20  eInt(aHdr+16);. 
22560 20 69 66 28 20 69 3d 3d 31 20 29 20 69 20 3d 20   if( i==1 ) i = 
22570 36 35 35 33 36 3b 0a 20 20 75 74 66 38 5f 70 72  65536;.  utf8_pr
22580 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 2d  intf(p->out, "%-
22590 32 30 73 20 25 64 5c 6e 22 2c 20 22 64 61 74 61  20s %d\n", "data
225a0 62 61 73 65 20 70 61 67 65 20 73 69 7a 65 3a 22  base page size:"
225b0 2c 20 69 29 3b 0a 20 20 75 74 66 38 5f 70 72 69  , i);.  utf8_pri
225c0 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 2d 32  ntf(p->out, "%-2
225d0 30 73 20 25 64 5c 6e 22 2c 20 22 77 72 69 74 65  0s %d\n", "write
225e0 20 66 6f 72 6d 61 74 3a 22 2c 20 61 48 64 72 5b   format:", aHdr[
225f0 31 38 5d 29 3b 0a 20 20 75 74 66 38 5f 70 72 69  18]);.  utf8_pri
22600 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 2d 32  ntf(p->out, "%-2
22610 30 73 20 25 64 5c 6e 22 2c 20 22 72 65 61 64 20  0s %d\n", "read 
22620 66 6f 72 6d 61 74 3a 22 2c 20 61 48 64 72 5b 31  format:", aHdr[1
22630 39 5d 29 3b 0a 20 20 75 74 66 38 5f 70 72 69 6e  9]);.  utf8_prin
22640 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 2d 32 30  tf(p->out, "%-20
22650 73 20 25 64 5c 6e 22 2c 20 22 72 65 73 65 72 76  s %d\n", "reserv
22660 65 64 20 62 79 74 65 73 3a 22 2c 20 61 48 64 72  ed bytes:", aHdr
22670 5b 32 30 5d 29 3b 0a 20 20 66 6f 72 28 69 3d 30  [20]);.  for(i=0
22680 3b 20 69 3c 41 72 72 61 79 53 69 7a 65 28 61 46  ; i<ArraySize(aF
22690 69 65 6c 64 29 3b 20 69 2b 2b 29 7b 0a 20 20 20  ield); i++){.   
226a0 20 69 6e 74 20 6f 66 73 74 20 3d 20 61 46 69 65   int ofst = aFie
226b0 6c 64 5b 69 5d 2e 6f 66 73 74 3b 0a 20 20 20 20  ld[i].ofst;.    
226c0 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 76 61 6c  unsigned int val
226d0 20 3d 20 67 65 74 34 62 79 74 65 49 6e 74 28 61   = get4byteInt(a
226e0 48 64 72 20 2b 20 6f 66 73 74 29 3b 0a 20 20 20  Hdr + ofst);.   
226f0 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e   utf8_printf(p->
22700 6f 75 74 2c 20 22 25 2d 32 30 73 20 25 75 22 2c  out, "%-20s %u",
22710 20 61 46 69 65 6c 64 5b 69 5d 2e 7a 4e 61 6d 65   aField[i].zName
22720 2c 20 76 61 6c 29 3b 0a 20 20 20 20 73 77 69 74  , val);.    swit
22730 63 68 28 20 6f 66 73 74 20 29 7b 0a 20 20 20 20  ch( ofst ){.    
22740 20 20 63 61 73 65 20 35 36 3a 20 7b 0a 20 20 20    case 56: {.   
22750 20 20 20 20 20 69 66 28 20 76 61 6c 3d 3d 31 20       if( val==1 
22760 29 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e  ) raw_printf(p->
22770 6f 75 74 2c 20 22 20 28 75 74 66 38 29 22 29 3b  out, " (utf8)");
22780 0a 20 20 20 20 20 20 20 20 69 66 28 20 76 61 6c  .        if( val
22790 3d 3d 32 20 29 20 72 61 77 5f 70 72 69 6e 74 66  ==2 ) raw_printf
227a0 28 70 2d 3e 6f 75 74 2c 20 22 20 28 75 74 66 31  (p->out, " (utf1
227b0 36 6c 65 29 22 29 3b 0a 20 20 20 20 20 20 20 20  6le)");.        
227c0 69 66 28 20 76 61 6c 3d 3d 33 20 29 20 72 61 77  if( val==3 ) raw
227d0 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
227e0 22 20 28 75 74 66 31 36 62 65 29 22 29 3b 0a 20  " (utf16be)");. 
227f0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
22800 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f   raw_printf(p->o
22810 75 74 2c 20 22 5c 6e 22 29 3b 0a 20 20 7d 0a 20  ut, "\n");.  }. 
22820 20 69 66 28 20 7a 44 62 3d 3d 30 20 29 7b 0a 20   if( zDb==0 ){. 
22830 20 20 20 7a 53 63 68 65 6d 61 54 61 62 20 3d 20     zSchemaTab = 
22840 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
22850 22 6d 61 69 6e 2e 73 71 6c 69 74 65 5f 6d 61 73  "main.sqlite_mas
22860 74 65 72 22 29 3b 0a 20 20 7d 65 6c 73 65 20 69  ter");.  }else i
22870 66 28 20 73 74 72 63 6d 70 28 7a 44 62 2c 22 74  f( strcmp(zDb,"t
22880 65 6d 70 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  emp")==0 ){.    
22890 7a 53 63 68 65 6d 61 54 61 62 20 3d 20 73 71 6c  zSchemaTab = sql
228a0 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73  ite3_mprintf("%s
228b0 22 2c 20 22 73 71 6c 69 74 65 5f 74 65 6d 70 5f  ", "sqlite_temp_
228c0 6d 61 73 74 65 72 22 29 3b 0a 20 20 7d 65 6c 73  master");.  }els
228d0 65 7b 0a 20 20 20 20 7a 53 63 68 65 6d 61 54 61  e{.    zSchemaTa
228e0 62 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  b = sqlite3_mpri
228f0 6e 74 66 28 22 5c 22 25 77 5c 22 2e 73 71 6c 69  ntf("\"%w\".sqli
22900 74 65 5f 6d 61 73 74 65 72 22 2c 20 7a 44 62 29  te_master", zDb)
22910 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b  ;.  }.  for(i=0;
22920 20 69 3c 41 72 72 61 79 53 69 7a 65 28 61 51 75   i<ArraySize(aQu
22930 65 72 79 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  ery); i++){.    
22940 63 68 61 72 20 2a 7a 53 71 6c 20 3d 20 73 71 6c  char *zSql = sql
22950 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 61 51 75  ite3_mprintf(aQu
22960 65 72 79 5b 69 5d 2e 7a 53 71 6c 2c 20 7a 53 63  ery[i].zSql, zSc
22970 68 65 6d 61 54 61 62 29 3b 0a 20 20 20 20 69 6e  hemaTab);.    in
22980 74 20 76 61 6c 20 3d 20 64 62 5f 69 6e 74 28 70  t val = db_int(p
22990 2c 20 7a 53 71 6c 29 3b 0a 20 20 20 20 73 71 6c  , zSql);.    sql
229a0 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b  ite3_free(zSql);
229b0 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66  .    utf8_printf
229c0 28 70 2d 3e 6f 75 74 2c 20 22 25 2d 32 30 73 20  (p->out, "%-20s 
229d0 25 64 5c 6e 22 2c 20 61 51 75 65 72 79 5b 69 5d  %d\n", aQuery[i]
229e0 2e 7a 4e 61 6d 65 2c 20 76 61 6c 29 3b 0a 20 20  .zName, val);.  
229f0 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  }.  sqlite3_free
22a00 28 7a 53 63 68 65 6d 61 54 61 62 29 3b 0a 20 20  (zSchemaTab);.  
22a10 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e  sqlite3_file_con
22a20 74 72 6f 6c 28 70 2d 3e 64 62 2c 20 7a 44 62 2c  trol(p->db, zDb,
22a30 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 44 41   SQLITE_FCNTL_DA
22a40 54 41 5f 56 45 52 53 49 4f 4e 2c 20 26 69 44 61  TA_VERSION, &iDa
22a50 74 61 56 65 72 73 69 6f 6e 29 3b 0a 20 20 75 74  taVersion);.  ut
22a60 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  f8_printf(p->out
22a70 2c 20 22 25 2d 32 30 73 20 25 75 5c 6e 22 2c 20  , "%-20s %u\n", 
22a80 22 64 61 74 61 20 76 65 72 73 69 6f 6e 22 2c 20  "data version", 
22a90 69 44 61 74 61 56 65 72 73 69 6f 6e 29 3b 0a 20  iDataVersion);. 
22aa0 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
22ab0 0a 2a 2a 20 50 72 69 6e 74 20 74 68 65 20 63 75  .** Print the cu
22ac0 72 72 65 6e 74 20 73 71 6c 69 74 65 33 5f 65 72  rrent sqlite3_er
22ad0 72 6d 73 67 28 29 20 76 61 6c 75 65 20 74 6f 20  rmsg() value to 
22ae0 73 74 64 65 72 72 20 61 6e 64 20 72 65 74 75 72  stderr and retur
22af0 6e 20 31 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  n 1..*/.static i
22b00 6e 74 20 73 68 65 6c 6c 44 61 74 61 62 61 73 65  nt shellDatabase
22b10 45 72 72 6f 72 28 73 71 6c 69 74 65 33 20 2a 64  Error(sqlite3 *d
22b20 62 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  b){.  const char
22b30 20 2a 7a 45 72 72 20 3d 20 73 71 6c 69 74 65 33   *zErr = sqlite3
22b40 5f 65 72 72 6d 73 67 28 64 62 29 3b 0a 20 20 75  _errmsg(db);.  u
22b50 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72  tf8_printf(stder
22b60 72 2c 20 22 45 72 72 6f 72 3a 20 25 73 5c 6e 22  r, "Error: %s\n"
22b70 2c 20 7a 45 72 72 29 3b 0a 20 20 72 65 74 75 72  , zErr);.  retur
22b80 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  n 1;.}../*.** Co
22b90 6d 70 61 72 65 20 74 68 65 20 70 61 74 74 65 72  mpare the patter
22ba0 6e 20 69 6e 20 7a 47 6c 6f 62 5b 5d 20 61 67 61  n in zGlob[] aga
22bb0 69 6e 73 74 20 74 68 65 20 74 65 78 74 20 69 6e  inst the text in
22bc0 20 7a 5b 5d 2e 20 20 52 65 74 75 72 6e 20 54 52   z[].  Return TR
22bd0 55 45 0a 2a 2a 20 69 66 20 74 68 65 79 20 6d 61  UE.** if they ma
22be0 74 63 68 20 61 6e 64 20 46 41 4c 53 45 20 28 30  tch and FALSE (0
22bf0 29 20 69 66 20 74 68 65 79 20 64 6f 20 6e 6f 74  ) if they do not
22c00 20 6d 61 74 63 68 2e 0a 2a 2a 0a 2a 2a 20 47 6c   match..**.** Gl
22c10 6f 62 62 69 6e 67 20 72 75 6c 65 73 3a 0a 2a 2a  obbing rules:.**
22c20 0a 2a 2a 20 20 20 20 20 20 27 2a 27 20 20 20 20  .**      '*'    
22c30 20 20 20 4d 61 74 63 68 65 73 20 61 6e 79 20 73     Matches any s
22c40 65 71 75 65 6e 63 65 20 6f 66 20 7a 65 72 6f 20  equence of zero 
22c50 6f 72 20 6d 6f 72 65 20 63 68 61 72 61 63 74 65  or more characte
22c60 72 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 27  rs..**.**      '
22c70 3f 27 20 20 20 20 20 20 20 4d 61 74 63 68 65 73  ?'       Matches
22c80 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 63 68 61   exactly one cha
22c90 72 61 63 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 20 20  racter..**.**   
22ca0 20 20 5b 2e 2e 2e 5d 20 20 20 20 20 20 4d 61 74    [...]      Mat
22cb0 63 68 65 73 20 6f 6e 65 20 63 68 61 72 61 63 74  ches one charact
22cc0 65 72 20 66 72 6f 6d 20 74 68 65 20 65 6e 63 6c  er from the encl
22cd0 6f 73 65 64 20 6c 69 73 74 20 6f 66 0a 2a 2a 20  osed list of.** 
22ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63                 c
22cf0 68 61 72 61 63 74 65 72 73 2e 0a 2a 2a 0a 2a 2a  haracters..**.**
22d00 20 20 20 20 20 5b 5e 2e 2e 2e 5d 20 20 20 20 20       [^...]     
22d10 4d 61 74 63 68 65 73 20 6f 6e 65 20 63 68 61 72  Matches one char
22d20 61 63 74 65 72 20 6e 6f 74 20 69 6e 20 74 68 65  acter not in the
22d30 20 65 6e 63 6c 6f 73 65 64 20 6c 69 73 74 2e 0a   enclosed list..
22d40 2a 2a 0a 2a 2a 20 20 20 20 20 20 27 23 27 20 20  **.**      '#'  
22d50 20 20 20 20 20 4d 61 74 63 68 65 73 20 61 6e 79       Matches any
22d60 20 73 65 71 75 65 6e 63 65 20 6f 66 20 6f 6e 65   sequence of one
22d70 20 6f 72 20 6d 6f 72 65 20 64 69 67 69 74 73 20   or more digits 
22d80 77 69 74 68 20 61 6e 0a 2a 2a 20 20 20 20 20 20  with an.**      
22d90 20 20 20 20 20 20 20 20 20 20 6f 70 74 69 6f 6e            option
22da0 61 6c 20 2b 20 6f 72 20 2d 20 73 69 67 6e 20 69  al + or - sign i
22db0 6e 20 66 72 6f 6e 74 0a 2a 2a 0a 2a 2a 20 20 20  n front.**.**   
22dc0 20 20 20 27 20 27 20 20 20 20 20 20 20 41 6e 79     ' '       Any
22dd0 20 73 70 61 6e 20 6f 66 20 77 68 69 74 65 73 70   span of whitesp
22de0 61 63 65 20 6d 61 74 63 68 65 73 20 61 6e 79 20  ace matches any 
22df0 6f 74 68 65 72 20 73 70 61 6e 20 6f 66 0a 2a 2a  other span of.**
22e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22e10 77 68 69 74 65 73 70 61 63 65 2e 0a 2a 2a 0a 2a  whitespace..**.*
22e20 2a 20 45 78 74 72 61 20 77 68 69 74 65 73 70 61  * Extra whitespa
22e30 63 65 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  ce at the end of
22e40 20 7a 5b 5d 20 69 73 20 69 67 6e 6f 72 65 64 2e   z[] is ignored.
22e50 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
22e60 65 73 74 63 61 73 65 5f 67 6c 6f 62 28 63 6f 6e  estcase_glob(con
22e70 73 74 20 63 68 61 72 20 2a 7a 47 6c 6f 62 2c 20  st char *zGlob, 
22e80 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a  const char *z){.
22e90 20 20 69 6e 74 20 63 2c 20 63 32 3b 0a 20 20 69    int c, c2;.  i
22ea0 6e 74 20 69 6e 76 65 72 74 3b 0a 20 20 69 6e 74  nt invert;.  int
22eb0 20 73 65 65 6e 3b 0a 0a 20 20 77 68 69 6c 65 28   seen;..  while(
22ec0 20 28 63 20 3d 20 28 2a 28 7a 47 6c 6f 62 2b 2b   (c = (*(zGlob++
22ed0 29 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 66  )))!=0 ){.    if
22ee0 28 20 49 73 53 70 61 63 65 28 63 29 20 29 7b 0a  ( IsSpace(c) ){.
22ef0 20 20 20 20 20 20 69 66 28 20 21 49 73 53 70 61        if( !IsSpa
22f00 63 65 28 2a 7a 29 20 29 20 72 65 74 75 72 6e 20  ce(*z) ) return 
22f10 30 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  0;.      while( 
22f20 49 73 53 70 61 63 65 28 2a 7a 47 6c 6f 62 29 20  IsSpace(*zGlob) 
22f30 29 20 7a 47 6c 6f 62 2b 2b 3b 0a 20 20 20 20 20  ) zGlob++;.     
22f40 20 77 68 69 6c 65 28 20 49 73 53 70 61 63 65 28   while( IsSpace(
22f50 2a 7a 29 20 29 20 7a 2b 2b 3b 0a 20 20 20 20 7d  *z) ) z++;.    }
22f60 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 2a 27 20  else if( c=='*' 
22f70 29 7b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  ){.      while( 
22f80 28 63 3d 28 2a 28 7a 47 6c 6f 62 2b 2b 29 29 29  (c=(*(zGlob++)))
22f90 20 3d 3d 20 27 2a 27 20 7c 7c 20 63 3d 3d 27 3f   == '*' || c=='?
22fa0 27 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ' ){.        if(
22fb0 20 63 3d 3d 27 3f 27 20 26 26 20 28 2a 28 7a 2b   c=='?' && (*(z+
22fc0 2b 29 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  +))==0 ) return 
22fd0 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  0;.      }.     
22fe0 20 69 66 28 20 63 3d 3d 30 20 29 7b 0a 20 20 20   if( c==0 ){.   
22ff0 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
23000 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63       }else if( c
23010 3d 3d 27 5b 27 20 29 7b 0a 20 20 20 20 20 20 20  =='[' ){.       
23020 20 77 68 69 6c 65 28 20 2a 7a 20 26 26 20 74 65   while( *z && te
23030 73 74 63 61 73 65 5f 67 6c 6f 62 28 7a 47 6c 6f  stcase_glob(zGlo
23040 62 2d 31 2c 7a 29 3d 3d 30 20 29 7b 0a 20 20 20  b-1,z)==0 ){.   
23050 20 20 20 20 20 20 20 7a 2b 2b 3b 0a 20 20 20 20         z++;.    
23060 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65      }.        re
23070 74 75 72 6e 20 28 2a 7a 29 21 3d 30 3b 0a 20 20  turn (*z)!=0;.  
23080 20 20 20 20 7d 0a 20 20 20 20 20 20 77 68 69 6c      }.      whil
23090 65 28 20 28 63 32 20 3d 20 28 2a 28 7a 2b 2b 29  e( (c2 = (*(z++)
230a0 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ))!=0 ){.       
230b0 20 77 68 69 6c 65 28 20 63 32 21 3d 63 20 29 7b   while( c2!=c ){
230c0 0a 20 20 20 20 20 20 20 20 20 20 63 32 20 3d 20  .          c2 = 
230d0 2a 28 7a 2b 2b 29 3b 0a 20 20 20 20 20 20 20 20  *(z++);.        
230e0 20 20 69 66 28 20 63 32 3d 3d 30 20 29 20 72 65    if( c2==0 ) re
230f0 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 20 20  turn 0;.        
23100 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 74 65  }.        if( te
23110 73 74 63 61 73 65 5f 67 6c 6f 62 28 7a 47 6c 6f  stcase_glob(zGlo
23120 62 2c 7a 29 20 29 20 72 65 74 75 72 6e 20 31 3b  b,z) ) return 1;
23130 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
23140 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 65 6c  eturn 0;.    }el
23150 73 65 20 69 66 28 20 63 3d 3d 27 3f 27 20 29 7b  se if( c=='?' ){
23160 0a 20 20 20 20 20 20 69 66 28 20 28 2a 28 7a 2b  .      if( (*(z+
23170 2b 29 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  +))==0 ) return 
23180 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  0;.    }else if(
23190 20 63 3d 3d 27 5b 27 20 29 7b 0a 20 20 20 20 20   c=='[' ){.     
231a0 20 69 6e 74 20 70 72 69 6f 72 5f 63 20 3d 20 30   int prior_c = 0
231b0 3b 0a 20 20 20 20 20 20 73 65 65 6e 20 3d 20 30  ;.      seen = 0
231c0 3b 0a 20 20 20 20 20 20 69 6e 76 65 72 74 20 3d  ;.      invert =
231d0 20 30 3b 0a 20 20 20 20 20 20 63 20 3d 20 2a 28   0;.      c = *(
231e0 7a 2b 2b 29 3b 0a 20 20 20 20 20 20 69 66 28 20  z++);.      if( 
231f0 63 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  c==0 ) return 0;
23200 0a 20 20 20 20 20 20 63 32 20 3d 20 2a 28 7a 47  .      c2 = *(zG
23210 6c 6f 62 2b 2b 29 3b 0a 20 20 20 20 20 20 69 66  lob++);.      if
23220 28 20 63 32 3d 3d 27 5e 27 20 29 7b 0a 20 20 20  ( c2=='^' ){.   
23230 20 20 20 20 20 69 6e 76 65 72 74 20 3d 20 31 3b       invert = 1;
23240 0a 20 20 20 20 20 20 20 20 63 32 20 3d 20 2a 28  .        c2 = *(
23250 7a 47 6c 6f 62 2b 2b 29 3b 0a 20 20 20 20 20 20  zGlob++);.      
23260 7d 0a 20 20 20 20 20 20 69 66 28 20 63 32 3d 3d  }.      if( c2==
23270 27 5d 27 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ']' ){.        i
23280 66 28 20 63 3d 3d 27 5d 27 20 29 20 73 65 65 6e  f( c==']' ) seen
23290 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 63 32   = 1;.        c2
232a0 20 3d 20 2a 28 7a 47 6c 6f 62 2b 2b 29 3b 0a 20   = *(zGlob++);. 
232b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 77 68 69       }.      whi
232c0 6c 65 28 20 63 32 20 26 26 20 63 32 21 3d 27 5d  le( c2 && c2!=']
232d0 27 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ' ){.        if(
232e0 20 63 32 3d 3d 27 2d 27 20 26 26 20 7a 47 6c 6f   c2=='-' && zGlo
232f0 62 5b 30 5d 21 3d 27 5d 27 20 26 26 20 7a 47 6c  b[0]!=']' && zGl
23300 6f 62 5b 30 5d 21 3d 30 20 26 26 20 70 72 69 6f  ob[0]!=0 && prio
23310 72 5f 63 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  r_c>0 ){.       
23320 20 20 20 63 32 20 3d 20 2a 28 7a 47 6c 6f 62 2b     c2 = *(zGlob+
23330 2b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  +);.          if
23340 28 20 63 3e 3d 70 72 69 6f 72 5f 63 20 26 26 20  ( c>=prior_c && 
23350 63 3c 3d 63 32 20 29 20 73 65 65 6e 20 3d 20 31  c<=c2 ) seen = 1
23360 3b 0a 20 20 20 20 20 20 20 20 20 20 70 72 69 6f  ;.          prio
23370 72 5f 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  r_c = 0;.       
23380 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
23390 20 20 69 66 28 20 63 3d 3d 63 32 20 29 7b 0a 20    if( c==c2 ){. 
233a0 20 20 20 20 20 20 20 20 20 20 20 73 65 65 6e 20             seen 
233b0 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  = 1;.          }
233c0 0a 20 20 20 20 20 20 20 20 20 20 70 72 69 6f 72  .          prior
233d0 5f 63 20 3d 20 63 32 3b 0a 20 20 20 20 20 20 20  _c = c2;.       
233e0 20 7d 0a 20 20 20 20 20 20 20 20 63 32 20 3d 20   }.        c2 = 
233f0 2a 28 7a 47 6c 6f 62 2b 2b 29 3b 0a 20 20 20 20  *(zGlob++);.    
23400 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63 32    }.      if( c2
23410 3d 3d 30 20 7c 7c 20 28 73 65 65 6e 20 5e 20 69  ==0 || (seen ^ i
23420 6e 76 65 72 74 29 3d 3d 30 20 29 20 72 65 74 75  nvert)==0 ) retu
23430 72 6e 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20  rn 0;.    }else 
23440 69 66 28 20 63 3d 3d 27 23 27 20 29 7b 0a 20 20  if( c=='#' ){.  
23450 20 20 20 20 69 66 28 20 28 7a 5b 30 5d 3d 3d 27      if( (z[0]=='
23460 2d 27 20 7c 7c 20 7a 5b 30 5d 3d 3d 27 2b 27 29  -' || z[0]=='+')
23470 20 26 26 20 49 73 44 69 67 69 74 28 7a 5b 31 5d   && IsDigit(z[1]
23480 29 20 29 20 7a 2b 2b 3b 0a 20 20 20 20 20 20 69  ) ) z++;.      i
23490 66 28 20 21 49 73 44 69 67 69 74 28 7a 5b 30 5d  f( !IsDigit(z[0]
234a0 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  ) ) return 0;.  
234b0 20 20 20 20 7a 2b 2b 3b 0a 20 20 20 20 20 20 77      z++;.      w
234c0 68 69 6c 65 28 20 49 73 44 69 67 69 74 28 7a 5b  hile( IsDigit(z[
234d0 30 5d 29 20 29 7b 20 7a 2b 2b 3b 20 7d 0a 20 20  0]) ){ z++; }.  
234e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
234f0 66 28 20 63 21 3d 28 2a 28 7a 2b 2b 29 29 20 29  f( c!=(*(z++)) )
23500 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
23510 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 49 73  .  }.  while( Is
23520 53 70 61 63 65 28 2a 7a 29 20 29 7b 20 7a 2b 2b  Space(*z) ){ z++
23530 3b 20 7d 0a 20 20 72 65 74 75 72 6e 20 2a 7a 3d  ; }.  return *z=
23540 3d 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f  =0;.}.../*.** Co
23550 6d 70 61 72 65 20 74 68 65 20 73 74 72 69 6e 67  mpare the string
23560 20 61 73 20 61 20 63 6f 6d 6d 61 6e 64 2d 6c 69   as a command-li
23570 6e 65 20 6f 70 74 69 6f 6e 20 77 69 74 68 20 65  ne option with e
23580 69 74 68 65 72 20 6f 6e 65 20 6f 72 20 74 77 6f  ither one or two
23590 0a 2a 2a 20 69 6e 69 74 69 61 6c 20 22 2d 22 20  .** initial "-" 
235a0 63 68 61 72 61 63 74 65 72 73 2e 0a 2a 2f 0a 73  characters..*/.s
235b0 74 61 74 69 63 20 69 6e 74 20 6f 70 74 69 6f 6e  tatic int option
235c0 4d 61 74 63 68 28 63 6f 6e 73 74 20 63 68 61 72  Match(const char
235d0 20 2a 7a 53 74 72 2c 20 63 6f 6e 73 74 20 63 68   *zStr, const ch
235e0 61 72 20 2a 7a 4f 70 74 29 7b 0a 20 20 69 66 28  ar *zOpt){.  if(
235f0 20 7a 53 74 72 5b 30 5d 21 3d 27 2d 27 20 29 20   zStr[0]!='-' ) 
23600 72 65 74 75 72 6e 20 30 3b 0a 20 20 7a 53 74 72  return 0;.  zStr
23610 2b 2b 3b 0a 20 20 69 66 28 20 7a 53 74 72 5b 30  ++;.  if( zStr[0
23620 5d 3d 3d 27 2d 27 20 29 20 7a 53 74 72 2b 2b 3b  ]=='-' ) zStr++;
23630 0a 20 20 72 65 74 75 72 6e 20 73 74 72 63 6d 70  .  return strcmp
23640 28 7a 53 74 72 2c 20 7a 4f 70 74 29 3d 3d 30 3b  (zStr, zOpt)==0;
23650 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65  .}../*.** Delete
23660 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a 69 6e 74 20   a file..*/.int 
23670 73 68 65 6c 6c 44 65 6c 65 74 65 46 69 6c 65 28  shellDeleteFile(
23680 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
23690 65 6e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 72 63  ename){.  int rc
236a0 3b 0a 23 69 66 64 65 66 20 5f 57 49 4e 33 32 0a  ;.#ifdef _WIN32.
236b0 20 20 77 63 68 61 72 5f 74 20 2a 7a 20 3d 20 73    wchar_t *z = s
236c0 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 75 74 66  qlite3_win32_utf
236d0 38 5f 74 6f 5f 75 6e 69 63 6f 64 65 28 7a 46 69  8_to_unicode(zFi
236e0 6c 65 6e 61 6d 65 29 3b 0a 20 20 72 63 20 3d 20  lename);.  rc = 
236f0 5f 77 75 6e 6c 69 6e 6b 28 7a 29 3b 0a 20 20 73  _wunlink(z);.  s
23700 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a  qlite3_free(z);.
23710 23 65 6c 73 65 0a 20 20 72 63 20 3d 20 75 6e 6c  #else.  rc = unl
23720 69 6e 6b 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  ink(zFilename);.
23730 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20  #endif.  return 
23740 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 79  rc;.}../*.** Try
23750 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 74   to delete the t
23760 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 28 69  emporary file (i
23770 66 20 74 68 65 72 65 20 69 73 20 6f 6e 65 29 20  f there is one) 
23780 61 6e 64 20 66 72 65 65 20 74 68 65 0a 2a 2a 20  and free the.** 
23790 6d 65 6d 6f 72 79 20 75 73 65 64 20 74 6f 20 68  memory used to h
237a0 6f 6c 64 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  old the name of 
237b0 74 68 65 20 74 65 6d 70 20 66 69 6c 65 2e 0a 2a  the temp file..*
237c0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6c  /.static void cl
237d0 65 61 72 54 65 6d 70 46 69 6c 65 28 53 68 65 6c  earTempFile(Shel
237e0 6c 53 74 61 74 65 20 2a 70 29 7b 0a 20 20 69 66  lState *p){.  if
237f0 28 20 70 2d 3e 7a 54 65 6d 70 46 69 6c 65 3d 3d  ( p->zTempFile==
23800 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  0 ) return;.  if
23810 28 20 70 2d 3e 64 6f 58 64 67 4f 70 65 6e 20 29  ( p->doXdgOpen )
23820 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 73   return;.  if( s
23830 68 65 6c 6c 44 65 6c 65 74 65 46 69 6c 65 28 70  hellDeleteFile(p
23840 2d 3e 7a 54 65 6d 70 46 69 6c 65 29 20 29 20 72  ->zTempFile) ) r
23850 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33  eturn;.  sqlite3
23860 5f 66 72 65 65 28 70 2d 3e 7a 54 65 6d 70 46 69  _free(p->zTempFi
23870 6c 65 29 3b 0a 20 20 70 2d 3e 7a 54 65 6d 70 46  le);.  p->zTempF
23880 69 6c 65 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  ile = 0;.}../*.*
23890 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 74  * Create a new t
238a0 65 6d 70 20 66 69 6c 65 20 6e 61 6d 65 20 77 69  emp file name wi
238b0 74 68 20 74 68 65 20 67 69 76 65 6e 20 73 75 66  th the given suf
238c0 66 69 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  fix..*/.static v
238d0 6f 69 64 20 6e 65 77 54 65 6d 70 46 69 6c 65 28  oid newTempFile(
238e0 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 2c 20 63  ShellState *p, c
238f0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 75 66 66  onst char *zSuff
23900 69 78 29 7b 0a 20 20 63 6c 65 61 72 54 65 6d 70  ix){.  clearTemp
23910 46 69 6c 65 28 70 29 3b 0a 20 20 73 71 6c 69 74  File(p);.  sqlit
23920 65 33 5f 66 72 65 65 28 70 2d 3e 7a 54 65 6d 70  e3_free(p->zTemp
23930 46 69 6c 65 29 3b 0a 20 20 70 2d 3e 7a 54 65 6d  File);.  p->zTem
23940 70 46 69 6c 65 20 3d 20 30 3b 0a 20 20 69 66 28  pFile = 0;.  if(
23950 20 70 2d 3e 64 62 20 29 7b 0a 20 20 20 20 73 71   p->db ){.    sq
23960 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72  lite3_file_contr
23970 6f 6c 28 70 2d 3e 64 62 2c 20 30 2c 20 53 51 4c  ol(p->db, 0, SQL
23980 49 54 45 5f 46 43 4e 54 4c 5f 54 45 4d 50 46 49  ITE_FCNTL_TEMPFI
23990 4c 45 4e 41 4d 45 2c 20 26 70 2d 3e 7a 54 65 6d  LENAME, &p->zTem
239a0 70 46 69 6c 65 29 3b 0a 20 20 7d 0a 20 20 69 66  pFile);.  }.  if
239b0 28 20 70 2d 3e 7a 54 65 6d 70 46 69 6c 65 3d 3d  ( p->zTempFile==
239c0 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
239d0 5f 75 69 6e 74 36 34 20 72 3b 0a 20 20 20 20 73  _uint64 r;.    s
239e0 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73  qlite3_randomnes
239f0 73 28 73 69 7a 65 6f 66 28 72 29 2c 20 26 72 29  s(sizeof(r), &r)
23a00 3b 0a 20 20 20 20 70 2d 3e 7a 54 65 6d 70 46 69  ;.    p->zTempFi
23a10 6c 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  le = sqlite3_mpr
23a20 69 6e 74 66 28 22 74 65 6d 70 25 6c 6c 78 2e 25  intf("temp%llx.%
23a30 73 22 2c 20 72 2c 20 7a 53 75 66 66 69 78 29 3b  s", r, zSuffix);
23a40 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 2d  .  }else{.    p-
23a50 3e 7a 54 65 6d 70 46 69 6c 65 20 3d 20 73 71 6c  >zTempFile = sql
23a60 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 7a  ite3_mprintf("%z
23a70 2e 25 73 22 2c 20 70 2d 3e 7a 54 65 6d 70 46 69  .%s", p->zTempFi
23a80 6c 65 2c 20 7a 53 75 66 66 69 78 29 3b 0a 20 20  le, zSuffix);.  
23a90 7d 0a 20 20 69 66 28 20 70 2d 3e 7a 54 65 6d 70  }.  if( p->zTemp
23aa0 46 69 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72  File==0 ){.    r
23ab0 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  aw_printf(stderr
23ac0 2c 20 22 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79  , "out of memory
23ad0 5c 6e 22 29 3b 0a 20 20 20 20 65 78 69 74 28 31  \n");.    exit(1
23ae0 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  );.  }.}.../*.**
23af0 20 54 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74   The implementat
23b00 69 6f 6e 20 6f 66 20 53 51 4c 20 73 63 61 6c 61  ion of SQL scala
23b10 72 20 66 75 6e 63 74 69 6f 6e 20 66 6b 65 79 5f  r function fkey_
23b20 63 6f 6c 6c 61 74 65 5f 63 6c 61 75 73 65 28 29  collate_clause()
23b30 2c 20 75 73 65 64 0a 2a 2a 20 62 79 20 74 68 65  , used.** by the
23b40 20 22 2e 6c 69 6e 74 20 66 6b 65 79 2d 69 6e 64   ".lint fkey-ind
23b50 65 78 65 73 22 20 63 6f 6d 6d 61 6e 64 2e 20 54  exes" command. T
23b60 68 69 73 20 73 63 61 6c 61 72 20 66 75 6e 63 74  his scalar funct
23b70 69 6f 6e 20 69 73 20 61 6c 77 61 79 73 0a 2a 2a  ion is always.**
23b80 20 63 61 6c 6c 65 64 20 77 69 74 68 20 66 6f 75   called with fou
23b90 72 20 61 72 67 75 6d 65 6e 74 73 20 2d 20 74 68  r arguments - th
23ba0 65 20 70 61 72 65 6e 74 20 74 61 62 6c 65 20 6e  e parent table n
23bb0 61 6d 65 2c 20 74 68 65 20 70 61 72 65 6e 74 20  ame, the parent 
23bc0 63 6f 6c 75 6d 6e 20 6e 61 6d 65 2c 0a 2a 2a 20  column name,.** 
23bd0 74 68 65 20 63 68 69 6c 64 20 74 61 62 6c 65 20  the child table 
23be0 6e 61 6d 65 20 61 6e 64 20 74 68 65 20 63 68 69  name and the chi
23bf0 6c 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 2e 0a  ld column name..
23c00 2a 2a 0a 2a 2a 20 20 20 66 6b 65 79 5f 63 6f 6c  **.**   fkey_col
23c10 6c 61 74 65 5f 63 6c 61 75 73 65 28 27 70 61 72  late_clause('par
23c20 65 6e 74 2d 74 61 62 27 2c 20 27 70 61 72 65 6e  ent-tab', 'paren
23c30 74 2d 63 6f 6c 27 2c 20 27 63 68 69 6c 64 2d 74  t-col', 'child-t
23c40 61 62 27 2c 20 27 63 68 69 6c 64 2d 63 6f 6c 27  ab', 'child-col'
23c50 29 0a 2a 2a 0a 2a 2a 20 49 66 20 65 69 74 68 65  ).**.** If eithe
23c60 72 20 6f 66 20 74 68 65 20 6e 61 6d 65 64 20 74  r of the named t
23c70 61 62 6c 65 73 20 6f 72 20 63 6f 6c 75 6d 6e 73  ables or columns
23c80 20 64 6f 20 6e 6f 74 20 65 78 69 73 74 2c 20 74   do not exist, t
23c90 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  his function.** 
23ca0 72 65 74 75 72 6e 73 20 61 6e 20 65 6d 70 74 79  returns an empty
23cb0 20 73 74 72 69 6e 67 2e 20 41 6e 20 65 6d 70 74   string. An empt
23cc0 79 20 73 74 72 69 6e 67 20 69 73 20 61 6c 73 6f  y string is also
23cd0 20 72 65 74 75 72 6e 65 64 20 69 66 20 62 6f 74   returned if bot
23ce0 68 20 74 61 62 6c 65 73 0a 2a 2a 20 61 6e 64 20  h tables.** and 
23cf0 63 6f 6c 75 6d 6e 73 20 65 78 69 73 74 20 62 75  columns exist bu
23d00 74 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 20  t have the same 
23d10 64 65 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6f  default collatio
23d20 6e 20 73 65 71 75 65 6e 63 65 2e 20 4f 72 2c 0a  n sequence. Or,.
23d30 2a 2a 20 69 66 20 62 6f 74 68 20 65 78 69 73 74  ** if both exist
23d40 20 62 75 74 20 74 68 65 20 64 65 66 61 75 6c 74   but the default
23d50 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
23d60 6e 63 65 73 20 61 72 65 20 64 69 66 66 65 72 65  nces are differe
23d70 6e 74 2c 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63  nt, this.** func
23d80 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 68 65  tion returns the
23d90 20 73 74 72 69 6e 67 20 22 20 43 4f 4c 4c 41 54   string " COLLAT
23da0 45 20 3c 70 61 72 65 6e 74 2d 63 6f 6c 6c 61 74  E <parent-collat
23db0 69 6f 6e 3e 22 2c 20 77 68 65 72 65 0a 2a 2a 20  ion>", where.** 
23dc0 3c 70 61 72 65 6e 74 2d 63 6f 6c 6c 61 74 69 6f  <parent-collatio
23dd0 6e 3e 20 69 73 20 74 68 65 20 64 65 66 61 75 6c  n> is the defaul
23de0 74 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  t collation sequ
23df0 65 6e 63 65 20 6f 66 20 74 68 65 20 70 61 72 65  ence of the pare
23e00 6e 74 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a 73 74  nt column..*/.st
23e10 61 74 69 63 20 76 6f 69 64 20 73 68 65 6c 6c 46  atic void shellF
23e20 6b 65 79 43 6f 6c 6c 61 74 65 43 6c 61 75 73 65  keyCollateClause
23e30 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74  (.  sqlite3_cont
23e40 65 78 74 20 2a 70 43 74 78 2c 0a 20 20 69 6e 74  ext *pCtx,.  int
23e50 20 6e 56 61 6c 2c 0a 20 20 73 71 6c 69 74 65 33   nVal,.  sqlite3
23e60 5f 76 61 6c 75 65 20 2a 2a 61 70 56 61 6c 0a 29  _value **apVal.)
23e70 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  {.  sqlite3 *db 
23e80 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  = sqlite3_contex
23e90 74 5f 64 62 5f 68 61 6e 64 6c 65 28 70 43 74 78  t_db_handle(pCtx
23ea0 29 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  );.  const char 
23eb0 2a 7a 50 61 72 65 6e 74 3b 0a 20 20 63 6f 6e 73  *zParent;.  cons
23ec0 74 20 63 68 61 72 20 2a 7a 50 61 72 65 6e 74 43  t char *zParentC
23ed0 6f 6c 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  ol;.  const char
23ee0 20 2a 7a 50 61 72 65 6e 74 53 65 71 3b 0a 20 20   *zParentSeq;.  
23ef0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 68 69  const char *zChi
23f00 6c 64 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  ld;.  const char
23f10 20 2a 7a 43 68 69 6c 64 43 6f 6c 3b 0a 20 20 63   *zChildCol;.  c
23f20 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 68 69 6c  onst char *zChil
23f30 64 53 65 71 20 3d 20 30 3b 20 20 2f 2a 20 49 6e  dSeq = 0;  /* In
23f40 69 74 69 61 6c 69 7a 65 20 74 6f 20 61 76 6f 69  itialize to avoi
23f50 64 20 66 61 6c 73 65 2d 70 6f 73 69 74 69 76 65  d false-positive
23f60 20 77 61 72 6e 69 6e 67 20 2a 2f 0a 20 20 69 6e   warning */.  in
23f70 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28  t rc;..  assert(
23f80 20 6e 56 61 6c 3d 3d 34 20 29 3b 0a 20 20 7a 50   nVal==4 );.  zP
23f90 61 72 65 6e 74 20 3d 20 28 63 6f 6e 73 74 20 63  arent = (const c
23fa0 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c  har*)sqlite3_val
23fb0 75 65 5f 74 65 78 74 28 61 70 56 61 6c 5b 30 5d  ue_text(apVal[0]
23fc0 29 3b 0a 20 20 7a 50 61 72 65 6e 74 43 6f 6c 20  );.  zParentCol 
23fd0 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73  = (const char*)s
23fe0 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
23ff0 74 28 61 70 56 61 6c 5b 31 5d 29 3b 0a 20 20 7a  t(apVal[1]);.  z
24000 43 68 69 6c 64 20 3d 20 28 63 6f 6e 73 74 20 63  Child = (const c
24010 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c  har*)sqlite3_val
24020 75 65 5f 74 65 78 74 28 61 70 56 61 6c 5b 32 5d  ue_text(apVal[2]
24030 29 3b 0a 20 20 7a 43 68 69 6c 64 43 6f 6c 20 3d  );.  zChildCol =
24040 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71   (const char*)sq
24050 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
24060 28 61 70 56 61 6c 5b 33 5d 29 3b 0a 0a 20 20 73  (apVal[3]);..  s
24070 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65  qlite3_result_te
24080 78 74 28 70 43 74 78 2c 20 22 22 2c 20 2d 31 2c  xt(pCtx, "", -1,
24090 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b   SQLITE_STATIC);
240a0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
240b0 74 61 62 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d 65 74  table_column_met
240c0 61 64 61 74 61 28 0a 20 20 20 20 20 20 64 62 2c  adata(.      db,
240d0 20 22 6d 61 69 6e 22 2c 20 7a 50 61 72 65 6e 74   "main", zParent
240e0 2c 20 7a 50 61 72 65 6e 74 43 6f 6c 2c 20 30 2c  , zParentCol, 0,
240f0 20 26 7a 50 61 72 65 6e 74 53 65 71 2c 20 30 2c   &zParentSeq, 0,
24100 20 30 2c 20 30 0a 20 20 29 3b 0a 20 20 69 66 28   0, 0.  );.  if(
24110 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
24120 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
24130 65 33 5f 74 61 62 6c 65 5f 63 6f 6c 75 6d 6e 5f  e3_table_column_
24140 6d 65 74 61 64 61 74 61 28 0a 20 20 20 20 20 20  metadata(.      
24150 20 20 64 62 2c 20 22 6d 61 69 6e 22 2c 20 7a 43    db, "main", zC
24160 68 69 6c 64 2c 20 7a 43 68 69 6c 64 43 6f 6c 2c  hild, zChildCol,
24170 20 30 2c 20 26 7a 43 68 69 6c 64 53 65 71 2c 20   0, &zChildSeq, 
24180 30 2c 20 30 2c 20 30 0a 20 20 20 20 29 3b 0a 20  0, 0, 0.    );. 
24190 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   }..  if( rc==SQ
241a0 4c 49 54 45 5f 4f 4b 20 26 26 20 73 71 6c 69 74  LITE_OK && sqlit
241b0 65 33 5f 73 74 72 69 63 6d 70 28 7a 50 61 72 65  e3_stricmp(zPare
241c0 6e 74 53 65 71 2c 20 7a 43 68 69 6c 64 53 65 71  ntSeq, zChildSeq
241d0 29 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  ) ){.    char *z
241e0 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
241f0 74 66 28 22 20 43 4f 4c 4c 41 54 45 20 25 73 22  tf(" COLLATE %s"
24200 2c 20 7a 50 61 72 65 6e 74 53 65 71 29 3b 0a 20  , zParentSeq);. 
24210 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
24220 74 5f 74 65 78 74 28 70 43 74 78 2c 20 7a 2c 20  t_text(pCtx, z, 
24230 2d 31 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53  -1, SQLITE_TRANS
24240 49 45 4e 54 29 3b 0a 20 20 20 20 73 71 6c 69 74  IENT);.    sqlit
24250 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20 7d 0a  e3_free(z);.  }.
24260 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69 6d  }.../*.** The im
24270 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
24280 64 6f 74 2d 63 6f 6d 6d 61 6e 64 20 22 2e 6c 69  dot-command ".li
24290 6e 74 20 66 6b 65 79 2d 69 6e 64 65 78 65 73 22  nt fkey-indexes"
242a0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
242b0 6c 69 6e 74 46 6b 65 79 49 6e 64 65 78 65 73 28  lintFkeyIndexes(
242c0 0a 20 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 70  .  ShellState *p
242d0 53 74 61 74 65 2c 20 20 20 20 20 20 20 20 20 20  State,          
242e0 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 73 68     /* Current sh
242f0 65 6c 6c 20 74 6f 6f 6c 20 73 74 61 74 65 20 2a  ell tool state *
24300 2f 0a 20 20 63 68 61 72 20 2a 2a 61 7a 41 72 67  /.  char **azArg
24310 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
24320 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20      /* Array of 
24330 61 72 67 75 6d 65 6e 74 73 20 70 61 73 73 65 64  arguments passed
24340 20 74 6f 20 64 6f 74 20 63 6f 6d 6d 61 6e 64 20   to dot command 
24350 2a 2f 0a 20 20 69 6e 74 20 6e 41 72 67 20 20 20  */.  int nArg   
24360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24370 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
24380 66 20 65 6e 74 72 69 65 73 20 69 6e 20 61 7a 41  f entries in azA
24390 72 67 5b 5d 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  rg[] */.){.  sql
243a0 69 74 65 33 20 2a 64 62 20 3d 20 70 53 74 61 74  ite3 *db = pStat
243b0 65 2d 3e 64 62 3b 20 20 20 20 20 20 20 2f 2a 20  e->db;       /* 
243c0 44 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  Database handle 
243d0 74 6f 20 71 75 65 72 79 20 22 6d 61 69 6e 22 20  to query "main" 
243e0 64 62 20 6f 66 20 2a 2f 0a 20 20 46 49 4c 45 20  db of */.  FILE 
243f0 2a 6f 75 74 20 3d 20 70 53 74 61 74 65 2d 3e 6f  *out = pState->o
24400 75 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 53 74  ut;        /* St
24410 72 65 61 6d 20 74 6f 20 77 72 69 74 65 20 6e 6f  ream to write no
24420 6e 2d 65 72 72 6f 72 20 6f 75 74 70 75 74 20 74  n-error output t
24430 6f 20 2a 2f 0a 20 20 69 6e 74 20 62 56 65 72 62  o */.  int bVerb
24440 6f 73 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ose = 0;        
24450 20 20 20 20 20 20 20 2f 2a 20 49 66 20 2d 76 65         /* If -ve
24460 72 62 6f 73 65 20 69 73 20 70 72 65 73 65 6e 74  rbose is present
24470 20 2a 2f 0a 20 20 69 6e 74 20 62 47 72 6f 75 70   */.  int bGroup
24480 42 79 50 61 72 65 6e 74 20 3d 20 30 3b 20 20 20  ByParent = 0;   
24490 20 20 20 20 20 20 2f 2a 20 49 66 20 2d 67 72 6f        /* If -gro
244a0 75 70 62 79 70 61 72 65 6e 74 20 69 73 20 70 72  upbyparent is pr
244b0 65 73 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69  esent */.  int i
244c0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
244d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f             /* To
244e0 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68   iterate through
244f0 20 61 7a 41 72 67 5b 5d 20 2a 2f 0a 20 20 63 6f   azArg[] */.  co
24500 6e 73 74 20 63 68 61 72 20 2a 7a 49 6e 64 65 6e  nst char *zInden
24510 74 20 3d 20 22 22 3b 20 20 20 20 20 20 20 2f 2a  t = "";       /*
24520 20 48 6f 77 20 6d 75 63 68 20 74 6f 20 69 6e 64   How much to ind
24530 65 6e 74 20 43 52 45 41 54 45 20 49 4e 44 45 58  ent CREATE INDEX
24540 20 62 79 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b   by */.  int rc;
24550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24560 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
24570 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 73 71 6c  rn code */.  sql
24580 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 71 6c 20  ite3_stmt *pSql 
24590 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  = 0;         /* 
245a0 43 6f 6d 70 69 6c 65 64 20 76 65 72 73 69 6f 6e  Compiled version
245b0 20 6f 66 20 53 51 4c 20 73 74 61 74 65 6d 65 6e   of SQL statemen
245c0 74 20 62 65 6c 6f 77 20 2a 2f 0a 0a 20 20 2f 2a  t below */..  /*
245d0 0a 20 20 2a 2a 20 54 68 69 73 20 53 45 4c 45 43  .  ** This SELEC
245e0 54 20 73 74 61 74 65 6d 65 6e 74 20 72 65 74 75  T statement retu
245f0 72 6e 73 20 6f 6e 65 20 72 6f 77 20 66 6f 72 20  rns one row for 
24600 65 61 63 68 20 66 6f 72 65 69 67 6e 20 6b 65 79  each foreign key
24610 20 63 6f 6e 73 74 72 61 69 6e 74 0a 20 20 2a 2a   constraint.  **
24620 20 69 6e 20 74 68 65 20 73 63 68 65 6d 61 20 6f   in the schema o
24630 66 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62  f the main datab
24640 61 73 65 2e 20 54 68 65 20 63 6f 6c 75 6d 6e 20  ase. The column 
24650 76 61 6c 75 65 73 20 61 72 65 3a 0a 20 20 2a 2a  values are:.  **
24660 0a 20 20 2a 2a 20 30 2e 20 54 68 65 20 74 65 78  .  ** 0. The tex
24670 74 20 6f 66 20 61 6e 20 53 51 4c 20 73 74 61 74  t of an SQL stat
24680 65 6d 65 6e 74 20 73 69 6d 69 6c 61 72 20 74 6f  ement similar to
24690 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  :.  **.  **     
246a0 20 22 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20   "EXPLAIN QUERY 
246b0 50 4c 41 4e 20 53 45 4c 45 43 54 20 31 20 46 52  PLAN SELECT 1 FR
246c0 4f 4d 20 63 68 69 6c 64 5f 74 61 62 6c 65 20 57  OM child_table W
246d0 48 45 52 45 20 63 68 69 6c 64 5f 6b 65 79 3d 3f  HERE child_key=?
246e0 22 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 54  ".  **.  **    T
246f0 68 69 73 20 53 45 4c 45 43 54 20 69 73 20 73 69  his SELECT is si
24700 6d 69 6c 61 72 20 74 6f 20 74 68 65 20 6f 6e 65  milar to the one
24710 20 74 68 61 74 20 74 68 65 20 66 6f 72 65 69 67   that the foreig
24720 6e 20 6b 65 79 73 20 69 6d 70 6c 65 6d 65 6e 74  n keys implement
24730 61 74 69 6f 6e 0a 20 20 2a 2a 20 20 20 20 6e 65  ation.  **    ne
24740 65 64 73 20 74 6f 20 72 75 6e 20 69 6e 74 65 72  eds to run inter
24750 6e 61 6c 6c 79 20 6f 6e 20 63 68 69 6c 64 20 74  nally on child t
24760 61 62 6c 65 73 2e 20 49 66 20 74 68 65 72 65 20  ables. If there 
24770 69 73 20 61 6e 20 69 6e 64 65 78 20 74 68 61 74  is an index that
24780 20 63 61 6e 0a 20 20 2a 2a 20 20 20 20 62 65 20   can.  **    be 
24790 75 73 65 64 20 74 6f 20 6f 70 74 69 6d 69 7a 65  used to optimize
247a0 20 74 68 69 73 20 71 75 65 72 79 2c 20 74 68 65   this query, the
247b0 6e 20 69 74 20 63 61 6e 20 61 6c 73 6f 20 62 65  n it can also be
247c0 20 75 73 65 64 20 62 79 20 74 68 65 20 46 4b 0a   used by the FK.
247d0 20 20 2a 2a 20 20 20 20 69 6d 70 6c 65 6d 65 6e    **    implemen
247e0 74 61 74 69 6f 6e 20 74 6f 20 6f 70 74 69 6d 69  tation to optimi
247f0 7a 65 20 44 45 4c 45 54 45 20 6f 72 20 55 50 44  ze DELETE or UPD
24800 41 54 45 20 73 74 61 74 65 6d 65 6e 74 73 20 6f  ATE statements o
24810 6e 20 74 68 65 20 70 61 72 65 6e 74 0a 20 20 2a  n the parent.  *
24820 2a 20 20 20 20 74 61 62 6c 65 2e 0a 20 20 2a 2a  *    table..  **
24830 0a 20 20 2a 2a 20 31 2e 20 41 20 47 4c 4f 42 20  .  ** 1. A GLOB 
24840 70 61 74 74 65 72 6e 20 73 75 69 74 61 62 6c 65  pattern suitable
24850 20 66 6f 72 20 73 71 6c 69 74 65 33 5f 73 74 72   for sqlite3_str
24860 67 6c 6f 62 28 29 2e 20 49 66 20 74 68 65 20 70  glob(). If the p
24870 6c 61 6e 20 6f 75 74 70 75 74 20 62 79 0a 20 20  lan output by.  
24880 2a 2a 20 20 20 20 74 68 65 20 45 58 50 4c 41 49  **    the EXPLAI
24890 4e 20 51 55 45 52 59 20 50 4c 41 4e 20 63 6f 6d  N QUERY PLAN com
248a0 6d 61 6e 64 20 6d 61 74 63 68 65 73 20 74 68 69  mand matches thi
248b0 73 20 70 61 74 74 65 72 6e 2c 20 74 68 65 6e 20  s pattern, then 
248c0 74 68 65 20 73 63 68 65 6d 61 0a 20 20 2a 2a 20  the schema.  ** 
248d0 20 20 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 69     contains an i
248e0 6e 64 65 78 20 74 68 61 74 20 63 61 6e 20 62 65  ndex that can be
248f0 20 75 73 65 64 20 74 6f 20 6f 70 74 69 6d 69 7a   used to optimiz
24900 65 20 74 68 65 20 71 75 65 72 79 2e 0a 20 20 2a  e the query..  *
24910 2a 0a 20 20 2a 2a 20 32 2e 20 48 75 6d 61 6e 20  *.  ** 2. Human 
24920 72 65 61 64 61 62 6c 65 20 74 65 78 74 20 74 68  readable text th
24930 61 74 20 64 65 73 63 72 69 62 65 73 20 74 68 65  at describes the
24940 20 63 68 69 6c 64 20 74 61 62 6c 65 20 61 6e 64   child table and
24950 20 63 6f 6c 75 6d 6e 73 2e 20 65 2e 67 2e 0a 20   columns. e.g.. 
24960 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 22   **.  **       "
24970 63 68 69 6c 64 5f 74 61 62 6c 65 28 63 68 69 6c  child_table(chil
24980 64 5f 6b 65 79 31 2c 20 63 68 69 6c 64 5f 6b 65  d_key1, child_ke
24990 79 32 29 22 0a 20 20 2a 2a 0a 20 20 2a 2a 20 33  y2)".  **.  ** 3
249a0 2e 20 48 75 6d 61 6e 20 72 65 61 64 61 62 6c 65  . Human readable
249b0 20 74 65 78 74 20 74 68 61 74 20 64 65 73 63 72   text that descr
249c0 69 62 65 73 20 74 68 65 20 70 61 72 65 6e 74 20  ibes the parent 
249d0 74 61 62 6c 65 20 61 6e 64 20 63 6f 6c 75 6d 6e  table and column
249e0 73 2e 20 65 2e 67 2e 0a 20 20 2a 2a 0a 20 20 2a  s. e.g..  **.  *
249f0 2a 20 20 20 20 20 20 20 22 70 61 72 65 6e 74 5f  *       "parent_
24a00 74 61 62 6c 65 28 70 61 72 65 6e 74 5f 6b 65 79  table(parent_key
24a10 31 2c 20 70 61 72 65 6e 74 5f 6b 65 79 32 29 22  1, parent_key2)"
24a20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 34 2e 20 41 20  .  **.  ** 4. A 
24a30 66 75 6c 6c 20 43 52 45 41 54 45 20 49 4e 44 45  full CREATE INDE
24a40 58 20 73 74 61 74 65 6d 65 6e 74 20 66 6f 72 20  X statement for 
24a50 61 6e 20 69 6e 64 65 78 20 74 68 61 74 20 63 6f  an index that co
24a60 75 6c 64 20 62 65 20 75 73 65 64 20 74 6f 0a 20  uld be used to. 
24a70 20 2a 2a 20 20 20 20 6f 70 74 69 6d 69 7a 65 20   **    optimize 
24a80 44 45 4c 45 54 45 20 6f 72 20 55 50 44 41 54 45  DELETE or UPDATE
24a90 20 73 74 61 74 65 6d 65 6e 74 73 20 6f 6e 20 74   statements on t
24aa0 68 65 20 70 61 72 65 6e 74 20 74 61 62 6c 65 2e  he parent table.
24ab0 20 65 2e 67 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20   e.g..  **.  ** 
24ac0 20 20 20 20 20 20 22 43 52 45 41 54 45 20 49 4e        "CREATE IN
24ad0 44 45 58 20 63 68 69 6c 64 5f 74 61 62 6c 65 5f  DEX child_table_
24ae0 63 68 69 6c 64 5f 6b 65 79 20 4f 4e 20 63 68 69  child_key ON chi
24af0 6c 64 5f 74 61 62 6c 65 28 63 68 69 6c 64 5f 6b  ld_table(child_k
24b00 65 79 29 22 0a 20 20 2a 2a 0a 20 20 2a 2a 20 35  ey)".  **.  ** 5
24b10 2e 20 54 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  . The name of th
24b20 65 20 70 61 72 65 6e 74 20 74 61 62 6c 65 2e 0a  e parent table..
24b30 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 73 65 20    **.  ** These 
24b40 73 69 78 20 76 61 6c 75 65 73 20 61 72 65 20 75  six values are u
24b50 73 65 64 20 62 79 20 74 68 65 20 43 20 6c 6f 67  sed by the C log
24b60 69 63 20 62 65 6c 6f 77 20 74 6f 20 67 65 6e 65  ic below to gene
24b70 72 61 74 65 20 74 68 65 20 72 65 70 6f 72 74 2e  rate the report.
24b80 0a 20 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  .  */.  const ch
24b90 61 72 20 2a 7a 53 71 6c 20 3d 0a 20 20 22 53 45  ar *zSql =.  "SE
24ba0 4c 45 43 54 20 22 0a 20 20 20 20 22 20 20 20 20  LECT ".    "    
24bb0 20 27 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20   'EXPLAIN QUERY 
24bc0 50 4c 41 4e 20 53 45 4c 45 43 54 20 31 20 46 52  PLAN SELECT 1 FR
24bd0 4f 4d 20 27 20 7c 7c 20 71 75 6f 74 65 28 73 2e  OM ' || quote(s.
24be0 6e 61 6d 65 29 20 7c 7c 20 27 20 57 48 45 52 45  name) || ' WHERE
24bf0 20 27 22 0a 20 20 20 20 22 20 20 7c 7c 20 67 72   '".    "  || gr
24c00 6f 75 70 5f 63 6f 6e 63 61 74 28 71 75 6f 74 65  oup_concat(quote
24c10 28 73 2e 6e 61 6d 65 29 20 7c 7c 20 27 2e 27 20  (s.name) || '.' 
24c20 7c 7c 20 71 75 6f 74 65 28 66 2e 5b 66 72 6f 6d  || quote(f.[from
24c30 5d 29 20 7c 7c 20 27 3d 3f 27 20 22 0a 20 20 20  ]) || '=?' ".   
24c40 20 22 20 20 7c 7c 20 66 6b 65 79 5f 63 6f 6c 6c   "  || fkey_coll
24c50 61 74 65 5f 63 6c 61 75 73 65 28 22 0a 20 20 20  ate_clause(".   
24c60 20 22 20 20 20 20 20 20 20 66 2e 5b 74 61 62 6c   "       f.[tabl
24c70 65 5d 2c 20 43 4f 41 4c 45 53 43 45 28 66 2e 5b  e], COALESCE(f.[
24c80 74 6f 5d 2c 20 70 2e 5b 6e 61 6d 65 5d 29 2c 20  to], p.[name]), 
24c90 73 2e 6e 61 6d 65 2c 20 66 2e 5b 66 72 6f 6d 5d  s.name, f.[from]
24ca0 29 2c 27 20 41 4e 44 20 27 29 22 0a 20 20 20 20  ),' AND ')".    
24cb0 22 2c 20 22 0a 20 20 20 20 22 20 20 20 20 20 27  ", ".    "     '
24cc0 53 45 41 52 43 48 20 54 41 42 4c 45 20 27 20 7c  SEARCH TABLE ' |
24cd0 7c 20 73 2e 6e 61 6d 65 20 7c 7c 20 27 20 55 53  | s.name || ' US
24ce0 49 4e 47 20 43 4f 56 45 52 49 4e 47 20 49 4e 44  ING COVERING IND
24cf0 45 58 2a 28 27 22 0a 20 20 20 20 22 20 20 7c 7c  EX*('".    "  ||
24d00 20 67 72 6f 75 70 5f 63 6f 6e 63 61 74 28 27 2a   group_concat('*
24d10 3d 3f 27 2c 20 27 20 41 4e 44 20 27 29 20 7c 7c  =?', ' AND ') ||
24d20 20 27 29 27 22 0a 20 20 20 20 22 2c 20 22 0a 20   ')'".    ", ". 
24d30 20 20 20 22 20 20 20 20 20 73 2e 6e 61 6d 65 20     "     s.name 
24d40 20 7c 7c 20 27 28 27 20 7c 7c 20 67 72 6f 75 70   || '(' || group
24d50 5f 63 6f 6e 63 61 74 28 66 2e 5b 66 72 6f 6d 5d  _concat(f.[from]
24d60 2c 20 20 27 2c 20 27 29 20 7c 7c 20 27 29 27 22  ,  ', ') || ')'"
24d70 0a 20 20 20 20 22 2c 20 22 0a 20 20 20 20 22 20  .    ", ".    " 
24d80 20 20 20 20 66 2e 5b 74 61 62 6c 65 5d 20 7c 7c      f.[table] ||
24d90 20 27 28 27 20 7c 7c 20 67 72 6f 75 70 5f 63 6f   '(' || group_co
24da0 6e 63 61 74 28 43 4f 41 4c 45 53 43 45 28 66 2e  ncat(COALESCE(f.
24db0 5b 74 6f 5d 2c 20 70 2e 5b 6e 61 6d 65 5d 29 29  [to], p.[name]))
24dc0 20 7c 7c 20 27 29 27 22 0a 20 20 20 20 22 2c 20   || ')'".    ", 
24dd0 22 0a 20 20 20 20 22 20 20 20 20 20 27 43 52 45  ".    "     'CRE
24de0 41 54 45 20 49 4e 44 45 58 20 27 20 7c 7c 20 71  ATE INDEX ' || q
24df0 75 6f 74 65 28 73 2e 6e 61 6d 65 20 7c 7c 27 5f  uote(s.name ||'_
24e00 27 7c 7c 20 67 72 6f 75 70 5f 63 6f 6e 63 61 74  '|| group_concat
24e10 28 66 2e 5b 66 72 6f 6d 5d 2c 20 27 5f 27 29 29  (f.[from], '_'))
24e20 22 0a 20 20 20 20 22 20 20 7c 7c 20 27 20 4f 4e  ".    "  || ' ON
24e30 20 27 20 7c 7c 20 71 75 6f 74 65 28 73 2e 6e 61   ' || quote(s.na
24e40 6d 65 29 20 7c 7c 20 27 28 27 22 0a 20 20 20 20  me) || '('".    
24e50 22 20 20 7c 7c 20 67 72 6f 75 70 5f 63 6f 6e 63  "  || group_conc
24e60 61 74 28 71 75 6f 74 65 28 66 2e 5b 66 72 6f 6d  at(quote(f.[from
24e70 5d 29 20 7c 7c 22 0a 20 20 20 20 22 20 20 20 20  ]) ||".    "    
24e80 20 20 20 20 66 6b 65 79 5f 63 6f 6c 6c 61 74 65      fkey_collate
24e90 5f 63 6c 61 75 73 65 28 22 0a 20 20 20 20 22 20  _clause(".    " 
24ea0 20 20 20 20 20 20 20 20 20 66 2e 5b 74 61 62 6c           f.[tabl
24eb0 65 5d 2c 20 43 4f 41 4c 45 53 43 45 28 66 2e 5b  e], COALESCE(f.[
24ec0 74 6f 5d 2c 20 70 2e 5b 6e 61 6d 65 5d 29 2c 20  to], p.[name]), 
24ed0 73 2e 6e 61 6d 65 2c 20 66 2e 5b 66 72 6f 6d 5d  s.name, f.[from]
24ee0 29 2c 20 27 2c 20 27 29 22 0a 20 20 20 20 22 20  ), ', ')".    " 
24ef0 20 7c 7c 20 27 29 3b 27 22 0a 20 20 20 20 22 2c   || ');'".    ",
24f00 20 22 0a 20 20 20 20 22 20 20 20 20 20 66 2e 5b   ".    "     f.[
24f10 74 61 62 6c 65 5d 20 22 0a 20 20 20 20 22 46 52  table] ".    "FR
24f20 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  OM sqlite_master
24f30 20 41 53 20 73 2c 20 70 72 61 67 6d 61 5f 66 6f   AS s, pragma_fo
24f40 72 65 69 67 6e 5f 6b 65 79 5f 6c 69 73 74 28 73  reign_key_list(s
24f50 2e 6e 61 6d 65 29 20 41 53 20 66 20 22 0a 20 20  .name) AS f ".  
24f60 20 20 22 4c 45 46 54 20 4a 4f 49 4e 20 70 72 61    "LEFT JOIN pra
24f70 67 6d 61 5f 74 61 62 6c 65 5f 69 6e 66 6f 20 41  gma_table_info A
24f80 53 20 70 20 4f 4e 20 28 70 6b 2d 31 3d 73 65 71  S p ON (pk-1=seq
24f90 20 41 4e 44 20 70 2e 61 72 67 3d 66 2e 5b 74 61   AND p.arg=f.[ta
24fa0 62 6c 65 5d 29 20 22 0a 20 20 20 20 22 47 52 4f  ble]) ".    "GRO
24fb0 55 50 20 42 59 20 73 2e 6e 61 6d 65 2c 20 66 2e  UP BY s.name, f.
24fc0 69 64 20 22 0a 20 20 20 20 22 4f 52 44 45 52 20  id ".    "ORDER 
24fd0 42 59 20 28 43 41 53 45 20 57 48 45 4e 20 3f 20  BY (CASE WHEN ? 
24fe0 54 48 45 4e 20 66 2e 5b 74 61 62 6c 65 5d 20 45  THEN f.[table] E
24ff0 4c 53 45 20 73 2e 6e 61 6d 65 20 45 4e 44 29 22  LSE s.name END)"
25000 0a 20 20 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  .  ;.  const cha
25010 72 20 2a 7a 47 6c 6f 62 49 50 4b 20 3d 20 22 53  r *zGlobIPK = "S
25020 45 41 52 43 48 20 54 41 42 4c 45 20 2a 20 55 53  EARCH TABLE * US
25030 49 4e 47 20 49 4e 54 45 47 45 52 20 50 52 49 4d  ING INTEGER PRIM
25040 41 52 59 20 4b 45 59 20 28 72 6f 77 69 64 3d 3f  ARY KEY (rowid=?
25050 29 22 3b 0a 0a 20 20 66 6f 72 28 69 3d 32 3b 20  )";..  for(i=2; 
25060 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20  i<nArg; i++){.  
25070 20 20 69 6e 74 20 6e 20 3d 20 73 74 72 6c 65 6e    int n = strlen
25080 33 30 28 61 7a 41 72 67 5b 69 5d 29 3b 0a 20 20  30(azArg[i]);.  
25090 20 20 69 66 28 20 6e 3e 31 20 26 26 20 73 71 6c    if( n>1 && sql
250a0 69 74 65 33 5f 73 74 72 6e 69 63 6d 70 28 22 2d  ite3_strnicmp("-
250b0 76 65 72 62 6f 73 65 22 2c 20 61 7a 41 72 67 5b  verbose", azArg[
250c0 69 5d 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20  i], n)==0 ){.   
250d0 20 20 20 62 56 65 72 62 6f 73 65 20 3d 20 31 3b     bVerbose = 1;
250e0 0a 20 20 20 20 7d 0a 20 20 20 20 65 6c 73 65 20  .    }.    else 
250f0 69 66 28 20 6e 3e 31 20 26 26 20 73 71 6c 69 74  if( n>1 && sqlit
25100 65 33 5f 73 74 72 6e 69 63 6d 70 28 22 2d 67 72  e3_strnicmp("-gr
25110 6f 75 70 62 79 70 61 72 65 6e 74 22 2c 20 61 7a  oupbyparent", az
25120 41 72 67 5b 69 5d 2c 20 6e 29 3d 3d 30 20 29 7b  Arg[i], n)==0 ){
25130 0a 20 20 20 20 20 20 62 47 72 6f 75 70 42 79 50  .      bGroupByP
25140 61 72 65 6e 74 20 3d 20 31 3b 0a 20 20 20 20 20  arent = 1;.     
25150 20 7a 49 6e 64 65 6e 74 20 3d 20 22 20 20 20 20   zIndent = "    
25160 22 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65 6c 73  ";.    }.    els
25170 65 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69  e{.      raw_pri
25180 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55 73 61  ntf(stderr, "Usa
25190 67 65 3a 20 25 73 20 25 73 20 3f 2d 76 65 72 62  ge: %s %s ?-verb
251a0 6f 73 65 3f 20 3f 2d 67 72 6f 75 70 62 79 70 61  ose? ?-groupbypa
251b0 72 65 6e 74 3f 5c 6e 22 2c 0a 20 20 20 20 20 20  rent?\n",.      
251c0 20 20 20 20 61 7a 41 72 67 5b 30 5d 2c 20 61 7a      azArg[0], az
251d0 41 72 67 5b 31 5d 0a 20 20 20 20 20 20 29 3b 0a  Arg[1].      );.
251e0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
251f0 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  ITE_ERROR;.    }
25200 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 67 69 73  .  }..  /* Regis
25210 74 65 72 20 74 68 65 20 66 6b 65 79 5f 63 6f 6c  ter the fkey_col
25220 6c 61 74 65 5f 63 6c 61 75 73 65 28 29 20 53 51  late_clause() SQ
25230 4c 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  L function */.  
25240 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65  rc = sqlite3_cre
25250 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c  ate_function(db,
25260 20 22 66 6b 65 79 5f 63 6f 6c 6c 61 74 65 5f 63   "fkey_collate_c
25270 6c 61 75 73 65 22 2c 20 34 2c 20 53 51 4c 49 54  lause", 4, SQLIT
25280 45 5f 55 54 46 38 2c 0a 20 20 20 20 20 20 30 2c  E_UTF8,.      0,
25290 20 73 68 65 6c 6c 46 6b 65 79 43 6f 6c 6c 61 74   shellFkeyCollat
252a0 65 43 6c 61 75 73 65 2c 20 30 2c 20 30 0a 20 20  eClause, 0, 0.  
252b0 29 3b 0a 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53  );...  if( rc==S
252c0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
252d0 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65  rc = sqlite3_pre
252e0 70 61 72 65 5f 76 32 28 64 62 2c 20 7a 53 71 6c  pare_v2(db, zSql
252f0 2c 20 2d 31 2c 20 26 70 53 71 6c 2c 20 30 29 3b  , -1, &pSql, 0);
25300 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53  .  }.  if( rc==S
25310 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
25320 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74  sqlite3_bind_int
25330 28 70 53 71 6c 2c 20 31 2c 20 62 47 72 6f 75 70  (pSql, 1, bGroup
25340 42 79 50 61 72 65 6e 74 29 3b 0a 20 20 7d 0a 0a  ByParent);.  }..
25350 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
25360 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  _OK ){.    int r
25370 63 32 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 50  c2;.    char *zP
25380 72 65 76 20 3d 20 30 3b 0a 20 20 20 20 77 68 69  rev = 0;.    whi
25390 6c 65 28 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d  le( SQLITE_ROW==
253a0 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 71  sqlite3_step(pSq
253b0 6c 29 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  l) ){.      int 
253c0 72 65 73 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20  res = -1;.      
253d0 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 45  sqlite3_stmt *pE
253e0 78 70 6c 61 69 6e 20 3d 20 30 3b 0a 20 20 20 20  xplain = 0;.    
253f0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45    const char *zE
25400 51 50 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  QP = (const char
25410 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  *)sqlite3_column
25420 5f 74 65 78 74 28 70 53 71 6c 2c 20 30 29 3b 0a  _text(pSql, 0);.
25430 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
25440 20 2a 7a 47 6c 6f 62 20 3d 20 28 63 6f 6e 73 74   *zGlob = (const
25450 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63   char*)sqlite3_c
25460 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 71 6c 2c  olumn_text(pSql,
25470 20 31 29 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74   1);.      const
25480 20 63 68 61 72 20 2a 7a 46 72 6f 6d 20 3d 20 28   char *zFrom = (
25490 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69  const char*)sqli
254a0 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28  te3_column_text(
254b0 70 53 71 6c 2c 20 32 29 3b 0a 20 20 20 20 20 20  pSql, 2);.      
254c0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 72  const char *zTar
254d0 67 65 74 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  get = (const cha
254e0 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  r*)sqlite3_colum
254f0 6e 5f 74 65 78 74 28 70 53 71 6c 2c 20 33 29 3b  n_text(pSql, 3);
25500 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
25510 72 20 2a 7a 43 49 20 3d 20 28 63 6f 6e 73 74 20  r *zCI = (const 
25520 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f  char*)sqlite3_co
25530 6c 75 6d 6e 5f 74 65 78 74 28 70 53 71 6c 2c 20  lumn_text(pSql, 
25540 34 29 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20  4);.      const 
25550 63 68 61 72 20 2a 7a 50 61 72 65 6e 74 20 3d 20  char *zParent = 
25560 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c  (const char*)sql
25570 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  ite3_column_text
25580 28 70 53 71 6c 2c 20 35 29 3b 0a 0a 20 20 20 20  (pSql, 5);..    
25590 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70    rc = sqlite3_p
255a0 72 65 70 61 72 65 5f 76 32 28 64 62 2c 20 7a 45  repare_v2(db, zE
255b0 51 50 2c 20 2d 31 2c 20 26 70 45 78 70 6c 61 69  QP, -1, &pExplai
255c0 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  n, 0);.      if(
255d0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
255e0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 69 66   break;.      if
255f0 28 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71  ( SQLITE_ROW==sq
25600 6c 69 74 65 33 5f 73 74 65 70 28 70 45 78 70 6c  lite3_step(pExpl
25610 61 69 6e 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ain) ){.        
25620 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 6c 61  const char *zPla
25630 6e 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a  n = (const char*
25640 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  )sqlite3_column_
25650 74 65 78 74 28 70 45 78 70 6c 61 69 6e 2c 20 33  text(pExplain, 3
25660 29 3b 0a 20 20 20 20 20 20 20 20 72 65 73 20 3d  );.        res =
25670 20 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   (.             
25680 20 30 3d 3d 73 71 6c 69 74 65 33 5f 73 74 72 67   0==sqlite3_strg
25690 6c 6f 62 28 7a 47 6c 6f 62 2c 20 7a 50 6c 61 6e  lob(zGlob, zPlan
256a0 29 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  ).           || 
256b0 30 3d 3d 73 71 6c 69 74 65 33 5f 73 74 72 67 6c  0==sqlite3_strgl
256c0 6f 62 28 7a 47 6c 6f 62 49 50 4b 2c 20 7a 50 6c  ob(zGlobIPK, zPl
256d0 61 6e 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20  an).        );. 
256e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20       }.      rc 
256f0 3d 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69  = sqlite3_finali
25700 7a 65 28 70 45 78 70 6c 61 69 6e 29 3b 0a 20 20  ze(pExplain);.  
25710 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
25720 54 45 5f 4f 4b 20 29 20 62 72 65 61 6b 3b 0a 0a  TE_OK ) break;..
25730 20 20 20 20 20 20 69 66 28 20 72 65 73 3c 30 20        if( res<0 
25740 29 7b 0a 20 20 20 20 20 20 20 20 72 61 77 5f 70  ){.        raw_p
25750 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45  rintf(stderr, "E
25760 72 72 6f 72 3a 20 69 6e 74 65 72 6e 61 6c 20 65  rror: internal e
25770 72 72 6f 72 22 29 3b 0a 20 20 20 20 20 20 20 20  rror");.        
25780 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 65 6c  break;.      }el
25790 73 65 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  se{.        if( 
257a0 62 47 72 6f 75 70 42 79 50 61 72 65 6e 74 0a 20  bGroupByParent. 
257b0 20 20 20 20 20 20 20 26 26 20 28 62 56 65 72 62         && (bVerb
257c0 6f 73 65 20 7c 7c 20 72 65 73 3d 3d 30 29 0a 20  ose || res==0). 
257d0 20 20 20 20 20 20 20 26 26 20 28 7a 50 72 65 76         && (zPrev
257e0 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 5f 73  ==0 || sqlite3_s
257f0 74 72 69 63 6d 70 28 7a 50 61 72 65 6e 74 2c 20  tricmp(zParent, 
25800 7a 50 72 65 76 29 29 0a 20 20 20 20 20 20 20 20  zPrev)).        
25810 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 61 77  ){.          raw
25820 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 2d 2d  _printf(out, "--
25830 20 50 61 72 65 6e 74 20 74 61 62 6c 65 20 25 73   Parent table %s
25840 5c 6e 22 2c 20 7a 50 61 72 65 6e 74 29 3b 0a 20  \n", zParent);. 
25850 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
25860 5f 66 72 65 65 28 7a 50 72 65 76 29 3b 0a 20 20  _free(zPrev);.  
25870 20 20 20 20 20 20 20 20 7a 50 72 65 76 20 3d 20          zPrev = 
25880 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
25890 22 25 73 22 2c 20 7a 50 61 72 65 6e 74 29 3b 0a  "%s", zParent);.
258a0 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
258b0 20 20 20 69 66 28 20 72 65 73 3d 3d 30 20 29 7b     if( res==0 ){
258c0 0a 20 20 20 20 20 20 20 20 20 20 72 61 77 5f 70  .          raw_p
258d0 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 73 25 73  rintf(out, "%s%s
258e0 20 2d 2d 3e 20 25 73 5c 6e 22 2c 20 7a 49 6e 64   --> %s\n", zInd
258f0 65 6e 74 2c 20 7a 43 49 2c 20 7a 54 61 72 67 65  ent, zCI, zTarge
25900 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  t);.        }els
25910 65 20 69 66 28 20 62 56 65 72 62 6f 73 65 20 29  e if( bVerbose )
25920 7b 0a 20 20 20 20 20 20 20 20 20 20 72 61 77 5f  {.          raw_
25930 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 73 2f  printf(out, "%s/
25940 2a 20 6e 6f 20 65 78 74 72 61 20 69 6e 64 65 78  * no extra index
25950 65 73 20 72 65 71 75 69 72 65 64 20 66 6f 72 20  es required for 
25960 25 73 20 2d 3e 20 25 73 20 2a 2f 5c 6e 22 2c 0a  %s -> %s */\n",.
25970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 49                zI
25980 6e 64 65 6e 74 2c 20 7a 46 72 6f 6d 2c 20 7a 54  ndent, zFrom, zT
25990 61 72 67 65 74 0a 20 20 20 20 20 20 20 20 20 20  arget.          
259a0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
259b0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73     }.    }.    s
259c0 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 50 72 65  qlite3_free(zPre
259d0 76 29 3b 0a 0a 20 20 20 20 69 66 28 20 72 63 21  v);..    if( rc!
259e0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
259f0 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73      raw_printf(s
25a00 74 64 65 72 72 2c 20 22 25 73 5c 6e 22 2c 20 73  tderr, "%s\n", s
25a10 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62  qlite3_errmsg(db
25a20 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72  ));.    }..    r
25a30 63 32 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6e  c2 = sqlite3_fin
25a40 61 6c 69 7a 65 28 70 53 71 6c 29 3b 0a 20 20 20  alize(pSql);.   
25a50 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
25a60 4f 4b 20 26 26 20 72 63 32 21 3d 53 51 4c 49 54  OK && rc2!=SQLIT
25a70 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  E_OK ){.      rc
25a80 20 3d 20 72 63 32 3b 0a 20 20 20 20 20 20 72 61   = rc2;.      ra
25a90 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  w_printf(stderr,
25aa0 20 22 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65 33   "%s\n", sqlite3
25ab0 5f 65 72 72 6d 73 67 28 64 62 29 29 3b 0a 20 20  _errmsg(db));.  
25ac0 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
25ad0 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65   raw_printf(stde
25ae0 72 72 2c 20 22 25 73 5c 6e 22 2c 20 73 71 6c 69  rr, "%s\n", sqli
25af0 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29 29 3b  te3_errmsg(db));
25b00 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
25b10 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c  c;.}../*.** Impl
25b20 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 22 2e  ementation of ".
25b30 6c 69 6e 74 22 20 64 6f 74 20 63 6f 6d 6d 61 6e  lint" dot comman
25b40 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
25b50 20 6c 69 6e 74 44 6f 74 43 6f 6d 6d 61 6e 64 28   lintDotCommand(
25b60 0a 20 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 70  .  ShellState *p
25b70 53 74 61 74 65 2c 20 20 20 20 20 20 20 20 20 20  State,          
25b80 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 73 68     /* Current sh
25b90 65 6c 6c 20 74 6f 6f 6c 20 73 74 61 74 65 20 2a  ell tool state *
25ba0 2f 0a 20 20 63 68 61 72 20 2a 2a 61 7a 41 72 67  /.  char **azArg
25bb0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
25bc0 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20      /* Array of 
25bd0 61 72 67 75 6d 65 6e 74 73 20 70 61 73 73 65 64  arguments passed
25be0 20 74 6f 20 64 6f 74 20 63 6f 6d 6d 61 6e 64 20   to dot command 
25bf0 2a 2f 0a 20 20 69 6e 74 20 6e 41 72 67 20 20 20  */.  int nArg   
25c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25c10 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
25c20 66 20 65 6e 74 72 69 65 73 20 69 6e 20 61 7a 41  f entries in azA
25c30 72 67 5b 5d 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  rg[] */.){.  int
25c40 20 6e 3b 0a 20 20 6e 20 3d 20 28 6e 41 72 67 3e   n;.  n = (nArg>
25c50 3d 32 20 3f 20 73 74 72 6c 65 6e 33 30 28 61 7a  =2 ? strlen30(az
25c60 41 72 67 5b 31 5d 29 20 3a 20 30 29 3b 0a 20 20  Arg[1]) : 0);.  
25c70 69 66 28 20 6e 3c 31 20 7c 7c 20 73 71 6c 69 74  if( n<1 || sqlit
25c80 65 33 5f 73 74 72 6e 69 63 6d 70 28 61 7a 41 72  e3_strnicmp(azAr
25c90 67 5b 31 5d 2c 20 22 66 6b 65 79 2d 69 6e 64 65  g[1], "fkey-inde
25ca0 78 65 73 22 2c 20 6e 29 20 29 20 67 6f 74 6f 20  xes", n) ) goto 
25cb0 75 73 61 67 65 3b 0a 20 20 72 65 74 75 72 6e 20  usage;.  return 
25cc0 6c 69 6e 74 46 6b 65 79 49 6e 64 65 78 65 73 28  lintFkeyIndexes(
25cd0 70 53 74 61 74 65 2c 20 61 7a 41 72 67 2c 20 6e  pState, azArg, n
25ce0 41 72 67 29 3b 0a 0a 20 75 73 61 67 65 3a 0a 20  Arg);.. usage:. 
25cf0 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65   raw_printf(stde
25d00 72 72 2c 20 22 55 73 61 67 65 20 25 73 20 73 75  rr, "Usage %s su
25d10 62 2d 63 6f 6d 6d 61 6e 64 20 3f 73 77 69 74 63  b-command ?switc
25d20 68 65 73 2e 2e 2e 3f 5c 6e 22 2c 20 61 7a 41 72  hes...?\n", azAr
25d30 67 5b 30 5d 29 3b 0a 20 20 72 61 77 5f 70 72 69  g[0]);.  raw_pri
25d40 6e 74 66 28 73 74 64 65 72 72 2c 20 22 57 68 65  ntf(stderr, "Whe
25d50 72 65 20 73 75 62 2d 63 6f 6d 6d 61 6e 64 73 20  re sub-commands 
25d60 61 72 65 3a 5c 6e 22 29 3b 0a 20 20 72 61 77 5f  are:\n");.  raw_
25d70 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
25d80 20 20 20 20 66 6b 65 79 2d 69 6e 64 65 78 65 73      fkey-indexes
25d90 5c 6e 22 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  \n");.  return S
25da0 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 7d 0a 0a  QLITE_ERROR;.}..
25db0 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
25dc0 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
25dd0 54 41 42 4c 45 29 20 26 26 20 64 65 66 69 6e 65  TABLE) && define
25de0 64 28 53 51 4c 49 54 45 5f 48 41 56 45 5f 5a 4c  d(SQLITE_HAVE_ZL
25df0 49 42 29 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  IB)./***********
25e00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
25e10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
25e20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
25e30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
25e40 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 65 20 22 2e  ******.** The ".
25e50 61 72 63 68 69 76 65 22 20 6f 72 20 22 2e 61 72  archive" or ".ar
25e60 22 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a 73 74  " command..*/.st
25e70 61 74 69 63 20 76 6f 69 64 20 73 68 65 6c 6c 50  atic void shellP
25e80 72 65 70 61 72 65 28 0a 20 20 73 71 6c 69 74 65  repare(.  sqlite
25e90 33 20 2a 64 62 2c 20 0a 20 20 69 6e 74 20 2a 70  3 *db, .  int *p
25ea0 52 63 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61  Rc, .  const cha
25eb0 72 20 2a 7a 53 71 6c 2c 20 0a 20 20 73 71 6c 69  r *zSql, .  sqli
25ec0 74 65 33 5f 73 74 6d 74 20 2a 2a 70 70 53 74 6d  te3_stmt **ppStm
25ed0 74 0a 29 7b 0a 20 20 2a 70 70 53 74 6d 74 20 3d  t.){.  *ppStmt =
25ee0 20 30 3b 0a 20 20 69 66 28 20 2a 70 52 63 3d 3d   0;.  if( *pRc==
25ef0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
25f00 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65   int rc = sqlite
25f10 33 5f 70 72 65 70 61 72 65 5f 76 32 28 64 62 2c  3_prepare_v2(db,
25f20 20 7a 53 71 6c 2c 20 2d 31 2c 20 70 70 53 74 6d   zSql, -1, ppStm
25f30 74 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72  t, 0);.    if( r
25f40 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
25f50 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
25f60 28 73 74 64 65 72 72 2c 20 22 73 71 6c 20 65 72  (stderr, "sql er
25f70 72 6f 72 3a 20 25 73 20 28 25 64 29 5c 6e 22 2c  ror: %s (%d)\n",
25f80 20 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69   .          sqli
25f90 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29 2c 20  te3_errmsg(db), 
25fa0 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28  sqlite3_errcode(
25fb0 64 62 29 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  db).      );.   
25fc0 20 20 20 2a 70 52 63 20 3d 20 72 63 3b 0a 20 20     *pRc = rc;.  
25fd0 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69    }.  }.}..stati
25fe0 63 20 76 6f 69 64 20 73 68 65 6c 6c 50 72 65 70  c void shellPrep
25ff0 61 72 65 50 72 69 6e 74 66 28 0a 20 20 73 71 6c  arePrintf(.  sql
26000 69 74 65 33 20 2a 64 62 2c 20 0a 20 20 69 6e 74  ite3 *db, .  int
26010 20 2a 70 52 63 2c 20 0a 20 20 73 71 6c 69 74 65   *pRc, .  sqlite
26020 33 5f 73 74 6d 74 20 2a 2a 70 70 53 74 6d 74 2c  3_stmt **ppStmt,
26030 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
26040 46 6d 74 2c 20 0a 20 20 2e 2e 2e 0a 29 7b 0a 20  Fmt, .  ....){. 
26050 20 2a 70 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20   *ppStmt = 0;.  
26060 69 66 28 20 2a 70 52 63 3d 3d 53 51 4c 49 54 45  if( *pRc==SQLITE
26070 5f 4f 4b 20 29 7b 0a 20 20 20 20 76 61 5f 6c 69  _OK ){.    va_li
26080 73 74 20 61 70 3b 0a 20 20 20 20 63 68 61 72 20  st ap;.    char 
26090 2a 7a 3b 0a 20 20 20 20 76 61 5f 73 74 61 72 74  *z;.    va_start
260a0 28 61 70 2c 20 7a 46 6d 74 29 3b 0a 20 20 20 20  (ap, zFmt);.    
260b0 7a 20 3d 20 73 71 6c 69 74 65 33 5f 76 6d 70 72  z = sqlite3_vmpr
260c0 69 6e 74 66 28 7a 46 6d 74 2c 20 61 70 29 3b 0a  intf(zFmt, ap);.
260d0 20 20 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a      va_end(ap);.
260e0 20 20 20 20 69 66 28 20 7a 3d 3d 30 20 29 7b 0a      if( z==0 ){.
260f0 20 20 20 20 20 20 2a 70 52 63 20 3d 20 53 51 4c        *pRc = SQL
26100 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d  ITE_NOMEM;.    }
26110 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 68 65 6c  else{.      shel
26120 6c 50 72 65 70 61 72 65 28 64 62 2c 20 70 52 63  lPrepare(db, pRc
26130 2c 20 7a 2c 20 70 70 53 74 6d 74 29 3b 0a 20 20  , z, ppStmt);.  
26140 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
26150 28 7a 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  (z);.    }.  }.}
26160 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 68  ..static void sh
26170 65 6c 6c 46 69 6e 61 6c 69 7a 65 28 0a 20 20 69  ellFinalize(.  i
26180 6e 74 20 2a 70 52 63 2c 20 0a 20 20 73 71 6c 69  nt *pRc, .  sqli
26190 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 0a  te3_stmt *pStmt.
261a0 29 7b 0a 20 20 69 66 28 20 70 53 74 6d 74 20 29  ){.  if( pStmt )
261b0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64  {.    sqlite3 *d
261c0 62 20 3d 20 73 71 6c 69 74 65 33 5f 64 62 5f 68  b = sqlite3_db_h
261d0 61 6e 64 6c 65 28 70 53 74 6d 74 29 3b 0a 20 20  andle(pStmt);.  
261e0 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74    int rc = sqlit
261f0 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d  e3_finalize(pStm
26200 74 29 3b 0a 20 20 20 20 69 66 28 20 2a 70 52 63  t);.    if( *pRc
26210 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
26220 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
26230 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
26240 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64    raw_printf(std
26250 65 72 72 2c 20 22 53 51 4c 20 65 72 72 6f 72 3a  err, "SQL error:
26260 20 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f   %s\n", sqlite3_
26270 65 72 72 6d 73 67 28 64 62 29 29 3b 0a 20 20 20  errmsg(db));.   
26280 20 20 20 7d 0a 20 20 20 20 20 20 2a 70 52 63 20     }.      *pRc 
26290 3d 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  = rc;.    }.  }.
262a0 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  }..static void s
262b0 68 65 6c 6c 52 65 73 65 74 28 0a 20 20 69 6e 74  hellReset(.  int
262c0 20 2a 70 52 63 2c 20 0a 20 20 73 71 6c 69 74 65   *pRc, .  sqlite
262d0 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 0a 29 7b  3_stmt *pStmt.){
262e0 0a 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69  .  int rc = sqli
262f0 74 65 33 5f 72 65 73 65 74 28 70 53 74 6d 74 29  te3_reset(pStmt)
26300 3b 0a 20 20 69 66 28 20 2a 70 52 63 3d 3d 53 51  ;.  if( *pRc==SQ
26310 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
26320 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
26330 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
26340 33 20 2a 64 62 20 3d 20 73 71 6c 69 74 65 33 5f  3 *db = sqlite3_
26350 64 62 5f 68 61 6e 64 6c 65 28 70 53 74 6d 74 29  db_handle(pStmt)
26360 3b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e  ;.      raw_prin
26370 74 66 28 73 74 64 65 72 72 2c 20 22 53 51 4c 20  tf(stderr, "SQL 
26380 65 72 72 6f 72 3a 20 25 73 5c 6e 22 2c 20 73 71  error: %s\n", sq
26390 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29  lite3_errmsg(db)
263a0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a 70 52  );.    }.    *pR
263b0 63 20 3d 20 72 63 3b 0a 20 20 7d 0a 7d 0a 2f 2a  c = rc;.  }.}./*
263c0 0a 2a 2a 20 53 74 72 75 63 74 75 72 65 20 72 65  .** Structure re
263d0 70 72 65 73 65 6e 74 69 6e 67 20 61 20 73 69 6e  presenting a sin
263e0 67 6c 65 20 22 2e 61 72 22 20 63 6f 6d 6d 61 6e  gle ".ar" comman
263f0 64 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  d..*/.typedef st
26400 72 75 63 74 20 41 72 43 6f 6d 6d 61 6e 64 20 41  ruct ArCommand A
26410 72 43 6f 6d 6d 61 6e 64 3b 0a 73 74 72 75 63 74  rCommand;.struct
26420 20 41 72 43 6f 6d 6d 61 6e 64 20 7b 0a 20 20 75   ArCommand {.  u
26430 38 20 65 43 6d 64 3b 20 20 20 20 20 20 20 20 20  8 eCmd;         
26440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
26450 2a 20 41 6e 20 41 52 5f 43 4d 44 5f 2a 20 76 61  * An AR_CMD_* va
26460 6c 75 65 20 2a 2f 0a 20 20 75 38 20 62 56 65 72  lue */.  u8 bVer
26470 62 6f 73 65 3b 20 20 20 20 20 20 20 20 20 20 20  bose;           
26480 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
26490 20 69 66 20 2d 2d 76 65 72 62 6f 73 65 20 2a 2f   if --verbose */
264a0 0a 20 20 75 38 20 62 5a 69 70 3b 20 20 20 20 20  .  u8 bZip;     
264b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
264c0 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
264d0 65 20 61 72 63 68 69 76 65 20 69 73 20 61 20 5a  e archive is a Z
264e0 49 50 20 2a 2f 0a 20 20 75 38 20 62 44 72 79 52  IP */.  u8 bDryR
264f0 75 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  un;             
26500 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
26510 69 66 20 2d 2d 64 72 79 2d 72 75 6e 20 2a 2f 0a  if --dry-run */.
26520 20 20 75 38 20 62 41 70 70 65 6e 64 3b 20 20 20    u8 bAppend;   
26530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26540 20 20 2f 2a 20 54 72 75 65 20 69 66 20 2d 2d 61    /* True if --a
26550 70 70 65 6e 64 20 2a 2f 0a 20 20 75 38 20 66 72  ppend */.  u8 fr
26560 6f 6d 43 6d 64 4c 69 6e 65 3b 20 20 20 20 20 20  omCmdLine;      
26570 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 75             /* Ru
26580 6e 20 66 72 6f 6d 20 2d 41 20 69 6e 73 74 65 61  n from -A instea
26590 64 20 6f 66 20 2e 61 72 63 68 69 76 65 20 2a 2f  d of .archive */
265a0 0a 20 20 69 6e 74 20 6e 41 72 67 3b 20 20 20 20  .  int nArg;    
265b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
265c0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
265d0 63 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74  command argument
265e0 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 53 72  s */.  char *zSr
265f0 63 54 61 62 6c 65 3b 20 20 20 20 20 20 20 20 20  cTable;         
26600 20 20 20 20 20 20 20 2f 2a 20 22 73 71 6c 61 72         /* "sqlar
26610 22 2c 20 22 7a 69 70 66 69 6c 65 28 24 66 69 6c  ", "zipfile($fil
26620 65 29 22 20 6f 72 20 22 7a 69 70 22 20 2a 2f 0a  e)" or "zip" */.
26630 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
26640 69 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ile;            
26650 20 20 2f 2a 20 2d 2d 66 69 6c 65 20 61 72 67 75    /* --file argu
26660 6d 65 6e 74 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f  ment, or NULL */
26670 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
26680 44 69 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  Dir;            
26690 20 20 20 2f 2a 20 2d 2d 64 69 72 65 63 74 6f 72     /* --director
266a0 79 20 61 72 67 75 6d 65 6e 74 2c 20 6f 72 20 4e  y argument, or N
266b0 55 4c 4c 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a  ULL */.  char **
266c0 61 7a 41 72 67 3b 20 20 20 20 20 20 20 20 20 20  azArg;          
266d0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61           /* Arra
266e0 79 20 6f 66 20 63 6f 6d 6d 61 6e 64 20 61 72 67  y of command arg
266f0 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 53 68 65 6c  uments */.  Shel
26700 6c 53 74 61 74 65 20 2a 70 3b 20 20 20 20 20 20  lState *p;      
26710 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
26720 68 65 6c 6c 20 73 74 61 74 65 20 2a 2f 0a 20 20  hell state */.  
26730 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20  sqlite3 *db;    
26740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26750 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 74  /* Database cont
26760 61 69 6e 69 6e 67 20 74 68 65 20 61 72 63 68 69  aining the archi
26770 76 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  ve */.};../*.** 
26780 50 72 69 6e 74 20 61 20 75 73 61 67 65 20 6d 65  Print a usage me
26790 73 73 61 67 65 20 66 6f 72 20 74 68 65 20 2e 61  ssage for the .a
267a0 72 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 73 74 64  r command to std
267b0 65 72 72 20 61 6e 64 20 72 65 74 75 72 6e 20 53  err and return S
267c0 51 4c 49 54 45 5f 45 52 52 4f 52 2e 0a 2a 2f 0a  QLITE_ERROR..*/.
267d0 73 74 61 74 69 63 20 69 6e 74 20 61 72 55 73 61  static int arUsa
267e0 67 65 28 46 49 4c 45 20 2a 66 29 7b 0a 20 20 73  ge(FILE *f){.  s
267f0 68 6f 77 48 65 6c 70 28 66 2c 22 61 72 63 68 69  howHelp(f,"archi
26800 76 65 22 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  ve");.  return S
26810 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 7d 0a 0a  QLITE_ERROR;.}..
26820 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 6e 20 65  /*.** Print an e
26830 72 72 6f 72 20 6d 65 73 73 61 67 65 20 66 6f 72  rror message for
26840 20 74 68 65 20 2e 61 72 20 63 6f 6d 6d 61 6e 64   the .ar command
26850 20 74 6f 20 73 74 64 65 72 72 20 61 6e 64 20 72   to stderr and r
26860 65 74 75 72 6e 20 0a 2a 2a 20 53 51 4c 49 54 45  eturn .** SQLITE
26870 5f 45 52 52 4f 52 2e 0a 2a 2f 0a 73 74 61 74 69  _ERROR..*/.stati
26880 63 20 69 6e 74 20 61 72 45 72 72 6f 72 4d 73 67  c int arErrorMsg
26890 28 41 72 43 6f 6d 6d 61 6e 64 20 2a 70 41 72 2c  (ArCommand *pAr,
268a0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6d   const char *zFm
268b0 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69  t, ...){.  va_li
268c0 73 74 20 61 70 3b 0a 20 20 63 68 61 72 20 2a 7a  st ap;.  char *z
268d0 3b 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c  ;.  va_start(ap,
268e0 20 7a 46 6d 74 29 3b 0a 20 20 7a 20 3d 20 73 71   zFmt);.  z = sq
268f0 6c 69 74 65 33 5f 76 6d 70 72 69 6e 74 66 28 7a  lite3_vmprintf(z
26900 46 6d 74 2c 20 61 70 29 3b 0a 20 20 76 61 5f 65  Fmt, ap);.  va_e
26910 6e 64 28 61 70 29 3b 0a 20 20 75 74 66 38 5f 70  nd(ap);.  utf8_p
26920 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45  rintf(stderr, "E
26930 72 72 6f 72 3a 20 25 73 5c 6e 22 2c 20 7a 29 3b  rror: %s\n", z);
26940 0a 20 20 69 66 28 20 70 41 72 2d 3e 66 72 6f 6d  .  if( pAr->from
26950 43 6d 64 4c 69 6e 65 20 29 7b 0a 20 20 20 20 75  CmdLine ){.    u
26960 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72  tf8_printf(stder
26970 72 2c 20 22 55 73 65 20 5c 22 2d 41 5c 22 20 66  r, "Use \"-A\" f
26980 6f 72 20 6d 6f 72 65 20 68 65 6c 70 5c 6e 22 29  or more help\n")
26990 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 75  ;.  }else{.    u
269a0 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72  tf8_printf(stder
269b0 72 2c 20 22 55 73 65 20 5c 22 2e 61 72 63 68 69  r, "Use \".archi
269c0 76 65 20 2d 2d 68 65 6c 70 5c 22 20 66 6f 72 20  ve --help\" for 
269d0 6d 6f 72 65 20 68 65 6c 70 5c 6e 22 29 3b 0a 20  more help\n");. 
269e0 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65   }.  sqlite3_fre
269f0 65 28 7a 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  e(z);.  return S
26a00 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 7d 0a 0a  QLITE_ERROR;.}..
26a10 2f 2a 0a 2a 2a 20 56 61 6c 75 65 73 20 66 6f 72  /*.** Values for
26a20 20 41 72 43 6f 6d 6d 61 6e 64 2e 65 43 6d 64 2e   ArCommand.eCmd.
26a30 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 41 52 5f 43  .*/.#define AR_C
26a40 4d 44 5f 43 52 45 41 54 45 20 20 20 20 20 20 20  MD_CREATE       
26a50 31 0a 23 64 65 66 69 6e 65 20 41 52 5f 43 4d 44  1.#define AR_CMD
26a60 5f 45 58 54 52 41 43 54 20 20 20 20 20 20 32 0a  _EXTRACT      2.
26a70 23 64 65 66 69 6e 65 20 41 52 5f 43 4d 44 5f 4c  #define AR_CMD_L
26a80 49 53 54 20 20 20 20 20 20 20 20 20 33 0a 23 64  IST         3.#d
26a90 65 66 69 6e 65 20 41 52 5f 43 4d 44 5f 55 50 44  efine AR_CMD_UPD
26aa0 41 54 45 20 20 20 20 20 20 20 34 0a 23 64 65 66  ATE       4.#def
26ab0 69 6e 65 20 41 52 5f 43 4d 44 5f 48 45 4c 50 20  ine AR_CMD_HELP 
26ac0 20 20 20 20 20 20 20 20 35 0a 0a 2f 2a 0a 2a 2a          5../*.**
26ad0 20 4f 74 68 65 72 20 28 6e 6f 6e 2d 63 6f 6d 6d   Other (non-comm
26ae0 61 6e 64 29 20 73 77 69 74 63 68 65 73 2e 0a 2a  and) switches..*
26af0 2f 0a 23 64 65 66 69 6e 65 20 41 52 5f 53 57 49  /.#define AR_SWI
26b00 54 43 48 5f 56 45 52 42 4f 53 45 20 20 20 20 20  TCH_VERBOSE     
26b10 36 0a 23 64 65 66 69 6e 65 20 41 52 5f 53 57 49  6.#define AR_SWI
26b20 54 43 48 5f 46 49 4c 45 20 20 20 20 20 20 20 20  TCH_FILE        
26b30 37 0a 23 64 65 66 69 6e 65 20 41 52 5f 53 57 49  7.#define AR_SWI
26b40 54 43 48 5f 44 49 52 45 43 54 4f 52 59 20 20 20  TCH_DIRECTORY   
26b50 38 0a 23 64 65 66 69 6e 65 20 41 52 5f 53 57 49  8.#define AR_SWI
26b60 54 43 48 5f 41 50 50 45 4e 44 20 20 20 20 20 20  TCH_APPEND      
26b70 39 0a 23 64 65 66 69 6e 65 20 41 52 5f 53 57 49  9.#define AR_SWI
26b80 54 43 48 5f 44 52 59 52 55 4e 20 20 20 20 20 31  TCH_DRYRUN     1
26b90 30 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 61 72  0..static int ar
26ba0 50 72 6f 63 65 73 73 53 77 69 74 63 68 28 41 72  ProcessSwitch(Ar
26bb0 43 6f 6d 6d 61 6e 64 20 2a 70 41 72 2c 20 69 6e  Command *pAr, in
26bc0 74 20 65 53 77 69 74 63 68 2c 20 63 6f 6e 73 74  t eSwitch, const
26bd0 20 63 68 61 72 20 2a 7a 41 72 67 29 7b 0a 20 20   char *zArg){.  
26be0 73 77 69 74 63 68 28 20 65 53 77 69 74 63 68 20  switch( eSwitch 
26bf0 29 7b 0a 20 20 20 20 63 61 73 65 20 41 52 5f 43  ){.    case AR_C
26c00 4d 44 5f 43 52 45 41 54 45 3a 0a 20 20 20 20 63  MD_CREATE:.    c
26c10 61 73 65 20 41 52 5f 43 4d 44 5f 45 58 54 52 41  ase AR_CMD_EXTRA
26c20 43 54 3a 0a 20 20 20 20 63 61 73 65 20 41 52 5f  CT:.    case AR_
26c30 43 4d 44 5f 4c 49 53 54 3a 0a 20 20 20 20 63 61  CMD_LIST:.    ca
26c40 73 65 20 41 52 5f 43 4d 44 5f 55 50 44 41 54 45  se AR_CMD_UPDATE
26c50 3a 0a 20 20 20 20 63 61 73 65 20 41 52 5f 43 4d  :.    case AR_CM
26c60 44 5f 48 45 4c 50 3a 0a 20 20 20 20 20 20 69 66  D_HELP:.      if
26c70 28 20 70 41 72 2d 3e 65 43 6d 64 20 29 7b 0a 20  ( pAr->eCmd ){. 
26c80 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 61 72         return ar
26c90 45 72 72 6f 72 4d 73 67 28 70 41 72 2c 20 22 6d  ErrorMsg(pAr, "m
26ca0 75 6c 74 69 70 6c 65 20 63 6f 6d 6d 61 6e 64 20  ultiple command 
26cb0 6f 70 74 69 6f 6e 73 22 29 3b 0a 20 20 20 20 20  options");.     
26cc0 20 7d 0a 20 20 20 20 20 20 70 41 72 2d 3e 65 43   }.      pAr->eC
26cd0 6d 64 20 3d 20 65 53 77 69 74 63 68 3b 0a 20 20  md = eSwitch;.  
26ce0 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20      break;..    
26cf0 63 61 73 65 20 41 52 5f 53 57 49 54 43 48 5f 44  case AR_SWITCH_D
26d00 52 59 52 55 4e 3a 0a 20 20 20 20 20 20 70 41 72  RYRUN:.      pAr
26d10 2d 3e 62 44 72 79 52 75 6e 20 3d 20 31 3b 0a 20  ->bDryRun = 1;. 
26d20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
26d30 63 61 73 65 20 41 52 5f 53 57 49 54 43 48 5f 56  case AR_SWITCH_V
26d40 45 52 42 4f 53 45 3a 0a 20 20 20 20 20 20 70 41  ERBOSE:.      pA
26d50 72 2d 3e 62 56 65 72 62 6f 73 65 20 3d 20 31 3b  r->bVerbose = 1;
26d60 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
26d70 20 20 63 61 73 65 20 41 52 5f 53 57 49 54 43 48    case AR_SWITCH
26d80 5f 41 50 50 45 4e 44 3a 0a 20 20 20 20 20 20 70  _APPEND:.      p
26d90 41 72 2d 3e 62 41 70 70 65 6e 64 20 3d 20 31 3b  Ar->bAppend = 1;
26da0 0a 20 20 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74  .      /* Fall t
26db0 68 72 75 20 69 6e 74 6f 20 2d 2d 66 69 6c 65 20  hru into --file 
26dc0 2a 2f 0a 20 20 20 20 63 61 73 65 20 41 52 5f 53  */.    case AR_S
26dd0 57 49 54 43 48 5f 46 49 4c 45 3a 0a 20 20 20 20  WITCH_FILE:.    
26de0 20 20 70 41 72 2d 3e 7a 46 69 6c 65 20 3d 20 7a    pAr->zFile = z
26df0 41 72 67 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  Arg;.      break
26e00 3b 0a 20 20 20 20 63 61 73 65 20 41 52 5f 53 57  ;.    case AR_SW
26e10 49 54 43 48 5f 44 49 52 45 43 54 4f 52 59 3a 0a  ITCH_DIRECTORY:.
26e20 20 20 20 20 20 20 70 41 72 2d 3e 7a 44 69 72 20        pAr->zDir 
26e30 3d 20 7a 41 72 67 3b 0a 20 20 20 20 20 20 62 72  = zArg;.      br
26e40 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  eak;.  }..  retu
26e50 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
26e60 0a 2f 2a 0a 2a 2a 20 50 61 72 73 65 20 74 68 65  ./*.** Parse the
26e70 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20 66 6f   command line fo
26e80 72 20 61 6e 20 22 2e 61 72 22 20 63 6f 6d 6d 61  r an ".ar" comma
26e90 6e 64 2e 20 54 68 65 20 72 65 73 75 6c 74 73 20  nd. The results 
26ea0 61 72 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f  are written into
26eb0 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20 28 2a  .** structure (*
26ec0 70 41 72 29 2e 20 53 51 4c 49 54 45 5f 4f 4b 20  pAr). SQLITE_OK 
26ed0 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 74  is returned if t
26ee0 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20  he command line 
26ef0 69 73 20 70 61 72 73 65 64 0a 2a 2a 20 73 75 63  is parsed.** suc
26f00 63 65 73 73 66 75 6c 6c 79 2c 20 6f 74 68 65 72  cessfully, other
26f10 77 69 73 65 20 61 6e 20 65 72 72 6f 72 20 6d 65  wise an error me
26f20 73 73 61 67 65 20 69 73 20 77 72 69 74 74 65 6e  ssage is written
26f30 20 74 6f 20 73 74 64 65 72 72 20 61 6e 64 20 0a   to stderr and .
26f40 2a 2a 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20  ** SQLITE_ERROR 
26f50 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
26f60 74 69 63 20 69 6e 74 20 61 72 50 61 72 73 65 43  tic int arParseC
26f70 6f 6d 6d 61 6e 64 28 0a 20 20 63 68 61 72 20 2a  ommand(.  char *
26f80 2a 61 7a 41 72 67 2c 20 20 20 20 20 20 20 20 20  *azArg,         
26f90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72            /* Arr
26fa0 61 79 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  ay of arguments 
26fb0 70 61 73 73 65 64 20 74 6f 20 64 6f 74 20 63 6f  passed to dot co
26fc0 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6e  mmand */.  int n
26fd0 41 72 67 2c 20 20 20 20 20 20 20 20 20 20 20 20  Arg,            
26fe0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
26ff0 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20  mber of entries 
27000 69 6e 20 61 7a 41 72 67 5b 5d 20 2a 2f 0a 20 20  in azArg[] */.  
27010 41 72 43 6f 6d 6d 61 6e 64 20 2a 70 41 72 20 20  ArCommand *pAr  
27020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27030 2f 2a 20 50 6f 70 75 6c 61 74 65 20 74 68 69 73  /* Populate this
27040 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20 20   object */.){.  
27050 73 74 72 75 63 74 20 41 72 53 77 69 74 63 68 20  struct ArSwitch 
27060 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  {.    const char
27070 20 2a 7a 4c 6f 6e 67 3b 0a 20 20 20 20 63 68 61   *zLong;.    cha
27080 72 20 63 53 68 6f 72 74 3b 0a 20 20 20 20 75 38  r cShort;.    u8
27090 20 65 53 77 69 74 63 68 3b 0a 20 20 20 20 75 38   eSwitch;.    u8
270a0 20 62 41 72 67 3b 0a 20 20 7d 20 61 53 77 69 74   bArg;.  } aSwit
270b0 63 68 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 20 22  ch[] = {.    { "
270c0 63 72 65 61 74 65 22 2c 20 20 20 20 27 63 27 2c  create",    'c',
270d0 20 41 52 5f 43 4d 44 5f 43 52 45 41 54 45 2c 20   AR_CMD_CREATE, 
270e0 20 20 20 20 20 20 30 20 7d 2c 0a 20 20 20 20 7b        0 },.    {
270f0 20 22 65 78 74 72 61 63 74 22 2c 20 20 20 27 78   "extract",   'x
27100 27 2c 20 41 52 5f 43 4d 44 5f 45 58 54 52 41 43  ', AR_CMD_EXTRAC
27110 54 2c 20 20 20 20 20 20 30 20 7d 2c 0a 20 20 20  T,      0 },.   
27120 20 7b 20 22 6c 69 73 74 22 2c 20 20 20 20 20 20   { "list",      
27130 27 74 27 2c 20 41 52 5f 43 4d 44 5f 4c 49 53 54  't', AR_CMD_LIST
27140 2c 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 20  ,         0 },. 
27150 20 20 20 7b 20 22 75 70 64 61 74 65 22 2c 20 20     { "update",  
27160 20 20 27 75 27 2c 20 41 52 5f 43 4d 44 5f 55 50    'u', AR_CMD_UP
27170 44 41 54 45 2c 20 20 20 20 20 20 20 30 20 7d 2c  DATE,       0 },
27180 0a 20 20 20 20 7b 20 22 68 65 6c 70 22 2c 20 20  .    { "help",  
27190 20 20 20 20 27 68 27 2c 20 41 52 5f 43 4d 44 5f      'h', AR_CMD_
271a0 48 45 4c 50 2c 20 20 20 20 20 20 20 20 20 30 20  HELP,         0 
271b0 7d 2c 0a 20 20 20 20 7b 20 22 76 65 72 62 6f 73  },.    { "verbos
271c0 65 22 2c 20 20 20 27 76 27 2c 20 41 52 5f 53 57  e",   'v', AR_SW
271d0 49 54 43 48 5f 56 45 52 42 4f 53 45 2c 20 20 20  ITCH_VERBOSE,   
271e0 30 20 7d 2c 0a 20 20 20 20 7b 20 22 66 69 6c 65  0 },.    { "file
271f0 22 2c 20 20 20 20 20 20 27 66 27 2c 20 41 52 5f  ",      'f', AR_
27200 53 57 49 54 43 48 5f 46 49 4c 45 2c 20 20 20 20  SWITCH_FILE,    
27210 20 20 31 20 7d 2c 0a 20 20 20 20 7b 20 22 61 70    1 },.    { "ap
27220 70 65 6e 64 22 2c 20 20 20 20 27 61 27 2c 20 41  pend",    'a', A
27230 52 5f 53 57 49 54 43 48 5f 41 50 50 45 4e 44 2c  R_SWITCH_APPEND,
27240 20 20 20 20 31 20 7d 2c 0a 20 20 20 20 7b 20 22      1 },.    { "
27250 64 69 72 65 63 74 6f 72 79 22 2c 20 27 43 27 2c  directory", 'C',
27260 20 41 52 5f 53 57 49 54 43 48 5f 44 49 52 45 43   AR_SWITCH_DIREC
27270 54 4f 52 59 2c 20 31 20 7d 2c 0a 20 20 20 20 7b  TORY, 1 },.    {
27280 20 22 64 72 79 72 75 6e 22 2c 20 20 20 20 27 6e   "dryrun",    'n
27290 27 2c 20 41 52 5f 53 57 49 54 43 48 5f 44 52 59  ', AR_SWITCH_DRY
272a0 52 55 4e 2c 20 20 20 20 30 20 7d 2c 0a 20 20 7d  RUN,    0 },.  }
272b0 3b 0a 20 20 69 6e 74 20 6e 53 77 69 74 63 68 20  ;.  int nSwitch 
272c0 3d 20 73 69 7a 65 6f 66 28 61 53 77 69 74 63 68  = sizeof(aSwitch
272d0 29 20 2f 20 73 69 7a 65 6f 66 28 73 74 72 75 63  ) / sizeof(struc
272e0 74 20 41 72 53 77 69 74 63 68 29 3b 0a 20 20 73  t ArSwitch);.  s
272f0 74 72 75 63 74 20 41 72 53 77 69 74 63 68 20 2a  truct ArSwitch *
27300 70 45 6e 64 20 3d 20 26 61 53 77 69 74 63 68 5b  pEnd = &aSwitch[
27310 6e 53 77 69 74 63 68 5d 3b 0a 0a 20 20 69 66 28  nSwitch];..  if(
27320 20 6e 41 72 67 3c 3d 31 20 29 7b 0a 20 20 20 20   nArg<=1 ){.    
27330 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65  utf8_printf(stde
27340 72 72 2c 20 22 57 72 6f 6e 67 20 6e 75 6d 62 65  rr, "Wrong numbe
27350 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 2e 20  r of arguments. 
27360 20 55 73 61 67 65 3a 5c 6e 22 29 3b 0a 20 20 20   Usage:\n");.   
27370 20 72 65 74 75 72 6e 20 61 72 55 73 61 67 65 28   return arUsage(
27380 73 74 64 65 72 72 29 3b 0a 20 20 7d 65 6c 73 65  stderr);.  }else
27390 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20  {.    char *z = 
273a0 61 7a 41 72 67 5b 31 5d 3b 0a 20 20 20 20 69 66  azArg[1];.    if
273b0 28 20 7a 5b 30 5d 21 3d 27 2d 27 20 29 7b 0a 20  ( z[0]!='-' ){. 
273c0 20 20 20 20 20 2f 2a 20 54 72 61 64 69 74 69 6f       /* Traditio
273d0 6e 61 6c 20 73 74 79 6c 65 20 5b 74 61 72 5d 20  nal style [tar] 
273e0 69 6e 76 6f 63 61 74 69 6f 6e 20 2a 2f 0a 20 20  invocation */.  
273f0 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20      int i;.     
27400 20 69 6e 74 20 69 41 72 67 20 3d 20 32 3b 0a 20   int iArg = 2;. 
27410 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 7a 5b       for(i=0; z[
27420 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  i]; i++){.      
27430 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41    const char *zA
27440 72 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  rg = 0;.        
27450 73 74 72 75 63 74 20 41 72 53 77 69 74 63 68 20  struct ArSwitch 
27460 2a 70 4f 70 74 3b 0a 20 20 20 20 20 20 20 20 66  *pOpt;.        f
27470 6f 72 28 70 4f 70 74 3d 26 61 53 77 69 74 63 68  or(pOpt=&aSwitch
27480 5b 30 5d 3b 20 70 4f 70 74 3c 70 45 6e 64 3b 20  [0]; pOpt<pEnd; 
27490 70 4f 70 74 2b 2b 29 7b 0a 20 20 20 20 20 20 20  pOpt++){.       
274a0 20 20 20 69 66 28 20 7a 5b 69 5d 3d 3d 70 4f 70     if( z[i]==pOp
274b0 74 2d 3e 63 53 68 6f 72 74 20 29 20 62 72 65 61  t->cShort ) brea
274c0 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
274d0 20 20 20 20 20 69 66 28 20 70 4f 70 74 3d 3d 70       if( pOpt==p
274e0 45 6e 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20  End ){.         
274f0 20 72 65 74 75 72 6e 20 61 72 45 72 72 6f 72 4d   return arErrorM
27500 73 67 28 70 41 72 2c 20 22 75 6e 72 65 63 6f 67  sg(pAr, "unrecog
27510 6e 69 7a 65 64 20 6f 70 74 69 6f 6e 3a 20 25 63  nized option: %c
27520 22 2c 20 7a 5b 69 5d 29 3b 0a 20 20 20 20 20 20  ", z[i]);.      
27530 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
27540 70 4f 70 74 2d 3e 62 41 72 67 20 29 7b 0a 20 20  pOpt->bArg ){.  
27550 20 20 20 20 20 20 20 20 69 66 28 20 69 41 72 67          if( iArg
27560 3e 3d 6e 41 72 67 20 29 7b 0a 20 20 20 20 20 20  >=nArg ){.      
27570 20 20 20 20 20 20 72 65 74 75 72 6e 20 61 72 45        return arE
27580 72 72 6f 72 4d 73 67 28 70 41 72 2c 20 22 6f 70  rrorMsg(pAr, "op
27590 74 69 6f 6e 20 72 65 71 75 69 72 65 73 20 61 6e  tion requires an
275a0 20 61 72 67 75 6d 65 6e 74 3a 20 25 63 22 2c 7a   argument: %c",z
275b0 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20  [i]);.          
275c0 7d 0a 20 20 20 20 20 20 20 20 20 20 7a 41 72 67  }.          zArg
275d0 20 3d 20 61 7a 41 72 67 5b 69 41 72 67 2b 2b 5d   = azArg[iArg++]
275e0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
275f0 20 20 20 20 69 66 28 20 61 72 50 72 6f 63 65 73      if( arProces
27600 73 53 77 69 74 63 68 28 70 41 72 2c 20 70 4f 70  sSwitch(pAr, pOp
27610 74 2d 3e 65 53 77 69 74 63 68 2c 20 7a 41 72 67  t->eSwitch, zArg
27620 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ) ) return SQLIT
27630 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d  E_ERROR;.      }
27640 0a 20 20 20 20 20 20 70 41 72 2d 3e 6e 41 72 67  .      pAr->nArg
27650 20 3d 20 6e 41 72 67 2d 69 41 72 67 3b 0a 20 20   = nArg-iArg;.  
27660 20 20 20 20 69 66 28 20 70 41 72 2d 3e 6e 41 72      if( pAr->nAr
27670 67 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  g>0 ){.        p
27680 41 72 2d 3e 61 7a 41 72 67 20 3d 20 26 61 7a 41  Ar->azArg = &azA
27690 72 67 5b 69 41 72 67 5d 3b 0a 20 20 20 20 20 20  rg[iArg];.      
276a0 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
276b0 20 20 20 2f 2a 20 4e 6f 6e 2d 74 72 61 64 69 74     /* Non-tradit
276c0 69 6f 6e 61 6c 20 69 6e 76 6f 63 61 74 69 6f 6e  ional invocation
276d0 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 41   */.      int iA
276e0 72 67 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 41  rg;.      for(iA
276f0 72 67 3d 31 3b 20 69 41 72 67 3c 6e 41 72 67 3b  rg=1; iArg<nArg;
27700 20 69 41 72 67 2b 2b 29 7b 0a 20 20 20 20 20 20   iArg++){.      
27710 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 20 20 20    int n;.       
27720 20 7a 20 3d 20 61 7a 41 72 67 5b 69 41 72 67 5d   z = azArg[iArg]
27730 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 5b  ;.        if( z[
27740 30 5d 21 3d 27 2d 27 20 29 7b 0a 20 20 20 20 20  0]!='-' ){.     
27750 20 20 20 20 20 2f 2a 20 41 6c 6c 20 72 65 6d 61       /* All rema
27760 69 6e 69 6e 67 20 63 6f 6d 6d 61 6e 64 20 6c 69  ining command li
27770 6e 65 20 77 6f 72 64 73 20 61 72 65 20 63 6f 6d  ne words are com
27780 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 2e 20  mand arguments. 
27790 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 70 41 72  */.          pAr
277a0 2d 3e 61 7a 41 72 67 20 3d 20 26 61 7a 41 72 67  ->azArg = &azArg
277b0 5b 69 41 72 67 5d 3b 0a 20 20 20 20 20 20 20 20  [iArg];.        
277c0 20 20 70 41 72 2d 3e 6e 41 72 67 20 3d 20 6e 41    pAr->nArg = nA
277d0 72 67 2d 69 41 72 67 3b 0a 20 20 20 20 20 20 20  rg-iArg;.       
277e0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
277f0 20 20 7d 0a 20 20 20 20 20 20 20 20 6e 20 3d 20    }.        n = 
27800 73 74 72 6c 65 6e 33 30 28 7a 29 3b 0a 0a 20 20  strlen30(z);..  
27810 20 20 20 20 20 20 69 66 28 20 7a 5b 31 5d 21 3d        if( z[1]!=
27820 27 2d 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20  '-' ){.         
27830 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 20 20   int i;.        
27840 20 20 2f 2a 20 4f 6e 65 20 6f 72 20 6d 6f 72 65    /* One or more
27850 20 73 68 6f 72 74 20 6f 70 74 69 6f 6e 73 20 2a   short options *
27860 2f 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28  /.          for(
27870 69 3d 31 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a  i=1; i<n; i++){.
27880 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73              cons
27890 74 20 63 68 61 72 20 2a 7a 41 72 67 20 3d 20 30  t char *zArg = 0
278a0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 74  ;.            st
278b0 72 75 63 74 20 41 72 53 77 69 74 63 68 20 2a 70  ruct ArSwitch *p
278c0 4f 70 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20  Opt;.           
278d0 20 66 6f 72 28 70 4f 70 74 3d 26 61 53 77 69 74   for(pOpt=&aSwit
278e0 63 68 5b 30 5d 3b 20 70 4f 70 74 3c 70 45 6e 64  ch[0]; pOpt<pEnd
278f0 3b 20 70 4f 70 74 2b 2b 29 7b 0a 20 20 20 20 20  ; pOpt++){.     
27900 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 5b 69           if( z[i
27910 5d 3d 3d 70 4f 70 74 2d 3e 63 53 68 6f 72 74 20  ]==pOpt->cShort 
27920 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20  ) break;.       
27930 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
27940 20 20 20 69 66 28 20 70 4f 70 74 3d 3d 70 45 6e     if( pOpt==pEn
27950 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  d ){.           
27960 20 20 20 72 65 74 75 72 6e 20 61 72 45 72 72 6f     return arErro
27970 72 4d 73 67 28 70 41 72 2c 20 22 75 6e 72 65 63  rMsg(pAr, "unrec
27980 6f 67 6e 69 7a 65 64 20 6f 70 74 69 6f 6e 3a 20  ognized option: 
27990 25 63 22 2c 20 7a 5b 69 5d 29 3b 0a 20 20 20 20  %c", z[i]);.    
279a0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
279b0 20 20 20 20 20 20 69 66 28 20 70 4f 70 74 2d 3e        if( pOpt->
279c0 62 41 72 67 20 29 7b 0a 20 20 20 20 20 20 20 20  bArg ){.        
279d0 20 20 20 20 20 20 69 66 28 20 69 3c 28 6e 2d 31        if( i<(n-1
279e0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
279f0 20 20 20 20 20 7a 41 72 67 20 3d 20 26 7a 5b 69       zArg = &z[i
27a00 2b 31 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20  +1];.           
27a10 20 20 20 20 20 69 20 3d 20 6e 3b 0a 20 20 20 20       i = n;.    
27a20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
27a30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
27a40 20 69 66 28 20 69 41 72 67 3e 3d 28 6e 41 72 67   if( iArg>=(nArg
27a50 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  -1) ){.         
27a60 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
27a70 61 72 45 72 72 6f 72 4d 73 67 28 70 41 72 2c 20  arErrorMsg(pAr, 
27a80 22 6f 70 74 69 6f 6e 20 72 65 71 75 69 72 65 73  "option requires
27a90 20 61 6e 20 61 72 67 75 6d 65 6e 74 3a 20 25 63   an argument: %c
27aa0 22 2c 7a 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20  ",z[i]);.       
27ab0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
27ac0 20 20 20 20 20 20 20 20 20 20 20 7a 41 72 67 20             zArg 
27ad0 3d 20 61 7a 41 72 67 5b 2b 2b 69 41 72 67 5d 3b  = azArg[++iArg];
27ae0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
27af0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
27b00 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 61             if( a
27b10 72 50 72 6f 63 65 73 73 53 77 69 74 63 68 28 70  rProcessSwitch(p
27b20 41 72 2c 20 70 4f 70 74 2d 3e 65 53 77 69 74 63  Ar, pOpt->eSwitc
27b30 68 2c 20 7a 41 72 67 29 20 29 20 72 65 74 75 72  h, zArg) ) retur
27b40 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
27b50 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
27b60 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 5b      }else if( z[
27b70 32 5d 3d 3d 27 5c 30 27 20 29 7b 0a 20 20 20 20  2]=='\0' ){.    
27b80 20 20 20 20 20 20 2f 2a 20 41 20 2d 2d 20 6f 70        /* A -- op
27b90 74 69 6f 6e 2c 20 69 6e 64 69 63 61 74 69 6e 67  tion, indicating
27ba0 20 74 68 61 74 20 61 6c 6c 20 72 65 6d 61 69 6e   that all remain
27bb0 69 6e 67 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65  ing command line
27bc0 20 77 6f 72 64 73 0a 20 20 20 20 20 20 20 20 20   words.         
27bd0 20 2a 2a 20 61 72 65 20 63 6f 6d 6d 61 6e 64 20   ** are command 
27be0 61 72 67 75 6d 65 6e 74 73 2e 20 20 2a 2f 0a 20  arguments.  */. 
27bf0 20 20 20 20 20 20 20 20 20 70 41 72 2d 3e 61 7a           pAr->az
27c00 41 72 67 20 3d 20 26 61 7a 41 72 67 5b 69 41 72  Arg = &azArg[iAr
27c10 67 2b 31 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  g+1];.          
27c20 70 41 72 2d 3e 6e 41 72 67 20 3d 20 6e 41 72 67  pAr->nArg = nArg
27c30 2d 69 41 72 67 2d 31 3b 0a 20 20 20 20 20 20 20  -iArg-1;.       
27c40 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
27c50 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
27c60 20 20 20 2f 2a 20 41 20 6c 6f 6e 67 20 6f 70 74     /* A long opt
27c70 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ion */.         
27c80 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 72   const char *zAr
27c90 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  g = 0;          
27ca0 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20 66     /* Argument f
27cb0 6f 72 20 6f 70 74 69 6f 6e 2c 20 69 66 20 61 6e  or option, if an
27cc0 79 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 73  y */.          s
27cd0 74 72 75 63 74 20 41 72 53 77 69 74 63 68 20 2a  truct ArSwitch *
27ce0 70 4d 61 74 63 68 20 3d 20 30 3b 20 20 20 20 20  pMatch = 0;     
27cf0 20 2f 2a 20 4d 61 74 63 68 69 6e 67 20 6f 70 74   /* Matching opt
27d00 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ion */.         
27d10 20 73 74 72 75 63 74 20 41 72 53 77 69 74 63 68   struct ArSwitch
27d20 20 2a 70 4f 70 74 3b 20 20 20 20 20 20 20 20 20   *pOpt;         
27d30 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 2a     /* Iterator *
27d40 2f 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28  /.          for(
27d50 70 4f 70 74 3d 26 61 53 77 69 74 63 68 5b 30 5d  pOpt=&aSwitch[0]
27d60 3b 20 70 4f 70 74 3c 70 45 6e 64 3b 20 70 4f 70  ; pOpt<pEnd; pOp
27d70 74 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  t++){.          
27d80 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4c    const char *zL
27d90 6f 6e 67 20 3d 20 70 4f 70 74 2d 3e 7a 4c 6f 6e  ong = pOpt->zLon
27da0 67 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  g;.            i
27db0 66 28 20 28 6e 2d 32 29 3c 3d 73 74 72 6c 65 6e  f( (n-2)<=strlen
27dc0 33 30 28 7a 4c 6f 6e 67 29 20 26 26 20 30 3d 3d  30(zLong) && 0==
27dd0 6d 65 6d 63 6d 70 28 26 7a 5b 32 5d 2c 20 7a 4c  memcmp(&z[2], zL
27de0 6f 6e 67 2c 20 6e 2d 32 29 20 29 7b 0a 20 20 20  ong, n-2) ){.   
27df0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
27e00 4d 61 74 63 68 20 29 7b 0a 20 20 20 20 20 20 20  Match ){.       
27e10 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
27e20 61 72 45 72 72 6f 72 4d 73 67 28 70 41 72 2c 20  arErrorMsg(pAr, 
27e30 22 61 6d 62 69 67 75 6f 75 73 20 6f 70 74 69 6f  "ambiguous optio
27e40 6e 3a 20 25 73 22 2c 7a 29 3b 0a 20 20 20 20 20  n: %s",z);.     
27e50 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
27e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27e70 70 4d 61 74 63 68 20 3d 20 70 4f 70 74 3b 0a 20  pMatch = pOpt;. 
27e80 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
27e90 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
27ea0 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
27eb0 20 20 20 20 69 66 28 20 70 4d 61 74 63 68 3d 3d      if( pMatch==
27ec0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
27ed0 20 72 65 74 75 72 6e 20 61 72 45 72 72 6f 72 4d   return arErrorM
27ee0 73 67 28 70 41 72 2c 20 22 75 6e 72 65 63 6f 67  sg(pAr, "unrecog
27ef0 6e 69 7a 65 64 20 6f 70 74 69 6f 6e 3a 20 25 73  nized option: %s
27f00 22 2c 20 7a 29 3b 0a 20 20 20 20 20 20 20 20 20  ", z);.         
27f10 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28   }.          if(
27f20 20 70 4d 61 74 63 68 2d 3e 62 41 72 67 20 29 7b   pMatch->bArg ){
27f30 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
27f40 20 69 41 72 67 3e 3d 28 6e 41 72 67 2d 31 29 20   iArg>=(nArg-1) 
27f50 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
27f60 20 72 65 74 75 72 6e 20 61 72 45 72 72 6f 72 4d   return arErrorM
27f70 73 67 28 70 41 72 2c 20 22 6f 70 74 69 6f 6e 20  sg(pAr, "option 
27f80 72 65 71 75 69 72 65 73 20 61 6e 20 61 72 67 75  requires an argu
27f90 6d 65 6e 74 3a 20 25 73 22 2c 20 7a 29 3b 0a 20  ment: %s", z);. 
27fa0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
27fb0 20 20 20 20 20 20 20 20 20 7a 41 72 67 20 3d 20           zArg = 
27fc0 61 7a 41 72 67 5b 2b 2b 69 41 72 67 5d 3b 0a 20  azArg[++iArg];. 
27fd0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
27fe0 20 20 20 20 20 69 66 28 20 61 72 50 72 6f 63 65       if( arProce
27ff0 73 73 53 77 69 74 63 68 28 70 41 72 2c 20 70 4d  ssSwitch(pAr, pM
28000 61 74 63 68 2d 3e 65 53 77 69 74 63 68 2c 20 7a  atch->eSwitch, z
28010 41 72 67 29 20 29 20 72 65 74 75 72 6e 20 53 51  Arg) ) return SQ
28020 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
28030 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
28040 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
28050 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
28060 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
28070 69 6f 6e 20 61 73 73 75 6d 65 73 20 74 68 61 74  ion assumes that
28080 20 61 6c 6c 20 61 72 67 75 6d 65 6e 74 73 20 77   all arguments w
28090 69 74 68 69 6e 20 74 68 65 20 41 72 43 6f 6d 6d  ithin the ArComm
280a0 61 6e 64 2e 61 7a 41 72 67 5b 5d 0a 2a 2a 20 61  and.azArg[].** a
280b0 72 72 61 79 20 72 65 66 65 72 20 74 6f 20 61 72  rray refer to ar
280c0 63 68 69 76 65 20 6d 65 6d 62 65 72 73 2c 20 61  chive members, a
280d0 73 20 66 6f 72 20 74 68 65 20 2d 2d 65 78 74 72  s for the --extr
280e0 61 63 74 20 6f 72 20 2d 2d 6c 69 73 74 20 63 6f  act or --list co
280f0 6d 6d 61 6e 64 73 2e 20 0a 2a 2a 20 49 74 20 63  mmands. .** It c
28100 68 65 63 6b 73 20 74 68 61 74 20 65 61 63 68 20  hecks that each 
28110 6f 66 20 74 68 65 6d 20 61 72 65 20 70 72 65 73  of them are pres
28120 65 6e 74 2e 20 49 66 20 61 6e 79 20 73 70 65 63  ent. If any spec
28130 69 66 69 65 64 20 66 69 6c 65 20 69 73 20 6e 6f  ified file is no
28140 74 0a 2a 2a 20 70 72 65 73 65 6e 74 20 69 6e 20  t.** present in 
28150 74 68 65 20 61 72 63 68 69 76 65 2c 20 61 6e 20  the archive, an 
28160 65 72 72 6f 72 20 69 73 20 70 72 69 6e 74 65 64  error is printed
28170 20 74 6f 20 73 74 64 65 72 72 20 61 6e 64 20 61   to stderr and a
28180 6e 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20  n error.** code 
28190 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77  returned. Otherw
281a0 69 73 65 2c 20 69 66 20 61 6c 6c 20 73 70 65 63  ise, if all spec
281b0 69 66 69 65 64 20 61 72 67 75 6d 65 6e 74 73 20  ified arguments 
281c0 61 72 65 20 70 72 65 73 65 6e 74 20 69 6e 0a 2a  are present in.*
281d0 2a 20 74 68 65 20 61 72 63 68 69 76 65 2c 20 53  * the archive, S
281e0 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
281f0 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  rned..**.** This
28200 20 66 75 6e 63 74 69 6f 6e 20 73 74 72 69 70 73   function strips
28210 20 61 6e 79 20 74 72 61 69 6c 69 6e 67 20 27 2f   any trailing '/
28220 27 20 63 68 61 72 61 63 74 65 72 73 20 66 72 6f  ' characters fro
28230 6d 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 2e  m each argument.
28240 0a 2a 2a 20 54 68 69 73 20 69 73 20 63 6f 6e 73  .** This is cons
28250 69 73 74 65 6e 74 20 77 69 74 68 20 74 68 65 20  istent with the 
28260 77 61 79 20 74 68 65 20 5b 74 61 72 5d 20 63 6f  way the [tar] co
28270 6d 6d 61 6e 64 20 73 65 65 6d 73 20 74 6f 20 77  mmand seems to w
28280 6f 72 6b 20 6f 6e 0a 2a 2a 20 4c 69 6e 75 78 2e  ork on.** Linux.
28290 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
282a0 72 43 68 65 63 6b 45 6e 74 72 69 65 73 28 41 72  rCheckEntries(Ar
282b0 43 6f 6d 6d 61 6e 64 20 2a 70 41 72 29 7b 0a 20  Command *pAr){. 
282c0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
282d0 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 41 72 2d 3e  _OK;.  if( pAr->
282e0 6e 41 72 67 20 29 7b 0a 20 20 20 20 69 6e 74 20  nArg ){.    int 
282f0 69 2c 20 6a 3b 0a 20 20 20 20 73 71 6c 69 74 65  i, j;.    sqlite
28300 33 5f 73 74 6d 74 20 2a 70 54 65 73 74 20 3d 20  3_stmt *pTest = 
28310 30 3b 0a 0a 20 20 20 20 73 68 65 6c 6c 50 72 65  0;..    shellPre
28320 70 61 72 65 50 72 69 6e 74 66 28 70 41 72 2d 3e  parePrintf(pAr->
28330 64 62 2c 20 26 72 63 2c 20 26 70 54 65 73 74 2c  db, &rc, &pTest,
28340 0a 20 20 20 20 20 20 20 20 22 53 45 4c 45 43 54  .        "SELECT
28350 20 6e 61 6d 65 20 46 52 4f 4d 20 25 73 20 57 48   name FROM %s WH
28360 45 52 45 20 6e 61 6d 65 3d 24 6e 61 6d 65 22 2c  ERE name=$name",
28370 20 0a 20 20 20 20 20 20 20 20 70 41 72 2d 3e 7a   .        pAr->z
28380 53 72 63 54 61 62 6c 65 0a 20 20 20 20 29 3b 0a  SrcTable.    );.
28390 20 20 20 20 6a 20 3d 20 73 71 6c 69 74 65 33 5f      j = sqlite3_
283a0 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 69  bind_parameter_i
283b0 6e 64 65 78 28 70 54 65 73 74 2c 20 22 24 6e 61  ndex(pTest, "$na
283c0 6d 65 22 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  me");.    for(i=
283d0 30 3b 20 69 3c 70 41 72 2d 3e 6e 41 72 67 20 26  0; i<pAr->nArg &
283e0 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b  & rc==SQLITE_OK;
283f0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 63 68 61   i++){.      cha
28400 72 20 2a 7a 20 3d 20 70 41 72 2d 3e 61 7a 41 72  r *z = pAr->azAr
28410 67 5b 69 5d 3b 0a 20 20 20 20 20 20 69 6e 74 20  g[i];.      int 
28420 6e 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a 29 3b  n = strlen30(z);
28430 0a 20 20 20 20 20 20 69 6e 74 20 62 4f 6b 20 3d  .      int bOk =
28440 20 30 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28   0;.      while(
28450 20 6e 3e 30 20 26 26 20 7a 5b 6e 2d 31 5d 3d 3d   n>0 && z[n-1]==
28460 27 2f 27 20 29 20 6e 2d 2d 3b 0a 20 20 20 20 20  '/' ) n--;.     
28470 20 7a 5b 6e 5d 20 3d 20 27 5c 30 27 3b 0a 20 20   z[n] = '\0';.  
28480 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64      sqlite3_bind
28490 5f 74 65 78 74 28 70 54 65 73 74 2c 20 6a 2c 20  _text(pTest, j, 
284a0 7a 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 53 54  z, -1, SQLITE_ST
284b0 41 54 49 43 29 3b 0a 20 20 20 20 20 20 69 66 28  ATIC);.      if(
284c0 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c   SQLITE_ROW==sql
284d0 69 74 65 33 5f 73 74 65 70 28 70 54 65 73 74 29  ite3_step(pTest)
284e0 20 29 7b 0a 20 20 20 20 20 20 20 20 62 4f 6b 20   ){.        bOk 
284f0 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
28500 20 20 20 73 68 65 6c 6c 52 65 73 65 74 28 26 72     shellReset(&r
28510 63 2c 20 70 54 65 73 74 29 3b 0a 20 20 20 20 20  c, pTest);.     
28520 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
28530 4f 4b 20 26 26 20 62 4f 6b 3d 3d 30 20 29 7b 0a  OK && bOk==0 ){.
28540 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69          utf8_pri
28550 6e 74 66 28 73 74 64 65 72 72 2c 20 22 6e 6f 74  ntf(stderr, "not
28560 20 66 6f 75 6e 64 20 69 6e 20 61 72 63 68 69 76   found in archiv
28570 65 3a 20 25 73 5c 6e 22 2c 20 7a 29 3b 0a 20 20  e: %s\n", z);.  
28580 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
28590 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d  E_ERROR;.      }
285a0 0a 20 20 20 20 7d 0a 20 20 20 20 73 68 65 6c 6c  .    }.    shell
285b0 46 69 6e 61 6c 69 7a 65 28 26 72 63 2c 20 70 54  Finalize(&rc, pT
285c0 65 73 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  est);.  }.  retu
285d0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
285e0 46 6f 72 6d 61 74 20 61 20 57 48 45 52 45 20 63  Format a WHERE c
285f0 6c 61 75 73 65 20 74 68 61 74 20 63 61 6e 20 62  lause that can b
28600 65 20 75 73 65 64 20 61 67 61 69 6e 73 74 20 74  e used against t
28610 68 65 20 22 73 71 6c 61 72 22 20 74 61 62 6c 65  he "sqlar" table
28620 20 74 6f 0a 2a 2a 20 69 64 65 6e 74 69 66 79 20   to.** identify 
28630 61 6c 6c 20 61 72 63 68 69 76 65 20 6d 65 6d 62  all archive memb
28640 65 72 73 20 74 68 61 74 20 6d 61 74 63 68 20 74  ers that match t
28650 68 65 20 63 6f 6d 6d 61 6e 64 20 61 72 67 75 6d  he command argum
28660 65 6e 74 73 20 68 65 6c 64 0a 2a 2a 20 69 6e 20  ents held.** in 
28670 28 2a 70 41 72 29 2e 20 4c 65 61 76 65 20 74 68  (*pAr). Leave th
28680 69 73 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  is WHERE clause 
28690 69 6e 20 28 2a 70 7a 57 68 65 72 65 29 20 62 65  in (*pzWhere) be
286a0 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a  fore returning..
286b0 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 69 73  ** The caller is
286c0 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72   responsible for
286d0 20 65 76 65 6e 74 75 61 6c 6c 79 20 63 61 6c 6c   eventually call
286e0 69 6e 67 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ing sqlite3_free
286f0 28 29 20 6f 6e 0a 2a 2a 20 61 6e 79 20 6e 6f 6e  () on.** any non
28700 2d 4e 55 4c 4c 20 28 2a 70 7a 57 68 65 72 65 29  -NULL (*pzWhere)
28710 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74 69   value..*/.stati
28720 63 20 76 6f 69 64 20 61 72 57 68 65 72 65 43 6c  c void arWhereCl
28730 61 75 73 65 28 0a 20 20 69 6e 74 20 2a 70 52 63  ause(.  int *pRc
28740 2c 20 0a 20 20 41 72 43 6f 6d 6d 61 6e 64 20 2a  , .  ArCommand *
28750 70 41 72 2c 20 0a 20 20 63 68 61 72 20 2a 2a 70  pAr, .  char **p
28760 7a 57 68 65 72 65 20 20 20 20 20 20 20 20 20 20  zWhere          
28770 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
28780 4e 65 77 20 57 48 45 52 45 20 63 6c 61 75 73 65  New WHERE clause
28790 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a   */.){.  char *z
287a0 57 68 65 72 65 20 3d 20 30 3b 0a 20 20 69 66 28  Where = 0;.  if(
287b0 20 2a 70 52 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b   *pRc==SQLITE_OK
287c0 20 29 7b 0a 20 20 20 20 69 66 28 20 70 41 72 2d   ){.    if( pAr-
287d0 3e 6e 41 72 67 3d 3d 30 20 29 7b 0a 20 20 20 20  >nArg==0 ){.    
287e0 20 20 7a 57 68 65 72 65 20 3d 20 73 71 6c 69 74    zWhere = sqlit
287f0 65 33 5f 6d 70 72 69 6e 74 66 28 22 31 22 29 3b  e3_mprintf("1");
28800 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
28810 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 63    int i;.      c
28820 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 65 70 20  onst char *zSep 
28830 3d 20 22 22 3b 0a 20 20 20 20 20 20 66 6f 72 28  = "";.      for(
28840 69 3d 30 3b 20 69 3c 70 41 72 2d 3e 6e 41 72 67  i=0; i<pAr->nArg
28850 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
28860 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20  const char *z = 
28870 70 41 72 2d 3e 61 7a 41 72 67 5b 69 5d 3b 0a 20  pAr->azArg[i];. 
28880 20 20 20 20 20 20 20 7a 57 68 65 72 65 20 3d 20         zWhere = 
28890 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
288a0 0a 20 20 20 20 20 20 20 20 20 20 22 25 7a 25 73  .          "%z%s
288b0 20 6e 61 6d 65 20 3d 20 27 25 71 27 20 4f 52 20   name = '%q' OR 
288c0 73 75 62 73 74 72 28 6e 61 6d 65 2c 31 2c 25 64  substr(name,1,%d
288d0 29 20 3d 20 27 25 71 2f 27 22 2c 20 0a 20 20 20  ) = '%q/'", .   
288e0 20 20 20 20 20 20 20 7a 57 68 65 72 65 2c 20 7a         zWhere, z
288f0 53 65 70 2c 20 7a 2c 20 73 74 72 6c 65 6e 33 30  Sep, z, strlen30
28900 28 7a 29 2b 31 2c 20 7a 0a 20 20 20 20 20 20 20  (z)+1, z.       
28910 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
28920 7a 57 68 65 72 65 3d 3d 30 20 29 7b 0a 20 20 20  zWhere==0 ){.   
28930 20 20 20 20 20 20 20 2a 70 52 63 20 3d 20 53 51         *pRc = SQ
28940 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
28950 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
28960 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7a       }.        z
28970 53 65 70 20 3d 20 22 20 4f 52 20 22 3b 0a 20 20  Sep = " OR ";.  
28980 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
28990 20 20 2a 70 7a 57 68 65 72 65 20 3d 20 7a 57 68    *pzWhere = zWh
289a0 65 72 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d  ere;.}../*.** Im
289b0 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
289c0 2e 61 72 20 22 6c 69 73 54 22 20 63 6f 6d 6d 61  .ar "lisT" comma
289d0 6e 64 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69  nd. .*/.static i
289e0 6e 74 20 61 72 4c 69 73 74 43 6f 6d 6d 61 6e 64  nt arListCommand
289f0 28 41 72 43 6f 6d 6d 61 6e 64 20 2a 70 41 72 29  (ArCommand *pAr)
28a00 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
28a10 7a 53 71 6c 20 3d 20 22 53 45 4c 45 43 54 20 25  zSql = "SELECT %
28a20 73 20 46 52 4f 4d 20 25 73 20 57 48 45 52 45 20  s FROM %s WHERE 
28a30 25 73 22 3b 20 0a 20 20 63 6f 6e 73 74 20 63 68  %s"; .  const ch
28a40 61 72 20 2a 61 7a 43 6f 6c 73 5b 5d 20 3d 20 7b  ar *azCols[] = {
28a50 0a 20 20 20 20 22 6e 61 6d 65 22 2c 0a 20 20 20  .    "name",.   
28a60 20 22 6c 73 6d 6f 64 65 28 6d 6f 64 65 29 2c 20   "lsmode(mode), 
28a70 73 7a 2c 20 64 61 74 65 74 69 6d 65 28 6d 74 69  sz, datetime(mti
28a80 6d 65 2c 20 27 75 6e 69 78 65 70 6f 63 68 27 29  me, 'unixepoch')
28a90 2c 20 6e 61 6d 65 22 0a 20 20 7d 3b 0a 0a 20 20  , name".  };..  
28aa0 63 68 61 72 20 2a 7a 57 68 65 72 65 20 3d 20 30  char *zWhere = 0
28ab0 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  ;.  sqlite3_stmt
28ac0 20 2a 70 53 71 6c 20 3d 20 30 3b 0a 20 20 69 6e   *pSql = 0;.  in
28ad0 74 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 61 72  t rc;..  rc = ar
28ae0 43 68 65 63 6b 45 6e 74 72 69 65 73 28 70 41 72  CheckEntries(pAr
28af0 29 3b 0a 20 20 61 72 57 68 65 72 65 43 6c 61 75  );.  arWhereClau
28b00 73 65 28 26 72 63 2c 20 70 41 72 2c 20 26 7a 57  se(&rc, pAr, &zW
28b10 68 65 72 65 29 3b 0a 0a 20 20 73 68 65 6c 6c 50  here);..  shellP
28b20 72 65 70 61 72 65 50 72 69 6e 74 66 28 70 41 72  reparePrintf(pAr
28b30 2d 3e 64 62 2c 20 26 72 63 2c 20 26 70 53 71 6c  ->db, &rc, &pSql
28b40 2c 20 7a 53 71 6c 2c 20 61 7a 43 6f 6c 73 5b 70  , zSql, azCols[p
28b50 41 72 2d 3e 62 56 65 72 62 6f 73 65 5d 2c 0a 20  Ar->bVerbose],. 
28b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28b70 20 20 20 20 70 41 72 2d 3e 7a 53 72 63 54 61 62      pAr->zSrcTab
28b80 6c 65 2c 20 7a 57 68 65 72 65 29 3b 0a 20 20 69  le, zWhere);.  i
28b90 66 28 20 70 41 72 2d 3e 62 44 72 79 52 75 6e 20  f( pAr->bDryRun 
28ba0 29 7b 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e  ){.    utf8_prin
28bb0 74 66 28 70 41 72 2d 3e 70 2d 3e 6f 75 74 2c 20  tf(pAr->p->out, 
28bc0 22 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f  "%s\n", sqlite3_
28bd0 73 71 6c 28 70 53 71 6c 29 29 3b 0a 20 20 7d 65  sql(pSql));.  }e
28be0 6c 73 65 7b 0a 20 20 20 20 77 68 69 6c 65 28 20  lse{.    while( 
28bf0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
28c00 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c   SQLITE_ROW==sql
28c10 69 74 65 33 5f 73 74 65 70 28 70 53 71 6c 29 20  ite3_step(pSql) 
28c20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 41 72  ){.      if( pAr
28c30 2d 3e 62 56 65 72 62 6f 73 65 20 29 7b 0a 20 20  ->bVerbose ){.  
28c40 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
28c50 66 28 70 41 72 2d 3e 70 2d 3e 6f 75 74 2c 20 22  f(pAr->p->out, "
28c60 25 73 20 25 20 31 30 64 20 20 25 73 20 20 25 73  %s % 10d  %s  %s
28c70 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
28c80 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
28c90 74 65 78 74 28 70 53 71 6c 2c 20 30 29 2c 0a 20  text(pSql, 0),. 
28ca0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
28cb0 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53  e3_column_int(pS
28cc0 71 6c 2c 20 31 29 2c 20 0a 20 20 20 20 20 20 20  ql, 1), .       
28cd0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6f 6c       sqlite3_col
28ce0 75 6d 6e 5f 74 65 78 74 28 70 53 71 6c 2c 20 32  umn_text(pSql, 2
28cf0 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ),.            s
28d00 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
28d10 78 74 28 70 53 71 6c 2c 20 33 29 0a 20 20 20 20  xt(pSql, 3).    
28d20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 65 6c      );.      }el
28d30 73 65 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38  se{.        utf8
28d40 5f 70 72 69 6e 74 66 28 70 41 72 2d 3e 70 2d 3e  _printf(pAr->p->
28d50 6f 75 74 2c 20 22 25 73 5c 6e 22 2c 20 73 71 6c  out, "%s\n", sql
28d60 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  ite3_column_text
28d70 28 70 53 71 6c 2c 20 30 29 29 3b 0a 20 20 20 20  (pSql, 0));.    
28d80 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
28d90 73 68 65 6c 6c 46 69 6e 61 6c 69 7a 65 28 26 72  shellFinalize(&r
28da0 63 2c 20 70 53 71 6c 29 3b 0a 20 20 73 71 6c 69  c, pSql);.  sqli
28db0 74 65 33 5f 66 72 65 65 28 7a 57 68 65 72 65 29  te3_free(zWhere)
28dc0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
28dd0 0a 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65  .../*.** Impleme
28de0 6e 74 61 74 69 6f 6e 20 6f 66 20 2e 61 72 20 22  ntation of .ar "
28df0 65 58 74 72 61 63 74 22 20 63 6f 6d 6d 61 6e 64  eXtract" command
28e00 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  . .*/.static int
28e10 20 61 72 45 78 74 72 61 63 74 43 6f 6d 6d 61 6e   arExtractComman
28e20 64 28 41 72 43 6f 6d 6d 61 6e 64 20 2a 70 41 72  d(ArCommand *pAr
28e30 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ){.  const char 
28e40 2a 7a 53 71 6c 31 20 3d 20 0a 20 20 20 20 22 53  *zSql1 = .    "S
28e50 45 4c 45 43 54 20 22 0a 20 20 20 20 22 20 28 24  ELECT ".    " ($
28e60 64 69 72 20 7c 7c 20 6e 61 6d 65 29 2c 22 0a 20  dir || name),". 
28e70 20 20 20 22 20 77 72 69 74 65 66 69 6c 65 28 28     " writefile((
28e80 24 64 69 72 20 7c 7c 20 6e 61 6d 65 29 2c 20 25  $dir || name), %
28e90 73 2c 20 6d 6f 64 65 2c 20 6d 74 69 6d 65 29 20  s, mode, mtime) 
28ea0 22 0a 20 20 20 20 22 46 52 4f 4d 20 25 73 20 57  ".    "FROM %s W
28eb0 48 45 52 45 20 28 25 73 29 20 41 4e 44 20 28 64  HERE (%s) AND (d
28ec0 61 74 61 20 49 53 20 4e 55 4c 4c 20 4f 52 20 24  ata IS NULL OR $
28ed0 64 69 72 4f 6e 6c 79 20 3d 20 30 29 22 0a 20 20  dirOnly = 0)".  
28ee0 20 20 22 20 41 4e 44 20 6e 61 6d 65 20 4e 4f 54    " AND name NOT
28ef0 20 47 4c 4f 42 20 27 2a 2e 2e 5b 2f 5c 5c 5d 2a   GLOB '*..[/\\]*
28f00 27 22 3b 0a 0a 20 20 63 6f 6e 73 74 20 63 68 61  '";..  const cha
28f10 72 20 2a 61 7a 45 78 74 72 61 41 72 67 5b 5d 20  r *azExtraArg[] 
28f20 3d 20 7b 20 0a 20 20 20 20 22 73 71 6c 61 72 5f  = { .    "sqlar_
28f30 75 6e 63 6f 6d 70 72 65 73 73 28 64 61 74 61 2c  uncompress(data,
28f40 20 73 7a 29 22 2c 0a 20 20 20 20 22 64 61 74 61   sz)",.    "data
28f50 22 0a 20 20 7d 3b 0a 0a 20 20 73 71 6c 69 74 65  ".  };..  sqlite
28f60 33 5f 73 74 6d 74 20 2a 70 53 71 6c 20 3d 20 30  3_stmt *pSql = 0
28f70 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
28f80 49 54 45 5f 4f 4b 3b 0a 20 20 63 68 61 72 20 2a  ITE_OK;.  char *
28f90 7a 44 69 72 20 3d 20 30 3b 0a 20 20 63 68 61 72  zDir = 0;.  char
28fa0 20 2a 7a 57 68 65 72 65 20 3d 20 30 3b 0a 20 20   *zWhere = 0;.  
28fb0 69 6e 74 20 69 2c 20 6a 3b 0a 0a 20 20 2f 2a 20  int i, j;..  /* 
28fc0 49 66 20 61 72 67 75 6d 65 6e 74 73 20 61 72 65  If arguments are
28fd0 20 73 70 65 63 69 66 69 65 64 2c 20 63 68 65 63   specified, chec
28fe0 6b 20 74 68 61 74 20 74 68 65 79 20 61 63 74 75  k that they actu
28ff0 61 6c 6c 79 20 65 78 69 73 74 20 77 69 74 68 69  ally exist withi
29000 6e 0a 20 20 2a 2a 20 74 68 65 20 61 72 63 68 69  n.  ** the archi
29010 76 65 20 62 65 66 6f 72 65 20 70 72 6f 63 65 65  ve before procee
29020 64 69 6e 67 2e 20 41 6e 64 20 66 6f 72 6d 75 6c  ding. And formul
29030 61 74 65 20 61 20 57 48 45 52 45 20 63 6c 61 75  ate a WHERE clau
29040 73 65 20 74 6f 0a 20 20 2a 2a 20 6d 61 74 63 68  se to.  ** match
29050 20 74 68 65 6d 2e 20 20 2a 2f 0a 20 20 72 63 20   them.  */.  rc 
29060 3d 20 61 72 43 68 65 63 6b 45 6e 74 72 69 65 73  = arCheckEntries
29070 28 70 41 72 29 3b 0a 20 20 61 72 57 68 65 72 65  (pAr);.  arWhere
29080 43 6c 61 75 73 65 28 26 72 63 2c 20 70 41 72 2c  Clause(&rc, pAr,
29090 20 26 7a 57 68 65 72 65 29 3b 0a 0a 20 20 69 66   &zWhere);..  if
290a0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
290b0 29 7b 0a 20 20 20 20 69 66 28 20 70 41 72 2d 3e  ){.    if( pAr->
290c0 7a 44 69 72 20 29 7b 0a 20 20 20 20 20 20 7a 44  zDir ){.      zD
290d0 69 72 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  ir = sqlite3_mpr
290e0 69 6e 74 66 28 22 25 73 2f 22 2c 20 70 41 72 2d  intf("%s/", pAr-
290f0 3e 7a 44 69 72 29 3b 0a 20 20 20 20 7d 65 6c 73  >zDir);.    }els
29100 65 7b 0a 20 20 20 20 20 20 7a 44 69 72 20 3d 20  e{.      zDir = 
29110 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
29120 22 22 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  "");.    }.    i
29130 66 28 20 7a 44 69 72 3d 3d 30 20 29 20 72 63 20  f( zDir==0 ) rc 
29140 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
29150 20 20 7d 0a 0a 20 20 73 68 65 6c 6c 50 72 65 70    }..  shellPrep
29160 61 72 65 50 72 69 6e 74 66 28 70 41 72 2d 3e 64  arePrintf(pAr->d
29170 62 2c 20 26 72 63 2c 20 26 70 53 71 6c 2c 20 7a  b, &rc, &pSql, z
29180 53 71 6c 31 2c 20 0a 20 20 20 20 20 20 61 7a 45  Sql1, .      azE
29190 78 74 72 61 41 72 67 5b 70 41 72 2d 3e 62 5a 69  xtraArg[pAr->bZi
291a0 70 5d 2c 20 70 41 72 2d 3e 7a 53 72 63 54 61 62  p], pAr->zSrcTab
291b0 6c 65 2c 20 7a 57 68 65 72 65 0a 20 20 29 3b 0a  le, zWhere.  );.
291c0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
291d0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 6a 20 3d 20  E_OK ){.    j = 
291e0 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61 72  sqlite3_bind_par
291f0 61 6d 65 74 65 72 5f 69 6e 64 65 78 28 70 53 71  ameter_index(pSq
29200 6c 2c 20 22 24 64 69 72 22 29 3b 0a 20 20 20 20  l, "$dir");.    
29210 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78  sqlite3_bind_tex
29220 74 28 70 53 71 6c 2c 20 6a 2c 20 7a 44 69 72 2c  t(pSql, j, zDir,
29230 20 2d 31 2c 20 53 51 4c 49 54 45 5f 53 54 41 54   -1, SQLITE_STAT
29240 49 43 29 3b 0a 0a 20 20 20 20 2f 2a 20 52 75 6e  IC);..    /* Run
29250 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   the SELECT stat
29260 65 6d 65 6e 74 20 74 77 69 63 65 2e 20 54 68 65  ement twice. The
29270 20 66 69 72 73 74 20 74 69 6d 65 2c 20 77 72 69   first time, wri
29280 74 65 66 69 6c 65 28 29 20 69 73 20 63 61 6c 6c  tefile() is call
29290 65 64 0a 20 20 20 20 2a 2a 20 66 6f 72 20 61 6c  ed.    ** for al
292a0 6c 20 61 72 63 68 69 76 65 20 6d 65 6d 62 65 72  l archive member
292b0 73 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65  s that should be
292c0 20 65 78 74 72 61 63 74 65 64 2e 20 54 68 65 20   extracted. The 
292d0 73 65 63 6f 6e 64 20 74 69 6d 65 2c 0a 20 20 20  second time,.   
292e0 20 2a 2a 20 6f 6e 6c 79 20 66 6f 72 20 74 68 65   ** only for the
292f0 20 64 69 72 65 63 74 6f 72 69 65 73 2e 20 54 68   directories. Th
29300 69 73 20 69 73 20 62 65 63 61 75 73 65 20 74 68  is is because th
29310 65 20 74 69 6d 65 73 74 61 6d 70 73 20 66 6f 72  e timestamps for
29320 0a 20 20 20 20 2a 2a 20 65 78 74 72 61 63 74 65  .    ** extracte
29330 64 20 64 69 72 65 63 74 6f 72 69 65 73 20 6d 75  d directories mu
29340 73 74 20 62 65 20 72 65 73 65 74 20 61 66 74 65  st be reset afte
29350 72 20 74 68 65 79 20 61 72 65 20 70 6f 70 75 6c  r they are popul
29360 61 74 65 64 20 28 61 73 0a 20 20 20 20 2a 2a 20  ated (as.    ** 
29370 70 6f 70 75 6c 61 74 69 6e 67 20 74 68 65 6d 20  populating them 
29380 63 68 61 6e 67 65 73 20 74 68 65 20 74 69 6d 65  changes the time
29390 73 74 61 6d 70 29 2e 20 20 2a 2f 0a 20 20 20 20  stamp).  */.    
293a0 66 6f 72 28 69 3d 30 3b 20 69 3c 32 3b 20 69 2b  for(i=0; i<2; i+
293b0 2b 29 7b 0a 20 20 20 20 20 20 6a 20 3d 20 73 71  +){.      j = sq
293c0 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d  lite3_bind_param
293d0 65 74 65 72 5f 69 6e 64 65 78 28 70 53 71 6c 2c  eter_index(pSql,
293e0 20 22 24 64 69 72 4f 6e 6c 79 22 29 3b 0a 20 20   "$dirOnly");.  
293f0 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64      sqlite3_bind
29400 5f 69 6e 74 28 70 53 71 6c 2c 20 6a 2c 20 69 29  _int(pSql, j, i)
29410 3b 0a 20 20 20 20 20 20 69 66 28 20 70 41 72 2d  ;.      if( pAr-
29420 3e 62 44 72 79 52 75 6e 20 29 7b 0a 20 20 20 20  >bDryRun ){.    
29430 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
29440 70 41 72 2d 3e 70 2d 3e 6f 75 74 2c 20 22 25 73  pAr->p->out, "%s
29450 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f 73 71 6c  \n", sqlite3_sql
29460 28 70 53 71 6c 29 29 3b 0a 20 20 20 20 20 20 7d  (pSql));.      }
29470 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 77 68  else{.        wh
29480 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ile( rc==SQLITE_
29490 4f 4b 20 26 26 20 53 51 4c 49 54 45 5f 52 4f 57  OK && SQLITE_ROW
294a0 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70  ==sqlite3_step(p
294b0 53 71 6c 29 20 29 7b 0a 20 20 20 20 20 20 20 20  Sql) ){.        
294c0 20 20 69 66 28 20 69 3d 3d 30 20 26 26 20 70 41    if( i==0 && pA
294d0 72 2d 3e 62 56 65 72 62 6f 73 65 20 29 7b 0a 20  r->bVerbose ){. 
294e0 20 20 20 20 20 20 20 20 20 20 20 75 74 66 38 5f             utf8_
294f0 70 72 69 6e 74 66 28 70 41 72 2d 3e 70 2d 3e 6f  printf(pAr->p->o
29500 75 74 2c 20 22 25 73 5c 6e 22 2c 20 73 71 6c 69  ut, "%s\n", sqli
29510 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28  te3_column_text(
29520 70 53 71 6c 2c 20 30 29 29 3b 0a 20 20 20 20 20  pSql, 0));.     
29530 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
29540 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
29550 68 65 6c 6c 52 65 73 65 74 28 26 72 63 2c 20 70  hellReset(&rc, p
29560 53 71 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Sql);.    }.    
29570 73 68 65 6c 6c 46 69 6e 61 6c 69 7a 65 28 26 72  shellFinalize(&r
29580 63 2c 20 70 53 71 6c 29 3b 0a 20 20 7d 0a 0a 20  c, pSql);.  }.. 
29590 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 44   sqlite3_free(zD
295a0 69 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  ir);.  sqlite3_f
295b0 72 65 65 28 7a 57 68 65 72 65 29 3b 0a 20 20 72  ree(zWhere);.  r
295c0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
295d0 2a 2a 20 52 75 6e 20 74 68 65 20 53 51 4c 20 73  ** Run the SQL s
295e0 74 61 74 65 6d 65 6e 74 20 69 6e 20 7a 53 71 6c  tatement in zSql
295f0 2e 20 20 4f 72 20 69 66 20 64 6f 69 6e 67 20 61  .  Or if doing a
29600 20 2d 2d 64 72 79 72 75 6e 2c 20 6d 65 72 65 6c   --dryrun, merel
29610 79 20 70 72 69 6e 74 20 69 74 20 6f 75 74 2e 0a  y print it out..
29620 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 72  */.static int ar
29630 45 78 65 63 53 71 6c 28 41 72 43 6f 6d 6d 61 6e  ExecSql(ArComman
29640 64 20 2a 70 41 72 2c 20 63 6f 6e 73 74 20 63 68  d *pAr, const ch
29650 61 72 20 2a 7a 53 71 6c 29 7b 0a 20 20 69 6e 74  ar *zSql){.  int
29660 20 72 63 3b 0a 20 20 69 66 28 20 70 41 72 2d 3e   rc;.  if( pAr->
29670 62 44 72 79 52 75 6e 20 29 7b 0a 20 20 20 20 75  bDryRun ){.    u
29680 74 66 38 5f 70 72 69 6e 74 66 28 70 41 72 2d 3e  tf8_printf(pAr->
29690 70 2d 3e 6f 75 74 2c 20 22 25 73 5c 6e 22 2c 20  p->out, "%s\n", 
296a0 7a 53 71 6c 29 3b 0a 20 20 20 20 72 63 20 3d 20  zSql);.    rc = 
296b0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c  SQLITE_OK;.  }el
296c0 73 65 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 45  se{.    char *zE
296d0 72 72 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d  rr = 0;.    rc =
296e0 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 41   sqlite3_exec(pA
296f0 72 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 30 2c 20  r->db, zSql, 0, 
29700 30 2c 20 26 7a 45 72 72 29 3b 0a 20 20 20 20 69  0, &zErr);.    i
29710 66 28 20 7a 45 72 72 20 29 7b 0a 20 20 20 20 20  f( zErr ){.     
29720 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64   utf8_printf(std
29730 6f 75 74 2c 20 22 45 52 52 4f 52 3a 20 25 73 5c  out, "ERROR: %s\
29740 6e 22 2c 20 7a 45 72 72 29 3b 0a 20 20 20 20 20  n", zErr);.     
29750 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 45   sqlite3_free(zE
29760 72 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  rr);.    }.  }. 
29770 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a   return rc;.}...
29780 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61  /*.** Implementa
29790 74 69 6f 6e 20 6f 66 20 2e 61 72 20 22 63 72 65  tion of .ar "cre
297a0 61 74 65 22 20 61 6e 64 20 22 75 70 64 61 74 65  ate" and "update
297b0 22 20 63 6f 6d 6d 61 6e 64 73 2e 0a 2a 2a 0a 2a  " commands..**.*
297c0 2a 20 43 72 65 61 74 65 20 74 68 65 20 22 73 71  * Create the "sq
297d0 6c 61 72 22 20 74 61 62 6c 65 20 69 6e 20 74 68  lar" table in th
297e0 65 20 64 61 74 61 62 61 73 65 20 69 66 20 69 74  e database if it
297f0 20 64 6f 65 73 20 6e 6f 74 20 61 6c 72 65 61 64   does not alread
29800 79 20 65 78 69 73 74 2e 0a 2a 2a 20 54 68 65 6e  y exist..** Then
29810 20 61 64 64 20 65 61 63 68 20 66 69 6c 65 20 69   add each file i
29820 6e 20 74 68 65 20 61 7a 46 69 6c 65 5b 5d 20 61  n the azFile[] a
29830 72 72 61 79 20 74 6f 20 74 68 65 20 61 72 63 68  rray to the arch
29840 69 76 65 2e 20 44 69 72 65 63 74 6f 72 69 65 73  ive. Directories
29850 0a 2a 2a 20 61 72 65 20 61 64 64 65 64 20 72 65  .** are added re
29860 63 75 72 73 69 76 65 6c 79 2e 20 49 66 20 61 72  cursively. If ar
29870 67 75 6d 65 6e 74 20 62 56 65 72 62 6f 73 65 20  gument bVerbose 
29880 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 61 20 6d  is non-zero, a m
29890 65 73 73 61 67 65 20 69 73 0a 2a 2a 20 70 72 69  essage is.** pri
298a0 6e 74 65 64 20 6f 6e 20 73 74 64 6f 75 74 20 66  nted on stdout f
298b0 6f 72 20 65 61 63 68 20 66 69 6c 65 20 61 72 63  or each file arc
298c0 68 69 76 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  hived..**.** The
298d0 20 63 72 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20   create command 
298e0 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 75  is the same as u
298f0 70 64 61 74 65 2c 20 65 78 63 65 70 74 20 74 68  pdate, except th
29900 61 74 20 69 74 20 64 72 6f 70 73 0a 2a 2a 20 61  at it drops.** a
29910 6e 79 20 65 78 69 73 74 69 6e 67 20 22 73 71 6c  ny existing "sql
29920 61 72 22 20 74 61 62 6c 65 20 62 65 66 6f 72 65  ar" table before
29930 20 62 65 67 69 6e 6e 69 6e 67 2e 0a 2a 2f 0a 73   beginning..*/.s
29940 74 61 74 69 63 20 69 6e 74 20 61 72 43 72 65 61  tatic int arCrea
29950 74 65 4f 72 55 70 64 61 74 65 43 6f 6d 6d 61 6e  teOrUpdateComman
29960 64 28 0a 20 20 41 72 43 6f 6d 6d 61 6e 64 20 2a  d(.  ArCommand *
29970 70 41 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  pAr,            
29980 20 20 20 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20       /* Command 
29990 61 72 67 75 6d 65 6e 74 73 20 61 6e 64 20 6f 70  arguments and op
299a0 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 62  tions */.  int b
299b0 55 70 64 61 74 65 20 20 20 20 20 20 20 20 20 20  Update          
299c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 74 72             /* tr
299d0 75 65 20 66 6f 72 20 61 20 2d 2d 63 72 65 61 74  ue for a --creat
299e0 65 2e 20 20 66 61 6c 73 65 20 66 6f 72 20 2d 2d  e.  false for --
299f0 75 70 64 61 74 65 20 2a 2f 0a 29 7b 0a 20 20 63  update */.){.  c
29a00 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 72 65 61  onst char *zCrea
29a10 74 65 20 3d 20 0a 20 20 20 20 20 20 22 43 52 45  te = .      "CRE
29a20 41 54 45 20 54 41 42 4c 45 20 49 46 20 4e 4f 54  ATE TABLE IF NOT
29a30 20 45 58 49 53 54 53 20 73 71 6c 61 72 28 5c 6e   EXISTS sqlar(\n
29a40 22 0a 20 20 20 20 20 20 22 20 20 6e 61 6d 65 20  ".      "  name 
29a50 54 45 58 54 20 50 52 49 4d 41 52 59 20 4b 45 59  TEXT PRIMARY KEY
29a60 2c 20 20 2d 2d 20 6e 61 6d 65 20 6f 66 20 74 68  ,  -- name of th
29a70 65 20 66 69 6c 65 5c 6e 22 0a 20 20 20 20 20 20  e file\n".      
29a80 22 20 20 6d 6f 64 65 20 49 4e 54 2c 20 20 20 20  "  mode INT,    
29a90 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20 61 63             -- ac
29aa0 63 65 73 73 20 70 65 72 6d 69 73 73 69 6f 6e 73  cess permissions
29ab0 5c 6e 22 0a 20 20 20 20 20 20 22 20 20 6d 74 69  \n".      "  mti
29ac0 6d 65 20 49 4e 54 2c 20 20 20 20 20 20 20 20 20  me INT,         
29ad0 20 20 20 20 20 2d 2d 20 6c 61 73 74 20 6d 6f 64       -- last mod
29ae0 69 66 69 63 61 74 69 6f 6e 20 74 69 6d 65 5c 6e  ification time\n
29af0 22 0a 20 20 20 20 20 20 22 20 20 73 7a 20 49 4e  ".      "  sz IN
29b00 54 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  T,              
29b10 20 20 20 2d 2d 20 6f 72 69 67 69 6e 61 6c 20 66     -- original f
29b20 69 6c 65 20 73 69 7a 65 5c 6e 22 0a 20 20 20 20  ile size\n".    
29b30 20 20 22 20 20 64 61 74 61 20 42 4c 4f 42 20 20    "  data BLOB  
29b40 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20               -- 
29b50 63 6f 6d 70 72 65 73 73 65 64 20 63 6f 6e 74 65  compressed conte
29b60 6e 74 5c 6e 22 0a 20 20 20 20 20 20 22 29 22 3b  nt\n".      ")";
29b70 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
29b80 44 72 6f 70 20 3d 20 22 44 52 4f 50 20 54 41 42  Drop = "DROP TAB
29b90 4c 45 20 49 46 20 45 58 49 53 54 53 20 73 71 6c  LE IF EXISTS sql
29ba0 61 72 22 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  ar";.  const cha
29bb0 72 20 2a 7a 49 6e 73 65 72 74 46 6d 74 5b 32 5d  r *zInsertFmt[2]
29bc0 20 3d 20 7b 0a 20 20 20 20 20 22 52 45 50 4c 41   = {.     "REPLA
29bd0 43 45 20 49 4e 54 4f 20 25 73 28 6e 61 6d 65 2c  CE INTO %s(name,
29be0 6d 6f 64 65 2c 6d 74 69 6d 65 2c 73 7a 2c 64 61  mode,mtime,sz,da
29bf0 74 61 29 5c 6e 22 0a 20 20 20 20 20 22 20 20 53  ta)\n".     "  S
29c00 45 4c 45 43 54 5c 6e 22 0a 20 20 20 20 20 22 20  ELECT\n".     " 
29c10 20 20 20 25 73 2c 5c 6e 22 0a 20 20 20 20 20 22     %s,\n".     "
29c20 20 20 20 20 6d 6f 64 65 2c 5c 6e 22 0a 20 20 20      mode,\n".   
29c30 20 20 22 20 20 20 20 6d 74 69 6d 65 2c 5c 6e 22    "    mtime,\n"
29c40 0a 20 20 20 20 20 22 20 20 20 20 43 41 53 45 20  .     "    CASE 
29c50 73 75 62 73 74 72 28 6c 73 6d 6f 64 65 28 6d 6f  substr(lsmode(mo
29c60 64 65 29 2c 31 2c 31 29 5c 6e 22 0a 20 20 20 20  de),1,1)\n".    
29c70 20 22 20 20 20 20 20 20 57 48 45 4e 20 27 2d 27   "      WHEN '-'
29c80 20 54 48 45 4e 20 6c 65 6e 67 74 68 28 64 61 74   THEN length(dat
29c90 61 29 5c 6e 22 0a 20 20 20 20 20 22 20 20 20 20  a)\n".     "    
29ca0 20 20 57 48 45 4e 20 27 64 27 20 54 48 45 4e 20    WHEN 'd' THEN 
29cb0 30 5c 6e 22 0a 20 20 20 20 20 22 20 20 20 20 20  0\n".     "     
29cc0 20 45 4c 53 45 20 2d 31 20 45 4e 44 2c 5c 6e 22   ELSE -1 END,\n"
29cd0 0a 20 20 20 20 20 22 20 20 20 20 73 71 6c 61 72  .     "    sqlar
29ce0 5f 63 6f 6d 70 72 65 73 73 28 64 61 74 61 29 5c  _compress(data)\
29cf0 6e 22 0a 20 20 20 20 20 22 20 20 46 52 4f 4d 20  n".     "  FROM 
29d00 66 73 64 69 72 28 25 51 2c 25 51 29 5c 6e 22 0a  fsdir(%Q,%Q)\n".
29d10 20 20 20 20 20 22 20 20 57 48 45 52 45 20 6c 73       "  WHERE ls
29d20 6d 6f 64 65 28 6d 6f 64 65 29 20 4e 4f 54 20 4c  mode(mode) NOT L
29d30 49 4b 45 20 27 3f 25 25 27 3b 22 2c 0a 20 20 20  IKE '?%%';",.   
29d40 20 20 22 52 45 50 4c 41 43 45 20 49 4e 54 4f 20    "REPLACE INTO 
29d50 25 73 28 6e 61 6d 65 2c 6d 6f 64 65 2c 6d 74 69  %s(name,mode,mti
29d60 6d 65 2c 64 61 74 61 29 5c 6e 22 0a 20 20 20 20  me,data)\n".    
29d70 20 22 20 20 53 45 4c 45 43 54 5c 6e 22 0a 20 20   "  SELECT\n".  
29d80 20 20 20 22 20 20 20 20 25 73 2c 5c 6e 22 0a 20     "    %s,\n". 
29d90 20 20 20 20 22 20 20 20 20 6d 6f 64 65 2c 5c 6e      "    mode,\n
29da0 22 0a 20 20 20 20 20 22 20 20 20 20 6d 74 69 6d  ".     "    mtim
29db0 65 2c 5c 6e 22 0a 20 20 20 20 20 22 20 20 20 20  e,\n".     "    
29dc0 64 61 74 61 5c 6e 22 0a 20 20 20 20 20 22 20 20  data\n".     "  
29dd0 46 52 4f 4d 20 66 73 64 69 72 28 25 51 2c 25 51  FROM fsdir(%Q,%Q
29de0 29 5c 6e 22 0a 20 20 20 20 20 22 20 20 57 48 45  )\n".     "  WHE
29df0 52 45 20 6c 73 6d 6f 64 65 28 6d 6f 64 65 29 20  RE lsmode(mode) 
29e00 4e 4f 54 20 4c 49 4b 45 20 27 3f 25 25 27 3b 22  NOT LIKE '?%%';"
29e10 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69 3b 20 20  .  };.  int i;  
29e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29e30 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 69          /* For i
29e40 74 65 72 61 74 69 6e 67 20 74 68 72 6f 75 67 68  terating through
29e50 20 61 7a 46 69 6c 65 5b 5d 20 2a 2f 0a 20 20 69   azFile[] */.  i
29e60 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
29e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
29e80 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
29e90 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
29ea0 54 61 62 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Tab = 0;        
29eb0 20 20 20 2f 2a 20 53 51 4c 20 74 61 62 6c 65 20     /* SQL table 
29ec0 69 6e 74 6f 20 77 68 69 63 68 20 74 6f 20 69 6e  into which to in
29ed0 73 65 72 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a  sert */.  char *
29ee0 7a 53 71 6c 3b 0a 20 20 63 68 61 72 20 7a 54 65  zSql;.  char zTe
29ef0 6d 70 5b 35 30 5d 3b 0a 0a 20 20 61 72 45 78 65  mp[50];..  arExe
29f00 63 53 71 6c 28 70 41 72 2c 20 22 50 52 41 47 4d  cSql(pAr, "PRAGM
29f10 41 20 70 61 67 65 5f 73 69 7a 65 3d 35 31 32 22  A page_size=512"
29f20 29 3b 0a 20 20 72 63 20 3d 20 61 72 45 78 65 63  );.  rc = arExec
29f30 53 71 6c 28 70 41 72 2c 20 22 53 41 56 45 50 4f  Sql(pAr, "SAVEPO
29f40 49 4e 54 20 61 72 3b 22 29 3b 0a 20 20 69 66 28  INT ar;");.  if(
29f50 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
29f60 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7a 54   return rc;.  zT
29f70 65 6d 70 5b 30 5d 20 3d 20 30 3b 20 0a 20 20 69  emp[0] = 0; .  i
29f80 66 28 20 70 41 72 2d 3e 62 5a 69 70 20 29 7b 0a  f( pAr->bZip ){.
29f90 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a      /* Initializ
29fa0 65 20 74 68 65 20 7a 69 70 66 69 6c 65 20 76 69  e the zipfile vi
29fb0 72 74 75 61 6c 20 74 61 62 6c 65 2c 20 69 66 20  rtual table, if 
29fc0 6e 65 63 65 73 73 61 72 79 20 2a 2f 0a 20 20 20  necessary */.   
29fd0 20 69 66 28 20 70 41 72 2d 3e 7a 46 69 6c 65 20   if( pAr->zFile 
29fe0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
29ff0 5f 75 69 6e 74 36 34 20 72 3b 0a 20 20 20 20 20  _uint64 r;.     
2a000 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e   sqlite3_randomn
2a010 65 73 73 28 73 69 7a 65 6f 66 28 72 29 2c 26 72  ess(sizeof(r),&r
2a020 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
2a030 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66  _snprintf(sizeof
2a040 28 7a 54 65 6d 70 29 2c 7a 54 65 6d 70 2c 22 7a  (zTemp),zTemp,"z
2a050 69 70 25 30 31 36 6c 6c 78 22 2c 72 29 3b 0a 20  ip%016llx",r);. 
2a060 20 20 20 20 20 7a 54 61 62 20 3d 20 7a 54 65 6d       zTab = zTem
2a070 70 3b 0a 20 20 20 20 20 20 7a 53 71 6c 20 3d 20  p;.      zSql = 
2a080 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
2a090 0a 20 20 20 20 20 20 20 20 20 22 43 52 45 41 54  .         "CREAT
2a0a0 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20  E VIRTUAL TABLE 
2a0b0 74 65 6d 70 2e 25 73 20 55 53 49 4e 47 20 7a 69  temp.%s USING zi
2a0c0 70 66 69 6c 65 28 25 51 29 22 2c 0a 20 20 20 20  pfile(%Q)",.    
2a0d0 20 20 20 20 20 7a 54 61 62 2c 20 70 41 72 2d 3e       zTab, pAr->
2a0e0 7a 46 69 6c 65 0a 20 20 20 20 20 20 29 3b 0a 20  zFile.      );. 
2a0f0 20 20 20 20 20 72 63 20 3d 20 61 72 45 78 65 63       rc = arExec
2a100 53 71 6c 28 70 41 72 2c 20 7a 53 71 6c 29 3b 0a  Sql(pAr, zSql);.
2a110 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
2a120 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20 7d 65  ee(zSql);.    }e
2a130 6c 73 65 7b 0a 20 20 20 20 20 20 7a 54 61 62 20  lse{.      zTab 
2a140 3d 20 22 7a 69 70 22 3b 0a 20 20 20 20 7d 0a 20  = "zip";.    }. 
2a150 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49   }else{.    /* I
2a160 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 74 61  nitialize the ta
2a170 62 6c 65 20 66 6f 72 20 61 6e 20 53 51 4c 41 52  ble for an SQLAR
2a180 20 2a 2f 0a 20 20 20 20 7a 54 61 62 20 3d 20 22   */.    zTab = "
2a190 73 71 6c 61 72 22 3b 0a 20 20 20 20 69 66 28 20  sqlar";.    if( 
2a1a0 62 55 70 64 61 74 65 3d 3d 30 20 29 7b 0a 20 20  bUpdate==0 ){.  
2a1b0 20 20 20 20 72 63 20 3d 20 61 72 45 78 65 63 53      rc = arExecS
2a1c0 71 6c 28 70 41 72 2c 20 7a 44 72 6f 70 29 3b 0a  ql(pAr, zDrop);.
2a1d0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
2a1e0 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 65  LITE_OK ) goto e
2a1f0 6e 64 5f 61 72 5f 74 72 61 6e 73 61 63 74 69 6f  nd_ar_transactio
2a200 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  n;.    }.    rc 
2a210 3d 20 61 72 45 78 65 63 53 71 6c 28 70 41 72 2c  = arExecSql(pAr,
2a220 20 7a 43 72 65 61 74 65 29 3b 0a 20 20 7d 0a 20   zCreate);.  }. 
2a230 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41 72 2d   for(i=0; i<pAr-
2a240 3e 6e 41 72 67 20 26 26 20 72 63 3d 3d 53 51 4c  >nArg && rc==SQL
2a250 49 54 45 5f 4f 4b 3b 20 69 2b 2b 29 7b 0a 20 20  ITE_OK; i++){.  
2a260 20 20 63 68 61 72 20 2a 7a 53 71 6c 32 20 3d 20    char *zSql2 = 
2a270 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
2a280 7a 49 6e 73 65 72 74 46 6d 74 5b 70 41 72 2d 3e  zInsertFmt[pAr->
2a290 62 5a 69 70 5d 2c 20 7a 54 61 62 2c 0a 20 20 20  bZip], zTab,.   
2a2a0 20 20 20 20 20 70 41 72 2d 3e 62 56 65 72 62 6f       pAr->bVerbo
2a2b0 73 65 20 3f 20 22 73 68 65 6c 6c 5f 70 75 74 73  se ? "shell_puts
2a2c0 6e 6c 28 6e 61 6d 65 29 22 20 3a 20 22 6e 61 6d  nl(name)" : "nam
2a2d0 65 22 2c 0a 20 20 20 20 20 20 20 20 70 41 72 2d  e",.        pAr-
2a2e0 3e 61 7a 41 72 67 5b 69 5d 2c 20 70 41 72 2d 3e  >azArg[i], pAr->
2a2f0 7a 44 69 72 29 3b 0a 20 20 20 20 72 63 20 3d 20  zDir);.    rc = 
2a300 61 72 45 78 65 63 53 71 6c 28 70 41 72 2c 20 7a  arExecSql(pAr, z
2a310 53 71 6c 32 29 3b 0a 20 20 20 20 73 71 6c 69 74  Sql2);.    sqlit
2a320 65 33 5f 66 72 65 65 28 7a 53 71 6c 32 29 3b 0a  e3_free(zSql2);.
2a330 20 20 7d 0a 65 6e 64 5f 61 72 5f 74 72 61 6e 73    }.end_ar_trans
2a340 61 63 74 69 6f 6e 3a 0a 20 20 69 66 28 20 72 63  action:.  if( rc
2a350 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
2a360 20 20 20 61 72 45 78 65 63 53 71 6c 28 70 41 72     arExecSql(pAr
2a370 2c 20 22 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 61  , "ROLLBACK TO a
2a380 72 3b 20 52 45 4c 45 41 53 45 20 61 72 3b 22 29  r; RELEASE ar;")
2a390 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
2a3a0 63 20 3d 20 61 72 45 78 65 63 53 71 6c 28 70 41  c = arExecSql(pA
2a3b0 72 2c 20 22 52 45 4c 45 41 53 45 20 61 72 3b 22  r, "RELEASE ar;"
2a3c0 29 3b 0a 20 20 20 20 69 66 28 20 70 41 72 2d 3e  );.    if( pAr->
2a3d0 62 5a 69 70 20 26 26 20 70 41 72 2d 3e 7a 46 69  bZip && pAr->zFi
2a3e0 6c 65 20 29 7b 0a 20 20 20 20 20 20 7a 53 71 6c  le ){.      zSql
2a3f0 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
2a400 74 66 28 22 44 52 4f 50 20 54 41 42 4c 45 20 25  tf("DROP TABLE %
2a410 73 22 2c 20 7a 54 65 6d 70 29 3b 0a 20 20 20 20  s", zTemp);.    
2a420 20 20 61 72 45 78 65 63 53 71 6c 28 70 41 72 2c    arExecSql(pAr,
2a430 20 7a 53 71 6c 29 3b 0a 20 20 20 20 20 20 73 71   zSql);.      sq
2a440 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29  lite3_free(zSql)
2a450 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
2a460 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
2a470 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  * Implementation
2a480 20 6f 66 20 22 2e 61 72 22 20 64 6f 74 20 63 6f   of ".ar" dot co
2a490 6d 6d 61 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  mmand..*/.static
2a4a0 20 69 6e 74 20 61 72 44 6f 74 43 6f 6d 6d 61 6e   int arDotComman
2a4b0 64 28 0a 20 20 53 68 65 6c 6c 53 74 61 74 65 20  d(.  ShellState 
2a4c0 2a 70 53 74 61 74 65 2c 20 20 20 20 20 20 20 20  *pState,        
2a4d0 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20       /* Current 
2a4e0 73 68 65 6c 6c 20 74 6f 6f 6c 20 73 74 61 74 65  shell tool state
2a4f0 20 2a 2f 0a 20 20 69 6e 74 20 66 72 6f 6d 43 6d   */.  int fromCm
2a500 64 4c 69 6e 65 2c 20 20 20 20 20 20 20 20 20 20  dLine,          
2a510 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
2a520 20 2d 41 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65   -A command-line
2a530 20 6f 70 74 69 6f 6e 2c 20 6e 6f 74 20 2e 61 72   option, not .ar
2a540 20 63 6d 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a   cmd */.  char *
2a550 2a 61 7a 41 72 67 2c 20 20 20 20 20 20 20 20 20  *azArg,         
2a560 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72            /* Arr
2a570 61 79 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  ay of arguments 
2a580 70 61 73 73 65 64 20 74 6f 20 64 6f 74 20 63 6f  passed to dot co
2a590 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6e  mmand */.  int n
2a5a0 41 72 67 20 20 20 20 20 20 20 20 20 20 20 20 20  Arg             
2a5b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
2a5c0 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20  mber of entries 
2a5d0 69 6e 20 61 7a 41 72 67 5b 5d 20 2a 2f 0a 29 7b  in azArg[] */.){
2a5e0 0a 20 20 41 72 43 6f 6d 6d 61 6e 64 20 63 6d 64  .  ArCommand cmd
2a5f0 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 6d 65  ;.  int rc;.  me
2a600 6d 73 65 74 28 26 63 6d 64 2c 20 30 2c 20 73 69  mset(&cmd, 0, si
2a610 7a 65 6f 66 28 63 6d 64 29 29 3b 0a 20 20 63 6d  zeof(cmd));.  cm
2a620 64 2e 66 72 6f 6d 43 6d 64 4c 69 6e 65 20 3d 20  d.fromCmdLine = 
2a630 66 72 6f 6d 43 6d 64 4c 69 6e 65 3b 0a 20 20 72  fromCmdLine;.  r
2a640 63 20 3d 20 61 72 50 61 72 73 65 43 6f 6d 6d 61  c = arParseComma
2a650 6e 64 28 61 7a 41 72 67 2c 20 6e 41 72 67 2c 20  nd(azArg, nArg, 
2a660 26 63 6d 64 29 3b 0a 20 20 69 66 28 20 72 63 3d  &cmd);.  if( rc=
2a670 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2a680 20 20 69 6e 74 20 65 44 62 54 79 70 65 20 3d 20    int eDbType = 
2a690 53 48 45 4c 4c 5f 4f 50 45 4e 5f 55 4e 53 50 45  SHELL_OPEN_UNSPE
2a6a0 43 3b 0a 20 20 20 20 63 6d 64 2e 70 20 3d 20 70  C;.    cmd.p = p
2a6b0 53 74 61 74 65 3b 0a 20 20 20 20 63 6d 64 2e 64  State;.    cmd.d
2a6c0 62 20 3d 20 70 53 74 61 74 65 2d 3e 64 62 3b 0a  b = pState->db;.
2a6d0 20 20 20 20 69 66 28 20 63 6d 64 2e 7a 46 69 6c      if( cmd.zFil
2a6e0 65 20 29 7b 0a 20 20 20 20 20 20 65 44 62 54 79  e ){.      eDbTy
2a6f0 70 65 20 3d 20 64 65 64 75 63 65 44 61 74 61 62  pe = deduceDatab
2a700 61 73 65 54 79 70 65 28 63 6d 64 2e 7a 46 69 6c  aseType(cmd.zFil
2a710 65 2c 20 31 29 3b 0a 20 20 20 20 7d 65 6c 73 65  e, 1);.    }else
2a720 7b 0a 20 20 20 20 20 20 65 44 62 54 79 70 65 20  {.      eDbType 
2a730 3d 20 70 53 74 61 74 65 2d 3e 6f 70 65 6e 4d 6f  = pState->openMo
2a740 64 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  de;.    }.    if
2a750 28 20 65 44 62 54 79 70 65 3d 3d 53 48 45 4c 4c  ( eDbType==SHELL
2a760 5f 4f 50 45 4e 5f 5a 49 50 46 49 4c 45 20 29 7b  _OPEN_ZIPFILE ){
2a770 0a 20 20 20 20 20 20 69 66 28 20 63 6d 64 2e 65  .      if( cmd.e
2a780 43 6d 64 3d 3d 41 52 5f 43 4d 44 5f 45 58 54 52  Cmd==AR_CMD_EXTR
2a790 41 43 54 20 7c 7c 20 63 6d 64 2e 65 43 6d 64 3d  ACT || cmd.eCmd=
2a7a0 3d 41 52 5f 43 4d 44 5f 4c 49 53 54 20 29 7b 0a  =AR_CMD_LIST ){.
2a7b0 20 20 20 20 20 20 20 20 69 66 28 20 63 6d 64 2e          if( cmd.
2a7c0 7a 46 69 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20  zFile==0 ){.    
2a7d0 20 20 20 20 20 20 63 6d 64 2e 7a 53 72 63 54 61        cmd.zSrcTa
2a7e0 62 6c 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  ble = sqlite3_mp
2a7f0 72 69 6e 74 66 28 22 7a 69 70 22 29 3b 0a 20 20  rintf("zip");.  
2a800 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2a810 20 20 20 20 20 20 20 63 6d 64 2e 7a 53 72 63 54         cmd.zSrcT
2a820 61 62 6c 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d  able = sqlite3_m
2a830 70 72 69 6e 74 66 28 22 7a 69 70 66 69 6c 65 28  printf("zipfile(
2a840 25 51 29 22 2c 20 63 6d 64 2e 7a 46 69 6c 65 29  %Q)", cmd.zFile)
2a850 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2a860 20 20 7d 0a 20 20 20 20 20 20 63 6d 64 2e 62 5a    }.      cmd.bZ
2a870 69 70 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73  ip = 1;.    }els
2a880 65 20 69 66 28 20 63 6d 64 2e 7a 46 69 6c 65 20  e if( cmd.zFile 
2a890 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 66 6c 61  ){.      int fla
2a8a0 67 73 3b 0a 20 20 20 20 20 20 69 66 28 20 63 6d  gs;.      if( cm
2a8b0 64 2e 62 41 70 70 65 6e 64 20 29 20 65 44 62 54  d.bAppend ) eDbT
2a8c0 79 70 65 20 3d 20 53 48 45 4c 4c 5f 4f 50 45 4e  ype = SHELL_OPEN
2a8d0 5f 41 50 50 45 4e 44 56 46 53 3b 0a 20 20 20 20  _APPENDVFS;.    
2a8e0 20 20 69 66 28 20 63 6d 64 2e 65 43 6d 64 3d 3d    if( cmd.eCmd==
2a8f0 41 52 5f 43 4d 44 5f 43 52 45 41 54 45 20 7c 7c  AR_CMD_CREATE ||
2a900 20 63 6d 64 2e 65 43 6d 64 3d 3d 41 52 5f 43 4d   cmd.eCmd==AR_CM
2a910 44 5f 55 50 44 41 54 45 20 29 7b 0a 20 20 20 20  D_UPDATE ){.    
2a920 20 20 20 20 66 6c 61 67 73 20 3d 20 53 51 4c 49      flags = SQLI
2a930 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
2a940 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52  E|SQLITE_OPEN_CR
2a950 45 41 54 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73  EATE;.      }els
2a960 65 7b 0a 20 20 20 20 20 20 20 20 66 6c 61 67 73  e{.        flags
2a970 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52   = SQLITE_OPEN_R
2a980 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 7d  EADONLY;.      }
2a990 0a 20 20 20 20 20 20 63 6d 64 2e 64 62 20 3d 20  .      cmd.db = 
2a9a0 30 3b 0a 20 20 20 20 20 20 69 66 28 20 63 6d 64  0;.      if( cmd
2a9b0 2e 62 44 72 79 52 75 6e 20 29 7b 0a 20 20 20 20  .bDryRun ){.    
2a9c0 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
2a9d0 70 53 74 61 74 65 2d 3e 6f 75 74 2c 20 22 2d 2d  pState->out, "--
2a9e0 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 27   open database '
2a9f0 25 73 27 25 73 5c 6e 22 2c 20 63 6d 64 2e 7a 46  %s'%s\n", cmd.zF
2aa00 69 6c 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ile,.           
2aa10 20 20 65 44 62 54 79 70 65 3d 3d 53 48 45 4c 4c    eDbType==SHELL
2aa20 5f 4f 50 45 4e 5f 41 50 50 45 4e 44 56 46 53 20  _OPEN_APPENDVFS 
2aa30 3f 20 22 20 75 73 69 6e 67 20 27 61 70 6e 64 76  ? " using 'apndv
2aa40 66 73 27 22 20 3a 20 22 22 29 3b 0a 20 20 20 20  fs'" : "");.    
2aa50 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 73    }.      rc = s
2aa60 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28 63  qlite3_open_v2(c
2aa70 6d 64 2e 7a 46 69 6c 65 2c 20 26 63 6d 64 2e 64  md.zFile, &cmd.d
2aa80 62 2c 20 66 6c 61 67 73 2c 20 0a 20 20 20 20 20  b, flags, .     
2aa90 20 20 20 20 20 20 20 20 65 44 62 54 79 70 65 3d          eDbType=
2aaa0 3d 53 48 45 4c 4c 5f 4f 50 45 4e 5f 41 50 50 45  =SHELL_OPEN_APPE
2aab0 4e 44 56 46 53 20 3f 20 22 61 70 6e 64 76 66 73  NDVFS ? "apndvfs
2aac0 22 20 3a 20 30 29 3b 0a 20 20 20 20 20 20 69 66  " : 0);.      if
2aad0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2aae0 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f  ){.        utf8_
2aaf0 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
2ab00 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 66 69 6c 65  cannot open file
2ab10 3a 20 25 73 20 28 25 73 29 5c 6e 22 2c 20 0a 20  : %s (%s)\n", . 
2ab20 20 20 20 20 20 20 20 20 20 20 20 63 6d 64 2e 7a             cmd.z
2ab30 46 69 6c 65 2c 20 73 71 6c 69 74 65 33 5f 65 72  File, sqlite3_er
2ab40 72 6d 73 67 28 63 6d 64 2e 64 62 29 0a 20 20 20  rmsg(cmd.db).   
2ab50 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
2ab60 67 6f 74 6f 20 65 6e 64 5f 61 72 5f 63 6f 6d 6d  goto end_ar_comm
2ab70 61 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  and;.      }.   
2ab80 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 69     sqlite3_filei
2ab90 6f 5f 69 6e 69 74 28 63 6d 64 2e 64 62 2c 20 30  o_init(cmd.db, 0
2aba0 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
2abb0 74 65 33 5f 73 71 6c 61 72 5f 69 6e 69 74 28 63  te3_sqlar_init(c
2abc0 6d 64 2e 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20  md.db, 0, 0);.  
2abd0 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61      sqlite3_crea
2abe0 74 65 5f 66 75 6e 63 74 69 6f 6e 28 63 6d 64 2e  te_function(cmd.
2abf0 64 62 2c 20 22 73 68 65 6c 6c 5f 70 75 74 73 6e  db, "shell_putsn
2ac00 6c 22 2c 20 31 2c 20 53 51 4c 49 54 45 5f 55 54  l", 1, SQLITE_UT
2ac10 46 38 2c 20 63 6d 64 2e 70 2c 0a 20 20 20 20 20  F8, cmd.p,.     
2ac20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ac30 20 20 20 20 20 20 20 20 20 73 68 65 6c 6c 50 75           shellPu
2ac40 74 73 46 75 6e 63 2c 20 30 2c 20 30 29 3b 0a 0a  tsFunc, 0, 0);..
2ac50 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 63 6d      }.    if( cm
2ac60 64 2e 7a 53 72 63 54 61 62 6c 65 3d 3d 30 20 26  d.zSrcTable==0 &
2ac70 26 20 63 6d 64 2e 62 5a 69 70 3d 3d 30 20 26 26  & cmd.bZip==0 &&
2ac80 20 63 6d 64 2e 65 43 6d 64 21 3d 41 52 5f 43 4d   cmd.eCmd!=AR_CM
2ac90 44 5f 48 45 4c 50 20 29 7b 0a 20 20 20 20 20 20  D_HELP ){.      
2aca0 69 66 28 20 63 6d 64 2e 65 43 6d 64 21 3d 41 52  if( cmd.eCmd!=AR
2acb0 5f 43 4d 44 5f 43 52 45 41 54 45 0a 20 20 20 20  _CMD_CREATE.    
2acc0 20 20 20 26 26 20 73 71 6c 69 74 65 33 5f 74 61     && sqlite3_ta
2acd0 62 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d 65 74 61 64  ble_column_metad
2ace0 61 74 61 28 63 6d 64 2e 64 62 2c 30 2c 22 73 71  ata(cmd.db,0,"sq
2acf0 6c 61 72 22 2c 22 6e 61 6d 65 22 2c 30 2c 30 2c  lar","name",0,0,
2ad00 30 2c 30 2c 30 29 0a 20 20 20 20 20 20 29 7b 0a  0,0,0).      ){.
2ad10 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69          utf8_pri
2ad20 6e 74 66 28 73 74 64 65 72 72 2c 20 22 64 61 74  ntf(stderr, "dat
2ad30 61 62 61 73 65 20 64 6f 65 73 20 6e 6f 74 20 63  abase does not c
2ad40 6f 6e 74 61 69 6e 20 61 6e 20 27 73 71 6c 61 72  ontain an 'sqlar
2ad50 27 20 74 61 62 6c 65 5c 6e 22 29 3b 0a 20 20 20  ' table\n");.   
2ad60 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
2ad70 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20  _ERROR;.        
2ad80 67 6f 74 6f 20 65 6e 64 5f 61 72 5f 63 6f 6d 6d  goto end_ar_comm
2ad90 61 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  and;.      }.   
2ada0 20 20 20 63 6d 64 2e 7a 53 72 63 54 61 62 6c 65     cmd.zSrcTable
2adb0 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
2adc0 74 66 28 22 73 71 6c 61 72 22 29 3b 0a 20 20 20  tf("sqlar");.   
2add0 20 7d 0a 0a 20 20 20 20 73 77 69 74 63 68 28 20   }..    switch( 
2ade0 63 6d 64 2e 65 43 6d 64 20 29 7b 0a 20 20 20 20  cmd.eCmd ){.    
2adf0 20 20 63 61 73 65 20 41 52 5f 43 4d 44 5f 43 52    case AR_CMD_CR
2ae00 45 41 54 45 3a 0a 20 20 20 20 20 20 20 20 72 63  EATE:.        rc
2ae10 20 3d 20 61 72 43 72 65 61 74 65 4f 72 55 70 64   = arCreateOrUpd
2ae20 61 74 65 43 6f 6d 6d 61 6e 64 28 26 63 6d 64 2c  ateCommand(&cmd,
2ae30 20 30 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65   0);.        bre
2ae40 61 6b 3b 0a 0a 20 20 20 20 20 20 63 61 73 65 20  ak;..      case 
2ae50 41 52 5f 43 4d 44 5f 45 58 54 52 41 43 54 3a 0a  AR_CMD_EXTRACT:.
2ae60 20 20 20 20 20 20 20 20 72 63 20 3d 20 61 72 45          rc = arE
2ae70 78 74 72 61 63 74 43 6f 6d 6d 61 6e 64 28 26 63  xtractCommand(&c
2ae80 6d 64 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  md);.        bre
2ae90 61 6b 3b 0a 0a 20 20 20 20 20 20 63 61 73 65 20  ak;..      case 
2aea0 41 52 5f 43 4d 44 5f 4c 49 53 54 3a 0a 20 20 20  AR_CMD_LIST:.   
2aeb0 20 20 20 20 20 72 63 20 3d 20 61 72 4c 69 73 74       rc = arList
2aec0 43 6f 6d 6d 61 6e 64 28 26 63 6d 64 29 3b 0a 20  Command(&cmd);. 
2aed0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20         break;.. 
2aee0 20 20 20 20 20 63 61 73 65 20 41 52 5f 43 4d 44       case AR_CMD
2aef0 5f 48 45 4c 50 3a 0a 20 20 20 20 20 20 20 20 61  _HELP:.        a
2af00 72 55 73 61 67 65 28 70 53 74 61 74 65 2d 3e 6f  rUsage(pState->o
2af10 75 74 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  ut);.        bre
2af20 61 6b 3b 0a 0a 20 20 20 20 20 20 64 65 66 61 75  ak;..      defau
2af30 6c 74 3a 0a 20 20 20 20 20 20 20 20 61 73 73 65  lt:.        asse
2af40 72 74 28 20 63 6d 64 2e 65 43 6d 64 3d 3d 41 52  rt( cmd.eCmd==AR
2af50 5f 43 4d 44 5f 55 50 44 41 54 45 20 29 3b 0a 20  _CMD_UPDATE );. 
2af60 20 20 20 20 20 20 20 72 63 20 3d 20 61 72 43 72         rc = arCr
2af70 65 61 74 65 4f 72 55 70 64 61 74 65 43 6f 6d 6d  eateOrUpdateComm
2af80 61 6e 64 28 26 63 6d 64 2c 20 31 29 3b 0a 20 20  and(&cmd, 1);.  
2af90 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
2afa0 20 7d 0a 20 20 7d 0a 65 6e 64 5f 61 72 5f 63 6f   }.  }.end_ar_co
2afb0 6d 6d 61 6e 64 3a 0a 20 20 69 66 28 20 63 6d 64  mmand:.  if( cmd
2afc0 2e 64 62 21 3d 70 53 74 61 74 65 2d 3e 64 62 20  .db!=pState->db 
2afd0 29 7b 0a 20 20 20 20 63 6c 6f 73 65 5f 64 62 28  ){.    close_db(
2afe0 63 6d 64 2e 64 62 29 3b 0a 20 20 7d 0a 20 20 73  cmd.db);.  }.  s
2aff0 71 6c 69 74 65 33 5f 66 72 65 65 28 63 6d 64 2e  qlite3_free(cmd.
2b000 7a 53 72 63 54 61 62 6c 65 29 3b 0a 0a 20 20 72  zSrcTable);..  r
2b010 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 2f 2a 20 45  eturn rc;.}./* E
2b020 6e 64 20 6f 66 20 74 68 65 20 22 2e 61 72 63 68  nd of the ".arch
2b030 69 76 65 22 20 6f 72 20 22 2e 61 72 22 20 63 6f  ive" or ".ar" co
2b040 6d 6d 61 6e 64 20 6c 6f 67 69 63 0a 2a 2a 2a 2a  mmand logic.****
2b050 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2b060 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2b070 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2b080 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2b090 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
2b0a0 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e  #endif /* !defin
2b0b0 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
2b0c0 49 52 54 55 41 4c 54 41 42 4c 45 29 20 26 26 20  IRTUALTABLE) && 
2b0d0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 48  defined(SQLITE_H
2b0e0 41 56 45 5f 5a 4c 49 42 29 20 2a 2f 0a 0a 0a 2f  AVE_ZLIB) */.../
2b0f0 2a 0a 2a 2a 20 49 66 20 61 6e 20 69 6e 70 75 74  *.** If an input
2b100 20 6c 69 6e 65 20 62 65 67 69 6e 73 20 77 69 74   line begins wit
2b110 68 20 22 2e 22 20 74 68 65 6e 20 69 6e 76 6f 6b  h "." then invok
2b120 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74  e this routine t
2b130 6f 0a 2a 2a 20 70 72 6f 63 65 73 73 20 74 68 61  o.** process tha
2b140 74 20 6c 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 52 65  t line..**.** Re
2b150 74 75 72 6e 20 31 20 6f 6e 20 65 72 72 6f 72 2c  turn 1 on error,
2b160 20 32 20 74 6f 20 65 78 69 74 2c 20 61 6e 64 20   2 to exit, and 
2b170 30 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a  0 otherwise..*/.
2b180 73 74 61 74 69 63 20 69 6e 74 20 64 6f 5f 6d 65  static int do_me
2b190 74 61 5f 63 6f 6d 6d 61 6e 64 28 63 68 61 72 20  ta_command(char 
2b1a0 2a 7a 4c 69 6e 65 2c 20 53 68 65 6c 6c 53 74 61  *zLine, ShellSta
2b1b0 74 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 68 20  te *p){.  int h 
2b1c0 3d 20 31 3b 0a 20 20 69 6e 74 20 6e 41 72 67 20  = 1;.  int nArg 
2b1d0 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 2c 20 63 3b  = 0;.  int n, c;
2b1e0 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a 20  .  int rc = 0;. 
2b1f0 20 63 68 61 72 20 2a 61 7a 41 72 67 5b 35 30 5d   char *azArg[50]
2b200 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
2b210 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
2b220 42 4c 45 0a 20 20 69 66 28 20 70 2d 3e 65 78 70  BLE.  if( p->exp
2b230 65 72 74 2e 70 45 78 70 65 72 74 20 29 7b 0a 20  ert.pExpert ){. 
2b240 20 20 20 65 78 70 65 72 74 46 69 6e 69 73 68 28     expertFinish(
2b250 70 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 23 65  p, 1, 0);.  }.#e
2b260 6e 64 69 66 0a 0a 20 20 2f 2a 20 50 61 72 73 65  ndif..  /* Parse
2b270 20 74 68 65 20 69 6e 70 75 74 20 6c 69 6e 65 20   the input line 
2b280 69 6e 74 6f 20 74 6f 6b 65 6e 73 2e 0a 20 20 2a  into tokens..  *
2b290 2f 0a 20 20 77 68 69 6c 65 28 20 7a 4c 69 6e 65  /.  while( zLine
2b2a0 5b 68 5d 20 26 26 20 6e 41 72 67 3c 41 72 72 61  [h] && nArg<Arra
2b2b0 79 53 69 7a 65 28 61 7a 41 72 67 29 20 29 7b 0a  ySize(azArg) ){.
2b2c0 20 20 20 20 77 68 69 6c 65 28 20 49 73 53 70 61      while( IsSpa
2b2d0 63 65 28 7a 4c 69 6e 65 5b 68 5d 29 20 29 7b 20  ce(zLine[h]) ){ 
2b2e0 68 2b 2b 3b 20 7d 0a 20 20 20 20 69 66 28 20 7a  h++; }.    if( z
2b2f0 4c 69 6e 65 5b 68 5d 3d 3d 30 20 29 20 62 72 65  Line[h]==0 ) bre
2b300 61 6b 3b 0a 20 20 20 20 69 66 28 20 7a 4c 69 6e  ak;.    if( zLin
2b310 65 5b 68 5d 3d 3d 27 5c 27 27 20 7c 7c 20 7a 4c  e[h]=='\'' || zL
2b320 69 6e 65 5b 68 5d 3d 3d 27 22 27 20 29 7b 0a 20  ine[h]=='"' ){. 
2b330 20 20 20 20 20 69 6e 74 20 64 65 6c 69 6d 20 3d       int delim =
2b340 20 7a 4c 69 6e 65 5b 68 2b 2b 5d 3b 0a 20 20 20   zLine[h++];.   
2b350 20 20 20 61 7a 41 72 67 5b 6e 41 72 67 2b 2b 5d     azArg[nArg++]
2b360 20 3d 20 26 7a 4c 69 6e 65 5b 68 5d 3b 0a 20 20   = &zLine[h];.  
2b370 20 20 20 20 77 68 69 6c 65 28 20 7a 4c 69 6e 65      while( zLine
2b380 5b 68 5d 20 26 26 20 7a 4c 69 6e 65 5b 68 5d 21  [h] && zLine[h]!
2b390 3d 64 65 6c 69 6d 20 29 7b 0a 20 20 20 20 20 20  =delim ){.      
2b3a0 20 20 69 66 28 20 7a 4c 69 6e 65 5b 68 5d 3d 3d    if( zLine[h]==
2b3b0 27 5c 5c 27 20 26 26 20 64 65 6c 69 6d 3d 3d 27  '\\' && delim=='
2b3c0 22 27 20 26 26 20 7a 4c 69 6e 65 5b 68 2b 31 5d  "' && zLine[h+1]
2b3d0 21 3d 30 20 29 20 68 2b 2b 3b 0a 20 20 20 20 20  !=0 ) h++;.     
2b3e0 20 20 20 68 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a     h++;.      }.
2b3f0 20 20 20 20 20 20 69 66 28 20 7a 4c 69 6e 65 5b        if( zLine[
2b400 68 5d 3d 3d 64 65 6c 69 6d 20 29 7b 0a 20 20 20  h]==delim ){.   
2b410 20 20 20 20 20 7a 4c 69 6e 65 5b 68 2b 2b 5d 20       zLine[h++] 
2b420 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
2b430 20 20 20 69 66 28 20 64 65 6c 69 6d 3d 3d 27 22     if( delim=='"
2b440 27 20 29 20 72 65 73 6f 6c 76 65 5f 62 61 63 6b  ' ) resolve_back
2b450 73 6c 61 73 68 65 73 28 61 7a 41 72 67 5b 6e 41  slashes(azArg[nA
2b460 72 67 2d 31 5d 29 3b 0a 20 20 20 20 7d 65 6c 73  rg-1]);.    }els
2b470 65 7b 0a 20 20 20 20 20 20 61 7a 41 72 67 5b 6e  e{.      azArg[n
2b480 41 72 67 2b 2b 5d 20 3d 20 26 7a 4c 69 6e 65 5b  Arg++] = &zLine[
2b490 68 5d 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28  h];.      while(
2b4a0 20 7a 4c 69 6e 65 5b 68 5d 20 26 26 20 21 49 73   zLine[h] && !Is
2b4b0 53 70 61 63 65 28 7a 4c 69 6e 65 5b 68 5d 29 20  Space(zLine[h]) 
2b4c0 29 7b 20 68 2b 2b 3b 20 7d 0a 20 20 20 20 20 20  ){ h++; }.      
2b4d0 69 66 28 20 7a 4c 69 6e 65 5b 68 5d 20 29 20 7a  if( zLine[h] ) z
2b4e0 4c 69 6e 65 5b 68 2b 2b 5d 20 3d 20 30 3b 0a 20  Line[h++] = 0;. 
2b4f0 20 20 20 20 20 72 65 73 6f 6c 76 65 5f 62 61 63       resolve_bac
2b500 6b 73 6c 61 73 68 65 73 28 61 7a 41 72 67 5b 6e  kslashes(azArg[n
2b510 41 72 67 2d 31 5d 29 3b 0a 20 20 20 20 7d 0a 20  Arg-1]);.    }. 
2b520 20 7d 0a 0a 20 20 2f 2a 20 50 72 6f 63 65 73 73   }..  /* Process
2b530 20 74 68 65 20 69 6e 70 75 74 20 6c 69 6e 65 2e   the input line.
2b540 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e 41 72 67  .  */.  if( nArg
2b550 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 20  ==0 ) return 0; 
2b560 2f 2a 20 6e 6f 20 74 6f 6b 65 6e 73 2c 20 6e 6f  /* no tokens, no
2b570 20 65 72 72 6f 72 20 2a 2f 0a 20 20 6e 20 3d 20   error */.  n = 
2b580 73 74 72 6c 65 6e 33 30 28 61 7a 41 72 67 5b 30  strlen30(azArg[0
2b590 5d 29 3b 0a 20 20 63 20 3d 20 61 7a 41 72 67 5b  ]);.  c = azArg[
2b5a0 30 5d 5b 30 5d 3b 0a 20 20 63 6c 65 61 72 54 65  0][0];.  clearTe
2b5b0 6d 70 46 69 6c 65 28 70 29 3b 0a 0a 23 69 66 6e  mpFile(p);..#ifn
2b5c0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
2b5d0 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20  AUTHORIZATION.  
2b5e0 69 66 28 20 63 3d 3d 27 61 27 20 26 26 20 73 74  if( c=='a' && st
2b5f0 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20  rncmp(azArg[0], 
2b600 22 61 75 74 68 22 2c 20 6e 29 3d 3d 30 20 29 7b  "auth", n)==0 ){
2b610 0a 20 20 20 20 69 66 28 20 6e 41 72 67 21 3d 32  .    if( nArg!=2
2b620 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72   ){.      raw_pr
2b630 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55 73  intf(stderr, "Us
2b640 61 67 65 3a 20 2e 61 75 74 68 20 4f 4e 7c 4f 46  age: .auth ON|OF
2b650 46 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20  F\n");.      rc 
2b660 3d 20 31 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  = 1;.      goto 
2b670 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69  meta_command_exi
2b680 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6f 70 65  t;.    }.    ope
2b690 6e 5f 64 62 28 70 2c 20 30 29 3b 0a 20 20 20 20  n_db(p, 0);.    
2b6a0 69 66 28 20 62 6f 6f 6c 65 61 6e 56 61 6c 75 65  if( booleanValue
2b6b0 28 61 7a 41 72 67 5b 31 5d 29 20 29 7b 0a 20 20  (azArg[1]) ){.  
2b6c0 20 20 20 20 73 71 6c 69 74 65 33 5f 73 65 74 5f      sqlite3_set_
2b6d0 61 75 74 68 6f 72 69 7a 65 72 28 70 2d 3e 64 62  authorizer(p->db
2b6e0 2c 20 73 68 65 6c 6c 41 75 74 68 2c 20 70 29 3b  , shellAuth, p);
2b6f0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
2b700 20 20 73 71 6c 69 74 65 33 5f 73 65 74 5f 61 75    sqlite3_set_au
2b710 74 68 6f 72 69 7a 65 72 28 70 2d 3e 64 62 2c 20  thorizer(p->db, 
2b720 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  0, 0);.    }.  }
2b730 65 6c 73 65 0a 23 65 6e 64 69 66 0a 0a 23 69 66  else.#endif..#if
2b740 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
2b750 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
2b760 4c 45 29 20 26 26 20 64 65 66 69 6e 65 64 28 53  LE) && defined(S
2b770 51 4c 49 54 45 5f 48 41 56 45 5f 5a 4c 49 42 29  QLITE_HAVE_ZLIB)
2b780 0a 20 20 69 66 28 20 63 3d 3d 27 61 27 20 26 26  .  if( c=='a' &&
2b790 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30   strncmp(azArg[0
2b7a0 5d 2c 20 22 61 72 63 68 69 76 65 22 2c 20 6e 29  ], "archive", n)
2b7b0 3d 3d 30 20 29 7b 0a 20 20 20 20 6f 70 65 6e 5f  ==0 ){.    open_
2b7c0 64 62 28 70 2c 20 30 29 3b 0a 20 20 20 20 72 63  db(p, 0);.    rc
2b7d0 20 3d 20 61 72 44 6f 74 43 6f 6d 6d 61 6e 64 28   = arDotCommand(
2b7e0 70 2c 20 30 2c 20 61 7a 41 72 67 2c 20 6e 41 72  p, 0, azArg, nAr
2b7f0 67 29 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64  g);.  }else.#end
2b800 69 66 0a 0a 20 20 69 66 28 20 28 63 3d 3d 27 62  if..  if( (c=='b
2b810 27 20 26 26 20 6e 3e 3d 33 20 26 26 20 73 74 72  ' && n>=3 && str
2b820 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22  ncmp(azArg[0], "
2b830 62 61 63 6b 75 70 22 2c 20 6e 29 3d 3d 30 29 0a  backup", n)==0).
2b840 20 20 20 7c 7c 20 28 63 3d 3d 27 73 27 20 26 26     || (c=='s' &&
2b850 20 6e 3e 3d 33 20 26 26 20 73 74 72 6e 63 6d 70   n>=3 && strncmp
2b860 28 61 7a 41 72 67 5b 30 5d 2c 20 22 73 61 76 65  (azArg[0], "save
2b870 22 2c 20 6e 29 3d 3d 30 29 0a 20 20 29 7b 0a 20  ", n)==0).  ){. 
2b880 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
2b890 44 65 73 74 46 69 6c 65 20 3d 20 30 3b 0a 20 20  DestFile = 0;.  
2b8a0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
2b8b0 62 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74  b = 0;.    sqlit
2b8c0 65 33 20 2a 70 44 65 73 74 3b 0a 20 20 20 20 73  e3 *pDest;.    s
2b8d0 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 20 2a 70  qlite3_backup *p
2b8e0 42 61 63 6b 75 70 3b 0a 20 20 20 20 69 6e 74 20  Backup;.    int 
2b8f0 6a 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  j;.    const cha
2b900 72 20 2a 7a 56 66 73 20 3d 20 30 3b 0a 20 20 20  r *zVfs = 0;.   
2b910 20 66 6f 72 28 6a 3d 31 3b 20 6a 3c 6e 41 72 67   for(j=1; j<nArg
2b920 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 63 6f  ; j++){.      co
2b930 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 61 7a  nst char *z = az
2b940 41 72 67 5b 6a 5d 3b 0a 20 20 20 20 20 20 69 66  Arg[j];.      if
2b950 28 20 7a 5b 30 5d 3d 3d 27 2d 27 20 29 7b 0a 20  ( z[0]=='-' ){. 
2b960 20 20 20 20 20 20 20 69 66 28 20 7a 5b 31 5d 3d         if( z[1]=
2b970 3d 27 2d 27 20 29 20 7a 2b 2b 3b 0a 20 20 20 20  ='-' ) z++;.    
2b980 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a      if( strcmp(z
2b990 2c 20 22 2d 61 70 70 65 6e 64 22 29 3d 3d 30 20  , "-append")==0 
2b9a0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 56 66  ){.          zVf
2b9b0 73 20 3d 20 22 61 70 6e 64 76 66 73 22 3b 0a 20  s = "apndvfs";. 
2b9c0 20 20 20 20 20 20 20 7d 65 6c 73 65 0a 20 20 20         }else.   
2b9d0 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20       {.         
2b9e0 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64   utf8_printf(std
2b9f0 65 72 72 2c 20 22 75 6e 6b 6e 6f 77 6e 20 6f 70  err, "unknown op
2ba00 74 69 6f 6e 3a 20 25 73 5c 6e 22 2c 20 61 7a 41  tion: %s\n", azA
2ba10 72 67 5b 6a 5d 29 3b 0a 20 20 20 20 20 20 20 20  rg[j]);.        
2ba20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
2ba30 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
2ba40 65 20 69 66 28 20 7a 44 65 73 74 46 69 6c 65 3d  e if( zDestFile=
2ba50 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 44  =0 ){.        zD
2ba60 65 73 74 46 69 6c 65 20 3d 20 61 7a 41 72 67 5b  estFile = azArg[
2ba70 6a 5d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  j];.      }else 
2ba80 69 66 28 20 7a 44 62 3d 3d 30 20 29 7b 0a 20 20  if( zDb==0 ){.  
2ba90 20 20 20 20 20 20 7a 44 62 20 3d 20 7a 44 65 73        zDb = zDes
2baa0 74 46 69 6c 65 3b 0a 20 20 20 20 20 20 20 20 7a  tFile;.        z
2bab0 44 65 73 74 46 69 6c 65 20 3d 20 61 7a 41 72 67  DestFile = azArg
2bac0 5b 6a 5d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  [j];.      }else
2bad0 7b 0a 20 20 20 20 20 20 20 20 72 61 77 5f 70 72  {.        raw_pr
2bae0 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55 73  intf(stderr, "Us
2baf0 61 67 65 3a 20 2e 62 61 63 6b 75 70 20 3f 44 42  age: .backup ?DB
2bb00 3f 20 3f 2d 2d 61 70 70 65 6e 64 3f 20 46 49 4c  ? ?--append? FIL
2bb10 45 4e 41 4d 45 5c 6e 22 29 3b 0a 20 20 20 20 20  ENAME\n");.     
2bb20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
2bb30 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
2bb40 66 28 20 7a 44 65 73 74 46 69 6c 65 3d 3d 30 20  f( zDestFile==0 
2bb50 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69  ){.      raw_pri
2bb60 6e 74 66 28 73 74 64 65 72 72 2c 20 22 6d 69 73  ntf(stderr, "mis
2bb70 73 69 6e 67 20 46 49 4c 45 4e 41 4d 45 20 61 72  sing FILENAME ar
2bb80 67 75 6d 65 6e 74 20 6f 6e 20 2e 62 61 63 6b 75  gument on .backu
2bb90 70 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 65 74  p\n");.      ret
2bba0 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 1;.    }.   
2bbb0 20 69 66 28 20 7a 44 62 3d 3d 30 20 29 20 7a 44   if( zDb==0 ) zD
2bbc0 62 20 3d 20 22 6d 61 69 6e 22 3b 0a 20 20 20 20  b = "main";.    
2bbd0 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 6f 70 65  rc = sqlite3_ope
2bbe0 6e 5f 76 32 28 7a 44 65 73 74 46 69 6c 65 2c 20  n_v2(zDestFile, 
2bbf0 26 70 44 65 73 74 2c 20 0a 20 20 20 20 20 20 20  &pDest, .       
2bc00 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
2bc10 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
2bc20 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45  |SQLITE_OPEN_CRE
2bc30 41 54 45 2c 20 7a 56 66 73 29 3b 0a 20 20 20 20  ATE, zVfs);.    
2bc40 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2bc50 4b 20 29 7b 0a 20 20 20 20 20 20 75 74 66 38 5f  K ){.      utf8_
2bc60 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
2bc70 45 72 72 6f 72 3a 20 63 61 6e 6e 6f 74 20 6f 70  Error: cannot op
2bc80 65 6e 20 5c 22 25 73 5c 22 5c 6e 22 2c 20 7a 44  en \"%s\"\n", zD
2bc90 65 73 74 46 69 6c 65 29 3b 0a 20 20 20 20 20 20  estFile);.      
2bca0 63 6c 6f 73 65 5f 64 62 28 70 44 65 73 74 29 3b  close_db(pDest);
2bcb0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
2bcc0 0a 20 20 20 20 7d 0a 20 20 20 20 6f 70 65 6e 5f  .    }.    open_
2bcd0 64 62 28 70 2c 20 30 29 3b 0a 20 20 20 20 70 42  db(p, 0);.    pB
2bce0 61 63 6b 75 70 20 3d 20 73 71 6c 69 74 65 33 5f  ackup = sqlite3_
2bcf0 62 61 63 6b 75 70 5f 69 6e 69 74 28 70 44 65 73  backup_init(pDes
2bd00 74 2c 20 22 6d 61 69 6e 22 2c 20 70 2d 3e 64 62  t, "main", p->db
2bd10 2c 20 7a 44 62 29 3b 0a 20 20 20 20 69 66 28 20  , zDb);.    if( 
2bd20 70 42 61 63 6b 75 70 3d 3d 30 20 29 7b 0a 20 20  pBackup==0 ){.  
2bd30 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
2bd40 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20  stderr, "Error: 
2bd50 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f 65  %s\n", sqlite3_e
2bd60 72 72 6d 73 67 28 70 44 65 73 74 29 29 3b 0a 20  rrmsg(pDest));. 
2bd70 20 20 20 20 20 63 6c 6f 73 65 5f 64 62 28 70 44       close_db(pD
2bd80 65 73 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75  est);.      retu
2bd90 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 1;.    }.    
2bda0 77 68 69 6c 65 28 20 20 28 72 63 20 3d 20 73 71  while(  (rc = sq
2bdb0 6c 69 74 65 33 5f 62 61 63 6b 75 70 5f 73 74 65  lite3_backup_ste
2bdc0 70 28 70 42 61 63 6b 75 70 2c 31 30 30 29 29 3d  p(pBackup,100))=
2bdd0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 7d 0a 20  =SQLITE_OK ){}. 
2bde0 20 20 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75     sqlite3_backu
2bdf0 70 5f 66 69 6e 69 73 68 28 70 42 61 63 6b 75 70  p_finish(pBackup
2be00 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
2be10 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20  QLITE_DONE ){.  
2be20 20 20 20 20 72 63 20 3d 20 30 3b 0a 20 20 20 20      rc = 0;.    
2be30 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 75 74 66  }else{.      utf
2be40 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  8_printf(stderr,
2be50 20 22 45 72 72 6f 72 3a 20 25 73 5c 6e 22 2c 20   "Error: %s\n", 
2be60 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70  sqlite3_errmsg(p
2be70 44 65 73 74 29 29 3b 0a 20 20 20 20 20 20 72 63  Dest));.      rc
2be80 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 1;.    }.    
2be90 63 6c 6f 73 65 5f 64 62 28 70 44 65 73 74 29 3b  close_db(pDest);
2bea0 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20  .  }else..  if( 
2beb0 63 3d 3d 27 62 27 20 26 26 20 6e 3e 3d 33 20 26  c=='b' && n>=3 &
2bec0 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b  & strncmp(azArg[
2bed0 30 5d 2c 20 22 62 61 69 6c 22 2c 20 6e 29 3d 3d  0], "bail", n)==
2bee0 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 41 72  0 ){.    if( nAr
2bef0 67 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 62 61  g==2 ){.      ba
2bf00 69 6c 5f 6f 6e 5f 65 72 72 6f 72 20 3d 20 62 6f  il_on_error = bo
2bf10 6f 6c 65 61 6e 56 61 6c 75 65 28 61 7a 41 72 67  oleanValue(azArg
2bf20 5b 31 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  [1]);.    }else{
2bf30 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74  .      raw_print
2bf40 66 28 73 74 64 65 72 72 2c 20 22 55 73 61 67 65  f(stderr, "Usage
2bf50 3a 20 2e 62 61 69 6c 20 6f 6e 7c 6f 66 66 5c 6e  : .bail on|off\n
2bf60 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31  ");.      rc = 1
2bf70 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a  ;.    }.  }else.
2bf80 0a 20 20 69 66 28 20 63 3d 3d 27 62 27 20 26 26  .  if( c=='b' &&
2bf90 20 6e 3e 3d 33 20 26 26 20 73 74 72 6e 63 6d 70   n>=3 && strncmp
2bfa0 28 61 7a 41 72 67 5b 30 5d 2c 20 22 62 69 6e 61  (azArg[0], "bina
2bfb0 72 79 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20  ry", n)==0 ){.  
2bfc0 20 20 69 66 28 20 6e 41 72 67 3d 3d 32 20 29 7b    if( nArg==2 ){
2bfd0 0a 20 20 20 20 20 20 69 66 28 20 62 6f 6f 6c 65  .      if( boole
2bfe0 61 6e 56 61 6c 75 65 28 61 7a 41 72 67 5b 31 5d  anValue(azArg[1]
2bff0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 65 74  ) ){.        set
2c000 42 69 6e 61 72 79 4d 6f 64 65 28 70 2d 3e 6f 75  BinaryMode(p->ou
2c010 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c  t, 1);.      }el
2c020 73 65 7b 0a 20 20 20 20 20 20 20 20 73 65 74 54  se{.        setT
2c030 65 78 74 4d 6f 64 65 28 70 2d 3e 6f 75 74 2c 20  extMode(p->out, 
2c040 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  1);.      }.    
2c050 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 61 77  }else{.      raw
2c060 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
2c070 22 55 73 61 67 65 3a 20 2e 62 69 6e 61 72 79 20  "Usage: .binary 
2c080 6f 6e 7c 6f 66 66 5c 6e 22 29 3b 0a 20 20 20 20  on|off\n");.    
2c090 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a    rc = 1;.    }.
2c0a0 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63    }else..  if( c
2c0b0 3d 3d 27 63 27 20 26 26 20 73 74 72 63 6d 70 28  =='c' && strcmp(
2c0c0 61 7a 41 72 67 5b 30 5d 2c 22 63 64 22 29 3d 3d  azArg[0],"cd")==
2c0d0 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 41 72  0 ){.    if( nAr
2c0e0 67 3d 3d 32 20 29 7b 0a 23 69 66 20 64 65 66 69  g==2 ){.#if defi
2c0f0 6e 65 64 28 5f 57 49 4e 33 32 29 20 7c 7c 20 64  ned(_WIN32) || d
2c100 65 66 69 6e 65 64 28 57 49 4e 33 32 29 0a 20 20  efined(WIN32).  
2c110 20 20 20 20 77 63 68 61 72 5f 74 20 2a 7a 20 3d      wchar_t *z =
2c120 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 75   sqlite3_win32_u
2c130 74 66 38 5f 74 6f 5f 75 6e 69 63 6f 64 65 28 61  tf8_to_unicode(a
2c140 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20 20 20  zArg[1]);.      
2c150 72 63 20 3d 20 21 53 65 74 43 75 72 72 65 6e 74  rc = !SetCurrent
2c160 44 69 72 65 63 74 6f 72 79 57 28 7a 29 3b 0a 20  DirectoryW(z);. 
2c170 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
2c180 65 28 7a 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20  e(z);.#else.    
2c190 20 20 72 63 20 3d 20 63 68 64 69 72 28 61 7a 41    rc = chdir(azA
2c1a0 72 67 5b 31 5d 29 3b 0a 23 65 6e 64 69 66 0a 20  rg[1]);.#endif. 
2c1b0 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
2c1c0 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e         utf8_prin
2c1d0 74 66 28 73 74 64 65 72 72 2c 20 22 43 61 6e 6e  tf(stderr, "Cann
2c1e0 6f 74 20 63 68 61 6e 67 65 20 74 6f 20 64 69 72  ot change to dir
2c1f0 65 63 74 6f 72 79 20 5c 22 25 73 5c 22 5c 6e 22  ectory \"%s\"\n"
2c200 2c 20 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20  , azArg[1]);.   
2c210 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20       rc = 1;.   
2c220 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
2c230 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
2c240 28 73 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a  (stderr, "Usage:
2c250 20 2e 63 64 20 44 49 52 45 43 54 4f 52 59 5c 6e   .cd DIRECTORY\n
2c260 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31  ");.      rc = 1
2c270 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a  ;.    }.  }else.
2c280 0a 20 20 2f 2a 20 54 68 65 20 75 6e 64 6f 63 75  .  /* The undocu
2c290 6d 65 6e 74 65 64 20 22 2e 62 72 65 61 6b 70 6f  mented ".breakpo
2c2a0 69 6e 74 22 20 63 6f 6d 6d 61 6e 64 20 63 61 75  int" command cau
2c2b0 73 65 73 20 61 20 63 61 6c 6c 20 74 6f 20 74 68  ses a call to th
2c2c0 65 20 6e 6f 2d 6f 70 0a 20 20 2a 2a 20 72 6f 75  e no-op.  ** rou
2c2d0 74 69 6e 65 20 6e 61 6d 65 64 20 74 65 73 74 5f  tine named test_
2c2e0 62 72 65 61 6b 70 6f 69 6e 74 28 29 2e 0a 20 20  breakpoint()..  
2c2f0 2a 2f 0a 20 20 69 66 28 20 63 3d 3d 27 62 27 20  */.  if( c=='b' 
2c300 26 26 20 6e 3e 3d 33 20 26 26 20 73 74 72 6e 63  && n>=3 && strnc
2c310 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 62 72  mp(azArg[0], "br
2c320 65 61 6b 70 6f 69 6e 74 22 2c 20 6e 29 3d 3d 30  eakpoint", n)==0
2c330 20 29 7b 0a 20 20 20 20 74 65 73 74 5f 62 72 65   ){.    test_bre
2c340 61 6b 70 6f 69 6e 74 28 29 3b 0a 20 20 7d 65 6c  akpoint();.  }el
2c350 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 63 27  se..  if( c=='c'
2c360 20 26 26 20 6e 3e 3d 33 20 26 26 20 73 74 72 6e   && n>=3 && strn
2c370 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 63  cmp(azArg[0], "c
2c380 68 61 6e 67 65 73 22 2c 20 6e 29 3d 3d 30 20 29  hanges", n)==0 )
2c390 7b 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3d 3d  {.    if( nArg==
2c3a0 32 20 29 7b 0a 20 20 20 20 20 20 73 65 74 4f 72  2 ){.      setOr
2c3b0 43 6c 65 61 72 46 6c 61 67 28 70 2c 20 53 48 46  ClearFlag(p, SHF
2c3c0 4c 47 5f 43 6f 75 6e 74 43 68 61 6e 67 65 73 2c  LG_CountChanges,
2c3d0 20 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20   azArg[1]);.    
2c3e0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 61 77  }else{.      raw
2c3f0 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
2c400 22 55 73 61 67 65 3a 20 2e 63 68 61 6e 67 65 73  "Usage: .changes
2c410 20 6f 6e 7c 6f 66 66 5c 6e 22 29 3b 0a 20 20 20   on|off\n");.   
2c420 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d     rc = 1;.    }
2c430 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 2f 2a 20 43  .  }else..  /* C
2c440 61 6e 63 65 6c 20 6f 75 74 70 75 74 20 72 65 64  ancel output red
2c450 69 72 65 63 74 69 6f 6e 2c 20 69 66 20 69 74 20  irection, if it 
2c460 69 73 20 63 75 72 72 65 6e 74 6c 79 20 73 65 74  is currently set
2c470 20 28 62 79 20 2e 74 65 73 74 63 61 73 65 29 0a   (by .testcase).
2c480 20 20 2a 2a 20 54 68 65 6e 20 72 65 61 64 20 74    ** Then read t
2c490 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68  he content of th
2c4a0 65 20 74 65 73 74 63 61 73 65 2d 6f 75 74 2e 74  e testcase-out.t
2c4b0 78 74 20 66 69 6c 65 20 61 6e 64 20 63 6f 6d 70  xt file and comp
2c4c0 61 72 65 20 61 67 61 69 6e 73 74 0a 20 20 2a 2a  are against.  **
2c4d0 20 61 7a 41 72 67 5b 31 5d 2e 20 20 49 66 20 74   azArg[1].  If t
2c4e0 68 65 72 65 20 61 72 65 20 64 69 66 66 65 72 65  here are differe
2c4f0 6e 63 65 73 2c 20 72 65 70 6f 72 74 20 61 6e 20  nces, report an 
2c500 65 72 72 6f 72 20 61 6e 64 20 65 78 69 74 2e 0a  error and exit..
2c510 20 20 2a 2f 0a 20 20 69 66 28 20 63 3d 3d 27 63    */.  if( c=='c
2c520 27 20 26 26 20 6e 3e 3d 33 20 26 26 20 73 74 72  ' && n>=3 && str
2c530 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22  ncmp(azArg[0], "
2c540 63 68 65 63 6b 22 2c 20 6e 29 3d 3d 30 20 29 7b  check", n)==0 ){
2c550 0a 20 20 20 20 63 68 61 72 20 2a 7a 52 65 73 20  .    char *zRes 
2c560 3d 20 30 3b 0a 20 20 20 20 6f 75 74 70 75 74 5f  = 0;.    output_
2c570 72 65 73 65 74 28 70 29 3b 0a 20 20 20 20 69 66  reset(p);.    if
2c580 28 20 6e 41 72 67 21 3d 32 20 29 7b 0a 20 20 20  ( nArg!=2 ){.   
2c590 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74     raw_printf(st
2c5a0 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 63  derr, "Usage: .c
2c5b0 68 65 63 6b 20 47 4c 4f 42 2d 50 41 54 54 45 52  heck GLOB-PATTER
2c5c0 4e 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20  N\n");.      rc 
2c5d0 3d 20 32 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  = 2;.    }else i
2c5e0 66 28 20 28 7a 52 65 73 20 3d 20 72 65 61 64 46  f( (zRes = readF
2c5f0 69 6c 65 28 22 74 65 73 74 63 61 73 65 2d 6f 75  ile("testcase-ou
2c600 74 2e 74 78 74 22 2c 20 30 29 29 3d 3d 30 20 29  t.txt", 0))==0 )
2c610 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e  {.      raw_prin
2c620 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f  tf(stderr, "Erro
2c630 72 3a 20 63 61 6e 6e 6f 74 20 72 65 61 64 20 27  r: cannot read '
2c640 74 65 73 74 63 61 73 65 2d 6f 75 74 2e 74 78 74  testcase-out.txt
2c650 27 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20  '\n");.      rc 
2c660 3d 20 32 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  = 2;.    }else i
2c670 66 28 20 74 65 73 74 63 61 73 65 5f 67 6c 6f 62  f( testcase_glob
2c680 28 61 7a 41 72 67 5b 31 5d 2c 7a 52 65 73 29 3d  (azArg[1],zRes)=
2c690 3d 30 20 29 7b 0a 20 20 20 20 20 20 75 74 66 38  =0 ){.      utf8
2c6a0 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 0a  _printf(stderr,.
2c6b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c6c0 20 22 74 65 73 74 63 61 73 65 2d 25 73 20 46 41   "testcase-%s FA
2c6d0 49 4c 45 44 5c 6e 20 45 78 70 65 63 74 65 64 3a  ILED\n Expected:
2c6e0 20 5b 25 73 5d 5c 6e 20 20 20 20 20 20 47 6f 74   [%s]\n      Got
2c6f0 3a 20 5b 25 73 5d 5c 6e 22 2c 0a 20 20 20 20 20  : [%s]\n",.     
2c700 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 7a              p->z
2c710 54 65 73 74 63 61 73 65 2c 20 61 7a 41 72 67 5b  Testcase, azArg[
2c720 31 5d 2c 20 7a 52 65 73 29 3b 0a 20 20 20 20 20  1], zRes);.     
2c730 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c   rc = 1;.    }el
2c740 73 65 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70  se{.      utf8_p
2c750 72 69 6e 74 66 28 73 74 64 6f 75 74 2c 20 22 74  rintf(stdout, "t
2c760 65 73 74 63 61 73 65 2d 25 73 20 6f 6b 5c 6e 22  estcase-%s ok\n"
2c770 2c 20 70 2d 3e 7a 54 65 73 74 63 61 73 65 29 3b  , p->zTestcase);
2c780 0a 20 20 20 20 20 20 70 2d 3e 6e 43 68 65 63 6b  .      p->nCheck
2c790 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  ++;.    }.    sq
2c7a0 6c 69 74 65 33 5f 66 72 65 65 28 7a 52 65 73 29  lite3_free(zRes)
2c7b0 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28  ;.  }else..  if(
2c7c0 20 63 3d 3d 27 63 27 20 26 26 20 73 74 72 6e 63   c=='c' && strnc
2c7d0 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 63 6c  mp(azArg[0], "cl
2c7e0 6f 6e 65 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20  one", n)==0 ){. 
2c7f0 20 20 20 69 66 28 20 6e 41 72 67 3d 3d 32 20 29     if( nArg==2 )
2c800 7b 0a 20 20 20 20 20 20 74 72 79 54 6f 43 6c 6f  {.      tryToClo
2c810 6e 65 28 70 2c 20 61 7a 41 72 67 5b 31 5d 29 3b  ne(p, azArg[1]);
2c820 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
2c830 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64    raw_printf(std
2c840 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 63 6c  err, "Usage: .cl
2c850 6f 6e 65 20 46 49 4c 45 4e 41 4d 45 5c 6e 22 29  one FILENAME\n")
2c860 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a  ;.      rc = 1;.
2c870 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20      }.  }else.. 
2c880 20 69 66 28 20 63 3d 3d 27 64 27 20 26 26 20 6e   if( c=='d' && n
2c890 3e 31 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a  >1 && strncmp(az
2c8a0 41 72 67 5b 30 5d 2c 20 22 64 61 74 61 62 61 73  Arg[0], "databas
2c8b0 65 73 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20  es", n)==0 ){.  
2c8c0 20 20 53 68 65 6c 6c 53 74 61 74 65 20 64 61 74    ShellState dat
2c8d0 61 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 45 72  a;.    char *zEr
2c8e0 72 4d 73 67 20 3d 20 30 3b 0a 20 20 20 20 6f 70  rMsg = 0;.    op
2c8f0 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a 20 20 20  en_db(p, 0);.   
2c900 20 6d 65 6d 63 70 79 28 26 64 61 74 61 2c 20 70   memcpy(&data, p
2c910 2c 20 73 69 7a 65 6f 66 28 64 61 74 61 29 29 3b  , sizeof(data));
2c920 0a 20 20 20 20 64 61 74 61 2e 73 68 6f 77 48 65  .    data.showHe
2c930 61 64 65 72 20 3d 20 30 3b 0a 20 20 20 20 64 61  ader = 0;.    da
2c940 74 61 2e 63 4d 6f 64 65 20 3d 20 64 61 74 61 2e  ta.cMode = data.
2c950 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 4c 69 73 74  mode = MODE_List
2c960 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  ;.    sqlite3_sn
2c970 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 64 61  printf(sizeof(da
2c980 74 61 2e 63 6f 6c 53 65 70 61 72 61 74 6f 72 29  ta.colSeparator)
2c990 2c 64 61 74 61 2e 63 6f 6c 53 65 70 61 72 61 74  ,data.colSeparat
2c9a0 6f 72 2c 22 3a 20 22 29 3b 0a 20 20 20 20 64 61  or,": ");.    da
2c9b0 74 61 2e 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20  ta.cnt = 0;.    
2c9c0 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e  sqlite3_exec(p->
2c9d0 64 62 2c 20 22 53 45 4c 45 43 54 20 6e 61 6d 65  db, "SELECT name
2c9e0 2c 20 66 69 6c 65 20 46 52 4f 4d 20 70 72 61 67  , file FROM prag
2c9f0 6d 61 5f 64 61 74 61 62 61 73 65 5f 6c 69 73 74  ma_database_list
2ca00 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
2ca10 20 20 20 20 63 61 6c 6c 62 61 63 6b 2c 20 26 64      callback, &d
2ca20 61 74 61 2c 20 26 7a 45 72 72 4d 73 67 29 3b 0a  ata, &zErrMsg);.
2ca30 20 20 20 20 69 66 28 20 7a 45 72 72 4d 73 67 20      if( zErrMsg 
2ca40 29 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72  ){.      utf8_pr
2ca50 69 6e 74 66 28 73 74 64 65 72 72 2c 22 45 72 72  intf(stderr,"Err
2ca60 6f 72 3a 20 25 73 5c 6e 22 2c 20 7a 45 72 72 4d  or: %s\n", zErrM
2ca70 73 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  sg);.      sqlit
2ca80 65 33 5f 66 72 65 65 28 7a 45 72 72 4d 73 67 29  e3_free(zErrMsg)
2ca90 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a  ;.      rc = 1;.
2caa0 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20      }.  }else.. 
2cab0 20 69 66 28 20 63 3d 3d 27 64 27 20 26 26 20 6e   if( c=='d' && n
2cac0 3e 3d 33 20 26 26 20 73 74 72 6e 63 6d 70 28 61  >=3 && strncmp(a
2cad0 7a 41 72 67 5b 30 5d 2c 20 22 64 62 63 6f 6e 66  zArg[0], "dbconf
2cae0 69 67 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20  ig", n)==0 ){.  
2caf0 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73    static const s
2cb00 74 72 75 63 74 20 44 62 43 6f 6e 66 69 67 43 68  truct DbConfigCh
2cb10 6f 69 63 65 73 20 7b 0a 20 20 20 20 20 20 63 6f  oices {.      co
2cb20 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b  nst char *zName;
2cb30 0a 20 20 20 20 20 20 69 6e 74 20 6f 70 3b 0a 20  .      int op;. 
2cb40 20 20 20 7d 20 61 44 62 43 6f 6e 66 69 67 5b 5d     } aDbConfig[]
2cb50 20 3d 20 7b 0a 20 20 20 20 20 20 20 20 7b 20 22   = {.        { "
2cb60 65 6e 61 62 6c 65 5f 66 6b 65 79 22 2c 20 20 20  enable_fkey",   
2cb70 20 20 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46     SQLITE_DBCONF
2cb80 49 47 5f 45 4e 41 42 4c 45 5f 46 4b 45 59 20 20  IG_ENABLE_FKEY  
2cb90 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
2cba0 20 20 20 20 20 7b 20 22 65 6e 61 62 6c 65 5f 74       { "enable_t
2cbb0 72 69 67 67 65 72 22 2c 20 20 20 53 51 4c 49 54  rigger",   SQLIT
2cbc0 45 5f 44 42 43 4f 4e 46 49 47 5f 45 4e 41 42 4c  E_DBCONFIG_ENABL
2cbd0 45 5f 54 52 49 47 47 45 52 20 20 20 20 20 20 20  E_TRIGGER       
2cbe0 20 20 7d 2c 0a 20 20 20 20 20 20 20 20 7b 20 22    },.        { "
2cbf0 66 74 73 33 5f 74 6f 6b 65 6e 69 7a 65 72 22 2c  fts3_tokenizer",
2cc00 20 20 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46     SQLITE_DBCONF
2cc10 49 47 5f 45 4e 41 42 4c 45 5f 46 54 53 33 5f 54  IG_ENABLE_FTS3_T
2cc20 4f 4b 45 4e 49 5a 45 52 20 20 7d 2c 0a 20 20 20  OKENIZER  },.   
2cc30 20 20 20 20 20 7b 20 22 6c 6f 61 64 5f 65 78 74       { "load_ext
2cc40 65 6e 73 69 6f 6e 22 2c 20 20 20 53 51 4c 49 54  ension",   SQLIT
2cc50 45 5f 44 42 43 4f 4e 46 49 47 5f 45 4e 41 42 4c  E_DBCONFIG_ENABL
2cc60 45 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e  E_LOAD_EXTENSION
2cc70 20 20 7d 2c 0a 20 20 20 20 20 20 20 20 7b 20 22    },.        { "
2cc80 6e 6f 5f 63 6b 70 74 5f 6f 6e 5f 63 6c 6f 73 65  no_ckpt_on_close
2cc90 22 2c 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46  ", SQLITE_DBCONF
2cca0 49 47 5f 4e 4f 5f 43 4b 50 54 5f 4f 4e 5f 43 4c  IG_NO_CKPT_ON_CL
2ccb0 4f 53 45 20 20 20 20 20 20 20 7d 2c 0a 20 20 20  OSE       },.   
2ccc0 20 20 20 20 20 7b 20 22 65 6e 61 62 6c 65 5f 71       { "enable_q
2ccd0 70 73 67 22 2c 20 20 20 20 20 20 53 51 4c 49 54  psg",      SQLIT
2cce0 45 5f 44 42 43 4f 4e 46 49 47 5f 45 4e 41 42 4c  E_DBCONFIG_ENABL
2ccf0 45 5f 51 50 53 47 20 20 20 20 20 20 20 20 20 20  E_QPSG          
2cd00 20 20 7d 2c 0a 20 20 20 20 20 20 20 20 7b 20 22    },.        { "
2cd10 74 72 69 67 67 65 72 5f 65 71 70 22 2c 20 20 20  trigger_eqp",   
2cd20 20 20 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46     SQLITE_DBCONF
2cd30 49 47 5f 54 52 49 47 47 45 52 5f 45 51 50 20 20  IG_TRIGGER_EQP  
2cd40 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
2cd50 20 20 20 20 20 7b 20 22 72 65 73 65 74 5f 64 61       { "reset_da
2cd60 74 61 62 61 73 65 22 2c 20 20 20 53 51 4c 49 54  tabase",   SQLIT
2cd70 45 5f 44 42 43 4f 4e 46 49 47 5f 52 45 53 45 54  E_DBCONFIG_RESET
2cd80 5f 44 41 54 41 42 41 53 45 20 20 20 20 20 20 20  _DATABASE       
2cd90 20 20 7d 2c 0a 20 20 20 20 20 20 20 20 7b 20 22    },.        { "
2cda0 64 65 66 65 6e 73 69 76 65 22 2c 20 20 20 20 20  defensive",     
2cdb0 20 20 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46     SQLITE_DBCONF
2cdc0 49 47 5f 44 45 46 45 4e 53 49 56 45 20 20 20 20  IG_DEFENSIVE    
2cdd0 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
2cde0 20 7d 3b 0a 20 20 20 20 69 6e 74 20 69 69 2c 20   };.    int ii, 
2cdf0 76 3b 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28 70  v;.    open_db(p
2ce00 2c 20 30 29 3b 0a 20 20 20 20 66 6f 72 28 69 69  , 0);.    for(ii
2ce10 3d 30 3b 20 69 69 3c 41 72 72 61 79 53 69 7a 65  =0; ii<ArraySize
2ce20 28 61 44 62 43 6f 6e 66 69 67 29 3b 20 69 69 2b  (aDbConfig); ii+
2ce30 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 41  +){.      if( nA
2ce40 72 67 3e 31 20 26 26 20 73 74 72 63 6d 70 28 61  rg>1 && strcmp(a
2ce50 7a 41 72 67 5b 31 5d 2c 20 61 44 62 43 6f 6e 66  zArg[1], aDbConf
2ce60 69 67 5b 69 69 5d 2e 7a 4e 61 6d 65 29 21 3d 30  ig[ii].zName)!=0
2ce70 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
2ce80 20 20 20 69 66 28 20 6e 41 72 67 3e 3d 33 20 29     if( nArg>=3 )
2ce90 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
2cea0 33 5f 64 62 5f 63 6f 6e 66 69 67 28 70 2d 3e 64  3_db_config(p->d
2ceb0 62 2c 20 61 44 62 43 6f 6e 66 69 67 5b 69 69 5d  b, aDbConfig[ii]
2cec0 2e 6f 70 2c 20 62 6f 6f 6c 65 61 6e 56 61 6c 75  .op, booleanValu
2ced0 65 28 61 7a 41 72 67 5b 32 5d 29 2c 20 30 29 3b  e(azArg[2]), 0);
2cee0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
2cef0 71 6c 69 74 65 33 5f 64 62 5f 63 6f 6e 66 69 67  qlite3_db_config
2cf00 28 70 2d 3e 64 62 2c 20 61 44 62 43 6f 6e 66 69  (p->db, aDbConfi
2cf10 67 5b 69 69 5d 2e 6f 70 2c 20 2d 31 2c 20 26 76  g[ii].op, -1, &v
2cf20 29 3b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72  );.      utf8_pr
2cf30 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 31  intf(p->out, "%1
2cf40 38 73 20 25 73 5c 6e 22 2c 20 61 44 62 43 6f 6e  8s %s\n", aDbCon
2cf50 66 69 67 5b 69 69 5d 2e 7a 4e 61 6d 65 2c 20 76  fig[ii].zName, v
2cf60 20 3f 20 22 6f 6e 22 20 3a 20 22 6f 66 66 22 29   ? "on" : "off")
2cf70 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 41 72 67  ;.      if( nArg
2cf80 3e 31 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  >1 ) break;.    
2cf90 7d 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3e 31  }.    if( nArg>1
2cfa0 20 26 26 20 69 69 3d 3d 41 72 72 61 79 53 69 7a   && ii==ArraySiz
2cfb0 65 28 61 44 62 43 6f 6e 66 69 67 29 20 29 7b 0a  e(aDbConfig) ){.
2cfc0 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
2cfd0 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72  f(stderr, "Error
2cfe0 3a 20 75 6e 6b 6e 6f 77 6e 20 64 62 63 6f 6e 66  : unknown dbconf
2cff0 69 67 20 5c 22 25 73 5c 22 5c 6e 22 2c 20 61 7a  ig \"%s\"\n", az
2d000 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20 20 20 75  Arg[1]);.      u
2d010 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72  tf8_printf(stder
2d020 72 2c 20 22 45 6e 74 65 72 20 5c 22 2e 64 62 63  r, "Enter \".dbc
2d030 6f 6e 66 69 67 5c 22 20 77 69 74 68 20 6e 6f 20  onfig\" with no 
2d040 61 72 67 75 6d 65 6e 74 73 20 66 6f 72 20 61 20  arguments for a 
2d050 6c 69 73 74 5c 6e 22 29 3b 0a 20 20 20 20 7d 20  list\n");.    } 
2d060 20 20 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66    .  }else..  if
2d070 28 20 63 3d 3d 27 64 27 20 26 26 20 6e 3e 3d 33  ( c=='d' && n>=3
2d080 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72   && strncmp(azAr
2d090 67 5b 30 5d 2c 20 22 64 62 69 6e 66 6f 22 2c 20  g[0], "dbinfo", 
2d0a0 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20  n)==0 ){.    rc 
2d0b0 3d 20 73 68 65 6c 6c 5f 64 62 69 6e 66 6f 5f 63  = shell_dbinfo_c
2d0c0 6f 6d 6d 61 6e 64 28 70 2c 20 6e 41 72 67 2c 20  ommand(p, nArg, 
2d0d0 61 7a 41 72 67 29 3b 0a 20 20 7d 65 6c 73 65 0a  azArg);.  }else.
2d0e0 0a 20 20 69 66 28 20 63 3d 3d 27 64 27 20 26 26  .  if( c=='d' &&
2d0f0 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30   strncmp(azArg[0
2d100 5d 2c 20 22 64 75 6d 70 22 2c 20 6e 29 3d 3d 30  ], "dump", n)==0
2d110 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   ){.    const ch
2d120 61 72 20 2a 7a 4c 69 6b 65 20 3d 20 30 3b 0a 20  ar *zLike = 0;. 
2d130 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e     int i;.    in
2d140 74 20 73 61 76 65 64 53 68 6f 77 48 65 61 64 65  t savedShowHeade
2d150 72 20 3d 20 70 2d 3e 73 68 6f 77 48 65 61 64 65  r = p->showHeade
2d160 72 3b 0a 20 20 20 20 69 6e 74 20 73 61 76 65 64  r;.    int saved
2d170 53 68 65 6c 6c 46 6c 61 67 73 20 3d 20 70 2d 3e  ShellFlags = p->
2d180 73 68 65 6c 6c 46 6c 67 73 3b 0a 20 20 20 20 53  shellFlgs;.    S
2d190 68 65 6c 6c 43 6c 65 61 72 46 6c 61 67 28 70 2c  hellClearFlag(p,
2d1a0 20 53 48 46 4c 47 5f 50 72 65 73 65 72 76 65 52   SHFLG_PreserveR
2d1b0 6f 77 69 64 7c 53 48 46 4c 47 5f 4e 65 77 6c 69  owid|SHFLG_Newli
2d1c0 6e 65 73 7c 53 48 46 4c 47 5f 45 63 68 6f 29 3b  nes|SHFLG_Echo);
2d1d0 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c  .    for(i=1; i<
2d1e0 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nArg; i++){.    
2d1f0 20 20 69 66 28 20 61 7a 41 72 67 5b 69 5d 5b 30    if( azArg[i][0
2d200 5d 3d 3d 27 2d 27 20 29 7b 0a 20 20 20 20 20 20  ]=='-' ){.      
2d210 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20    const char *z 
2d220 3d 20 61 7a 41 72 67 5b 69 5d 2b 31 3b 0a 20 20  = azArg[i]+1;.  
2d230 20 20 20 20 20 20 69 66 28 20 7a 5b 30 5d 3d 3d        if( z[0]==
2d240 27 2d 27 20 29 20 7a 2b 2b 3b 0a 20 20 20 20 20  '-' ) z++;.     
2d250 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c     if( strcmp(z,
2d260 22 70 72 65 73 65 72 76 65 2d 72 6f 77 69 64 73  "preserve-rowids
2d270 22 29 3d 3d 30 20 29 7b 0a 23 69 66 64 65 66 20  ")==0 ){.#ifdef 
2d280 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
2d290 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 20 20 20  UALTABLE.       
2d2a0 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74     raw_printf(st
2d2b0 64 65 72 72 2c 20 22 54 68 65 20 2d 2d 70 72 65  derr, "The --pre
2d2c0 73 65 72 76 65 2d 72 6f 77 69 64 73 20 6f 70 74  serve-rowids opt
2d2d0 69 6f 6e 20 69 73 20 6e 6f 74 20 63 6f 6d 70 61  ion is not compa
2d2e0 74 69 62 6c 65 22 0a 20 20 20 20 20 20 20 20 20  tible".         
2d2f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d300 20 20 20 20 22 20 77 69 74 68 20 53 51 4c 49 54      " with SQLIT
2d310 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
2d320 42 4c 45 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20  BLE\n");.       
2d330 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20     rc = 1;.     
2d340 20 20 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63       goto meta_c
2d350 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 23 65 6c  ommand_exit;.#el
2d360 73 65 0a 20 20 20 20 20 20 20 20 20 20 53 68 65  se.          She
2d370 6c 6c 53 65 74 46 6c 61 67 28 70 2c 20 53 48 46  llSetFlag(p, SHF
2d380 4c 47 5f 50 72 65 73 65 72 76 65 52 6f 77 69 64  LG_PreserveRowid
2d390 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  );.#endif.      
2d3a0 20 20 7d 65 6c 73 65 0a 20 20 20 20 20 20 20 20    }else.        
2d3b0 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 22 6e 65  if( strcmp(z,"ne
2d3c0 77 6c 69 6e 65 73 22 29 3d 3d 30 20 29 7b 0a 20  wlines")==0 ){. 
2d3d0 20 20 20 20 20 20 20 20 20 53 68 65 6c 6c 53 65           ShellSe
2d3e0 74 46 6c 61 67 28 70 2c 20 53 48 46 4c 47 5f 4e  tFlag(p, SHFLG_N
2d3f0 65 77 6c 69 6e 65 73 29 3b 0a 20 20 20 20 20 20  ewlines);.      
2d400 20 20 7d 65 6c 73 65 0a 20 20 20 20 20 20 20 20    }else.        
2d410 7b 0a 20 20 20 20 20 20 20 20 20 20 72 61 77 5f  {.          raw_
2d420 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
2d430 55 6e 6b 6e 6f 77 6e 20 6f 70 74 69 6f 6e 20 5c  Unknown option \
2d440 22 25 73 5c 22 20 6f 6e 20 5c 22 2e 64 75 6d 70  "%s\" on \".dump
2d450 5c 22 5c 6e 22 2c 20 61 7a 41 72 67 5b 69 5d 29  \"\n", azArg[i])
2d460 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
2d470 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f   1;.          go
2d480 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f  to meta_command_
2d490 65 78 69 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  exit;.        }.
2d4a0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
2d4b0 7a 4c 69 6b 65 20 29 7b 0a 20 20 20 20 20 20 20  zLike ){.       
2d4c0 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65   raw_printf(stde
2d4d0 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 64 75 6d  rr, "Usage: .dum
2d4e0 70 20 3f 2d 2d 70 72 65 73 65 72 76 65 2d 72 6f  p ?--preserve-ro
2d4f0 77 69 64 73 3f 20 22 0a 20 20 20 20 20 20 20 20  wids? ".        
2d500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d510 20 20 20 22 3f 2d 2d 6e 65 77 6c 69 6e 65 73 3f     "?--newlines?
2d520 20 3f 4c 49 4b 45 2d 50 41 54 54 45 52 4e 3f 5c   ?LIKE-PATTERN?\
2d530 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  n");.        rc 
2d540 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  = 1;.        got
2d550 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65  o meta_command_e
2d560 78 69 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  xit;.      }else
2d570 7b 0a 20 20 20 20 20 20 20 20 7a 4c 69 6b 65 20  {.        zLike 
2d580 3d 20 61 7a 41 72 67 5b 69 5d 3b 0a 20 20 20 20  = azArg[i];.    
2d590 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 6f 70    }.    }.    op
2d5a0 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a 20 20 20  en_db(p, 0);.   
2d5b0 20 2f 2a 20 57 68 65 6e 20 70 6c 61 79 69 6e 67   /* When playing
2d5c0 20 62 61 63 6b 20 61 20 22 64 75 6d 70 22 2c 20   back a "dump", 
2d5d0 74 68 65 20 63 6f 6e 74 65 6e 74 20 6d 69 67 68  the content migh
2d5e0 74 20 61 70 70 65 61 72 20 69 6e 20 61 6e 20 6f  t appear in an o
2d5f0 72 64 65 72 0a 20 20 20 20 2a 2a 20 77 68 69 63  rder.    ** whic
2d600 68 20 63 61 75 73 65 73 20 69 6d 6d 65 64 69 61  h causes immedia
2d610 74 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 63  te foreign key c
2d620 6f 6e 73 74 72 61 69 6e 74 73 20 74 6f 20 62 65  onstraints to be
2d630 20 76 69 6f 6c 61 74 65 64 2e 0a 20 20 20 20 2a   violated..    *
2d640 2a 20 53 6f 20 64 69 73 61 62 6c 65 20 66 6f 72  * So disable for
2d650 65 69 67 6e 2d 6b 65 79 20 63 6f 6e 73 74 72 61  eign-key constra
2d660 69 6e 74 20 65 6e 66 6f 72 63 65 6d 65 6e 74 20  int enforcement 
2d670 74 6f 20 70 72 65 76 65 6e 74 20 70 72 6f 62 6c  to prevent probl
2d680 65 6d 73 2e 20 2a 2f 0a 20 20 20 20 72 61 77 5f  ems. */.    raw_
2d690 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
2d6a0 50 52 41 47 4d 41 20 66 6f 72 65 69 67 6e 5f 6b  PRAGMA foreign_k
2d6b0 65 79 73 3d 4f 46 46 3b 5c 6e 22 29 3b 0a 20 20  eys=OFF;\n");.  
2d6c0 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e    raw_printf(p->
2d6d0 6f 75 74 2c 20 22 42 45 47 49 4e 20 54 52 41 4e  out, "BEGIN TRAN
2d6e0 53 41 43 54 49 4f 4e 3b 5c 6e 22 29 3b 0a 20 20  SACTION;\n");.  
2d6f0 20 20 70 2d 3e 77 72 69 74 61 62 6c 65 53 63 68    p->writableSch
2d700 65 6d 61 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e  ema = 0;.    p->
2d710 73 68 6f 77 48 65 61 64 65 72 20 3d 20 30 3b 0a  showHeader = 0;.
2d720 20 20 20 20 2f 2a 20 53 65 74 20 77 72 69 74 61      /* Set writa
2d730 62 6c 65 5f 73 63 68 65 6d 61 3d 4f 4e 20 73 69  ble_schema=ON si
2d740 6e 63 65 20 64 6f 69 6e 67 20 73 6f 20 66 6f 72  nce doing so for
2d750 63 65 73 20 53 51 4c 69 74 65 20 74 6f 20 69 6e  ces SQLite to in
2d760 69 74 69 61 6c 69 7a 65 0a 20 20 20 20 2a 2a 20  itialize.    ** 
2d770 61 73 20 6d 75 63 68 20 6f 66 20 74 68 65 20 73  as much of the s
2d780 63 68 65 6d 61 20 61 73 20 69 74 20 63 61 6e 20  chema as it can 
2d790 65 76 65 6e 20 69 66 20 74 68 65 20 73 71 6c 69  even if the sqli
2d7a0 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20  te_master table 
2d7b0 69 73 0a 20 20 20 20 2a 2a 20 63 6f 72 72 75 70  is.    ** corrup
2d7c0 74 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  t. */.    sqlite
2d7d0 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20 22 53  3_exec(p->db, "S
2d7e0 41 56 45 50 4f 49 4e 54 20 64 75 6d 70 3b 20 50  AVEPOINT dump; P
2d7f0 52 41 47 4d 41 20 77 72 69 74 61 62 6c 65 5f 73  RAGMA writable_s
2d800 63 68 65 6d 61 3d 4f 4e 22 2c 20 30 2c 20 30 2c  chema=ON", 0, 0,
2d810 20 30 29 3b 0a 20 20 20 20 70 2d 3e 6e 45 72 72   0);.    p->nErr
2d820 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 7a 4c   = 0;.    if( zL
2d830 69 6b 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ike==0 ){.      
2d840 72 75 6e 5f 73 63 68 65 6d 61 5f 64 75 6d 70 5f  run_schema_dump_
2d850 71 75 65 72 79 28 70 2c 0a 20 20 20 20 20 20 20  query(p,.       
2d860 20 22 53 45 4c 45 43 54 20 6e 61 6d 65 2c 20 74   "SELECT name, t
2d870 79 70 65 2c 20 73 71 6c 20 46 52 4f 4d 20 73 71  ype, sql FROM sq
2d880 6c 69 74 65 5f 6d 61 73 74 65 72 20 22 0a 20 20  lite_master ".  
2d890 20 20 20 20 20 20 22 57 48 45 52 45 20 73 71 6c        "WHERE sql
2d8a0 20 4e 4f 54 20 4e 55 4c 4c 20 41 4e 44 20 74 79   NOT NULL AND ty
2d8b0 70 65 3d 3d 27 74 61 62 6c 65 27 20 41 4e 44 20  pe=='table' AND 
2d8c0 6e 61 6d 65 21 3d 27 73 71 6c 69 74 65 5f 73 65  name!='sqlite_se
2d8d0 71 75 65 6e 63 65 27 22 0a 20 20 20 20 20 20 29  quence'".      )
2d8e0 3b 0a 20 20 20 20 20 20 72 75 6e 5f 73 63 68 65  ;.      run_sche
2d8f0 6d 61 5f 64 75 6d 70 5f 71 75 65 72 79 28 70 2c  ma_dump_query(p,
2d900 0a 20 20 20 20 20 20 20 20 22 53 45 4c 45 43 54  .        "SELECT
2d910 20 6e 61 6d 65 2c 20 74 79 70 65 2c 20 73 71 6c   name, type, sql
2d920 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73   FROM sqlite_mas
2d930 74 65 72 20 22 0a 20 20 20 20 20 20 20 20 22 57  ter ".        "W
2d940 48 45 52 45 20 6e 61 6d 65 3d 3d 27 73 71 6c 69  HERE name=='sqli
2d950 74 65 5f 73 65 71 75 65 6e 63 65 27 22 0a 20 20  te_sequence'".  
2d960 20 20 20 20 29 3b 0a 20 20 20 20 20 20 72 75 6e      );.      run
2d970 5f 74 61 62 6c 65 5f 64 75 6d 70 5f 71 75 65 72  _table_dump_quer
2d980 79 28 70 2c 0a 20 20 20 20 20 20 20 20 22 53 45  y(p,.        "SE
2d990 4c 45 43 54 20 73 71 6c 20 46 52 4f 4d 20 73 71  LECT sql FROM sq
2d9a0 6c 69 74 65 5f 6d 61 73 74 65 72 20 22 0a 20 20  lite_master ".  
2d9b0 20 20 20 20 20 20 22 57 48 45 52 45 20 73 71 6c        "WHERE sql
2d9c0 20 4e 4f 54 20 4e 55 4c 4c 20 41 4e 44 20 74 79   NOT NULL AND ty
2d9d0 70 65 20 49 4e 20 28 27 69 6e 64 65 78 27 2c 27  pe IN ('index','
2d9e0 74 72 69 67 67 65 72 27 2c 27 76 69 65 77 27 29  trigger','view')
2d9f0 22 2c 20 30 0a 20 20 20 20 20 20 29 3b 0a 20 20  ", 0.      );.  
2da00 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63    }else{.      c
2da10 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 20 20 20  har *zSql;.     
2da20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f   zSql = sqlite3_
2da30 6d 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20  mprintf(.       
2da40 20 22 53 45 4c 45 43 54 20 6e 61 6d 65 2c 20 74   "SELECT name, t
2da50 79 70 65 2c 20 73 71 6c 20 46 52 4f 4d 20 73 71  ype, sql FROM sq
2da60 6c 69 74 65 5f 6d 61 73 74 65 72 20 22 0a 20 20  lite_master ".  
2da70 20 20 20 20 20 20 22 57 48 45 52 45 20 74 62 6c        "WHERE tbl
2da80 5f 6e 61 6d 65 20 4c 49 4b 45 20 25 51 20 41 4e  _name LIKE %Q AN
2da90 44 20 74 79 70 65 3d 3d 27 74 61 62 6c 65 27 22  D type=='table'"
2daa0 0a 20 20 20 20 20 20 20 20 22 20 20 41 4e 44 20  .        "  AND 
2dab0 73 71 6c 20 4e 4f 54 20 4e 55 4c 4c 22 2c 20 7a  sql NOT NULL", z
2dac0 4c 69 6b 65 29 3b 0a 20 20 20 20 20 20 72 75 6e  Like);.      run
2dad0 5f 73 63 68 65 6d 61 5f 64 75 6d 70 5f 71 75 65  _schema_dump_que
2dae0 72 79 28 70 2c 7a 53 71 6c 29 3b 0a 20 20 20 20  ry(p,zSql);.    
2daf0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
2db00 53 71 6c 29 3b 0a 20 20 20 20 20 20 7a 53 71 6c  Sql);.      zSql
2db10 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
2db20 74 66 28 0a 20 20 20 20 20 20 20 20 22 53 45 4c  tf(.        "SEL
2db30 45 43 54 20 73 71 6c 20 46 52 4f 4d 20 73 71 6c  ECT sql FROM sql
2db40 69 74 65 5f 6d 61 73 74 65 72 20 22 0a 20 20 20  ite_master ".   
2db50 20 20 20 20 20 22 57 48 45 52 45 20 73 71 6c 20       "WHERE sql 
2db60 4e 4f 54 20 4e 55 4c 4c 22 0a 20 20 20 20 20 20  NOT NULL".      
2db70 20 20 22 20 20 41 4e 44 20 74 79 70 65 20 49 4e    "  AND type IN
2db80 20 28 27 69 6e 64 65 78 27 2c 27 74 72 69 67 67   ('index','trigg
2db90 65 72 27 2c 27 76 69 65 77 27 29 22 0a 20 20 20  er','view')".   
2dba0 20 20 20 20 20 22 20 20 41 4e 44 20 74 62 6c 5f       "  AND tbl_
2dbb0 6e 61 6d 65 20 4c 49 4b 45 20 25 51 22 2c 20 7a  name LIKE %Q", z
2dbc0 4c 69 6b 65 29 3b 0a 20 20 20 20 20 20 72 75 6e  Like);.      run
2dbd0 5f 74 61 62 6c 65 5f 64 75 6d 70 5f 71 75 65 72  _table_dump_quer
2dbe0 79 28 70 2c 20 7a 53 71 6c 2c 20 30 29 3b 0a 20  y(p, zSql, 0);. 
2dbf0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
2dc00 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20 7d 0a 20  e(zSql);.    }. 
2dc10 20 20 20 69 66 28 20 70 2d 3e 77 72 69 74 61 62     if( p->writab
2dc20 6c 65 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20  leSchema ){.    
2dc30 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e    raw_printf(p->
2dc40 6f 75 74 2c 20 22 50 52 41 47 4d 41 20 77 72 69  out, "PRAGMA wri
2dc50 74 61 62 6c 65 5f 73 63 68 65 6d 61 3d 4f 46 46  table_schema=OFF
2dc60 3b 5c 6e 22 29 3b 0a 20 20 20 20 20 20 70 2d 3e  ;\n");.      p->
2dc70 77 72 69 74 61 62 6c 65 53 63 68 65 6d 61 20 3d  writableSchema =
2dc80 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71   0;.    }.    sq
2dc90 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62  lite3_exec(p->db
2dca0 2c 20 22 50 52 41 47 4d 41 20 77 72 69 74 61 62  , "PRAGMA writab
2dcb0 6c 65 5f 73 63 68 65 6d 61 3d 4f 46 46 3b 22 2c  le_schema=OFF;",
2dcc0 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73   0, 0, 0);.    s
2dcd0 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64  qlite3_exec(p->d
2dce0 62 2c 20 22 52 45 4c 45 41 53 45 20 64 75 6d 70  b, "RELEASE dump
2dcf0 3b 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  ;", 0, 0, 0);.  
2dd00 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e    raw_printf(p->
2dd10 6f 75 74 2c 20 70 2d 3e 6e 45 72 72 20 3f 20 22  out, p->nErr ? "
2dd20 52 4f 4c 4c 42 41 43 4b 3b 20 2d 2d 20 64 75 65  ROLLBACK; -- due
2dd30 20 74 6f 20 65 72 72 6f 72 73 5c 6e 22 20 3a 20   to errors\n" : 
2dd40 22 43 4f 4d 4d 49 54 3b 5c 6e 22 29 3b 0a 20 20  "COMMIT;\n");.  
2dd50 20 20 70 2d 3e 73 68 6f 77 48 65 61 64 65 72 20    p->showHeader 
2dd60 3d 20 73 61 76 65 64 53 68 6f 77 48 65 61 64 65  = savedShowHeade
2dd70 72 3b 0a 20 20 20 20 70 2d 3e 73 68 65 6c 6c 46  r;.    p->shellF
2dd80 6c 67 73 20 3d 20 73 61 76 65 64 53 68 65 6c 6c  lgs = savedShell
2dd90 46 6c 61 67 73 3b 0a 20 20 7d 65 6c 73 65 0a 0a  Flags;.  }else..
2dda0 20 20 69 66 28 20 63 3d 3d 27 65 27 20 26 26 20    if( c=='e' && 
2ddb0 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d  strncmp(azArg[0]
2ddc0 2c 20 22 65 63 68 6f 22 2c 20 6e 29 3d 3d 30 20  , "echo", n)==0 
2ddd0 29 7b 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3d  ){.    if( nArg=
2dde0 3d 32 20 29 7b 0a 20 20 20 20 20 20 73 65 74 4f  =2 ){.      setO
2ddf0 72 43 6c 65 61 72 46 6c 61 67 28 70 2c 20 53 48  rClearFlag(p, SH
2de00 46 4c 47 5f 45 63 68 6f 2c 20 61 7a 41 72 67 5b  FLG_Echo, azArg[
2de10 31 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  1]);.    }else{.
2de20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
2de30 28 73 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a  (stderr, "Usage:
2de40 20 2e 65 63 68 6f 20 6f 6e 7c 6f 66 66 5c 6e 22   .echo on|off\n"
2de50 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b  );.      rc = 1;
2de60 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a  .    }.  }else..
2de70 20 20 69 66 28 20 63 3d 3d 27 65 27 20 26 26 20    if( c=='e' && 
2de80 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d  strncmp(azArg[0]
2de90 2c 20 22 65 71 70 22 2c 20 6e 29 3d 3d 30 20 29  , "eqp", n)==0 )
2dea0 7b 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3d 3d  {.    if( nArg==
2deb0 32 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 61 75  2 ){.      p->au
2dec0 74 6f 45 51 50 74 65 73 74 20 3d 20 30 3b 0a 20  toEQPtest = 0;. 
2ded0 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28       if( strcmp(
2dee0 61 7a 41 72 67 5b 31 5d 2c 22 66 75 6c 6c 22 29  azArg[1],"full")
2def0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ==0 ){.        p
2df00 2d 3e 61 75 74 6f 45 51 50 20 3d 20 41 55 54 4f  ->autoEQP = AUTO
2df10 45 51 50 5f 66 75 6c 6c 3b 0a 20 20 20 20 20 20  EQP_full;.      
2df20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
2df30 28 61 7a 41 72 67 5b 31 5d 2c 22 74 72 69 67 67  (azArg[1],"trigg
2df40 65 72 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  er")==0 ){.     
2df50 20 20 20 70 2d 3e 61 75 74 6f 45 51 50 20 3d 20     p->autoEQP = 
2df60 41 55 54 4f 45 51 50 5f 74 72 69 67 67 65 72 3b  AUTOEQP_trigger;
2df70 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
2df80 20 73 74 72 63 6d 70 28 61 7a 41 72 67 5b 31 5d   strcmp(azArg[1]
2df90 2c 22 74 65 73 74 22 29 3d 3d 30 20 29 7b 0a 20  ,"test")==0 ){. 
2dfa0 20 20 20 20 20 20 20 70 2d 3e 61 75 74 6f 45 51         p->autoEQ
2dfb0 50 20 3d 20 41 55 54 4f 45 51 50 5f 6f 6e 3b 0a  P = AUTOEQP_on;.
2dfc0 20 20 20 20 20 20 20 20 70 2d 3e 61 75 74 6f 45          p->autoE
2dfd0 51 50 74 65 73 74 20 3d 20 31 3b 0a 20 20 20 20  QPtest = 1;.    
2dfe0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2dff0 20 70 2d 3e 61 75 74 6f 45 51 50 20 3d 20 28 75   p->autoEQP = (u
2e000 38 29 62 6f 6f 6c 65 61 6e 56 61 6c 75 65 28 61  8)booleanValue(a
2e010 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20 20 20  zArg[1]);.      
2e020 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
2e030 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74     raw_printf(st
2e040 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 65  derr, "Usage: .e
2e050 71 70 20 6f 66 66 7c 6f 6e 7c 74 72 69 67 67 65  qp off|on|trigge
2e060 72 7c 66 75 6c 6c 5c 6e 22 29 3b 0a 20 20 20 20  r|full\n");.    
2e070 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a    rc = 1;.    }.
2e080 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63    }else..  if( c
2e090 3d 3d 27 65 27 20 26 26 20 73 74 72 6e 63 6d 70  =='e' && strncmp
2e0a0 28 61 7a 41 72 67 5b 30 5d 2c 20 22 65 78 69 74  (azArg[0], "exit
2e0b0 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ", n)==0 ){.    
2e0c0 69 66 28 20 6e 41 72 67 3e 31 20 26 26 20 28 72  if( nArg>1 && (r
2e0d0 63 20 3d 20 28 69 6e 74 29 69 6e 74 65 67 65 72  c = (int)integer
2e0e0 56 61 6c 75 65 28 61 7a 41 72 67 5b 31 5d 29 29  Value(azArg[1]))
2e0f0 21 3d 30 20 29 20 65 78 69 74 28 72 63 29 3b 0a  !=0 ) exit(rc);.
2e100 20 20 20 20 72 63 20 3d 20 32 3b 0a 20 20 7d 65      rc = 2;.  }e
2e110 6c 73 65 0a 0a 20 20 2f 2a 20 54 68 65 20 22 2e  lse..  /* The ".
2e120 65 78 70 6c 61 69 6e 22 20 63 6f 6d 6d 61 6e 64  explain" command
2e130 20 69 73 20 61 75 74 6f 6d 61 74 69 63 20 6e 6f   is automatic no
2e140 77 2e 20 20 49 74 20 69 73 20 6c 61 72 67 65 6c  w.  It is largel
2e150 79 20 70 6f 69 6e 74 6c 65 73 73 2e 20 20 49 74  y pointless.  It
2e160 0a 20 20 2a 2a 20 72 65 74 61 69 6e 65 64 20 70  .  ** retained p
2e170 75 72 65 6c 79 20 66 6f 72 20 62 61 63 6b 77 61  urely for backwa
2e180 72 64 73 20 63 6f 6d 70 61 74 69 62 69 6c 69 74  rds compatibilit
2e190 79 20 2a 2f 0a 20 20 69 66 28 20 63 3d 3d 27 65  y */.  if( c=='e
2e1a0 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41  ' && strncmp(azA
2e1b0 72 67 5b 30 5d 2c 20 22 65 78 70 6c 61 69 6e 22  rg[0], "explain"
2e1c0 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69  , n)==0 ){.    i
2e1d0 6e 74 20 76 61 6c 20 3d 20 31 3b 0a 20 20 20 20  nt val = 1;.    
2e1e0 69 66 28 20 6e 41 72 67 3e 3d 32 20 29 7b 0a 20  if( nArg>=2 ){. 
2e1f0 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28       if( strcmp(
2e200 61 7a 41 72 67 5b 31 5d 2c 22 61 75 74 6f 22 29  azArg[1],"auto")
2e210 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 76  ==0 ){.        v
2e220 61 6c 20 3d 20 39 39 3b 0a 20 20 20 20 20 20 7d  al = 99;.      }
2e230 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 76 61  else{.        va
2e240 6c 20 3d 20 20 62 6f 6f 6c 65 61 6e 56 61 6c 75  l =  booleanValu
2e250 65 28 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20  e(azArg[1]);.   
2e260 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
2e270 66 28 20 76 61 6c 3d 3d 31 20 26 26 20 70 2d 3e  f( val==1 && p->
2e280 6d 6f 64 65 21 3d 4d 4f 44 45 5f 45 78 70 6c 61  mode!=MODE_Expla
2e290 69 6e 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e  in ){.      p->n
2e2a0 6f 72 6d 61 6c 4d 6f 64 65 20 3d 20 70 2d 3e 6d  ormalMode = p->m
2e2b0 6f 64 65 3b 0a 20 20 20 20 20 20 70 2d 3e 6d 6f  ode;.      p->mo
2e2c0 64 65 20 3d 20 4d 4f 44 45 5f 45 78 70 6c 61 69  de = MODE_Explai
2e2d0 6e 3b 0a 20 20 20 20 20 20 70 2d 3e 61 75 74 6f  n;.      p->auto
2e2e0 45 78 70 6c 61 69 6e 20 3d 20 30 3b 0a 20 20 20  Explain = 0;.   
2e2f0 20 7d 65 6c 73 65 20 69 66 28 20 76 61 6c 3d 3d   }else if( val==
2e300 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  0 ){.      if( p
2e310 2d 3e 6d 6f 64 65 3d 3d 4d 4f 44 45 5f 45 78 70  ->mode==MODE_Exp
2e320 6c 61 69 6e 20 29 20 70 2d 3e 6d 6f 64 65 20 3d  lain ) p->mode =
2e330 20 70 2d 3e 6e 6f 72 6d 61 6c 4d 6f 64 65 3b 0a   p->normalMode;.
2e340 20 20 20 20 20 20 70 2d 3e 61 75 74 6f 45 78 70        p->autoExp
2e350 6c 61 69 6e 20 3d 20 30 3b 0a 20 20 20 20 7d 65  lain = 0;.    }e
2e360 6c 73 65 20 69 66 28 20 76 61 6c 3d 3d 39 39 20  lse if( val==99 
2e370 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  ){.      if( p->
2e380 6d 6f 64 65 3d 3d 4d 4f 44 45 5f 45 78 70 6c 61  mode==MODE_Expla
2e390 69 6e 20 29 20 70 2d 3e 6d 6f 64 65 20 3d 20 70  in ) p->mode = p
2e3a0 2d 3e 6e 6f 72 6d 61 6c 4d 6f 64 65 3b 0a 20 20  ->normalMode;.  
2e3b0 20 20 20 20 70 2d 3e 61 75 74 6f 45 78 70 6c 61      p->autoExpla
2e3c0 69 6e 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  in = 1;.    }.  
2e3d0 7d 65 6c 73 65 0a 0a 23 69 66 6e 64 65 66 20 53  }else..#ifndef S
2e3e0 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
2e3f0 41 4c 54 41 42 4c 45 0a 20 20 69 66 28 20 63 3d  ALTABLE.  if( c=
2e400 3d 27 65 27 20 26 26 20 73 74 72 6e 63 6d 70 28  ='e' && strncmp(
2e410 61 7a 41 72 67 5b 30 5d 2c 20 22 65 78 70 65 72  azArg[0], "exper
2e420 74 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20  t", n)==0 ){.   
2e430 20 6f 70 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a   open_db(p, 0);.
2e440 20 20 20 20 65 78 70 65 72 74 44 6f 74 43 6f 6d      expertDotCom
2e450 6d 61 6e 64 28 70 2c 20 61 7a 41 72 67 2c 20 6e  mand(p, azArg, n
2e460 41 72 67 29 3b 0a 20 20 7d 65 6c 73 65 0a 23 65  Arg);.  }else.#e
2e470 6e 64 69 66 0a 0a 20 20 69 66 28 20 63 3d 3d 27  ndif..  if( c=='
2e480 66 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a  f' && strncmp(az
2e490 41 72 67 5b 30 5d 2c 20 22 66 75 6c 6c 73 63 68  Arg[0], "fullsch
2e4a0 65 6d 61 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20  ema", n)==0 ){. 
2e4b0 20 20 20 53 68 65 6c 6c 53 74 61 74 65 20 64 61     ShellState da
2e4c0 74 61 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 45  ta;.    char *zE
2e4d0 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 20 20 69  rrMsg = 0;.    i
2e4e0 6e 74 20 64 6f 53 74 61 74 73 20 3d 20 30 3b 0a  nt doStats = 0;.
2e4f0 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61      memcpy(&data
2e500 2c 20 70 2c 20 73 69 7a 65 6f 66 28 64 61 74 61  , p, sizeof(data
2e510 29 29 3b 0a 20 20 20 20 64 61 74 61 2e 73 68 6f  ));.    data.sho
2e520 77 48 65 61 64 65 72 20 3d 20 30 3b 0a 20 20 20  wHeader = 0;.   
2e530 20 64 61 74 61 2e 63 4d 6f 64 65 20 3d 20 64 61   data.cMode = da
2e540 74 61 2e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 53  ta.mode = MODE_S
2e550 65 6d 69 3b 0a 20 20 20 20 69 66 28 20 6e 41 72  emi;.    if( nAr
2e560 67 3d 3d 32 20 26 26 20 6f 70 74 69 6f 6e 4d 61  g==2 && optionMa
2e570 74 63 68 28 61 7a 41 72 67 5b 31 5d 2c 20 22 69  tch(azArg[1], "i
2e580 6e 64 65 6e 74 22 29 20 29 7b 0a 20 20 20 20 20  ndent") ){.     
2e590 20 64 61 74 61 2e 63 4d 6f 64 65 20 3d 20 64 61   data.cMode = da
2e5a0 74 61 2e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 50  ta.mode = MODE_P
2e5b0 72 65 74 74 79 3b 0a 20 20 20 20 20 20 6e 41 72  retty;.      nAr
2e5c0 67 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  g = 1;.    }.   
2e5d0 20 69 66 28 20 6e 41 72 67 21 3d 31 20 29 7b 0a   if( nArg!=1 ){.
2e5e0 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
2e5f0 28 73 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a  (stderr, "Usage:
2e600 20 2e 66 75 6c 6c 73 63 68 65 6d 61 20 3f 2d 2d   .fullschema ?--
2e610 69 6e 64 65 6e 74 3f 5c 6e 22 29 3b 0a 20 20 20  indent?\n");.   
2e620 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20     rc = 1;.     
2e630 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61   goto meta_comma
2e640 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a 20  nd_exit;.    }. 
2e650 20 20 20 6f 70 65 6e 5f 64 62 28 70 2c 20 30 29     open_db(p, 0)
2e660 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
2e670 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c 0a 20  e3_exec(p->db,. 
2e680 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 73 71        "SELECT sq
2e690 6c 20 46 52 4f 4d 22 0a 20 20 20 20 20 20 20 22  l FROM".       "
2e6a0 20 20 28 53 45 4c 45 43 54 20 73 71 6c 20 73 71    (SELECT sql sq
2e6b0 6c 2c 20 74 79 70 65 20 74 79 70 65 2c 20 74 62  l, type type, tb
2e6c0 6c 5f 6e 61 6d 65 20 74 62 6c 5f 6e 61 6d 65 2c  l_name tbl_name,
2e6d0 20 6e 61 6d 65 20 6e 61 6d 65 2c 20 72 6f 77 69   name name, rowi
2e6e0 64 20 78 22 0a 20 20 20 20 20 20 20 22 20 20 20  d x".       "   
2e6f0 20 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61    FROM sqlite_ma
2e700 73 74 65 72 20 55 4e 49 4f 4e 20 41 4c 4c 22 0a  ster UNION ALL".
2e710 20 20 20 20 20 20 20 22 20 20 20 53 45 4c 45 43         "   SELEC
2e720 54 20 73 71 6c 2c 20 74 79 70 65 2c 20 74 62 6c  T sql, type, tbl
2e730 5f 6e 61 6d 65 2c 20 6e 61 6d 65 2c 20 72 6f 77  _name, name, row
2e740 69 64 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 74  id FROM sqlite_t
2e750 65 6d 70 5f 6d 61 73 74 65 72 29 20 22 0a 20 20  emp_master) ".  
2e760 20 20 20 20 20 22 57 48 45 52 45 20 74 79 70 65       "WHERE type
2e770 21 3d 27 6d 65 74 61 27 20 41 4e 44 20 73 71 6c  !='meta' AND sql
2e780 20 4e 4f 54 4e 55 4c 4c 20 41 4e 44 20 6e 61 6d   NOTNULL AND nam
2e790 65 20 4e 4f 54 20 4c 49 4b 45 20 27 73 71 6c 69  e NOT LIKE 'sqli
2e7a0 74 65 5f 25 27 20 22 0a 20 20 20 20 20 20 20 22  te_%' ".       "
2e7b0 4f 52 44 45 52 20 42 59 20 72 6f 77 69 64 22 2c  ORDER BY rowid",
2e7c0 0a 20 20 20 20 20 20 20 63 61 6c 6c 62 61 63 6b  .       callback
2e7d0 2c 20 26 64 61 74 61 2c 20 26 7a 45 72 72 4d 73  , &data, &zErrMs
2e7e0 67 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28  g.    );.    if(
2e7f0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2e800 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
2e810 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 20  stmt *pStmt;.   
2e820 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
2e830 70 72 65 70 61 72 65 5f 76 32 28 70 2d 3e 64 62  prepare_v2(p->db
2e840 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2e850 20 22 53 45 4c 45 43 54 20 72 6f 77 69 64 20 46   "SELECT rowid F
2e860 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  ROM sqlite_maste
2e870 72 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r".             
2e880 20 20 22 20 57 48 45 52 45 20 6e 61 6d 65 20 47    " WHERE name G
2e890 4c 4f 42 20 27 73 71 6c 69 74 65 5f 73 74 61 74  LOB 'sqlite_stat
2e8a0 5b 31 33 34 5d 27 22 2c 0a 20 20 20 20 20 20 20  [134]'",.       
2e8b0 20 20 20 20 20 20 20 20 2d 31 2c 20 26 70 53 74          -1, &pSt
2e8c0 6d 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 64 6f  mt, 0);.      do
2e8d0 53 74 61 74 73 20 3d 20 73 71 6c 69 74 65 33 5f  Stats = sqlite3_
2e8e0 73 74 65 70 28 70 53 74 6d 74 29 3d 3d 53 51 4c  step(pStmt)==SQL
2e8f0 49 54 45 5f 52 4f 57 3b 0a 20 20 20 20 20 20 73  ITE_ROW;.      s
2e900 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
2e910 70 53 74 6d 74 29 3b 0a 20 20 20 20 7d 0a 20 20  pStmt);.    }.  
2e920 20 20 69 66 28 20 64 6f 53 74 61 74 73 3d 3d 30    if( doStats==0
2e930 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72   ){.      raw_pr
2e940 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 2f 2a  intf(p->out, "/*
2e950 20 4e 6f 20 53 54 41 54 20 74 61 62 6c 65 73 20   No STAT tables 
2e960 61 76 61 69 6c 61 62 6c 65 20 2a 2f 5c 6e 22 29  available */\n")
2e970 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
2e980 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d     raw_printf(p-
2e990 3e 6f 75 74 2c 20 22 41 4e 41 4c 59 5a 45 20 73  >out, "ANALYZE s
2e9a0 71 6c 69 74 65 5f 6d 61 73 74 65 72 3b 5c 6e 22  qlite_master;\n"
2e9b0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
2e9c0 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20 22 53 45  _exec(p->db, "SE
2e9d0 4c 45 43 54 20 27 41 4e 41 4c 59 5a 45 20 73 71  LECT 'ANALYZE sq
2e9e0 6c 69 74 65 5f 6d 61 73 74 65 72 27 22 2c 0a 20  lite_master'",. 
2e9f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ea00 20 20 63 61 6c 6c 62 61 63 6b 2c 20 26 64 61 74    callback, &dat
2ea10 61 2c 20 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20  a, &zErrMsg);.  
2ea20 20 20 20 20 64 61 74 61 2e 63 4d 6f 64 65 20 3d      data.cMode =
2ea30 20 64 61 74 61 2e 6d 6f 64 65 20 3d 20 4d 4f 44   data.mode = MOD
2ea40 45 5f 49 6e 73 65 72 74 3b 0a 20 20 20 20 20 20  E_Insert;.      
2ea50 64 61 74 61 2e 7a 44 65 73 74 54 61 62 6c 65 20  data.zDestTable 
2ea60 3d 20 22 73 71 6c 69 74 65 5f 73 74 61 74 31 22  = "sqlite_stat1"
2ea70 3b 0a 20 20 20 20 20 20 73 68 65 6c 6c 5f 65 78  ;.      shell_ex
2ea80 65 63 28 26 64 61 74 61 2c 20 22 53 45 4c 45 43  ec(&data, "SELEC
2ea90 54 20 2a 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f  T * FROM sqlite_
2eaa0 73 74 61 74 31 22 2c 20 26 7a 45 72 72 4d 73 67  stat1", &zErrMsg
2eab0 29 3b 0a 20 20 20 20 20 20 64 61 74 61 2e 7a 44  );.      data.zD
2eac0 65 73 74 54 61 62 6c 65 20 3d 20 22 73 71 6c 69  estTable = "sqli
2ead0 74 65 5f 73 74 61 74 33 22 3b 0a 20 20 20 20 20  te_stat3";.     
2eae0 20 73 68 65 6c 6c 5f 65 78 65 63 28 26 64 61 74   shell_exec(&dat
2eaf0 61 2c 20 22 53 45 4c 45 43 54 20 2a 20 46 52 4f  a, "SELECT * FRO
2eb00 4d 20 73 71 6c 69 74 65 5f 73 74 61 74 33 22 2c  M sqlite_stat3",
2eb10 20 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20   &zErrMsg);.    
2eb20 20 20 64 61 74 61 2e 7a 44 65 73 74 54 61 62 6c    data.zDestTabl
2eb30 65 20 3d 20 22 73 71 6c 69 74 65 5f 73 74 61 74  e = "sqlite_stat
2eb40 34 22 3b 0a 20 20 20 20 20 20 73 68 65 6c 6c 5f  4";.      shell_
2eb50 65 78 65 63 28 26 64 61 74 61 2c 20 22 53 45 4c  exec(&data, "SEL
2eb60 45 43 54 20 2a 20 46 52 4f 4d 20 73 71 6c 69 74  ECT * FROM sqlit
2eb70 65 5f 73 74 61 74 34 22 2c 20 26 7a 45 72 72 4d  e_stat4", &zErrM
2eb80 73 67 29 3b 0a 20 20 20 20 20 20 72 61 77 5f 70  sg);.      raw_p
2eb90 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 41  rintf(p->out, "A
2eba0 4e 41 4c 59 5a 45 20 73 71 6c 69 74 65 5f 6d 61  NALYZE sqlite_ma
2ebb0 73 74 65 72 3b 5c 6e 22 29 3b 0a 20 20 20 20 7d  ster;\n");.    }
2ebc0 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20  .  }else..  if( 
2ebd0 63 3d 3d 27 68 27 20 26 26 20 73 74 72 6e 63 6d  c=='h' && strncm
2ebe0 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 68 65 61  p(azArg[0], "hea
2ebf0 64 65 72 73 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a  ders", n)==0 ){.
2ec00 20 20 20 20 69 66 28 20 6e 41 72 67 3d 3d 32 20      if( nArg==2 
2ec10 29 7b 0a 20 20 20 20 20 20 70 2d 3e 73 68 6f 77  ){.      p->show
2ec20 48 65 61 64 65 72 20 3d 20 62 6f 6f 6c 65 61 6e  Header = boolean
2ec30 56 61 6c 75 65 28 61 7a 41 72 67 5b 31 5d 29 3b  Value(azArg[1]);
2ec40 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
2ec50 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64    raw_printf(std
2ec60 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 68 65  err, "Usage: .he
2ec70 61 64 65 72 73 20 6f 6e 7c 6f 66 66 5c 6e 22 29  aders on|off\n")
2ec80 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a  ;.      rc = 1;.
2ec90 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20      }.  }else.. 
2eca0 20 69 66 28 20 63 3d 3d 27 68 27 20 26 26 20 73   if( c=='h' && s
2ecb0 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c  trncmp(azArg[0],
2ecc0 20 22 68 65 6c 70 22 2c 20 6e 29 3d 3d 30 20 29   "help", n)==0 )
2ecd0 7b 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3e 3d  {.    if( nArg>=
2ece0 32 20 29 7b 0a 20 20 20 20 20 20 6e 20 3d 20 73  2 ){.      n = s
2ecf0 68 6f 77 48 65 6c 70 28 70 2d 3e 6f 75 74 2c 20  howHelp(p->out, 
2ed00 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20 20  azArg[1]);.     
2ed10 20 69 66 28 20 6e 3d 3d 30 20 29 7b 0a 20 20 20   if( n==0 ){.   
2ed20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
2ed30 28 70 2d 3e 6f 75 74 2c 20 22 4e 6f 74 68 69 6e  (p->out, "Nothin
2ed40 67 20 6d 61 74 63 68 65 73 20 27 25 73 27 5c 6e  g matches '%s'\n
2ed50 22 2c 20 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20  ", azArg[1]);.  
2ed60 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
2ed70 0a 20 20 20 20 20 20 73 68 6f 77 48 65 6c 70 28  .      showHelp(
2ed80 70 2d 3e 6f 75 74 2c 20 30 29 3b 0a 20 20 20 20  p->out, 0);.    
2ed90 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28  }.  }else..  if(
2eda0 20 63 3d 3d 27 69 27 20 26 26 20 73 74 72 6e 63   c=='i' && strnc
2edb0 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 69 6d  mp(azArg[0], "im
2edc0 70 6f 72 74 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a  port", n)==0 ){.
2edd0 20 20 20 20 63 68 61 72 20 2a 7a 54 61 62 6c 65      char *zTable
2ede0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2edf0 2f 2a 20 49 6e 73 65 72 74 20 64 61 74 61 20 69  /* Insert data i
2ee00 6e 74 6f 20 74 68 69 73 20 74 61 62 6c 65 20 2a  nto this table *
2ee10 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 46 69 6c  /.    char *zFil
2ee20 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
2ee30 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 66 69 6c    /* Name of fil
2ee40 65 20 74 6f 20 65 78 74 72 61 20 63 6f 6e 74 65  e to extra conte
2ee50 6e 74 20 66 72 6f 6d 20 2a 2f 0a 20 20 20 20 73  nt from */.    s
2ee60 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
2ee70 6d 74 20 3d 20 4e 55 4c 4c 3b 20 2f 2a 20 41 20  mt = NULL; /* A 
2ee80 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20  statement */.   
2ee90 20 69 6e 74 20 6e 43 6f 6c 3b 20 20 20 20 20 20   int nCol;      
2eea0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2eeb0 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  Number of column
2eec0 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 2a  s in the table *
2eed0 2f 0a 20 20 20 20 69 6e 74 20 6e 42 79 74 65 3b  /.    int nByte;
2eee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2eef0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
2ef00 79 74 65 73 20 69 6e 20 61 6e 20 53 51 4c 20 73  ytes in an SQL s
2ef10 74 72 69 6e 67 20 2a 2f 0a 20 20 20 20 69 6e 74  tring */.    int
2ef20 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20   i, j;          
2ef30 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
2ef40 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 20   counters */.   
2ef50 20 69 6e 74 20 6e 65 65 64 43 6f 6d 6d 69 74 3b   int needCommit;
2ef60 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2ef70 54 72 75 65 20 74 6f 20 43 4f 4d 4d 49 54 20 6f  True to COMMIT o
2ef80 72 20 52 4f 4c 4c 42 41 43 4b 20 61 74 20 65 6e  r ROLLBACK at en
2ef90 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 53 65  d */.    int nSe
2efa0 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
2efb0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
2efc0 66 20 62 79 74 65 73 20 69 6e 20 70 2d 3e 63 6f  f bytes in p->co
2efd0 6c 53 65 70 61 72 61 74 6f 72 5b 5d 20 2a 2f 0a  lSeparator[] */.
2efe0 20 20 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b 20      char *zSql; 
2eff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f000 2f 2a 20 41 6e 20 53 51 4c 20 73 74 61 74 65 6d  /* An SQL statem
2f010 65 6e 74 20 2a 2f 0a 20 20 20 20 49 6d 70 6f 72  ent */.    Impor
2f020 74 43 74 78 20 73 43 74 78 3b 20 20 20 20 20 20  tCtx sCtx;      
2f030 20 20 20 20 20 20 20 2f 2a 20 52 65 61 64 65 72         /* Reader
2f040 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 20 20   context */.    
2f050 63 68 61 72 20 2a 28 53 51 4c 49 54 45 5f 43 44  char *(SQLITE_CD
2f060 45 43 4c 20 2a 78 52 65 61 64 29 28 49 6d 70 6f  ECL *xRead)(Impo
2f070 72 74 43 74 78 2a 29 3b 20 2f 2a 20 46 75 6e 63  rtCtx*); /* Func
2f080 20 74 6f 20 72 65 61 64 20 6f 6e 65 20 76 61 6c   to read one val
2f090 75 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 28 53  ue */.    int (S
2f0a0 51 4c 49 54 45 5f 43 44 45 43 4c 20 2a 78 43 6c  QLITE_CDECL *xCl
2f0b0 6f 73 65 72 29 28 46 49 4c 45 2a 29 3b 20 20 20  oser)(FILE*);   
2f0c0 20 20 20 2f 2a 20 46 75 6e 63 20 74 6f 20 63 6c     /* Func to cl
2f0d0 6f 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 20  ose file */..   
2f0e0 20 69 66 28 20 6e 41 72 67 21 3d 33 20 29 7b 0a   if( nArg!=3 ){.
2f0f0 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
2f100 28 73 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a  (stderr, "Usage:
2f110 20 2e 69 6d 70 6f 72 74 20 46 49 4c 45 20 54 41   .import FILE TA
2f120 42 4c 45 5c 6e 22 29 3b 0a 20 20 20 20 20 20 67  BLE\n");.      g
2f130 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64  oto meta_command
2f140 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a 20 20 20  _exit;.    }.   
2f150 20 7a 46 69 6c 65 20 3d 20 61 7a 41 72 67 5b 31   zFile = azArg[1
2f160 5d 3b 0a 20 20 20 20 7a 54 61 62 6c 65 20 3d 20  ];.    zTable = 
2f170 61 7a 41 72 67 5b 32 5d 3b 0a 20 20 20 20 73 65  azArg[2];.    se
2f180 65 6e 49 6e 74 65 72 72 75 70 74 20 3d 20 30 3b  enInterrupt = 0;
2f190 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 73 43 74  .    memset(&sCt
2f1a0 78 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 43 74  x, 0, sizeof(sCt
2f1b0 78 29 29 3b 0a 20 20 20 20 6f 70 65 6e 5f 64 62  x));.    open_db
2f1c0 28 70 2c 20 30 29 3b 0a 20 20 20 20 6e 53 65 70  (p, 0);.    nSep
2f1d0 20 3d 20 73 74 72 6c 65 6e 33 30 28 70 2d 3e 63   = strlen30(p->c
2f1e0 6f 6c 53 65 70 61 72 61 74 6f 72 29 3b 0a 20 20  olSeparator);.  
2f1f0 20 20 69 66 28 20 6e 53 65 70 3d 3d 30 20 29 7b    if( nSep==0 ){
2f200 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74  .      raw_print
2f210 66 28 73 74 64 65 72 72 2c 0a 20 20 20 20 20 20  f(stderr,.      
2f220 20 20 20 20 20 20 20 20 20 20 20 22 45 72 72 6f             "Erro
2f230 72 3a 20 6e 6f 6e 2d 6e 75 6c 6c 20 63 6f 6c 75  r: non-null colu
2f240 6d 6e 20 73 65 70 61 72 61 74 6f 72 20 72 65 71  mn separator req
2f250 75 69 72 65 64 20 66 6f 72 20 69 6d 70 6f 72 74  uired for import
2f260 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75  \n");.      retu
2f270 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 1;.    }.    
2f280 69 66 28 20 6e 53 65 70 3e 31 20 29 7b 0a 20 20  if( nSep>1 ){.  
2f290 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73      raw_printf(s
2f2a0 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 6d  tderr, "Error: m
2f2b0 75 6c 74 69 2d 63 68 61 72 61 63 74 65 72 20 63  ulti-character c
2f2c0 6f 6c 75 6d 6e 20 73 65 70 61 72 61 74 6f 72 73  olumn separators
2f2d0 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 22 0a 20 20   not allowed".  
2f2e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f2f0 20 20 20 20 22 20 66 6f 72 20 69 6d 70 6f 72 74      " for import
2f300 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75  \n");.      retu
2f310 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 1;.    }.    
2f320 6e 53 65 70 20 3d 20 73 74 72 6c 65 6e 33 30 28  nSep = strlen30(
2f330 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 29  p->rowSeparator)
2f340 3b 0a 20 20 20 20 69 66 28 20 6e 53 65 70 3d 3d  ;.    if( nSep==
2f350 30 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70  0 ){.      raw_p
2f360 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45  rintf(stderr, "E
2f370 72 72 6f 72 3a 20 6e 6f 6e 2d 6e 75 6c 6c 20 72  rror: non-null r
2f380 6f 77 20 73 65 70 61 72 61 74 6f 72 20 72 65 71  ow separator req
2f390 75 69 72 65 64 20 66 6f 72 20 69 6d 70 6f 72 74  uired for import
2f3a0 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75  \n");.      retu
2f3b0 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 1;.    }.    
2f3c0 69 66 28 20 6e 53 65 70 3d 3d 32 20 26 26 20 70  if( nSep==2 && p
2f3d0 2d 3e 6d 6f 64 65 3d 3d 4d 4f 44 45 5f 43 73 76  ->mode==MODE_Csv
2f3e0 20 26 26 20 73 74 72 63 6d 70 28 70 2d 3e 72 6f   && strcmp(p->ro
2f3f0 77 53 65 70 61 72 61 74 6f 72 2c 20 53 45 50 5f  wSeparator, SEP_
2f400 43 72 4c 66 29 3d 3d 30 20 29 7b 0a 20 20 20 20  CrLf)==0 ){.    
2f410 20 20 2f 2a 20 57 68 65 6e 20 69 6d 70 6f 72 74    /* When import
2f420 69 6e 67 20 43 53 56 20 28 6f 6e 6c 79 29 2c 20  ing CSV (only), 
2f430 69 66 20 74 68 65 20 72 6f 77 20 73 65 70 61 72  if the row separ
2f440 61 74 6f 72 20 69 73 20 73 65 74 20 74 6f 20 74  ator is set to t
2f450 68 65 0a 20 20 20 20 20 20 2a 2a 20 64 65 66 61  he.      ** defa
2f460 75 6c 74 20 6f 75 74 70 75 74 20 72 6f 77 20 73  ult output row s
2f470 65 70 61 72 61 74 6f 72 2c 20 63 68 61 6e 67 65  eparator, change
2f480 20 69 74 20 74 6f 20 74 68 65 20 64 65 66 61 75   it to the defau
2f490 6c 74 20 69 6e 70 75 74 0a 20 20 20 20 20 20 2a  lt input.      *
2f4a0 2a 20 72 6f 77 20 73 65 70 61 72 61 74 6f 72 2e  * row separator.
2f4b0 20 20 54 68 69 73 20 61 76 6f 69 64 73 20 68 61    This avoids ha
2f4c0 76 69 6e 67 20 74 6f 20 6d 61 69 6e 74 61 69 6e  ving to maintain
2f4d0 20 64 69 66 66 65 72 65 6e 74 20 69 6e 70 75 74   different input
2f4e0 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 6f 75  .      ** and ou
2f4f0 74 70 75 74 20 72 6f 77 20 73 65 70 61 72 61 74  tput row separat
2f500 6f 72 73 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71  ors. */.      sq
2f510 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
2f520 69 7a 65 6f 66 28 70 2d 3e 72 6f 77 53 65 70 61  izeof(p->rowSepa
2f530 72 61 74 6f 72 29 2c 20 70 2d 3e 72 6f 77 53 65  rator), p->rowSe
2f540 70 61 72 61 74 6f 72 2c 20 53 45 50 5f 52 6f 77  parator, SEP_Row
2f550 29 3b 0a 20 20 20 20 20 20 6e 53 65 70 20 3d 20  );.      nSep = 
2f560 73 74 72 6c 65 6e 33 30 28 70 2d 3e 72 6f 77 53  strlen30(p->rowS
2f570 65 70 61 72 61 74 6f 72 29 3b 0a 20 20 20 20 7d  eparator);.    }
2f580 0a 20 20 20 20 69 66 28 20 6e 53 65 70 3e 31 20  .    if( nSep>1 
2f590 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69  ){.      raw_pri
2f5a0 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72  ntf(stderr, "Err
2f5b0 6f 72 3a 20 6d 75 6c 74 69 2d 63 68 61 72 61 63  or: multi-charac
2f5c0 74 65 72 20 72 6f 77 20 73 65 70 61 72 61 74 6f  ter row separato
2f5d0 72 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 22 0a  rs not allowed".
2f5e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f5f0 20 20 20 20 20 20 22 20 66 6f 72 20 69 6d 70 6f        " for impo
2f600 72 74 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 65  rt\n");.      re
2f610 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20  turn 1;.    }.  
2f620 20 20 73 43 74 78 2e 7a 46 69 6c 65 20 3d 20 7a    sCtx.zFile = z
2f630 46 69 6c 65 3b 0a 20 20 20 20 73 43 74 78 2e 6e  File;.    sCtx.n
2f640 4c 69 6e 65 20 3d 20 31 3b 0a 20 20 20 20 69 66  Line = 1;.    if
2f650 28 20 73 43 74 78 2e 7a 46 69 6c 65 5b 30 5d 3d  ( sCtx.zFile[0]=
2f660 3d 27 7c 27 20 29 7b 0a 23 69 66 64 65 66 20 53  ='|' ){.#ifdef S
2f670 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 4f 50 45 4e  QLITE_OMIT_POPEN
2f680 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74  .      raw_print
2f690 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72  f(stderr, "Error
2f6a0 3a 20 70 69 70 65 73 20 61 72 65 20 6e 6f 74 20  : pipes are not 
2f6b0 73 75 70 70 6f 72 74 65 64 20 69 6e 20 74 68 69  supported in thi
2f6c0 73 20 4f 53 5c 6e 22 29 3b 0a 20 20 20 20 20 20  s OS\n");.      
2f6d0 72 65 74 75 72 6e 20 31 3b 0a 23 65 6c 73 65 0a  return 1;.#else.
2f6e0 20 20 20 20 20 20 73 43 74 78 2e 69 6e 20 3d 20        sCtx.in = 
2f6f0 70 6f 70 65 6e 28 73 43 74 78 2e 7a 46 69 6c 65  popen(sCtx.zFile
2f700 2b 31 2c 20 22 72 22 29 3b 0a 20 20 20 20 20 20  +1, "r");.      
2f710 73 43 74 78 2e 7a 46 69 6c 65 20 3d 20 22 3c 70  sCtx.zFile = "<p
2f720 69 70 65 3e 22 3b 0a 20 20 20 20 20 20 78 43 6c  ipe>";.      xCl
2f730 6f 73 65 72 20 3d 20 70 63 6c 6f 73 65 3b 0a 23  oser = pclose;.#
2f740 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 7b  endif.    }else{
2f750 0a 20 20 20 20 20 20 73 43 74 78 2e 69 6e 20 3d  .      sCtx.in =
2f760 20 66 6f 70 65 6e 28 73 43 74 78 2e 7a 46 69 6c   fopen(sCtx.zFil
2f770 65 2c 20 22 72 62 22 29 3b 0a 20 20 20 20 20 20  e, "rb");.      
2f780 78 43 6c 6f 73 65 72 20 3d 20 66 63 6c 6f 73 65  xCloser = fclose
2f790 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
2f7a0 70 2d 3e 6d 6f 64 65 3d 3d 4d 4f 44 45 5f 41 73  p->mode==MODE_As
2f7b0 63 69 69 20 29 7b 0a 20 20 20 20 20 20 78 52 65  cii ){.      xRe
2f7c0 61 64 20 3d 20 61 73 63 69 69 5f 72 65 61 64 5f  ad = ascii_read_
2f7d0 6f 6e 65 5f 66 69 65 6c 64 3b 0a 20 20 20 20 7d  one_field;.    }
2f7e0 65 6c 73 65 7b 0a 20 20 20 20 20 20 78 52 65 61  else{.      xRea
2f7f0 64 20 3d 20 63 73 76 5f 72 65 61 64 5f 6f 6e 65  d = csv_read_one
2f800 5f 66 69 65 6c 64 3b 0a 20 20 20 20 7d 0a 20 20  _field;.    }.  
2f810 20 20 69 66 28 20 73 43 74 78 2e 69 6e 3d 3d 30    if( sCtx.in==0
2f820 20 29 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70   ){.      utf8_p
2f830 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45  rintf(stderr, "E
2f840 72 72 6f 72 3a 20 63 61 6e 6e 6f 74 20 6f 70 65  rror: cannot ope
2f850 6e 20 5c 22 25 73 5c 22 5c 6e 22 2c 20 7a 46 69  n \"%s\"\n", zFi
2f860 6c 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  le);.      retur
2f870 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  n 1;.    }.    s
2f880 43 74 78 2e 63 43 6f 6c 53 65 70 20 3d 20 70 2d  Ctx.cColSep = p-
2f890 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 5b 30 5d  >colSeparator[0]
2f8a0 3b 0a 20 20 20 20 73 43 74 78 2e 63 52 6f 77 53  ;.    sCtx.cRowS
2f8b0 65 70 20 3d 20 70 2d 3e 72 6f 77 53 65 70 61 72  ep = p->rowSepar
2f8c0 61 74 6f 72 5b 30 5d 3b 0a 20 20 20 20 7a 53 71  ator[0];.    zSq
2f8d0 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  l = sqlite3_mpri
2f8e0 6e 74 66 28 22 53 45 4c 45 43 54 20 2a 20 46 52  ntf("SELECT * FR
2f8f0 4f 4d 20 25 73 22 2c 20 7a 54 61 62 6c 65 29 3b  OM %s", zTable);
2f900 0a 20 20 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30  .    if( zSql==0
2f910 20 29 7b 0a 20 20 20 20 20 20 78 43 6c 6f 73 65   ){.      xClose
2f920 72 28 73 43 74 78 2e 69 6e 29 3b 0a 20 20 20 20  r(sCtx.in);.    
2f930 20 20 73 68 65 6c 6c 5f 6f 75 74 5f 6f 66 5f 6d    shell_out_of_m
2f940 65 6d 6f 72 79 28 29 3b 0a 20 20 20 20 7d 0a 20  emory();.    }. 
2f950 20 20 20 6e 42 79 74 65 20 3d 20 73 74 72 6c 65     nByte = strle
2f960 6e 33 30 28 7a 53 71 6c 29 3b 0a 20 20 20 20 72  n30(zSql);.    r
2f970 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70  c = sqlite3_prep
2f980 61 72 65 5f 76 32 28 70 2d 3e 64 62 2c 20 7a 53  are_v2(p->db, zS
2f990 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20  ql, -1, &pStmt, 
2f9a0 30 29 3b 0a 20 20 20 20 69 6d 70 6f 72 74 5f 61  0);.    import_a
2f9b0 70 70 65 6e 64 5f 63 68 61 72 28 26 73 43 74 78  ppend_char(&sCtx
2f9c0 2c 20 30 29 3b 20 20 20 20 2f 2a 20 54 6f 20 65  , 0);    /* To e
2f9d0 6e 73 75 72 65 20 73 43 74 78 2e 7a 20 69 73 20  nsure sCtx.z is 
2f9e0 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a 20 20 20  allocated */.   
2f9f0 20 69 66 28 20 72 63 20 26 26 20 73 71 6c 69 74   if( rc && sqlit
2fa00 65 33 5f 73 74 72 67 6c 6f 62 28 22 6e 6f 20 73  e3_strglob("no s
2fa10 75 63 68 20 74 61 62 6c 65 3a 20 2a 22 2c 20 73  uch table: *", s
2fa20 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 2d  qlite3_errmsg(p-
2fa30 3e 64 62 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20  >db))==0 ){.    
2fa40 20 20 63 68 61 72 20 2a 7a 43 72 65 61 74 65 20    char *zCreate 
2fa50 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
2fa60 66 28 22 43 52 45 41 54 45 20 54 41 42 4c 45 20  f("CREATE TABLE 
2fa70 25 73 22 2c 20 7a 54 61 62 6c 65 29 3b 0a 20 20  %s", zTable);.  
2fa80 20 20 20 20 63 68 61 72 20 63 53 65 70 20 3d 20      char cSep = 
2fa90 27 28 27 3b 0a 20 20 20 20 20 20 77 68 69 6c 65  '(';.      while
2faa0 28 20 78 52 65 61 64 28 26 73 43 74 78 29 20 29  ( xRead(&sCtx) )
2fab0 7b 0a 20 20 20 20 20 20 20 20 7a 43 72 65 61 74  {.        zCreat
2fac0 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  e = sqlite3_mpri
2fad0 6e 74 66 28 22 25 7a 25 63 5c 6e 20 20 5c 22 25  ntf("%z%c\n  \"%
2fae0 77 5c 22 20 54 45 58 54 22 2c 20 7a 43 72 65 61  w\" TEXT", zCrea
2faf0 74 65 2c 20 63 53 65 70 2c 20 73 43 74 78 2e 7a  te, cSep, sCtx.z
2fb00 29 3b 0a 20 20 20 20 20 20 20 20 63 53 65 70 20  );.        cSep 
2fb10 3d 20 27 2c 27 3b 0a 20 20 20 20 20 20 20 20 69  = ',';.        i
2fb20 66 28 20 73 43 74 78 2e 63 54 65 72 6d 21 3d 73  f( sCtx.cTerm!=s
2fb30 43 74 78 2e 63 43 6f 6c 53 65 70 20 29 20 62 72  Ctx.cColSep ) br
2fb40 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
2fb50 20 20 20 69 66 28 20 63 53 65 70 3d 3d 27 28 27     if( cSep=='('
2fb60 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
2fb70 74 65 33 5f 66 72 65 65 28 7a 43 72 65 61 74 65  te3_free(zCreate
2fb80 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
2fb90 65 33 5f 66 72 65 65 28 73 43 74 78 2e 7a 29 3b  e3_free(sCtx.z);
2fba0 0a 20 20 20 20 20 20 20 20 78 43 6c 6f 73 65 72  .        xCloser
2fbb0 28 73 43 74 78 2e 69 6e 29 3b 0a 20 20 20 20 20  (sCtx.in);.     
2fbc0 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73     utf8_printf(s
2fbd0 74 64 65 72 72 2c 22 25 73 3a 20 65 6d 70 74 79  tderr,"%s: empty
2fbe0 20 66 69 6c 65 5c 6e 22 2c 20 73 43 74 78 2e 7a   file\n", sCtx.z
2fbf0 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 72  File);.        r
2fc00 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d  eturn 1;.      }
2fc10 0a 20 20 20 20 20 20 7a 43 72 65 61 74 65 20 3d  .      zCreate =
2fc20 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
2fc30 28 22 25 7a 5c 6e 29 22 2c 20 7a 43 72 65 61 74  ("%z\n)", zCreat
2fc40 65 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  e);.      rc = s
2fc50 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64  qlite3_exec(p->d
2fc60 62 2c 20 7a 43 72 65 61 74 65 2c 20 30 2c 20 30  b, zCreate, 0, 0
2fc70 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
2fc80 74 65 33 5f 66 72 65 65 28 7a 43 72 65 61 74 65  te3_free(zCreate
2fc90 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
2fca0 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f  ){.        utf8_
2fcb0 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
2fcc0 43 52 45 41 54 45 20 54 41 42 4c 45 20 25 73 28  CREATE TABLE %s(
2fcd0 2e 2e 2e 29 20 66 61 69 6c 65 64 3a 20 25 73 5c  ...) failed: %s\
2fce0 6e 22 2c 20 7a 54 61 62 6c 65 2c 0a 20 20 20 20  n", zTable,.    
2fcf0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
2fd00 74 65 33 5f 65 72 72 6d 73 67 28 70 2d 3e 64 62  te3_errmsg(p->db
2fd10 29 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  ));.        sqli
2fd20 74 65 33 5f 66 72 65 65 28 73 43 74 78 2e 7a 29  te3_free(sCtx.z)
2fd30 3b 0a 20 20 20 20 20 20 20 20 78 43 6c 6f 73 65  ;.        xClose
2fd40 72 28 73 43 74 78 2e 69 6e 29 3b 0a 20 20 20 20  r(sCtx.in);.    
2fd50 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
2fd60 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d      }.      rc =
2fd70 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
2fd80 5f 76 32 28 70 2d 3e 64 62 2c 20 7a 53 71 6c 2c  _v2(p->db, zSql,
2fd90 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b   -1, &pStmt, 0);
2fda0 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
2fdb0 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20  e3_free(zSql);. 
2fdc0 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
2fdd0 20 20 20 69 66 20 28 70 53 74 6d 74 29 20 73 71     if (pStmt) sq
2fde0 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
2fdf0 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 75 74 66  Stmt);.      utf
2fe00 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  8_printf(stderr,
2fe10 22 45 72 72 6f 72 3a 20 25 73 5c 6e 22 2c 20 73  "Error: %s\n", s
2fe20 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 2d  qlite3_errmsg(p-
2fe30 3e 64 62 29 29 3b 0a 20 20 20 20 20 20 78 43 6c  >db));.      xCl
2fe40 6f 73 65 72 28 73 43 74 78 2e 69 6e 29 3b 0a 20  oser(sCtx.in);. 
2fe50 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
2fe60 20 20 20 7d 0a 20 20 20 20 6e 43 6f 6c 20 3d 20     }.    nCol = 
2fe70 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63  sqlite3_column_c
2fe80 6f 75 6e 74 28 70 53 74 6d 74 29 3b 0a 20 20 20  ount(pStmt);.   
2fe90 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
2fea0 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 70 53  e(pStmt);.    pS
2feb0 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  tmt = 0;.    if(
2fec0 20 6e 43 6f 6c 3d 3d 30 20 29 20 72 65 74 75 72   nCol==0 ) retur
2fed0 6e 20 30 3b 20 2f 2a 20 6e 6f 20 63 6f 6c 75 6d  n 0; /* no colum
2fee0 6e 73 2c 20 6e 6f 20 65 72 72 6f 72 20 2a 2f 0a  ns, no error */.
2fef0 20 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74      zSql = sqlit
2ff00 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 20 6e 42 79  e3_malloc64( nBy
2ff10 74 65 2a 32 20 2b 20 32 30 20 2b 20 6e 43 6f 6c  te*2 + 20 + nCol
2ff20 2a 32 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 53  *2 );.    if( zS
2ff30 71 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 78  ql==0 ){.      x
2ff40 43 6c 6f 73 65 72 28 73 43 74 78 2e 69 6e 29 3b  Closer(sCtx.in);
2ff50 0a 20 20 20 20 20 20 73 68 65 6c 6c 5f 6f 75 74  .      shell_out
2ff60 5f 6f 66 5f 6d 65 6d 6f 72 79 28 29 3b 0a 20 20  _of_memory();.  
2ff70 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f    }.    sqlite3_
2ff80 73 6e 70 72 69 6e 74 66 28 6e 42 79 74 65 2b 32  snprintf(nByte+2
2ff90 30 2c 20 7a 53 71 6c 2c 20 22 49 4e 53 45 52 54  0, zSql, "INSERT
2ffa0 20 49 4e 54 4f 20 5c 22 25 77 5c 22 20 56 41 4c   INTO \"%w\" VAL
2ffb0 55 45 53 28 3f 22 2c 20 7a 54 61 62 6c 65 29 3b  UES(?", zTable);
2ffc0 0a 20 20 20 20 6a 20 3d 20 73 74 72 6c 65 6e 33  .    j = strlen3
2ffd0 30 28 7a 53 71 6c 29 3b 0a 20 20 20 20 66 6f 72  0(zSql);.    for
2ffe0 28 69 3d 31 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b  (i=1; i<nCol; i+
2fff0 2b 29 7b 0a 20 20 20 20 20 20 7a 53 71 6c 5b 6a  +){.      zSql[j
30000 2b 2b 5d 20 3d 20 27 2c 27 3b 0a 20 20 20 20 20  ++] = ',';.     
30010 20 7a 53 71 6c 5b 6a 2b 2b 5d 20 3d 20 27 3f 27   zSql[j++] = '?'
30020 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 53 71 6c  ;.    }.    zSql
30030 5b 6a 2b 2b 5d 20 3d 20 27 29 27 3b 0a 20 20 20  [j++] = ')';.   
30040 20 7a 53 71 6c 5b 6a 5d 20 3d 20 30 3b 0a 20 20   zSql[j] = 0;.  
30050 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70    rc = sqlite3_p
30060 72 65 70 61 72 65 5f 76 32 28 70 2d 3e 64 62 2c  repare_v2(p->db,
30070 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d   zSql, -1, &pStm
30080 74 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  t, 0);.    sqlit
30090 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20  e3_free(zSql);. 
300a0 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
300b0 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73     utf8_printf(s
300c0 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 25  tderr, "Error: %
300d0 73 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f 65 72  s\n", sqlite3_er
300e0 72 6d 73 67 28 70 2d 3e 64 62 29 29 3b 0a 20 20  rmsg(p->db));.  
300f0 20 20 20 20 69 66 20 28 70 53 74 6d 74 29 20 73      if (pStmt) s
30100 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
30110 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 78 43  pStmt);.      xC
30120 6c 6f 73 65 72 28 73 43 74 78 2e 69 6e 29 3b 0a  loser(sCtx.in);.
30130 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
30140 20 20 20 20 7d 0a 20 20 20 20 6e 65 65 64 43 6f      }.    needCo
30150 6d 6d 69 74 20 3d 20 73 71 6c 69 74 65 33 5f 67  mmit = sqlite3_g
30160 65 74 5f 61 75 74 6f 63 6f 6d 6d 69 74 28 70 2d  et_autocommit(p-
30170 3e 64 62 29 3b 0a 20 20 20 20 69 66 28 20 6e 65  >db);.    if( ne
30180 65 64 43 6f 6d 6d 69 74 20 29 20 73 71 6c 69 74  edCommit ) sqlit
30190 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20 22  e3_exec(p->db, "
301a0 42 45 47 49 4e 22 2c 20 30 2c 20 30 2c 20 30 29  BEGIN", 0, 0, 0)
301b0 3b 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20  ;.    do{.      
301c0 69 6e 74 20 73 74 61 72 74 4c 69 6e 65 20 3d 20  int startLine = 
301d0 73 43 74 78 2e 6e 4c 69 6e 65 3b 0a 20 20 20 20  sCtx.nLine;.    
301e0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f    for(i=0; i<nCo
301f0 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  l; i++){.       
30200 20 63 68 61 72 20 2a 7a 20 3d 20 78 52 65 61 64   char *z = xRead
30210 28 26 73 43 74 78 29 3b 0a 20 20 20 20 20 20 20  (&sCtx);.       
30220 20 2f 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 44   /*.        ** D
30230 69 64 20 77 65 20 72 65 61 63 68 20 65 6e 64 2d  id we reach end-
30240 6f 66 2d 66 69 6c 65 20 62 65 66 6f 72 65 20 66  of-file before f
30250 69 6e 64 69 6e 67 20 61 6e 79 20 63 6f 6c 75 6d  inding any colum
30260 6e 73 3f 0a 20 20 20 20 20 20 20 20 2a 2a 20 49  ns?.        ** I
30270 66 20 73 6f 2c 20 73 74 6f 70 20 69 6e 73 74 65  f so, stop inste
30280 61 64 20 6f 66 20 4e 55 4c 4c 20 66 69 6c 6c 69  ad of NULL filli
30290 6e 67 20 74 68 65 20 72 65 6d 61 69 6e 69 6e 67  ng the remaining
302a0 20 63 6f 6c 75 6d 6e 73 2e 0a 20 20 20 20 20 20   columns..      
302b0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28    */.        if(
302c0 20 7a 3d 3d 30 20 26 26 20 69 3d 3d 30 20 29 20   z==0 && i==0 ) 
302d0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 2f  break;.        /
302e0 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 44 69 64  *.        ** Did
302f0 20 77 65 20 72 65 61 63 68 20 65 6e 64 2d 6f 66   we reach end-of
30300 2d 66 69 6c 65 20 4f 52 20 65 6e 64 2d 6f 66 2d  -file OR end-of-
30310 6c 69 6e 65 20 62 65 66 6f 72 65 20 66 69 6e 64  line before find
30320 69 6e 67 20 61 6e 79 0a 20 20 20 20 20 20 20 20  ing any.        
30330 2a 2a 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 41 53  ** columns in AS
30340 43 49 49 20 6d 6f 64 65 3f 20 20 49 66 20 73 6f  CII mode?  If so
30350 2c 20 73 74 6f 70 20 69 6e 73 74 65 61 64 20 6f  , stop instead o
30360 66 20 4e 55 4c 4c 20 66 69 6c 6c 69 6e 67 0a 20  f NULL filling. 
30370 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 72 65         ** the re
30380 6d 61 69 6e 69 6e 67 20 63 6f 6c 75 6d 6e 73 2e  maining columns.
30390 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
303a0 20 20 20 20 69 66 28 20 70 2d 3e 6d 6f 64 65 3d      if( p->mode=
303b0 3d 4d 4f 44 45 5f 41 73 63 69 69 20 26 26 20 28  =MODE_Ascii && (
303c0 7a 3d 3d 30 20 7c 7c 20 7a 5b 30 5d 3d 3d 30 29  z==0 || z[0]==0)
303d0 20 26 26 20 69 3d 3d 30 20 29 20 62 72 65 61 6b   && i==0 ) break
303e0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
303f0 33 5f 62 69 6e 64 5f 74 65 78 74 28 70 53 74 6d  3_bind_text(pStm
30400 74 2c 20 69 2b 31 2c 20 7a 2c 20 2d 31 2c 20 53  t, i+1, z, -1, S
30410 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29  QLITE_TRANSIENT)
30420 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 3c  ;.        if( i<
30430 6e 43 6f 6c 2d 31 20 26 26 20 73 43 74 78 2e 63  nCol-1 && sCtx.c
30440 54 65 72 6d 21 3d 73 43 74 78 2e 63 43 6f 6c 53  Term!=sCtx.cColS
30450 65 70 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ep ){.          
30460 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65  utf8_printf(stde
30470 72 72 2c 20 22 25 73 3a 25 64 3a 20 65 78 70 65  rr, "%s:%d: expe
30480 63 74 65 64 20 25 64 20 63 6f 6c 75 6d 6e 73 20  cted %d columns 
30490 62 75 74 20 66 6f 75 6e 64 20 25 64 20 2d 20 22  but found %d - "
304a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
304b0 20 20 20 20 20 20 20 20 20 20 20 22 66 69 6c 6c             "fill
304c0 69 6e 67 20 74 68 65 20 72 65 73 74 20 77 69 74  ing the rest wit
304d0 68 20 4e 55 4c 4c 5c 6e 22 2c 0a 20 20 20 20 20  h NULL\n",.     
304e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
304f0 20 20 20 20 20 73 43 74 78 2e 7a 46 69 6c 65 2c       sCtx.zFile,
30500 20 73 74 61 72 74 4c 69 6e 65 2c 20 6e 43 6f 6c   startLine, nCol
30510 2c 20 69 2b 31 29 3b 0a 20 20 20 20 20 20 20 20  , i+1);.        
30520 20 20 69 20 2b 3d 20 32 3b 0a 20 20 20 20 20 20    i += 2;.      
30530 20 20 20 20 77 68 69 6c 65 28 20 69 3c 3d 6e 43      while( i<=nC
30540 6f 6c 20 29 7b 20 73 71 6c 69 74 65 33 5f 62 69  ol ){ sqlite3_bi
30550 6e 64 5f 6e 75 6c 6c 28 70 53 74 6d 74 2c 20 69  nd_null(pStmt, i
30560 29 3b 20 69 2b 2b 3b 20 7d 0a 20 20 20 20 20 20  ); i++; }.      
30570 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
30580 20 20 69 66 28 20 73 43 74 78 2e 63 54 65 72 6d    if( sCtx.cTerm
30590 3d 3d 73 43 74 78 2e 63 43 6f 6c 53 65 70 20 29  ==sCtx.cColSep )
305a0 7b 0a 20 20 20 20 20 20 20 20 64 6f 7b 0a 20 20  {.        do{.  
305b0 20 20 20 20 20 20 20 20 78 52 65 61 64 28 26 73          xRead(&s
305c0 43 74 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Ctx);.          
305d0 69 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 77 68  i++;.        }wh
305e0 69 6c 65 28 20 73 43 74 78 2e 63 54 65 72 6d 3d  ile( sCtx.cTerm=
305f0 3d 73 43 74 78 2e 63 43 6f 6c 53 65 70 20 29 3b  =sCtx.cColSep );
30600 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72  .        utf8_pr
30610 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 25 73  intf(stderr, "%s
30620 3a 25 64 3a 20 65 78 70 65 63 74 65 64 20 25 64  :%d: expected %d
30630 20 63 6f 6c 75 6d 6e 73 20 62 75 74 20 66 6f 75   columns but fou
30640 6e 64 20 25 64 20 2d 20 22 0a 20 20 20 20 20 20  nd %d - ".      
30650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30660 20 20 22 65 78 74 72 61 73 20 69 67 6e 6f 72 65    "extras ignore
30670 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  d\n",.          
30680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 43                sC
30690 74 78 2e 7a 46 69 6c 65 2c 20 73 74 61 72 74 4c  tx.zFile, startL
306a0 69 6e 65 2c 20 6e 43 6f 6c 2c 20 69 29 3b 0a 20  ine, nCol, i);. 
306b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
306c0 20 69 3e 3d 6e 43 6f 6c 20 29 7b 0a 20 20 20 20   i>=nCol ){.    
306d0 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 65 70      sqlite3_step
306e0 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 20  (pStmt);.       
306f0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65   rc = sqlite3_re
30700 73 65 74 28 70 53 74 6d 74 29 3b 0a 20 20 20 20  set(pStmt);.    
30710 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
30720 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
30730 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73     utf8_printf(s
30740 74 64 65 72 72 2c 20 22 25 73 3a 25 64 3a 20 49  tderr, "%s:%d: I
30750 4e 53 45 52 54 20 66 61 69 6c 65 64 3a 20 25 73  NSERT failed: %s
30760 5c 6e 22 2c 20 73 43 74 78 2e 7a 46 69 6c 65 2c  \n", sCtx.zFile,
30770 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
30780 20 20 20 20 20 20 20 73 74 61 72 74 4c 69 6e 65         startLine
30790 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  , sqlite3_errmsg
307a0 28 70 2d 3e 64 62 29 29 3b 0a 20 20 20 20 20 20  (p->db));.      
307b0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
307c0 7d 77 68 69 6c 65 28 20 73 43 74 78 2e 63 54 65  }while( sCtx.cTe
307d0 72 6d 21 3d 45 4f 46 20 29 3b 0a 0a 20 20 20 20  rm!=EOF );..    
307e0 78 43 6c 6f 73 65 72 28 73 43 74 78 2e 69 6e 29  xCloser(sCtx.in)
307f0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
30800 65 65 28 73 43 74 78 2e 7a 29 3b 0a 20 20 20 20  ee(sCtx.z);.    
30810 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
30820 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 69 66 28  (pStmt);.    if(
30830 20 6e 65 65 64 43 6f 6d 6d 69 74 20 29 20 73 71   needCommit ) sq
30840 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62  lite3_exec(p->db
30850 2c 20 22 43 4f 4d 4d 49 54 22 2c 20 30 2c 20 30  , "COMMIT", 0, 0
30860 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a 23  , 0);.  }else..#
30870 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 55 4e  ifndef SQLITE_UN
30880 54 45 53 54 41 42 4c 45 0a 20 20 69 66 28 20 63  TESTABLE.  if( c
30890 3d 3d 27 69 27 20 26 26 20 73 74 72 6e 63 6d 70  =='i' && strncmp
308a0 28 61 7a 41 72 67 5b 30 5d 2c 20 22 69 6d 70 6f  (azArg[0], "impo
308b0 73 74 65 72 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a  ster", n)==0 ){.
308c0 20 20 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a      char *zSql;.
308d0 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 69      char *zColli
308e0 73 74 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69  st = 0;.    sqli
308f0 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b  te3_stmt *pStmt;
30900 0a 20 20 20 20 69 6e 74 20 74 6e 75 6d 20 3d 20  .    int tnum = 
30910 30 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  0;.    int i;.  
30920 20 20 69 66 28 20 21 28 6e 41 72 67 3d 3d 33 20    if( !(nArg==3 
30930 7c 7c 20 28 6e 41 72 67 3d 3d 32 20 26 26 20 73  || (nArg==2 && s
30940 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28 61  qlite3_stricmp(a
30950 7a 41 72 67 5b 31 5d 2c 22 6f 66 66 22 29 3d 3d  zArg[1],"off")==
30960 30 29 29 20 29 7b 0a 20 20 20 20 20 20 75 74 66  0)) ){.      utf
30970 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  8_printf(stderr,
30980 20 22 55 73 61 67 65 3a 20 2e 69 6d 70 6f 73 74   "Usage: .impost
30990 65 72 20 49 4e 44 45 58 20 49 4d 50 4f 53 54 45  er INDEX IMPOSTE
309a0 52 5c 6e 22 0a 20 20 20 20 20 20 20 20 20 20 20  R\n".           
309b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
309c0 20 20 20 20 20 20 20 2e 69 6d 70 6f 73 74 65 72         .imposter
309d0 20 6f 66 66 5c 6e 22 29 3b 0a 20 20 20 20 20 20   off\n");.      
309e0 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 67 6f  rc = 1;.      go
309f0 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f  to meta_command_
30a00 65 78 69 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  exit;.    }.    
30a10 6f 70 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a 20  open_db(p, 0);. 
30a20 20 20 20 69 66 28 20 6e 41 72 67 3d 3d 32 20 29     if( nArg==2 )
30a30 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
30a40 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c  test_control(SQL
30a50 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 49 4d 50  ITE_TESTCTRL_IMP
30a60 4f 53 54 45 52 2c 20 70 2d 3e 64 62 2c 20 22 6d  OSTER, p->db, "m
30a70 61 69 6e 22 2c 20 30 2c 20 31 29 3b 0a 20 20 20  ain", 0, 1);.   
30a80 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d     goto meta_com
30a90 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20 7d  mand_exit;.    }
30aa0 0a 20 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69  .    zSql = sqli
30ab0 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 53 45 4c  te3_mprintf("SEL
30ac0 45 43 54 20 72 6f 6f 74 70 61 67 65 20 46 52 4f  ECT rootpage FRO
30ad0 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 22  M sqlite_master"
30ae0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
30af0 20 20 20 20 20 20 20 20 20 20 20 20 22 20 57 48              " WH
30b00 45 52 45 20 6e 61 6d 65 3d 27 25 71 27 20 41 4e  ERE name='%q' AN
30b10 44 20 74 79 70 65 3d 27 69 6e 64 65 78 27 22 2c  D type='index'",
30b20 20 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20   azArg[1]);.    
30b30 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f  sqlite3_prepare_
30b40 76 32 28 70 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20  v2(p->db, zSql, 
30b50 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a  -1, &pStmt, 0);.
30b60 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
30b70 28 7a 53 71 6c 29 3b 0a 20 20 20 20 69 66 28 20  (zSql);.    if( 
30b80 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74  sqlite3_step(pSt
30b90 6d 74 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20  mt)==SQLITE_ROW 
30ba0 29 7b 0a 20 20 20 20 20 20 74 6e 75 6d 20 3d 20  ){.      tnum = 
30bb0 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69  sqlite3_column_i
30bc0 6e 74 28 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20  nt(pStmt, 0);.  
30bd0 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f    }.    sqlite3_
30be0 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b  finalize(pStmt);
30bf0 0a 20 20 20 20 69 66 28 20 74 6e 75 6d 3d 3d 30  .    if( tnum==0
30c00 20 29 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70   ){.      utf8_p
30c10 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 6e  rintf(stderr, "n
30c20 6f 20 73 75 63 68 20 69 6e 64 65 78 3a 20 5c 22  o such index: \"
30c30 25 73 5c 22 5c 6e 22 2c 20 61 7a 41 72 67 5b 31  %s\"\n", azArg[1
30c40 5d 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31  ]);.      rc = 1
30c50 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 65 74  ;.      goto met
30c60 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a  a_command_exit;.
30c70 20 20 20 20 7d 0a 20 20 20 20 7a 53 71 6c 20 3d      }.    zSql =
30c80 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
30c90 28 22 50 52 41 47 4d 41 20 69 6e 64 65 78 5f 78  ("PRAGMA index_x
30ca0 69 6e 66 6f 3d 27 25 71 27 22 2c 20 61 7a 41 72  info='%q'", azAr
30cb0 67 5b 31 5d 29 3b 0a 20 20 20 20 72 63 20 3d 20  g[1]);.    rc = 
30cc0 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f  sqlite3_prepare_
30cd0 76 32 28 70 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20  v2(p->db, zSql, 
30ce0 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a  -1, &pStmt, 0);.
30cf0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
30d00 28 7a 53 71 6c 29 3b 0a 20 20 20 20 69 20 3d 20  (zSql);.    i = 
30d10 30 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 73 71  0;.    while( sq
30d20 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74  lite3_step(pStmt
30d30 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b  )==SQLITE_ROW ){
30d40 0a 20 20 20 20 20 20 63 68 61 72 20 7a 4c 61 62  .      char zLab
30d50 65 6c 5b 32 30 5d 3b 0a 20 20 20 20 20 20 63 6f  el[20];.      co
30d60 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 20 3d  nst char *zCol =
30d70 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71   (const char*)sq
30d80 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
30d90 74 28 70 53 74 6d 74 2c 32 29 3b 0a 20 20 20 20  t(pStmt,2);.    
30da0 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28    i++;.      if(
30db0 20 7a 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20 20   zCol==0 ){.    
30dc0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f      if( sqlite3_
30dd0 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 74 6d 74  column_int(pStmt
30de0 2c 31 29 3d 3d 2d 31 20 29 7b 0a 20 20 20 20 20  ,1)==-1 ){.     
30df0 20 20 20 20 20 7a 43 6f 6c 20 3d 20 22 5f 52 4f       zCol = "_RO
30e00 57 49 44 5f 22 3b 0a 20 20 20 20 20 20 20 20 7d  WID_";.        }
30e10 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
30e20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
30e30 28 73 69 7a 65 6f 66 28 7a 4c 61 62 65 6c 29 2c  (sizeof(zLabel),
30e40 7a 4c 61 62 65 6c 2c 22 65 78 70 72 25 64 22 2c  zLabel,"expr%d",
30e50 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 43  i);.          zC
30e60 6f 6c 20 3d 20 7a 4c 61 62 65 6c 3b 0a 20 20 20  ol = zLabel;.   
30e70 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
30e80 20 20 20 20 20 69 66 28 20 7a 43 6f 6c 6c 69 73       if( zCollis
30e90 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  t==0 ){.        
30ea0 7a 43 6f 6c 6c 69 73 74 20 3d 20 73 71 6c 69 74  zCollist = sqlit
30eb0 65 33 5f 6d 70 72 69 6e 74 66 28 22 5c 22 25 77  e3_mprintf("\"%w
30ec0 5c 22 22 2c 20 7a 43 6f 6c 29 3b 0a 20 20 20 20  \"", zCol);.    
30ed0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
30ee0 20 7a 43 6f 6c 6c 69 73 74 20 3d 20 73 71 6c 69   zCollist = sqli
30ef0 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 7a 2c  te3_mprintf("%z,
30f00 5c 22 25 77 5c 22 22 2c 20 7a 43 6f 6c 6c 69 73  \"%w\"", zCollis
30f10 74 2c 20 7a 43 6f 6c 29 3b 0a 20 20 20 20 20 20  t, zCol);.      
30f20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  }.    }.    sqli
30f30 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74  te3_finalize(pSt
30f40 6d 74 29 3b 0a 20 20 20 20 7a 53 71 6c 20 3d 20  mt);.    zSql = 
30f50 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
30f60 0a 20 20 20 20 20 20 20 20 20 20 22 43 52 45 41  .          "CREA
30f70 54 45 20 54 41 42 4c 45 20 5c 22 25 77 5c 22 28  TE TABLE \"%w\"(
30f80 25 73 2c 50 52 49 4d 41 52 59 20 4b 45 59 28 25  %s,PRIMARY KEY(%
30f90 73 29 29 57 49 54 48 4f 55 54 20 52 4f 57 49 44  s))WITHOUT ROWID
30fa0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 61 7a 41  ",.          azA
30fb0 72 67 5b 32 5d 2c 20 7a 43 6f 6c 6c 69 73 74 2c  rg[2], zCollist,
30fc0 20 7a 43 6f 6c 6c 69 73 74 29 3b 0a 20 20 20 20   zCollist);.    
30fd0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f  sqlite3_free(zCo
30fe0 6c 6c 69 73 74 29 3b 0a 20 20 20 20 72 63 20 3d  llist);.    rc =
30ff0 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f   sqlite3_test_co
31000 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53  ntrol(SQLITE_TES
31010 54 43 54 52 4c 5f 49 4d 50 4f 53 54 45 52 2c 20  TCTRL_IMPOSTER, 
31020 70 2d 3e 64 62 2c 20 22 6d 61 69 6e 22 2c 20 31  p->db, "main", 1
31030 2c 20 74 6e 75 6d 29 3b 0a 20 20 20 20 69 66 28  , tnum);.    if(
31040 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
31050 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
31060 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c  ite3_exec(p->db,
31070 20 7a 53 71 6c 2c 20 30 2c 20 30 2c 20 30 29 3b   zSql, 0, 0, 0);
31080 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 74  .      sqlite3_t
31090 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49  est_control(SQLI
310a0 54 45 5f 54 45 53 54 43 54 52 4c 5f 49 4d 50 4f  TE_TESTCTRL_IMPO
310b0 53 54 45 52 2c 20 70 2d 3e 64 62 2c 20 22 6d 61  STER, p->db, "ma
310c0 69 6e 22 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  in", 0, 0);.    
310d0 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
310e0 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
310f0 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72 20 69  stderr, "Error i
31100 6e 20 5b 25 73 5d 3a 20 25 73 5c 6e 22 2c 20 7a  n [%s]: %s\n", z
31110 53 71 6c 2c 20 73 71 6c 69 74 65 33 5f 65 72 72  Sql, sqlite3_err
31120 6d 73 67 28 70 2d 3e 64 62 29 29 3b 0a 20 20 20  msg(p->db));.   
31130 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
31140 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74    utf8_printf(st
31150 64 6f 75 74 2c 20 22 25 73 3b 5c 6e 22 2c 20 7a  dout, "%s;\n", z
31160 53 71 6c 29 3b 0a 20 20 20 20 20 20 20 20 72 61  Sql);.        ra
31170 77 5f 70 72 69 6e 74 66 28 73 74 64 6f 75 74 2c  w_printf(stdout,
31180 0a 20 20 20 20 20 20 20 20 20 20 20 22 57 41 52  .           "WAR
31190 4e 49 4e 47 3a 20 77 72 69 74 69 6e 67 20 74 6f  NING: writing to
311a0 20 61 6e 20 69 6d 70 6f 73 74 65 72 20 74 61 62   an imposter tab
311b0 6c 65 20 77 69 6c 6c 20 63 6f 72 72 75 70 74 20  le will corrupt 
311c0 74 68 65 20 69 6e 64 65 78 21 5c 6e 22 0a 20 20  the index!\n".  
311d0 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d        );.      }
311e0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
311f0 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64    raw_printf(std
31200 65 72 72 2c 20 22 53 51 4c 49 54 45 5f 54 45 53  err, "SQLITE_TES
31210 54 43 54 52 4c 5f 49 4d 50 4f 53 54 45 52 20 72  TCTRL_IMPOSTER r
31220 65 74 75 72 6e 73 20 25 64 5c 6e 22 2c 20 72 63  eturns %d\n", rc
31230 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b  );.      rc = 1;
31240 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
31250 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20  e3_free(zSql);. 
31260 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 20 2f 2a   }else.#endif /*
31270 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
31280 5f 4f 4d 49 54 5f 54 45 53 54 5f 43 4f 4e 54 52  _OMIT_TEST_CONTR
31290 4f 4c 29 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53  OL) */..#ifdef S
312a0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49 4f 54  QLITE_ENABLE_IOT
312b0 52 41 43 45 0a 20 20 69 66 28 20 63 3d 3d 27 69  RACE.  if( c=='i
312c0 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41  ' && strncmp(azA
312d0 72 67 5b 30 5d 2c 20 22 69 6f 74 72 61 63 65 22  rg[0], "iotrace"
312e0 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 53  , n)==0 ){.    S
312f0 51 4c 49 54 45 5f 41 50 49 20 65 78 74 65 72 6e  QLITE_API extern
31300 20 76 6f 69 64 20 28 53 51 4c 49 54 45 5f 43 44   void (SQLITE_CD
31310 45 43 4c 20 2a 73 71 6c 69 74 65 33 49 6f 54 72  ECL *sqlite3IoTr
31320 61 63 65 29 28 63 6f 6e 73 74 20 63 68 61 72 2a  ace)(const char*
31330 2c 20 2e 2e 2e 29 3b 0a 20 20 20 20 69 66 28 20  , ...);.    if( 
31340 69 6f 74 72 61 63 65 20 26 26 20 69 6f 74 72 61  iotrace && iotra
31350 63 65 21 3d 73 74 64 6f 75 74 20 29 20 66 63 6c  ce!=stdout ) fcl
31360 6f 73 65 28 69 6f 74 72 61 63 65 29 3b 0a 20 20  ose(iotrace);.  
31370 20 20 69 6f 74 72 61 63 65 20 3d 20 30 3b 0a 20    iotrace = 0;. 
31380 20 20 20 69 66 28 20 6e 41 72 67 3c 32 20 29 7b     if( nArg<2 ){
31390 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 49 6f  .      sqlite3Io
313a0 54 72 61 63 65 20 3d 20 30 3b 0a 20 20 20 20 7d  Trace = 0;.    }
313b0 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
313c0 61 7a 41 72 67 5b 31 5d 2c 20 22 2d 22 29 3d 3d  azArg[1], "-")==
313d0 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
313e0 65 33 49 6f 54 72 61 63 65 20 3d 20 69 6f 74 72  e3IoTrace = iotr
313f0 61 63 65 50 72 69 6e 74 66 3b 0a 20 20 20 20 20  acePrintf;.     
31400 20 69 6f 74 72 61 63 65 20 3d 20 73 74 64 6f 75   iotrace = stdou
31410 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  t;.    }else{.  
31420 20 20 20 20 69 6f 74 72 61 63 65 20 3d 20 66 6f      iotrace = fo
31430 70 65 6e 28 61 7a 41 72 67 5b 31 5d 2c 20 22 77  pen(azArg[1], "w
31440 22 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 6f  ");.      if( io
31450 74 72 61 63 65 3d 3d 30 20 29 7b 0a 20 20 20 20  trace==0 ){.    
31460 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
31470 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20  stderr, "Error: 
31480 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 5c 22 25 73  cannot open \"%s
31490 5c 22 5c 6e 22 2c 20 61 7a 41 72 67 5b 31 5d 29  \"\n", azArg[1])
314a0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
314b0 33 49 6f 54 72 61 63 65 20 3d 20 30 3b 0a 20 20  3IoTrace = 0;.  
314c0 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
314d0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
314e0 20 20 20 73 71 6c 69 74 65 33 49 6f 54 72 61 63     sqlite3IoTrac
314f0 65 20 3d 20 69 6f 74 72 61 63 65 50 72 69 6e 74  e = iotracePrint
31500 66 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  f;.      }.    }
31510 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a  .  }else.#endif.
31520 0a 20 20 69 66 28 20 63 3d 3d 27 6c 27 20 26 26  .  if( c=='l' &&
31530 20 6e 3e 3d 35 20 26 26 20 73 74 72 6e 63 6d 70   n>=5 && strncmp
31540 28 61 7a 41 72 67 5b 30 5d 2c 20 22 6c 69 6d 69  (azArg[0], "limi
31550 74 73 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20  ts", n)==0 ){.  
31560 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73    static const s
31570 74 72 75 63 74 20 7b 0a 20 20 20 20 20 20 20 63  truct {.       c
31580 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4c 69 6d 69  onst char *zLimi
31590 74 4e 61 6d 65 3b 20 20 20 2f 2a 20 4e 61 6d 65  tName;   /* Name
315a0 20 6f 66 20 61 20 6c 69 6d 69 74 20 2a 2f 0a 20   of a limit */. 
315b0 20 20 20 20 20 20 69 6e 74 20 6c 69 6d 69 74 43        int limitC
315c0 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ode;            
315d0 2f 2a 20 49 6e 74 65 67 65 72 20 63 6f 64 65 20  /* Integer code 
315e0 66 6f 72 20 74 68 61 74 20 6c 69 6d 69 74 20 2a  for that limit *
315f0 2f 0a 20 20 20 20 7d 20 61 4c 69 6d 69 74 5b 5d  /.    } aLimit[]
31600 20 3d 20 7b 0a 20 20 20 20 20 20 7b 20 22 6c 65   = {.      { "le
31610 6e 67 74 68 22 2c 20 20 20 20 20 20 20 20 20 20  ngth",          
31620 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d        SQLITE_LIM
31630 49 54 5f 4c 45 4e 47 54 48 20 20 20 20 20 20 20  IT_LENGTH       
31640 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
31650 20 20 20 20 20 20 7b 20 22 73 71 6c 5f 6c 65 6e        { "sql_len
31660 67 74 68 22 2c 20 20 20 20 20 20 20 20 20 20 20  gth",           
31670 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 53 51   SQLITE_LIMIT_SQ
31680 4c 5f 4c 45 4e 47 54 48 20 20 20 20 20 20 20 20  L_LENGTH        
31690 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20          },.     
316a0 20 7b 20 22 63 6f 6c 75 6d 6e 22 2c 20 20 20 20   { "column",    
316b0 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
316c0 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 20  TE_LIMIT_COLUMN 
316d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
316e0 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 65     },.      { "e
316f0 78 70 72 5f 64 65 70 74 68 22 2c 20 20 20 20 20  xpr_depth",     
31700 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4c 49         SQLITE_LI
31710 4d 49 54 5f 45 58 50 52 5f 44 45 50 54 48 20 20  MIT_EXPR_DEPTH  
31720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
31730 0a 20 20 20 20 20 20 7b 20 22 63 6f 6d 70 6f 75  .      { "compou
31740 6e 64 5f 73 65 6c 65 63 74 22 2c 20 20 20 20 20  nd_select",     
31750 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43    SQLITE_LIMIT_C
31760 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20 20  OMPOUND_SELECT  
31770 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
31780 20 20 7b 20 22 76 64 62 65 5f 6f 70 22 2c 20 20    { "vdbe_op",  
31790 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
317a0 49 54 45 5f 4c 49 4d 49 54 5f 56 44 42 45 5f 4f  ITE_LIMIT_VDBE_O
317b0 50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  P               
317c0 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22      },.      { "
317d0 66 75 6e 63 74 69 6f 6e 5f 61 72 67 22 2c 20 20  function_arg",  
317e0 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4c          SQLITE_L
317f0 49 4d 49 54 5f 46 55 4e 43 54 49 4f 4e 5f 41 52  IMIT_FUNCTION_AR
31800 47 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  G              }
31810 2c 0a 20 20 20 20 20 20 7b 20 22 61 74 74 61 63  ,.      { "attac
31820 68 65 64 22 2c 20 20 20 20 20 20 20 20 20 20 20  hed",           
31830 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f     SQLITE_LIMIT_
31840 41 54 54 41 43 48 45 44 20 20 20 20 20 20 20 20  ATTACHED        
31850 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
31860 20 20 20 7b 20 22 6c 69 6b 65 5f 70 61 74 74 65     { "like_patte
31870 72 6e 5f 6c 65 6e 67 74 68 22 2c 20 20 20 53 51  rn_length",   SQ
31880 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 49 4b 45 5f  LITE_LIMIT_LIKE_
31890 50 41 54 54 45 52 4e 5f 4c 45 4e 47 54 48 20 20  PATTERN_LENGTH  
318a0 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20       },.      { 
318b0 22 76 61 72 69 61 62 6c 65 5f 6e 75 6d 62 65 72  "variable_number
318c0 22 2c 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f  ",       SQLITE_
318d0 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e  LIMIT_VARIABLE_N
318e0 55 4d 42 45 52 20 20 20 20 20 20 20 20 20 20 20  UMBER           
318f0 7d 2c 0a 20 20 20 20 20 20 7b 20 22 74 72 69 67  },.      { "trig
31900 67 65 72 5f 64 65 70 74 68 22 2c 20 20 20 20 20  ger_depth",     
31910 20 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54      SQLITE_LIMIT
31920 5f 54 52 49 47 47 45 52 5f 44 45 50 54 48 20 20  _TRIGGER_DEPTH  
31930 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
31940 20 20 20 20 7b 20 22 77 6f 72 6b 65 72 5f 74 68      { "worker_th
31950 72 65 61 64 73 22 2c 20 20 20 20 20 20 20 20 53  reads",        S
31960 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 57 4f 52 4b  QLITE_LIMIT_WORK
31970 45 52 5f 54 48 52 45 41 44 53 20 20 20 20 20 20  ER_THREADS      
31980 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7d 3b 0a        },.    };.
31990 20 20 20 20 69 6e 74 20 69 2c 20 6e 32 3b 0a 20      int i, n2;. 
319a0 20 20 20 6f 70 65 6e 5f 64 62 28 70 2c 20 30 29     open_db(p, 0)
319b0 3b 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3d 3d  ;.    if( nArg==
319c0 31 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69  1 ){.      for(i
319d0 3d 30 3b 20 69 3c 41 72 72 61 79 53 69 7a 65 28  =0; i<ArraySize(
319e0 61 4c 69 6d 69 74 29 3b 20 69 2b 2b 29 7b 0a 20  aLimit); i++){. 
319f0 20 20 20 20 20 20 20 70 72 69 6e 74 66 28 22 25         printf("%
31a00 32 30 73 20 25 64 5c 6e 22 2c 20 61 4c 69 6d 69  20s %d\n", aLimi
31a10 74 5b 69 5d 2e 7a 4c 69 6d 69 74 4e 61 6d 65 2c  t[i].zLimitName,
31a20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
31a30 73 71 6c 69 74 65 33 5f 6c 69 6d 69 74 28 70 2d  sqlite3_limit(p-
31a40 3e 64 62 2c 20 61 4c 69 6d 69 74 5b 69 5d 2e 6c  >db, aLimit[i].l
31a50 69 6d 69 74 43 6f 64 65 2c 20 2d 31 29 29 3b 0a  imitCode, -1));.
31a60 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
31a70 65 20 69 66 28 20 6e 41 72 67 3e 33 20 29 7b 0a  e if( nArg>3 ){.
31a80 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
31a90 28 73 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a  (stderr, "Usage:
31aa0 20 2e 6c 69 6d 69 74 20 4e 41 4d 45 20 3f 4e 45   .limit NAME ?NE
31ab0 57 2d 56 41 4c 55 45 3f 5c 6e 22 29 3b 0a 20 20  W-VALUE?\n");.  
31ac0 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
31ad0 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d    goto meta_comm
31ae0 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20 7d 65  and_exit;.    }e
31af0 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  lse{.      int i
31b00 4c 69 6d 69 74 20 3d 20 2d 31 3b 0a 20 20 20 20  Limit = -1;.    
31b10 20 20 6e 32 20 3d 20 73 74 72 6c 65 6e 33 30 28    n2 = strlen30(
31b20 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20 20  azArg[1]);.     
31b30 20 66 6f 72 28 69 3d 30 3b 20 69 3c 41 72 72 61   for(i=0; i<Arra
31b40 79 53 69 7a 65 28 61 4c 69 6d 69 74 29 3b 20 69  ySize(aLimit); i
31b50 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
31b60 20 73 71 6c 69 74 65 33 5f 73 74 72 6e 69 63 6d   sqlite3_strnicm
31b70 70 28 61 4c 69 6d 69 74 5b 69 5d 2e 7a 4c 69 6d  p(aLimit[i].zLim
31b80 69 74 4e 61 6d 65 2c 20 61 7a 41 72 67 5b 31 5d  itName, azArg[1]
31b90 2c 20 6e 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20  , n2)==0 ){.    
31ba0 20 20 20 20 20 20 69 66 28 20 69 4c 69 6d 69 74        if( iLimit
31bb0 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  <0 ){.          
31bc0 20 20 69 4c 69 6d 69 74 20 3d 20 69 3b 0a 20 20    iLimit = i;.  
31bd0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
31be0 20 20 20 20 20 20 20 20 20 20 20 75 74 66 38 5f             utf8_
31bf0 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
31c00 61 6d 62 69 67 75 6f 75 73 20 6c 69 6d 69 74 3a  ambiguous limit:
31c10 20 5c 22 25 73 5c 22 5c 6e 22 2c 20 61 7a 41 72   \"%s\"\n", azAr
31c20 67 5b 31 5d 29 3b 0a 20 20 20 20 20 20 20 20 20  g[1]);.         
31c30 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20     rc = 1;.     
31c40 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 65 74 61         goto meta
31c50 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20  _command_exit;. 
31c60 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
31c70 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
31c80 20 20 20 69 66 28 20 69 4c 69 6d 69 74 3c 30 20     if( iLimit<0 
31c90 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f  ){.        utf8_
31ca0 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
31cb0 75 6e 6b 6e 6f 77 6e 20 6c 69 6d 69 74 3a 20 5c  unknown limit: \
31cc0 22 25 73 5c 22 5c 6e 22 0a 20 20 20 20 20 20 20  "%s\"\n".       
31cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31ce0 20 22 65 6e 74 65 72 20 5c 22 2e 6c 69 6d 69 74   "enter \".limit
31cf0 73 5c 22 20 77 69 74 68 20 6e 6f 20 61 72 67 75  s\" with no argu
31d00 6d 65 6e 74 73 20 66 6f 72 20 61 20 6c 69 73 74  ments for a list
31d10 2e 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  .\n",.          
31d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
31d30 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20 20 20  zArg[1]);.      
31d40 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20    rc = 1;.      
31d50 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d    goto meta_comm
31d60 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20 20 20  and_exit;.      
31d70 7d 0a 20 20 20 20 20 20 69 66 28 20 6e 41 72 67  }.      if( nArg
31d80 3d 3d 33 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ==3 ){.        s
31d90 71 6c 69 74 65 33 5f 6c 69 6d 69 74 28 70 2d 3e  qlite3_limit(p->
31da0 64 62 2c 20 61 4c 69 6d 69 74 5b 69 4c 69 6d 69  db, aLimit[iLimi
31db0 74 5d 2e 6c 69 6d 69 74 43 6f 64 65 2c 0a 20 20  t].limitCode,.  
31dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31dd0 20 20 20 20 28 69 6e 74 29 69 6e 74 65 67 65 72      (int)integer
31de0 56 61 6c 75 65 28 61 7a 41 72 67 5b 32 5d 29 29  Value(azArg[2]))
31df0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
31e00 70 72 69 6e 74 66 28 22 25 32 30 73 20 25 64 5c  printf("%20s %d\
31e10 6e 22 2c 20 61 4c 69 6d 69 74 5b 69 4c 69 6d 69  n", aLimit[iLimi
31e20 74 5d 2e 7a 4c 69 6d 69 74 4e 61 6d 65 2c 0a 20  t].zLimitName,. 
31e30 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
31e40 74 65 33 5f 6c 69 6d 69 74 28 70 2d 3e 64 62 2c  te3_limit(p->db,
31e50 20 61 4c 69 6d 69 74 5b 69 4c 69 6d 69 74 5d 2e   aLimit[iLimit].
31e60 6c 69 6d 69 74 43 6f 64 65 2c 20 2d 31 29 29 3b  limitCode, -1));
31e70 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a  .    }.  }else..
31e80 20 20 69 66 28 20 63 3d 3d 27 6c 27 20 26 26 20    if( c=='l' && 
31e90 6e 3e 32 20 26 26 20 73 74 72 6e 63 6d 70 28 61  n>2 && strncmp(a
31ea0 7a 41 72 67 5b 30 5d 2c 20 22 6c 69 6e 74 22 2c  zArg[0], "lint",
31eb0 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 6f 70   n)==0 ){.    op
31ec0 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a 20 20 20  en_db(p, 0);.   
31ed0 20 6c 69 6e 74 44 6f 74 43 6f 6d 6d 61 6e 64 28   lintDotCommand(
31ee0 70 2c 20 61 7a 41 72 67 2c 20 6e 41 72 67 29 3b  p, azArg, nArg);
31ef0 0a 20 20 7d 65 6c 73 65 0a 0a 23 69 66 6e 64 65  .  }else..#ifnde
31f00 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f  f SQLITE_OMIT_LO
31f10 41 44 5f 45 58 54 45 4e 53 49 4f 4e 0a 20 20 69  AD_EXTENSION.  i
31f20 66 28 20 63 3d 3d 27 6c 27 20 26 26 20 73 74 72  f( c=='l' && str
31f30 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22  ncmp(azArg[0], "
31f40 6c 6f 61 64 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a  load", n)==0 ){.
31f50 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
31f60 7a 46 69 6c 65 2c 20 2a 7a 50 72 6f 63 3b 0a 20  zFile, *zProc;. 
31f70 20 20 20 63 68 61 72 20 2a 7a 45 72 72 4d 73 67     char *zErrMsg
31f80 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 6e 41   = 0;.    if( nA
31f90 72 67 3c 32 20 29 7b 0a 20 20 20 20 20 20 72 61  rg<2 ){.      ra
31fa0 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  w_printf(stderr,
31fb0 20 22 55 73 61 67 65 3a 20 2e 6c 6f 61 64 20 46   "Usage: .load F
31fc0 49 4c 45 20 3f 45 4e 54 52 59 50 4f 49 4e 54 3f  ILE ?ENTRYPOINT?
31fd0 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  \n");.      rc =
31fe0 20 31 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d   1;.      goto m
31ff0 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74  eta_command_exit
32000 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 46 69 6c  ;.    }.    zFil
32010 65 20 3d 20 61 7a 41 72 67 5b 31 5d 3b 0a 20 20  e = azArg[1];.  
32020 20 20 7a 50 72 6f 63 20 3d 20 6e 41 72 67 3e 3d    zProc = nArg>=
32030 33 20 3f 20 61 7a 41 72 67 5b 32 5d 20 3a 20 30  3 ? azArg[2] : 0
32040 3b 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28 70 2c  ;.    open_db(p,
32050 20 30 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71   0);.    rc = sq
32060 6c 69 74 65 33 5f 6c 6f 61 64 5f 65 78 74 65 6e  lite3_load_exten
32070 73 69 6f 6e 28 70 2d 3e 64 62 2c 20 7a 46 69 6c  sion(p->db, zFil
32080 65 2c 20 7a 50 72 6f 63 2c 20 26 7a 45 72 72 4d  e, zProc, &zErrM
32090 73 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  sg);.    if( rc!
320a0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
320b0 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
320c0 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20  stderr, "Error: 
320d0 25 73 5c 6e 22 2c 20 7a 45 72 72 4d 73 67 29 3b  %s\n", zErrMsg);
320e0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
320f0 72 65 65 28 7a 45 72 72 4d 73 67 29 3b 0a 20 20  ree(zErrMsg);.  
32100 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
32110 7d 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66  }.  }else.#endif
32120 0a 0a 20 20 69 66 28 20 63 3d 3d 27 6c 27 20 26  ..  if( c=='l' &
32130 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b  & strncmp(azArg[
32140 30 5d 2c 20 22 6c 6f 67 22 2c 20 6e 29 3d 3d 30  0], "log", n)==0
32150 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 41 72 67   ){.    if( nArg
32160 21 3d 32 20 29 7b 0a 20 20 20 20 20 20 72 61 77  !=2 ){.      raw
32170 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
32180 22 55 73 61 67 65 3a 20 2e 6c 6f 67 20 46 49 4c  "Usage: .log FIL
32190 45 4e 41 4d 45 5c 6e 22 29 3b 0a 20 20 20 20 20  ENAME\n");.     
321a0 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c   rc = 1;.    }el
321b0 73 65 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20  se{.      const 
321c0 63 68 61 72 20 2a 7a 46 69 6c 65 20 3d 20 61 7a  char *zFile = az
321d0 41 72 67 5b 31 5d 3b 0a 20 20 20 20 20 20 6f 75  Arg[1];.      ou
321e0 74 70 75 74 5f 66 69 6c 65 5f 63 6c 6f 73 65 28  tput_file_close(
321f0 70 2d 3e 70 4c 6f 67 29 3b 0a 20 20 20 20 20 20  p->pLog);.      
32200 70 2d 3e 70 4c 6f 67 20 3d 20 6f 75 74 70 75 74  p->pLog = output
32210 5f 66 69 6c 65 5f 6f 70 65 6e 28 7a 46 69 6c 65  _file_open(zFile
32220 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  , 0);.    }.  }e
32230 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 6d  lse..  if( c=='m
32240 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41  ' && strncmp(azA
32250 72 67 5b 30 5d 2c 20 22 6d 6f 64 65 22 2c 20 6e  rg[0], "mode", n
32260 29 3d 3d 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73  )==0 ){.    cons
32270 74 20 63 68 61 72 20 2a 7a 4d 6f 64 65 20 3d 20  t char *zMode = 
32280 6e 41 72 67 3e 3d 32 20 3f 20 61 7a 41 72 67 5b  nArg>=2 ? azArg[
32290 31 5d 20 3a 20 22 22 3b 0a 20 20 20 20 69 6e 74  1] : "";.    int
322a0 20 6e 32 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a   n2 = strlen30(z
322b0 4d 6f 64 65 29 3b 0a 20 20 20 20 69 6e 74 20 63  Mode);.    int c
322c0 32 20 3d 20 7a 4d 6f 64 65 5b 30 5d 3b 0a 20 20  2 = zMode[0];.  
322d0 20 20 69 66 28 20 63 32 3d 3d 27 6c 27 20 26 26    if( c2=='l' &&
322e0 20 6e 32 3e 32 20 26 26 20 73 74 72 6e 63 6d 70   n2>2 && strncmp
322f0 28 61 7a 41 72 67 5b 31 5d 2c 22 6c 69 6e 65 73  (azArg[1],"lines
32300 22 2c 6e 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ",n2)==0 ){.    
32310 20 20 70 2d 3e 6d 6f 64 65 20 3d 20 4d 4f 44 45    p->mode = MODE
32320 5f 4c 69 6e 65 3b 0a 20 20 20 20 20 20 73 71 6c  _Line;.      sql
32330 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
32340 7a 65 6f 66 28 70 2d 3e 72 6f 77 53 65 70 61 72  zeof(p->rowSepar
32350 61 74 6f 72 29 2c 20 70 2d 3e 72 6f 77 53 65 70  ator), p->rowSep
32360 61 72 61 74 6f 72 2c 20 53 45 50 5f 52 6f 77 29  arator, SEP_Row)
32370 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
32380 63 32 3d 3d 27 63 27 20 26 26 20 73 74 72 6e 63  c2=='c' && strnc
32390 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 22 63 6f 6c  mp(azArg[1],"col
323a0 75 6d 6e 73 22 2c 6e 32 29 3d 3d 30 20 29 7b 0a  umns",n2)==0 ){.
323b0 20 20 20 20 20 20 70 2d 3e 6d 6f 64 65 20 3d 20        p->mode = 
323c0 4d 4f 44 45 5f 43 6f 6c 75 6d 6e 3b 0a 20 20 20  MODE_Column;.   
323d0 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
323e0 6e 74 66 28 73 69 7a 65 6f 66 28 70 2d 3e 72 6f  ntf(sizeof(p->ro
323f0 77 53 65 70 61 72 61 74 6f 72 29 2c 20 70 2d 3e  wSeparator), p->
32400 72 6f 77 53 65 70 61 72 61 74 6f 72 2c 20 53 45  rowSeparator, SE
32410 50 5f 52 6f 77 29 3b 0a 20 20 20 20 7d 65 6c 73  P_Row);.    }els
32420 65 20 69 66 28 20 63 32 3d 3d 27 6c 27 20 26 26  e if( c2=='l' &&
32430 20 6e 32 3e 32 20 26 26 20 73 74 72 6e 63 6d 70   n2>2 && strncmp
32440 28 61 7a 41 72 67 5b 31 5d 2c 22 6c 69 73 74 22  (azArg[1],"list"
32450 2c 6e 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ,n2)==0 ){.     
32460 20 70 2d 3e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f   p->mode = MODE_
32470 4c 69 73 74 3b 0a 20 20 20 20 20 20 73 71 6c 69  List;.      sqli
32480 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
32490 65 6f 66 28 70 2d 3e 63 6f 6c 53 65 70 61 72 61  eof(p->colSepara
324a0 74 6f 72 29 2c 20 70 2d 3e 63 6f 6c 53 65 70 61  tor), p->colSepa
324b0 72 61 74 6f 72 2c 20 53 45 50 5f 43 6f 6c 75 6d  rator, SEP_Colum
324c0 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  n);.      sqlite
324d0 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
324e0 66 28 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f  f(p->rowSeparato
324f0 72 29 2c 20 70 2d 3e 72 6f 77 53 65 70 61 72 61  r), p->rowSepara
32500 74 6f 72 2c 20 53 45 50 5f 52 6f 77 29 3b 0a 20  tor, SEP_Row);. 
32510 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 32 3d     }else if( c2=
32520 3d 27 68 27 20 26 26 20 73 74 72 6e 63 6d 70 28  ='h' && strncmp(
32530 61 7a 41 72 67 5b 31 5d 2c 22 68 74 6d 6c 22 2c  azArg[1],"html",
32540 6e 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  n2)==0 ){.      
32550 70 2d 3e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 48  p->mode = MODE_H
32560 74 6d 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  tml;.    }else i
32570 66 28 20 63 32 3d 3d 27 74 27 20 26 26 20 73 74  f( c2=='t' && st
32580 72 6e 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 22  rncmp(azArg[1],"
32590 74 63 6c 22 2c 6e 32 29 3d 3d 30 20 29 7b 0a 20  tcl",n2)==0 ){. 
325a0 20 20 20 20 20 70 2d 3e 6d 6f 64 65 20 3d 20 4d       p->mode = M
325b0 4f 44 45 5f 54 63 6c 3b 0a 20 20 20 20 20 20 73  ODE_Tcl;.      s
325c0 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
325d0 73 69 7a 65 6f 66 28 70 2d 3e 63 6f 6c 53 65 70  sizeof(p->colSep
325e0 61 72 61 74 6f 72 29 2c 20 70 2d 3e 63 6f 6c 53  arator), p->colS
325f0 65 70 61 72 61 74 6f 72 2c 20 53 45 50 5f 53 70  eparator, SEP_Sp
32600 61 63 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ace);.      sqli
32610 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
32620 65 6f 66 28 70 2d 3e 72 6f 77 53 65 70 61 72 61  eof(p->rowSepara
32630 74 6f 72 29 2c 20 70 2d 3e 72 6f 77 53 65 70 61  tor), p->rowSepa
32640 72 61 74 6f 72 2c 20 53 45 50 5f 52 6f 77 29 3b  rator, SEP_Row);
32650 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63  .    }else if( c
32660 32 3d 3d 27 63 27 20 26 26 20 73 74 72 6e 63 6d  2=='c' && strncm
32670 70 28 61 7a 41 72 67 5b 31 5d 2c 22 63 73 76 22  p(azArg[1],"csv"
32680 2c 6e 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ,n2)==0 ){.     
32690 20 70 2d 3e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f   p->mode = MODE_
326a0 43 73 76 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  Csv;.      sqlit
326b0 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
326c0 6f 66 28 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74  of(p->colSeparat
326d0 6f 72 29 2c 20 70 2d 3e 63 6f 6c 53 65 70 61 72  or), p->colSepar
326e0 61 74 6f 72 2c 20 53 45 50 5f 43 6f 6d 6d 61 29  ator, SEP_Comma)
326f0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
32700 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
32710 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 29  p->rowSeparator)
32720 2c 20 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f  , p->rowSeparato
32730 72 2c 20 53 45 50 5f 43 72 4c 66 29 3b 0a 20 20  r, SEP_CrLf);.  
32740 20 20 7d 65 6c 73 65 20 69 66 28 20 63 32 3d 3d    }else if( c2==
32750 27 74 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61  't' && strncmp(a
32760 7a 41 72 67 5b 31 5d 2c 22 74 61 62 73 22 2c 6e  zArg[1],"tabs",n
32770 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  2)==0 ){.      p
32780 2d 3e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 4c 69  ->mode = MODE_Li
32790 73 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  st;.      sqlite
327a0 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
327b0 66 28 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f  f(p->colSeparato
327c0 72 29 2c 20 70 2d 3e 63 6f 6c 53 65 70 61 72 61  r), p->colSepara
327d0 74 6f 72 2c 20 53 45 50 5f 54 61 62 29 3b 0a 20  tor, SEP_Tab);. 
327e0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 32 3d     }else if( c2=
327f0 3d 27 69 27 20 26 26 20 73 74 72 6e 63 6d 70 28  ='i' && strncmp(
32800 61 7a 41 72 67 5b 31 5d 2c 22 69 6e 73 65 72 74  azArg[1],"insert
32810 22 2c 6e 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ",n2)==0 ){.    
32820 20 20 70 2d 3e 6d 6f 64 65 20 3d 20 4d 4f 44 45    p->mode = MODE
32830 5f 49 6e 73 65 72 74 3b 0a 20 20 20 20 20 20 73  _Insert;.      s
32840 65 74 5f 74 61 62 6c 65 5f 6e 61 6d 65 28 70 2c  et_table_name(p,
32850 20 6e 41 72 67 3e 3d 33 20 3f 20 61 7a 41 72 67   nArg>=3 ? azArg
32860 5b 32 5d 20 3a 20 22 74 61 62 6c 65 22 29 3b 0a  [2] : "table");.
32870 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 32      }else if( c2
32880 3d 3d 27 71 27 20 26 26 20 73 74 72 6e 63 6d 70  =='q' && strncmp
32890 28 61 7a 41 72 67 5b 31 5d 2c 22 71 75 6f 74 65  (azArg[1],"quote
328a0 22 2c 6e 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ",n2)==0 ){.    
328b0 20 20 70 2d 3e 6d 6f 64 65 20 3d 20 4d 4f 44 45    p->mode = MODE
328c0 5f 51 75 6f 74 65 3b 0a 20 20 20 20 7d 65 6c 73  _Quote;.    }els
328d0 65 20 69 66 28 20 63 32 3d 3d 27 61 27 20 26 26  e if( c2=='a' &&
328e0 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 31   strncmp(azArg[1
328f0 5d 2c 22 61 73 63 69 69 22 2c 6e 32 29 3d 3d 30  ],"ascii",n2)==0
32900 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6d 6f 64   ){.      p->mod
32910 65 20 3d 20 4d 4f 44 45 5f 41 73 63 69 69 3b 0a  e = MODE_Ascii;.
32920 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
32930 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 70 2d  printf(sizeof(p-
32940 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 29 2c 20  >colSeparator), 
32950 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 2c  p->colSeparator,
32960 20 53 45 50 5f 55 6e 69 74 29 3b 0a 20 20 20 20   SEP_Unit);.    
32970 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
32980 74 66 28 73 69 7a 65 6f 66 28 70 2d 3e 72 6f 77  tf(sizeof(p->row
32990 53 65 70 61 72 61 74 6f 72 29 2c 20 70 2d 3e 72  Separator), p->r
329a0 6f 77 53 65 70 61 72 61 74 6f 72 2c 20 53 45 50  owSeparator, SEP
329b0 5f 52 65 63 6f 72 64 29 3b 0a 20 20 20 20 7d 65  _Record);.    }e
329c0 6c 73 65 20 69 66 28 20 6e 41 72 67 3d 3d 31 20  lse if( nArg==1 
329d0 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69  ){.      raw_pri
329e0 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 63 75 72  ntf(p->out, "cur
329f0 72 65 6e 74 20 6f 75 74 70 75 74 20 6d 6f 64 65  rent output mode
32a00 3a 20 25 73 5c 6e 22 2c 20 6d 6f 64 65 44 65 73  : %s\n", modeDes
32a10 63 72 5b 70 2d 3e 6d 6f 64 65 5d 29 3b 0a 20 20  cr[p->mode]);.  
32a20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
32a30 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  aw_printf(stderr
32a40 2c 20 22 45 72 72 6f 72 3a 20 6d 6f 64 65 20 73  , "Error: mode s
32a50 68 6f 75 6c 64 20 62 65 20 6f 6e 65 20 6f 66 3a  hould be one of:
32a60 20 22 0a 20 20 20 20 20 20 20 20 20 22 61 73 63   ".         "asc
32a70 69 69 20 63 6f 6c 75 6d 6e 20 63 73 76 20 68 74  ii column csv ht
32a80 6d 6c 20 69 6e 73 65 72 74 20 6c 69 6e 65 20 6c  ml insert line l
32a90 69 73 74 20 71 75 6f 74 65 20 74 61 62 73 20 74  ist quote tabs t
32aa0 63 6c 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 63  cl\n");.      rc
32ab0 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 1;.    }.    
32ac0 70 2d 3e 63 4d 6f 64 65 20 3d 20 70 2d 3e 6d 6f  p->cMode = p->mo
32ad0 64 65 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69  de;.  }else..  i
32ae0 66 28 20 63 3d 3d 27 6e 27 20 26 26 20 73 74 72  f( c=='n' && str
32af0 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22  ncmp(azArg[0], "
32b00 6e 75 6c 6c 76 61 6c 75 65 22 2c 20 6e 29 3d 3d  nullvalue", n)==
32b10 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 41 72  0 ){.    if( nAr
32b20 67 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 73 71  g==2 ){.      sq
32b30 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
32b40 69 7a 65 6f 66 28 70 2d 3e 6e 75 6c 6c 56 61 6c  izeof(p->nullVal
32b50 75 65 29 2c 20 70 2d 3e 6e 75 6c 6c 56 61 6c 75  ue), p->nullValu
32b60 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
32b70 20 20 20 20 20 20 20 20 20 20 22 25 2e 2a 73 22            "%.*s"
32b80 2c 20 28 69 6e 74 29 41 72 72 61 79 53 69 7a 65  , (int)ArraySize
32b90 28 70 2d 3e 6e 75 6c 6c 56 61 6c 75 65 29 2d 31  (p->nullValue)-1
32ba0 2c 20 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20  , azArg[1]);.   
32bb0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 61   }else{.      ra
32bc0 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  w_printf(stderr,
32bd0 20 22 55 73 61 67 65 3a 20 2e 6e 75 6c 6c 76 61   "Usage: .nullva
32be0 6c 75 65 20 53 54 52 49 4e 47 5c 6e 22 29 3b 0a  lue STRING\n");.
32bf0 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
32c00 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69    }.  }else..  i
32c10 66 28 20 63 3d 3d 27 6f 27 20 26 26 20 73 74 72  f( c=='o' && str
32c20 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22  ncmp(azArg[0], "
32c30 6f 70 65 6e 22 2c 20 6e 29 3d 3d 30 20 26 26 20  open", n)==0 && 
32c40 6e 3e 3d 32 20 29 7b 0a 20 20 20 20 63 68 61 72  n>=2 ){.    char
32c50 20 2a 7a 4e 65 77 46 69 6c 65 6e 61 6d 65 3b 20   *zNewFilename; 
32c60 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
32c70 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f  database file to
32c80 20 6f 70 65 6e 20 2a 2f 0a 20 20 20 20 69 6e 74   open */.    int
32c90 20 69 4e 61 6d 65 20 3d 20 31 3b 20 20 20 20 20   iName = 1;     
32ca0 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 61 7a    /* Index in az
32cb0 41 72 67 5b 5d 20 6f 66 20 74 68 65 20 66 69 6c  Arg[] of the fil
32cc0 65 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 69 6e 74  ename */.    int
32cd0 20 6e 65 77 46 6c 61 67 20 3d 20 30 3b 20 20 20   newFlag = 0;   
32ce0 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 64 65 6c    /* True to del
32cf0 65 74 65 20 66 69 6c 65 20 62 65 66 6f 72 65 20  ete file before 
32d00 6f 70 65 6e 69 6e 67 20 2a 2f 0a 20 20 20 20 2f  opening */.    /
32d10 2a 20 43 6c 6f 73 65 20 74 68 65 20 65 78 69 73  * Close the exis
32d20 74 69 6e 67 20 64 61 74 61 62 61 73 65 20 2a 2f  ting database */
32d30 0a 20 20 20 20 73 65 73 73 69 6f 6e 5f 63 6c 6f  .    session_clo
32d40 73 65 5f 61 6c 6c 28 70 29 3b 0a 20 20 20 20 63  se_all(p);.    c
32d50 6c 6f 73 65 5f 64 62 28 70 2d 3e 64 62 29 3b 0a  lose_db(p->db);.
32d60 20 20 20 20 70 2d 3e 64 62 20 3d 20 30 3b 0a 20      p->db = 0;. 
32d70 20 20 20 70 2d 3e 7a 44 62 46 69 6c 65 6e 61 6d     p->zDbFilenam
32d80 65 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74  e = 0;.    sqlit
32d90 65 33 5f 66 72 65 65 28 70 2d 3e 7a 46 72 65 65  e3_free(p->zFree
32da0 4f 6e 43 6c 6f 73 65 29 3b 0a 20 20 20 20 70 2d  OnClose);.    p-
32db0 3e 7a 46 72 65 65 4f 6e 43 6c 6f 73 65 20 3d 20  >zFreeOnClose = 
32dc0 30 3b 0a 20 20 20 20 70 2d 3e 6f 70 65 6e 4d 6f  0;.    p->openMo
32dd0 64 65 20 3d 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f  de = SHELL_OPEN_
32de0 55 4e 53 50 45 43 3b 0a 20 20 20 20 2f 2a 20 43  UNSPEC;.    /* C
32df0 68 65 63 6b 20 66 6f 72 20 63 6f 6d 6d 61 6e 64  heck for command
32e00 2d 6c 69 6e 65 20 61 72 67 75 6d 65 6e 74 73 20  -line arguments 
32e10 2a 2f 0a 20 20 20 20 66 6f 72 28 69 4e 61 6d 65  */.    for(iName
32e20 3d 31 3b 20 69 4e 61 6d 65 3c 6e 41 72 67 20 26  =1; iName<nArg &
32e30 26 20 61 7a 41 72 67 5b 69 4e 61 6d 65 5d 5b 30  & azArg[iName][0
32e40 5d 3d 3d 27 2d 27 3b 20 69 4e 61 6d 65 2b 2b 29  ]=='-'; iName++)
32e50 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  {.      const ch
32e60 61 72 20 2a 7a 20 3d 20 61 7a 41 72 67 5b 69 4e  ar *z = azArg[iN
32e70 61 6d 65 5d 3b 0a 20 20 20 20 20 20 69 66 28 20  ame];.      if( 
32e80 6f 70 74 69 6f 6e 4d 61 74 63 68 28 7a 2c 22 6e  optionMatch(z,"n
32e90 65 77 22 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ew") ){.        
32ea0 6e 65 77 46 6c 61 67 20 3d 20 31 3b 0a 23 69 66  newFlag = 1;.#if
32eb0 64 65 66 20 53 51 4c 49 54 45 5f 48 41 56 45 5f  def SQLITE_HAVE_
32ec0 5a 4c 49 42 0a 20 20 20 20 20 20 7d 65 6c 73 65  ZLIB.      }else
32ed0 20 69 66 28 20 6f 70 74 69 6f 6e 4d 61 74 63 68   if( optionMatch
32ee0 28 7a 2c 20 22 7a 69 70 22 29 20 29 7b 0a 20 20  (z, "zip") ){.  
32ef0 20 20 20 20 20 20 70 2d 3e 6f 70 65 6e 4d 6f 64        p->openMod
32f00 65 20 3d 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f 5a  e = SHELL_OPEN_Z
32f10 49 50 46 49 4c 45 3b 0a 23 65 6e 64 69 66 0a 20  IPFILE;.#endif. 
32f20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f       }else if( o
32f30 70 74 69 6f 6e 4d 61 74 63 68 28 7a 2c 20 22 61  ptionMatch(z, "a
32f40 70 70 65 6e 64 22 29 20 29 7b 0a 20 20 20 20 20  ppend") ){.     
32f50 20 20 20 70 2d 3e 6f 70 65 6e 4d 6f 64 65 20 3d     p->openMode =
32f60 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f 41 50 50 45   SHELL_OPEN_APPE
32f70 4e 44 56 46 53 3b 0a 20 20 20 20 20 20 7d 65 6c  NDVFS;.      }el
32f80 73 65 20 69 66 28 20 6f 70 74 69 6f 6e 4d 61 74  se if( optionMat
32f90 63 68 28 7a 2c 20 22 72 65 61 64 6f 6e 6c 79 22  ch(z, "readonly"
32fa0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e  ) ){.        p->
32fb0 6f 70 65 6e 4d 6f 64 65 20 3d 20 53 48 45 4c 4c  openMode = SHELL
32fc0 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 3b 0a  _OPEN_READONLY;.
32fd0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
32fe0 41 42 4c 45 5f 44 45 53 45 52 49 41 4c 49 5a 45  ABLE_DESERIALIZE
32ff0 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
33000 20 6f 70 74 69 6f 6e 4d 61 74 63 68 28 7a 2c 20   optionMatch(z, 
33010 22 64 65 73 65 72 69 61 6c 69 7a 65 22 29 20 29  "deserialize") )
33020 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6f 70 65  {.        p->ope
33030 6e 4d 6f 64 65 20 3d 20 53 48 45 4c 4c 5f 4f 50  nMode = SHELL_OP
33040 45 4e 5f 44 45 53 45 52 49 41 4c 49 5a 45 3b 0a  EN_DESERIALIZE;.
33050 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7d 65 6c  #endif.      }el
33060 73 65 20 69 66 28 20 7a 5b 30 5d 3d 3d 27 2d 27  se if( z[0]=='-'
33070 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38   ){.        utf8
33080 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
33090 22 75 6e 6b 6e 6f 77 6e 20 6f 70 74 69 6f 6e 3a  "unknown option:
330a0 20 25 73 5c 6e 22 2c 20 7a 29 3b 0a 20 20 20 20   %s\n", z);.    
330b0 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
330c0 20 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f      goto meta_co
330d0 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20  mmand_exit;.    
330e0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a    }.    }.    /*
330f0 20 49 66 20 61 20 66 69 6c 65 6e 61 6d 65 20 69   If a filename i
33100 73 20 73 70 65 63 69 66 69 65 64 2c 20 74 72 79  s specified, try
33110 20 74 6f 20 6f 70 65 6e 20 69 74 20 66 69 72 73   to open it firs
33120 74 20 2a 2f 0a 20 20 20 20 7a 4e 65 77 46 69 6c  t */.    zNewFil
33130 65 6e 61 6d 65 20 3d 20 6e 41 72 67 3e 69 4e 61  ename = nArg>iNa
33140 6d 65 20 3f 20 73 71 6c 69 74 65 33 5f 6d 70 72  me ? sqlite3_mpr
33150 69 6e 74 66 28 22 25 73 22 2c 20 61 7a 41 72 67  intf("%s", azArg
33160 5b 69 4e 61 6d 65 5d 29 20 3a 20 30 3b 0a 20 20  [iName]) : 0;.  
33170 20 20 69 66 28 20 7a 4e 65 77 46 69 6c 65 6e 61    if( zNewFilena
33180 6d 65 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  me ){.      if( 
33190 6e 65 77 46 6c 61 67 20 29 20 73 68 65 6c 6c 44  newFlag ) shellD
331a0 65 6c 65 74 65 46 69 6c 65 28 7a 4e 65 77 46 69  eleteFile(zNewFi
331b0 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 70  lename);.      p
331c0 2d 3e 7a 44 62 46 69 6c 65 6e 61 6d 65 20 3d 20  ->zDbFilename = 
331d0 7a 4e 65 77 46 69 6c 65 6e 61 6d 65 3b 0a 20 20  zNewFilename;.  
331e0 20 20 20 20 6f 70 65 6e 5f 64 62 28 70 2c 20 4f      open_db(p, O
331f0 50 45 4e 5f 44 42 5f 4b 45 45 50 41 4c 49 56 45  PEN_DB_KEEPALIVE
33200 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  );.      if( p->
33210 64 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  db==0 ){.       
33220 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64   utf8_printf(std
33230 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 63 61 6e  err, "Error: can
33240 6e 6f 74 20 6f 70 65 6e 20 27 25 73 27 5c 6e 22  not open '%s'\n"
33250 2c 20 7a 4e 65 77 46 69 6c 65 6e 61 6d 65 29 3b  , zNewFilename);
33260 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
33270 5f 66 72 65 65 28 7a 4e 65 77 46 69 6c 65 6e 61  _free(zNewFilena
33280 6d 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  me);.      }else
33290 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 7a 46 72  {.        p->zFr
332a0 65 65 4f 6e 43 6c 6f 73 65 20 3d 20 7a 4e 65 77  eeOnClose = zNew
332b0 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 20 20 20 20  Filename;.      
332c0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
332d0 70 2d 3e 64 62 3d 3d 30 20 29 7b 0a 20 20 20 20  p->db==0 ){.    
332e0 20 20 2f 2a 20 41 73 20 61 20 66 61 6c 6c 2d 62    /* As a fall-b
332f0 61 63 6b 20 6f 70 65 6e 20 61 20 54 45 4d 50 20  ack open a TEMP 
33300 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 20 20  database */.    
33310 20 20 70 2d 3e 7a 44 62 46 69 6c 65 6e 61 6d 65    p->zDbFilename
33320 20 3d 20 30 3b 0a 20 20 20 20 20 20 6f 70 65 6e   = 0;.      open
33330 5f 64 62 28 70 2c 20 30 29 3b 0a 20 20 20 20 7d  _db(p, 0);.    }
33340 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20  .  }else..  if( 
33350 28 63 3d 3d 27 6f 27 0a 20 20 20 20 20 20 20 20  (c=='o'.        
33360 26 26 20 28 73 74 72 6e 63 6d 70 28 61 7a 41 72  && (strncmp(azAr
33370 67 5b 30 5d 2c 20 22 6f 75 74 70 75 74 22 2c 20  g[0], "output", 
33380 6e 29 3d 3d 30 7c 7c 73 74 72 6e 63 6d 70 28 61  n)==0||strncmp(a
33390 7a 41 72 67 5b 30 5d 2c 20 22 6f 6e 63 65 22 2c  zArg[0], "once",
333a0 20 6e 29 3d 3d 30 29 29 0a 20 20 20 7c 7c 20 28   n)==0)).   || (
333b0 63 3d 3d 27 65 27 20 26 26 20 6e 3d 3d 35 20 26  c=='e' && n==5 &
333c0 26 20 73 74 72 63 6d 70 28 61 7a 41 72 67 5b 30  & strcmp(azArg[0
333d0 5d 2c 22 65 78 63 65 6c 22 29 3d 3d 30 29 0a 20  ],"excel")==0). 
333e0 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   ){.    const ch
333f0 61 72 20 2a 7a 46 69 6c 65 20 3d 20 6e 41 72 67  ar *zFile = nArg
33400 3e 3d 32 20 3f 20 61 7a 41 72 67 5b 31 5d 20 3a  >=2 ? azArg[1] :
33410 20 22 73 74 64 6f 75 74 22 3b 0a 20 20 20 20 69   "stdout";.    i
33420 6e 74 20 62 54 78 74 4d 6f 64 65 20 3d 20 30 3b  nt bTxtMode = 0;
33430 0a 20 20 20 20 69 66 28 20 61 7a 41 72 67 5b 30  .    if( azArg[0
33440 5d 5b 30 5d 3d 3d 27 65 27 20 29 7b 0a 20 20 20  ][0]=='e' ){.   
33450 20 20 20 2f 2a 20 54 72 61 6e 73 66 6f 72 6d 20     /* Transform 
33460 74 68 65 20 22 2e 65 78 63 65 6c 22 20 63 6f 6d  the ".excel" com
33470 6d 61 6e 64 20 69 6e 74 6f 20 22 2e 6f 6e 63 65  mand into ".once
33480 20 2d 78 22 20 2a 2f 0a 20 20 20 20 20 20 6e 41   -x" */.      nA
33490 72 67 20 3d 20 32 3b 0a 20 20 20 20 20 20 61 7a  rg = 2;.      az
334a0 41 72 67 5b 30 5d 20 3d 20 22 6f 6e 63 65 22 3b  Arg[0] = "once";
334b0 0a 20 20 20 20 20 20 7a 46 69 6c 65 20 3d 20 61  .      zFile = a
334c0 7a 41 72 67 5b 31 5d 20 3d 20 22 2d 78 22 3b 0a  zArg[1] = "-x";.
334d0 20 20 20 20 20 20 6e 20 3d 20 34 3b 0a 20 20 20        n = 4;.   
334e0 20 7d 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3e   }.    if( nArg>
334f0 32 20 29 7b 0a 20 20 20 20 20 20 75 74 66 38 5f  2 ){.      utf8_
33500 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
33510 55 73 61 67 65 3a 20 2e 25 73 20 5b 2d 65 7c 2d  Usage: .%s [-e|-
33520 78 7c 46 49 4c 45 5d 5c 6e 22 2c 20 61 7a 41 72  x|FILE]\n", azAr
33530 67 5b 30 5d 29 3b 0a 20 20 20 20 20 20 72 63 20  g[0]);.      rc 
33540 3d 20 31 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  = 1;.      goto 
33550 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69  meta_command_exi
33560 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  t;.    }.    if(
33570 20 6e 3e 31 20 26 26 20 73 74 72 6e 63 6d 70 28   n>1 && strncmp(
33580 61 7a 41 72 67 5b 30 5d 2c 20 22 6f 6e 63 65 22  azArg[0], "once"
33590 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  , n)==0 ){.     
335a0 20 69 66 28 20 6e 41 72 67 3c 32 20 29 7b 0a 20   if( nArg<2 ){. 
335b0 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74         raw_print
335c0 66 28 73 74 64 65 72 72 2c 20 22 55 73 61 67 65  f(stderr, "Usage
335d0 3a 20 2e 6f 6e 63 65 20 28 2d 65 7c 2d 78 7c 46  : .once (-e|-x|F
335e0 49 4c 45 29 5c 6e 22 29 3b 0a 20 20 20 20 20 20  ILE)\n");.      
335f0 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20    rc = 1;.      
33600 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d    goto meta_comm
33610 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20 20 20  and_exit;.      
33620 7d 0a 20 20 20 20 20 20 70 2d 3e 6f 75 74 43 6f  }.      p->outCo
33630 75 6e 74 20 3d 20 32 3b 0a 20 20 20 20 7d 65 6c  unt = 2;.    }el
33640 73 65 7b 0a 20 20 20 20 20 20 70 2d 3e 6f 75 74  se{.      p->out
33650 43 6f 75 6e 74 20 3d 20 30 3b 0a 20 20 20 20 7d  Count = 0;.    }
33660 0a 20 20 20 20 6f 75 74 70 75 74 5f 72 65 73 65  .    output_rese
33670 74 28 70 29 3b 0a 20 20 20 20 69 66 28 20 7a 46  t(p);.    if( zF
33680 69 6c 65 5b 30 5d 3d 3d 27 2d 27 20 26 26 20 7a  ile[0]=='-' && z
33690 46 69 6c 65 5b 31 5d 3d 3d 27 2d 27 20 29 20 7a  File[1]=='-' ) z
336a0 46 69 6c 65 2b 2b 3b 0a 23 69 66 6e 64 65 66 20  File++;.#ifndef 
336b0 53 51 4c 49 54 45 5f 4e 4f 48 41 56 45 5f 53 59  SQLITE_NOHAVE_SY
336c0 53 54 45 4d 0a 20 20 20 20 69 66 28 20 73 74 72  STEM.    if( str
336d0 63 6d 70 28 7a 46 69 6c 65 2c 20 22 2d 65 22 29  cmp(zFile, "-e")
336e0 3d 3d 30 20 7c 7c 20 73 74 72 63 6d 70 28 7a 46  ==0 || strcmp(zF
336f0 69 6c 65 2c 20 22 2d 78 22 29 3d 3d 30 20 29 7b  ile, "-x")==0 ){
33700 0a 20 20 20 20 20 20 70 2d 3e 64 6f 58 64 67 4f  .      p->doXdgO
33710 70 65 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 6f  pen = 1;.      o
33720 75 74 70 75 74 4d 6f 64 65 50 75 73 68 28 70 29  utputModePush(p)
33730 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 46 69 6c  ;.      if( zFil
33740 65 5b 31 5d 3d 3d 27 78 27 20 29 7b 0a 20 20 20  e[1]=='x' ){.   
33750 20 20 20 20 20 6e 65 77 54 65 6d 70 46 69 6c 65       newTempFile
33760 28 70 2c 20 22 63 73 76 22 29 3b 0a 20 20 20 20  (p, "csv");.    
33770 20 20 20 20 70 2d 3e 6d 6f 64 65 20 3d 20 4d 4f      p->mode = MO
33780 44 45 5f 43 73 76 3b 0a 20 20 20 20 20 20 20 20  DE_Csv;.        
33790 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
337a0 28 73 69 7a 65 6f 66 28 70 2d 3e 63 6f 6c 53 65  (sizeof(p->colSe
337b0 70 61 72 61 74 6f 72 29 2c 20 70 2d 3e 63 6f 6c  parator), p->col
337c0 53 65 70 61 72 61 74 6f 72 2c 20 53 45 50 5f 43  Separator, SEP_C
337d0 6f 6d 6d 61 29 3b 0a 20 20 20 20 20 20 20 20 73  omma);.        s
337e0 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
337f0 73 69 7a 65 6f 66 28 70 2d 3e 72 6f 77 53 65 70  sizeof(p->rowSep
33800 61 72 61 74 6f 72 29 2c 20 70 2d 3e 72 6f 77 53  arator), p->rowS
33810 65 70 61 72 61 74 6f 72 2c 20 53 45 50 5f 43 72  eparator, SEP_Cr
33820 4c 66 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  Lf);.      }else
33830 7b 0a 20 20 20 20 20 20 20 20 6e 65 77 54 65 6d  {.        newTem
33840 70 46 69 6c 65 28 70 2c 20 22 74 78 74 22 29 3b  pFile(p, "txt");
33850 0a 20 20 20 20 20 20 20 20 62 54 78 74 4d 6f 64  .        bTxtMod
33860 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  e = 1;.      }. 
33870 20 20 20 20 20 7a 46 69 6c 65 20 3d 20 70 2d 3e       zFile = p->
33880 7a 54 65 6d 70 46 69 6c 65 3b 0a 20 20 20 20 7d  zTempFile;.    }
33890 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
338a0 45 5f 4e 4f 48 41 56 45 5f 53 59 53 54 45 4d 20  E_NOHAVE_SYSTEM 
338b0 2a 2f 0a 20 20 20 20 69 66 28 20 7a 46 69 6c 65  */.    if( zFile
338c0 5b 30 5d 3d 3d 27 7c 27 20 29 7b 0a 23 69 66 64  [0]=='|' ){.#ifd
338d0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50  ef SQLITE_OMIT_P
338e0 4f 50 45 4e 0a 20 20 20 20 20 20 72 61 77 5f 70  OPEN.      raw_p
338f0 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45  rintf(stderr, "E
33900 72 72 6f 72 3a 20 70 69 70 65 73 20 61 72 65 20  rror: pipes are 
33910 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 20 69 6e  not supported in
33920 20 74 68 69 73 20 4f 53 5c 6e 22 29 3b 0a 20 20   this OS\n");.  
33930 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
33940 20 20 70 2d 3e 6f 75 74 20 3d 20 73 74 64 6f 75    p->out = stdou
33950 74 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 70  t;.#else.      p
33960 2d 3e 6f 75 74 20 3d 20 70 6f 70 65 6e 28 7a 46  ->out = popen(zF
33970 69 6c 65 20 2b 20 31 2c 20 22 77 22 29 3b 0a 20  ile + 1, "w");. 
33980 20 20 20 20 20 69 66 28 20 70 2d 3e 6f 75 74 3d       if( p->out=
33990 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74  =0 ){.        ut
339a0 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  f8_printf(stderr
339b0 2c 22 45 72 72 6f 72 3a 20 63 61 6e 6e 6f 74 20  ,"Error: cannot 
339c0 6f 70 65 6e 20 70 69 70 65 20 5c 22 25 73 5c 22  open pipe \"%s\"
339d0 5c 6e 22 2c 20 7a 46 69 6c 65 20 2b 20 31 29 3b  \n", zFile + 1);
339e0 0a 20 20 20 20 20 20 20 20 70 2d 3e 6f 75 74 20  .        p->out 
339f0 3d 20 73 74 64 6f 75 74 3b 0a 20 20 20 20 20 20  = stdout;.      
33a00 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20    rc = 1;.      
33a10 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
33a20 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
33a30 73 69 7a 65 6f 66 28 70 2d 3e 6f 75 74 66 69 6c  sizeof(p->outfil
33a40 65 29 2c 20 70 2d 3e 6f 75 74 66 69 6c 65 2c 20  e), p->outfile, 
33a50 22 25 73 22 2c 20 7a 46 69 6c 65 29 3b 0a 20 20  "%s", zFile);.  
33a60 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
33a70 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 2d   }else{.      p-
33a80 3e 6f 75 74 20 3d 20 6f 75 74 70 75 74 5f 66 69  >out = output_fi
33a90 6c 65 5f 6f 70 65 6e 28 7a 46 69 6c 65 2c 20 62  le_open(zFile, b
33aa0 54 78 74 4d 6f 64 65 29 3b 0a 20 20 20 20 20 20  TxtMode);.      
33ab0 69 66 28 20 70 2d 3e 6f 75 74 3d 3d 30 20 29 7b  if( p->out==0 ){
33ac0 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 74 72  .        if( str
33ad0 63 6d 70 28 7a 46 69 6c 65 2c 22 6f 66 66 22 29  cmp(zFile,"off")
33ae0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  !=0 ){.         
33af0 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64   utf8_printf(std
33b00 65 72 72 2c 22 45 72 72 6f 72 3a 20 63 61 6e 6e  err,"Error: cann
33b10 6f 74 20 77 72 69 74 65 20 74 6f 20 5c 22 25 73  ot write to \"%s
33b20 5c 22 5c 6e 22 2c 20 7a 46 69 6c 65 29 3b 0a 20  \"\n", zFile);. 
33b30 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
33b40 20 70 2d 3e 6f 75 74 20 3d 20 73 74 64 6f 75 74   p->out = stdout
33b50 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 31  ;.        rc = 1
33b60 3b 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b  ;.      } else {
33b70 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
33b80 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66  _snprintf(sizeof
33b90 28 70 2d 3e 6f 75 74 66 69 6c 65 29 2c 20 70 2d  (p->outfile), p-
33ba0 3e 6f 75 74 66 69 6c 65 2c 20 22 25 73 22 2c 20  >outfile, "%s", 
33bb0 7a 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 7d 0a  zFile);.      }.
33bc0 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20      }.  }else.. 
33bd0 20 69 66 28 20 63 3d 3d 27 70 27 20 26 26 20 6e   if( c=='p' && n
33be0 3e 3d 33 20 26 26 20 73 74 72 6e 63 6d 70 28 61  >=3 && strncmp(a
33bf0 7a 41 72 67 5b 30 5d 2c 20 22 70 72 69 6e 74 22  zArg[0], "print"
33c00 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69  , n)==0 ){.    i
33c10 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d  nt i;.    for(i=
33c20 31 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b  1; i<nArg; i++){
33c30 0a 20 20 20 20 20 20 69 66 28 20 69 3e 31 20 29  .      if( i>1 )
33c40 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f   raw_printf(p->o
33c50 75 74 2c 20 22 20 22 29 3b 0a 20 20 20 20 20 20  ut, " ");.      
33c60 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f  utf8_printf(p->o
33c70 75 74 2c 20 22 25 73 22 2c 20 61 7a 41 72 67 5b  ut, "%s", azArg[
33c80 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  i]);.    }.    r
33c90 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  aw_printf(p->out
33ca0 2c 20 22 5c 6e 22 29 3b 0a 20 20 7d 65 6c 73 65  , "\n");.  }else
33cb0 0a 0a 20 20 69 66 28 20 63 3d 3d 27 70 27 20 26  ..  if( c=='p' &
33cc0 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b  & strncmp(azArg[
33cd0 30 5d 2c 20 22 70 72 6f 6d 70 74 22 2c 20 6e 29  0], "prompt", n)
33ce0 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6e  ==0 ){.    if( n
33cf0 41 72 67 20 3e 3d 20 32 29 20 7b 0a 20 20 20 20  Arg >= 2) {.    
33d00 20 20 73 74 72 6e 63 70 79 28 6d 61 69 6e 50 72    strncpy(mainPr
33d10 6f 6d 70 74 2c 61 7a 41 72 67 5b 31 5d 2c 28 69  ompt,azArg[1],(i
33d20 6e 74 29 41 72 72 61 79 53 69 7a 65 28 6d 61 69  nt)ArraySize(mai
33d30 6e 50 72 6f 6d 70 74 29 2d 31 29 3b 0a 20 20 20  nPrompt)-1);.   
33d40 20 7d 0a 20 20 20 20 69 66 28 20 6e 41 72 67 20   }.    if( nArg 
33d50 3e 3d 20 33 29 20 7b 0a 20 20 20 20 20 20 73 74  >= 3) {.      st
33d60 72 6e 63 70 79 28 63 6f 6e 74 69 6e 75 65 50 72  rncpy(continuePr
33d70 6f 6d 70 74 2c 61 7a 41 72 67 5b 32 5d 2c 28 69  ompt,azArg[2],(i
33d80 6e 74 29 41 72 72 61 79 53 69 7a 65 28 63 6f 6e  nt)ArraySize(con
33d90 74 69 6e 75 65 50 72 6f 6d 70 74 29 2d 31 29 3b  tinuePrompt)-1);
33da0 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a  .    }.  }else..
33db0 20 20 69 66 28 20 63 3d 3d 27 71 27 20 26 26 20    if( c=='q' && 
33dc0 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d  strncmp(azArg[0]
33dd0 2c 20 22 71 75 69 74 22 2c 20 6e 29 3d 3d 30 20  , "quit", n)==0 
33de0 29 7b 0a 20 20 20 20 72 63 20 3d 20 32 3b 0a 20  ){.    rc = 2;. 
33df0 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d   }else..  if( c=
33e00 3d 27 72 27 20 26 26 20 6e 3e 3d 33 20 26 26 20  ='r' && n>=3 && 
33e10 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d  strncmp(azArg[0]
33e20 2c 20 22 72 65 61 64 22 2c 20 6e 29 3d 3d 30 20  , "read", n)==0 
33e30 29 7b 0a 20 20 20 20 46 49 4c 45 20 2a 61 6c 74  ){.    FILE *alt
33e40 3b 0a 20 20 20 20 69 66 28 20 6e 41 72 67 21 3d  ;.    if( nArg!=
33e50 32 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70  2 ){.      raw_p
33e60 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55  rintf(stderr, "U
33e70 73 61 67 65 3a 20 2e 72 65 61 64 20 46 49 4c 45  sage: .read FILE
33e80 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  \n");.      rc =
33e90 20 31 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d   1;.      goto m
33ea0 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74  eta_command_exit
33eb0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 6c 74 20  ;.    }.    alt 
33ec0 3d 20 66 6f 70 65 6e 28 61 7a 41 72 67 5b 31 5d  = fopen(azArg[1]
33ed0 2c 20 22 72 62 22 29 3b 0a 20 20 20 20 69 66 28  , "rb");.    if(
33ee0 20 61 6c 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20   alt==0 ){.     
33ef0 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64   utf8_printf(std
33f00 65 72 72 2c 22 45 72 72 6f 72 3a 20 63 61 6e 6e  err,"Error: cann
33f10 6f 74 20 6f 70 65 6e 20 5c 22 25 73 5c 22 5c 6e  ot open \"%s\"\n
33f20 22 2c 20 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20  ", azArg[1]);.  
33f30 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
33f40 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
33f50 3d 20 70 72 6f 63 65 73 73 5f 69 6e 70 75 74 28  = process_input(
33f60 70 2c 20 61 6c 74 29 3b 0a 20 20 20 20 20 20 66  p, alt);.      f
33f70 63 6c 6f 73 65 28 61 6c 74 29 3b 0a 20 20 20 20  close(alt);.    
33f80 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28  }.  }else..  if(
33f90 20 63 3d 3d 27 72 27 20 26 26 20 6e 3e 3d 33 20   c=='r' && n>=3 
33fa0 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67  && strncmp(azArg
33fb0 5b 30 5d 2c 20 22 72 65 73 74 6f 72 65 22 2c 20  [0], "restore", 
33fc0 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 63 6f 6e  n)==0 ){.    con
33fd0 73 74 20 63 68 61 72 20 2a 7a 53 72 63 46 69 6c  st char *zSrcFil
33fe0 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  e;.    const cha
33ff0 72 20 2a 7a 44 62 3b 0a 20 20 20 20 73 71 6c 69  r *zDb;.    sqli
34000 74 65 33 20 2a 70 53 72 63 3b 0a 20 20 20 20 73  te3 *pSrc;.    s
34010 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 20 2a 70  qlite3_backup *p
34020 42 61 63 6b 75 70 3b 0a 20 20 20 20 69 6e 74 20  Backup;.    int 
34030 6e 54 69 6d 65 6f 75 74 20 3d 20 30 3b 0a 0a 20  nTimeout = 0;.. 
34040 20 20 20 69 66 28 20 6e 41 72 67 3d 3d 32 20 29     if( nArg==2 )
34050 7b 0a 20 20 20 20 20 20 7a 53 72 63 46 69 6c 65  {.      zSrcFile
34060 20 3d 20 61 7a 41 72 67 5b 31 5d 3b 0a 20 20 20   = azArg[1];.   
34070 20 20 20 7a 44 62 20 3d 20 22 6d 61 69 6e 22 3b     zDb = "main";
34080 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e  .    }else if( n
34090 41 72 67 3d 3d 33 20 29 7b 0a 20 20 20 20 20 20  Arg==3 ){.      
340a0 7a 53 72 63 46 69 6c 65 20 3d 20 61 7a 41 72 67  zSrcFile = azArg
340b0 5b 32 5d 3b 0a 20 20 20 20 20 20 7a 44 62 20 3d  [2];.      zDb =
340c0 20 61 7a 41 72 67 5b 31 5d 3b 0a 20 20 20 20 7d   azArg[1];.    }
340d0 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 61 77 5f  else{.      raw_
340e0 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
340f0 55 73 61 67 65 3a 20 2e 72 65 73 74 6f 72 65 20  Usage: .restore 
34100 3f 44 42 3f 20 46 49 4c 45 5c 6e 22 29 3b 0a 20  ?DB? FILE\n");. 
34110 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20       rc = 1;.   
34120 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d     goto meta_com
34130 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20 7d  mand_exit;.    }
34140 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
34150 33 5f 6f 70 65 6e 28 7a 53 72 63 46 69 6c 65 2c  3_open(zSrcFile,
34160 20 26 70 53 72 63 29 3b 0a 20 20 20 20 69 66 28   &pSrc);.    if(
34170 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
34180 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69  {.      utf8_pri
34190 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72  ntf(stderr, "Err
341a0 6f 72 3a 20 63 61 6e 6e 6f 74 20 6f 70 65 6e 20  or: cannot open 
341b0 5c 22 25 73 5c 22 5c 6e 22 2c 20 7a 53 72 63 46  \"%s\"\n", zSrcF
341c0 69 6c 65 29 3b 0a 20 20 20 20 20 20 63 6c 6f 73  ile);.      clos
341d0 65 5f 64 62 28 70 53 72 63 29 3b 0a 20 20 20 20  e_db(pSrc);.    
341e0 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
341f0 7d 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28 70 2c  }.    open_db(p,
34200 20 30 29 3b 0a 20 20 20 20 70 42 61 63 6b 75 70   0);.    pBackup
34210 20 3d 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75   = sqlite3_backu
34220 70 5f 69 6e 69 74 28 70 2d 3e 64 62 2c 20 7a 44  p_init(p->db, zD
34230 62 2c 20 70 53 72 63 2c 20 22 6d 61 69 6e 22 29  b, pSrc, "main")
34240 3b 0a 20 20 20 20 69 66 28 20 70 42 61 63 6b 75  ;.    if( pBacku
34250 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 75 74  p==0 ){.      ut
34260 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  f8_printf(stderr
34270 2c 20 22 45 72 72 6f 72 3a 20 25 73 5c 6e 22 2c  , "Error: %s\n",
34280 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
34290 70 2d 3e 64 62 29 29 3b 0a 20 20 20 20 20 20 63  p->db));.      c
342a0 6c 6f 73 65 5f 64 62 28 70 53 72 63 29 3b 0a 20  lose_db(pSrc);. 
342b0 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
342c0 20 20 20 7d 0a 20 20 20 20 77 68 69 6c 65 28 20     }.    while( 
342d0 28 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 61  (rc = sqlite3_ba
342e0 63 6b 75 70 5f 73 74 65 70 28 70 42 61 63 6b 75  ckup_step(pBacku
342f0 70 2c 31 30 30 29 29 3d 3d 53 51 4c 49 54 45 5f  p,100))==SQLITE_
34300 4f 4b 0a 20 20 20 20 20 20 20 20 20 20 7c 7c 20  OK.          || 
34310 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20  rc==SQLITE_BUSY 
34320 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 72 63   ){.      if( rc
34330 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 29 7b  ==SQLITE_BUSY ){
34340 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 54 69  .        if( nTi
34350 6d 65 6f 75 74 2b 2b 20 3e 3d 20 33 20 29 20 62  meout++ >= 3 ) b
34360 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 73 71  reak;.        sq
34370 6c 69 74 65 33 5f 73 6c 65 65 70 28 31 30 30 29  lite3_sleep(100)
34380 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
34390 20 20 20 20 73 71 6c 69 74 65 33 5f 62 61 63 6b      sqlite3_back
343a0 75 70 5f 66 69 6e 69 73 68 28 70 42 61 63 6b 75  up_finish(pBacku
343b0 70 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  p);.    if( rc==
343c0 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20  SQLITE_DONE ){. 
343d0 20 20 20 20 20 72 63 20 3d 20 30 3b 0a 20 20 20       rc = 0;.   
343e0 20 7d 65 6c 73 65 20 69 66 28 20 72 63 3d 3d 53   }else if( rc==S
343f0 51 4c 49 54 45 5f 42 55 53 59 20 7c 7c 20 72 63  QLITE_BUSY || rc
34400 3d 3d 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 20  ==SQLITE_LOCKED 
34410 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69  ){.      raw_pri
34420 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72  ntf(stderr, "Err
34430 6f 72 3a 20 73 6f 75 72 63 65 20 64 61 74 61 62  or: source datab
34440 61 73 65 20 69 73 20 62 75 73 79 5c 6e 22 29 3b  ase is busy\n");
34450 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20  .      rc = 1;. 
34460 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
34470 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65  utf8_printf(stde
34480 72 72 2c 20 22 45 72 72 6f 72 3a 20 25 73 5c 6e  rr, "Error: %s\n
34490 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73  ", sqlite3_errms
344a0 67 28 70 2d 3e 64 62 29 29 3b 0a 20 20 20 20 20  g(p->db));.     
344b0 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20   rc = 1;.    }. 
344c0 20 20 20 63 6c 6f 73 65 5f 64 62 28 70 53 72 63     close_db(pSrc
344d0 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66  );.  }else..  if
344e0 28 20 63 3d 3d 27 73 27 20 26 26 20 73 74 72 6e  ( c=='s' && strn
344f0 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 73  cmp(azArg[0], "s
34500 63 61 6e 73 74 61 74 73 22 2c 20 6e 29 3d 3d 30  canstats", n)==0
34510 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 41 72 67   ){.    if( nArg
34520 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  ==2 ){.      p->
34530 73 63 61 6e 73 74 61 74 73 4f 6e 20 3d 20 28 75  scanstatsOn = (u
34540 38 29 62 6f 6f 6c 65 61 6e 56 61 6c 75 65 28 61  8)booleanValue(a
34550 7a 41 72 67 5b 31 5d 29 3b 0a 23 69 66 6e 64 65  zArg[1]);.#ifnde
34560 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
34570 53 54 4d 54 5f 53 43 41 4e 53 54 41 54 55 53 0a  STMT_SCANSTATUS.
34580 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
34590 28 73 74 64 65 72 72 2c 20 22 57 61 72 6e 69 6e  (stderr, "Warnin
345a0 67 3a 20 2e 73 63 61 6e 73 74 61 74 73 20 6e 6f  g: .scanstats no
345b0 74 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 74  t available in t
345c0 68 69 73 20 62 75 69 6c 64 2e 5c 6e 22 29 3b 0a  his build.\n");.
345d0 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73 65  #endif.    }else
345e0 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e  {.      raw_prin
345f0 74 66 28 73 74 64 65 72 72 2c 20 22 55 73 61 67  tf(stderr, "Usag
34600 65 3a 20 2e 73 63 61 6e 73 74 61 74 73 20 6f 6e  e: .scanstats on
34610 7c 6f 66 66 5c 6e 22 29 3b 0a 20 20 20 20 20 20  |off\n");.      
34620 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  rc = 1;.    }.  
34630 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d  }else..  if( c==
34640 27 73 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61  's' && strncmp(a
34650 7a 41 72 67 5b 30 5d 2c 20 22 73 63 68 65 6d 61  zArg[0], "schema
34660 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ", n)==0 ){.    
34670 53 68 65 6c 6c 54 65 78 74 20 73 53 65 6c 65 63  ShellText sSelec
34680 74 3b 0a 20 20 20 20 53 68 65 6c 6c 53 74 61 74  t;.    ShellStat
34690 65 20 64 61 74 61 3b 0a 20 20 20 20 63 68 61 72  e data;.    char
346a0 20 2a 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20   *zErrMsg = 0;. 
346b0 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
346c0 44 69 76 20 3d 20 22 28 22 3b 0a 20 20 20 20 63  Div = "(";.    c
346d0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
346e0 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 69 53   = 0;.    int iS
346f0 63 68 65 6d 61 20 3d 20 30 3b 0a 20 20 20 20 69  chema = 0;.    i
34700 6e 74 20 62 44 65 62 75 67 20 3d 20 30 3b 0a 20  nt bDebug = 0;. 
34710 20 20 20 69 6e 74 20 69 69 3b 0a 0a 20 20 20 20     int ii;..    
34720 6f 70 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a 20  open_db(p, 0);. 
34730 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61 2c     memcpy(&data,
34740 20 70 2c 20 73 69 7a 65 6f 66 28 64 61 74 61 29   p, sizeof(data)
34750 29 3b 0a 20 20 20 20 64 61 74 61 2e 73 68 6f 77  );.    data.show
34760 48 65 61 64 65 72 20 3d 20 30 3b 0a 20 20 20 20  Header = 0;.    
34770 64 61 74 61 2e 63 4d 6f 64 65 20 3d 20 64 61 74  data.cMode = dat
34780 61 2e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 53 65  a.mode = MODE_Se
34790 6d 69 3b 0a 20 20 20 20 69 6e 69 74 54 65 78 74  mi;.    initText
347a0 28 26 73 53 65 6c 65 63 74 29 3b 0a 20 20 20 20  (&sSelect);.    
347b0 66 6f 72 28 69 69 3d 31 3b 20 69 69 3c 6e 41 72  for(ii=1; ii<nAr
347c0 67 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20  g; ii++){.      
347d0 69 66 28 20 6f 70 74 69 6f 6e 4d 61 74 63 68 28  if( optionMatch(
347e0 61 7a 41 72 67 5b 69 69 5d 2c 22 69 6e 64 65 6e  azArg[ii],"inden
347f0 74 22 29 20 29 7b 0a 20 20 20 20 20 20 20 20 64  t") ){.        d
34800 61 74 61 2e 63 4d 6f 64 65 20 3d 20 64 61 74 61  ata.cMode = data
34810 2e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 50 72 65  .mode = MODE_Pre
34820 74 74 79 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  tty;.      }else
34830 20 69 66 28 20 6f 70 74 69 6f 6e 4d 61 74 63 68   if( optionMatch
34840 28 61 7a 41 72 67 5b 69 69 5d 2c 22 64 65 62 75  (azArg[ii],"debu
34850 67 22 29 20 29 7b 0a 20 20 20 20 20 20 20 20 62  g") ){.        b
34860 44 65 62 75 67 20 3d 20 31 3b 0a 20 20 20 20 20  Debug = 1;.     
34870 20 7d 65 6c 73 65 20 69 66 28 20 7a 4e 61 6d 65   }else if( zName
34880 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  ==0 ){.        z
34890 4e 61 6d 65 20 3d 20 61 7a 41 72 67 5b 69 69 5d  Name = azArg[ii]
348a0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
348b0 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74         raw_print
348c0 66 28 73 74 64 65 72 72 2c 20 22 55 73 61 67 65  f(stderr, "Usage
348d0 3a 20 2e 73 63 68 65 6d 61 20 3f 2d 2d 69 6e 64  : .schema ?--ind
348e0 65 6e 74 3f 20 3f 4c 49 4b 45 2d 50 41 54 54 45  ent? ?LIKE-PATTE
348f0 52 4e 3f 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20  RN?\n");.       
34900 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20   rc = 1;.       
34910 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61   goto meta_comma
34920 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 7d  nd_exit;.      }
34930 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 7a  .    }.    if( z
34940 4e 61 6d 65 21 3d 30 20 29 7b 0a 20 20 20 20 20  Name!=0 ){.     
34950 20 69 6e 74 20 69 73 4d 61 73 74 65 72 20 3d 20   int isMaster = 
34960 73 71 6c 69 74 65 33 5f 73 74 72 6c 69 6b 65 28  sqlite3_strlike(
34970 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f 6d  zName, "sqlite_m
34980 61 73 74 65 72 22 2c 20 27 5c 5c 27 29 3d 3d 30  aster", '\\')==0
34990 3b 0a 20 20 20 20 20 20 69 66 28 20 69 73 4d 61  ;.      if( isMa
349a0 73 74 65 72 20 7c 7c 20 73 71 6c 69 74 65 33 5f  ster || sqlite3_
349b0 73 74 72 6c 69 6b 65 28 7a 4e 61 6d 65 2c 22 73  strlike(zName,"s
349c0 71 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65  qlite_temp_maste
349d0 72 22 2c 20 27 5c 5c 27 29 3d 3d 30 20 29 7b 0a  r", '\\')==0 ){.
349e0 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 6e 65          char *ne
349f0 77 5f 61 72 67 76 5b 32 5d 2c 20 2a 6e 65 77 5f  w_argv[2], *new_
34a00 63 6f 6c 76 5b 32 5d 3b 0a 20 20 20 20 20 20 20  colv[2];.       
34a10 20 6e 65 77 5f 61 72 67 76 5b 30 5d 20 3d 20 73   new_argv[0] = s
34a20 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a  qlite3_mprintf(.
34a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34a40 20 20 20 20 20 20 22 43 52 45 41 54 45 20 54 41        "CREATE TA
34a50 42 4c 45 20 25 73 20 28 5c 6e 22 0a 20 20 20 20  BLE %s (\n".    
34a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34a70 20 20 22 20 20 74 79 70 65 20 74 65 78 74 2c 5c    "  type text,\
34a80 6e 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n".             
34a90 20 20 20 20 20 20 20 20 20 22 20 20 6e 61 6d 65           "  name
34aa0 20 74 65 78 74 2c 5c 6e 22 0a 20 20 20 20 20 20   text,\n".      
34ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34ac0 22 20 20 74 62 6c 5f 6e 61 6d 65 20 74 65 78 74  "  tbl_name text
34ad0 2c 5c 6e 22 0a 20 20 20 20 20 20 20 20 20 20 20  ,\n".           
34ae0 20 20 20 20 20 20 20 20 20 20 20 22 20 20 72 6f             "  ro
34af0 6f 74 70 61 67 65 20 69 6e 74 65 67 65 72 2c 5c  otpage integer,\
34b00 6e 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n".             
34b10 20 20 20 20 20 20 20 20 20 22 20 20 73 71 6c 20           "  sql 
34b20 74 65 78 74 5c 6e 22 0a 20 20 20 20 20 20 20 20  text\n".        
34b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 29                ")
34b40 22 2c 20 69 73 4d 61 73 74 65 72 20 3f 20 22 73  ", isMaster ? "s
34b50 71 6c 69 74 65 5f 6d 61 73 74 65 72 22 20 3a 20  qlite_master" : 
34b60 22 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73  "sqlite_temp_mas
34b70 74 65 72 22 29 3b 0a 20 20 20 20 20 20 20 20 6e  ter");.        n
34b80 65 77 5f 61 72 67 76 5b 31 5d 20 3d 20 30 3b 0a  ew_argv[1] = 0;.
34b90 20 20 20 20 20 20 20 20 6e 65 77 5f 63 6f 6c 76          new_colv
34ba0 5b 30 5d 20 3d 20 22 73 71 6c 22 3b 0a 20 20 20  [0] = "sql";.   
34bb0 20 20 20 20 20 6e 65 77 5f 63 6f 6c 76 5b 31 5d       new_colv[1]
34bc0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 63 61   = 0;.        ca
34bd0 6c 6c 62 61 63 6b 28 26 64 61 74 61 2c 20 31 2c  llback(&data, 1,
34be0 20 6e 65 77 5f 61 72 67 76 2c 20 6e 65 77 5f 63   new_argv, new_c
34bf0 6f 6c 76 29 3b 0a 20 20 20 20 20 20 20 20 73 71  olv);.        sq
34c00 6c 69 74 65 33 5f 66 72 65 65 28 6e 65 77 5f 61  lite3_free(new_a
34c10 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 20 20 7d  rgv[0]);.      }
34c20 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 7a  .    }.    if( z
34c30 44 69 76 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  Div ){.      sql
34c40 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
34c50 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d   = 0;.      rc =
34c60 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
34c70 5f 76 32 28 70 2d 3e 64 62 2c 20 22 53 45 4c 45  _v2(p->db, "SELE
34c80 43 54 20 6e 61 6d 65 20 46 52 4f 4d 20 70 72 61  CT name FROM pra
34c90 67 6d 61 5f 64 61 74 61 62 61 73 65 5f 6c 69 73  gma_database_lis
34ca0 74 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  t",.            
34cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34cc0 20 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29    -1, &pStmt, 0)
34cd0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
34ce0 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70  {.        utf8_p
34cf0 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45  rintf(stderr, "E
34d00 72 72 6f 72 3a 20 25 73 5c 6e 22 2c 20 73 71 6c  rror: %s\n", sql
34d10 69 74 65 33 5f 65 72 72 6d 73 67 28 70 2d 3e 64  ite3_errmsg(p->d
34d20 62 29 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  b));.        sql
34d30 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53  ite3_finalize(pS
34d40 74 6d 74 29 3b 0a 20 20 20 20 20 20 20 20 72 63  tmt);.        rc
34d50 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 67 6f   = 1;.        go
34d60 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f  to meta_command_
34d70 65 78 69 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  exit;.      }.  
34d80 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26      appendText(&
34d90 73 53 65 6c 65 63 74 2c 20 22 53 45 4c 45 43 54  sSelect, "SELECT
34da0 20 73 71 6c 20 46 52 4f 4d 22 2c 20 30 29 3b 0a   sql FROM", 0);.
34db0 20 20 20 20 20 20 69 53 63 68 65 6d 61 20 3d 20        iSchema = 
34dc0 30 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  0;.      while( 
34dd0 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74  sqlite3_step(pSt
34de0 6d 74 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20  mt)==SQLITE_ROW 
34df0 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74  ){.        const
34e00 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 28 63 6f   char *zDb = (co
34e10 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65  nst char*)sqlite
34e20 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53  3_column_text(pS
34e30 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  tmt, 0);.       
34e40 20 63 68 61 72 20 7a 53 63 4e 75 6d 5b 33 30 5d   char zScNum[30]
34e50 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
34e60 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
34e70 66 28 7a 53 63 4e 75 6d 29 2c 20 7a 53 63 4e 75  f(zScNum), zScNu
34e80 6d 2c 20 22 25 64 22 2c 20 2b 2b 69 53 63 68 65  m, "%d", ++iSche
34e90 6d 61 29 3b 0a 20 20 20 20 20 20 20 20 61 70 70  ma);.        app
34ea0 65 6e 64 54 65 78 74 28 26 73 53 65 6c 65 63 74  endText(&sSelect
34eb0 2c 20 7a 44 69 76 2c 20 30 29 3b 0a 20 20 20 20  , zDiv, 0);.    
34ec0 20 20 20 20 7a 44 69 76 20 3d 20 22 20 55 4e 49      zDiv = " UNI
34ed0 4f 4e 20 41 4c 4c 20 22 3b 0a 20 20 20 20 20 20  ON ALL ";.      
34ee0 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 53    appendText(&sS
34ef0 65 6c 65 63 74 2c 20 22 53 45 4c 45 43 54 20 73  elect, "SELECT s
34f00 68 65 6c 6c 5f 61 64 64 5f 73 63 68 65 6d 61 28  hell_add_schema(
34f10 73 71 6c 2c 22 2c 20 30 29 3b 0a 20 20 20 20 20  sql,", 0);.     
34f20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73     if( sqlite3_s
34f30 74 72 69 63 6d 70 28 7a 44 62 2c 20 22 6d 61 69  tricmp(zDb, "mai
34f40 6e 22 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  n")!=0 ){.      
34f50 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26      appendText(&
34f60 73 53 65 6c 65 63 74 2c 20 7a 44 62 2c 20 27 22  sSelect, zDb, '"
34f70 27 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ');.        }els
34f80 65 7b 0a 20 20 20 20 20 20 20 20 20 20 61 70 70  e{.          app
34f90 65 6e 64 54 65 78 74 28 26 73 53 65 6c 65 63 74  endText(&sSelect
34fa0 2c 20 22 4e 55 4c 4c 22 2c 20 30 29 3b 0a 20 20  , "NULL", 0);.  
34fb0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
34fc0 61 70 70 65 6e 64 54 65 78 74 28 26 73 53 65 6c  appendText(&sSel
34fd0 65 63 74 2c 20 22 2c 6e 61 6d 65 29 20 41 53 20  ect, ",name) AS 
34fe0 73 71 6c 2c 20 74 79 70 65 2c 20 74 62 6c 5f 6e  sql, type, tbl_n
34ff0 61 6d 65 2c 20 6e 61 6d 65 2c 20 72 6f 77 69 64  ame, name, rowid
35000 2c 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  ,", 0);.        
35010 61 70 70 65 6e 64 54 65 78 74 28 26 73 53 65 6c  appendText(&sSel
35020 65 63 74 2c 20 7a 53 63 4e 75 6d 2c 20 30 29 3b  ect, zScNum, 0);
35030 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 54  .        appendT
35040 65 78 74 28 26 73 53 65 6c 65 63 74 2c 20 22 20  ext(&sSelect, " 
35050 41 53 20 73 6e 75 6d 2c 20 22 2c 20 30 29 3b 0a  AS snum, ", 0);.
35060 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 54 65          appendTe
35070 78 74 28 26 73 53 65 6c 65 63 74 2c 20 7a 44 62  xt(&sSelect, zDb
35080 2c 20 27 5c 27 27 29 3b 0a 20 20 20 20 20 20 20  , '\'');.       
35090 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 53 65   appendText(&sSe
350a0 6c 65 63 74 2c 20 22 20 41 53 20 73 6e 61 6d 65  lect, " AS sname
350b0 20 46 52 4f 4d 20 22 2c 20 30 29 3b 0a 20 20 20   FROM ", 0);.   
350c0 20 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28       appendText(
350d0 26 73 53 65 6c 65 63 74 2c 20 7a 44 62 2c 20 27  &sSelect, zDb, '
350e0 22 27 29 3b 0a 20 20 20 20 20 20 20 20 61 70 70  "');.        app
350f0 65 6e 64 54 65 78 74 28 26 73 53 65 6c 65 63 74  endText(&sSelect
35100 2c 20 22 2e 73 71 6c 69 74 65 5f 6d 61 73 74 65  , ".sqlite_maste
35110 72 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  r", 0);.      }.
35120 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69        sqlite3_fi
35130 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 23  nalize(pStmt);.#
35140 69 66 64 65 66 20 53 51 4c 49 54 45 5f 49 4e 54  ifdef SQLITE_INT
35150 52 4f 53 50 45 43 54 49 4f 4e 5f 50 52 41 47 4d  ROSPECTION_PRAGM
35160 41 53 0a 20 20 20 20 20 20 69 66 28 20 7a 4e 61  AS.      if( zNa
35170 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20 61 70  me ){.        ap
35180 70 65 6e 64 54 65 78 74 28 26 73 53 65 6c 65 63  pendText(&sSelec
35190 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 22 20  t,.           " 
351a0 55 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c 45 43 54  UNION ALL SELECT
351b0 20 73 68 65 6c 6c 5f 6d 6f 64 75 6c 65 5f 73 63   shell_module_sc
351c0 68 65 6d 61 28 6e 61 6d 65 29 2c 22 0a 20 20 20  hema(name),".   
351d0 20 20 20 20 20 20 20 20 22 20 27 74 61 62 6c 65          " 'table
351e0 27 2c 20 6e 61 6d 65 2c 20 6e 61 6d 65 2c 20 6e  ', name, name, n
351f0 61 6d 65 2c 20 39 65 2b 39 39 2c 20 27 6d 61 69  ame, 9e+99, 'mai
35200 6e 27 20 46 52 4f 4d 20 70 72 61 67 6d 61 5f 6d  n' FROM pragma_m
35210 6f 64 75 6c 65 5f 6c 69 73 74 22 2c 20 30 29 3b  odule_list", 0);
35220 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
35230 20 20 20 20 20 20 61 70 70 65 6e 64 54 65 78 74        appendText
35240 28 26 73 53 65 6c 65 63 74 2c 20 22 29 20 57 48  (&sSelect, ") WH
35250 45 52 45 20 22 2c 20 30 29 3b 0a 20 20 20 20 20  ERE ", 0);.     
35260 20 69 66 28 20 7a 4e 61 6d 65 20 29 7b 0a 20 20   if( zName ){.  
35270 20 20 20 20 20 20 63 68 61 72 20 2a 7a 51 61 72        char *zQar
35280 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  g = sqlite3_mpri
35290 6e 74 66 28 22 25 51 22 2c 20 7a 4e 61 6d 65 29  ntf("%Q", zName)
352a0 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 62 47  ;.        int bG
352b0 6c 6f 62 20 3d 20 73 74 72 63 68 72 28 7a 4e 61  lob = strchr(zNa
352c0 6d 65 2c 20 27 2a 27 29 20 21 3d 20 30 20 7c 7c  me, '*') != 0 ||
352d0 20 73 74 72 63 68 72 28 7a 4e 61 6d 65 2c 20 27   strchr(zName, '
352e0 3f 27 29 20 21 3d 20 30 20 7c 7c 0a 20 20 20 20  ?') != 0 ||.    
352f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35300 73 74 72 63 68 72 28 7a 4e 61 6d 65 2c 20 27 5b  strchr(zName, '[
35310 27 29 20 21 3d 20 30 3b 0a 20 20 20 20 20 20 20  ') != 0;.       
35320 20 69 66 28 20 73 74 72 63 68 72 28 7a 4e 61 6d   if( strchr(zNam
35330 65 2c 20 27 2e 27 29 20 29 7b 0a 20 20 20 20 20  e, '.') ){.     
35340 20 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28       appendText(
35350 26 73 53 65 6c 65 63 74 2c 20 22 6c 6f 77 65 72  &sSelect, "lower
35360 28 70 72 69 6e 74 66 28 27 25 73 2e 25 73 27 2c  (printf('%s.%s',
35370 73 6e 61 6d 65 2c 74 62 6c 5f 6e 61 6d 65 29 29  sname,tbl_name))
35380 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d  ", 0);.        }
35390 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
353a0 61 70 70 65 6e 64 54 65 78 74 28 26 73 53 65 6c  appendText(&sSel
353b0 65 63 74 2c 20 22 6c 6f 77 65 72 28 74 62 6c 5f  ect, "lower(tbl_
353c0 6e 61 6d 65 29 22 2c 20 30 29 3b 0a 20 20 20 20  name)", 0);.    
353d0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 70      }.        ap
353e0 70 65 6e 64 54 65 78 74 28 26 73 53 65 6c 65 63  pendText(&sSelec
353f0 74 2c 20 62 47 6c 6f 62 20 3f 20 22 20 47 4c 4f  t, bGlob ? " GLO
35400 42 20 22 20 3a 20 22 20 4c 49 4b 45 20 22 2c 20  B " : " LIKE ", 
35410 30 29 3b 0a 20 20 20 20 20 20 20 20 61 70 70 65  0);.        appe
35420 6e 64 54 65 78 74 28 26 73 53 65 6c 65 63 74 2c  ndText(&sSelect,
35430 20 7a 51 61 72 67 2c 20 30 29 3b 0a 20 20 20 20   zQarg, 0);.    
35440 20 20 20 20 69 66 28 20 21 62 47 6c 6f 62 20 29      if( !bGlob )
35450 7b 0a 20 20 20 20 20 20 20 20 20 20 61 70 70 65  {.          appe
35460 6e 64 54 65 78 74 28 26 73 53 65 6c 65 63 74 2c  ndText(&sSelect,
35470 20 22 20 45 53 43 41 50 45 20 27 5c 5c 27 20 22   " ESCAPE '\\' "
35480 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  , 0);.        }.
35490 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 54 65          appendTe
354a0 78 74 28 26 73 53 65 6c 65 63 74 2c 20 22 20 41  xt(&sSelect, " A
354b0 4e 44 20 22 2c 20 30 29 3b 0a 20 20 20 20 20 20  ND ", 0);.      
354c0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
354d0 51 61 72 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Qarg);.      }. 
354e0 20 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28       appendText(
354f0 26 73 53 65 6c 65 63 74 2c 20 22 74 79 70 65 21  &sSelect, "type!
35500 3d 27 6d 65 74 61 27 20 41 4e 44 20 73 71 6c 20  ='meta' AND sql 
35510 49 53 20 4e 4f 54 20 4e 55 4c 4c 22 0a 20 20 20  IS NOT NULL".   
35520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35530 20 20 20 20 20 20 20 20 22 20 4f 52 44 45 52 20          " ORDER 
35540 42 59 20 73 6e 75 6d 2c 20 72 6f 77 69 64 22 2c  BY snum, rowid",
35550 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 62   0);.      if( b
35560 44 65 62 75 67 20 29 7b 0a 20 20 20 20 20 20 20  Debug ){.       
35570 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e   utf8_printf(p->
35580 6f 75 74 2c 20 22 53 51 4c 3a 20 25 73 3b 5c 6e  out, "SQL: %s;\n
35590 22 2c 20 73 53 65 6c 65 63 74 2e 7a 29 3b 0a 20  ", sSelect.z);. 
355a0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
355b0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
355c0 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20 73 53 65  _exec(p->db, sSe
355d0 6c 65 63 74 2e 7a 2c 20 63 61 6c 6c 62 61 63 6b  lect.z, callback
355e0 2c 20 26 64 61 74 61 2c 20 26 7a 45 72 72 4d 73  , &data, &zErrMs
355f0 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  g);.      }.    
35600 20 20 66 72 65 65 54 65 78 74 28 26 73 53 65 6c    freeText(&sSel
35610 65 63 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ect);.    }.    
35620 69 66 28 20 7a 45 72 72 4d 73 67 20 29 7b 0a 20  if( zErrMsg ){. 
35630 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
35640 28 73 74 64 65 72 72 2c 22 45 72 72 6f 72 3a 20  (stderr,"Error: 
35650 25 73 5c 6e 22 2c 20 7a 45 72 72 4d 73 67 29 3b  %s\n", zErrMsg);
35660 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
35670 72 65 65 28 7a 45 72 72 4d 73 67 29 3b 0a 20 20  ree(zErrMsg);.  
35680 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
35690 7d 65 6c 73 65 20 69 66 28 20 72 63 20 21 3d 20  }else if( rc != 
356a0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
356b0 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74     raw_printf(st
356c0 64 65 72 72 2c 22 45 72 72 6f 72 3a 20 71 75 65  derr,"Error: que
356d0 72 79 69 6e 67 20 73 63 68 65 6d 61 20 69 6e 66  rying schema inf
356e0 6f 72 6d 61 74 69 6f 6e 5c 6e 22 29 3b 0a 20 20  ormation\n");.  
356f0 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
35700 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
35710 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  = 0;.    }.  }el
35720 73 65 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  se..#if defined(
35730 53 51 4c 49 54 45 5f 44 45 42 55 47 29 20 26 26  SQLITE_DEBUG) &&
35740 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
35750 45 4e 41 42 4c 45 5f 53 45 4c 45 43 54 54 52 41  ENABLE_SELECTTRA
35760 43 45 29 0a 20 20 69 66 28 20 63 3d 3d 27 73 27  CE).  if( c=='s'
35770 20 26 26 20 6e 3d 3d 31 31 20 26 26 20 73 74 72   && n==11 && str
35780 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22  ncmp(azArg[0], "
35790 73 65 6c 65 63 74 74 72 61 63 65 22 2c 20 6e 29  selecttrace", n)
357a0 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
357b0 65 33 53 65 6c 65 63 74 54 72 61 63 65 20 3d 20  e3SelectTrace = 
357c0 28 69 6e 74 29 69 6e 74 65 67 65 72 56 61 6c 75  (int)integerValu
357d0 65 28 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 7d  e(azArg[1]);.  }
357e0 65 6c 73 65 0a 23 65 6e 64 69 66 0a 0a 23 69 66  else.#endif..#if
357f0 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
35800 45 4e 41 42 4c 45 5f 53 45 53 53 49 4f 4e 29 0a  ENABLE_SESSION).
35810 20 20 69 66 28 20 63 3d 3d 27 73 27 20 26 26 20    if( c=='s' && 
35820 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d  strncmp(azArg[0]
35830 2c 22 73 65 73 73 69 6f 6e 22 2c 6e 29 3d 3d 30  ,"session",n)==0
35840 20 26 26 20 6e 3e 3d 33 20 29 7b 0a 20 20 20 20   && n>=3 ){.    
35850 4f 70 65 6e 53 65 73 73 69 6f 6e 20 2a 70 53 65  OpenSession *pSe
35860 73 73 69 6f 6e 20 3d 20 26 70 2d 3e 61 53 65 73  ssion = &p->aSes
35870 73 69 6f 6e 5b 30 5d 3b 0a 20 20 20 20 63 68 61  sion[0];.    cha
35880 72 20 2a 2a 61 7a 43 6d 64 20 3d 20 26 61 7a 41  r **azCmd = &azA
35890 72 67 5b 31 5d 3b 0a 20 20 20 20 69 6e 74 20 69  rg[1];.    int i
358a0 53 65 73 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74  Ses = 0;.    int
358b0 20 6e 43 6d 64 20 3d 20 6e 41 72 67 20 2d 20 31   nCmd = nArg - 1
358c0 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  ;.    int i;.   
358d0 20 69 66 28 20 6e 41 72 67 3c 3d 31 20 29 20 67   if( nArg<=1 ) g
358e0 6f 74 6f 20 73 65 73 73 69 6f 6e 5f 73 79 6e 74  oto session_synt
358f0 61 78 5f 65 72 72 6f 72 3b 0a 20 20 20 20 6f 70  ax_error;.    op
35900 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a 20 20 20  en_db(p, 0);.   
35910 20 69 66 28 20 6e 41 72 67 3e 3d 33 20 29 7b 0a   if( nArg>=3 ){.
35920 20 20 20 20 20 20 66 6f 72 28 69 53 65 73 3d 30        for(iSes=0
35930 3b 20 69 53 65 73 3c 70 2d 3e 6e 53 65 73 73 69  ; iSes<p->nSessi
35940 6f 6e 3b 20 69 53 65 73 2b 2b 29 7b 0a 20 20 20  on; iSes++){.   
35950 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28       if( strcmp(
35960 70 2d 3e 61 53 65 73 73 69 6f 6e 5b 69 53 65 73  p->aSession[iSes
35970 5d 2e 7a 4e 61 6d 65 2c 20 61 7a 41 72 67 5b 31  ].zName, azArg[1
35980 5d 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  ])==0 ) break;. 
35990 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
359a0 20 69 53 65 73 3c 70 2d 3e 6e 53 65 73 73 69 6f   iSes<p->nSessio
359b0 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 70 53 65  n ){.        pSe
359c0 73 73 69 6f 6e 20 3d 20 26 70 2d 3e 61 53 65 73  ssion = &p->aSes
359d0 73 69 6f 6e 5b 69 53 65 73 5d 3b 0a 20 20 20 20  sion[iSes];.    
359e0 20 20 20 20 61 7a 43 6d 64 2b 2b 3b 0a 20 20 20      azCmd++;.   
359f0 20 20 20 20 20 6e 43 6d 64 2d 2d 3b 0a 20 20 20       nCmd--;.   
35a00 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
35a10 20 20 70 53 65 73 73 69 6f 6e 20 3d 20 26 70 2d    pSession = &p-
35a20 3e 61 53 65 73 73 69 6f 6e 5b 30 5d 3b 0a 20 20  >aSession[0];.  
35a30 20 20 20 20 20 20 69 53 65 73 20 3d 20 30 3b 0a        iSes = 0;.
35a40 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
35a50 20 20 20 2f 2a 20 2e 73 65 73 73 69 6f 6e 20 61     /* .session a
35a60 74 74 61 63 68 20 54 41 42 4c 45 0a 20 20 20 20  ttach TABLE.    
35a70 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 73 71  ** Invoke the sq
35a80 6c 69 74 65 33 73 65 73 73 69 6f 6e 5f 61 74 74  lite3session_att
35a90 61 63 68 28 29 20 69 6e 74 65 72 66 61 63 65 20  ach() interface 
35aa0 74 6f 20 61 74 74 61 63 68 20 61 20 70 61 72 74  to attach a part
35ab0 69 63 75 6c 61 72 0a 20 20 20 20 2a 2a 20 74 61  icular.    ** ta
35ac0 62 6c 65 20 73 6f 20 74 68 61 74 20 69 74 20 69  ble so that it i
35ad0 73 20 6e 65 76 65 72 20 66 69 6c 74 65 72 65 64  s never filtered
35ae0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
35af0 20 73 74 72 63 6d 70 28 61 7a 43 6d 64 5b 30 5d   strcmp(azCmd[0]
35b00 2c 22 61 74 74 61 63 68 22 29 3d 3d 30 20 29 7b  ,"attach")==0 ){
35b10 0a 20 20 20 20 20 20 69 66 28 20 6e 43 6d 64 21  .      if( nCmd!
35b20 3d 32 20 29 20 67 6f 74 6f 20 73 65 73 73 69 6f  =2 ) goto sessio
35b30 6e 5f 73 79 6e 74 61 78 5f 65 72 72 6f 72 3b 0a  n_syntax_error;.
35b40 20 20 20 20 20 20 69 66 28 20 70 53 65 73 73 69        if( pSessi
35b50 6f 6e 2d 3e 70 3d 3d 30 20 29 7b 0a 20 20 20 20  on->p==0 ){.    
35b60 20 20 20 20 73 65 73 73 69 6f 6e 5f 6e 6f 74 5f      session_not_
35b70 6f 70 65 6e 3a 0a 20 20 20 20 20 20 20 20 72 61  open:.        ra
35b80 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  w_printf(stderr,
35b90 20 22 45 52 52 4f 52 3a 20 4e 6f 20 73 65 73 73   "ERROR: No sess
35ba0 69 6f 6e 73 20 61 72 65 20 6f 70 65 6e 5c 6e 22  ions are open\n"
35bb0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
35bc0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
35bd0 69 74 65 33 73 65 73 73 69 6f 6e 5f 61 74 74 61  ite3session_atta
35be0 63 68 28 70 53 65 73 73 69 6f 6e 2d 3e 70 2c 20  ch(pSession->p, 
35bf0 61 7a 43 6d 64 5b 31 5d 29 3b 0a 20 20 20 20 20  azCmd[1]);.     
35c00 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
35c10 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74         raw_print
35c20 66 28 73 74 64 65 72 72 2c 20 22 45 52 52 4f 52  f(stderr, "ERROR
35c30 3a 20 73 71 6c 69 74 65 33 73 65 73 73 69 6f 6e  : sqlite3session
35c40 5f 61 74 74 61 63 68 28 29 20 72 65 74 75 72 6e  _attach() return
35c50 73 20 25 64 5c 6e 22 2c 20 72 63 29 3b 0a 20 20  s %d\n", rc);.  
35c60 20 20 20 20 20 20 20 20 72 63 20 3d 20 30 3b 0a          rc = 0;.
35c70 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
35c80 7d 0a 20 20 20 20 7d 65 6c 73 65 0a 0a 20 20 20  }.    }else..   
35c90 20 2f 2a 20 2e 73 65 73 73 69 6f 6e 20 63 68 61   /* .session cha
35ca0 6e 67 65 73 65 74 20 46 49 4c 45 0a 20 20 20 20  ngeset FILE.    
35cb0 2a 2a 20 2e 73 65 73 73 69 6f 6e 20 70 61 74 63  ** .session patc
35cc0 68 73 65 74 20 46 49 4c 45 0a 20 20 20 20 2a 2a  hset FILE.    **
35cd0 20 57 72 69 74 65 20 61 20 63 68 61 6e 67 65 73   Write a changes
35ce0 65 74 20 6f 72 20 70 61 74 63 68 73 65 74 20 69  et or patchset i
35cf0 6e 74 6f 20 61 20 66 69 6c 65 2e 20 20 54 68 65  nto a file.  The
35d00 20 66 69 6c 65 20 69 73 20 6f 76 65 72 77 72 69   file is overwri
35d10 74 74 65 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  tten..    */.   
35d20 20 69 66 28 20 73 74 72 63 6d 70 28 61 7a 43 6d   if( strcmp(azCm
35d30 64 5b 30 5d 2c 22 63 68 61 6e 67 65 73 65 74 22  d[0],"changeset"
35d40 29 3d 3d 30 20 7c 7c 20 73 74 72 63 6d 70 28 61  )==0 || strcmp(a
35d50 7a 43 6d 64 5b 30 5d 2c 22 70 61 74 63 68 73 65  zCmd[0],"patchse
35d60 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  t")==0 ){.      
35d70 46 49 4c 45 20 2a 6f 75 74 20 3d 20 30 3b 0a 20  FILE *out = 0;. 
35d80 20 20 20 20 20 69 66 28 20 6e 43 6d 64 21 3d 32       if( nCmd!=2
35d90 20 29 20 67 6f 74 6f 20 73 65 73 73 69 6f 6e 5f   ) goto session_
35da0 73 79 6e 74 61 78 5f 65 72 72 6f 72 3b 0a 20 20  syntax_error;.  
35db0 20 20 20 20 69 66 28 20 70 53 65 73 73 69 6f 6e      if( pSession
35dc0 2d 3e 70 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65  ->p==0 ) goto se
35dd0 73 73 69 6f 6e 5f 6e 6f 74 5f 6f 70 65 6e 3b 0a  ssion_not_open;.
35de0 20 20 20 20 20 20 6f 75 74 20 3d 20 66 6f 70 65        out = fope
35df0 6e 28 61 7a 43 6d 64 5b 31 5d 2c 20 22 77 62 22  n(azCmd[1], "wb"
35e00 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6f 75 74  );.      if( out
35e10 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 75  ==0 ){.        u
35e20 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72  tf8_printf(stder
35e30 72 2c 20 22 45 52 52 4f 52 3a 20 63 61 6e 6e 6f  r, "ERROR: canno
35e40 74 20 6f 70 65 6e 20 5c 22 25 73 5c 22 20 66 6f  t open \"%s\" fo
35e50 72 20 77 72 69 74 69 6e 67 5c 6e 22 2c 20 61 7a  r writing\n", az
35e60 43 6d 64 5b 31 5d 29 3b 0a 20 20 20 20 20 20 7d  Cmd[1]);.      }
35e70 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e  else{.        in
35e80 74 20 73 7a 43 68 6e 67 3b 0a 20 20 20 20 20 20  t szChng;.      
35e90 20 20 76 6f 69 64 20 2a 70 43 68 6e 67 3b 0a 20    void *pChng;. 
35ea0 20 20 20 20 20 20 20 69 66 28 20 61 7a 43 6d 64         if( azCmd
35eb0 5b 30 5d 5b 30 5d 3d 3d 27 63 27 20 29 7b 0a 20  [0][0]=='c' ){. 
35ec0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
35ed0 6c 69 74 65 33 73 65 73 73 69 6f 6e 5f 63 68 61  lite3session_cha
35ee0 6e 67 65 73 65 74 28 70 53 65 73 73 69 6f 6e 2d  ngeset(pSession-
35ef0 3e 70 2c 20 26 73 7a 43 68 6e 67 2c 20 26 70 43  >p, &szChng, &pC
35f00 68 6e 67 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  hng);.        }e
35f10 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72  lse{.          r
35f20 63 20 3d 20 73 71 6c 69 74 65 33 73 65 73 73 69  c = sqlite3sessi
35f30 6f 6e 5f 70 61 74 63 68 73 65 74 28 70 53 65 73  on_patchset(pSes
35f40 73 69 6f 6e 2d 3e 70 2c 20 26 73 7a 43 68 6e 67  sion->p, &szChng
35f50 2c 20 26 70 43 68 6e 67 29 3b 0a 20 20 20 20 20  , &pChng);.     
35f60 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
35f70 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20   rc ){.         
35f80 20 70 72 69 6e 74 66 28 22 45 72 72 6f 72 3a 20   printf("Error: 
35f90 65 72 72 6f 72 20 63 6f 64 65 20 25 64 5c 6e 22  error code %d\n"
35fa0 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 20 20 20  , rc);.         
35fb0 20 72 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 20   rc = 0;.       
35fc0 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70   }.        if( p
35fd0 43 68 6e 67 0a 20 20 20 20 20 20 20 20 20 20 26  Chng.          &
35fe0 26 20 66 77 72 69 74 65 28 70 43 68 6e 67 2c 20  & fwrite(pChng, 
35ff0 73 7a 43 68 6e 67 2c 20 31 2c 20 6f 75 74 29 21  szChng, 1, out)!
36000 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =1 ){.          
36010 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72  raw_printf(stder
36020 72 2c 20 22 45 52 52 4f 52 3a 20 46 61 69 6c 65  r, "ERROR: Faile
36030 64 20 74 6f 20 77 72 69 74 65 20 65 6e 74 69 72  d to write entir
36040 65 20 25 64 2d 62 79 74 65 20 6f 75 74 70 75 74  e %d-byte output
36050 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
36060 20 20 20 20 20 20 20 73 7a 43 68 6e 67 29 3b 0a         szChng);.
36070 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
36080 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
36090 43 68 6e 67 29 3b 0a 20 20 20 20 20 20 20 20 66  Chng);.        f
360a0 63 6c 6f 73 65 28 6f 75 74 29 3b 0a 20 20 20 20  close(out);.    
360b0 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 0a 0a 20    }.    }else.. 
360c0 20 20 20 2f 2a 20 2e 73 65 73 73 69 6f 6e 20 63     /* .session c
360d0 6c 6f 73 65 0a 20 20 20 20 2a 2a 20 43 6c 6f 73  lose.    ** Clos
360e0 65 20 74 68 65 20 69 64 65 6e 74 69 66 69 65 64  e the identified
360f0 20 73 65 73 73 69 6f 6e 0a 20 20 20 20 2a 2f 0a   session.    */.
36100 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 61      if( strcmp(a
36110 7a 43 6d 64 5b 30 5d 2c 20 22 63 6c 6f 73 65 22  zCmd[0], "close"
36120 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66  )==0 ){.      if
36130 28 20 6e 43 6d 64 21 3d 31 20 29 20 67 6f 74 6f  ( nCmd!=1 ) goto
36140 20 73 65 73 73 69 6f 6e 5f 73 79 6e 74 61 78 5f   session_syntax_
36150 65 72 72 6f 72 3b 0a 20 20 20 20 20 20 69 66 28  error;.      if(
36160 20 70 2d 3e 6e 53 65 73 73 69 6f 6e 20 29 7b 0a   p->nSession ){.
36170 20 20 20 20 20 20 20 20 73 65 73 73 69 6f 6e 5f          session_
36180 63 6c 6f 73 65 28 70 53 65 73 73 69 6f 6e 29 3b  close(pSession);
36190 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 53 65 73  .        p->aSes
361a0 73 69 6f 6e 5b 69 53 65 73 5d 20 3d 20 70 2d 3e  sion[iSes] = p->
361b0 61 53 65 73 73 69 6f 6e 5b 2d 2d 70 2d 3e 6e 53  aSession[--p->nS
361c0 65 73 73 69 6f 6e 5d 3b 0a 20 20 20 20 20 20 7d  ession];.      }
361d0 0a 20 20 20 20 7d 65 6c 73 65 0a 0a 20 20 20 20  .    }else..    
361e0 2f 2a 20 2e 73 65 73 73 69 6f 6e 20 65 6e 61 62  /* .session enab
361f0 6c 65 20 3f 42 4f 4f 4c 45 41 4e 3f 0a 20 20 20  le ?BOOLEAN?.   
36200 20 2a 2a 20 51 75 65 72 79 20 6f 72 20 73 65 74   ** Query or set
36210 20 74 68 65 20 65 6e 61 62 6c 65 20 66 6c 61 67   the enable flag
36220 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
36230 73 74 72 63 6d 70 28 61 7a 43 6d 64 5b 30 5d 2c  strcmp(azCmd[0],
36240 20 22 65 6e 61 62 6c 65 22 29 3d 3d 30 20 29 7b   "enable")==0 ){
36250 0a 20 20 20 20 20 20 69 6e 74 20 69 69 3b 0a 20  .      int ii;. 
36260 20 20 20 20 20 69 66 28 20 6e 43 6d 64 3e 32 20       if( nCmd>2 
36270 29 20 67 6f 74 6f 20 73 65 73 73 69 6f 6e 5f 73  ) goto session_s
36280 79 6e 74 61 78 5f 65 72 72 6f 72 3b 0a 20 20 20  yntax_error;.   
36290 20 20 20 69 69 20 3d 20 6e 43 6d 64 3d 3d 31 20     ii = nCmd==1 
362a0 3f 20 2d 31 20 3a 20 62 6f 6f 6c 65 61 6e 56 61  ? -1 : booleanVa
362b0 6c 75 65 28 61 7a 43 6d 64 5b 31 5d 29 3b 0a 20  lue(azCmd[1]);. 
362c0 20 20 20 20 20 69 66 28 20 70 2d 3e 6e 53 65 73       if( p->nSes
362d0 73 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  sion ){.        
362e0 69 69 20 3d 20 73 71 6c 69 74 65 33 73 65 73 73  ii = sqlite3sess
362f0 69 6f 6e 5f 65 6e 61 62 6c 65 28 70 53 65 73 73  ion_enable(pSess
36300 69 6f 6e 2d 3e 70 2c 20 69 69 29 3b 0a 20 20 20  ion->p, ii);.   
36310 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
36320 28 70 2d 3e 6f 75 74 2c 20 22 73 65 73 73 69 6f  (p->out, "sessio
36330 6e 20 25 73 20 65 6e 61 62 6c 65 20 66 6c 61 67  n %s enable flag
36340 20 3d 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20   = %d\n",.      
36350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 53                pS
36360 65 73 73 69 6f 6e 2d 3e 7a 4e 61 6d 65 2c 20 69  ession->zName, i
36370 69 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  i);.      }.    
36380 7d 65 6c 73 65 0a 0a 20 20 20 20 2f 2a 20 2e 73  }else..    /* .s
36390 65 73 73 69 6f 6e 20 66 69 6c 74 65 72 20 47 4c  ession filter GL
363a0 4f 42 20 2e 2e 2e 2e 0a 20 20 20 20 2a 2a 20 53  OB .....    ** S
363b0 65 74 20 61 20 6c 69 73 74 20 6f 66 20 47 4c 4f  et a list of GLO
363c0 42 20 70 61 74 74 65 72 6e 73 20 6f 66 20 74 61  B patterns of ta
363d0 62 6c 65 20 6e 61 6d 65 73 20 74 6f 20 62 65 20  ble names to be 
363e0 65 78 63 6c 75 64 65 64 2e 0a 20 20 20 20 2a 2f  excluded..    */
363f0 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28  .    if( strcmp(
36400 61 7a 43 6d 64 5b 30 5d 2c 20 22 66 69 6c 74 65  azCmd[0], "filte
36410 72 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  r")==0 ){.      
36420 69 6e 74 20 69 69 2c 20 6e 42 79 74 65 3b 0a 20  int ii, nByte;. 
36430 20 20 20 20 20 69 66 28 20 6e 43 6d 64 3c 32 20       if( nCmd<2 
36440 29 20 67 6f 74 6f 20 73 65 73 73 69 6f 6e 5f 73  ) goto session_s
36450 79 6e 74 61 78 5f 65 72 72 6f 72 3b 0a 20 20 20  yntax_error;.   
36460 20 20 20 69 66 28 20 70 2d 3e 6e 53 65 73 73 69     if( p->nSessi
36470 6f 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6f  on ){.        fo
36480 72 28 69 69 3d 30 3b 20 69 69 3c 70 53 65 73 73  r(ii=0; ii<pSess
36490 69 6f 6e 2d 3e 6e 46 69 6c 74 65 72 3b 20 69 69  ion->nFilter; ii
364a0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  ++){.          s
364b0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 53 65 73  qlite3_free(pSes
364c0 73 69 6f 6e 2d 3e 61 7a 46 69 6c 74 65 72 5b 69  sion->azFilter[i
364d0 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  i]);.        }. 
364e0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
364f0 72 65 65 28 70 53 65 73 73 69 6f 6e 2d 3e 61 7a  ree(pSession->az
36500 46 69 6c 74 65 72 29 3b 0a 20 20 20 20 20 20 20  Filter);.       
36510 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28   nByte = sizeof(
36520 70 53 65 73 73 69 6f 6e 2d 3e 61 7a 46 69 6c 74  pSession->azFilt
36530 65 72 5b 30 5d 29 2a 28 6e 43 6d 64 2d 31 29 3b  er[0])*(nCmd-1);
36540 0a 20 20 20 20 20 20 20 20 70 53 65 73 73 69 6f  .        pSessio
36550 6e 2d 3e 61 7a 46 69 6c 74 65 72 20 3d 20 73 71  n->azFilter = sq
36560 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 6e 42  lite3_malloc( nB
36570 79 74 65 20 29 3b 0a 20 20 20 20 20 20 20 20 69  yte );.        i
36580 66 28 20 70 53 65 73 73 69 6f 6e 2d 3e 61 7a 46  f( pSession->azF
36590 69 6c 74 65 72 3d 3d 30 20 29 7b 0a 20 20 20 20  ilter==0 ){.    
365a0 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
365b0 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a  (stderr, "Error:
365c0 20 6f 75 74 20 6f 72 20 6d 65 6d 6f 72 79 5c 6e   out or memory\n
365d0 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 65 78  ");.          ex
365e0 69 74 28 31 29 3b 0a 20 20 20 20 20 20 20 20 7d  it(1);.        }
365f0 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 69 3d  .        for(ii=
36600 31 3b 20 69 69 3c 6e 43 6d 64 3b 20 69 69 2b 2b  1; ii<nCmd; ii++
36610 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 53 65  ){.          pSe
36620 73 73 69 6f 6e 2d 3e 61 7a 46 69 6c 74 65 72 5b  ssion->azFilter[
36630 69 69 2d 31 5d 20 3d 20 73 71 6c 69 74 65 33 5f  ii-1] = sqlite3_
36640 6d 70 72 69 6e 74 66 28 22 25 73 22 2c 20 61 7a  mprintf("%s", az
36650 43 6d 64 5b 69 69 5d 29 3b 0a 20 20 20 20 20 20  Cmd[ii]);.      
36660 20 20 7d 0a 20 20 20 20 20 20 20 20 70 53 65 73    }.        pSes
36670 73 69 6f 6e 2d 3e 6e 46 69 6c 74 65 72 20 3d 20  sion->nFilter = 
36680 69 69 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ii-1;.      }.  
36690 20 20 7d 65 6c 73 65 0a 0a 20 20 20 20 2f 2a 20    }else..    /* 
366a0 2e 73 65 73 73 69 6f 6e 20 69 6e 64 69 72 65 63  .session indirec
366b0 74 20 3f 42 4f 4f 4c 45 41 4e 3f 0a 20 20 20 20  t ?BOOLEAN?.    
366c0 2a 2a 20 51 75 65 72 79 20 6f 72 20 73 65 74 20  ** Query or set 
366d0 74 68 65 20 69 6e 64 69 72 65 63 74 20 66 6c 61  the indirect fla
366e0 67 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  g.    */.    if(
366f0 20 73 74 72 63 6d 70 28 61 7a 43 6d 64 5b 30 5d   strcmp(azCmd[0]
36700 2c 20 22 69 6e 64 69 72 65 63 74 22 29 3d 3d 30  , "indirect")==0
36710 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 69   ){.      int ii
36720 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 43 6d 64  ;.      if( nCmd
36730 3e 32 20 29 20 67 6f 74 6f 20 73 65 73 73 69 6f  >2 ) goto sessio
36740 6e 5f 73 79 6e 74 61 78 5f 65 72 72 6f 72 3b 0a  n_syntax_error;.
36750 20 20 20 20 20 20 69 69 20 3d 20 6e 43 6d 64 3d        ii = nCmd=
36760 3d 31 20 3f 20 2d 31 20 3a 20 62 6f 6f 6c 65 61  =1 ? -1 : boolea
36770 6e 56 61 6c 75 65 28 61 7a 43 6d 64 5b 31 5d 29  nValue(azCmd[1])
36780 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6e  ;.      if( p->n
36790 53 65 73 73 69 6f 6e 20 29 7b 0a 20 20 20 20 20  Session ){.     
367a0 20 20 20 69 69 20 3d 20 73 71 6c 69 74 65 33 73     ii = sqlite3s
367b0 65 73 73 69 6f 6e 5f 69 6e 64 69 72 65 63 74 28  ession_indirect(
367c0 70 53 65 73 73 69 6f 6e 2d 3e 70 2c 20 69 69 29  pSession->p, ii)
367d0 3b 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70  ;.        utf8_p
367e0 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 73  rintf(p->out, "s
367f0 65 73 73 69 6f 6e 20 25 73 20 69 6e 64 69 72 65  ession %s indire
36800 63 74 20 66 6c 61 67 20 3d 20 25 64 5c 6e 22 2c  ct flag = %d\n",
36810 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
36820 20 20 20 20 20 70 53 65 73 73 69 6f 6e 2d 3e 7a       pSession->z
36830 4e 61 6d 65 2c 20 69 69 29 3b 0a 20 20 20 20 20  Name, ii);.     
36840 20 7d 0a 20 20 20 20 7d 65 6c 73 65 0a 0a 20 20   }.    }else..  
36850 20 20 2f 2a 20 2e 73 65 73 73 69 6f 6e 20 69 73    /* .session is
36860 65 6d 70 74 79 0a 20 20 20 20 2a 2a 20 44 65 74  empty.    ** Det
36870 65 72 6d 69 6e 65 20 69 66 20 74 68 65 20 73 65  ermine if the se
36880 73 73 69 6f 6e 20 69 73 20 65 6d 70 74 79 0a 20  ssion is empty. 
36890 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 74     */.    if( st
368a0 72 63 6d 70 28 61 7a 43 6d 64 5b 30 5d 2c 20 22  rcmp(azCmd[0], "
368b0 69 73 65 6d 70 74 79 22 29 3d 3d 30 20 29 7b 0a  isempty")==0 ){.
368c0 20 20 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20        int ii;.  
368d0 20 20 20 20 69 66 28 20 6e 43 6d 64 21 3d 31 20      if( nCmd!=1 
368e0 29 20 67 6f 74 6f 20 73 65 73 73 69 6f 6e 5f 73  ) goto session_s
368f0 79 6e 74 61 78 5f 65 72 72 6f 72 3b 0a 20 20 20  yntax_error;.   
36900 20 20 20 69 66 28 20 70 2d 3e 6e 53 65 73 73 69     if( p->nSessi
36910 6f 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 69 69  on ){.        ii
36920 20 3d 20 73 71 6c 69 74 65 33 73 65 73 73 69 6f   = sqlite3sessio
36930 6e 5f 69 73 65 6d 70 74 79 28 70 53 65 73 73 69  n_isempty(pSessi
36940 6f 6e 2d 3e 70 29 3b 0a 20 20 20 20 20 20 20 20  on->p);.        
36950 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f  utf8_printf(p->o
36960 75 74 2c 20 22 73 65 73 73 69 6f 6e 20 25 73 20  ut, "session %s 
36970 69 73 65 6d 70 74 79 20 66 6c 61 67 20 3d 20 25  isempty flag = %
36980 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  d\n",.          
36990 20 20 20 20 20 20 20 20 20 20 70 53 65 73 73 69            pSessi
369a0 6f 6e 2d 3e 7a 4e 61 6d 65 2c 20 69 69 29 3b 0a  on->zName, ii);.
369b0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
369c0 65 0a 0a 20 20 20 20 2f 2a 20 2e 73 65 73 73 69  e..    /* .sessi
369d0 6f 6e 20 6c 69 73 74 0a 20 20 20 20 2a 2a 20 4c  on list.    ** L
369e0 69 73 74 20 61 6c 6c 20 63 75 72 72 65 6e 74 6c  ist all currentl
369f0 79 20 6f 70 65 6e 20 73 65 73 73 69 6f 6e 73 0a  y open sessions.
36a00 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73      */.    if( s
36a10 74 72 63 6d 70 28 61 7a 43 6d 64 5b 30 5d 2c 22  trcmp(azCmd[0],"
36a20 6c 69 73 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20  list")==0 ){.   
36a30 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d     for(i=0; i<p-
36a40 3e 6e 53 65 73 73 69 6f 6e 3b 20 69 2b 2b 29 7b  >nSession; i++){
36a50 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72  .        utf8_pr
36a60 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 64  intf(p->out, "%d
36a70 20 25 73 5c 6e 22 2c 20 69 2c 20 70 2d 3e 61 53   %s\n", i, p->aS
36a80 65 73 73 69 6f 6e 5b 69 5d 2e 7a 4e 61 6d 65 29  ession[i].zName)
36a90 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
36aa0 6c 73 65 0a 0a 20 20 20 20 2f 2a 20 2e 73 65 73  lse..    /* .ses
36ab0 73 69 6f 6e 20 6f 70 65 6e 20 44 42 20 4e 41 4d  sion open DB NAM
36ac0 45 0a 20 20 20 20 2a 2a 20 4f 70 65 6e 20 61 20  E.    ** Open a 
36ad0 6e 65 77 20 73 65 73 73 69 6f 6e 20 63 61 6c 6c  new session call
36ae0 65 64 20 4e 41 4d 45 20 6f 6e 20 74 68 65 20 61  ed NAME on the a
36af0 74 74 61 63 68 65 64 20 64 61 74 61 62 61 73 65  ttached database
36b00 20 44 42 2e 0a 20 20 20 20 2a 2a 20 44 42 20 69   DB..    ** DB i
36b10 73 20 6e 6f 72 6d 61 6c 6c 79 20 22 6d 61 69 6e  s normally "main
36b20 22 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  "..    */.    if
36b30 28 20 73 74 72 63 6d 70 28 61 7a 43 6d 64 5b 30  ( strcmp(azCmd[0
36b40 5d 2c 22 6f 70 65 6e 22 29 3d 3d 30 20 29 7b 0a  ],"open")==0 ){.
36b50 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d        char *zNam
36b60 65 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 43 6d  e;.      if( nCm
36b70 64 21 3d 33 20 29 20 67 6f 74 6f 20 73 65 73 73  d!=3 ) goto sess
36b80 69 6f 6e 5f 73 79 6e 74 61 78 5f 65 72 72 6f 72  ion_syntax_error
36b90 3b 0a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20  ;.      zName = 
36ba0 61 7a 43 6d 64 5b 32 5d 3b 0a 20 20 20 20 20 20  azCmd[2];.      
36bb0 69 66 28 20 7a 4e 61 6d 65 5b 30 5d 3d 3d 30 20  if( zName[0]==0 
36bc0 29 20 67 6f 74 6f 20 73 65 73 73 69 6f 6e 5f 73  ) goto session_s
36bd0 79 6e 74 61 78 5f 65 72 72 6f 72 3b 0a 20 20 20  yntax_error;.   
36be0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d     for(i=0; i<p-
36bf0 3e 6e 53 65 73 73 69 6f 6e 3b 20 69 2b 2b 29 7b  >nSession; i++){
36c00 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 74 72  .        if( str
36c10 63 6d 70 28 70 2d 3e 61 53 65 73 73 69 6f 6e 5b  cmp(p->aSession[
36c20 69 5d 2e 7a 4e 61 6d 65 2c 7a 4e 61 6d 65 29 3d  i].zName,zName)=
36c30 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
36c40 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65  utf8_printf(stde
36c50 72 72 2c 20 22 53 65 73 73 69 6f 6e 20 5c 22 25  rr, "Session \"%
36c60 73 5c 22 20 61 6c 72 65 61 64 79 20 65 78 69 73  s\" already exis
36c70 74 73 5c 6e 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20  ts\n", zName);. 
36c80 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 65           goto me
36c90 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b  ta_command_exit;
36ca0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
36cb0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e   }.      if( p->
36cc0 6e 53 65 73 73 69 6f 6e 3e 3d 41 72 72 61 79 53  nSession>=ArrayS
36cd0 69 7a 65 28 70 2d 3e 61 53 65 73 73 69 6f 6e 29  ize(p->aSession)
36ce0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 61 77 5f   ){.        raw_
36cf0 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
36d00 4d 61 78 69 6d 75 6d 20 6f 66 20 25 64 20 73 65  Maximum of %d se
36d10 73 73 69 6f 6e 73 5c 6e 22 2c 20 41 72 72 61 79  ssions\n", Array
36d20 53 69 7a 65 28 70 2d 3e 61 53 65 73 73 69 6f 6e  Size(p->aSession
36d30 29 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f  ));.        goto
36d40 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78   meta_command_ex
36d50 69 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  it;.      }.    
36d60 20 20 70 53 65 73 73 69 6f 6e 20 3d 20 26 70 2d    pSession = &p-
36d70 3e 61 53 65 73 73 69 6f 6e 5b 70 2d 3e 6e 53 65  >aSession[p->nSe
36d80 73 73 69 6f 6e 5d 3b 0a 20 20 20 20 20 20 72 63  ssion];.      rc
36d90 20 3d 20 73 71 6c 69 74 65 33 73 65 73 73 69 6f   = sqlite3sessio
36da0 6e 5f 63 72 65 61 74 65 28 70 2d 3e 64 62 2c 20  n_create(p->db, 
36db0 61 7a 43 6d 64 5b 31 5d 2c 20 26 70 53 65 73 73  azCmd[1], &pSess
36dc0 69 6f 6e 2d 3e 70 29 3b 0a 20 20 20 20 20 20 69  ion->p);.      i
36dd0 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
36de0 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65   raw_printf(stde
36df0 72 72 2c 20 22 43 61 6e 6e 6f 74 20 6f 70 65 6e  rr, "Cannot open
36e00 20 73 65 73 73 69 6f 6e 3a 20 65 72 72 6f 72 20   session: error 
36e10 63 6f 64 65 3d 25 64 5c 6e 22 2c 20 72 63 29 3b  code=%d\n", rc);
36e20 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 30 3b  .        rc = 0;
36e30 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 65  .        goto me
36e40 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b  ta_command_exit;
36e50 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
36e60 53 65 73 73 69 6f 6e 2d 3e 6e 46 69 6c 74 65 72  Session->nFilter
36e70 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 71 6c 69   = 0;.      sqli
36e80 74 65 33 73 65 73 73 69 6f 6e 5f 74 61 62 6c 65  te3session_table
36e90 5f 66 69 6c 74 65 72 28 70 53 65 73 73 69 6f 6e  _filter(pSession
36ea0 2d 3e 70 2c 20 73 65 73 73 69 6f 6e 5f 66 69 6c  ->p, session_fil
36eb0 74 65 72 2c 20 70 53 65 73 73 69 6f 6e 29 3b 0a  ter, pSession);.
36ec0 20 20 20 20 20 20 70 2d 3e 6e 53 65 73 73 69 6f        p->nSessio
36ed0 6e 2b 2b 3b 0a 20 20 20 20 20 20 70 53 65 73 73  n++;.      pSess
36ee0 69 6f 6e 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c  ion->zName = sql
36ef0 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73  ite3_mprintf("%s
36f00 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d  ", zName);.    }
36f10 65 6c 73 65 0a 20 20 20 20 2f 2a 20 49 66 20 6e  else.    /* If n
36f20 6f 20 63 6f 6d 6d 61 6e 64 20 6e 61 6d 65 20 6d  o command name m
36f30 61 74 63 68 65 73 2c 20 73 68 6f 77 20 61 20 73  atches, show a s
36f40 79 6e 74 61 78 20 65 72 72 6f 72 20 2a 2f 0a 20  yntax error */. 
36f50 20 20 20 73 65 73 73 69 6f 6e 5f 73 79 6e 74 61     session_synta
36f60 78 5f 65 72 72 6f 72 3a 0a 20 20 20 20 73 68 6f  x_error:.    sho
36f70 77 48 65 6c 70 28 70 2d 3e 6f 75 74 2c 20 22 73  wHelp(p->out, "s
36f80 65 73 73 69 6f 6e 22 29 3b 0a 20 20 7d 65 6c 73  ession");.  }els
36f90 65 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66  e.#endif..#ifdef
36fa0 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
36fb0 2f 2a 20 55 6e 64 6f 63 75 6d 65 6e 74 65 64 20  /* Undocumented 
36fc0 63 6f 6d 6d 61 6e 64 73 20 66 6f 72 20 69 6e 74  commands for int
36fd0 65 72 6e 61 6c 20 74 65 73 74 69 6e 67 2e 20 20  ernal testing.  
36fe0 53 75 62 6a 65 63 74 20 74 6f 20 63 68 61 6e 67  Subject to chang
36ff0 65 0a 20 20 2a 2a 20 77 69 74 68 6f 75 74 20 6e  e.  ** without n
37000 6f 74 69 63 65 2e 20 2a 2f 0a 20 20 69 66 28 20  otice. */.  if( 
37010 63 3d 3d 27 73 27 20 26 26 20 6e 3e 3d 31 30 20  c=='s' && n>=10 
37020 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67  && strncmp(azArg
37030 5b 30 5d 2c 20 22 73 65 6c 66 74 65 73 74 2d 22  [0], "selftest-"
37040 2c 20 39 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69  , 9)==0 ){.    i
37050 66 28 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67  f( strncmp(azArg
37060 5b 30 5d 2b 39 2c 20 22 62 6f 6f 6c 65 61 6e 22  [0]+9, "boolean"
37070 2c 20 6e 2d 39 29 3d 3d 30 20 29 7b 0a 20 20 20  , n-9)==0 ){.   
37080 20 20 20 69 6e 74 20 69 2c 20 76 3b 0a 20 20 20     int i, v;.   
37090 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 41     for(i=1; i<nA
370a0 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  rg; i++){.      
370b0 20 20 76 20 3d 20 62 6f 6f 6c 65 61 6e 56 61 6c    v = booleanVal
370c0 75 65 28 61 7a 41 72 67 5b 69 5d 29 3b 0a 20 20  ue(azArg[i]);.  
370d0 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
370e0 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 3a 20 25  f(p->out, "%s: %
370f0 64 20 30 78 25 78 5c 6e 22 2c 20 61 7a 41 72 67  d 0x%x\n", azArg
37100 5b 69 5d 2c 20 76 2c 20 76 29 3b 0a 20 20 20 20  [i], v, v);.    
37110 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
37120 28 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b  ( strncmp(azArg[
37130 30 5d 2b 39 2c 20 22 69 6e 74 65 67 65 72 22 2c  0]+9, "integer",
37140 20 6e 2d 39 29 3d 3d 30 20 29 7b 0a 20 20 20 20   n-9)==0 ){.    
37150 20 20 69 6e 74 20 69 3b 20 73 71 6c 69 74 65 33    int i; sqlite3
37160 5f 69 6e 74 36 34 20 76 3b 0a 20 20 20 20 20 20  _int64 v;.      
37170 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 41 72 67 3b  for(i=1; i<nArg;
37180 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63   i++){.        c
37190 68 61 72 20 7a 42 75 66 5b 32 30 30 5d 3b 0a 20  har zBuf[200];. 
371a0 20 20 20 20 20 20 20 76 20 3d 20 69 6e 74 65 67         v = integ
371b0 65 72 56 61 6c 75 65 28 61 7a 41 72 67 5b 69 5d  erValue(azArg[i]
371c0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
371d0 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
371e0 6f 66 28 7a 42 75 66 29 2c 7a 42 75 66 2c 22 25  of(zBuf),zBuf,"%
371f0 73 3a 20 25 6c 6c 64 20 30 78 25 6c 6c 78 5c 6e  s: %lld 0x%llx\n
37200 22 2c 20 61 7a 41 72 67 5b 69 5d 2c 76 2c 76 29  ", azArg[i],v,v)
37210 3b 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70  ;.        utf8_p
37220 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25  rintf(p->out, "%
37230 73 22 2c 20 7a 42 75 66 29 3b 0a 20 20 20 20 20  s", zBuf);.     
37240 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65   }.    }.  }else
37250 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 63  .#endif..  if( c
37260 3d 3d 27 73 27 20 26 26 20 6e 3e 3d 34 20 26 26  =='s' && n>=4 &&
37270 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30   strncmp(azArg[0
37280 5d 2c 22 73 65 6c 66 74 65 73 74 22 2c 6e 29 3d  ],"selftest",n)=
37290 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 62 49  =0 ){.    int bI
372a0 73 49 6e 69 74 20 3d 20 30 3b 20 20 20 20 20 20  sInit = 0;      
372b0 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 69 6e     /* True to in
372c0 69 74 69 61 6c 69 7a 65 20 74 68 65 20 53 45 4c  itialize the SEL
372d0 46 54 45 53 54 20 74 61 62 6c 65 20 2a 2f 0a 20  FTEST table */. 
372e0 20 20 20 69 6e 74 20 62 56 65 72 62 6f 73 65 20     int bVerbose 
372f0 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 56  = 0;        /* V
37300 65 72 62 6f 73 65 20 6f 75 74 70 75 74 20 2a 2f  erbose output */
37310 0a 20 20 20 20 69 6e 74 20 62 53 65 6c 66 74 65  .    int bSelfte
37320 73 74 45 78 69 73 74 73 3b 20 20 20 20 20 2f 2a  stExists;     /*
37330 20 54 72 75 65 20 69 66 20 53 45 4c 46 54 45 53   True if SELFTES
37340 54 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73  T already exists
37350 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 2c 20 6b   */.    int i, k
37360 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
37370 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
37380 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 54 65  s */.    int nTe
37390 73 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  st = 0;         
373a0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74    /* Number of t
373b0 65 73 74 73 20 72 75 6e 73 20 2a 2f 0a 20 20 20  ests runs */.   
373c0 20 69 6e 74 20 6e 45 72 72 20 3d 20 30 3b 20 20   int nErr = 0;  
373d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
373e0 62 65 72 20 6f 66 20 65 72 72 6f 72 73 20 73 65  ber of errors se
373f0 65 6e 20 2a 2f 0a 20 20 20 20 53 68 65 6c 6c 54  en */.    ShellT
37400 65 78 74 20 73 74 72 3b 20 20 20 20 20 20 20 20  ext str;        
37410 20 20 20 2f 2a 20 41 6e 73 77 65 72 20 66 6f 72     /* Answer for
37420 20 61 20 71 75 65 72 79 20 2a 2f 0a 20 20 20 20   a query */.    
37430 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
37440 74 6d 74 20 3d 20 30 3b 20 2f 2a 20 51 75 65 72  tmt = 0; /* Quer
37450 79 20 61 67 61 69 6e 73 74 20 74 68 65 20 53 45  y against the SE
37460 4c 46 54 45 53 54 20 74 61 62 6c 65 20 2a 2f 0a  LFTEST table */.
37470 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28 70 2c 30  .    open_db(p,0
37480 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20  );.    for(i=1; 
37490 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20  i<nArg; i++){.  
374a0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
374b0 7a 20 3d 20 61 7a 41 72 67 5b 69 5d 3b 0a 20 20  z = azArg[i];.  
374c0 20 20 20 20 69 66 28 20 7a 5b 30 5d 3d 3d 27 2d      if( z[0]=='-
374d0 27 20 26 26 20 7a 5b 31 5d 3d 3d 27 2d 27 20 29  ' && z[1]=='-' )
374e0 20 7a 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20   z++;.      if( 
374f0 73 74 72 63 6d 70 28 7a 2c 22 2d 69 6e 69 74 22  strcmp(z,"-init"
37500 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
37510 62 49 73 49 6e 69 74 20 3d 20 31 3b 0a 20 20 20  bIsInit = 1;.   
37520 20 20 20 7d 65 6c 73 65 0a 20 20 20 20 20 20 69     }else.      i
37530 66 28 20 73 74 72 63 6d 70 28 7a 2c 22 2d 76 22  f( strcmp(z,"-v"
37540 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
37550 62 56 65 72 62 6f 73 65 2b 2b 3b 0a 20 20 20 20  bVerbose++;.    
37560 20 20 7d 65 6c 73 65 0a 20 20 20 20 20 20 7b 0a    }else.      {.
37570 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69          utf8_pri
37580 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55 6e 6b  ntf(stderr, "Unk
37590 6e 6f 77 6e 20 6f 70 74 69 6f 6e 20 5c 22 25 73  nown option \"%s
375a0 5c 22 20 6f 6e 20 5c 22 25 73 5c 22 5c 6e 22 2c  \" on \"%s\"\n",
375b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
375c0 20 20 20 20 20 61 7a 41 72 67 5b 69 5d 2c 20 61       azArg[i], a
375d0 7a 41 72 67 5b 30 5d 29 3b 0a 20 20 20 20 20 20  zArg[0]);.      
375e0 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64    raw_printf(std
375f0 65 72 72 2c 20 22 53 68 6f 75 6c 64 20 62 65 20  err, "Should be 
37600 6f 6e 65 20 6f 66 3a 20 2d 2d 69 6e 69 74 20 2d  one of: --init -
37610 76 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 72  v\n");.        r
37620 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 67  c = 1;.        g
37630 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64  oto meta_command
37640 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 7d 0a 20  _exit;.      }. 
37650 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c     }.    if( sql
37660 69 74 65 33 5f 74 61 62 6c 65 5f 63 6f 6c 75 6d  ite3_table_colum
37670 6e 5f 6d 65 74 61 64 61 74 61 28 70 2d 3e 64 62  n_metadata(p->db
37680 2c 22 6d 61 69 6e 22 2c 22 73 65 6c 66 74 65 73  ,"main","selftes
37690 74 22 2c 30 2c 30 2c 30 2c 30 2c 30 2c 30 29 0a  t",0,0,0,0,0,0).
376a0 20 20 20 20 20 20 20 20 20 20 20 21 3d 20 53 51             != SQ
376b0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
376c0 20 62 53 65 6c 66 74 65 73 74 45 78 69 73 74 73   bSelftestExists
376d0 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 0;.    }else{
376e0 0a 20 20 20 20 20 20 62 53 65 6c 66 74 65 73 74  .      bSelftest
376f0 45 78 69 73 74 73 20 3d 20 31 3b 0a 20 20 20 20  Exists = 1;.    
37700 7d 0a 20 20 20 20 69 66 28 20 62 49 73 49 6e 69  }.    if( bIsIni
37710 74 20 29 7b 0a 20 20 20 20 20 20 63 72 65 61 74  t ){.      creat
37720 65 53 65 6c 66 74 65 73 74 54 61 62 6c 65 28 70  eSelftestTable(p
37730 29 3b 0a 20 20 20 20 20 20 62 53 65 6c 66 74 65  );.      bSelfte
37740 73 74 45 78 69 73 74 73 20 3d 20 31 3b 0a 20 20  stExists = 1;.  
37750 20 20 7d 0a 20 20 20 20 69 6e 69 74 54 65 78 74    }.    initText
37760 28 26 73 74 72 29 3b 0a 20 20 20 20 61 70 70 65  (&str);.    appe
37770 6e 64 54 65 78 74 28 26 73 74 72 2c 20 22 78 22  ndText(&str, "x"
37780 2c 20 30 29 3b 0a 20 20 20 20 66 6f 72 28 6b 3d  , 0);.    for(k=
37790 62 53 65 6c 66 74 65 73 74 45 78 69 73 74 73 3b  bSelftestExists;
377a0 20 6b 3e 3d 30 3b 20 6b 2d 2d 29 7b 0a 20 20 20   k>=0; k--){.   
3