/ Hex Artifact Content
Login

Artifact 2e72b9dc9dabde7e1d26142bf1080dfbc182ac1bf9431f85307b5931062a041b:


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: 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 4d 49 4e  if defined(__MIN
08b0: 47 57 33 32 5f 5f 29 0a 23 20 20 64 65 66 69 6e  GW32__).#  defin
08c0: 65 20 44 49 52 45 4e 54 20 64 69 72 65 6e 74 0a  e DIRENT dirent.
08d0: 23 20 20 69 66 6e 64 65 66 20 53 5f 49 53 4c 4e  #  ifndef S_ISLN
08e0: 4b 0a 23 20 20 20 64 65 66 69 6e 65 20 53 5f 49  K.#   define S_I
08f0: 53 4c 4e 4b 28 6d 6f 64 65 29 20 28 30 29 0a 23  SLNK(mode) (0).#
0900: 20 20 65 6e 64 69 66 0a 23 20 65 6e 64 69 66 0a    endif.# endif.
0910: 23 65 6e 64 69 66 0a 23 69 6e 63 6c 75 64 65 20  #endif.#include 
0920: 3c 73 79 73 2f 74 79 70 65 73 2e 68 3e 0a 23 69  <sys/types.h>.#i
0930: 6e 63 6c 75 64 65 20 3c 73 79 73 2f 73 74 61 74  nclude <sys/stat
0940: 2e 68 3e 0a 0a 23 69 66 20 48 41 56 45 5f 52 45  .h>..#if HAVE_RE
0950: 41 44 4c 49 4e 45 0a 23 20 69 6e 63 6c 75 64 65  ADLINE.# include
0960: 20 3c 72 65 61 64 6c 69 6e 65 2f 72 65 61 64 6c   <readline/readl
0970: 69 6e 65 2e 68 3e 0a 23 20 69 6e 63 6c 75 64 65  ine.h>.# include
0980: 20 3c 72 65 61 64 6c 69 6e 65 2f 68 69 73 74 6f   <readline/histo
0990: 72 79 2e 68 3e 0a 23 65 6e 64 69 66 0a 0a 23 69  ry.h>.#endif..#i
09a0: 66 20 48 41 56 45 5f 45 44 49 54 4c 49 4e 45 0a  f HAVE_EDITLINE.
09b0: 23 20 69 6e 63 6c 75 64 65 20 3c 65 64 69 74 6c  # include <editl
09c0: 69 6e 65 2f 72 65 61 64 6c 69 6e 65 2e 68 3e 0a  ine/readline.h>.
09d0: 23 65 6e 64 69 66 0a 0a 23 69 66 20 48 41 56 45  #endif..#if HAVE
09e0: 5f 45 44 49 54 4c 49 4e 45 20 7c 7c 20 48 41 56  _EDITLINE || HAV
09f0: 45 5f 52 45 41 44 4c 49 4e 45 0a 0a 23 20 64 65  E_READLINE..# de
0a00: 66 69 6e 65 20 73 68 65 6c 6c 5f 61 64 64 5f 68  fine shell_add_h
0a10: 69 73 74 6f 72 79 28 58 29 20 61 64 64 5f 68 69  istory(X) add_hi
0a20: 73 74 6f 72 79 28 58 29 0a 23 20 64 65 66 69 6e  story(X).# defin
0a30: 65 20 73 68 65 6c 6c 5f 72 65 61 64 5f 68 69 73  e shell_read_his
0a40: 74 6f 72 79 28 58 29 20 72 65 61 64 5f 68 69 73  tory(X) read_his
0a50: 74 6f 72 79 28 58 29 0a 23 20 64 65 66 69 6e 65  tory(X).# define
0a60: 20 73 68 65 6c 6c 5f 77 72 69 74 65 5f 68 69 73   shell_write_his
0a70: 74 6f 72 79 28 58 29 20 77 72 69 74 65 5f 68 69  tory(X) write_hi
0a80: 73 74 6f 72 79 28 58 29 0a 23 20 64 65 66 69 6e  story(X).# defin
0a90: 65 20 73 68 65 6c 6c 5f 73 74 69 66 6c 65 5f 68  e shell_stifle_h
0aa0: 69 73 74 6f 72 79 28 58 29 20 73 74 69 66 6c 65  istory(X) stifle
0ab0: 5f 68 69 73 74 6f 72 79 28 58 29 0a 23 20 64 65  _history(X).# de
0ac0: 66 69 6e 65 20 73 68 65 6c 6c 5f 72 65 61 64 6c  fine shell_readl
0ad0: 69 6e 65 28 58 29 20 72 65 61 64 6c 69 6e 65 28  ine(X) readline(
0ae0: 58 29 0a 0a 23 65 6c 69 66 20 48 41 56 45 5f 4c  X)..#elif HAVE_L
0af0: 49 4e 45 4e 4f 49 53 45 0a 0a 23 20 69 6e 63 6c  INENOISE..# incl
0b00: 75 64 65 20 22 6c 69 6e 65 6e 6f 69 73 65 2e 68  ude "linenoise.h
0b10: 22 0a 23 20 64 65 66 69 6e 65 20 73 68 65 6c 6c  ".# define shell
0b20: 5f 61 64 64 5f 68 69 73 74 6f 72 79 28 58 29 20  _add_history(X) 
0b30: 6c 69 6e 65 6e 6f 69 73 65 48 69 73 74 6f 72 79  linenoiseHistory
0b40: 41 64 64 28 58 29 0a 23 20 64 65 66 69 6e 65 20  Add(X).# define 
0b50: 73 68 65 6c 6c 5f 72 65 61 64 5f 68 69 73 74 6f  shell_read_histo
0b60: 72 79 28 58 29 20 6c 69 6e 65 6e 6f 69 73 65 48  ry(X) linenoiseH
0b70: 69 73 74 6f 72 79 4c 6f 61 64 28 58 29 0a 23 20  istoryLoad(X).# 
0b80: 64 65 66 69 6e 65 20 73 68 65 6c 6c 5f 77 72 69  define shell_wri
0b90: 74 65 5f 68 69 73 74 6f 72 79 28 58 29 20 6c 69  te_history(X) li
0ba0: 6e 65 6e 6f 69 73 65 48 69 73 74 6f 72 79 53 61  nenoiseHistorySa
0bb0: 76 65 28 58 29 0a 23 20 64 65 66 69 6e 65 20 73  ve(X).# define s
0bc0: 68 65 6c 6c 5f 73 74 69 66 6c 65 5f 68 69 73 74  hell_stifle_hist
0bd0: 6f 72 79 28 58 29 20 6c 69 6e 65 6e 6f 69 73 65  ory(X) linenoise
0be0: 48 69 73 74 6f 72 79 53 65 74 4d 61 78 4c 65 6e  HistorySetMaxLen
0bf0: 28 58 29 0a 23 20 64 65 66 69 6e 65 20 73 68 65  (X).# define she
0c00: 6c 6c 5f 72 65 61 64 6c 69 6e 65 28 58 29 20 6c  ll_readline(X) l
0c10: 69 6e 65 6e 6f 69 73 65 28 58 29 0a 0a 23 65 6c  inenoise(X)..#el
0c20: 73 65 0a 0a 23 20 64 65 66 69 6e 65 20 73 68 65  se..# define she
0c30: 6c 6c 5f 72 65 61 64 5f 68 69 73 74 6f 72 79 28  ll_read_history(
0c40: 58 29 0a 23 20 64 65 66 69 6e 65 20 73 68 65 6c  X).# define shel
0c50: 6c 5f 77 72 69 74 65 5f 68 69 73 74 6f 72 79 28  l_write_history(
0c60: 58 29 0a 23 20 64 65 66 69 6e 65 20 73 68 65 6c  X).# define shel
0c70: 6c 5f 73 74 69 66 6c 65 5f 68 69 73 74 6f 72 79  l_stifle_history
0c80: 28 58 29 0a 0a 23 20 64 65 66 69 6e 65 20 53 48  (X)..# define SH
0c90: 45 4c 4c 5f 55 53 45 5f 4c 4f 43 41 4c 5f 47 45  ELL_USE_LOCAL_GE
0ca0: 54 4c 49 4e 45 20 31 0a 23 65 6e 64 69 66 0a 0a  TLINE 1.#endif..
0cb0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 57 49  .#if defined(_WI
0cc0: 4e 33 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  N32) || defined(
0cd0: 57 49 4e 33 32 29 0a 23 20 69 6e 63 6c 75 64 65  WIN32).# include
0ce0: 20 3c 69 6f 2e 68 3e 0a 23 20 69 6e 63 6c 75 64   <io.h>.# includ
0cf0: 65 20 3c 66 63 6e 74 6c 2e 68 3e 0a 23 20 64 65  e <fcntl.h>.# de
0d00: 66 69 6e 65 20 69 73 61 74 74 79 28 68 29 20 5f  fine isatty(h) _
0d10: 69 73 61 74 74 79 28 68 29 0a 23 20 69 66 6e 64  isatty(h).# ifnd
0d20: 65 66 20 61 63 63 65 73 73 0a 23 20 20 64 65 66  ef access.#  def
0d30: 69 6e 65 20 61 63 63 65 73 73 28 66 2c 6d 29 20  ine access(f,m) 
0d40: 5f 61 63 63 65 73 73 28 28 66 29 2c 28 6d 29 29  _access((f),(m))
0d50: 0a 23 20 65 6e 64 69 66 0a 23 20 75 6e 64 65 66  .# endif.# undef
0d60: 20 70 6f 70 65 6e 0a 23 20 64 65 66 69 6e 65 20   popen.# define 
0d70: 70 6f 70 65 6e 20 5f 70 6f 70 65 6e 0a 23 20 75  popen _popen.# u
0d80: 6e 64 65 66 20 70 63 6c 6f 73 65 0a 23 20 64 65  ndef pclose.# de
0d90: 66 69 6e 65 20 70 63 6c 6f 73 65 20 5f 70 63 6c  fine pclose _pcl
0da0: 6f 73 65 0a 23 65 6c 73 65 0a 20 2f 2a 20 4d 61  ose.#else. /* Ma
0db0: 6b 65 20 73 75 72 65 20 69 73 61 74 74 79 28 29  ke sure isatty()
0dc0: 20 68 61 73 20 61 20 70 72 6f 74 6f 74 79 70 65   has a prototype
0dd0: 2e 20 2a 2f 0a 20 65 78 74 65 72 6e 20 69 6e 74  . */. extern int
0de0: 20 69 73 61 74 74 79 28 69 6e 74 29 3b 0a 0a 23   isatty(int);..#
0df0: 20 69 66 20 21 64 65 66 69 6e 65 64 28 5f 5f 52   if !defined(__R
0e00: 54 50 5f 5f 29 20 26 26 20 21 64 65 66 69 6e 65  TP__) && !define
0e10: 64 28 5f 57 52 53 5f 4b 45 52 4e 45 4c 29 0a 20  d(_WRS_KERNEL). 
0e20: 20 2f 2a 20 70 6f 70 65 6e 20 61 6e 64 20 70 63   /* popen and pc
0e30: 6c 6f 73 65 20 61 72 65 20 6e 6f 74 20 43 38 39  lose are not C89
0e40: 20 66 75 6e 63 74 69 6f 6e 73 20 61 6e 64 20 73   functions and s
0e50: 6f 20 61 72 65 0a 20 20 2a 2a 20 73 6f 6d 65 74  o are.  ** somet
0e60: 69 6d 65 73 20 6f 6d 69 74 74 65 64 20 66 72 6f  imes omitted fro
0e70: 6d 20 74 68 65 20 3c 73 74 64 69 6f 2e 68 3e 20  m the <stdio.h> 
0e80: 68 65 61 64 65 72 20 2a 2f 0a 20 20 20 65 78 74  header */.   ext
0e90: 65 72 6e 20 46 49 4c 45 20 2a 70 6f 70 65 6e 28  ern FILE *popen(
0ea0: 63 6f 6e 73 74 20 63 68 61 72 2a 2c 63 6f 6e 73  const char*,cons
0eb0: 74 20 63 68 61 72 2a 29 3b 0a 20 20 20 65 78 74  t char*);.   ext
0ec0: 65 72 6e 20 69 6e 74 20 70 63 6c 6f 73 65 28 46  ern int pclose(F
0ed0: 49 4c 45 2a 29 3b 0a 23 20 65 6c 73 65 0a 23 20  ILE*);.# else.# 
0ee0: 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 4f   define SQLITE_O
0ef0: 4d 49 54 5f 50 4f 50 45 4e 20 31 0a 23 20 65 6e  MIT_POPEN 1.# en
0f00: 64 69 66 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20  dif.#endif..#if 
0f10: 64 65 66 69 6e 65 64 28 5f 57 49 4e 33 32 5f 57  defined(_WIN32_W
0f20: 43 45 29 0a 2f 2a 20 57 69 6e 64 6f 77 73 20 43  CE)./* Windows C
0f30: 45 20 28 61 72 6d 2d 77 69 6e 63 65 2d 6d 69 6e  E (arm-wince-min
0f40: 67 77 33 32 63 65 2d 67 63 63 29 20 64 6f 65 73  gw32ce-gcc) does
0f50: 20 6e 6f 74 20 70 72 6f 76 69 64 65 20 69 73 61   not provide isa
0f60: 74 74 79 28 29 0a 20 2a 20 74 68 75 73 20 77 65  tty(). * thus we
0f70: 20 61 6c 77 61 79 73 20 61 73 73 75 6d 65 20 74   always assume t
0f80: 68 61 74 20 77 65 20 68 61 76 65 20 61 20 63 6f  hat we have a co
0f90: 6e 73 6f 6c 65 2e 20 54 68 61 74 20 63 61 6e 20  nsole. That can 
0fa0: 62 65 0a 20 2a 20 6f 76 65 72 72 69 64 64 65 6e  be. * overridden
0fb0: 20 77 69 74 68 20 74 68 65 20 2d 62 61 74 63 68   with the -batch
0fc0: 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20 6f 70   command line op
0fd0: 74 69 6f 6e 2e 0a 20 2a 2f 0a 23 64 65 66 69 6e  tion.. */.#defin
0fe0: 65 20 69 73 61 74 74 79 28 78 29 20 31 0a 23 65  e isatty(x) 1.#e
0ff0: 6e 64 69 66 0a 0a 2f 2a 20 63 74 79 70 65 20 6d  ndif../* ctype m
1000: 61 63 72 6f 73 20 74 68 61 74 20 77 6f 72 6b 20  acros that work 
1010: 77 69 74 68 20 73 69 67 6e 65 64 20 63 68 61 72  with signed char
1020: 61 63 74 65 72 73 20 2a 2f 0a 23 64 65 66 69 6e  acters */.#defin
1030: 65 20 49 73 53 70 61 63 65 28 58 29 20 20 69 73  e IsSpace(X)  is
1040: 73 70 61 63 65 28 28 75 6e 73 69 67 6e 65 64 20  space((unsigned 
1050: 63 68 61 72 29 58 29 0a 23 64 65 66 69 6e 65 20  char)X).#define 
1060: 49 73 44 69 67 69 74 28 58 29 20 20 69 73 64 69  IsDigit(X)  isdi
1070: 67 69 74 28 28 75 6e 73 69 67 6e 65 64 20 63 68  git((unsigned ch
1080: 61 72 29 58 29 0a 23 64 65 66 69 6e 65 20 54 6f  ar)X).#define To
1090: 4c 6f 77 65 72 28 58 29 20 20 28 63 68 61 72 29  Lower(X)  (char)
10a0: 74 6f 6c 6f 77 65 72 28 28 75 6e 73 69 67 6e 65  tolower((unsigne
10b0: 64 20 63 68 61 72 29 58 29 0a 0a 23 69 66 20 64  d char)X)..#if d
10c0: 65 66 69 6e 65 64 28 5f 57 49 4e 33 32 29 20 7c  efined(_WIN32) |
10d0: 7c 20 64 65 66 69 6e 65 64 28 57 49 4e 33 32 29  | defined(WIN32)
10e0: 0a 23 69 6e 63 6c 75 64 65 20 3c 77 69 6e 64 6f  .#include <windo
10f0: 77 73 2e 68 3e 0a 0a 2f 2a 20 73 74 72 69 6e 67  ws.h>../* string
1100: 20 63 6f 6e 76 65 72 73 69 6f 6e 20 72 6f 75 74   conversion rout
1110: 69 6e 65 73 20 6f 6e 6c 79 20 6e 65 65 64 65 64  ines only needed
1120: 20 6f 6e 20 57 69 6e 33 32 20 2a 2f 0a 65 78 74   on Win32 */.ext
1130: 65 72 6e 20 63 68 61 72 20 2a 73 71 6c 69 74 65  ern char *sqlite
1140: 33 5f 77 69 6e 33 32 5f 75 6e 69 63 6f 64 65 5f  3_win32_unicode_
1150: 74 6f 5f 75 74 66 38 28 4c 50 43 57 53 54 52 29  to_utf8(LPCWSTR)
1160: 3b 0a 65 78 74 65 72 6e 20 63 68 61 72 20 2a 73  ;.extern char *s
1170: 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 6d 62 63  qlite3_win32_mbc
1180: 73 5f 74 6f 5f 75 74 66 38 5f 76 32 28 63 6f 6e  s_to_utf8_v2(con
1190: 73 74 20 63 68 61 72 20 2a 2c 20 69 6e 74 29 3b  st char *, int);
11a0: 0a 65 78 74 65 72 6e 20 63 68 61 72 20 2a 73 71  .extern char *sq
11b0: 6c 69 74 65 33 5f 77 69 6e 33 32 5f 75 74 66 38  lite3_win32_utf8
11c0: 5f 74 6f 5f 6d 62 63 73 5f 76 32 28 63 6f 6e 73  _to_mbcs_v2(cons
11d0: 74 20 63 68 61 72 20 2a 2c 20 69 6e 74 29 3b 0a  t char *, int);.
11e0: 65 78 74 65 72 6e 20 4c 50 57 53 54 52 20 73 71  extern LPWSTR sq
11f0: 6c 69 74 65 33 5f 77 69 6e 33 32 5f 75 74 66 38  lite3_win32_utf8
1200: 5f 74 6f 5f 75 6e 69 63 6f 64 65 28 63 6f 6e 73  _to_unicode(cons
1210: 74 20 63 68 61 72 20 2a 7a 54 65 78 74 29 3b 0a  t char *zText);.
1220: 23 65 6e 64 69 66 0a 0a 2f 2a 20 4f 6e 20 57 69  #endif../* On Wi
1230: 6e 64 6f 77 73 2c 20 77 65 20 6e 6f 72 6d 61 6c  ndows, we normal
1240: 6c 79 20 72 75 6e 20 77 69 74 68 20 6f 75 74 70  ly run with outp
1250: 75 74 20 6d 6f 64 65 20 6f 66 20 54 45 58 54 20  ut mode of TEXT 
1260: 73 6f 20 74 68 61 74 20 5c 6e 20 63 68 61 72 61  so that \n chara
1270: 63 74 65 72 73 0a 2a 2a 20 61 72 65 20 61 75 74  cters.** are aut
1280: 6f 6d 61 74 69 63 61 6c 6c 79 20 74 72 61 6e 73  omatically trans
1290: 6c 61 74 65 64 20 69 6e 74 6f 20 5c 72 5c 6e 2e  lated into \r\n.
12a0: 20 20 48 6f 77 65 76 65 72 2c 20 74 68 69 73 20    However, this 
12b0: 62 65 68 61 76 69 6f 72 20 6e 65 65 64 73 0a 2a  behavior needs.*
12c0: 2a 20 74 6f 20 62 65 20 64 69 73 61 62 6c 65 64  * to be disabled
12d0: 20 69 6e 20 73 6f 6d 65 20 63 61 73 65 73 20 28   in some cases (
12e0: 65 78 3a 20 77 68 65 6e 20 67 65 6e 65 72 61 74  ex: when generat
12f0: 69 6e 67 20 43 53 56 20 6f 75 74 70 75 74 20 61  ing CSV output a
1300: 6e 64 20 77 68 65 6e 0a 2a 2a 20 72 65 6e 64 65  nd when.** rende
1310: 72 69 6e 67 20 71 75 6f 74 65 64 20 73 74 72 69  ring quoted stri
1320: 6e 67 73 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  ngs that contain
1330: 20 5c 6e 20 63 68 61 72 61 63 74 65 72 73 29 2e   \n characters).
1340: 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a    The following.
1350: 2a 2a 20 72 6f 75 74 69 6e 65 73 20 74 61 6b 65  ** routines take
1360: 20 63 61 72 65 20 6f 66 20 74 68 61 74 2e 0a 2a   care of that..*
1370: 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 57  /.#if defined(_W
1380: 49 4e 33 32 29 20 7c 7c 20 64 65 66 69 6e 65 64  IN32) || defined
1390: 28 57 49 4e 33 32 29 0a 73 74 61 74 69 63 20 76  (WIN32).static v
13a0: 6f 69 64 20 73 65 74 42 69 6e 61 72 79 4d 6f 64  oid setBinaryMod
13b0: 65 28 46 49 4c 45 20 2a 66 69 6c 65 2c 20 69 6e  e(FILE *file, in
13c0: 74 20 69 73 4f 75 74 70 75 74 29 7b 0a 20 20 69  t isOutput){.  i
13d0: 66 28 20 69 73 4f 75 74 70 75 74 20 29 20 66 66  f( isOutput ) ff
13e0: 6c 75 73 68 28 66 69 6c 65 29 3b 0a 20 20 5f 73  lush(file);.  _s
13f0: 65 74 6d 6f 64 65 28 5f 66 69 6c 65 6e 6f 28 66  etmode(_fileno(f
1400: 69 6c 65 29 2c 20 5f 4f 5f 42 49 4e 41 52 59 29  ile), _O_BINARY)
1410: 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  ;.}.static void 
1420: 73 65 74 54 65 78 74 4d 6f 64 65 28 46 49 4c 45  setTextMode(FILE
1430: 20 2a 66 69 6c 65 2c 20 69 6e 74 20 69 73 4f 75   *file, int isOu
1440: 74 70 75 74 29 7b 0a 20 20 69 66 28 20 69 73 4f  tput){.  if( isO
1450: 75 74 70 75 74 20 29 20 66 66 6c 75 73 68 28 66  utput ) fflush(f
1460: 69 6c 65 29 3b 0a 20 20 5f 73 65 74 6d 6f 64 65  ile);.  _setmode
1470: 28 5f 66 69 6c 65 6e 6f 28 66 69 6c 65 29 2c 20  (_fileno(file), 
1480: 5f 4f 5f 54 45 58 54 29 3b 0a 7d 0a 23 65 6c 73  _O_TEXT);.}.#els
1490: 65 0a 23 20 64 65 66 69 6e 65 20 73 65 74 42 69  e.# define setBi
14a0: 6e 61 72 79 4d 6f 64 65 28 58 2c 59 29 0a 23 20  naryMode(X,Y).# 
14b0: 64 65 66 69 6e 65 20 73 65 74 54 65 78 74 4d 6f  define setTextMo
14c0: 64 65 28 58 2c 59 29 0a 23 65 6e 64 69 66 0a 0a  de(X,Y).#endif..
14d0: 0a 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20  ./* True if the 
14e0: 74 69 6d 65 72 20 69 73 20 65 6e 61 62 6c 65 64  timer is enabled
14f0: 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65   */.static int e
1500: 6e 61 62 6c 65 54 69 6d 65 72 20 3d 20 30 3b 0a  nableTimer = 0;.
1510: 0a 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63  ./* Return the c
1520: 75 72 72 65 6e 74 20 77 61 6c 6c 2d 63 6c 6f 63  urrent wall-cloc
1530: 6b 20 74 69 6d 65 20 2a 2f 0a 73 74 61 74 69 63  k time */.static
1540: 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 74   sqlite3_int64 t
1550: 69 6d 65 4f 66 44 61 79 28 76 6f 69 64 29 7b 0a  imeOfDay(void){.
1560: 20 20 73 74 61 74 69 63 20 73 71 6c 69 74 65 33    static sqlite3
1570: 5f 76 66 73 20 2a 63 6c 6f 63 6b 56 66 73 20 3d  _vfs *clockVfs =
1580: 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e   0;.  sqlite3_in
1590: 74 36 34 20 74 3b 0a 20 20 69 66 28 20 63 6c 6f  t64 t;.  if( clo
15a0: 63 6b 56 66 73 3d 3d 30 20 29 20 63 6c 6f 63 6b  ckVfs==0 ) clock
15b0: 56 66 73 20 3d 20 73 71 6c 69 74 65 33 5f 76 66  Vfs = sqlite3_vf
15c0: 73 5f 66 69 6e 64 28 30 29 3b 0a 20 20 69 66 28  s_find(0);.  if(
15d0: 20 63 6c 6f 63 6b 56 66 73 2d 3e 69 56 65 72 73   clockVfs->iVers
15e0: 69 6f 6e 3e 3d 32 20 26 26 20 63 6c 6f 63 6b 56  ion>=2 && clockV
15f0: 66 73 2d 3e 78 43 75 72 72 65 6e 74 54 69 6d 65  fs->xCurrentTime
1600: 49 6e 74 36 34 21 3d 30 20 29 7b 0a 20 20 20 20  Int64!=0 ){.    
1610: 63 6c 6f 63 6b 56 66 73 2d 3e 78 43 75 72 72 65  clockVfs->xCurre
1620: 6e 74 54 69 6d 65 49 6e 74 36 34 28 63 6c 6f 63  ntTimeInt64(cloc
1630: 6b 56 66 73 2c 20 26 74 29 3b 0a 20 20 7d 65 6c  kVfs, &t);.  }el
1640: 73 65 7b 0a 20 20 20 20 64 6f 75 62 6c 65 20 72  se{.    double r
1650: 3b 0a 20 20 20 20 63 6c 6f 63 6b 56 66 73 2d 3e  ;.    clockVfs->
1660: 78 43 75 72 72 65 6e 74 54 69 6d 65 28 63 6c 6f  xCurrentTime(clo
1670: 63 6b 56 66 73 2c 20 26 72 29 3b 0a 20 20 20 20  ckVfs, &r);.    
1680: 74 20 3d 20 28 73 71 6c 69 74 65 33 5f 69 6e 74  t = (sqlite3_int
1690: 36 34 29 28 72 2a 38 36 34 30 30 30 30 30 2e 30  64)(r*86400000.0
16a0: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
16b0: 74 3b 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e  t;.}..#if !defin
16c0: 65 64 28 5f 57 49 4e 33 32 29 20 26 26 20 21 64  ed(_WIN32) && !d
16d0: 65 66 69 6e 65 64 28 57 49 4e 33 32 29 20 26 26  efined(WIN32) &&
16e0: 20 21 64 65 66 69 6e 65 64 28 5f 5f 6d 69 6e 75   !defined(__minu
16f0: 78 29 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79 73  x).#include <sys
1700: 2f 74 69 6d 65 2e 68 3e 0a 23 69 6e 63 6c 75 64  /time.h>.#includ
1710: 65 20 3c 73 79 73 2f 72 65 73 6f 75 72 63 65 2e  e <sys/resource.
1720: 68 3e 0a 0a 2f 2a 20 56 78 57 6f 72 6b 73 20 64  h>../* VxWorks d
1730: 6f 65 73 20 6e 6f 74 20 73 75 70 70 6f 72 74 20  oes not support 
1740: 67 65 74 72 75 73 61 67 65 28 29 20 61 73 20 66  getrusage() as f
1750: 61 72 20 61 73 20 77 65 20 63 61 6e 20 64 65 74  ar as we can det
1760: 65 72 6d 69 6e 65 20 2a 2f 0a 23 69 66 20 64 65  ermine */.#if de
1770: 66 69 6e 65 64 28 5f 57 52 53 5f 4b 45 52 4e 45  fined(_WRS_KERNE
1780: 4c 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f 5f  L) || defined(__
1790: 52 54 50 5f 5f 29 0a 73 74 72 75 63 74 20 72 75  RTP__).struct ru
17a0: 73 61 67 65 20 7b 0a 20 20 73 74 72 75 63 74 20  sage {.  struct 
17b0: 74 69 6d 65 76 61 6c 20 72 75 5f 75 74 69 6d 65  timeval ru_utime
17c0: 3b 20 2f 2a 20 75 73 65 72 20 43 50 55 20 74 69  ; /* user CPU ti
17d0: 6d 65 20 75 73 65 64 20 2a 2f 0a 20 20 73 74 72  me used */.  str
17e0: 75 63 74 20 74 69 6d 65 76 61 6c 20 72 75 5f 73  uct timeval ru_s
17f0: 74 69 6d 65 3b 20 2f 2a 20 73 79 73 74 65 6d 20  time; /* system 
1800: 43 50 55 20 74 69 6d 65 20 75 73 65 64 20 2a 2f  CPU time used */
1810: 0a 7d 3b 0a 23 64 65 66 69 6e 65 20 67 65 74 72  .};.#define getr
1820: 75 73 61 67 65 28 41 2c 42 29 20 6d 65 6d 73 65  usage(A,B) memse
1830: 74 28 42 2c 30 2c 73 69 7a 65 6f 66 28 2a 42 29  t(B,0,sizeof(*B)
1840: 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 53 61 76  ).#endif../* Sav
1850: 65 64 20 72 65 73 6f 75 72 63 65 20 69 6e 66 6f  ed resource info
1860: 72 6d 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20  rmation for the 
1870: 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 61 6e 20  beginning of an 
1880: 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 73 74 61  operation */.sta
1890: 74 69 63 20 73 74 72 75 63 74 20 72 75 73 61 67  tic struct rusag
18a0: 65 20 73 42 65 67 69 6e 3b 20 20 2f 2a 20 43 50  e sBegin;  /* CP
18b0: 55 20 74 69 6d 65 20 61 74 20 73 74 61 72 74 20  U time at start 
18c0: 2a 2f 0a 73 74 61 74 69 63 20 73 71 6c 69 74 65  */.static sqlite
18d0: 33 5f 69 6e 74 36 34 20 69 42 65 67 69 6e 3b 20  3_int64 iBegin; 
18e0: 20 2f 2a 20 57 61 6c 6c 2d 63 6c 6f 63 6b 20 74   /* Wall-clock t
18f0: 69 6d 65 20 61 74 20 73 74 61 72 74 20 2a 2f 0a  ime at start */.
1900: 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 74 69 6d  ./*.** Begin tim
1910: 69 6e 67 20 61 6e 20 6f 70 65 72 61 74 69 6f 6e  ing an operation
1920: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1930: 62 65 67 69 6e 54 69 6d 65 72 28 76 6f 69 64 29  beginTimer(void)
1940: 7b 0a 20 20 69 66 28 20 65 6e 61 62 6c 65 54 69  {.  if( enableTi
1950: 6d 65 72 20 29 7b 0a 20 20 20 20 67 65 74 72 75  mer ){.    getru
1960: 73 61 67 65 28 52 55 53 41 47 45 5f 53 45 4c 46  sage(RUSAGE_SELF
1970: 2c 20 26 73 42 65 67 69 6e 29 3b 0a 20 20 20 20  , &sBegin);.    
1980: 69 42 65 67 69 6e 20 3d 20 74 69 6d 65 4f 66 44  iBegin = timeOfD
1990: 61 79 28 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20  ay();.  }.}../* 
19a0: 52 65 74 75 72 6e 20 74 68 65 20 64 69 66 66 65  Return the diffe
19b0: 72 65 6e 63 65 20 6f 66 20 74 77 6f 20 74 69 6d  rence of two tim
19c0: 65 5f 73 74 72 75 63 74 73 20 69 6e 20 73 65 63  e_structs in sec
19d0: 6f 6e 64 73 20 2a 2f 0a 73 74 61 74 69 63 20 64  onds */.static d
19e0: 6f 75 62 6c 65 20 74 69 6d 65 44 69 66 66 28 73  ouble timeDiff(s
19f0: 74 72 75 63 74 20 74 69 6d 65 76 61 6c 20 2a 70  truct timeval *p
1a00: 53 74 61 72 74 2c 20 73 74 72 75 63 74 20 74 69  Start, struct ti
1a10: 6d 65 76 61 6c 20 2a 70 45 6e 64 29 7b 0a 20 20  meval *pEnd){.  
1a20: 72 65 74 75 72 6e 20 28 70 45 6e 64 2d 3e 74 76  return (pEnd->tv
1a30: 5f 75 73 65 63 20 2d 20 70 53 74 61 72 74 2d 3e  _usec - pStart->
1a40: 74 76 5f 75 73 65 63 29 2a 30 2e 30 30 30 30 30  tv_usec)*0.00000
1a50: 31 20 2b 0a 20 20 20 20 20 20 20 20 20 28 64 6f  1 +.         (do
1a60: 75 62 6c 65 29 28 70 45 6e 64 2d 3e 74 76 5f 73  uble)(pEnd->tv_s
1a70: 65 63 20 2d 20 70 53 74 61 72 74 2d 3e 74 76 5f  ec - pStart->tv_
1a80: 73 65 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  sec);.}../*.** P
1a90: 72 69 6e 74 20 74 68 65 20 74 69 6d 69 6e 67 20  rint the timing 
1aa0: 72 65 73 75 6c 74 73 2e 0a 2a 2f 0a 73 74 61 74  results..*/.stat
1ab0: 69 63 20 76 6f 69 64 20 65 6e 64 54 69 6d 65 72  ic void endTimer
1ac0: 28 76 6f 69 64 29 7b 0a 20 20 69 66 28 20 65 6e  (void){.  if( en
1ad0: 61 62 6c 65 54 69 6d 65 72 20 29 7b 0a 20 20 20  ableTimer ){.   
1ae0: 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69   sqlite3_int64 i
1af0: 45 6e 64 20 3d 20 74 69 6d 65 4f 66 44 61 79 28  End = timeOfDay(
1b00: 29 3b 0a 20 20 20 20 73 74 72 75 63 74 20 72 75  );.    struct ru
1b10: 73 61 67 65 20 73 45 6e 64 3b 0a 20 20 20 20 67  sage sEnd;.    g
1b20: 65 74 72 75 73 61 67 65 28 52 55 53 41 47 45 5f  etrusage(RUSAGE_
1b30: 53 45 4c 46 2c 20 26 73 45 6e 64 29 3b 0a 20 20  SELF, &sEnd);.  
1b40: 20 20 70 72 69 6e 74 66 28 22 52 75 6e 20 54 69    printf("Run Ti
1b50: 6d 65 3a 20 72 65 61 6c 20 25 2e 33 66 20 75 73  me: real %.3f us
1b60: 65 72 20 25 66 20 73 79 73 20 25 66 5c 6e 22 2c  er %f sys %f\n",
1b70: 0a 20 20 20 20 20 20 20 28 69 45 6e 64 20 2d 20  .       (iEnd - 
1b80: 69 42 65 67 69 6e 29 2a 30 2e 30 30 31 2c 0a 20  iBegin)*0.001,. 
1b90: 20 20 20 20 20 20 74 69 6d 65 44 69 66 66 28 26        timeDiff(&
1ba0: 73 42 65 67 69 6e 2e 72 75 5f 75 74 69 6d 65 2c  sBegin.ru_utime,
1bb0: 20 26 73 45 6e 64 2e 72 75 5f 75 74 69 6d 65 29   &sEnd.ru_utime)
1bc0: 2c 0a 20 20 20 20 20 20 20 74 69 6d 65 44 69 66  ,.       timeDif
1bd0: 66 28 26 73 42 65 67 69 6e 2e 72 75 5f 73 74 69  f(&sBegin.ru_sti
1be0: 6d 65 2c 20 26 73 45 6e 64 2e 72 75 5f 73 74 69  me, &sEnd.ru_sti
1bf0: 6d 65 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 64 65  me));.  }.}..#de
1c00: 66 69 6e 65 20 42 45 47 49 4e 5f 54 49 4d 45 52  fine BEGIN_TIMER
1c10: 20 62 65 67 69 6e 54 69 6d 65 72 28 29 0a 23 64   beginTimer().#d
1c20: 65 66 69 6e 65 20 45 4e 44 5f 54 49 4d 45 52 20  efine END_TIMER 
1c30: 65 6e 64 54 69 6d 65 72 28 29 0a 23 64 65 66 69  endTimer().#defi
1c40: 6e 65 20 48 41 53 5f 54 49 4d 45 52 20 31 0a 0a  ne HAS_TIMER 1..
1c50: 23 65 6c 69 66 20 28 64 65 66 69 6e 65 64 28 5f  #elif (defined(_
1c60: 57 49 4e 33 32 29 20 7c 7c 20 64 65 66 69 6e 65  WIN32) || define
1c70: 64 28 57 49 4e 33 32 29 29 0a 0a 2f 2a 20 53 61  d(WIN32))../* Sa
1c80: 76 65 64 20 72 65 73 6f 75 72 63 65 20 69 6e 66  ved resource inf
1c90: 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 74 68 65  ormation for the
1ca0: 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 61 6e   beginning of an
1cb0: 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 73 74   operation */.st
1cc0: 61 74 69 63 20 48 41 4e 44 4c 45 20 68 50 72 6f  atic HANDLE hPro
1cd0: 63 65 73 73 3b 0a 73 74 61 74 69 63 20 46 49 4c  cess;.static FIL
1ce0: 45 54 49 4d 45 20 66 74 4b 65 72 6e 65 6c 42 65  ETIME ftKernelBe
1cf0: 67 69 6e 3b 0a 73 74 61 74 69 63 20 46 49 4c 45  gin;.static FILE
1d00: 54 49 4d 45 20 66 74 55 73 65 72 42 65 67 69 6e  TIME ftUserBegin
1d10: 3b 0a 73 74 61 74 69 63 20 73 71 6c 69 74 65 33  ;.static sqlite3
1d20: 5f 69 6e 74 36 34 20 66 74 57 61 6c 6c 42 65 67  _int64 ftWallBeg
1d30: 69 6e 3b 0a 74 79 70 65 64 65 66 20 42 4f 4f 4c  in;.typedef BOOL
1d40: 20 28 57 49 4e 41 50 49 20 2a 47 45 54 50 52 4f   (WINAPI *GETPRO
1d50: 43 54 49 4d 45 53 29 28 48 41 4e 44 4c 45 2c 20  CTIMES)(HANDLE, 
1d60: 4c 50 46 49 4c 45 54 49 4d 45 2c 20 4c 50 46 49  LPFILETIME, LPFI
1d70: 4c 45 54 49 4d 45 2c 0a 20 20 20 20 20 20 20 20  LETIME,.        
1d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d90: 20 20 20 20 20 20 20 20 20 20 20 20 4c 50 46 49              LPFI
1da0: 4c 45 54 49 4d 45 2c 20 4c 50 46 49 4c 45 54 49  LETIME, LPFILETI
1db0: 4d 45 29 3b 0a 73 74 61 74 69 63 20 47 45 54 50  ME);.static GETP
1dc0: 52 4f 43 54 49 4d 45 53 20 67 65 74 50 72 6f 63  ROCTIMES getProc
1dd0: 65 73 73 54 69 6d 65 73 41 64 64 72 20 3d 20 4e  essTimesAddr = N
1de0: 55 4c 4c 3b 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63  ULL;../*.** Chec
1df0: 6b 20 74 6f 20 73 65 65 20 69 66 20 77 65 20 68  k to see if we h
1e00: 61 76 65 20 74 69 6d 65 72 20 73 75 70 70 6f 72  ave timer suppor
1e10: 74 2e 20 20 52 65 74 75 72 6e 20 31 20 69 66 20  t.  Return 1 if 
1e20: 6e 65 63 65 73 73 61 72 79 0a 2a 2a 20 73 75 70  necessary.** sup
1e30: 70 6f 72 74 20 66 6f 75 6e 64 20 28 6f 72 20 66  port found (or f
1e40: 6f 75 6e 64 20 70 72 65 76 69 6f 75 73 6c 79 29  ound previously)
1e50: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1e60: 68 61 73 54 69 6d 65 72 28 76 6f 69 64 29 7b 0a  hasTimer(void){.
1e70: 20 20 69 66 28 20 67 65 74 50 72 6f 63 65 73 73    if( getProcess
1e80: 54 69 6d 65 73 41 64 64 72 20 29 7b 0a 20 20 20  TimesAddr ){.   
1e90: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 20 65   return 1;.  } e
1ea0: 6c 73 65 20 7b 0a 20 20 20 20 2f 2a 20 47 65 74  lse {.    /* Get
1eb0: 50 72 6f 63 65 73 73 54 69 6d 65 73 28 29 20 69  ProcessTimes() i
1ec0: 73 6e 27 74 20 73 75 70 70 6f 72 74 65 64 20 69  sn't supported i
1ed0: 6e 20 57 49 4e 39 35 20 61 6e 64 20 73 6f 6d 65  n WIN95 and some
1ee0: 20 6f 74 68 65 72 20 57 69 6e 64 6f 77 73 0a 20   other Windows. 
1ef0: 20 20 20 2a 2a 20 76 65 72 73 69 6f 6e 73 2e 20     ** versions. 
1f00: 53 65 65 20 69 66 20 74 68 65 20 76 65 72 73 69  See if the versi
1f10: 6f 6e 20 77 65 20 61 72 65 20 72 75 6e 6e 69 6e  on we are runnin
1f20: 67 20 6f 6e 20 68 61 73 20 69 74 2c 20 61 6e 64  g on has it, and
1f30: 20 69 66 20 69 74 0a 20 20 20 20 2a 2a 20 64 6f   if it.    ** do
1f40: 65 73 2c 20 73 61 76 65 20 6f 66 66 20 61 20 70  es, save off a p
1f50: 6f 69 6e 74 65 72 20 74 6f 20 69 74 20 61 6e 64  ointer to it and
1f60: 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 72 6f   the current pro
1f70: 63 65 73 73 20 68 61 6e 64 6c 65 2e 0a 20 20 20  cess handle..   
1f80: 20 2a 2f 0a 20 20 20 20 68 50 72 6f 63 65 73 73   */.    hProcess
1f90: 20 3d 20 47 65 74 43 75 72 72 65 6e 74 50 72 6f   = GetCurrentPro
1fa0: 63 65 73 73 28 29 3b 0a 20 20 20 20 69 66 28 20  cess();.    if( 
1fb0: 68 50 72 6f 63 65 73 73 20 29 7b 0a 20 20 20 20  hProcess ){.    
1fc0: 20 20 48 49 4e 53 54 41 4e 43 45 20 68 69 6e 73    HINSTANCE hins
1fd0: 74 4c 69 62 20 3d 20 4c 6f 61 64 4c 69 62 72 61  tLib = LoadLibra
1fe0: 72 79 28 54 45 58 54 28 22 4b 65 72 6e 65 6c 33  ry(TEXT("Kernel3
1ff0: 32 2e 64 6c 6c 22 29 29 3b 0a 20 20 20 20 20 20  2.dll"));.      
2000: 69 66 28 20 4e 55 4c 4c 20 21 3d 20 68 69 6e 73  if( NULL != hins
2010: 74 4c 69 62 20 29 7b 0a 20 20 20 20 20 20 20 20  tLib ){.        
2020: 67 65 74 50 72 6f 63 65 73 73 54 69 6d 65 73 41  getProcessTimesA
2030: 64 64 72 20 3d 0a 20 20 20 20 20 20 20 20 20 20  ddr =.          
2040: 20 20 28 47 45 54 50 52 4f 43 54 49 4d 45 53 29    (GETPROCTIMES)
2050: 20 47 65 74 50 72 6f 63 41 64 64 72 65 73 73 28   GetProcAddress(
2060: 68 69 6e 73 74 4c 69 62 2c 20 22 47 65 74 50 72  hinstLib, "GetPr
2070: 6f 63 65 73 73 54 69 6d 65 73 22 29 3b 0a 20 20  ocessTimes");.  
2080: 20 20 20 20 20 20 69 66 28 20 4e 55 4c 4c 20 21        if( NULL !
2090: 3d 20 67 65 74 50 72 6f 63 65 73 73 54 69 6d 65  = getProcessTime
20a0: 73 41 64 64 72 20 29 7b 0a 20 20 20 20 20 20 20  sAddr ){.       
20b0: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
20c0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 46       }.        F
20d0: 72 65 65 4c 69 62 72 61 72 79 28 68 69 6e 73 74  reeLibrary(hinst
20e0: 4c 69 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Lib);.      }.  
20f0: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
2100: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67   0;.}../*.** Beg
2110: 69 6e 20 74 69 6d 69 6e 67 20 61 6e 20 6f 70 65  in timing an ope
2120: 72 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63  ration.*/.static
2130: 20 76 6f 69 64 20 62 65 67 69 6e 54 69 6d 65 72   void beginTimer
2140: 28 76 6f 69 64 29 7b 0a 20 20 69 66 28 20 65 6e  (void){.  if( en
2150: 61 62 6c 65 54 69 6d 65 72 20 26 26 20 67 65 74  ableTimer && get
2160: 50 72 6f 63 65 73 73 54 69 6d 65 73 41 64 64 72  ProcessTimesAddr
2170: 20 29 7b 0a 20 20 20 20 46 49 4c 45 54 49 4d 45   ){.    FILETIME
2180: 20 66 74 43 72 65 61 74 69 6f 6e 2c 20 66 74 45   ftCreation, ftE
2190: 78 69 74 3b 0a 20 20 20 20 67 65 74 50 72 6f 63  xit;.    getProc
21a0: 65 73 73 54 69 6d 65 73 41 64 64 72 28 68 50 72  essTimesAddr(hPr
21b0: 6f 63 65 73 73 2c 26 66 74 43 72 65 61 74 69 6f  ocess,&ftCreatio
21c0: 6e 2c 26 66 74 45 78 69 74 2c 0a 20 20 20 20 20  n,&ftExit,.     
21d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21e0: 20 20 20 26 66 74 4b 65 72 6e 65 6c 42 65 67 69     &ftKernelBegi
21f0: 6e 2c 26 66 74 55 73 65 72 42 65 67 69 6e 29 3b  n,&ftUserBegin);
2200: 0a 20 20 20 20 66 74 57 61 6c 6c 42 65 67 69 6e  .    ftWallBegin
2210: 20 3d 20 74 69 6d 65 4f 66 44 61 79 28 29 3b 0a   = timeOfDay();.
2220: 20 20 7d 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e    }.}../* Return
2230: 20 74 68 65 20 64 69 66 66 65 72 65 6e 63 65 20   the difference 
2240: 6f 66 20 74 77 6f 20 46 49 4c 45 54 49 4d 45 20  of two FILETIME 
2250: 73 74 72 75 63 74 73 20 69 6e 20 73 65 63 6f 6e  structs in secon
2260: 64 73 20 2a 2f 0a 73 74 61 74 69 63 20 64 6f 75  ds */.static dou
2270: 62 6c 65 20 74 69 6d 65 44 69 66 66 28 46 49 4c  ble timeDiff(FIL
2280: 45 54 49 4d 45 20 2a 70 53 74 61 72 74 2c 20 46  ETIME *pStart, F
2290: 49 4c 45 54 49 4d 45 20 2a 70 45 6e 64 29 7b 0a  ILETIME *pEnd){.
22a0: 20 20 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 69    sqlite_int64 i
22b0: 36 34 53 74 61 72 74 20 3d 20 2a 28 28 73 71 6c  64Start = *((sql
22c0: 69 74 65 5f 69 6e 74 36 34 20 2a 29 20 70 53 74  ite_int64 *) pSt
22d0: 61 72 74 29 3b 0a 20 20 73 71 6c 69 74 65 5f 69  art);.  sqlite_i
22e0: 6e 74 36 34 20 69 36 34 45 6e 64 20 3d 20 2a 28  nt64 i64End = *(
22f0: 28 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 2a 29  (sqlite_int64 *)
2300: 20 70 45 6e 64 29 3b 0a 20 20 72 65 74 75 72 6e   pEnd);.  return
2310: 20 28 64 6f 75 62 6c 65 29 20 28 28 69 36 34 45   (double) ((i64E
2320: 6e 64 20 2d 20 69 36 34 53 74 61 72 74 29 20 2f  nd - i64Start) /
2330: 20 31 30 30 30 30 30 30 30 2e 30 29 3b 0a 7d 0a   10000000.0);.}.
2340: 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 74 68 65  ./*.** Print the
2350: 20 74 69 6d 69 6e 67 20 72 65 73 75 6c 74 73 2e   timing results.
2360: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
2370: 65 6e 64 54 69 6d 65 72 28 76 6f 69 64 29 7b 0a  endTimer(void){.
2380: 20 20 69 66 28 20 65 6e 61 62 6c 65 54 69 6d 65    if( enableTime
2390: 72 20 26 26 20 67 65 74 50 72 6f 63 65 73 73 54  r && getProcessT
23a0: 69 6d 65 73 41 64 64 72 29 7b 0a 20 20 20 20 46  imesAddr){.    F
23b0: 49 4c 45 54 49 4d 45 20 66 74 43 72 65 61 74 69  ILETIME ftCreati
23c0: 6f 6e 2c 20 66 74 45 78 69 74 2c 20 66 74 4b 65  on, ftExit, ftKe
23d0: 72 6e 65 6c 45 6e 64 2c 20 66 74 55 73 65 72 45  rnelEnd, ftUserE
23e0: 6e 64 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  nd;.    sqlite3_
23f0: 69 6e 74 36 34 20 66 74 57 61 6c 6c 45 6e 64 20  int64 ftWallEnd 
2400: 3d 20 74 69 6d 65 4f 66 44 61 79 28 29 3b 0a 20  = timeOfDay();. 
2410: 20 20 20 67 65 74 50 72 6f 63 65 73 73 54 69 6d     getProcessTim
2420: 65 73 41 64 64 72 28 68 50 72 6f 63 65 73 73 2c  esAddr(hProcess,
2430: 26 66 74 43 72 65 61 74 69 6f 6e 2c 26 66 74 45  &ftCreation,&ftE
2440: 78 69 74 2c 26 66 74 4b 65 72 6e 65 6c 45 6e 64  xit,&ftKernelEnd
2450: 2c 26 66 74 55 73 65 72 45 6e 64 29 3b 0a 20 20  ,&ftUserEnd);.  
2460: 20 20 70 72 69 6e 74 66 28 22 52 75 6e 20 54 69    printf("Run Ti
2470: 6d 65 3a 20 72 65 61 6c 20 25 2e 33 66 20 75 73  me: real %.3f us
2480: 65 72 20 25 66 20 73 79 73 20 25 66 5c 6e 22 2c  er %f sys %f\n",
2490: 0a 20 20 20 20 20 20 20 28 66 74 57 61 6c 6c 45  .       (ftWallE
24a0: 6e 64 20 2d 20 66 74 57 61 6c 6c 42 65 67 69 6e  nd - ftWallBegin
24b0: 29 2a 30 2e 30 30 31 2c 0a 20 20 20 20 20 20 20  )*0.001,.       
24c0: 74 69 6d 65 44 69 66 66 28 26 66 74 55 73 65 72  timeDiff(&ftUser
24d0: 42 65 67 69 6e 2c 20 26 66 74 55 73 65 72 45 6e  Begin, &ftUserEn
24e0: 64 29 2c 0a 20 20 20 20 20 20 20 74 69 6d 65 44  d),.       timeD
24f0: 69 66 66 28 26 66 74 4b 65 72 6e 65 6c 42 65 67  iff(&ftKernelBeg
2500: 69 6e 2c 20 26 66 74 4b 65 72 6e 65 6c 45 6e 64  in, &ftKernelEnd
2510: 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 64 65 66 69  ));.  }.}..#defi
2520: 6e 65 20 42 45 47 49 4e 5f 54 49 4d 45 52 20 62  ne BEGIN_TIMER b
2530: 65 67 69 6e 54 69 6d 65 72 28 29 0a 23 64 65 66  eginTimer().#def
2540: 69 6e 65 20 45 4e 44 5f 54 49 4d 45 52 20 65 6e  ine END_TIMER en
2550: 64 54 69 6d 65 72 28 29 0a 23 64 65 66 69 6e 65  dTimer().#define
2560: 20 48 41 53 5f 54 49 4d 45 52 20 68 61 73 54 69   HAS_TIMER hasTi
2570: 6d 65 72 28 29 0a 0a 23 65 6c 73 65 0a 23 64 65  mer()..#else.#de
2580: 66 69 6e 65 20 42 45 47 49 4e 5f 54 49 4d 45 52  fine BEGIN_TIMER
2590: 0a 23 64 65 66 69 6e 65 20 45 4e 44 5f 54 49 4d  .#define END_TIM
25a0: 45 52 0a 23 64 65 66 69 6e 65 20 48 41 53 5f 54  ER.#define HAS_T
25b0: 49 4d 45 52 20 30 0a 23 65 6e 64 69 66 0a 0a 2f  IMER 0.#endif../
25c0: 2a 0a 2a 2a 20 55 73 65 64 20 74 6f 20 70 72 65  *.** Used to pre
25d0: 76 65 6e 74 20 77 61 72 6e 69 6e 67 73 20 61 62  vent warnings ab
25e0: 6f 75 74 20 75 6e 75 73 65 64 20 70 61 72 61 6d  out unused param
25f0: 65 74 65 72 73 0a 2a 2f 0a 23 64 65 66 69 6e 65  eters.*/.#define
2600: 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
2610: 52 28 78 29 20 28 76 6f 69 64 29 28 78 29 0a 0a  R(x) (void)(x)..
2620: 2f 2a 0a 2a 2a 20 4e 75 6d 62 65 72 20 6f 66 20  /*.** Number of 
2630: 65 6c 65 6d 65 6e 74 73 20 69 6e 20 61 6e 20 61  elements in an a
2640: 72 72 61 79 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  rray.*/.#define 
2650: 41 72 72 61 79 53 69 7a 65 28 58 29 20 20 28 69  ArraySize(X)  (i
2660: 6e 74 29 28 73 69 7a 65 6f 66 28 58 29 2f 73 69  nt)(sizeof(X)/si
2670: 7a 65 6f 66 28 58 5b 30 5d 29 29 0a 0a 2f 2a 0a  zeof(X[0]))../*.
2680: 2a 2a 20 49 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ** If the follow
2690: 69 6e 67 20 66 6c 61 67 20 69 73 20 73 65 74 2c  ing flag is set,
26a0: 20 74 68 65 6e 20 63 6f 6d 6d 61 6e 64 20 65 78   then command ex
26b0: 65 63 75 74 69 6f 6e 20 73 74 6f 70 73 0a 2a 2a  ecution stops.**
26c0: 20 61 74 20 61 6e 20 65 72 72 6f 72 20 69 66 20   at an error if 
26d0: 77 65 20 61 72 65 20 6e 6f 74 20 69 6e 74 65 72  we are not inter
26e0: 61 63 74 69 76 65 2e 0a 2a 2f 0a 73 74 61 74 69  active..*/.stati
26f0: 63 20 69 6e 74 20 62 61 69 6c 5f 6f 6e 5f 65 72  c int bail_on_er
2700: 72 6f 72 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20  ror = 0;../*.** 
2710: 54 68 72 65 61 74 20 73 74 64 69 6e 20 61 73 20  Threat stdin as 
2720: 61 6e 20 69 6e 74 65 72 61 63 74 69 76 65 20 69  an interactive i
2730: 6e 70 75 74 20 69 66 20 74 68 65 20 66 6f 6c 6c  nput if the foll
2740: 6f 77 69 6e 67 20 76 61 72 69 61 62 6c 65 0a 2a  owing variable.*
2750: 2a 20 69 73 20 74 72 75 65 2e 20 20 4f 74 68 65  * is true.  Othe
2760: 72 77 69 73 65 2c 20 61 73 73 75 6d 65 20 73 74  rwise, assume st
2770: 64 69 6e 20 69 73 20 63 6f 6e 6e 65 63 74 65 64  din is connected
2780: 20 74 6f 20 61 20 66 69 6c 65 20 6f 72 20 70 69   to a file or pi
2790: 70 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  pe..*/.static in
27a0: 74 20 73 74 64 69 6e 5f 69 73 5f 69 6e 74 65 72  t stdin_is_inter
27b0: 61 63 74 69 76 65 20 3d 20 31 3b 0a 0a 2f 2a 0a  active = 1;../*.
27c0: 2a 2a 20 4f 6e 20 57 69 6e 64 6f 77 73 20 73 79  ** On Windows sy
27d0: 73 74 65 6d 73 20 77 65 20 68 61 76 65 20 74 6f  stems we have to
27e0: 20 6b 6e 6f 77 20 69 66 20 73 74 61 6e 64 61 72   know if standar
27f0: 64 20 6f 75 74 70 75 74 20 69 73 20 61 20 63 6f  d output is a co
2800: 6e 73 6f 6c 65 0a 2a 2a 20 69 6e 20 6f 72 64 65  nsole.** in orde
2810: 72 20 74 6f 20 74 72 61 6e 73 6c 61 74 65 20 55  r to translate U
2820: 54 46 2d 38 20 69 6e 74 6f 20 4d 42 43 53 2e 20  TF-8 into MBCS. 
2830: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76   The following v
2840: 61 72 69 61 62 6c 65 20 69 73 0a 2a 2a 20 74 72  ariable is.** tr
2850: 75 65 20 69 66 20 74 72 61 6e 73 6c 61 74 69 6f  ue if translatio
2860: 6e 20 69 73 20 72 65 71 75 69 72 65 64 2e 0a 2a  n is required..*
2870: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 74 64  /.static int std
2880: 6f 75 74 5f 69 73 5f 63 6f 6e 73 6f 6c 65 20 3d  out_is_console =
2890: 20 31 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66   1;../*.** The f
28a0: 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 74 68 65 20  ollowing is the 
28b0: 6f 70 65 6e 20 53 51 4c 69 74 65 20 64 61 74 61  open SQLite data
28c0: 62 61 73 65 2e 20 20 57 65 20 6d 61 6b 65 20 61  base.  We make a
28d0: 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74   pointer.** to t
28e0: 68 69 73 20 64 61 74 61 62 61 73 65 20 61 20 73  his database a s
28f0: 74 61 74 69 63 20 76 61 72 69 61 62 6c 65 20 73  tatic variable s
2900: 6f 20 74 68 61 74 20 69 74 20 63 61 6e 20 62 65  o that it can be
2910: 20 61 63 63 65 73 73 65 64 0a 2a 2a 20 62 79 20   accessed.** by 
2920: 74 68 65 20 53 49 47 49 4e 54 20 68 61 6e 64 6c  the SIGINT handl
2930: 65 72 20 74 6f 20 69 6e 74 65 72 72 75 70 74 20  er to interrupt 
2940: 64 61 74 61 62 61 73 65 20 70 72 6f 63 65 73 73  database process
2950: 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73  ing..*/.static s
2960: 71 6c 69 74 65 33 20 2a 67 6c 6f 62 61 6c 44 62  qlite3 *globalDb
2970: 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 54 72 75   = 0;../*.** Tru
2980: 65 20 69 66 20 61 6e 20 69 6e 74 65 72 72 75 70  e if an interrup
2990: 74 20 28 43 6f 6e 74 72 6f 6c 2d 43 29 20 68 61  t (Control-C) ha
29a0: 73 20 62 65 65 6e 20 72 65 63 65 69 76 65 64 2e  s been received.
29b0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 6c 61 74  .*/.static volat
29c0: 69 6c 65 20 69 6e 74 20 73 65 65 6e 49 6e 74 65  ile int seenInte
29d0: 72 72 75 70 74 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a  rrupt = 0;../*.*
29e0: 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 6e 61  * This is the na
29f0: 6d 65 20 6f 66 20 6f 75 72 20 70 72 6f 67 72 61  me of our progra
2a00: 6d 2e 20 49 74 20 69 73 20 73 65 74 20 69 6e 20  m. It is set in 
2a10: 6d 61 69 6e 28 29 2c 20 75 73 65 64 0a 2a 2a 20  main(), used.** 
2a20: 69 6e 20 61 20 6e 75 6d 62 65 72 20 6f 66 20 6f  in a number of o
2a30: 74 68 65 72 20 70 6c 61 63 65 73 2c 20 6d 6f 73  ther places, mos
2a40: 74 6c 79 20 66 6f 72 20 65 72 72 6f 72 20 6d 65  tly for error me
2a50: 73 73 61 67 65 73 2e 0a 2a 2f 0a 73 74 61 74 69  ssages..*/.stati
2a60: 63 20 63 68 61 72 20 2a 41 72 67 76 30 3b 0a 0a  c char *Argv0;..
2a70: 2f 2a 0a 2a 2a 20 50 72 6f 6d 70 74 20 73 74 72  /*.** Prompt str
2a80: 69 6e 67 73 2e 20 49 6e 69 74 69 61 6c 69 7a 65  ings. Initialize
2a90: 64 20 69 6e 20 6d 61 69 6e 2e 20 53 65 74 74 61  d in main. Setta
2aa0: 62 6c 65 20 77 69 74 68 0a 2a 2a 20 20 20 2e 70  ble with.**   .p
2ab0: 72 6f 6d 70 74 20 6d 61 69 6e 20 63 6f 6e 74 69  rompt main conti
2ac0: 6e 75 65 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68  nue.*/.static ch
2ad0: 61 72 20 6d 61 69 6e 50 72 6f 6d 70 74 5b 32 30  ar mainPrompt[20
2ae0: 5d 3b 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20  ];     /* First 
2af0: 6c 69 6e 65 20 70 72 6f 6d 70 74 2e 20 64 65 66  line prompt. def
2b00: 61 75 6c 74 3a 20 22 73 71 6c 69 74 65 3e 20 22  ault: "sqlite> "
2b10: 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 63  */.static char c
2b20: 6f 6e 74 69 6e 75 65 50 72 6f 6d 70 74 5b 32 30  ontinuePrompt[20
2b30: 5d 3b 20 2f 2a 20 43 6f 6e 74 69 6e 75 61 74 69  ]; /* Continuati
2b40: 6f 6e 20 70 72 6f 6d 70 74 2e 20 64 65 66 61 75  on prompt. defau
2b50: 6c 74 3a 20 22 20 20 20 2e 2e 2e 3e 20 22 20 2a  lt: "   ...> " *
2b60: 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 6e 64 65 72 20  /../*.** Render 
2b70: 6f 75 74 70 75 74 20 6c 69 6b 65 20 66 70 72 69  output like fpri
2b80: 6e 74 66 28 29 2e 20 20 45 78 63 65 70 74 2c 20  ntf().  Except, 
2b90: 69 66 20 74 68 65 20 6f 75 74 70 75 74 20 69 73  if the output is
2ba0: 20 67 6f 69 6e 67 20 74 6f 20 74 68 65 0a 2a 2a   going to the.**
2bb0: 20 63 6f 6e 73 6f 6c 65 20 61 6e 64 20 69 66 20   console and if 
2bc0: 74 68 69 73 20 69 73 20 72 75 6e 6e 69 6e 67 20  this is running 
2bd0: 6f 6e 20 61 20 57 69 6e 64 6f 77 73 20 6d 61 63  on a Windows mac
2be0: 68 69 6e 65 2c 20 74 72 61 6e 73 6c 61 74 65 20  hine, translate 
2bf0: 74 68 65 0a 2a 2a 20 6f 75 74 70 75 74 20 66 72  the.** output fr
2c00: 6f 6d 20 55 54 46 2d 38 20 69 6e 74 6f 20 4d 42  om UTF-8 into MB
2c10: 43 53 2e 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e  CS..*/.#if defin
2c20: 65 64 28 5f 57 49 4e 33 32 29 20 7c 7c 20 64 65  ed(_WIN32) || de
2c30: 66 69 6e 65 64 28 57 49 4e 33 32 29 0a 76 6f 69  fined(WIN32).voi
2c40: 64 20 75 74 66 38 5f 70 72 69 6e 74 66 28 46 49  d utf8_printf(FI
2c50: 4c 45 20 2a 6f 75 74 2c 20 63 6f 6e 73 74 20 63  LE *out, const c
2c60: 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e  har *zFormat, ..
2c70: 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70  .){.  va_list ap
2c80: 3b 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c  ;.  va_start(ap,
2c90: 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 69 66 28   zFormat);.  if(
2ca0: 20 73 74 64 6f 75 74 5f 69 73 5f 63 6f 6e 73 6f   stdout_is_conso
2cb0: 6c 65 20 26 26 20 28 6f 75 74 3d 3d 73 74 64 6f  le && (out==stdo
2cc0: 75 74 20 7c 7c 20 6f 75 74 3d 3d 73 74 64 65 72  ut || out==stder
2cd0: 72 29 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a  r) ){.    char *
2ce0: 7a 31 20 3d 20 73 71 6c 69 74 65 33 5f 76 6d 70  z1 = sqlite3_vmp
2cf0: 72 69 6e 74 66 28 7a 46 6f 72 6d 61 74 2c 20 61  rintf(zFormat, a
2d00: 70 29 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 32  p);.    char *z2
2d10: 20 3d 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32   = sqlite3_win32
2d20: 5f 75 74 66 38 5f 74 6f 5f 6d 62 63 73 5f 76 32  _utf8_to_mbcs_v2
2d30: 28 7a 31 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  (z1, 0);.    sql
2d40: 69 74 65 33 5f 66 72 65 65 28 7a 31 29 3b 0a 20  ite3_free(z1);. 
2d50: 20 20 20 66 70 75 74 73 28 7a 32 2c 20 6f 75 74     fputs(z2, out
2d60: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
2d70: 72 65 65 28 7a 32 29 3b 0a 20 20 7d 65 6c 73 65  ree(z2);.  }else
2d80: 7b 0a 20 20 20 20 76 66 70 72 69 6e 74 66 28 6f  {.    vfprintf(o
2d90: 75 74 2c 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29  ut, zFormat, ap)
2da0: 3b 0a 20 20 7d 0a 20 20 76 61 5f 65 6e 64 28 61  ;.  }.  va_end(a
2db0: 70 29 3b 0a 7d 0a 23 65 6c 69 66 20 21 64 65 66  p);.}.#elif !def
2dc0: 69 6e 65 64 28 75 74 66 38 5f 70 72 69 6e 74 66  ined(utf8_printf
2dd0: 29 0a 23 20 64 65 66 69 6e 65 20 75 74 66 38 5f  ).# define utf8_
2de0: 70 72 69 6e 74 66 20 66 70 72 69 6e 74 66 0a 23  printf fprintf.#
2df0: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 6e  endif../*.** Ren
2e00: 64 65 72 20 6f 75 74 70 75 74 20 6c 69 6b 65 20  der output like 
2e10: 66 70 72 69 6e 74 66 28 29 2e 20 20 54 68 69 73  fprintf().  This
2e20: 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 75   should not be u
2e30: 73 65 64 20 6f 6e 20 61 6e 79 74 68 69 6e 67 20  sed on anything 
2e40: 74 68 61 74 0a 2a 2a 20 69 6e 63 6c 75 64 65 73  that.** includes
2e50: 20 73 74 72 69 6e 67 20 66 6f 72 6d 61 74 74 69   string formatti
2e60: 6e 67 20 28 65 2e 67 2e 20 22 25 73 22 29 2e 0a  ng (e.g. "%s")..
2e70: 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  */.#if !defined(
2e80: 72 61 77 5f 70 72 69 6e 74 66 29 0a 23 20 64 65  raw_printf).# de
2e90: 66 69 6e 65 20 72 61 77 5f 70 72 69 6e 74 66 20  fine raw_printf 
2ea0: 66 70 72 69 6e 74 66 0a 23 65 6e 64 69 66 0a 0a  fprintf.#endif..
2eb0: 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 49 2f 4f 20  /*.** Write I/O 
2ec0: 74 72 61 63 65 73 20 74 6f 20 74 68 65 20 66 6f  traces to the fo
2ed0: 6c 6c 6f 77 69 6e 67 20 73 74 72 65 61 6d 2e 0a  llowing stream..
2ee0: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
2ef0: 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41 43 45 0a  _ENABLE_IOTRACE.
2f00: 73 74 61 74 69 63 20 46 49 4c 45 20 2a 69 6f 74  static FILE *iot
2f10: 72 61 63 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66  race = 0;.#endif
2f20: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
2f30: 74 69 6e 65 20 77 6f 72 6b 73 20 6c 69 6b 65 20  tine works like 
2f40: 70 72 69 6e 74 66 20 69 6e 20 74 68 61 74 20 69  printf in that i
2f50: 74 73 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  ts first argumen
2f60: 74 20 69 73 20 61 0a 2a 2a 20 66 6f 72 6d 61 74  t is a.** format
2f70: 20 73 74 72 69 6e 67 20 61 6e 64 20 73 75 62 73   string and subs
2f80: 65 71 75 65 6e 74 20 61 72 67 75 6d 65 6e 74 73  equent arguments
2f90: 20 61 72 65 20 76 61 6c 75 65 73 20 74 6f 20 62   are values to b
2fa0: 65 20 73 75 62 73 74 69 74 75 74 65 64 0a 2a 2a  e substituted.**
2fb0: 20 69 6e 20 70 6c 61 63 65 20 6f 66 20 25 20 66   in place of % f
2fc0: 69 65 6c 64 73 2e 20 20 54 68 65 20 72 65 73 75  ields.  The resu
2fd0: 6c 74 20 6f 66 20 66 6f 72 6d 61 74 74 69 6e 67  lt of formatting
2fe0: 20 74 68 69 73 20 73 74 72 69 6e 67 0a 2a 2a 20   this string.** 
2ff0: 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 69 6f  is written to io
3000: 74 72 61 63 65 2e 0a 2a 2f 0a 23 69 66 64 65 66  trace..*/.#ifdef
3010: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49   SQLITE_ENABLE_I
3020: 4f 54 52 41 43 45 0a 73 74 61 74 69 63 20 76 6f  OTRACE.static vo
3030: 69 64 20 53 51 4c 49 54 45 5f 43 44 45 43 4c 20  id SQLITE_CDECL 
3040: 69 6f 74 72 61 63 65 50 72 69 6e 74 66 28 63 6f  iotracePrintf(co
3050: 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61  nst char *zForma
3060: 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69  t, ...){.  va_li
3070: 73 74 20 61 70 3b 0a 20 20 63 68 61 72 20 2a 7a  st ap;.  char *z
3080: 3b 0a 20 20 69 66 28 20 69 6f 74 72 61 63 65 3d  ;.  if( iotrace=
3090: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 76  =0 ) return;.  v
30a0: 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72  a_start(ap, zFor
30b0: 6d 61 74 29 3b 0a 20 20 7a 20 3d 20 73 71 6c 69  mat);.  z = sqli
30c0: 74 65 33 5f 76 6d 70 72 69 6e 74 66 28 7a 46 6f  te3_vmprintf(zFo
30d0: 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 76 61 5f  rmat, ap);.  va_
30e0: 65 6e 64 28 61 70 29 3b 0a 20 20 75 74 66 38 5f  end(ap);.  utf8_
30f0: 70 72 69 6e 74 66 28 69 6f 74 72 61 63 65 2c 20  printf(iotrace, 
3100: 22 25 73 22 2c 20 7a 29 3b 0a 20 20 73 71 6c 69  "%s", z);.  sqli
3110: 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a 7d 0a 23  te3_free(z);.}.#
3120: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4f 75 74  endif../*.** Out
3130: 70 75 74 20 73 74 72 69 6e 67 20 7a 55 74 66 20  put string zUtf 
3140: 74 6f 20 73 74 72 65 61 6d 20 70 4f 75 74 20 61  to stream pOut a
3150: 73 20 77 20 63 68 61 72 61 63 74 65 72 73 2e 20  s w characters. 
3160: 20 49 66 20 77 20 69 73 20 6e 65 67 61 74 69 76   If w is negativ
3170: 65 2c 0a 2a 2a 20 74 68 65 6e 20 72 69 67 68 74  e,.** then right
3180: 2d 6a 75 73 74 69 66 79 20 74 68 65 20 74 65 78  -justify the tex
3190: 74 2e 20 20 57 20 69 73 20 74 68 65 20 77 69 64  t.  W is the wid
31a0: 74 68 20 69 6e 20 55 54 46 2d 38 20 63 68 61 72  th in UTF-8 char
31b0: 61 63 74 65 72 73 2c 20 6e 6f 74 0a 2a 2a 20 69  acters, not.** i
31c0: 6e 20 62 79 74 65 73 2e 20 20 54 68 69 73 20 69  n bytes.  This i
31d0: 73 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d  s different from
31e0: 20 74 68 65 20 25 2a 2e 2a 73 20 73 70 65 63 69   the %*.*s speci
31f0: 66 69 63 61 74 69 6f 6e 20 69 6e 20 70 72 69 6e  fication in prin
3200: 74 66 0a 2a 2a 20 73 69 6e 63 65 20 77 69 74 68  tf.** since with
3210: 20 25 2a 2e 2a 73 20 74 68 65 20 77 69 64 74 68   %*.*s the width
3220: 20 69 73 20 6d 65 61 73 75 72 65 64 20 69 6e 20   is measured in 
3230: 62 79 74 65 73 2c 20 6e 6f 74 20 63 68 61 72 61  bytes, not chara
3240: 63 74 65 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  cters..*/.static
3250: 20 76 6f 69 64 20 75 74 66 38 5f 77 69 64 74 68   void utf8_width
3260: 5f 70 72 69 6e 74 28 46 49 4c 45 20 2a 70 4f 75  _print(FILE *pOu
3270: 74 2c 20 69 6e 74 20 77 2c 20 63 6f 6e 73 74 20  t, int w, const 
3280: 63 68 61 72 20 2a 7a 55 74 66 29 7b 0a 20 20 69  char *zUtf){.  i
3290: 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20  nt i;.  int n;. 
32a0: 20 69 6e 74 20 61 77 20 3d 20 77 3c 30 20 3f 20   int aw = w<0 ? 
32b0: 2d 77 20 3a 20 77 3b 0a 20 20 63 68 61 72 20 7a  -w : w;.  char z
32c0: 42 75 66 5b 31 30 30 30 5d 3b 0a 20 20 69 66 28  Buf[1000];.  if(
32d0: 20 61 77 3e 28 69 6e 74 29 73 69 7a 65 6f 66 28   aw>(int)sizeof(
32e0: 7a 42 75 66 29 2f 33 20 29 20 61 77 20 3d 20 28  zBuf)/3 ) aw = (
32f0: 69 6e 74 29 73 69 7a 65 6f 66 28 7a 42 75 66 29  int)sizeof(zBuf)
3300: 2f 33 3b 0a 20 20 66 6f 72 28 69 3d 6e 3d 30 3b  /3;.  for(i=n=0;
3310: 20 7a 55 74 66 5b 69 5d 3b 20 69 2b 2b 29 7b 0a   zUtf[i]; i++){.
3320: 20 20 20 20 69 66 28 20 28 7a 55 74 66 5b 69 5d      if( (zUtf[i]
3330: 26 30 78 63 30 29 21 3d 30 78 38 30 20 29 7b 0a  &0xc0)!=0x80 ){.
3340: 20 20 20 20 20 20 6e 2b 2b 3b 0a 20 20 20 20 20        n++;.     
3350: 20 69 66 28 20 6e 3d 3d 61 77 20 29 7b 0a 20 20   if( n==aw ){.  
3360: 20 20 20 20 20 20 64 6f 7b 20 69 2b 2b 3b 20 7d        do{ i++; }
3370: 77 68 69 6c 65 28 20 28 7a 55 74 66 5b 69 5d 26  while( (zUtf[i]&
3380: 30 78 63 30 29 3d 3d 30 78 38 30 20 29 3b 0a 20  0xc0)==0x80 );. 
3390: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
33a0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
33b0: 20 20 69 66 28 20 6e 3e 3d 61 77 20 29 7b 0a 20    if( n>=aw ){. 
33c0: 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70     utf8_printf(p
33d0: 4f 75 74 2c 20 22 25 2e 2a 73 22 2c 20 69 2c 20  Out, "%.*s", i, 
33e0: 7a 55 74 66 29 3b 0a 20 20 7d 65 6c 73 65 20 69  zUtf);.  }else i
33f0: 66 28 20 77 3c 30 20 29 7b 0a 20 20 20 20 75 74  f( w<0 ){.    ut
3400: 66 38 5f 70 72 69 6e 74 66 28 70 4f 75 74 2c 20  f8_printf(pOut, 
3410: 22 25 2a 73 25 73 22 2c 20 61 77 2d 6e 2c 20 22  "%*s%s", aw-n, "
3420: 22 2c 20 7a 55 74 66 29 3b 0a 20 20 7d 65 6c 73  ", zUtf);.  }els
3430: 65 7b 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e  e{.    utf8_prin
3440: 74 66 28 70 4f 75 74 2c 20 22 25 73 25 2a 73 22  tf(pOut, "%s%*s"
3450: 2c 20 7a 55 74 66 2c 20 61 77 2d 6e 2c 20 22 22  , zUtf, aw-n, ""
3460: 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  );.  }.}.../*.**
3470: 20 44 65 74 65 72 6d 69 6e 65 73 20 69 66 20 61   Determines if a
3480: 20 73 74 72 69 6e 67 20 69 73 20 61 20 6e 75 6d   string is a num
3490: 62 65 72 20 6f 66 20 6e 6f 74 2e 0a 2a 2f 0a 73  ber of not..*/.s
34a0: 74 61 74 69 63 20 69 6e 74 20 69 73 4e 75 6d 62  tatic int isNumb
34b0: 65 72 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  er(const char *z
34c0: 2c 20 69 6e 74 20 2a 72 65 61 6c 6e 75 6d 29 7b  , int *realnum){
34d0: 0a 20 20 69 66 28 20 2a 7a 3d 3d 27 2d 27 20 7c  .  if( *z=='-' |
34e0: 7c 20 2a 7a 3d 3d 27 2b 27 20 29 20 7a 2b 2b 3b  | *z=='+' ) z++;
34f0: 0a 20 20 69 66 28 20 21 49 73 44 69 67 69 74 28  .  if( !IsDigit(
3500: 2a 7a 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  *z) ){.    retur
3510: 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a 2b 2b 3b 0a  n 0;.  }.  z++;.
3520: 20 20 69 66 28 20 72 65 61 6c 6e 75 6d 20 29 20    if( realnum ) 
3530: 2a 72 65 61 6c 6e 75 6d 20 3d 20 30 3b 0a 20 20  *realnum = 0;.  
3540: 77 68 69 6c 65 28 20 49 73 44 69 67 69 74 28 2a  while( IsDigit(*
3550: 7a 29 20 29 7b 20 7a 2b 2b 3b 20 7d 0a 20 20 69  z) ){ z++; }.  i
3560: 66 28 20 2a 7a 3d 3d 27 2e 27 20 29 7b 0a 20 20  f( *z=='.' ){.  
3570: 20 20 7a 2b 2b 3b 0a 20 20 20 20 69 66 28 20 21    z++;.    if( !
3580: 49 73 44 69 67 69 74 28 2a 7a 29 20 29 20 72 65  IsDigit(*z) ) re
3590: 74 75 72 6e 20 30 3b 0a 20 20 20 20 77 68 69 6c  turn 0;.    whil
35a0: 65 28 20 49 73 44 69 67 69 74 28 2a 7a 29 20 29  e( IsDigit(*z) )
35b0: 7b 20 7a 2b 2b 3b 20 7d 0a 20 20 20 20 69 66 28  { z++; }.    if(
35c0: 20 72 65 61 6c 6e 75 6d 20 29 20 2a 72 65 61 6c   realnum ) *real
35d0: 6e 75 6d 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 69  num = 1;.  }.  i
35e0: 66 28 20 2a 7a 3d 3d 27 65 27 20 7c 7c 20 2a 7a  f( *z=='e' || *z
35f0: 3d 3d 27 45 27 20 29 7b 0a 20 20 20 20 7a 2b 2b  =='E' ){.    z++
3600: 3b 0a 20 20 20 20 69 66 28 20 2a 7a 3d 3d 27 2b  ;.    if( *z=='+
3610: 27 20 7c 7c 20 2a 7a 3d 3d 27 2d 27 20 29 20 7a  ' || *z=='-' ) z
3620: 2b 2b 3b 0a 20 20 20 20 69 66 28 20 21 49 73 44  ++;.    if( !IsD
3630: 69 67 69 74 28 2a 7a 29 20 29 20 72 65 74 75 72  igit(*z) ) retur
3640: 6e 20 30 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  n 0;.    while( 
3650: 49 73 44 69 67 69 74 28 2a 7a 29 20 29 7b 20 7a  IsDigit(*z) ){ z
3660: 2b 2b 3b 20 7d 0a 20 20 20 20 69 66 28 20 72 65  ++; }.    if( re
3670: 61 6c 6e 75 6d 20 29 20 2a 72 65 61 6c 6e 75 6d  alnum ) *realnum
3680: 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 1;.  }.  retu
3690: 72 6e 20 2a 7a 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a  rn *z==0;.}../*.
36a0: 2a 2a 20 43 6f 6d 70 75 74 65 20 61 20 73 74 72  ** Compute a str
36b0: 69 6e 67 20 6c 65 6e 67 74 68 20 74 68 61 74 20  ing length that 
36c0: 69 73 20 6c 69 6d 69 74 65 64 20 74 6f 20 77 68  is limited to wh
36d0: 61 74 20 63 61 6e 20 62 65 20 73 74 6f 72 65 64  at can be stored
36e0: 20 69 6e 0a 2a 2a 20 6c 6f 77 65 72 20 33 30 20   in.** lower 30 
36f0: 62 69 74 73 20 6f 66 20 61 20 33 32 2d 62 69 74  bits of a 32-bit
3700: 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 2e   signed integer.
3710: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
3720: 74 72 6c 65 6e 33 30 28 63 6f 6e 73 74 20 63 68  trlen30(const ch
3730: 61 72 20 2a 7a 29 7b 0a 20 20 63 6f 6e 73 74 20  ar *z){.  const 
3740: 63 68 61 72 20 2a 7a 32 20 3d 20 7a 3b 0a 20 20  char *z2 = z;.  
3750: 77 68 69 6c 65 28 20 2a 7a 32 20 29 7b 20 7a 32  while( *z2 ){ z2
3760: 2b 2b 3b 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ++; }.  return 0
3770: 78 33 66 66 66 66 66 66 66 20 26 20 28 69 6e 74  x3fffffff & (int
3780: 29 28 7a 32 20 2d 20 7a 29 3b 0a 7d 0a 0a 2f 2a  )(z2 - z);.}../*
3790: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6c  .** Return the l
37a0: 65 6e 67 74 68 20 6f 66 20 61 20 73 74 72 69 6e  ength of a strin
37b0: 67 20 69 6e 20 63 68 61 72 61 63 74 65 72 73 2e  g in characters.
37c0: 20 20 4d 75 6c 74 69 62 79 74 65 20 55 54 46 38    Multibyte UTF8
37d0: 20 63 68 61 72 61 63 74 65 72 73 0a 2a 2a 20 63   characters.** c
37e0: 6f 75 6e 74 20 61 73 20 61 20 73 69 6e 67 6c 65  ount as a single
37f0: 20 63 68 61 72 61 63 74 65 72 2e 0a 2a 2f 0a 73   character..*/.s
3800: 74 61 74 69 63 20 69 6e 74 20 73 74 72 6c 65 6e  tatic int strlen
3810: 43 68 61 72 28 63 6f 6e 73 74 20 63 68 61 72 20  Char(const char 
3820: 2a 7a 29 7b 0a 20 20 69 6e 74 20 6e 20 3d 20 30  *z){.  int n = 0
3830: 3b 0a 20 20 77 68 69 6c 65 28 20 2a 7a 20 29 7b  ;.  while( *z ){
3840: 0a 20 20 20 20 69 66 28 20 28 30 78 63 30 26 2a  .    if( (0xc0&*
3850: 28 7a 2b 2b 29 29 21 3d 30 78 38 30 20 29 20 6e  (z++))!=0x80 ) n
3860: 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ++;.  }.  return
3870: 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69   n;.}../*.** Thi
3880: 73 20 72 6f 75 74 69 6e 65 20 72 65 61 64 73 20  s routine reads 
3890: 61 20 6c 69 6e 65 20 6f 66 20 74 65 78 74 20 66  a line of text f
38a0: 72 6f 6d 20 46 49 4c 45 20 69 6e 2c 20 73 74 6f  rom FILE in, sto
38b0: 72 65 73 0a 2a 2a 20 74 68 65 20 74 65 78 74 20  res.** the text 
38c0: 69 6e 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e  in memory obtain
38d0: 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 28 29  ed from malloc()
38e0: 20 61 6e 64 20 72 65 74 75 72 6e 73 20 61 20 70   and returns a p
38f0: 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65  ointer.** to the
3900: 20 74 65 78 74 2e 20 20 4e 55 4c 4c 20 69 73 20   text.  NULL is 
3910: 72 65 74 75 72 6e 65 64 20 61 74 20 65 6e 64 20  returned at end 
3920: 6f 66 20 66 69 6c 65 2c 20 6f 72 20 69 66 20 6d  of file, or if m
3930: 61 6c 6c 6f 63 28 29 0a 2a 2a 20 66 61 69 6c 73  alloc().** fails
3940: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 4c 69 6e 65  ..**.** If zLine
3950: 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 74 68 65   is not NULL the
3960: 6e 20 69 74 20 69 73 20 61 20 6d 61 6c 6c 6f 63  n it is a malloc
3970: 65 64 20 62 75 66 66 65 72 20 72 65 74 75 72 6e  ed buffer return
3980: 65 64 20 66 72 6f 6d 0a 2a 2a 20 61 20 70 72 65  ed from.** a pre
3990: 76 69 6f 75 73 20 63 61 6c 6c 20 74 6f 20 74 68  vious call to th
39a0: 69 73 20 72 6f 75 74 69 6e 65 20 74 68 61 74 20  is routine that 
39b0: 6d 61 79 20 62 65 20 72 65 75 73 65 64 2e 0a 2a  may be reused..*
39c0: 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 6c  /.static char *l
39d0: 6f 63 61 6c 5f 67 65 74 6c 69 6e 65 28 63 68 61  ocal_getline(cha
39e0: 72 20 2a 7a 4c 69 6e 65 2c 20 46 49 4c 45 20 2a  r *zLine, FILE *
39f0: 69 6e 29 7b 0a 20 20 69 6e 74 20 6e 4c 69 6e 65  in){.  int nLine
3a00: 20 3d 20 7a 4c 69 6e 65 3d 3d 30 20 3f 20 30 20   = zLine==0 ? 0 
3a10: 3a 20 31 30 30 3b 0a 20 20 69 6e 74 20 6e 20 3d  : 100;.  int n =
3a20: 20 30 3b 0a 0a 20 20 77 68 69 6c 65 28 20 31 20   0;..  while( 1 
3a30: 29 7b 0a 20 20 20 20 69 66 28 20 6e 2b 31 30 30  ){.    if( n+100
3a40: 3e 6e 4c 69 6e 65 20 29 7b 0a 20 20 20 20 20 20  >nLine ){.      
3a50: 6e 4c 69 6e 65 20 3d 20 6e 4c 69 6e 65 2a 32 20  nLine = nLine*2 
3a60: 2b 20 31 30 30 3b 0a 20 20 20 20 20 20 7a 4c 69  + 100;.      zLi
3a70: 6e 65 20 3d 20 72 65 61 6c 6c 6f 63 28 7a 4c 69  ne = realloc(zLi
3a80: 6e 65 2c 20 6e 4c 69 6e 65 29 3b 0a 20 20 20 20  ne, nLine);.    
3a90: 20 20 69 66 28 20 7a 4c 69 6e 65 3d 3d 30 20 29    if( zLine==0 )
3aa0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
3ab0: 0a 20 20 20 20 69 66 28 20 66 67 65 74 73 28 26  .    if( fgets(&
3ac0: 7a 4c 69 6e 65 5b 6e 5d 2c 20 6e 4c 69 6e 65 20  zLine[n], nLine 
3ad0: 2d 20 6e 2c 20 69 6e 29 3d 3d 30 20 29 7b 0a 20  - n, in)==0 ){. 
3ae0: 20 20 20 20 20 69 66 28 20 6e 3d 3d 30 20 29 7b       if( n==0 ){
3af0: 0a 20 20 20 20 20 20 20 20 66 72 65 65 28 7a 4c  .        free(zL
3b00: 69 6e 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65  ine);.        re
3b10: 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a  turn 0;.      }.
3b20: 20 20 20 20 20 20 7a 4c 69 6e 65 5b 6e 5d 20 3d        zLine[n] =
3b30: 20 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   0;.      break;
3b40: 0a 20 20 20 20 7d 0a 20 20 20 20 77 68 69 6c 65  .    }.    while
3b50: 28 20 7a 4c 69 6e 65 5b 6e 5d 20 29 20 6e 2b 2b  ( zLine[n] ) n++
3b60: 3b 0a 20 20 20 20 69 66 28 20 6e 3e 30 20 26 26  ;.    if( n>0 &&
3b70: 20 7a 4c 69 6e 65 5b 6e 2d 31 5d 3d 3d 27 5c 6e   zLine[n-1]=='\n
3b80: 27 20 29 7b 0a 20 20 20 20 20 20 6e 2d 2d 3b 0a  ' ){.      n--;.
3b90: 20 20 20 20 20 20 69 66 28 20 6e 3e 30 20 26 26        if( n>0 &&
3ba0: 20 7a 4c 69 6e 65 5b 6e 2d 31 5d 3d 3d 27 5c 72   zLine[n-1]=='\r
3bb0: 27 20 29 20 6e 2d 2d 3b 0a 20 20 20 20 20 20 7a  ' ) n--;.      z
3bc0: 4c 69 6e 65 5b 6e 5d 20 3d 20 30 3b 0a 20 20 20  Line[n] = 0;.   
3bd0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
3be0: 20 20 7d 0a 23 69 66 20 64 65 66 69 6e 65 64 28    }.#if defined(
3bf0: 5f 57 49 4e 33 32 29 20 7c 7c 20 64 65 66 69 6e  _WIN32) || defin
3c00: 65 64 28 57 49 4e 33 32 29 0a 20 20 2f 2a 20 46  ed(WIN32).  /* F
3c10: 6f 72 20 69 6e 74 65 72 61 63 74 69 76 65 20 69  or interactive i
3c20: 6e 70 75 74 20 6f 6e 20 57 69 6e 64 6f 77 73 20  nput on Windows 
3c30: 73 79 73 74 65 6d 73 2c 20 74 72 61 6e 73 6c 61  systems, transla
3c40: 74 65 20 74 68 65 0a 20 20 2a 2a 20 6d 75 6c 74  te the.  ** mult
3c50: 69 2d 62 79 74 65 20 63 68 61 72 61 63 74 65 72  i-byte character
3c60: 73 65 74 20 63 68 61 72 61 63 74 65 72 73 20 69  set characters i
3c70: 6e 74 6f 20 55 54 46 2d 38 2e 20 2a 2f 0a 20 20  nto UTF-8. */.  
3c80: 69 66 28 20 73 74 64 69 6e 5f 69 73 5f 69 6e 74  if( stdin_is_int
3c90: 65 72 61 63 74 69 76 65 20 26 26 20 69 6e 3d 3d  eractive && in==
3ca0: 73 74 64 69 6e 20 29 7b 0a 20 20 20 20 63 68 61  stdin ){.    cha
3cb0: 72 20 2a 7a 54 72 61 6e 73 20 3d 20 73 71 6c 69  r *zTrans = sqli
3cc0: 74 65 33 5f 77 69 6e 33 32 5f 6d 62 63 73 5f 74  te3_win32_mbcs_t
3cd0: 6f 5f 75 74 66 38 5f 76 32 28 7a 4c 69 6e 65 2c  o_utf8_v2(zLine,
3ce0: 20 30 29 3b 0a 20 20 20 20 69 66 28 20 7a 54 72   0);.    if( zTr
3cf0: 61 6e 73 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ans ){.      int
3d00: 20 6e 54 72 61 6e 73 20 3d 20 73 74 72 6c 65 6e   nTrans = strlen
3d10: 33 30 28 7a 54 72 61 6e 73 29 2b 31 3b 0a 20 20  30(zTrans)+1;.  
3d20: 20 20 20 20 69 66 28 20 6e 54 72 61 6e 73 3e 6e      if( nTrans>n
3d30: 4c 69 6e 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Line ){.        
3d40: 7a 4c 69 6e 65 20 3d 20 72 65 61 6c 6c 6f 63 28  zLine = realloc(
3d50: 7a 4c 69 6e 65 2c 20 6e 54 72 61 6e 73 29 3b 0a  zLine, nTrans);.
3d60: 20 20 20 20 20 20 20 20 69 66 28 20 7a 4c 69 6e          if( zLin
3d70: 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e==0 ){.        
3d80: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
3d90: 54 72 61 6e 73 29 3b 0a 20 20 20 20 20 20 20 20  Trans);.        
3da0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
3db0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
3dc0: 20 20 20 20 6d 65 6d 63 70 79 28 7a 4c 69 6e 65      memcpy(zLine
3dd0: 2c 20 7a 54 72 61 6e 73 2c 20 6e 54 72 61 6e 73  , zTrans, nTrans
3de0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
3df0: 5f 66 72 65 65 28 7a 54 72 61 6e 73 29 3b 0a 20  _free(zTrans);. 
3e00: 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 20     }.  }.#endif 
3e10: 2f 2a 20 64 65 66 69 6e 65 64 28 5f 57 49 4e 33  /* defined(_WIN3
3e20: 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 57 49  2) || defined(WI
3e30: 4e 33 32 29 20 2a 2f 0a 20 20 72 65 74 75 72 6e  N32) */.  return
3e40: 20 7a 4c 69 6e 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   zLine;.}../*.**
3e50: 20 52 65 74 72 69 65 76 65 20 61 20 73 69 6e 67   Retrieve a sing
3e60: 6c 65 20 6c 69 6e 65 20 6f 66 20 69 6e 70 75 74  le line of input
3e70: 20 74 65 78 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   text..**.** If 
3e80: 69 6e 3d 3d 30 20 74 68 65 6e 20 72 65 61 64 20  in==0 then read 
3e90: 66 72 6f 6d 20 73 74 61 6e 64 61 72 64 20 69 6e  from standard in
3ea0: 70 75 74 20 61 6e 64 20 70 72 6f 6d 70 74 20 62  put and prompt b
3eb0: 65 66 6f 72 65 20 65 61 63 68 20 6c 69 6e 65 2e  efore each line.
3ec0: 0a 2a 2a 20 49 66 20 69 73 43 6f 6e 74 69 6e 75  .** If isContinu
3ed0: 61 74 69 6f 6e 20 69 73 20 74 72 75 65 2c 20 74  ation is true, t
3ee0: 68 65 6e 20 61 20 63 6f 6e 74 69 6e 75 61 74 69  hen a continuati
3ef0: 6f 6e 20 70 72 6f 6d 70 74 20 69 73 20 61 70 70  on prompt is app
3f00: 72 6f 70 72 69 61 74 65 2e 0a 2a 2a 20 49 66 20  ropriate..** If 
3f10: 69 73 43 6f 6e 74 69 6e 75 61 74 69 6f 6e 20 69  isContinuation i
3f20: 73 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65  s zero, then the
3f30: 20 6d 61 69 6e 20 70 72 6f 6d 70 74 20 73 68 6f   main prompt sho
3f40: 75 6c 64 20 62 65 20 75 73 65 64 2e 0a 2a 2a 0a  uld be used..**.
3f50: 2a 2a 20 49 66 20 7a 50 72 69 6f 72 20 69 73 20  ** If zPrior is 
3f60: 6e 6f 74 20 4e 55 4c 4c 20 74 68 65 6e 20 69 74  not NULL then it
3f70: 20 69 73 20 61 20 62 75 66 66 65 72 20 66 72 6f   is a buffer fro
3f80: 6d 20 61 20 70 72 69 6f 72 20 63 61 6c 6c 20 74  m a prior call t
3f90: 6f 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e  o this.** routin
3fa0: 65 20 74 68 61 74 20 63 61 6e 20 62 65 20 72 65  e that can be re
3fb0: 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  used..**.** The 
3fc0: 72 65 73 75 6c 74 20 69 73 20 73 74 6f 72 65 64  result is stored
3fd0: 20 69 6e 20 73 70 61 63 65 20 6f 62 74 61 69 6e   in space obtain
3fe0: 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 28 29  ed from malloc()
3ff0: 20 61 6e 64 20 6d 75 73 74 20 65 69 74 68 65 72   and must either
4000: 0a 2a 2a 20 62 65 20 66 72 65 65 64 20 62 79 20  .** be freed by 
4010: 74 68 65 20 63 61 6c 6c 65 72 20 6f 72 20 65 6c  the caller or el
4020: 73 65 20 70 61 73 73 65 64 20 62 61 63 6b 20 69  se passed back i
4030: 6e 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65  nto this routine
4040: 20 76 69 61 20 74 68 65 0a 2a 2a 20 7a 50 72 69   via the.** zPri
4050: 6f 72 20 61 72 67 75 6d 65 6e 74 20 66 6f 72 20  or argument for 
4060: 72 65 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  reuse..*/.static
4070: 20 63 68 61 72 20 2a 6f 6e 65 5f 69 6e 70 75 74   char *one_input
4080: 5f 6c 69 6e 65 28 46 49 4c 45 20 2a 69 6e 2c 20  _line(FILE *in, 
4090: 63 68 61 72 20 2a 7a 50 72 69 6f 72 2c 20 69 6e  char *zPrior, in
40a0: 74 20 69 73 43 6f 6e 74 69 6e 75 61 74 69 6f 6e  t isContinuation
40b0: 29 7b 0a 20 20 63 68 61 72 20 2a 7a 50 72 6f 6d  ){.  char *zProm
40c0: 70 74 3b 0a 20 20 63 68 61 72 20 2a 7a 52 65 73  pt;.  char *zRes
40d0: 75 6c 74 3b 0a 20 20 69 66 28 20 69 6e 21 3d 30  ult;.  if( in!=0
40e0: 20 29 7b 0a 20 20 20 20 7a 52 65 73 75 6c 74 20   ){.    zResult 
40f0: 3d 20 6c 6f 63 61 6c 5f 67 65 74 6c 69 6e 65 28  = local_getline(
4100: 7a 50 72 69 6f 72 2c 20 69 6e 29 3b 0a 20 20 7d  zPrior, in);.  }
4110: 65 6c 73 65 7b 0a 20 20 20 20 7a 50 72 6f 6d 70  else{.    zPromp
4120: 74 20 3d 20 69 73 43 6f 6e 74 69 6e 75 61 74 69  t = isContinuati
4130: 6f 6e 20 3f 20 63 6f 6e 74 69 6e 75 65 50 72 6f  on ? continuePro
4140: 6d 70 74 20 3a 20 6d 61 69 6e 50 72 6f 6d 70 74  mpt : mainPrompt
4150: 3b 0a 23 69 66 20 53 48 45 4c 4c 5f 55 53 45 5f  ;.#if SHELL_USE_
4160: 4c 4f 43 41 4c 5f 47 45 54 4c 49 4e 45 0a 20 20  LOCAL_GETLINE.  
4170: 20 20 70 72 69 6e 74 66 28 22 25 73 22 2c 20 7a    printf("%s", z
4180: 50 72 6f 6d 70 74 29 3b 0a 20 20 20 20 66 66 6c  Prompt);.    ffl
4190: 75 73 68 28 73 74 64 6f 75 74 29 3b 0a 20 20 20  ush(stdout);.   
41a0: 20 7a 52 65 73 75 6c 74 20 3d 20 6c 6f 63 61 6c   zResult = local
41b0: 5f 67 65 74 6c 69 6e 65 28 7a 50 72 69 6f 72 2c  _getline(zPrior,
41c0: 20 73 74 64 69 6e 29 3b 0a 23 65 6c 73 65 0a 20   stdin);.#else. 
41d0: 20 20 20 66 72 65 65 28 7a 50 72 69 6f 72 29 3b     free(zPrior);
41e0: 0a 20 20 20 20 7a 52 65 73 75 6c 74 20 3d 20 73  .    zResult = s
41f0: 68 65 6c 6c 5f 72 65 61 64 6c 69 6e 65 28 7a 50  hell_readline(zP
4200: 72 6f 6d 70 74 29 3b 0a 20 20 20 20 69 66 28 20  rompt);.    if( 
4210: 7a 52 65 73 75 6c 74 20 26 26 20 2a 7a 52 65 73  zResult && *zRes
4220: 75 6c 74 20 29 20 73 68 65 6c 6c 5f 61 64 64 5f  ult ) shell_add_
4230: 68 69 73 74 6f 72 79 28 7a 52 65 73 75 6c 74 29  history(zResult)
4240: 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 72  ;.#endif.  }.  r
4250: 65 74 75 72 6e 20 7a 52 65 73 75 6c 74 3b 0a 7d  eturn zResult;.}
4260: 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  .../*.** Return 
4270: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 61 20 68  the value of a h
4280: 65 78 61 64 65 63 69 6d 61 6c 20 64 69 67 69 74  exadecimal digit
4290: 2e 20 20 52 65 74 75 72 6e 20 2d 31 20 69 66 20  .  Return -1 if 
42a0: 74 68 65 20 69 6e 70 75 74 0a 2a 2a 20 69 73 20  the input.** is 
42b0: 6e 6f 74 20 61 20 68 65 78 20 64 69 67 69 74 2e  not a hex digit.
42c0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 68  .*/.static int h
42d0: 65 78 44 69 67 69 74 56 61 6c 75 65 28 63 68 61  exDigitValue(cha
42e0: 72 20 63 29 7b 0a 20 20 69 66 28 20 63 3e 3d 27  r c){.  if( c>='
42f0: 30 27 20 26 26 20 63 3c 3d 27 39 27 20 29 20 72  0' && c<='9' ) r
4300: 65 74 75 72 6e 20 63 20 2d 20 27 30 27 3b 0a 20  eturn c - '0';. 
4310: 20 69 66 28 20 63 3e 3d 27 61 27 20 26 26 20 63   if( c>='a' && c
4320: 3c 3d 27 66 27 20 29 20 72 65 74 75 72 6e 20 63  <='f' ) return c
4330: 20 2d 20 27 61 27 20 2b 20 31 30 3b 0a 20 20 69   - 'a' + 10;.  i
4340: 66 28 20 63 3e 3d 27 41 27 20 26 26 20 63 3c 3d  f( c>='A' && c<=
4350: 27 46 27 20 29 20 72 65 74 75 72 6e 20 63 20 2d  'F' ) return c -
4360: 20 27 41 27 20 2b 20 31 30 3b 0a 20 20 72 65 74   'A' + 10;.  ret
4370: 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn -1;.}../*.**
4380: 20 49 6e 74 65 72 70 72 65 74 20 7a 41 72 67 20   Interpret zArg 
4390: 61 73 20 61 6e 20 69 6e 74 65 67 65 72 20 76 61  as an integer va
43a0: 6c 75 65 2c 20 70 6f 73 73 69 62 6c 79 20 77 69  lue, possibly wi
43b0: 74 68 20 73 75 66 66 69 78 65 73 2e 0a 2a 2f 0a  th suffixes..*/.
43c0: 73 74 61 74 69 63 20 73 71 6c 69 74 65 33 5f 69  static sqlite3_i
43d0: 6e 74 36 34 20 69 6e 74 65 67 65 72 56 61 6c 75  nt64 integerValu
43e0: 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41  e(const char *zA
43f0: 72 67 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69  rg){.  sqlite3_i
4400: 6e 74 36 34 20 76 20 3d 20 30 3b 0a 20 20 73 74  nt64 v = 0;.  st
4410: 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63  atic const struc
4420: 74 20 7b 20 63 68 61 72 20 2a 7a 53 75 66 66 69  t { char *zSuffi
4430: 78 3b 20 69 6e 74 20 69 4d 75 6c 74 3b 20 7d 20  x; int iMult; } 
4440: 61 4d 75 6c 74 5b 5d 20 3d 20 7b 0a 20 20 20 20  aMult[] = {.    
4450: 7b 20 22 4b 69 42 22 2c 20 31 30 32 34 20 7d 2c  { "KiB", 1024 },
4460: 0a 20 20 20 20 7b 20 22 4d 69 42 22 2c 20 31 30  .    { "MiB", 10
4470: 32 34 2a 31 30 32 34 20 7d 2c 0a 20 20 20 20 7b  24*1024 },.    {
4480: 20 22 47 69 42 22 2c 20 31 30 32 34 2a 31 30 32   "GiB", 1024*102
4490: 34 2a 31 30 32 34 20 7d 2c 0a 20 20 20 20 7b 20  4*1024 },.    { 
44a0: 22 4b 42 22 2c 20 20 31 30 30 30 20 7d 2c 0a 20  "KB",  1000 },. 
44b0: 20 20 20 7b 20 22 4d 42 22 2c 20 20 31 30 30 30     { "MB",  1000
44c0: 30 30 30 20 7d 2c 0a 20 20 20 20 7b 20 22 47 42  000 },.    { "GB
44d0: 22 2c 20 20 31 30 30 30 30 30 30 30 30 30 20 7d  ",  1000000000 }
44e0: 2c 0a 20 20 20 20 7b 20 22 4b 22 2c 20 20 20 31  ,.    { "K",   1
44f0: 30 30 30 20 7d 2c 0a 20 20 20 20 7b 20 22 4d 22  000 },.    { "M"
4500: 2c 20 20 20 31 30 30 30 30 30 30 20 7d 2c 0a 20  ,   1000000 },. 
4510: 20 20 20 7b 20 22 47 22 2c 20 20 20 31 30 30 30     { "G",   1000
4520: 30 30 30 30 30 30 20 7d 2c 0a 20 20 7d 3b 0a 20  000000 },.  };. 
4530: 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 69 73   int i;.  int is
4540: 4e 65 67 20 3d 20 30 3b 0a 20 20 69 66 28 20 7a  Neg = 0;.  if( z
4550: 41 72 67 5b 30 5d 3d 3d 27 2d 27 20 29 7b 0a 20  Arg[0]=='-' ){. 
4560: 20 20 20 69 73 4e 65 67 20 3d 20 31 3b 0a 20 20     isNeg = 1;.  
4570: 20 20 7a 41 72 67 2b 2b 3b 0a 20 20 7d 65 6c 73    zArg++;.  }els
4580: 65 20 69 66 28 20 7a 41 72 67 5b 30 5d 3d 3d 27  e if( zArg[0]=='
4590: 2b 27 20 29 7b 0a 20 20 20 20 7a 41 72 67 2b 2b  +' ){.    zArg++
45a0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a 41 72 67  ;.  }.  if( zArg
45b0: 5b 30 5d 3d 3d 27 30 27 20 26 26 20 7a 41 72 67  [0]=='0' && zArg
45c0: 5b 31 5d 3d 3d 27 78 27 20 29 7b 0a 20 20 20 20  [1]=='x' ){.    
45d0: 69 6e 74 20 78 3b 0a 20 20 20 20 7a 41 72 67 20  int x;.    zArg 
45e0: 2b 3d 20 32 3b 0a 20 20 20 20 77 68 69 6c 65 28  += 2;.    while(
45f0: 20 28 78 20 3d 20 68 65 78 44 69 67 69 74 56 61   (x = hexDigitVa
4600: 6c 75 65 28 7a 41 72 67 5b 30 5d 29 29 3e 3d 30  lue(zArg[0]))>=0
4610: 20 29 7b 0a 20 20 20 20 20 20 76 20 3d 20 28 76   ){.      v = (v
4620: 3c 3c 34 29 20 2b 20 78 3b 0a 20 20 20 20 20 20  <<4) + x;.      
4630: 7a 41 72 67 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  zArg++;.    }.  
4640: 7d 65 6c 73 65 7b 0a 20 20 20 20 77 68 69 6c 65  }else{.    while
4650: 28 20 49 73 44 69 67 69 74 28 7a 41 72 67 5b 30  ( IsDigit(zArg[0
4660: 5d 29 20 29 7b 0a 20 20 20 20 20 20 76 20 3d 20  ]) ){.      v = 
4670: 76 2a 31 30 20 2b 20 7a 41 72 67 5b 30 5d 20 2d  v*10 + zArg[0] -
4680: 20 27 30 27 3b 0a 20 20 20 20 20 20 7a 41 72 67   '0';.      zArg
4690: 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ++;.    }.  }.  
46a0: 66 6f 72 28 69 3d 30 3b 20 69 3c 41 72 72 61 79  for(i=0; i<Array
46b0: 53 69 7a 65 28 61 4d 75 6c 74 29 3b 20 69 2b 2b  Size(aMult); i++
46c0: 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  ){.    if( sqlit
46d0: 65 33 5f 73 74 72 69 63 6d 70 28 61 4d 75 6c 74  e3_stricmp(aMult
46e0: 5b 69 5d 2e 7a 53 75 66 66 69 78 2c 20 7a 41 72  [i].zSuffix, zAr
46f0: 67 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 76  g)==0 ){.      v
4700: 20 2a 3d 20 61 4d 75 6c 74 5b 69 5d 2e 69 4d 75   *= aMult[i].iMu
4710: 6c 74 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  lt;.      break;
4720: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
4730: 75 72 6e 20 69 73 4e 65 67 3f 20 2d 76 20 3a 20  urn isNeg? -v : 
4740: 76 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 76 61  v;.}../*.** A va
4750: 72 69 61 62 6c 65 20 6c 65 6e 67 74 68 20 73 74  riable length st
4760: 72 69 6e 67 20 74 6f 20 77 68 69 63 68 20 6f 6e  ring to which on
4770: 65 20 63 61 6e 20 61 70 70 65 6e 64 20 74 65 78  e can append tex
4780: 74 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  t..*/.typedef st
4790: 72 75 63 74 20 53 68 65 6c 6c 54 65 78 74 20 53  ruct ShellText S
47a0: 68 65 6c 6c 54 65 78 74 3b 0a 73 74 72 75 63 74  hellText;.struct
47b0: 20 53 68 65 6c 6c 54 65 78 74 20 7b 0a 20 20 63   ShellText {.  c
47c0: 68 61 72 20 2a 7a 3b 0a 20 20 69 6e 74 20 6e 3b  har *z;.  int n;
47d0: 0a 20 20 69 6e 74 20 6e 41 6c 6c 6f 63 3b 0a 7d  .  int nAlloc;.}
47e0: 3b 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c  ;../*.** Initial
47f0: 69 7a 65 20 61 6e 64 20 64 65 73 74 72 6f 79 20  ize and destroy 
4800: 61 20 53 68 65 6c 6c 54 65 78 74 20 6f 62 6a 65  a ShellText obje
4810: 63 74 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  ct.*/.static voi
4820: 64 20 69 6e 69 74 54 65 78 74 28 53 68 65 6c 6c  d initText(Shell
4830: 54 65 78 74 20 2a 70 29 7b 0a 20 20 6d 65 6d 73  Text *p){.  mems
4840: 65 74 28 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28  et(p, 0, sizeof(
4850: 2a 70 29 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76  *p));.}.static v
4860: 6f 69 64 20 66 72 65 65 54 65 78 74 28 53 68 65  oid freeText(She
4870: 6c 6c 54 65 78 74 20 2a 70 29 7b 0a 20 20 66 72  llText *p){.  fr
4880: 65 65 28 70 2d 3e 7a 29 3b 0a 20 20 69 6e 69 74  ee(p->z);.  init
4890: 54 65 78 74 28 70 29 3b 0a 7d 0a 0a 2f 2a 20 7a  Text(p);.}../* z
48a0: 49 6e 20 69 73 20 65 69 74 68 65 72 20 61 20 70  In is either a p
48b0: 6f 69 6e 74 65 72 20 74 6f 20 61 20 4e 55 4c 4c  ointer to a NULL
48c0: 2d 74 65 72 6d 69 6e 61 74 65 64 20 73 74 72 69  -terminated stri
48d0: 6e 67 20 69 6e 20 6d 65 6d 6f 72 79 20 6f 62 74  ng in memory obt
48e0: 61 69 6e 65 64 0a 2a 2a 20 66 72 6f 6d 20 6d 61  ained.** from ma
48f0: 6c 6c 6f 63 28 29 2c 20 6f 72 20 61 20 4e 55 4c  lloc(), or a NUL
4900: 4c 20 70 6f 69 6e 74 65 72 2e 20 54 68 65 20 73  L pointer. The s
4910: 74 72 69 6e 67 20 70 6f 69 6e 74 65 64 20 74 6f  tring pointed to
4920: 20 62 79 20 7a 41 70 70 65 6e 64 20 69 73 0a 2a   by zAppend is.*
4930: 2a 20 61 64 64 65 64 20 74 6f 20 7a 49 6e 2c 20  * added to zIn, 
4940: 61 6e 64 20 74 68 65 20 72 65 73 75 6c 74 20 72  and the result r
4950: 65 74 75 72 6e 65 64 20 69 6e 20 6d 65 6d 6f 72  eturned in memor
4960: 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  y obtained from 
4970: 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 7a 49 6e  malloc()..** zIn
4980: 2c 20 69 66 20 69 74 20 77 61 73 20 6e 6f 74 20  , if it was not 
4990: 4e 55 4c 4c 2c 20 69 73 20 66 72 65 65 64 2e 0a  NULL, is freed..
49a0: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 74 68 69  **.** If the thi
49b0: 72 64 20 61 72 67 75 6d 65 6e 74 2c 20 71 75 6f  rd argument, quo
49c0: 74 65 2c 20 69 73 20 6e 6f 74 20 27 5c 30 27 2c  te, is not '\0',
49d0: 20 74 68 65 6e 20 69 74 20 69 73 20 75 73 65 64   then it is used
49e0: 20 61 73 20 61 0a 2a 2a 20 71 75 6f 74 65 20 63   as a.** quote c
49f0: 68 61 72 61 63 74 65 72 20 66 6f 72 20 7a 41 70  haracter for zAp
4a00: 70 65 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  pend..*/.static 
4a10: 76 6f 69 64 20 61 70 70 65 6e 64 54 65 78 74 28  void appendText(
4a20: 53 68 65 6c 6c 54 65 78 74 20 2a 70 2c 20 63 68  ShellText *p, ch
4a30: 61 72 20 63 6f 6e 73 74 20 2a 7a 41 70 70 65 6e  ar const *zAppen
4a40: 64 2c 20 63 68 61 72 20 71 75 6f 74 65 29 7b 0a  d, char quote){.
4a50: 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 69 6e 74    int len;.  int
4a60: 20 69 3b 0a 20 20 69 6e 74 20 6e 41 70 70 65 6e   i;.  int nAppen
4a70: 64 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a 41 70  d = strlen30(zAp
4a80: 70 65 6e 64 29 3b 0a 0a 20 20 6c 65 6e 20 3d 20  pend);..  len = 
4a90: 6e 41 70 70 65 6e 64 2b 70 2d 3e 6e 2b 31 3b 0a  nAppend+p->n+1;.
4aa0: 20 20 69 66 28 20 71 75 6f 74 65 20 29 7b 0a 20    if( quote ){. 
4ab0: 20 20 20 6c 65 6e 20 2b 3d 20 32 3b 0a 20 20 20     len += 2;.   
4ac0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 70 70   for(i=0; i<nApp
4ad0: 65 6e 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  end; i++){.     
4ae0: 20 69 66 28 20 7a 41 70 70 65 6e 64 5b 69 5d 3d   if( zAppend[i]=
4af0: 3d 71 75 6f 74 65 20 29 20 6c 65 6e 2b 2b 3b 0a  =quote ) len++;.
4b00: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28      }.  }..  if(
4b10: 20 70 2d 3e 6e 2b 6c 65 6e 3e 3d 70 2d 3e 6e 41   p->n+len>=p->nA
4b20: 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 70 2d 3e 6e  lloc ){.    p->n
4b30: 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 41 6c 6c 6f  Alloc = p->nAllo
4b40: 63 2a 32 20 2b 20 6c 65 6e 20 2b 20 32 30 3b 0a  c*2 + len + 20;.
4b50: 20 20 20 20 70 2d 3e 7a 20 3d 20 72 65 61 6c 6c      p->z = reall
4b60: 6f 63 28 70 2d 3e 7a 2c 20 70 2d 3e 6e 41 6c 6c  oc(p->z, p->nAll
4b70: 6f 63 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  oc);.    if( p->
4b80: 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6d 65  z==0 ){.      me
4b90: 6d 73 65 74 28 70 2c 20 30 2c 20 73 69 7a 65 6f  mset(p, 0, sizeo
4ba0: 66 28 2a 70 29 29 3b 0a 20 20 20 20 20 20 72 65  f(*p));.      re
4bb0: 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  turn;.    }.  }.
4bc0: 0a 20 20 69 66 28 20 71 75 6f 74 65 20 29 7b 0a  .  if( quote ){.
4bd0: 20 20 20 20 63 68 61 72 20 2a 7a 43 73 72 20 3d      char *zCsr =
4be0: 20 70 2d 3e 7a 2b 70 2d 3e 6e 3b 0a 20 20 20 20   p->z+p->n;.    
4bf0: 2a 7a 43 73 72 2b 2b 20 3d 20 71 75 6f 74 65 3b  *zCsr++ = quote;
4c00: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
4c10: 6e 41 70 70 65 6e 64 3b 20 69 2b 2b 29 7b 0a 20  nAppend; i++){. 
4c20: 20 20 20 20 20 2a 7a 43 73 72 2b 2b 20 3d 20 7a       *zCsr++ = z
4c30: 41 70 70 65 6e 64 5b 69 5d 3b 0a 20 20 20 20 20  Append[i];.     
4c40: 20 69 66 28 20 7a 41 70 70 65 6e 64 5b 69 5d 3d   if( zAppend[i]=
4c50: 3d 71 75 6f 74 65 20 29 20 2a 7a 43 73 72 2b 2b  =quote ) *zCsr++
4c60: 20 3d 20 71 75 6f 74 65 3b 0a 20 20 20 20 7d 0a   = quote;.    }.
4c70: 20 20 20 20 2a 7a 43 73 72 2b 2b 20 3d 20 71 75      *zCsr++ = qu
4c80: 6f 74 65 3b 0a 20 20 20 20 70 2d 3e 6e 20 3d 20  ote;.    p->n = 
4c90: 28 69 6e 74 29 28 7a 43 73 72 20 2d 20 70 2d 3e  (int)(zCsr - p->
4ca0: 7a 29 3b 0a 20 20 20 20 2a 7a 43 73 72 20 3d 20  z);.    *zCsr = 
4cb0: 27 5c 30 27 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  '\0';.  }else{. 
4cc0: 20 20 20 6d 65 6d 63 70 79 28 70 2d 3e 7a 2b 70     memcpy(p->z+p
4cd0: 2d 3e 6e 2c 20 7a 41 70 70 65 6e 64 2c 20 6e 41  ->n, zAppend, nA
4ce0: 70 70 65 6e 64 29 3b 0a 20 20 20 20 70 2d 3e 6e  ppend);.    p->n
4cf0: 20 2b 3d 20 6e 41 70 70 65 6e 64 3b 0a 20 20 20   += nAppend;.   
4d00: 20 70 2d 3e 7a 5b 70 2d 3e 6e 5d 20 3d 20 27 5c   p->z[p->n] = '\
4d10: 30 27 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  0';.  }.}../*.**
4d20: 20 41 74 74 65 6d 70 74 20 74 6f 20 64 65 74 65   Attempt to dete
4d30: 72 6d 69 6e 65 20 69 66 20 69 64 65 6e 74 69 66  rmine if identif
4d40: 69 65 72 20 7a 4e 61 6d 65 20 6e 65 65 64 73 20  ier zName needs 
4d50: 74 6f 20 62 65 20 71 75 6f 74 65 64 2c 20 65 69  to be quoted, ei
4d60: 74 68 65 72 0a 2a 2a 20 62 65 63 61 75 73 65 20  ther.** because 
4d70: 69 74 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 6e 2d  it contains non-
4d80: 61 6c 70 68 61 6e 75 6d 65 72 69 63 20 63 68 61  alphanumeric cha
4d90: 72 61 63 74 65 72 73 2c 20 6f 72 20 62 65 63 61  racters, or beca
4da0: 75 73 65 20 69 74 20 69 73 20 61 6e 0a 2a 2a 20  use it is an.** 
4db0: 53 51 4c 69 74 65 20 6b 65 79 77 6f 72 64 2e 20  SQLite keyword. 
4dc0: 20 42 65 20 63 6f 6e 73 65 72 76 61 74 69 76 65   Be conservative
4dd0: 20 69 6e 20 74 68 69 73 20 65 73 74 69 6d 61 74   in this estimat
4de0: 65 3a 20 20 57 68 65 6e 20 69 6e 20 64 6f 75 62  e:  When in doub
4df0: 74 20 61 73 73 75 6d 65 0a 2a 2a 20 74 68 61 74  t assume.** that
4e00: 20 71 75 6f 74 69 6e 67 20 69 73 20 72 65 71 75   quoting is requ
4e10: 69 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  ired..**.** Retu
4e20: 72 6e 20 27 22 27 20 69 66 20 71 75 6f 74 69 6e  rn '"' if quotin
4e30: 67 20 69 73 20 72 65 71 75 69 72 65 64 2e 20 20  g is required.  
4e40: 52 65 74 75 72 6e 20 30 20 69 66 20 6e 6f 20 71  Return 0 if no q
4e50: 75 6f 74 69 6e 67 20 69 73 20 72 65 71 75 69 72  uoting is requir
4e60: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68  ed..*/.static ch
4e70: 61 72 20 71 75 6f 74 65 43 68 61 72 28 63 6f 6e  ar quoteChar(con
4e80: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b  st char *zName){
4e90: 0a 20 20 2f 2a 20 41 6c 6c 20 53 51 4c 69 74 65  .  /* All SQLite
4ea0: 20 6b 65 79 77 6f 72 64 73 2c 20 69 6e 20 61 6c   keywords, in al
4eb0: 70 68 61 62 65 74 69 63 61 6c 20 6f 72 64 65 72  phabetical order
4ec0: 20 2a 2f 0a 20 20 73 74 61 74 69 63 20 63 6f 6e   */.  static con
4ed0: 73 74 20 63 68 61 72 20 2a 61 7a 4b 65 79 77 6f  st char *azKeywo
4ee0: 72 64 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 22 41  rds[] = {.    "A
4ef0: 42 4f 52 54 22 2c 20 22 41 43 54 49 4f 4e 22 2c  BORT", "ACTION",
4f00: 20 22 41 44 44 22 2c 20 22 41 46 54 45 52 22 2c   "ADD", "AFTER",
4f10: 20 22 41 4c 4c 22 2c 20 22 41 4c 54 45 52 22 2c   "ALL", "ALTER",
4f20: 20 22 41 4e 41 4c 59 5a 45 22 2c 20 22 41 4e 44   "ANALYZE", "AND
4f30: 22 2c 20 22 41 53 22 2c 0a 20 20 20 20 22 41 53  ", "AS",.    "AS
4f40: 43 22 2c 20 22 41 54 54 41 43 48 22 2c 20 22 41  C", "ATTACH", "A
4f50: 55 54 4f 49 4e 43 52 45 4d 45 4e 54 22 2c 20 22  UTOINCREMENT", "
4f60: 42 45 46 4f 52 45 22 2c 20 22 42 45 47 49 4e 22  BEFORE", "BEGIN"
4f70: 2c 20 22 42 45 54 57 45 45 4e 22 2c 20 22 42 59  , "BETWEEN", "BY
4f80: 22 2c 0a 20 20 20 20 22 43 41 53 43 41 44 45 22  ",.    "CASCADE"
4f90: 2c 20 22 43 41 53 45 22 2c 20 22 43 41 53 54 22  , "CASE", "CAST"
4fa0: 2c 20 22 43 48 45 43 4b 22 2c 20 22 43 4f 4c 4c  , "CHECK", "COLL
4fb0: 41 54 45 22 2c 20 22 43 4f 4c 55 4d 4e 22 2c 20  ATE", "COLUMN", 
4fc0: 22 43 4f 4d 4d 49 54 22 2c 0a 20 20 20 20 22 43  "COMMIT",.    "C
4fd0: 4f 4e 46 4c 49 43 54 22 2c 20 22 43 4f 4e 53 54  ONFLICT", "CONST
4fe0: 52 41 49 4e 54 22 2c 20 22 43 52 45 41 54 45 22  RAINT", "CREATE"
4ff0: 2c 20 22 43 52 4f 53 53 22 2c 20 22 43 55 52 52  , "CROSS", "CURR
5000: 45 4e 54 5f 44 41 54 45 22 2c 0a 20 20 20 20 22  ENT_DATE",.    "
5010: 43 55 52 52 45 4e 54 5f 54 49 4d 45 22 2c 20 22  CURRENT_TIME", "
5020: 43 55 52 52 45 4e 54 5f 54 49 4d 45 53 54 41 4d  CURRENT_TIMESTAM
5030: 50 22 2c 20 22 44 41 54 41 42 41 53 45 22 2c 20  P", "DATABASE", 
5040: 22 44 45 46 41 55 4c 54 22 2c 20 22 44 45 46 45  "DEFAULT", "DEFE
5050: 52 52 41 42 4c 45 22 2c 0a 20 20 20 20 22 44 45  RRABLE",.    "DE
5060: 46 45 52 52 45 44 22 2c 20 22 44 45 4c 45 54 45  FERRED", "DELETE
5070: 22 2c 20 22 44 45 53 43 22 2c 20 22 44 45 54 41  ", "DESC", "DETA
5080: 43 48 22 2c 20 22 44 49 53 54 49 4e 43 54 22 2c  CH", "DISTINCT",
5090: 20 22 44 52 4f 50 22 2c 20 22 45 41 43 48 22 2c   "DROP", "EACH",
50a0: 0a 20 20 20 20 22 45 4c 53 45 22 2c 20 22 45 4e  .    "ELSE", "EN
50b0: 44 22 2c 20 22 45 53 43 41 50 45 22 2c 20 22 45  D", "ESCAPE", "E
50c0: 58 43 45 50 54 22 2c 20 22 45 58 43 4c 55 53 49  XCEPT", "EXCLUSI
50d0: 56 45 22 2c 20 22 45 58 49 53 54 53 22 2c 20 22  VE", "EXISTS", "
50e0: 45 58 50 4c 41 49 4e 22 2c 0a 20 20 20 20 22 46  EXPLAIN",.    "F
50f0: 41 49 4c 22 2c 20 22 46 4f 52 22 2c 20 22 46 4f  AIL", "FOR", "FO
5100: 52 45 49 47 4e 22 2c 20 22 46 52 4f 4d 22 2c 20  REIGN", "FROM", 
5110: 22 46 55 4c 4c 22 2c 20 22 47 4c 4f 42 22 2c 20  "FULL", "GLOB", 
5120: 22 47 52 4f 55 50 22 2c 20 22 48 41 56 49 4e 47  "GROUP", "HAVING
5130: 22 2c 20 22 49 46 22 2c 0a 20 20 20 20 22 49 47  ", "IF",.    "IG
5140: 4e 4f 52 45 22 2c 20 22 49 4d 4d 45 44 49 41 54  NORE", "IMMEDIAT
5150: 45 22 2c 20 22 49 4e 22 2c 20 22 49 4e 44 45 58  E", "IN", "INDEX
5160: 22 2c 20 22 49 4e 44 45 58 45 44 22 2c 20 22 49  ", "INDEXED", "I
5170: 4e 49 54 49 41 4c 4c 59 22 2c 20 22 49 4e 4e 45  NITIALLY", "INNE
5180: 52 22 2c 0a 20 20 20 20 22 49 4e 53 45 52 54 22  R",.    "INSERT"
5190: 2c 20 22 49 4e 53 54 45 41 44 22 2c 20 22 49 4e  , "INSTEAD", "IN
51a0: 54 45 52 53 45 43 54 22 2c 20 22 49 4e 54 4f 22  TERSECT", "INTO"
51b0: 2c 20 22 49 53 22 2c 20 22 49 53 4e 55 4c 4c 22  , "IS", "ISNULL"
51c0: 2c 20 22 4a 4f 49 4e 22 2c 20 22 4b 45 59 22 2c  , "JOIN", "KEY",
51d0: 0a 20 20 20 20 22 4c 45 46 54 22 2c 20 22 4c 49  .    "LEFT", "LI
51e0: 4b 45 22 2c 20 22 4c 49 4d 49 54 22 2c 20 22 4d  KE", "LIMIT", "M
51f0: 41 54 43 48 22 2c 20 22 4e 41 54 55 52 41 4c 22  ATCH", "NATURAL"
5200: 2c 20 22 4e 4f 22 2c 20 22 4e 4f 54 22 2c 20 22  , "NO", "NOT", "
5210: 4e 4f 54 4e 55 4c 4c 22 2c 0a 20 20 20 20 22 4e  NOTNULL",.    "N
5220: 55 4c 4c 22 2c 20 22 4f 46 22 2c 20 22 4f 46 46  ULL", "OF", "OFF
5230: 53 45 54 22 2c 20 22 4f 4e 22 2c 20 22 4f 52 22  SET", "ON", "OR"
5240: 2c 20 22 4f 52 44 45 52 22 2c 20 22 4f 55 54 45  , "ORDER", "OUTE
5250: 52 22 2c 20 22 50 4c 41 4e 22 2c 20 22 50 52 41  R", "PLAN", "PRA
5260: 47 4d 41 22 2c 0a 20 20 20 20 22 50 52 49 4d 41  GMA",.    "PRIMA
5270: 52 59 22 2c 20 22 51 55 45 52 59 22 2c 20 22 52  RY", "QUERY", "R
5280: 41 49 53 45 22 2c 20 22 52 45 43 55 52 53 49 56  AISE", "RECURSIV
5290: 45 22 2c 20 22 52 45 46 45 52 45 4e 43 45 53 22  E", "REFERENCES"
52a0: 2c 20 22 52 45 47 45 58 50 22 2c 0a 20 20 20 20  , "REGEXP",.    
52b0: 22 52 45 49 4e 44 45 58 22 2c 20 22 52 45 4c 45  "REINDEX", "RELE
52c0: 41 53 45 22 2c 20 22 52 45 4e 41 4d 45 22 2c 20  ASE", "RENAME", 
52d0: 22 52 45 50 4c 41 43 45 22 2c 20 22 52 45 53 54  "REPLACE", "REST
52e0: 52 49 43 54 22 2c 20 22 52 49 47 48 54 22 2c 0a  RICT", "RIGHT",.
52f0: 20 20 20 20 22 52 4f 4c 4c 42 41 43 4b 22 2c 20      "ROLLBACK", 
5300: 22 52 4f 57 22 2c 20 22 53 41 56 45 50 4f 49 4e  "ROW", "SAVEPOIN
5310: 54 22 2c 20 22 53 45 4c 45 43 54 22 2c 20 22 53  T", "SELECT", "S
5320: 45 54 22 2c 20 22 54 41 42 4c 45 22 2c 20 22 54  ET", "TABLE", "T
5330: 45 4d 50 22 2c 0a 20 20 20 20 22 54 45 4d 50 4f  EMP",.    "TEMPO
5340: 52 41 52 59 22 2c 20 22 54 48 45 4e 22 2c 20 22  RARY", "THEN", "
5350: 54 4f 22 2c 20 22 54 52 41 4e 53 41 43 54 49 4f  TO", "TRANSACTIO
5360: 4e 22 2c 20 22 54 52 49 47 47 45 52 22 2c 20 22  N", "TRIGGER", "
5370: 55 4e 49 4f 4e 22 2c 20 22 55 4e 49 51 55 45 22  UNION", "UNIQUE"
5380: 2c 0a 20 20 20 20 22 55 50 44 41 54 45 22 2c 20  ,.    "UPDATE", 
5390: 22 55 53 49 4e 47 22 2c 20 22 56 41 43 55 55 4d  "USING", "VACUUM
53a0: 22 2c 20 22 56 41 4c 55 45 53 22 2c 20 22 56 49  ", "VALUES", "VI
53b0: 45 57 22 2c 20 22 56 49 52 54 55 41 4c 22 2c 20  EW", "VIRTUAL", 
53c0: 22 57 48 45 4e 22 2c 20 22 57 48 45 52 45 22 2c  "WHEN", "WHERE",
53d0: 0a 20 20 20 20 22 57 49 54 48 22 2c 20 22 57 49  .    "WITH", "WI
53e0: 54 48 4f 55 54 22 2c 0a 20 20 7d 3b 0a 20 20 69  THOUT",.  };.  i
53f0: 6e 74 20 69 2c 20 6c 77 72 2c 20 75 70 72 2c 20  nt i, lwr, upr, 
5400: 6d 69 64 2c 20 63 3b 0a 20 20 69 66 28 20 21 69  mid, c;.  if( !i
5410: 73 61 6c 70 68 61 28 28 75 6e 73 69 67 6e 65 64  salpha((unsigned
5420: 20 63 68 61 72 29 7a 4e 61 6d 65 5b 30 5d 29 20   char)zName[0]) 
5430: 26 26 20 7a 4e 61 6d 65 5b 30 5d 21 3d 27 5f 27  && zName[0]!='_'
5440: 20 29 20 72 65 74 75 72 6e 20 27 22 27 3b 0a 20   ) return '"';. 
5450: 20 66 6f 72 28 69 3d 30 3b 20 7a 4e 61 6d 65 5b   for(i=0; zName[
5460: 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  i]; i++){.    if
5470: 28 20 21 69 73 61 6c 6e 75 6d 28 28 75 6e 73 69  ( !isalnum((unsi
5480: 67 6e 65 64 20 63 68 61 72 29 7a 4e 61 6d 65 5b  gned char)zName[
5490: 69 5d 29 20 26 26 20 7a 4e 61 6d 65 5b 69 5d 21  i]) && zName[i]!
54a0: 3d 27 5f 27 20 29 20 72 65 74 75 72 6e 20 27 22  ='_' ) return '"
54b0: 27 3b 0a 20 20 7d 0a 20 20 6c 77 72 20 3d 20 30  ';.  }.  lwr = 0
54c0: 3b 0a 20 20 75 70 72 20 3d 20 73 69 7a 65 6f 66  ;.  upr = sizeof
54d0: 28 61 7a 4b 65 79 77 6f 72 64 73 29 2f 73 69 7a  (azKeywords)/siz
54e0: 65 6f 66 28 61 7a 4b 65 79 77 6f 72 64 73 5b 30  eof(azKeywords[0
54f0: 5d 29 20 2d 20 31 3b 0a 20 20 77 68 69 6c 65 28  ]) - 1;.  while(
5500: 20 6c 77 72 3c 3d 75 70 72 20 29 7b 0a 20 20 20   lwr<=upr ){.   
5510: 20 6d 69 64 20 3d 20 28 6c 77 72 2b 75 70 72 29   mid = (lwr+upr)
5520: 2f 32 3b 0a 20 20 20 20 63 20 3d 20 73 71 6c 69  /2;.    c = sqli
5530: 74 65 33 5f 73 74 72 69 63 6d 70 28 61 7a 4b 65  te3_stricmp(azKe
5540: 79 77 6f 72 64 73 5b 6d 69 64 5d 2c 20 7a 4e 61  ywords[mid], zNa
5550: 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 63 3d 3d  me);.    if( c==
5560: 30 20 29 20 72 65 74 75 72 6e 20 27 22 27 3b 0a  0 ) return '"';.
5570: 20 20 20 20 69 66 28 20 63 3c 30 20 29 7b 0a 20      if( c<0 ){. 
5580: 20 20 20 20 20 6c 77 72 20 3d 20 6d 69 64 2b 31       lwr = mid+1
5590: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
55a0: 20 20 20 75 70 72 20 3d 20 6d 69 64 2d 31 3b 0a     upr = mid-1;.
55b0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
55c0: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  rn 0;.}../*.** C
55d0: 6f 6e 73 74 72 75 63 74 20 61 20 66 61 6b 65 20  onstruct a fake 
55e0: 6f 62 6a 65 63 74 20 6e 61 6d 65 20 61 6e 64 20  object name and 
55f0: 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 74 6f 20 64  column list to d
5600: 65 73 63 72 69 62 65 20 74 68 65 20 73 74 72 75  escribe the stru
5610: 63 74 75 72 65 0a 2a 2a 20 6f 66 20 74 68 65 20  cture.** of the 
5620: 76 69 65 77 2c 20 76 69 72 74 75 61 6c 20 74 61  view, virtual ta
5630: 62 6c 65 2c 20 6f 72 20 74 61 62 6c 65 20 76 61  ble, or table va
5640: 6c 75 65 64 20 66 75 6e 63 74 69 6f 6e 20 7a 53  lued function zS
5650: 63 68 65 6d 61 2e 7a 4e 61 6d 65 2e 0a 2a 2f 0a  chema.zName..*/.
5660: 73 74 61 74 69 63 20 63 68 61 72 20 2a 73 68 65  static char *she
5670: 6c 6c 46 61 6b 65 53 63 68 65 6d 61 28 0a 20 20  llFakeSchema(.  
5680: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20  sqlite3 *db,    
5690: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64          /* The d
56a0: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
56b0: 6f 6e 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  on containing th
56c0: 65 20 76 74 61 62 20 2a 2f 0a 20 20 63 6f 6e 73  e vtab */.  cons
56d0: 74 20 63 68 61 72 20 2a 7a 53 63 68 65 6d 61 2c  t char *zSchema,
56e0: 20 20 20 20 2f 2a 20 53 63 68 65 6d 61 20 6f 66      /* Schema of
56f0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68 6f   the database ho
5700: 6c 64 69 6e 67 20 74 68 65 20 76 74 61 62 20 2a  lding the vtab *
5710: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
5720: 7a 4e 61 6d 65 20 20 20 20 20 20 20 2f 2a 20 54  zName       /* T
5730: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 76  he name of the v
5740: 69 72 74 75 61 6c 20 74 61 62 6c 65 20 2a 2f 0a  irtual table */.
5750: 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  ){.  sqlite3_stm
5760: 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20  t *pStmt = 0;.  
5770: 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 53 68  char *zSql;.  Sh
5780: 65 6c 6c 54 65 78 74 20 73 3b 0a 20 20 63 68 61  ellText s;.  cha
5790: 72 20 63 51 75 6f 74 65 3b 0a 20 20 63 68 61 72  r cQuote;.  char
57a0: 20 2a 7a 44 69 76 20 3d 20 22 28 22 3b 0a 20 20   *zDiv = "(";.  
57b0: 69 6e 74 20 6e 52 6f 77 20 3d 20 30 3b 0a 0a 20  int nRow = 0;.. 
57c0: 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f   zSql = sqlite3_
57d0: 6d 70 72 69 6e 74 66 28 22 50 52 41 47 4d 41 20  mprintf("PRAGMA 
57e0: 5c 22 25 77 5c 22 2e 74 61 62 6c 65 5f 69 6e 66  \"%w\".table_inf
57f0: 6f 3d 25 51 3b 22 2c 0a 20 20 20 20 20 20 20 20  o=%Q;",.        
5800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5810: 20 7a 53 63 68 65 6d 61 20 3f 20 7a 53 63 68 65   zSchema ? zSche
5820: 6d 61 20 3a 20 22 6d 61 69 6e 22 2c 20 7a 4e 61  ma : "main", zNa
5830: 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 70  me);.  sqlite3_p
5840: 72 65 70 61 72 65 5f 76 32 28 64 62 2c 20 7a 53  repare_v2(db, zS
5850: 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20  ql, -1, &pStmt, 
5860: 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  0);.  sqlite3_fr
5870: 65 65 28 7a 53 71 6c 29 3b 0a 20 20 69 6e 69 74  ee(zSql);.  init
5880: 54 65 78 74 28 26 73 29 3b 0a 20 20 69 66 28 20  Text(&s);.  if( 
5890: 7a 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 63  zSchema ){.    c
58a0: 51 75 6f 74 65 20 3d 20 71 75 6f 74 65 43 68 61  Quote = quoteCha
58b0: 72 28 7a 53 63 68 65 6d 61 29 3b 0a 20 20 20 20  r(zSchema);.    
58c0: 69 66 28 20 63 51 75 6f 74 65 20 26 26 20 73 71  if( cQuote && sq
58d0: 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28 7a 53  lite3_stricmp(zS
58e0: 63 68 65 6d 61 2c 22 74 65 6d 70 22 29 3d 3d 30  chema,"temp")==0
58f0: 20 29 20 63 51 75 6f 74 65 20 3d 20 30 3b 0a 20   ) cQuote = 0;. 
5900: 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73     appendText(&s
5910: 2c 20 7a 53 63 68 65 6d 61 2c 20 63 51 75 6f 74  , zSchema, cQuot
5920: 65 29 3b 0a 20 20 20 20 61 70 70 65 6e 64 54 65  e);.    appendTe
5930: 78 74 28 26 73 2c 20 22 2e 22 2c 20 30 29 3b 0a  xt(&s, ".", 0);.
5940: 20 20 7d 0a 20 20 63 51 75 6f 74 65 20 3d 20 71    }.  cQuote = q
5950: 75 6f 74 65 43 68 61 72 28 7a 4e 61 6d 65 29 3b  uoteChar(zName);
5960: 0a 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73  .  appendText(&s
5970: 2c 20 7a 4e 61 6d 65 2c 20 63 51 75 6f 74 65 29  , zName, cQuote)
5980: 3b 0a 20 20 77 68 69 6c 65 28 20 73 71 6c 69 74  ;.  while( sqlit
5990: 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3d 3d  e3_step(pStmt)==
59a0: 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20  SQLITE_ROW ){.  
59b0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43    const char *zC
59c0: 6f 6c 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  ol = (const char
59d0: 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  *)sqlite3_column
59e0: 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 31 29 3b  _text(pStmt, 1);
59f0: 0a 20 20 20 20 6e 52 6f 77 2b 2b 3b 0a 20 20 20  .    nRow++;.   
5a00: 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 2c 20   appendText(&s, 
5a10: 7a 44 69 76 2c 20 30 29 3b 0a 20 20 20 20 7a 44  zDiv, 0);.    zD
5a20: 69 76 20 3d 20 22 2c 22 3b 0a 20 20 20 20 63 51  iv = ",";.    cQ
5a30: 75 6f 74 65 20 3d 20 71 75 6f 74 65 43 68 61 72  uote = quoteChar
5a40: 28 7a 43 6f 6c 29 3b 0a 20 20 20 20 61 70 70 65  (zCol);.    appe
5a50: 6e 64 54 65 78 74 28 26 73 2c 20 7a 43 6f 6c 2c  ndText(&s, zCol,
5a60: 20 63 51 75 6f 74 65 29 3b 0a 20 20 7d 0a 20 20   cQuote);.  }.  
5a70: 61 70 70 65 6e 64 54 65 78 74 28 26 73 2c 20 22  appendText(&s, "
5a80: 29 22 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65  )", 0);.  sqlite
5a90: 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74  3_finalize(pStmt
5aa0: 29 3b 0a 20 20 69 66 28 20 6e 52 6f 77 3d 3d 30  );.  if( nRow==0
5ab0: 20 29 7b 0a 20 20 20 20 66 72 65 65 54 65 78 74   ){.    freeText
5ac0: 28 26 73 29 3b 0a 20 20 20 20 73 2e 7a 20 3d 20  (&s);.    s.z = 
5ad0: 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
5ae0: 73 2e 7a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 51  s.z;.}../*.** SQ
5af0: 4c 20 66 75 6e 63 74 69 6f 6e 3a 20 20 73 68 65  L function:  she
5b00: 6c 6c 5f 6d 6f 64 75 6c 65 5f 73 63 68 65 6d 61  ll_module_schema
5b10: 28 58 29 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  (X).**.** Return
5b20: 20 61 20 66 61 6b 65 20 73 63 68 65 6d 61 20 66   a fake schema f
5b30: 6f 72 20 74 68 65 20 74 61 62 6c 65 2d 76 61 6c  or the table-val
5b40: 75 65 64 20 66 75 6e 63 74 69 6f 6e 20 6f 72 20  ued function or 
5b50: 65 70 6f 6e 79 6d 6f 75 73 20 76 69 72 74 75 61  eponymous virtua
5b60: 6c 0a 2a 2a 20 74 61 62 6c 65 20 58 2e 0a 2a 2f  l.** table X..*/
5b70: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 68 65  .static void she
5b80: 6c 6c 4d 6f 64 75 6c 65 53 63 68 65 6d 61 28 0a  llModuleSchema(.
5b90: 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78    sqlite3_contex
5ba0: 74 20 2a 70 43 74 78 2c 0a 20 20 69 6e 74 20 6e  t *pCtx,.  int n
5bb0: 56 61 6c 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76  Val,.  sqlite3_v
5bc0: 61 6c 75 65 20 2a 2a 61 70 56 61 6c 0a 29 7b 0a  alue **apVal.){.
5bd0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
5be0: 61 6d 65 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  ame = (const cha
5bf0: 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  r*)sqlite3_value
5c00: 5f 74 65 78 74 28 61 70 56 61 6c 5b 30 5d 29 3b  _text(apVal[0]);
5c10: 0a 20 20 63 68 61 72 20 2a 7a 46 61 6b 65 20 3d  .  char *zFake =
5c20: 20 73 68 65 6c 6c 46 61 6b 65 53 63 68 65 6d 61   shellFakeSchema
5c30: 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
5c40: 5f 64 62 5f 68 61 6e 64 6c 65 28 70 43 74 78 29  _db_handle(pCtx)
5c50: 2c 20 30 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 69  , 0, zName);.  i
5c60: 66 28 20 7a 46 61 6b 65 20 29 7b 0a 20 20 20 20  f( zFake ){.    
5c70: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74  sqlite3_result_t
5c80: 65 78 74 28 70 43 74 78 2c 20 73 71 6c 69 74 65  ext(pCtx, sqlite
5c90: 33 5f 6d 70 72 69 6e 74 66 28 22 2f 2a 20 25 73  3_mprintf("/* %s
5ca0: 20 2a 2f 22 2c 20 7a 46 61 6b 65 29 2c 0a 20 20   */", zFake),.  
5cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5cc0: 20 20 20 20 20 20 2d 31 2c 20 73 71 6c 69 74 65        -1, sqlite
5cd0: 33 5f 66 72 65 65 29 3b 0a 20 20 20 20 66 72 65  3_free);.    fre
5ce0: 65 28 7a 46 61 6b 65 29 3b 0a 20 20 7d 0a 7d 0a  e(zFake);.  }.}.
5cf0: 0a 2f 2a 0a 2a 2a 20 53 51 4c 20 66 75 6e 63 74  ./*.** SQL funct
5d00: 69 6f 6e 3a 20 20 73 68 65 6c 6c 5f 61 64 64 5f  ion:  shell_add_
5d10: 73 63 68 65 6d 61 28 53 2c 58 29 0a 2a 2a 0a 2a  schema(S,X).**.*
5d20: 2a 20 41 64 64 20 74 68 65 20 73 63 68 65 6d 61  * Add the schema
5d30: 20 6e 61 6d 65 20 58 20 74 6f 20 74 68 65 20 43   name X to the C
5d40: 52 45 41 54 45 20 73 74 61 74 65 6d 65 6e 74 20  REATE statement 
5d50: 69 6e 20 53 20 61 6e 64 20 72 65 74 75 72 6e 20  in S and return 
5d60: 74 68 65 20 72 65 73 75 6c 74 2e 0a 2a 2a 20 45  the result..** E
5d70: 78 61 6d 70 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20  xamples:.**.**  
5d80: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
5d90: 31 28 78 29 20 20 20 2d 3e 20 20 20 43 52 45 41  1(x)   ->   CREA
5da0: 54 45 20 54 41 42 4c 45 20 78 79 7a 2e 74 31 28  TE TABLE xyz.t1(
5db0: 78 29 3b 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 77  x);.**.** Also w
5dc0: 6f 72 6b 73 20 6f 6e 0a 2a 2a 0a 2a 2a 20 20 20  orks on.**.**   
5dd0: 20 43 52 45 41 54 45 20 49 4e 44 45 58 0a 2a 2a   CREATE INDEX.**
5de0: 20 20 20 20 43 52 45 41 54 45 20 55 4e 49 51 55      CREATE UNIQU
5df0: 45 20 49 4e 44 45 58 0a 2a 2a 20 20 20 20 43 52  E INDEX.**    CR
5e00: 45 41 54 45 20 56 49 45 57 0a 2a 2a 20 20 20 20  EATE VIEW.**    
5e10: 43 52 45 41 54 45 20 54 52 49 47 47 45 52 0a 2a  CREATE TRIGGER.*
5e20: 2a 20 20 20 20 43 52 45 41 54 45 20 56 49 52 54  *    CREATE VIRT
5e30: 55 41 4c 20 54 41 42 4c 45 0a 2a 2a 0a 2a 2a 20  UAL TABLE.**.** 
5e40: 54 68 69 73 20 55 44 46 20 69 73 20 75 73 65 64  This UDF is used
5e50: 20 62 79 20 74 68 65 20 2e 73 63 68 65 6d 61 20   by the .schema 
5e60: 63 6f 6d 6d 61 6e 64 20 74 6f 20 69 6e 73 65 72  command to inser
5e70: 74 20 74 68 65 20 73 63 68 65 6d 61 20 6e 61 6d  t the schema nam
5e80: 65 20 6f 66 0a 2a 2a 20 61 74 74 61 63 68 65 64  e of.** attached
5e90: 20 64 61 74 61 62 61 73 65 73 20 69 6e 74 6f 20   databases into 
5ea0: 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 20 74 68  the middle of th
5eb0: 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 2e  e sqlite_master.
5ec0: 73 71 6c 20 66 69 65 6c 64 2e 0a 2a 2f 0a 73 74  sql field..*/.st
5ed0: 61 74 69 63 20 76 6f 69 64 20 73 68 65 6c 6c 41  atic void shellA
5ee0: 64 64 53 63 68 65 6d 61 4e 61 6d 65 28 0a 20 20  ddSchemaName(.  
5ef0: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
5f00: 2a 70 43 74 78 2c 0a 20 20 69 6e 74 20 6e 56 61  *pCtx,.  int nVa
5f10: 6c 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  l,.  sqlite3_val
5f20: 75 65 20 2a 2a 61 70 56 61 6c 0a 29 7b 0a 20 20  ue **apVal.){.  
5f30: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
5f40: 72 20 2a 61 50 72 65 66 69 78 5b 5d 20 3d 20 7b  r *aPrefix[] = {
5f50: 0a 20 20 20 20 20 22 54 41 42 4c 45 22 2c 0a 20  .     "TABLE",. 
5f60: 20 20 20 20 22 49 4e 44 45 58 22 2c 0a 20 20 20      "INDEX",.   
5f70: 20 20 22 55 4e 49 51 55 45 20 49 4e 44 45 58 22    "UNIQUE INDEX"
5f80: 2c 0a 20 20 20 20 20 22 56 49 45 57 22 2c 0a 20  ,.     "VIEW",. 
5f90: 20 20 20 20 22 54 52 49 47 47 45 52 22 2c 0a 20      "TRIGGER",. 
5fa0: 20 20 20 20 22 56 49 52 54 55 41 4c 20 54 41 42      "VIRTUAL TAB
5fb0: 4c 45 22 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69  LE".  };.  int i
5fc0: 20 3d 20 30 3b 0a 20 20 63 6f 6e 73 74 20 63 68   = 0;.  const ch
5fd0: 61 72 20 2a 7a 49 6e 20 3d 20 28 63 6f 6e 73 74  ar *zIn = (const
5fe0: 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76   char*)sqlite3_v
5ff0: 61 6c 75 65 5f 74 65 78 74 28 61 70 56 61 6c 5b  alue_text(apVal[
6000: 30 5d 29 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  0]);.  const cha
6010: 72 20 2a 7a 53 63 68 65 6d 61 20 3d 20 28 63 6f  r *zSchema = (co
6020: 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65  nst char*)sqlite
6030: 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 70 56  3_value_text(apV
6040: 61 6c 5b 31 5d 29 3b 0a 20 20 63 6f 6e 73 74 20  al[1]);.  const 
6050: 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 28 63  char *zName = (c
6060: 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74  onst char*)sqlit
6070: 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 70  e3_value_text(ap
6080: 56 61 6c 5b 32 5d 29 3b 0a 20 20 73 71 6c 69 74  Val[2]);.  sqlit
6090: 65 33 20 2a 64 62 20 3d 20 73 71 6c 69 74 65 33  e3 *db = sqlite3
60a0: 5f 63 6f 6e 74 65 78 74 5f 64 62 5f 68 61 6e 64  _context_db_hand
60b0: 6c 65 28 70 43 74 78 29 3b 0a 20 20 69 66 28 20  le(pCtx);.  if( 
60c0: 7a 49 6e 21 3d 30 20 26 26 20 73 74 72 6e 63 6d  zIn!=0 && strncm
60d0: 70 28 7a 49 6e 2c 20 22 43 52 45 41 54 45 20 22  p(zIn, "CREATE "
60e0: 2c 20 37 29 3d 3d 30 20 29 7b 0a 20 20 20 20 66  , 7)==0 ){.    f
60f0: 6f 72 28 69 3d 30 3b 20 69 3c 28 69 6e 74 29 28  or(i=0; i<(int)(
6100: 73 69 7a 65 6f 66 28 61 50 72 65 66 69 78 29 2f  sizeof(aPrefix)/
6110: 73 69 7a 65 6f 66 28 61 50 72 65 66 69 78 5b 30  sizeof(aPrefix[0
6120: 5d 29 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  ])); i++){.     
6130: 20 69 6e 74 20 6e 20 3d 20 73 74 72 6c 65 6e 33   int n = strlen3
6140: 30 28 61 50 72 65 66 69 78 5b 69 5d 29 3b 0a 20  0(aPrefix[i]);. 
6150: 20 20 20 20 20 69 66 28 20 73 74 72 6e 63 6d 70       if( strncmp
6160: 28 7a 49 6e 2b 37 2c 20 61 50 72 65 66 69 78 5b  (zIn+7, aPrefix[
6170: 69 5d 2c 20 6e 29 3d 3d 30 20 26 26 20 7a 49 6e  i], n)==0 && zIn
6180: 5b 6e 2b 37 5d 3d 3d 27 20 27 20 29 7b 0a 20 20  [n+7]==' ' ){.  
6190: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20        char *z = 
61a0: 30 3b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  0;.        char 
61b0: 2a 7a 46 61 6b 65 20 3d 20 30 3b 0a 20 20 20 20  *zFake = 0;.    
61c0: 20 20 20 20 69 66 28 20 7a 53 63 68 65 6d 61 20      if( zSchema 
61d0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 68 61  ){.          cha
61e0: 72 20 63 51 75 6f 74 65 20 3d 20 71 75 6f 74 65  r cQuote = quote
61f0: 43 68 61 72 28 7a 53 63 68 65 6d 61 29 3b 0a 20  Char(zSchema);. 
6200: 20 20 20 20 20 20 20 20 20 69 66 28 20 63 51 75           if( cQu
6210: 6f 74 65 20 26 26 20 73 71 6c 69 74 65 33 5f 73  ote && sqlite3_s
6220: 74 72 69 63 6d 70 28 7a 53 63 68 65 6d 61 2c 22  tricmp(zSchema,"
6230: 74 65 6d 70 22 29 21 3d 30 20 29 7b 0a 20 20 20  temp")!=0 ){.   
6240: 20 20 20 20 20 20 20 20 20 7a 20 3d 20 73 71 6c           z = sql
6250: 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 2e  ite3_mprintf("%.
6260: 2a 73 20 5c 22 25 77 5c 22 2e 25 73 22 2c 20 6e  *s \"%w\".%s", n
6270: 2b 37 2c 20 7a 49 6e 2c 20 7a 53 63 68 65 6d 61  +7, zIn, zSchema
6280: 2c 20 7a 49 6e 2b 6e 2b 38 29 3b 0a 20 20 20 20  , zIn+n+8);.    
6290: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
62a0: 20 20 20 20 20 20 20 20 20 7a 20 3d 20 73 71 6c           z = sql
62b0: 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 2e  ite3_mprintf("%.
62c0: 2a 73 20 25 73 2e 25 73 22 2c 20 6e 2b 37 2c 20  *s %s.%s", n+7, 
62d0: 7a 49 6e 2c 20 7a 53 63 68 65 6d 61 2c 20 7a 49  zIn, zSchema, zI
62e0: 6e 2b 6e 2b 38 29 3b 0a 20 20 20 20 20 20 20 20  n+n+8);.        
62f0: 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
6300: 20 20 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 0a        if( zName.
6310: 20 20 20 20 20 20 20 20 20 26 26 20 61 50 72 65           && aPre
6320: 66 69 78 5b 69 5d 5b 30 5d 3d 3d 27 56 27 0a 20  fix[i][0]=='V'. 
6330: 20 20 20 20 20 20 20 20 26 26 20 28 7a 46 61 6b          && (zFak
6340: 65 20 3d 20 73 68 65 6c 6c 46 61 6b 65 53 63 68  e = shellFakeSch
6350: 65 6d 61 28 64 62 2c 20 7a 53 63 68 65 6d 61 2c  ema(db, zSchema,
6360: 20 7a 4e 61 6d 65 29 29 21 3d 30 0a 20 20 20 20   zName))!=0.    
6370: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
6380: 20 69 66 28 20 7a 3d 3d 30 20 29 7b 0a 20 20 20   if( z==0 ){.   
6390: 20 20 20 20 20 20 20 20 20 7a 20 3d 20 73 71 6c           z = sql
63a0: 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73  ite3_mprintf("%s
63b0: 5c 6e 2f 2a 20 25 73 20 2a 2f 22 2c 20 7a 49 6e  \n/* %s */", zIn
63c0: 2c 20 7a 46 61 6b 65 29 3b 0a 20 20 20 20 20 20  , zFake);.      
63d0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
63e0: 20 20 20 20 20 20 20 7a 20 3d 20 73 71 6c 69 74         z = sqlit
63f0: 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 7a 5c 6e  e3_mprintf("%z\n
6400: 2f 2a 20 25 73 20 2a 2f 22 2c 20 7a 2c 20 7a 46  /* %s */", z, zF
6410: 61 6b 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ake);.          
6420: 7d 0a 20 20 20 20 20 20 20 20 20 20 66 72 65 65  }.          free
6430: 28 7a 46 61 6b 65 29 3b 0a 20 20 20 20 20 20 20  (zFake);.       
6440: 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a   }.        if( z
6450: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
6460: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78  lite3_result_tex
6470: 74 28 70 43 74 78 2c 20 7a 2c 20 2d 31 2c 20 73  t(pCtx, z, -1, s
6480: 71 6c 69 74 65 33 5f 66 72 65 65 29 3b 0a 20 20  qlite3_free);.  
6490: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a          return;.
64a0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
64b0: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  }.    }.  }.  sq
64c0: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 76 61 6c  lite3_result_val
64d0: 75 65 28 70 43 74 78 2c 20 61 70 56 61 6c 5b 30  ue(pCtx, apVal[0
64e0: 5d 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  ]);.}../*.** The
64f0: 20 73 6f 75 72 63 65 20 63 6f 64 65 20 66 6f 72   source code for
6500: 20 73 65 76 65 72 61 6c 20 72 75 6e 2d 74 69 6d   several run-tim
6510: 65 20 6c 6f 61 64 61 62 6c 65 20 65 78 74 65 6e  e loadable exten
6520: 73 69 6f 6e 73 20 69 73 20 69 6e 73 65 72 74 65  sions is inserte
6530: 64 0a 2a 2a 20 62 65 6c 6f 77 20 62 79 20 74 68  d.** below by th
6540: 65 20 2e 2e 2f 74 6f 6f 6c 2f 6d 6b 73 68 65 6c  e ../tool/mkshel
6550: 6c 63 2e 74 63 6c 20 73 63 72 69 70 74 2e 20 20  lc.tcl script.  
6560: 42 65 66 6f 72 65 20 70 72 6f 63 65 73 73 69 6e  Before processin
6570: 67 20 74 68 61 74 20 69 6e 63 6c 75 64 65 64 0a  g that included.
6580: 2a 2a 20 63 6f 64 65 2c 20 77 65 20 6e 65 65 64  ** code, we need
6590: 20 74 6f 20 6f 76 65 72 72 69 64 65 20 73 6f 6d   to override som
65a0: 65 20 6d 61 63 72 6f 73 20 74 6f 20 6d 61 6b 65  e macros to make
65b0: 20 74 68 65 20 69 6e 63 6c 75 64 65 64 20 70 72   the included pr
65c0: 6f 67 72 61 6d 20 63 6f 64 65 0a 2a 2a 20 77 6f  ogram code.** wo
65d0: 72 6b 20 68 65 72 65 20 69 6e 20 74 68 65 20 6d  rk here in the m
65e0: 69 64 64 6c 65 20 6f 66 20 74 68 69 73 20 72 65  iddle of this re
65f0: 67 75 6c 61 72 20 70 72 6f 67 72 61 6d 2e 0a 2a  gular program..*
6600: 2f 0a 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45  /.#define SQLITE
6610: 5f 45 58 54 45 4e 53 49 4f 4e 5f 49 4e 49 54 31  _EXTENSION_INIT1
6620: 0a 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f  .#define SQLITE_
6630: 45 58 54 45 4e 53 49 4f 4e 5f 49 4e 49 54 32 28  EXTENSION_INIT2(
6640: 58 29 20 28 76 6f 69 64 29 28 58 29 0a 0a 23 69  X) (void)(X)..#i
6650: 66 20 64 65 66 69 6e 65 64 28 5f 57 49 4e 33 32  f defined(_WIN32
6660: 29 20 26 26 20 64 65 66 69 6e 65 64 28 5f 4d 53  ) && defined(_MS
6670: 43 5f 56 45 52 29 0a 49 4e 43 4c 55 44 45 20 74  C_VER).INCLUDE t
6680: 65 73 74 5f 77 69 6e 64 69 72 65 6e 74 2e 68 0a  est_windirent.h.
6690: 49 4e 43 4c 55 44 45 20 74 65 73 74 5f 77 69 6e  INCLUDE test_win
66a0: 64 69 72 65 6e 74 2e 63 0a 23 64 65 66 69 6e 65  dirent.c.#define
66b0: 20 64 69 72 65 6e 74 20 44 49 52 45 4e 54 0a 23   dirent DIRENT.#
66c0: 65 6e 64 69 66 0a 49 4e 43 4c 55 44 45 20 2e 2e  endif.INCLUDE ..
66d0: 2f 65 78 74 2f 6d 69 73 63 2f 73 68 61 74 68 72  /ext/misc/shathr
66e0: 65 65 2e 63 0a 49 4e 43 4c 55 44 45 20 2e 2e 2f  ee.c.INCLUDE ../
66f0: 65 78 74 2f 6d 69 73 63 2f 66 69 6c 65 69 6f 2e  ext/misc/fileio.
6700: 63 0a 49 4e 43 4c 55 44 45 20 2e 2e 2f 65 78 74  c.INCLUDE ../ext
6710: 2f 6d 69 73 63 2f 63 6f 6d 70 6c 65 74 69 6f 6e  /misc/completion
6720: 2e 63 0a 49 4e 43 4c 55 44 45 20 2e 2e 2f 65 78  .c.INCLUDE ../ex
6730: 74 2f 6d 69 73 63 2f 61 70 70 65 6e 64 76 66 73  t/misc/appendvfs
6740: 2e 63 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  .c.#ifdef SQLITE
6750: 5f 48 41 56 45 5f 5a 4c 49 42 0a 49 4e 43 4c 55  _HAVE_ZLIB.INCLU
6760: 44 45 20 2e 2e 2f 65 78 74 2f 6d 69 73 63 2f 7a  DE ../ext/misc/z
6770: 69 70 66 69 6c 65 2e 63 0a 49 4e 43 4c 55 44 45  ipfile.c.INCLUDE
6780: 20 2e 2e 2f 65 78 74 2f 6d 69 73 63 2f 73 71 6c   ../ext/misc/sql
6790: 61 72 2e 63 0a 23 65 6e 64 69 66 0a 49 4e 43 4c  ar.c.#endif.INCL
67a0: 55 44 45 20 2e 2e 2f 65 78 74 2f 65 78 70 65 72  UDE ../ext/exper
67b0: 74 2f 73 71 6c 69 74 65 33 65 78 70 65 72 74 2e  t/sqlite3expert.
67c0: 68 0a 49 4e 43 4c 55 44 45 20 2e 2e 2f 65 78 74  h.INCLUDE ../ext
67d0: 2f 65 78 70 65 72 74 2f 73 71 6c 69 74 65 33 65  /expert/sqlite3e
67e0: 78 70 65 72 74 2e 63 0a 0a 23 69 66 20 64 65 66  xpert.c..#if def
67f0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
6800: 4c 45 5f 53 45 53 53 49 4f 4e 29 0a 2f 2a 0a 2a  LE_SESSION)./*.*
6810: 2a 20 53 74 61 74 65 20 69 6e 66 6f 72 6d 61 74  * State informat
6820: 69 6f 6e 20 66 6f 72 20 61 20 73 69 6e 67 6c 65  ion for a single
6830: 20 6f 70 65 6e 20 73 65 73 73 69 6f 6e 0a 2a 2f   open session.*/
6840: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
6850: 4f 70 65 6e 53 65 73 73 69 6f 6e 20 4f 70 65 6e  OpenSession Open
6860: 53 65 73 73 69 6f 6e 3b 0a 73 74 72 75 63 74 20  Session;.struct 
6870: 4f 70 65 6e 53 65 73 73 69 6f 6e 20 7b 0a 20 20  OpenSession {.  
6880: 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 20  char *zName;    
6890: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 79 6d 62           /* Symb
68a0: 6f 6c 69 63 20 6e 61 6d 65 20 66 6f 72 20 74 68  olic name for th
68b0: 69 73 20 73 65 73 73 69 6f 6e 20 2a 2f 0a 20 20  is session */.  
68c0: 69 6e 74 20 6e 46 69 6c 74 65 72 3b 20 20 20 20  int nFilter;    
68d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
68e0: 65 72 20 6f 66 20 78 46 69 6c 74 65 72 20 72 65  er of xFilter re
68f0: 6a 65 63 74 69 6f 6e 20 47 4c 4f 42 20 70 61 74  jection GLOB pat
6900: 74 65 72 6e 73 20 2a 2f 0a 20 20 63 68 61 72 20  terns */.  char 
6910: 2a 2a 61 7a 46 69 6c 74 65 72 3b 20 20 20 20 20  **azFilter;     
6920: 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20      /* Array of 
6930: 78 46 69 6c 74 65 72 20 72 65 6a 65 63 74 69 6f  xFilter rejectio
6940: 6e 20 47 4c 4f 42 20 70 61 74 74 65 72 6e 73 20  n GLOB patterns 
6950: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 65 73  */.  sqlite3_ses
6960: 73 69 6f 6e 20 2a 70 3b 20 20 20 20 20 20 2f 2a  sion *p;      /*
6970: 20 54 68 65 20 6f 70 65 6e 20 73 65 73 73 69 6f   The open sessio
6980: 6e 20 2a 2f 0a 7d 3b 0a 23 65 6e 64 69 66 0a 0a  n */.};.#endif..
6990: 2f 2a 0a 2a 2a 20 53 68 65 6c 6c 20 6f 75 74 70  /*.** Shell outp
69a0: 75 74 20 6d 6f 64 65 20 69 6e 66 6f 72 6d 61 74  ut mode informat
69b0: 69 6f 6e 20 66 72 6f 6d 20 62 65 66 6f 72 65 20  ion from before 
69c0: 22 2e 65 78 70 6c 61 69 6e 20 6f 6e 22 2c 0a 2a  ".explain on",.*
69d0: 2a 20 73 61 76 65 64 20 73 6f 20 74 68 61 74 20  * saved so that 
69e0: 69 74 20 63 61 6e 20 62 65 20 72 65 73 74 6f 72  it can be restor
69f0: 65 64 20 62 79 20 22 2e 65 78 70 6c 61 69 6e 20  ed by ".explain 
6a00: 6f 66 66 22 0a 2a 2f 0a 74 79 70 65 64 65 66 20  off".*/.typedef 
6a10: 73 74 72 75 63 74 20 53 61 76 65 64 4d 6f 64 65  struct SavedMode
6a20: 49 6e 66 6f 20 53 61 76 65 64 4d 6f 64 65 49 6e  Info SavedModeIn
6a30: 66 6f 3b 0a 73 74 72 75 63 74 20 53 61 76 65 64  fo;.struct Saved
6a40: 4d 6f 64 65 49 6e 66 6f 20 7b 0a 20 20 69 6e 74  ModeInfo {.  int
6a50: 20 76 61 6c 69 64 3b 20 20 20 20 20 20 20 20 20   valid;         
6a60: 20 2f 2a 20 49 73 20 74 68 65 72 65 20 6c 65 67   /* Is there leg
6a70: 69 74 20 64 61 74 61 20 69 6e 20 68 65 72 65 3f  it data in here?
6a80: 20 2a 2f 0a 20 20 69 6e 74 20 6d 6f 64 65 3b 20   */.  int mode; 
6a90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 6f 64            /* Mod
6aa0: 65 20 70 72 69 6f 72 20 74 6f 20 22 2e 65 78 70  e prior to ".exp
6ab0: 6c 61 69 6e 20 6f 6e 22 20 2a 2f 0a 20 20 69 6e  lain on" */.  in
6ac0: 74 20 73 68 6f 77 48 65 61 64 65 72 3b 20 20 20  t showHeader;   
6ad0: 20 20 2f 2a 20 54 68 65 20 22 2e 68 65 61 64 65    /* The ".heade
6ae0: 72 22 20 73 65 74 74 69 6e 67 20 70 72 69 6f 72  r" setting prior
6af0: 20 74 6f 20 22 2e 65 78 70 6c 61 69 6e 20 6f 6e   to ".explain on
6b00: 22 20 2a 2f 0a 20 20 69 6e 74 20 63 6f 6c 57 69  " */.  int colWi
6b10: 64 74 68 5b 31 30 30 5d 3b 20 20 2f 2a 20 43 6f  dth[100];  /* Co
6b20: 6c 75 6d 6e 20 77 69 64 74 68 73 20 70 72 69 6f  lumn widths prio
6b30: 72 20 74 6f 20 22 2e 65 78 70 6c 61 69 6e 20 6f  r to ".explain o
6b40: 6e 22 20 2a 2f 0a 7d 3b 0a 0a 74 79 70 65 64 65  n" */.};..typede
6b50: 66 20 73 74 72 75 63 74 20 45 78 70 65 72 74 49  f struct ExpertI
6b60: 6e 66 6f 20 45 78 70 65 72 74 49 6e 66 6f 3b 0a  nfo ExpertInfo;.
6b70: 73 74 72 75 63 74 20 45 78 70 65 72 74 49 6e 66  struct ExpertInf
6b80: 6f 20 7b 0a 20 20 73 71 6c 69 74 65 33 65 78 70  o {.  sqlite3exp
6b90: 65 72 74 20 2a 70 45 78 70 65 72 74 3b 0a 20 20  ert *pExpert;.  
6ba0: 69 6e 74 20 62 56 65 72 62 6f 73 65 3b 0a 7d 3b  int bVerbose;.};
6bb0: 0a 0a 2f 2a 0a 2a 2a 20 53 74 61 74 65 20 69 6e  ../*.** State in
6bc0: 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20  formation about 
6bd0: 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  the database con
6be0: 6e 65 63 74 69 6f 6e 20 69 73 20 63 6f 6e 74 61  nection is conta
6bf0: 69 6e 65 64 20 69 6e 20 61 6e 0a 2a 2a 20 69 6e  ined in an.** in
6c00: 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f  stance of the fo
6c10: 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72  llowing structur
6c20: 65 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  e..*/.typedef st
6c30: 72 75 63 74 20 53 68 65 6c 6c 53 74 61 74 65 20  ruct ShellState 
6c40: 53 68 65 6c 6c 53 74 61 74 65 3b 0a 73 74 72 75  ShellState;.stru
6c50: 63 74 20 53 68 65 6c 6c 53 74 61 74 65 20 7b 0a  ct ShellState {.
6c60: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20    sqlite3 *db;  
6c70: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
6c80: 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 75 38  database */.  u8
6c90: 20 61 75 74 6f 45 78 70 6c 61 69 6e 3b 20 20 20   autoExplain;   
6ca0: 20 20 20 20 20 2f 2a 20 41 75 74 6f 6d 61 74 69       /* Automati
6cb0: 63 61 6c 6c 79 20 74 75 72 6e 20 6f 6e 20 2e 65  cally turn on .e
6cc0: 78 70 6c 61 69 6e 20 6d 6f 64 65 20 2a 2f 0a 20  xplain mode */. 
6cd0: 20 75 38 20 61 75 74 6f 45 51 50 3b 20 20 20 20   u8 autoEQP;    
6ce0: 20 20 20 20 20 20 20 20 2f 2a 20 52 75 6e 20 45          /* Run E
6cf0: 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41  XPLAIN QUERY PLA
6d00: 4e 20 70 72 69 6f 72 20 74 6f 20 73 65 61 63 68  N prior to seach
6d10: 20 53 51 4c 20 73 74 6d 74 20 2a 2f 0a 20 20 75   SQL stmt */.  u
6d20: 38 20 73 74 61 74 73 4f 6e 3b 20 20 20 20 20 20  8 statsOn;      
6d30: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f        /* True to
6d40: 20 64 69 73 70 6c 61 79 20 6d 65 6d 6f 72 79 20   display memory 
6d50: 73 74 61 74 73 20 62 65 66 6f 72 65 20 65 61 63  stats before eac
6d60: 68 20 66 69 6e 61 6c 69 7a 65 20 2a 2f 0a 20 20  h finalize */.  
6d70: 75 38 20 73 63 61 6e 73 74 61 74 73 4f 6e 3b 20  u8 scanstatsOn; 
6d80: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74         /* True t
6d90: 6f 20 64 69 73 70 6c 61 79 20 73 63 61 6e 20 73  o display scan s
6da0: 74 61 74 73 20 62 65 66 6f 72 65 20 65 61 63 68  tats before each
6db0: 20 66 69 6e 61 6c 69 7a 65 20 2a 2f 0a 20 20 75   finalize */.  u
6dc0: 38 20 6f 70 65 6e 4d 6f 64 65 3b 20 20 20 20 20  8 openMode;     
6dd0: 20 20 20 20 20 20 2f 2a 20 53 48 45 4c 4c 5f 4f        /* SHELL_O
6de0: 50 45 4e 5f 4e 4f 52 4d 41 4c 2c 20 5f 41 50 50  PEN_NORMAL, _APP
6df0: 45 4e 44 56 46 53 2c 20 6f 72 20 5f 5a 49 50 46  ENDVFS, or _ZIPF
6e00: 49 4c 45 20 2a 2f 0a 20 20 69 6e 74 20 6f 75 74  ILE */.  int out
6e10: 43 6f 75 6e 74 3b 20 20 20 20 20 20 20 20 20 20  Count;          
6e20: 2f 2a 20 52 65 76 65 72 74 20 74 6f 20 73 74 64  /* Revert to std
6e30: 6f 75 74 20 77 68 65 6e 20 72 65 61 63 68 69 6e  out when reachin
6e40: 67 20 7a 65 72 6f 20 2a 2f 0a 20 20 69 6e 74 20  g zero */.  int 
6e50: 63 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  cnt;            
6e60: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
6e70: 72 65 63 6f 72 64 73 20 64 69 73 70 6c 61 79 65  records displaye
6e80: 64 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 46 49  d so far */.  FI
6e90: 4c 45 20 2a 6f 75 74 3b 20 20 20 20 20 20 20 20  LE *out;        
6ea0: 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 72 65       /* Write re
6eb0: 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a 20 20  sults here */.  
6ec0: 46 49 4c 45 20 2a 74 72 61 63 65 4f 75 74 3b 20  FILE *traceOut; 
6ed0: 20 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74         /* Output
6ee0: 20 66 6f 72 20 73 71 6c 69 74 65 33 5f 74 72 61   for sqlite3_tra
6ef0: 63 65 28 29 20 2a 2f 0a 20 20 69 6e 74 20 6e 45  ce() */.  int nE
6f00: 72 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rr;             
6f10: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 72   /* Number of er
6f20: 72 6f 72 73 20 73 65 65 6e 20 2a 2f 0a 20 20 69  rors seen */.  i
6f30: 6e 74 20 6d 6f 64 65 3b 20 20 20 20 20 20 20 20  nt mode;        
6f40: 20 20 20 20 20 20 2f 2a 20 41 6e 20 6f 75 74 70        /* An outp
6f50: 75 74 20 6d 6f 64 65 20 73 65 74 74 69 6e 67 20  ut mode setting 
6f60: 2a 2f 0a 20 20 69 6e 74 20 63 4d 6f 64 65 3b 20  */.  int cMode; 
6f70: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 74              /* t
6f80: 65 6d 70 6f 72 61 72 79 20 6f 75 74 70 75 74 20  emporary output 
6f90: 6d 6f 64 65 20 66 6f 72 20 74 68 65 20 63 75 72  mode for the cur
6fa0: 72 65 6e 74 20 71 75 65 72 79 20 2a 2f 0a 20 20  rent query */.  
6fb0: 69 6e 74 20 6e 6f 72 6d 61 6c 4d 6f 64 65 3b 20  int normalMode; 
6fc0: 20 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74         /* Output
6fd0: 20 6d 6f 64 65 20 62 65 66 6f 72 65 20 22 2e 65   mode before ".e
6fe0: 78 70 6c 61 69 6e 20 6f 6e 22 20 2a 2f 0a 20 20  xplain on" */.  
6ff0: 69 6e 74 20 77 72 69 74 61 62 6c 65 53 63 68 65  int writableSche
7000: 6d 61 3b 20 20 20 20 2f 2a 20 54 72 75 65 20 69  ma;    /* True i
7010: 66 20 50 52 41 47 4d 41 20 77 72 69 74 61 62 6c  f PRAGMA writabl
7020: 65 5f 73 63 68 65 6d 61 3d 4f 4e 20 2a 2f 0a 20  e_schema=ON */. 
7030: 20 69 6e 74 20 73 68 6f 77 48 65 61 64 65 72 3b   int showHeader;
7040: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
7050: 74 6f 20 73 68 6f 77 20 63 6f 6c 75 6d 6e 20 6e  to show column n
7060: 61 6d 65 73 20 69 6e 20 4c 69 73 74 20 6f 72 20  ames in List or 
7070: 43 6f 6c 75 6d 6e 20 6d 6f 64 65 20 2a 2f 0a 20  Column mode */. 
7080: 20 69 6e 74 20 6e 43 68 65 63 6b 3b 20 20 20 20   int nCheck;    
7090: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
70a0: 72 20 6f 66 20 22 2e 63 68 65 63 6b 22 20 63 6f  r of ".check" co
70b0: 6d 6d 61 6e 64 73 20 72 75 6e 20 2a 2f 0a 20 20  mmands run */.  
70c0: 75 6e 73 69 67 6e 65 64 20 73 68 65 6c 6c 46 6c  unsigned shellFl
70d0: 67 73 3b 20 20 20 20 2f 2a 20 56 61 72 69 6f 75  gs;    /* Variou
70e0: 73 20 66 6c 61 67 73 20 2a 2f 0a 20 20 63 68 61  s flags */.  cha
70f0: 72 20 2a 7a 44 65 73 74 54 61 62 6c 65 3b 20 20  r *zDestTable;  
7100: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 64      /* Name of d
7110: 65 73 74 69 6e 61 74 69 6f 6e 20 74 61 62 6c 65  estination table
7120: 20 77 68 65 6e 20 4d 4f 44 45 5f 49 6e 73 65 72   when MODE_Inser
7130: 74 20 2a 2f 0a 20 20 63 68 61 72 20 7a 54 65 73  t */.  char zTes
7140: 74 63 61 73 65 5b 33 30 5d 3b 20 20 20 20 2f 2a  tcase[30];    /*
7150: 20 4e 61 6d 65 20 6f 66 20 63 75 72 72 65 6e 74   Name of current
7160: 20 74 65 73 74 20 63 61 73 65 20 2a 2f 0a 20 20   test case */.  
7170: 63 68 61 72 20 63 6f 6c 53 65 70 61 72 61 74 6f  char colSeparato
7180: 72 5b 32 30 5d 3b 20 2f 2a 20 43 6f 6c 75 6d 6e  r[20]; /* Column
7190: 20 73 65 70 61 72 61 74 6f 72 20 63 68 61 72 61   separator chara
71a0: 63 74 65 72 20 66 6f 72 20 73 65 76 65 72 61 6c  cter for several
71b0: 20 6d 6f 64 65 73 20 2a 2f 0a 20 20 63 68 61 72   modes */.  char
71c0: 20 72 6f 77 53 65 70 61 72 61 74 6f 72 5b 32 30   rowSeparator[20
71d0: 5d 3b 20 2f 2a 20 52 6f 77 20 73 65 70 61 72 61  ]; /* Row separa
71e0: 74 6f 72 20 63 68 61 72 61 63 74 65 72 20 66 6f  tor character fo
71f0: 72 20 4d 4f 44 45 5f 41 73 63 69 69 20 2a 2f 0a  r MODE_Ascii */.
7200: 20 20 69 6e 74 20 63 6f 6c 57 69 64 74 68 5b 31    int colWidth[1
7210: 30 30 5d 3b 20 20 20 20 20 2f 2a 20 52 65 71 75  00];     /* Requ
7220: 65 73 74 65 64 20 77 69 64 74 68 20 6f 66 20 65  ested width of e
7230: 61 63 68 20 63 6f 6c 75 6d 6e 20 77 68 65 6e 20  ach column when 
7240: 69 6e 20 63 6f 6c 75 6d 6e 20 6d 6f 64 65 2a 2f  in column mode*/
7250: 0a 20 20 69 6e 74 20 61 63 74 75 61 6c 57 69 64  .  int actualWid
7260: 74 68 5b 31 30 30 5d 3b 20 20 2f 2a 20 41 63 74  th[100];  /* Act
7270: 75 61 6c 20 77 69 64 74 68 20 6f 66 20 65 61 63  ual width of eac
7280: 68 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 63 68  h column */.  ch
7290: 61 72 20 6e 75 6c 6c 56 61 6c 75 65 5b 32 30 5d  ar nullValue[20]
72a0: 3b 20 20 20 20 2f 2a 20 54 68 65 20 74 65 78 74  ;    /* The text
72b0: 20 74 6f 20 70 72 69 6e 74 20 77 68 65 6e 20 61   to print when a
72c0: 20 4e 55 4c 4c 20 63 6f 6d 65 73 20 62 61 63 6b   NULL comes back
72d0: 20 66 72 6f 6d 0a 20 20 20 20 20 20 20 20 20 20   from.          
72e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
72f0: 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 2a  * the database *
7300: 2f 0a 20 20 63 68 61 72 20 6f 75 74 66 69 6c 65  /.  char outfile
7310: 5b 46 49 4c 45 4e 41 4d 45 5f 4d 41 58 5d 3b 20  [FILENAME_MAX]; 
7320: 2f 2a 20 46 69 6c 65 6e 61 6d 65 20 66 6f 72 20  /* Filename for 
7330: 2a 6f 75 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  *out */.  const 
7340: 63 68 61 72 20 2a 7a 44 62 46 69 6c 65 6e 61 6d  char *zDbFilenam
7350: 65 3b 20 20 20 20 2f 2a 20 6e 61 6d 65 20 6f 66  e;    /* name of
7360: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
7370: 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 46  le */.  char *zF
7380: 72 65 65 4f 6e 43 6c 6f 73 65 3b 20 20 20 20 20  reeOnClose;     
7390: 20 20 20 20 2f 2a 20 46 69 6c 65 6e 61 6d 65 20      /* Filename 
73a0: 74 6f 20 66 72 65 65 20 77 68 65 6e 20 63 6c 6f  to free when clo
73b0: 73 69 6e 67 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  sing */.  const 
73c0: 63 68 61 72 20 2a 7a 56 66 73 3b 20 20 20 20 20  char *zVfs;     
73d0: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
73e0: 20 56 46 53 20 74 6f 20 75 73 65 20 2a 2f 0a 20   VFS to use */. 
73f0: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
7400: 53 74 6d 74 3b 20 20 20 2f 2a 20 43 75 72 72 65  Stmt;   /* Curre
7410: 6e 74 20 73 74 61 74 65 6d 65 6e 74 20 69 66 20  nt statement if 
7420: 61 6e 79 2e 20 2a 2f 0a 20 20 46 49 4c 45 20 2a  any. */.  FILE *
7430: 70 4c 6f 67 3b 20 20 20 20 20 20 20 20 20 20 20  pLog;           
7440: 20 2f 2a 20 57 72 69 74 65 20 6c 6f 67 20 6f 75   /* Write log ou
7450: 74 70 75 74 20 68 65 72 65 20 2a 2f 0a 20 20 69  tput here */.  i
7460: 6e 74 20 2a 61 69 49 6e 64 65 6e 74 3b 20 20 20  nt *aiIndent;   
7470: 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f        /* Array o
7480: 66 20 69 6e 64 65 6e 74 73 20 75 73 65 64 20 69  f indents used i
7490: 6e 20 4d 4f 44 45 5f 45 78 70 6c 61 69 6e 20 2a  n MODE_Explain *
74a0: 2f 0a 20 20 69 6e 74 20 6e 49 6e 64 65 6e 74 3b  /.  int nIndent;
74b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
74c0: 7a 65 20 6f 66 20 61 72 72 61 79 20 61 69 49 6e  ze of array aiIn
74d0: 64 65 6e 74 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20  dent[] */.  int 
74e0: 69 49 6e 64 65 6e 74 3b 20 20 20 20 20 20 20 20  iIndent;        
74f0: 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63     /* Index of c
7500: 75 72 72 65 6e 74 20 6f 70 20 69 6e 20 61 69 49  urrent op in aiI
7510: 6e 64 65 6e 74 5b 5d 20 2a 2f 0a 23 69 66 20 64  ndent[] */.#if d
7520: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
7530: 41 42 4c 45 5f 53 45 53 53 49 4f 4e 29 0a 20 20  ABLE_SESSION).  
7540: 69 6e 74 20 6e 53 65 73 73 69 6f 6e 3b 20 20 20  int nSession;   
7550: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
7560: 62 65 72 20 6f 66 20 61 63 74 69 76 65 20 73 65  ber of active se
7570: 73 73 69 6f 6e 73 20 2a 2f 0a 20 20 4f 70 65 6e  ssions */.  Open
7580: 53 65 73 73 69 6f 6e 20 61 53 65 73 73 69 6f 6e  Session aSession
7590: 5b 34 5d 3b 20 20 2f 2a 20 41 72 72 61 79 20 6f  [4];  /* Array o
75a0: 66 20 73 65 73 73 69 6f 6e 73 2e 20 20 5b 30 5d  f sessions.  [0]
75b0: 20 69 73 20 69 6e 20 66 6f 63 75 73 2e 20 2a 2f   is in focus. */
75c0: 0a 23 65 6e 64 69 66 0a 20 20 45 78 70 65 72 74  .#endif.  Expert
75d0: 49 6e 66 6f 20 65 78 70 65 72 74 3b 20 20 20 20  Info expert;    
75e0: 20 20 20 20 2f 2a 20 56 61 6c 69 64 20 69 66 20      /* Valid if 
75f0: 70 72 65 76 69 6f 75 73 20 63 6f 6d 6d 61 6e 64  previous command
7600: 20 77 61 73 20 22 2e 65 78 70 65 72 74 20 4f 50   was ".expert OP
7610: 54 2e 2e 2e 22 20 2a 2f 0a 7d 3b 0a 0a 0a 2f 2a  T..." */.};.../*
7620: 20 41 6c 6c 6f 77 65 64 20 76 61 6c 75 65 73 20   Allowed values 
7630: 66 6f 72 20 53 68 65 6c 6c 53 74 61 74 65 2e 61  for ShellState.a
7640: 75 74 6f 45 51 50 0a 2a 2f 0a 23 64 65 66 69 6e  utoEQP.*/.#defin
7650: 65 20 41 55 54 4f 45 51 50 5f 6f 66 66 20 20 20  e AUTOEQP_off   
7660: 20 20 20 30 0a 23 64 65 66 69 6e 65 20 41 55 54     0.#define AUT
7670: 4f 45 51 50 5f 6f 6e 20 20 20 20 20 20 20 31 0a  OEQP_on       1.
7680: 23 64 65 66 69 6e 65 20 41 55 54 4f 45 51 50 5f  #define AUTOEQP_
7690: 74 72 69 67 67 65 72 20 20 32 0a 23 64 65 66 69  trigger  2.#defi
76a0: 6e 65 20 41 55 54 4f 45 51 50 5f 66 75 6c 6c 20  ne AUTOEQP_full 
76b0: 20 20 20 20 33 0a 0a 2f 2a 20 41 6c 6c 6f 77 65      3../* Allowe
76c0: 64 20 76 61 6c 75 65 73 20 66 6f 72 20 53 68 65  d values for She
76d0: 6c 6c 53 74 61 74 65 2e 6f 70 65 6e 4d 6f 64 65  llState.openMode
76e0: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 53 48 45 4c  .*/.#define SHEL
76f0: 4c 5f 4f 50 45 4e 5f 55 4e 53 50 45 43 20 20 20  L_OPEN_UNSPEC   
7700: 20 20 30 20 20 20 20 20 20 2f 2a 20 4e 6f 20 6f    0      /* No o
7710: 70 65 6e 2d 6d 6f 64 65 20 73 70 65 63 69 66 69  pen-mode specifi
7720: 65 64 20 2a 2f 0a 23 64 65 66 69 6e 65 20 53 48  ed */.#define SH
7730: 45 4c 4c 5f 4f 50 45 4e 5f 4e 4f 52 4d 41 4c 20  ELL_OPEN_NORMAL 
7740: 20 20 20 20 31 20 20 20 20 20 20 2f 2a 20 4e 6f      1      /* No
7750: 72 6d 61 6c 20 64 61 74 61 62 61 73 65 20 66 69  rmal database fi
7760: 6c 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 53 48  le */.#define SH
7770: 45 4c 4c 5f 4f 50 45 4e 5f 41 50 50 45 4e 44 56  ELL_OPEN_APPENDV
7780: 46 53 20 20 32 20 20 20 20 20 20 2f 2a 20 55 73  FS  2      /* Us
7790: 65 20 61 70 70 65 6e 64 76 66 73 20 2a 2f 0a 23  e appendvfs */.#
77a0: 64 65 66 69 6e 65 20 53 48 45 4c 4c 5f 4f 50 45  define SHELL_OPE
77b0: 4e 5f 5a 49 50 46 49 4c 45 20 20 20 20 33 20 20  N_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 0a 2f 2a 0a 2a 2a 20 54  able */../*.** T
77f0: 68 65 73 65 20 61 72 65 20 74 68 65 20 61 6c 6c  hese are the all
7800: 6f 77 65 64 20 73 68 65 6c 6c 46 6c 67 73 20 76  owed shellFlgs v
7810: 61 6c 75 65 73 0a 2a 2f 0a 23 64 65 66 69 6e 65  alues.*/.#define
7820: 20 53 48 46 4c 47 5f 50 61 67 65 63 61 63 68 65   SHFLG_Pagecache
7830: 20 20 20 20 20 20 30 78 30 30 30 30 30 30 30 31        0x00000001
7840: 20 2f 2a 20 54 68 65 20 2d 2d 70 61 67 65 63 61   /* The --pageca
7850: 63 68 65 20 6f 70 74 69 6f 6e 20 69 73 20 75 73  che option is us
7860: 65 64 20 2a 2f 0a 23 64 65 66 69 6e 65 20 53 48  ed */.#define SH
7870: 46 4c 47 5f 4c 6f 6f 6b 61 73 69 64 65 20 20 20  FLG_Lookaside   
7880: 20 20 20 30 78 30 30 30 30 30 30 30 32 20 2f 2a     0x00000002 /*
7890: 20 4c 6f 6f 6b 61 73 69 64 65 20 6d 65 6d 6f 72   Lookaside memor
78a0: 79 20 69 73 20 75 73 65 64 20 2a 2f 0a 23 64 65  y is used */.#de
78b0: 66 69 6e 65 20 53 48 46 4c 47 5f 42 61 63 6b 73  fine SHFLG_Backs
78c0: 6c 61 73 68 20 20 20 20 20 20 30 78 30 30 30 30  lash      0x0000
78d0: 30 30 30 34 20 2f 2a 20 54 68 65 20 2d 2d 62 61  0004 /* The --ba
78e0: 63 6b 73 6c 61 73 68 20 6f 70 74 69 6f 6e 20 69  ckslash option i
78f0: 73 20 75 73 65 64 20 2a 2f 0a 23 64 65 66 69 6e  s used */.#defin
7900: 65 20 53 48 46 4c 47 5f 50 72 65 73 65 72 76 65  e SHFLG_Preserve
7910: 52 6f 77 69 64 20 20 30 78 30 30 30 30 30 30 30  Rowid  0x0000000
7920: 38 20 2f 2a 20 2e 64 75 6d 70 20 70 72 65 73 65  8 /* .dump prese
7930: 72 76 65 73 20 72 6f 77 69 64 20 76 61 6c 75 65  rves rowid value
7940: 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20 53 48 46  s */.#define SHF
7950: 4c 47 5f 4e 65 77 6c 69 6e 65 73 20 20 20 20 20  LG_Newlines     
7960: 20 20 30 78 30 30 30 30 30 30 31 30 20 2f 2a 20    0x00000010 /* 
7970: 2e 64 75 6d 70 20 2d 2d 6e 65 77 6c 69 6e 65 20  .dump --newline 
7980: 66 6c 61 67 20 2a 2f 0a 23 64 65 66 69 6e 65 20  flag */.#define 
7990: 53 48 46 4c 47 5f 43 6f 75 6e 74 43 68 61 6e 67  SHFLG_CountChang
79a0: 65 73 20 20 20 30 78 30 30 30 30 30 30 32 30 20  es   0x00000020 
79b0: 2f 2a 20 2e 63 68 61 6e 67 65 73 20 73 65 74 74  /* .changes sett
79c0: 69 6e 67 20 2a 2f 0a 23 64 65 66 69 6e 65 20 53  ing */.#define S
79d0: 48 46 4c 47 5f 45 63 68 6f 20 20 20 20 20 20 20  HFLG_Echo       
79e0: 20 20 20 20 30 78 30 30 30 30 30 30 34 30 20 2f      0x00000040 /
79f0: 2a 20 2e 65 63 68 6f 20 6f 72 20 2d 2d 65 63 68  * .echo or --ech
7a00: 6f 20 73 65 74 74 69 6e 67 20 2a 2f 0a 0a 2f 2a  o setting */../*
7a10: 0a 2a 2a 20 4d 61 63 72 6f 73 20 66 6f 72 20 74  .** Macros for t
7a20: 65 73 74 69 6e 67 20 61 6e 64 20 73 65 74 74 69  esting and setti
7a30: 6e 67 20 73 68 65 6c 6c 46 6c 67 73 0a 2a 2f 0a  ng shellFlgs.*/.
7a40: 23 64 65 66 69 6e 65 20 53 68 65 6c 6c 48 61 73  #define ShellHas
7a50: 46 6c 61 67 28 50 2c 58 29 20 20 20 20 28 28 28  Flag(P,X)    (((
7a60: 50 29 2d 3e 73 68 65 6c 6c 46 6c 67 73 20 26 20  P)->shellFlgs & 
7a70: 28 58 29 29 21 3d 30 29 0a 23 64 65 66 69 6e 65  (X))!=0).#define
7a80: 20 53 68 65 6c 6c 53 65 74 46 6c 61 67 28 50 2c   ShellSetFlag(P,
7a90: 58 29 20 20 20 20 28 28 50 29 2d 3e 73 68 65 6c  X)    ((P)->shel
7aa0: 6c 46 6c 67 73 7c 3d 28 58 29 29 0a 23 64 65 66  lFlgs|=(X)).#def
7ab0: 69 6e 65 20 53 68 65 6c 6c 43 6c 65 61 72 46 6c  ine ShellClearFl
7ac0: 61 67 28 50 2c 58 29 20 20 28 28 50 29 2d 3e 73  ag(P,X)  ((P)->s
7ad0: 68 65 6c 6c 46 6c 67 73 26 3d 28 7e 28 58 29 29  hellFlgs&=(~(X))
7ae0: 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 73 65 20 61  )../*.** These a
7af0: 72 65 20 74 68 65 20 61 6c 6c 6f 77 65 64 20 6d  re the allowed m
7b00: 6f 64 65 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  odes..*/.#define
7b10: 20 4d 4f 44 45 5f 4c 69 6e 65 20 20 20 20 20 30   MODE_Line     0
7b20: 20 20 2f 2a 20 4f 6e 65 20 63 6f 6c 75 6d 6e 20    /* One column 
7b30: 70 65 72 20 6c 69 6e 65 2e 20 20 42 6c 61 6e 6b  per line.  Blank
7b40: 20 6c 69 6e 65 20 62 65 74 77 65 65 6e 20 72 65   line between re
7b50: 63 6f 72 64 73 20 2a 2f 0a 23 64 65 66 69 6e 65  cords */.#define
7b60: 20 4d 4f 44 45 5f 43 6f 6c 75 6d 6e 20 20 20 31   MODE_Column   1
7b70: 20 20 2f 2a 20 4f 6e 65 20 72 65 63 6f 72 64 20    /* One record 
7b80: 70 65 72 20 6c 69 6e 65 20 69 6e 20 6e 65 61 74  per line in neat
7b90: 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 23 64 65 66   columns */.#def
7ba0: 69 6e 65 20 4d 4f 44 45 5f 4c 69 73 74 20 20 20  ine MODE_List   
7bb0: 20 20 32 20 20 2f 2a 20 4f 6e 65 20 72 65 63 6f    2  /* One reco
7bc0: 72 64 20 70 65 72 20 6c 69 6e 65 20 77 69 74 68  rd per line with
7bd0: 20 61 20 73 65 70 61 72 61 74 6f 72 20 2a 2f 0a   a separator */.
7be0: 23 64 65 66 69 6e 65 20 4d 4f 44 45 5f 53 65 6d  #define MODE_Sem
7bf0: 69 20 20 20 20 20 33 20 20 2f 2a 20 53 61 6d 65  i     3  /* Same
7c00: 20 61 73 20 4d 4f 44 45 5f 4c 69 73 74 20 62 75   as MODE_List bu
7c10: 74 20 61 70 70 65 6e 64 20 22 3b 22 20 74 6f 20  t append ";" to 
7c20: 65 61 63 68 20 6c 69 6e 65 20 2a 2f 0a 23 64 65  each line */.#de
7c30: 66 69 6e 65 20 4d 4f 44 45 5f 48 74 6d 6c 20 20  fine MODE_Html  
7c40: 20 20 20 34 20 20 2f 2a 20 47 65 6e 65 72 61 74     4  /* Generat
7c50: 65 20 61 6e 20 58 48 54 4d 4c 20 74 61 62 6c 65  e an XHTML table
7c60: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 4f 44 45   */.#define MODE
7c70: 5f 49 6e 73 65 72 74 20 20 20 35 20 20 2f 2a 20  _Insert   5  /* 
7c80: 47 65 6e 65 72 61 74 65 20 53 51 4c 20 22 69 6e  Generate SQL "in
7c90: 73 65 72 74 22 20 73 74 61 74 65 6d 65 6e 74 73  sert" statements
7ca0: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 4f 44 45   */.#define MODE
7cb0: 5f 51 75 6f 74 65 20 20 20 20 36 20 20 2f 2a 20  _Quote    6  /* 
7cc0: 51 75 6f 74 65 20 76 61 6c 75 65 73 20 61 73 20  Quote values as 
7cd0: 66 6f 72 20 53 51 4c 20 2a 2f 0a 23 64 65 66 69  for SQL */.#defi
7ce0: 6e 65 20 4d 4f 44 45 5f 54 63 6c 20 20 20 20 20  ne MODE_Tcl     
7cf0: 20 37 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20   7  /* Generate 
7d00: 41 4e 53 49 2d 43 20 6f 72 20 54 43 4c 20 71 75  ANSI-C or TCL qu
7d10: 6f 74 65 64 20 65 6c 65 6d 65 6e 74 73 20 2a 2f  oted elements */
7d20: 0a 23 64 65 66 69 6e 65 20 4d 4f 44 45 5f 43 73  .#define MODE_Cs
7d30: 76 20 20 20 20 20 20 38 20 20 2f 2a 20 51 75 6f  v      8  /* Quo
7d40: 74 65 20 73 74 72 69 6e 67 73 2c 20 6e 75 6d 62  te strings, numb
7d50: 65 72 73 20 61 72 65 20 70 6c 61 69 6e 20 2a 2f  ers are plain */
7d60: 0a 23 64 65 66 69 6e 65 20 4d 4f 44 45 5f 45 78  .#define MODE_Ex
7d70: 70 6c 61 69 6e 20 20 39 20 20 2f 2a 20 4c 69 6b  plain  9  /* Lik
7d80: 65 20 4d 4f 44 45 5f 43 6f 6c 75 6d 6e 2c 20 62  e MODE_Column, b
7d90: 75 74 20 64 6f 20 6e 6f 74 20 74 72 75 6e 63 61  ut do not trunca
7da0: 74 65 20 64 61 74 61 20 2a 2f 0a 23 64 65 66 69  te data */.#defi
7db0: 6e 65 20 4d 4f 44 45 5f 41 73 63 69 69 20 20 20  ne MODE_Ascii   
7dc0: 31 30 20 20 2f 2a 20 55 73 65 20 41 53 43 49 49  10  /* Use ASCII
7dd0: 20 75 6e 69 74 20 61 6e 64 20 72 65 63 6f 72 64   unit and record
7de0: 20 73 65 70 61 72 61 74 6f 72 73 20 28 30 78 31   separators (0x1
7df0: 46 2f 30 78 31 45 29 20 2a 2f 0a 23 64 65 66 69  F/0x1E) */.#defi
7e00: 6e 65 20 4d 4f 44 45 5f 50 72 65 74 74 79 20 20  ne MODE_Pretty  
7e10: 31 31 20 20 2f 2a 20 50 72 65 74 74 79 2d 70 72  11  /* Pretty-pr
7e20: 69 6e 74 20 73 63 68 65 6d 61 73 20 2a 2f 0a 0a  int schemas */..
7e30: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
7e40: 72 20 2a 6d 6f 64 65 44 65 73 63 72 5b 5d 20 3d  r *modeDescr[] =
7e50: 20 7b 0a 20 20 22 6c 69 6e 65 22 2c 0a 20 20 22   {.  "line",.  "
7e60: 63 6f 6c 75 6d 6e 22 2c 0a 20 20 22 6c 69 73 74  column",.  "list
7e70: 22 2c 0a 20 20 22 73 65 6d 69 22 2c 0a 20 20 22  ",.  "semi",.  "
7e80: 68 74 6d 6c 22 2c 0a 20 20 22 69 6e 73 65 72 74  html",.  "insert
7e90: 22 2c 0a 20 20 22 71 75 6f 74 65 22 2c 0a 20 20  ",.  "quote",.  
7ea0: 22 74 63 6c 22 2c 0a 20 20 22 63 73 76 22 2c 0a  "tcl",.  "csv",.
7eb0: 20 20 22 65 78 70 6c 61 69 6e 22 2c 0a 20 20 22    "explain",.  "
7ec0: 61 73 63 69 69 22 2c 0a 20 20 22 70 72 65 74 74  ascii",.  "prett
7ed0: 79 70 72 69 6e 74 22 2c 0a 7d 3b 0a 0a 2f 2a 0a  yprint",.};../*.
7ee0: 2a 2a 20 54 68 65 73 65 20 61 72 65 20 74 68 65  ** These are the
7ef0: 20 63 6f 6c 75 6d 6e 2f 72 6f 77 2f 6c 69 6e 65   column/row/line
7f00: 20 73 65 70 61 72 61 74 6f 72 73 20 75 73 65 64   separators used
7f10: 20 62 79 20 74 68 65 20 76 61 72 69 6f 75 73 0a   by the various.
7f20: 2a 2a 20 69 6d 70 6f 72 74 2f 65 78 70 6f 72 74  ** import/export
7f30: 20 6d 6f 64 65 73 2e 0a 2a 2f 0a 23 64 65 66 69   modes..*/.#defi
7f40: 6e 65 20 53 45 50 5f 43 6f 6c 75 6d 6e 20 20 20  ne SEP_Column   
7f50: 20 22 7c 22 0a 23 64 65 66 69 6e 65 20 53 45 50   "|".#define SEP
7f60: 5f 52 6f 77 20 20 20 20 20 20 20 22 5c 6e 22 0a  _Row       "\n".
7f70: 23 64 65 66 69 6e 65 20 53 45 50 5f 54 61 62 20  #define SEP_Tab 
7f80: 20 20 20 20 20 20 22 5c 74 22 0a 23 64 65 66 69        "\t".#defi
7f90: 6e 65 20 53 45 50 5f 53 70 61 63 65 20 20 20 20  ne SEP_Space    
7fa0: 20 22 20 22 0a 23 64 65 66 69 6e 65 20 53 45 50   " ".#define SEP
7fb0: 5f 43 6f 6d 6d 61 20 20 20 20 20 22 2c 22 0a 23  _Comma     ",".#
7fc0: 64 65 66 69 6e 65 20 53 45 50 5f 43 72 4c 66 20  define SEP_CrLf 
7fd0: 20 20 20 20 20 22 5c 72 5c 6e 22 0a 23 64 65 66       "\r\n".#def
7fe0: 69 6e 65 20 53 45 50 5f 55 6e 69 74 20 20 20 20  ine SEP_Unit    
7ff0: 20 20 22 5c 78 31 46 22 0a 23 64 65 66 69 6e 65    "\x1F".#define
8000: 20 53 45 50 5f 52 65 63 6f 72 64 20 20 20 20 22   SEP_Record    "
8010: 5c 78 31 45 22 0a 0a 2f 2a 0a 2a 2a 20 41 20 63  \x1E"../*.** A c
8020: 61 6c 6c 62 61 63 6b 20 66 6f 72 20 74 68 65 20  allback for the 
8030: 73 71 6c 69 74 65 33 5f 6c 6f 67 28 29 20 69 6e  sqlite3_log() in
8040: 74 65 72 66 61 63 65 2e 0a 2a 2f 0a 73 74 61 74  terface..*/.stat
8050: 69 63 20 76 6f 69 64 20 73 68 65 6c 6c 4c 6f 67  ic void shellLog
8060: 28 76 6f 69 64 20 2a 70 41 72 67 2c 20 69 6e 74  (void *pArg, int
8070: 20 69 45 72 72 43 6f 64 65 2c 20 63 6f 6e 73 74   iErrCode, const
8080: 20 63 68 61 72 20 2a 7a 4d 73 67 29 7b 0a 20 20   char *zMsg){.  
8090: 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 20 3d 20  ShellState *p = 
80a0: 28 53 68 65 6c 6c 53 74 61 74 65 2a 29 70 41 72  (ShellState*)pAr
80b0: 67 3b 0a 20 20 69 66 28 20 70 2d 3e 70 4c 6f 67  g;.  if( p->pLog
80c0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
80d0: 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 70  utf8_printf(p->p
80e0: 4c 6f 67 2c 20 22 28 25 64 29 20 25 73 5c 6e 22  Log, "(%d) %s\n"
80f0: 2c 20 69 45 72 72 43 6f 64 65 2c 20 7a 4d 73 67  , iErrCode, zMsg
8100: 29 3b 0a 20 20 66 66 6c 75 73 68 28 70 2d 3e 70  );.  fflush(p->p
8110: 4c 6f 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  Log);.}../*.** S
8120: 51 4c 20 66 75 6e 63 74 69 6f 6e 3a 20 20 73 68  QL function:  sh
8130: 65 6c 6c 5f 70 75 74 73 6e 6c 28 58 29 0a 2a 2a  ell_putsnl(X).**
8140: 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20 74 65  .** Write the te
8150: 78 74 20 58 20 74 6f 20 74 68 65 20 73 63 72 65  xt X to the scre
8160: 65 6e 20 28 6f 72 20 77 68 61 74 65 76 65 72 20  en (or whatever 
8170: 6f 75 74 70 75 74 20 69 73 20 62 65 69 6e 67 20  output is being 
8180: 64 69 72 65 63 74 65 64 29 0a 2a 2a 20 61 64 64  directed).** add
8190: 69 6e 67 20 61 20 6e 65 77 6c 69 6e 65 20 61 74  ing a newline at
81a0: 20 74 68 65 20 65 6e 64 2c 20 61 6e 64 20 74 68   the end, and th
81b0: 65 6e 20 72 65 74 75 72 6e 20 58 2e 0a 2a 2f 0a  en return X..*/.
81c0: 73 74 61 74 69 63 20 76 6f 69 64 20 73 68 65 6c  static void shel
81d0: 6c 50 75 74 73 46 75 6e 63 28 0a 20 20 73 71 6c  lPutsFunc(.  sql
81e0: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43  ite3_context *pC
81f0: 74 78 2c 0a 20 20 69 6e 74 20 6e 56 61 6c 2c 0a  tx,.  int nVal,.
8200: 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
8210: 2a 2a 61 70 56 61 6c 0a 29 7b 0a 20 20 53 68 65  **apVal.){.  She
8220: 6c 6c 53 74 61 74 65 20 2a 70 20 3d 20 28 53 68  llState *p = (Sh
8230: 65 6c 6c 53 74 61 74 65 2a 29 73 71 6c 69 74 65  ellState*)sqlite
8240: 33 5f 75 73 65 72 5f 64 61 74 61 28 70 43 74 78  3_user_data(pCtx
8250: 29 3b 0a 20 20 75 74 66 38 5f 70 72 69 6e 74 66  );.  utf8_printf
8260: 28 70 2d 3e 6f 75 74 2c 20 22 25 73 5c 6e 22 2c  (p->out, "%s\n",
8270: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74   sqlite3_value_t
8280: 65 78 74 28 61 70 56 61 6c 5b 30 5d 29 29 3b 0a  ext(apVal[0]));.
8290: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
82a0: 5f 76 61 6c 75 65 28 70 43 74 78 2c 20 61 70 56  _value(pCtx, apV
82b0: 61 6c 5b 30 5d 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  al[0]);.}../*.**
82c0: 20 4f 75 74 70 75 74 20 74 68 65 20 67 69 76 65   Output the give
82d0: 6e 20 73 74 72 69 6e 67 20 61 73 20 61 20 68 65  n string as a he
82e0: 78 2d 65 6e 63 6f 64 65 64 20 62 6c 6f 62 20 28  x-encoded blob (
82f0: 65 67 2e 20 58 27 31 32 33 34 27 20 29 0a 2a 2f  eg. X'1234' ).*/
8300: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6f 75 74  .static void out
8310: 70 75 74 5f 68 65 78 5f 62 6c 6f 62 28 46 49 4c  put_hex_blob(FIL
8320: 45 20 2a 6f 75 74 2c 20 63 6f 6e 73 74 20 76 6f  E *out, const vo
8330: 69 64 20 2a 70 42 6c 6f 62 2c 20 69 6e 74 20 6e  id *pBlob, int n
8340: 42 6c 6f 62 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  Blob){.  int i;.
8350: 20 20 63 68 61 72 20 2a 7a 42 6c 6f 62 20 3d 20    char *zBlob = 
8360: 28 63 68 61 72 20 2a 29 70 42 6c 6f 62 3b 0a 20  (char *)pBlob;. 
8370: 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c   raw_printf(out,
8380: 22 58 27 22 29 3b 0a 20 20 66 6f 72 28 69 3d 30  "X'");.  for(i=0
8390: 3b 20 69 3c 6e 42 6c 6f 62 3b 20 69 2b 2b 29 7b  ; i<nBlob; i++){
83a0: 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c   raw_printf(out,
83b0: 22 25 30 32 78 22 2c 7a 42 6c 6f 62 5b 69 5d 26  "%02x",zBlob[i]&
83c0: 30 78 66 66 29 3b 20 7d 0a 20 20 72 61 77 5f 70  0xff); }.  raw_p
83d0: 72 69 6e 74 66 28 6f 75 74 2c 22 27 22 29 3b 0a  rintf(out,"'");.
83e0: 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 61 20  }../*.** Find a 
83f0: 73 74 72 69 6e 67 20 74 68 61 74 20 69 73 20 6e  string that is n
8400: 6f 74 20 66 6f 75 6e 64 20 61 6e 79 77 68 65 72  ot found anywher
8410: 65 20 69 6e 20 7a 5b 5d 2e 20 20 52 65 74 75 72  e in z[].  Retur
8420: 6e 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74  n a pointer.** t
8430: 6f 20 74 68 61 74 20 73 74 72 69 6e 67 2e 0a 2a  o that string..*
8440: 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 75 73 65 20  *.** Try to use 
8450: 7a 41 20 61 6e 64 20 7a 42 20 66 69 72 73 74 2e  zA and zB first.
8460: 20 20 49 66 20 62 6f 74 68 20 6f 66 20 74 68 6f    If both of tho
8470: 73 65 20 61 72 65 20 61 6c 72 65 61 64 79 20 66  se are already f
8480: 6f 75 6e 64 20 69 6e 20 7a 5b 5d 0a 2a 2a 20 74  ound in z[].** t
8490: 68 65 6e 20 6d 61 6b 65 20 75 70 20 73 6f 6d 65  hen make up some
84a0: 20 73 74 72 69 6e 67 20 61 6e 64 20 73 74 6f 72   string and stor
84b0: 65 20 69 74 20 69 6e 20 74 68 65 20 62 75 66 66  e it in the buff
84c0: 65 72 20 7a 42 75 66 2e 0a 2a 2f 0a 73 74 61 74  er zBuf..*/.stat
84d0: 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 75  ic const char *u
84e0: 6e 75 73 65 64 5f 73 74 72 69 6e 67 28 0a 20 20  nused_string(.  
84f0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 20  const char *z,  
8500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8510: 20 20 2f 2a 20 52 65 73 75 6c 74 20 6d 75 73 74    /* Result must
8520: 20 6e 6f 74 20 61 70 70 65 61 72 20 61 6e 79 77   not appear anyw
8530: 68 65 72 65 20 69 6e 20 7a 20 2a 2f 0a 20 20 63  here in z */.  c
8540: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 2c 20 63  onst char *zA, c
8550: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 42 2c 20 20  onst char *zB,  
8560: 20 2f 2a 20 54 72 79 20 74 68 65 73 65 20 66 69   /* Try these fi
8570: 72 73 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  rst */.  char *z
8580: 42 75 66 20 20 20 20 20 20 20 20 20 20 20 20 20  Buf             
8590: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70             /* Sp
85a0: 61 63 65 20 74 6f 20 73 74 6f 72 65 20 61 20 67  ace to store a g
85b0: 65 6e 65 72 61 74 65 64 20 73 74 72 69 6e 67 20  enerated string 
85c0: 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64  */.){.  unsigned
85d0: 20 69 20 3d 20 30 3b 0a 20 20 69 66 28 20 73 74   i = 0;.  if( st
85e0: 72 73 74 72 28 7a 2c 20 7a 41 29 3d 3d 30 20 29  rstr(z, zA)==0 )
85f0: 20 72 65 74 75 72 6e 20 7a 41 3b 0a 20 20 69 66   return zA;.  if
8600: 28 20 73 74 72 73 74 72 28 7a 2c 20 7a 42 29 3d  ( strstr(z, zB)=
8610: 3d 30 20 29 20 72 65 74 75 72 6e 20 7a 42 3b 0a  =0 ) return zB;.
8620: 20 20 64 6f 7b 0a 20 20 20 20 73 71 6c 69 74 65    do{.    sqlite
8630: 33 5f 73 6e 70 72 69 6e 74 66 28 32 30 2c 7a 42  3_snprintf(20,zB
8640: 75 66 2c 22 28 25 73 25 75 29 22 2c 20 7a 41 2c  uf,"(%s%u)", zA,
8650: 20 69 2b 2b 29 3b 0a 20 20 7d 77 68 69 6c 65 28   i++);.  }while(
8660: 20 73 74 72 73 74 72 28 7a 2c 7a 42 75 66 29 21   strstr(z,zBuf)!
8670: 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a  =0 );.  return z
8680: 42 75 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 75  Buf;.}../*.** Ou
8690: 74 70 75 74 20 74 68 65 20 67 69 76 65 6e 20 73  tput the given s
86a0: 74 72 69 6e 67 20 61 73 20 61 20 71 75 6f 74 65  tring as a quote
86b0: 64 20 73 74 72 69 6e 67 20 75 73 69 6e 67 20 53  d string using S
86c0: 51 4c 20 71 75 6f 74 69 6e 67 20 63 6f 6e 76 65  QL quoting conve
86d0: 6e 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 53 65  ntions..**.** Se
86e0: 65 20 61 6c 73 6f 3a 20 6f 75 74 70 75 74 5f 71  e also: output_q
86f0: 75 6f 74 65 64 5f 65 73 63 61 70 65 64 5f 73 74  uoted_escaped_st
8700: 72 69 6e 67 28 29 0a 2a 2f 0a 73 74 61 74 69 63  ring().*/.static
8710: 20 76 6f 69 64 20 6f 75 74 70 75 74 5f 71 75 6f   void output_quo
8720: 74 65 64 5f 73 74 72 69 6e 67 28 46 49 4c 45 20  ted_string(FILE 
8730: 2a 6f 75 74 2c 20 63 6f 6e 73 74 20 63 68 61 72  *out, const char
8740: 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20   *z){.  int i;. 
8750: 20 63 68 61 72 20 63 3b 0a 20 20 73 65 74 42 69   char c;.  setBi
8760: 6e 61 72 79 4d 6f 64 65 28 6f 75 74 2c 20 31 29  naryMode(out, 1)
8770: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 28 63 20  ;.  for(i=0; (c 
8780: 3d 20 7a 5b 69 5d 29 21 3d 30 20 26 26 20 63 21  = z[i])!=0 && c!
8790: 3d 27 5c 27 27 3b 20 69 2b 2b 29 7b 7d 0a 20 20  ='\''; i++){}.  
87a0: 69 66 28 20 63 3d 3d 30 20 29 7b 0a 20 20 20 20  if( c==0 ){.    
87b0: 75 74 66 38 5f 70 72 69 6e 74 66 28 6f 75 74 2c  utf8_printf(out,
87c0: 22 27 25 73 27 22 2c 7a 29 3b 0a 20 20 7d 65 6c  "'%s'",z);.  }el
87d0: 73 65 7b 0a 20 20 20 20 72 61 77 5f 70 72 69 6e  se{.    raw_prin
87e0: 74 66 28 6f 75 74 2c 20 22 27 22 29 3b 0a 20 20  tf(out, "'");.  
87f0: 20 20 77 68 69 6c 65 28 20 2a 7a 20 29 7b 0a 20    while( *z ){. 
8800: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 28 63       for(i=0; (c
8810: 20 3d 20 7a 5b 69 5d 29 21 3d 30 20 26 26 20 63   = z[i])!=0 && c
8820: 21 3d 27 5c 27 27 3b 20 69 2b 2b 29 7b 7d 0a 20  !='\''; i++){}. 
8830: 20 20 20 20 20 69 66 28 20 63 3d 3d 27 5c 27 27       if( c=='\''
8840: 20 29 20 69 2b 2b 3b 0a 20 20 20 20 20 20 69 66   ) i++;.      if
8850: 28 20 69 20 29 7b 0a 20 20 20 20 20 20 20 20 75  ( i ){.        u
8860: 74 66 38 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20  tf8_printf(out, 
8870: 22 25 2e 2a 73 22 2c 20 69 2c 20 7a 29 3b 0a 20  "%.*s", i, z);. 
8880: 20 20 20 20 20 20 20 7a 20 2b 3d 20 69 3b 0a 20         z += i;. 
8890: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
88a0: 20 63 3d 3d 27 5c 27 27 20 29 7b 0a 20 20 20 20   c=='\'' ){.    
88b0: 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f      raw_printf(o
88c0: 75 74 2c 20 22 27 22 29 3b 0a 20 20 20 20 20 20  ut, "'");.      
88d0: 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
88e0: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63 3d    }.      if( c=
88f0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72  =0 ){.        br
8900: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
8910: 20 20 20 7a 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20     z++;.    }.  
8920: 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74    raw_printf(out
8930: 2c 20 22 27 22 29 3b 0a 20 20 7d 0a 20 20 73 65  , "'");.  }.  se
8940: 74 54 65 78 74 4d 6f 64 65 28 6f 75 74 2c 20 31  tTextMode(out, 1
8950: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 75 74 70  );.}../*.** Outp
8960: 75 74 20 74 68 65 20 67 69 76 65 6e 20 73 74 72  ut the given str
8970: 69 6e 67 20 61 73 20 61 20 71 75 6f 74 65 64 20  ing as a quoted 
8980: 73 74 72 69 6e 67 20 75 73 69 6e 67 20 53 51 4c  string using SQL
8990: 20 71 75 6f 74 69 6e 67 20 63 6f 6e 76 65 6e 74   quoting convent
89a0: 69 6f 6e 73 2e 0a 2a 2a 20 41 64 64 69 74 69 6f  ions..** Additio
89b0: 6e 61 6c 6c 6c 79 20 2c 20 65 73 63 61 70 65 20  nallly , escape 
89c0: 74 68 65 20 22 5c 6e 22 20 61 6e 64 20 22 5c 72  the "\n" and "\r
89d0: 22 20 63 68 61 72 61 63 74 65 72 73 20 73 6f 20  " characters so 
89e0: 74 68 61 74 20 74 68 65 79 20 64 6f 20 6e 6f 74  that they do not
89f0: 0a 2a 2a 20 67 65 74 20 63 6f 72 72 75 70 74 65  .** get corrupte
8a00: 64 20 62 79 20 65 6e 64 2d 6f 66 2d 6c 69 6e 65  d by end-of-line
8a10: 20 74 72 61 6e 73 6c 61 74 69 6f 6e 20 66 61 63   translation fac
8a20: 69 6c 69 74 69 65 73 20 69 6e 20 73 6f 6d 65 20  ilities in some 
8a30: 6f 70 65 72 61 74 69 6e 67 0a 2a 2a 20 73 79 73  operating.** sys
8a40: 74 65 6d 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  tems..**.** This
8a50: 20 69 73 20 6c 69 6b 65 20 6f 75 74 70 75 74 5f   is like output_
8a60: 71 75 6f 74 65 64 5f 73 74 72 69 6e 67 28 29 20  quoted_string() 
8a70: 62 75 74 20 77 69 74 68 20 74 68 65 20 61 64 64  but with the add
8a80: 69 74 69 6f 6e 20 6f 66 20 74 68 65 20 5c 72 5c  ition of the \r\
8a90: 6e 0a 2a 2a 20 65 73 63 61 70 65 20 6d 65 63 68  n.** escape mech
8aa0: 61 6e 69 73 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63  anism..*/.static
8ab0: 20 76 6f 69 64 20 6f 75 74 70 75 74 5f 71 75 6f   void output_quo
8ac0: 74 65 64 5f 65 73 63 61 70 65 64 5f 73 74 72 69  ted_escaped_stri
8ad0: 6e 67 28 46 49 4c 45 20 2a 6f 75 74 2c 20 63 6f  ng(FILE *out, co
8ae0: 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20  nst char *z){.  
8af0: 69 6e 74 20 69 3b 0a 20 20 63 68 61 72 20 63 3b  int i;.  char c;
8b00: 0a 20 20 73 65 74 42 69 6e 61 72 79 4d 6f 64 65  .  setBinaryMode
8b10: 28 6f 75 74 2c 20 31 29 3b 0a 20 20 66 6f 72 28  (out, 1);.  for(
8b20: 69 3d 30 3b 20 28 63 20 3d 20 7a 5b 69 5d 29 21  i=0; (c = z[i])!
8b30: 3d 30 20 26 26 20 63 21 3d 27 5c 27 27 20 26 26  =0 && c!='\'' &&
8b40: 20 63 21 3d 27 5c 6e 27 20 26 26 20 63 21 3d 27   c!='\n' && c!='
8b50: 5c 72 27 3b 20 69 2b 2b 29 7b 7d 0a 20 20 69 66  \r'; i++){}.  if
8b60: 28 20 63 3d 3d 30 20 29 7b 0a 20 20 20 20 75 74  ( c==0 ){.    ut
8b70: 66 38 5f 70 72 69 6e 74 66 28 6f 75 74 2c 22 27  f8_printf(out,"'
8b80: 25 73 27 22 2c 7a 29 3b 0a 20 20 7d 65 6c 73 65  %s'",z);.  }else
8b90: 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  {.    const char
8ba0: 20 2a 7a 4e 4c 20 3d 20 30 3b 0a 20 20 20 20 63   *zNL = 0;.    c
8bb0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 52 20 3d  onst char *zCR =
8bc0: 20 30 3b 0a 20 20 20 20 69 6e 74 20 6e 4e 4c 20   0;.    int nNL 
8bd0: 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 6e 43 52  = 0;.    int nCR
8be0: 20 3d 20 30 3b 0a 20 20 20 20 63 68 61 72 20 7a   = 0;.    char z
8bf0: 42 75 66 31 5b 32 30 5d 2c 20 7a 42 75 66 32 5b  Buf1[20], zBuf2[
8c00: 32 30 5d 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  20];.    for(i=0
8c10: 3b 20 7a 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20  ; z[i]; i++){.  
8c20: 20 20 20 20 69 66 28 20 7a 5b 69 5d 3d 3d 27 5c      if( z[i]=='\
8c30: 6e 27 20 29 20 6e 4e 4c 2b 2b 3b 0a 20 20 20 20  n' ) nNL++;.    
8c40: 20 20 69 66 28 20 7a 5b 69 5d 3d 3d 27 5c 72 27    if( z[i]=='\r'
8c50: 20 29 20 6e 43 52 2b 2b 3b 0a 20 20 20 20 7d 0a   ) nCR++;.    }.
8c60: 20 20 20 20 69 66 28 20 6e 4e 4c 20 29 7b 0a 20      if( nNL ){. 
8c70: 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
8c80: 6f 75 74 2c 20 22 72 65 70 6c 61 63 65 28 22 29  out, "replace(")
8c90: 3b 0a 20 20 20 20 20 20 7a 4e 4c 20 3d 20 75 6e  ;.      zNL = un
8ca0: 75 73 65 64 5f 73 74 72 69 6e 67 28 7a 2c 20 22  used_string(z, "
8cb0: 5c 5c 6e 22 2c 20 22 5c 5c 30 31 32 22 2c 20 7a  \\n", "\\012", z
8cc0: 42 75 66 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Buf1);.    }.   
8cd0: 20 69 66 28 20 6e 43 52 20 29 7b 0a 20 20 20 20   if( nCR ){.    
8ce0: 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74    raw_printf(out
8cf0: 2c 20 22 72 65 70 6c 61 63 65 28 22 29 3b 0a 20  , "replace(");. 
8d00: 20 20 20 20 20 7a 43 52 20 3d 20 75 6e 75 73 65       zCR = unuse
8d10: 64 5f 73 74 72 69 6e 67 28 7a 2c 20 22 5c 5c 72  d_string(z, "\\r
8d20: 22 2c 20 22 5c 5c 30 31 35 22 2c 20 7a 42 75 66  ", "\\015", zBuf
8d30: 32 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 61  2);.    }.    ra
8d40: 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 27  w_printf(out, "'
8d50: 22 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 2a  ");.    while( *
8d60: 7a 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69  z ){.      for(i
8d70: 3d 30 3b 20 28 63 20 3d 20 7a 5b 69 5d 29 21 3d  =0; (c = z[i])!=
8d80: 30 20 26 26 20 63 21 3d 27 5c 6e 27 20 26 26 20  0 && c!='\n' && 
8d90: 63 21 3d 27 5c 72 27 20 26 26 20 63 21 3d 27 5c  c!='\r' && c!='\
8da0: 27 27 3b 20 69 2b 2b 29 7b 7d 0a 20 20 20 20 20  ''; i++){}.     
8db0: 20 69 66 28 20 63 3d 3d 27 5c 27 27 20 29 20 69   if( c=='\'' ) i
8dc0: 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 69 20  ++;.      if( i 
8dd0: 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f  ){.        utf8_
8de0: 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 2e 2a  printf(out, "%.*
8df0: 73 22 2c 20 69 2c 20 7a 29 3b 0a 20 20 20 20 20  s", i, z);.     
8e00: 20 20 20 7a 20 2b 3d 20 69 3b 0a 20 20 20 20 20     z += i;.     
8e10: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d   }.      if( c==
8e20: 27 5c 27 27 20 29 7b 0a 20 20 20 20 20 20 20 20  '\'' ){.        
8e30: 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20  raw_printf(out, 
8e40: 22 27 22 29 3b 0a 20 20 20 20 20 20 20 20 63 6f  "'");.        co
8e50: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a  ntinue;.      }.
8e60: 20 20 20 20 20 20 69 66 28 20 63 3d 3d 30 20 29        if( c==0 )
8e70: 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  {.        break;
8e80: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a  .      }.      z
8e90: 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 63 3d  ++;.      if( c=
8ea0: 3d 27 5c 6e 27 20 29 7b 0a 20 20 20 20 20 20 20  ='\n' ){.       
8eb0: 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c   raw_printf(out,
8ec0: 20 22 25 73 22 2c 20 7a 4e 4c 29 3b 0a 20 20 20   "%s", zNL);.   
8ed0: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
8ee0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 61 77       }.      raw
8ef0: 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 73  _printf(out, "%s
8f00: 22 2c 20 7a 43 52 29 3b 0a 20 20 20 20 7d 0a 20  ", zCR);.    }. 
8f10: 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75     raw_printf(ou
8f20: 74 2c 20 22 27 22 29 3b 0a 20 20 20 20 69 66 28  t, "'");.    if(
8f30: 20 6e 43 52 20 29 7b 0a 20 20 20 20 20 20 72 61   nCR ){.      ra
8f40: 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 2c  w_printf(out, ",
8f50: 27 25 73 27 2c 63 68 61 72 28 31 33 29 29 22 2c  '%s',char(13))",
8f60: 20 7a 43 52 29 3b 0a 20 20 20 20 7d 0a 20 20 20   zCR);.    }.   
8f70: 20 69 66 28 20 6e 4e 4c 20 29 7b 0a 20 20 20 20   if( nNL ){.    
8f80: 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74    raw_printf(out
8f90: 2c 20 22 2c 27 25 73 27 2c 63 68 61 72 28 31 30  , ",'%s',char(10
8fa0: 29 29 22 2c 20 7a 4e 4c 29 3b 0a 20 20 20 20 7d  ))", zNL);.    }
8fb0: 0a 20 20 7d 0a 20 20 73 65 74 54 65 78 74 4d 6f  .  }.  setTextMo
8fc0: 64 65 28 6f 75 74 2c 20 31 29 3b 0a 7d 0a 0a 2f  de(out, 1);.}../
8fd0: 2a 0a 2a 2a 20 4f 75 74 70 75 74 20 74 68 65 20  *.** Output the 
8fe0: 67 69 76 65 6e 20 73 74 72 69 6e 67 20 61 73 20  given string as 
8ff0: 61 20 71 75 6f 74 65 64 20 61 63 63 6f 72 64 69  a quoted accordi
9000: 6e 67 20 74 6f 20 43 20 6f 72 20 54 43 4c 20 71  ng to C or TCL q
9010: 75 6f 74 69 6e 67 20 72 75 6c 65 73 2e 0a 2a 2f  uoting rules..*/
9020: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6f 75 74  .static void out
9030: 70 75 74 5f 63 5f 73 74 72 69 6e 67 28 46 49 4c  put_c_string(FIL
9040: 45 20 2a 6f 75 74 2c 20 63 6f 6e 73 74 20 63 68  E *out, const ch
9050: 61 72 20 2a 7a 29 7b 0a 20 20 75 6e 73 69 67 6e  ar *z){.  unsign
9060: 65 64 20 69 6e 74 20 63 3b 0a 20 20 66 70 75 74  ed int c;.  fput
9070: 63 28 27 22 27 2c 20 6f 75 74 29 3b 0a 20 20 77  c('"', out);.  w
9080: 68 69 6c 65 28 20 28 63 20 3d 20 2a 28 7a 2b 2b  hile( (c = *(z++
9090: 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  ))!=0 ){.    if(
90a0: 20 63 3d 3d 27 5c 5c 27 20 29 7b 0a 20 20 20 20   c=='\\' ){.    
90b0: 20 20 66 70 75 74 63 28 63 2c 20 6f 75 74 29 3b    fputc(c, out);
90c0: 0a 20 20 20 20 20 20 66 70 75 74 63 28 63 2c 20  .      fputc(c, 
90d0: 6f 75 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  out);.    }else 
90e0: 69 66 28 20 63 3d 3d 27 22 27 20 29 7b 0a 20 20  if( c=='"' ){.  
90f0: 20 20 20 20 66 70 75 74 63 28 27 5c 5c 27 2c 20      fputc('\\', 
9100: 6f 75 74 29 3b 0a 20 20 20 20 20 20 66 70 75 74  out);.      fput
9110: 63 28 27 22 27 2c 20 6f 75 74 29 3b 0a 20 20 20  c('"', out);.   
9120: 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 5c   }else if( c=='\
9130: 74 27 20 29 7b 0a 20 20 20 20 20 20 66 70 75 74  t' ){.      fput
9140: 63 28 27 5c 5c 27 2c 20 6f 75 74 29 3b 0a 20 20  c('\\', out);.  
9150: 20 20 20 20 66 70 75 74 63 28 27 74 27 2c 20 6f      fputc('t', o
9160: 75 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  ut);.    }else i
9170: 66 28 20 63 3d 3d 27 5c 6e 27 20 29 7b 0a 20 20  f( c=='\n' ){.  
9180: 20 20 20 20 66 70 75 74 63 28 27 5c 5c 27 2c 20      fputc('\\', 
9190: 6f 75 74 29 3b 0a 20 20 20 20 20 20 66 70 75 74  out);.      fput
91a0: 63 28 27 6e 27 2c 20 6f 75 74 29 3b 0a 20 20 20  c('n', out);.   
91b0: 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 5c   }else if( c=='\
91c0: 72 27 20 29 7b 0a 20 20 20 20 20 20 66 70 75 74  r' ){.      fput
91d0: 63 28 27 5c 5c 27 2c 20 6f 75 74 29 3b 0a 20 20  c('\\', out);.  
91e0: 20 20 20 20 66 70 75 74 63 28 27 72 27 2c 20 6f      fputc('r', o
91f0: 75 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  ut);.    }else i
9200: 66 28 20 21 69 73 70 72 69 6e 74 28 63 26 30 78  f( !isprint(c&0x
9210: 66 66 29 20 29 7b 0a 20 20 20 20 20 20 72 61 77  ff) ){.      raw
9220: 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 5c 5c  _printf(out, "\\
9230: 25 30 33 6f 22 2c 20 63 26 30 78 66 66 29 3b 0a  %03o", c&0xff);.
9240: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
9250: 20 66 70 75 74 63 28 63 2c 20 6f 75 74 29 3b 0a   fputc(c, out);.
9260: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 70 75 74      }.  }.  fput
9270: 63 28 27 22 27 2c 20 6f 75 74 29 3b 0a 7d 0a 0a  c('"', out);.}..
9280: 2f 2a 0a 2a 2a 20 4f 75 74 70 75 74 20 74 68 65  /*.** Output the
9290: 20 67 69 76 65 6e 20 73 74 72 69 6e 67 20 77 69   given string wi
92a0: 74 68 20 63 68 61 72 61 63 74 65 72 73 20 74 68  th characters th
92b0: 61 74 20 61 72 65 20 73 70 65 63 69 61 6c 20 74  at are special t
92c0: 6f 0a 2a 2a 20 48 54 4d 4c 20 65 73 63 61 70 65  o.** HTML escape
92d0: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
92e0: 64 20 6f 75 74 70 75 74 5f 68 74 6d 6c 5f 73 74  d output_html_st
92f0: 72 69 6e 67 28 46 49 4c 45 20 2a 6f 75 74 2c 20  ring(FILE *out, 
9300: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a  const char *z){.
9310: 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 7a    int i;.  if( z
9320: 3d 3d 30 20 29 20 7a 20 3d 20 22 22 3b 0a 20 20  ==0 ) z = "";.  
9330: 77 68 69 6c 65 28 20 2a 7a 20 29 7b 0a 20 20 20  while( *z ){.   
9340: 20 66 6f 72 28 69 3d 30 3b 20 20 20 7a 5b 69 5d   for(i=0;   z[i]
9350: 0a 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20  .            && 
9360: 7a 5b 69 5d 21 3d 27 3c 27 0a 20 20 20 20 20 20  z[i]!='<'.      
9370: 20 20 20 20 20 20 26 26 20 7a 5b 69 5d 21 3d 27        && z[i]!='
9380: 26 27 0a 20 20 20 20 20 20 20 20 20 20 20 20 26  &'.            &
9390: 26 20 7a 5b 69 5d 21 3d 27 3e 27 0a 20 20 20 20  & z[i]!='>'.    
93a0: 20 20 20 20 20 20 20 20 26 26 20 7a 5b 69 5d 21          && z[i]!
93b0: 3d 27 5c 22 27 0a 20 20 20 20 20 20 20 20 20 20  ='\"'.          
93c0: 20 20 26 26 20 7a 5b 69 5d 21 3d 27 5c 27 27 3b    && z[i]!='\'';
93d0: 0a 20 20 20 20 20 20 20 20 69 2b 2b 29 7b 7d 0a  .        i++){}.
93e0: 20 20 20 20 69 66 28 20 69 3e 30 20 29 7b 0a 20      if( i>0 ){. 
93f0: 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
9400: 28 6f 75 74 2c 22 25 2e 2a 73 22 2c 69 2c 7a 29  (out,"%.*s",i,z)
9410: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
9420: 7a 5b 69 5d 3d 3d 27 3c 27 20 29 7b 0a 20 20 20  z[i]=='<' ){.   
9430: 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75     raw_printf(ou
9440: 74 2c 22 26 6c 74 3b 22 29 3b 0a 20 20 20 20 7d  t,"&lt;");.    }
9450: 65 6c 73 65 20 69 66 28 20 7a 5b 69 5d 3d 3d 27  else if( z[i]=='
9460: 26 27 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f  &' ){.      raw_
9470: 70 72 69 6e 74 66 28 6f 75 74 2c 22 26 61 6d 70  printf(out,"&amp
9480: 3b 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  ;");.    }else i
9490: 66 28 20 7a 5b 69 5d 3d 3d 27 3e 27 20 29 7b 0a  f( z[i]=='>' ){.
94a0: 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
94b0: 28 6f 75 74 2c 22 26 67 74 3b 22 29 3b 0a 20 20  (out,"&gt;");.  
94c0: 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 5b 69 5d    }else if( z[i]
94d0: 3d 3d 27 5c 22 27 20 29 7b 0a 20 20 20 20 20 20  =='\"' ){.      
94e0: 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 22  raw_printf(out,"
94f0: 26 71 75 6f 74 3b 22 29 3b 0a 20 20 20 20 7d 65  &quot;");.    }e
9500: 6c 73 65 20 69 66 28 20 7a 5b 69 5d 3d 3d 27 5c  lse if( z[i]=='\
9510: 27 27 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f  '' ){.      raw_
9520: 70 72 69 6e 74 66 28 6f 75 74 2c 22 26 23 33 39  printf(out,"&#39
9530: 3b 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ;");.    }else{.
9540: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
9550: 20 7d 0a 20 20 20 20 7a 20 2b 3d 20 69 20 2b 20   }.    z += i + 
9560: 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  1;.  }.}../*.** 
9570: 49 66 20 61 20 66 69 65 6c 64 20 63 6f 6e 74 61  If a field conta
9580: 69 6e 73 20 61 6e 79 20 63 68 61 72 61 63 74 65  ins any characte
9590: 72 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20  r identified by 
95a0: 61 20 31 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f  a 1 in the follo
95b0: 77 69 6e 67 0a 2a 2a 20 61 72 72 61 79 2c 20 74  wing.** array, t
95c0: 68 65 6e 20 74 68 65 20 73 74 72 69 6e 67 20 6d  hen the string m
95d0: 75 73 74 20 62 65 20 71 75 6f 74 65 64 20 66 6f  ust be quoted fo
95e0: 72 20 43 53 56 2e 0a 2a 2f 0a 73 74 61 74 69 63  r CSV..*/.static
95f0: 20 63 6f 6e 73 74 20 63 68 61 72 20 6e 65 65 64   const char need
9600: 43 73 76 51 75 6f 74 65 5b 5d 20 3d 20 7b 0a 20  CsvQuote[] = {. 
9610: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
9620: 31 2c 20 31 2c 20 31 2c 20 20 20 31 2c 20 31 2c  1, 1, 1,   1, 1,
9630: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
9640: 31 2c 0a 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c  1,.  1, 1, 1, 1,
9650: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 20 20 31   1, 1, 1, 1,   1
9660: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c  , 1, 1, 1, 1, 1,
9670: 20 31 2c 20 31 2c 0a 20 20 31 2c 20 30 2c 20 31   1, 1,.  1, 0, 1
9680: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 31 2c  , 0, 0, 0, 0, 1,
9690: 20 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30     0, 0, 0, 0, 0
96a0: 2c 20 30 2c 20 30 2c 20 30 2c 0a 20 20 30 2c 20  , 0, 0, 0,.  0, 
96b0: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
96c0: 2c 20 30 2c 20 20 20 30 2c 20 30 2c 20 30 2c 20  , 0,   0, 0, 0, 
96d0: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 0a 20  0, 0, 0, 0, 0,. 
96e0: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
96f0: 30 2c 20 30 2c 20 30 2c 20 20 20 30 2c 20 30 2c  0, 0, 0,   0, 0,
9700: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
9710: 30 2c 0a 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c  0,.  0, 0, 0, 0,
9720: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 20 20 30   0, 0, 0, 0,   0
9730: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
9740: 20 30 2c 20 30 2c 0a 20 20 30 2c 20 30 2c 20 30   0, 0,.  0, 0, 0
9750: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
9760: 20 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30     0, 0, 0, 0, 0
9770: 2c 20 30 2c 20 30 2c 20 30 2c 0a 20 20 30 2c 20  , 0, 0, 0,.  0, 
9780: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
9790: 2c 20 30 2c 20 20 20 30 2c 20 30 2c 20 30 2c 20  , 0,   0, 0, 0, 
97a0: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 31 2c 0a 20  0, 0, 0, 0, 1,. 
97b0: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
97c0: 31 2c 20 31 2c 20 31 2c 20 20 20 31 2c 20 31 2c  1, 1, 1,   1, 1,
97d0: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
97e0: 31 2c 0a 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c  1,.  1, 1, 1, 1,
97f0: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 20 20 31   1, 1, 1, 1,   1
9800: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c  , 1, 1, 1, 1, 1,
9810: 20 31 2c 20 31 2c 0a 20 20 31 2c 20 31 2c 20 31   1, 1,.  1, 1, 1
9820: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c  , 1, 1, 1, 1, 1,
9830: 20 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31     1, 1, 1, 1, 1
9840: 2c 20 31 2c 20 31 2c 20 31 2c 0a 20 20 31 2c 20  , 1, 1, 1,.  1, 
9850: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
9860: 2c 20 31 2c 20 20 20 31 2c 20 31 2c 20 31 2c 20  , 1,   1, 1, 1, 
9870: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 0a 20  1, 1, 1, 1, 1,. 
9880: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
9890: 31 2c 20 31 2c 20 31 2c 20 20 20 31 2c 20 31 2c  1, 1, 1,   1, 1,
98a0: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
98b0: 31 2c 0a 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c  1,.  1, 1, 1, 1,
98c0: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 20 20 31   1, 1, 1, 1,   1
98d0: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c  , 1, 1, 1, 1, 1,
98e0: 20 31 2c 20 31 2c 0a 20 20 31 2c 20 31 2c 20 31   1, 1,.  1, 1, 1
98f0: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c  , 1, 1, 1, 1, 1,
9900: 20 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31     1, 1, 1, 1, 1
9910: 2c 20 31 2c 20 31 2c 20 31 2c 0a 20 20 31 2c 20  , 1, 1, 1,.  1, 
9920: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
9930: 2c 20 31 2c 20 20 20 31 2c 20 31 2c 20 31 2c 20  , 1,   1, 1, 1, 
9940: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 0a 7d  1, 1, 1, 1, 1,.}
9950: 3b 0a 0a 2f 2a 0a 2a 2a 20 4f 75 74 70 75 74 20  ;../*.** Output 
9960: 61 20 73 69 6e 67 6c 65 20 74 65 72 6d 20 6f 66  a single term of
9970: 20 43 53 56 2e 20 20 41 63 74 75 61 6c 6c 79 2c   CSV.  Actually,
9980: 20 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72   p->colSeparator
9990: 20 69 73 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20   is used for.** 
99a0: 74 68 65 20 73 65 70 61 72 61 74 6f 72 2c 20 77  the separator, w
99b0: 68 69 63 68 20 6d 61 79 20 6f 72 20 6d 61 79 20  hich may or may 
99c0: 6e 6f 74 20 62 65 20 61 20 63 6f 6d 6d 61 2e 20  not be a comma. 
99d0: 20 70 2d 3e 6e 75 6c 6c 56 61 6c 75 65 20 69 73   p->nullValue is
99e0: 0a 2a 2a 20 74 68 65 20 6e 75 6c 6c 20 76 61 6c  .** the null val
99f0: 75 65 2e 20 20 53 74 72 69 6e 67 73 20 61 72 65  ue.  Strings are
9a00: 20 71 75 6f 74 65 64 20 69 66 20 6e 65 63 65 73   quoted if neces
9a10: 73 61 72 79 2e 20 20 54 68 65 20 73 65 70 61 72  sary.  The separ
9a20: 61 74 6f 72 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20  ator.** is only 
9a30: 69 73 73 75 65 64 20 69 66 20 62 53 65 70 20 69  issued if bSep i
9a40: 73 20 74 72 75 65 2e 0a 2a 2f 0a 73 74 61 74 69  s true..*/.stati
9a50: 63 20 76 6f 69 64 20 6f 75 74 70 75 74 5f 63 73  c void output_cs
9a60: 76 28 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 2c  v(ShellState *p,
9a70: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20   const char *z, 
9a80: 69 6e 74 20 62 53 65 70 29 7b 0a 20 20 46 49 4c  int bSep){.  FIL
9a90: 45 20 2a 6f 75 74 20 3d 20 70 2d 3e 6f 75 74 3b  E *out = p->out;
9aa0: 0a 20 20 69 66 28 20 7a 3d 3d 30 20 29 7b 0a 20  .  if( z==0 ){. 
9ab0: 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 6f     utf8_printf(o
9ac0: 75 74 2c 22 25 73 22 2c 70 2d 3e 6e 75 6c 6c 56  ut,"%s",p->nullV
9ad0: 61 6c 75 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  alue);.  }else{.
9ae0: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69      int i;.    i
9af0: 6e 74 20 6e 53 65 70 20 3d 20 73 74 72 6c 65 6e  nt nSep = strlen
9b00: 33 30 28 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74  30(p->colSeparat
9b10: 6f 72 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  or);.    for(i=0
9b20: 3b 20 7a 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20  ; z[i]; i++){.  
9b30: 20 20 20 20 69 66 28 20 6e 65 65 64 43 73 76 51      if( needCsvQ
9b40: 75 6f 74 65 5b 28 28 75 6e 73 69 67 6e 65 64 20  uote[((unsigned 
9b50: 63 68 61 72 2a 29 7a 29 5b 69 5d 5d 0a 20 20 20  char*)z)[i]].   
9b60: 20 20 20 20 20 20 7c 7c 20 28 7a 5b 69 5d 3d 3d        || (z[i]==
9b70: 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 5b  p->colSeparator[
9b80: 30 5d 20 26 26 0a 20 20 20 20 20 20 20 20 20 20  0] &&.          
9b90: 20 20 20 28 6e 53 65 70 3d 3d 31 20 7c 7c 20 6d     (nSep==1 || m
9ba0: 65 6d 63 6d 70 28 7a 2c 20 70 2d 3e 63 6f 6c 53  emcmp(z, p->colS
9bb0: 65 70 61 72 61 74 6f 72 2c 20 6e 53 65 70 29 3d  eparator, nSep)=
9bc0: 3d 30 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20  =0)) ){.        
9bd0: 69 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 62  i = 0;.        b
9be0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
9bf0: 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3d 3d 30    }.    if( i==0
9c00: 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a   ){.      char *
9c10: 7a 51 75 6f 74 65 64 20 3d 20 73 71 6c 69 74 65  zQuoted = sqlite
9c20: 33 5f 6d 70 72 69 6e 74 66 28 22 5c 22 25 77 5c  3_mprintf("\"%w\
9c30: 22 22 2c 20 7a 29 3b 0a 20 20 20 20 20 20 75 74  "", z);.      ut
9c40: 66 38 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22  f8_printf(out, "
9c50: 25 73 22 2c 20 7a 51 75 6f 74 65 64 29 3b 0a 20  %s", zQuoted);. 
9c60: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
9c70: 65 28 7a 51 75 6f 74 65 64 29 3b 0a 20 20 20 20  e(zQuoted);.    
9c80: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 75 74 66  }else{.      utf
9c90: 38 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25  8_printf(out, "%
9ca0: 73 22 2c 20 7a 29 3b 0a 20 20 20 20 7d 0a 20 20  s", z);.    }.  
9cb0: 7d 0a 20 20 69 66 28 20 62 53 65 70 20 29 7b 0a  }.  if( bSep ){.
9cc0: 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
9cd0: 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20 70 2d  p->out, "%s", p-
9ce0: 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 29 3b 0a  >colSeparator);.
9cf0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69    }.}../*.** Thi
9d00: 73 20 72 6f 75 74 69 6e 65 20 72 75 6e 73 20 77  s routine runs w
9d10: 68 65 6e 20 74 68 65 20 75 73 65 72 20 70 72 65  hen the user pre
9d20: 73 73 65 73 20 43 74 72 6c 2d 43 0a 2a 2f 0a 73  sses Ctrl-C.*/.s
9d30: 74 61 74 69 63 20 76 6f 69 64 20 69 6e 74 65 72  tatic void inter
9d40: 72 75 70 74 5f 68 61 6e 64 6c 65 72 28 69 6e 74  rupt_handler(int
9d50: 20 4e 6f 74 55 73 65 64 29 7b 0a 20 20 55 4e 55   NotUsed){.  UNU
9d60: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f  SED_PARAMETER(No
9d70: 74 55 73 65 64 29 3b 0a 20 20 73 65 65 6e 49 6e  tUsed);.  seenIn
9d80: 74 65 72 72 75 70 74 2b 2b 3b 0a 20 20 69 66 28  terrupt++;.  if(
9d90: 20 73 65 65 6e 49 6e 74 65 72 72 75 70 74 3e 32   seenInterrupt>2
9da0: 20 29 20 65 78 69 74 28 31 29 3b 0a 20 20 69 66   ) exit(1);.  if
9db0: 28 20 67 6c 6f 62 61 6c 44 62 20 29 20 73 71 6c  ( globalDb ) sql
9dc0: 69 74 65 33 5f 69 6e 74 65 72 72 75 70 74 28 67  ite3_interrupt(g
9dd0: 6c 6f 62 61 6c 44 62 29 3b 0a 7d 0a 0a 23 69 66  lobalDb);.}..#if
9de0: 20 28 64 65 66 69 6e 65 64 28 5f 57 49 4e 33 32   (defined(_WIN32
9df0: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 57 49 4e  ) || defined(WIN
9e00: 33 32 29 29 20 26 26 20 21 64 65 66 69 6e 65 64  32)) && !defined
9e10: 28 5f 57 49 4e 33 32 5f 57 43 45 29 0a 2f 2a 0a  (_WIN32_WCE)./*.
9e20: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
9e30: 72 75 6e 73 20 66 6f 72 20 63 6f 6e 73 6f 6c 65  runs for console
9e40: 20 65 76 65 6e 74 73 20 28 65 2e 67 2e 20 43 74   events (e.g. Ct
9e50: 72 6c 2d 43 29 20 6f 6e 20 57 69 6e 33 32 0a 2a  rl-C) on Win32.*
9e60: 2f 0a 73 74 61 74 69 63 20 42 4f 4f 4c 20 57 49  /.static BOOL WI
9e70: 4e 41 50 49 20 43 6f 6e 73 6f 6c 65 43 74 72 6c  NAPI ConsoleCtrl
9e80: 48 61 6e 64 6c 65 72 28 0a 20 20 44 57 4f 52 44  Handler(.  DWORD
9e90: 20 64 77 43 74 72 6c 54 79 70 65 20 2f 2a 20 4f   dwCtrlType /* O
9ea0: 6e 65 20 6f 66 20 74 68 65 20 43 54 52 4c 5f 2a  ne of the CTRL_*
9eb0: 5f 45 56 45 4e 54 20 63 6f 6e 73 74 61 6e 74 73  _EVENT constants
9ec0: 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 64 77 43   */.){.  if( dwC
9ed0: 74 72 6c 54 79 70 65 3d 3d 43 54 52 4c 5f 43 5f  trlType==CTRL_C_
9ee0: 45 56 45 4e 54 20 29 7b 0a 20 20 20 20 69 6e 74  EVENT ){.    int
9ef0: 65 72 72 75 70 74 5f 68 61 6e 64 6c 65 72 28 30  errupt_handler(0
9f00: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 52  );.    return TR
9f10: 55 45 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  UE;.  }.  return
9f20: 20 46 41 4c 53 45 3b 0a 7d 0a 23 65 6e 64 69 66   FALSE;.}.#endif
9f30: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
9f40: 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54  _OMIT_AUTHORIZAT
9f50: 49 4f 4e 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74  ION./*.** When t
9f60: 68 65 20 22 2e 61 75 74 68 20 4f 4e 22 20 69 73  he ".auth ON" is
9f70: 20 73 65 74 2c 20 74 68 65 20 66 6f 6c 6c 6f 77   set, the follow
9f80: 69 6e 67 20 61 75 74 68 6f 72 69 7a 65 72 20 63  ing authorizer c
9f90: 61 6c 6c 62 61 63 6b 20 69 73 0a 2a 2a 20 69 6e  allback is.** in
9fa0: 76 6f 6b 65 64 2e 20 20 49 74 20 61 6c 77 61 79  voked.  It alway
9fb0: 73 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45  s returns SQLITE
9fc0: 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  _OK..*/.static i
9fd0: 6e 74 20 73 68 65 6c 6c 41 75 74 68 28 0a 20 20  nt shellAuth(.  
9fe0: 76 6f 69 64 20 2a 70 43 6c 69 65 6e 74 44 61 74  void *pClientDat
9ff0: 61 2c 0a 20 20 69 6e 74 20 6f 70 2c 0a 20 20 63  a,.  int op,.  c
a000: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 31 2c 0a  onst char *zA1,.
a010: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41    const char *zA
a020: 32 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  2,.  const char 
a030: 2a 7a 41 33 2c 0a 20 20 63 6f 6e 73 74 20 63 68  *zA3,.  const ch
a040: 61 72 20 2a 7a 41 34 0a 29 7b 0a 20 20 53 68 65  ar *zA4.){.  She
a050: 6c 6c 53 74 61 74 65 20 2a 70 20 3d 20 28 53 68  llState *p = (Sh
a060: 65 6c 6c 53 74 61 74 65 2a 29 70 43 6c 69 65 6e  ellState*)pClien
a070: 74 44 61 74 61 3b 0a 20 20 73 74 61 74 69 63 20  tData;.  static 
a080: 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 41 63  const char *azAc
a090: 74 69 6f 6e 5b 5d 20 3d 20 7b 20 30 2c 0a 20 20  tion[] = { 0,.  
a0a0: 20 20 20 22 43 52 45 41 54 45 5f 49 4e 44 45 58     "CREATE_INDEX
a0b0: 22 2c 20 20 20 20 20 20 20 20 20 22 43 52 45 41  ",         "CREA
a0c0: 54 45 5f 54 41 42 4c 45 22 2c 20 20 20 20 20 20  TE_TABLE",      
a0d0: 20 20 20 22 43 52 45 41 54 45 5f 54 45 4d 50 5f     "CREATE_TEMP_
a0e0: 49 4e 44 45 58 22 2c 0a 20 20 20 20 20 22 43 52  INDEX",.     "CR
a0f0: 45 41 54 45 5f 54 45 4d 50 5f 54 41 42 4c 45 22  EATE_TEMP_TABLE"
a100: 2c 20 20 20 20 22 43 52 45 41 54 45 5f 54 45 4d  ,    "CREATE_TEM
a110: 50 5f 54 52 49 47 47 45 52 22 2c 20 20 22 43 52  P_TRIGGER",  "CR
a120: 45 41 54 45 5f 54 45 4d 50 5f 56 49 45 57 22 2c  EATE_TEMP_VIEW",
a130: 0a 20 20 20 20 20 22 43 52 45 41 54 45 5f 54 52  .     "CREATE_TR
a140: 49 47 47 45 52 22 2c 20 20 20 20 20 20 20 22 43  IGGER",       "C
a150: 52 45 41 54 45 5f 56 49 45 57 22 2c 20 20 20 20  REATE_VIEW",    
a160: 20 20 20 20 20 20 22 44 45 4c 45 54 45 22 2c 0a        "DELETE",.
a170: 20 20 20 20 20 22 44 52 4f 50 5f 49 4e 44 45 58       "DROP_INDEX
a180: 22 2c 20 20 20 20 20 20 20 20 20 20 20 22 44 52  ",           "DR
a190: 4f 50 5f 54 41 42 4c 45 22 2c 20 20 20 20 20 20  OP_TABLE",      
a1a0: 20 20 20 20 20 22 44 52 4f 50 5f 54 45 4d 50 5f       "DROP_TEMP_
a1b0: 49 4e 44 45 58 22 2c 0a 20 20 20 20 20 22 44 52  INDEX",.     "DR
a1c0: 4f 50 5f 54 45 4d 50 5f 54 41 42 4c 45 22 2c 20  OP_TEMP_TABLE", 
a1d0: 20 20 20 20 20 22 44 52 4f 50 5f 54 45 4d 50 5f       "DROP_TEMP_
a1e0: 54 52 49 47 47 45 52 22 2c 20 20 20 20 22 44 52  TRIGGER",    "DR
a1f0: 4f 50 5f 54 45 4d 50 5f 56 49 45 57 22 2c 0a 20  OP_TEMP_VIEW",. 
a200: 20 20 20 20 22 44 52 4f 50 5f 54 52 49 47 47 45      "DROP_TRIGGE
a210: 52 22 2c 20 20 20 20 20 20 20 20 20 22 44 52 4f  R",         "DRO
a220: 50 5f 56 49 45 57 22 2c 20 20 20 20 20 20 20 20  P_VIEW",        
a230: 20 20 20 20 22 49 4e 53 45 52 54 22 2c 0a 20 20      "INSERT",.  
a240: 20 20 20 22 50 52 41 47 4d 41 22 2c 20 20 20 20     "PRAGMA",    
a250: 20 20 20 20 20 20 20 20 20 20 20 22 52 45 41 44             "READ
a260: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
a270: 20 20 20 22 53 45 4c 45 43 54 22 2c 0a 20 20 20     "SELECT",.   
a280: 20 20 22 54 52 41 4e 53 41 43 54 49 4f 4e 22 2c    "TRANSACTION",
a290: 20 20 20 20 20 20 20 20 20 20 22 55 50 44 41 54            "UPDAT
a2a0: 45 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  E",             
a2b0: 20 20 22 41 54 54 41 43 48 22 2c 0a 20 20 20 20    "ATTACH",.    
a2c0: 20 22 44 45 54 41 43 48 22 2c 20 20 20 20 20 20   "DETACH",      
a2d0: 20 20 20 20 20 20 20 20 20 22 41 4c 54 45 52 5f           "ALTER_
a2e0: 54 41 42 4c 45 22 2c 20 20 20 20 20 20 20 20 20  TABLE",         
a2f0: 20 22 52 45 49 4e 44 45 58 22 2c 0a 20 20 20 20   "REINDEX",.    
a300: 20 22 41 4e 41 4c 59 5a 45 22 2c 20 20 20 20 20   "ANALYZE",     
a310: 20 20 20 20 20 20 20 20 20 22 43 52 45 41 54 45           "CREATE
a320: 5f 56 54 41 42 4c 45 22 2c 20 20 20 20 20 20 20  _VTABLE",       
a330: 20 22 44 52 4f 50 5f 56 54 41 42 4c 45 22 2c 0a   "DROP_VTABLE",.
a340: 20 20 20 20 20 22 46 55 4e 43 54 49 4f 4e 22 2c       "FUNCTION",
a350: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 53 41               "SA
a360: 56 45 50 4f 49 4e 54 22 2c 20 20 20 20 20 20 20  VEPOINT",       
a370: 20 20 20 20 20 22 52 45 43 55 52 53 49 56 45 22       "RECURSIVE"
a380: 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  .  };.  int i;. 
a390: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 5b   const char *az[
a3a0: 34 5d 3b 0a 20 20 61 7a 5b 30 5d 20 3d 20 7a 41  4];.  az[0] = zA
a3b0: 31 3b 0a 20 20 61 7a 5b 31 5d 20 3d 20 7a 41 32  1;.  az[1] = zA2
a3c0: 3b 0a 20 20 61 7a 5b 32 5d 20 3d 20 7a 41 33 3b  ;.  az[2] = zA3;
a3d0: 0a 20 20 61 7a 5b 33 5d 20 3d 20 7a 41 34 3b 0a  .  az[3] = zA4;.
a3e0: 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d    utf8_printf(p-
a3f0: 3e 6f 75 74 2c 20 22 61 75 74 68 6f 72 69 7a 65  >out, "authorize
a400: 72 3a 20 25 73 22 2c 20 61 7a 41 63 74 69 6f 6e  r: %s", azAction
a410: 5b 6f 70 5d 29 3b 0a 20 20 66 6f 72 28 69 3d 30  [op]);.  for(i=0
a420: 3b 20 69 3c 34 3b 20 69 2b 2b 29 7b 0a 20 20 20  ; i<4; i++){.   
a430: 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f   raw_printf(p->o
a440: 75 74 2c 20 22 20 22 29 3b 0a 20 20 20 20 69 66  ut, " ");.    if
a450: 28 20 61 7a 5b 69 5d 20 29 7b 0a 20 20 20 20 20  ( az[i] ){.     
a460: 20 6f 75 74 70 75 74 5f 63 5f 73 74 72 69 6e 67   output_c_string
a470: 28 70 2d 3e 6f 75 74 2c 20 61 7a 5b 69 5d 29 3b  (p->out, az[i]);
a480: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
a490: 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e    raw_printf(p->
a4a0: 6f 75 74 2c 20 22 4e 55 4c 4c 22 29 3b 0a 20 20  out, "NULL");.  
a4b0: 20 20 7d 0a 20 20 7d 0a 20 20 72 61 77 5f 70 72    }.  }.  raw_pr
a4c0: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 5c 6e  intf(p->out, "\n
a4d0: 22 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  ");.  return SQL
a4e0: 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  ITE_OK;.}.#endif
a4f0: 0a 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 20  ../*.** Print a 
a500: 73 63 68 65 6d 61 20 73 74 61 74 65 6d 65 6e 74  schema statement
a510: 2e 20 20 50 61 72 74 20 6f 66 20 4d 4f 44 45 5f  .  Part of MODE_
a520: 53 65 6d 69 20 61 6e 64 20 4d 4f 44 45 5f 50 72  Semi and MODE_Pr
a530: 65 74 74 79 20 6f 75 74 70 75 74 2e 0a 2a 2a 0a  etty output..**.
a540: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
a550: 63 6f 6e 76 65 72 74 73 20 73 6f 6d 65 20 43 52  converts some CR
a560: 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
a570: 6d 65 6e 74 73 20 66 6f 72 20 73 68 61 64 6f 77  ments for shadow
a580: 20 74 61 62 6c 65 73 0a 2a 2a 20 69 6e 20 46 54   tables.** in FT
a590: 53 33 2f 34 2f 35 20 69 6e 74 6f 20 43 52 45 41  S3/4/5 into CREA
a5a0: 54 45 20 54 41 42 4c 45 20 49 46 20 4e 4f 54 20  TE TABLE IF NOT 
a5b0: 45 58 49 53 54 53 20 73 74 61 74 65 6d 65 6e 74  EXISTS statement
a5c0: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
a5d0: 64 20 70 72 69 6e 74 53 63 68 65 6d 61 4c 69 6e  d printSchemaLin
a5e0: 65 28 46 49 4c 45 20 2a 6f 75 74 2c 20 63 6f 6e  e(FILE *out, con
a5f0: 73 74 20 63 68 61 72 20 2a 7a 2c 20 63 6f 6e 73  st char *z, cons
a600: 74 20 63 68 61 72 20 2a 7a 54 61 69 6c 29 7b 0a  t char *zTail){.
a610: 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74    if( sqlite3_st
a620: 72 67 6c 6f 62 28 22 43 52 45 41 54 45 20 54 41  rglob("CREATE TA
a630: 42 4c 45 20 5b 27 5c 22 5d 2a 22 2c 20 7a 29 3d  BLE ['\"]*", z)=
a640: 3d 30 20 29 7b 0a 20 20 20 20 75 74 66 38 5f 70  =0 ){.    utf8_p
a650: 72 69 6e 74 66 28 6f 75 74 2c 20 22 43 52 45 41  rintf(out, "CREA
a660: 54 45 20 54 41 42 4c 45 20 49 46 20 4e 4f 54 20  TE TABLE IF NOT 
a670: 45 58 49 53 54 53 20 25 73 25 73 22 2c 20 7a 2b  EXISTS %s%s", z+
a680: 31 33 2c 20 7a 54 61 69 6c 29 3b 0a 20 20 7d 65  13, zTail);.  }e
a690: 6c 73 65 7b 0a 20 20 20 20 75 74 66 38 5f 70 72  lse{.    utf8_pr
a6a0: 69 6e 74 66 28 6f 75 74 2c 20 22 25 73 25 73 22  intf(out, "%s%s"
a6b0: 2c 20 7a 2c 20 7a 54 61 69 6c 29 3b 0a 20 20 7d  , z, zTail);.  }
a6c0: 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  .}.static void p
a6d0: 72 69 6e 74 53 63 68 65 6d 61 4c 69 6e 65 4e 28  rintSchemaLineN(
a6e0: 46 49 4c 45 20 2a 6f 75 74 2c 20 63 68 61 72 20  FILE *out, char 
a6f0: 2a 7a 2c 20 69 6e 74 20 6e 2c 20 63 6f 6e 73 74  *z, int n, const
a700: 20 63 68 61 72 20 2a 7a 54 61 69 6c 29 7b 0a 20   char *zTail){. 
a710: 20 63 68 61 72 20 63 20 3d 20 7a 5b 6e 5d 3b 0a   char c = z[n];.
a720: 20 20 7a 5b 6e 5d 20 3d 20 30 3b 0a 20 20 70 72    z[n] = 0;.  pr
a730: 69 6e 74 53 63 68 65 6d 61 4c 69 6e 65 28 6f 75  intSchemaLine(ou
a740: 74 2c 20 7a 2c 20 7a 54 61 69 6c 29 3b 0a 20 20  t, z, zTail);.  
a750: 7a 5b 6e 5d 20 3d 20 63 3b 0a 7d 0a 0a 2f 2a 0a  z[n] = c;.}../*.
a760: 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  ** Return true i
a770: 66 20 73 74 72 69 6e 67 20 7a 5b 5d 20 68 61 73  f string z[] has
a780: 20 6e 6f 74 68 69 6e 67 20 62 75 74 20 77 68 69   nothing but whi
a790: 74 65 73 70 61 63 65 20 61 6e 64 20 63 6f 6d 6d  tespace and comm
a7a0: 65 6e 74 73 20 74 6f 20 74 68 65 0a 2a 2a 20 65  ents to the.** e
a7b0: 6e 64 20 6f 66 20 74 68 65 20 66 69 72 73 74 20  nd of the first 
a7c0: 6c 69 6e 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  line..*/.static 
a7d0: 69 6e 74 20 77 73 54 6f 45 6f 6c 28 63 6f 6e 73  int wsToEol(cons
a7e0: 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69 6e  t char *z){.  in
a7f0: 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  t i;.  for(i=0; 
a800: 7a 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  z[i]; i++){.    
a810: 69 66 28 20 7a 5b 69 5d 3d 3d 27 5c 6e 27 20 29  if( z[i]=='\n' )
a820: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 69   return 1;.    i
a830: 66 28 20 49 73 53 70 61 63 65 28 7a 5b 69 5d 29  f( IsSpace(z[i])
a840: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
a850: 20 69 66 28 20 7a 5b 69 5d 3d 3d 27 2d 27 20 26   if( z[i]=='-' &
a860: 26 20 7a 5b 69 2b 31 5d 3d 3d 27 2d 27 20 29 20  & z[i+1]=='-' ) 
a870: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 72 65  return 1;.    re
a880: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65  turn 0;.  }.  re
a890: 74 75 72 6e 20 31 3b 0a 7d 0a 20 20 20 20 0a 0a  turn 1;.}.    ..
a8a0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68  /*.** This is th
a8b0: 65 20 63 61 6c 6c 62 61 63 6b 20 72 6f 75 74 69  e callback routi
a8c0: 6e 65 20 74 68 61 74 20 74 68 65 20 73 68 65 6c  ne that the shel
a8d0: 6c 0a 2a 2a 20 69 6e 76 6f 6b 65 73 20 66 6f 72  l.** invokes for
a8e0: 20 65 61 63 68 20 72 6f 77 20 6f 66 20 61 20 71   each row of a q
a8f0: 75 65 72 79 20 72 65 73 75 6c 74 2e 0a 2a 2f 0a  uery result..*/.
a900: 73 74 61 74 69 63 20 69 6e 74 20 73 68 65 6c 6c  static int shell
a910: 5f 63 61 6c 6c 62 61 63 6b 28 0a 20 20 76 6f 69  _callback(.  voi
a920: 64 20 2a 70 41 72 67 2c 0a 20 20 69 6e 74 20 6e  d *pArg,.  int n
a930: 41 72 67 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e  Arg,        /* N
a940: 75 6d 62 65 72 20 6f 66 20 72 65 73 75 6c 74 20  umber of result 
a950: 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 63 68 61  columns */.  cha
a960: 72 20 2a 2a 61 7a 41 72 67 2c 20 20 20 20 2f 2a  r **azArg,    /*
a970: 20 54 65 78 74 20 6f 66 20 65 61 63 68 20 72 65   Text of each re
a980: 73 75 6c 74 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20  sult column */. 
a990: 20 63 68 61 72 20 2a 2a 61 7a 43 6f 6c 2c 20 20   char **azCol,  
a9a0: 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 61 6d 65    /* Column name
a9b0: 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 69 54 79  s */.  int *aiTy
a9c0: 70 65 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d  pe      /* Colum
a9d0: 6e 20 74 79 70 65 73 20 2a 2f 0a 29 7b 0a 20 20  n types */.){.  
a9e0: 69 6e 74 20 69 3b 0a 20 20 53 68 65 6c 6c 53 74  int i;.  ShellSt
a9f0: 61 74 65 20 2a 70 20 3d 20 28 53 68 65 6c 6c 53  ate *p = (ShellS
aa00: 74 61 74 65 2a 29 70 41 72 67 3b 0a 0a 20 20 69  tate*)pArg;..  i
aa10: 66 28 20 61 7a 41 72 67 3d 3d 30 20 29 20 72 65  f( azArg==0 ) re
aa20: 74 75 72 6e 20 30 3b 0a 20 20 73 77 69 74 63 68  turn 0;.  switch
aa30: 28 20 70 2d 3e 63 4d 6f 64 65 20 29 7b 0a 20 20  ( p->cMode ){.  
aa40: 20 20 63 61 73 65 20 4d 4f 44 45 5f 4c 69 6e 65    case MODE_Line
aa50: 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 77 20  : {.      int w 
aa60: 3d 20 35 3b 0a 20 20 20 20 20 20 69 66 28 20 61  = 5;.      if( a
aa70: 7a 41 72 67 3d 3d 30 20 29 20 62 72 65 61 6b 3b  zArg==0 ) break;
aa80: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
aa90: 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20  i<nArg; i++){.  
aaa0: 20 20 20 20 20 20 69 6e 74 20 6c 65 6e 20 3d 20        int len = 
aab0: 73 74 72 6c 65 6e 33 30 28 61 7a 43 6f 6c 5b 69  strlen30(azCol[i
aac0: 5d 20 3f 20 61 7a 43 6f 6c 5b 69 5d 20 3a 20 22  ] ? azCol[i] : "
aad0: 22 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ");.        if( 
aae0: 6c 65 6e 3e 77 20 29 20 77 20 3d 20 6c 65 6e 3b  len>w ) w = len;
aaf0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
ab00: 66 28 20 70 2d 3e 63 6e 74 2b 2b 3e 30 20 29 20  f( p->cnt++>0 ) 
ab10: 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f  utf8_printf(p->o
ab20: 75 74 2c 20 22 25 73 22 2c 20 70 2d 3e 72 6f 77  ut, "%s", p->row
ab30: 53 65 70 61 72 61 74 6f 72 29 3b 0a 20 20 20 20  Separator);.    
ab40: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72    for(i=0; i<nAr
ab50: 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  g; i++){.       
ab60: 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e   utf8_printf(p->
ab70: 6f 75 74 2c 22 25 2a 73 20 3d 20 25 73 25 73 22  out,"%*s = %s%s"
ab80: 2c 20 77 2c 20 61 7a 43 6f 6c 5b 69 5d 2c 0a 20  , w, azCol[i],. 
ab90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
aba0: 7a 41 72 67 5b 69 5d 20 3f 20 61 7a 41 72 67 5b  zArg[i] ? azArg[
abb0: 69 5d 20 3a 20 70 2d 3e 6e 75 6c 6c 56 61 6c 75  i] : p->nullValu
abc0: 65 2c 20 70 2d 3e 72 6f 77 53 65 70 61 72 61 74  e, p->rowSeparat
abd0: 6f 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  or);.      }.   
abe0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
abf0: 20 20 20 20 63 61 73 65 20 4d 4f 44 45 5f 45 78      case MODE_Ex
ac00: 70 6c 61 69 6e 3a 0a 20 20 20 20 63 61 73 65 20  plain:.    case 
ac10: 4d 4f 44 45 5f 43 6f 6c 75 6d 6e 3a 20 7b 0a 20  MODE_Column: {. 
ac20: 20 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73       static cons
ac30: 74 20 69 6e 74 20 61 45 78 70 6c 61 69 6e 57 69  t int aExplainWi
ac40: 64 74 68 73 5b 5d 20 3d 20 7b 34 2c 20 31 33 2c  dths[] = {4, 13,
ac50: 20 34 2c 20 34 2c 20 34 2c 20 31 33 2c 20 32 2c   4, 4, 4, 13, 2,
ac60: 20 31 33 7d 3b 0a 20 20 20 20 20 20 63 6f 6e 73   13};.      cons
ac70: 74 20 69 6e 74 20 2a 63 6f 6c 57 69 64 74 68 3b  t int *colWidth;
ac80: 0a 20 20 20 20 20 20 69 6e 74 20 73 68 6f 77 48  .      int showH
ac90: 64 72 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a  dr;.      char *
aca0: 72 6f 77 53 65 70 3b 0a 20 20 20 20 20 20 69 66  rowSep;.      if
acb0: 28 20 70 2d 3e 63 4d 6f 64 65 3d 3d 4d 4f 44 45  ( p->cMode==MODE
acc0: 5f 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20  _Column ){.     
acd0: 20 20 20 63 6f 6c 57 69 64 74 68 20 3d 20 70 2d     colWidth = p-
ace0: 3e 63 6f 6c 57 69 64 74 68 3b 0a 20 20 20 20 20  >colWidth;.     
acf0: 20 20 20 73 68 6f 77 48 64 72 20 3d 20 70 2d 3e     showHdr = p->
ad00: 73 68 6f 77 48 65 61 64 65 72 3b 0a 20 20 20 20  showHeader;.    
ad10: 20 20 20 20 72 6f 77 53 65 70 20 3d 20 70 2d 3e      rowSep = p->
ad20: 72 6f 77 53 65 70 61 72 61 74 6f 72 3b 0a 20 20  rowSeparator;.  
ad30: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
ad40: 20 20 20 63 6f 6c 57 69 64 74 68 20 3d 20 61 45     colWidth = aE
ad50: 78 70 6c 61 69 6e 57 69 64 74 68 73 3b 0a 20 20  xplainWidths;.  
ad60: 20 20 20 20 20 20 73 68 6f 77 48 64 72 20 3d 20        showHdr = 
ad70: 31 3b 0a 20 20 20 20 20 20 20 20 72 6f 77 53 65  1;.        rowSe
ad80: 70 20 3d 20 53 45 50 5f 52 6f 77 3b 0a 20 20 20  p = SEP_Row;.   
ad90: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
ada0: 2d 3e 63 6e 74 2b 2b 3d 3d 30 20 29 7b 0a 20 20  ->cnt++==0 ){.  
adb0: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
adc0: 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nArg; i++){.   
add0: 20 20 20 20 20 20 20 69 6e 74 20 77 2c 20 6e 3b         int w, n;
ade0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69  .          if( i
adf0: 3c 41 72 72 61 79 53 69 7a 65 28 70 2d 3e 63 6f  <ArraySize(p->co
ae00: 6c 57 69 64 74 68 29 20 29 7b 0a 20 20 20 20 20  lWidth) ){.     
ae10: 20 20 20 20 20 20 20 77 20 3d 20 63 6f 6c 57 69         w = colWi
ae20: 64 74 68 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20  dth[i];.        
ae30: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
ae40: 20 20 20 20 20 77 20 3d 20 30 3b 0a 20 20 20 20       w = 0;.    
ae50: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
ae60: 20 20 69 66 28 20 77 3d 3d 30 20 29 7b 0a 20 20    if( w==0 ){.  
ae70: 20 20 20 20 20 20 20 20 20 20 77 20 3d 20 73 74            w = st
ae80: 72 6c 65 6e 43 68 61 72 28 61 7a 43 6f 6c 5b 69  rlenChar(azCol[i
ae90: 5d 20 3f 20 61 7a 43 6f 6c 5b 69 5d 20 3a 20 22  ] ? azCol[i] : "
aea0: 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ");.            
aeb0: 69 66 28 20 77 3c 31 30 20 29 20 77 20 3d 20 31  if( w<10 ) w = 1
aec0: 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e  0;.            n
aed0: 20 3d 20 73 74 72 6c 65 6e 43 68 61 72 28 61 7a   = strlenChar(az
aee0: 41 72 67 20 26 26 20 61 7a 41 72 67 5b 69 5d 20  Arg && azArg[i] 
aef0: 3f 20 61 7a 41 72 67 5b 69 5d 20 3a 20 70 2d 3e  ? azArg[i] : p->
af00: 6e 75 6c 6c 56 61 6c 75 65 29 3b 0a 20 20 20 20  nullValue);.    
af10: 20 20 20 20 20 20 20 20 69 66 28 20 77 3c 6e 20          if( w<n 
af20: 29 20 77 20 3d 20 6e 3b 0a 20 20 20 20 20 20 20  ) w = n;.       
af30: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69     }.          i
af40: 66 28 20 69 3c 41 72 72 61 79 53 69 7a 65 28 70  f( i<ArraySize(p
af50: 2d 3e 61 63 74 75 61 6c 57 69 64 74 68 29 20 29  ->actualWidth) )
af60: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 2d  {.            p-
af70: 3e 61 63 74 75 61 6c 57 69 64 74 68 5b 69 5d 20  >actualWidth[i] 
af80: 3d 20 77 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  = w;.          }
af90: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73  .          if( s
afa0: 68 6f 77 48 64 72 20 29 7b 0a 20 20 20 20 20 20  howHdr ){.      
afb0: 20 20 20 20 20 20 75 74 66 38 5f 77 69 64 74 68        utf8_width
afc0: 5f 70 72 69 6e 74 28 70 2d 3e 6f 75 74 2c 20 77  _print(p->out, w
afd0: 2c 20 61 7a 43 6f 6c 5b 69 5d 29 3b 0a 20 20 20  , azCol[i]);.   
afe0: 20 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72           utf8_pr
aff0: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73  intf(p->out, "%s
b000: 22 2c 20 69 3d 3d 6e 41 72 67 2d 31 20 3f 20 72  ", i==nArg-1 ? r
b010: 6f 77 53 65 70 20 3a 20 22 20 20 22 29 3b 0a 20  owSep : "  ");. 
b020: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
b030: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
b040: 20 73 68 6f 77 48 64 72 20 29 7b 0a 20 20 20 20   showHdr ){.    
b050: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
b060: 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nArg; i++){.   
b070: 20 20 20 20 20 20 20 20 20 69 6e 74 20 77 3b 0a           int w;.
b080: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
b090: 69 3c 41 72 72 61 79 53 69 7a 65 28 70 2d 3e 61  i<ArraySize(p->a
b0a0: 63 74 75 61 6c 57 69 64 74 68 29 20 29 7b 0a 20  ctualWidth) ){. 
b0b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77 20                w 
b0c0: 3d 20 70 2d 3e 61 63 74 75 61 6c 57 69 64 74 68  = p->actualWidth
b0d0: 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20  [i];.           
b0e0: 20 20 20 20 69 66 28 20 77 3c 30 20 29 20 77 20      if( w<0 ) w 
b0f0: 3d 20 2d 77 3b 0a 20 20 20 20 20 20 20 20 20 20  = -w;.          
b100: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
b110: 20 20 20 20 20 20 20 20 77 20 3d 20 31 30 3b 0a          w = 10;.
b120: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
b130: 20 20 20 20 20 20 20 20 20 20 75 74 66 38 5f 70            utf8_p
b140: 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 25 2d  rintf(p->out,"%-
b150: 2a 2e 2a 73 25 73 22 2c 77 2c 77 2c 0a 20 20 20  *.*s%s",w,w,.   
b160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b170: 22 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  "---------------
b180: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b190: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b1a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 22 0a 20 20 20  -----------".   
b1b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b1c0: 22 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  "---------------
b1d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b1e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b1f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 22 2c 0a 20 20  -----------",.  
b200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b210: 20 20 69 3d 3d 6e 41 72 67 2d 31 20 3f 20 72 6f    i==nArg-1 ? ro
b220: 77 53 65 70 20 3a 20 22 20 20 22 29 3b 0a 20 20  wSep : "  ");.  
b230: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
b240: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
b250: 20 20 69 66 28 20 61 7a 41 72 67 3d 3d 30 20 29    if( azArg==0 )
b260: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 66 6f   break;.      fo
b270: 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69  r(i=0; i<nArg; i
b280: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  ++){.        int
b290: 20 77 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   w;.        if( 
b2a0: 69 3c 41 72 72 61 79 53 69 7a 65 28 70 2d 3e 61  i<ArraySize(p->a
b2b0: 63 74 75 61 6c 57 69 64 74 68 29 20 29 7b 0a 20  ctualWidth) ){. 
b2c0: 20 20 20 20 20 20 20 20 20 20 77 20 3d 20 70 2d            w = p-
b2d0: 3e 61 63 74 75 61 6c 57 69 64 74 68 5b 69 5d 3b  >actualWidth[i];
b2e0: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
b2f0: 20 20 20 20 20 20 20 20 20 20 20 77 20 3d 20 31             w = 1
b300: 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  0;.        }.   
b310: 20 20 20 20 20 69 66 28 20 70 2d 3e 63 4d 6f 64       if( p->cMod
b320: 65 3d 3d 4d 4f 44 45 5f 45 78 70 6c 61 69 6e 20  e==MODE_Explain 
b330: 26 26 20 61 7a 41 72 67 5b 69 5d 20 26 26 20 73  && azArg[i] && s
b340: 74 72 6c 65 6e 43 68 61 72 28 61 7a 41 72 67 5b  trlenChar(azArg[
b350: 69 5d 29 3e 77 20 29 7b 0a 20 20 20 20 20 20 20  i])>w ){.       
b360: 20 20 20 77 20 3d 20 73 74 72 6c 65 6e 43 68 61     w = strlenCha
b370: 72 28 61 7a 41 72 67 5b 69 5d 29 3b 0a 20 20 20  r(azArg[i]);.   
b380: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
b390: 66 28 20 69 3d 3d 31 20 26 26 20 70 2d 3e 61 69  f( i==1 && p->ai
b3a0: 49 6e 64 65 6e 74 20 26 26 20 70 2d 3e 70 53 74  Indent && p->pSt
b3b0: 6d 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  mt ){.          
b3c0: 69 66 28 20 70 2d 3e 69 49 6e 64 65 6e 74 3c 70  if( p->iIndent<p
b3d0: 2d 3e 6e 49 6e 64 65 6e 74 20 29 7b 0a 20 20 20  ->nIndent ){.   
b3e0: 20 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72           utf8_pr
b3f0: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 2a  intf(p->out, "%*
b400: 2e 73 22 2c 20 70 2d 3e 61 69 49 6e 64 65 6e 74  .s", p->aiIndent
b410: 5b 70 2d 3e 69 49 6e 64 65 6e 74 5d 2c 20 22 22  [p->iIndent], ""
b420: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
b430: 20 20 20 20 20 20 20 20 20 70 2d 3e 69 49 6e 64           p->iInd
b440: 65 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d  ent++;.        }
b450: 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 77 69  .        utf8_wi
b460: 64 74 68 5f 70 72 69 6e 74 28 70 2d 3e 6f 75 74  dth_print(p->out
b470: 2c 20 77 2c 20 61 7a 41 72 67 5b 69 5d 20 3f 20  , w, azArg[i] ? 
b480: 61 7a 41 72 67 5b 69 5d 20 3a 20 70 2d 3e 6e 75  azArg[i] : p->nu
b490: 6c 6c 56 61 6c 75 65 29 3b 0a 20 20 20 20 20 20  llValue);.      
b4a0: 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d    utf8_printf(p-
b4b0: 3e 6f 75 74 2c 20 22 25 73 22 2c 20 69 3d 3d 6e  >out, "%s", i==n
b4c0: 41 72 67 2d 31 20 3f 20 72 6f 77 53 65 70 20 3a  Arg-1 ? rowSep :
b4d0: 20 22 20 20 22 29 3b 0a 20 20 20 20 20 20 7d 0a   "  ");.      }.
b4e0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
b4f0: 20 7d 0a 20 20 20 20 63 61 73 65 20 4d 4f 44 45   }.    case MODE
b500: 5f 53 65 6d 69 3a 20 7b 20 20 20 2f 2a 20 2e 73  _Semi: {   /* .s
b510: 63 68 65 6d 61 20 61 6e 64 20 2e 66 75 6c 6c 73  chema and .fulls
b520: 63 68 65 6d 61 20 6f 75 74 70 75 74 20 2a 2f 0a  chema output */.
b530: 20 20 20 20 20 20 70 72 69 6e 74 53 63 68 65 6d        printSchem
b540: 61 4c 69 6e 65 28 70 2d 3e 6f 75 74 2c 20 61 7a  aLine(p->out, az
b550: 41 72 67 5b 30 5d 2c 20 22 3b 5c 6e 22 29 3b 0a  Arg[0], ";\n");.
b560: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
b570: 20 7d 0a 20 20 20 20 63 61 73 65 20 4d 4f 44 45   }.    case MODE
b580: 5f 50 72 65 74 74 79 3a 20 7b 20 20 2f 2a 20 2e  _Pretty: {  /* .
b590: 73 63 68 65 6d 61 20 61 6e 64 20 2e 66 75 6c 6c  schema and .full
b5a0: 73 63 68 65 6d 61 20 77 69 74 68 20 2d 2d 69 6e  schema with --in
b5b0: 64 65 6e 74 20 2a 2f 0a 20 20 20 20 20 20 63 68  dent */.      ch
b5c0: 61 72 20 2a 7a 3b 0a 20 20 20 20 20 20 69 6e 74  ar *z;.      int
b5d0: 20 6a 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 50   j;.      int nP
b5e0: 61 72 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20  aren = 0;.      
b5f0: 63 68 61 72 20 63 45 6e 64 20 3d 20 30 3b 0a 20  char cEnd = 0;. 
b600: 20 20 20 20 20 63 68 61 72 20 63 3b 0a 20 20 20       char c;.   
b610: 20 20 20 69 6e 74 20 6e 4c 69 6e 65 20 3d 20 30     int nLine = 0
b620: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
b630: 6e 41 72 67 3d 3d 31 20 29 3b 0a 20 20 20 20 20  nArg==1 );.     
b640: 20 69 66 28 20 61 7a 41 72 67 5b 30 5d 3d 3d 30   if( azArg[0]==0
b650: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
b660: 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72 6c  if( sqlite3_strl
b670: 69 6b 65 28 22 43 52 45 41 54 45 20 56 49 45 57  ike("CREATE VIEW
b680: 25 22 2c 20 61 7a 41 72 67 5b 30 5d 2c 20 30 29  %", azArg[0], 0)
b690: 3d 3d 30 0a 20 20 20 20 20 20 20 7c 7c 20 73 71  ==0.       || sq
b6a0: 6c 69 74 65 33 5f 73 74 72 6c 69 6b 65 28 22 43  lite3_strlike("C
b6b0: 52 45 41 54 45 20 54 52 49 47 25 22 2c 20 61 7a  REATE TRIG%", az
b6c0: 41 72 67 5b 30 5d 2c 20 30 29 3d 3d 30 0a 20 20  Arg[0], 0)==0.  
b6d0: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 75      ){.        u
b6e0: 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  tf8_printf(p->ou
b6f0: 74 2c 20 22 25 73 3b 5c 6e 22 2c 20 61 7a 41 72  t, "%s;\n", azAr
b700: 67 5b 30 5d 29 3b 0a 20 20 20 20 20 20 20 20 62  g[0]);.        b
b710: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
b720: 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f      z = sqlite3_
b730: 6d 70 72 69 6e 74 66 28 22 25 73 22 2c 20 61 7a  mprintf("%s", az
b740: 41 72 67 5b 30 5d 29 3b 0a 20 20 20 20 20 20 6a  Arg[0]);.      j
b750: 20 3d 20 30 3b 0a 20 20 20 20 20 20 66 6f 72 28   = 0;.      for(
b760: 69 3d 30 3b 20 49 73 53 70 61 63 65 28 7a 5b 69  i=0; IsSpace(z[i
b770: 5d 29 3b 20 69 2b 2b 29 7b 7d 0a 20 20 20 20 20  ]); i++){}.     
b780: 20 66 6f 72 28 3b 20 28 63 20 3d 20 7a 5b 69 5d   for(; (c = z[i]
b790: 29 21 3d 30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  )!=0; i++){.    
b7a0: 20 20 20 20 69 66 28 20 49 73 53 70 61 63 65 28      if( IsSpace(
b7b0: 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  c) ){.          
b7c0: 69 66 28 20 7a 5b 6a 2d 31 5d 3d 3d 27 5c 72 27  if( z[j-1]=='\r'
b7d0: 20 29 20 7a 5b 6a 2d 31 5d 20 3d 20 27 5c 6e 27   ) z[j-1] = '\n'
b7e0: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
b7f0: 49 73 53 70 61 63 65 28 7a 5b 6a 2d 31 5d 29 20  IsSpace(z[j-1]) 
b800: 7c 7c 20 7a 5b 6a 2d 31 5d 3d 3d 27 28 27 20 29  || z[j-1]=='(' )
b810: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
b820: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 63 3d     }else if( (c=
b830: 3d 27 28 27 20 7c 7c 20 63 3d 3d 27 29 27 29 20  ='(' || c==')') 
b840: 26 26 20 6a 3e 30 20 26 26 20 49 73 53 70 61 63  && j>0 && IsSpac
b850: 65 28 7a 5b 6a 2d 31 5d 29 20 29 7b 0a 20 20 20  e(z[j-1]) ){.   
b860: 20 20 20 20 20 20 20 6a 2d 2d 3b 0a 20 20 20 20         j--;.    
b870: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7a 5b      }.        z[
b880: 6a 2b 2b 5d 20 3d 20 63 3b 0a 20 20 20 20 20 20  j++] = c;.      
b890: 7d 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 6a  }.      while( j
b8a0: 3e 30 20 26 26 20 49 73 53 70 61 63 65 28 7a 5b  >0 && IsSpace(z[
b8b0: 6a 2d 31 5d 29 20 29 7b 20 6a 2d 2d 3b 20 7d 0a  j-1]) ){ j--; }.
b8c0: 20 20 20 20 20 20 7a 5b 6a 5d 20 3d 20 30 3b 0a        z[j] = 0;.
b8d0: 20 20 20 20 20 20 69 66 28 20 73 74 72 6c 65 6e        if( strlen
b8e0: 33 30 28 7a 29 3e 3d 37 39 20 29 7b 0a 20 20 20  30(z)>=79 ){.   
b8f0: 20 20 20 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20       for(i=j=0; 
b900: 28 63 20 3d 20 7a 5b 69 5d 29 21 3d 30 3b 20 69  (c = z[i])!=0; i
b910: 2b 2b 29 7b 20 20 2f 2a 20 43 6f 70 79 20 63 68  ++){  /* Copy ch
b920: 61 6e 67 65 73 20 66 72 6f 6d 20 7a 5b 69 5d 20  anges from z[i] 
b930: 62 61 63 6b 20 74 6f 20 7a 5b 6a 5d 20 2a 2f 0a  back to z[j] */.
b940: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 63 3d            if( c=
b950: 3d 63 45 6e 64 20 29 7b 0a 20 20 20 20 20 20 20  =cEnd ){.       
b960: 20 20 20 20 20 63 45 6e 64 20 3d 20 30 3b 0a 20       cEnd = 0;. 
b970: 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69           }else i
b980: 66 28 20 63 3d 3d 27 22 27 20 7c 7c 20 63 3d 3d  f( c=='"' || c==
b990: 27 5c 27 27 20 7c 7c 20 63 3d 3d 27 60 27 20 29  '\'' || c=='`' )
b9a0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 45  {.            cE
b9b0: 6e 64 20 3d 20 63 3b 0a 20 20 20 20 20 20 20 20  nd = c;.        
b9c0: 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27    }else if( c=='
b9d0: 5b 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  [' ){.          
b9e0: 20 20 63 45 6e 64 20 3d 20 27 5d 27 3b 0a 20 20    cEnd = ']';.  
b9f0: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
ba00: 28 20 63 3d 3d 27 2d 27 20 26 26 20 7a 5b 69 2b  ( c=='-' && z[i+
ba10: 31 5d 3d 3d 27 2d 27 20 29 7b 0a 20 20 20 20 20  1]=='-' ){.     
ba20: 20 20 20 20 20 20 20 63 45 6e 64 20 3d 20 27 5c         cEnd = '\
ba30: 6e 27 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  n';.          }e
ba40: 6c 73 65 20 69 66 28 20 63 3d 3d 27 28 27 20 29  lse if( c=='(' )
ba50: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e 50  {.            nP
ba60: 61 72 65 6e 2b 2b 3b 0a 20 20 20 20 20 20 20 20  aren++;.        
ba70: 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27    }else if( c=='
ba80: 29 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  )' ){.          
ba90: 20 20 6e 50 61 72 65 6e 2d 2d 3b 0a 20 20 20 20    nParen--;.    
baa0: 20 20 20 20 20 20 20 20 69 66 28 20 6e 4c 69 6e          if( nLin
bab0: 65 3e 30 20 26 26 20 6e 50 61 72 65 6e 3d 3d 30  e>0 && nParen==0
bac0: 20 26 26 20 6a 3e 30 20 29 7b 0a 20 20 20 20 20   && j>0 ){.     
bad0: 20 20 20 20 20 20 20 20 20 70 72 69 6e 74 53 63           printSc
bae0: 68 65 6d 61 4c 69 6e 65 4e 28 70 2d 3e 6f 75 74  hemaLineN(p->out
baf0: 2c 20 7a 2c 20 6a 2c 20 22 5c 6e 22 29 3b 0a 20  , z, j, "\n");. 
bb00: 20 20 20 20 20 20 20 20 20 20 20 20 20 6a 20 3d               j =
bb10: 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   0;.            
bb20: 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  }.          }.  
bb30: 20 20 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d          z[j++] =
bb40: 20 63 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66   c;.          if
bb50: 28 20 6e 50 61 72 65 6e 3d 3d 31 20 26 26 20 63  ( nParen==1 && c
bb60: 45 6e 64 3d 3d 30 0a 20 20 20 20 20 20 20 20 20  End==0.         
bb70: 20 20 26 26 20 28 63 3d 3d 27 28 27 20 7c 7c 20    && (c=='(' || 
bb80: 63 3d 3d 27 5c 6e 27 20 7c 7c 20 28 63 3d 3d 27  c=='\n' || (c=='
bb90: 2c 27 20 26 26 20 21 77 73 54 6f 45 6f 6c 28 7a  ,' && !wsToEol(z
bba0: 2b 69 2b 31 29 29 29 0a 20 20 20 20 20 20 20 20  +i+1))).        
bbb0: 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20    ){.           
bbc0: 20 69 66 28 20 63 3d 3d 27 5c 6e 27 20 29 20 6a   if( c=='\n' ) j
bbd0: 2d 2d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  --;.            
bbe0: 70 72 69 6e 74 53 63 68 65 6d 61 4c 69 6e 65 4e  printSchemaLineN
bbf0: 28 70 2d 3e 6f 75 74 2c 20 7a 2c 20 6a 2c 20 22  (p->out, z, j, "
bc00: 5c 6e 20 20 22 29 3b 0a 20 20 20 20 20 20 20 20  \n  ");.        
bc10: 20 20 20 20 6a 20 3d 20 30 3b 0a 20 20 20 20 20      j = 0;.     
bc20: 20 20 20 20 20 20 20 6e 4c 69 6e 65 2b 2b 3b 0a         nLine++;.
bc30: 20 20 20 20 20 20 20 20 20 20 20 20 77 68 69 6c              whil
bc40: 65 28 20 49 73 53 70 61 63 65 28 7a 5b 69 2b 31  e( IsSpace(z[i+1
bc50: 5d 29 20 29 7b 20 69 2b 2b 3b 20 7d 0a 20 20 20  ]) ){ i++; }.   
bc60: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
bc70: 20 7d 0a 20 20 20 20 20 20 20 20 7a 5b 6a 5d 20   }.        z[j] 
bc80: 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
bc90: 20 20 20 70 72 69 6e 74 53 63 68 65 6d 61 4c 69     printSchemaLi
bca0: 6e 65 28 70 2d 3e 6f 75 74 2c 20 7a 2c 20 22 3b  ne(p->out, z, ";
bcb0: 5c 6e 22 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  \n");.      sqli
bcc0: 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20 20  te3_free(z);.   
bcd0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
bce0: 20 20 20 20 63 61 73 65 20 4d 4f 44 45 5f 4c 69      case MODE_Li
bcf0: 73 74 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20  st: {.      if( 
bd00: 70 2d 3e 63 6e 74 2b 2b 3d 3d 30 20 26 26 20 70  p->cnt++==0 && p
bd10: 2d 3e 73 68 6f 77 48 65 61 64 65 72 20 29 7b 0a  ->showHeader ){.
bd20: 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
bd30: 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20   i<nArg; i++){. 
bd40: 20 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72           utf8_pr
bd50: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 25 73 25  intf(p->out,"%s%
bd60: 73 22 2c 61 7a 43 6f 6c 5b 69 5d 2c 0a 20 20 20  s",azCol[i],.   
bd70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
bd80: 3d 3d 6e 41 72 67 2d 31 20 3f 20 70 2d 3e 72 6f  ==nArg-1 ? p->ro
bd90: 77 53 65 70 61 72 61 74 6f 72 20 3a 20 70 2d 3e  wSeparator : p->
bda0: 63 6f 6c 53 65 70 61 72 61 74 6f 72 29 3b 0a 20  colSeparator);. 
bdb0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
bdc0: 0a 20 20 20 20 20 20 69 66 28 20 61 7a 41 72 67  .      if( azArg
bdd0: 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
bde0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41     for(i=0; i<nA
bdf0: 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  rg; i++){.      
be00: 20 20 63 68 61 72 20 2a 7a 20 3d 20 61 7a 41 72    char *z = azAr
be10: 67 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 69 66  g[i];.        if
be20: 28 20 7a 3d 3d 30 20 29 20 7a 20 3d 20 70 2d 3e  ( z==0 ) z = p->
be30: 6e 75 6c 6c 56 61 6c 75 65 3b 0a 20 20 20 20 20  nullValue;.     
be40: 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70     utf8_printf(p
be50: 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20 7a 29 3b  ->out, "%s", z);
be60: 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 3c 6e  .        if( i<n
be70: 41 72 67 2d 31 20 29 7b 0a 20 20 20 20 20 20 20  Arg-1 ){.       
be80: 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70     utf8_printf(p
be90: 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20 70 2d 3e  ->out, "%s", p->
bea0: 63 6f 6c 53 65 70 61 72 61 74 6f 72 29 3b 0a 20  colSeparator);. 
beb0: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
bec0: 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69          utf8_pri
bed0: 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22  ntf(p->out, "%s"
bee0: 2c 20 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f  , p->rowSeparato
bef0: 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  r);.        }.  
bf00: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
bf10: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
bf20: 65 20 4d 4f 44 45 5f 48 74 6d 6c 3a 20 7b 0a 20  e MODE_Html: {. 
bf30: 20 20 20 20 20 69 66 28 20 70 2d 3e 63 6e 74 2b       if( p->cnt+
bf40: 2b 3d 3d 30 20 26 26 20 70 2d 3e 73 68 6f 77 48  +==0 && p->showH
bf50: 65 61 64 65 72 20 29 7b 0a 20 20 20 20 20 20 20  eader ){.       
bf60: 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f   raw_printf(p->o
bf70: 75 74 2c 22 3c 54 52 3e 22 29 3b 0a 20 20 20 20  ut,"<TR>");.    
bf80: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
bf90: 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Arg; i++){.     
bfa0: 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
bfb0: 70 2d 3e 6f 75 74 2c 22 3c 54 48 3e 22 29 3b 0a  p->out,"<TH>");.
bfc0: 20 20 20 20 20 20 20 20 20 20 6f 75 74 70 75 74            output
bfd0: 5f 68 74 6d 6c 5f 73 74 72 69 6e 67 28 70 2d 3e  _html_string(p->
bfe0: 6f 75 74 2c 20 61 7a 43 6f 6c 5b 69 5d 29 3b 0a  out, azCol[i]);.
bff0: 20 20 20 20 20 20 20 20 20 20 72 61 77 5f 70 72            raw_pr
c000: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 3c 2f 54  intf(p->out,"</T
c010: 48 3e 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20 20  H>\n");.        
c020: 7d 0a 20 20 20 20 20 20 20 20 72 61 77 5f 70 72  }.        raw_pr
c030: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 3c 2f 54  intf(p->out,"</T
c040: 52 3e 5c 6e 22 29 3b 0a 20 20 20 20 20 20 7d 0a  R>\n");.      }.
c050: 20 20 20 20 20 20 69 66 28 20 61 7a 41 72 67 3d        if( azArg=
c060: 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
c070: 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e    raw_printf(p->
c080: 6f 75 74 2c 22 3c 54 52 3e 22 29 3b 0a 20 20 20  out,"<TR>");.   
c090: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41     for(i=0; i<nA
c0a0: 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  rg; i++){.      
c0b0: 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e    raw_printf(p->
c0c0: 6f 75 74 2c 22 3c 54 44 3e 22 29 3b 0a 20 20 20  out,"<TD>");.   
c0d0: 20 20 20 20 20 6f 75 74 70 75 74 5f 68 74 6d 6c       output_html
c0e0: 5f 73 74 72 69 6e 67 28 70 2d 3e 6f 75 74 2c 20  _string(p->out, 
c0f0: 61 7a 41 72 67 5b 69 5d 20 3f 20 61 7a 41 72 67  azArg[i] ? azArg
c100: 5b 69 5d 20 3a 20 70 2d 3e 6e 75 6c 6c 56 61 6c  [i] : p->nullVal
c110: 75 65 29 3b 0a 20 20 20 20 20 20 20 20 72 61 77  ue);.        raw
c120: 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22  _printf(p->out,"
c130: 3c 2f 54 44 3e 5c 6e 22 29 3b 0a 20 20 20 20 20  </TD>\n");.     
c140: 20 7d 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69   }.      raw_pri
c150: 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 3c 2f 54 52  ntf(p->out,"</TR
c160: 3e 5c 6e 22 29 3b 0a 20 20 20 20 20 20 62 72 65  >\n");.      bre
c170: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
c180: 73 65 20 4d 4f 44 45 5f 54 63 6c 3a 20 7b 0a 20  se MODE_Tcl: {. 
c190: 20 20 20 20 20 69 66 28 20 70 2d 3e 63 6e 74 2b       if( p->cnt+
c1a0: 2b 3d 3d 30 20 26 26 20 70 2d 3e 73 68 6f 77 48  +==0 && p->showH
c1b0: 65 61 64 65 72 20 29 7b 0a 20 20 20 20 20 20 20  eader ){.       
c1c0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67   for(i=0; i<nArg
c1d0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
c1e0: 20 20 6f 75 74 70 75 74 5f 63 5f 73 74 72 69 6e    output_c_strin
c1f0: 67 28 70 2d 3e 6f 75 74 2c 61 7a 43 6f 6c 5b 69  g(p->out,azCol[i
c200: 5d 20 3f 20 61 7a 43 6f 6c 5b 69 5d 20 3a 20 22  ] ? azCol[i] : "
c210: 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  ");.          if
c220: 28 69 3c 6e 41 72 67 2d 31 29 20 75 74 66 38 5f  (i<nArg-1) utf8_
c230: 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
c240: 25 73 22 2c 20 70 2d 3e 63 6f 6c 53 65 70 61 72  %s", p->colSepar
c250: 61 74 6f 72 29 3b 0a 20 20 20 20 20 20 20 20 7d  ator);.        }
c260: 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72  .        utf8_pr
c270: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73  intf(p->out, "%s
c280: 22 2c 20 70 2d 3e 72 6f 77 53 65 70 61 72 61 74  ", p->rowSeparat
c290: 6f 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  or);.      }.   
c2a0: 20 20 20 69 66 28 20 61 7a 41 72 67 3d 3d 30 20     if( azArg==0 
c2b0: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 66  ) break;.      f
c2c0: 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20  or(i=0; i<nArg; 
c2d0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 6f 75  i++){.        ou
c2e0: 74 70 75 74 5f 63 5f 73 74 72 69 6e 67 28 70 2d  tput_c_string(p-
c2f0: 3e 6f 75 74 2c 20 61 7a 41 72 67 5b 69 5d 20 3f  >out, azArg[i] ?
c300: 20 61 7a 41 72 67 5b 69 5d 20 3a 20 70 2d 3e 6e   azArg[i] : p->n
c310: 75 6c 6c 56 61 6c 75 65 29 3b 0a 20 20 20 20 20  ullValue);.     
c320: 20 20 20 69 66 28 69 3c 6e 41 72 67 2d 31 29 20     if(i<nArg-1) 
c330: 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f  utf8_printf(p->o
c340: 75 74 2c 20 22 25 73 22 2c 20 70 2d 3e 63 6f 6c  ut, "%s", p->col
c350: 53 65 70 61 72 61 74 6f 72 29 3b 0a 20 20 20 20  Separator);.    
c360: 20 20 7d 0a 20 20 20 20 20 20 75 74 66 38 5f 70    }.      utf8_p
c370: 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25  rintf(p->out, "%
c380: 73 22 2c 20 70 2d 3e 72 6f 77 53 65 70 61 72 61  s", p->rowSepara
c390: 74 6f 72 29 3b 0a 20 20 20 20 20 20 62 72 65 61  tor);.      brea
c3a0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
c3b0: 65 20 4d 4f 44 45 5f 43 73 76 3a 20 7b 0a 20 20  e MODE_Csv: {.  
c3c0: 20 20 20 20 73 65 74 42 69 6e 61 72 79 4d 6f 64      setBinaryMod
c3d0: 65 28 70 2d 3e 6f 75 74 2c 20 31 29 3b 0a 20 20  e(p->out, 1);.  
c3e0: 20 20 20 20 69 66 28 20 70 2d 3e 63 6e 74 2b 2b      if( p->cnt++
c3f0: 3d 3d 30 20 26 26 20 70 2d 3e 73 68 6f 77 48 65  ==0 && p->showHe
c400: 61 64 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20  ader ){.        
c410: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b  for(i=0; i<nArg;
c420: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
c430: 20 6f 75 74 70 75 74 5f 63 73 76 28 70 2c 20 61   output_csv(p, a
c440: 7a 43 6f 6c 5b 69 5d 20 3f 20 61 7a 43 6f 6c 5b  zCol[i] ? azCol[
c450: 69 5d 20 3a 20 22 22 2c 20 69 3c 6e 41 72 67 2d  i] : "", i<nArg-
c460: 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  1);.        }.  
c470: 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
c480: 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20  f(p->out, "%s", 
c490: 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 29  p->rowSeparator)
c4a0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
c4b0: 69 66 28 20 6e 41 72 67 3e 30 20 29 7b 0a 20 20  if( nArg>0 ){.  
c4c0: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
c4d0: 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nArg; i++){.   
c4e0: 20 20 20 20 20 20 20 6f 75 74 70 75 74 5f 63 73         output_cs
c4f0: 76 28 70 2c 20 61 7a 41 72 67 5b 69 5d 2c 20 69  v(p, azArg[i], i
c500: 3c 6e 41 72 67 2d 31 29 3b 0a 20 20 20 20 20 20  <nArg-1);.      
c510: 20 20 7d 0a 20 20 20 20 20 20 20 20 75 74 66 38    }.        utf8
c520: 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
c530: 22 25 73 22 2c 20 70 2d 3e 72 6f 77 53 65 70 61  "%s", p->rowSepa
c540: 72 61 74 6f 72 29 3b 0a 20 20 20 20 20 20 7d 0a  rator);.      }.
c550: 20 20 20 20 20 20 73 65 74 54 65 78 74 4d 6f 64        setTextMod
c560: 65 28 70 2d 3e 6f 75 74 2c 20 31 29 3b 0a 20 20  e(p->out, 1);.  
c570: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
c580: 0a 20 20 20 20 63 61 73 65 20 4d 4f 44 45 5f 49  .    case MODE_I
c590: 6e 73 65 72 74 3a 20 7b 0a 20 20 20 20 20 20 69  nsert: {.      i
c5a0: 66 28 20 61 7a 41 72 67 3d 3d 30 20 29 20 62 72  f( azArg==0 ) br
c5b0: 65 61 6b 3b 0a 20 20 20 20 20 20 75 74 66 38 5f  eak;.      utf8_
c5c0: 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 49  printf(p->out,"I
c5d0: 4e 53 45 52 54 20 49 4e 54 4f 20 25 73 22 2c 70  NSERT INTO %s",p
c5e0: 2d 3e 7a 44 65 73 74 54 61 62 6c 65 29 3b 0a 20  ->zDestTable);. 
c5f0: 20 20 20 20 20 69 66 28 20 70 2d 3e 73 68 6f 77       if( p->show
c600: 48 65 61 64 65 72 20 29 7b 0a 20 20 20 20 20 20  Header ){.      
c610: 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e    raw_printf(p->
c620: 6f 75 74 2c 22 28 22 29 3b 0a 20 20 20 20 20 20  out,"(");.      
c630: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72    for(i=0; i<nAr
c640: 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  g; i++){.       
c650: 20 20 20 69 66 28 20 69 3e 30 20 29 20 72 61 77     if( i>0 ) raw
c660: 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
c670: 22 2c 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ",");.          
c680: 69 66 28 20 71 75 6f 74 65 43 68 61 72 28 61 7a  if( quoteChar(az
c690: 43 6f 6c 5b 69 5d 29 20 29 7b 0a 20 20 20 20 20  Col[i]) ){.     
c6a0: 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 20 3d         char *z =
c6b0: 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
c6c0: 28 22 5c 22 25 77 5c 22 22 2c 20 61 7a 43 6f 6c  ("\"%w\"", azCol
c6d0: 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20  [i]);.          
c6e0: 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d    utf8_printf(p-
c6f0: 3e 6f 75 74 2c 20 22 25 73 22 2c 20 7a 29 3b 0a  >out, "%s", z);.
c700: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
c710: 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20 20  te3_free(z);.   
c720: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
c730: 20 20 20 20 20 20 20 20 20 20 72 61 77 5f 70 72            raw_pr
c740: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73  intf(p->out, "%s
c750: 22 2c 20 61 7a 43 6f 6c 5b 69 5d 29 3b 0a 20 20  ", azCol[i]);.  
c760: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
c770: 20 20 7d 0a 20 20 20 20 20 20 20 20 72 61 77 5f    }.        raw_
c780: 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 29  printf(p->out,")
c790: 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ");.      }.    
c7a0: 20 20 70 2d 3e 63 6e 74 2b 2b 3b 0a 20 20 20 20    p->cnt++;.    
c7b0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72    for(i=0; i<nAr
c7c0: 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  g; i++){.       
c7d0: 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f   raw_printf(p->o
c7e0: 75 74 2c 20 69 3e 30 20 3f 20 22 2c 22 20 3a 20  ut, i>0 ? "," : 
c7f0: 22 20 56 41 4c 55 45 53 28 22 29 3b 0a 20 20 20  " VALUES(");.   
c800: 20 20 20 20 20 69 66 28 20 28 61 7a 41 72 67 5b       if( (azArg[
c810: 69 5d 3d 3d 30 29 20 7c 7c 20 28 61 69 54 79 70  i]==0) || (aiTyp
c820: 65 20 26 26 20 61 69 54 79 70 65 5b 69 5d 3d 3d  e && aiType[i]==
c830: 53 51 4c 49 54 45 5f 4e 55 4c 4c 29 20 29 7b 0a  SQLITE_NULL) ){.
c840: 20 20 20 20 20 20 20 20 20 20 75 74 66 38 5f 70            utf8_p
c850: 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 4e 55  rintf(p->out,"NU
c860: 4c 4c 22 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  LL");.        }e
c870: 6c 73 65 20 69 66 28 20 61 69 54 79 70 65 20 26  lse if( aiType &
c880: 26 20 61 69 54 79 70 65 5b 69 5d 3d 3d 53 51 4c  & aiType[i]==SQL
c890: 49 54 45 5f 54 45 58 54 20 29 7b 0a 20 20 20 20  ITE_TEXT ){.    
c8a0: 20 20 20 20 20 20 69 66 28 20 53 68 65 6c 6c 48        if( ShellH
c8b0: 61 73 46 6c 61 67 28 70 2c 20 53 48 46 4c 47 5f  asFlag(p, SHFLG_
c8c0: 4e 65 77 6c 69 6e 65 73 29 20 29 7b 0a 20 20 20  Newlines) ){.   
c8d0: 20 20 20 20 20 20 20 20 20 6f 75 74 70 75 74 5f           output_
c8e0: 71 75 6f 74 65 64 5f 73 74 72 69 6e 67 28 70 2d  quoted_string(p-
c8f0: 3e 6f 75 74 2c 20 61 7a 41 72 67 5b 69 5d 29 3b  >out, azArg[i]);
c900: 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
c910: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6f 75  {.            ou
c920: 74 70 75 74 5f 71 75 6f 74 65 64 5f 65 73 63 61  tput_quoted_esca
c930: 70 65 64 5f 73 74 72 69 6e 67 28 70 2d 3e 6f 75  ped_string(p->ou
c940: 74 2c 20 61 7a 41 72 67 5b 69 5d 29 3b 0a 20 20  t, azArg[i]);.  
c950: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
c960: 20 20 7d 65 6c 73 65 20 69 66 28 20 61 69 54 79    }else if( aiTy
c970: 70 65 20 26 26 20 61 69 54 79 70 65 5b 69 5d 3d  pe && aiType[i]=
c980: 3d 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 20  =SQLITE_INTEGER 
c990: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 74 66  ){.          utf
c9a0: 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  8_printf(p->out,
c9b0: 22 25 73 22 2c 20 61 7a 41 72 67 5b 69 5d 29 3b  "%s", azArg[i]);
c9c0: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
c9d0: 66 28 20 61 69 54 79 70 65 20 26 26 20 61 69 54  f( aiType && aiT
c9e0: 79 70 65 5b 69 5d 3d 3d 53 51 4c 49 54 45 5f 46  ype[i]==SQLITE_F
c9f0: 4c 4f 41 54 20 29 7b 0a 20 20 20 20 20 20 20 20  LOAT ){.        
ca00: 20 20 63 68 61 72 20 7a 5b 35 30 5d 3b 0a 20 20    char z[50];.  
ca10: 20 20 20 20 20 20 20 20 64 6f 75 62 6c 65 20 72          double r
ca20: 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
ca30: 6e 5f 64 6f 75 62 6c 65 28 70 2d 3e 70 53 74 6d  n_double(p->pStm
ca40: 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20 20  t, i);.         
ca50: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
ca60: 66 28 35 30 2c 7a 2c 22 25 21 2e 32 30 67 22 2c  f(50,z,"%!.20g",
ca70: 20 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72   r);.          r
ca80: 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  aw_printf(p->out
ca90: 2c 20 22 25 73 22 2c 20 7a 29 3b 0a 20 20 20 20  , "%s", z);.    
caa0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 61 69      }else if( ai
cab0: 54 79 70 65 20 26 26 20 61 69 54 79 70 65 5b 69  Type && aiType[i
cac0: 5d 3d 3d 53 51 4c 49 54 45 5f 42 4c 4f 42 20 26  ]==SQLITE_BLOB &
cad0: 26 20 70 2d 3e 70 53 74 6d 74 20 29 7b 0a 20 20  & p->pStmt ){.  
cae0: 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 76 6f          const vo
caf0: 69 64 20 2a 70 42 6c 6f 62 20 3d 20 73 71 6c 69  id *pBlob = sqli
cb00: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 28  te3_column_blob(
cb10: 70 2d 3e 70 53 74 6d 74 2c 20 69 29 3b 0a 20 20  p->pStmt, i);.  
cb20: 20 20 20 20 20 20 20 20 69 6e 74 20 6e 42 6c 6f          int nBlo
cb30: 62 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  b = sqlite3_colu
cb40: 6d 6e 5f 62 79 74 65 73 28 70 2d 3e 70 53 74 6d  mn_bytes(p->pStm
cb50: 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20 20  t, i);.         
cb60: 20 6f 75 74 70 75 74 5f 68 65 78 5f 62 6c 6f 62   output_hex_blob
cb70: 28 70 2d 3e 6f 75 74 2c 20 70 42 6c 6f 62 2c 20  (p->out, pBlob, 
cb80: 6e 42 6c 6f 62 29 3b 0a 20 20 20 20 20 20 20 20  nBlob);.        
cb90: 7d 65 6c 73 65 20 69 66 28 20 69 73 4e 75 6d 62  }else if( isNumb
cba0: 65 72 28 61 7a 41 72 67 5b 69 5d 2c 20 30 29 20  er(azArg[i], 0) 
cbb0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 74 66  ){.          utf
cbc0: 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  8_printf(p->out,
cbd0: 22 25 73 22 2c 20 61 7a 41 72 67 5b 69 5d 29 3b  "%s", azArg[i]);
cbe0: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
cbf0: 66 28 20 53 68 65 6c 6c 48 61 73 46 6c 61 67 28  f( ShellHasFlag(
cc00: 70 2c 20 53 48 46 4c 47 5f 4e 65 77 6c 69 6e 65  p, SHFLG_Newline
cc10: 73 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  s) ){.          
cc20: 6f 75 74 70 75 74 5f 71 75 6f 74 65 64 5f 73 74  output_quoted_st
cc30: 72 69 6e 67 28 70 2d 3e 6f 75 74 2c 20 61 7a 41  ring(p->out, azA
cc40: 72 67 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20  rg[i]);.        
cc50: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
cc60: 20 6f 75 74 70 75 74 5f 71 75 6f 74 65 64 5f 65   output_quoted_e
cc70: 73 63 61 70 65 64 5f 73 74 72 69 6e 67 28 70 2d  scaped_string(p-
cc80: 3e 6f 75 74 2c 20 61 7a 41 72 67 5b 69 5d 29 3b  >out, azArg[i]);
cc90: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
cca0: 20 7d 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69   }.      raw_pri
ccb0: 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 29 3b 5c 6e  ntf(p->out,");\n
ccc0: 22 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ");.      break;
ccd0: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
cce0: 4d 4f 44 45 5f 51 75 6f 74 65 3a 20 7b 0a 20 20  MODE_Quote: {.  
ccf0: 20 20 20 20 69 66 28 20 61 7a 41 72 67 3d 3d 30      if( azArg==0
cd00: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
cd10: 69 66 28 20 70 2d 3e 63 6e 74 3d 3d 30 20 26 26  if( p->cnt==0 &&
cd20: 20 70 2d 3e 73 68 6f 77 48 65 61 64 65 72 20 29   p->showHeader )
cd30: 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  {.        for(i=
cd40: 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b  0; i<nArg; i++){
cd50: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69  .          if( i
cd60: 3e 30 20 29 20 72 61 77 5f 70 72 69 6e 74 66 28  >0 ) raw_printf(
cd70: 70 2d 3e 6f 75 74 2c 20 22 2c 22 29 3b 0a 20 20  p->out, ",");.  
cd80: 20 20 20 20 20 20 20 20 6f 75 74 70 75 74 5f 71          output_q
cd90: 75 6f 74 65 64 5f 73 74 72 69 6e 67 28 70 2d 3e  uoted_string(p->
cda0: 6f 75 74 2c 20 61 7a 43 6f 6c 5b 69 5d 29 3b 0a  out, azCol[i]);.
cdb0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
cdc0: 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e    raw_printf(p->
cdd0: 6f 75 74 2c 22 5c 6e 22 29 3b 0a 20 20 20 20 20  out,"\n");.     
cde0: 20 7d 0a 20 20 20 20 20 20 70 2d 3e 63 6e 74 2b   }.      p->cnt+
cdf0: 2b 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  +;.      for(i=0
ce00: 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a  ; i<nArg; i++){.
ce10: 20 20 20 20 20 20 20 20 69 66 28 20 69 3e 30 20          if( i>0 
ce20: 29 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e  ) raw_printf(p->
ce30: 6f 75 74 2c 20 22 2c 22 29 3b 0a 20 20 20 20 20  out, ",");.     
ce40: 20 20 20 69 66 28 20 28 61 7a 41 72 67 5b 69 5d     if( (azArg[i]
ce50: 3d 3d 30 29 20 7c 7c 20 28 61 69 54 79 70 65 20  ==0) || (aiType 
ce60: 26 26 20 61 69 54 79 70 65 5b 69 5d 3d 3d 53 51  && aiType[i]==SQ
ce70: 4c 49 54 45 5f 4e 55 4c 4c 29 20 29 7b 0a 20 20  LITE_NULL) ){.  
ce80: 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69          utf8_pri
ce90: 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 4e 55 4c 4c  ntf(p->out,"NULL
cea0: 22 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ");.        }els
ceb0: 65 20 69 66 28 20 61 69 54 79 70 65 20 26 26 20  e if( aiType && 
cec0: 61 69 54 79 70 65 5b 69 5d 3d 3d 53 51 4c 49 54  aiType[i]==SQLIT
ced0: 45 5f 54 45 58 54 20 29 7b 0a 20 20 20 20 20 20  E_TEXT ){.      
cee0: 20 20 20 20 6f 75 74 70 75 74 5f 71 75 6f 74 65      output_quote
cef0: 64 5f 73 74 72 69 6e 67 28 70 2d 3e 6f 75 74 2c  d_string(p->out,
cf00: 20 61 7a 41 72 67 5b 69 5d 29 3b 0a 20 20 20 20   azArg[i]);.    
cf10: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 61 69      }else if( ai
cf20: 54 79 70 65 20 26 26 20 61 69 54 79 70 65 5b 69  Type && aiType[i
cf30: 5d 3d 3d 53 51 4c 49 54 45 5f 49 4e 54 45 47 45  ]==SQLITE_INTEGE
cf40: 52 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75  R ){.          u
cf50: 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  tf8_printf(p->ou
cf60: 74 2c 22 25 73 22 2c 20 61 7a 41 72 67 5b 69 5d  t,"%s", azArg[i]
cf70: 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
cf80: 20 69 66 28 20 61 69 54 79 70 65 20 26 26 20 61   if( aiType && a
cf90: 69 54 79 70 65 5b 69 5d 3d 3d 53 51 4c 49 54 45  iType[i]==SQLITE
cfa0: 5f 46 4c 4f 41 54 20 29 7b 0a 20 20 20 20 20 20  _FLOAT ){.      
cfb0: 20 20 20 20 63 68 61 72 20 7a 5b 35 30 5d 3b 0a      char z[50];.
cfc0: 20 20 20 20 20 20 20 20 20 20 64 6f 75 62 6c 65            double
cfd0: 20 72 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c   r = sqlite3_col
cfe0: 75 6d 6e 5f 64 6f 75 62 6c 65 28 70 2d 3e 70 53  umn_double(p->pS
cff0: 74 6d 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 20  tmt, i);.       
d000: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
d010: 6e 74 66 28 35 30 2c 7a 2c 22 25 21 2e 32 30 67  ntf(50,z,"%!.20g
d020: 22 2c 20 72 29 3b 0a 20 20 20 20 20 20 20 20 20  ", r);.         
d030: 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f   raw_printf(p->o
d040: 75 74 2c 20 22 25 73 22 2c 20 7a 29 3b 0a 20 20  ut, "%s", z);.  
d050: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
d060: 61 69 54 79 70 65 20 26 26 20 61 69 54 79 70 65  aiType && aiType
d070: 5b 69 5d 3d 3d 53 51 4c 49 54 45 5f 42 4c 4f 42  [i]==SQLITE_BLOB
d080: 20 26 26 20 70 2d 3e 70 53 74 6d 74 20 29 7b 0a   && p->pStmt ){.
d090: 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20            const 
d0a0: 76 6f 69 64 20 2a 70 42 6c 6f 62 20 3d 20 73 71  void *pBlob = sq
d0b0: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f  lite3_column_blo
d0c0: 62 28 70 2d 3e 70 53 74 6d 74 2c 20 69 29 3b 0a  b(p->pStmt, i);.
d0d0: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e 42            int nB
d0e0: 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  lob = sqlite3_co
d0f0: 6c 75 6d 6e 5f 62 79 74 65 73 28 70 2d 3e 70 53  lumn_bytes(p->pS
d100: 74 6d 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 20  tmt, i);.       
d110: 20 20 20 6f 75 74 70 75 74 5f 68 65 78 5f 62 6c     output_hex_bl
d120: 6f 62 28 70 2d 3e 6f 75 74 2c 20 70 42 6c 6f 62  ob(p->out, pBlob
d130: 2c 20 6e 42 6c 6f 62 29 3b 0a 20 20 20 20 20 20  , nBlob);.      
d140: 20 20 7d 65 6c 73 65 20 69 66 28 20 69 73 4e 75    }else if( isNu
d150: 6d 62 65 72 28 61 7a 41 72 67 5b 69 5d 2c 20 30  mber(azArg[i], 0
d160: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75  ) ){.          u
d170: 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  tf8_printf(p->ou
d180: 74 2c 22 25 73 22 2c 20 61 7a 41 72 67 5b 69 5d  t,"%s", azArg[i]
d190: 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
d1a0: 7b 0a 20 20 20 20 20 20 20 20 20 20 6f 75 74 70  {.          outp
d1b0: 75 74 5f 71 75 6f 74 65 64 5f 73 74 72 69 6e 67  ut_quoted_string
d1c0: 28 70 2d 3e 6f 75 74 2c 20 61 7a 41 72 67 5b 69  (p->out, azArg[i
d1d0: 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ]);.        }.  
d1e0: 20 20 20 20 7d 0a 20 20 20 20 20 20 72 61 77 5f      }.      raw_
d1f0: 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 5c  printf(p->out,"\
d200: 6e 22 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  n");.      break
d210: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
d220: 20 4d 4f 44 45 5f 41 73 63 69 69 3a 20 7b 0a 20   MODE_Ascii: {. 
d230: 20 20 20 20 20 69 66 28 20 70 2d 3e 63 6e 74 2b       if( p->cnt+
d240: 2b 3d 3d 30 20 26 26 20 70 2d 3e 73 68 6f 77 48  +==0 && p->showH
d250: 65 61 64 65 72 20 29 7b 0a 20 20 20 20 20 20 20  eader ){.       
d260: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67   for(i=0; i<nArg
d270: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
d280: 20 20 69 66 28 20 69 3e 30 20 29 20 75 74 66 38    if( i>0 ) utf8
d290: 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
d2a0: 22 25 73 22 2c 20 70 2d 3e 63 6f 6c 53 65 70 61  "%s", p->colSepa
d2b0: 72 61 74 6f 72 29 3b 0a 20 20 20 20 20 20 20 20  rator);.        
d2c0: 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d    utf8_printf(p-
d2d0: 3e 6f 75 74 2c 22 25 73 22 2c 61 7a 43 6f 6c 5b  >out,"%s",azCol[
d2e0: 69 5d 20 3f 20 61 7a 43 6f 6c 5b 69 5d 20 3a 20  i] ? azCol[i] : 
d2f0: 22 22 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  "");.        }. 
d300: 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e         utf8_prin
d310: 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c  tf(p->out, "%s",
d320: 20 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72   p->rowSeparator
d330: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
d340: 20 69 66 28 20 61 7a 41 72 67 3d 3d 30 20 29 20   if( azArg==0 ) 
d350: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 66 6f 72  break;.      for
d360: 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b  (i=0; i<nArg; i+
d370: 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
d380: 69 3e 30 20 29 20 75 74 66 38 5f 70 72 69 6e 74  i>0 ) utf8_print
d390: 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20  f(p->out, "%s", 
d3a0: 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 29  p->colSeparator)
d3b0: 3b 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70  ;.        utf8_p
d3c0: 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 25 73  rintf(p->out,"%s
d3d0: 22 2c 61 7a 41 72 67 5b 69 5d 20 3f 20 61 7a 41  ",azArg[i] ? azA
d3e0: 72 67 5b 69 5d 20 3a 20 70 2d 3e 6e 75 6c 6c 56  rg[i] : p->nullV
d3f0: 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  alue);.      }. 
d400: 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
d410: 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20 70  (p->out, "%s", p
d420: 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 29 3b  ->rowSeparator);
d430: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
d440: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
d450: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69   0;.}../*.** Thi
d460: 73 20 69 73 20 74 68 65 20 63 61 6c 6c 62 61 63  s is the callbac
d470: 6b 20 72 6f 75 74 69 6e 65 20 74 68 61 74 20 74  k routine that t
d480: 68 65 20 53 51 4c 69 74 65 20 6c 69 62 72 61 72  he SQLite librar
d490: 79 0a 2a 2a 20 69 6e 76 6f 6b 65 73 20 66 6f 72  y.** invokes for
d4a0: 20 65 61 63 68 20 72 6f 77 20 6f 66 20 61 20 71   each row of a q
d4b0: 75 65 72 79 20 72 65 73 75 6c 74 2e 0a 2a 2f 0a  uery result..*/.
d4c0: 73 74 61 74 69 63 20 69 6e 74 20 63 61 6c 6c 62  static int callb
d4d0: 61 63 6b 28 76 6f 69 64 20 2a 70 41 72 67 2c 20  ack(void *pArg, 
d4e0: 69 6e 74 20 6e 41 72 67 2c 20 63 68 61 72 20 2a  int nArg, char *
d4f0: 2a 61 7a 41 72 67 2c 20 63 68 61 72 20 2a 2a 61  *azArg, char **a
d500: 7a 43 6f 6c 29 7b 0a 20 20 2f 2a 20 73 69 6e 63  zCol){.  /* sinc
d510: 65 20 77 65 20 64 6f 6e 27 74 20 68 61 76 65 20  e we don't have 
d520: 74 79 70 65 20 69 6e 66 6f 2c 20 63 61 6c 6c 20  type info, call 
d530: 74 68 65 20 73 68 65 6c 6c 5f 63 61 6c 6c 62 61  the shell_callba
d540: 63 6b 20 77 69 74 68 20 61 20 4e 55 4c 4c 20 76  ck with a NULL v
d550: 61 6c 75 65 20 2a 2f 0a 20 20 72 65 74 75 72 6e  alue */.  return
d560: 20 73 68 65 6c 6c 5f 63 61 6c 6c 62 61 63 6b 28   shell_callback(
d570: 70 41 72 67 2c 20 6e 41 72 67 2c 20 61 7a 41 72  pArg, nArg, azAr
d580: 67 2c 20 61 7a 43 6f 6c 2c 20 4e 55 4c 4c 29 3b  g, azCol, NULL);
d590: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69  .}../*.** This i
d5a0: 73 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 72  s the callback r
d5b0: 6f 75 74 69 6e 65 20 66 72 6f 6d 20 73 71 6c 69  outine from sqli
d5c0: 74 65 33 5f 65 78 65 63 28 29 20 74 68 61 74 20  te3_exec() that 
d5d0: 61 70 70 65 6e 64 73 20 61 6c 6c 0a 2a 2a 20 6f  appends all.** o
d5e0: 75 74 70 75 74 20 6f 6e 74 6f 20 74 68 65 20 65  utput onto the e
d5f0: 6e 64 20 6f 66 20 61 20 53 68 65 6c 6c 54 65 78  nd of a ShellTex
d600: 74 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61  t object..*/.sta
d610: 74 69 63 20 69 6e 74 20 63 61 70 74 75 72 65 4f  tic int captureO
d620: 75 74 70 75 74 43 61 6c 6c 62 61 63 6b 28 76 6f  utputCallback(vo
d630: 69 64 20 2a 70 41 72 67 2c 20 69 6e 74 20 6e 41  id *pArg, int nA
d640: 72 67 2c 20 63 68 61 72 20 2a 2a 61 7a 41 72 67  rg, char **azArg
d650: 2c 20 63 68 61 72 20 2a 2a 61 7a 29 7b 0a 20 20  , char **az){.  
d660: 53 68 65 6c 6c 54 65 78 74 20 2a 70 20 3d 20 28  ShellText *p = (
d670: 53 68 65 6c 6c 54 65 78 74 2a 29 70 41 72 67 3b  ShellText*)pArg;
d680: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 55 4e 55 53  .  int i;.  UNUS
d690: 45 44 5f 50 41 52 41 4d 45 54 45 52 28 61 7a 29  ED_PARAMETER(az)
d6a0: 3b 0a 20 20 69 66 28 20 61 7a 41 72 67 3d 3d 30  ;.  if( azArg==0
d6b0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
d6c0: 66 28 20 70 2d 3e 6e 20 29 20 61 70 70 65 6e 64  f( p->n ) append
d6d0: 54 65 78 74 28 70 2c 20 22 7c 22 2c 20 30 29 3b  Text(p, "|", 0);
d6e0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41  .  for(i=0; i<nA
d6f0: 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  rg; i++){.    if
d700: 28 20 69 20 29 20 61 70 70 65 6e 64 54 65 78 74  ( i ) appendText
d710: 28 70 2c 20 22 2c 22 2c 20 30 29 3b 0a 20 20 20  (p, ",", 0);.   
d720: 20 69 66 28 20 61 7a 41 72 67 5b 69 5d 20 29 20   if( azArg[i] ) 
d730: 61 70 70 65 6e 64 54 65 78 74 28 70 2c 20 61 7a  appendText(p, az
d740: 41 72 67 5b 69 5d 2c 20 30 29 3b 0a 20 20 7d 0a  Arg[i], 0);.  }.
d750: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
d760: 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 6e  *.** Generate an
d770: 20 61 70 70 72 6f 70 72 69 61 74 65 20 53 45 4c   appropriate SEL
d780: 46 54 45 53 54 20 74 61 62 6c 65 20 69 6e 20 74  FTEST table in t
d790: 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
d7a0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
d7b0: 20 63 72 65 61 74 65 53 65 6c 66 74 65 73 74 54   createSelftestT
d7c0: 61 62 6c 65 28 53 68 65 6c 6c 53 74 61 74 65 20  able(ShellState 
d7d0: 2a 70 29 7b 0a 20 20 63 68 61 72 20 2a 7a 45 72  *p){.  char *zEr
d7e0: 72 4d 73 67 20 3d 20 30 3b 0a 20 20 73 71 6c 69  rMsg = 0;.  sqli
d7f0: 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c 0a  te3_exec(p->db,.
d800: 20 20 20 20 22 53 41 56 45 50 4f 49 4e 54 20 73      "SAVEPOINT s
d810: 65 6c 66 74 65 73 74 5f 69 6e 69 74 3b 5c 6e 22  elftest_init;\n"
d820: 0a 20 20 20 20 22 43 52 45 41 54 45 20 54 41 42  .    "CREATE TAB
d830: 4c 45 20 49 46 20 4e 4f 54 20 45 58 49 53 54 53  LE IF NOT EXISTS
d840: 20 73 65 6c 66 74 65 73 74 28 5c 6e 22 0a 20 20   selftest(\n".  
d850: 20 20 22 20 20 74 6e 6f 20 49 4e 54 45 47 45 52    "  tno INTEGER
d860: 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 5c 6e 22   PRIMARY KEY,\n"
d870: 20 20 20 2f 2a 20 54 65 73 74 20 6e 75 6d 62 65     /* Test numbe
d880: 72 20 2a 2f 0a 20 20 20 20 22 20 20 6f 70 20 54  r */.    "  op T
d890: 45 58 54 2c 5c 6e 22 20 20 20 20 20 20 20 20 20  EXT,\n"         
d8a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65            /* Ope
d8b0: 72 61 74 6f 72 3a 20 20 6d 65 6d 6f 20 72 75 6e  rator:  memo run
d8c0: 20 2a 2f 0a 20 20 20 20 22 20 20 63 6d 64 20 54   */.    "  cmd T
d8d0: 45 58 54 2c 5c 6e 22 20 20 20 20 20 20 20 20 20  EXT,\n"         
d8e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 6d           /* Comm
d8f0: 61 6e 64 20 74 65 78 74 20 2a 2f 0a 20 20 20 20  and text */.    
d900: 22 20 20 61 6e 73 20 54 45 58 54 5c 6e 22 20 20  "  ans TEXT\n"  
d910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d920: 20 2f 2a 20 44 65 73 69 72 65 64 20 61 6e 73 77   /* Desired answ
d930: 65 72 20 2a 2f 0a 20 20 20 20 22 29 3b 22 0a 20  er */.    ");". 
d940: 20 20 20 22 43 52 45 41 54 45 20 54 45 4d 50 20     "CREATE TEMP 
d950: 54 41 42 4c 45 20 5b 5f 73 68 65 6c 6c 24 73 65  TABLE [_shell$se
d960: 6c 66 5d 28 6f 70 2c 63 6d 64 2c 61 6e 73 29 3b  lf](op,cmd,ans);
d970: 5c 6e 22 0a 20 20 20 20 22 49 4e 53 45 52 54 20  \n".    "INSERT 
d980: 49 4e 54 4f 20 5b 5f 73 68 65 6c 6c 24 73 65 6c  INTO [_shell$sel
d990: 66 5d 28 72 6f 77 69 64 2c 6f 70 2c 63 6d 64 29  f](rowid,op,cmd)
d9a0: 5c 6e 22 0a 20 20 20 20 22 20 20 56 41 4c 55 45  \n".    "  VALUE
d9b0: 53 28 63 6f 61 6c 65 73 63 65 28 28 53 45 4c 45  S(coalesce((SELE
d9c0: 43 54 20 28 6d 61 78 28 74 6e 6f 29 2b 31 30 30  CT (max(tno)+100
d9d0: 29 2f 31 30 20 46 52 4f 4d 20 73 65 6c 66 74 65  )/10 FROM selfte
d9e0: 73 74 29 2c 31 30 29 2c 5c 6e 22 0a 20 20 20 20  st),10),\n".    
d9f0: 22 20 20 20 20 20 20 20 20 20 27 6d 65 6d 6f 27  "         'memo'
da00: 2c 27 54 65 73 74 73 20 67 65 6e 65 72 61 74 65  ,'Tests generate
da10: 64 20 62 79 20 2d 2d 69 6e 69 74 27 29 3b 5c 6e  d by --init');\n
da20: 22 0a 20 20 20 20 22 49 4e 53 45 52 54 20 49 4e  ".    "INSERT IN
da30: 54 4f 20 5b 5f 73 68 65 6c 6c 24 73 65 6c 66 5d  TO [_shell$self]
da40: 5c 6e 22 0a 20 20 20 20 22 20 20 53 45 4c 45 43  \n".    "  SELEC
da50: 54 20 27 72 75 6e 27 2c 5c 6e 22 0a 20 20 20 20  T 'run',\n".    
da60: 22 20 20 20 20 27 53 45 4c 45 43 54 20 68 65 78  "    'SELECT hex
da70: 28 73 68 61 33 5f 71 75 65 72 79 28 27 27 53 45  (sha3_query(''SE
da80: 4c 45 43 54 20 74 79 70 65 2c 6e 61 6d 65 2c 74  LECT type,name,t
da90: 62 6c 5f 6e 61 6d 65 2c 73 71 6c 20 22 0a 20 20  bl_name,sql ".  
daa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
dac0: 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74  FROM sqlite_mast
dad0: 65 72 20 4f 52 44 45 52 20 42 59 20 32 27 27 2c  er ORDER BY 2'',
dae0: 32 32 34 29 29 27 2c 5c 6e 22 0a 20 20 20 20 22  224))',\n".    "
daf0: 20 20 20 20 68 65 78 28 73 68 61 33 5f 71 75 65      hex(sha3_que
db00: 72 79 28 27 53 45 4c 45 43 54 20 74 79 70 65 2c  ry('SELECT type,
db10: 6e 61 6d 65 2c 74 62 6c 5f 6e 61 6d 65 2c 73 71  name,tbl_name,sq
db20: 6c 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  l ".            
db30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 46                "F
db40: 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  ROM sqlite_maste
db50: 72 20 4f 52 44 45 52 20 42 59 20 32 27 2c 32 32  r ORDER BY 2',22
db60: 34 29 29 3b 5c 6e 22 0a 20 20 20 20 22 49 4e 53  4));\n".    "INS
db70: 45 52 54 20 49 4e 54 4f 20 5b 5f 73 68 65 6c 6c  ERT INTO [_shell
db80: 24 73 65 6c 66 5d 5c 6e 22 0a 20 20 20 20 22 20  $self]\n".    " 
db90: 20 53 45 4c 45 43 54 20 27 72 75 6e 27 2c 22 0a   SELECT 'run',".
dba0: 20 20 20 20 22 20 20 20 20 27 53 45 4c 45 43 54      "    'SELECT
dbb0: 20 68 65 78 28 73 68 61 33 5f 71 75 65 72 79 28   hex(sha3_query(
dbc0: 27 27 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  ''SELECT * FROM 
dbd0: 5c 22 27 20 7c 7c 22 0a 20 20 20 20 22 20 20 20  \"' ||".    "   
dbe0: 20 20 20 20 20 70 72 69 6e 74 66 28 27 25 77 27       printf('%w'
dbf0: 2c 6e 61 6d 65 29 20 7c 7c 20 27 5c 22 20 4e 4f  ,name) || '\" NO
dc00: 54 20 49 4e 44 45 58 45 44 27 27 2c 32 32 34 29  T INDEXED'',224)
dc10: 29 27 2c 5c 6e 22 0a 20 20 20 20 22 20 20 20 20  )',\n".    "    
dc20: 68 65 78 28 73 68 61 33 5f 71 75 65 72 79 28 70  hex(sha3_query(p
dc30: 72 69 6e 74 66 28 27 53 45 4c 45 43 54 20 2a 20  rintf('SELECT * 
dc40: 46 52 4f 4d 20 5c 22 25 77 5c 22 20 4e 4f 54 20  FROM \"%w\" NOT 
dc50: 49 4e 44 45 58 45 44 27 2c 6e 61 6d 65 29 2c 32  INDEXED',name),2
dc60: 32 34 29 29 5c 6e 22 0a 20 20 20 20 22 20 20 46  24))\n".    "  F
dc70: 52 4f 4d 20 28 5c 6e 22 0a 20 20 20 20 22 20 20  ROM (\n".    "  
dc80: 20 20 53 45 4c 45 43 54 20 6e 61 6d 65 20 46 52    SELECT name FR
dc90: 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  OM sqlite_master
dca0: 5c 6e 22 0a 20 20 20 20 22 20 20 20 20 20 57 48  \n".    "     WH
dcb0: 45 52 45 20 74 79 70 65 3d 27 74 61 62 6c 65 27  ERE type='table'
dcc0: 5c 6e 22 0a 20 20 20 20 22 20 20 20 20 20 20 20  \n".    "       
dcd0: 41 4e 44 20 6e 61 6d 65 3c 3e 27 73 65 6c 66 74  AND name<>'selft
dce0: 65 73 74 27 5c 6e 22 0a 20 20 20 20 22 20 20 20  est'\n".    "   
dcf0: 20 20 20 20 41 4e 44 20 63 6f 61 6c 65 73 63 65      AND coalesce
dd00: 28 72 6f 6f 74 70 61 67 65 2c 30 29 3e 30 5c 6e  (rootpage,0)>0\n
dd10: 22 0a 20 20 20 20 22 20 20 29 5c 6e 22 0a 20 20  ".    "  )\n".  
dd20: 20 20 22 20 4f 52 44 45 52 20 42 59 20 6e 61 6d    " ORDER BY nam
dd30: 65 3b 5c 6e 22 0a 20 20 20 20 22 49 4e 53 45 52  e;\n".    "INSER
dd40: 54 20 49 4e 54 4f 20 5b 5f 73 68 65 6c 6c 24 73  T INTO [_shell$s
dd50: 65 6c 66 5d 5c 6e 22 0a 20 20 20 20 22 20 20 56  elf]\n".    "  V
dd60: 41 4c 55 45 53 28 27 72 75 6e 27 2c 27 50 52 41  ALUES('run','PRA
dd70: 47 4d 41 20 69 6e 74 65 67 72 69 74 79 5f 63 68  GMA integrity_ch
dd80: 65 63 6b 27 2c 27 6f 6b 27 29 3b 5c 6e 22 0a 20  eck','ok');\n". 
dd90: 20 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20     "INSERT INTO 
dda0: 73 65 6c 66 74 65 73 74 28 74 6e 6f 2c 6f 70 2c  selftest(tno,op,
ddb0: 63 6d 64 2c 61 6e 73 29 22 0a 20 20 20 20 22 20  cmd,ans)".    " 
ddc0: 20 53 45 4c 45 43 54 20 72 6f 77 69 64 2a 31 30   SELECT rowid*10
ddd0: 2c 6f 70 2c 63 6d 64 2c 61 6e 73 20 46 52 4f 4d  ,op,cmd,ans FROM
dde0: 20 5b 5f 73 68 65 6c 6c 24 73 65 6c 66 5d 3b 5c   [_shell$self];\
ddf0: 6e 22 0a 20 20 20 20 22 44 52 4f 50 20 54 41 42  n".    "DROP TAB
de00: 4c 45 20 5b 5f 73 68 65 6c 6c 24 73 65 6c 66 5d  LE [_shell$self]
de10: 3b 22 0a 20 20 20 20 2c 30 2c 30 2c 26 7a 45 72  ;".    ,0,0,&zEr
de20: 72 4d 73 67 29 3b 0a 20 20 69 66 28 20 7a 45 72  rMsg);.  if( zEr
de30: 72 4d 73 67 20 29 7b 0a 20 20 20 20 75 74 66 38  rMsg ){.    utf8
de40: 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
de50: 22 53 45 4c 46 54 45 53 54 20 69 6e 69 74 69 61  "SELFTEST initia
de60: 6c 69 7a 61 74 69 6f 6e 20 66 61 69 6c 75 72 65  lization failure
de70: 3a 20 25 73 5c 6e 22 2c 20 7a 45 72 72 4d 73 67  : %s\n", zErrMsg
de80: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
de90: 72 65 65 28 7a 45 72 72 4d 73 67 29 3b 0a 20 20  ree(zErrMsg);.  
dea0: 7d 0a 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63  }.  sqlite3_exec
deb0: 28 70 2d 3e 64 62 2c 20 22 52 45 4c 45 41 53 45  (p->db, "RELEASE
dec0: 20 73 65 6c 66 74 65 73 74 5f 69 6e 69 74 22 2c   selftest_init",
ded0: 30 2c 30 2c 30 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  0,0,0);.}.../*.*
dee0: 2a 20 53 65 74 20 74 68 65 20 64 65 73 74 69 6e  * Set the destin
def0: 61 74 69 6f 6e 20 74 61 62 6c 65 20 66 69 65 6c  ation table fiel
df00: 64 20 6f 66 20 74 68 65 20 53 68 65 6c 6c 53 74  d of the ShellSt
df10: 61 74 65 20 73 74 72 75 63 74 75 72 65 20 74 6f  ate structure to
df20: 0a 2a 2a 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  .** the name of 
df30: 74 68 65 20 74 61 62 6c 65 20 67 69 76 65 6e 2e  the table given.
df40: 20 20 45 73 63 61 70 65 20 61 6e 79 20 71 75 6f    Escape any quo
df50: 74 65 20 63 68 61 72 61 63 74 65 72 73 20 69 6e  te characters in
df60: 20 74 68 65 0a 2a 2a 20 74 61 62 6c 65 20 6e 61   the.** table na
df70: 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  me..*/.static vo
df80: 69 64 20 73 65 74 5f 74 61 62 6c 65 5f 6e 61 6d  id set_table_nam
df90: 65 28 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 2c  e(ShellState *p,
dfa0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
dfb0: 6d 65 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6e 3b  me){.  int i, n;
dfc0: 0a 20 20 63 68 61 72 20 63 51 75 6f 74 65 3b 0a  .  char cQuote;.
dfd0: 20 20 63 68 61 72 20 2a 7a 3b 0a 0a 20 20 69 66    char *z;..  if
dfe0: 28 20 70 2d 3e 7a 44 65 73 74 54 61 62 6c 65 20  ( p->zDestTable 
dff0: 29 7b 0a 20 20 20 20 66 72 65 65 28 70 2d 3e 7a  ){.    free(p->z
e000: 44 65 73 74 54 61 62 6c 65 29 3b 0a 20 20 20 20  DestTable);.    
e010: 70 2d 3e 7a 44 65 73 74 54 61 62 6c 65 20 3d 20  p->zDestTable = 
e020: 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a 4e 61  0;.  }.  if( zNa
e030: 6d 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  me==0 ) return;.
e040: 20 20 63 51 75 6f 74 65 20 3d 20 71 75 6f 74 65    cQuote = quote
e050: 43 68 61 72 28 7a 4e 61 6d 65 29 3b 0a 20 20 6e  Char(zName);.  n
e060: 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a 4e 61 6d   = strlen30(zNam
e070: 65 29 3b 0a 20 20 69 66 28 20 63 51 75 6f 74 65  e);.  if( cQuote
e080: 20 29 20 6e 20 2b 3d 20 6e 2b 32 3b 0a 20 20 7a   ) n += n+2;.  z
e090: 20 3d 20 70 2d 3e 7a 44 65 73 74 54 61 62 6c 65   = p->zDestTable
e0a0: 20 3d 20 6d 61 6c 6c 6f 63 28 20 6e 2b 31 20 29   = malloc( n+1 )
e0b0: 3b 0a 20 20 69 66 28 20 7a 3d 3d 30 20 29 7b 0a  ;.  if( z==0 ){.
e0c0: 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73      raw_printf(s
e0d0: 74 64 65 72 72 2c 22 45 72 72 6f 72 3a 20 6f 75  tderr,"Error: ou
e0e0: 74 20 6f 66 20 6d 65 6d 6f 72 79 5c 6e 22 29 3b  t of memory\n");
e0f0: 0a 20 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20  .    exit(1);.  
e100: 7d 0a 20 20 6e 20 3d 20 30 3b 0a 20 20 69 66 28  }.  n = 0;.  if(
e110: 20 63 51 75 6f 74 65 20 29 20 7a 5b 6e 2b 2b 5d   cQuote ) z[n++]
e120: 20 3d 20 63 51 75 6f 74 65 3b 0a 20 20 66 6f 72   = cQuote;.  for
e130: 28 69 3d 30 3b 20 7a 4e 61 6d 65 5b 69 5d 3b 20  (i=0; zName[i]; 
e140: 69 2b 2b 29 7b 0a 20 20 20 20 7a 5b 6e 2b 2b 5d  i++){.    z[n++]
e150: 20 3d 20 7a 4e 61 6d 65 5b 69 5d 3b 0a 20 20 20   = zName[i];.   
e160: 20 69 66 28 20 7a 4e 61 6d 65 5b 69 5d 3d 3d 63   if( zName[i]==c
e170: 51 75 6f 74 65 20 29 20 7a 5b 6e 2b 2b 5d 20 3d  Quote ) z[n++] =
e180: 20 63 51 75 6f 74 65 3b 0a 20 20 7d 0a 20 20 69   cQuote;.  }.  i
e190: 66 28 20 63 51 75 6f 74 65 20 29 20 7a 5b 6e 2b  f( cQuote ) z[n+
e1a0: 2b 5d 20 3d 20 63 51 75 6f 74 65 3b 0a 20 20 7a  +] = cQuote;.  z
e1b0: 5b 6e 5d 20 3d 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a  [n] = 0;.}.../*.
e1c0: 2a 2a 20 45 78 65 63 75 74 65 20 61 20 71 75 65  ** Execute a que
e1d0: 72 79 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61  ry statement tha
e1e0: 74 20 77 69 6c 6c 20 67 65 6e 65 72 61 74 65 20  t will generate 
e1f0: 53 51 4c 20 6f 75 74 70 75 74 2e 20 20 50 72 69  SQL output.  Pri
e200: 6e 74 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74  nt.** the result
e210: 20 63 6f 6c 75 6d 6e 73 2c 20 63 6f 6d 6d 61 2d   columns, comma-
e220: 73 65 70 61 72 61 74 65 64 2c 20 6f 6e 20 61 20  separated, on a 
e230: 6c 69 6e 65 20 61 6e 64 20 74 68 65 6e 20 61 64  line and then ad
e240: 64 20 61 0a 2a 2a 20 73 65 6d 69 63 6f 6c 6f 6e  d a.** semicolon
e250: 20 74 65 72 6d 69 6e 61 74 6f 72 20 74 6f 20 74   terminator to t
e260: 68 65 20 65 6e 64 20 6f 66 20 74 68 61 74 20 6c  he end of that l
e270: 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ine..**.** If th
e280: 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  e number of colu
e290: 6d 6e 73 20 69 73 20 31 20 61 6e 64 20 74 68 61  mns is 1 and tha
e2a0: 74 20 63 6f 6c 75 6d 6e 20 63 6f 6e 74 61 69 6e  t column contain
e2b0: 73 20 74 65 78 74 20 22 2d 2d 22 0a 2a 2a 20 74  s text "--".** t
e2c0: 68 65 6e 20 77 72 69 74 65 20 74 68 65 20 73 65  hen write the se
e2d0: 6d 69 63 6f 6c 6f 6e 20 6f 6e 20 61 20 73 65 70  micolon on a sep
e2e0: 61 72 61 74 65 20 6c 69 6e 65 2e 20 20 54 68 61  arate line.  Tha
e2f0: 74 20 77 61 79 2c 20 69 66 20 61 0a 2a 2a 20 22  t way, if a.** "
e300: 2d 2d 22 20 63 6f 6d 6d 65 6e 74 20 6f 63 63 75  --" comment occu
e310: 72 73 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  rs at the end of
e320: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 2c 20   the statement, 
e330: 74 68 65 20 63 6f 6d 6d 65 6e 74 0a 2a 2a 20 77  the comment.** w
e340: 6f 6e 27 74 20 63 6f 6e 73 75 6d 65 20 74 68 65  on't consume the
e350: 20 73 65 6d 69 63 6f 6c 6f 6e 20 74 65 72 6d 69   semicolon termi
e360: 6e 61 74 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  nator..*/.static
e370: 20 69 6e 74 20 72 75 6e 5f 74 61 62 6c 65 5f 64   int run_table_d
e380: 75 6d 70 5f 71 75 65 72 79 28 0a 20 20 53 68 65  ump_query(.  She
e390: 6c 6c 53 74 61 74 65 20 2a 70 2c 20 20 20 20 20  llState *p,     
e3a0: 20 20 20 20 20 20 2f 2a 20 51 75 65 72 79 20 63        /* Query c
e3b0: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 63 6f 6e 73  ontext */.  cons
e3c0: 74 20 63 68 61 72 20 2a 7a 53 65 6c 65 63 74 2c  t char *zSelect,
e3d0: 20 20 20 20 20 2f 2a 20 53 45 4c 45 43 54 20 73       /* SELECT s
e3e0: 74 61 74 65 6d 65 6e 74 20 74 6f 20 65 78 74 72  tatement to extr
e3f0: 61 63 74 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20  act content */. 
e400: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69   const char *zFi
e410: 72 73 74 52 6f 77 20 20 20 20 2f 2a 20 50 72 69  rstRow    /* Pri
e420: 6e 74 20 62 65 66 6f 72 65 20 66 69 72 73 74 20  nt before first 
e430: 72 6f 77 2c 20 69 66 20 6e 6f 74 20 4e 55 4c 4c  row, if not NULL
e440: 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
e450: 5f 73 74 6d 74 20 2a 70 53 65 6c 65 63 74 3b 0a  _stmt *pSelect;.
e460: 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20    int rc;.  int 
e470: 6e 52 65 73 75 6c 74 3b 0a 20 20 69 6e 74 20 69  nResult;.  int i
e480: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
e490: 7a 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  z;.  rc = sqlite
e4a0: 33 5f 70 72 65 70 61 72 65 5f 76 32 28 70 2d 3e  3_prepare_v2(p->
e4b0: 64 62 2c 20 7a 53 65 6c 65 63 74 2c 20 2d 31 2c  db, zSelect, -1,
e4c0: 20 26 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20   &pSelect, 0);. 
e4d0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
e4e0: 4f 4b 20 7c 7c 20 21 70 53 65 6c 65 63 74 20 29  OK || !pSelect )
e4f0: 7b 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74  {.    utf8_print
e500: 66 28 70 2d 3e 6f 75 74 2c 20 22 2f 2a 2a 2a 2a  f(p->out, "/****
e510: 20 45 52 52 4f 52 3a 20 28 25 64 29 20 25 73 20   ERROR: (%d) %s 
e520: 2a 2a 2a 2a 2a 2f 5c 6e 22 2c 20 72 63 2c 0a 20  *****/\n", rc,. 
e530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
e540: 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 2d  qlite3_errmsg(p-
e550: 3e 64 62 29 29 3b 0a 20 20 20 20 69 66 28 20 28  >db));.    if( (
e560: 72 63 26 30 78 66 66 29 21 3d 53 51 4c 49 54 45  rc&0xff)!=SQLITE
e570: 5f 43 4f 52 52 55 50 54 20 29 20 70 2d 3e 6e 45  _CORRUPT ) p->nE
e580: 72 72 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e  rr++;.    return
e590: 20 72 63 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20   rc;.  }.  rc = 
e5a0: 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 65  sqlite3_step(pSe
e5b0: 6c 65 63 74 29 3b 0a 20 20 6e 52 65 73 75 6c 74  lect);.  nResult
e5c0: 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
e5d0: 6e 5f 63 6f 75 6e 74 28 70 53 65 6c 65 63 74 29  n_count(pSelect)
e5e0: 3b 0a 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53  ;.  while( rc==S
e5f0: 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20  QLITE_ROW ){.   
e600: 20 69 66 28 20 7a 46 69 72 73 74 52 6f 77 20 29   if( zFirstRow )
e610: 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69  {.      utf8_pri
e620: 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22  ntf(p->out, "%s"
e630: 2c 20 7a 46 69 72 73 74 52 6f 77 29 3b 0a 20 20  , zFirstRow);.  
e640: 20 20 20 20 7a 46 69 72 73 74 52 6f 77 20 3d 20      zFirstRow = 
e650: 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 20 3d  0;.    }.    z =
e660: 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71   (const char*)sq
e670: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
e680: 74 28 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20  t(pSelect, 0);. 
e690: 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70     utf8_printf(p
e6a0: 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20 7a 29 3b  ->out, "%s", z);
e6b0: 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c  .    for(i=1; i<
e6c0: 6e 52 65 73 75 6c 74 3b 20 69 2b 2b 29 7b 0a 20  nResult; i++){. 
e6d0: 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
e6e0: 28 70 2d 3e 6f 75 74 2c 20 22 2c 25 73 22 2c 20  (p->out, ",%s", 
e6f0: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
e700: 65 78 74 28 70 53 65 6c 65 63 74 2c 20 69 29 29  ext(pSelect, i))
e710: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
e720: 7a 3d 3d 30 20 29 20 7a 20 3d 20 22 22 3b 0a 20  z==0 ) z = "";. 
e730: 20 20 20 77 68 69 6c 65 28 20 7a 5b 30 5d 20 26     while( z[0] &
e740: 26 20 28 7a 5b 30 5d 21 3d 27 2d 27 20 7c 7c 20  & (z[0]!='-' || 
e750: 7a 5b 31 5d 21 3d 27 2d 27 29 20 29 20 7a 2b 2b  z[1]!='-') ) z++
e760: 3b 0a 20 20 20 20 69 66 28 20 7a 5b 30 5d 20 29  ;.    if( z[0] )
e770: 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e  {.      raw_prin
e780: 74 66 28 70 2d 3e 6f 75 74 2c 20 22 5c 6e 3b 5c  tf(p->out, "\n;\
e790: 6e 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  n");.    }else{.
e7a0: 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
e7b0: 28 70 2d 3e 6f 75 74 2c 20 22 3b 5c 6e 22 29 3b  (p->out, ";\n");
e7c0: 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
e7d0: 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 65  sqlite3_step(pSe
e7e0: 6c 65 63 74 29 3b 0a 20 20 7d 0a 20 20 72 63 20  lect);.  }.  rc 
e7f0: 3d 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69  = sqlite3_finali
e800: 7a 65 28 70 53 65 6c 65 63 74 29 3b 0a 20 20 69  ze(pSelect);.  i
e810: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
e820: 20 29 7b 0a 20 20 20 20 75 74 66 38 5f 70 72 69   ){.    utf8_pri
e830: 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 2f 2a 2a  ntf(p->out, "/**
e840: 2a 2a 20 45 52 52 4f 52 3a 20 28 25 64 29 20 25  ** ERROR: (%d) %
e850: 73 20 2a 2a 2a 2a 2a 2f 5c 6e 22 2c 20 72 63 2c  s *****/\n", rc,
e860: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
e870: 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
e880: 70 2d 3e 64 62 29 29 3b 0a 20 20 20 20 69 66 28  p->db));.    if(
e890: 20 28 72 63 26 30 78 66 66 29 21 3d 53 51 4c 49   (rc&0xff)!=SQLI
e8a0: 54 45 5f 43 4f 52 52 55 50 54 20 29 20 70 2d 3e  TE_CORRUPT ) p->
e8b0: 6e 45 72 72 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65  nErr++;.  }.  re
e8c0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
e8d0: 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65  * Allocate space
e8e0: 20 61 6e 64 20 73 61 76 65 20 6f 66 66 20 63 75   and save off cu
e8f0: 72 72 65 6e 74 20 65 72 72 6f 72 20 73 74 72 69  rrent error stri
e900: 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68  ng..*/.static ch
e910: 61 72 20 2a 73 61 76 65 5f 65 72 72 5f 6d 73 67  ar *save_err_msg
e920: 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  (.  sqlite3 *db 
e930: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
e940: 74 61 62 61 73 65 20 74 6f 20 71 75 65 72 79 20  tabase to query 
e950: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 45 72 72  */.){.  int nErr
e960: 4d 73 67 20 3d 20 31 2b 73 74 72 6c 65 6e 33 30  Msg = 1+strlen30
e970: 28 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28  (sqlite3_errmsg(
e980: 64 62 29 29 3b 0a 20 20 63 68 61 72 20 2a 7a 45  db));.  char *zE
e990: 72 72 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f  rrMsg = sqlite3_
e9a0: 6d 61 6c 6c 6f 63 36 34 28 6e 45 72 72 4d 73 67  malloc64(nErrMsg
e9b0: 29 3b 0a 20 20 69 66 28 20 7a 45 72 72 4d 73 67  );.  if( zErrMsg
e9c0: 20 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a   ){.    memcpy(z
e9d0: 45 72 72 4d 73 67 2c 20 73 71 6c 69 74 65 33 5f  ErrMsg, sqlite3_
e9e0: 65 72 72 6d 73 67 28 64 62 29 2c 20 6e 45 72 72  errmsg(db), nErr
e9f0: 4d 73 67 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Msg);.  }.  retu
ea00: 72 6e 20 7a 45 72 72 4d 73 67 3b 0a 7d 0a 0a 23  rn zErrMsg;.}..#
ea10: 69 66 64 65 66 20 5f 5f 6c 69 6e 75 78 5f 5f 0a  ifdef __linux__.
ea20: 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f  /*.** Attempt to
ea30: 20 64 69 73 70 6c 61 79 20 49 2f 4f 20 73 74 61   display I/O sta
ea40: 74 73 20 6f 6e 20 4c 69 6e 75 78 20 75 73 69 6e  ts on Linux usin
ea50: 67 20 2f 70 72 6f 63 2f 50 49 44 2f 69 6f 0a 2a  g /proc/PID/io.*
ea60: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64 69  /.static void di
ea70: 73 70 6c 61 79 4c 69 6e 75 78 49 6f 53 74 61 74  splayLinuxIoStat
ea80: 73 28 46 49 4c 45 20 2a 6f 75 74 29 7b 0a 20 20  s(FILE *out){.  
ea90: 46 49 4c 45 20 2a 69 6e 3b 0a 20 20 63 68 61 72  FILE *in;.  char
eaa0: 20 7a 5b 32 30 30 5d 3b 0a 20 20 73 71 6c 69 74   z[200];.  sqlit
eab0: 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
eac0: 6f 66 28 7a 29 2c 20 7a 2c 20 22 2f 70 72 6f 63  of(z), z, "/proc
ead0: 2f 25 64 2f 69 6f 22 2c 20 67 65 74 70 69 64 28  /%d/io", getpid(
eae0: 29 29 3b 0a 20 20 69 6e 20 3d 20 66 6f 70 65 6e  ));.  in = fopen
eaf0: 28 7a 2c 20 22 72 62 22 29 3b 0a 20 20 69 66 28  (z, "rb");.  if(
eb00: 20 69 6e 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b   in==0 ) return;
eb10: 0a 20 20 77 68 69 6c 65 28 20 66 67 65 74 73 28  .  while( fgets(
eb20: 7a 2c 20 73 69 7a 65 6f 66 28 7a 29 2c 20 69 6e  z, sizeof(z), in
eb30: 29 21 3d 30 20 29 7b 0a 20 20 20 20 73 74 61 74  )!=0 ){.    stat
eb40: 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20  ic const struct 
eb50: 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  {.      const ch
eb60: 61 72 20 2a 7a 50 61 74 74 65 72 6e 3b 0a 20 20  ar *zPattern;.  
eb70: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
eb80: 7a 44 65 73 63 3b 0a 20 20 20 20 7d 20 61 54 72  zDesc;.    } aTr
eb90: 61 6e 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20  ans[] = {.      
eba0: 7b 20 22 72 63 68 61 72 3a 20 22 2c 20 20 20 20  { "rchar: ",    
ebb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 42                "B
ebc0: 79 74 65 73 20 72 65 63 65 69 76 65 64 20 62 79  ytes received by
ebd0: 20 72 65 61 64 28 29 3a 22 20 7d 2c 0a 20 20 20   read():" },.   
ebe0: 20 20 20 7b 20 22 77 63 68 61 72 3a 20 22 2c 20     { "wchar: ", 
ebf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ec00: 20 22 42 79 74 65 73 20 73 65 6e 74 20 74 6f 20   "Bytes sent to 
ec10: 77 72 69 74 65 28 29 3a 22 20 20 20 20 7d 2c 0a  write():"    },.
ec20: 20 20 20 20 20 20 7b 20 22 73 79 73 63 72 3a 20        { "syscr: 
ec30: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
ec40: 20 20 20 20 22 52 65 61 64 28 29 20 73 79 73 74      "Read() syst
ec50: 65 6d 20 63 61 6c 6c 73 3a 22 20 20 20 20 20 20  em calls:"      
ec60: 7d 2c 0a 20 20 20 20 20 20 7b 20 22 73 79 73 63  },.      { "sysc
ec70: 77 3a 20 22 2c 20 20 20 20 20 20 20 20 20 20 20  w: ",           
ec80: 20 20 20 20 20 20 20 22 57 72 69 74 65 28 29 20         "Write() 
ec90: 73 79 73 74 65 6d 20 63 61 6c 6c 73 3a 22 20 20  system calls:"  
eca0: 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 72     },.      { "r
ecb0: 65 61 64 5f 62 79 74 65 73 3a 20 22 2c 20 20 20  ead_bytes: ",   
ecc0: 20 20 20 20 20 20 20 20 20 20 22 42 79 74 65 73            "Bytes
ecd0: 20 72 65 61 64 20 66 72 6f 6d 20 73 74 6f 72 61   read from stora
ece0: 67 65 3a 22 20 20 7d 2c 0a 20 20 20 20 20 20 7b  ge:"  },.      {
ecf0: 20 22 77 72 69 74 65 5f 62 79 74 65 73 3a 20 22   "write_bytes: "
ed00: 2c 20 20 20 20 20 20 20 20 20 20 20 20 22 42 79  ,            "By
ed10: 74 65 73 20 77 72 69 74 74 65 6e 20 74 6f 20 73  tes written to s
ed20: 74 6f 72 61 67 65 3a 22 20 7d 2c 0a 20 20 20 20  torage:" },.    
ed30: 20 20 7b 20 22 63 61 6e 63 65 6c 6c 65 64 5f 77    { "cancelled_w
ed40: 72 69 74 65 5f 62 79 74 65 73 3a 20 22 2c 20 20  rite_bytes: ",  
ed50: 22 43 61 6e 63 65 6c 6c 65 64 20 77 72 69 74 65  "Cancelled write
ed60: 20 62 79 74 65 73 3a 22 20 20 20 20 7d 2c 0a 20   bytes:"    },. 
ed70: 20 20 20 7d 3b 0a 20 20 20 20 69 6e 74 20 69 3b     };.    int i;
ed80: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
ed90: 41 72 72 61 79 53 69 7a 65 28 61 54 72 61 6e 73  ArraySize(aTrans
eda0: 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  ); i++){.      i
edb0: 6e 74 20 6e 20 3d 20 73 74 72 6c 65 6e 33 30 28  nt n = strlen30(
edc0: 61 54 72 61 6e 73 5b 69 5d 2e 7a 50 61 74 74 65  aTrans[i].zPatte
edd0: 72 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73  rn);.      if( s
ede0: 74 72 6e 63 6d 70 28 61 54 72 61 6e 73 5b 69 5d  trncmp(aTrans[i]
edf0: 2e 7a 50 61 74 74 65 72 6e 2c 20 7a 2c 20 6e 29  .zPattern, z, n)
ee00: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 75  ==0 ){.        u
ee10: 74 66 38 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20  tf8_printf(out, 
ee20: 22 25 2d 33 36 73 20 25 73 22 2c 20 61 54 72 61  "%-36s %s", aTra
ee30: 6e 73 5b 69 5d 2e 7a 44 65 73 63 2c 20 26 7a 5b  ns[i].zDesc, &z[
ee40: 6e 5d 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  n]);.        bre
ee50: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
ee60: 7d 0a 20 20 7d 0a 20 20 66 63 6c 6f 73 65 28 69  }.  }.  fclose(i
ee70: 6e 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  n);.}.#endif../*
ee80: 0a 2a 2a 20 44 69 73 70 6c 61 79 20 61 20 73 69  .** Display a si
ee90: 6e 67 6c 65 20 6c 69 6e 65 20 6f 66 20 73 74 61  ngle line of sta
eea0: 74 75 73 20 75 73 69 6e 67 20 36 34 2d 62 69 74  tus using 64-bit
eeb0: 20 76 61 6c 75 65 73 2e 0a 2a 2f 0a 73 74 61 74   values..*/.stat
eec0: 69 63 20 76 6f 69 64 20 64 69 73 70 6c 61 79 53  ic void displayS
eed0: 74 61 74 4c 69 6e 65 28 0a 20 20 53 68 65 6c 6c  tatLine(.  Shell
eee0: 53 74 61 74 65 20 2a 70 2c 20 20 20 20 20 20 20  State *p,       
eef0: 20 20 20 20 20 2f 2a 20 54 68 65 20 73 68 65 6c       /* The shel
ef00: 6c 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 63  l context */.  c
ef10: 68 61 72 20 2a 7a 4c 61 62 65 6c 2c 20 20 20 20  har *zLabel,    
ef20: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 62 65           /* Labe
ef30: 6c 20 66 6f 72 20 74 68 69 73 20 6f 6e 65 20 6c  l for this one l
ef40: 69 6e 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ine */.  char *z
ef50: 46 6f 72 6d 61 74 2c 20 20 20 20 20 20 20 20 20  Format,         
ef60: 20 20 20 2f 2a 20 46 6f 72 6d 61 74 20 66 6f 72     /* Format for
ef70: 20 74 68 65 20 72 65 73 75 6c 74 20 2a 2f 0a 20   the result */. 
ef80: 20 69 6e 74 20 69 53 74 61 74 75 73 43 74 72 6c   int iStatusCtrl
ef90: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68  ,          /* Wh
efa0: 69 63 68 20 73 74 61 74 75 73 20 74 6f 20 64 69  ich status to di
efb0: 73 70 6c 61 79 20 2a 2f 0a 20 20 69 6e 74 20 62  splay */.  int b
efc0: 52 65 73 65 74 20 20 20 20 20 20 20 20 20 20 20  Reset           
efd0: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20       /* True to 
efe0: 72 65 73 65 74 20 74 68 65 20 73 74 61 74 73 20  reset the stats 
eff0: 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  */.){.  sqlite3_
f000: 69 6e 74 36 34 20 69 43 75 72 20 3d 20 2d 31 3b  int64 iCur = -1;
f010: 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
f020: 20 69 48 69 77 74 72 20 3d 20 2d 31 3b 0a 20 20   iHiwtr = -1;.  
f030: 69 6e 74 20 69 2c 20 6e 50 65 72 63 65 6e 74 3b  int i, nPercent;
f040: 0a 20 20 63 68 61 72 20 7a 4c 69 6e 65 5b 32 30  .  char zLine[20
f050: 30 5d 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  0];.  sqlite3_st
f060: 61 74 75 73 36 34 28 69 53 74 61 74 75 73 43 74  atus64(iStatusCt
f070: 72 6c 2c 20 26 69 43 75 72 2c 20 26 69 48 69 77  rl, &iCur, &iHiw
f080: 74 72 2c 20 62 52 65 73 65 74 29 3b 0a 20 20 66  tr, bReset);.  f
f090: 6f 72 28 69 3d 30 2c 20 6e 50 65 72 63 65 6e 74  or(i=0, nPercent
f0a0: 3d 30 3b 20 7a 46 6f 72 6d 61 74 5b 69 5d 3b 20  =0; zFormat[i]; 
f0b0: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 7a 46  i++){.    if( zF
f0c0: 6f 72 6d 61 74 5b 69 5d 3d 3d 27 25 27 20 29 20  ormat[i]=='%' ) 
f0d0: 6e 50 65 72 63 65 6e 74 2b 2b 3b 0a 20 20 7d 0a  nPercent++;.  }.
f0e0: 20 20 69 66 28 20 6e 50 65 72 63 65 6e 74 3e 31    if( nPercent>1
f0f0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
f100: 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
f110: 7a 4c 69 6e 65 29 2c 20 7a 4c 69 6e 65 2c 20 7a  zLine), zLine, z
f120: 46 6f 72 6d 61 74 2c 20 69 43 75 72 2c 20 69 48  Format, iCur, iH
f130: 69 77 74 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  iwtr);.  }else{.
f140: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
f150: 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 4c 69 6e  intf(sizeof(zLin
f160: 65 29 2c 20 7a 4c 69 6e 65 2c 20 7a 46 6f 72 6d  e), zLine, zForm
f170: 61 74 2c 20 69 48 69 77 74 72 29 3b 0a 20 20 7d  at, iHiwtr);.  }
f180: 0a 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d  .  raw_printf(p-
f190: 3e 6f 75 74 2c 20 22 25 2d 33 36 73 20 25 73 5c  >out, "%-36s %s\
f1a0: 6e 22 2c 20 7a 4c 61 62 65 6c 2c 20 7a 4c 69 6e  n", zLabel, zLin
f1b0: 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69 73  e);.}../*.** Dis
f1c0: 70 6c 61 79 20 6d 65 6d 6f 72 79 20 73 74 61 74  play memory stat
f1d0: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
f1e0: 20 64 69 73 70 6c 61 79 5f 73 74 61 74 73 28 0a   display_stats(.
f1f0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20    sqlite3 *db,  
f200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
f210: 20 44 61 74 61 62 61 73 65 20 74 6f 20 71 75 65   Database to que
f220: 72 79 20 2a 2f 0a 20 20 53 68 65 6c 6c 53 74 61  ry */.  ShellSta
f230: 74 65 20 2a 70 41 72 67 2c 20 20 20 20 20 20 20  te *pArg,       
f240: 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
f250: 6f 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 2f 0a  o ShellState */.
f260: 20 20 69 6e 74 20 62 52 65 73 65 74 20 20 20 20    int bReset    
f270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
f280: 20 54 72 75 65 20 74 6f 20 72 65 73 65 74 20 74   True to reset t
f290: 68 65 20 73 74 61 74 73 20 2a 2f 0a 29 7b 0a 20  he stats */.){. 
f2a0: 20 69 6e 74 20 69 43 75 72 3b 0a 20 20 69 6e 74   int iCur;.  int
f2b0: 20 69 48 69 77 74 72 3b 0a 0a 20 20 69 66 28 20   iHiwtr;..  if( 
f2c0: 70 41 72 67 20 26 26 20 70 41 72 67 2d 3e 6f 75  pArg && pArg->ou
f2d0: 74 20 29 7b 0a 20 20 20 20 64 69 73 70 6c 61 79  t ){.    display
f2e0: 53 74 61 74 4c 69 6e 65 28 70 41 72 67 2c 20 22  StatLine(pArg, "
f2f0: 4d 65 6d 6f 72 79 20 55 73 65 64 3a 22 2c 0a 20  Memory Used:",. 
f300: 20 20 20 20 20 20 22 25 6c 6c 64 20 28 6d 61 78        "%lld (max
f310: 20 25 6c 6c 64 29 20 62 79 74 65 73 22 2c 20 53   %lld) bytes", S
f320: 51 4c 49 54 45 5f 53 54 41 54 55 53 5f 4d 45 4d  QLITE_STATUS_MEM
f330: 4f 52 59 5f 55 53 45 44 2c 20 62 52 65 73 65 74  ORY_USED, bReset
f340: 29 3b 0a 20 20 20 20 64 69 73 70 6c 61 79 53 74  );.    displaySt
f350: 61 74 4c 69 6e 65 28 70 41 72 67 2c 20 22 4e 75  atLine(pArg, "Nu
f360: 6d 62 65 72 20 6f 66 20 4f 75 74 73 74 61 6e 64  mber of Outstand
f370: 69 6e 67 20 41 6c 6c 6f 63 61 74 69 6f 6e 73 3a  ing Allocations:
f380: 22 2c 0a 20 20 20 20 20 20 20 22 25 6c 6c 64 20  ",.       "%lld 
f390: 28 6d 61 78 20 25 6c 6c 64 29 22 2c 20 53 51 4c  (max %lld)", SQL
f3a0: 49 54 45 5f 53 54 41 54 55 53 5f 4d 41 4c 4c 4f  ITE_STATUS_MALLO
f3b0: 43 5f 43 4f 55 4e 54 2c 20 62 52 65 73 65 74 29  C_COUNT, bReset)
f3c0: 3b 0a 20 20 20 20 69 66 28 20 70 41 72 67 2d 3e  ;.    if( pArg->
f3d0: 73 68 65 6c 6c 46 6c 67 73 20 26 20 53 48 46 4c  shellFlgs & SHFL
f3e0: 47 5f 50 61 67 65 63 61 63 68 65 20 29 7b 0a 20  G_Pagecache ){. 
f3f0: 20 20 20 20 20 64 69 73 70 6c 61 79 53 74 61 74       displayStat
f400: 4c 69 6e 65 28 70 41 72 67 2c 20 22 4e 75 6d 62  Line(pArg, "Numb
f410: 65 72 20 6f 66 20 50 63 61 63 68 65 20 50 61 67  er of Pcache Pag
f420: 65 73 20 55 73 65 64 3a 22 2c 0a 20 20 20 20 20  es Used:",.     
f430: 20 20 20 20 22 25 6c 6c 64 20 28 6d 61 78 20 25      "%lld (max %
f440: 6c 6c 64 29 20 70 61 67 65 73 22 2c 20 53 51 4c  lld) pages", SQL
f450: 49 54 45 5f 53 54 41 54 55 53 5f 50 41 47 45 43  ITE_STATUS_PAGEC
f460: 41 43 48 45 5f 55 53 45 44 2c 20 62 52 65 73 65  ACHE_USED, bRese
f470: 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 69  t);.    }.    di
f480: 73 70 6c 61 79 53 74 61 74 4c 69 6e 65 28 70 41  splayStatLine(pA
f490: 72 67 2c 20 22 4e 75 6d 62 65 72 20 6f 66 20 50  rg, "Number of P
f4a0: 63 61 63 68 65 20 4f 76 65 72 66 6c 6f 77 20 42  cache Overflow B
f4b0: 79 74 65 73 3a 22 2c 0a 20 20 20 20 20 20 20 22  ytes:",.       "
f4c0: 25 6c 6c 64 20 28 6d 61 78 20 25 6c 6c 64 29 20  %lld (max %lld) 
f4d0: 62 79 74 65 73 22 2c 20 53 51 4c 49 54 45 5f 53  bytes", SQLITE_S
f4e0: 54 41 54 55 53 5f 50 41 47 45 43 41 43 48 45 5f  TATUS_PAGECACHE_
f4f0: 4f 56 45 52 46 4c 4f 57 2c 20 62 52 65 73 65 74  OVERFLOW, bReset
f500: 29 3b 0a 20 20 20 20 64 69 73 70 6c 61 79 53 74  );.    displaySt
f510: 61 74 4c 69 6e 65 28 70 41 72 67 2c 20 22 4c 61  atLine(pArg, "La
f520: 72 67 65 73 74 20 41 6c 6c 6f 63 61 74 69 6f 6e  rgest Allocation
f530: 3a 22 2c 0a 20 20 20 20 20 20 20 22 25 6c 6c 64  :",.       "%lld
f540: 20 62 79 74 65 73 22 2c 20 53 51 4c 49 54 45 5f   bytes", SQLITE_
f550: 53 54 41 54 55 53 5f 4d 41 4c 4c 4f 43 5f 53 49  STATUS_MALLOC_SI
f560: 5a 45 2c 20 62 52 65 73 65 74 29 3b 0a 20 20 20  ZE, bReset);.   
f570: 20 64 69 73 70 6c 61 79 53 74 61 74 4c 69 6e 65   displayStatLine
f580: 28 70 41 72 67 2c 20 22 4c 61 72 67 65 73 74 20  (pArg, "Largest 
f590: 50 63 61 63 68 65 20 41 6c 6c 6f 63 61 74 69 6f  Pcache Allocatio
f5a0: 6e 3a 22 2c 0a 20 20 20 20 20 20 20 22 25 6c 6c  n:",.       "%ll
f5b0: 64 20 62 79 74 65 73 22 2c 20 53 51 4c 49 54 45  d bytes", SQLITE
f5c0: 5f 53 54 41 54 55 53 5f 50 41 47 45 43 41 43 48  _STATUS_PAGECACH
f5d0: 45 5f 53 49 5a 45 2c 20 62 52 65 73 65 74 29 3b  E_SIZE, bReset);
f5e0: 0a 23 69 66 64 65 66 20 59 59 54 52 41 43 4b 4d  .#ifdef YYTRACKM
f5f0: 41 58 53 54 41 43 4b 44 45 50 54 48 0a 20 20 20  AXSTACKDEPTH.   
f600: 20 64 69 73 70 6c 61 79 53 74 61 74 4c 69 6e 65   displayStatLine
f610: 28 70 41 72 67 2c 20 22 44 65 65 70 65 73 74 20  (pArg, "Deepest 
f620: 50 61 72 73 65 72 20 53 74 61 63 6b 3a 22 2c 0a  Parser Stack:",.
f630: 20 20 20 20 20 20 20 22 25 6c 6c 64 20 28 6d 61         "%lld (ma
f640: 78 20 25 6c 6c 64 29 22 2c 20 53 51 4c 49 54 45  x %lld)", SQLITE
f650: 5f 53 54 41 54 55 53 5f 50 41 52 53 45 52 5f 53  _STATUS_PARSER_S
f660: 54 41 43 4b 2c 20 62 52 65 73 65 74 29 3b 0a 23  TACK, bReset);.#
f670: 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 69 66 28  endif.  }..  if(
f680: 20 70 41 72 67 20 26 26 20 70 41 72 67 2d 3e 6f   pArg && pArg->o
f690: 75 74 20 26 26 20 64 62 20 29 7b 0a 20 20 20 20  ut && db ){.    
f6a0: 69 66 28 20 70 41 72 67 2d 3e 73 68 65 6c 6c 46  if( pArg->shellF
f6b0: 6c 67 73 20 26 20 53 48 46 4c 47 5f 4c 6f 6f 6b  lgs & SHFLG_Look
f6c0: 61 73 69 64 65 20 29 7b 0a 20 20 20 20 20 20 69  aside ){.      i
f6d0: 48 69 77 74 72 20 3d 20 69 43 75 72 20 3d 20 2d  Hiwtr = iCur = -
f6e0: 31 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  1;.      sqlite3
f6f0: 5f 64 62 5f 73 74 61 74 75 73 28 64 62 2c 20 53  _db_status(db, S
f700: 51 4c 49 54 45 5f 44 42 53 54 41 54 55 53 5f 4c  QLITE_DBSTATUS_L
f710: 4f 4f 4b 41 53 49 44 45 5f 55 53 45 44 2c 0a 20  OOKASIDE_USED,. 
f720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f730: 20 20 20 20 20 20 20 26 69 43 75 72 2c 20 26 69         &iCur, &i
f740: 48 69 77 74 72 2c 20 62 52 65 73 65 74 29 3b 0a  Hiwtr, bReset);.
f750: 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
f760: 28 70 41 72 67 2d 3e 6f 75 74 2c 0a 20 20 20 20  (pArg->out,.    
f770: 20 20 20 20 20 20 20 20 20 20 22 4c 6f 6f 6b 61            "Looka
f780: 73 69 64 65 20 53 6c 6f 74 73 20 55 73 65 64 3a  side Slots Used:
f790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f7a0: 25 64 20 28 6d 61 78 20 25 64 29 5c 6e 22 2c 0a  %d (max %d)\n",.
f7b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 43                iC
f7c0: 75 72 2c 20 69 48 69 77 74 72 29 3b 0a 20 20 20  ur, iHiwtr);.   
f7d0: 20 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 73 74     sqlite3_db_st
f7e0: 61 74 75 73 28 64 62 2c 20 53 51 4c 49 54 45 5f  atus(db, SQLITE_
f7f0: 44 42 53 54 41 54 55 53 5f 4c 4f 4f 4b 41 53 49  DBSTATUS_LOOKASI
f800: 44 45 5f 48 49 54 2c 0a 20 20 20 20 20 20 20 20  DE_HIT,.        
f810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f820: 26 69 43 75 72 2c 20 26 69 48 69 77 74 72 2c 20  &iCur, &iHiwtr, 
f830: 62 52 65 73 65 74 29 3b 0a 20 20 20 20 20 20 72  bReset);.      r
f840: 61 77 5f 70 72 69 6e 74 66 28 70 41 72 67 2d 3e  aw_printf(pArg->
f850: 6f 75 74 2c 20 22 53 75 63 63 65 73 73 66 75 6c  out, "Successful
f860: 20 6c 6f 6f 6b 61 73 69 64 65 20 61 74 74 65 6d   lookaside attem
f870: 70 74 73 3a 20 20 20 20 20 20 20 25 64 5c 6e 22  pts:       %d\n"
f880: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
f890: 69 48 69 77 74 72 29 3b 0a 20 20 20 20 20 20 73  iHiwtr);.      s
f8a0: 71 6c 69 74 65 33 5f 64 62 5f 73 74 61 74 75 73  qlite3_db_status
f8b0: 28 64 62 2c 20 53 51 4c 49 54 45 5f 44 42 53 54  (db, SQLITE_DBST
f8c0: 41 54 55 53 5f 4c 4f 4f 4b 41 53 49 44 45 5f 4d  ATUS_LOOKASIDE_M
f8d0: 49 53 53 5f 53 49 5a 45 2c 0a 20 20 20 20 20 20  ISS_SIZE,.      
f8e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f8f0: 20 20 26 69 43 75 72 2c 20 26 69 48 69 77 74 72    &iCur, &iHiwtr
f900: 2c 20 62 52 65 73 65 74 29 3b 0a 20 20 20 20 20  , bReset);.     
f910: 20 72 61 77 5f 70 72 69 6e 74 66 28 70 41 72 67   raw_printf(pArg
f920: 2d 3e 6f 75 74 2c 20 22 4c 6f 6f 6b 61 73 69 64  ->out, "Lookasid
f930: 65 20 66 61 69 6c 75 72 65 73 20 64 75 65 20 74  e failures due t
f940: 6f 20 73 69 7a 65 3a 20 20 20 20 20 20 25 64 5c  o size:      %d\
f950: 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
f960: 20 20 69 48 69 77 74 72 29 3b 0a 20 20 20 20 20    iHiwtr);.     
f970: 20 73 71 6c 69 74 65 33 5f 64 62 5f 73 74 61 74   sqlite3_db_stat
f980: 75 73 28 64 62 2c 20 53 51 4c 49 54 45 5f 44 42  us(db, SQLITE_DB
f990: 53 54 41 54 55 53 5f 4c 4f 4f 4b 41 53 49 44 45  STATUS_LOOKASIDE
f9a0: 5f 4d 49 53 53 5f 46 55 4c 4c 2c 0a 20 20 20 20  _MISS_FULL,.    
f9b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f9c0: 20 20 20 20 26 69 43 75 72 2c 20 26 69 48 69 77      &iCur, &iHiw
f9d0: 74 72 2c 20 62 52 65 73 65 74 29 3b 0a 20 20 20  tr, bReset);.   
f9e0: 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 41     raw_printf(pA
f9f0: 72 67 2d 3e 6f 75 74 2c 20 22 4c 6f 6f 6b 61 73  rg->out, "Lookas
fa00: 69 64 65 20 66 61 69 6c 75 72 65 73 20 64 75 65  ide failures due
fa10: 20 74 6f 20 4f 4f 4d 3a 20 20 20 20 20 20 20 25   to OOM:       %
fa20: 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  d\n",.          
fa30: 20 20 20 20 69 48 69 77 74 72 29 3b 0a 20 20 20      iHiwtr);.   
fa40: 20 7d 0a 20 20 20 20 69 48 69 77 74 72 20 3d 20   }.    iHiwtr = 
fa50: 69 43 75 72 20 3d 20 2d 31 3b 0a 20 20 20 20 73  iCur = -1;.    s
fa60: 71 6c 69 74 65 33 5f 64 62 5f 73 74 61 74 75 73  qlite3_db_status
fa70: 28 64 62 2c 20 53 51 4c 49 54 45 5f 44 42 53 54  (db, SQLITE_DBST
fa80: 41 54 55 53 5f 43 41 43 48 45 5f 55 53 45 44 2c  ATUS_CACHE_USED,
fa90: 20 26 69 43 75 72 2c 20 26 69 48 69 77 74 72 2c   &iCur, &iHiwtr,
faa0: 20 62 52 65 73 65 74 29 3b 0a 20 20 20 20 72 61   bReset);.    ra
fab0: 77 5f 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f  w_printf(pArg->o
fac0: 75 74 2c 20 22 50 61 67 65 72 20 48 65 61 70 20  ut, "Pager Heap 
fad0: 55 73 61 67 65 3a 20 20 20 20 20 20 20 20 20 20  Usage:          
fae0: 20 20 20 20 20 20 20 20 20 20 25 64 20 62 79 74            %d byt
faf0: 65 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  es\n",.         
fb00: 20 20 20 69 43 75 72 29 3b 0a 20 20 20 20 69 48     iCur);.    iH
fb10: 69 77 74 72 20 3d 20 69 43 75 72 20 3d 20 2d 31  iwtr = iCur = -1
fb20: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 64 62  ;.    sqlite3_db
fb30: 5f 73 74 61 74 75 73 28 64 62 2c 20 53 51 4c 49  _status(db, SQLI
fb40: 54 45 5f 44 42 53 54 41 54 55 53 5f 43 41 43 48  TE_DBSTATUS_CACH
fb50: 45 5f 48 49 54 2c 20 26 69 43 75 72 2c 20 26 69  E_HIT, &iCur, &i
fb60: 48 69 77 74 72 2c 20 31 29 3b 0a 20 20 20 20 72  Hiwtr, 1);.    r
fb70: 61 77 5f 70 72 69 6e 74 66 28 70 41 72 67 2d 3e  aw_printf(pArg->
fb80: 6f 75 74 2c 20 22 50 61 67 65 20 63 61 63 68 65  out, "Page cache
fb90: 20 68 69 74 73 3a 20 20 20 20 20 20 20 20 20 20   hits:          
fba0: 20 20 20 20 20 20 20 20 20 20 20 25 64 5c 6e 22             %d\n"
fbb0: 2c 20 69 43 75 72 29 3b 0a 20 20 20 20 69 48 69  , iCur);.    iHi
fbc0: 77 74 72 20 3d 20 69 43 75 72 20 3d 20 2d 31 3b  wtr = iCur = -1;
fbd0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 64 62 5f  .    sqlite3_db_
fbe0: 73 74 61 74 75 73 28 64 62 2c 20 53 51 4c 49 54  status(db, SQLIT
fbf0: 45 5f 44 42 53 54 41 54 55 53 5f 43 41 43 48 45  E_DBSTATUS_CACHE
fc00: 5f 4d 49 53 53 2c 20 26 69 43 75 72 2c 20 26 69  _MISS, &iCur, &i
fc10: 48 69 77 74 72 2c 20 31 29 3b 0a 20 20 20 20 72  Hiwtr, 1);.    r
fc20: 61 77 5f 70 72 69 6e 74 66 28 70 41 72 67 2d 3e  aw_printf(pArg->
fc30: 6f 75 74 2c 20 22 50 61 67 65 20 63 61 63 68 65  out, "Page cache
fc40: 20 6d 69 73 73 65 73 3a 20 20 20 20 20 20 20 20   misses:        
fc50: 20 20 20 20 20 20 20 20 20 20 20 25 64 5c 6e 22             %d\n"
fc60: 2c 20 69 43 75 72 29 3b 0a 20 20 20 20 69 48 69  , iCur);.    iHi
fc70: 77 74 72 20 3d 20 69 43 75 72 20 3d 20 2d 31 3b  wtr = iCur = -1;
fc80: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 64 62 5f  .    sqlite3_db_
fc90: 73 74 61 74 75 73 28 64 62 2c 20 53 51 4c 49 54  status(db, SQLIT
fca0: 45 5f 44 42 53 54 41 54 55 53 5f 43 41 43 48 45  E_DBSTATUS_CACHE
fcb0: 5f 57 52 49 54 45 2c 20 26 69 43 75 72 2c 20 26  _WRITE, &iCur, &
fcc0: 69 48 69 77 74 72 2c 20 31 29 3b 0a 20 20 20 20  iHiwtr, 1);.    
fcd0: 72 61 77 5f 70 72 69 6e 74 66 28 70 41 72 67 2d  raw_printf(pArg-
fce0: 3e 6f 75 74 2c 20 22 50 61 67 65 20 63 61 63 68  >out, "Page cach
fcf0: 65 20 77 72 69 74 65 73 3a 20 20 20 20 20 20 20  e writes:       
fd00: 20 20 20 20 20 20 20 20 20 20 20 20 25 64 5c 6e              %d\n
fd10: 22 2c 20 69 43 75 72 29 3b 0a 20 20 20 20 69 48  ", iCur);.    iH
fd20: 69 77 74 72 20 3d 20 69 43 75 72 20 3d 20 2d 31  iwtr = iCur = -1
fd30: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 64 62  ;.    sqlite3_db
fd40: 5f 73 74 61 74 75 73 28 64 62 2c 20 53 51 4c 49  _status(db, SQLI
fd50: 54 45 5f 44 42 53 54 41 54 55 53 5f 53 43 48 45  TE_DBSTATUS_SCHE
fd60: 4d 41 5f 55 53 45 44 2c 20 26 69 43 75 72 2c 20  MA_USED, &iCur, 
fd70: 26 69 48 69 77 74 72 2c 20 62 52 65 73 65 74 29  &iHiwtr, bReset)
fd80: 3b 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66  ;.    raw_printf
fd90: 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22 53 63 68  (pArg->out, "Sch
fda0: 65 6d 61 20 48 65 61 70 20 55 73 61 67 65 3a 20  ema Heap Usage: 
fdb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fdc0: 20 20 25 64 20 62 79 74 65 73 5c 6e 22 2c 0a 20    %d bytes\n",. 
fdd0: 20 20 20 20 20 20 20 20 20 20 20 69 43 75 72 29             iCur)
fde0: 3b 0a 20 20 20 20 69 48 69 77 74 72 20 3d 20 69  ;.    iHiwtr = i
fdf0: 43 75 72 20 3d 20 2d 31 3b 0a 20 20 20 20 73 71  Cur = -1;.    sq
fe00: 6c 69 74 65 33 5f 64 62 5f 73 74 61 74 75 73 28  lite3_db_status(
fe10: 64 62 2c 20 53 51 4c 49 54 45 5f 44 42 53 54 41  db, SQLITE_DBSTA
fe20: 54 55 53 5f 53 54 4d 54 5f 55 53 45 44 2c 20 26  TUS_STMT_USED, &
fe30: 69 43 75 72 2c 20 26 69 48 69 77 74 72 2c 20 62  iCur, &iHiwtr, b
fe40: 52 65 73 65 74 29 3b 0a 20 20 20 20 72 61 77 5f  Reset);.    raw_
fe50: 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74  printf(pArg->out
fe60: 2c 20 22 53 74 61 74 65 6d 65 6e 74 20 48 65 61  , "Statement Hea
fe70: 70 2f 4c 6f 6f 6b 61 73 69 64 65 20 55 73 61 67  p/Lookaside Usag
fe80: 65 3a 20 20 20 20 20 20 25 64 20 62 79 74 65 73  e:      %d bytes
fe90: 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
fea0: 20 69 43 75 72 29 3b 0a 20 20 7d 0a 0a 20 20 69   iCur);.  }..  i
feb0: 66 28 20 70 41 72 67 20 26 26 20 70 41 72 67 2d  f( pArg && pArg-
fec0: 3e 6f 75 74 20 26 26 20 64 62 20 26 26 20 70 41  >out && db && pA
fed0: 72 67 2d 3e 70 53 74 6d 74 20 29 7b 0a 20 20 20  rg->pStmt ){.   
fee0: 20 69 43 75 72 20 3d 20 73 71 6c 69 74 65 33 5f   iCur = sqlite3_
fef0: 73 74 6d 74 5f 73 74 61 74 75 73 28 70 41 72 67  stmt_status(pArg
ff00: 2d 3e 70 53 74 6d 74 2c 20 53 51 4c 49 54 45 5f  ->pStmt, SQLITE_
ff10: 53 54 4d 54 53 54 41 54 55 53 5f 46 55 4c 4c 53  STMTSTATUS_FULLS
ff20: 43 41 4e 5f 53 54 45 50 2c 0a 20 20 20 20 20 20  CAN_STEP,.      
ff30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ff40: 20 20 20 20 20 20 20 20 20 62 52 65 73 65 74 29           bReset)
ff50: 3b 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66  ;.    raw_printf
ff60: 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22 46 75 6c  (pArg->out, "Ful
ff70: 6c 73 63 61 6e 20 53 74 65 70 73 3a 20 20 20 20  lscan Steps:    
ff80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ff90: 20 20 25 64 5c 6e 22 2c 20 69 43 75 72 29 3b 0a    %d\n", iCur);.
ffa0: 20 20 20 20 69 43 75 72 20 3d 20 73 71 6c 69 74      iCur = sqlit
ffb0: 65 33 5f 73 74 6d 74 5f 73 74 61 74 75 73 28 70  e3_stmt_status(p
ffc0: 41 72 67 2d 3e 70 53 74 6d 74 2c 20 53 51 4c 49  Arg->pStmt, SQLI
ffd0: 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 53 4f  TE_STMTSTATUS_SO
ffe0: 52 54 2c 20 62 52 65 73 65 74 29 3b 0a 20 20 20  RT, bReset);.   
fff0: 20 72 61 77 5f 70 72 69 6e 74 66 28 70 41 72 67   raw_printf(pArg
10000 2d 3e 6f 75 74 2c 20 22 53 6f 72 74 20 4f 70 65  ->out, "Sort Ope
10010 72 61 74 69 6f 6e 73 3a 20 20 20 20 20 20 20 20  rations:        
10020 20 20 20 20 20 20 20 20 20 20 20 20 20 25 64 5c               %d\
10030 6e 22 2c 20 69 43 75 72 29 3b 0a 20 20 20 20 69  n", iCur);.    i
10040 43 75 72 20 3d 20 73 71 6c 69 74 65 33 5f 73 74  Cur = sqlite3_st
10050 6d 74 5f 73 74 61 74 75 73 28 70 41 72 67 2d 3e  mt_status(pArg->
10060 70 53 74 6d 74 2c 20 53 51 4c 49 54 45 5f 53 54  pStmt, SQLITE_ST
10070 4d 54 53 54 41 54 55 53 5f 41 55 54 4f 49 4e 44  MTSTATUS_AUTOIND
10080 45 58 2c 62 52 65 73 65 74 29 3b 0a 20 20 20 20  EX,bReset);.    
10090 72 61 77 5f 70 72 69 6e 74 66 28 70 41 72 67 2d  raw_printf(pArg-
100a0 3e 6f 75 74 2c 20 22 41 75 74 6f 69 6e 64 65 78  >out, "Autoindex
100b0 20 49 6e 73 65 72 74 73 3a 20 20 20 20 20 20 20   Inserts:       
100c0 20 20 20 20 20 20 20 20 20 20 20 20 25 64 5c 6e              %d\n
100d0 22 2c 20 69 43 75 72 29 3b 0a 20 20 20 20 69 43  ", iCur);.    iC
100e0 75 72 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 6d  ur = sqlite3_stm
100f0 74 5f 73 74 61 74 75 73 28 70 41 72 67 2d 3e 70  t_status(pArg->p
10100 53 74 6d 74 2c 20 53 51 4c 49 54 45 5f 53 54 4d  Stmt, SQLITE_STM
10110 54 53 54 41 54 55 53 5f 56 4d 5f 53 54 45 50 2c  TSTATUS_VM_STEP,
10120 20 62 52 65 73 65 74 29 3b 0a 20 20 20 20 72 61   bReset);.    ra
10130 77 5f 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f  w_printf(pArg->o
10140 75 74 2c 20 22 56 69 72 74 75 61 6c 20 4d 61 63  ut, "Virtual Mac
10150 68 69 6e 65 20 53 74 65 70 73 3a 20 20 20 20 20  hine Steps:     
10160 20 20 20 20 20 20 20 20 20 20 25 64 5c 6e 22 2c            %d\n",
10170 20 69 43 75 72 29 3b 0a 20 20 7d 0a 0a 23 69 66   iCur);.  }..#if
10180 64 65 66 20 5f 5f 6c 69 6e 75 78 5f 5f 0a 20 20  def __linux__.  
10190 64 69 73 70 6c 61 79 4c 69 6e 75 78 49 6f 53 74  displayLinuxIoSt
101a0 61 74 73 28 70 41 72 67 2d 3e 6f 75 74 29 3b 0a  ats(pArg->out);.
101b0 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 44 6f 20  #endif..  /* Do 
101c0 6e 6f 74 20 72 65 6d 6f 76 65 20 74 68 69 73 20  not remove this 
101d0 6d 61 63 68 69 6e 65 20 72 65 61 64 61 62 6c 65  machine readable
101e0 20 63 6f 6d 6d 65 6e 74 3a 20 65 78 74 72 61 2d   comment: extra-
101f0 73 74 61 74 73 2d 6f 75 74 70 75 74 2d 68 65 72  stats-output-her
10200 65 20 2a 2f 0a 0a 20 20 72 65 74 75 72 6e 20 30  e */..  return 0
10210 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 70 6c  ;.}../*.** Displ
10220 61 79 20 73 63 61 6e 20 73 74 61 74 73 2e 0a 2a  ay scan stats..*
10230 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64 69  /.static void di
10240 73 70 6c 61 79 5f 73 63 61 6e 73 74 61 74 73 28  splay_scanstats(
10250 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
10260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10270 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 74     /* Database t
10280 6f 20 71 75 65 72 79 20 2a 2f 0a 20 20 53 68 65  o query */.  She
10290 6c 6c 53 74 61 74 65 20 2a 70 41 72 67 20 20 20  llState *pArg   
102a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
102b0 50 6f 69 6e 74 65 72 20 74 6f 20 53 68 65 6c 6c  Pointer to Shell
102c0 53 74 61 74 65 20 2a 2f 0a 29 7b 0a 23 69 66 6e  State */.){.#ifn
102d0 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
102e0 45 5f 53 54 4d 54 5f 53 43 41 4e 53 54 41 54 55  E_STMT_SCANSTATU
102f0 53 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  S.  UNUSED_PARAM
10300 45 54 45 52 28 64 62 29 3b 0a 20 20 55 4e 55 53  ETER(db);.  UNUS
10310 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 41 72  ED_PARAMETER(pAr
10320 67 29 3b 0a 23 65 6c 73 65 0a 20 20 69 6e 74 20  g);.#else.  int 
10330 69 2c 20 6b 2c 20 6e 2c 20 6d 78 3b 0a 20 20 72  i, k, n, mx;.  r
10340 61 77 5f 70 72 69 6e 74 66 28 70 41 72 67 2d 3e  aw_printf(pArg->
10350 6f 75 74 2c 20 22 2d 2d 2d 2d 2d 2d 2d 2d 20 73  out, "-------- s
10360 63 61 6e 73 74 61 74 73 20 2d 2d 2d 2d 2d 2d 2d  canstats -------
10370 2d 5c 6e 22 29 3b 0a 20 20 6d 78 20 3d 20 30 3b  -\n");.  mx = 0;
10380 0a 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 3d 6d  .  for(k=0; k<=m
10390 78 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 64 6f 75  x; k++){.    dou
103a0 62 6c 65 20 72 45 73 74 4c 6f 6f 70 20 3d 20 31  ble rEstLoop = 1
103b0 2e 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d 6e 3d  .0;.    for(i=n=
103c0 30 3b 20 31 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  0; 1; i++){.    
103d0 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
103e0 70 20 3d 20 70 41 72 67 2d 3e 70 53 74 6d 74 3b  p = pArg->pStmt;
103f0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69  .      sqlite3_i
10400 6e 74 36 34 20 6e 4c 6f 6f 70 2c 20 6e 56 69 73  nt64 nLoop, nVis
10410 69 74 3b 0a 20 20 20 20 20 20 64 6f 75 62 6c 65  it;.      double
10420 20 72 45 73 74 3b 0a 20 20 20 20 20 20 69 6e 74   rEst;.      int
10430 20 69 53 69 64 3b 0a 20 20 20 20 20 20 63 6f 6e   iSid;.      con
10440 73 74 20 63 68 61 72 20 2a 7a 45 78 70 6c 61 69  st char *zExplai
10450 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  n;.      if( sql
10460 69 74 65 33 5f 73 74 6d 74 5f 73 63 61 6e 73 74  ite3_stmt_scanst
10470 61 74 75 73 28 70 2c 20 69 2c 20 53 51 4c 49 54  atus(p, i, SQLIT
10480 45 5f 53 43 41 4e 53 54 41 54 5f 4e 4c 4f 4f 50  E_SCANSTAT_NLOOP
10490 2c 20 28 76 6f 69 64 2a 29 26 6e 4c 6f 6f 70 29  , (void*)&nLoop)
104a0 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61   ){.        brea
104b0 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
104c0 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 63   sqlite3_stmt_sc
104d0 61 6e 73 74 61 74 75 73 28 70 2c 20 69 2c 20 53  anstatus(p, i, S
104e0 51 4c 49 54 45 5f 53 43 41 4e 53 54 41 54 5f 53  QLITE_SCANSTAT_S
104f0 45 4c 45 43 54 49 44 2c 20 28 76 6f 69 64 2a 29  ELECTID, (void*)
10500 26 69 53 69 64 29 3b 0a 20 20 20 20 20 20 69 66  &iSid);.      if
10510 28 20 69 53 69 64 3e 6d 78 20 29 20 6d 78 20 3d  ( iSid>mx ) mx =
10520 20 69 53 69 64 3b 0a 20 20 20 20 20 20 69 66 28   iSid;.      if(
10530 20 69 53 69 64 21 3d 6b 20 29 20 63 6f 6e 74 69   iSid!=k ) conti
10540 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 6e  nue;.      if( n
10550 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ==0 ){.        r
10560 45 73 74 4c 6f 6f 70 20 3d 20 28 64 6f 75 62 6c  EstLoop = (doubl
10570 65 29 6e 4c 6f 6f 70 3b 0a 20 20 20 20 20 20 20  e)nLoop;.       
10580 20 69 66 28 20 6b 3e 30 20 29 20 72 61 77 5f 70   if( k>0 ) raw_p
10590 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c  rintf(pArg->out,
105a0 20 22 2d 2d 2d 2d 2d 2d 2d 2d 20 73 75 62 71 75   "-------- subqu
105b0 65 72 79 20 25 64 20 2d 2d 2d 2d 2d 2d 2d 5c 6e  ery %d -------\n
105c0 22 2c 20 6b 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ", k);.      }. 
105d0 20 20 20 20 20 6e 2b 2b 3b 0a 20 20 20 20 20 20       n++;.      
105e0 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 63 61  sqlite3_stmt_sca
105f0 6e 73 74 61 74 75 73 28 70 2c 20 69 2c 20 53 51  nstatus(p, i, SQ
10600 4c 49 54 45 5f 53 43 41 4e 53 54 41 54 5f 4e 56  LITE_SCANSTAT_NV
10610 49 53 49 54 2c 20 28 76 6f 69 64 2a 29 26 6e 56  ISIT, (void*)&nV
10620 69 73 69 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  isit);.      sql
10630 69 74 65 33 5f 73 74 6d 74 5f 73 63 61 6e 73 74  ite3_stmt_scanst
10640 61 74 75 73 28 70 2c 20 69 2c 20 53 51 4c 49 54  atus(p, i, SQLIT
10650 45 5f 53 43 41 4e 53 54 41 54 5f 45 53 54 2c 20  E_SCANSTAT_EST, 
10660 28 76 6f 69 64 2a 29 26 72 45 73 74 29 3b 0a 20  (void*)&rEst);. 
10670 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d       sqlite3_stm
10680 74 5f 73 63 61 6e 73 74 61 74 75 73 28 70 2c 20  t_scanstatus(p, 
10690 69 2c 20 53 51 4c 49 54 45 5f 53 43 41 4e 53 54  i, SQLITE_SCANST
106a0 41 54 5f 45 58 50 4c 41 49 4e 2c 20 28 76 6f 69  AT_EXPLAIN, (voi
106b0 64 2a 29 26 7a 45 78 70 6c 61 69 6e 29 3b 0a 20  d*)&zExplain);. 
106c0 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
106d0 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22 4c 6f 6f  (pArg->out, "Loo
106e0 70 20 25 32 64 3a 20 25 73 5c 6e 22 2c 20 6e 2c  p %2d: %s\n", n,
106f0 20 7a 45 78 70 6c 61 69 6e 29 3b 0a 20 20 20 20   zExplain);.    
10700 20 20 72 45 73 74 4c 6f 6f 70 20 2a 3d 20 72 45    rEstLoop *= rE
10710 73 74 3b 0a 20 20 20 20 20 20 72 61 77 5f 70 72  st;.      raw_pr
10720 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c 0a  intf(pArg->out,.
10730 20 20 20 20 20 20 20 20 20 20 22 20 20 20 20 20            "     
10740 20 20 20 20 6e 4c 6f 6f 70 3d 25 2d 38 6c 6c 64      nLoop=%-8lld
10750 20 6e 52 6f 77 3d 25 2d 38 6c 6c 64 20 65 73 74   nRow=%-8lld est
10760 52 6f 77 3d 25 2d 38 6c 6c 64 20 65 73 74 52 6f  Row=%-8lld estRo
10770 77 2f 4c 6f 6f 70 3d 25 2d 38 67 5c 6e 22 2c 0a  w/Loop=%-8g\n",.
10780 20 20 20 20 20 20 20 20 20 20 6e 4c 6f 6f 70 2c            nLoop,
10790 20 6e 56 69 73 69 74 2c 20 28 73 71 6c 69 74 65   nVisit, (sqlite
107a0 33 5f 69 6e 74 36 34 29 28 72 45 73 74 4c 6f 6f  3_int64)(rEstLoo
107b0 70 2b 30 2e 35 29 2c 20 72 45 73 74 0a 20 20 20  p+0.5), rEst.   
107c0 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a     );.    }.  }.
107d0 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 41 72    raw_printf(pAr
107e0 67 2d 3e 6f 75 74 2c 20 22 2d 2d 2d 2d 2d 2d 2d  g->out, "-------
107f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10800 2d 2d 2d 2d 5c 6e 22 29 3b 0a 23 65 6e 64 69 66  ----\n");.#endif
10810 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65  .}../*.** Parame
10820 74 65 72 20 61 7a 41 72 72 61 79 20 70 6f 69 6e  ter azArray poin
10830 74 73 20 74 6f 20 61 20 7a 65 72 6f 2d 74 65 72  ts to a zero-ter
10840 6d 69 6e 61 74 65 64 20 61 72 72 61 79 20 6f 66  minated array of
10850 20 73 74 72 69 6e 67 73 2e 20 7a 53 74 72 0a 2a   strings. zStr.*
10860 2a 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 73 69  * points to a si
10870 6e 67 6c 65 20 6e 75 6c 2d 74 65 72 6d 69 6e 61  ngle nul-termina
10880 74 65 64 20 73 74 72 69 6e 67 2e 20 52 65 74 75  ted string. Retu
10890 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 7a  rn non-zero if z
108a0 53 74 72 0a 2a 2a 20 69 73 20 65 71 75 61 6c 2c  Str.** is equal,
108b0 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 73 74   according to st
108c0 72 63 6d 70 28 29 2c 20 74 6f 20 61 6e 79 20 6f  rcmp(), to any o
108d0 66 20 74 68 65 20 73 74 72 69 6e 67 73 20 69 6e  f the strings in
108e0 20 74 68 65 20 61 72 72 61 79 2e 0a 2a 2a 20 4f   the array..** O
108f0 74 68 65 72 77 69 73 65 2c 20 72 65 74 75 72 6e  therwise, return
10900 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63   zero..*/.static
10910 20 69 6e 74 20 73 74 72 5f 69 6e 5f 61 72 72 61   int str_in_arra
10920 79 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53  y(const char *zS
10930 74 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tr, const char *
10940 2a 61 7a 41 72 72 61 79 29 7b 0a 20 20 69 6e 74  *azArray){.  int
10950 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 61   i;.  for(i=0; a
10960 7a 41 72 72 61 79 5b 69 5d 3b 20 69 2b 2b 29 7b  zArray[i]; i++){
10970 0a 20 20 20 20 69 66 28 20 30 3d 3d 73 74 72 63  .    if( 0==strc
10980 6d 70 28 7a 53 74 72 2c 20 61 7a 41 72 72 61 79  mp(zStr, azArray
10990 5b 69 5d 29 20 29 20 72 65 74 75 72 6e 20 31 3b  [i]) ) return 1;
109a0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
109b0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 63 6f 6d  .}../*.** If com
109c0 70 69 6c 65 64 20 73 74 61 74 65 6d 65 6e 74 20  piled statement 
109d0 70 53 71 6c 20 61 70 70 65 61 72 73 20 74 6f 20  pSql appears to 
109e0 62 65 20 61 6e 20 45 58 50 4c 41 49 4e 20 73 74  be an EXPLAIN st
109f0 61 74 65 6d 65 6e 74 2c 20 61 6c 6c 6f 63 61 74  atement, allocat
10a00 65 0a 2a 2a 20 61 6e 64 20 70 6f 70 75 6c 61 74  e.** and populat
10a10 65 20 74 68 65 20 53 68 65 6c 6c 53 74 61 74 65  e the ShellState
10a20 2e 61 69 49 6e 64 65 6e 74 5b 5d 20 61 72 72 61  .aiIndent[] arra
10a30 79 20 77 69 74 68 20 74 68 65 20 6e 75 6d 62 65  y with the numbe
10a40 72 20 6f 66 0a 2a 2a 20 73 70 61 63 65 73 20 65  r of.** spaces e
10a50 61 63 68 20 6f 70 63 6f 64 65 20 73 68 6f 75 6c  ach opcode shoul
10a60 64 20 62 65 20 69 6e 64 65 6e 74 65 64 20 62 65  d be indented be
10a70 66 6f 72 65 20 69 74 20 69 73 20 6f 75 74 70 75  fore it is outpu
10a80 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e 64  t..**.** The ind
10a90 65 6e 74 69 6e 67 20 72 75 6c 65 73 20 61 72 65  enting rules are
10aa0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20 46 6f  :.**.**     * Fo
10ab0 72 20 65 61 63 68 20 22 4e 65 78 74 22 2c 20 22  r each "Next", "
10ac0 50 72 65 76 22 2c 20 22 56 4e 65 78 74 22 20 6f  Prev", "VNext" o
10ad0 72 20 22 56 50 72 65 76 22 20 69 6e 73 74 72 75  r "VPrev" instru
10ae0 63 74 69 6f 6e 2c 20 69 6e 64 65 6e 74 0a 2a 2a  ction, indent.**
10af0 20 20 20 20 20 20 20 61 6c 6c 20 6f 70 63 6f 64         all opcod
10b00 65 73 20 74 68 61 74 20 6f 63 63 75 72 20 62 65  es that occur be
10b10 74 77 65 65 6e 20 74 68 65 20 70 32 20 6a 75 6d  tween the p2 jum
10b20 70 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 61 6e  p destination an
10b30 64 20 74 68 65 20 6f 70 63 6f 64 65 0a 2a 2a 20  d the opcode.** 
10b40 20 20 20 20 20 20 69 74 73 65 6c 66 20 62 79 20        itself by 
10b50 32 20 73 70 61 63 65 73 2e 0a 2a 2a 0a 2a 2a 20  2 spaces..**.** 
10b60 20 20 20 20 2a 20 46 6f 72 20 65 61 63 68 20 22      * For each "
10b70 47 6f 74 6f 22 2c 20 69 66 20 74 68 65 20 6a 75  Goto", if the ju
10b80 6d 70 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 69  mp destination i
10b90 73 20 65 61 72 6c 69 65 72 20 69 6e 20 74 68 65  s earlier in the
10ba0 20 70 72 6f 67 72 61 6d 0a 2a 2a 20 20 20 20 20   program.**     
10bb0 20 20 61 6e 64 20 65 6e 64 73 20 6f 6e 20 6f 6e    and ends on on
10bc0 65 20 6f 66 3a 0a 2a 2a 20 20 20 20 20 20 20 20  e of:.**        
10bd0 20 20 59 69 65 6c 64 20 20 53 65 65 6b 47 74 20    Yield  SeekGt 
10be0 20 53 65 65 6b 4c 74 20 20 52 6f 77 53 65 74 52   SeekLt  RowSetR
10bf0 65 61 64 20 20 52 65 77 69 6e 64 0a 2a 2a 20 20  ead  Rewind.**  
10c00 20 20 20 20 20 6f 72 20 69 66 20 74 68 65 20 50       or if the P
10c10 31 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6f  1 parameter is o
10c20 6e 65 20 69 6e 73 74 65 61 64 20 6f 66 20 7a 65  ne instead of ze
10c30 72 6f 2c 0a 2a 2a 20 20 20 20 20 20 20 74 68 65  ro,.**       the
10c40 6e 20 69 6e 64 65 6e 74 20 61 6c 6c 20 6f 70 63  n indent all opc
10c50 6f 64 65 73 20 62 65 74 77 65 65 6e 20 74 68 65  odes between the
10c60 20 65 61 72 6c 69 65 72 20 69 6e 73 74 72 75 63   earlier instruc
10c70 74 69 6f 6e 0a 2a 2a 20 20 20 20 20 20 20 61 6e  tion.**       an
10c80 64 20 22 47 6f 74 6f 22 20 62 79 20 32 20 73 70  d "Goto" by 2 sp
10c90 61 63 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  aces..*/.static 
10ca0 76 6f 69 64 20 65 78 70 6c 61 69 6e 5f 64 61 74  void explain_dat
10cb0 61 5f 70 72 65 70 61 72 65 28 53 68 65 6c 6c 53  a_prepare(ShellS
10cc0 74 61 74 65 20 2a 70 2c 20 73 71 6c 69 74 65 33  tate *p, sqlite3
10cd0 5f 73 74 6d 74 20 2a 70 53 71 6c 29 7b 0a 20 20  _stmt *pSql){.  
10ce0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c  const char *zSql
10cf0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
10d00 2f 2a 20 54 68 65 20 74 65 78 74 20 6f 66 20 74  /* The text of t
10d10 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  he SQL statement
10d20 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
10d30 20 2a 7a 3b 20 20 20 20 20 20 20 20 20 20 20 20   *z;            
10d40 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f        /* Used to
10d50 20 63 68 65 63 6b 20 69 66 20 74 68 69 73 20 69   check if this i
10d60 73 20 61 6e 20 45 58 50 4c 41 49 4e 20 2a 2f 0a  s an EXPLAIN */.
10d70 20 20 69 6e 74 20 2a 61 62 59 69 65 6c 64 20 3d    int *abYield =
10d80 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
10d90 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6f 70 20    /* True if op 
10da0 69 73 20 61 6e 20 4f 50 5f 59 69 65 6c 64 20 2a  is an OP_Yield *
10db0 2f 0a 20 20 69 6e 74 20 6e 41 6c 6c 6f 63 20 3d  /.  int nAlloc =
10dc0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
10dd0 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 64      /* Allocated
10de0 20 73 69 7a 65 20 6f 66 20 70 2d 3e 61 69 49 6e   size of p->aiIn
10df0 64 65 6e 74 5b 5d 2c 20 61 62 59 69 65 6c 64 20  dent[], abYield 
10e00 2a 2f 0a 20 20 69 6e 74 20 69 4f 70 3b 20 20 20  */.  int iOp;   
10e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10e20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
10e30 20 6f 70 65 72 61 74 69 6f 6e 20 69 6e 20 70 2d   operation in p-
10e40 3e 61 69 49 6e 64 65 6e 74 5b 5d 20 2a 2f 0a 0a  >aiIndent[] */..
10e50 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a    const char *az
10e60 4e 65 78 74 5b 5d 20 3d 20 7b 20 22 4e 65 78 74  Next[] = { "Next
10e70 22 2c 20 22 50 72 65 76 22 2c 20 22 56 50 72 65  ", "Prev", "VPre
10e80 76 22 2c 20 22 56 4e 65 78 74 22 2c 20 22 53 6f  v", "VNext", "So
10e90 72 74 65 72 4e 65 78 74 22 2c 0a 20 20 20 20 20  rterNext",.     
10ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10eb0 20 20 20 20 20 20 22 4e 65 78 74 49 66 4f 70 65        "NextIfOpe
10ec0 6e 22 2c 20 22 50 72 65 76 49 66 4f 70 65 6e 22  n", "PrevIfOpen"
10ed0 2c 20 30 20 7d 3b 0a 20 20 63 6f 6e 73 74 20 63  , 0 };.  const c
10ee0 68 61 72 20 2a 61 7a 59 69 65 6c 64 5b 5d 20 3d  har *azYield[] =
10ef0 20 7b 20 22 59 69 65 6c 64 22 2c 20 22 53 65 65   { "Yield", "See
10f00 6b 4c 54 22 2c 20 22 53 65 65 6b 47 54 22 2c 20  kLT", "SeekGT", 
10f10 22 52 6f 77 53 65 74 52 65 61 64 22 2c 0a 20 20  "RowSetRead",.  
10f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10f30 20 20 20 20 20 20 20 20 20 20 22 52 65 77 69 6e            "Rewin
10f40 64 22 2c 20 30 20 7d 3b 0a 20 20 63 6f 6e 73 74  d", 0 };.  const
10f50 20 63 68 61 72 20 2a 61 7a 47 6f 74 6f 5b 5d 20   char *azGoto[] 
10f60 3d 20 7b 20 22 47 6f 74 6f 22 2c 20 30 20 7d 3b  = { "Goto", 0 };
10f70 0a 0a 20 20 2f 2a 20 54 72 79 20 74 6f 20 66 69  ..  /* Try to fi
10f80 67 75 72 65 20 6f 75 74 20 69 66 20 74 68 69 73  gure out if this
10f90 20 69 73 20 72 65 61 6c 6c 79 20 61 6e 20 45 58   is really an EX
10fa0 50 4c 41 49 4e 20 73 74 61 74 65 6d 65 6e 74 2e  PLAIN statement.
10fb0 20 49 66 20 74 68 69 73 0a 20 20 2a 2a 20 63 61   If this.  ** ca
10fc0 6e 6e 6f 74 20 62 65 20 76 65 72 69 66 69 65 64  nnot be verified
10fd0 2c 20 72 65 74 75 72 6e 20 65 61 72 6c 79 2e 20  , return early. 
10fe0 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65   */.  if( sqlite
10ff0 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 70  3_column_count(p
11000 53 71 6c 29 21 3d 38 20 29 7b 0a 20 20 20 20 70  Sql)!=8 ){.    p
11010 2d 3e 63 4d 6f 64 65 20 3d 20 70 2d 3e 6d 6f 64  ->cMode = p->mod
11020 65 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  e;.    return;. 
11030 20 7d 0a 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69   }.  zSql = sqli
11040 74 65 33 5f 73 71 6c 28 70 53 71 6c 29 3b 0a 20  te3_sql(pSql);. 
11050 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29 20 72   if( zSql==0 ) r
11060 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 7a 3d 7a  eturn;.  for(z=z
11070 53 71 6c 3b 20 2a 7a 3d 3d 27 20 27 20 7c 7c 20  Sql; *z==' ' || 
11080 2a 7a 3d 3d 27 5c 74 27 20 7c 7c 20 2a 7a 3d 3d  *z=='\t' || *z==
11090 27 5c 6e 27 20 7c 7c 20 2a 7a 3d 3d 27 5c 66 27  '\n' || *z=='\f'
110a0 20 7c 7c 20 2a 7a 3d 3d 27 5c 72 27 3b 20 7a 2b   || *z=='\r'; z+
110b0 2b 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  +);.  if( sqlite
110c0 33 5f 73 74 72 6e 69 63 6d 70 28 7a 2c 20 22 65  3_strnicmp(z, "e
110d0 78 70 6c 61 69 6e 22 2c 20 37 29 20 29 7b 0a 20  xplain", 7) ){. 
110e0 20 20 20 70 2d 3e 63 4d 6f 64 65 20 3d 20 70 2d     p->cMode = p-
110f0 3e 6d 6f 64 65 3b 0a 20 20 20 20 72 65 74 75 72  >mode;.    retur
11100 6e 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72 28 69 4f  n;.  }..  for(iO
11110 70 3d 30 3b 20 53 51 4c 49 54 45 5f 52 4f 57 3d  p=0; SQLITE_ROW=
11120 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53  =sqlite3_step(pS
11130 71 6c 29 3b 20 69 4f 70 2b 2b 29 7b 0a 20 20 20  ql); iOp++){.   
11140 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74 20   int i;.    int 
11150 69 41 64 64 72 20 3d 20 73 71 6c 69 74 65 33 5f  iAddr = sqlite3_
11160 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 71 6c 2c  column_int(pSql,
11170 20 30 29 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63   0);.    const c
11180 68 61 72 20 2a 7a 4f 70 20 3d 20 28 63 6f 6e 73  har *zOp = (cons
11190 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f  t char*)sqlite3_
111a0 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 71 6c  column_text(pSql
111b0 2c 20 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 65  , 1);..    /* Se
111c0 74 20 70 32 20 74 6f 20 74 68 65 20 50 32 20 66  t p2 to the P2 f
111d0 69 65 6c 64 20 6f 66 20 74 68 65 20 63 75 72 72  ield of the curr
111e0 65 6e 74 20 6f 70 63 6f 64 65 2e 20 54 68 65 6e  ent opcode. Then
111f0 2c 20 61 73 73 75 6d 69 6e 67 20 74 68 61 74 0a  , assuming that.
11200 20 20 20 20 2a 2a 20 70 32 20 69 73 20 61 6e 20      ** p2 is an 
11210 69 6e 73 74 72 75 63 74 69 6f 6e 20 61 64 64 72  instruction addr
11220 65 73 73 2c 20 73 65 74 20 76 61 72 69 61 62 6c  ess, set variabl
11230 65 20 70 32 6f 70 20 74 6f 20 74 68 65 20 69 6e  e p2op to the in
11240 64 65 78 20 6f 66 20 74 68 61 74 0a 20 20 20 20  dex of that.    
11250 2a 2a 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69  ** instruction i
11260 6e 20 74 68 65 20 61 69 49 6e 64 65 6e 74 5b 5d  n the aiIndent[]
11270 20 61 72 72 61 79 2e 20 70 32 20 61 6e 64 20 70   array. p2 and p
11280 32 6f 70 20 6d 61 79 20 62 65 20 64 69 66 66 65  2op may be diffe
11290 72 65 6e 74 20 69 66 0a 20 20 20 20 2a 2a 20 74  rent if.    ** t
112a0 68 65 20 63 75 72 72 65 6e 74 20 69 6e 73 74 72  he current instr
112b0 75 63 74 69 6f 6e 20 69 73 20 70 61 72 74 20 6f  uction is part o
112c0 66 20 61 20 73 75 62 2d 70 72 6f 67 72 61 6d 20  f a sub-program 
112d0 67 65 6e 65 72 61 74 65 64 20 62 79 20 61 6e 0a  generated by an.
112e0 20 20 20 20 2a 2a 20 53 51 4c 20 74 72 69 67 67      ** SQL trigg
112f0 65 72 20 6f 72 20 66 6f 72 65 69 67 6e 20 6b 65  er or foreign ke
11300 79 2e 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 70  y.  */.    int p
11310 32 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  2 = sqlite3_colu
11320 6d 6e 5f 69 6e 74 28 70 53 71 6c 2c 20 33 29 3b  mn_int(pSql, 3);
11330 0a 20 20 20 20 69 6e 74 20 70 32 6f 70 20 3d 20  .    int p2op = 
11340 28 70 32 20 2b 20 28 69 4f 70 2d 69 41 64 64 72  (p2 + (iOp-iAddr
11350 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 47 72 6f 77  ));..    /* Grow
11360 20 74 68 65 20 70 2d 3e 61 69 49 6e 64 65 6e 74   the p->aiIndent
11370 20 61 72 72 61 79 20 61 73 20 72 65 71 75 69 72   array as requir
11380 65 64 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 4f  ed */.    if( iO
11390 70 3e 3d 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20 20  p>=nAlloc ){.   
113a0 20 20 20 69 66 28 20 69 4f 70 3d 3d 30 20 29 7b     if( iOp==0 ){
113b0 0a 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 66  .        /* Do f
113c0 75 72 74 68 65 72 20 76 65 72 66 69 63 61 74 69  urther verficati
113d0 6f 6e 20 74 68 61 74 20 74 68 69 73 20 69 73 20  on that this is 
113e0 65 78 70 6c 61 69 6e 20 6f 75 74 70 75 74 2e 20  explain output. 
113f0 20 41 62 6f 72 74 20 69 66 0a 20 20 20 20 20 20   Abort if.      
11400 20 20 2a 2a 20 69 74 20 69 73 20 6e 6f 74 20 2a    ** it is not *
11410 2f 0a 20 20 20 20 20 20 20 20 73 74 61 74 69 63  /.        static
11420 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 65 78 70   const char *exp
11430 6c 61 69 6e 43 6f 6c 73 5b 5d 20 3d 20 7b 0a 20  lainCols[] = {. 
11440 20 20 20 20 20 20 20 20 20 20 22 61 64 64 72 22            "addr"
11450 2c 20 22 6f 70 63 6f 64 65 22 2c 20 22 70 31 22  , "opcode", "p1"
11460 2c 20 22 70 32 22 2c 20 22 70 33 22 2c 20 22 70  , "p2", "p3", "p
11470 34 22 2c 20 22 70 35 22 2c 20 22 63 6f 6d 6d 65  4", "p5", "comme
11480 6e 74 22 20 7d 3b 0a 20 20 20 20 20 20 20 20 69  nt" };.        i
11490 6e 74 20 6a 6a 3b 0a 20 20 20 20 20 20 20 20 66  nt jj;.        f
114a0 6f 72 28 6a 6a 3d 30 3b 20 6a 6a 3c 41 72 72 61  or(jj=0; jj<Arra
114b0 79 53 69 7a 65 28 65 78 70 6c 61 69 6e 43 6f 6c  ySize(explainCol
114c0 73 29 3b 20 6a 6a 2b 2b 29 7b 0a 20 20 20 20 20  s); jj++){.     
114d0 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28       if( strcmp(
114e0 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6e  sqlite3_column_n
114f0 61 6d 65 28 70 53 71 6c 2c 6a 6a 29 2c 65 78 70  ame(pSql,jj),exp
11500 6c 61 69 6e 43 6f 6c 73 5b 6a 6a 5d 29 21 3d 30  lainCols[jj])!=0
11510 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
11520 70 2d 3e 63 4d 6f 64 65 20 3d 20 70 2d 3e 6d 6f  p->cMode = p->mo
11530 64 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  de;.            
11540 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 53  sqlite3_reset(pS
11550 71 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ql);.           
11560 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 20   return;.       
11570 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
11580 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 41 6c       }.      nAl
11590 6c 6f 63 20 2b 3d 20 31 30 30 3b 0a 20 20 20 20  loc += 100;.    
115a0 20 20 70 2d 3e 61 69 49 6e 64 65 6e 74 20 3d 20    p->aiIndent = 
115b0 28 69 6e 74 2a 29 73 71 6c 69 74 65 33 5f 72 65  (int*)sqlite3_re
115c0 61 6c 6c 6f 63 36 34 28 70 2d 3e 61 69 49 6e 64  alloc64(p->aiInd
115d0 65 6e 74 2c 20 6e 41 6c 6c 6f 63 2a 73 69 7a 65  ent, nAlloc*size
115e0 6f 66 28 69 6e 74 29 29 3b 0a 20 20 20 20 20 20  of(int));.      
115f0 61 62 59 69 65 6c 64 20 3d 20 28 69 6e 74 2a 29  abYield = (int*)
11600 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 36  sqlite3_realloc6
11610 34 28 61 62 59 69 65 6c 64 2c 20 6e 41 6c 6c 6f  4(abYield, nAllo
11620 63 2a 73 69 7a 65 6f 66 28 69 6e 74 29 29 3b 0a  c*sizeof(int));.
11630 20 20 20 20 7d 0a 20 20 20 20 61 62 59 69 65 6c      }.    abYiel
11640 64 5b 69 4f 70 5d 20 3d 20 73 74 72 5f 69 6e 5f  d[iOp] = str_in_
11650 61 72 72 61 79 28 7a 4f 70 2c 20 61 7a 59 69 65  array(zOp, azYie
11660 6c 64 29 3b 0a 20 20 20 20 70 2d 3e 61 69 49 6e  ld);.    p->aiIn
11670 64 65 6e 74 5b 69 4f 70 5d 20 3d 20 30 3b 0a 20  dent[iOp] = 0;. 
11680 20 20 20 70 2d 3e 6e 49 6e 64 65 6e 74 20 3d 20     p->nIndent = 
11690 69 4f 70 2b 31 3b 0a 0a 20 20 20 20 69 66 28 20  iOp+1;..    if( 
116a0 73 74 72 5f 69 6e 5f 61 72 72 61 79 28 7a 4f 70  str_in_array(zOp
116b0 2c 20 61 7a 4e 65 78 74 29 20 29 7b 0a 20 20 20  , azNext) ){.   
116c0 20 20 20 66 6f 72 28 69 3d 70 32 6f 70 3b 20 69     for(i=p2op; i
116d0 3c 69 4f 70 3b 20 69 2b 2b 29 20 70 2d 3e 61 69  <iOp; i++) p->ai
116e0 49 6e 64 65 6e 74 5b 69 5d 20 2b 3d 20 32 3b 0a  Indent[i] += 2;.
116f0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 74      }.    if( st
11700 72 5f 69 6e 5f 61 72 72 61 79 28 7a 4f 70 2c 20  r_in_array(zOp, 
11710 61 7a 47 6f 74 6f 29 20 26 26 20 70 32 6f 70 3c  azGoto) && p2op<
11720 70 2d 3e 6e 49 6e 64 65 6e 74 0a 20 20 20 20 20  p->nIndent.     
11730 26 26 20 28 61 62 59 69 65 6c 64 5b 70 32 6f 70  && (abYield[p2op
11740 5d 20 7c 7c 20 73 71 6c 69 74 65 33 5f 63 6f 6c  ] || sqlite3_col
11750 75 6d 6e 5f 69 6e 74 28 70 53 71 6c 2c 20 32 29  umn_int(pSql, 2)
11760 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 66  ).    ){.      f
11770 6f 72 28 69 3d 70 32 6f 70 3b 20 69 3c 69 4f 70  or(i=p2op; i<iOp
11780 3b 20 69 2b 2b 29 20 70 2d 3e 61 69 49 6e 64 65  ; i++) p->aiInde
11790 6e 74 5b 69 5d 20 2b 3d 20 32 3b 0a 20 20 20 20  nt[i] += 2;.    
117a0 7d 0a 20 20 7d 0a 0a 20 20 70 2d 3e 69 49 6e 64  }.  }..  p->iInd
117b0 65 6e 74 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  ent = 0;.  sqlit
117c0 65 33 5f 66 72 65 65 28 61 62 59 69 65 6c 64 29  e3_free(abYield)
117d0 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 65  ;.  sqlite3_rese
117e0 74 28 70 53 71 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  t(pSql);.}../*.*
117f0 2a 20 46 72 65 65 20 74 68 65 20 61 72 72 61 79  * Free the array
11800 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 65 78   allocated by ex
11810 70 6c 61 69 6e 5f 64 61 74 61 5f 70 72 65 70 61  plain_data_prepa
11820 72 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  re()..*/.static 
11830 76 6f 69 64 20 65 78 70 6c 61 69 6e 5f 64 61 74  void explain_dat
11840 61 5f 64 65 6c 65 74 65 28 53 68 65 6c 6c 53 74  a_delete(ShellSt
11850 61 74 65 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74  ate *p){.  sqlit
11860 65 33 5f 66 72 65 65 28 70 2d 3e 61 69 49 6e 64  e3_free(p->aiInd
11870 65 6e 74 29 3b 0a 20 20 70 2d 3e 61 69 49 6e 64  ent);.  p->aiInd
11880 65 6e 74 20 3d 20 30 3b 0a 20 20 70 2d 3e 6e 49  ent = 0;.  p->nI
11890 6e 64 65 6e 74 20 3d 20 30 3b 0a 20 20 70 2d 3e  ndent = 0;.  p->
118a0 69 49 6e 64 65 6e 74 20 3d 20 30 3b 0a 7d 0a 0a  iIndent = 0;.}..
118b0 2f 2a 0a 2a 2a 20 44 69 73 61 62 6c 65 20 61 6e  /*.** Disable an
118c0 64 20 72 65 73 74 6f 72 65 20 2e 77 68 65 72 65  d restore .where
118d0 74 72 61 63 65 20 61 6e 64 20 2e 73 65 6c 65 63  trace and .selec
118e0 74 74 72 61 63 65 20 73 65 74 74 69 6e 67 73 2e  ttrace settings.
118f0 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28  .*/.#if defined(
11900 53 51 4c 49 54 45 5f 44 45 42 55 47 29 20 26 26  SQLITE_DEBUG) &&
11910 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
11920 45 4e 41 42 4c 45 5f 53 45 4c 45 43 54 54 52 41  ENABLE_SELECTTRA
11930 43 45 29 0a 65 78 74 65 72 6e 20 69 6e 74 20 73  CE).extern int s
11940 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61 63  qlite3SelectTrac
11950 65 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61  e;.static int sa
11960 76 65 64 53 65 6c 65 63 74 54 72 61 63 65 3b 0a  vedSelectTrace;.
11970 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e  #endif.#if defin
11980 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29  ed(SQLITE_DEBUG)
11990 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49   && defined(SQLI
119a0 54 45 5f 45 4e 41 42 4c 45 5f 57 48 45 52 45 54  TE_ENABLE_WHERET
119b0 52 41 43 45 29 0a 65 78 74 65 72 6e 20 69 6e 74  RACE).extern int
119c0 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61   sqlite3WhereTra
119d0 63 65 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 73  ce;.static int s
119e0 61 76 65 64 57 68 65 72 65 54 72 61 63 65 3b 0a  avedWhereTrace;.
119f0 23 65 6e 64 69 66 0a 73 74 61 74 69 63 20 76 6f  #endif.static vo
11a00 69 64 20 64 69 73 61 62 6c 65 5f 64 65 62 75 67  id disable_debug
11a10 5f 74 72 61 63 65 5f 6d 6f 64 65 73 28 76 6f 69  _trace_modes(voi
11a20 64 29 7b 0a 23 69 66 20 64 65 66 69 6e 65 64 28  d){.#if defined(
11a30 53 51 4c 49 54 45 5f 44 45 42 55 47 29 20 26 26  SQLITE_DEBUG) &&
11a40 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
11a50 45 4e 41 42 4c 45 5f 53 45 4c 45 43 54 54 52 41  ENABLE_SELECTTRA
11a60 43 45 29 0a 20 20 73 61 76 65 64 53 65 6c 65 63  CE).  savedSelec
11a70 74 54 72 61 63 65 20 3d 20 73 71 6c 69 74 65 33  tTrace = sqlite3
11a80 53 65 6c 65 63 74 54 72 61 63 65 3b 0a 20 20 73  SelectTrace;.  s
11a90 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61 63  qlite3SelectTrac
11aa0 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 69  e = 0;.#endif.#i
11ab0 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
11ac0 5f 44 45 42 55 47 29 20 26 26 20 64 65 66 69 6e  _DEBUG) && defin
11ad0 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
11ae0 5f 57 48 45 52 45 54 52 41 43 45 29 0a 20 20 73  _WHERETRACE).  s
11af0 61 76 65 64 57 68 65 72 65 54 72 61 63 65 20 3d  avedWhereTrace =
11b00 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61   sqlite3WhereTra
11b10 63 65 3b 0a 20 20 73 71 6c 69 74 65 33 57 68 65  ce;.  sqlite3Whe
11b20 72 65 54 72 61 63 65 20 3d 20 30 3b 0a 23 65 6e  reTrace = 0;.#en
11b30 64 69 66 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69  dif.}.static voi
11b40 64 20 72 65 73 74 6f 72 65 5f 64 65 62 75 67 5f  d restore_debug_
11b50 74 72 61 63 65 5f 6d 6f 64 65 73 28 76 6f 69 64  trace_modes(void
11b60 29 7b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  ){.#if defined(S
11b70 51 4c 49 54 45 5f 44 45 42 55 47 29 20 26 26 20  QLITE_DEBUG) && 
11b80 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
11b90 4e 41 42 4c 45 5f 53 45 4c 45 43 54 54 52 41 43  NABLE_SELECTTRAC
11ba0 45 29 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65  E).  sqlite3Sele
11bb0 63 74 54 72 61 63 65 20 3d 20 73 61 76 65 64 53  ctTrace = savedS
11bc0 65 6c 65 63 74 54 72 61 63 65 3b 0a 23 65 6e 64  electTrace;.#end
11bd0 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  if.#if defined(S
11be0 51 4c 49 54 45 5f 44 45 42 55 47 29 20 26 26 20  QLITE_DEBUG) && 
11bf0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
11c00 4e 41 42 4c 45 5f 57 48 45 52 45 54 52 41 43 45  NABLE_WHERETRACE
11c10 29 0a 20 20 73 71 6c 69 74 65 33 57 68 65 72 65  ).  sqlite3Where
11c20 54 72 61 63 65 20 3d 20 73 61 76 65 64 57 68 65  Trace = savedWhe
11c30 72 65 54 72 61 63 65 3b 0a 23 65 6e 64 69 66 0a  reTrace;.#endif.
11c40 7d 0a 0a 2f 2a 0a 2a 2a 20 52 75 6e 20 61 20 70  }../*.** Run a p
11c50 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
11c60 74 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  t.*/.static void
11c70 20 65 78 65 63 5f 70 72 65 70 61 72 65 64 5f 73   exec_prepared_s
11c80 74 6d 74 28 0a 20 20 53 68 65 6c 6c 53 74 61 74  tmt(.  ShellStat
11c90 65 20 2a 70 41 72 67 2c 20 20 20 20 20 20 20 20  e *pArg,        
11ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11cb0 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
11cc0 65 72 20 74 6f 20 53 68 65 6c 6c 53 74 61 74 65  er to ShellState
11cd0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74   */.  sqlite3_st
11ce0 6d 74 20 2a 70 53 74 6d 74 2c 20 20 20 20 20 20  mt *pStmt,      
11cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11d00 20 20 20 20 20 20 20 2f 2a 20 53 74 61 74 6d 65         /* Statme
11d10 6e 74 20 74 6f 20 72 75 6e 20 2a 2f 0a 20 20 69  nt to run */.  i
11d20 6e 74 20 28 2a 78 43 61 6c 6c 62 61 63 6b 29 28  nt (*xCallback)(
11d30 76 6f 69 64 2a 2c 69 6e 74 2c 63 68 61 72 2a 2a  void*,int,char**
11d40 2c 63 68 61 72 2a 2a 2c 69 6e 74 2a 29 20 20 20  ,char**,int*)   
11d50 2f 2a 20 43 61 6c 6c 62 61 63 6b 20 66 75 6e 63  /* Callback func
11d60 74 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  tion */.){.  int
11d70 20 72 63 3b 0a 0a 20 20 2f 2a 20 70 65 72 66 6f   rc;..  /* perfo
11d80 72 6d 20 74 68 65 20 66 69 72 73 74 20 73 74 65  rm the first ste
11d90 70 2e 20 20 74 68 69 73 20 77 69 6c 6c 20 74 65  p.  this will te
11da0 6c 6c 20 75 73 20 69 66 20 77 65 0a 20 20 2a 2a  ll us if we.  **
11db0 20 68 61 76 65 20 61 20 72 65 73 75 6c 74 20 73   have a result s
11dc0 65 74 20 6f 72 20 6e 6f 74 20 61 6e 64 20 68 6f  et or not and ho
11dd0 77 20 77 69 64 65 20 69 74 20 69 73 2e 0a 20 20  w wide it is..  
11de0 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  */.  rc = sqlite
11df0 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3b 0a 20  3_step(pStmt);. 
11e00 20 2f 2a 20 69 66 20 77 65 20 68 61 76 65 20 61   /* if we have a
11e10 20 72 65 73 75 6c 74 20 73 65 74 2e 2e 2e 20 2a   result set... *
11e20 2f 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 52  /.  if( SQLITE_R
11e30 4f 57 20 3d 3d 20 72 63 20 29 7b 0a 20 20 20 20  OW == rc ){.    
11e40 2f 2a 20 69 66 20 77 65 20 68 61 76 65 20 61 20  /* if we have a 
11e50 63 61 6c 6c 62 61 63 6b 2e 2e 2e 20 2a 2f 0a 20  callback... */. 
11e60 20 20 20 69 66 28 20 78 43 61 6c 6c 62 61 63 6b     if( xCallback
11e70 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 61 6c 6c   ){.      /* all
11e80 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 20  ocate space for 
11e90 63 6f 6c 20 6e 61 6d 65 20 70 74 72 2c 20 76 61  col name ptr, va
11ea0 6c 75 65 20 70 74 72 2c 20 61 6e 64 20 74 79 70  lue ptr, and typ
11eb0 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e  e */.      int n
11ec0 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  Col = sqlite3_co
11ed0 6c 75 6d 6e 5f 63 6f 75 6e 74 28 70 53 74 6d 74  lumn_count(pStmt
11ee0 29 3b 0a 20 20 20 20 20 20 76 6f 69 64 20 2a 70  );.      void *p
11ef0 44 61 74 61 20 3d 20 73 71 6c 69 74 65 33 5f 6d  Data = sqlite3_m
11f00 61 6c 6c 6f 63 36 34 28 33 2a 6e 43 6f 6c 2a 73  alloc64(3*nCol*s
11f10 69 7a 65 6f 66 28 63 6f 6e 73 74 20 63 68 61 72  izeof(const char
11f20 2a 29 20 2b 20 31 29 3b 0a 20 20 20 20 20 20 69  *) + 1);.      i
11f30 66 28 20 21 70 44 61 74 61 20 29 7b 0a 20 20 20  f( !pData ){.   
11f40 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
11f50 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 65  _NOMEM;.      }e
11f60 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63 68 61  lse{.        cha
11f70 72 20 2a 2a 61 7a 43 6f 6c 73 20 3d 20 28 63 68  r **azCols = (ch
11f80 61 72 20 2a 2a 29 70 44 61 74 61 3b 20 20 20 20  ar **)pData;    
11f90 20 20 2f 2a 20 4e 61 6d 65 73 20 6f 66 20 72 65    /* Names of re
11fa0 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a  sult columns */.
11fb0 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 2a 61          char **a
11fc0 7a 56 61 6c 73 20 3d 20 26 61 7a 43 6f 6c 73 5b  zVals = &azCols[
11fd0 6e 43 6f 6c 5d 3b 20 20 20 20 20 20 20 2f 2a 20  nCol];       /* 
11fe0 52 65 73 75 6c 74 73 20 2a 2f 0a 20 20 20 20 20  Results */.     
11ff0 20 20 20 69 6e 74 20 2a 61 69 54 79 70 65 73 20     int *aiTypes 
12000 3d 20 28 69 6e 74 20 2a 29 26 61 7a 56 61 6c 73  = (int *)&azVals
12010 5b 6e 43 6f 6c 5d 3b 20 2f 2a 20 52 65 73 75 6c  [nCol]; /* Resul
12020 74 20 74 79 70 65 73 20 2a 2f 0a 20 20 20 20 20  t types */.     
12030 20 20 20 69 6e 74 20 69 2c 20 78 3b 0a 20 20 20     int i, x;.   
12040 20 20 20 20 20 61 73 73 65 72 74 28 73 69 7a 65       assert(size
12050 6f 66 28 69 6e 74 29 20 3c 3d 20 73 69 7a 65 6f  of(int) <= sizeo
12060 66 28 63 68 61 72 20 2a 29 29 3b 0a 20 20 20 20  f(char *));.    
12070 20 20 20 20 2f 2a 20 73 61 76 65 20 6f 66 66 20      /* save off 
12080 70 74 72 73 20 74 6f 20 63 6f 6c 75 6d 6e 20 6e  ptrs to column n
12090 61 6d 65 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  ames */.        
120a0 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b  for(i=0; i<nCol;
120b0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
120c0 20 61 7a 43 6f 6c 73 5b 69 5d 20 3d 20 28 63 68   azCols[i] = (ch
120d0 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c  ar *)sqlite3_col
120e0 75 6d 6e 5f 6e 61 6d 65 28 70 53 74 6d 74 2c 20  umn_name(pStmt, 
120f0 69 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  i);.        }.  
12100 20 20 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20        do{.      
12110 20 20 20 20 2f 2a 20 65 78 74 72 61 63 74 20 74      /* extract t
12120 68 65 20 64 61 74 61 20 61 6e 64 20 64 61 74 61  he data and data
12130 20 74 79 70 65 73 20 2a 2f 0a 20 20 20 20 20 20   types */.      
12140 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
12150 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Col; i++){.     
12160 20 20 20 20 20 20 20 61 69 54 79 70 65 73 5b 69         aiTypes[i
12170 5d 20 3d 20 78 20 3d 20 73 71 6c 69 74 65 33 5f  ] = x = sqlite3_
12180 63 6f 6c 75 6d 6e 5f 74 79 70 65 28 70 53 74 6d  column_type(pStm
12190 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20 20  t, i);.         
121a0 20 20 20 69 66 28 20 78 3d 3d 53 51 4c 49 54 45     if( x==SQLITE
121b0 5f 42 4c 4f 42 20 26 26 20 70 41 72 67 20 26 26  _BLOB && pArg &&
121c0 20 70 41 72 67 2d 3e 63 4d 6f 64 65 3d 3d 4d 4f   pArg->cMode==MO
121d0 44 45 5f 49 6e 73 65 72 74 20 29 7b 0a 20 20 20  DE_Insert ){.   
121e0 20 20 20 20 20 20 20 20 20 20 20 61 7a 56 61 6c             azVal
121f0 73 5b 69 5d 20 3d 20 22 22 3b 0a 20 20 20 20 20  s[i] = "";.     
12200 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
12210 20 20 20 20 20 20 20 20 20 20 20 20 61 7a 56 61              azVa
12220 6c 73 5b 69 5d 20 3d 20 28 63 68 61 72 2a 29 73  ls[i] = (char*)s
12230 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
12240 78 74 28 70 53 74 6d 74 2c 20 69 29 3b 0a 20 20  xt(pStmt, i);.  
12250 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
12260 20 20 20 20 20 20 20 20 69 66 28 20 21 61 7a 56          if( !azV
12270 61 6c 73 5b 69 5d 20 26 26 20 28 61 69 54 79 70  als[i] && (aiTyp
12280 65 73 5b 69 5d 21 3d 53 51 4c 49 54 45 5f 4e 55  es[i]!=SQLITE_NU
12290 4c 4c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  LL) ){.         
122a0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
122b0 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20  _NOMEM;.        
122c0 20 20 20 20 20 20 62 72 65 61 6b 3b 20 2f 2a 20        break; /* 
122d0 66 72 6f 6d 20 66 6f 72 20 2a 2f 0a 20 20 20 20  from for */.    
122e0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
122f0 20 20 20 20 7d 20 2f 2a 20 65 6e 64 20 66 6f 72      } /* end for
12300 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 20 20 2f   */..          /
12310 2a 20 69 66 20 64 61 74 61 20 61 6e 64 20 74 79  * if data and ty
12320 70 65 73 20 65 78 74 72 61 63 74 65 64 20 73 75  pes extracted su
12330 63 63 65 73 73 66 75 6c 6c 79 2e 2e 2e 20 2a 2f  ccessfully... */
12340 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 53  .          if( S
12350 51 4c 49 54 45 5f 52 4f 57 20 3d 3d 20 72 63 20  QLITE_ROW == rc 
12360 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  ){.            /
12370 2a 20 63 61 6c 6c 20 74 68 65 20 73 75 70 70 6c  * call the suppl
12380 69 65 64 20 63 61 6c 6c 62 61 63 6b 20 77 69 74  ied callback wit
12390 68 20 74 68 65 20 72 65 73 75 6c 74 20 72 6f 77  h the result row
123a0 20 64 61 74 61 20 2a 2f 0a 20 20 20 20 20 20 20   data */.       
123b0 20 20 20 20 20 69 66 28 20 78 43 61 6c 6c 62 61       if( xCallba
123c0 63 6b 28 70 41 72 67 2c 20 6e 43 6f 6c 2c 20 61  ck(pArg, nCol, a
123d0 7a 56 61 6c 73 2c 20 61 7a 43 6f 6c 73 2c 20 61  zVals, azCols, a
123e0 69 54 79 70 65 73 29 20 29 7b 0a 20 20 20 20 20  iTypes) ){.     
123f0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
12400 4c 49 54 45 5f 41 42 4f 52 54 3b 0a 20 20 20 20  LITE_ABORT;.    
12410 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
12420 20 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20               rc 
12430 3d 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70  = sqlite3_step(p
12440 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 20 20 20  Stmt);.         
12450 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
12460 0a 20 20 20 20 20 20 20 20 7d 20 77 68 69 6c 65  .        } while
12470 28 20 53 51 4c 49 54 45 5f 52 4f 57 20 3d 3d 20  ( SQLITE_ROW == 
12480 72 63 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71  rc );.        sq
12490 6c 69 74 65 33 5f 66 72 65 65 28 70 44 61 74 61  lite3_free(pData
124a0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
124b0 65 6c 73 65 7b 0a 20 20 20 20 20 20 64 6f 7b 0a  else{.      do{.
124c0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
124d0 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29  ite3_step(pStmt)
124e0 3b 0a 20 20 20 20 20 20 7d 20 77 68 69 6c 65 28  ;.      } while(
124f0 20 72 63 20 3d 3d 20 53 51 4c 49 54 45 5f 52 4f   rc == SQLITE_RO
12500 57 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  W );.    }.  }.}
12510 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
12520 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
12530 4c 45 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  LE./*.** This fu
12540 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
12550 20 74 6f 20 70 72 6f 63 65 73 73 20 53 51 4c 20   to process SQL 
12560 69 66 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  if the previous 
12570 73 68 65 6c 6c 20 63 6f 6d 6d 61 6e 64 0a 2a 2a  shell command.**
12580 20 77 61 73 20 22 2e 65 78 70 65 72 74 22 2e 20   was ".expert". 
12590 49 74 20 70 61 73 73 65 73 20 74 68 65 20 53 51  It passes the SQ
125a0 4c 20 69 6e 20 74 68 65 20 73 65 63 6f 6e 64 20  L in the second 
125b0 61 72 67 75 6d 65 6e 74 20 64 69 72 65 63 74 6c  argument directl
125c0 79 20 74 6f 0a 2a 2a 20 74 68 65 20 73 71 6c 69  y to.** the sqli
125d0 74 65 33 65 78 70 65 72 74 20 6f 62 6a 65 63 74  te3expert object
125e0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65  ..**.** If succe
125f0 73 73 66 75 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b  ssful, SQLITE_OK
12600 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74   is returned. Ot
12610 68 65 72 77 69 73 65 2c 20 61 6e 20 53 51 4c 69  herwise, an SQLi
12620 74 65 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65  te error.** code
12630 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20  . In this case, 
12640 28 2a 70 7a 45 72 72 29 20 6d 61 79 20 62 65 20  (*pzErr) may be 
12650 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  set to point to 
12660 61 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e  a buffer contain
12670 69 6e 67 0a 2a 2a 20 61 6e 20 45 6e 67 6c 69 73  ing.** an Englis
12680 68 20 6c 61 6e 67 75 61 67 65 20 65 72 72 6f 72  h language error
12690 20 6d 65 73 73 61 67 65 2e 20 49 74 20 69 73 20   message. It is 
126a0 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69  the responsibili
126b0 74 79 20 6f 66 20 74 68 65 0a 2a 2a 20 63 61 6c  ty of the.** cal
126c0 6c 65 72 20 74 6f 20 65 76 65 6e 74 75 61 6c 6c  ler to eventuall
126d0 79 20 66 72 65 65 20 74 68 69 73 20 62 75 66 66  y free this buff
126e0 65 72 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  er using sqlite3
126f0 5f 66 72 65 65 28 29 2e 0a 2a 2f 0a 73 74 61 74  _free()..*/.stat
12700 69 63 20 69 6e 74 20 65 78 70 65 72 74 48 61 6e  ic int expertHan
12710 64 6c 65 53 51 4c 28 0a 20 20 53 68 65 6c 6c 53  dleSQL(.  ShellS
12720 74 61 74 65 20 2a 70 53 74 61 74 65 2c 20 0a 20  tate *pState, . 
12730 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71   const char *zSq
12740 6c 2c 20 0a 20 20 63 68 61 72 20 2a 2a 70 7a 45  l, .  char **pzE
12750 72 72 0a 29 7b 0a 20 20 61 73 73 65 72 74 28 20  rr.){.  assert( 
12760 70 53 74 61 74 65 2d 3e 65 78 70 65 72 74 2e 70  pState->expert.p
12770 45 78 70 65 72 74 20 29 3b 0a 20 20 61 73 73 65  Expert );.  asse
12780 72 74 28 20 70 7a 45 72 72 3d 3d 30 20 7c 7c 20  rt( pzErr==0 || 
12790 2a 70 7a 45 72 72 3d 3d 30 20 29 3b 0a 20 20 72  *pzErr==0 );.  r
127a0 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 65 78  eturn sqlite3_ex
127b0 70 65 72 74 5f 73 71 6c 28 70 53 74 61 74 65 2d  pert_sql(pState-
127c0 3e 65 78 70 65 72 74 2e 70 45 78 70 65 72 74 2c  >expert.pExpert,
127d0 20 7a 53 71 6c 2c 20 70 7a 45 72 72 29 3b 0a 7d   zSql, pzErr);.}
127e0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
127f0 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
12800 65 69 74 68 65 72 20 74 6f 20 73 69 6c 65 6e 74  either to silent
12810 6c 79 20 63 6c 65 61 6e 20 75 70 20 74 68 65 20  ly clean up the 
12820 6f 62 6a 65 63 74 0a 2a 2a 20 63 72 65 61 74 65  object.** create
12830 64 20 62 79 20 74 68 65 20 22 2e 65 78 70 65 72  d by the ".exper
12840 74 22 20 63 6f 6d 6d 61 6e 64 20 28 69 66 20 62  t" command (if b
12850 43 61 6e 63 65 6c 3d 3d 31 29 2c 20 6f 72 20 74  Cancel==1), or t
12860 6f 20 67 65 6e 65 72 61 74 65 20 61 20 0a 2a 2a  o generate a .**
12870 20 72 65 70 6f 72 74 20 66 72 6f 6d 20 69 74 20   report from it 
12880 61 6e 64 20 74 68 65 6e 20 63 6c 65 61 6e 20 69  and then clean i
12890 74 20 75 70 20 28 69 66 20 62 43 61 6e 63 65 6c  t up (if bCancel
128a0 3d 3d 30 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73  ==0)..**.** If s
128b0 75 63 63 65 73 73 66 75 6c 2c 20 53 51 4c 49 54  uccessful, SQLIT
128c0 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
128d0 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 61 6e 20  . Otherwise, an 
128e0 53 51 4c 69 74 65 20 65 72 72 6f 72 0a 2a 2a 20  SQLite error.** 
128f0 63 6f 64 65 2e 20 49 6e 20 74 68 69 73 20 63 61  code. In this ca
12900 73 65 2c 20 28 2a 70 7a 45 72 72 29 20 6d 61 79  se, (*pzErr) may
12910 20 62 65 20 73 65 74 20 74 6f 20 70 6f 69 6e 74   be set to point
12920 20 74 6f 20 61 20 62 75 66 66 65 72 20 63 6f 6e   to a buffer con
12930 74 61 69 6e 69 6e 67 0a 2a 2a 20 61 6e 20 45 6e  taining.** an En
12940 67 6c 69 73 68 20 6c 61 6e 67 75 61 67 65 20 65  glish language e
12950 72 72 6f 72 20 6d 65 73 73 61 67 65 2e 20 49 74  rror message. It
12960 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69   is the responsi
12970 62 69 6c 69 74 79 20 6f 66 20 74 68 65 0a 2a 2a  bility of the.**
12980 20 63 61 6c 6c 65 72 20 74 6f 20 65 76 65 6e 74   caller to event
12990 75 61 6c 6c 79 20 66 72 65 65 20 74 68 69 73 20  ually free this 
129a0 62 75 66 66 65 72 20 75 73 69 6e 67 20 73 71 6c  buffer using sql
129b0 69 74 65 33 5f 66 72 65 65 28 29 2e 0a 2a 2f 0a  ite3_free()..*/.
129c0 73 74 61 74 69 63 20 69 6e 74 20 65 78 70 65 72  static int exper
129d0 74 46 69 6e 69 73 68 28 0a 20 20 53 68 65 6c 6c  tFinish(.  Shell
129e0 53 74 61 74 65 20 2a 70 53 74 61 74 65 2c 0a 20  State *pState,. 
129f0 20 69 6e 74 20 62 43 61 6e 63 65 6c 2c 0a 20 20   int bCancel,.  
12a00 63 68 61 72 20 2a 2a 70 7a 45 72 72 0a 29 7b 0a  char **pzErr.){.
12a10 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
12a20 45 5f 4f 4b 3b 0a 20 20 73 71 6c 69 74 65 33 65  E_OK;.  sqlite3e
12a30 78 70 65 72 74 20 2a 70 20 3d 20 70 53 74 61 74  xpert *p = pStat
12a40 65 2d 3e 65 78 70 65 72 74 2e 70 45 78 70 65 72  e->expert.pExper
12a50 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70 20 29  t;.  assert( p )
12a60 3b 0a 20 20 61 73 73 65 72 74 28 20 62 43 61 6e  ;.  assert( bCan
12a70 63 65 6c 20 7c 7c 20 70 7a 45 72 72 3d 3d 30 20  cel || pzErr==0 
12a80 7c 7c 20 2a 70 7a 45 72 72 3d 3d 30 20 29 3b 0a  || *pzErr==0 );.
12a90 20 20 69 66 28 20 62 43 61 6e 63 65 6c 3d 3d 30    if( bCancel==0
12aa0 20 29 7b 0a 20 20 20 20 46 49 4c 45 20 2a 6f 75   ){.    FILE *ou
12ab0 74 20 3d 20 70 53 74 61 74 65 2d 3e 6f 75 74 3b  t = pState->out;
12ac0 0a 20 20 20 20 69 6e 74 20 62 56 65 72 62 6f 73  .    int bVerbos
12ad0 65 20 3d 20 70 53 74 61 74 65 2d 3e 65 78 70 65  e = pState->expe
12ae0 72 74 2e 62 56 65 72 62 6f 73 65 3b 0a 0a 20 20  rt.bVerbose;..  
12af0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65    rc = sqlite3_e
12b00 78 70 65 72 74 5f 61 6e 61 6c 79 7a 65 28 70 2c  xpert_analyze(p,
12b10 20 70 7a 45 72 72 29 3b 0a 20 20 20 20 69 66 28   pzErr);.    if(
12b20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
12b30 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 51 75 65  {.      int nQue
12b40 72 79 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 70  ry = sqlite3_exp
12b50 65 72 74 5f 63 6f 75 6e 74 28 70 29 3b 0a 20 20  ert_count(p);.  
12b60 20 20 20 20 69 6e 74 20 69 3b 0a 0a 20 20 20 20      int i;..    
12b70 20 20 69 66 28 20 62 56 65 72 62 6f 73 65 20 29    if( bVerbose )
12b80 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20  {.        const 
12b90 63 68 61 72 20 2a 7a 43 61 6e 64 20 3d 20 73 71  char *zCand = sq
12ba0 6c 69 74 65 33 5f 65 78 70 65 72 74 5f 72 65 70  lite3_expert_rep
12bb0 6f 72 74 28 70 2c 30 2c 45 58 50 45 52 54 5f 52  ort(p,0,EXPERT_R
12bc0 45 50 4f 52 54 5f 43 41 4e 44 49 44 41 54 45 53  EPORT_CANDIDATES
12bd0 29 3b 0a 20 20 20 20 20 20 20 20 72 61 77 5f 70  );.        raw_p
12be0 72 69 6e 74 66 28 6f 75 74 2c 20 22 2d 2d 20 43  rintf(out, "-- C
12bf0 61 6e 64 69 64 61 74 65 73 20 2d 2d 2d 2d 2d 2d  andidates ------
12c00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12c10 2d 2d 2d 2d 2d 2d 2d 5c 6e 22 29 3b 0a 20 20 20  -------\n");.   
12c20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
12c30 6f 75 74 2c 20 22 25 73 5c 6e 22 2c 20 7a 43 61  out, "%s\n", zCa
12c40 6e 64 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  nd);.      }.   
12c50 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 51     for(i=0; i<nQ
12c60 75 65 72 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  uery; i++){.    
12c70 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
12c80 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 65  zSql = sqlite3_e
12c90 78 70 65 72 74 5f 72 65 70 6f 72 74 28 70 2c 20  xpert_report(p, 
12ca0 69 2c 20 45 58 50 45 52 54 5f 52 45 50 4f 52 54  i, EXPERT_REPORT
12cb0 5f 53 51 4c 29 3b 0a 20 20 20 20 20 20 20 20 63  _SQL);.        c
12cc0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 64 78 20  onst char *zIdx 
12cd0 3d 20 73 71 6c 69 74 65 33 5f 65 78 70 65 72 74  = sqlite3_expert
12ce0 5f 72 65 70 6f 72 74 28 70 2c 20 69 2c 20 45 58  _report(p, i, EX
12cf0 50 45 52 54 5f 52 45 50 4f 52 54 5f 49 4e 44 45  PERT_REPORT_INDE
12d00 58 45 53 29 3b 0a 20 20 20 20 20 20 20 20 63 6f  XES);.        co
12d10 6e 73 74 20 63 68 61 72 20 2a 7a 45 51 50 20 3d  nst char *zEQP =
12d20 20 73 71 6c 69 74 65 33 5f 65 78 70 65 72 74 5f   sqlite3_expert_
12d30 72 65 70 6f 72 74 28 70 2c 20 69 2c 20 45 58 50  report(p, i, EXP
12d40 45 52 54 5f 52 45 50 4f 52 54 5f 50 4c 41 4e 29  ERT_REPORT_PLAN)
12d50 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 49  ;.        if( zI
12d60 64 78 3d 3d 30 20 29 20 7a 49 64 78 20 3d 20 22  dx==0 ) zIdx = "
12d70 28 6e 6f 20 6e 65 77 20 69 6e 64 65 78 65 73 29  (no new indexes)
12d80 5c 6e 22 3b 0a 20 20 20 20 20 20 20 20 69 66 28  \n";.        if(
12d90 20 62 56 65 72 62 6f 73 65 20 29 7b 0a 20 20 20   bVerbose ){.   
12da0 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74         raw_print
12db0 66 28 6f 75 74 2c 20 22 2d 2d 20 51 75 65 72 79  f(out, "-- Query
12dc0 20 25 64 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   %d ------------
12dd0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12de0 2d 2d 2d 2d 5c 6e 22 2c 69 2b 31 29 3b 0a 20 20  ----\n",i+1);.  
12df0 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e          raw_prin
12e00 74 66 28 6f 75 74 2c 20 22 25 73 5c 6e 5c 6e 22  tf(out, "%s\n\n"
12e10 2c 20 7a 53 71 6c 29 3b 0a 20 20 20 20 20 20 20  , zSql);.       
12e20 20 7d 0a 20 20 20 20 20 20 20 20 72 61 77 5f 70   }.        raw_p
12e30 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 73 5c 6e  rintf(out, "%s\n
12e40 22 2c 20 7a 49 64 78 29 3b 0a 20 20 20 20 20 20  ", zIdx);.      
12e50 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74    raw_printf(out
12e60 2c 20 22 25 73 5c 6e 22 2c 20 7a 45 51 50 29 3b  , "%s\n", zEQP);
12e70 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
12e80 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 65 78 70   }.  sqlite3_exp
12e90 65 72 74 5f 64 65 73 74 72 6f 79 28 70 29 3b 0a  ert_destroy(p);.
12ea0 20 20 70 53 74 61 74 65 2d 3e 65 78 70 65 72 74    pState->expert
12eb0 2e 70 45 78 70 65 72 74 20 3d 20 30 3b 0a 20 20  .pExpert = 0;.  
12ec0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
12ed0 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69  .** Implementati
12ee0 6f 6e 20 6f 66 20 22 2e 65 78 70 65 72 74 22 20  on of ".expert" 
12ef0 64 6f 74 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a  dot command..*/.
12f00 73 74 61 74 69 63 20 69 6e 74 20 65 78 70 65 72  static int exper
12f10 74 44 6f 74 43 6f 6d 6d 61 6e 64 28 0a 20 20 53  tDotCommand(.  S
12f20 68 65 6c 6c 53 74 61 74 65 20 2a 70 53 74 61 74  hellState *pStat
12f30 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  e,             /
12f40 2a 20 43 75 72 72 65 6e 74 20 73 68 65 6c 6c 20  * Current shell 
12f50 74 6f 6f 6c 20 73 74 61 74 65 20 2a 2f 0a 20 20  tool state */.  
12f60 63 68 61 72 20 2a 2a 61 7a 41 72 67 2c 20 20 20  char **azArg,   
12f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12f80 2f 2a 20 41 72 72 61 79 20 6f 66 20 61 72 67 75  /* Array of argu
12f90 6d 65 6e 74 73 20 70 61 73 73 65 64 20 74 6f 20  ments passed to 
12fa0 64 6f 74 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  dot command */. 
12fb0 20 69 6e 74 20 6e 41 72 67 20 20 20 20 20 20 20   int nArg       
12fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12fd0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e   /* Number of en
12fe0 74 72 69 65 73 20 69 6e 20 61 7a 41 72 67 5b 5d  tries in azArg[]
12ff0 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20   */.){.  int rc 
13000 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 63  = SQLITE_OK;.  c
13010 68 61 72 20 2a 7a 45 72 72 20 3d 20 30 3b 0a 20  har *zErr = 0;. 
13020 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 69 53   int i;.  int iS
13030 61 6d 70 6c 65 20 3d 20 30 3b 0a 0a 20 20 61 73  ample = 0;..  as
13040 73 65 72 74 28 20 70 53 74 61 74 65 2d 3e 65 78  sert( pState->ex
13050 70 65 72 74 2e 70 45 78 70 65 72 74 3d 3d 30 20  pert.pExpert==0 
13060 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 70 53 74  );.  memset(&pSt
13070 61 74 65 2d 3e 65 78 70 65 72 74 2c 20 30 2c 20  ate->expert, 0, 
13080 73 69 7a 65 6f 66 28 45 78 70 65 72 74 49 6e 66  sizeof(ExpertInf
13090 6f 29 29 3b 0a 0a 20 20 66 6f 72 28 69 3d 31 3b  o));..  for(i=1;
130a0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
130b0 26 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a  & i<nArg; i++){.
130c0 20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20 61 7a      char *z = az
130d0 41 72 67 5b 69 5d 3b 0a 20 20 20 20 69 6e 74 20  Arg[i];.    int 
130e0 6e 3b 0a 20 20 20 20 69 66 28 20 7a 5b 30 5d 3d  n;.    if( z[0]=
130f0 3d 27 2d 27 20 26 26 20 7a 5b 31 5d 3d 3d 27 2d  ='-' && z[1]=='-
13100 27 20 29 20 7a 2b 2b 3b 0a 20 20 20 20 6e 20 3d  ' ) z++;.    n =
13110 20 73 74 72 6c 65 6e 33 30 28 7a 29 3b 0a 20 20   strlen30(z);.  
13120 20 20 69 66 28 20 6e 3e 3d 32 20 26 26 20 30 3d    if( n>=2 && 0=
13130 3d 73 74 72 6e 63 6d 70 28 7a 2c 20 22 2d 76 65  =strncmp(z, "-ve
13140 72 62 6f 73 65 22 2c 20 6e 29 20 29 7b 0a 20 20  rbose", n) ){.  
13150 20 20 20 20 70 53 74 61 74 65 2d 3e 65 78 70 65      pState->expe
13160 72 74 2e 62 56 65 72 62 6f 73 65 20 3d 20 31 3b  rt.bVerbose = 1;
13170 0a 20 20 20 20 7d 0a 20 20 20 20 65 6c 73 65 20  .    }.    else 
13180 69 66 28 20 6e 3e 3d 32 20 26 26 20 30 3d 3d 73  if( n>=2 && 0==s
13190 74 72 6e 63 6d 70 28 7a 2c 20 22 2d 73 61 6d 70  trncmp(z, "-samp
131a0 6c 65 22 2c 20 6e 29 20 29 7b 0a 20 20 20 20 20  le", n) ){.     
131b0 20 69 66 28 20 69 3d 3d 28 6e 41 72 67 2d 31 29   if( i==(nArg-1)
131c0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 61 77 5f   ){.        raw_
131d0 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
131e0 6f 70 74 69 6f 6e 20 72 65 71 75 69 72 65 73 20  option requires 
131f0 61 6e 20 61 72 67 75 6d 65 6e 74 3a 20 25 73 5c  an argument: %s\
13200 6e 22 2c 20 7a 29 3b 0a 20 20 20 20 20 20 20 20  n", z);.        
13210 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
13220 52 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  R;.      }else{.
13230 20 20 20 20 20 20 20 20 69 53 61 6d 70 6c 65 20          iSample 
13240 3d 20 28 69 6e 74 29 69 6e 74 65 67 65 72 56 61  = (int)integerVa
13250 6c 75 65 28 61 7a 41 72 67 5b 2b 2b 69 5d 29 3b  lue(azArg[++i]);
13260 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 53 61  .        if( iSa
13270 6d 70 6c 65 3c 30 20 7c 7c 20 69 53 61 6d 70 6c  mple<0 || iSampl
13280 65 3e 31 30 30 20 29 7b 0a 20 20 20 20 20 20 20  e>100 ){.       
13290 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74     raw_printf(st
132a0 64 65 72 72 2c 20 22 76 61 6c 75 65 20 6f 75 74  derr, "value out
132b0 20 6f 66 20 72 61 6e 67 65 3a 20 25 73 5c 6e 22   of range: %s\n"
132c0 2c 20 61 7a 41 72 67 5b 69 5d 29 3b 0a 20 20 20  , azArg[i]);.   
132d0 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
132e0 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  TE_ERROR;.      
132f0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
13300 7d 0a 20 20 20 20 65 6c 73 65 7b 0a 20 20 20 20  }.    else{.    
13310 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64    raw_printf(std
13320 65 72 72 2c 20 22 75 6e 6b 6e 6f 77 6e 20 6f 70  err, "unknown op
13330 74 69 6f 6e 3a 20 25 73 5c 6e 22 2c 20 7a 29 3b  tion: %s\n", z);
13340 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
13350 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  TE_ERROR;.    }.
13360 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53    }..  if( rc==S
13370 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
13380 70 53 74 61 74 65 2d 3e 65 78 70 65 72 74 2e 70  pState->expert.p
13390 45 78 70 65 72 74 20 3d 20 73 71 6c 69 74 65 33  Expert = sqlite3
133a0 5f 65 78 70 65 72 74 5f 6e 65 77 28 70 53 74 61  _expert_new(pSta
133b0 74 65 2d 3e 64 62 2c 20 26 7a 45 72 72 29 3b 0a  te->db, &zErr);.
133c0 20 20 20 20 69 66 28 20 70 53 74 61 74 65 2d 3e      if( pState->
133d0 65 78 70 65 72 74 2e 70 45 78 70 65 72 74 3d 3d  expert.pExpert==
133e0 30 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70  0 ){.      raw_p
133f0 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 73  rintf(stderr, "s
13400 71 6c 69 74 65 33 5f 65 78 70 65 72 74 5f 6e 65  qlite3_expert_ne
13410 77 3a 20 25 73 5c 6e 22 2c 20 7a 45 72 72 29 3b  w: %s\n", zErr);
13420 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
13430 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 65  TE_ERROR;.    }e
13440 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
13450 65 33 5f 65 78 70 65 72 74 5f 63 6f 6e 66 69 67  e3_expert_config
13460 28 0a 20 20 20 20 20 20 20 20 20 20 70 53 74 61  (.          pSta
13470 74 65 2d 3e 65 78 70 65 72 74 2e 70 45 78 70 65  te->expert.pExpe
13480 72 74 2c 20 45 58 50 45 52 54 5f 43 4f 4e 46 49  rt, EXPERT_CONFI
13490 47 5f 53 41 4d 50 4c 45 2c 20 69 53 61 6d 70 6c  G_SAMPLE, iSampl
134a0 65 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d  e.      );.    }
134b0 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
134c0 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 69  c;.}.#endif /* i
134d0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
134e0 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a  T_VIRTUALTABLE *
134f0 2f 0a 0a 2f 2a 0a 2a 2a 20 45 78 65 63 75 74 65  /../*.** Execute
13500 20 61 20 73 74 61 74 65 6d 65 6e 74 20 6f 72 20   a statement or 
13510 73 65 74 20 6f 66 20 73 74 61 74 65 6d 65 6e 74  set of statement
13520 73 2e 20 20 50 72 69 6e 74 0a 2a 2a 20 61 6e 79  s.  Print.** any
13530 20 72 65 73 75 6c 74 20 72 6f 77 73 2f 63 6f 6c   result rows/col
13540 75 6d 6e 73 20 64 65 70 65 6e 64 69 6e 67 20 6f  umns depending o
13550 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 6d 6f  n the current mo
13560 64 65 0a 2a 2a 20 73 65 74 20 76 69 61 20 74 68  de.** set via th
13570 65 20 73 75 70 70 6c 69 65 64 20 63 61 6c 6c 62  e supplied callb
13580 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ack..**.** This 
13590 69 73 20 76 65 72 79 20 73 69 6d 69 6c 61 72 20  is very similar 
135a0 74 6f 20 53 51 4c 69 74 65 27 73 20 62 75 69 6c  to SQLite's buil
135b0 74 2d 69 6e 20 73 71 6c 69 74 65 33 5f 65 78 65  t-in sqlite3_exe
135c0 63 28 29 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  c().** function 
135d0 65 78 63 65 70 74 20 69 74 20 74 61 6b 65 73 20  except it takes 
135e0 61 20 73 6c 69 67 68 74 6c 79 20 64 69 66 66 65  a slightly diffe
135f0 72 65 6e 74 20 63 61 6c 6c 62 61 63 6b 0a 2a 2a  rent callback.**
13600 20 61 6e 64 20 63 61 6c 6c 62 61 63 6b 20 64 61   and callback da
13610 74 61 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a  ta argument..*/.
13620 73 74 61 74 69 63 20 69 6e 74 20 73 68 65 6c 6c  static int shell
13630 5f 65 78 65 63 28 0a 20 20 73 71 6c 69 74 65 33  _exec(.  sqlite3
13640 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20   *db,           
13650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13660 20 20 20 2f 2a 20 41 6e 20 6f 70 65 6e 20 64 61     /* An open da
13670 74 61 62 61 73 65 20 2a 2f 0a 20 20 63 6f 6e 73  tabase */.  cons
13680 74 20 63 68 61 72 20 2a 7a 53 71 6c 2c 20 20 20  t char *zSql,   
13690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
136a0 20 20 20 20 20 20 2f 2a 20 53 51 4c 20 74 6f 20        /* SQL to 
136b0 62 65 20 65 76 61 6c 75 61 74 65 64 20 2a 2f 0a  be evaluated */.
136c0 20 20 69 6e 74 20 28 2a 78 43 61 6c 6c 62 61 63    int (*xCallbac
136d0 6b 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 68 61  k)(void*,int,cha
136e0 72 2a 2a 2c 63 68 61 72 2a 2a 2c 69 6e 74 2a 29  r**,char**,int*)
136f0 2c 20 20 20 2f 2a 20 43 61 6c 6c 62 61 63 6b 20  ,   /* Callback 
13700 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  function */.    
13710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13730 20 20 20 20 20 20 20 20 2f 2a 20 28 6e 6f 74 20          /* (not 
13740 74 68 65 20 73 61 6d 65 20 61 73 20 73 71 6c 69  the same as sqli
13750 74 65 33 5f 65 78 65 63 29 20 2a 2f 0a 20 20 53  te3_exec) */.  S
13760 68 65 6c 6c 53 74 61 74 65 20 2a 70 41 72 67 2c  hellState *pArg,
13770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13780 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
13790 74 65 72 20 74 6f 20 53 68 65 6c 6c 53 74 61 74  ter to ShellStat
137a0 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70 7a  e */.  char **pz
137b0 45 72 72 4d 73 67 20 20 20 20 20 20 20 20 20 20  ErrMsg          
137c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
137d0 20 2f 2a 20 45 72 72 6f 72 20 6d 73 67 20 77 72   /* Error msg wr
137e0 69 74 74 65 6e 20 68 65 72 65 20 2a 2f 0a 29 7b  itten here */.){
137f0 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
13800 2a 70 53 74 6d 74 20 3d 20 4e 55 4c 4c 3b 20 20  *pStmt = NULL;  
13810 20 20 20 2f 2a 20 53 74 61 74 65 6d 65 6e 74 20     /* Statement 
13820 74 6f 20 65 78 65 63 75 74 65 2e 20 2a 2f 0a 20  to execute. */. 
13830 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
13840 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
13850 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64 65 20   /* Return Code 
13860 2a 2f 0a 20 20 69 6e 74 20 72 63 32 3b 0a 20 20  */.  int rc2;.  
13870 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4c 65 66  const char *zLef
13880 74 6f 76 65 72 3b 20 20 20 20 20 20 20 20 20 20  tover;          
13890 2f 2a 20 54 61 69 6c 20 6f 66 20 75 6e 70 72 6f  /* Tail of unpro
138a0 63 65 73 73 65 64 20 53 51 4c 20 2a 2f 0a 0a 20  cessed SQL */.. 
138b0 20 69 66 28 20 70 7a 45 72 72 4d 73 67 20 29 7b   if( pzErrMsg ){
138c0 0a 20 20 20 20 2a 70 7a 45 72 72 4d 73 67 20 3d  .    *pzErrMsg =
138d0 20 4e 55 4c 4c 3b 0a 20 20 7d 0a 0a 23 69 66 6e   NULL;.  }..#ifn
138e0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
138f0 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 69  VIRTUALTABLE.  i
13900 66 28 20 70 41 72 67 2d 3e 65 78 70 65 72 74 2e  f( pArg->expert.
13910 70 45 78 70 65 72 74 20 29 7b 0a 20 20 20 20 72  pExpert ){.    r
13920 63 20 3d 20 65 78 70 65 72 74 48 61 6e 64 6c 65  c = expertHandle
13930 53 51 4c 28 70 41 72 67 2c 20 7a 53 71 6c 2c 20  SQL(pArg, zSql, 
13940 70 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 72  pzErrMsg);.    r
13950 65 74 75 72 6e 20 65 78 70 65 72 74 46 69 6e 69  eturn expertFini
13960 73 68 28 70 41 72 67 2c 20 28 72 63 21 3d 53 51  sh(pArg, (rc!=SQ
13970 4c 49 54 45 5f 4f 4b 29 2c 20 70 7a 45 72 72 4d  LITE_OK), pzErrM
13980 73 67 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  sg);.  }.#endif.
13990 0a 20 20 77 68 69 6c 65 28 20 7a 53 71 6c 5b 30  .  while( zSql[0
139a0 5d 20 26 26 20 28 53 51 4c 49 54 45 5f 4f 4b 20  ] && (SQLITE_OK 
139b0 3d 3d 20 72 63 29 20 29 7b 0a 20 20 20 20 73 74  == rc) ){.    st
139c0 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
139d0 2a 7a 53 74 6d 74 53 71 6c 3b 0a 20 20 20 20 72  *zStmtSql;.    r
139e0 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70  c = sqlite3_prep
139f0 61 72 65 5f 76 32 28 64 62 2c 20 7a 53 71 6c 2c  are_v2(db, zSql,
13a00 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 26 7a 4c   -1, &pStmt, &zL
13a10 65 66 74 6f 76 65 72 29 3b 0a 20 20 20 20 69 66  eftover);.    if
13a20 28 20 53 51 4c 49 54 45 5f 4f 4b 20 21 3d 20 72  ( SQLITE_OK != r
13a30 63 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  c ){.      if( p
13a40 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20 20  zErrMsg ){.     
13a50 20 20 20 2a 70 7a 45 72 72 4d 73 67 20 3d 20 73     *pzErrMsg = s
13a60 61 76 65 5f 65 72 72 5f 6d 73 67 28 64 62 29 3b  ave_err_msg(db);
13a70 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
13a80 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20 21 70  se{.      if( !p
13a90 53 74 6d 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Stmt ){.        
13aa0 2f 2a 20 74 68 69 73 20 68 61 70 70 65 6e 73 20  /* this happens 
13ab0 66 6f 72 20 61 20 63 6f 6d 6d 65 6e 74 20 6f 72  for a comment or
13ac0 20 77 68 69 74 65 2d 73 70 61 63 65 20 2a 2f 0a   white-space */.
13ad0 20 20 20 20 20 20 20 20 7a 53 71 6c 20 3d 20 7a          zSql = z
13ae0 4c 65 66 74 6f 76 65 72 3b 0a 20 20 20 20 20 20  Leftover;.      
13af0 20 20 77 68 69 6c 65 28 20 49 73 53 70 61 63 65    while( IsSpace
13b00 28 7a 53 71 6c 5b 30 5d 29 20 29 20 7a 53 71 6c  (zSql[0]) ) zSql
13b10 2b 2b 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74  ++;.        cont
13b20 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20  inue;.      }.  
13b30 20 20 20 20 7a 53 74 6d 74 53 71 6c 20 3d 20 73      zStmtSql = s
13b40 71 6c 69 74 65 33 5f 73 71 6c 28 70 53 74 6d 74  qlite3_sql(pStmt
13b50 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 53 74  );.      if( zSt
13b60 6d 74 53 71 6c 3d 3d 30 20 29 20 7a 53 74 6d 74  mtSql==0 ) zStmt
13b70 53 71 6c 20 3d 20 22 22 3b 0a 20 20 20 20 20 20  Sql = "";.      
13b80 77 68 69 6c 65 28 20 49 73 53 70 61 63 65 28 7a  while( IsSpace(z
13b90 53 74 6d 74 53 71 6c 5b 30 5d 29 20 29 20 7a 53  StmtSql[0]) ) zS
13ba0 74 6d 74 53 71 6c 2b 2b 3b 0a 0a 20 20 20 20 20  tmtSql++;..     
13bb0 20 2f 2a 20 73 61 76 65 20 6f 66 66 20 74 68 65   /* save off the
13bc0 20 70 72 65 70 61 72 65 64 20 73 74 61 74 6d 65   prepared statme
13bd0 6e 74 20 68 61 6e 64 6c 65 20 61 6e 64 20 72 65  nt handle and re
13be0 73 65 74 20 72 6f 77 20 63 6f 75 6e 74 20 2a 2f  set row count */
13bf0 0a 20 20 20 20 20 20 69 66 28 20 70 41 72 67 20  .      if( pArg 
13c00 29 7b 0a 20 20 20 20 20 20 20 20 70 41 72 67 2d  ){.        pArg-
13c10 3e 70 53 74 6d 74 20 3d 20 70 53 74 6d 74 3b 0a  >pStmt = pStmt;.
13c20 20 20 20 20 20 20 20 20 70 41 72 67 2d 3e 63 6e          pArg->cn
13c30 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 0a  t = 0;.      }..
13c40 20 20 20 20 20 20 2f 2a 20 65 63 68 6f 20 74 68        /* echo th
13c50 65 20 73 71 6c 20 73 74 61 74 65 6d 65 6e 74 20  e sql statement 
13c60 69 66 20 65 63 68 6f 20 6f 6e 20 2a 2f 0a 20 20  if echo on */.  
13c70 20 20 20 20 69 66 28 20 70 41 72 67 20 26 26 20      if( pArg && 
13c80 53 68 65 6c 6c 48 61 73 46 6c 61 67 28 70 41 72  ShellHasFlag(pAr
13c90 67 2c 20 53 48 46 4c 47 5f 45 63 68 6f 29 20 29  g, SHFLG_Echo) )
13ca0 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70  {.        utf8_p
13cb0 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c  rintf(pArg->out,
13cc0 20 22 25 73 5c 6e 22 2c 20 7a 53 74 6d 74 53 71   "%s\n", zStmtSq
13cd0 6c 20 3f 20 7a 53 74 6d 74 53 71 6c 20 3a 20 7a  l ? zStmtSql : z
13ce0 53 71 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  Sql);.      }.. 
13cf0 20 20 20 20 20 2f 2a 20 53 68 6f 77 20 74 68 65       /* Show the
13d00 20 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50   EXPLAIN QUERY P
13d10 4c 41 4e 20 69 66 20 2e 65 71 70 20 69 73 20 6f  LAN if .eqp is o
13d20 6e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70  n */.      if( p
13d30 41 72 67 20 26 26 20 70 41 72 67 2d 3e 61 75 74  Arg && pArg->aut
13d40 6f 45 51 50 20 26 26 20 73 71 6c 69 74 65 33 5f  oEQP && sqlite3_
13d50 73 74 72 6c 69 6b 65 28 22 45 58 50 4c 41 49 4e  strlike("EXPLAIN
13d60 25 22 2c 7a 53 74 6d 74 53 71 6c 2c 30 29 21 3d  %",zStmtSql,0)!=
13d70 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 ){.        sql
13d80 69 74 65 33 5f 73 74 6d 74 20 2a 70 45 78 70 6c  ite3_stmt *pExpl
13d90 61 69 6e 3b 0a 20 20 20 20 20 20 20 20 63 68 61  ain;.        cha
13da0 72 20 2a 7a 45 51 50 3b 0a 20 20 20 20 20 20 20  r *zEQP;.       
13db0 20 69 6e 74 20 74 72 69 67 67 65 72 45 51 50 20   int triggerEQP 
13dc0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 64 69 73  = 0;.        dis
13dd0 61 62 6c 65 5f 64 65 62 75 67 5f 74 72 61 63 65  able_debug_trace
13de0 5f 6d 6f 64 65 73 28 29 3b 0a 20 20 20 20 20 20  _modes();.      
13df0 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 63 6f 6e    sqlite3_db_con
13e00 66 69 67 28 64 62 2c 20 53 51 4c 49 54 45 5f 44  fig(db, SQLITE_D
13e10 42 43 4f 4e 46 49 47 5f 54 52 49 47 47 45 52 5f  BCONFIG_TRIGGER_
13e20 45 51 50 2c 20 2d 31 2c 20 26 74 72 69 67 67 65  EQP, -1, &trigge
13e30 72 45 51 50 29 3b 0a 20 20 20 20 20 20 20 20 69  rEQP);.        i
13e40 66 28 20 70 41 72 67 2d 3e 61 75 74 6f 45 51 50  f( pArg->autoEQP
13e50 3e 3d 41 55 54 4f 45 51 50 5f 74 72 69 67 67 65  >=AUTOEQP_trigge
13e60 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  r ){.          s
13e70 71 6c 69 74 65 33 5f 64 62 5f 63 6f 6e 66 69 67  qlite3_db_config
13e80 28 64 62 2c 20 53 51 4c 49 54 45 5f 44 42 43 4f  (db, SQLITE_DBCO
13e90 4e 46 49 47 5f 54 52 49 47 47 45 52 5f 45 51 50  NFIG_TRIGGER_EQP
13ea0 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  , 1, 0);.       
13eb0 20 7d 0a 20 20 20 20 20 20 20 20 7a 45 51 50 20   }.        zEQP 
13ec0 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
13ed0 66 28 22 45 58 50 4c 41 49 4e 20 51 55 45 52 59  f("EXPLAIN QUERY
13ee0 20 50 4c 41 4e 20 25 73 22 2c 20 7a 53 74 6d 74   PLAN %s", zStmt
13ef0 53 71 6c 29 3b 0a 20 20 20 20 20 20 20 20 72 63  Sql);.        rc
13f00 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61   = sqlite3_prepa
13f10 72 65 5f 76 32 28 64 62 2c 20 7a 45 51 50 2c 20  re_v2(db, zEQP, 
13f20 2d 31 2c 20 26 70 45 78 70 6c 61 69 6e 2c 20 30  -1, &pExplain, 0
13f30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
13f40 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
13f50 20 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28            while(
13f60 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 45   sqlite3_step(pE
13f70 78 70 6c 61 69 6e 29 3d 3d 53 51 4c 49 54 45 5f  xplain)==SQLITE_
13f80 52 4f 57 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ROW ){.         
13f90 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 41     raw_printf(pA
13fa0 72 67 2d 3e 6f 75 74 2c 22 2d 2d 45 51 50 2d 2d  rg->out,"--EQP--
13fb0 20 25 64 2c 22 2c 73 71 6c 69 74 65 33 5f 63 6f   %d,",sqlite3_co
13fc0 6c 75 6d 6e 5f 69 6e 74 28 70 45 78 70 6c 61 69  lumn_int(pExplai
13fd0 6e 2c 20 30 29 29 3b 0a 20 20 20 20 20 20 20 20  n, 0));.        
13fe0 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70      raw_printf(p
13ff0 41 72 67 2d 3e 6f 75 74 2c 22 25 64 2c 22 2c 20  Arg->out,"%d,", 
14000 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69  sqlite3_column_i
14010 6e 74 28 70 45 78 70 6c 61 69 6e 2c 20 31 29 29  nt(pExplain, 1))
14020 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 61  ;.            ra
14030 77 5f 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f  w_printf(pArg->o
14040 75 74 2c 22 25 64 2c 22 2c 20 73 71 6c 69 74 65  ut,"%d,", sqlite
14050 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 45 78  3_column_int(pEx
14060 70 6c 61 69 6e 2c 20 32 29 29 3b 0a 20 20 20 20  plain, 2));.    
14070 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69          utf8_pri
14080 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c 22 25  ntf(pArg->out,"%
14090 73 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f 63 6f  s\n", sqlite3_co
140a0 6c 75 6d 6e 5f 74 65 78 74 28 70 45 78 70 6c 61  lumn_text(pExpla
140b0 69 6e 2c 20 33 29 29 3b 0a 20 20 20 20 20 20 20  in, 3));.       
140c0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
140d0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
140e0 69 6e 61 6c 69 7a 65 28 70 45 78 70 6c 61 69 6e  inalize(pExplain
140f0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
14100 65 33 5f 66 72 65 65 28 7a 45 51 50 29 3b 0a 20  e3_free(zEQP);. 
14110 20 20 20 20 20 20 20 69 66 28 20 70 41 72 67 2d         if( pArg-
14120 3e 61 75 74 6f 45 51 50 3e 3d 41 55 54 4f 45 51  >autoEQP>=AUTOEQ
14130 50 5f 66 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20  P_full ){.      
14140 20 20 20 20 2f 2a 20 41 6c 73 6f 20 64 6f 20 61      /* Also do a
14150 6e 20 45 58 50 4c 41 49 4e 20 66 6f 72 20 22 2e  n EXPLAIN for ".
14160 65 71 70 20 66 75 6c 6c 22 20 6d 6f 64 65 20 2a  eqp full" mode *
14170 2f 0a 20 20 20 20 20 20 20 20 20 20 7a 45 51 50  /.          zEQP
14180 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
14190 74 66 28 22 45 58 50 4c 41 49 4e 20 25 73 22 2c  tf("EXPLAIN %s",
141a0 20 7a 53 74 6d 74 53 71 6c 29 3b 0a 20 20 20 20   zStmtSql);.    
141b0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
141c0 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 64 62  e3_prepare_v2(db
141d0 2c 20 7a 45 51 50 2c 20 2d 31 2c 20 26 70 45 78  , zEQP, -1, &pEx
141e0 70 6c 61 69 6e 2c 20 30 29 3b 0a 20 20 20 20 20  plain, 0);.     
141f0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
14200 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
14210 20 20 20 20 20 20 70 41 72 67 2d 3e 63 4d 6f 64        pArg->cMod
14220 65 20 3d 20 4d 4f 44 45 5f 45 78 70 6c 61 69 6e  e = MODE_Explain
14230 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 65 78  ;.            ex
14240 70 6c 61 69 6e 5f 64 61 74 61 5f 70 72 65 70 61  plain_data_prepa
14250 72 65 28 70 41 72 67 2c 20 70 45 78 70 6c 61 69  re(pArg, pExplai
14260 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  n);.            
14270 65 78 65 63 5f 70 72 65 70 61 72 65 64 5f 73 74  exec_prepared_st
14280 6d 74 28 70 41 72 67 2c 20 70 45 78 70 6c 61 69  mt(pArg, pExplai
14290 6e 2c 20 78 43 61 6c 6c 62 61 63 6b 29 3b 0a 20  n, xCallback);. 
142a0 20 20 20 20 20 20 20 20 20 20 20 65 78 70 6c 61             expla
142b0 69 6e 5f 64 61 74 61 5f 64 65 6c 65 74 65 28 70  in_data_delete(p
142c0 41 72 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Arg);.          
142d0 7d 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  }.          sqli
142e0 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 45 78  te3_finalize(pEx
142f0 70 6c 61 69 6e 29 3b 0a 20 20 20 20 20 20 20 20  plain);.        
14300 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
14310 45 51 50 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  EQP);.        }.
14320 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
14330 64 62 5f 63 6f 6e 66 69 67 28 64 62 2c 20 53 51  db_config(db, SQ
14340 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f 54 52  LITE_DBCONFIG_TR
14350 49 47 47 45 52 5f 45 51 50 2c 20 74 72 69 67 67  IGGER_EQP, trigg
14360 65 72 45 51 50 2c 20 30 29 3b 0a 20 20 20 20 20  erEQP, 0);.     
14370 20 20 20 72 65 73 74 6f 72 65 5f 64 65 62 75 67     restore_debug
14380 5f 74 72 61 63 65 5f 6d 6f 64 65 73 28 29 3b 0a  _trace_modes();.
14390 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69        }..      i
143a0 66 28 20 70 41 72 67 20 29 7b 0a 20 20 20 20 20  f( pArg ){.     
143b0 20 20 20 70 41 72 67 2d 3e 63 4d 6f 64 65 20 3d     pArg->cMode =
143c0 20 70 41 72 67 2d 3e 6d 6f 64 65 3b 0a 20 20 20   pArg->mode;.   
143d0 20 20 20 20 20 69 66 28 20 70 41 72 67 2d 3e 61       if( pArg->a
143e0 75 74 6f 45 78 70 6c 61 69 6e 0a 20 20 20 20 20  utoExplain.     
143f0 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 5f 63      && sqlite3_c
14400 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 70 53 74 6d  olumn_count(pStm
14410 74 29 3d 3d 38 0a 20 20 20 20 20 20 20 20 20 26  t)==8.         &
14420 26 20 73 71 6c 69 74 65 33 5f 73 74 72 6c 69 6b  & sqlite3_strlik
14430 65 28 22 45 58 50 4c 41 49 4e 25 22 2c 20 7a 53  e("EXPLAIN%", zS
14440 74 6d 74 53 71 6c 2c 30 29 3d 3d 30 0a 20 20 20  tmtSql,0)==0.   
14450 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
14460 20 20 70 41 72 67 2d 3e 63 4d 6f 64 65 20 3d 20    pArg->cMode = 
14470 4d 4f 44 45 5f 45 78 70 6c 61 69 6e 3b 0a 20 20  MODE_Explain;.  
14480 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
14490 20 2f 2a 20 49 66 20 74 68 65 20 73 68 65 6c 6c   /* If the shell
144a0 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 69 6e   is currently in
144b0 20 22 2e 65 78 70 6c 61 69 6e 22 20 6d 6f 64 65   ".explain" mode
144c0 2c 20 67 61 74 68 65 72 20 74 68 65 20 65 78 74  , gather the ext
144d0 72 61 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 61  ra.        ** da
144e0 74 61 20 72 65 71 75 69 72 65 64 20 74 6f 20 61  ta required to a
144f0 64 64 20 69 6e 64 65 6e 74 73 20 74 6f 20 74 68  dd indents to th
14500 65 20 6f 75 74 70 75 74 2e 2a 2f 0a 20 20 20 20  e output.*/.    
14510 20 20 20 20 69 66 28 20 70 41 72 67 2d 3e 63 4d      if( pArg->cM
14520 6f 64 65 3d 3d 4d 4f 44 45 5f 45 78 70 6c 61 69  ode==MODE_Explai
14530 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 65  n ){.          e
14540 78 70 6c 61 69 6e 5f 64 61 74 61 5f 70 72 65 70  xplain_data_prep
14550 61 72 65 28 70 41 72 67 2c 20 70 53 74 6d 74 29  are(pArg, pStmt)
14560 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
14570 20 20 7d 0a 0a 20 20 20 20 20 20 65 78 65 63 5f    }..      exec_
14580 70 72 65 70 61 72 65 64 5f 73 74 6d 74 28 70 41  prepared_stmt(pA
14590 72 67 2c 20 70 53 74 6d 74 2c 20 78 43 61 6c 6c  rg, pStmt, xCall
145a0 62 61 63 6b 29 3b 0a 20 20 20 20 20 20 65 78 70  back);.      exp
145b0 6c 61 69 6e 5f 64 61 74 61 5f 64 65 6c 65 74 65  lain_data_delete
145c0 28 70 41 72 67 29 3b 0a 0a 20 20 20 20 20 20 2f  (pArg);..      /
145d0 2a 20 70 72 69 6e 74 20 75 73 61 67 65 20 73 74  * print usage st
145e0 61 74 73 20 69 66 20 73 74 61 74 73 20 6f 6e 20  ats if stats on 
145f0 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 41 72  */.      if( pAr
14600 67 20 26 26 20 70 41 72 67 2d 3e 73 74 61 74 73  g && pArg->stats
14610 4f 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 64 69  On ){.        di
14620 73 70 6c 61 79 5f 73 74 61 74 73 28 64 62 2c 20  splay_stats(db, 
14630 70 41 72 67 2c 20 30 29 3b 0a 20 20 20 20 20 20  pArg, 0);.      
14640 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 70 72 69 6e  }..      /* prin
14650 74 20 6c 6f 6f 70 2d 63 6f 75 6e 74 65 72 73 20  t loop-counters 
14660 69 66 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20  if required */. 
14670 20 20 20 20 20 69 66 28 20 70 41 72 67 20 26 26       if( pArg &&
14680 20 70 41 72 67 2d 3e 73 63 61 6e 73 74 61 74 73   pArg->scanstats
14690 4f 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 64 69  On ){.        di
146a0 73 70 6c 61 79 5f 73 63 61 6e 73 74 61 74 73 28  splay_scanstats(
146b0 64 62 2c 20 70 41 72 67 29 3b 0a 20 20 20 20 20  db, pArg);.     
146c0 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 46 69 6e   }..      /* Fin
146d0 61 6c 69 7a 65 20 74 68 65 20 73 74 61 74 65 6d  alize the statem
146e0 65 6e 74 20 6a 75 73 74 20 65 78 65 63 75 74 65  ent just execute
146f0 64 2e 20 49 66 20 74 68 69 73 20 66 61 69 6c 73  d. If this fails
14700 2c 20 73 61 76 65 20 61 0a 20 20 20 20 20 20 2a  , save a.      *
14710 2a 20 63 6f 70 79 20 6f 66 20 74 68 65 20 65 72  * copy of the er
14720 72 6f 72 20 6d 65 73 73 61 67 65 2e 20 4f 74 68  ror message. Oth
14730 65 72 77 69 73 65 2c 20 73 65 74 20 7a 53 71 6c  erwise, set zSql
14740 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65   to point to the
14750 0a 20 20 20 20 20 20 2a 2a 20 6e 65 78 74 20 73  .      ** next s
14760 74 61 74 65 6d 65 6e 74 20 74 6f 20 65 78 65 63  tatement to exec
14770 75 74 65 2e 20 2a 2f 0a 20 20 20 20 20 20 72 63  ute. */.      rc
14780 32 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6e 61  2 = sqlite3_fina
14790 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20  lize(pStmt);.   
147a0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
147b0 45 5f 4e 4f 4d 45 4d 20 29 20 72 63 20 3d 20 72  E_NOMEM ) rc = r
147c0 63 32 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  c2;.      if( rc
147d0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
147e0 20 20 20 20 20 20 20 7a 53 71 6c 20 3d 20 7a 4c         zSql = zL
147f0 65 66 74 6f 76 65 72 3b 0a 20 20 20 20 20 20 20  eftover;.       
14800 20 77 68 69 6c 65 28 20 49 73 53 70 61 63 65 28   while( IsSpace(
14810 7a 53 71 6c 5b 30 5d 29 20 29 20 7a 53 71 6c 2b  zSql[0]) ) zSql+
14820 2b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  +;.      }else i
14830 66 28 20 70 7a 45 72 72 4d 73 67 20 29 7b 0a 20  f( pzErrMsg ){. 
14840 20 20 20 20 20 20 20 2a 70 7a 45 72 72 4d 73 67         *pzErrMsg
14850 20 3d 20 73 61 76 65 5f 65 72 72 5f 6d 73 67 28   = save_err_msg(
14860 64 62 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  db);.      }..  
14870 20 20 20 20 2f 2a 20 63 6c 65 61 72 20 73 61 76      /* clear sav
14880 65 64 20 73 74 6d 74 20 68 61 6e 64 6c 65 20 2a  ed stmt handle *
14890 2f 0a 20 20 20 20 20 20 69 66 28 20 70 41 72 67  /.      if( pArg
148a0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 41 72 67   ){.        pArg
148b0 2d 3e 70 53 74 6d 74 20 3d 20 4e 55 4c 4c 3b 0a  ->pStmt = NULL;.
148c0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
148d0 7d 20 2f 2a 20 65 6e 64 20 77 68 69 6c 65 20 2a  } /* end while *
148e0 2f 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  /..  return rc;.
148f0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65  }../*.** Release
14900 20 6d 65 6d 6f 72 79 20 70 72 65 76 69 6f 75 73   memory previous
14910 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20  ly allocated by 
14920 74 61 62 6c 65 43 6f 6c 75 6d 6e 4c 69 73 74 28  tableColumnList(
14930 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  )..*/.static voi
14940 64 20 66 72 65 65 43 6f 6c 75 6d 6e 4c 69 73 74  d freeColumnList
14950 28 63 68 61 72 20 2a 2a 61 7a 43 6f 6c 29 7b 0a  (char **azCol){.
14960 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69    int i;.  for(i
14970 3d 31 3b 20 61 7a 43 6f 6c 5b 69 5d 3b 20 69 2b  =1; azCol[i]; i+
14980 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  +){.    sqlite3_
14990 66 72 65 65 28 61 7a 43 6f 6c 5b 69 5d 29 3b 0a  free(azCol[i]);.
149a0 20 20 7d 0a 20 20 2f 2a 20 61 7a 43 6f 6c 5b 30    }.  /* azCol[0
149b0 5d 20 69 73 20 61 20 73 74 61 74 69 63 20 73 74  ] is a static st
149c0 72 69 6e 67 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ring */.  sqlite
149d0 33 5f 66 72 65 65 28 61 7a 43 6f 6c 29 3b 0a 7d  3_free(azCol);.}
149e0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
149f0 20 6c 69 73 74 20 6f 66 20 70 6f 69 6e 74 65 72   list of pointer
14a00 73 20 74 6f 20 73 74 72 69 6e 67 73 20 77 68 69  s to strings whi
14a10 63 68 20 61 72 65 20 74 68 65 20 6e 61 6d 65 73  ch are the names
14a20 20 6f 66 20 61 6c 6c 0a 2a 2a 20 63 6f 6c 75 6d   of all.** colum
14a30 6e 73 20 69 6e 20 74 61 62 6c 65 20 7a 54 61 62  ns in table zTab
14a40 2e 20 20 20 54 68 65 20 6d 65 6d 6f 72 79 20 74  .   The memory t
14a50 6f 20 68 6f 6c 64 20 74 68 65 20 6e 61 6d 65 73  o hold the names
14a60 20 69 73 20 64 79 6e 61 6d 69 63 61 6c 6c 79 0a   is dynamically.
14a70 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64  ** allocated and
14a80 20 6d 75 73 74 20 62 65 20 72 65 6c 65 61 73 65   must be release
14a90 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 20  d by the caller 
14aa0 75 73 69 6e 67 20 61 20 73 75 62 73 65 71 75 65  using a subseque
14ab0 6e 74 20 63 61 6c 6c 0a 2a 2a 20 74 6f 20 66 72  nt call.** to fr
14ac0 65 65 43 6f 6c 75 6d 6e 4c 69 73 74 28 29 2e 0a  eeColumnList()..
14ad0 2a 2a 0a 2a 2a 20 54 68 65 20 61 7a 43 6f 6c 5b  **.** The azCol[
14ae0 30 5d 20 65 6e 74 72 79 20 69 73 20 75 73 75 61  0] entry is usua
14af0 6c 6c 79 20 4e 55 4c 4c 2e 20 20 48 6f 77 65 76  lly NULL.  Howev
14b00 65 72 2c 20 69 66 20 7a 54 61 62 20 63 6f 6e 74  er, if zTab cont
14b10 61 69 6e 73 20 61 20 72 6f 77 69 64 0a 2a 2a 20  ains a rowid.** 
14b20 76 61 6c 75 65 20 74 68 61 74 20 6e 65 65 64 73  value that needs
14b30 20 74 6f 20 62 65 20 70 72 65 73 65 72 76 65 64   to be preserved
14b40 2c 20 74 68 65 6e 20 61 7a 43 6f 6c 5b 30 5d 20  , then azCol[0] 
14b50 69 73 20 66 69 6c 6c 65 64 20 69 6e 20 77 69 74  is filled in wit
14b60 68 20 74 68 65 0a 2a 2a 20 6e 61 6d 65 20 6f 66  h the.** name of
14b70 20 74 68 65 20 72 6f 77 69 64 20 63 6f 6c 75 6d   the rowid colum
14b80 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72  n..**.** The fir
14b90 73 74 20 72 65 67 75 6c 61 72 20 63 6f 6c 75 6d  st regular colum
14ba0 6e 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 69  n in the table i
14bb0 73 20 61 7a 43 6f 6c 5b 31 5d 2e 20 20 54 68 65  s azCol[1].  The
14bc0 20 6c 69 73 74 20 69 73 20 74 65 72 6d 69 6e 61   list is termina
14bd0 74 65 64 0a 2a 2a 20 62 79 20 61 6e 20 65 6e 74  ted.** by an ent
14be0 72 79 20 77 69 74 68 20 61 7a 43 6f 6c 5b 69 5d  ry with azCol[i]
14bf0 3d 3d 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  ==0..*/.static c
14c00 68 61 72 20 2a 2a 74 61 62 6c 65 43 6f 6c 75 6d  har **tableColum
14c10 6e 4c 69 73 74 28 53 68 65 6c 6c 53 74 61 74 65  nList(ShellState
14c20 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20   *p, const char 
14c30 2a 7a 54 61 62 29 7b 0a 20 20 63 68 61 72 20 2a  *zTab){.  char *
14c40 2a 61 7a 43 6f 6c 20 3d 20 30 3b 0a 20 20 73 71  *azCol = 0;.  sq
14c50 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
14c60 74 3b 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b  t;.  char *zSql;
14c70 0a 20 20 69 6e 74 20 6e 43 6f 6c 20 3d 20 30 3b  .  int nCol = 0;
14c80 0a 20 20 69 6e 74 20 6e 41 6c 6c 6f 63 20 3d 20  .  int nAlloc = 
14c90 30 3b 0a 20 20 69 6e 74 20 6e 50 4b 20 3d 20 30  0;.  int nPK = 0
14ca0 3b 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65  ;       /* Numbe
14cb0 72 20 6f 66 20 50 52 49 4d 41 52 59 20 4b 45 59  r of PRIMARY KEY
14cc0 20 63 6f 6c 75 6d 6e 73 20 73 65 65 6e 20 2a 2f   columns seen */
14cd0 0a 20 20 69 6e 74 20 69 73 49 50 4b 20 3d 20 30  .  int isIPK = 0
14ce0 3b 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66  ;     /* True if
14cf0 20 6f 6e 65 20 50 52 49 4d 41 52 59 20 4b 45 59   one PRIMARY KEY
14d00 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 79 70 65 20   column of type 
14d10 49 4e 54 45 47 45 52 20 2a 2f 0a 20 20 69 6e 74  INTEGER */.  int
14d20 20 70 72 65 73 65 72 76 65 52 6f 77 69 64 20 3d   preserveRowid =
14d30 20 53 68 65 6c 6c 48 61 73 46 6c 61 67 28 70 2c   ShellHasFlag(p,
14d40 20 53 48 46 4c 47 5f 50 72 65 73 65 72 76 65 52   SHFLG_PreserveR
14d50 6f 77 69 64 29 3b 0a 20 20 69 6e 74 20 72 63 3b  owid);.  int rc;
14d60 0a 0a 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74  ..  zSql = sqlit
14d70 65 33 5f 6d 70 72 69 6e 74 66 28 22 50 52 41 47  e3_mprintf("PRAG
14d80 4d 41 20 74 61 62 6c 65 5f 69 6e 66 6f 3d 25 51  MA table_info=%Q
14d90 22 2c 20 7a 54 61 62 29 3b 0a 20 20 72 63 20 3d  ", zTab);.  rc =
14da0 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
14db0 5f 76 32 28 70 2d 3e 64 62 2c 20 7a 53 71 6c 2c  _v2(p->db, zSql,
14dc0 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b   -1, &pStmt, 0);
14dd0 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
14de0 7a 53 71 6c 29 3b 0a 20 20 69 66 28 20 72 63 20  zSql);.  if( rc 
14df0 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 77 68  ) return 0;.  wh
14e00 69 6c 65 28 20 73 71 6c 69 74 65 33 5f 73 74 65  ile( sqlite3_ste
14e10 70 28 70 53 74 6d 74 29 3d 3d 53 51 4c 49 54 45  p(pStmt)==SQLITE
14e20 5f 52 4f 57 20 29 7b 0a 20 20 20 20 69 66 28 20  _ROW ){.    if( 
14e30 6e 43 6f 6c 3e 3d 6e 41 6c 6c 6f 63 2d 32 20 29  nCol>=nAlloc-2 )
14e40 7b 0a 20 20 20 20 20 20 6e 41 6c 6c 6f 63 20 3d  {.      nAlloc =
14e50 20 6e 41 6c 6c 6f 63 2a 32 20 2b 20 6e 43 6f 6c   nAlloc*2 + nCol
14e60 20 2b 20 31 30 3b 0a 20 20 20 20 20 20 61 7a 43   + 10;.      azC
14e70 6f 6c 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 61  ol = sqlite3_rea
14e80 6c 6c 6f 63 28 61 7a 43 6f 6c 2c 20 6e 41 6c 6c  lloc(azCol, nAll
14e90 6f 63 2a 73 69 7a 65 6f 66 28 61 7a 43 6f 6c 5b  oc*sizeof(azCol[
14ea0 30 5d 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20  0]));.      if( 
14eb0 61 7a 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20 20  azCol==0 ){.    
14ec0 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73      raw_printf(s
14ed0 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 6f  tderr, "Error: o
14ee0 75 74 20 6f 66 20 6d 65 6d 6f 72 79 5c 6e 22 29  ut of memory\n")
14ef0 3b 0a 20 20 20 20 20 20 20 20 65 78 69 74 28 31  ;.        exit(1
14f00 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
14f10 0a 20 20 20 20 61 7a 43 6f 6c 5b 2b 2b 6e 43 6f  .    azCol[++nCo
14f20 6c 5d 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  l] = sqlite3_mpr
14f30 69 6e 74 66 28 22 25 73 22 2c 20 73 71 6c 69 74  intf("%s", sqlit
14f40 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70  e3_column_text(p
14f50 53 74 6d 74 2c 20 31 29 29 3b 0a 20 20 20 20 69  Stmt, 1));.    i
14f60 66 28 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  f( sqlite3_colum
14f70 6e 5f 69 6e 74 28 70 53 74 6d 74 2c 20 35 29 20  n_int(pStmt, 5) 
14f80 29 7b 0a 20 20 20 20 20 20 6e 50 4b 2b 2b 3b 0a  ){.      nPK++;.
14f90 20 20 20 20 20 20 69 66 28 20 6e 50 4b 3d 3d 31        if( nPK==1
14fa0 0a 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74  .       && sqlit
14fb0 65 33 5f 73 74 72 69 63 6d 70 28 28 63 6f 6e 73  e3_stricmp((cons
14fc0 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f  t char*)sqlite3_
14fd0 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d  column_text(pStm
14fe0 74 2c 32 29 2c 0a 20 20 20 20 20 20 20 20 20 20  t,2),.          
14ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15000 22 49 4e 54 45 47 45 52 22 29 3d 3d 30 0a 20 20  "INTEGER")==0.  
15010 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 69      ){.        i
15020 73 49 50 4b 20 3d 20 31 3b 0a 20 20 20 20 20 20  sIPK = 1;.      
15030 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69  }else{.        i
15040 73 49 50 4b 20 3d 20 30 3b 0a 20 20 20 20 20 20  sIPK = 0;.      
15050 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  }.    }.  }.  sq
15060 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
15070 53 74 6d 74 29 3b 0a 20 20 69 66 28 20 61 7a 43  Stmt);.  if( azC
15080 6f 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  ol==0 ) return 0
15090 3b 0a 20 20 61 7a 43 6f 6c 5b 30 5d 20 3d 20 30  ;.  azCol[0] = 0
150a0 3b 0a 20 20 61 7a 43 6f 6c 5b 6e 43 6f 6c 2b 31  ;.  azCol[nCol+1
150b0 5d 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 54 68 65  ] = 0;..  /* The
150c0 20 64 65 63 69 73 69 6f 6e 20 6f 66 20 77 68 65   decision of whe
150d0 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 20 72 6f  ther or not a ro
150e0 77 69 64 20 72 65 61 6c 6c 79 20 6e 65 65 64 73  wid really needs
150f0 20 74 6f 20 62 65 20 70 72 65 73 65 72 76 65 64   to be preserved
15100 0a 20 20 2a 2a 20 69 73 20 74 72 69 63 6b 79 2e  .  ** is tricky.
15110 20 20 57 65 20 6e 65 76 65 72 20 6e 65 65 64 20    We never need 
15120 74 6f 20 70 72 65 73 65 72 76 65 20 61 20 72 6f  to preserve a ro
15130 77 69 64 20 66 6f 72 20 61 20 57 49 54 48 4f 55  wid for a WITHOU
15140 54 20 52 4f 57 49 44 20 74 61 62 6c 65 0a 20 20  T ROWID table.  
15150 2a 2a 20 6f 72 20 61 20 74 61 62 6c 65 20 77 69  ** or a table wi
15160 74 68 20 61 6e 20 49 4e 54 45 47 45 52 20 50 52  th an INTEGER PR
15170 49 4d 41 52 59 20 4b 45 59 2e 20 20 57 65 20 61  IMARY KEY.  We a
15180 72 65 20 75 6e 61 62 6c 65 20 74 6f 20 70 72 65  re unable to pre
15190 73 65 72 76 65 0a 20 20 2a 2a 20 72 6f 77 69 64  serve.  ** rowid
151a0 73 20 6f 6e 20 74 61 62 6c 65 73 20 77 68 65 72  s on tables wher
151b0 65 20 74 68 65 20 72 6f 77 69 64 20 69 73 20 69  e the rowid is i
151c0 6e 61 63 63 65 73 73 69 62 6c 65 20 62 65 63 61  naccessible beca
151d0 75 73 65 20 74 68 65 72 65 20 61 72 65 20 6f 74  use there are ot
151e0 68 65 72 0a 20 20 2a 2a 20 63 6f 6c 75 6d 6e 73  her.  ** columns
151f0 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 6e 61   in the table na
15200 6d 65 64 20 22 72 6f 77 69 64 22 2c 20 22 5f 72  med "rowid", "_r
15210 6f 77 69 64 5f 22 2c 20 61 6e 64 20 22 6f 69 64  owid_", and "oid
15220 22 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 72  "..  */.  if( pr
15230 65 73 65 72 76 65 52 6f 77 69 64 20 26 26 20 69  eserveRowid && i
15240 73 49 50 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 49  sIPK ){.    /* I
15250 66 20 61 20 73 69 6e 67 6c 65 20 50 52 49 4d 41  f a single PRIMA
15260 52 59 20 4b 45 59 20 63 6f 6c 75 6d 6e 20 77 69  RY KEY column wi
15270 74 68 20 74 79 70 65 20 49 4e 54 45 47 45 52 20  th type INTEGER 
15280 77 61 73 20 73 65 65 6e 2c 20 74 68 65 6e 20 69  was seen, then i
15290 74 0a 20 20 20 20 2a 2a 20 6d 69 67 68 74 20 62  t.    ** might b
152a0 65 20 61 6e 20 61 6c 69 73 65 20 66 6f 72 20 74  e an alise for t
152b0 68 65 20 52 4f 57 49 44 2e 20 20 42 75 74 20 69  he ROWID.  But i
152c0 74 20 6d 69 67 68 74 20 61 6c 73 6f 20 62 65 20  t might also be 
152d0 61 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 0a  a WITHOUT ROWID.
152e0 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 6f 72 20      ** table or 
152f0 61 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  a INTEGER PRIMAR
15300 59 20 4b 45 59 20 44 45 53 43 20 63 6f 6c 75 6d  Y KEY DESC colum
15310 6e 2c 20 6e 65 69 74 68 65 72 20 6f 66 20 77 68  n, neither of wh
15320 69 63 68 20 61 72 65 0a 20 20 20 20 2a 2a 20 52  ich are.    ** R
15330 4f 57 49 44 20 61 6c 69 61 73 65 73 2e 20 20 54  OWID aliases.  T
15340 6f 20 64 69 73 74 69 6e 67 75 69 73 68 20 74 68  o distinguish th
15350 65 73 65 20 63 61 73 65 73 2c 20 63 68 65 63 6b  ese cases, check
15360 20 74 6f 20 73 65 65 20 69 66 0a 20 20 20 20 2a   to see if.    *
15370 2a 20 74 68 65 72 65 20 69 73 20 61 20 22 70 6b  * there is a "pk
15380 22 20 65 6e 74 72 79 20 69 6e 20 22 50 52 41 47  " entry in "PRAG
15390 4d 41 20 69 6e 64 65 78 5f 6c 69 73 74 22 2e 20  MA index_list". 
153a0 20 54 68 65 72 65 20 77 69 6c 6c 20 62 65 0a 20   There will be. 
153b0 20 20 20 2a 2a 20 6e 6f 20 22 70 6b 22 20 69 6e     ** no "pk" in
153c0 64 65 78 20 69 66 20 74 68 65 20 50 52 49 4d 41  dex if the PRIMA
153d0 52 59 20 4b 45 59 20 72 65 61 6c 6c 79 20 69 73  RY KEY really is
153e0 20 61 6e 20 61 6c 69 61 73 20 66 6f 72 20 74 68   an alias for th
153f0 65 20 52 4f 57 49 44 2e 0a 20 20 20 20 2a 2f 0a  e ROWID..    */.
15400 20 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74      zSql = sqlit
15410 65 33 5f 6d 70 72 69 6e 74 66 28 22 53 45 4c 45  e3_mprintf("SELE
15420 43 54 20 31 20 46 52 4f 4d 20 70 72 61 67 6d 61  CT 1 FROM pragma
15430 5f 69 6e 64 65 78 5f 6c 69 73 74 28 25 51 29 22  _index_list(%Q)"
15440 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
15450 20 20 20 20 20 20 20 20 20 20 20 20 22 20 57 48              " WH
15460 45 52 45 20 6f 72 69 67 69 6e 3d 27 70 6b 27 22  ERE origin='pk'"
15470 2c 20 7a 54 61 62 29 3b 0a 20 20 20 20 72 63 20  , zTab);.    rc 
15480 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72  = sqlite3_prepar
15490 65 5f 76 32 28 70 2d 3e 64 62 2c 20 7a 53 71 6c  e_v2(p->db, zSql
154a0 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29  , -1, &pStmt, 0)
154b0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
154c0 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20 69 66  ee(zSql);.    if
154d0 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 66 72  ( rc ){.      fr
154e0 65 65 43 6f 6c 75 6d 6e 4c 69 73 74 28 61 7a 43  eeColumnList(azC
154f0 6f 6c 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ol);.      retur
15500 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  n 0;.    }.    r
15510 63 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 65 70  c = sqlite3_step
15520 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 73 71 6c  (pStmt);.    sql
15530 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53  ite3_finalize(pS
15540 74 6d 74 29 3b 0a 20 20 20 20 70 72 65 73 65 72  tmt);.    preser
15550 76 65 52 6f 77 69 64 20 3d 20 72 63 3d 3d 53 51  veRowid = rc==SQ
15560 4c 49 54 45 5f 52 4f 57 3b 0a 20 20 7d 0a 20 20  LITE_ROW;.  }.  
15570 69 66 28 20 70 72 65 73 65 72 76 65 52 6f 77 69  if( preserveRowi
15580 64 20 29 7b 0a 20 20 20 20 2f 2a 20 4f 6e 6c 79  d ){.    /* Only
15590 20 70 72 65 73 65 72 76 65 20 74 68 65 20 72 6f   preserve the ro
155a0 77 69 64 20 69 66 20 77 65 20 63 61 6e 20 66 69  wid if we can fi
155b0 6e 64 20 61 20 6e 61 6d 65 20 74 6f 20 75 73 65  nd a name to use
155c0 20 66 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20   for the.    ** 
155d0 72 6f 77 69 64 20 2a 2f 0a 20 20 20 20 73 74 61  rowid */.    sta
155e0 74 69 63 20 63 68 61 72 20 2a 61 7a 52 6f 77 69  tic char *azRowi
155f0 64 5b 5d 20 3d 20 7b 20 22 72 6f 77 69 64 22 2c  d[] = { "rowid",
15600 20 22 5f 72 6f 77 69 64 5f 22 2c 20 22 6f 69 64   "_rowid_", "oid
15610 22 20 7d 3b 0a 20 20 20 20 69 6e 74 20 69 2c 20  " };.    int i, 
15620 6a 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  j;.    for(j=0; 
15630 6a 3c 33 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  j<3; j++){.     
15640 20 66 6f 72 28 69 3d 31 3b 20 69 3c 3d 6e 43 6f   for(i=1; i<=nCo
15650 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  l; i++){.       
15660 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72   if( sqlite3_str
15670 69 63 6d 70 28 61 7a 52 6f 77 69 64 5b 6a 5d 2c  icmp(azRowid[j],
15680 61 7a 43 6f 6c 5b 69 5d 29 3d 3d 30 20 29 20 62  azCol[i])==0 ) b
15690 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
156a0 20 20 20 20 69 66 28 20 69 3e 6e 43 6f 6c 20 29      if( i>nCol )
156b0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 74 20  {.        /* At 
156c0 74 68 69 73 20 70 6f 69 6e 74 2c 20 77 65 20 6b  this point, we k
156d0 6e 6f 77 20 74 68 61 74 20 61 7a 52 6f 77 69 64  now that azRowid
156e0 5b 6a 5d 20 69 73 20 6e 6f 74 20 74 68 65 20 6e  [j] is not the n
156f0 61 6d 65 20 6f 66 20 61 6e 79 0a 20 20 20 20 20  ame of any.     
15700 20 20 20 2a 2a 20 6f 72 64 69 6e 61 72 79 20 63     ** ordinary c
15710 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 74 61 62  olumn in the tab
15720 6c 65 2e 20 20 56 65 72 69 66 79 20 74 68 61 74  le.  Verify that
15730 20 61 7a 52 6f 77 69 64 5b 6a 5d 20 69 73 20 61   azRowid[j] is a
15740 20 76 61 6c 69 64 0a 20 20 20 20 20 20 20 20 2a   valid.        *
15750 2a 20 6e 61 6d 65 20 66 6f 72 20 74 68 65 20 72  * name for the r
15760 6f 77 69 64 20 62 65 66 6f 72 65 20 61 64 64 69  owid before addi
15770 6e 67 20 69 74 20 74 6f 20 61 7a 43 6f 6c 5b 30  ng it to azCol[0
15780 5d 2e 20 20 57 49 54 48 4f 55 54 20 52 4f 57 49  ].  WITHOUT ROWI
15790 44 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 61 62  D.        ** tab
157a0 6c 65 73 20 77 69 6c 6c 20 66 61 69 6c 20 74 68  les will fail th
157b0 69 73 20 6c 61 73 74 20 63 68 65 63 6b 20 2a 2f  is last check */
157c0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
157d0 6c 69 74 65 33 5f 74 61 62 6c 65 5f 63 6f 6c 75  lite3_table_colu
157e0 6d 6e 5f 6d 65 74 61 64 61 74 61 28 70 2d 3e 64  mn_metadata(p->d
157f0 62 2c 30 2c 7a 54 61 62 2c 61 7a 52 6f 77 69 64  b,0,zTab,azRowid
15800 5b 6a 5d 2c 30 2c 30 2c 30 2c 30 2c 30 29 3b 0a  [j],0,0,0,0,0);.
15810 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
15820 53 51 4c 49 54 45 5f 4f 4b 20 29 20 61 7a 43 6f  SQLITE_OK ) azCo
15830 6c 5b 30 5d 20 3d 20 61 7a 52 6f 77 69 64 5b 6a  l[0] = azRowid[j
15840 5d 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  ];.        break
15850 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
15860 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 61 7a 43    }.  return azC
15870 6f 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 6f 67  ol;.}../*.** Tog
15880 67 6c 65 20 74 68 65 20 72 65 76 65 72 73 65 5f  gle the reverse_
15890 75 6e 6f 72 64 65 72 65 64 5f 73 65 6c 65 63 74  unordered_select
158a0 73 20 73 65 74 74 69 6e 67 2e 0a 2a 2f 0a 73 74  s setting..*/.st
158b0 61 74 69 63 20 76 6f 69 64 20 74 6f 67 67 6c 65  atic void toggle
158c0 53 65 6c 65 63 74 4f 72 64 65 72 28 73 71 6c 69  SelectOrder(sqli
158d0 74 65 33 20 2a 64 62 29 7b 0a 20 20 73 71 6c 69  te3 *db){.  sqli
158e0 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20  te3_stmt *pStmt 
158f0 3d 20 30 3b 0a 20 20 69 6e 74 20 69 53 65 74 74  = 0;.  int iSett
15900 69 6e 67 20 3d 20 30 3b 0a 20 20 63 68 61 72 20  ing = 0;.  char 
15910 7a 53 74 6d 74 5b 31 30 30 5d 3b 0a 20 20 73 71  zStmt[100];.  sq
15920 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32  lite3_prepare_v2
15930 28 64 62 2c 20 22 50 52 41 47 4d 41 20 72 65 76  (db, "PRAGMA rev
15940 65 72 73 65 5f 75 6e 6f 72 64 65 72 65 64 5f 73  erse_unordered_s
15950 65 6c 65 63 74 73 22 2c 20 2d 31 2c 20 26 70 53  elects", -1, &pS
15960 74 6d 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 73  tmt, 0);.  if( s
15970 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d  qlite3_step(pStm
15980 74 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29  t)==SQLITE_ROW )
15990 7b 0a 20 20 20 20 69 53 65 74 74 69 6e 67 20 3d  {.    iSetting =
159a0 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
159b0 69 6e 74 28 70 53 74 6d 74 2c 20 30 29 3b 0a 20  int(pStmt, 0);. 
159c0 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6e   }.  sqlite3_fin
159d0 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20  alize(pStmt);.  
159e0 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
159f0 28 73 69 7a 65 6f 66 28 7a 53 74 6d 74 29 2c 20  (sizeof(zStmt), 
15a00 7a 53 74 6d 74 2c 0a 20 20 20 20 20 20 20 22 50  zStmt,.       "P
15a10 52 41 47 4d 41 20 72 65 76 65 72 73 65 5f 75 6e  RAGMA reverse_un
15a20 6f 72 64 65 72 65 64 5f 73 65 6c 65 63 74 73 28  ordered_selects(
15a30 25 64 29 22 2c 20 21 69 53 65 74 74 69 6e 67 29  %d)", !iSetting)
15a40 3b 0a 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63  ;.  sqlite3_exec
15a50 28 64 62 2c 20 7a 53 74 6d 74 2c 20 30 2c 20 30  (db, zStmt, 0, 0
15a60 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  , 0);.}../*.** T
15a70 68 69 73 20 69 73 20 61 20 64 69 66 66 65 72 65  his is a differe
15a80 6e 74 20 63 61 6c 6c 62 61 63 6b 20 72 6f 75 74  nt callback rout
15a90 69 6e 65 20 75 73 65 64 20 66 6f 72 20 64 75 6d  ine used for dum
15aa0 70 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73  ping the databas
15ab0 65 2e 0a 2a 2a 20 45 61 63 68 20 72 6f 77 20 72  e..** Each row r
15ac0 65 63 65 69 76 65 64 20 62 79 20 74 68 69 73 20  eceived by this 
15ad0 63 61 6c 6c 62 61 63 6b 20 63 6f 6e 73 69 73 74  callback consist
15ae0 73 20 6f 66 20 61 20 74 61 62 6c 65 20 6e 61 6d  s of a table nam
15af0 65 2c 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20  e,.** the table 
15b00 74 79 70 65 20 28 22 69 6e 64 65 78 22 20 6f 72  type ("index" or
15b10 20 22 74 61 62 6c 65 22 29 20 61 6e 64 20 53 51   "table") and SQ
15b20 4c 20 74 6f 20 63 72 65 61 74 65 20 74 68 65 20  L to create the 
15b30 74 61 62 6c 65 2e 0a 2a 2a 20 54 68 69 73 20 72  table..** This r
15b40 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 70 72  outine should pr
15b50 69 6e 74 20 74 65 78 74 20 73 75 66 66 69 63 69  int text suffici
15b60 65 6e 74 20 74 6f 20 72 65 63 72 65 61 74 65 20  ent to recreate 
15b70 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74  the table..*/.st
15b80 61 74 69 63 20 69 6e 74 20 64 75 6d 70 5f 63 61  atic int dump_ca
15b90 6c 6c 62 61 63 6b 28 76 6f 69 64 20 2a 70 41 72  llback(void *pAr
15ba0 67 2c 20 69 6e 74 20 6e 41 72 67 2c 20 63 68 61  g, int nArg, cha
15bb0 72 20 2a 2a 61 7a 41 72 67 2c 20 63 68 61 72 20  r **azArg, char 
15bc0 2a 2a 61 7a 4e 6f 74 55 73 65 64 29 7b 0a 20 20  **azNotUsed){.  
15bd0 69 6e 74 20 72 63 3b 0a 20 20 63 6f 6e 73 74 20  int rc;.  const 
15be0 63 68 61 72 20 2a 7a 54 61 62 6c 65 3b 0a 20 20  char *zTable;.  
15bf0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70  const char *zTyp
15c00 65 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  e;.  const char 
15c10 2a 7a 53 71 6c 3b 0a 20 20 53 68 65 6c 6c 53 74  *zSql;.  ShellSt
15c20 61 74 65 20 2a 70 20 3d 20 28 53 68 65 6c 6c 53  ate *p = (ShellS
15c30 74 61 74 65 20 2a 29 70 41 72 67 3b 0a 0a 20 20  tate *)pArg;..  
15c40 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
15c50 28 61 7a 4e 6f 74 55 73 65 64 29 3b 0a 20 20 69  (azNotUsed);.  i
15c60 66 28 20 6e 41 72 67 21 3d 33 20 7c 7c 20 61 7a  f( nArg!=3 || az
15c70 41 72 67 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  Arg==0 ) return 
15c80 30 3b 0a 20 20 7a 54 61 62 6c 65 20 3d 20 61 7a  0;.  zTable = az
15c90 41 72 67 5b 30 5d 3b 0a 20 20 7a 54 79 70 65 20  Arg[0];.  zType 
15ca0 3d 20 61 7a 41 72 67 5b 31 5d 3b 0a 20 20 7a 53  = azArg[1];.  zS
15cb0 71 6c 20 3d 20 61 7a 41 72 67 5b 32 5d 3b 0a 0a  ql = azArg[2];..
15cc0 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 54 61    if( strcmp(zTa
15cd0 62 6c 65 2c 20 22 73 71 6c 69 74 65 5f 73 65 71  ble, "sqlite_seq
15ce0 75 65 6e 63 65 22 29 3d 3d 30 20 29 7b 0a 20 20  uence")==0 ){.  
15cf0 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e    raw_printf(p->
15d00 6f 75 74 2c 20 22 44 45 4c 45 54 45 20 46 52 4f  out, "DELETE FRO
15d10 4d 20 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63  M sqlite_sequenc
15d20 65 3b 5c 6e 22 29 3b 0a 20 20 7d 65 6c 73 65 20  e;\n");.  }else 
15d30 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72 67  if( sqlite3_strg
15d40 6c 6f 62 28 22 73 71 6c 69 74 65 5f 73 74 61 74  lob("sqlite_stat
15d50 3f 22 2c 20 7a 54 61 62 6c 65 29 3d 3d 30 20 29  ?", zTable)==0 )
15d60 7b 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66  {.    raw_printf
15d70 28 70 2d 3e 6f 75 74 2c 20 22 41 4e 41 4c 59 5a  (p->out, "ANALYZ
15d80 45 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 3b  E sqlite_master;
15d90 5c 6e 22 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66  \n");.  }else if
15da0 28 20 73 74 72 6e 63 6d 70 28 7a 54 61 62 6c 65  ( strncmp(zTable
15db0 2c 20 22 73 71 6c 69 74 65 5f 22 2c 20 37 29 3d  , "sqlite_", 7)=
15dc0 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
15dd0 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   0;.  }else if( 
15de0 73 74 72 6e 63 6d 70 28 7a 53 71 6c 2c 20 22 43  strncmp(zSql, "C
15df0 52 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41  REATE VIRTUAL TA
15e00 42 4c 45 22 2c 20 32 30 29 3d 3d 30 20 29 7b 0a  BLE", 20)==0 ){.
15e10 20 20 20 20 63 68 61 72 20 2a 7a 49 6e 73 3b 0a      char *zIns;.
15e20 20 20 20 20 69 66 28 20 21 70 2d 3e 77 72 69 74      if( !p->writ
15e30 61 62 6c 65 53 63 68 65 6d 61 20 29 7b 0a 20 20  ableSchema ){.  
15e40 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70      raw_printf(p
15e50 2d 3e 6f 75 74 2c 20 22 50 52 41 47 4d 41 20 77  ->out, "PRAGMA w
15e60 72 69 74 61 62 6c 65 5f 73 63 68 65 6d 61 3d 4f  ritable_schema=O
15e70 4e 3b 5c 6e 22 29 3b 0a 20 20 20 20 20 20 70 2d  N;\n");.      p-
15e80 3e 77 72 69 74 61 62 6c 65 53 63 68 65 6d 61 20  >writableSchema 
15e90 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a  = 1;.    }.    z
15ea0 49 6e 73 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  Ins = sqlite3_mp
15eb0 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 22 49  rintf(.       "I
15ec0 4e 53 45 52 54 20 49 4e 54 4f 20 73 71 6c 69 74  NSERT INTO sqlit
15ed0 65 5f 6d 61 73 74 65 72 28 74 79 70 65 2c 6e 61  e_master(type,na
15ee0 6d 65 2c 74 62 6c 5f 6e 61 6d 65 2c 72 6f 6f 74  me,tbl_name,root
15ef0 70 61 67 65 2c 73 71 6c 29 22 0a 20 20 20 20 20  page,sql)".     
15f00 20 20 22 56 41 4c 55 45 53 28 27 74 61 62 6c 65    "VALUES('table
15f10 27 2c 27 25 71 27 2c 27 25 71 27 2c 30 2c 27 25  ','%q','%q',0,'%
15f20 71 27 29 3b 22 2c 0a 20 20 20 20 20 20 20 7a 54  q');",.       zT
15f30 61 62 6c 65 2c 20 7a 54 61 62 6c 65 2c 20 7a 53  able, zTable, zS
15f40 71 6c 29 3b 0a 20 20 20 20 75 74 66 38 5f 70 72  ql);.    utf8_pr
15f50 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73  intf(p->out, "%s
15f60 5c 6e 22 2c 20 7a 49 6e 73 29 3b 0a 20 20 20 20  \n", zIns);.    
15f70 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 49 6e  sqlite3_free(zIn
15f80 73 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  s);.    return 0
15f90 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
15fa0 72 69 6e 74 53 63 68 65 6d 61 4c 69 6e 65 28 70  rintSchemaLine(p
15fb0 2d 3e 6f 75 74 2c 20 7a 53 71 6c 2c 20 22 3b 5c  ->out, zSql, ";\
15fc0 6e 22 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  n");.  }..  if( 
15fd0 73 74 72 63 6d 70 28 7a 54 79 70 65 2c 20 22 74  strcmp(zType, "t
15fe0 61 62 6c 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20  able")==0 ){.   
15ff0 20 53 68 65 6c 6c 54 65 78 74 20 73 53 65 6c 65   ShellText sSele
16000 63 74 3b 0a 20 20 20 20 53 68 65 6c 6c 54 65 78  ct;.    ShellTex
16010 74 20 73 54 61 62 6c 65 3b 0a 20 20 20 20 63 68  t sTable;.    ch
16020 61 72 20 2a 2a 61 7a 43 6f 6c 3b 0a 20 20 20 20  ar **azCol;.    
16030 69 6e 74 20 69 3b 0a 20 20 20 20 63 68 61 72 20  int i;.    char 
16040 2a 73 61 76 65 64 44 65 73 74 54 61 62 6c 65 3b  *savedDestTable;
16050 0a 20 20 20 20 69 6e 74 20 73 61 76 65 64 4d 6f  .    int savedMo
16060 64 65 3b 0a 0a 20 20 20 20 61 7a 43 6f 6c 20 3d  de;..    azCol =
16070 20 74 61 62 6c 65 43 6f 6c 75 6d 6e 4c 69 73 74   tableColumnList
16080 28 70 2c 20 7a 54 61 62 6c 65 29 3b 0a 20 20 20  (p, zTable);.   
16090 20 69 66 28 20 61 7a 43 6f 6c 3d 3d 30 20 29 7b   if( azCol==0 ){
160a0 0a 20 20 20 20 20 20 70 2d 3e 6e 45 72 72 2b 2b  .      p->nErr++
160b0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  ;.      return 0
160c0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
160d0 41 6c 77 61 79 73 20 71 75 6f 74 65 20 74 68 65  Always quote the
160e0 20 74 61 62 6c 65 20 6e 61 6d 65 2c 20 65 76 65   table name, eve
160f0 6e 20 69 66 20 69 74 20 61 70 70 65 61 72 73 20  n if it appears 
16100 74 6f 20 62 65 20 70 75 72 65 20 61 73 63 69 69  to be pure ascii
16110 2c 0a 20 20 20 20 2a 2a 20 69 6e 20 63 61 73 65  ,.    ** in case
16120 20 69 74 20 69 73 20 61 20 6b 65 79 77 6f 72 64   it is a keyword
16130 2e 20 45 78 3a 20 20 49 4e 53 45 52 54 20 49 4e  . Ex:  INSERT IN
16140 54 4f 20 22 74 61 62 6c 65 22 20 2e 2e 2e 20 2a  TO "table" ... *
16150 2f 0a 20 20 20 20 69 6e 69 74 54 65 78 74 28 26  /.    initText(&
16160 73 54 61 62 6c 65 29 3b 0a 20 20 20 20 61 70 70  sTable);.    app
16170 65 6e 64 54 65 78 74 28 26 73 54 61 62 6c 65 2c  endText(&sTable,
16180 20 7a 54 61 62 6c 65 2c 20 71 75 6f 74 65 43 68   zTable, quoteCh
16190 61 72 28 7a 54 61 62 6c 65 29 29 3b 0a 20 20 20  ar(zTable));.   
161a0 20 2f 2a 20 49 66 20 70 72 65 73 65 72 76 69 6e   /* If preservin
161b0 67 20 74 68 65 20 72 6f 77 69 64 2c 20 61 64 64  g the rowid, add
161c0 20 61 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 61   a column list a
161d0 66 74 65 72 20 74 68 65 20 74 61 62 6c 65 20 6e  fter the table n
161e0 61 6d 65 2e 0a 20 20 20 20 2a 2a 20 49 6e 20 6f  ame..    ** In o
161f0 74 68 65 72 20 77 6f 72 64 73 3a 20 20 22 49 4e  ther words:  "IN
16200 53 45 52 54 20 49 4e 54 4f 20 74 61 62 28 72 6f  SERT INTO tab(ro
16210 77 69 64 2c 61 2c 62 2c 63 2c 2e 2e 2e 29 20 56  wid,a,b,c,...) V
16220 41 4c 55 45 53 28 2e 2e 2e 29 22 0a 20 20 20 20  ALUES(...)".    
16230 2a 2a 20 69 6e 73 74 65 61 64 20 6f 66 20 74 68  ** instead of th
16240 65 20 75 73 75 61 6c 20 22 49 4e 53 45 52 54 20  e usual "INSERT 
16250 49 4e 54 4f 20 74 61 62 20 56 41 4c 55 45 53 28  INTO tab VALUES(
16260 2e 2e 2e 29 22 2e 0a 20 20 20 20 2a 2f 0a 20 20  ...)"..    */.  
16270 20 20 69 66 28 20 61 7a 43 6f 6c 5b 30 5d 20 29    if( azCol[0] )
16280 7b 0a 20 20 20 20 20 20 61 70 70 65 6e 64 54 65  {.      appendTe
16290 78 74 28 26 73 54 61 62 6c 65 2c 20 22 28 22 2c  xt(&sTable, "(",
162a0 20 30 29 3b 0a 20 20 20 20 20 20 61 70 70 65 6e   0);.      appen
162b0 64 54 65 78 74 28 26 73 54 61 62 6c 65 2c 20 61  dText(&sTable, a
162c0 7a 43 6f 6c 5b 30 5d 2c 20 30 29 3b 0a 20 20 20  zCol[0], 0);.   
162d0 20 20 20 66 6f 72 28 69 3d 31 3b 20 61 7a 43 6f     for(i=1; azCo
162e0 6c 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  l[i]; i++){.    
162f0 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26      appendText(&
16300 73 54 61 62 6c 65 2c 20 22 2c 22 2c 20 30 29 3b  sTable, ",", 0);
16310 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 54  .        appendT
16320 65 78 74 28 26 73 54 61 62 6c 65 2c 20 61 7a 43  ext(&sTable, azC
16330 6f 6c 5b 69 5d 2c 20 71 75 6f 74 65 43 68 61 72  ol[i], quoteChar
16340 28 61 7a 43 6f 6c 5b 69 5d 29 29 3b 0a 20 20 20  (azCol[i]));.   
16350 20 20 20 7d 0a 20 20 20 20 20 20 61 70 70 65 6e     }.      appen
16360 64 54 65 78 74 28 26 73 54 61 62 6c 65 2c 20 22  dText(&sTable, "
16370 29 22 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 0a 20  )", 0);.    }.. 
16380 20 20 20 2f 2a 20 42 75 69 6c 64 20 61 6e 20 61     /* Build an a
16390 70 70 72 6f 70 72 69 61 74 65 20 53 45 4c 45 43  ppropriate SELEC
163a0 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  T statement */. 
163b0 20 20 20 69 6e 69 74 54 65 78 74 28 26 73 53 65     initText(&sSe
163c0 6c 65 63 74 29 3b 0a 20 20 20 20 61 70 70 65 6e  lect);.    appen
163d0 64 54 65 78 74 28 26 73 53 65 6c 65 63 74 2c 20  dText(&sSelect, 
163e0 22 53 45 4c 45 43 54 20 22 2c 20 30 29 3b 0a 20  "SELECT ", 0);. 
163f0 20 20 20 69 66 28 20 61 7a 43 6f 6c 5b 30 5d 20     if( azCol[0] 
16400 29 7b 0a 20 20 20 20 20 20 61 70 70 65 6e 64 54  ){.      appendT
16410 65 78 74 28 26 73 53 65 6c 65 63 74 2c 20 61 7a  ext(&sSelect, az
16420 43 6f 6c 5b 30 5d 2c 20 30 29 3b 0a 20 20 20 20  Col[0], 0);.    
16430 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 53    appendText(&sS
16440 65 6c 65 63 74 2c 20 22 2c 22 2c 20 30 29 3b 0a  elect, ",", 0);.
16450 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d      }.    for(i=
16460 31 3b 20 61 7a 43 6f 6c 5b 69 5d 3b 20 69 2b 2b  1; azCol[i]; i++
16470 29 7b 0a 20 20 20 20 20 20 61 70 70 65 6e 64 54  ){.      appendT
16480 65 78 74 28 26 73 53 65 6c 65 63 74 2c 20 61 7a  ext(&sSelect, az
16490 43 6f 6c 5b 69 5d 2c 20 71 75 6f 74 65 43 68 61  Col[i], quoteCha
164a0 72 28 61 7a 43 6f 6c 5b 69 5d 29 29 3b 0a 20 20  r(azCol[i]));.  
164b0 20 20 20 20 69 66 28 20 61 7a 43 6f 6c 5b 69 2b      if( azCol[i+
164c0 31 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 61 70  1] ){.        ap
164d0 70 65 6e 64 54 65 78 74 28 26 73 53 65 6c 65 63  pendText(&sSelec
164e0 74 2c 20 22 2c 22 2c 20 30 29 3b 0a 20 20 20 20  t, ",", 0);.    
164f0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66 72    }.    }.    fr
16500 65 65 43 6f 6c 75 6d 6e 4c 69 73 74 28 61 7a 43  eeColumnList(azC
16510 6f 6c 29 3b 0a 20 20 20 20 61 70 70 65 6e 64 54  ol);.    appendT
16520 65 78 74 28 26 73 53 65 6c 65 63 74 2c 20 22 20  ext(&sSelect, " 
16530 46 52 4f 4d 20 22 2c 20 30 29 3b 0a 20 20 20 20  FROM ", 0);.    
16540 61 70 70 65 6e 64 54 65 78 74 28 26 73 53 65 6c  appendText(&sSel
16550 65 63 74 2c 20 7a 54 61 62 6c 65 2c 20 71 75 6f  ect, zTable, quo
16560 74 65 43 68 61 72 28 7a 54 61 62 6c 65 29 29 3b  teChar(zTable));
16570 0a 0a 20 20 20 20 73 61 76 65 64 44 65 73 74 54  ..    savedDestT
16580 61 62 6c 65 20 3d 20 70 2d 3e 7a 44 65 73 74 54  able = p->zDestT
16590 61 62 6c 65 3b 0a 20 20 20 20 73 61 76 65 64 4d  able;.    savedM
165a0 6f 64 65 20 3d 20 70 2d 3e 6d 6f 64 65 3b 0a 20  ode = p->mode;. 
165b0 20 20 20 70 2d 3e 7a 44 65 73 74 54 61 62 6c 65     p->zDestTable
165c0 20 3d 20 73 54 61 62 6c 65 2e 7a 3b 0a 20 20 20   = sTable.z;.   
165d0 20 70 2d 3e 6d 6f 64 65 20 3d 20 70 2d 3e 63 4d   p->mode = p->cM
165e0 6f 64 65 20 3d 20 4d 4f 44 45 5f 49 6e 73 65 72  ode = MODE_Inser
165f0 74 3b 0a 20 20 20 20 72 63 20 3d 20 73 68 65 6c  t;.    rc = shel
16600 6c 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20 73 53  l_exec(p->db, sS
16610 65 6c 65 63 74 2e 7a 2c 20 73 68 65 6c 6c 5f 63  elect.z, shell_c
16620 61 6c 6c 62 61 63 6b 2c 20 70 2c 20 30 29 3b 0a  allback, p, 0);.
16630 20 20 20 20 69 66 28 20 28 72 63 26 30 78 66 66      if( (rc&0xff
16640 29 3d 3d 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  )==SQLITE_CORRUP
16650 54 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70  T ){.      raw_p
16660 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 2f  rintf(p->out, "/
16670 2a 2a 2a 2a 2a 2a 20 43 4f 52 52 55 50 54 49 4f  ****** CORRUPTIO
16680 4e 20 45 52 52 4f 52 20 2a 2a 2a 2a 2a 2a 2a 2f  N ERROR *******/
16690 5c 6e 22 29 3b 0a 20 20 20 20 20 20 74 6f 67 67  \n");.      togg
166a0 6c 65 53 65 6c 65 63 74 4f 72 64 65 72 28 70 2d  leSelectOrder(p-
166b0 3e 64 62 29 3b 0a 20 20 20 20 20 20 73 68 65 6c  >db);.      shel
166c0 6c 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20 73 53  l_exec(p->db, sS
166d0 65 6c 65 63 74 2e 7a 2c 20 73 68 65 6c 6c 5f 63  elect.z, shell_c
166e0 61 6c 6c 62 61 63 6b 2c 20 70 2c 20 30 29 3b 0a  allback, p, 0);.
166f0 20 20 20 20 20 20 74 6f 67 67 6c 65 53 65 6c 65        toggleSele
16700 63 74 4f 72 64 65 72 28 70 2d 3e 64 62 29 3b 0a  ctOrder(p->db);.
16710 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 7a 44 65      }.    p->zDe
16720 73 74 54 61 62 6c 65 20 3d 20 73 61 76 65 64 44  stTable = savedD
16730 65 73 74 54 61 62 6c 65 3b 0a 20 20 20 20 70 2d  estTable;.    p-
16740 3e 6d 6f 64 65 20 3d 20 73 61 76 65 64 4d 6f 64  >mode = savedMod
16750 65 3b 0a 20 20 20 20 66 72 65 65 54 65 78 74 28  e;.    freeText(
16760 26 73 54 61 62 6c 65 29 3b 0a 20 20 20 20 66 72  &sTable);.    fr
16770 65 65 54 65 78 74 28 26 73 53 65 6c 65 63 74 29  eeText(&sSelect)
16780 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 70  ;.    if( rc ) p
16790 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 7d 0a 20 20  ->nErr++;.  }.  
167a0 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
167b0 2a 2a 20 52 75 6e 20 7a 51 75 65 72 79 2e 20 20  ** Run zQuery.  
167c0 55 73 65 20 64 75 6d 70 5f 63 61 6c 6c 62 61 63  Use dump_callbac
167d0 6b 28 29 20 61 73 20 74 68 65 20 63 61 6c 6c 62  k() as the callb
167e0 61 63 6b 20 72 6f 75 74 69 6e 65 20 73 6f 20 74  ack routine so t
167f0 68 61 74 0a 2a 2a 20 74 68 65 20 63 6f 6e 74 65  hat.** the conte
16800 6e 74 73 20 6f 66 20 74 68 65 20 71 75 65 72 79  nts of the query
16810 20 61 72 65 20 6f 75 74 70 75 74 20 61 73 20 53   are output as S
16820 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a  QL statements..*
16830 2a 0a 2a 2a 20 49 66 20 77 65 20 67 65 74 20 61  *.** If we get a
16840 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20   SQLITE_CORRUPT 
16850 65 72 72 6f 72 2c 20 72 65 72 75 6e 20 74 68 65  error, rerun the
16860 20 71 75 65 72 79 20 61 66 74 65 72 20 61 70 70   query after app
16870 65 6e 64 69 6e 67 0a 2a 2a 20 22 4f 52 44 45 52  ending.** "ORDER
16880 20 42 59 20 72 6f 77 69 64 20 44 45 53 43 22 20   BY rowid DESC" 
16890 74 6f 20 74 68 65 20 65 6e 64 2e 0a 2a 2f 0a 73  to the end..*/.s
168a0 74 61 74 69 63 20 69 6e 74 20 72 75 6e 5f 73 63  tatic int run_sc
168b0 68 65 6d 61 5f 64 75 6d 70 5f 71 75 65 72 79 28  hema_dump_query(
168c0 0a 20 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 70  .  ShellState *p
168d0 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
168e0 7a 51 75 65 72 79 0a 29 7b 0a 20 20 69 6e 74 20  zQuery.){.  int 
168f0 72 63 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72  rc;.  char *zErr
16900 20 3d 20 30 3b 0a 20 20 72 63 20 3d 20 73 71 6c   = 0;.  rc = sql
16910 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c  ite3_exec(p->db,
16920 20 7a 51 75 65 72 79 2c 20 64 75 6d 70 5f 63 61   zQuery, dump_ca
16930 6c 6c 62 61 63 6b 2c 20 70 2c 20 26 7a 45 72 72  llback, p, &zErr
16940 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
16950 49 54 45 5f 43 4f 52 52 55 50 54 20 29 7b 0a 20  ITE_CORRUPT ){. 
16960 20 20 20 63 68 61 72 20 2a 7a 51 32 3b 0a 20 20     char *zQ2;.  
16970 20 20 69 6e 74 20 6c 65 6e 20 3d 20 73 74 72 6c    int len = strl
16980 65 6e 33 30 28 7a 51 75 65 72 79 29 3b 0a 20 20  en30(zQuery);.  
16990 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e    raw_printf(p->
169a0 6f 75 74 2c 20 22 2f 2a 2a 2a 2a 2a 2a 20 43 4f  out, "/****** CO
169b0 52 52 55 50 54 49 4f 4e 20 45 52 52 4f 52 20 2a  RRUPTION ERROR *
169c0 2a 2a 2a 2a 2a 2a 2f 5c 6e 22 29 3b 0a 20 20 20  ******/\n");.   
169d0 20 69 66 28 20 7a 45 72 72 20 29 7b 0a 20 20 20   if( zErr ){.   
169e0 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70     utf8_printf(p
169f0 2d 3e 6f 75 74 2c 20 22 2f 2a 2a 2a 2a 2a 2a 20  ->out, "/****** 
16a00 25 73 20 2a 2a 2a 2a 2a 2a 2f 5c 6e 22 2c 20 7a  %s ******/\n", z
16a10 45 72 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Err);.      sqli
16a20 74 65 33 5f 66 72 65 65 28 7a 45 72 72 29 3b 0a  te3_free(zErr);.
16a30 20 20 20 20 20 20 7a 45 72 72 20 3d 20 30 3b 0a        zErr = 0;.
16a40 20 20 20 20 7d 0a 20 20 20 20 7a 51 32 20 3d 20      }.    zQ2 = 
16a50 6d 61 6c 6c 6f 63 28 20 6c 65 6e 2b 31 30 30 20  malloc( len+100 
16a60 29 3b 0a 20 20 20 20 69 66 28 20 7a 51 32 3d 3d  );.    if( zQ2==
16a70 30 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  0 ) return rc;. 
16a80 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
16a90 6e 74 66 28 6c 65 6e 2b 31 30 30 2c 20 7a 51 32  ntf(len+100, zQ2
16aa0 2c 20 22 25 73 20 4f 52 44 45 52 20 42 59 20 72  , "%s ORDER BY r
16ab0 6f 77 69 64 20 44 45 53 43 22 2c 20 7a 51 75 65  owid DESC", zQue
16ac0 72 79 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  ry);.    rc = sq
16ad0 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62  lite3_exec(p->db
16ae0 2c 20 7a 51 32 2c 20 64 75 6d 70 5f 63 61 6c 6c  , zQ2, dump_call
16af0 62 61 63 6b 2c 20 70 2c 20 26 7a 45 72 72 29 3b  back, p, &zErr);
16b00 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20  .    if( rc ){. 
16b10 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
16b20 28 70 2d 3e 6f 75 74 2c 20 22 2f 2a 2a 2a 2a 2a  (p->out, "/*****
16b30 2a 20 45 52 52 4f 52 3a 20 25 73 20 2a 2a 2a 2a  * ERROR: %s ****
16b40 2a 2a 2f 5c 6e 22 2c 20 7a 45 72 72 29 3b 0a 20  **/\n", zErr);. 
16b50 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
16b60 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
16b70 55 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  UPT;.    }.    s
16b80 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 45 72 72  qlite3_free(zErr
16b90 29 3b 0a 20 20 20 20 66 72 65 65 28 7a 51 32 29  );.    free(zQ2)
16ba0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
16bb0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 65 78 74  c;.}../*.** Text
16bc0 20 6f 66 20 61 20 68 65 6c 70 20 6d 65 73 73 61   of a help messa
16bd0 67 65 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61  ge.*/.static cha
16be0 72 20 7a 48 65 6c 70 5b 5d 20 3d 0a 23 69 66 20  r zHelp[] =.#if 
16bf0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 48  defined(SQLITE_H
16c00 41 56 45 5f 5a 4c 49 42 29 20 26 26 20 21 64 65  AVE_ZLIB) && !de
16c10 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
16c20 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 0a  T_VIRTUALTABLE).
16c30 20 20 22 2e 61 72 63 68 69 76 65 20 2e 2e 2e 20    ".archive ... 
16c40 20 20 20 20 20 20 20 20 20 20 4d 61 6e 61 67 65            Manage
16c50 20 53 51 4c 20 61 72 63 68 69 76 65 73 3a 20 5c   SQL archives: \
16c60 22 2e 61 72 63 68 69 76 65 20 2d 2d 68 65 6c 70  ".archive --help
16c70 5c 22 20 66 6f 72 20 64 65 74 61 69 6c 73 5c 6e  \" for details\n
16c80 22 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66  ".#endif.#ifndef
16c90 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
16ca0 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 22 2e 61  HORIZATION.  ".a
16cb0 75 74 68 20 4f 4e 7c 4f 46 46 20 20 20 20 20 20  uth ON|OFF      
16cc0 20 20 20 20 20 53 68 6f 77 20 61 75 74 68 6f 72       Show author
16cd0 69 7a 65 72 20 63 61 6c 6c 62 61 63 6b 73 5c 6e  izer callbacks\n
16ce0 22 0a 23 65 6e 64 69 66 0a 20 20 22 2e 62 61 63  ".#endif.  ".bac
16cf0 6b 75 70 20 3f 44 42 3f 20 46 49 4c 45 20 20 20  kup ?DB? FILE   
16d00 20 20 20 42 61 63 6b 75 70 20 44 42 20 28 64 65     Backup DB (de
16d10 66 61 75 6c 74 20 5c 22 6d 61 69 6e 5c 22 29 20  fault \"main\") 
16d20 74 6f 20 46 49 4c 45 5c 6e 22 0a 20 20 22 2e 62  to FILE\n".  ".b
16d30 61 69 6c 20 6f 6e 7c 6f 66 66 20 20 20 20 20 20  ail on|off      
16d40 20 20 20 20 20 53 74 6f 70 20 61 66 74 65 72 20       Stop after 
16d50 68 69 74 74 69 6e 67 20 61 6e 20 65 72 72 6f 72  hitting an error
16d60 2e 20 20 44 65 66 61 75 6c 74 20 4f 46 46 5c 6e  .  Default OFF\n
16d70 22 0a 20 20 22 2e 62 69 6e 61 72 79 20 6f 6e 7c  ".  ".binary on|
16d80 6f 66 66 20 20 20 20 20 20 20 20 20 54 75 72 6e  off         Turn
16d90 20 62 69 6e 61 72 79 20 6f 75 74 70 75 74 20 6f   binary output o
16da0 6e 20 6f 72 20 6f 66 66 2e 20 20 44 65 66 61 75  n or off.  Defau
16db0 6c 74 20 4f 46 46 5c 6e 22 0a 20 20 22 2e 63 64  lt OFF\n".  ".cd
16dc0 20 44 49 52 45 43 54 4f 52 59 20 20 20 20 20 20   DIRECTORY      
16dd0 20 20 20 20 43 68 61 6e 67 65 20 74 68 65 20 77      Change the w
16de0 6f 72 6b 69 6e 67 20 64 69 72 65 63 74 6f 72 79  orking directory
16df0 20 74 6f 20 44 49 52 45 43 54 4f 52 59 5c 6e 22   to DIRECTORY\n"
16e00 0a 20 20 22 2e 63 68 61 6e 67 65 73 20 6f 6e 7c  .  ".changes on|
16e10 6f 66 66 20 20 20 20 20 20 20 20 53 68 6f 77 20  off        Show 
16e20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 63  number of rows c
16e30 68 61 6e 67 65 64 20 62 79 20 53 51 4c 5c 6e 22  hanged by SQL\n"
16e40 0a 20 20 22 2e 63 68 65 63 6b 20 47 4c 4f 42 20  .  ".check GLOB 
16e50 20 20 20 20 20 20 20 20 20 20 20 46 61 69 6c 20             Fail 
16e60 69 66 20 6f 75 74 70 75 74 20 73 69 6e 63 65 20  if output since 
16e70 2e 74 65 73 74 63 61 73 65 20 64 6f 65 73 20 6e  .testcase does n
16e80 6f 74 20 6d 61 74 63 68 5c 6e 22 0a 20 20 22 2e  ot match\n".  ".
16e90 63 6c 6f 6e 65 20 4e 45 57 44 42 20 20 20 20 20  clone NEWDB     
16ea0 20 20 20 20 20 20 43 6c 6f 6e 65 20 64 61 74 61        Clone data
16eb0 20 69 6e 74 6f 20 4e 45 57 44 42 20 66 72 6f 6d   into NEWDB from
16ec0 20 74 68 65 20 65 78 69 73 74 69 6e 67 20 64 61   the existing da
16ed0 74 61 62 61 73 65 5c 6e 22 0a 20 20 22 2e 64 61  tabase\n".  ".da
16ee0 74 61 62 61 73 65 73 20 20 20 20 20 20 20 20 20  tabases         
16ef0 20 20 20 20 4c 69 73 74 20 6e 61 6d 65 73 20 61      List names a
16f00 6e 64 20 66 69 6c 65 73 20 6f 66 20 61 74 74 61  nd files of atta
16f10 63 68 65 64 20 64 61 74 61 62 61 73 65 73 5c 6e  ched databases\n
16f20 22 0a 20 20 22 2e 64 62 69 6e 66 6f 20 3f 44 42  ".  ".dbinfo ?DB
16f30 3f 20 20 20 20 20 20 20 20 20 20 20 53 68 6f 77  ?           Show
16f40 20 73 74 61 74 75 73 20 69 6e 66 6f 72 6d 61 74   status informat
16f50 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 64 61  ion about the da
16f60 74 61 62 61 73 65 5c 6e 22 0a 20 20 22 2e 64 75  tabase\n".  ".du
16f70 6d 70 20 3f 54 41 42 4c 45 3f 20 2e 2e 2e 20 20  mp ?TABLE? ...  
16f80 20 20 20 20 44 75 6d 70 20 74 68 65 20 64 61 74      Dump the dat
16f90 61 62 61 73 65 20 69 6e 20 61 6e 20 53 51 4c 20  abase in an SQL 
16fa0 74 65 78 74 20 66 6f 72 6d 61 74 5c 6e 22 0a 20  text format\n". 
16fb0 20 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20   "              
16fc0 20 20 20 20 20 20 20 20 20 20 20 49 66 20 54 41             If TA
16fd0 42 4c 45 20 73 70 65 63 69 66 69 65 64 2c 20 6f  BLE specified, o
16fe0 6e 6c 79 20 64 75 6d 70 20 74 61 62 6c 65 73 20  nly dump tables 
16ff0 6d 61 74 63 68 69 6e 67 5c 6e 22 0a 20 20 22 20  matching\n".  " 
17000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17010 20 20 20 20 20 20 20 20 4c 49 4b 45 20 70 61 74          LIKE pat
17020 74 65 72 6e 20 54 41 42 4c 45 2e 5c 6e 22 0a 20  tern TABLE.\n". 
17030 20 22 2e 65 63 68 6f 20 6f 6e 7c 6f 66 66 20 20   ".echo on|off  
17040 20 20 20 20 20 20 20 20 20 54 75 72 6e 20 63 6f           Turn co
17050 6d 6d 61 6e 64 20 65 63 68 6f 20 6f 6e 20 6f 72  mmand echo on or
17060 20 6f 66 66 5c 6e 22 0a 20 20 22 2e 65 71 70 20   off\n".  ".eqp 
17070 6f 6e 7c 6f 66 66 7c 66 75 6c 6c 20 20 20 20 20  on|off|full     
17080 20 20 45 6e 61 62 6c 65 20 6f 72 20 64 69 73 61    Enable or disa
17090 62 6c 65 20 61 75 74 6f 6d 61 74 69 63 20 45 58  ble automatic EX
170a0 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e  PLAIN QUERY PLAN
170b0 5c 6e 22 0a 20 20 22 2e 65 78 69 74 20 20 20 20  \n".  ".exit    
170c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 45 78                Ex
170d0 69 74 20 74 68 69 73 20 70 72 6f 67 72 61 6d 5c  it this program\
170e0 6e 22 0a 20 20 22 2e 65 78 70 65 72 74 20 20 20  n".  ".expert   
170f0 20 20 20 20 20 20 20 20 20 20 20 20 20 45 58 50               EXP
17100 45 52 49 4d 45 4e 54 41 4c 2e 20 53 75 67 67 65  ERIMENTAL. Sugge
17110 73 74 20 69 6e 64 65 78 65 73 20 66 6f 72 20 73  st indexes for s
17120 70 65 63 69 66 69 65 64 20 71 75 65 72 69 65 73  pecified queries
17130 5c 6e 22 0a 2f 2a 20 42 65 63 61 75 73 65 20 65  \n"./* Because e
17140 78 70 6c 61 69 6e 20 6d 6f 64 65 20 63 6f 6d 65  xplain mode come
17150 73 20 6f 6e 20 61 75 74 6f 6d 61 74 69 63 61 6c  s on automatical
17160 6c 79 20 6e 6f 77 2c 20 74 68 65 20 22 2e 65 78  ly now, the ".ex
17170 70 6c 61 69 6e 22 20 6d 6f 64 65 0a 2a 2a 20 69  plain" mode.** i
17180 73 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74  s removed from t
17190 68 65 20 68 65 6c 70 20 73 63 72 65 65 6e 2e 20  he help screen. 
171a0 20 49 74 20 69 73 20 73 74 69 6c 6c 20 73 75 70   It is still sup
171b0 70 6f 72 74 65 64 20 66 6f 72 20 6c 65 67 61 63  ported for legac
171c0 79 2c 20 68 6f 77 65 76 65 72 20 2a 2f 0a 2f 2a  y, however */./*
171d0 22 2e 65 78 70 6c 61 69 6e 20 3f 6f 6e 7c 6f 66  ".explain ?on|of
171e0 66 7c 61 75 74 6f 3f 20 54 75 72 6e 20 45 58 50  f|auto? Turn EXP
171f0 4c 41 49 4e 20 6f 75 74 70 75 74 20 6d 6f 64 65  LAIN output mode
17200 20 6f 6e 20 6f 72 20 6f 66 66 20 6f 72 20 74 6f   on or off or to
17210 20 61 75 74 6f 6d 61 74 69 63 5c 6e 22 2a 2f 0a   automatic\n"*/.
17220 20 20 22 2e 66 75 6c 6c 73 63 68 65 6d 61 20 3f    ".fullschema ?
17230 2d 2d 69 6e 64 65 6e 74 3f 20 53 68 6f 77 20 73  --indent? Show s
17240 63 68 65 6d 61 20 61 6e 64 20 74 68 65 20 63 6f  chema and the co
17250 6e 74 65 6e 74 20 6f 66 20 73 71 6c 69 74 65 5f  ntent of sqlite_
17260 73 74 61 74 20 74 61 62 6c 65 73 5c 6e 22 0a 20  stat tables\n". 
17270 20 22 2e 68 65 61 64 65 72 73 20 6f 6e 7c 6f 66   ".headers on|of
17280 66 20 20 20 20 20 20 20 20 54 75 72 6e 20 64 69  f        Turn di
17290 73 70 6c 61 79 20 6f 66 20 68 65 61 64 65 72 73  splay of headers
172a0 20 6f 6e 20 6f 72 20 6f 66 66 5c 6e 22 0a 20 20   on or off\n".  
172b0 22 2e 68 65 6c 70 20 20 20 20 20 20 20 20 20 20  ".help          
172c0 20 20 20 20 20 20 20 20 53 68 6f 77 20 74 68 69          Show thi
172d0 73 20 6d 65 73 73 61 67 65 5c 6e 22 0a 20 20 22  s message\n".  "
172e0 2e 69 6d 70 6f 72 74 20 46 49 4c 45 20 54 41 42  .import FILE TAB
172f0 4c 45 20 20 20 20 20 49 6d 70 6f 72 74 20 64 61  LE     Import da
17300 74 61 20 66 72 6f 6d 20 46 49 4c 45 20 69 6e 74  ta from FILE int
17310 6f 20 54 41 42 4c 45 5c 6e 22 0a 23 69 66 6e 64  o TABLE\n".#ifnd
17320 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54  ef SQLITE_OMIT_T
17330 45 53 54 5f 43 4f 4e 54 52 4f 4c 0a 20 20 22 2e  EST_CONTROL.  ".
17340 69 6d 70 6f 73 74 65 72 20 49 4e 44 45 58 20 54  imposter INDEX T
17350 41 42 4c 45 20 20 43 72 65 61 74 65 20 69 6d 70  ABLE  Create imp
17360 6f 73 74 65 72 20 74 61 62 6c 65 20 54 41 42 4c  oster table TABL
17370 45 20 6f 6e 20 69 6e 64 65 78 20 49 4e 44 45 58  E on index INDEX
17380 5c 6e 22 0a 23 65 6e 64 69 66 0a 20 20 22 2e 69  \n".#endif.  ".i
17390 6e 64 65 78 65 73 20 3f 54 41 42 4c 45 3f 20 20  ndexes ?TABLE?  
173a0 20 20 20 20 20 53 68 6f 77 20 6e 61 6d 65 73 20       Show names 
173b0 6f 66 20 61 6c 6c 20 69 6e 64 65 78 65 73 5c 6e  of all indexes\n
173c0 22 0a 20 20 22 20 20 20 20 20 20 20 20 20 20 20  ".  "           
173d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 49 66                If
173e0 20 54 41 42 4c 45 20 73 70 65 63 69 66 69 65 64   TABLE specified
173f0 2c 20 6f 6e 6c 79 20 73 68 6f 77 20 69 6e 64 65  , only show inde
17400 78 65 73 20 66 6f 72 20 74 61 62 6c 65 73 5c 6e  xes for tables\n
17410 22 0a 20 20 22 20 20 20 20 20 20 20 20 20 20 20  ".  "           
17420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 61                ma
17430 74 63 68 69 6e 67 20 4c 49 4b 45 20 70 61 74 74  tching LIKE patt
17440 65 72 6e 20 54 41 42 4c 45 2e 5c 6e 22 0a 23 69  ern TABLE.\n".#i
17450 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
17460 4c 45 5f 49 4f 54 52 41 43 45 0a 20 20 22 2e 69  LE_IOTRACE.  ".i
17470 6f 74 72 61 63 65 20 46 49 4c 45 20 20 20 20 20  otrace FILE     
17480 20 20 20 20 20 45 6e 61 62 6c 65 20 49 2f 4f 20       Enable I/O 
17490 64 69 61 67 6e 6f 73 74 69 63 20 6c 6f 67 67 69  diagnostic loggi
174a0 6e 67 20 74 6f 20 46 49 4c 45 5c 6e 22 0a 23 65  ng to FILE\n".#e
174b0 6e 64 69 66 0a 20 20 22 2e 6c 69 6d 69 74 20 3f  ndif.  ".limit ?
174c0 4c 49 4d 49 54 3f 20 3f 56 41 4c 3f 20 20 20 44  LIMIT? ?VAL?   D
174d0 69 73 70 6c 61 79 20 6f 72 20 63 68 61 6e 67 65  isplay or change
174e0 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 61 6e   the value of an
174f0 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5c 6e 22   SQLITE_LIMIT\n"
17500 0a 20 20 22 2e 6c 69 6e 74 20 4f 50 54 49 4f 4e  .  ".lint OPTION
17510 53 20 20 20 20 20 20 20 20 20 20 52 65 70 6f 72  S          Repor
17520 74 20 70 6f 74 65 6e 74 69 61 6c 20 73 63 68 65  t potential sche
17530 6d 61 20 69 73 73 75 65 73 2e 20 4f 70 74 69 6f  ma issues. Optio
17540 6e 73 3a 5c 6e 22 0a 20 20 22 20 20 20 20 20 20  ns:\n".  "      
17550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17560 20 20 20 66 6b 65 79 2d 69 6e 64 65 78 65 73 20     fkey-indexes 
17570 20 20 20 20 46 69 6e 64 20 6d 69 73 73 69 6e 67      Find missing
17580 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 69 6e 64   foreign key ind
17590 65 78 65 73 5c 6e 22 0a 23 69 66 6e 64 65 66 20  exes\n".#ifndef 
175a0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44  SQLITE_OMIT_LOAD
175b0 5f 45 58 54 45 4e 53 49 4f 4e 0a 20 20 22 2e 6c  _EXTENSION.  ".l
175c0 6f 61 64 20 46 49 4c 45 20 3f 45 4e 54 52 59 3f  oad FILE ?ENTRY?
175d0 20 20 20 20 20 4c 6f 61 64 20 61 6e 20 65 78 74       Load an ext
175e0 65 6e 73 69 6f 6e 20 6c 69 62 72 61 72 79 5c 6e  ension library\n
175f0 22 0a 23 65 6e 64 69 66 0a 20 20 22 2e 6c 6f 67  ".#endif.  ".log
17600 20 46 49 4c 45 7c 6f 66 66 20 20 20 20 20 20 20   FILE|off       
17610 20 20 20 54 75 72 6e 20 6c 6f 67 67 69 6e 67 20     Turn logging 
17620 6f 6e 20 6f 72 20 6f 66 66 2e 20 20 46 49 4c 45  on or off.  FILE
17630 20 63 61 6e 20 62 65 20 73 74 64 65 72 72 2f 73   can be stderr/s
17640 74 64 6f 75 74 5c 6e 22 0a 20 20 22 2e 6d 6f 64  tdout\n".  ".mod
17650 65 20 4d 4f 44 45 20 3f 54 41 42 4c 45 3f 20 20  e MODE ?TABLE?  
17660 20 20 20 53 65 74 20 6f 75 74 70 75 74 20 6d 6f     Set output mo
17670 64 65 20 77 68 65 72 65 20 4d 4f 44 45 20 69 73  de where MODE is
17680 20 6f 6e 65 20 6f 66 3a 5c 6e 22 0a 20 20 22 20   one of:\n".  " 
17690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
176a0 20 20 20 20 20 20 20 20 61 73 63 69 69 20 20 20          ascii   
176b0 20 43 6f 6c 75 6d 6e 73 2f 72 6f 77 73 20 64 65   Columns/rows de
176c0 6c 69 6d 69 74 65 64 20 62 79 20 30 78 31 46 20  limited by 0x1F 
176d0 61 6e 64 20 30 78 31 45 5c 6e 22 0a 20 20 22 20  and 0x1E\n".  " 
176e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
176f0 20 20 20 20 20 20 20 20 63 73 76 20 20 20 20 20          csv     
17700 20 43 6f 6d 6d 61 2d 73 65 70 61 72 61 74 65 64   Comma-separated
17710 20 76 61 6c 75 65 73 5c 6e 22 0a 20 20 22 20 20   values\n".  "  
17720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17730 20 20 20 20 20 20 20 63 6f 6c 75 6d 6e 20 20 20         column   
17740 4c 65 66 74 2d 61 6c 69 67 6e 65 64 20 63 6f 6c  Left-aligned col
17750 75 6d 6e 73 2e 20 20 28 53 65 65 20 2e 77 69 64  umns.  (See .wid
17760 74 68 29 5c 6e 22 0a 20 20 22 20 20 20 20 20 20  th)\n".  "      
17770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17780 20 20 20 68 74 6d 6c 20 20 20 20 20 48 54 4d 4c     html     HTML
17790 20 3c 74 61 62 6c 65 3e 20 63 6f 64 65 5c 6e 22   <table> code\n"
177a0 0a 20 20 22 20 20 20 20 20 20 20 20 20 20 20 20  .  "            
177b0 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 73               ins
177c0 65 72 74 20 20 20 53 51 4c 20 69 6e 73 65 72 74  ert   SQL insert
177d0 20 73 74 61 74 65 6d 65 6e 74 73 20 66 6f 72 20   statements for 
177e0 54 41 42 4c 45 5c 6e 22 0a 20 20 22 20 20 20 20  TABLE\n".  "    
177f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17800 20 20 20 20 20 6c 69 6e 65 20 20 20 20 20 4f 6e       line     On
17810 65 20 76 61 6c 75 65 20 70 65 72 20 6c 69 6e 65  e value per line
17820 5c 6e 22 0a 20 20 22 20 20 20 20 20 20 20 20 20  \n".  "         
17830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17840 6c 69 73 74 20 20 20 20 20 56 61 6c 75 65 73 20  list     Values 
17850 64 65 6c 69 6d 69 74 65 64 20 62 79 20 5c 22 7c  delimited by \"|
17860 5c 22 5c 6e 22 0a 20 20 22 20 20 20 20 20 20 20  \"\n".  "       
17870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17880 20 20 71 75 6f 74 65 20 20 20 20 45 73 63 61 70    quote    Escap
17890 65 20 61 6e 73 77 65 72 73 20 61 73 20 66 6f 72  e answers as for
178a0 20 53 51 4c 5c 6e 22 0a 20 20 22 20 20 20 20 20   SQL\n".  "     
178b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
178c0 20 20 20 20 74 61 62 73 20 20 20 20 20 54 61 62      tabs     Tab
178d0 2d 73 65 70 61 72 61 74 65 64 20 76 61 6c 75 65  -separated value
178e0 73 5c 6e 22 0a 20 20 22 20 20 20 20 20 20 20 20  s\n".  "        
178f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17900 20 74 63 6c 20 20 20 20 20 20 54 43 4c 20 6c 69   tcl      TCL li
17910 73 74 20 65 6c 65 6d 65 6e 74 73 5c 6e 22 0a 20  st elements\n". 
17920 20 22 2e 6e 75 6c 6c 76 61 6c 75 65 20 53 54 52   ".nullvalue STR
17930 49 4e 47 20 20 20 20 20 20 55 73 65 20 53 54 52  ING      Use STR
17940 49 4e 47 20 69 6e 20 70 6c 61 63 65 20 6f 66 20  ING in place of 
17950 4e 55 4c 4c 20 76 61 6c 75 65 73 5c 6e 22 0a 20  NULL values\n". 
17960 20 22 2e 6f 6e 63 65 20 46 49 4c 45 4e 41 4d 45   ".once FILENAME
17970 20 20 20 20 20 20 20 20 20 4f 75 74 70 75 74 20           Output 
17980 66 6f 72 20 74 68 65 20 6e 65 78 74 20 53 51 4c  for the next SQL
17990 20 63 6f 6d 6d 61 6e 64 20 6f 6e 6c 79 20 74 6f   command only to
179a0 20 46 49 4c 45 4e 41 4d 45 5c 6e 22 0a 20 20 22   FILENAME\n".  "
179b0 2e 6f 70 65 6e 20 3f 4f 50 54 49 4f 4e 53 3f 20  .open ?OPTIONS? 
179c0 3f 46 49 4c 45 3f 20 43 6c 6f 73 65 20 65 78 69  ?FILE? Close exi
179d0 73 74 69 6e 67 20 64 61 74 61 62 61 73 65 20 61  sting database a
179e0 6e 64 20 72 65 6f 70 65 6e 20 46 49 4c 45 5c 6e  nd reopen FILE\n
179f0 22 0a 20 20 22 20 20 20 20 20 20 20 20 20 20 20  ".  "           
17a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54 68                Th
17a10 65 20 2d 2d 6e 65 77 20 6f 70 74 69 6f 6e 20 73  e --new option s
17a20 74 61 72 74 73 20 77 69 74 68 20 61 6e 20 65 6d  tarts with an em
17a30 70 74 79 20 66 69 6c 65 5c 6e 22 0a 20 20 22 2e  pty file\n".  ".
17a40 6f 75 74 70 75 74 20 3f 46 49 4c 45 4e 41 4d 45  output ?FILENAME
17a50 3f 20 20 20 20 20 53 65 6e 64 20 6f 75 74 70 75  ?     Send outpu
17a60 74 20 74 6f 20 46 49 4c 45 4e 41 4d 45 20 6f 72  t to FILENAME or
17a70 20 73 74 64 6f 75 74 5c 6e 22 0a 20 20 22 2e 70   stdout\n".  ".p
17a80 72 69 6e 74 20 53 54 52 49 4e 47 2e 2e 2e 20 20  rint STRING...  
17a90 20 20 20 20 20 50 72 69 6e 74 20 6c 69 74 65 72       Print liter
17aa0 61 6c 20 53 54 52 49 4e 47 5c 6e 22 0a 20 20 22  al STRING\n".  "
17ab0 2e 70 72 6f 6d 70 74 20 4d 41 49 4e 20 43 4f 4e  .prompt MAIN CON
17ac0 54 49 4e 55 45 20 20 52 65 70 6c 61 63 65 20 74  TINUE  Replace t
17ad0 68 65 20 73 74 61 6e 64 61 72 64 20 70 72 6f 6d  he standard prom
17ae0 70 74 73 5c 6e 22 0a 20 20 22 2e 71 75 69 74 20  pts\n".  ".quit 
17af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17b00 20 45 78 69 74 20 74 68 69 73 20 70 72 6f 67 72   Exit this progr
17b10 61 6d 5c 6e 22 0a 20 20 22 2e 72 65 61 64 20 46  am\n".  ".read F
17b20 49 4c 45 4e 41 4d 45 20 20 20 20 20 20 20 20 20  ILENAME         
17b30 45 78 65 63 75 74 65 20 53 51 4c 20 69 6e 20 46  Execute SQL in F
17b40 49 4c 45 4e 41 4d 45 5c 6e 22 0a 20 20 22 2e 72  ILENAME\n".  ".r
17b50 65 73 74 6f 72 65 20 3f 44 42 3f 20 46 49 4c 45  estore ?DB? FILE
17b60 20 20 20 20 20 52 65 73 74 6f 72 65 20 63 6f 6e       Restore con
17b70 74 65 6e 74 20 6f 66 20 44 42 20 28 64 65 66 61  tent of DB (defa
17b80 75 6c 74 20 5c 22 6d 61 69 6e 5c 22 29 20 66 72  ult \"main\") fr
17b90 6f 6d 20 46 49 4c 45 5c 6e 22 0a 20 20 22 2e 73  om FILE\n".  ".s
17ba0 61 76 65 20 46 49 4c 45 20 20 20 20 20 20 20 20  ave FILE        
17bb0 20 20 20 20 20 57 72 69 74 65 20 69 6e 2d 6d 65       Write in-me
17bc0 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20 69 6e  mory database in
17bd0 74 6f 20 46 49 4c 45 5c 6e 22 0a 20 20 22 2e 73  to FILE\n".  ".s
17be0 63 61 6e 73 74 61 74 73 20 6f 6e 7c 6f 66 66 20  canstats on|off 
17bf0 20 20 20 20 20 54 75 72 6e 20 73 71 6c 69 74 65       Turn sqlite
17c00 33 5f 73 74 6d 74 5f 73 63 61 6e 73 74 61 74 75  3_stmt_scanstatu
17c10 73 28 29 20 6d 65 74 72 69 63 73 20 6f 6e 20 6f  s() metrics on o
17c20 72 20 6f 66 66 5c 6e 22 0a 20 20 22 2e 73 63 68  r off\n".  ".sch
17c30 65 6d 61 20 3f 50 41 54 54 45 52 4e 3f 20 20 20  ema ?PATTERN?   
17c40 20 20 20 53 68 6f 77 20 74 68 65 20 43 52 45 41     Show the CREA
17c50 54 45 20 73 74 61 74 65 6d 65 6e 74 73 20 6d 61  TE statements ma
17c60 74 63 68 69 6e 67 20 50 41 54 54 45 52 4e 5c 6e  tching PATTERN\n
17c70 22 0a 20 20 22 20 20 20 20 20 20 20 20 20 20 20  ".  "           
17c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 41                 A
17c90 64 64 20 2d 2d 69 6e 64 65 6e 74 20 66 6f 72 20  dd --indent for 
17ca0 70 72 65 74 74 79 2d 70 72 69 6e 74 69 6e 67 5c  pretty-printing\
17cb0 6e 22 0a 20 20 22 2e 73 65 6c 66 74 65 73 74 20  n".  ".selftest 
17cc0 3f 2d 2d 69 6e 69 74 3f 20 20 20 20 20 52 75 6e  ?--init?     Run
17cd0 20 74 65 73 74 73 20 64 65 66 69 6e 65 64 20 69   tests defined i
17ce0 6e 20 74 68 65 20 53 45 4c 46 54 45 53 54 20 74  n the SELFTEST t
17cf0 61 62 6c 65 5c 6e 22 0a 20 20 22 2e 73 65 70 61  able\n".  ".sepa
17d00 72 61 74 6f 72 20 43 4f 4c 20 3f 52 4f 57 3f 20  rator COL ?ROW? 
17d10 20 20 43 68 61 6e 67 65 20 74 68 65 20 63 6f 6c    Change the col
17d20 75 6d 6e 20 73 65 70 61 72 61 74 6f 72 20 61 6e  umn separator an
17d30 64 20 6f 70 74 69 6f 6e 61 6c 6c 79 20 74 68 65  d optionally the
17d40 20 72 6f 77 5c 6e 22 0a 20 20 22 20 20 20 20 20   row\n".  "     
17d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17d60 20 20 20 20 73 65 70 61 72 61 74 6f 72 20 66 6f      separator fo
17d70 72 20 62 6f 74 68 20 74 68 65 20 6f 75 74 70 75  r both the outpu
17d80 74 20 6d 6f 64 65 20 61 6e 64 20 2e 69 6d 70 6f  t mode and .impo
17d90 72 74 5c 6e 22 0a 23 69 66 20 64 65 66 69 6e 65  rt\n".#if define
17da0 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  d(SQLITE_ENABLE_
17db0 53 45 53 53 49 4f 4e 29 0a 20 20 22 2e 73 65 73  SESSION).  ".ses
17dc0 73 69 6f 6e 20 43 4d 44 20 2e 2e 2e 20 20 20 20  sion CMD ...    
17dd0 20 20 20 43 72 65 61 74 65 20 6f 72 20 63 6f 6e     Create or con
17de0 74 72 6f 6c 20 73 65 73 73 69 6f 6e 73 5c 6e 22  trol sessions\n"
17df0 0a 23 65 6e 64 69 66 0a 20 20 22 2e 73 68 61 33  .#endif.  ".sha3
17e00 73 75 6d 20 3f 4f 50 54 49 4f 4e 53 2e 2e 2e 3f  sum ?OPTIONS...?
17e10 20 20 43 6f 6d 70 75 74 65 20 61 20 53 48 41 33    Compute a SHA3
17e20 20 68 61 73 68 20 6f 66 20 64 61 74 61 62 61 73   hash of databas
17e30 65 20 63 6f 6e 74 65 6e 74 5c 6e 22 0a 20 20 22  e content\n".  "
17e40 2e 73 68 65 6c 6c 20 43 4d 44 20 41 52 47 53 2e  .shell CMD ARGS.
17e50 2e 2e 20 20 20 20 20 52 75 6e 20 43 4d 44 20 41  ..     Run CMD A
17e60 52 47 53 2e 2e 2e 20 69 6e 20 61 20 73 79 73 74  RGS... in a syst
17e70 65 6d 20 73 68 65 6c 6c 5c 6e 22 0a 20 20 22 2e  em shell\n".  ".
17e80 73 68 6f 77 20 20 20 20 20 20 20 20 20 20 20 20  show            
17e90 20 20 20 20 20 20 53 68 6f 77 20 74 68 65 20 63        Show the c
17ea0 75 72 72 65 6e 74 20 76 61 6c 75 65 73 20 66 6f  urrent values fo
17eb0 72 20 76 61 72 69 6f 75 73 20 73 65 74 74 69 6e  r various settin
17ec0 67 73 5c 6e 22 0a 20 20 22 2e 73 74 61 74 73 20  gs\n".  ".stats 
17ed0 3f 6f 6e 7c 6f 66 66 3f 20 20 20 20 20 20 20 20  ?on|off?        
17ee0 53 68 6f 77 20 73 74 61 74 73 20 6f 72 20 74 75  Show stats or tu
17ef0 72 6e 20 73 74 61 74 73 20 6f 6e 20 6f 72 20 6f  rn stats on or o
17f00 66 66 5c 6e 22 0a 20 20 22 2e 73 79 73 74 65 6d  ff\n".  ".system
17f10 20 43 4d 44 20 41 52 47 53 2e 2e 2e 20 20 20 20   CMD ARGS...    
17f20 52 75 6e 20 43 4d 44 20 41 52 47 53 2e 2e 2e 20  Run CMD ARGS... 
17f30 69 6e 20 61 20 73 79 73 74 65 6d 20 73 68 65 6c  in a system shel
17f40 6c 5c 6e 22 0a 20 20 22 2e 74 61 62 6c 65 73 20  l\n".  ".tables 
17f50 3f 54 41 42 4c 45 3f 20 20 20 20 20 20 20 20 4c  ?TABLE?        L
17f60 69 73 74 20 6e 61 6d 65 73 20 6f 66 20 74 61 62  ist names of tab
17f70 6c 65 73 5c 6e 22 0a 20 20 22 20 20 20 20 20 20  les\n".  "      
17f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17f90 20 20 20 49 66 20 54 41 42 4c 45 20 73 70 65 63     If TABLE spec
17fa0 69 66 69 65 64 2c 20 6f 6e 6c 79 20 6c 69 73 74  ified, only list
17fb0 20 74 61 62 6c 65 73 20 6d 61 74 63 68 69 6e 67   tables matching
17fc0 5c 6e 22 0a 20 20 22 20 20 20 20 20 20 20 20 20  \n".  "         
17fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17fe0 4c 49 4b 45 20 70 61 74 74 65 72 6e 20 54 41 42  LIKE pattern TAB
17ff0 4c 45 2e 5c 6e 22 0a 20 20 22 2e 74 65 73 74 63  LE.\n".  ".testc
18000 61 73 65 20 4e 41 4d 45 20 20 20 20 20 20 20 20  ase NAME        
18010 20 42 65 67 69 6e 20 72 65 64 69 72 65 63 74 69   Begin redirecti
18020 6e 67 20 6f 75 74 70 75 74 20 74 6f 20 27 74 65  ng output to 'te
18030 73 74 63 61 73 65 2d 6f 75 74 2e 74 78 74 27 5c  stcase-out.txt'\
18040 6e 22 0a 20 20 22 2e 74 69 6d 65 6f 75 74 20 4d  n".  ".timeout M
18050 53 20 20 20 20 20 20 20 20 20 20 20 20 54 72 79  S            Try
18060 20 6f 70 65 6e 69 6e 67 20 6c 6f 63 6b 65 64 20   opening locked 
18070 74 61 62 6c 65 73 20 66 6f 72 20 4d 53 20 6d 69  tables for MS mi
18080 6c 6c 69 73 65 63 6f 6e 64 73 5c 6e 22 0a 20 20  lliseconds\n".  
18090 22 2e 74 69 6d 65 72 20 6f 6e 7c 6f 66 66 20 20  ".timer on|off  
180a0 20 20 20 20 20 20 20 20 54 75 72 6e 20 53 51 4c          Turn SQL
180b0 20 74 69 6d 65 72 20 6f 6e 20 6f 72 20 6f 66 66   timer on or off
180c0 5c 6e 22 0a 20 20 22 2e 74 72 61 63 65 20 46 49  \n".  ".trace FI
180d0 4c 45 7c 6f 66 66 20 20 20 20 20 20 20 20 4f 75  LE|off        Ou
180e0 74 70 75 74 20 65 61 63 68 20 53 51 4c 20 73 74  tput each SQL st
180f0 61 74 65 6d 65 6e 74 20 61 73 20 69 74 20 69 73  atement as it is
18100 20 72 75 6e 5c 6e 22 0a 20 20 22 2e 76 66 73 69   run\n".  ".vfsi
18110 6e 66 6f 20 3f 41 55 58 3f 20 20 20 20 20 20 20  nfo ?AUX?       
18120 20 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62    Information ab
18130 6f 75 74 20 74 68 65 20 74 6f 70 2d 6c 65 76 65  out the top-leve
18140 6c 20 56 46 53 5c 6e 22 0a 20 20 22 2e 76 66 73  l VFS\n".  ".vfs
18150 6c 69 73 74 20 20 20 20 20 20 20 20 20 20 20 20  list            
18160 20 20 20 4c 69 73 74 20 61 6c 6c 20 61 76 61 69     List all avai
18170 6c 61 62 6c 65 20 56 46 53 65 73 5c 6e 22 0a 20  lable VFSes\n". 
18180 20 22 2e 76 66 73 6e 61 6d 65 20 3f 41 55 58 3f   ".vfsname ?AUX?
18190 20 20 20 20 20 20 20 20 20 50 72 69 6e 74 20 74           Print t
181a0 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 56  he name of the V
181b0 46 53 20 73 74 61 63 6b 5c 6e 22 0a 20 20 22 2e  FS stack\n".  ".
181c0 77 69 64 74 68 20 4e 55 4d 31 20 4e 55 4d 32 20  width NUM1 NUM2 
181d0 2e 2e 2e 20 20 20 53 65 74 20 63 6f 6c 75 6d 6e  ...   Set column
181e0 20 77 69 64 74 68 73 20 66 6f 72 20 5c 22 63 6f   widths for \"co
181f0 6c 75 6d 6e 5c 22 20 6d 6f 64 65 5c 6e 22 0a 20  lumn\" mode\n". 
18200 20 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20   "              
18210 20 20 20 20 20 20 20 20 20 20 20 4e 65 67 61 74             Negat
18220 69 76 65 20 76 61 6c 75 65 73 20 72 69 67 68 74  ive values right
18230 2d 6a 75 73 74 69 66 79 5c 6e 22 0a 3b 0a 0a 23  -justify\n".;..#
18240 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
18250 45 5f 45 4e 41 42 4c 45 5f 53 45 53 53 49 4f 4e  E_ENABLE_SESSION
18260 29 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 68 65  )./*.** Print he
18270 6c 70 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66  lp information f
18280 6f 72 20 74 68 65 20 22 2e 73 65 73 73 69 6f 6e  or the ".session
18290 73 22 20 63 6f 6d 6d 61 6e 64 0a 2a 2f 0a 76 6f  s" command.*/.vo
182a0 69 64 20 73 65 73 73 69 6f 6e 5f 68 65 6c 70 28  id session_help(
182b0 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 29 7b 0a  ShellState *p){.
182c0 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e    raw_printf(p->
182d0 6f 75 74 2c 0a 20 20 20 20 22 2e 73 65 73 73 69  out,.    ".sessi
182e0 6f 6e 20 3f 4e 41 4d 45 3f 20 53 55 42 43 4f 4d  on ?NAME? SUBCOM
182f0 4d 41 4e 44 20 3f 41 52 47 53 2e 2e 2e 3f 5c 6e  MAND ?ARGS...?\n
18300 22 0a 20 20 20 20 22 49 66 20 3f 4e 41 4d 45 3f  ".    "If ?NAME?
18310 20 69 73 20 6f 6d 69 74 74 65 64 2c 20 74 68 65   is omitted, the
18320 20 66 69 72 73 74 20 64 65 66 69 6e 65 64 20 73   first defined s
18330 65 73 73 69 6f 6e 20 69 73 20 75 73 65 64 2e 5c  ession is used.\
18340 6e 22 0a 20 20 20 20 22 53 75 62 63 6f 6d 6d 61  n".    "Subcomma
18350 6e 64 73 3a 5c 6e 22 0a 20 20 20 20 22 20 20 20  nds:\n".    "   
18360 61 74 74 61 63 68 20 54 41 42 4c 45 20 20 20 20  attach TABLE    
18370 20 20 20 20 20 20 20 20 20 41 74 74 61 63 68 20           Attach 
18380 54 41 42 4c 45 5c 6e 22 0a 20 20 20 20 22 20 20  TABLE\n".    "  
18390 20 63 68 61 6e 67 65 73 65 74 20 46 49 4c 45 20   changeset FILE 
183a0 20 20 20 20 20 20 20 20 20 20 57 72 69 74 65 20            Write 
183b0 61 20 63 68 61 6e 67 65 73 65 74 20 69 6e 74 6f  a changeset into
183c0 20 46 49 4c 45 5c 6e 22 0a 20 20 20 20 22 20 20   FILE\n".    "  
183d0 20 63 6c 6f 73 65 20 20 20 20 20 20 20 20 20 20   close          
183e0 20 20 20 20 20 20 20 20 20 20 43 6c 6f 73 65 20            Close 
183f0 6f 6e 65 20 73 65 73 73 69 6f 6e 5c 6e 22 0a 20  one session\n". 
18400 20 20 20 22 20 20 20 65 6e 61 62 6c 65 20 3f 42     "   enable ?B
18410 4f 4f 4c 45 41 4e 3f 20 20 20 20 20 20 20 20 20  OOLEAN?         
18420 53 65 74 20 6f 72 20 71 75 65 72 79 20 74 68 65  Set or query the
18430 20 65 6e 61 62 6c 65 20 62 69 74 5c 6e 22 0a 20   enable bit\n". 
18440 20 20 20 22 20 20 20 66 69 6c 74 65 72 20 47 4c     "   filter GL
18450 4f 42 2e 2e 2e 20 20 20 20 20 20 20 20 20 20 20  OB...           
18460 52 65 6a 65 63 74 20 74 61 62 6c 65 73 20 6d 61  Reject tables ma
18470 74 63 68 69 6e 67 20 47 4c 4f 42 73 5c 6e 22 0a  tching GLOBs\n".
18480 20 20 20 20 22 20 20 20 69 6e 64 69 72 65 63 74      "   indirect
18490 20 3f 42 4f 4f 4c 45 41 4e 3f 20 20 20 20 20 20   ?BOOLEAN?      
184a0 20 4d 61 72 6b 20 6f 72 20 71 75 65 72 79 20 74   Mark or query t
184b0 68 65 20 69 6e 64 69 72 65 63 74 20 73 74 61 74  he indirect stat
184c0 75 73 5c 6e 22 0a 20 20 20 20 22 20 20 20 69 73  us\n".    "   is
184d0 65 6d 70 74 79 20 20 20 20 20 20 20 20 20 20 20  empty           
184e0 20 20 20 20 20 20 20 51 75 65 72 79 20 77 68 65         Query whe
184f0 74 68 65 72 20 74 68 65 20 73 65 73 73 69 6f 6e  ther the session
18500 20 69 73 20 65 6d 70 74 79 5c 6e 22 0a 20 20 20   is empty\n".   
18510 20 22 20 20 20 6c 69 73 74 20 20 20 20 20 20 20   "   list       
18520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4c 69                Li
18530 73 74 20 63 75 72 72 65 6e 74 6c 79 20 6f 70 65  st currently ope
18540 6e 20 73 65 73 73 69 6f 6e 20 6e 61 6d 65 73 5c  n session names\
18550 6e 22 0a 20 20 20 20 22 20 20 20 6f 70 65 6e 20  n".    "   open 
18560 44 42 20 4e 41 4d 45 20 20 20 20 20 20 20 20 20  DB NAME         
18570 20 20 20 20 4f 70 65 6e 20 61 20 6e 65 77 20 73      Open a new s
18580 65 73 73 69 6f 6e 20 6f 6e 20 44 42 5c 6e 22 0a  ession on DB\n".
18590 20 20 20 20 22 20 20 20 70 61 74 63 68 73 65 74      "   patchset
185a0 20 46 49 4c 45 20 20 20 20 20 20 20 20 20 20 20   FILE           
185b0 20 57 72 69 74 65 20 61 20 70 61 74 63 68 73 65   Write a patchse
185c0 74 20 69 6e 74 6f 20 46 49 4c 45 5c 6e 22 0a 20  t into FILE\n". 
185d0 20 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f   );.}.#endif.../
185e0 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65  * Forward refere
185f0 6e 63 65 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  nce */.static in
18600 74 20 70 72 6f 63 65 73 73 5f 69 6e 70 75 74 28  t process_input(
18610 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 2c 20 46  ShellState *p, F
18620 49 4c 45 20 2a 69 6e 29 3b 0a 0a 2f 2a 0a 2a 2a  ILE *in);../*.**
18630 20 52 65 61 64 20 74 68 65 20 63 6f 6e 74 65 6e   Read the conten
18640 74 20 6f 66 20 66 69 6c 65 20 7a 4e 61 6d 65 20  t of file zName 
18650 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 6f 62 74 61  into memory obta
18660 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65  ined from sqlite
18670 33 5f 6d 61 6c 6c 6f 63 36 34 28 29 0a 2a 2a 20  3_malloc64().** 
18680 61 6e 64 20 72 65 74 75 72 6e 20 61 20 70 6f 69  and return a poi
18690 6e 74 65 72 20 74 6f 20 74 68 65 20 62 75 66 66  nter to the buff
186a0 65 72 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 69  er. The caller i
186b0 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f  s responsible fo
186c0 72 20 66 72 65 65 69 6e 67 0a 2a 2a 20 74 68 65  r freeing.** the
186d0 20 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 49   memory..**.** I
186e0 66 20 70 61 72 61 6d 65 74 65 72 20 70 6e 42 79  f parameter pnBy
186f0 74 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20  te is not NULL, 
18700 28 2a 70 6e 42 79 74 65 29 20 69 73 20 73 65 74  (*pnByte) is set
18710 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   to the number o
18720 66 20 62 79 74 65 73 0a 2a 2a 20 72 65 61 64 2e  f bytes.** read.
18730 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 63 6f 6e 76 65  .**.** For conve
18740 6e 69 65 6e 63 65 2c 20 61 20 6e 75 6c 2d 74 65  nience, a nul-te
18750 72 6d 69 6e 61 74 6f 72 20 62 79 74 65 20 69 73  rminator byte is
18760 20 61 6c 77 61 79 73 20 61 70 70 65 6e 64 65 64   always appended
18770 20 74 6f 20 74 68 65 20 64 61 74 61 20 72 65 61   to the data rea
18780 64 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 66 69  d.** from the fi
18790 6c 65 20 62 65 66 6f 72 65 20 74 68 65 20 62 75  le before the bu
187a0 66 66 65 72 20 69 73 20 72 65 74 75 72 6e 65 64  ffer is returned
187b0 2e 20 54 68 69 73 20 62 79 74 65 20 69 73 20 6e  . This byte is n
187c0 6f 74 20 69 6e 63 6c 75 64 65 64 20 69 6e 0a 2a  ot included in.*
187d0 2a 20 74 68 65 20 66 69 6e 61 6c 20 76 61 6c 75  * the final valu
187e0 65 20 6f 66 20 28 2a 70 6e 42 79 74 65 29 2c 20  e of (*pnByte), 
187f0 69 66 20 61 70 70 6c 69 63 61 62 6c 65 2e 0a 2a  if applicable..*
18800 2a 0a 2a 2a 20 4e 55 4c 4c 20 69 73 20 72 65 74  *.** NULL is ret
18810 75 72 6e 65 64 20 69 66 20 61 6e 79 20 65 72 72  urned if any err
18820 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65  or is encountere
18830 64 2e 20 54 68 65 20 66 69 6e 61 6c 20 76 61 6c  d. The final val
18840 75 65 20 6f 66 20 2a 70 6e 42 79 74 65 0a 2a 2a  ue of *pnByte.**
18850 20 69 73 20 75 6e 64 65 66 69 6e 65 64 20 69 6e   is undefined in
18860 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2f 0a 73   this case..*/.s
18870 74 61 74 69 63 20 63 68 61 72 20 2a 72 65 61 64  tatic char *read
18880 46 69 6c 65 28 63 6f 6e 73 74 20 63 68 61 72 20  File(const char 
18890 2a 7a 4e 61 6d 65 2c 20 69 6e 74 20 2a 70 6e 42  *zName, int *pnB
188a0 79 74 65 29 7b 0a 20 20 46 49 4c 45 20 2a 69 6e  yte){.  FILE *in
188b0 20 3d 20 66 6f 70 65 6e 28 7a 4e 61 6d 65 2c 20   = fopen(zName, 
188c0 22 72 62 22 29 3b 0a 20 20 6c 6f 6e 67 20 6e 49  "rb");.  long nI
188d0 6e 3b 0a 20 20 73 69 7a 65 5f 74 20 6e 52 65 61  n;.  size_t nRea
188e0 64 3b 0a 20 20 63 68 61 72 20 2a 70 42 75 66 3b  d;.  char *pBuf;
188f0 0a 20 20 69 66 28 20 69 6e 3d 3d 30 20 29 20 72  .  if( in==0 ) r
18900 65 74 75 72 6e 20 30 3b 0a 20 20 66 73 65 65 6b  eturn 0;.  fseek
18910 28 69 6e 2c 20 30 2c 20 53 45 45 4b 5f 45 4e 44  (in, 0, SEEK_END
18920 29 3b 0a 20 20 6e 49 6e 20 3d 20 66 74 65 6c 6c  );.  nIn = ftell
18930 28 69 6e 29 3b 0a 20 20 72 65 77 69 6e 64 28 69  (in);.  rewind(i
18940 6e 29 3b 0a 20 20 70 42 75 66 20 3d 20 73 71 6c  n);.  pBuf = sql
18950 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 20 6e  ite3_malloc64( n
18960 49 6e 2b 31 20 29 3b 0a 20 20 69 66 28 20 70 42  In+1 );.  if( pB
18970 75 66 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  uf==0 ) return 0
18980 3b 0a 20 20 6e 52 65 61 64 20 3d 20 66 72 65 61  ;.  nRead = frea
18990 64 28 70 42 75 66 2c 20 6e 49 6e 2c 20 31 2c 20  d(pBuf, nIn, 1, 
189a0 69 6e 29 3b 0a 20 20 66 63 6c 6f 73 65 28 69 6e  in);.  fclose(in
189b0 29 3b 0a 20 20 69 66 28 20 6e 52 65 61 64 21 3d  );.  if( nRead!=
189c0 31 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  1 ){.    sqlite3
189d0 5f 66 72 65 65 28 70 42 75 66 29 3b 0a 20 20 20  _free(pBuf);.   
189e0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
189f0 20 70 42 75 66 5b 6e 49 6e 5d 20 3d 20 30 3b 0a   pBuf[nIn] = 0;.
18a00 20 20 69 66 28 20 70 6e 42 79 74 65 20 29 20 2a    if( pnByte ) *
18a10 70 6e 42 79 74 65 20 3d 20 6e 49 6e 3b 0a 20 20  pnByte = nIn;.  
18a20 72 65 74 75 72 6e 20 70 42 75 66 3b 0a 7d 0a 0a  return pBuf;.}..
18a30 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
18a40 54 45 5f 45 4e 41 42 4c 45 5f 53 45 53 53 49 4f  TE_ENABLE_SESSIO
18a50 4e 29 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61  N)./*.** Close a
18a60 20 73 69 6e 67 6c 65 20 4f 70 65 6e 53 65 73 73   single OpenSess
18a70 69 6f 6e 20 6f 62 6a 65 63 74 20 61 6e 64 20 72  ion object and r
18a80 65 6c 65 61 73 65 20 61 6c 6c 20 6f 66 20 69 74  elease all of it
18a90 73 20 61 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20  s associated.** 
18aa0 72 65 73 6f 75 72 63 65 73 2e 0a 2a 2f 0a 73 74  resources..*/.st
18ab0 61 74 69 63 20 76 6f 69 64 20 73 65 73 73 69 6f  atic void sessio
18ac0 6e 5f 63 6c 6f 73 65 28 4f 70 65 6e 53 65 73 73  n_close(OpenSess
18ad0 69 6f 6e 20 2a 70 53 65 73 73 69 6f 6e 29 7b 0a  ion *pSession){.
18ae0 20 20 69 6e 74 20 69 3b 0a 20 20 73 71 6c 69 74    int i;.  sqlit
18af0 65 33 73 65 73 73 69 6f 6e 5f 64 65 6c 65 74 65  e3session_delete
18b00 28 70 53 65 73 73 69 6f 6e 2d 3e 70 29 3b 0a 20  (pSession->p);. 
18b10 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 53   sqlite3_free(pS
18b20 65 73 73 69 6f 6e 2d 3e 7a 4e 61 6d 65 29 3b 0a  ession->zName);.
18b30 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53 65    for(i=0; i<pSe
18b40 73 73 69 6f 6e 2d 3e 6e 46 69 6c 74 65 72 3b 20  ssion->nFilter; 
18b50 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  i++){.    sqlite
18b60 33 5f 66 72 65 65 28 70 53 65 73 73 69 6f 6e 2d  3_free(pSession-
18b70 3e 61 7a 46 69 6c 74 65 72 5b 69 5d 29 3b 0a 20  >azFilter[i]);. 
18b80 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65   }.  sqlite3_fre
18b90 65 28 70 53 65 73 73 69 6f 6e 2d 3e 61 7a 46 69  e(pSession->azFi
18ba0 6c 74 65 72 29 3b 0a 20 20 6d 65 6d 73 65 74 28  lter);.  memset(
18bb0 70 53 65 73 73 69 6f 6e 2c 20 30 2c 20 73 69 7a  pSession, 0, siz
18bc0 65 6f 66 28 4f 70 65 6e 53 65 73 73 69 6f 6e 29  eof(OpenSession)
18bd0 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  );.}.#endif../*.
18be0 2a 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 4f 70 65  ** Close all Ope
18bf0 6e 53 65 73 73 69 6f 6e 20 6f 62 6a 65 63 74 73  nSession objects
18c00 20 61 6e 64 20 72 65 6c 65 61 73 65 20 61 6c 6c   and release all
18c10 20 61 73 73 6f 63 69 61 74 65 64 20 72 65 73 6f   associated reso
18c20 75 72 63 65 73 2e 0a 2a 2f 0a 23 69 66 20 64 65  urces..*/.#if de
18c30 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
18c40 42 4c 45 5f 53 45 53 53 49 4f 4e 29 0a 73 74 61  BLE_SESSION).sta
18c50 74 69 63 20 76 6f 69 64 20 73 65 73 73 69 6f 6e  tic void session
18c60 5f 63 6c 6f 73 65 5f 61 6c 6c 28 53 68 65 6c 6c  _close_all(Shell
18c70 53 74 61 74 65 20 2a 70 29 7b 0a 20 20 69 6e 74  State *p){.  int
18c80 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   i;.  for(i=0; i
18c90 3c 70 2d 3e 6e 53 65 73 73 69 6f 6e 3b 20 69 2b  <p->nSession; i+
18ca0 2b 29 7b 0a 20 20 20 20 73 65 73 73 69 6f 6e 5f  +){.    session_
18cb0 63 6c 6f 73 65 28 26 70 2d 3e 61 53 65 73 73 69  close(&p->aSessi
18cc0 6f 6e 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 70 2d  on[i]);.  }.  p-
18cd0 3e 6e 53 65 73 73 69 6f 6e 20 3d 20 30 3b 0a 7d  >nSession = 0;.}
18ce0 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
18cf0 73 65 73 73 69 6f 6e 5f 63 6c 6f 73 65 5f 61 6c  session_close_al
18d00 6c 28 58 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  l(X).#endif../*.
18d10 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ** Implementatio
18d20 6e 20 6f 66 20 74 68 65 20 78 46 69 6c 74 65 72  n of the xFilter
18d30 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 61 6e   function for an
18d40 20 6f 70 65 6e 20 73 65 73 73 69 6f 6e 2e 20 20   open session.  
18d50 4f 6d 69 74 0a 2a 2a 20 61 6e 79 20 74 61 62 6c  Omit.** any tabl
18d60 65 73 20 6e 61 6d 65 64 20 62 79 20 22 2e 73 65  es named by ".se
18d70 73 73 69 6f 6e 20 66 69 6c 74 65 72 22 20 62 75  ssion filter" bu
18d80 74 20 6c 65 74 20 61 6c 6c 20 6f 74 68 65 72 20  t let all other 
18d90 74 61 62 6c 65 20 74 68 72 6f 75 67 68 2e 0a 2a  table through..*
18da0 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  /.#if defined(SQ
18db0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 45 53 53  LITE_ENABLE_SESS
18dc0 49 4f 4e 29 0a 73 74 61 74 69 63 20 69 6e 74 20  ION).static int 
18dd0 73 65 73 73 69 6f 6e 5f 66 69 6c 74 65 72 28 76  session_filter(v
18de0 6f 69 64 20 2a 70 43 74 78 2c 20 63 6f 6e 73 74  oid *pCtx, const
18df0 20 63 68 61 72 20 2a 7a 54 61 62 29 7b 0a 20 20   char *zTab){.  
18e00 4f 70 65 6e 53 65 73 73 69 6f 6e 20 2a 70 53 65  OpenSession *pSe
18e10 73 73 69 6f 6e 20 3d 20 28 4f 70 65 6e 53 65 73  ssion = (OpenSes
18e20 73 69 6f 6e 2a 29 70 43 74 78 3b 0a 20 20 69 6e  sion*)pCtx;.  in
18e30 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  t i;.  for(i=0; 
18e40 69 3c 70 53 65 73 73 69 6f 6e 2d 3e 6e 46 69 6c  i<pSession->nFil
18e50 74 65 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  ter; i++){.    i
18e60 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72 67 6c  f( sqlite3_strgl
18e70 6f 62 28 70 53 65 73 73 69 6f 6e 2d 3e 61 7a 46  ob(pSession->azF
18e80 69 6c 74 65 72 5b 69 5d 2c 20 7a 54 61 62 29 3d  ilter[i], zTab)=
18e90 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
18ea0 20 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d   }.  return 1;.}
18eb0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
18ec0 72 79 20 74 6f 20 64 65 64 75 63 65 20 74 68 65  ry to deduce the
18ed0 20 74 79 70 65 20 6f 66 20 66 69 6c 65 20 66 6f   type of file fo
18ee0 72 20 7a 4e 61 6d 65 20 62 61 73 65 64 20 6f 6e  r zName based on
18ef0 20 69 74 73 20 63 6f 6e 74 65 6e 74 2e 20 20 52   its content.  R
18f00 65 74 75 72 6e 0a 2a 2a 20 6f 6e 65 20 6f 66 20  eturn.** one of 
18f10 74 68 65 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f 2a  the SHELL_OPEN_*
18f20 20 63 6f 6e 73 74 61 6e 74 73 2e 0a 2a 2f 0a 73   constants..*/.s
18f30 74 61 74 69 63 20 69 6e 74 20 64 65 64 75 63 65  tatic int deduce
18f40 44 61 74 61 62 61 73 65 54 79 70 65 28 63 6f 6e  DatabaseType(con
18f50 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b  st char *zName){
18f60 0a 20 20 46 49 4c 45 20 2a 66 20 3d 20 66 6f 70  .  FILE *f = fop
18f70 65 6e 28 7a 4e 61 6d 65 2c 20 22 72 62 22 29 3b  en(zName, "rb");
18f80 0a 20 20 73 69 7a 65 5f 74 20 6e 3b 0a 20 20 69  .  size_t n;.  i
18f90 6e 74 20 72 63 20 3d 20 53 48 45 4c 4c 5f 4f 50  nt rc = SHELL_OP
18fa0 45 4e 5f 55 4e 53 50 45 43 3b 0a 20 20 63 68 61  EN_UNSPEC;.  cha
18fb0 72 20 7a 42 75 66 5b 31 30 30 5d 3b 0a 20 20 69  r zBuf[100];.  i
18fc0 66 28 20 66 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( f==0 ) return
18fd0 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f 4e 4f 52 4d   SHELL_OPEN_NORM
18fe0 41 4c 3b 0a 20 20 66 73 65 65 6b 28 66 2c 20 2d  AL;.  fseek(f, -
18ff0 32 35 2c 20 53 45 45 4b 5f 45 4e 44 29 3b 0a 20  25, SEEK_END);. 
19000 20 6e 20 3d 20 66 72 65 61 64 28 7a 42 75 66 2c   n = fread(zBuf,
19010 20 32 35 2c 20 31 2c 20 66 29 3b 0a 20 20 69 66   25, 1, f);.  if
19020 28 20 6e 3d 3d 31 20 26 26 20 6d 65 6d 63 6d 70  ( n==1 && memcmp
19030 28 7a 42 75 66 2c 20 22 53 74 61 72 74 2d 4f 66  (zBuf, "Start-Of
19040 2d 53 51 4c 69 74 65 33 2d 22 2c 20 31 37 29 3d  -SQLite3-", 17)=
19050 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  =0 ){.    rc = S
19060 48 45 4c 4c 5f 4f 50 45 4e 5f 41 50 50 45 4e 44  HELL_OPEN_APPEND
19070 56 46 53 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  VFS;.  }else{.  
19080 20 20 66 73 65 65 6b 28 66 2c 20 2d 32 32 2c 20    fseek(f, -22, 
19090 53 45 45 4b 5f 45 4e 44 29 3b 0a 20 20 20 20 6e  SEEK_END);.    n
190a0 20 3d 20 66 72 65 61 64 28 7a 42 75 66 2c 20 32   = fread(zBuf, 2
190b0 32 2c 20 31 2c 20 66 29 3b 0a 20 20 20 20 69 66  2, 1, f);.    if
190c0 28 20 6e 3d 3d 31 20 26 26 20 7a 42 75 66 5b 30  ( n==1 && zBuf[0
190d0 5d 3d 3d 30 78 35 30 20 26 26 20 7a 42 75 66 5b  ]==0x50 && zBuf[
190e0 31 5d 3d 3d 30 78 34 62 20 26 26 20 7a 42 75 66  1]==0x4b && zBuf
190f0 5b 32 5d 3d 3d 30 78 30 35 0a 20 20 20 20 20 20  [2]==0x05.      
19100 20 26 26 20 7a 42 75 66 5b 33 5d 3d 3d 30 78 30   && zBuf[3]==0x0
19110 36 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  6 ){.      rc = 
19120 53 48 45 4c 4c 5f 4f 50 45 4e 5f 5a 49 50 46 49  SHELL_OPEN_ZIPFI
19130 4c 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  LE;.    }.  }.  
19140 66 63 6c 6f 73 65 28 66 29 3b 0a 20 20 72 65 74  fclose(f);.  ret
19150 75 72 6e 20 72 63 3b 20 20 0a 7d 0a 0a 2f 2a 0a  urn rc;  .}../*.
19160 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  ** Make sure the
19170 20 64 61 74 61 62 61 73 65 20 69 73 20 6f 70 65   database is ope
19180 6e 2e 20 20 49 66 20 69 74 20 69 73 20 6e 6f 74  n.  If it is not
19190 2c 20 74 68 65 6e 20 6f 70 65 6e 20 69 74 2e 20  , then open it. 
191a0 20 49 66 0a 2a 2a 20 74 68 65 20 64 61 74 61 62   If.** the datab
191b0 61 73 65 20 66 61 69 6c 73 20 74 6f 20 6f 70 65  ase fails to ope
191c0 6e 2c 20 70 72 69 6e 74 20 61 6e 20 65 72 72 6f  n, print an erro
191d0 72 20 6d 65 73 73 61 67 65 20 61 6e 64 20 65 78  r message and ex
191e0 69 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  it..*/.static vo
191f0 69 64 20 6f 70 65 6e 5f 64 62 28 53 68 65 6c 6c  id open_db(Shell
19200 53 74 61 74 65 20 2a 70 2c 20 69 6e 74 20 6b 65  State *p, int ke
19210 65 70 41 6c 69 76 65 29 7b 0a 20 20 69 66 28 20  epAlive){.  if( 
19220 70 2d 3e 64 62 3d 3d 30 20 29 7b 0a 20 20 20 20  p->db==0 ){.    
19230 73 71 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c 69  sqlite3_initiali
19240 7a 65 28 29 3b 0a 20 20 20 20 69 66 28 20 70 2d  ze();.    if( p-
19250 3e 6f 70 65 6e 4d 6f 64 65 3d 3d 53 48 45 4c 4c  >openMode==SHELL
19260 5f 4f 50 45 4e 5f 55 4e 53 50 45 43 20 26 26 20  _OPEN_UNSPEC && 
19270 61 63 63 65 73 73 28 70 2d 3e 7a 44 62 46 69 6c  access(p->zDbFil
19280 65 6e 61 6d 65 2c 30 29 3d 3d 30 20 29 7b 0a 20  ename,0)==0 ){. 
19290 20 20 20 20 20 70 2d 3e 6f 70 65 6e 4d 6f 64 65       p->openMode
192a0 20 3d 20 64 65 64 75 63 65 44 61 74 61 62 61 73   = deduceDatabas
192b0 65 54 79 70 65 28 70 2d 3e 7a 44 62 46 69 6c 65  eType(p->zDbFile
192c0 6e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  name);.    }.   
192d0 20 73 77 69 74 63 68 28 20 70 2d 3e 6f 70 65 6e   switch( p->open
192e0 4d 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 63 61  Mode ){.      ca
192f0 73 65 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f 41 50  se SHELL_OPEN_AP
19300 50 45 4e 44 56 46 53 3a 20 7b 0a 20 20 20 20 20  PENDVFS: {.     
19310 20 20 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f     sqlite3_open_
19320 76 32 28 70 2d 3e 7a 44 62 46 69 6c 65 6e 61 6d  v2(p->zDbFilenam
19330 65 2c 20 26 70 2d 3e 64 62 2c 20 0a 20 20 20 20  e, &p->db, .    
19340 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
19350 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c  EN_READWRITE|SQL
19360 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 2c  ITE_OPEN_CREATE,
19370 20 22 61 70 6e 64 76 66 73 22 29 3b 0a 20 20 20   "apndvfs");.   
19380 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
19390 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 53    }.      case S
193a0 48 45 4c 4c 5f 4f 50 45 4e 5f 5a 49 50 46 49 4c  HELL_OPEN_ZIPFIL
193b0 45 3a 20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  E: {.        sql
193c0 69 74 65 33 5f 6f 70 65 6e 28 22 3a 6d 65 6d 6f  ite3_open(":memo
193d0 72 79 3a 22 2c 20 26 70 2d 3e 64 62 29 3b 0a 20  ry:", &p->db);. 
193e0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
193f0 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65      }.      case
19400 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f 55 4e 53 50   SHELL_OPEN_UNSP
19410 45 43 3a 0a 20 20 20 20 20 20 63 61 73 65 20 53  EC:.      case S
19420 48 45 4c 4c 5f 4f 50 45 4e 5f 4e 4f 52 4d 41 4c  HELL_OPEN_NORMAL
19430 3a 20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  : {.        sqli
19440 74 65 33 5f 6f 70 65 6e 28 70 2d 3e 7a 44 62 46  te3_open(p->zDbF
19450 69 6c 65 6e 61 6d 65 2c 20 26 70 2d 3e 64 62 29  ilename, &p->db)
19460 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
19470 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
19480 20 20 20 67 6c 6f 62 61 6c 44 62 20 3d 20 70 2d     globalDb = p-
19490 3e 64 62 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  >db;.    if( p->
194a0 64 62 3d 3d 30 20 7c 7c 20 53 51 4c 49 54 45 5f  db==0 || SQLITE_
194b0 4f 4b 21 3d 73 71 6c 69 74 65 33 5f 65 72 72 63  OK!=sqlite3_errc
194c0 6f 64 65 28 70 2d 3e 64 62 29 20 29 7b 0a 20 20  ode(p->db) ){.  
194d0 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
194e0 73 74 64 65 72 72 2c 22 45 72 72 6f 72 3a 20 75  stderr,"Error: u
194f0 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 64 61  nable to open da
19500 74 61 62 61 73 65 20 5c 22 25 73 5c 22 3a 20 25  tabase \"%s\": %
19510 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  s\n",.          
19520 70 2d 3e 7a 44 62 46 69 6c 65 6e 61 6d 65 2c 20  p->zDbFilename, 
19530 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70  sqlite3_errmsg(p
19540 2d 3e 64 62 29 29 3b 0a 20 20 20 20 20 20 69 66  ->db));.      if
19550 28 20 6b 65 65 70 41 6c 69 76 65 20 29 20 72 65  ( keepAlive ) re
19560 74 75 72 6e 3b 0a 20 20 20 20 20 20 65 78 69 74  turn;.      exit
19570 28 31 29 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64  (1);.    }.#ifnd
19580 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c  ef SQLITE_OMIT_L
19590 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 0a 20 20  OAD_EXTENSION.  
195a0 20 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65    sqlite3_enable
195b0 5f 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f 6e 28  _load_extension(
195c0 70 2d 3e 64 62 2c 20 31 29 3b 0a 23 65 6e 64 69  p->db, 1);.#endi
195d0 66 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69  f.    sqlite3_fi
195e0 6c 65 69 6f 5f 69 6e 69 74 28 70 2d 3e 64 62 2c  leio_init(p->db,
195f0 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   0, 0);.    sqli
19600 74 65 33 5f 73 68 61 74 68 72 65 65 5f 69 6e 69  te3_shathree_ini
19610 74 28 70 2d 3e 64 62 2c 20 30 2c 20 30 29 3b 0a  t(p->db, 0, 0);.
19620 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6f 6d 70      sqlite3_comp
19630 6c 65 74 69 6f 6e 5f 69 6e 69 74 28 70 2d 3e 64  letion_init(p->d
19640 62 2c 20 30 2c 20 30 29 3b 0a 23 69 66 64 65 66  b, 0, 0);.#ifdef
19650 20 53 51 4c 49 54 45 5f 48 41 56 45 5f 5a 4c 49   SQLITE_HAVE_ZLI
19660 42 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 7a 69  B.    sqlite3_zi
19670 70 66 69 6c 65 5f 69 6e 69 74 28 70 2d 3e 64 62  pfile_init(p->db
19680 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  , 0, 0);.    sql
19690 69 74 65 33 5f 73 71 6c 61 72 5f 69 6e 69 74 28  ite3_sqlar_init(
196a0 70 2d 3e 64 62 2c 20 30 2c 20 30 29 3b 0a 23 65  p->db, 0, 0);.#e
196b0 6e 64 69 66 0a 20 20 20 20 73 71 6c 69 74 65 33  ndif.    sqlite3
196c0 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
196d0 28 70 2d 3e 64 62 2c 20 22 73 68 65 6c 6c 5f 61  (p->db, "shell_a
196e0 64 64 5f 73 63 68 65 6d 61 22 2c 20 33 2c 20 53  dd_schema", 3, S
196f0 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 0a 20  QLITE_UTF8, 0,. 
19700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19710 20 20 20 20 20 20 20 20 20 20 20 73 68 65 6c 6c             shell
19720 41 64 64 53 63 68 65 6d 61 4e 61 6d 65 2c 20 30  AddSchemaName, 0
19730 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
19740 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
19750 6e 28 70 2d 3e 64 62 2c 20 22 73 68 65 6c 6c 5f  n(p->db, "shell_
19760 6d 6f 64 75 6c 65 5f 73 63 68 65 6d 61 22 2c 20  module_schema", 
19770 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  1, SQLITE_UTF8, 
19780 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
19790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
197a0 68 65 6c 6c 4d 6f 64 75 6c 65 53 63 68 65 6d 61  hellModuleSchema
197b0 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  , 0, 0);.    sql
197c0 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
197d0 74 69 6f 6e 28 70 2d 3e 64 62 2c 20 22 73 68 65  tion(p->db, "she
197e0 6c 6c 5f 70 75 74 73 6e 6c 22 2c 20 31 2c 20 53  ll_putsnl", 1, S
197f0 51 4c 49 54 45 5f 55 54 46 38 2c 20 70 2c 0a 20  QLITE_UTF8, p,. 
19800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19810 20 20 20 20 20 20 20 20 20 20 20 73 68 65 6c 6c             shell
19820 50 75 74 73 46 75 6e 63 2c 20 30 2c 20 30 29 3b  PutsFunc, 0, 0);
19830 0a 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 65 6e  .    if( p->open
19840 4d 6f 64 65 3d 3d 53 48 45 4c 4c 5f 4f 50 45 4e  Mode==SHELL_OPEN
19850 5f 5a 49 50 46 49 4c 45 20 29 7b 0a 20 20 20 20  _ZIPFILE ){.    
19860 20 20 63 68 61 72 20 2a 7a 53 71 6c 20 3d 20 73    char *zSql = s
19870 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a  qlite3_mprintf(.
19880 20 20 20 20 20 20 20 20 20 22 43 52 45 41 54 45           "CREATE
19890 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20 7a   VIRTUAL TABLE z
198a0 69 70 20 55 53 49 4e 47 20 7a 69 70 66 69 6c 65  ip USING zipfile
198b0 28 25 51 29 3b 22 2c 20 70 2d 3e 7a 44 62 46 69  (%Q);", p->zDbFi
198c0 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 73  lename);.      s
198d0 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64  qlite3_exec(p->d
198e0 62 2c 20 7a 53 71 6c 2c 20 30 2c 20 30 2c 20 30  b, zSql, 0, 0, 0
198f0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
19900 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20  _free(zSql);.   
19910 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 69 66 20 48 41   }.  }.}..#if HA
19920 56 45 5f 52 45 41 44 4c 49 4e 45 20 7c 7c 20 48  VE_READLINE || H
19930 41 56 45 5f 45 44 49 54 4c 49 4e 45 0a 2f 2a 0a  AVE_EDITLINE./*.
19940 2a 2a 20 52 65 61 64 6c 69 6e 65 20 63 6f 6d 70  ** Readline comp
19950 6c 65 74 69 6f 6e 20 63 61 6c 6c 62 61 63 6b 73  letion callbacks
19960 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20  .*/.static char 
19970 2a 72 65 61 64 6c 69 6e 65 5f 63 6f 6d 70 6c 65  *readline_comple
19980 74 69 6f 6e 5f 67 65 6e 65 72 61 74 6f 72 28 63  tion_generator(c
19990 6f 6e 73 74 20 63 68 61 72 20 2a 74 65 78 74 2c  onst char *text,
199a0 20 69 6e 74 20 73 74 61 74 65 29 7b 0a 20 20 73   int state){.  s
199b0 74 61 74 69 63 20 73 71 6c 69 74 65 33 5f 73 74  tatic sqlite3_st
199c0 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20  mt *pStmt = 0;. 
199d0 20 63 68 61 72 20 2a 7a 52 65 74 3b 0a 20 20 69   char *zRet;.  i
199e0 66 28 20 73 74 61 74 65 3d 3d 30 20 29 7b 0a 20  f( state==0 ){. 
199f0 20 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20     char *zSql;. 
19a00 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c     sqlite3_final
19a10 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20  ize(pStmt);.    
19a20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d  zSql = sqlite3_m
19a30 70 72 69 6e 74 66 28 22 53 45 4c 45 43 54 20 44  printf("SELECT D
19a40 49 53 54 49 4e 43 54 20 63 61 6e 64 69 64 61 74  ISTINCT candidat
19a50 65 20 43 4f 4c 4c 41 54 45 20 6e 6f 63 61 73 65  e COLLATE nocase
19a60 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ".              
19a70 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20 20               "  
19a80 46 52 4f 4d 20 63 6f 6d 70 6c 65 74 69 6f 6e 28  FROM completion(
19a90 25 51 29 20 4f 52 44 45 52 20 42 59 20 31 22 2c  %Q) ORDER BY 1",
19aa0 20 74 65 78 74 29 3b 0a 20 20 20 20 73 71 6c 69   text);.    sqli
19ab0 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 67  te3_prepare_v2(g
19ac0 6c 6f 62 61 6c 44 62 2c 20 7a 53 71 6c 2c 20 2d  lobalDb, zSql, -
19ad0 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20  1, &pStmt, 0);. 
19ae0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
19af0 7a 53 71 6c 29 3b 0a 20 20 7d 0a 20 20 69 66 28  zSql);.  }.  if(
19b00 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53   sqlite3_step(pS
19b10 74 6d 74 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57  tmt)==SQLITE_ROW
19b20 20 29 7b 0a 20 20 20 20 7a 52 65 74 20 3d 20 73   ){.    zRet = s
19b30 74 72 64 75 70 28 28 63 6f 6e 73 74 20 63 68 61  trdup((const cha
19b40 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  r*)sqlite3_colum
19b50 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 30 29  n_text(pStmt, 0)
19b60 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
19b70 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
19b80 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 70 53 74  (pStmt);.    pSt
19b90 6d 74 20 3d 20 30 3b 0a 20 20 20 20 7a 52 65 74  mt = 0;.    zRet
19ba0 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 0;.  }.  retu
19bb0 72 6e 20 7a 52 65 74 3b 0a 7d 0a 73 74 61 74 69  rn zRet;.}.stati
19bc0 63 20 63 68 61 72 20 2a 2a 72 65 61 64 6c 69 6e  c char **readlin
19bd0 65 5f 63 6f 6d 70 6c 65 74 69 6f 6e 28 63 6f 6e  e_completion(con
19be0 73 74 20 63 68 61 72 20 2a 7a 54 65 78 74 2c 20  st char *zText, 
19bf0 69 6e 74 20 69 53 74 61 72 74 2c 20 69 6e 74 20  int iStart, int 
19c00 69 45 6e 64 29 7b 0a 20 20 72 6c 5f 61 74 74 65  iEnd){.  rl_atte
19c10 6d 70 74 65 64 5f 63 6f 6d 70 6c 65 74 69 6f 6e  mpted_completion
19c20 5f 6f 76 65 72 20 3d 20 31 3b 0a 20 20 72 65 74  _over = 1;.  ret
19c30 75 72 6e 20 72 6c 5f 63 6f 6d 70 6c 65 74 69 6f  urn rl_completio
19c40 6e 5f 6d 61 74 63 68 65 73 28 7a 54 65 78 74 2c  n_matches(zText,
19c50 20 72 65 61 64 6c 69 6e 65 5f 63 6f 6d 70 6c 65   readline_comple
19c60 74 69 6f 6e 5f 67 65 6e 65 72 61 74 6f 72 29 3b  tion_generator);
19c70 0a 7d 0a 0a 23 65 6c 69 66 20 48 41 56 45 5f 4c  .}..#elif HAVE_L
19c80 49 4e 45 4e 4f 49 53 45 0a 2f 2a 0a 2a 2a 20 4c  INENOISE./*.** L
19c90 69 6e 65 6e 6f 69 73 65 20 63 6f 6d 70 6c 65 74  inenoise complet
19ca0 69 6f 6e 20 63 61 6c 6c 62 61 63 6b 0a 2a 2f 0a  ion callback.*/.
19cb0 73 74 61 74 69 63 20 76 6f 69 64 20 6c 69 6e 65  static void line
19cc0 6e 6f 69 73 65 5f 63 6f 6d 70 6c 65 74 69 6f 6e  noise_completion
19cd0 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4c 69  (const char *zLi
19ce0 6e 65 2c 20 6c 69 6e 65 6e 6f 69 73 65 43 6f 6d  ne, linenoiseCom
19cf0 70 6c 65 74 69 6f 6e 73 20 2a 6c 63 29 7b 0a 20  pletions *lc){. 
19d00 20 69 6e 74 20 6e 4c 69 6e 65 20 3d 20 73 74 72   int nLine = str
19d10 6c 65 6e 33 30 28 7a 4c 69 6e 65 29 3b 0a 20 20  len30(zLine);.  
19d20 69 6e 74 20 69 2c 20 69 53 74 61 72 74 3b 0a 20  int i, iStart;. 
19d30 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
19d40 53 74 6d 74 20 3d 20 30 3b 0a 20 20 63 68 61 72  Stmt = 0;.  char
19d50 20 2a 7a 53 71 6c 3b 0a 20 20 63 68 61 72 20 7a   *zSql;.  char z
19d60 42 75 66 5b 31 30 30 30 5d 3b 0a 0a 20 20 69 66  Buf[1000];..  if
19d70 28 20 6e 4c 69 6e 65 3e 73 69 7a 65 6f 66 28 7a  ( nLine>sizeof(z
19d80 42 75 66 29 2d 33 30 20 29 20 72 65 74 75 72 6e  Buf)-30 ) return
19d90 3b 0a 20 20 69 66 28 20 7a 4c 69 6e 65 5b 30 5d  ;.  if( zLine[0]
19da0 3d 3d 27 2e 27 20 29 20 72 65 74 75 72 6e 3b 0a  =='.' ) return;.
19db0 20 20 66 6f 72 28 69 3d 6e 4c 69 6e 65 2d 31 3b    for(i=nLine-1;
19dc0 20 69 3e 3d 30 20 26 26 20 28 69 73 61 6c 6e 75   i>=0 && (isalnu
19dd0 6d 28 7a 4c 69 6e 65 5b 69 5d 29 20 7c 7c 20 7a  m(zLine[i]) || z
19de0 4c 69 6e 65 5b 69 5d 3d 3d 27 5f 27 29 3b 20 69  Line[i]=='_'); i
19df0 2d 2d 29 7b 7d 0a 20 20 69 66 28 20 69 3d 3d 6e  --){}.  if( i==n
19e00 4c 69 6e 65 2d 31 20 29 20 72 65 74 75 72 6e 3b  Line-1 ) return;
19e10 0a 20 20 69 53 74 61 72 74 20 3d 20 69 2b 31 3b  .  iStart = i+1;
19e20 0a 20 20 6d 65 6d 63 70 79 28 7a 42 75 66 2c 20  .  memcpy(zBuf, 
19e30 7a 4c 69 6e 65 2c 20 69 53 74 61 72 74 29 3b 0a  zLine, iStart);.
19e40 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33    zSql = sqlite3
19e50 5f 6d 70 72 69 6e 74 66 28 22 53 45 4c 45 43 54  _mprintf("SELECT
19e60 20 44 49 53 54 49 4e 43 54 20 63 61 6e 64 69 64   DISTINCT candid
19e70 61 74 65 20 43 4f 4c 4c 41 54 45 20 6e 6f 63 61  ate COLLATE noca
19e80 73 65 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  se".            
19e90 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20 20               "  
19ea0 46 52 4f 4d 20 63 6f 6d 70 6c 65 74 69 6f 6e 28  FROM completion(
19eb0 25 51 2c 25 51 29 20 4f 52 44 45 52 20 42 59 20  %Q,%Q) ORDER BY 
19ec0 31 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  1",.            
19ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 26 7a 4c               &zL
19ee0 69 6e 65 5b 69 53 74 61 72 74 5d 2c 20 7a 4c 69  ine[iStart], zLi
19ef0 6e 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 70  ne);.  sqlite3_p
19f00 72 65 70 61 72 65 5f 76 32 28 67 6c 6f 62 61 6c  repare_v2(global
19f10 44 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70  Db, zSql, -1, &p
19f20 53 74 6d 74 2c 20 30 29 3b 0a 20 20 73 71 6c 69  Stmt, 0);.  sqli
19f30 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a  te3_free(zSql);.
19f40 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 67    sqlite3_exec(g
19f50 6c 6f 62 61 6c 44 62 2c 20 22 50 52 41 47 4d 41  lobalDb, "PRAGMA
19f60 20 70 61 67 65 5f 63 6f 75 6e 74 22 2c 20 30 2c   page_count", 0,
19f70 20 30 2c 20 30 29 3b 20 2f 2a 20 4c 6f 61 64 20   0, 0); /* Load 
19f80 74 68 65 20 73 63 68 65 6d 61 20 2a 2f 0a 20 20  the schema */.  
19f90 77 68 69 6c 65 28 20 73 71 6c 69 74 65 33 5f 73  while( sqlite3_s
19fa0 74 65 70 28 70 53 74 6d 74 29 3d 3d 53 51 4c 49  tep(pStmt)==SQLI
19fb0 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 63 6f  TE_ROW ){.    co
19fc0 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6d 70 6c  nst char *zCompl
19fd0 65 74 69 6f 6e 20 3d 20 28 63 6f 6e 73 74 20 63  etion = (const c
19fe0 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c  har*)sqlite3_col
19ff0 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 20  umn_text(pStmt, 
1a000 30 29 3b 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6d  0);.    int nCom
1a010 70 6c 65 74 69 6f 6e 20 3d 20 73 71 6c 69 74 65  pletion = sqlite
1a020 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 28 70  3_column_bytes(p
1a030 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 69 66  Stmt, 0);.    if
1a040 28 20 69 53 74 61 72 74 2b 6e 43 6f 6d 70 6c 65  ( iStart+nComple
1a050 74 69 6f 6e 20 3c 20 73 69 7a 65 6f 66 28 7a 42  tion < sizeof(zB
1a060 75 66 29 2d 31 20 29 7b 0a 20 20 20 20 20 20 6d  uf)-1 ){.      m
1a070 65 6d 63 70 79 28 7a 42 75 66 2b 69 53 74 61 72  emcpy(zBuf+iStar
1a080 74 2c 20 7a 43 6f 6d 70 6c 65 74 69 6f 6e 2c 20  t, zCompletion, 
1a090 6e 43 6f 6d 70 6c 65 74 69 6f 6e 2b 31 29 3b 0a  nCompletion+1);.
1a0a0 20 20 20 20 20 20 6c 69 6e 65 6e 6f 69 73 65 41        linenoiseA
1a0b0 64 64 43 6f 6d 70 6c 65 74 69 6f 6e 28 6c 63 2c  ddCompletion(lc,
1a0c0 20 7a 42 75 66 29 3b 0a 20 20 20 20 7d 0a 20 20   zBuf);.    }.  
1a0d0 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61  }.  sqlite3_fina
1a0e0 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 7d 0a 23  lize(pStmt);.}.#
1a0f0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20  endif../*.** Do 
1a100 43 2d 6c 61 6e 67 75 61 67 65 20 73 74 79 6c 65  C-language style
1a110 20 64 65 71 75 6f 74 69 6e 67 2e 0a 2a 2a 0a 2a   dequoting..**.*
1a120 2a 20 20 20 20 5c 61 20 20 20 20 2d 3e 20 61 6c  *    \a    -> al
1a130 61 72 6d 0a 2a 2a 20 20 20 20 5c 62 20 20 20 20  arm.**    \b    
1a140 2d 3e 20 62 61 63 6b 73 70 61 63 65 0a 2a 2a 20  -> backspace.** 
1a150 20 20 20 5c 74 20 20 20 20 2d 3e 20 74 61 62 0a     \t    -> tab.
1a160 2a 2a 20 20 20 20 5c 6e 20 20 20 20 2d 3e 20 6e  **    \n    -> n
1a170 65 77 6c 69 6e 65 0a 2a 2a 20 20 20 20 5c 76 20  ewline.**    \v 
1a180 20 20 20 2d 3e 20 76 65 72 74 69 63 61 6c 20 74     -> vertical t
1a190 61 62 0a 2a 2a 20 20 20 20 5c 66 20 20 20 20 2d  ab.**    \f    -
1a1a0 3e 20 66 6f 72 6d 20 66 65 65 64 0a 2a 2a 20 20  > form feed.**  
1a1b0 20 20 5c 72 20 20 20 20 2d 3e 20 63 61 72 72 69    \r    -> carri
1a1c0 61 67 65 20 72 65 74 75 72 6e 0a 2a 2a 20 20 20  age return.**   
1a1d0 20 5c 73 20 20 20 20 2d 3e 20 73 70 61 63 65 0a   \s    -> space.
1a1e0 2a 2a 20 20 20 20 5c 22 20 20 20 20 2d 3e 20 22  **    \"    -> "
1a1f0 0a 2a 2a 20 20 20 20 5c 27 20 20 20 20 2d 3e 20  .**    \'    -> 
1a200 27 0a 2a 2a 20 20 20 20 5c 5c 20 20 20 20 2d 3e  '.**    \\    ->
1a210 20 62 61 63 6b 73 6c 61 73 68 0a 2a 2a 20 20 20   backslash.**   
1a220 20 5c 4e 4e 4e 20 20 2d 3e 20 61 73 63 69 69 20   \NNN  -> ascii 
1a230 63 68 61 72 61 63 74 65 72 20 4e 4e 4e 20 69 6e  character NNN in
1a240 20 6f 63 74 61 6c 0a 2a 2f 0a 73 74 61 74 69 63   octal.*/.static
1a250 20 76 6f 69 64 20 72 65 73 6f 6c 76 65 5f 62 61   void resolve_ba
1a260 63 6b 73 6c 61 73 68 65 73 28 63 68 61 72 20 2a  ckslashes(char *
1a270 7a 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a  z){.  int i, j;.
1a280 20 20 63 68 61 72 20 63 3b 0a 20 20 77 68 69 6c    char c;.  whil
1a290 65 28 20 2a 7a 20 26 26 20 2a 7a 21 3d 27 5c 5c  e( *z && *z!='\\
1a2a0 27 20 29 20 7a 2b 2b 3b 0a 20 20 66 6f 72 28 69  ' ) z++;.  for(i
1a2b0 3d 6a 3d 30 3b 20 28 63 20 3d 20 7a 5b 69 5d 29  =j=0; (c = z[i])
1a2c0 21 3d 30 3b 20 69 2b 2b 2c 20 6a 2b 2b 29 7b 0a  !=0; i++, j++){.
1a2d0 20 20 20 20 69 66 28 20 63 3d 3d 27 5c 5c 27 20      if( c=='\\' 
1a2e0 26 26 20 7a 5b 69 2b 31 5d 21 3d 30 20 29 7b 0a  && z[i+1]!=0 ){.
1a2f0 20 20 20 20 20 20 63 20 3d 20 7a 5b 2b 2b 69 5d        c = z[++i]
1a300 3b 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27  ;.      if( c=='
1a310 61 27 20 29 7b 0a 20 20 20 20 20 20 20 20 63 20  a' ){.        c 
1a320 3d 20 27 5c 61 27 3b 0a 20 20 20 20 20 20 7d 65  = '\a';.      }e
1a330 6c 73 65 20 69 66 28 20 63 3d 3d 27 62 27 20 29  lse if( c=='b' )
1a340 7b 0a 20 20 20 20 20 20 20 20 63 20 3d 20 27 5c  {.        c = '\
1a350 62 27 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  b';.      }else 
1a360 69 66 28 20 63 3d 3d 27 74 27 20 29 7b 0a 20 20  if( c=='t' ){.  
1a370 20 20 20 20 20 20 63 20 3d 20 27 5c 74 27 3b 0a        c = '\t';.
1a380 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
1a390 63 3d 3d 27 6e 27 20 29 7b 0a 20 20 20 20 20 20  c=='n' ){.      
1a3a0 20 20 63 20 3d 20 27 5c 6e 27 3b 0a 20 20 20 20    c = '\n';.    
1a3b0 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27    }else if( c=='
1a3c0 76 27 20 29 7b 0a 20 20 20 20 20 20 20 20 63 20  v' ){.        c 
1a3d0 3d 20 27 5c 76 27 3b 0a 20 20 20 20 20 20 7d 65  = '\v';.      }e
1a3e0 6c 73 65 20 69 66 28 20 63 3d 3d 27 66 27 20 29  lse if( c=='f' )
1a3f0 7b 0a 20 20 20 20 20 20 20 20 63 20 3d 20 27 5c  {.        c = '\
1a400 66 27 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  f';.      }else 
1a410 69 66 28 20 63 3d 3d 27 72 27 20 29 7b 0a 20 20  if( c=='r' ){.  
1a420 20 20 20 20 20 20 63 20 3d 20 27 5c 72 27 3b 0a        c = '\r';.
1a430 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
1a440 63 3d 3d 27 22 27 20 29 7b 0a 20 20 20 20 20 20  c=='"' ){.      
1a450 20 20 63 20 3d 20 27 22 27 3b 0a 20 20 20 20 20    c = '"';.     
1a460 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 5c   }else if( c=='\
1a470 27 27 20 29 7b 0a 20 20 20 20 20 20 20 20 63 20  '' ){.        c 
1a480 3d 20 27 5c 27 27 3b 0a 20 20 20 20 20 20 7d 65  = '\'';.      }e
1a490 6c 73 65 20 69 66 28 20 63 3d 3d 27 5c 5c 27 20  lse if( c=='\\' 
1a4a0 29 7b 0a 20 20 20 20 20 20 20 20 63 20 3d 20 27  ){.        c = '
1a4b0 5c 5c 27 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  \\';.      }else
1a4c0 20 69 66 28 20 63 3e 3d 27 30 27 20 26 26 20 63   if( c>='0' && c
1a4d0 3c 3d 27 37 27 20 29 7b 0a 20 20 20 20 20 20 20  <='7' ){.       
1a4e0 20 63 20 2d 3d 20 27 30 27 3b 0a 20 20 20 20 20   c -= '0';.     
1a4f0 20 20 20 69 66 28 20 7a 5b 69 2b 31 5d 3e 3d 27     if( z[i+1]>='
1a500 30 27 20 26 26 20 7a 5b 69 2b 31 5d 3c 3d 27 37  0' && z[i+1]<='7
1a510 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  ' ){.          i
1a520 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 63 20  ++;.          c 
1a530 3d 20 28 63 3c 3c 33 29 20 2b 20 7a 5b 69 5d 20  = (c<<3) + z[i] 
1a540 2d 20 27 30 27 3b 0a 20 20 20 20 20 20 20 20 20  - '0';.         
1a550 20 69 66 28 20 7a 5b 69 2b 31 5d 3e 3d 27 30 27   if( z[i+1]>='0'
1a560 20 26 26 20 7a 5b 69 2b 31 5d 3c 3d 27 37 27 20   && z[i+1]<='7' 
1a570 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
1a580 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ++;.            
1a590 63 20 3d 20 28 63 3c 3c 33 29 20 2b 20 7a 5b 69  c = (c<<3) + z[i
1a5a0 5d 20 2d 20 27 30 27 3b 0a 20 20 20 20 20 20 20  ] - '0';.       
1a5b0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
1a5c0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
1a5d0 20 7a 5b 6a 5d 20 3d 20 63 3b 0a 20 20 7d 0a 20   z[j] = c;.  }. 
1a5e0 20 69 66 28 20 6a 3c 69 20 29 20 7a 5b 6a 5d 20   if( j<i ) z[j] 
1a5f0 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  = 0;.}../*.** In
1a600 74 65 72 70 72 65 74 20 7a 41 72 67 20 61 73 20  terpret zArg as 
1a610 65 69 74 68 65 72 20 61 6e 20 69 6e 74 65 67 65  either an intege
1a620 72 20 6f 72 20 61 20 62 6f 6f 6c 65 61 6e 20 76  r or a boolean v
1a630 61 6c 75 65 2e 20 20 52 65 74 75 72 6e 20 31 20  alue.  Return 1 
1a640 6f 72 20 30 0a 2a 2a 20 66 6f 72 20 54 52 55 45  or 0.** for TRUE
1a650 20 61 6e 64 20 46 41 4c 53 45 2e 20 20 52 65 74   and FALSE.  Ret
1a660 75 72 6e 20 74 68 65 20 69 6e 74 65 67 65 72 20  urn the integer 
1a670 76 61 6c 75 65 20 69 66 20 61 70 70 72 6f 70 72  value if appropr
1a680 69 61 74 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  iate..*/.static 
1a690 69 6e 74 20 62 6f 6f 6c 65 61 6e 56 61 6c 75 65  int booleanValue
1a6a0 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 72  (const char *zAr
1a6b0 67 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  g){.  int i;.  i
1a6c0 66 28 20 7a 41 72 67 5b 30 5d 3d 3d 27 30 27 20  f( zArg[0]=='0' 
1a6d0 26 26 20 7a 41 72 67 5b 31 5d 3d 3d 27 78 27 20  && zArg[1]=='x' 
1a6e0 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 32 3b 20  ){.    for(i=2; 
1a6f0 68 65 78 44 69 67 69 74 56 61 6c 75 65 28 7a 41  hexDigitValue(zA
1a700 72 67 5b 69 5d 29 3e 3d 30 3b 20 69 2b 2b 29 7b  rg[i])>=0; i++){
1a710 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66  }.  }else{.    f
1a720 6f 72 28 69 3d 30 3b 20 7a 41 72 67 5b 69 5d 3e  or(i=0; zArg[i]>
1a730 3d 27 30 27 20 26 26 20 7a 41 72 67 5b 69 5d 3c  ='0' && zArg[i]<
1a740 3d 27 39 27 3b 20 69 2b 2b 29 7b 7d 0a 20 20 7d  ='9'; i++){}.  }
1a750 0a 20 20 69 66 28 20 69 3e 30 20 26 26 20 7a 41  .  if( i>0 && zA
1a760 72 67 5b 69 5d 3d 3d 30 20 29 20 72 65 74 75 72  rg[i]==0 ) retur
1a770 6e 20 28 69 6e 74 29 28 69 6e 74 65 67 65 72 56  n (int)(integerV
1a780 61 6c 75 65 28 7a 41 72 67 29 20 26 20 30 78 66  alue(zArg) & 0xf
1a790 66 66 66 66 66 66 66 29 3b 0a 20 20 69 66 28 20  fffffff);.  if( 
1a7a0 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28  sqlite3_stricmp(
1a7b0 7a 41 72 67 2c 20 22 6f 6e 22 29 3d 3d 30 20 7c  zArg, "on")==0 |
1a7c0 7c 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d  | sqlite3_stricm
1a7d0 70 28 7a 41 72 67 2c 22 79 65 73 22 29 3d 3d 30  p(zArg,"yes")==0
1a7e0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31   ){.    return 1
1a7f0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69  ;.  }.  if( sqli
1a800 74 65 33 5f 73 74 72 69 63 6d 70 28 7a 41 72 67  te3_stricmp(zArg
1a810 2c 20 22 6f 66 66 22 29 3d 3d 30 20 7c 7c 20 73  , "off")==0 || s
1a820 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28 7a  qlite3_stricmp(z
1a830 41 72 67 2c 22 6e 6f 22 29 3d 3d 30 20 29 7b 0a  Arg,"no")==0 ){.
1a840 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
1a850 7d 0a 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28  }.  utf8_printf(
1a860 73 74 64 65 72 72 2c 20 22 45 52 52 4f 52 3a 20  stderr, "ERROR: 
1a870 4e 6f 74 20 61 20 62 6f 6f 6c 65 61 6e 20 76 61  Not a boolean va
1a880 6c 75 65 3a 20 5c 22 25 73 5c 22 2e 20 41 73 73  lue: \"%s\". Ass
1a890 75 6d 69 6e 67 20 5c 22 6e 6f 5c 22 2e 5c 6e 22  uming \"no\".\n"
1a8a0 2c 0a 20 20 20 20 20 20 20 20 20 20 7a 41 72 67  ,.          zArg
1a8b0 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  );.  return 0;.}
1a8c0 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 6f 72 20 63  ../*.** Set or c
1a8d0 6c 65 61 72 20 61 20 73 68 65 6c 6c 20 66 6c 61  lear a shell fla
1a8e0 67 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 61  g according to a
1a8f0 20 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65 2e 0a   boolean value..
1a900 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
1a910 65 74 4f 72 43 6c 65 61 72 46 6c 61 67 28 53 68  etOrClearFlag(Sh
1a920 65 6c 6c 53 74 61 74 65 20 2a 70 2c 20 75 6e 73  ellState *p, uns
1a930 69 67 6e 65 64 20 6d 46 6c 61 67 2c 20 63 6f 6e  igned mFlag, con
1a940 73 74 20 63 68 61 72 20 2a 7a 41 72 67 29 7b 0a  st char *zArg){.
1a950 20 20 69 66 28 20 62 6f 6f 6c 65 61 6e 56 61 6c    if( booleanVal
1a960 75 65 28 7a 41 72 67 29 20 29 7b 0a 20 20 20 20  ue(zArg) ){.    
1a970 53 68 65 6c 6c 53 65 74 46 6c 61 67 28 70 2c 20  ShellSetFlag(p, 
1a980 6d 46 6c 61 67 29 3b 0a 20 20 7d 65 6c 73 65 7b  mFlag);.  }else{
1a990 0a 20 20 20 20 53 68 65 6c 6c 43 6c 65 61 72 46  .    ShellClearF
1a9a0 6c 61 67 28 70 2c 20 6d 46 6c 61 67 29 3b 0a 20  lag(p, mFlag);. 
1a9b0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73   }.}../*.** Clos
1a9c0 65 20 61 6e 20 6f 75 74 70 75 74 20 66 69 6c 65  e an output file
1a9d0 2c 20 61 73 73 75 6d 69 6e 67 20 69 74 20 69 73  , assuming it is
1a9e0 20 6e 6f 74 20 73 74 64 65 72 72 20 6f 72 20 73   not stderr or s
1a9f0 74 64 6f 75 74 0a 2a 2f 0a 73 74 61 74 69 63 20  tdout.*/.static 
1aa00 76 6f 69 64 20 6f 75 74 70 75 74 5f 66 69 6c 65  void output_file
1aa10 5f 63 6c 6f 73 65 28 46 49 4c 45 20 2a 66 29 7b  _close(FILE *f){
1aa20 0a 20 20 69 66 28 20 66 20 26 26 20 66 21 3d 73  .  if( f && f!=s
1aa30 74 64 6f 75 74 20 26 26 20 66 21 3d 73 74 64 65  tdout && f!=stde
1aa40 72 72 20 29 20 66 63 6c 6f 73 65 28 66 29 3b 0a  rr ) fclose(f);.
1aa50 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20  }../*.** Try to 
1aa60 6f 70 65 6e 20 61 6e 20 6f 75 74 70 75 74 20 66  open an output f
1aa70 69 6c 65 2e 20 20 20 54 68 65 20 6e 61 6d 65 73  ile.   The names
1aa80 20 22 73 74 64 6f 75 74 22 20 61 6e 64 20 22 73   "stdout" and "s
1aa90 74 64 65 72 72 22 20 61 72 65 0a 2a 2a 20 72 65  tderr" are.** re
1aaa0 63 6f 67 6e 69 7a 65 64 20 61 6e 64 20 64 6f 20  cognized and do 
1aab0 74 68 65 20 72 69 67 68 74 20 74 68 69 6e 67 2e  the right thing.
1aac0 20 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e    NULL is return
1aad0 65 64 20 69 66 20 74 68 65 20 6f 75 74 70 75 74  ed if the output
1aae0 0a 2a 2a 20 66 69 6c 65 6e 61 6d 65 20 69 73 20  .** filename is 
1aaf0 22 6f 66 66 22 2e 0a 2a 2f 0a 73 74 61 74 69 63  "off"..*/.static
1ab00 20 46 49 4c 45 20 2a 6f 75 74 70 75 74 5f 66 69   FILE *output_fi
1ab10 6c 65 5f 6f 70 65 6e 28 63 6f 6e 73 74 20 63 68  le_open(const ch
1ab20 61 72 20 2a 7a 46 69 6c 65 29 7b 0a 20 20 46 49  ar *zFile){.  FI
1ab30 4c 45 20 2a 66 3b 0a 20 20 69 66 28 20 73 74 72  LE *f;.  if( str
1ab40 63 6d 70 28 7a 46 69 6c 65 2c 22 73 74 64 6f 75  cmp(zFile,"stdou
1ab50 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 66 20  t")==0 ){.    f 
1ab60 3d 20 73 74 64 6f 75 74 3b 0a 20 20 7d 65 6c 73  = stdout;.  }els
1ab70 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 46 69  e if( strcmp(zFi
1ab80 6c 65 2c 20 22 73 74 64 65 72 72 22 29 3d 3d 30  le, "stderr")==0
1ab90 20 29 7b 0a 20 20 20 20 66 20 3d 20 73 74 64 65   ){.    f = stde
1aba0 72 72 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  rr;.  }else if( 
1abb0 73 74 72 63 6d 70 28 7a 46 69 6c 65 2c 20 22 6f  strcmp(zFile, "o
1abc0 66 66 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 66  ff")==0 ){.    f
1abd0 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
1abe0 20 20 20 66 20 3d 20 66 6f 70 65 6e 28 7a 46 69     f = fopen(zFi
1abf0 6c 65 2c 20 22 77 62 22 29 3b 0a 20 20 20 20 69  le, "wb");.    i
1ac00 66 28 20 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20  f( f==0 ){.     
1ac10 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64   utf8_printf(std
1ac20 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 63 61 6e  err, "Error: can
1ac30 6e 6f 74 20 6f 70 65 6e 20 5c 22 25 73 5c 22 5c  not open \"%s\"\
1ac40 6e 22 2c 20 7a 46 69 6c 65 29 3b 0a 20 20 20 20  n", zFile);.    
1ac50 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 66  }.  }.  return f
1ac60 3b 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65  ;.}..#if !define
1ac70 64 28 53 51 4c 49 54 45 5f 55 4e 54 45 53 54 41  d(SQLITE_UNTESTA
1ac80 42 4c 45 29 0a 23 69 66 20 21 64 65 66 69 6e 65  BLE).#if !define
1ac90 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52  d(SQLITE_OMIT_TR
1aca0 41 43 45 29 20 26 26 20 21 64 65 66 69 6e 65 64  ACE) && !defined
1acb0 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f  (SQLITE_OMIT_FLO
1acc0 41 54 49 4e 47 5f 50 4f 49 4e 54 29 0a 2f 2a 0a  ATING_POINT)./*.
1acd0 2a 2a 20 41 20 72 6f 75 74 69 6e 65 20 66 6f 72  ** A routine for
1ace0 20 68 61 6e 64 6c 69 6e 67 20 6f 75 74 70 75 74   handling output
1acf0 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 74 72   from sqlite3_tr
1ad00 61 63 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  ace()..*/.static
1ad10 20 69 6e 74 20 73 71 6c 5f 74 72 61 63 65 5f 63   int sql_trace_c
1ad20 61 6c 6c 62 61 63 6b 28 0a 20 20 75 6e 73 69 67  allback(.  unsig
1ad30 6e 65 64 20 6d 54 79 70 65 2c 0a 20 20 76 6f 69  ned mType,.  voi
1ad40 64 20 2a 70 41 72 67 2c 0a 20 20 76 6f 69 64 20  d *pArg,.  void 
1ad50 2a 70 50 2c 0a 20 20 76 6f 69 64 20 2a 70 58 0a  *pP,.  void *pX.
1ad60 29 7b 0a 20 20 46 49 4c 45 20 2a 66 20 3d 20 28  ){.  FILE *f = (
1ad70 46 49 4c 45 2a 29 70 41 72 67 3b 0a 20 20 55 4e  FILE*)pArg;.  UN
1ad80 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 6d  USED_PARAMETER(m
1ad90 54 79 70 65 29 3b 0a 20 20 55 4e 55 53 45 44 5f  Type);.  UNUSED_
1ada0 50 41 52 41 4d 45 54 45 52 28 70 50 29 3b 0a 20  PARAMETER(pP);. 
1adb0 20 69 66 28 20 66 20 29 7b 0a 20 20 20 20 63 6f   if( f ){.    co
1adc0 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 28 63  nst char *z = (c
1add0 6f 6e 73 74 20 63 68 61 72 2a 29 70 58 3b 0a 20  onst char*)pX;. 
1ade0 20 20 20 69 6e 74 20 69 20 3d 20 73 74 72 6c 65     int i = strle
1adf0 6e 33 30 28 7a 29 3b 0a 20 20 20 20 77 68 69 6c  n30(z);.    whil
1ae00 65 28 20 69 3e 30 20 26 26 20 7a 5b 69 2d 31 5d  e( i>0 && z[i-1]
1ae10 3d 3d 27 3b 27 20 29 7b 20 69 2d 2d 3b 20 7d 0a  ==';' ){ i--; }.
1ae20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
1ae30 66 2c 20 22 25 2e 2a 73 3b 5c 6e 22 2c 20 69 2c  f, "%.*s;\n", i,
1ae40 20 7a 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72   z);.  }.  retur
1ae50 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 23 65  n 0;.}.#endif.#e
1ae60 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 20 6e 6f  ndif../*.** A no
1ae70 2d 6f 70 20 72 6f 75 74 69 6e 65 20 74 68 61 74  -op routine that
1ae80 20 72 75 6e 73 20 77 69 74 68 20 74 68 65 20 22   runs with the "
1ae90 2e 62 72 65 61 6b 70 6f 69 6e 74 22 20 64 6f 63  .breakpoint" doc
1aea0 2d 63 6f 6d 6d 61 6e 64 2e 20 20 54 68 69 73 20  -command.  This 
1aeb0 69 73 0a 2a 2a 20 61 20 75 73 65 66 75 6c 20 73  is.** a useful s
1aec0 70 6f 74 20 74 6f 20 73 65 74 20 61 20 64 65 62  pot to set a deb
1aed0 75 67 67 65 72 20 62 72 65 61 6b 70 6f 69 6e 74  ugger breakpoint
1aee0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1aef0 20 74 65 73 74 5f 62 72 65 61 6b 70 6f 69 6e 74   test_breakpoint
1af00 28 76 6f 69 64 29 7b 0a 20 20 73 74 61 74 69 63  (void){.  static
1af10 20 69 6e 74 20 6e 43 61 6c 6c 20 3d 20 30 3b 0a   int nCall = 0;.
1af20 20 20 6e 43 61 6c 6c 2b 2b 3b 0a 7d 0a 0a 2f 2a    nCall++;.}../*
1af30 0a 2a 2a 20 41 6e 20 6f 62 6a 65 63 74 20 75 73  .** An object us
1af40 65 64 20 74 6f 20 72 65 61 64 20 61 20 43 53 56  ed to read a CSV
1af50 20 61 6e 64 20 6f 74 68 65 72 20 66 69 6c 65 73   and other files
1af60 20 66 6f 72 20 69 6d 70 6f 72 74 2e 0a 2a 2f 0a   for import..*/.
1af70 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 49  typedef struct I
1af80 6d 70 6f 72 74 43 74 78 20 49 6d 70 6f 72 74 43  mportCtx ImportC
1af90 74 78 3b 0a 73 74 72 75 63 74 20 49 6d 70 6f 72  tx;.struct Impor
1afa0 74 43 74 78 20 7b 0a 20 20 63 6f 6e 73 74 20 63  tCtx {.  const c
1afb0 68 61 72 20 2a 7a 46 69 6c 65 3b 20 20 2f 2a 20  har *zFile;  /* 
1afc0 4e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e 70 75  Name of the inpu
1afd0 74 20 66 69 6c 65 20 2a 2f 0a 20 20 46 49 4c 45  t file */.  FILE
1afe0 20 2a 69 6e 3b 20 20 20 20 20 20 20 20 20 20 20   *in;           
1aff0 2f 2a 20 52 65 61 64 20 74 68 65 20 43 53 56 20  /* Read the CSV 
1b000 74 65 78 74 20 66 72 6f 6d 20 74 68 69 73 20 69  text from this i
1b010 6e 70 75 74 20 73 74 72 65 61 6d 20 2a 2f 0a 20  nput stream */. 
1b020 20 63 68 61 72 20 2a 7a 3b 20 20 20 20 20 20 20   char *z;       
1b030 20 20 20 20 20 2f 2a 20 41 63 63 75 6d 75 6c 61       /* Accumula
1b040 74 65 64 20 74 65 78 74 20 66 6f 72 20 61 20 66  ted text for a f
1b050 69 65 6c 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b  ield */.  int n;
1b060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1b070 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
1b080 20 69 6e 20 7a 20 2a 2f 0a 20 20 69 6e 74 20 6e   in z */.  int n
1b090 41 6c 6c 6f 63 3b 20 20 20 20 20 20 20 20 20 2f  Alloc;         /
1b0a0 2a 20 53 70 61 63 65 20 61 6c 6c 6f 63 61 74 65  * Space allocate
1b0b0 64 20 66 6f 72 20 7a 5b 5d 20 2a 2f 0a 20 20 69  d for z[] */.  i
1b0c0 6e 74 20 6e 4c 69 6e 65 3b 20 20 20 20 20 20 20  nt nLine;       
1b0d0 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 6c 69     /* Current li
1b0e0 6e 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69  ne number */.  i
1b0f0 6e 74 20 62 4e 6f 74 46 69 72 73 74 3b 20 20 20  nt bNotFirst;   
1b100 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6f 6e     /* True if on
1b110 65 20 6f 72 20 6d 6f 72 65 20 62 79 74 65 73 20  e or more bytes 
1b120 61 6c 72 65 61 64 79 20 72 65 61 64 20 2a 2f 0a  already read */.
1b130 20 20 69 6e 74 20 63 54 65 72 6d 3b 20 20 20 20    int cTerm;    
1b140 20 20 20 20 20 20 2f 2a 20 43 68 61 72 61 63 74        /* Charact
1b150 65 72 20 74 68 61 74 20 74 65 72 6d 69 6e 61 74  er that terminat
1b160 65 64 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  ed the most rece
1b170 6e 74 20 66 69 65 6c 64 20 2a 2f 0a 20 20 69 6e  nt field */.  in
1b180 74 20 63 43 6f 6c 53 65 70 3b 20 20 20 20 20 20  t cColSep;      
1b190 20 20 2f 2a 20 54 68 65 20 63 6f 6c 75 6d 6e 20    /* The column 
1b1a0 73 65 70 61 72 61 74 6f 72 20 63 68 61 72 61 63  separator charac
1b1b0 74 65 72 2e 20 20 28 55 73 75 61 6c 6c 79 20 22  ter.  (Usually "
1b1c0 2c 22 29 20 2a 2f 0a 20 20 69 6e 74 20 63 52 6f  ,") */.  int cRo
1b1d0 77 53 65 70 3b 20 20 20 20 20 20 20 20 2f 2a 20  wSep;        /* 
1b1e0 54 68 65 20 72 6f 77 20 73 65 70 61 72 61 74 6f  The row separato
1b1f0 72 20 63 68 61 72 61 63 74 65 72 2e 20 20 28 55  r character.  (U
1b200 73 75 61 6c 6c 79 20 22 5c 6e 22 29 20 2a 2f 0a  sually "\n") */.
1b210 7d 3b 0a 0a 2f 2a 20 41 70 70 65 6e 64 20 61 20  };../* Append a 
1b220 73 69 6e 67 6c 65 20 62 79 74 65 20 74 6f 20 7a  single byte to z
1b230 5b 5d 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  [] */.static voi
1b240 64 20 69 6d 70 6f 72 74 5f 61 70 70 65 6e 64 5f  d import_append_
1b250 63 68 61 72 28 49 6d 70 6f 72 74 43 74 78 20 2a  char(ImportCtx *
1b260 70 2c 20 69 6e 74 20 63 29 7b 0a 20 20 69 66 28  p, int c){.  if(
1b270 20 70 2d 3e 6e 2b 31 3e 3d 70 2d 3e 6e 41 6c 6c   p->n+1>=p->nAll
1b280 6f 63 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 41 6c  oc ){.    p->nAl
1b290 6c 6f 63 20 2b 3d 20 70 2d 3e 6e 41 6c 6c 6f 63  loc += p->nAlloc
1b2a0 20 2b 20 31 30 30 3b 0a 20 20 20 20 70 2d 3e 7a   + 100;.    p->z
1b2b0 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c   = sqlite3_reall
1b2c0 6f 63 36 34 28 70 2d 3e 7a 2c 20 70 2d 3e 6e 41  oc64(p->z, p->nA
1b2d0 6c 6c 6f 63 29 3b 0a 20 20 20 20 69 66 28 20 70  lloc);.    if( p
1b2e0 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ->z==0 ){.      
1b2f0 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72  raw_printf(stder
1b300 72 2c 20 22 6f 75 74 20 6f 66 20 6d 65 6d 6f 72  r, "out of memor
1b310 79 5c 6e 22 29 3b 0a 20 20 20 20 20 20 65 78 69  y\n");.      exi
1b320 74 28 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  t(1);.    }.  }.
1b330 20 20 70 2d 3e 7a 5b 70 2d 3e 6e 2b 2b 5d 20 3d    p->z[p->n++] =
1b340 20 28 63 68 61 72 29 63 3b 0a 7d 0a 0a 2f 2a 20   (char)c;.}../* 
1b350 52 65 61 64 20 61 20 73 69 6e 67 6c 65 20 66 69  Read a single fi
1b360 65 6c 64 20 6f 66 20 43 53 56 20 74 65 78 74 2e  eld of CSV text.
1b370 20 20 43 6f 6d 70 61 74 69 62 6c 65 20 77 69 74    Compatible wit
1b380 68 20 72 66 63 34 31 38 30 20 61 6e 64 20 65 78  h rfc4180 and ex
1b390 74 65 6e 64 65 64 0a 2a 2a 20 77 69 74 68 20 74  tended.** with t
1b3a0 68 65 20 6f 70 74 69 6f 6e 20 6f 66 20 68 61 76  he option of hav
1b3b0 69 6e 67 20 61 20 73 65 70 61 72 61 74 6f 72 20  ing a separator 
1b3c0 6f 74 68 65 72 20 74 68 61 6e 20 22 2c 22 2e 0a  other than ","..
1b3d0 2a 2a 0a 2a 2a 20 20 20 2b 20 20 49 6e 70 75 74  **.**   +  Input
1b3e0 20 63 6f 6d 65 73 20 66 72 6f 6d 20 70 2d 3e 69   comes from p->i
1b3f0 6e 2e 0a 2a 2a 20 20 20 2b 20 20 53 74 6f 72 65  n..**   +  Store
1b400 20 72 65 73 75 6c 74 73 20 69 6e 20 70 2d 3e 7a   results in p->z
1b410 20 6f 66 20 6c 65 6e 67 74 68 20 70 2d 3e 6e 2e   of length p->n.
1b420 20 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20    Space to hold 
1b430 70 2d 3e 7a 20 63 6f 6d 65 73 0a 2a 2a 20 20 20  p->z comes.**   
1b440 20 20 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f     from sqlite3_
1b450 6d 61 6c 6c 6f 63 36 34 28 29 2e 0a 2a 2a 20 20  malloc64()..**  
1b460 20 2b 20 20 55 73 65 20 70 2d 3e 63 53 65 70 20   +  Use p->cSep 
1b470 61 73 20 74 68 65 20 63 6f 6c 75 6d 6e 20 73 65  as the column se
1b480 70 61 72 61 74 6f 72 2e 20 20 54 68 65 20 64 65  parator.  The de
1b490 66 61 75 6c 74 20 69 73 20 22 2c 22 2e 0a 2a 2a  fault is ","..**
1b4a0 20 20 20 2b 20 20 55 73 65 20 70 2d 3e 72 53 65     +  Use p->rSe
1b4b0 70 20 61 73 20 74 68 65 20 72 6f 77 20 73 65 70  p as the row sep
1b4c0 61 72 61 74 6f 72 2e 20 20 54 68 65 20 64 65 66  arator.  The def
1b4d0 61 75 6c 74 20 69 73 20 22 5c 6e 22 2e 0a 2a 2a  ault is "\n"..**
1b4e0 20 20 20 2b 20 20 4b 65 65 70 20 74 72 61 63 6b     +  Keep track
1b4f0 20 6f 66 20 74 68 65 20 6c 69 6e 65 20 6e 75 6d   of the line num
1b500 62 65 72 20 69 6e 20 70 2d 3e 6e 4c 69 6e 65 2e  ber in p->nLine.
1b510 0a 2a 2a 20 20 20 2b 20 20 53 74 6f 72 65 20 74  .**   +  Store t
1b520 68 65 20 63 68 61 72 61 63 74 65 72 20 74 68 61  he character tha
1b530 74 20 74 65 72 6d 69 6e 61 74 65 73 20 74 68 65  t terminates the
1b540 20 66 69 65 6c 64 20 69 6e 20 70 2d 3e 63 54 65   field in p->cTe
1b550 72 6d 2e 20 20 53 74 6f 72 65 0a 2a 2a 20 20 20  rm.  Store.**   
1b560 20 20 20 45 4f 46 20 6f 6e 20 65 6e 64 2d 6f 66     EOF on end-of
1b570 2d 66 69 6c 65 2e 0a 2a 2a 20 20 20 2b 20 20 52  -file..**   +  R
1b580 65 70 6f 72 74 20 73 79 6e 74 61 78 20 65 72 72  eport syntax err
1b590 6f 72 73 20 6f 6e 20 73 74 64 65 72 72 0a 2a 2f  ors on stderr.*/
1b5a0 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 53 51  .static char *SQ
1b5b0 4c 49 54 45 5f 43 44 45 43 4c 20 63 73 76 5f 72  LITE_CDECL csv_r
1b5c0 65 61 64 5f 6f 6e 65 5f 66 69 65 6c 64 28 49 6d  ead_one_field(Im
1b5d0 70 6f 72 74 43 74 78 20 2a 70 29 7b 0a 20 20 69  portCtx *p){.  i
1b5e0 6e 74 20 63 3b 0a 20 20 69 6e 74 20 63 53 65 70  nt c;.  int cSep
1b5f0 20 3d 20 70 2d 3e 63 43 6f 6c 53 65 70 3b 0a 20   = p->cColSep;. 
1b600 20 69 6e 74 20 72 53 65 70 20 3d 20 70 2d 3e 63   int rSep = p->c
1b610 52 6f 77 53 65 70 3b 0a 20 20 70 2d 3e 6e 20 3d  RowSep;.  p->n =
1b620 20 30 3b 0a 20 20 63 20 3d 20 66 67 65 74 63 28   0;.  c = fgetc(
1b630 70 2d 3e 69 6e 29 3b 0a 20 20 69 66 28 20 63 3d  p->in);.  if( c=
1b640 3d 45 4f 46 20 7c 7c 20 73 65 65 6e 49 6e 74 65  =EOF || seenInte
1b650 72 72 75 70 74 20 29 7b 0a 20 20 20 20 70 2d 3e  rrupt ){.    p->
1b660 63 54 65 72 6d 20 3d 20 45 4f 46 3b 0a 20 20 20  cTerm = EOF;.   
1b670 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
1b680 20 69 66 28 20 63 3d 3d 27 22 27 20 29 7b 0a 20   if( c=='"' ){. 
1b690 20 20 20 69 6e 74 20 70 63 2c 20 70 70 63 3b 0a     int pc, ppc;.
1b6a0 20 20 20 20 69 6e 74 20 73 74 61 72 74 4c 69 6e      int startLin
1b6b0 65 20 3d 20 70 2d 3e 6e 4c 69 6e 65 3b 0a 20 20  e = p->nLine;.  
1b6c0 20 20 69 6e 74 20 63 51 75 6f 74 65 20 3d 20 63    int cQuote = c
1b6d0 3b 0a 20 20 20 20 70 63 20 3d 20 70 70 63 20 3d  ;.    pc = ppc =
1b6e0 20 30 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 31   0;.    while( 1
1b6f0 20 29 7b 0a 20 20 20 20 20 20 63 20 3d 20 66 67   ){.      c = fg
1b700 65 74 63 28 70 2d 3e 69 6e 29 3b 0a 20 20 20 20  etc(p->in);.    
1b710 20 20 69 66 28 20 63 3d 3d 72 53 65 70 20 29 20    if( c==rSep ) 
1b720 70 2d 3e 6e 4c 69 6e 65 2b 2b 3b 0a 20 20 20 20  p->nLine++;.    
1b730 20 20 69 66 28 20 63 3d 3d 63 51 75 6f 74 65 20    if( c==cQuote 
1b740 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
1b750 63 3d 3d 63 51 75 6f 74 65 20 29 7b 0a 20 20 20  c==cQuote ){.   
1b760 20 20 20 20 20 20 20 70 63 20 3d 20 30 3b 0a 20         pc = 0;. 
1b770 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
1b780 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  e;.        }.   
1b790 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 28     }.      if( (
1b7a0 63 3d 3d 63 53 65 70 20 26 26 20 70 63 3d 3d 63  c==cSep && pc==c
1b7b0 51 75 6f 74 65 29 0a 20 20 20 20 20 20 20 7c 7c  Quote).       ||
1b7c0 20 28 63 3d 3d 72 53 65 70 20 26 26 20 70 63 3d   (c==rSep && pc=
1b7d0 3d 63 51 75 6f 74 65 29 0a 20 20 20 20 20 20 20  =cQuote).       
1b7e0 7c 7c 20 28 63 3d 3d 72 53 65 70 20 26 26 20 70  || (c==rSep && p
1b7f0 63 3d 3d 27 5c 72 27 20 26 26 20 70 70 63 3d 3d  c=='\r' && ppc==
1b800 63 51 75 6f 74 65 29 0a 20 20 20 20 20 20 20 7c  cQuote).       |
1b810 7c 20 28 63 3d 3d 45 4f 46 20 26 26 20 70 63 3d  | (c==EOF && pc=
1b820 3d 63 51 75 6f 74 65 29 0a 20 20 20 20 20 20 29  =cQuote).      )
1b830 7b 0a 20 20 20 20 20 20 20 20 64 6f 7b 20 70 2d  {.        do{ p-
1b840 3e 6e 2d 2d 3b 20 7d 77 68 69 6c 65 28 20 70 2d  >n--; }while( p-
1b850 3e 7a 5b 70 2d 3e 6e 5d 21 3d 63 51 75 6f 74 65  >z[p->n]!=cQuote
1b860 20 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 63   );.        p->c
1b870 54 65 72 6d 20 3d 20 63 3b 0a 20 20 20 20 20 20  Term = c;.      
1b880 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
1b890 0a 20 20 20 20 20 20 69 66 28 20 70 63 3d 3d 63  .      if( pc==c
1b8a0 51 75 6f 74 65 20 26 26 20 63 21 3d 27 5c 72 27  Quote && c!='\r'
1b8b0 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38   ){.        utf8
1b8c0 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
1b8d0 22 25 73 3a 25 64 3a 20 75 6e 65 73 63 61 70 65  "%s:%d: unescape
1b8e0 64 20 25 63 20 63 68 61 72 61 63 74 65 72 5c 6e  d %c character\n
1b8f0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
1b900 20 20 20 70 2d 3e 7a 46 69 6c 65 2c 20 70 2d 3e     p->zFile, p->
1b910 6e 4c 69 6e 65 2c 20 63 51 75 6f 74 65 29 3b 0a  nLine, cQuote);.
1b920 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
1b930 28 20 63 3d 3d 45 4f 46 20 29 7b 0a 20 20 20 20  ( c==EOF ){.    
1b940 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
1b950 73 74 64 65 72 72 2c 20 22 25 73 3a 25 64 3a 20  stderr, "%s:%d: 
1b960 75 6e 74 65 72 6d 69 6e 61 74 65 64 20 25 63 2d  unterminated %c-
1b970 71 75 6f 74 65 64 20 66 69 65 6c 64 5c 6e 22 2c  quoted field\n",
1b980 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1b990 20 70 2d 3e 7a 46 69 6c 65 2c 20 73 74 61 72 74   p->zFile, start
1b9a0 4c 69 6e 65 2c 20 63 51 75 6f 74 65 29 3b 0a 20  Line, cQuote);. 
1b9b0 20 20 20 20 20 20 20 70 2d 3e 63 54 65 72 6d 20         p->cTerm 
1b9c0 3d 20 63 3b 0a 20 20 20 20 20 20 20 20 62 72 65  = c;.        bre
1b9d0 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
1b9e0 20 20 69 6d 70 6f 72 74 5f 61 70 70 65 6e 64 5f    import_append_
1b9f0 63 68 61 72 28 70 2c 20 63 29 3b 0a 20 20 20 20  char(p, c);.    
1ba00 20 20 70 70 63 20 3d 20 70 63 3b 0a 20 20 20 20    ppc = pc;.    
1ba10 20 20 70 63 20 3d 20 63 3b 0a 20 20 20 20 7d 0a    pc = c;.    }.
1ba20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
1ba30 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66  If this is the f
1ba40 69 72 73 74 20 66 69 65 6c 64 20 62 65 69 6e 67  irst field being
1ba50 20 70 61 72 73 65 64 20 61 6e 64 20 69 74 20 62   parsed and it b
1ba60 65 67 69 6e 73 20 77 69 74 68 20 74 68 65 0a 20  egins with the. 
1ba70 20 20 20 2a 2a 20 55 54 46 2d 38 20 42 4f 4d 20     ** UTF-8 BOM 
1ba80 20 28 30 78 45 46 20 42 42 20 42 46 29 20 74 68   (0xEF BB BF) th
1ba90 65 6e 20 73 6b 69 70 20 74 68 65 20 42 4f 4d 20  en skip the BOM 
1baa0 2a 2f 0a 20 20 20 20 69 66 28 20 28 63 26 30 78  */.    if( (c&0x
1bab0 66 66 29 3d 3d 30 78 65 66 20 26 26 20 70 2d 3e  ff)==0xef && p->
1bac0 62 4e 6f 74 46 69 72 73 74 3d 3d 30 20 29 7b 0a  bNotFirst==0 ){.
1bad0 20 20 20 20 20 20 69 6d 70 6f 72 74 5f 61 70 70        import_app
1bae0 65 6e 64 5f 63 68 61 72 28 70 2c 20 63 29 3b 0a  end_char(p, c);.
1baf0 20 20 20 20 20 20 63 20 3d 20 66 67 65 74 63 28        c = fgetc(
1bb00 70 2d 3e 69 6e 29 3b 0a 20 20 20 20 20 20 69 66  p->in);.      if
1bb10 28 20 28 63 26 30 78 66 66 29 3d 3d 30 78 62 62  ( (c&0xff)==0xbb
1bb20 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6d 70 6f   ){.        impo
1bb30 72 74 5f 61 70 70 65 6e 64 5f 63 68 61 72 28 70  rt_append_char(p
1bb40 2c 20 63 29 3b 0a 20 20 20 20 20 20 20 20 63 20  , c);.        c 
1bb50 3d 20 66 67 65 74 63 28 70 2d 3e 69 6e 29 3b 0a  = fgetc(p->in);.
1bb60 20 20 20 20 20 20 20 20 69 66 28 20 28 63 26 30          if( (c&0
1bb70 78 66 66 29 3d 3d 30 78 62 66 20 29 7b 0a 20 20  xff)==0xbf ){.  
1bb80 20 20 20 20 20 20 20 20 70 2d 3e 62 4e 6f 74 46          p->bNotF
1bb90 69 72 73 74 20 3d 20 31 3b 0a 20 20 20 20 20 20  irst = 1;.      
1bba0 20 20 20 20 70 2d 3e 6e 20 3d 20 30 3b 0a 20 20      p->n = 0;.  
1bbb0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 63          return c
1bbc0 73 76 5f 72 65 61 64 5f 6f 6e 65 5f 66 69 65 6c  sv_read_one_fiel
1bbd0 64 28 70 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  d(p);.        }.
1bbe0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1bbf0 20 20 77 68 69 6c 65 28 20 63 21 3d 45 4f 46 20    while( c!=EOF 
1bc00 26 26 20 63 21 3d 63 53 65 70 20 26 26 20 63 21  && c!=cSep && c!
1bc10 3d 72 53 65 70 20 29 7b 0a 20 20 20 20 20 20 69  =rSep ){.      i
1bc20 6d 70 6f 72 74 5f 61 70 70 65 6e 64 5f 63 68 61  mport_append_cha
1bc30 72 28 70 2c 20 63 29 3b 0a 20 20 20 20 20 20 63  r(p, c);.      c
1bc40 20 3d 20 66 67 65 74 63 28 70 2d 3e 69 6e 29 3b   = fgetc(p->in);
1bc50 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 63  .    }.    if( c
1bc60 3d 3d 72 53 65 70 20 29 7b 0a 20 20 20 20 20 20  ==rSep ){.      
1bc70 70 2d 3e 6e 4c 69 6e 65 2b 2b 3b 0a 20 20 20 20  p->nLine++;.    
1bc80 20 20 69 66 28 20 70 2d 3e 6e 3e 30 20 26 26 20    if( p->n>0 && 
1bc90 70 2d 3e 7a 5b 70 2d 3e 6e 2d 31 5d 3d 3d 27 5c  p->z[p->n-1]=='\
1bca0 72 27 20 29 20 70 2d 3e 6e 2d 2d 3b 0a 20 20 20  r' ) p->n--;.   
1bcb0 20 7d 0a 20 20 20 20 70 2d 3e 63 54 65 72 6d 20   }.    p->cTerm 
1bcc0 3d 20 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  = c;.  }.  if( p
1bcd0 2d 3e 7a 20 29 20 70 2d 3e 7a 5b 70 2d 3e 6e 5d  ->z ) p->z[p->n]
1bce0 20 3d 20 30 3b 0a 20 20 70 2d 3e 62 4e 6f 74 46   = 0;.  p->bNotF
1bcf0 69 72 73 74 20 3d 20 31 3b 0a 20 20 72 65 74 75  irst = 1;.  retu
1bd00 72 6e 20 70 2d 3e 7a 3b 0a 7d 0a 0a 2f 2a 20 52  rn p->z;.}../* R
1bd10 65 61 64 20 61 20 73 69 6e 67 6c 65 20 66 69 65  ead a single fie
1bd20 6c 64 20 6f 66 20 41 53 43 49 49 20 64 65 6c 69  ld of ASCII deli
1bd30 6d 69 74 65 64 20 74 65 78 74 2e 0a 2a 2a 0a 2a  mited text..**.*
1bd40 2a 20 20 20 2b 20 20 49 6e 70 75 74 20 63 6f 6d  *   +  Input com
1bd50 65 73 20 66 72 6f 6d 20 70 2d 3e 69 6e 2e 0a 2a  es from p->in..*
1bd60 2a 20 20 20 2b 20 20 53 74 6f 72 65 20 72 65 73  *   +  Store res
1bd70 75 6c 74 73 20 69 6e 20 70 2d 3e 7a 20 6f 66 20  ults in p->z of 
1bd80 6c 65 6e 67 74 68 20 70 2d 3e 6e 2e 20 20 53 70  length p->n.  Sp
1bd90 61 63 65 20 74 6f 20 68 6f 6c 64 20 70 2d 3e 7a  ace to hold p->z
1bda0 20 63 6f 6d 65 73 0a 2a 2a 20 20 20 20 20 20 66   comes.**      f
1bdb0 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  rom sqlite3_mall
1bdc0 6f 63 36 34 28 29 2e 0a 2a 2a 20 20 20 2b 20 20  oc64()..**   +  
1bdd0 55 73 65 20 70 2d 3e 63 53 65 70 20 61 73 20 74  Use p->cSep as t
1bde0 68 65 20 63 6f 6c 75 6d 6e 20 73 65 70 61 72 61  he column separa
1bdf0 74 6f 72 2e 20 20 54 68 65 20 64 65 66 61 75 6c  tor.  The defaul
1be00 74 20 69 73 20 22 5c 78 31 46 22 2e 0a 2a 2a 20  t is "\x1F"..** 
1be10 20 20 2b 20 20 55 73 65 20 70 2d 3e 72 53 65 70    +  Use p->rSep
1be20 20 61 73 20 74 68 65 20 72 6f 77 20 73 65 70 61   as the row sepa
1be30 72 61 74 6f 72 2e 20 20 54 68 65 20 64 65 66 61  rator.  The defa
1be40 75 6c 74 20 69 73 20 22 5c 78 31 45 22 2e 0a 2a  ult is "\x1E"..*
1be50 2a 20 20 20 2b 20 20 4b 65 65 70 20 74 72 61 63  *   +  Keep trac
1be60 6b 20 6f 66 20 74 68 65 20 72 6f 77 20 6e 75 6d  k of the row num
1be70 62 65 72 20 69 6e 20 70 2d 3e 6e 4c 69 6e 65 2e  ber in p->nLine.
1be80 0a 2a 2a 20 20 20 2b 20 20 53 74 6f 72 65 20 74  .**   +  Store t
1be90 68 65 20 63 68 61 72 61 63 74 65 72 20 74 68 61  he character tha
1bea0 74 20 74 65 72 6d 69 6e 61 74 65 73 20 74 68 65  t terminates the
1beb0 20 66 69 65 6c 64 20 69 6e 20 70 2d 3e 63 54 65   field in p->cTe
1bec0 72 6d 2e 20 20 53 74 6f 72 65 0a 2a 2a 20 20 20  rm.  Store.**   
1bed0 20 20 20 45 4f 46 20 6f 6e 20 65 6e 64 2d 6f 66     EOF on end-of
1bee0 2d 66 69 6c 65 2e 0a 2a 2a 20 20 20 2b 20 20 52  -file..**   +  R
1bef0 65 70 6f 72 74 20 73 79 6e 74 61 78 20 65 72 72  eport syntax err
1bf00 6f 72 73 20 6f 6e 20 73 74 64 65 72 72 0a 2a 2f  ors on stderr.*/
1bf10 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 53 51  .static char *SQ
1bf20 4c 49 54 45 5f 43 44 45 43 4c 20 61 73 63 69 69  LITE_CDECL ascii
1bf30 5f 72 65 61 64 5f 6f 6e 65 5f 66 69 65 6c 64 28  _read_one_field(
1bf40 49 6d 70 6f 72 74 43 74 78 20 2a 70 29 7b 0a 20  ImportCtx *p){. 
1bf50 20 69 6e 74 20 63 3b 0a 20 20 69 6e 74 20 63 53   int c;.  int cS
1bf60 65 70 20 3d 20 70 2d 3e 63 43 6f 6c 53 65 70 3b  ep = p->cColSep;
1bf70 0a 20 20 69 6e 74 20 72 53 65 70 20 3d 20 70 2d  .  int rSep = p-
1bf80 3e 63 52 6f 77 53 65 70 3b 0a 20 20 70 2d 3e 6e  >cRowSep;.  p->n
1bf90 20 3d 20 30 3b 0a 20 20 63 20 3d 20 66 67 65 74   = 0;.  c = fget
1bfa0 63 28 70 2d 3e 69 6e 29 3b 0a 20 20 69 66 28 20  c(p->in);.  if( 
1bfb0 63 3d 3d 45 4f 46 20 7c 7c 20 73 65 65 6e 49 6e  c==EOF || seenIn
1bfc0 74 65 72 72 75 70 74 20 29 7b 0a 20 20 20 20 70  terrupt ){.    p
1bfd0 2d 3e 63 54 65 72 6d 20 3d 20 45 4f 46 3b 0a 20  ->cTerm = EOF;. 
1bfe0 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
1bff0 0a 20 20 77 68 69 6c 65 28 20 63 21 3d 45 4f 46  .  while( c!=EOF
1c000 20 26 26 20 63 21 3d 63 53 65 70 20 26 26 20 63   && c!=cSep && c
1c010 21 3d 72 53 65 70 20 29 7b 0a 20 20 20 20 69 6d  !=rSep ){.    im
1c020 70 6f 72 74 5f 61 70 70 65 6e 64 5f 63 68 61 72  port_append_char
1c030 28 70 2c 20 63 29 3b 0a 20 20 20 20 63 20 3d 20  (p, c);.    c = 
1c040 66 67 65 74 63 28 70 2d 3e 69 6e 29 3b 0a 20 20  fgetc(p->in);.  
1c050 7d 0a 20 20 69 66 28 20 63 3d 3d 72 53 65 70 20  }.  if( c==rSep 
1c060 29 7b 0a 20 20 20 20 70 2d 3e 6e 4c 69 6e 65 2b  ){.    p->nLine+
1c070 2b 3b 0a 20 20 7d 0a 20 20 70 2d 3e 63 54 65 72  +;.  }.  p->cTer
1c080 6d 20 3d 20 63 3b 0a 20 20 69 66 28 20 70 2d 3e  m = c;.  if( p->
1c090 7a 20 29 20 70 2d 3e 7a 5b 70 2d 3e 6e 5d 20 3d  z ) p->z[p->n] =
1c0a0 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e   0;.  return p->
1c0b0 7a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20  z;.}../*.** Try 
1c0c0 74 6f 20 74 72 61 6e 73 66 65 72 20 64 61 74 61  to transfer data
1c0d0 20 66 6f 72 20 74 61 62 6c 65 20 7a 54 61 62 6c   for table zTabl
1c0e0 65 2e 20 20 49 66 20 61 6e 20 65 72 72 6f 72 20  e.  If an error 
1c0f0 69 73 20 73 65 65 6e 20 77 68 69 6c 65 0a 2a 2a  is seen while.**
1c100 20 6d 6f 76 69 6e 67 20 66 6f 72 77 61 72 64 2c   moving forward,
1c110 20 74 72 79 20 74 6f 20 67 6f 20 62 61 63 6b 77   try to go backw
1c120 61 72 64 73 2e 20 20 54 68 65 20 62 61 63 6b 77  ards.  The backw
1c130 61 72 64 73 20 6d 6f 76 65 6d 65 6e 74 20 77 6f  ards movement wo
1c140 6e 27 74 0a 2a 2a 20 77 6f 72 6b 20 66 6f 72 20  n't.** work for 
1c150 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20 74 61  WITHOUT ROWID ta
1c160 62 6c 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  bles..*/.static 
1c170 76 6f 69 64 20 74 72 79 54 6f 43 6c 6f 6e 65 44  void tryToCloneD
1c180 61 74 61 28 0a 20 20 53 68 65 6c 6c 53 74 61 74  ata(.  ShellStat
1c190 65 20 2a 70 2c 0a 20 20 73 71 6c 69 74 65 33 20  e *p,.  sqlite3 
1c1a0 2a 6e 65 77 44 62 2c 0a 20 20 63 6f 6e 73 74 20  *newDb,.  const 
1c1b0 63 68 61 72 20 2a 7a 54 61 62 6c 65 0a 29 7b 0a  char *zTable.){.
1c1c0 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
1c1d0 70 51 75 65 72 79 20 3d 20 30 3b 0a 20 20 73 71  pQuery = 0;.  sq
1c1e0 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 49 6e 73  lite3_stmt *pIns
1c1f0 65 72 74 20 3d 20 30 3b 0a 20 20 63 68 61 72 20  ert = 0;.  char 
1c200 2a 7a 51 75 65 72 79 20 3d 20 30 3b 0a 20 20 63  *zQuery = 0;.  c
1c210 68 61 72 20 2a 7a 49 6e 73 65 72 74 20 3d 20 30  har *zInsert = 0
1c220 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e  ;.  int rc;.  in
1c230 74 20 69 2c 20 6a 2c 20 6e 3b 0a 20 20 69 6e 74  t i, j, n;.  int
1c240 20 6e 54 61 62 6c 65 20 3d 20 73 74 72 6c 65 6e   nTable = strlen
1c250 33 30 28 7a 54 61 62 6c 65 29 3b 0a 20 20 69 6e  30(zTable);.  in
1c260 74 20 6b 20 3d 20 30 3b 0a 20 20 69 6e 74 20 63  t k = 0;.  int c
1c270 6e 74 20 3d 20 30 3b 0a 20 20 63 6f 6e 73 74 20  nt = 0;.  const 
1c280 69 6e 74 20 73 70 69 6e 52 61 74 65 20 3d 20 31  int spinRate = 1
1c290 30 30 30 30 3b 0a 0a 20 20 7a 51 75 65 72 79 20  0000;..  zQuery 
1c2a0 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
1c2b0 66 28 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  f("SELECT * FROM
1c2c0 20 5c 22 25 77 5c 22 22 2c 20 7a 54 61 62 6c 65   \"%w\"", zTable
1c2d0 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
1c2e0 33 5f 70 72 65 70 61 72 65 5f 76 32 28 70 2d 3e  3_prepare_v2(p->
1c2f0 64 62 2c 20 7a 51 75 65 72 79 2c 20 2d 31 2c 20  db, zQuery, -1, 
1c300 26 70 51 75 65 72 79 2c 20 30 29 3b 0a 20 20 69  &pQuery, 0);.  i
1c310 66 28 20 72 63 20 29 7b 0a 20 20 20 20 75 74 66  f( rc ){.    utf
1c320 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  8_printf(stderr,
1c330 20 22 45 72 72 6f 72 20 25 64 3a 20 25 73 20 6f   "Error %d: %s o
1c340 6e 20 5b 25 73 5d 5c 6e 22 2c 0a 20 20 20 20 20  n [%s]\n",.     
1c350 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65         sqlite3_e
1c360 78 74 65 6e 64 65 64 5f 65 72 72 63 6f 64 65 28  xtended_errcode(
1c370 70 2d 3e 64 62 29 2c 20 73 71 6c 69 74 65 33 5f  p->db), sqlite3_
1c380 65 72 72 6d 73 67 28 70 2d 3e 64 62 29 2c 0a 20  errmsg(p->db),. 
1c390 20 20 20 20 20 20 20 20 20 20 20 7a 51 75 65 72             zQuer
1c3a0 79 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64  y);.    goto end
1c3b0 5f 64 61 74 61 5f 78 66 65 72 3b 0a 20 20 7d 0a  _data_xfer;.  }.
1c3c0 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f    n = sqlite3_co
1c3d0 6c 75 6d 6e 5f 63 6f 75 6e 74 28 70 51 75 65 72  lumn_count(pQuer
1c3e0 79 29 3b 0a 20 20 7a 49 6e 73 65 72 74 20 3d 20  y);.  zInsert = 
1c3f0 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34  sqlite3_malloc64
1c400 28 32 30 30 20 2b 20 6e 54 61 62 6c 65 20 2b 20  (200 + nTable + 
1c410 6e 2a 33 29 3b 0a 20 20 69 66 28 20 7a 49 6e 73  n*3);.  if( zIns
1c420 65 72 74 3d 3d 30 20 29 7b 0a 20 20 20 20 72 61  ert==0 ){.    ra
1c430 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  w_printf(stderr,
1c440 20 22 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 5c   "out of memory\
1c450 6e 22 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e  n");.    goto en
1c460 64 5f 64 61 74 61 5f 78 66 65 72 3b 0a 20 20 7d  d_data_xfer;.  }
1c470 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69  .  sqlite3_snpri
1c480 6e 74 66 28 32 30 30 2b 6e 54 61 62 6c 65 2c 7a  ntf(200+nTable,z
1c490 49 6e 73 65 72 74 2c 0a 20 20 20 20 20 20 20 20  Insert,.        
1c4a0 20 20 20 20 20 20 20 20 20 20 20 22 49 4e 53 45             "INSE
1c4b0 52 54 20 4f 52 20 49 47 4e 4f 52 45 20 49 4e 54  RT OR IGNORE INT
1c4c0 4f 20 5c 22 25 73 5c 22 20 56 41 4c 55 45 53 28  O \"%s\" VALUES(
1c4d0 3f 22 2c 20 7a 54 61 62 6c 65 29 3b 0a 20 20 69  ?", zTable);.  i
1c4e0 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a 49 6e 73   = strlen30(zIns
1c4f0 65 72 74 29 3b 0a 20 20 66 6f 72 28 6a 3d 31 3b  ert);.  for(j=1;
1c500 20 6a 3c 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20   j<n; j++){.    
1c510 6d 65 6d 63 70 79 28 7a 49 6e 73 65 72 74 2b 69  memcpy(zInsert+i
1c520 2c 20 22 2c 3f 22 2c 20 32 29 3b 0a 20 20 20 20  , ",?", 2);.    
1c530 69 20 2b 3d 20 32 3b 0a 20 20 7d 0a 20 20 6d 65  i += 2;.  }.  me
1c540 6d 63 70 79 28 7a 49 6e 73 65 72 74 2b 69 2c 20  mcpy(zInsert+i, 
1c550 22 29 3b 22 2c 20 33 29 3b 0a 20 20 72 63 20 3d  ");", 3);.  rc =
1c560 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
1c570 5f 76 32 28 6e 65 77 44 62 2c 20 7a 49 6e 73 65  _v2(newDb, zInse
1c580 72 74 2c 20 2d 31 2c 20 26 70 49 6e 73 65 72 74  rt, -1, &pInsert
1c590 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 20 29  , 0);.  if( rc )
1c5a0 7b 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74  {.    utf8_print
1c5b0 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72  f(stderr, "Error
1c5c0 20 25 64 3a 20 25 73 20 6f 6e 20 5b 25 73 5d 5c   %d: %s on [%s]\
1c5d0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
1c5e0 73 71 6c 69 74 65 33 5f 65 78 74 65 6e 64 65 64  sqlite3_extended
1c5f0 5f 65 72 72 63 6f 64 65 28 6e 65 77 44 62 29 2c  _errcode(newDb),
1c600 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
1c610 6e 65 77 44 62 29 2c 0a 20 20 20 20 20 20 20 20  newDb),.        
1c620 20 20 20 20 7a 51 75 65 72 79 29 3b 0a 20 20 20      zQuery);.   
1c630 20 67 6f 74 6f 20 65 6e 64 5f 64 61 74 61 5f 78   goto end_data_x
1c640 66 65 72 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 6b  fer;.  }.  for(k
1c650 3d 30 3b 20 6b 3c 32 3b 20 6b 2b 2b 29 7b 0a 20  =0; k<2; k++){. 
1c660 20 20 20 77 68 69 6c 65 28 20 28 72 63 20 3d 20     while( (rc = 
1c670 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 51 75  sqlite3_step(pQu
1c680 65 72 79 29 29 3d 3d 53 51 4c 49 54 45 5f 52 4f  ery))==SQLITE_RO
1c690 57 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69  W ){.      for(i
1c6a0 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20  =0; i<n; i++){. 
1c6b0 20 20 20 20 20 20 20 73 77 69 74 63 68 28 20 73         switch( s
1c6c0 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 79  qlite3_column_ty
1c6d0 70 65 28 70 51 75 65 72 79 2c 20 69 29 20 29 7b  pe(pQuery, i) ){
1c6e0 0a 20 20 20 20 20 20 20 20 20 20 63 61 73 65 20  .          case 
1c6f0 53 51 4c 49 54 45 5f 4e 55 4c 4c 3a 20 7b 0a 20  SQLITE_NULL: {. 
1c700 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
1c710 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c 28 70 49 6e  e3_bind_null(pIn
1c720 73 65 72 74 2c 20 69 2b 31 29 3b 0a 20 20 20 20  sert, i+1);.    
1c730 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
1c740 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1c750 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
1c760 5f 49 4e 54 45 47 45 52 3a 20 7b 0a 20 20 20 20  _INTEGER: {.    
1c770 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
1c780 62 69 6e 64 5f 69 6e 74 36 34 28 70 49 6e 73 65  bind_int64(pInse
1c790 72 74 2c 20 69 2b 31 2c 20 73 71 6c 69 74 65 33  rt, i+1, sqlite3
1c7a0 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28 70 51  _column_int64(pQ
1c7b0 75 65 72 79 2c 69 29 29 3b 0a 20 20 20 20 20 20  uery,i));.      
1c7c0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1c7d0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1c7e0 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46     case SQLITE_F
1c7f0 4c 4f 41 54 3a 20 7b 0a 20 20 20 20 20 20 20 20  LOAT: {.        
1c800 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64      sqlite3_bind
1c810 5f 64 6f 75 62 6c 65 28 70 49 6e 73 65 72 74 2c  _double(pInsert,
1c820 20 69 2b 31 2c 20 73 71 6c 69 74 65 33 5f 63 6f   i+1, sqlite3_co
1c830 6c 75 6d 6e 5f 64 6f 75 62 6c 65 28 70 51 75 65  lumn_double(pQue
1c840 72 79 2c 69 29 29 3b 0a 20 20 20 20 20 20 20 20  ry,i));.        
1c850 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
1c860 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
1c870 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 58   case SQLITE_TEX
1c880 54 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  T: {.           
1c890 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65   sqlite3_bind_te
1c8a0 78 74 28 70 49 6e 73 65 72 74 2c 20 69 2b 31 2c  xt(pInsert, i+1,
1c8b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1c8c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63                (c
1c8d0 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74  onst char*)sqlit
1c8e0 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70  e3_column_text(p
1c8f0 51 75 65 72 79 2c 69 29 2c 0a 20 20 20 20 20 20  Query,i),.      
1c900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c910 20 20 20 20 20 20 20 2d 31 2c 20 53 51 4c 49 54         -1, SQLIT
1c920 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20  E_STATIC);.     
1c930 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
1c940 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1c950 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
1c960 42 4c 4f 42 3a 20 7b 0a 20 20 20 20 20 20 20 20  BLOB: {.        
1c970 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64      sqlite3_bind
1c980 5f 62 6c 6f 62 28 70 49 6e 73 65 72 74 2c 20 69  _blob(pInsert, i
1c990 2b 31 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  +1, sqlite3_colu
1c9a0 6d 6e 5f 62 6c 6f 62 28 70 51 75 65 72 79 2c 69  mn_blob(pQuery,i
1c9b0 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
1c9c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c9d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
1c9e0 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79  qlite3_column_by
1c9f0 74 65 73 28 70 51 75 65 72 79 2c 69 29 2c 0a 20  tes(pQuery,i),. 
1ca00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ca10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ca20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
1ca30 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20  E_STATIC);.     
1ca40 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
1ca50 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1ca60 20 20 7d 0a 20 20 20 20 20 20 7d 20 2f 2a 20 45    }.      } /* E
1ca70 6e 64 20 66 6f 72 20 2a 2f 0a 20 20 20 20 20 20  nd for */.      
1ca80 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 65  rc = sqlite3_ste
1ca90 70 28 70 49 6e 73 65 72 74 29 3b 0a 20 20 20 20  p(pInsert);.    
1caa0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1cab0 5f 4f 4b 20 26 26 20 72 63 21 3d 53 51 4c 49 54  _OK && rc!=SQLIT
1cac0 45 5f 52 4f 57 20 26 26 20 72 63 21 3d 53 51 4c  E_ROW && rc!=SQL
1cad0 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20  ITE_DONE ){.    
1cae0 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
1caf0 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72 20 25  stderr, "Error %
1cb00 64 3a 20 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65  d: %s\n", sqlite
1cb10 33 5f 65 78 74 65 6e 64 65 64 5f 65 72 72 63 6f  3_extended_errco
1cb20 64 65 28 6e 65 77 44 62 29 2c 0a 20 20 20 20 20  de(newDb),.     
1cb30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cb40 20 20 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73     sqlite3_errms
1cb50 67 28 6e 65 77 44 62 29 29 3b 0a 20 20 20 20 20  g(newDb));.     
1cb60 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
1cb70 5f 72 65 73 65 74 28 70 49 6e 73 65 72 74 29 3b  _reset(pInsert);
1cb80 0a 20 20 20 20 20 20 63 6e 74 2b 2b 3b 0a 20 20  .      cnt++;.  
1cb90 20 20 20 20 69 66 28 20 28 63 6e 74 25 73 70 69      if( (cnt%spi
1cba0 6e 52 61 74 65 29 3d 3d 30 20 29 7b 0a 20 20 20  nRate)==0 ){.   
1cbb0 20 20 20 20 20 70 72 69 6e 74 66 28 22 25 63 5c       printf("%c\
1cbc0 62 22 2c 20 22 7c 2f 2d 5c 5c 22 5b 28 63 6e 74  b", "|/-\\"[(cnt
1cbd0 2f 73 70 69 6e 52 61 74 65 29 25 34 5d 29 3b 0a  /spinRate)%4]);.
1cbe0 20 20 20 20 20 20 20 20 66 66 6c 75 73 68 28 73          fflush(s
1cbf0 74 64 6f 75 74 29 3b 0a 20 20 20 20 20 20 7d 0a  tdout);.      }.
1cc00 20 20 20 20 7d 20 2f 2a 20 45 6e 64 20 77 68 69      } /* End whi
1cc10 6c 65 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63  le */.    if( rc
1cc20 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 20  ==SQLITE_DONE ) 
1cc30 62 72 65 61 6b 3b 0a 20 20 20 20 73 71 6c 69 74  break;.    sqlit
1cc40 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 51 75 65  e3_finalize(pQue
1cc50 72 79 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ry);.    sqlite3
1cc60 5f 66 72 65 65 28 7a 51 75 65 72 79 29 3b 0a 20  _free(zQuery);. 
1cc70 20 20 20 7a 51 75 65 72 79 20 3d 20 73 71 6c 69     zQuery = sqli
1cc80 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 53 45 4c  te3_mprintf("SEL
1cc90 45 43 54 20 2a 20 46 52 4f 4d 20 5c 22 25 77 5c  ECT * FROM \"%w\
1cca0 22 20 4f 52 44 45 52 20 42 59 20 72 6f 77 69 64  " ORDER BY rowid
1ccb0 20 44 45 53 43 3b 22 2c 0a 20 20 20 20 20 20 20   DESC;",.       
1ccc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ccd0 20 20 20 20 20 20 7a 54 61 62 6c 65 29 3b 0a 20        zTable);. 
1cce0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
1ccf0 70 72 65 70 61 72 65 5f 76 32 28 70 2d 3e 64 62  prepare_v2(p->db
1cd00 2c 20 7a 51 75 65 72 79 2c 20 2d 31 2c 20 26 70  , zQuery, -1, &p
1cd10 51 75 65 72 79 2c 20 30 29 3b 0a 20 20 20 20 69  Query, 0);.    i
1cd20 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 75  f( rc ){.      u
1cd30 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72  tf8_printf(stder
1cd40 72 2c 20 22 57 61 72 6e 69 6e 67 3a 20 63 61 6e  r, "Warning: can
1cd50 6e 6f 74 20 73 74 65 70 20 5c 22 25 73 5c 22 20  not step \"%s\" 
1cd60 62 61 63 6b 77 61 72 64 73 22 2c 20 7a 54 61 62  backwards", zTab
1cd70 6c 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  le);.      break
1cd80 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 2f 2a 20 45  ;.    }.  } /* E
1cd90 6e 64 20 66 6f 72 28 6b 3d 30 2e 2e 2e 29 20 2a  nd for(k=0...) *
1cda0 2f 0a 0a 65 6e 64 5f 64 61 74 61 5f 78 66 65 72  /..end_data_xfer
1cdb0 3a 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61  :.  sqlite3_fina
1cdc0 6c 69 7a 65 28 70 51 75 65 72 79 29 3b 0a 20 20  lize(pQuery);.  
1cdd0 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
1cde0 28 70 49 6e 73 65 72 74 29 3b 0a 20 20 73 71 6c  (pInsert);.  sql
1cdf0 69 74 65 33 5f 66 72 65 65 28 7a 51 75 65 72 79  ite3_free(zQuery
1ce00 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
1ce10 65 28 7a 49 6e 73 65 72 74 29 3b 0a 7d 0a 0a 0a  e(zInsert);.}...
1ce20 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 74 72 61  /*.** Try to tra
1ce30 6e 73 66 65 72 20 61 6c 6c 20 72 6f 77 73 20 6f  nsfer all rows o
1ce40 66 20 74 68 65 20 73 63 68 65 6d 61 20 74 68 61  f the schema tha
1ce50 74 20 6d 61 74 63 68 20 7a 57 68 65 72 65 2e 20  t match zWhere. 
1ce60 20 46 6f 72 0a 2a 2a 20 65 61 63 68 20 72 6f 77   For.** each row
1ce70 2c 20 69 6e 76 6f 6b 65 20 78 46 6f 72 45 61 63  , invoke xForEac
1ce80 68 28 29 20 6f 6e 20 74 68 65 20 6f 62 6a 65 63  h() on the objec
1ce90 74 20 64 65 66 69 6e 65 64 20 62 79 20 74 68 61  t defined by tha
1cea0 74 20 72 6f 77 2e 0a 2a 2a 20 49 66 20 61 6e 20  t row..** If an 
1ceb0 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74  error is encount
1cec0 65 72 65 64 20 77 68 69 6c 65 20 6d 6f 76 69 6e  ered while movin
1ced0 67 20 66 6f 72 77 61 72 64 20 74 68 72 6f 75 67  g forward throug
1cee0 68 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 5f  h the.** sqlite_
1cef0 6d 61 73 74 65 72 20 74 61 62 6c 65 2c 20 74 72  master table, tr
1cf00 79 20 61 67 61 69 6e 20 6d 6f 76 69 6e 67 20 62  y again moving b
1cf10 61 63 6b 77 61 72 64 73 2e 0a 2a 2f 0a 73 74 61  ackwards..*/.sta
1cf20 74 69 63 20 76 6f 69 64 20 74 72 79 54 6f 43 6c  tic void tryToCl
1cf30 6f 6e 65 53 63 68 65 6d 61 28 0a 20 20 53 68 65  oneSchema(.  She
1cf40 6c 6c 53 74 61 74 65 20 2a 70 2c 0a 20 20 73 71  llState *p,.  sq
1cf50 6c 69 74 65 33 20 2a 6e 65 77 44 62 2c 0a 20 20  lite3 *newDb,.  
1cf60 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 57 68 65  const char *zWhe
1cf70 72 65 2c 0a 20 20 76 6f 69 64 20 28 2a 78 46 6f  re,.  void (*xFo
1cf80 72 45 61 63 68 29 28 53 68 65 6c 6c 53 74 61 74  rEach)(ShellStat
1cf90 65 2a 2c 73 71 6c 69 74 65 33 2a 2c 63 6f 6e 73  e*,sqlite3*,cons
1cfa0 74 20 63 68 61 72 2a 29 0a 29 7b 0a 20 20 73 71  t char*).){.  sq
1cfb0 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 51 75 65  lite3_stmt *pQue
1cfc0 72 79 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a  ry = 0;.  char *
1cfd0 7a 51 75 65 72 79 20 3d 20 30 3b 0a 20 20 69 6e  zQuery = 0;.  in
1cfe0 74 20 72 63 3b 0a 20 20 63 6f 6e 73 74 20 75 6e  t rc;.  const un
1cff0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 4e 61  signed char *zNa
1d000 6d 65 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69  me;.  const unsi
1d010 67 6e 65 64 20 63 68 61 72 20 2a 7a 53 71 6c 3b  gned char *zSql;
1d020 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 4d 73 67  .  char *zErrMsg
1d030 20 3d 20 30 3b 0a 0a 20 20 7a 51 75 65 72 79 20   = 0;..  zQuery 
1d040 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
1d050 66 28 22 53 45 4c 45 43 54 20 6e 61 6d 65 2c 20  f("SELECT name, 
1d060 73 71 6c 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f  sql FROM sqlite_
1d070 6d 61 73 74 65 72 22 0a 20 20 20 20 20 20 20 20  master".        
1d080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d090 20 20 20 22 20 57 48 45 52 45 20 25 73 22 2c 20     " WHERE %s", 
1d0a0 7a 57 68 65 72 65 29 3b 0a 20 20 72 63 20 3d 20  zWhere);.  rc = 
1d0b0 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f  sqlite3_prepare_
1d0c0 76 32 28 70 2d 3e 64 62 2c 20 7a 51 75 65 72 79  v2(p->db, zQuery
1d0d0 2c 20 2d 31 2c 20 26 70 51 75 65 72 79 2c 20 30  , -1, &pQuery, 0
1d0e0 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  );.  if( rc ){. 
1d0f0 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73     utf8_printf(s
1d100 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 28  tderr, "Error: (
1d110 25 64 29 20 25 73 20 6f 6e 20 5b 25 73 5d 5c 6e  %d) %s on [%s]\n
1d120 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
1d130 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65         sqlite3_e
1d140 78 74 65 6e 64 65 64 5f 65 72 72 63 6f 64 65 28  xtended_errcode(
1d150 70 2d 3e 64 62 29 2c 20 73 71 6c 69 74 65 33 5f  p->db), sqlite3_
1d160 65 72 72 6d 73 67 28 70 2d 3e 64 62 29 2c 0a 20  errmsg(p->db),. 
1d170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d180 20 20 20 7a 51 75 65 72 79 29 3b 0a 20 20 20 20     zQuery);.    
1d190 67 6f 74 6f 20 65 6e 64 5f 73 63 68 65 6d 61 5f  goto end_schema_
1d1a0 78 66 65 72 3b 0a 20 20 7d 0a 20 20 77 68 69 6c  xfer;.  }.  whil
1d1b0 65 28 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33  e( (rc = sqlite3
1d1c0 5f 73 74 65 70 28 70 51 75 65 72 79 29 29 3d 3d  _step(pQuery))==
1d1d0 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20  SQLITE_ROW ){.  
1d1e0 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65    zName = sqlite
1d1f0 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 51  3_column_text(pQ
1d200 75 65 72 79 2c 20 30 29 3b 0a 20 20 20 20 7a 53  uery, 0);.    zS
1d210 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  ql = sqlite3_col
1d220 75 6d 6e 5f 74 65 78 74 28 70 51 75 65 72 79 2c  umn_text(pQuery,
1d230 20 31 29 3b 0a 20 20 20 20 70 72 69 6e 74 66 28   1);.    printf(
1d240 22 25 73 2e 2e 2e 20 22 2c 20 7a 4e 61 6d 65 29  "%s... ", zName)
1d250 3b 20 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29  ; fflush(stdout)
1d260 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 65 78  ;.    sqlite3_ex
1d270 65 63 28 6e 65 77 44 62 2c 20 28 63 6f 6e 73 74  ec(newDb, (const
1d280 20 63 68 61 72 2a 29 7a 53 71 6c 2c 20 30 2c 20   char*)zSql, 0, 
1d290 30 2c 20 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20  0, &zErrMsg);.  
1d2a0 20 20 69 66 28 20 7a 45 72 72 4d 73 67 20 29 7b    if( zErrMsg ){
1d2b0 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e  .      utf8_prin
1d2c0 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f  tf(stderr, "Erro
1d2d0 72 3a 20 25 73 5c 6e 53 51 4c 3a 20 5b 25 73 5d  r: %s\nSQL: [%s]
1d2e0 5c 6e 22 2c 20 7a 45 72 72 4d 73 67 2c 20 7a 53  \n", zErrMsg, zS
1d2f0 71 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ql);.      sqlit
1d300 65 33 5f 66 72 65 65 28 7a 45 72 72 4d 73 67 29  e3_free(zErrMsg)
1d310 3b 0a 20 20 20 20 20 20 7a 45 72 72 4d 73 67 20  ;.      zErrMsg 
1d320 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  = 0;.    }.    i
1d330 66 28 20 78 46 6f 72 45 61 63 68 20 29 7b 0a 20  f( xForEach ){. 
1d340 20 20 20 20 20 78 46 6f 72 45 61 63 68 28 70 2c       xForEach(p,
1d350 20 6e 65 77 44 62 2c 20 28 63 6f 6e 73 74 20 63   newDb, (const c
1d360 68 61 72 2a 29 7a 4e 61 6d 65 29 3b 0a 20 20 20  har*)zName);.   
1d370 20 7d 0a 20 20 20 20 70 72 69 6e 74 66 28 22 64   }.    printf("d
1d380 6f 6e 65 5c 6e 22 29 3b 0a 20 20 7d 0a 20 20 69  one\n");.  }.  i
1d390 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f  f( rc!=SQLITE_DO
1d3a0 4e 45 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  NE ){.    sqlite
1d3b0 33 5f 66 69 6e 61 6c 69 7a 65 28 70 51 75 65 72  3_finalize(pQuer
1d3c0 79 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  y);.    sqlite3_
1d3d0 66 72 65 65 28 7a 51 75 65 72 79 29 3b 0a 20 20  free(zQuery);.  
1d3e0 20 20 7a 51 75 65 72 79 20 3d 20 73 71 6c 69 74    zQuery = sqlit
1d3f0 65 33 5f 6d 70 72 69 6e 74 66 28 22 53 45 4c 45  e3_mprintf("SELE
1d400 43 54 20 6e 61 6d 65 2c 20 73 71 6c 20 46 52 4f  CT name, sql FRO
1d410 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 22  M sqlite_master"
1d420 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1d430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20                " 
1d440 57 48 45 52 45 20 25 73 20 4f 52 44 45 52 20 42  WHERE %s ORDER B
1d450 59 20 72 6f 77 69 64 20 44 45 53 43 22 2c 20 7a  Y rowid DESC", z
1d460 57 68 65 72 65 29 3b 0a 20 20 20 20 72 63 20 3d  Where);.    rc =
1d470 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
1d480 5f 76 32 28 70 2d 3e 64 62 2c 20 7a 51 75 65 72  _v2(p->db, zQuer
1d490 79 2c 20 2d 31 2c 20 26 70 51 75 65 72 79 2c 20  y, -1, &pQuery, 
1d4a0 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  0);.    if( rc )
1d4b0 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69  {.      utf8_pri
1d4c0 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72  ntf(stderr, "Err
1d4d0 6f 72 3a 20 28 25 64 29 20 25 73 20 6f 6e 20 5b  or: (%d) %s on [
1d4e0 25 73 5d 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  %s]\n",.        
1d4f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
1d500 6c 69 74 65 33 5f 65 78 74 65 6e 64 65 64 5f 65  lite3_extended_e
1d510 72 72 63 6f 64 65 28 70 2d 3e 64 62 29 2c 20 73  rrcode(p->db), s
1d520 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 2d  qlite3_errmsg(p-
1d530 3e 64 62 29 2c 0a 20 20 20 20 20 20 20 20 20 20  >db),.          
1d540 20 20 20 20 20 20 20 20 20 20 20 20 7a 51 75 65              zQue
1d550 72 79 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  ry);.      goto 
1d560 65 6e 64 5f 73 63 68 65 6d 61 5f 78 66 65 72 3b  end_schema_xfer;
1d570 0a 20 20 20 20 7d 0a 20 20 20 20 77 68 69 6c 65  .    }.    while
1d580 28 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  ( (rc = sqlite3_
1d590 73 74 65 70 28 70 51 75 65 72 79 29 29 3d 3d 53  step(pQuery))==S
1d5a0 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20  QLITE_ROW ){.   
1d5b0 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74     zName = sqlit
1d5c0 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70  e3_column_text(p
1d5d0 51 75 65 72 79 2c 20 30 29 3b 0a 20 20 20 20 20  Query, 0);.     
1d5e0 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f   zSql = sqlite3_
1d5f0 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 51 75 65  column_text(pQue
1d600 72 79 2c 20 31 29 3b 0a 20 20 20 20 20 20 70 72  ry, 1);.      pr
1d610 69 6e 74 66 28 22 25 73 2e 2e 2e 20 22 2c 20 7a  intf("%s... ", z
1d620 4e 61 6d 65 29 3b 20 66 66 6c 75 73 68 28 73 74  Name); fflush(st
1d630 64 6f 75 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  dout);.      sql
1d640 69 74 65 33 5f 65 78 65 63 28 6e 65 77 44 62 2c  ite3_exec(newDb,
1d650 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 7a 53   (const char*)zS
1d660 71 6c 2c 20 30 2c 20 30 2c 20 26 7a 45 72 72 4d  ql, 0, 0, &zErrM
1d670 73 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a  sg);.      if( z
1d680 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20 20 20  ErrMsg ){.      
1d690 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74    utf8_printf(st
1d6a0 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 25 73  derr, "Error: %s
1d6b0 5c 6e 53 51 4c 3a 20 5b 25 73 5d 5c 6e 22 2c 20  \nSQL: [%s]\n", 
1d6c0 7a 45 72 72 4d 73 67 2c 20 7a 53 71 6c 29 3b 0a  zErrMsg, zSql);.
1d6d0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
1d6e0 66 72 65 65 28 7a 45 72 72 4d 73 67 29 3b 0a 20  free(zErrMsg);. 
1d6f0 20 20 20 20 20 20 20 7a 45 72 72 4d 73 67 20 3d         zErrMsg =
1d700 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
1d710 20 20 69 66 28 20 78 46 6f 72 45 61 63 68 20 29    if( xForEach )
1d720 7b 0a 20 20 20 20 20 20 20 20 78 46 6f 72 45 61  {.        xForEa
1d730 63 68 28 70 2c 20 6e 65 77 44 62 2c 20 28 63 6f  ch(p, newDb, (co
1d740 6e 73 74 20 63 68 61 72 2a 29 7a 4e 61 6d 65 29  nst char*)zName)
1d750 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1d760 70 72 69 6e 74 66 28 22 64 6f 6e 65 5c 6e 22 29  printf("done\n")
1d770 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 65 6e 64 5f  ;.    }.  }.end_
1d780 73 63 68 65 6d 61 5f 78 66 65 72 3a 0a 20 20 73  schema_xfer:.  s
1d790 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
1d7a0 70 51 75 65 72 79 29 3b 0a 20 20 73 71 6c 69 74  pQuery);.  sqlit
1d7b0 65 33 5f 66 72 65 65 28 7a 51 75 65 72 79 29 3b  e3_free(zQuery);
1d7c0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61  .}../*.** Open a
1d7d0 20 6e 65 77 20 64 61 74 61 62 61 73 65 20 66 69   new database fi
1d7e0 6c 65 20 6e 61 6d 65 64 20 22 7a 4e 65 77 44 62  le named "zNewDb
1d7f0 22 2e 20 20 54 72 79 20 74 6f 20 72 65 63 6f 76  ".  Try to recov
1d800 65 72 20 61 73 20 6d 75 63 68 20 69 6e 66 6f 72  er as much infor
1d810 6d 61 74 69 6f 6e 0a 2a 2a 20 61 73 20 70 6f 73  mation.** as pos
1d820 73 69 62 6c 65 20 6f 75 74 20 6f 66 20 74 68 65  sible out of the
1d830 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 28   main database (
1d840 77 68 69 63 68 20 6d 69 67 68 74 20 62 65 20 63  which might be c
1d850 6f 72 72 75 70 74 29 20 61 6e 64 20 77 72 69 74  orrupt) and writ
1d860 65 20 69 74 0a 2a 2a 20 69 6e 74 6f 20 7a 4e 65  e it.** into zNe
1d870 77 44 62 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  wDb..*/.static v
1d880 6f 69 64 20 74 72 79 54 6f 43 6c 6f 6e 65 28 53  oid tryToClone(S
1d890 68 65 6c 6c 53 74 61 74 65 20 2a 70 2c 20 63 6f  hellState *p, co
1d8a0 6e 73 74 20 63 68 61 72 20 2a 7a 4e 65 77 44 62  nst char *zNewDb
1d8b0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73  ){.  int rc;.  s
1d8c0 71 6c 69 74 65 33 20 2a 6e 65 77 44 62 20 3d 20  qlite3 *newDb = 
1d8d0 30 3b 0a 20 20 69 66 28 20 61 63 63 65 73 73 28  0;.  if( access(
1d8e0 7a 4e 65 77 44 62 2c 30 29 3d 3d 30 20 29 7b 0a  zNewDb,0)==0 ){.
1d8f0 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
1d900 73 74 64 65 72 72 2c 20 22 46 69 6c 65 20 5c 22  stderr, "File \"
1d910 25 73 5c 22 20 61 6c 72 65 61 64 79 20 65 78 69  %s\" already exi
1d920 73 74 73 2e 5c 6e 22 2c 20 7a 4e 65 77 44 62 29  sts.\n", zNewDb)
1d930 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
1d940 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  }.  rc = sqlite3
1d950 5f 6f 70 65 6e 28 7a 4e 65 77 44 62 2c 20 26 6e  _open(zNewDb, &n
1d960 65 77 44 62 29 3b 0a 20 20 69 66 28 20 72 63 20  ewDb);.  if( rc 
1d970 29 7b 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e  ){.    utf8_prin
1d980 74 66 28 73 74 64 65 72 72 2c 20 22 43 61 6e 6e  tf(stderr, "Cann
1d990 6f 74 20 63 72 65 61 74 65 20 6f 75 74 70 75 74  ot create output
1d9a0 20 64 61 74 61 62 61 73 65 3a 20 25 73 5c 6e 22   database: %s\n"
1d9b0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  ,.            sq
1d9c0 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 6e 65 77  lite3_errmsg(new
1d9d0 44 62 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Db));.  }else{. 
1d9e0 20 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28     sqlite3_exec(
1d9f0 70 2d 3e 64 62 2c 20 22 50 52 41 47 4d 41 20 77  p->db, "PRAGMA w
1da00 72 69 74 61 62 6c 65 5f 73 63 68 65 6d 61 3d 4f  ritable_schema=O
1da10 4e 3b 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  N;", 0, 0, 0);. 
1da20 20 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28     sqlite3_exec(
1da30 6e 65 77 44 62 2c 20 22 42 45 47 49 4e 20 45 58  newDb, "BEGIN EX
1da40 43 4c 55 53 49 56 45 3b 22 2c 20 30 2c 20 30 2c  CLUSIVE;", 0, 0,
1da50 20 30 29 3b 0a 20 20 20 20 74 72 79 54 6f 43 6c   0);.    tryToCl
1da60 6f 6e 65 53 63 68 65 6d 61 28 70 2c 20 6e 65 77  oneSchema(p, new
1da70 44 62 2c 20 22 74 79 70 65 3d 27 74 61 62 6c 65  Db, "type='table
1da80 27 22 2c 20 74 72 79 54 6f 43 6c 6f 6e 65 44 61  '", tryToCloneDa
1da90 74 61 29 3b 0a 20 20 20 20 74 72 79 54 6f 43 6c  ta);.    tryToCl
1daa0 6f 6e 65 53 63 68 65 6d 61 28 70 2c 20 6e 65 77  oneSchema(p, new
1dab0 44 62 2c 20 22 74 79 70 65 21 3d 27 74 61 62 6c  Db, "type!='tabl
1dac0 65 27 22 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  e'", 0);.    sql
1dad0 69 74 65 33 5f 65 78 65 63 28 6e 65 77 44 62 2c  ite3_exec(newDb,
1dae0 20 22 43 4f 4d 4d 49 54 3b 22 2c 20 30 2c 20 30   "COMMIT;", 0, 0
1daf0 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
1db00 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20 22 50  3_exec(p->db, "P
1db10 52 41 47 4d 41 20 77 72 69 74 61 62 6c 65 5f 73  RAGMA writable_s
1db20 63 68 65 6d 61 3d 4f 46 46 3b 22 2c 20 30 2c 20  chema=OFF;", 0, 
1db30 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  0, 0);.  }.  sql
1db40 69 74 65 33 5f 63 6c 6f 73 65 28 6e 65 77 44 62  ite3_close(newDb
1db50 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  );.}../*.** Chan
1db60 67 65 20 74 68 65 20 6f 75 74 70 75 74 20 66 69  ge the output fi
1db70 6c 65 20 62 61 63 6b 20 74 6f 20 73 74 64 6f 75  le back to stdou
1db80 74 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  t.*/.static void
1db90 20 6f 75 74 70 75 74 5f 72 65 73 65 74 28 53 68   output_reset(Sh
1dba0 65 6c 6c 53 74 61 74 65 20 2a 70 29 7b 0a 20 20  ellState *p){.  
1dbb0 69 66 28 20 70 2d 3e 6f 75 74 66 69 6c 65 5b 30  if( p->outfile[0
1dbc0 5d 3d 3d 27 7c 27 20 29 7b 0a 23 69 66 6e 64 65  ]=='|' ){.#ifnde
1dbd0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 4f  f SQLITE_OMIT_PO
1dbe0 50 45 4e 0a 20 20 20 20 70 63 6c 6f 73 65 28 70  PEN.    pclose(p
1dbf0 2d 3e 6f 75 74 29 3b 0a 23 65 6e 64 69 66 0a 20  ->out);.#endif. 
1dc00 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 75 74 70   }else{.    outp
1dc10 75 74 5f 66 69 6c 65 5f 63 6c 6f 73 65 28 70 2d  ut_file_close(p-
1dc20 3e 6f 75 74 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e  >out);.  }.  p->
1dc30 6f 75 74 66 69 6c 65 5b 30 5d 20 3d 20 30 3b 0a  outfile[0] = 0;.
1dc40 20 20 70 2d 3e 6f 75 74 20 3d 20 73 74 64 6f 75    p->out = stdou
1dc50 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 75 6e 20  t;.}../*.** Run 
1dc60 61 6e 20 53 51 4c 20 63 6f 6d 6d 61 6e 64 20 61  an SQL command a
1dc70 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20 73 69  nd return the si
1dc80 6e 67 6c 65 20 69 6e 74 65 67 65 72 20 72 65 73  ngle integer res
1dc90 75 6c 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ult..*/.static i
1dca0 6e 74 20 64 62 5f 69 6e 74 28 53 68 65 6c 6c 53  nt db_int(ShellS
1dcb0 74 61 74 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63  tate *p, const c
1dcc0 68 61 72 20 2a 7a 53 71 6c 29 7b 0a 20 20 73 71  har *zSql){.  sq
1dcd0 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
1dce0 74 3b 0a 20 20 69 6e 74 20 72 65 73 20 3d 20 30  t;.  int res = 0
1dcf0 3b 0a 20 20 73 71 6c 69 74 65 33 5f 70 72 65 70  ;.  sqlite3_prep
1dd00 61 72 65 5f 76 32 28 70 2d 3e 64 62 2c 20 7a 53  are_v2(p->db, zS
1dd10 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20  ql, -1, &pStmt, 
1dd20 30 29 3b 0a 20 20 69 66 28 20 70 53 74 6d 74 20  0);.  if( pStmt 
1dd30 26 26 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28  && sqlite3_step(
1dd40 70 53 74 6d 74 29 3d 3d 53 51 4c 49 54 45 5f 52  pStmt)==SQLITE_R
1dd50 4f 57 20 29 7b 0a 20 20 20 20 72 65 73 20 3d 20  OW ){.    res = 
1dd60 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69  sqlite3_column_i
1dd70 6e 74 28 70 53 74 6d 74 2c 30 29 3b 0a 20 20 7d  nt(pStmt,0);.  }
1dd80 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c  .  sqlite3_final
1dd90 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 72 65  ize(pStmt);.  re
1dda0 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a  turn res;.}../*.
1ddb0 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20 32 2d 62  ** Convert a 2-b
1ddc0 79 74 65 20 6f 72 20 34 2d 62 79 74 65 20 62 69  yte or 4-byte bi
1ddd0 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72  g-endian integer
1dde0 20 69 6e 74 6f 20 61 20 6e 61 74 69 76 65 20 69   into a native i
1ddf0 6e 74 65 67 65 72 0a 2a 2f 0a 73 74 61 74 69 63  nteger.*/.static
1de00 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 67 65   unsigned int ge
1de10 74 32 62 79 74 65 49 6e 74 28 75 6e 73 69 67 6e  t2byteInt(unsign
1de20 65 64 20 63 68 61 72 20 2a 61 29 7b 0a 20 20 72  ed char *a){.  r
1de30 65 74 75 72 6e 20 28 61 5b 30 5d 3c 3c 38 29 20  eturn (a[0]<<8) 
1de40 2b 20 61 5b 31 5d 3b 0a 7d 0a 73 74 61 74 69 63  + a[1];.}.static
1de50 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 67 65   unsigned int ge
1de60 74 34 62 79 74 65 49 6e 74 28 75 6e 73 69 67 6e  t4byteInt(unsign
1de70 65 64 20 63 68 61 72 20 2a 61 29 7b 0a 20 20 72  ed char *a){.  r
1de80 65 74 75 72 6e 20 28 61 5b 30 5d 3c 3c 32 34 29  eturn (a[0]<<24)
1de90 20 2b 20 28 61 5b 31 5d 3c 3c 31 36 29 20 2b 20   + (a[1]<<16) + 
1dea0 28 61 5b 32 5d 3c 3c 38 29 20 2b 20 61 5b 33 5d  (a[2]<<8) + a[3]
1deb0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65  ;.}../*.** Imple
1dec0 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  mentation of the
1ded0 20 22 2e 69 6e 66 6f 22 20 63 6f 6d 6d 61 6e 64   ".info" command
1dee0 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 31  ..**.** Return 1
1def0 20 6f 6e 20 65 72 72 6f 72 2c 20 32 20 74 6f 20   on error, 2 to 
1df00 65 78 69 74 2c 20 61 6e 64 20 30 20 6f 74 68 65  exit, and 0 othe
1df10 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  rwise..*/.static
1df20 20 69 6e 74 20 73 68 65 6c 6c 5f 64 62 69 6e 66   int shell_dbinf
1df30 6f 5f 63 6f 6d 6d 61 6e 64 28 53 68 65 6c 6c 53  o_command(ShellS
1df40 74 61 74 65 20 2a 70 2c 20 69 6e 74 20 6e 41 72  tate *p, int nAr
1df50 67 2c 20 63 68 61 72 20 2a 2a 61 7a 41 72 67 29  g, char **azArg)
1df60 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  {.  static const
1df70 20 73 74 72 75 63 74 20 7b 20 63 6f 6e 73 74 20   struct { const 
1df80 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 69 6e 74  char *zName; int
1df90 20 6f 66 73 74 3b 20 7d 20 61 46 69 65 6c 64 5b   ofst; } aField[
1dfa0 5d 20 3d 20 7b 0a 20 20 20 20 20 7b 20 22 66 69  ] = {.     { "fi
1dfb0 6c 65 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65  le change counte
1dfc0 72 3a 22 2c 20 20 32 34 20 20 7d 2c 0a 20 20 20  r:",  24  },.   
1dfd0 20 20 7b 20 22 64 61 74 61 62 61 73 65 20 70 61    { "database pa
1dfe0 67 65 20 63 6f 75 6e 74 3a 22 2c 20 20 32 38 20  ge count:",  28 
1dff0 20 7d 2c 0a 20 20 20 20 20 7b 20 22 66 72 65 65   },.     { "free
1e000 6c 69 73 74 20 70 61 67 65 20 63 6f 75 6e 74 3a  list page count:
1e010 22 2c 20 20 33 36 20 20 7d 2c 0a 20 20 20 20 20  ",  36  },.     
1e020 7b 20 22 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65  { "schema cookie
1e030 3a 22 2c 20 20 20 20 20 20 20 20 34 30 20 20 7d  :",        40  }
1e040 2c 0a 20 20 20 20 20 7b 20 22 73 63 68 65 6d 61  ,.     { "schema
1e050 20 66 6f 72 6d 61 74 3a 22 2c 20 20 20 20 20 20   format:",      
1e060 20 20 34 34 20 20 7d 2c 0a 20 20 20 20 20 7b 20    44  },.     { 
1e070 22 64 65 66 61 75 6c 74 20 63 61 63 68 65 20 73  "default cache s
1e080 69 7a 65 3a 22 2c 20 20 20 34 38 20 20 7d 2c 0a  ize:",   48  },.
1e090 20 20 20 20 20 7b 20 22 61 75 74 6f 76 61 63 75       { "autovacu
1e0a0 75 6d 20 74 6f 70 20 72 6f 6f 74 3a 22 2c 20 20  um top root:",  
1e0b0 35 32 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 69  52  },.     { "i
1e0c0 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75  ncremental vacuu
1e0d0 6d 3a 22 2c 20 20 20 36 34 20 20 7d 2c 0a 20 20  m:",   64  },.  
1e0e0 20 20 20 7b 20 22 74 65 78 74 20 65 6e 63 6f 64     { "text encod
1e0f0 69 6e 67 3a 22 2c 20 20 20 20 20 20 20 20 35 36  ing:",        56
1e100 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 75 73 65    },.     { "use
1e110 72 20 76 65 72 73 69 6f 6e 3a 22 2c 20 20 20 20  r version:",    
1e120 20 20 20 20 20 36 30 20 20 7d 2c 0a 20 20 20 20       60  },.    
1e130 20 7b 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 20   { "application 
1e140 69 64 3a 22 2c 20 20 20 20 20 20 20 36 38 20 20  id:",       68  
1e150 7d 2c 0a 20 20 20 20 20 7b 20 22 73 6f 66 74 77  },.     { "softw
1e160 61 72 65 20 76 65 72 73 69 6f 6e 3a 22 2c 20 20  are version:",  
1e170 20 20 20 39 36 20 20 7d 2c 0a 20 20 7d 3b 0a 20     96  },.  };. 
1e180 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 74   static const st
1e190 72 75 63 74 20 7b 20 63 6f 6e 73 74 20 63 68 61  ruct { const cha
1e1a0 72 20 2a 7a 4e 61 6d 65 3b 20 63 6f 6e 73 74 20  r *zName; const 
1e1b0 63 68 61 72 20 2a 7a 53 71 6c 3b 20 7d 20 61 51  char *zSql; } aQ
1e1c0 75 65 72 79 5b 5d 20 3d 20 7b 0a 20 20 20 20 20  uery[] = {.     
1e1d0 7b 20 22 6e 75 6d 62 65 72 20 6f 66 20 74 61 62  { "number of tab
1e1e0 6c 65 73 3a 22 2c 0a 20 20 20 20 20 20 20 22 53  les:",.       "S
1e1f0 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46  ELECT count(*) F
1e200 52 4f 4d 20 25 73 20 57 48 45 52 45 20 74 79 70  ROM %s WHERE typ
1e210 65 3d 27 74 61 62 6c 65 27 22 20 7d 2c 0a 20 20  e='table'" },.  
1e220 20 20 20 7b 20 22 6e 75 6d 62 65 72 20 6f 66 20     { "number of 
1e230 69 6e 64 65 78 65 73 3a 22 2c 0a 20 20 20 20 20  indexes:",.     
1e240 20 20 22 53 45 4c 45 43 54 20 63 6f 75 6e 74 28    "SELECT count(
1e250 2a 29 20 46 52 4f 4d 20 25 73 20 57 48 45 52 45  *) FROM %s WHERE
1e260 20 74 79 70 65 3d 27 69 6e 64 65 78 27 22 20 7d   type='index'" }
1e270 2c 0a 20 20 20 20 20 7b 20 22 6e 75 6d 62 65 72  ,.     { "number
1e280 20 6f 66 20 74 72 69 67 67 65 72 73 3a 22 2c 0a   of triggers:",.
1e290 20 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 63         "SELECT c
1e2a0 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 25 73 20  ount(*) FROM %s 
1e2b0 57 48 45 52 45 20 74 79 70 65 3d 27 74 72 69 67  WHERE type='trig
1e2c0 67 65 72 27 22 20 7d 2c 0a 20 20 20 20 20 7b 20  ger'" },.     { 
1e2d0 22 6e 75 6d 62 65 72 20 6f 66 20 76 69 65 77 73  "number of views
1e2e0 3a 22 2c 0a 20 20 20 20 20 20 20 22 53 45 4c 45  :",.       "SELE
1e2f0 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d  CT count(*) FROM
1e300 20 25 73 20 57 48 45 52 45 20 74 79 70 65 3d 27   %s WHERE type='
1e310 76 69 65 77 27 22 20 7d 2c 0a 20 20 20 20 20 7b  view'" },.     {
1e320 20 22 73 63 68 65 6d 61 20 73 69 7a 65 3a 22 2c   "schema size:",
1e330 0a 20 20 20 20 20 20 20 22 53 45 4c 45 43 54 20  .       "SELECT 
1e340 74 6f 74 61 6c 28 6c 65 6e 67 74 68 28 73 71 6c  total(length(sql
1e350 29 29 20 46 52 4f 4d 20 25 73 22 20 7d 2c 0a 20  )) FROM %s" },. 
1e360 20 7d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63   };.  int i;.  c
1e370 68 61 72 20 2a 7a 53 63 68 65 6d 61 54 61 62 3b  har *zSchemaTab;
1e380 0a 20 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 6e  .  char *zDb = n
1e390 41 72 67 3e 3d 32 20 3f 20 61 7a 41 72 67 5b 31  Arg>=2 ? azArg[1
1e3a0 5d 20 3a 20 22 6d 61 69 6e 22 3b 0a 20 20 73 71  ] : "main";.  sq
1e3b0 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
1e3c0 74 20 3d 20 30 3b 0a 20 20 75 6e 73 69 67 6e 65  t = 0;.  unsigne
1e3d0 64 20 63 68 61 72 20 61 48 64 72 5b 31 30 30 5d  d char aHdr[100]
1e3e0 3b 0a 20 20 6f 70 65 6e 5f 64 62 28 70 2c 20 30  ;.  open_db(p, 0
1e3f0 29 3b 0a 20 20 69 66 28 20 70 2d 3e 64 62 3d 3d  );.  if( p->db==
1e400 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  0 ) return 1;.  
1e410 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f  sqlite3_prepare_
1e420 76 32 28 70 2d 3e 64 62 2c 22 53 45 4c 45 43 54  v2(p->db,"SELECT
1e430 20 64 61 74 61 20 46 52 4f 4d 20 73 71 6c 69 74   data FROM sqlit
1e440 65 5f 64 62 70 61 67 65 28 3f 31 29 20 57 48 45  e_dbpage(?1) WHE
1e450 52 45 20 70 67 6e 6f 3d 31 22 2c 0a 20 20 20 20  RE pgno=1",.    
1e460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e470 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b   -1, &pStmt, 0);
1e480 0a 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f  .  sqlite3_bind_
1e490 74 65 78 74 28 70 53 74 6d 74 2c 20 31 2c 20 7a  text(pStmt, 1, z
1e4a0 44 62 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 53  Db, -1, SQLITE_S
1e4b0 54 41 54 49 43 29 3b 0a 20 20 69 66 28 20 73 71  TATIC);.  if( sq
1e4c0 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74  lite3_step(pStmt
1e4d0 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 0a 20 20  )==SQLITE_ROW.  
1e4e0 20 26 26 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75   && sqlite3_colu
1e4f0 6d 6e 5f 62 79 74 65 73 28 70 53 74 6d 74 2c 30  mn_bytes(pStmt,0
1e500 29 3e 31 30 30 0a 20 20 29 7b 0a 20 20 20 20 6d  )>100.  ){.    m
1e510 65 6d 63 70 79 28 61 48 64 72 2c 20 73 71 6c 69  emcpy(aHdr, sqli
1e520 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 28  te3_column_blob(
1e530 70 53 74 6d 74 2c 30 29 2c 20 31 30 30 29 3b 0a  pStmt,0), 100);.
1e540 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61      sqlite3_fina
1e550 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 7d  lize(pStmt);.  }
1e560 65 6c 73 65 7b 0a 20 20 20 20 72 61 77 5f 70 72  else{.    raw_pr
1e570 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 75 6e  intf(stderr, "un
1e580 61 62 6c 65 20 74 6f 20 72 65 61 64 20 64 61 74  able to read dat
1e590 61 62 61 73 65 20 68 65 61 64 65 72 5c 6e 22 29  abase header\n")
1e5a0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69  ;.    sqlite3_fi
1e5b0 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20  nalize(pStmt);. 
1e5c0 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
1e5d0 0a 20 20 69 20 3d 20 67 65 74 32 62 79 74 65 49  .  i = get2byteI
1e5e0 6e 74 28 61 48 64 72 2b 31 36 29 3b 0a 20 20 69  nt(aHdr+16);.  i
1e5f0 66 28 20 69 3d 3d 31 20 29 20 69 20 3d 20 36 35  f( i==1 ) i = 65
1e600 35 33 36 3b 0a 20 20 75 74 66 38 5f 70 72 69 6e  536;.  utf8_prin
1e610 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 2d 32 30  tf(p->out, "%-20
1e620 73 20 25 64 5c 6e 22 2c 20 22 64 61 74 61 62 61  s %d\n", "databa
1e630 73 65 20 70 61 67 65 20 73 69 7a 65 3a 22 2c 20  se page size:", 
1e640 69 29 3b 0a 20 20 75 74 66 38 5f 70 72 69 6e 74  i);.  utf8_print
1e650 66 28 70 2d 3e 6f 75 74 2c 20 22 25 2d 32 30 73  f(p->out, "%-20s
1e660 20 25 64 5c 6e 22 2c 20 22 77 72 69 74 65 20 66   %d\n", "write f
1e670 6f 72 6d 61 74 3a 22 2c 20 61 48 64 72 5b 31 38  ormat:", aHdr[18
1e680 5d 29 3b 0a 20 20 75 74 66 38 5f 70 72 69 6e 74  ]);.  utf8_print
1e690 66 28 70 2d 3e 6f 75 74 2c 20 22 25 2d 32 30 73  f(p->out, "%-20s
1e6a0 20 25 64 5c 6e 22 2c 20 22 72 65 61 64 20 66 6f   %d\n", "read fo
1e6b0 72 6d 61 74 3a 22 2c 20 61 48 64 72 5b 31 39 5d  rmat:", aHdr[19]
1e6c0 29 3b 0a 20 20 75 74 66 38 5f 70 72 69 6e 74 66  );.  utf8_printf
1e6d0 28 70 2d 3e 6f 75 74 2c 20 22 25 2d 32 30 73 20  (p->out, "%-20s 
1e6e0 25 64 5c 6e 22 2c 20 22 72 65 73 65 72 76 65 64  %d\n", "reserved
1e6f0 20 62 79 74 65 73 3a 22 2c 20 61 48 64 72 5b 32   bytes:", aHdr[2
1e700 30 5d 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  0]);.  for(i=0; 
1e710 69 3c 41 72 72 61 79 53 69 7a 65 28 61 46 69 65  i<ArraySize(aFie
1e720 6c 64 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  ld); i++){.    i
1e730 6e 74 20 6f 66 73 74 20 3d 20 61 46 69 65 6c 64  nt ofst = aField
1e740 5b 69 5d 2e 6f 66 73 74 3b 0a 20 20 20 20 75 6e  [i].ofst;.    un
1e750 73 69 67 6e 65 64 20 69 6e 74 20 76 61 6c 20 3d  signed int val =
1e760 20 67 65 74 34 62 79 74 65 49 6e 74 28 61 48 64   get4byteInt(aHd
1e770 72 20 2b 20 6f 66 73 74 29 3b 0a 20 20 20 20 75  r + ofst);.    u
1e780 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  tf8_printf(p->ou
1e790 74 2c 20 22 25 2d 32 30 73 20 25 75 22 2c 20 61  t, "%-20s %u", a
1e7a0 46 69 65 6c 64 5b 69 5d 2e 7a 4e 61 6d 65 2c 20  Field[i].zName, 
1e7b0 76 61 6c 29 3b 0a 20 20 20 20 73 77 69 74 63 68  val);.    switch
1e7c0 28 20 6f 66 73 74 20 29 7b 0a 20 20 20 20 20 20  ( ofst ){.      
1e7d0 63 61 73 65 20 35 36 3a 20 7b 0a 20 20 20 20 20  case 56: {.     
1e7e0 20 20 20 69 66 28 20 76 61 6c 3d 3d 31 20 29 20     if( val==1 ) 
1e7f0 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  raw_printf(p->ou
1e800 74 2c 20 22 20 28 75 74 66 38 29 22 29 3b 0a 20  t, " (utf8)");. 
1e810 20 20 20 20 20 20 20 69 66 28 20 76 61 6c 3d 3d         if( val==
1e820 32 20 29 20 72 61 77 5f 70 72 69 6e 74 66 28 70  2 ) raw_printf(p
1e830 2d 3e 6f 75 74 2c 20 22 20 28 75 74 66 31 36 6c  ->out, " (utf16l
1e840 65 29 22 29 3b 0a 20 20 20 20 20 20 20 20 69 66  e)");.        if
1e850 28 20 76 61 6c 3d 3d 33 20 29 20 72 61 77 5f 70  ( val==3 ) raw_p
1e860 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 20  rintf(p->out, " 
1e870 28 75 74 66 31 36 62 65 29 22 29 3b 0a 20 20 20  (utf16be)");.   
1e880 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72     }.    }.    r
1e890 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  aw_printf(p->out
1e8a0 2c 20 22 5c 6e 22 29 3b 0a 20 20 7d 0a 20 20 69  , "\n");.  }.  i
1e8b0 66 28 20 7a 44 62 3d 3d 30 20 29 7b 0a 20 20 20  f( zDb==0 ){.   
1e8c0 20 7a 53 63 68 65 6d 61 54 61 62 20 3d 20 73 71   zSchemaTab = sq
1e8d0 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 6d  lite3_mprintf("m
1e8e0 61 69 6e 2e 73 71 6c 69 74 65 5f 6d 61 73 74 65  ain.sqlite_maste
1e8f0 72 22 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  r");.  }else if(
1e900 20 73 74 72 63 6d 70 28 7a 44 62 2c 22 74 65 6d   strcmp(zDb,"tem
1e910 70 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 7a 53  p")==0 ){.    zS
1e920 63 68 65 6d 61 54 61 62 20 3d 20 73 71 6c 69 74  chemaTab = sqlit
1e930 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 22 2c  e3_mprintf("%s",
1e940 20 22 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d 61   "sqlite_temp_ma
1e950 73 74 65 72 22 29 3b 0a 20 20 7d 65 6c 73 65 7b  ster");.  }else{
1e960 0a 20 20 20 20 7a 53 63 68 65 6d 61 54 61 62 20  .    zSchemaTab 
1e970 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
1e980 66 28 22 5c 22 25 77 5c 22 2e 73 71 6c 69 74 65  f("\"%w\".sqlite
1e990 5f 6d 61 73 74 65 72 22 2c 20 7a 44 62 29 3b 0a  _master", zDb);.
1e9a0 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69    }.  for(i=0; i
1e9b0 3c 41 72 72 61 79 53 69 7a 65 28 61 51 75 65 72  <ArraySize(aQuer
1e9c0 79 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 68  y); i++){.    ch
1e9d0 61 72 20 2a 7a 53 71 6c 20 3d 20 73 71 6c 69 74  ar *zSql = sqlit
1e9e0 65 33 5f 6d 70 72 69 6e 74 66 28 61 51 75 65 72  e3_mprintf(aQuer
1e9f0 79 5b 69 5d 2e 7a 53 71 6c 2c 20 7a 53 63 68 65  y[i].zSql, zSche
1ea00 6d 61 54 61 62 29 3b 0a 20 20 20 20 69 6e 74 20  maTab);.    int 
1ea10 76 61 6c 20 3d 20 64 62 5f 69 6e 74 28 70 2c 20  val = db_int(p, 
1ea20 7a 53 71 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74  zSql);.    sqlit
1ea30 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20  e3_free(zSql);. 
1ea40 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70     utf8_printf(p
1ea50 2d 3e 6f 75 74 2c 20 22 25 2d 32 30 73 20 25 64  ->out, "%-20s %d
1ea60 5c 6e 22 2c 20 61 51 75 65 72 79 5b 69 5d 2e 7a  \n", aQuery[i].z
1ea70 4e 61 6d 65 2c 20 76 61 6c 29 3b 0a 20 20 7d 0a  Name, val);.  }.
1ea80 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
1ea90 53 63 68 65 6d 61 54 61 62 29 3b 0a 20 20 72 65  SchemaTab);.  re
1eaa0 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
1eab0 20 50 72 69 6e 74 20 74 68 65 20 63 75 72 72 65   Print the curre
1eac0 6e 74 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73  nt sqlite3_errms
1ead0 67 28 29 20 76 61 6c 75 65 20 74 6f 20 73 74 64  g() value to std
1eae0 65 72 72 20 61 6e 64 20 72 65 74 75 72 6e 20 31  err and return 1
1eaf0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1eb00 73 68 65 6c 6c 44 61 74 61 62 61 73 65 45 72 72  shellDatabaseErr
1eb10 6f 72 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  or(sqlite3 *db){
1eb20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
1eb30 45 72 72 20 3d 20 73 71 6c 69 74 65 33 5f 65 72  Err = sqlite3_er
1eb40 72 6d 73 67 28 64 62 29 3b 0a 20 20 75 74 66 38  rmsg(db);.  utf8
1eb50 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
1eb60 22 45 72 72 6f 72 3a 20 25 73 5c 6e 22 2c 20 7a  "Error: %s\n", z
1eb70 45 72 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 31  Err);.  return 1
1eb80 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74  ;.}../*.** Print
1eb90 20 61 6e 20 6f 75 74 2d 6f 66 2d 6d 65 6d 6f 72   an out-of-memor
1eba0 79 20 6d 65 73 73 61 67 65 20 74 6f 20 73 74 64  y message to std
1ebb0 65 72 72 20 61 6e 64 20 72 65 74 75 72 6e 20 31  err and return 1
1ebc0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1ebd0 73 68 65 6c 6c 4e 6f 6d 65 6d 45 72 72 6f 72 28  shellNomemError(
1ebe0 76 6f 69 64 29 7b 0a 20 20 72 61 77 5f 70 72 69  void){.  raw_pri
1ebf0 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72  ntf(stderr, "Err
1ec00 6f 72 3a 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72  or: out of memor
1ec10 79 5c 6e 22 29 3b 0a 20 20 72 65 74 75 72 6e 20  y\n");.  return 
1ec20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70  1;.}../*.** Comp
1ec30 61 72 65 20 74 68 65 20 70 61 74 74 65 72 6e 20  are the pattern 
1ec40 69 6e 20 7a 47 6c 6f 62 5b 5d 20 61 67 61 69 6e  in zGlob[] again
1ec50 73 74 20 74 68 65 20 74 65 78 74 20 69 6e 20 7a  st the text in z
1ec60 5b 5d 2e 20 20 52 65 74 75 72 6e 20 54 52 55 45  [].  Return TRUE
1ec70 0a 2a 2a 20 69 66 20 74 68 65 79 20 6d 61 74 63  .** if they matc
1ec80 68 20 61 6e 64 20 46 41 4c 53 45 20 28 30 29 20  h and FALSE (0) 
1ec90 69 66 20 74 68 65 79 20 64 6f 20 6e 6f 74 20 6d  if they do not m
1eca0 61 74 63 68 2e 0a 2a 2a 0a 2a 2a 20 47 6c 6f 62  atch..**.** Glob
1ecb0 62 69 6e 67 20 72 75 6c 65 73 3a 0a 2a 2a 0a 2a  bing rules:.**.*
1ecc0 2a 20 20 20 20 20 20 27 2a 27 20 20 20 20 20 20  *      '*'      
1ecd0 20 4d 61 74 63 68 65 73 20 61 6e 79 20 73 65 71   Matches any seq
1ece0 75 65 6e 63 65 20 6f 66 20 7a 65 72 6f 20 6f 72  uence of zero or
1ecf0 20 6d 6f 72 65 20 63 68 61 72 61 63 74 65 72 73   more characters
1ed00 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 27 3f 27  ..**.**      '?'
1ed10 20 20 20 20 20 20 20 4d 61 74 63 68 65 73 20 65         Matches e
1ed20 78 61 63 74 6c 79 20 6f 6e 65 20 63 68 61 72 61  xactly one chara
1ed30 63 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  cter..**.**     
1ed40 5b 2e 2e 2e 5d 20 20 20 20 20 20 4d 61 74 63 68  [...]      Match
1ed50 65 73 20 6f 6e 65 20 63 68 61 72 61 63 74 65 72  es one character
1ed60 20 66 72 6f 6d 20 74 68 65 20 65 6e 63 6c 6f 73   from the enclos
1ed70 65 64 20 6c 69 73 74 20 6f 66 0a 2a 2a 20 20 20  ed list of.**   
1ed80 20 20 20 20 20 20 20 20 20 20 20 20 20 63 68 61               cha
1ed90 72 61 63 74 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 20  racters..**.**  
1eda0 20 20 20 5b 5e 2e 2e 2e 5d 20 20 20 20 20 4d 61     [^...]     Ma
1edb0 74 63 68 65 73 20 6f 6e 65 20 63 68 61 72 61 63  tches one charac
1edc0 74 65 72 20 6e 6f 74 20 69 6e 20 74 68 65 20 65  ter not in the e
1edd0 6e 63 6c 6f 73 65 64 20 6c 69 73 74 2e 0a 2a 2a  nclosed list..**
1ede0 0a 2a 2a 20 20 20 20 20 20 27 23 27 20 20 20 20  .**      '#'    
1edf0 20 20 20 4d 61 74 63 68 65 73 20 61 6e 79 20 73     Matches any s
1ee00 65 71 75 65 6e 63 65 20 6f 66 20 6f 6e 65 20 6f  equence of one o
1ee10 72 20 6d 6f 72 65 20 64 69 67 69 74 73 20 77 69  r more digits wi
1ee20 74 68 20 61 6e 0a 2a 2a 20 20 20 20 20 20 20 20  th an.**        
1ee30 20 20 20 20 20 20 20 20 6f 70 74 69 6f 6e 61 6c          optional
1ee40 20 2b 20 6f 72 20 2d 20 73 69 67 6e 20 69 6e 20   + or - sign in 
1ee50 66 72 6f 6e 74 0a 2a 2a 0a 2a 2a 20 20 20 20 20  front.**.**     
1ee60 20 27 20 27 20 20 20 20 20 20 20 41 6e 79 20 73   ' '       Any s
1ee70 70 61 6e 20 6f 66 20 77 68 69 74 65 73 70 61 63  pan of whitespac
1ee80 65 20 6d 61 74 63 68 65 73 20 61 6e 79 20 6f 74  e matches any ot
1ee90 68 65 72 20 73 70 61 6e 20 6f 66 0a 2a 2a 20 20  her span of.**  
1eea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77 68                wh
1eeb0 69 74 65 73 70 61 63 65 2e 0a 2a 2a 0a 2a 2a 20  itespace..**.** 
1eec0 45 78 74 72 61 20 77 68 69 74 65 73 70 61 63 65  Extra whitespace
1eed0 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 7a   at the end of z
1eee0 5b 5d 20 69 73 20 69 67 6e 6f 72 65 64 2e 0a 2a  [] is ignored..*
1eef0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
1ef00 74 63 61 73 65 5f 67 6c 6f 62 28 63 6f 6e 73 74  tcase_glob(const
1ef10 20 63 68 61 72 20 2a 7a 47 6c 6f 62 2c 20 63 6f   char *zGlob, co
1ef20 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20  nst char *z){.  
1ef30 69 6e 74 20 63 2c 20 63 32 3b 0a 20 20 69 6e 74  int c, c2;.  int
1ef40 20 69 6e 76 65 72 74 3b 0a 20 20 69 6e 74 20 73   invert;.  int s
1ef50 65 65 6e 3b 0a 0a 20 20 77 68 69 6c 65 28 20 28  een;..  while( (
1ef60 63 20 3d 20 28 2a 28 7a 47 6c 6f 62 2b 2b 29 29  c = (*(zGlob++))
1ef70 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  )!=0 ){.    if( 
1ef80 49 73 53 70 61 63 65 28 63 29 20 29 7b 0a 20 20  IsSpace(c) ){.  
1ef90 20 20 20 20 69 66 28 20 21 49 73 53 70 61 63 65      if( !IsSpace
1efa0 28 2a 7a 29 20 29 20 72 65 74 75 72 6e 20 30 3b  (*z) ) return 0;
1efb0 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 49 73  .      while( Is
1efc0 53 70 61 63 65 28 2a 7a 47 6c 6f 62 29 20 29 20  Space(*zGlob) ) 
1efd0 7a 47 6c 6f 62 2b 2b 3b 0a 20 20 20 20 20 20 77  zGlob++;.      w
1efe0 68 69 6c 65 28 20 49 73 53 70 61 63 65 28 2a 7a  hile( IsSpace(*z
1eff0 29 20 29 20 7a 2b 2b 3b 0a 20 20 20 20 7d 65 6c  ) ) z++;.    }el
1f000 73 65 20 69 66 28 20 63 3d 3d 27 2a 27 20 29 7b  se if( c=='*' ){
1f010 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 28 63  .      while( (c
1f020 3d 28 2a 28 7a 47 6c 6f 62 2b 2b 29 29 29 20 3d  =(*(zGlob++))) =
1f030 3d 20 27 2a 27 20 7c 7c 20 63 3d 3d 27 3f 27 20  = '*' || c=='?' 
1f040 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63  ){.        if( c
1f050 3d 3d 27 3f 27 20 26 26 20 28 2a 28 7a 2b 2b 29  =='?' && (*(z++)
1f060 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  )==0 ) return 0;
1f070 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
1f080 66 28 20 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20  f( c==0 ){.     
1f090 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
1f0a0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d     }else if( c==
1f0b0 27 5b 27 20 29 7b 0a 20 20 20 20 20 20 20 20 77  '[' ){.        w
1f0c0 68 69 6c 65 28 20 2a 7a 20 26 26 20 74 65 73 74  hile( *z && test
1f0d0 63 61 73 65 5f 67 6c 6f 62 28 7a 47 6c 6f 62 2d  case_glob(zGlob-
1f0e0 31 2c 7a 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  1,z)==0 ){.     
1f0f0 20 20 20 20 20 7a 2b 2b 3b 0a 20 20 20 20 20 20       z++;.      
1f100 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65 74 75    }.        retu
1f110 72 6e 20 28 2a 7a 29 21 3d 30 3b 0a 20 20 20 20  rn (*z)!=0;.    
1f120 20 20 7d 0a 20 20 20 20 20 20 77 68 69 6c 65 28    }.      while(
1f130 20 28 63 32 20 3d 20 28 2a 28 7a 2b 2b 29 29 29   (c2 = (*(z++)))
1f140 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 77  !=0 ){.        w
1f150 68 69 6c 65 28 20 63 32 21 3d 63 20 29 7b 0a 20  hile( c2!=c ){. 
1f160 20 20 20 20 20 20 20 20 20 63 32 20 3d 20 2a 28           c2 = *(
1f170 7a 2b 2b 29 3b 0a 20 20 20 20 20 20 20 20 20 20  z++);.          
1f180 69 66 28 20 63 32 3d 3d 30 20 29 20 72 65 74 75  if( c2==0 ) retu
1f190 72 6e 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a  rn 0;.        }.
1f1a0 20 20 20 20 20 20 20 20 69 66 28 20 74 65 73 74          if( test
1f1b0 63 61 73 65 5f 67 6c 6f 62 28 7a 47 6c 6f 62 2c  case_glob(zGlob,
1f1c0 7a 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  z) ) return 1;. 
1f1d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74       }.      ret
1f1e0 75 72 6e 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  urn 0;.    }else
1f1f0 20 69 66 28 20 63 3d 3d 27 3f 27 20 29 7b 0a 20   if( c=='?' ){. 
1f200 20 20 20 20 20 69 66 28 20 28 2a 28 7a 2b 2b 29       if( (*(z++)
1f210 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  )==0 ) return 0;
1f220 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63  .    }else if( c
1f230 3d 3d 27 5b 27 20 29 7b 0a 20 20 20 20 20 20 69  =='[' ){.      i
1f240 6e 74 20 70 72 69 6f 72 5f 63 20 3d 20 30 3b 0a  nt prior_c = 0;.
1f250 20 20 20 20 20 20 73 65 65 6e 20 3d 20 30 3b 0a        seen = 0;.
1f260 20 20 20 20 20 20 69 6e 76 65 72 74 20 3d 20 30        invert = 0
1f270 3b 0a 20 20 20 20 20 20 63 20 3d 20 2a 28 7a 2b  ;.      c = *(z+
1f280 2b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 63 3d  +);.      if( c=
1f290 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
1f2a0 20 20 20 20 20 63 32 20 3d 20 2a 28 7a 47 6c 6f       c2 = *(zGlo
1f2b0 62 2b 2b 29 3b 0a 20 20 20 20 20 20 69 66 28 20  b++);.      if( 
1f2c0 63 32 3d 3d 27 5e 27 20 29 7b 0a 20 20 20 20 20  c2=='^' ){.     
1f2d0 20 20 20 69 6e 76 65 72 74 20 3d 20 31 3b 0a 20     invert = 1;. 
1f2e0 20 20 20 20 20 20 20 63 32 20 3d 20 2a 28 7a 47         c2 = *(zG
1f2f0 6c 6f 62 2b 2b 29 3b 0a 20 20 20 20 20 20 7d 0a  lob++);.      }.
1f300 20 20 20 20 20 20 69 66 28 20 63 32 3d 3d 27 5d        if( c2==']
1f310 27 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ' ){.        if(
1f320 20 63 3d 3d 27 5d 27 20 29 20 73 65 65 6e 20 3d   c==']' ) seen =
1f330 20 31 3b 0a 20 20 20 20 20 20 20 20 63 32 20 3d   1;.        c2 =
1f340 20 2a 28 7a 47 6c 6f 62 2b 2b 29 3b 0a 20 20 20   *(zGlob++);.   
1f350 20 20 20 7d 0a 20 20 20 20 20 20 77 68 69 6c 65     }.      while
1f360 28 20 63 32 20 26 26 20 63 32 21 3d 27 5d 27 20  ( c2 && c2!=']' 
1f370 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63  ){.        if( c
1f380 32 3d 3d 27 2d 27 20 26 26 20 7a 47 6c 6f 62 5b  2=='-' && zGlob[
1f390 30 5d 21 3d 27 5d 27 20 26 26 20 7a 47 6c 6f 62  0]!=']' && zGlob
1f3a0 5b 30 5d 21 3d 30 20 26 26 20 70 72 69 6f 72 5f  [0]!=0 && prior_
1f3b0 63 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  c>0 ){.         
1f3c0 20 63 32 20 3d 20 2a 28 7a 47 6c 6f 62 2b 2b 29   c2 = *(zGlob++)
1f3d0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
1f3e0 63 3e 3d 70 72 69 6f 72 5f 63 20 26 26 20 63 3c  c>=prior_c && c<
1f3f0 3d 63 32 20 29 20 73 65 65 6e 20 3d 20 31 3b 0a  =c2 ) seen = 1;.
1f400 20 20 20 20 20 20 20 20 20 20 70 72 69 6f 72 5f            prior_
1f410 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  c = 0;.        }
1f420 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
1f430 69 66 28 20 63 3d 3d 63 32 20 29 7b 0a 20 20 20  if( c==c2 ){.   
1f440 20 20 20 20 20 20 20 20 20 73 65 65 6e 20 3d 20           seen = 
1f450 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  1;.          }. 
1f460 20 20 20 20 20 20 20 20 20 70 72 69 6f 72 5f 63           prior_c
1f470 20 3d 20 63 32 3b 0a 20 20 20 20 20 20 20 20 7d   = c2;.        }
1f480 0a 20 20 20 20 20 20 20 20 63 32 20 3d 20 2a 28  .        c2 = *(
1f490 7a 47 6c 6f 62 2b 2b 29 3b 0a 20 20 20 20 20 20  zGlob++);.      
1f4a0 7d 0a 20 20 20 20 20 20 69 66 28 20 63 32 3d 3d  }.      if( c2==
1f4b0 30 20 7c 7c 20 28 73 65 65 6e 20 5e 20 69 6e 76  0 || (seen ^ inv
1f4c0 65 72 74 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  ert)==0 ) return
1f4d0 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66   0;.    }else if
1f4e0 28 20 63 3d 3d 27 23 27 20 29 7b 0a 20 20 20 20  ( c=='#' ){.    
1f4f0 20 20 69 66 28 20 28 7a 5b 30 5d 3d 3d 27 2d 27    if( (z[0]=='-'
1f500 20 7c 7c 20 7a 5b 30 5d 3d 3d 27 2b 27 29 20 26   || z[0]=='+') &
1f510 26 20 49 73 44 69 67 69 74 28 7a 5b 31 5d 29 20  & IsDigit(z[1]) 
1f520 29 20 7a 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28  ) z++;.      if(
1f530 20 21 49 73 44 69 67 69 74 28 7a 5b 30 5d 29 20   !IsDigit(z[0]) 
1f540 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20  ) return 0;.    
1f550 20 20 7a 2b 2b 3b 0a 20 20 20 20 20 20 77 68 69    z++;.      whi
1f560 6c 65 28 20 49 73 44 69 67 69 74 28 7a 5b 30 5d  le( IsDigit(z[0]
1f570 29 20 29 7b 20 7a 2b 2b 3b 20 7d 0a 20 20 20 20  ) ){ z++; }.    
1f580 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28  }else{.      if(
1f590 20 63 21 3d 28 2a 28 7a 2b 2b 29 29 20 29 20 72   c!=(*(z++)) ) r
1f5a0 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20  eturn 0;.    }. 
1f5b0 20 7d 0a 20 20 77 68 69 6c 65 28 20 49 73 53 70   }.  while( IsSp
1f5c0 61 63 65 28 2a 7a 29 20 29 7b 20 7a 2b 2b 3b 20  ace(*z) ){ z++; 
1f5d0 7d 0a 20 20 72 65 74 75 72 6e 20 2a 7a 3d 3d 30  }.  return *z==0
1f5e0 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70  ;.}.../*.** Comp
1f5f0 61 72 65 20 74 68 65 20 73 74 72 69 6e 67 20 61  are the string a
1f600 73 20 61 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65  s a command-line
1f610 20 6f 70 74 69 6f 6e 20 77 69 74 68 20 65 69 74   option with eit
1f620 68 65 72 20 6f 6e 65 20 6f 72 20 74 77 6f 0a 2a  her one or two.*
1f630 2a 20 69 6e 69 74 69 61 6c 20 22 2d 22 20 63 68  * initial "-" ch
1f640 61 72 61 63 74 65 72 73 2e 0a 2a 2f 0a 73 74 61  aracters..*/.sta
1f650 74 69 63 20 69 6e 74 20 6f 70 74 69 6f 6e 4d 61  tic int optionMa
1f660 74 63 68 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  tch(const char *
1f670 7a 53 74 72 2c 20 63 6f 6e 73 74 20 63 68 61 72  zStr, const char
1f680 20 2a 7a 4f 70 74 29 7b 0a 20 20 69 66 28 20 7a   *zOpt){.  if( z
1f690 53 74 72 5b 30 5d 21 3d 27 2d 27 20 29 20 72 65  Str[0]!='-' ) re
1f6a0 74 75 72 6e 20 30 3b 0a 20 20 7a 53 74 72 2b 2b  turn 0;.  zStr++
1f6b0 3b 0a 20 20 69 66 28 20 7a 53 74 72 5b 30 5d 3d  ;.  if( zStr[0]=
1f6c0 3d 27 2d 27 20 29 20 7a 53 74 72 2b 2b 3b 0a 20  ='-' ) zStr++;. 
1f6d0 20 72 65 74 75 72 6e 20 73 74 72 63 6d 70 28 7a   return strcmp(z
1f6e0 53 74 72 2c 20 7a 4f 70 74 29 3d 3d 30 3b 0a 7d  Str, zOpt)==0;.}
1f6f0 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61  ../*.** Delete a
1f700 20 66 69 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 68   file..*/.int sh
1f710 65 6c 6c 44 65 6c 65 74 65 46 69 6c 65 28 63 6f  ellDeleteFile(co
1f720 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  nst char *zFilen
1f730 61 6d 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ame){.  int rc;.
1f740 23 69 66 64 65 66 20 5f 57 49 4e 33 32 0a 20 20  #ifdef _WIN32.  
1f750 77 63 68 61 72 5f 74 20 2a 7a 20 3d 20 73 71 6c  wchar_t *z = sql
1f760 69 74 65 33 5f 77 69 6e 33 32 5f 75 74 66 38 5f  ite3_win32_utf8_
1f770 74 6f 5f 75 6e 69 63 6f 64 65 28 7a 46 69 6c 65  to_unicode(zFile
1f780 6e 61 6d 65 29 3b 0a 20 20 72 63 20 3d 20 5f 77  name);.  rc = _w
1f790 75 6e 6c 69 6e 6b 28 7a 29 3b 0a 20 20 73 71 6c  unlink(z);.  sql
1f7a0 69 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a 23 65  ite3_free(z);.#e
1f7b0 6c 73 65 0a 20 20 72 63 20 3d 20 75 6e 6c 69 6e  lse.  rc = unlin
1f7c0 6b 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 23 65  k(zFilename);.#e
1f7d0 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 72 63  ndif.  return rc
1f7e0 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ;.}.../*.** The 
1f7f0 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  implementation o
1f800 66 20 53 51 4c 20 73 63 61 6c 61 72 20 66 75 6e  f SQL scalar fun
1f810 63 74 69 6f 6e 20 66 6b 65 79 5f 63 6f 6c 6c 61  ction fkey_colla
1f820 74 65 5f 63 6c 61 75 73 65 28 29 2c 20 75 73 65  te_clause(), use
1f830 64 0a 2a 2a 20 62 79 20 74 68 65 20 22 2e 6c 69  d.** by the ".li
1f840 6e 74 20 66 6b 65 79 2d 69 6e 64 65 78 65 73 22  nt fkey-indexes"
1f850 20 63 6f 6d 6d 61 6e 64 2e 20 54 68 69 73 20 73   command. This s
1f860 63 61 6c 61 72 20 66 75 6e 63 74 69 6f 6e 20 69  calar function i
1f870 73 20 61 6c 77 61 79 73 0a 2a 2a 20 63 61 6c 6c  s always.** call
1f880 65 64 20 77 69 74 68 20 66 6f 75 72 20 61 72 67  ed with four arg
1f890 75 6d 65 6e 74 73 20 2d 20 74 68 65 20 70 61 72  uments - the par
1f8a0 65 6e 74 20 74 61 62 6c 65 20 6e 61 6d 65 2c 20  ent table name, 
1f8b0 74 68 65 20 70 61 72 65 6e 74 20 63 6f 6c 75 6d  the parent colum
1f8c0 6e 20 6e 61 6d 65 2c 0a 2a 2a 20 74 68 65 20 63  n name,.** the c
1f8d0 68 69 6c 64 20 74 61 62 6c 65 20 6e 61 6d 65 20  hild table name 
1f8e0 61 6e 64 20 74 68 65 20 63 68 69 6c 64 20 63 6f  and the child co
1f8f0 6c 75 6d 6e 20 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a  lumn name..**.**
1f900 20 20 20 66 6b 65 79 5f 63 6f 6c 6c 61 74 65 5f     fkey_collate_
1f910 63 6c 61 75 73 65 28 27 70 61 72 65 6e 74 2d 74  clause('parent-t
1f920 61 62 27 2c 20 27 70 61 72 65 6e 74 2d 63 6f 6c  ab', 'parent-col
1f930 27 2c 20 27 63 68 69 6c 64 2d 74 61 62 27 2c 20  ', 'child-tab', 
1f940 27 63 68 69 6c 64 2d 63 6f 6c 27 29 0a 2a 2a 0a  'child-col').**.
1f950 2a 2a 20 49 66 20 65 69 74 68 65 72 20 6f 66 20  ** If either of 
1f960 74 68 65 20 6e 61 6d 65 64 20 74 61 62 6c 65 73  the named tables
1f970 20 6f 72 20 63 6f 6c 75 6d 6e 73 20 64 6f 20 6e   or columns do n
1f980 6f 74 20 65 78 69 73 74 2c 20 74 68 69 73 20 66  ot exist, this f
1f990 75 6e 63 74 69 6f 6e 0a 2a 2a 20 72 65 74 75 72  unction.** retur
1f9a0 6e 73 20 61 6e 20 65 6d 70 74 79 20 73 74 72 69  ns an empty stri
1f9b0 6e 67 2e 20 41 6e 20 65 6d 70 74 79 20 73 74 72  ng. An empty str
1f9c0 69 6e 67 20 69 73 20 61 6c 73 6f 20 72 65 74 75  ing is also retu
1f9d0 72 6e 65 64 20 69 66 20 62 6f 74 68 20 74 61 62  rned if both tab
1f9e0 6c 65 73 0a 2a 2a 20 61 6e 64 20 63 6f 6c 75 6d  les.** and colum
1f9f0 6e 73 20 65 78 69 73 74 20 62 75 74 20 68 61 76  ns exist but hav
1fa00 65 20 74 68 65 20 73 61 6d 65 20 64 65 66 61 75  e the same defau
1fa10 6c 74 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  lt collation seq
1fa20 75 65 6e 63 65 2e 20 4f 72 2c 0a 2a 2a 20 69 66  uence. Or,.** if
1fa30 20 62 6f 74 68 20 65 78 69 73 74 20 62 75 74 20   both exist but 
1fa40 74 68 65 20 64 65 66 61 75 6c 74 20 63 6f 6c 6c  the default coll
1fa50 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 73 20  ation sequences 
1fa60 61 72 65 20 64 69 66 66 65 72 65 6e 74 2c 20 74  are different, t
1fa70 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  his.** function 
1fa80 72 65 74 75 72 6e 73 20 74 68 65 20 73 74 72 69  returns the stri
1fa90 6e 67 20 22 20 43 4f 4c 4c 41 54 45 20 3c 70 61  ng " COLLATE <pa
1faa0 72 65 6e 74 2d 63 6f 6c 6c 61 74 69 6f 6e 3e 22  rent-collation>"
1fab0 2c 20 77 68 65 72 65 0a 2a 2a 20 3c 70 61 72 65  , where.** <pare
1fac0 6e 74 2d 63 6f 6c 6c 61 74 69 6f 6e 3e 20 69 73  nt-collation> is
1fad0 20 74 68 65 20 64 65 66 61 75 6c 74 20 63 6f 6c   the default col
1fae0 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
1faf0 6f 66 20 74 68 65 20 70 61 72 65 6e 74 20 63 6f  of the parent co
1fb00 6c 75 6d 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lumn..*/.static 
1fb10 76 6f 69 64 20 73 68 65 6c 6c 46 6b 65 79 43 6f  void shellFkeyCo
1fb20 6c 6c 61 74 65 43 6c 61 75 73 65 28 0a 20 20 73  llateClause(.  s
1fb30 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
1fb40 70 43 74 78 2c 0a 20 20 69 6e 74 20 6e 56 61 6c  pCtx,.  int nVal
1fb50 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  ,.  sqlite3_valu
1fb60 65 20 2a 2a 61 70 56 61 6c 0a 29 7b 0a 20 20 73  e **apVal.){.  s
1fb70 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 73 71 6c  qlite3 *db = sql
1fb80 69 74 65 33 5f 63 6f 6e 74 65 78 74 5f 64 62 5f  ite3_context_db_
1fb90 68 61 6e 64 6c 65 28 70 43 74 78 29 3b 0a 20 20  handle(pCtx);.  
1fba0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 72  const char *zPar
1fbb0 65 6e 74 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  ent;.  const cha
1fbc0 72 20 2a 7a 50 61 72 65 6e 74 43 6f 6c 3b 0a 20  r *zParentCol;. 
1fbd0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61   const char *zPa
1fbe0 72 65 6e 74 53 65 71 3b 0a 20 20 63 6f 6e 73 74  rentSeq;.  const
1fbf0 20 63 68 61 72 20 2a 7a 43 68 69 6c 64 3b 0a 20   char *zChild;. 
1fc00 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 68   const char *zCh
1fc10 69 6c 64 43 6f 6c 3b 0a 20 20 63 6f 6e 73 74 20  ildCol;.  const 
1fc20 63 68 61 72 20 2a 7a 43 68 69 6c 64 53 65 71 20  char *zChildSeq 
1fc30 3d 20 30 3b 20 20 2f 2a 20 49 6e 69 74 69 61 6c  = 0;  /* Initial
1fc40 69 7a 65 20 74 6f 20 61 76 6f 69 64 20 66 61 6c  ize to avoid fal
1fc50 73 65 2d 70 6f 73 69 74 69 76 65 20 77 61 72 6e  se-positive warn
1fc60 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  ing */.  int rc;
1fc70 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 56 61 6c  ..  assert( nVal
1fc80 3d 3d 34 20 29 3b 0a 20 20 7a 50 61 72 65 6e 74  ==4 );.  zParent
1fc90 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29   = (const char*)
1fca0 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
1fcb0 78 74 28 61 70 56 61 6c 5b 30 5d 29 3b 0a 20 20  xt(apVal[0]);.  
1fcc0 7a 50 61 72 65 6e 74 43 6f 6c 20 3d 20 28 63 6f  zParentCol = (co
1fcd0 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65  nst char*)sqlite
1fce0 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 70 56  3_value_text(apV
1fcf0 61 6c 5b 31 5d 29 3b 0a 20 20 7a 43 68 69 6c 64  al[1]);.  zChild
1fd00 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29   = (const char*)
1fd10 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
1fd20 78 74 28 61 70 56 61 6c 5b 32 5d 29 3b 0a 20 20  xt(apVal[2]);.  
1fd30 7a 43 68 69 6c 64 43 6f 6c 20 3d 20 28 63 6f 6e  zChildCol = (con
1fd40 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33  st char*)sqlite3
1fd50 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 70 56 61  _value_text(apVa
1fd60 6c 5b 33 5d 29 3b 0a 0a 20 20 73 71 6c 69 74 65  l[3]);..  sqlite
1fd70 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 70 43  3_result_text(pC
1fd80 74 78 2c 20 22 22 2c 20 2d 31 2c 20 53 51 4c 49  tx, "", -1, SQLI
1fd90 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 72 63  TE_STATIC);.  rc
1fda0 20 3d 20 73 71 6c 69 74 65 33 5f 74 61 62 6c 65   = sqlite3_table
1fdb0 5f 63 6f 6c 75 6d 6e 5f 6d 65 74 61 64 61 74 61  _column_metadata
1fdc0 28 0a 20 20 20 20 20 20 64 62 2c 20 22 6d 61 69  (.      db, "mai
1fdd0 6e 22 2c 20 7a 50 61 72 65 6e 74 2c 20 7a 50 61  n", zParent, zPa
1fde0 72 65 6e 74 43 6f 6c 2c 20 30 2c 20 26 7a 50 61  rentCol, 0, &zPa
1fdf0 72 65 6e 74 53 65 71 2c 20 30 2c 20 30 2c 20 30  rentSeq, 0, 0, 0
1fe00 0a 20 20 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  .  );.  if( rc==
1fe10 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1fe20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 74 61   rc = sqlite3_ta
1fe30 62 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d 65 74 61 64  ble_column_metad
1fe40 61 74 61 28 0a 20 20 20 20 20 20 20 20 64 62 2c  ata(.        db,
1fe50 20 22 6d 61 69 6e 22 2c 20 7a 43 68 69 6c 64 2c   "main", zChild,
1fe60 20 7a 43 68 69 6c 64 43 6f 6c 2c 20 30 2c 20 26   zChildCol, 0, &
1fe70 7a 43 68 69 6c 64 53 65 71 2c 20 30 2c 20 30 2c  zChildSeq, 0, 0,
1fe80 20 30 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 0a 20   0.    );.  }.. 
1fe90 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1fea0 4f 4b 20 26 26 20 73 71 6c 69 74 65 33 5f 73 74  OK && sqlite3_st
1feb0 72 69 63 6d 70 28 7a 50 61 72 65 6e 74 53 65 71  ricmp(zParentSeq
1fec0 2c 20 7a 43 68 69 6c 64 53 65 71 29 20 29 7b 0a  , zChildSeq) ){.
1fed0 20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20 73 71      char *z = sq
1fee0 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 20  lite3_mprintf(" 
1fef0 43 4f 4c 4c 41 54 45 20 25 73 22 2c 20 7a 50 61  COLLATE %s", zPa
1ff00 72 65 6e 74 53 65 71 29 3b 0a 20 20 20 20 73 71  rentSeq);.    sq
1ff10 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78  lite3_result_tex
1ff20 74 28 70 43 74 78 2c 20 7a 2c 20 2d 31 2c 20 53  t(pCtx, z, -1, S
1ff30 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29  QLITE_TRANSIENT)
1ff40 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
1ff50 65 65 28 7a 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f  ee(z);.  }.}.../
1ff60 2a 0a 2a 2a 20 54 68 65 20 69 6d 70 6c 65 6d 65  *.** The impleme
1ff70 6e 74 61 74 69 6f 6e 20 6f 66 20 64 6f 74 2d 63  ntation of dot-c
1ff80 6f 6d 6d 61 6e 64 20 22 2e 6c 69 6e 74 20 66 6b  ommand ".lint fk
1ff90 65 79 2d 69 6e 64 65 78 65 73 22 2e 0a 2a 2f 0a  ey-indexes"..*/.
1ffa0 73 74 61 74 69 63 20 69 6e 74 20 6c 69 6e 74 46  static int lintF
1ffb0 6b 65 79 49 6e 64 65 78 65 73 28 0a 20 20 53 68  keyIndexes(.  Sh
1ffc0 65 6c 6c 53 74 61 74 65 20 2a 70 53 74 61 74 65  ellState *pState
1ffd0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
1ffe0 20 43 75 72 72 65 6e 74 20 73 68 65 6c 6c 20 74   Current shell t
1fff0 6f 6f 6c 20 73 74 61 74 65 20 2a 2f 0a 20 20 63  ool state */.  c
20000 68 61 72 20 2a 2a 61 7a 41 72 67 2c 20 20 20 20  har **azArg,    
20010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
20020 2a 20 41 72 72 61 79 20 6f 66 20 61 72 67 75 6d  * Array of argum
20030 65 6e 74 73 20 70 61 73 73 65 64 20 74 6f 20 64  ents passed to d
20040 6f 74 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  ot command */.  
20050 69 6e 74 20 6e 41 72 67 20 20 20 20 20 20 20 20  int nArg        
20060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20070 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74  /* Number of ent
20080 72 69 65 73 20 69 6e 20 61 7a 41 72 67 5b 5d 20  ries in azArg[] 
20090 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  */.){.  sqlite3 
200a0 2a 64 62 20 3d 20 70 53 74 61 74 65 2d 3e 64 62  *db = pState->db
200b0 3b 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62  ;       /* Datab
200c0 61 73 65 20 68 61 6e 64 6c 65 20 74 6f 20 71 75  ase handle to qu
200d0 65 72 79 20 22 6d 61 69 6e 22 20 64 62 20 6f 66  ery "main" db of
200e0 20 2a 2f 0a 20 20 46 49 4c 45 20 2a 6f 75 74 20   */.  FILE *out 
200f0 3d 20 70 53 74 61 74 65 2d 3e 6f 75 74 3b 20 20  = pState->out;  
20100 20 20 20 20 20 20 2f 2a 20 53 74 72 65 61 6d 20        /* Stream 
20110 74 6f 20 77 72 69 74 65 20 6e 6f 6e 2d 65 72 72  to write non-err
20120 6f 72 20 6f 75 74 70 75 74 20 74 6f 20 2a 2f 0a  or output to */.
20130 20 20 69 6e 74 20 62 56 65 72 62 6f 73 65 20 3d    int bVerbose =
20140 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
20150 20 20 2f 2a 20 49 66 20 2d 76 65 72 62 6f 73 65    /* If -verbose
20160 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20   is present */. 
20170 20 69 6e 74 20 62 47 72 6f 75 70 42 79 50 61 72   int bGroupByPar
20180 65 6e 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ent = 0;        
20190 20 2f 2a 20 49 66 20 2d 67 72 6f 75 70 62 79 70   /* If -groupbyp
201a0 61 72 65 6e 74 20 69 73 20 70 72 65 73 65 6e 74  arent is present
201b0 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20   */.  int i;    
201c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
201d0 20 20 20 20 20 20 2f 2a 20 54 6f 20 69 74 65 72        /* To iter
201e0 61 74 65 20 74 68 72 6f 75 67 68 20 61 7a 41 72  ate through azAr
201f0 67 5b 5d 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  g[] */.  const c
20200 68 61 72 20 2a 7a 49 6e 64 65 6e 74 20 3d 20 22  har *zIndent = "
20210 22 3b 20 20 20 20 20 20 20 2f 2a 20 48 6f 77 20  ";       /* How 
20220 6d 75 63 68 20 74 6f 20 69 6e 64 65 6e 74 20 43  much to indent C
20230 52 45 41 54 45 20 49 4e 44 45 58 20 62 79 20 2a  REATE INDEX by *
20240 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  /.  int rc;     
20250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20260 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
20270 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  de */.  sqlite3_
20280 73 74 6d 74 20 2a 70 53 71 6c 20 3d 20 30 3b 20  stmt *pSql = 0; 
20290 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 69          /* Compi
202a0 6c 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 53  led version of S
202b0 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 62 65 6c  QL statement bel
202c0 6f 77 20 2a 2f 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  ow */..  /*.  **
202d0 20 54 68 69 73 20 53 45 4c 45 43 54 20 73 74 61   This SELECT sta
202e0 74 65 6d 65 6e 74 20 72 65 74 75 72 6e 73 20 6f  tement returns o
202f0 6e 65 20 72 6f 77 20 66 6f 72 20 65 61 63 68 20  ne row for each 
20300 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73  foreign key cons
20310 74 72 61 69 6e 74 0a 20 20 2a 2a 20 69 6e 20 74  traint.  ** in t
20320 68 65 20 73 63 68 65 6d 61 20 6f 66 20 74 68 65  he schema of the
20330 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 2e 20   main database. 
20340 54 68 65 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65  The column value
20350 73 20 61 72 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  s are:.  **.  **
20360 20 30 2e 20 54 68 65 20 74 65 78 74 20 6f 66 20   0. The text of 
20370 61 6e 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  an SQL statement
20380 20 73 69 6d 69 6c 61 72 20 74 6f 3a 0a 20 20 2a   similar to:.  *
20390 2a 0a 20 20 2a 2a 20 20 20 20 20 20 22 45 58 50  *.  **      "EXP
203a0 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 20  LAIN QUERY PLAN 
203b0 53 45 4c 45 43 54 20 31 20 46 52 4f 4d 20 63 68  SELECT 1 FROM ch
203c0 69 6c 64 5f 74 61 62 6c 65 20 57 48 45 52 45 20  ild_table WHERE 
203d0 63 68 69 6c 64 5f 6b 65 79 3d 3f 22 0a 20 20 2a  child_key=?".  *
203e0 2a 0a 20 20 2a 2a 20 20 20 20 54 68 69 73 20 53  *.  **    This S
203f0 45 4c 45 43 54 20 69 73 20 73 69 6d 69 6c 61 72  ELECT is similar
20400 20 74 6f 20 74 68 65 20 6f 6e 65 20 74 68 61 74   to the one that
20410 20 74 68 65 20 66 6f 72 65 69 67 6e 20 6b 65 79   the foreign key
20420 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  s implementation
20430 0a 20 20 2a 2a 20 20 20 20 6e 65 65 64 73 20 74  .  **    needs t
20440 6f 20 72 75 6e 20 69 6e 74 65 72 6e 61 6c 6c 79  o run internally
20450 20 6f 6e 20 63 68 69 6c 64 20 74 61 62 6c 65 73   on child tables
20460 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6e  . If there is an
20470 20 69 6e 64 65 78 20 74 68 61 74 20 63 61 6e 0a   index that can.
20480 20 20 2a 2a 20 20 20 20 62 65 20 75 73 65 64 20    **    be used 
20490 74 6f 20 6f 70 74 69 6d 69 7a 65 20 74 68 69 73  to optimize this
204a0 20 71 75 65 72 79 2c 20 74 68 65 6e 20 69 74 20   query, then it 
204b0 63 61 6e 20 61 6c 73 6f 20 62 65 20 75 73 65 64  can also be used
204c0 20 62 79 20 74 68 65 20 46 4b 0a 20 20 2a 2a 20   by the FK.  ** 
204d0 20 20 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f     implementatio
204e0 6e 20 74 6f 20 6f 70 74 69 6d 69 7a 65 20 44 45  n to optimize DE
204f0 4c 45 54 45 20 6f 72 20 55 50 44 41 54 45 20 73  LETE or UPDATE s
20500 74 61 74 65 6d 65 6e 74 73 20 6f 6e 20 74 68 65  tatements on the
20510 20 70 61 72 65 6e 74 0a 20 20 2a 2a 20 20 20 20   parent.  **    
20520 74 61 62 6c 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  table..  **.  **
20530 20 31 2e 20 41 20 47 4c 4f 42 20 70 61 74 74 65   1. A GLOB patte
20540 72 6e 20 73 75 69 74 61 62 6c 65 20 66 6f 72 20  rn suitable for 
20550 73 71 6c 69 74 65 33 5f 73 74 72 67 6c 6f 62 28  sqlite3_strglob(
20560 29 2e 20 49 66 20 74 68 65 20 70 6c 61 6e 20 6f  ). If the plan o
20570 75 74 70 75 74 20 62 79 0a 20 20 2a 2a 20 20 20  utput by.  **   
20580 20 74 68 65 20 45 58 50 4c 41 49 4e 20 51 55 45   the EXPLAIN QUE
20590 52 59 20 50 4c 41 4e 20 63 6f 6d 6d 61 6e 64 20  RY PLAN command 
205a0 6d 61 74 63 68 65 73 20 74 68 69 73 20 70 61 74  matches this pat
205b0 74 65 72 6e 2c 20 74 68 65 6e 20 74 68 65 20 73  tern, then the s
205c0 63 68 65 6d 61 0a 20 20 2a 2a 20 20 20 20 63 6f  chema.  **    co
205d0 6e 74 61 69 6e 73 20 61 6e 20 69 6e 64 65 78 20  ntains an index 
205e0 74 68 61 74 20 63 61 6e 20 62 65 20 75 73 65 64  that can be used
205f0 20 74 6f 20 6f 70 74 69 6d 69 7a 65 20 74 68 65   to optimize the
20600 20 71 75 65 72 79 2e 0a 20 20 2a 2a 0a 20 20 2a   query..  **.  *
20610 2a 20 32 2e 20 48 75 6d 61 6e 20 72 65 61 64 61  * 2. Human reada
20620 62 6c 65 20 74 65 78 74 20 74 68 61 74 20 64 65  ble text that de
20630 73 63 72 69 62 65 73 20 74 68 65 20 63 68 69 6c  scribes the chil
20640 64 20 74 61 62 6c 65 20 61 6e 64 20 63 6f 6c 75  d table and colu
20650 6d 6e 73 2e 20 65 2e 67 2e 0a 20 20 2a 2a 0a 20  mns. e.g..  **. 
20660 20 2a 2a 20 20 20 20 20 20 20 22 63 68 69 6c 64   **       "child
20670 5f 74 61 62 6c 65 28 63 68 69 6c 64 5f 6b 65 79  _table(child_key
20680 31 2c 20 63 68 69 6c 64 5f 6b 65 79 32 29 22 0a  1, child_key2)".
20690 20 20 2a 2a 0a 20 20 2a 2a 20 33 2e 20 48 75 6d    **.  ** 3. Hum
206a0 61 6e 20 72 65 61 64 61 62 6c 65 20 74 65 78 74  an readable text
206b0 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20   that describes 
206c0 74 68 65 20 70 61 72 65 6e 74 20 74 61 62 6c 65  the parent table
206d0 20 61 6e 64 20 63 6f 6c 75 6d 6e 73 2e 20 65 2e   and columns. e.
206e0 67 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  g..  **.  **    
206f0 20 20 20 22 70 61 72 65 6e 74 5f 74 61 62 6c 65     "parent_table
20700 28 70 61 72 65 6e 74 5f 6b 65 79 31 2c 20 70 61  (parent_key1, pa
20710 72 65 6e 74 5f 6b 65 79 32 29 22 0a 20 20 2a 2a  rent_key2)".  **
20720 0a 20 20 2a 2a 20 34 2e 20 41 20 66 75 6c 6c 20  .  ** 4. A full 
20730 43 52 45 41 54 45 20 49 4e 44 45 58 20 73 74 61  CREATE INDEX sta
20740 74 65 6d 65 6e 74 20 66 6f 72 20 61 6e 20 69 6e  tement for an in
20750 64 65 78 20 74 68 61 74 20 63 6f 75 6c 64 20 62  dex that could b
20760 65 20 75 73 65 64 20 74 6f 0a 20 20 2a 2a 20 20  e used to.  **  
20770 20 20 6f 70 74 69 6d 69 7a 65 20 44 45 4c 45 54    optimize DELET
20780 45 20 6f 72 20 55 50 44 41 54 45 20 73 74 61 74  E or UPDATE stat
20790 65 6d 65 6e 74 73 20 6f 6e 20 74 68 65 20 70 61  ements on the pa
207a0 72 65 6e 74 20 74 61 62 6c 65 2e 20 65 2e 67 2e  rent table. e.g.
207b0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20  .  **.  **      
207c0 20 22 43 52 45 41 54 45 20 49 4e 44 45 58 20 63   "CREATE INDEX c
207d0 68 69 6c 64 5f 74 61 62 6c 65 5f 63 68 69 6c 64  hild_table_child
207e0 5f 6b 65 79 20 4f 4e 20 63 68 69 6c 64 5f 74 61  _key ON child_ta
207f0 62 6c 65 28 63 68 69 6c 64 5f 6b 65 79 29 22 0a  ble(child_key)".
20800 20 20 2a 2a 0a 20 20 2a 2a 20 35 2e 20 54 68 65    **.  ** 5. The
20810 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 70 61 72   name of the par
20820 65 6e 74 20 74 61 62 6c 65 2e 0a 20 20 2a 2a 0a  ent table..  **.
20830 20 20 2a 2a 20 54 68 65 73 65 20 73 69 78 20 76    ** These six v
20840 61 6c 75 65 73 20 61 72 65 20 75 73 65 64 20 62  alues are used b
20850 79 20 74 68 65 20 43 20 6c 6f 67 69 63 20 62 65  y the C logic be
20860 6c 6f 77 20 74 6f 20 67 65 6e 65 72 61 74 65 20  low to generate 
20870 74 68 65 20 72 65 70 6f 72 74 2e 0a 20 20 2a 2f  the report..  */
20880 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
20890 53 71 6c 20 3d 0a 20 20 22 53 45 4c 45 43 54 20  Sql =.  "SELECT 
208a0 22 0a 20 20 20 20 22 20 20 20 20 20 27 45 58 50  ".    "     'EXP
208b0 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 20  LAIN QUERY PLAN 
208c0 53 45 4c 45 43 54 20 31 20 46 52 4f 4d 20 27 20  SELECT 1 FROM ' 
208d0 7c 7c 20 71 75 6f 74 65 28 73 2e 6e 61 6d 65 29  || quote(s.name)
208e0 20 7c 7c 20 27 20 57 48 45 52 45 20 27 22 0a 20   || ' WHERE '". 
208f0 20 20 20 22 20 20 7c 7c 20 67 72 6f 75 70 5f 63     "  || group_c
20900 6f 6e 63 61 74 28 71 75 6f 74 65 28 73 2e 6e 61  oncat(quote(s.na
20910 6d 65 29 20 7c 7c 20 27 2e 27 20 7c 7c 20 71 75  me) || '.' || qu
20920 6f 74 65 28 66 2e 5b 66 72 6f 6d 5d 29 20 7c 7c  ote(f.[from]) ||
20930 20 27 3d 3f 27 20 22 0a 20 20 20 20 22 20 20 7c   '=?' ".    "  |
20940 7c 20 66 6b 65 79 5f 63 6f 6c 6c 61 74 65 5f 63  | fkey_collate_c
20950 6c 61 75 73 65 28 22 0a 20 20 20 20 22 20 20 20  lause(".    "   
20960 20 20 20 20 66 2e 5b 74 61 62 6c 65 5d 2c 20 43      f.[table], C
20970 4f 41 4c 45 53 43 45 28 66 2e 5b 74 6f 5d 2c 20  OALESCE(f.[to], 
20980 70 2e 5b 6e 61 6d 65 5d 29 2c 20 73 2e 6e 61 6d  p.[name]), s.nam
20990 65 2c 20 66 2e 5b 66 72 6f 6d 5d 29 2c 27 20 41  e, f.[from]),' A
209a0 4e 44 20 27 29 22 0a 20 20 20 20 22 2c 20 22 0a  ND ')".    ", ".
209b0 20 20 20 20 22 20 20 20 20 20 27 53 45 41 52 43      "     'SEARC
209c0 48 20 54 41 42 4c 45 20 27 20 7c 7c 20 73 2e 6e  H TABLE ' || s.n
209d0 61 6d 65 20 7c 7c 20 27 20 55 53 49 4e 47 20 43  ame || ' USING C
209e0 4f 56 45 52 49 4e 47 20 49 4e 44 45 58 2a 28 27  OVERING INDEX*('
209f0 22 0a 20 20 20 20 22 20 20 7c 7c 20 67 72 6f 75  ".    "  || grou
20a00 70 5f 63 6f 6e 63 61 74 28 27 2a 3d 3f 27 2c 20  p_concat('*=?', 
20a10 27 20 41 4e 44 20 27 29 20 7c 7c 20 27 29 27 22  ' AND ') || ')'"
20a20 0a 20 20 20 20 22 2c 20 22 0a 20 20 20 20 22 20  .    ", ".    " 
20a30 20 20 20 20 73 2e 6e 61 6d 65 20 20 7c 7c 20 27      s.name  || '
20a40 28 27 20 7c 7c 20 67 72 6f 75 70 5f 63 6f 6e 63  (' || group_conc
20a50 61 74 28 66 2e 5b 66 72 6f 6d 5d 2c 20 20 27 2c  at(f.[from],  ',
20a60 20 27 29 20 7c 7c 20 27 29 27 22 0a 20 20 20 20   ') || ')'".    
20a70 22 2c 20 22 0a 20 20 20 20 22 20 20 20 20 20 66  ", ".    "     f
20a80 2e 5b 74 61 62 6c 65 5d 20 7c 7c 20 27 28 27 20  .[table] || '(' 
20a90 7c 7c 20 67 72 6f 75 70 5f 63 6f 6e 63 61 74 28  || group_concat(
20aa0 43 4f 41 4c 45 53 43 45 28 66 2e 5b 74 6f 5d 2c  COALESCE(f.[to],
20ab0 20 70 2e 5b 6e 61 6d 65 5d 29 29 20 7c 7c 20 27   p.[name])) || '
20ac0 29 27 22 0a 20 20 20 20 22 2c 20 22 0a 20 20 20  )'".    ", ".   
20ad0 20 22 20 20 20 20 20 27 43 52 45 41 54 45 20 49   "     'CREATE I
20ae0 4e 44 45 58 20 27 20 7c 7c 20 71 75 6f 74 65 28  NDEX ' || quote(
20af0 73 2e 6e 61 6d 65 20 7c 7c 27 5f 27 7c 7c 20 67  s.name ||'_'|| g
20b00 72 6f 75 70 5f 63 6f 6e 63 61 74 28 66 2e 5b 66  roup_concat(f.[f
20b10 72 6f 6d 5d 2c 20 27 5f 27 29 29 22 0a 20 20 20  rom], '_'))".   
20b20 20 22 20 20 7c 7c 20 27 20 4f 4e 20 27 20 7c 7c   "  || ' ON ' ||
20b30 20 71 75 6f 74 65 28 73 2e 6e 61 6d 65 29 20 7c   quote(s.name) |
20b40 7c 20 27 28 27 22 0a 20 20 20 20 22 20 20 7c 7c  | '('".    "  ||
20b50 20 67 72 6f 75 70 5f 63 6f 6e 63 61 74 28 71 75   group_concat(qu
20b60 6f 74 65 28 66 2e 5b 66 72 6f 6d 5d 29 20 7c 7c  ote(f.[from]) ||
20b70 22 0a 20 20 20 20 22 20 20 20 20 20 20 20 20 66  ".    "        f
20b80 6b 65 79 5f 63 6f 6c 6c 61 74 65 5f 63 6c 61 75  key_collate_clau
20b90 73 65 28 22 0a 20 20 20 20 22 20 20 20 20 20 20  se(".    "      
20ba0 20 20 20 20 66 2e 5b 74 61 62 6c 65 5d 2c 20 43      f.[table], C
20bb0 4f 41 4c 45 53 43 45 28 66 2e 5b 74 6f 5d 2c 20  OALESCE(f.[to], 
20bc0 70 2e 5b 6e 61 6d 65 5d 29 2c 20 73 2e 6e 61 6d  p.[name]), s.nam
20bd0 65 2c 20 66 2e 5b 66 72 6f 6d 5d 29 2c 20 27 2c  e, f.[from]), ',
20be0 20 27 29 22 0a 20 20 20 20 22 20 20 7c 7c 20 27   ')".    "  || '
20bf0 29 3b 27 22 0a 20 20 20 20 22 2c 20 22 0a 20 20  );'".    ", ".  
20c00 20 20 22 20 20 20 20 20 66 2e 5b 74 61 62 6c 65    "     f.[table
20c10 5d 20 22 0a 20 20 20 20 22 46 52 4f 4d 20 73 71  ] ".    "FROM sq
20c20 6c 69 74 65 5f 6d 61 73 74 65 72 20 41 53 20 73  lite_master AS s
20c30 2c 20 70 72 61 67 6d 61 5f 66 6f 72 65 69 67 6e  , pragma_foreign
20c40 5f 6b 65 79 5f 6c 69 73 74 28 73 2e 6e 61 6d 65  _key_list(s.name
20c50 29 20 41 53 20 66 20 22 0a 20 20 20 20 22 4c 45  ) AS f ".    "LE
20c60 46 54 20 4a 4f 49 4e 20 70 72 61 67 6d 61 5f 74  FT JOIN pragma_t
20c70 61 62 6c 65 5f 69 6e 66 6f 20 41 53 20 70 20 4f  able_info AS p O
20c80 4e 20 28 70 6b 2d 31 3d 73 65 71 20 41 4e 44 20  N (pk-1=seq AND 
20c90 70 2e 61 72 67 3d 66 2e 5b 74 61 62 6c 65 5d 29  p.arg=f.[table])
20ca0 20 22 0a 20 20 20 20 22 47 52 4f 55 50 20 42 59   ".    "GROUP BY
20cb0 20 73 2e 6e 61 6d 65 2c 20 66 2e 69 64 20 22 0a   s.name, f.id ".
20cc0 20 20 20 20 22 4f 52 44 45 52 20 42 59 20 28 43      "ORDER BY (C
20cd0 41 53 45 20 57 48 45 4e 20 3f 20 54 48 45 4e 20  ASE WHEN ? THEN 
20ce0 66 2e 5b 74 61 62 6c 65 5d 20 45 4c 53 45 20 73  f.[table] ELSE s
20cf0 2e 6e 61 6d 65 20 45 4e 44 29 22 0a 20 20 3b 0a  .name END)".  ;.
20d00 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 47    const char *zG
20d10 6c 6f 62 49 50 4b 20 3d 20 22 53 45 41 52 43 48  lobIPK = "SEARCH
20d20 20 54 41 42 4c 45 20 2a 20 55 53 49 4e 47 20 49   TABLE * USING I
20d30 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
20d40 45 59 20 28 72 6f 77 69 64 3d 3f 29 22 3b 0a 0a  EY (rowid=?)";..
20d50 20 20 66 6f 72 28 69 3d 32 3b 20 69 3c 6e 41 72    for(i=2; i<nAr
20d60 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74  g; i++){.    int
20d70 20 6e 20 3d 20 73 74 72 6c 65 6e 33 30 28 61 7a   n = strlen30(az
20d80 41 72 67 5b 69 5d 29 3b 0a 20 20 20 20 69 66 28  Arg[i]);.    if(
20d90 20 6e 3e 31 20 26 26 20 73 71 6c 69 74 65 33 5f   n>1 && sqlite3_
20da0 73 74 72 6e 69 63 6d 70 28 22 2d 76 65 72 62 6f  strnicmp("-verbo
20db0 73 65 22 2c 20 61 7a 41 72 67 5b 69 5d 2c 20 6e  se", azArg[i], n
20dc0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 62 56  )==0 ){.      bV
20dd0 65 72 62 6f 73 65 20 3d 20 31 3b 0a 20 20 20 20  erbose = 1;.    
20de0 7d 0a 20 20 20 20 65 6c 73 65 20 69 66 28 20 6e  }.    else if( n
20df0 3e 31 20 26 26 20 73 71 6c 69 74 65 33 5f 73 74  >1 && sqlite3_st
20e00 72 6e 69 63 6d 70 28 22 2d 67 72 6f 75 70 62 79  rnicmp("-groupby
20e10 70 61 72 65 6e 74 22 2c 20 61 7a 41 72 67 5b 69  parent", azArg[i
20e20 5d 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ], n)==0 ){.    
20e30 20 20 62 47 72 6f 75 70 42 79 50 61 72 65 6e 74    bGroupByParent
20e40 20 3d 20 31 3b 0a 20 20 20 20 20 20 7a 49 6e 64   = 1;.      zInd
20e50 65 6e 74 20 3d 20 22 20 20 20 20 22 3b 0a 20 20  ent = "    ";.  
20e60 20 20 7d 0a 20 20 20 20 65 6c 73 65 7b 0a 20 20    }.    else{.  
20e70 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73      raw_printf(s
20e80 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20 25  tderr, "Usage: %
20e90 73 20 25 73 20 3f 2d 76 65 72 62 6f 73 65 3f 20  s %s ?-verbose? 
20ea0 3f 2d 67 72 6f 75 70 62 79 70 61 72 65 6e 74 3f  ?-groupbyparent?
20eb0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 61  \n",.          a
20ec0 7a 41 72 67 5b 30 5d 2c 20 61 7a 41 72 67 5b 31  zArg[0], azArg[1
20ed0 5d 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20  ].      );.     
20ee0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
20ef0 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  RROR;.    }.  }.
20f00 0a 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 74  .  /* Register t
20f10 68 65 20 66 6b 65 79 5f 63 6f 6c 6c 61 74 65 5f  he fkey_collate_
20f20 63 6c 61 75 73 65 28 29 20 53 51 4c 20 66 75 6e  clause() SQL fun
20f30 63 74 69 6f 6e 20 2a 2f 0a 20 20 72 63 20 3d 20  ction */.  rc = 
20f40 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
20f50 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22 66 6b 65  unction(db, "fke
20f60 79 5f 63 6f 6c 6c 61 74 65 5f 63 6c 61 75 73 65  y_collate_clause
20f70 22 2c 20 34 2c 20 53 51 4c 49 54 45 5f 55 54 46  ", 4, SQLITE_UTF
20f80 38 2c 0a 20 20 20 20 20 20 30 2c 20 73 68 65 6c  8,.      0, shel
20f90 6c 46 6b 65 79 43 6f 6c 6c 61 74 65 43 6c 61 75  lFkeyCollateClau
20fa0 73 65 2c 20 30 2c 20 30 0a 20 20 29 3b 0a 0a 0a  se, 0, 0.  );...
20fb0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
20fc0 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
20fd0 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f  sqlite3_prepare_
20fe0 76 32 28 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c  v2(db, zSql, -1,
20ff0 20 26 70 53 71 6c 2c 20 30 29 3b 0a 20 20 7d 0a   &pSql, 0);.  }.
21000 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
21010 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  _OK ){.    sqlit
21020 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70 53 71 6c  e3_bind_int(pSql
21030 2c 20 31 2c 20 62 47 72 6f 75 70 42 79 50 61 72  , 1, bGroupByPar
21040 65 6e 74 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  ent);.  }..  if(
21050 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
21060 7b 0a 20 20 20 20 69 6e 74 20 72 63 32 3b 0a 20  {.    int rc2;. 
21070 20 20 20 63 68 61 72 20 2a 7a 50 72 65 76 20 3d     char *zPrev =
21080 20 30 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 53   0;.    while( S
21090 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74  QLITE_ROW==sqlit
210a0 65 33 5f 73 74 65 70 28 70 53 71 6c 29 20 29 7b  e3_step(pSql) ){
210b0 0a 20 20 20 20 20 20 69 6e 74 20 72 65 73 20 3d  .      int res =
210c0 20 2d 31 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   -1;.      sqlit
210d0 65 33 5f 73 74 6d 74 20 2a 70 45 78 70 6c 61 69  e3_stmt *pExplai
210e0 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 63 6f 6e  n = 0;.      con
210f0 73 74 20 63 68 61 72 20 2a 7a 45 51 50 20 3d 20  st char *zEQP = 
21100 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c  (const char*)sql
21110 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  ite3_column_text
21120 28 70 53 71 6c 2c 20 30 29 3b 0a 20 20 20 20 20  (pSql, 0);.     
21130 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 47 6c   const char *zGl
21140 6f 62 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  ob = (const char
21150 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  *)sqlite3_column
21160 5f 74 65 78 74 28 70 53 71 6c 2c 20 31 29 3b 0a  _text(pSql, 1);.
21170 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
21180 20 2a 7a 46 72 6f 6d 20 3d 20 28 63 6f 6e 73 74   *zFrom = (const
21190 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63   char*)sqlite3_c
211a0 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 71 6c 2c  olumn_text(pSql,
211b0 20 32 29 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74   2);.      const
211c0 20 63 68 61 72 20 2a 7a 54 61 72 67 65 74 20 3d   char *zTarget =
211d0 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71   (const char*)sq
211e0 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
211f0 74 28 70 53 71 6c 2c 20 33 29 3b 0a 20 20 20 20  t(pSql, 3);.    
21200 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43    const char *zC
21210 49 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a  I = (const char*
21220 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  )sqlite3_column_
21230 74 65 78 74 28 70 53 71 6c 2c 20 34 29 3b 0a 20  text(pSql, 4);. 
21240 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
21250 2a 7a 50 61 72 65 6e 74 20 3d 20 28 63 6f 6e 73  *zParent = (cons
21260 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f  t char*)sqlite3_
21270 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 71 6c  column_text(pSql
21280 2c 20 35 29 3b 0a 0a 20 20 20 20 20 20 72 63 20  , 5);..      rc 
21290 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72  = sqlite3_prepar
212a0 65 5f 76 32 28 64 62 2c 20 7a 45 51 50 2c 20 2d  e_v2(db, zEQP, -
212b0 31 2c 20 26 70 45 78 70 6c 61 69 6e 2c 20 30 29  1, &pExplain, 0)
212c0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
212d0 53 51 4c 49 54 45 5f 4f 4b 20 29 20 62 72 65 61  SQLITE_OK ) brea
212e0 6b 3b 0a 20 20 20 20 20 20 69 66 28 20 53 51 4c  k;.      if( SQL
212f0 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33  ITE_ROW==sqlite3
21300 5f 73 74 65 70 28 70 45 78 70 6c 61 69 6e 29 20  _step(pExplain) 
21310 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74  ){.        const
21320 20 63 68 61 72 20 2a 7a 50 6c 61 6e 20 3d 20 28   char *zPlan = (
21330 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69  const char*)sqli
21340 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28  te3_column_text(
21350 70 45 78 70 6c 61 69 6e 2c 20 33 29 3b 0a 20 20  pExplain, 3);.  
21360 20 20 20 20 20 20 72 65 73 20 3d 20 28 0a 20 20        res = (.  
21370 20 20 20 20 20 20 20 20 20 20 20 20 30 3d 3d 73              0==s
21380 71 6c 69 74 65 33 5f 73 74 72 67 6c 6f 62 28 7a  qlite3_strglob(z
21390 47 6c 6f 62 2c 20 7a 50 6c 61 6e 29 0a 20 20 20  Glob, zPlan).   
213a0 20 20 20 20 20 20 20 20 7c 7c 20 30 3d 3d 73 71          || 0==sq
213b0 6c 69 74 65 33 5f 73 74 72 67 6c 6f 62 28 7a 47  lite3_strglob(zG
213c0 6c 6f 62 49 50 4b 2c 20 7a 50 6c 61 6e 29 0a 20  lobIPK, zPlan). 
213d0 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
213e0 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  }.      rc = sql
213f0 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 45  ite3_finalize(pE
21400 78 70 6c 61 69 6e 29 3b 0a 20 20 20 20 20 20 69  xplain);.      i
21410 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
21420 20 29 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20   ) break;..     
21430 20 69 66 28 20 72 65 73 3c 30 20 29 7b 0a 20 20   if( res<0 ){.  
21440 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
21450 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a  (stderr, "Error:
21460 20 69 6e 74 65 72 6e 61 6c 20 65 72 72 6f 72 22   internal error"
21470 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
21480 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
21490 20 20 20 20 20 20 20 69 66 28 20 62 47 72 6f 75         if( bGrou
214a0 70 42 79 50 61 72 65 6e 74 0a 20 20 20 20 20 20  pByParent.      
214b0 20 20 26 26 20 28 62 56 65 72 62 6f 73 65 20 7c    && (bVerbose |
214c0 7c 20 72 65 73 3d 3d 30 29 0a 20 20 20 20 20 20  | res==0).      
214d0 20 20 26 26 20 28 7a 50 72 65 76 3d 3d 30 20 7c    && (zPrev==0 |
214e0 7c 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d  | sqlite3_stricm
214f0 70 28 7a 50 61 72 65 6e 74 2c 20 7a 50 72 65 76  p(zParent, zPrev
21500 29 29 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20  )).        ){.  
21510 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e          raw_prin
21520 74 66 28 6f 75 74 2c 20 22 2d 2d 20 50 61 72 65  tf(out, "-- Pare
21530 6e 74 20 74 61 62 6c 65 20 25 73 5c 6e 22 2c 20  nt table %s\n", 
21540 7a 50 61 72 65 6e 74 29 3b 0a 20 20 20 20 20 20  zParent);.      
21550 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
21560 28 7a 50 72 65 76 29 3b 0a 20 20 20 20 20 20 20  (zPrev);.       
21570 20 20 20 7a 50 72 65 76 20 3d 20 73 71 6c 69 74     zPrev = sqlit
21580 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 22 2c  e3_mprintf("%s",
21590 20 7a 50 61 72 65 6e 74 29 3b 0a 20 20 20 20 20   zParent);.     
215a0 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 69 66     }..        if
215b0 28 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20  ( res==0 ){.    
215c0 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
215d0 28 6f 75 74 2c 20 22 25 73 25 73 20 2d 2d 3e 20  (out, "%s%s --> 
215e0 25 73 5c 6e 22 2c 20 7a 49 6e 64 65 6e 74 2c 20  %s\n", zIndent, 
215f0 7a 43 49 2c 20 7a 54 61 72 67 65 74 29 3b 0a 20  zCI, zTarget);. 
21600 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
21610 20 62 56 65 72 62 6f 73 65 20 29 7b 0a 20 20 20   bVerbose ){.   
21620 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74         raw_print
21630 66 28 6f 75 74 2c 20 22 25 73 2f 2a 20 6e 6f 20  f(out, "%s/* no 
21640 65 78 74 72 61 20 69 6e 64 65 78 65 73 20 72 65  extra indexes re
21650 71 75 69 72 65 64 20 66 6f 72 20 25 73 20 2d 3e  quired for %s ->
21660 20 25 73 20 2a 2f 5c 6e 22 2c 0a 20 20 20 20 20   %s */\n",.     
21670 20 20 20 20 20 20 20 20 20 7a 49 6e 64 65 6e 74           zIndent
21680 2c 20 7a 46 72 6f 6d 2c 20 7a 54 61 72 67 65 74  , zFrom, zTarget
21690 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20  .          );.  
216a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
216b0 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
216c0 33 5f 66 72 65 65 28 7a 50 72 65 76 29 3b 0a 0a  3_free(zPrev);..
216d0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
216e0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
216f0 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  aw_printf(stderr
21700 2c 20 22 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65  , "%s\n", sqlite
21710 33 5f 65 72 72 6d 73 67 28 64 62 29 29 3b 0a 20  3_errmsg(db));. 
21720 20 20 20 7d 0a 0a 20 20 20 20 72 63 32 20 3d 20     }..    rc2 = 
21730 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
21740 28 70 53 71 6c 29 3b 0a 20 20 20 20 69 66 28 20  (pSql);.    if( 
21750 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
21760 20 72 63 32 21 3d 53 51 4c 49 54 45 5f 4f 4b 20   rc2!=SQLITE_OK 
21770 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 72 63  ){.      rc = rc
21780 32 3b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69  2;.      raw_pri
21790 6e 74 66 28 73 74 64 65 72 72 2c 20 22 25 73 5c  ntf(stderr, "%s\
217a0 6e 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d  n", sqlite3_errm
217b0 73 67 28 64 62 29 29 3b 0a 20 20 20 20 7d 0a 20  sg(db));.    }. 
217c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 61 77 5f   }else{.    raw_
217d0 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
217e0 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f 65  %s\n", sqlite3_e
217f0 72 72 6d 73 67 28 64 62 29 29 3b 0a 20 20 7d 0a  rrmsg(db));.  }.
21800 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
21810 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74  ./*.** Implement
21820 61 74 69 6f 6e 20 6f 66 20 22 2e 6c 69 6e 74 22  ation of ".lint"
21830 20 64 6f 74 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f   dot command..*/
21840 0a 73 74 61 74 69 63 20 69 6e 74 20 6c 69 6e 74  .static int lint
21850 44 6f 74 43 6f 6d 6d 61 6e 64 28 0a 20 20 53 68  DotCommand(.  Sh
21860 65 6c 6c 53 74 61 74 65 20 2a 70 53 74 61 74 65  ellState *pState
21870 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
21880 20 43 75 72 72 65 6e 74 20 73 68 65 6c 6c 20 74   Current shell t
21890 6f 6f 6c 20 73 74 61 74 65 20 2a 2f 0a 20 20 63  ool state */.  c
218a0 68 61 72 20 2a 2a 61 7a 41 72 67 2c 20 20 20 20  har **azArg,    
218b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
218c0 2a 20 41 72 72 61 79 20 6f 66 20 61 72 67 75 6d  * Array of argum
218d0 65 6e 74 73 20 70 61 73 73 65 64 20 74 6f 20 64  ents passed to d
218e0 6f 74 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  ot command */.  
218f0 69 6e 74 20 6e 41 72 67 20 20 20 20 20 20 20 20  int nArg        
21900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21910 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74  /* Number of ent
21920 72 69 65 73 20 69 6e 20 61 7a 41 72 67 5b 5d 20  ries in azArg[] 
21930 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20  */.){.  int n;. 
21940 20 6e 20 3d 20 28 6e 41 72 67 3e 3d 32 20 3f 20   n = (nArg>=2 ? 
21950 73 74 72 6c 65 6e 33 30 28 61 7a 41 72 67 5b 31  strlen30(azArg[1
21960 5d 29 20 3a 20 30 29 3b 0a 20 20 69 66 28 20 6e  ]) : 0);.  if( n
21970 3c 31 20 7c 7c 20 73 71 6c 69 74 65 33 5f 73 74  <1 || sqlite3_st
21980 72 6e 69 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c  rnicmp(azArg[1],
21990 20 22 66 6b 65 79 2d 69 6e 64 65 78 65 73 22 2c   "fkey-indexes",
219a0 20 6e 29 20 29 20 67 6f 74 6f 20 75 73 61 67 65   n) ) goto usage
219b0 3b 0a 20 20 72 65 74 75 72 6e 20 6c 69 6e 74 46  ;.  return lintF
219c0 6b 65 79 49 6e 64 65 78 65 73 28 70 53 74 61 74  keyIndexes(pStat
219d0 65 2c 20 61 7a 41 72 67 2c 20 6e 41 72 67 29 3b  e, azArg, nArg);
219e0 0a 0a 20 75 73 61 67 65 3a 0a 20 20 72 61 77 5f  .. usage:.  raw_
219f0 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
21a00 55 73 61 67 65 20 25 73 20 73 75 62 2d 63 6f 6d  Usage %s sub-com
21a10 6d 61 6e 64 20 3f 73 77 69 74 63 68 65 73 2e 2e  mand ?switches..
21a20 2e 3f 5c 6e 22 2c 20 61 7a 41 72 67 5b 30 5d 29  .?\n", azArg[0])
21a30 3b 0a 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73  ;.  raw_printf(s
21a40 74 64 65 72 72 2c 20 22 57 68 65 72 65 20 73 75  tderr, "Where su
21a50 62 2d 63 6f 6d 6d 61 6e 64 73 20 61 72 65 3a 5c  b-commands are:\
21a60 6e 22 29 3b 0a 20 20 72 61 77 5f 70 72 69 6e 74  n");.  raw_print
21a70 66 28 73 74 64 65 72 72 2c 20 22 20 20 20 20 66  f(stderr, "    f
21a80 6b 65 79 2d 69 6e 64 65 78 65 73 5c 6e 22 29 3b  key-indexes\n");
21a90 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
21aa0 5f 45 52 52 4f 52 3b 0a 7d 0a 0a 23 69 66 20 21  _ERROR;.}..#if !
21ab0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
21ac0 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
21ad0 29 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c  ) && defined(SQL
21ae0 49 54 45 5f 48 41 56 45 5f 5a 4c 49 42 29 0a 2f  ITE_HAVE_ZLIB)./
21af0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
21b00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
21b10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
21b20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
21b30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
21b40 2a 0a 2a 2a 20 54 68 65 20 22 2e 61 72 63 68 69  *.** The ".archi
21b50 76 65 22 20 6f 72 20 22 2e 61 72 22 20 63 6f 6d  ve" or ".ar" com
21b60 6d 61 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  mand..*/.static 
21b70 76 6f 69 64 20 73 68 65 6c 6c 50 72 65 70 61 72  void shellPrepar
21b80 65 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  e(.  sqlite3 *db
21b90 2c 20 0a 20 20 69 6e 74 20 2a 70 52 63 2c 20 0a  , .  int *pRc, .
21ba0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53    const char *zS
21bb0 71 6c 2c 20 0a 20 20 73 71 6c 69 74 65 33 5f 73  ql, .  sqlite3_s
21bc0 74 6d 74 20 2a 2a 70 70 53 74 6d 74 0a 29 7b 0a  tmt **ppStmt.){.
21bd0 20 20 2a 70 70 53 74 6d 74 20 3d 20 30 3b 0a 20    *ppStmt = 0;. 
21be0 20 69 66 28 20 2a 70 52 63 3d 3d 53 51 4c 49 54   if( *pRc==SQLIT
21bf0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20  E_OK ){.    int 
21c00 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65  rc = sqlite3_pre
21c10 70 61 72 65 5f 76 32 28 64 62 2c 20 7a 53 71 6c  pare_v2(db, zSql
21c20 2c 20 2d 31 2c 20 70 70 53 74 6d 74 2c 20 30 29  , -1, ppStmt, 0)
21c30 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
21c40 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
21c50 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65   raw_printf(stde
21c60 72 72 2c 20 22 73 71 6c 20 65 72 72 6f 72 3a 20  rr, "sql error: 
21c70 25 73 20 28 25 64 29 5c 6e 22 2c 20 0a 20 20 20  %s (%d)\n", .   
21c80 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65         sqlite3_e
21c90 72 72 6d 73 67 28 64 62 29 2c 20 73 71 6c 69 74  rrmsg(db), sqlit
21ca0 65 33 5f 65 72 72 63 6f 64 65 28 64 62 29 0a 20  e3_errcode(db). 
21cb0 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 2a 70       );.      *p
21cc0 52 63 20 3d 20 72 63 3b 0a 20 20 20 20 7d 0a 20  Rc = rc;.    }. 
21cd0 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69   }.}..static voi
21ce0 64 20 73 68 65 6c 6c 50 72 65 70 61 72 65 50 72  d shellPreparePr
21cf0 69 6e 74 66 28 0a 20 20 73 71 6c 69 74 65 33 20  intf(.  sqlite3 
21d00 2a 64 62 2c 20 0a 20 20 69 6e 74 20 2a 70 52 63  *db, .  int *pRc
21d10 2c 20 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  , .  sqlite3_stm
21d20 74 20 2a 2a 70 70 53 74 6d 74 2c 0a 20 20 63 6f  t **ppStmt,.  co
21d30 6e 73 74 20 63 68 61 72 20 2a 7a 46 6d 74 2c 20  nst char *zFmt, 
21d40 0a 20 20 2e 2e 2e 0a 29 7b 0a 20 20 2a 70 70 53  .  ....){.  *ppS
21d50 74 6d 74 20 3d 20 30 3b 0a 20 20 69 66 28 20 2a  tmt = 0;.  if( *
21d60 70 52 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  pRc==SQLITE_OK )
21d70 7b 0a 20 20 20 20 76 61 5f 6c 69 73 74 20 61 70  {.    va_list ap
21d80 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 3b 0a 20  ;.    char *z;. 
21d90 20 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20     va_start(ap, 
21da0 7a 46 6d 74 29 3b 0a 20 20 20 20 7a 20 3d 20 73  zFmt);.    z = s
21db0 71 6c 69 74 65 33 5f 76 6d 70 72 69 6e 74 66 28  qlite3_vmprintf(
21dc0 7a 46 6d 74 2c 20 61 70 29 3b 0a 20 20 20 20 69  zFmt, ap);.    i
21dd0 66 28 20 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 20  f( z==0 ){.     
21de0 20 2a 70 52 63 20 3d 20 53 51 4c 49 54 45 5f 4e   *pRc = SQLITE_N
21df0 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  OMEM;.    }else{
21e00 0a 20 20 20 20 20 20 73 68 65 6c 6c 50 72 65 70  .      shellPrep
21e10 61 72 65 28 64 62 2c 20 70 52 63 2c 20 7a 2c 20  are(db, pRc, z, 
21e20 70 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 73  ppStmt);.      s
21e30 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a  qlite3_free(z);.
21e40 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 73 74 61      }.  }.}..sta
21e50 74 69 63 20 76 6f 69 64 20 73 68 65 6c 6c 46 69  tic void shellFi
21e60 6e 61 6c 69 7a 65 28 0a 20 20 69 6e 74 20 2a 70  nalize(.  int *p
21e70 52 63 2c 20 0a 20 20 73 71 6c 69 74 65 33 5f 73  Rc, .  sqlite3_s
21e80 74 6d 74 20 2a 70 53 74 6d 74 0a 29 7b 0a 20 20  tmt *pStmt.){.  
21e90 69 66 28 20 70 53 74 6d 74 20 29 7b 0a 20 20 20  if( pStmt ){.   
21ea0 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 73   sqlite3 *db = s
21eb0 71 6c 69 74 65 33 5f 64 62 5f 68 61 6e 64 6c 65  qlite3_db_handle
21ec0 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 69 6e 74  (pStmt);.    int
21ed0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69   rc = sqlite3_fi
21ee0 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20  nalize(pStmt);. 
21ef0 20 20 20 69 66 28 20 2a 70 52 63 3d 3d 53 51 4c     if( *pRc==SQL
21f00 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
21f10 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
21f20 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 61 77  K ){.        raw
21f30 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
21f40 22 53 51 4c 20 65 72 72 6f 72 3a 20 25 73 5c 6e  "SQL error: %s\n
21f50 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73  ", sqlite3_errms
21f60 67 28 64 62 29 29 3b 0a 20 20 20 20 20 20 7d 0a  g(db));.      }.
21f70 20 20 20 20 20 20 2a 70 52 63 20 3d 20 72 63 3b        *pRc = rc;
21f80 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 73 74  .    }.  }.}..st
21f90 61 74 69 63 20 76 6f 69 64 20 73 68 65 6c 6c 52  atic void shellR
21fa0 65 73 65 74 28 0a 20 20 69 6e 74 20 2a 70 52 63  eset(.  int *pRc
21fb0 2c 20 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  , .  sqlite3_stm
21fc0 74 20 2a 70 53 74 6d 74 0a 29 7b 0a 20 20 69 6e  t *pStmt.){.  in
21fd0 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72  t rc = sqlite3_r
21fe0 65 73 65 74 28 70 53 74 6d 74 29 3b 0a 20 20 69  eset(pStmt);.  i
21ff0 66 28 20 2a 70 52 63 3d 3d 53 51 4c 49 54 45 5f  f( *pRc==SQLITE_
22000 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 72 63  OK ){.    if( rc
22010 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
22020 20 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62       sqlite3 *db
22030 20 3d 20 73 71 6c 69 74 65 33 5f 64 62 5f 68 61   = sqlite3_db_ha
22040 6e 64 6c 65 28 70 53 74 6d 74 29 3b 0a 20 20 20  ndle(pStmt);.   
22050 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74     raw_printf(st
22060 64 65 72 72 2c 20 22 53 51 4c 20 65 72 72 6f 72  derr, "SQL error
22070 3a 20 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65 33  : %s\n", sqlite3
22080 5f 65 72 72 6d 73 67 28 64 62 29 29 3b 0a 20 20  _errmsg(db));.  
22090 20 20 7d 0a 20 20 20 20 2a 70 52 63 20 3d 20 72    }.    *pRc = r
220a0 63 3b 0a 20 20 7d 0a 7d 0a 2f 2a 0a 2a 2a 20 53  c;.  }.}./*.** S
220b0 74 72 75 63 74 75 72 65 20 72 65 70 72 65 73 65  tructure represe
220c0 6e 74 69 6e 67 20 61 20 73 69 6e 67 6c 65 20 22  nting a single "
220d0 2e 61 72 22 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f  .ar" command..*/
220e0 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
220f0 41 72 43 6f 6d 6d 61 6e 64 20 41 72 43 6f 6d 6d  ArCommand ArComm
22100 61 6e 64 3b 0a 73 74 72 75 63 74 20 41 72 43 6f  and;.struct ArCo
22110 6d 6d 61 6e 64 20 7b 0a 20 20 75 38 20 65 43 6d  mmand {.  u8 eCm
22120 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
22130 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20            /* An 
22140 41 52 5f 43 4d 44 5f 2a 20 76 61 6c 75 65 20 2a  AR_CMD_* value *
22150 2f 0a 20 20 75 38 20 62 56 65 72 62 6f 73 65 3b  /.  u8 bVerbose;
22160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22170 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 2d      /* True if -
22180 2d 76 65 72 62 6f 73 65 20 2a 2f 0a 20 20 75 38  -verbose */.  u8
22190 20 62 5a 69 70 3b 20 20 20 20 20 20 20 20 20 20   bZip;          
221a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
221b0 20 54 72 75 65 20 69 66 20 74 68 65 20 61 72 63   True if the arc
221c0 68 69 76 65 20 69 73 20 61 20 5a 49 50 20 2a 2f  hive is a ZIP */
221d0 0a 20 20 75 38 20 62 44 72 79 52 75 6e 3b 20 20  .  u8 bDryRun;  
221e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
221f0 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 2d 2d     /* True if --
22200 64 72 79 2d 72 75 6e 20 2a 2f 0a 20 20 75 38 20  dry-run */.  u8 
22210 62 41 70 70 65 6e 64 3b 20 20 20 20 20 20 20 20  bAppend;        
22220 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
22230 54 72 75 65 20 69 66 20 2d 2d 61 70 70 65 6e 64  True if --append
22240 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 72 67 3b 20   */.  int nArg; 
22250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22260 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
22270 6f 66 20 63 6f 6d 6d 61 6e 64 20 61 72 67 75 6d  of command argum
22280 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ents */.  char *
22290 7a 53 72 63 54 61 62 6c 65 3b 20 20 20 20 20 20  zSrcTable;      
222a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 22 73 71            /* "sq
222b0 6c 61 72 22 2c 20 22 7a 69 70 66 69 6c 65 28 24  lar", "zipfile($
222c0 66 69 6c 65 29 22 20 6f 72 20 22 7a 69 70 22 20  file)" or "zip" 
222d0 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
222e0 2a 7a 46 69 6c 65 3b 20 20 20 20 20 20 20 20 20  *zFile;         
222f0 20 20 20 20 20 2f 2a 20 2d 2d 66 69 6c 65 20 61       /* --file a
22300 72 67 75 6d 65 6e 74 2c 20 6f 72 20 4e 55 4c 4c  rgument, or NULL
22310 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
22320 20 2a 7a 44 69 72 3b 20 20 20 20 20 20 20 20 20   *zDir;         
22330 20 20 20 20 20 20 2f 2a 20 2d 2d 64 69 72 65 63        /* --direc
22340 74 6f 72 79 20 61 72 67 75 6d 65 6e 74 2c 20 6f  tory argument, o
22350 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 63 68 61 72  r NULL */.  char
22360 20 2a 2a 61 7a 41 72 67 3b 20 20 20 20 20 20 20   **azArg;       
22370 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
22380 72 72 61 79 20 6f 66 20 63 6f 6d 6d 61 6e 64 20  rray of command 
22390 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 53  arguments */.  S
223a0 68 65 6c 6c 53 74 61 74 65 20 2a 70 3b 20 20 20  hellState *p;   
223b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
223c0 2a 20 53 68 65 6c 6c 20 73 74 61 74 65 20 2a 2f  * Shell state */
223d0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20  .  sqlite3 *db; 
223e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
223f0 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63     /* Database c
22400 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 61 72  ontaining the ar
22410 63 68 69 76 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a  chive */.};../*.
22420 2a 2a 20 50 72 69 6e 74 20 61 20 75 73 61 67 65  ** Print a usage
22430 20 6d 65 73 73 61 67 65 20 66 6f 72 20 74 68 65   message for the
22440 20 2e 61 72 20 63 6f 6d 6d 61 6e 64 20 74 6f 20   .ar command to 
22450 73 74 64 65 72 72 20 61 6e 64 20 72 65 74 75 72  stderr and retur
22460 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2e 0a  n SQLITE_ERROR..
22470 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 72  */.static int ar
22480 55 73 61 67 65 28 46 49 4c 45 20 2a 66 29 7b 0a  Usage(FILE *f){.
22490 20 20 72 61 77 5f 70 72 69 6e 74 66 28 66 2c 0a    raw_printf(f,.
224a0 22 5c 6e 22 0a 22 55 73 61 67 65 3a 20 2e 61 72  "\n"."Usage: .ar
224b0 20 5b 4f 50 54 49 4f 4e 2e 2e 2e 5d 20 5b 46 49   [OPTION...] [FI
224c0 4c 45 2e 2e 2e 5d 5c 6e 22 0a 22 54 68 65 20 2e  LE...]\n"."The .
224d0 61 72 20 63 6f 6d 6d 61 6e 64 20 6d 61 6e 61 67  ar command manag
224e0 65 73 20 73 71 6c 61 72 20 61 72 63 68 69 76 65  es sqlar archive
224f0 73 2e 5c 6e 22 0a 22 5c 6e 22 0a 22 45 78 61 6d  s.\n"."\n"."Exam
22500 70 6c 65 73 3a 5c 6e 22 0a 22 20 20 2e 61 72 20  ples:\n"."  .ar 
22510 2d 63 66 20 61 72 63 68 69 76 65 2e 73 61 72 20  -cf archive.sar 
22520 66 6f 6f 20 62 61 72 20 20 20 20 23 20 43 72 65  foo bar    # Cre
22530 61 74 65 20 61 72 63 68 69 76 65 2e 73 61 72 20  ate archive.sar 
22540 66 72 6f 6d 20 66 69 6c 65 73 20 66 6f 6f 20 61  from files foo a
22550 6e 64 20 62 61 72 5c 6e 22 0a 22 20 20 2e 61 72  nd bar\n"."  .ar
22560 20 2d 74 66 20 61 72 63 68 69 76 65 2e 73 61 72   -tf archive.sar
22570 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4c 69              # Li
22580 73 74 20 6d 65 6d 62 65 72 73 20 6f 66 20 61 72  st members of ar
22590 63 68 69 76 65 2e 73 61 72 5c 6e 22 0a 22 20 20  chive.sar\n"."  
225a0 2e 61 72 20 2d 78 76 66 20 61 72 63 68 69 76 65  .ar -xvf archive
225b0 2e 73 61 72 20 20 20 20 20 20 20 20 20 20 20 23  .sar           #
225c0 20 56 65 72 62 6f 73 65 6c 79 20 65 78 74 72 61   Verbosely extra
225d0 63 74 20 66 69 6c 65 73 20 66 72 6f 6d 20 61 72  ct files from ar
225e0 63 68 69 76 65 2e 73 61 72 5c 6e 22 0a 22 5c 6e  chive.sar\n"."\n
225f0 22 0a 22 45 61 63 68 20 63 6f 6d 6d 61 6e 64 20  "."Each command 
22600 6c 69 6e 65 20 6d 75 73 74 20 66 65 61 74 75 72  line must featur
22610 65 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 63 6f  e exactly one co
22620 6d 6d 61 6e 64 20 6f 70 74 69 6f 6e 3a 5c 6e 22  mmand option:\n"
22630 0a 22 20 20 2d 63 2c 20 2d 2d 63 72 65 61 74 65  ."  -c, --create
22640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 43                 C
22650 72 65 61 74 65 20 61 20 6e 65 77 20 61 72 63 68  reate a new arch
22660 69 76 65 5c 6e 22 0a 22 20 20 2d 75 2c 20 2d 2d  ive\n"."  -u, --
22670 75 70 64 61 74 65 20 20 20 20 20 20 20 20 20 20  update          
22680 20 20 20 20 20 55 70 64 61 74 65 20 6f 72 20 61       Update or a
22690 64 64 20 66 69 6c 65 73 20 74 6f 20 61 6e 20 65  dd files to an e
226a0 78 69 73 74 69 6e 67 20 61 72 63 68 69 76 65 5c  xisting archive\
226b0 6e 22 0a 22 20 20 2d 74 2c 20 2d 2d 6c 69 73 74  n"."  -t, --list
226c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
226d0 20 4c 69 73 74 20 63 6f 6e 74 65 6e 74 73 20 6f   List contents o
226e0 66 20 61 72 63 68 69 76 65 5c 6e 22 0a 22 20 20  f archive\n"."  
226f0 2d 78 2c 20 2d 2d 65 78 74 72 61 63 74 20 20 20  -x, --extract   
22700 20 20 20 20 20 20 20 20 20 20 20 45 78 74 72 61             Extra
22710 63 74 20 66 69 6c 65 73 20 66 72 6f 6d 20 61 72  ct files from ar
22720 63 68 69 76 65 5c 6e 22 0a 22 5c 6e 22 0a 22 41  chive\n"."\n"."A
22730 6e 64 20 7a 65 72 6f 20 6f 72 20 6d 6f 72 65 20  nd zero or more 
22740 6f 70 74 69 6f 6e 61 6c 20 6f 70 74 69 6f 6e 73  optional options
22750 3a 5c 6e 22 0a 22 20 20 2d 76 2c 20 2d 2d 76 65  :\n"."  -v, --ve
22760 72 62 6f 73 65 20 20 20 20 20 20 20 20 20 20 20  rbose           
22770 20 20 20 50 72 69 6e 74 20 65 61 63 68 20 66 69     Print each fi
22780 6c 65 6e 61 6d 65 20 61 73 20 69 74 20 69 73 20  lename as it is 
22790 70 72 6f 63 65 73 73 65 64 5c 6e 22 0a 22 20 20  processed\n"."  
227a0 2d 66 20 46 49 4c 45 2c 20 2d 2d 66 69 6c 65 20  -f FILE, --file 
227b0 46 49 4c 45 20 20 20 20 20 20 20 4f 70 65 72 61  FILE       Opera
227c0 74 65 20 6f 6e 20 61 72 63 68 69 76 65 20 46 49  te on archive FI
227d0 4c 45 20 28 64 65 66 61 75 6c 74 20 69 73 20 63  LE (default is c
227e0 75 72 72 65 6e 74 20 64 62 29 5c 6e 22 0a 22 20  urrent db)\n"." 
227f0 20 2d 61 20 46 49 4c 45 2c 20 2d 2d 61 70 70 65   -a FILE, --appe
22800 6e 64 20 46 49 4c 45 20 20 20 20 20 4f 70 65 72  nd FILE     Oper
22810 61 74 65 20 6f 6e 20 46 49 4c 45 20 6f 70 65 6e  ate on FILE open
22820 65 64 20 75 73 69 6e 67 20 74 68 65 20 61 70 6e  ed using the apn
22830 64 76 66 73 20 56 46 53 5c 6e 22 0a 22 20 20 2d  dvfs VFS\n"."  -
22840 43 20 44 49 52 2c 20 2d 2d 64 69 72 65 63 74 6f  C DIR, --directo
22850 72 79 20 44 49 52 20 20 20 20 43 68 61 6e 67 65  ry DIR    Change
22860 20 74 6f 20 64 69 72 65 63 74 6f 72 79 20 44 49   to directory DI
22870 52 20 74 6f 20 72 65 61 64 2f 65 78 74 72 61 63  R to read/extrac
22880 74 20 66 69 6c 65 73 5c 6e 22 0a 22 20 20 2d 6e  t files\n"."  -n
22890 2c 20 2d 2d 64 72 79 72 75 6e 20 20 20 20 20 20  , --dryrun      
228a0 20 20 20 20 20 20 20 20 20 53 68 6f 77 20 74 68           Show th
228b0 65 20 53 51 4c 20 74 68 61 74 20 77 6f 75 6c 64  e SQL that would
228c0 20 68 61 76 65 20 6f 63 63 75 72 72 65 64 5c 6e   have occurred\n
228d0 22 0a 22 5c 6e 22 0a 22 53 65 65 20 61 6c 73 6f  "."\n"."See also
228e0 3a 20 68 74 74 70 3a 2f 2f 73 71 6c 69 74 65 2e  : http://sqlite.
228f0 6f 72 67 2f 63 6c 69 2e 68 74 6d 6c 23 73 71 6c  org/cli.html#sql
22900 61 72 5f 61 72 63 68 69 76 65 5f 73 75 70 70 6f  ar_archive_suppo
22910 72 74 5c 6e 22 0a 22 5c 6e 22 0a 29 3b 0a 20 20  rt\n"."\n".);.  
22920 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
22930 52 4f 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72  ROR;.}../*.** Pr
22940 69 6e 74 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  int an error mes
22950 73 61 67 65 20 66 6f 72 20 74 68 65 20 2e 61 72  sage for the .ar
22960 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 73 74 64 65   command to stde
22970 72 72 20 61 6e 64 20 72 65 74 75 72 6e 20 0a 2a  rr and return .*
22980 2a 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2e 0a  * SQLITE_ERROR..
22990 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 72  */.static int ar
229a0 45 72 72 6f 72 4d 73 67 28 63 6f 6e 73 74 20 63  ErrorMsg(const c
229b0 68 61 72 20 2a 7a 46 6d 74 2c 20 2e 2e 2e 29 7b  har *zFmt, ...){
229c0 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20  .  va_list ap;. 
229d0 20 63 68 61 72 20 2a 7a 3b 0a 20 20 76 61 5f 73   char *z;.  va_s
229e0 74 61 72 74 28 61 70 2c 20 7a 46 6d 74 29 3b 0a  tart(ap, zFmt);.
229f0 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 76 6d    z = sqlite3_vm
22a00 70 72 69 6e 74 66 28 7a 46 6d 74 2c 20 61 70 29  printf(zFmt, ap)
22a10 3b 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a  ;.  va_end(ap);.
22a20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64    raw_printf(std
22a30 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 25 73 20  err, "Error: %s 
22a40 28 74 72 79 20 5c 22 2e 61 72 20 2d 2d 68 65 6c  (try \".ar --hel
22a50 70 5c 22 29 5c 6e 22 2c 20 7a 29 3b 0a 20 20 73  p\")\n", z);.  s
22a60 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a  qlite3_free(z);.
22a70 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
22a80 45 52 52 4f 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ERROR;.}../*.** 
22a90 56 61 6c 75 65 73 20 66 6f 72 20 41 72 43 6f 6d  Values for ArCom
22aa0 6d 61 6e 64 2e 65 43 6d 64 2e 0a 2a 2f 0a 23 64  mand.eCmd..*/.#d
22ab0 65 66 69 6e 65 20 41 52 5f 43 4d 44 5f 43 52 45  efine AR_CMD_CRE
22ac0 41 54 45 20 20 20 20 20 20 20 31 0a 23 64 65 66  ATE       1.#def
22ad0 69 6e 65 20 41 52 5f 43 4d 44 5f 45 58 54 52 41  ine AR_CMD_EXTRA
22ae0 43 54 20 20 20 20 20 20 32 0a 23 64 65 66 69 6e  CT      2.#defin
22af0 65 20 41 52 5f 43 4d 44 5f 4c 49 53 54 20 20 20  e AR_CMD_LIST   
22b00 20 20 20 20 20 20 33 0a 23 64 65 66 69 6e 65 20        3.#define 
22b10 41 52 5f 43 4d 44 5f 55 50 44 41 54 45 20 20 20  AR_CMD_UPDATE   
22b20 20 20 20 20 34 0a 23 64 65 66 69 6e 65 20 41 52      4.#define AR
22b30 5f 43 4d 44 5f 48 45 4c 50 20 20 20 20 20 20 20  _CMD_HELP       
22b40 20 20 35 0a 0a 2f 2a 0a 2a 2a 20 4f 74 68 65 72    5../*.** Other
22b50 20 28 6e 6f 6e 2d 63 6f 6d 6d 61 6e 64 29 20 73   (non-command) s
22b60 77 69 74 63 68 65 73 2e 0a 2a 2f 0a 23 64 65 66  witches..*/.#def
22b70 69 6e 65 20 41 52 5f 53 57 49 54 43 48 5f 56 45  ine AR_SWITCH_VE
22b80 52 42 4f 53 45 20 20 20 20 20 36 0a 23 64 65 66  RBOSE     6.#def
22b90 69 6e 65 20 41 52 5f 53 57 49 54 43 48 5f 46 49  ine AR_SWITCH_FI
22ba0 4c 45 20 20 20 20 20 20 20 20 37 0a 23 64 65 66  LE        7.#def
22bb0 69 6e 65 20 41 52 5f 53 57 49 54 43 48 5f 44 49  ine AR_SWITCH_DI
22bc0 52 45 43 54 4f 52 59 20 20 20 38 0a 23 64 65 66  RECTORY   8.#def
22bd0 69 6e 65 20 41 52 5f 53 57 49 54 43 48 5f 41 50  ine AR_SWITCH_AP
22be0 50 45 4e 44 20 20 20 20 20 20 39 0a 23 64 65 66  PEND      9.#def
22bf0 69 6e 65 20 41 52 5f 53 57 49 54 43 48 5f 44 52  ine AR_SWITCH_DR
22c00 59 52 55 4e 20 20 20 20 20 31 30 0a 0a 73 74 61  YRUN     10..sta
22c10 74 69 63 20 69 6e 74 20 61 72 50 72 6f 63 65 73  tic int arProces
22c20 73 53 77 69 74 63 68 28 41 72 43 6f 6d 6d 61 6e  sSwitch(ArComman
22c30 64 20 2a 70 41 72 2c 20 69 6e 74 20 65 53 77 69  d *pAr, int eSwi
22c40 74 63 68 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  tch, const char 
22c50 2a 7a 41 72 67 29 7b 0a 20 20 73 77 69 74 63 68  *zArg){.  switch
22c60 28 20 65 53 77 69 74 63 68 20 29 7b 0a 20 20 20  ( eSwitch ){.   
22c70 20 63 61 73 65 20 41 52 5f 43 4d 44 5f 43 52 45   case AR_CMD_CRE
22c80 41 54 45 3a 0a 20 20 20 20 63 61 73 65 20 41 52  ATE:.    case AR
22c90 5f 43 4d 44 5f 45 58 54 52 41 43 54 3a 0a 20 20  _CMD_EXTRACT:.  
22ca0 20 20 63 61 73 65 20 41 52 5f 43 4d 44 5f 4c 49    case AR_CMD_LI
22cb0 53 54 3a 0a 20 20 20 20 63 61 73 65 20 41 52 5f  ST:.    case AR_
22cc0 43 4d 44 5f 55 50 44 41 54 45 3a 0a 20 20 20 20  CMD_UPDATE:.    
22cd0 63 61 73 65 20 41 52 5f 43 4d 44 5f 48 45 4c 50  case AR_CMD_HELP
22ce0 3a 0a 20 20 20 20 20 20 69 66 28 20 70 41 72 2d  :.      if( pAr-
22cf0 3e 65 43 6d 64 20 29 7b 0a 20 20 20 20 20 20 20  >eCmd ){.       
22d00 20 72 65 74 75 72 6e 20 61 72 45 72 72 6f 72 4d   return arErrorM
22d10 73 67 28 22 6d 75 6c 74 69 70 6c 65 20 63 6f 6d  sg("multiple com
22d20 6d 61 6e 64 20 6f 70 74 69 6f 6e 73 22 29 3b 0a  mand options");.
22d30 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 41        }.      pA
22d40 72 2d 3e 65 43 6d 64 20 3d 20 65 53 77 69 74 63  r->eCmd = eSwitc
22d50 68 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  h;.      break;.
22d60 0a 20 20 20 20 63 61 73 65 20 41 52 5f 53 57 49  .    case AR_SWI
22d70 54 43 48 5f 44 52 59 52 55 4e 3a 0a 20 20 20 20  TCH_DRYRUN:.    
22d80 20 20 70 41 72 2d 3e 62 44 72 79 52 75 6e 20 3d    pAr->bDryRun =
22d90 20 31 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   1;.      break;
22da0 0a 20 20 20 20 63 61 73 65 20 41 52 5f 53 57 49  .    case AR_SWI
22db0 54 43 48 5f 56 45 52 42 4f 53 45 3a 0a 20 20 20  TCH_VERBOSE:.   
22dc0 20 20 20 70 41 72 2d 3e 62 56 65 72 62 6f 73 65     pAr->bVerbose
22dd0 20 3d 20 31 3b 0a 20 20 20 20 20 20 62 72 65 61   = 1;.      brea
22de0 6b 3b 0a 20 20 20 20 63 61 73 65 20 41 52 5f 53  k;.    case AR_S
22df0 57 49 54 43 48 5f 41 50 50 45 4e 44 3a 0a 20 20  WITCH_APPEND:.  
22e00 20 20 20 20 70 41 72 2d 3e 62 41 70 70 65 6e 64      pAr->bAppend
22e10 20 3d 20 31 3b 0a 20 20 20 20 20 20 2f 2a 20 46   = 1;.      /* F
22e20 61 6c 6c 20 74 68 72 75 20 69 6e 74 6f 20 2d 2d  all thru into --
22e30 66 69 6c 65 20 2a 2f 0a 20 20 20 20 63 61 73 65  file */.    case
22e40 20 41 52 5f 53 57 49 54 43 48 5f 46 49 4c 45 3a   AR_SWITCH_FILE:
22e50 0a 20 20 20 20 20 20 70 41 72 2d 3e 7a 46 69 6c  .      pAr->zFil
22e60 65 20 3d 20 7a 41 72 67 3b 0a 20 20 20 20 20 20  e = zArg;.      
22e70 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
22e80 41 52 5f 53 57 49 54 43 48 5f 44 49 52 45 43 54  AR_SWITCH_DIRECT
22e90 4f 52 59 3a 0a 20 20 20 20 20 20 70 41 72 2d 3e  ORY:.      pAr->
22ea0 7a 44 69 72 20 3d 20 7a 41 72 67 3b 0a 20 20 20  zDir = zArg;.   
22eb0 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20     break;.  }.. 
22ec0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
22ed0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 73  K;.}../*.** Pars
22ee0 65 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69  e the command li
22ef0 6e 65 20 66 6f 72 20 61 6e 20 22 2e 61 72 22 20  ne for an ".ar" 
22f00 63 6f 6d 6d 61 6e 64 2e 20 54 68 65 20 72 65 73  command. The res
22f10 75 6c 74 73 20 61 72 65 20 77 72 69 74 74 65 6e  ults are written
22f20 20 69 6e 74 6f 0a 2a 2a 20 73 74 72 75 63 74 75   into.** structu
22f30 72 65 20 28 2a 70 41 72 29 2e 20 53 51 4c 49 54  re (*pAr). SQLIT
22f40 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
22f50 20 69 66 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20   if the command 
22f60 6c 69 6e 65 20 69 73 20 70 61 72 73 65 64 0a 2a  line is parsed.*
22f70 2a 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20  * successfully, 
22f80 6f 74 68 65 72 77 69 73 65 20 61 6e 20 65 72 72  otherwise an err
22f90 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20 77 72  or message is wr
22fa0 69 74 74 65 6e 20 74 6f 20 73 74 64 65 72 72 20  itten to stderr 
22fb0 61 6e 64 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 45  and .** SQLITE_E
22fc0 52 52 4f 52 20 72 65 74 75 72 6e 65 64 2e 0a 2a  RROR returned..*
22fd0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 72 50  /.static int arP
22fe0 61 72 73 65 43 6f 6d 6d 61 6e 64 28 0a 20 20 63  arseCommand(.  c
22ff0 68 61 72 20 2a 2a 61 7a 41 72 67 2c 20 20 20 20  har **azArg,    
23000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
23010 2a 20 41 72 72 61 79 20 6f 66 20 61 72 67 75 6d  * Array of argum
23020 65 6e 74 73 20 70 61 73 73 65 64 20 74 6f 20 64  ents passed to d
23030 6f 74 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  ot command */.  
23040 69 6e 74 20 6e 41 72 67 2c 20 20 20 20 20 20 20  int nArg,       
23050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23060 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74  /* Number of ent
23070 72 69 65 73 20 69 6e 20 61 7a 41 72 67 5b 5d 20  ries in azArg[] 
23080 2a 2f 0a 20 20 41 72 43 6f 6d 6d 61 6e 64 20 2a  */.  ArCommand *
23090 70 41 72 20 20 20 20 20 20 20 20 20 20 20 20 20  pAr             
230a0 20 20 20 20 20 2f 2a 20 50 6f 70 75 6c 61 74 65       /* Populate
230b0 20 74 68 69 73 20 6f 62 6a 65 63 74 20 2a 2f 0a   this object */.
230c0 29 7b 0a 20 20 73 74 72 75 63 74 20 41 72 53 77  ){.  struct ArSw
230d0 69 74 63 68 20 7b 0a 20 20 20 20 63 6f 6e 73 74  itch {.    const
230e0 20 63 68 61 72 20 2a 7a 4c 6f 6e 67 3b 0a 20 20   char *zLong;.  
230f0 20 20 63 68 61 72 20 63 53 68 6f 72 74 3b 0a 20    char cShort;. 
23100 20 20 20 75 38 20 65 53 77 69 74 63 68 3b 0a 20     u8 eSwitch;. 
23110 20 20 20 75 38 20 62 41 72 67 3b 0a 20 20 7d 20     u8 bArg;.  } 
23120 61 53 77 69 74 63 68 5b 5d 20 3d 20 7b 0a 20 20  aSwitch[] = {.  
23130 20 20 7b 20 22 63 72 65 61 74 65 22 2c 20 20 20    { "create",   
23140 20 27 63 27 2c 20 41 52 5f 43 4d 44 5f 43 52 45   'c', AR_CMD_CRE
23150 41 54 45 2c 20 20 20 20 20 20 20 30 20 7d 2c 0a  ATE,       0 },.
23160 20 20 20 20 7b 20 22 65 78 74 72 61 63 74 22 2c      { "extract",
23170 20 20 20 27 78 27 2c 20 41 52 5f 43 4d 44 5f 45     'x', AR_CMD_E
23180 58 54 52 41 43 54 2c 20 20 20 20 20 20 30 20 7d  XTRACT,      0 }
23190 2c 0a 20 20 20 20 7b 20 22 6c 69 73 74 22 2c 20  ,.    { "list", 
231a0 20 20 20 20 20 27 74 27 2c 20 41 52 5f 43 4d 44       't', AR_CMD
231b0 5f 4c 49 53 54 2c 20 20 20 20 20 20 20 20 20 30  _LIST,         0
231c0 20 7d 2c 0a 20 20 20 20 7b 20 22 75 70 64 61 74   },.    { "updat
231d0 65 22 2c 20 20 20 20 27 75 27 2c 20 41 52 5f 43  e",    'u', AR_C
231e0 4d 44 5f 55 50 44 41 54 45 2c 20 20 20 20 20 20  MD_UPDATE,      
231f0 20 30 20 7d 2c 0a 20 20 20 20 7b 20 22 68 65 6c   0 },.    { "hel
23200 70 22 2c 20 20 20 20 20 20 27 68 27 2c 20 41 52  p",      'h', AR
23210 5f 43 4d 44 5f 48 45 4c 50 2c 20 20 20 20 20 20  _CMD_HELP,      
23220 20 20 20 30 20 7d 2c 0a 20 20 20 20 7b 20 22 76     0 },.    { "v
23230 65 72 62 6f 73 65 22 2c 20 20 20 27 76 27 2c 20  erbose",   'v', 
23240 41 52 5f 53 57 49 54 43 48 5f 56 45 52 42 4f 53  AR_SWITCH_VERBOS
23250 45 2c 20 20 20 30 20 7d 2c 0a 20 20 20 20 7b 20  E,   0 },.    { 
23260 22 66 69 6c 65 22 2c 20 20 20 20 20 20 27 66 27  "file",      'f'
23270 2c 20 41 52 5f 53 57 49 54 43 48 5f 46 49 4c 45  , AR_SWITCH_FILE
23280 2c 20 20 20 20 20 20 31 20 7d 2c 0a 20 20 20 20  ,      1 },.    
23290 7b 20 22 61 70 70 65 6e 64 22 2c 20 20 20 20 27  { "append",    '
232a0 61 27 2c 20 41 52 5f 53 57 49 54 43 48 5f 41 50  a', AR_SWITCH_AP
232b0 50 45 4e 44 2c 20 20 20 20 31 20 7d 2c 0a 20 20  PEND,    1 },.  
232c0 20 20 7b 20 22 64 69 72 65 63 74 6f 72 79 22 2c    { "directory",
232d0 20 27 43 27 2c 20 41 52 5f 53 57 49 54 43 48 5f   'C', AR_SWITCH_
232e0 44 49 52 45 43 54 4f 52 59 2c 20 31 20 7d 2c 0a  DIRECTORY, 1 },.
232f0 20 20 20 20 7b 20 22 64 72 79 72 75 6e 22 2c 20      { "dryrun", 
23300 20 20 20 27 6e 27 2c 20 41 52 5f 53 57 49 54 43     'n', AR_SWITC
23310 48 5f 44 52 59 52 55 4e 2c 20 20 20 20 30 20 7d  H_DRYRUN,    0 }
23320 2c 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 6e 53 77  ,.  };.  int nSw
23330 69 74 63 68 20 3d 20 73 69 7a 65 6f 66 28 61 53  itch = sizeof(aS
23340 77 69 74 63 68 29 20 2f 20 73 69 7a 65 6f 66 28  witch) / sizeof(
23350 73 74 72 75 63 74 20 41 72 53 77 69 74 63 68 29  struct ArSwitch)
23360 3b 0a 20 20 73 74 72 75 63 74 20 41 72 53 77 69  ;.  struct ArSwi
23370 74 63 68 20 2a 70 45 6e 64 20 3d 20 26 61 53 77  tch *pEnd = &aSw
23380 69 74 63 68 5b 6e 53 77 69 74 63 68 5d 3b 0a 0a  itch[nSwitch];..
23390 20 20 69 66 28 20 6e 41 72 67 3c 3d 31 20 29 7b    if( nArg<=1 ){
233a0 0a 20 20 20 20 72 65 74 75 72 6e 20 61 72 55 73  .    return arUs
233b0 61 67 65 28 73 74 64 65 72 72 29 3b 0a 20 20 7d  age(stderr);.  }
233c0 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20 2a  else{.    char *
233d0 7a 20 3d 20 61 7a 41 72 67 5b 31 5d 3b 0a 20 20  z = azArg[1];.  
233e0 20 20 6d 65 6d 73 65 74 28 70 41 72 2c 20 30 2c    memset(pAr, 0,
233f0 20 73 69 7a 65 6f 66 28 41 72 43 6f 6d 6d 61 6e   sizeof(ArComman
23400 64 29 29 3b 0a 0a 20 20 20 20 69 66 28 20 7a 5b  d));..    if( z[
23410 30 5d 21 3d 27 2d 27 20 29 7b 0a 20 20 20 20 20  0]!='-' ){.     
23420 20 2f 2a 20 54 72 61 64 69 74 69 6f 6e 61 6c 20   /* Traditional 
23430 73 74 79 6c 65 20 5b 74 61 72 5d 20 69 6e 76 6f  style [tar] invo
23440 63 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20  cation */.      
23450 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 69 6e 74  int i;.      int
23460 20 69 41 72 67 20 3d 20 32 3b 0a 20 20 20 20 20   iArg = 2;.     
23470 20 66 6f 72 28 69 3d 30 3b 20 7a 5b 69 5d 3b 20   for(i=0; z[i]; 
23480 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 6f  i++){.        co
23490 6e 73 74 20 63 68 61 72 20 2a 7a 41 72 67 20 3d  nst char *zArg =
234a0 20 30 3b 0a 20 20 20 20 20 20 20 20 73 74 72 75   0;.        stru
234b0 63 74 20 41 72 53 77 69 74 63 68 20 2a 70 4f 70  ct ArSwitch *pOp
234c0 74 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 70  t;.        for(p
234d0 4f 70 74 3d 26 61 53 77 69 74 63 68 5b 30 5d 3b  Opt=&aSwitch[0];
234e0 20 70 4f 70 74 3c 70 45 6e 64 3b 20 70 4f 70 74   pOpt<pEnd; pOpt
234f0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  ++){.          i
23500 66 28 20 7a 5b 69 5d 3d 3d 70 4f 70 74 2d 3e 63  f( z[i]==pOpt->c
23510 53 68 6f 72 74 20 29 20 62 72 65 61 6b 3b 0a 20  Short ) break;. 
23520 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
23530 20 69 66 28 20 70 4f 70 74 3d 3d 70 45 6e 64 20   if( pOpt==pEnd 
23540 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  ){.          ret
23550 75 72 6e 20 61 72 45 72 72 6f 72 4d 73 67 28 22  urn arErrorMsg("
23560 75 6e 72 65 63 6f 67 6e 69 7a 65 64 20 6f 70 74  unrecognized opt
23570 69 6f 6e 3a 20 25 63 22 2c 20 7a 5b 69 5d 29 3b  ion: %c", z[i]);
23580 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
23590 20 20 20 69 66 28 20 70 4f 70 74 2d 3e 62 41 72     if( pOpt->bAr
235a0 67 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  g ){.          i
235b0 66 28 20 69 41 72 67 3e 3d 6e 41 72 67 20 29 7b  f( iArg>=nArg ){
235c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74  .            ret
235d0 75 72 6e 20 61 72 45 72 72 6f 72 4d 73 67 28 22  urn arErrorMsg("
235e0 6f 70 74 69 6f 6e 20 72 65 71 75 69 72 65 73 20  option requires 
235f0 61 6e 20 61 72 67 75 6d 65 6e 74 3a 20 25 63 22  an argument: %c"
23600 2c 7a 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20  ,z[i]);.        
23610 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7a 41    }.          zA
23620 72 67 20 3d 20 61 7a 41 72 67 5b 69 41 72 67 2b  rg = azArg[iArg+
23630 2b 5d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  +];.        }.  
23640 20 20 20 20 20 20 69 66 28 20 61 72 50 72 6f 63        if( arProc
23650 65 73 73 53 77 69 74 63 68 28 70 41 72 2c 20 70  essSwitch(pAr, p
23660 4f 70 74 2d 3e 65 53 77 69 74 63 68 2c 20 7a 41  Opt->eSwitch, zA
23670 72 67 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c  rg) ) return SQL
23680 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  ITE_ERROR;.     
23690 20 7d 0a 20 20 20 20 20 20 70 41 72 2d 3e 6e 41   }.      pAr->nA
236a0 72 67 20 3d 20 6e 41 72 67 2d 69 41 72 67 3b 0a  rg = nArg-iArg;.
236b0 20 20 20 20 20 20 69 66 28 20 70 41 72 2d 3e 6e        if( pAr->n
236c0 41 72 67 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  Arg>0 ){.       
236d0 20 70 41 72 2d 3e 61 7a 41 72 67 20 3d 20 26 61   pAr->azArg = &a
236e0 7a 41 72 67 5b 69 41 72 67 5d 3b 0a 20 20 20 20  zArg[iArg];.    
236f0 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
23700 20 20 20 20 20 2f 2a 20 4e 6f 6e 2d 74 72 61 64       /* Non-trad
23710 69 74 69 6f 6e 61 6c 20 69 6e 76 6f 63 61 74 69  itional invocati
23720 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  on */.      int 
23730 69 41 72 67 3b 0a 20 20 20 20 20 20 66 6f 72 28  iArg;.      for(
23740 69 41 72 67 3d 31 3b 20 69 41 72 67 3c 6e 41 72  iArg=1; iArg<nAr
23750 67 3b 20 69 41 72 67 2b 2b 29 7b 0a 20 20 20 20  g; iArg++){.    
23760 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 20      int n;.     
23770 20 20 20 7a 20 3d 20 61 7a 41 72 67 5b 69 41 72     z = azArg[iAr
23780 67 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  g];.        if( 
23790 7a 5b 30 5d 21 3d 27 2d 27 20 29 7b 0a 20 20 20  z[0]!='-' ){.   
237a0 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 72 65         /* All re
237b0 6d 61 69 6e 69 6e 67 20 63 6f 6d 6d 61 6e 64 20  maining command 
237c0 6c 69 6e 65 20 77 6f 72 64 73 20 61 72 65 20 63  line words are c
237d0 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73  ommand arguments
237e0 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 70  . */.          p
237f0 41 72 2d 3e 61 7a 41 72 67 20 3d 20 26 61 7a 41  Ar->azArg = &azA
23800 72 67 5b 69 41 72 67 5d 3b 0a 20 20 20 20 20 20  rg[iArg];.      
23810 20 20 20 20 70 41 72 2d 3e 6e 41 72 67 20 3d 20      pAr->nArg = 
23820 6e 41 72 67 2d 69 41 72 67 3b 0a 20 20 20 20 20  nArg-iArg;.     
23830 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
23840 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6e 20      }.        n 
23850 3d 20 73 74 72 6c 65 6e 33 30 28 7a 29 3b 0a 0a  = strlen30(z);..
23860 20 20 20 20 20 20 20 20 69 66 28 20 7a 5b 31 5d          if( z[1]
23870 21 3d 27 2d 27 20 29 7b 0a 20 20 20 20 20 20 20  !='-' ){.       
23880 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
23890 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 72 20 6d 6f      /* One or mo
238a0 72 65 20 73 68 6f 72 74 20 6f 70 74 69 6f 6e 73  re short options
238b0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 66 6f   */.          fo
238c0 72 28 69 3d 31 3b 20 69 3c 6e 3b 20 69 2b 2b 29  r(i=1; i<n; i++)
238d0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6f  {.            co
238e0 6e 73 74 20 63 68 61 72 20 2a 7a 41 72 67 20 3d  nst char *zArg =
238f0 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   0;.            
23900 73 74 72 75 63 74 20 41 72 53 77 69 74 63 68 20  struct ArSwitch 
23910 2a 70 4f 70 74 3b 0a 20 20 20 20 20 20 20 20 20  *pOpt;.         
23920 20 20 20 66 6f 72 28 70 4f 70 74 3d 26 61 53 77     for(pOpt=&aSw
23930 69 74 63 68 5b 30 5d 3b 20 70 4f 70 74 3c 70 45  itch[0]; pOpt<pE
23940 6e 64 3b 20 70 4f 70 74 2b 2b 29 7b 0a 20 20 20  nd; pOpt++){.   
23950 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a             if( z
23960 5b 69 5d 3d 3d 70 4f 70 74 2d 3e 63 53 68 6f 72  [i]==pOpt->cShor
23970 74 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  t ) break;.     
23980 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
23990 20 20 20 20 20 69 66 28 20 70 4f 70 74 3d 3d 70       if( pOpt==p
239a0 45 6e 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20  End ){.         
239b0 20 20 20 20 20 72 65 74 75 72 6e 20 61 72 45 72       return arEr
239c0 72 6f 72 4d 73 67 28 22 75 6e 72 65 63 6f 67 6e  rorMsg("unrecogn
239d0 69 7a 65 64 20 6f 70 74 69 6f 6e 3a 20 25 63 5c  ized option: %c\
239e0 6e 22 2c 20 7a 5b 69 5d 29 3b 0a 20 20 20 20 20  n", z[i]);.     
239f0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
23a00 20 20 20 20 20 69 66 28 20 70 4f 70 74 2d 3e 62       if( pOpt->b
23a10 41 72 67 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Arg ){.         
23a20 20 20 20 20 20 69 66 28 20 69 3c 28 6e 2d 31 29       if( i<(n-1)
23a30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
23a40 20 20 20 20 7a 41 72 67 20 3d 20 26 7a 5b 69 2b      zArg = &z[i+
23a50 31 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  1];.            
23a60 20 20 20 20 69 20 3d 20 6e 3b 0a 20 20 20 20 20      i = n;.     
23a70 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
23a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23a90 69 66 28 20 69 41 72 67 3e 3d 28 6e 41 72 67 2d  if( iArg>=(nArg-
23aa0 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  1) ){.          
23ab0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 61          return a
23ac0 72 45 72 72 6f 72 4d 73 67 28 22 6f 70 74 69 6f  rErrorMsg("optio
23ad0 6e 20 72 65 71 75 69 72 65 73 20 61 6e 20 61 72  n requires an ar
23ae0 67 75 6d 65 6e 74 3a 20 25 63 5c 6e 22 2c 7a 5b  gument: %c\n",z[
23af0 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  i]);.           
23b00 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
23b10 20 20 20 20 20 20 20 7a 41 72 67 20 3d 20 61 7a         zArg = az
23b20 41 72 67 5b 2b 2b 69 41 72 67 5d 3b 0a 20 20 20  Arg[++iArg];.   
23b30 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
23b40 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
23b50 20 20 20 20 20 20 20 69 66 28 20 61 72 50 72 6f         if( arPro
23b60 63 65 73 73 53 77 69 74 63 68 28 70 41 72 2c 20  cessSwitch(pAr, 
23b70 70 4f 70 74 2d 3e 65 53 77 69 74 63 68 2c 20 7a  pOpt->eSwitch, z
23b80 41 72 67 29 20 29 20 72 65 74 75 72 6e 20 53 51  Arg) ) return SQ
23b90 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
23ba0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
23bb0 7d 65 6c 73 65 20 69 66 28 20 7a 5b 32 5d 3d 3d  }else if( z[2]==
23bc0 27 5c 30 27 20 29 7b 0a 20 20 20 20 20 20 20 20  '\0' ){.        
23bd0 20 20 2f 2a 20 41 20 2d 2d 20 6f 70 74 69 6f 6e    /* A -- option
23be0 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 74 68 61  , indicating tha
23bf0 74 20 61 6c 6c 20 72 65 6d 61 69 6e 69 6e 67 20  t all remaining 
23c00 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20 77 6f 72  command line wor
23c10 64 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  ds.          ** 
23c20 61 72 65 20 63 6f 6d 6d 61 6e 64 20 61 72 67 75  are command argu
23c30 6d 65 6e 74 73 2e 20 20 2a 2f 0a 20 20 20 20 20  ments.  */.     
23c40 20 20 20 20 20 70 41 72 2d 3e 61 7a 41 72 67 20       pAr->azArg 
23c50 3d 20 26 61 7a 41 72 67 5b 69 41 72 67 2b 31 5d  = &azArg[iArg+1]
23c60 3b 0a 20 20 20 20 20 20 20 20 20 20 70 41 72 2d  ;.          pAr-
23c70 3e 6e 41 72 67 20 3d 20 6e 41 72 67 2d 69 41 72  >nArg = nArg-iAr
23c80 67 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20 62  g-1;.          b
23c90 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65  reak;.        }e
23ca0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  lse{.          /
23cb0 2a 20 41 20 6c 6f 6e 67 20 6f 70 74 69 6f 6e 20  * A long option 
23cc0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e  */.          con
23cd0 73 74 20 63 68 61 72 20 2a 7a 41 72 67 20 3d 20  st char *zArg = 
23ce0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  0;             /
23cf0 2a 20 41 72 67 75 6d 65 6e 74 20 66 6f 72 20 6f  * Argument for o
23d00 70 74 69 6f 6e 2c 20 69 66 20 61 6e 79 20 2a 2f  ption, if any */
23d10 0a 20 20 20 20 20 20 20 20 20 20 73 74 72 75 63  .          struc
23d20 74 20 41 72 53 77 69 74 63 68 20 2a 70 4d 61 74  t ArSwitch *pMat
23d30 63 68 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20  ch = 0;      /* 
23d40 4d 61 74 63 68 69 6e 67 20 6f 70 74 69 6f 6e 20  Matching option 
23d50 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 73 74 72  */.          str
23d60 75 63 74 20 41 72 53 77 69 74 63 68 20 2a 70 4f  uct ArSwitch *pO
23d70 70 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  pt;            /
23d80 2a 20 49 74 65 72 61 74 6f 72 20 2a 2f 0a 20 20  * Iterator */.  
23d90 20 20 20 20 20 20 20 20 66 6f 72 28 70 4f 70 74          for(pOpt
23da0 3d 26 61 53 77 69 74 63 68 5b 30 5d 3b 20 70 4f  =&aSwitch[0]; pO
23db0 70 74 3c 70 45 6e 64 3b 20 70 4f 70 74 2b 2b 29  pt<pEnd; pOpt++)
23dc0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6f  {.            co
23dd0 6e 73 74 20 63 68 61 72 20 2a 7a 4c 6f 6e 67 20  nst char *zLong 
23de0 3d 20 70 4f 70 74 2d 3e 7a 4c 6f 6e 67 3b 0a 20  = pOpt->zLong;. 
23df0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28             if( (
23e00 6e 2d 32 29 3c 3d 73 74 72 6c 65 6e 33 30 28 7a  n-2)<=strlen30(z
23e10 4c 6f 6e 67 29 20 26 26 20 30 3d 3d 6d 65 6d 63  Long) && 0==memc
23e20 6d 70 28 26 7a 5b 32 5d 2c 20 7a 4c 6f 6e 67 2c  mp(&z[2], zLong,
23e30 20 6e 2d 32 29 20 29 7b 0a 20 20 20 20 20 20 20   n-2) ){.       
23e40 20 20 20 20 20 20 20 69 66 28 20 70 4d 61 74 63         if( pMatc
23e50 68 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  h ){.           
23e60 20 20 20 20 20 72 65 74 75 72 6e 20 61 72 45 72       return arEr
23e70 72 6f 72 4d 73 67 28 22 61 6d 62 69 67 75 6f 75  rorMsg("ambiguou
23e80 73 20 6f 70 74 69 6f 6e 3a 20 25 73 22 2c 7a 29  s option: %s",z)
23e90 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
23ea0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
23eb0 20 20 20 20 20 20 20 70 4d 61 74 63 68 20 3d 20         pMatch = 
23ec0 70 4f 70 74 3b 0a 20 20 20 20 20 20 20 20 20 20  pOpt;.          
23ed0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
23ee0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a    }.          }.
23ef0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
23f00 4d 61 74 63 68 3d 3d 30 20 29 7b 0a 20 20 20 20  Match==0 ){.    
23f10 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 61          return a
23f20 72 45 72 72 6f 72 4d 73 67 28 22 75 6e 72 65 63  rErrorMsg("unrec
23f30 6f 67 6e 69 7a 65 64 20 6f 70 74 69 6f 6e 3a 20  ognized option: 
23f40 25 73 22 2c 20 7a 29 3b 0a 20 20 20 20 20 20 20  %s", z);.       
23f50 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69     }.          i
23f60 66 28 20 70 4d 61 74 63 68 2d 3e 62 41 72 67 20  f( pMatch->bArg 
23f70 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
23f80 66 28 20 69 41 72 67 3e 3d 28 6e 41 72 67 2d 31  f( iArg>=(nArg-1
23f90 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
23fa0 20 20 20 72 65 74 75 72 6e 20 61 72 45 72 72 6f     return arErro
23fb0 72 4d 73 67 28 22 6f 70 74 69 6f 6e 20 72 65 71  rMsg("option req
23fc0 75 69 72 65 73 20 61 6e 20 61 72 67 75 6d 65 6e  uires an argumen
23fd0 74 3a 20 25 73 22 2c 20 7a 29 3b 0a 20 20 20 20  t: %s", z);.    
23fe0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
23ff0 20 20 20 20 20 20 7a 41 72 67 20 3d 20 61 7a 41        zArg = azA
24000 72 67 5b 2b 2b 69 41 72 67 5d 3b 0a 20 20 20 20  rg[++iArg];.    
24010 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
24020 20 20 69 66 28 20 61 72 50 72 6f 63 65 73 73 53    if( arProcessS
24030 77 69 74 63 68 28 70 41 72 2c 20 70 4d 61 74 63  witch(pAr, pMatc
24040 68 2d 3e 65 53 77 69 74 63 68 2c 20 7a 41 72 67  h->eSwitch, zArg
24050 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ) ) return SQLIT
24060 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20  E_ERROR;.       
24070 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
24080 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53  .  }..  return S
24090 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
240a0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
240b0 20 61 73 73 75 6d 65 73 20 74 68 61 74 20 61 6c   assumes that al
240c0 6c 20 61 72 67 75 6d 65 6e 74 73 20 77 69 74 68  l arguments with
240d0 69 6e 20 74 68 65 20 41 72 43 6f 6d 6d 61 6e 64  in the ArCommand
240e0 2e 61 7a 41 72 67 5b 5d 0a 2a 2a 20 61 72 72 61  .azArg[].** arra
240f0 79 20 72 65 66 65 72 20 74 6f 20 61 72 63 68 69  y refer to archi
24100 76 65 20 6d 65 6d 62 65 72 73 2c 20 61 73 20 66  ve members, as f
24110 6f 72 20 74 68 65 20 2d 2d 65 78 74 72 61 63 74  or the --extract
24120 20 6f 72 20 2d 2d 6c 69 73 74 20 63 6f 6d 6d 61   or --list comma
24130 6e 64 73 2e 20 0a 2a 2a 20 49 74 20 63 68 65 63  nds. .** It chec
24140 6b 73 20 74 68 61 74 20 65 61 63 68 20 6f 66 20  ks that each of 
24150 74 68 65 6d 20 61 72 65 20 70 72 65 73 65 6e 74  them are present
24160 2e 20 49 66 20 61 6e 79 20 73 70 65 63 69 66 69  . If any specifi
24170 65 64 20 66 69 6c 65 20 69 73 20 6e 6f 74 0a 2a  ed file is not.*
24180 2a 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68 65  * present in the
24190 20 61 72 63 68 69 76 65 2c 20 61 6e 20 65 72 72   archive, an err
241a0 6f 72 20 69 73 20 70 72 69 6e 74 65 64 20 74 6f  or is printed to
241b0 20 73 74 64 65 72 72 20 61 6e 64 20 61 6e 20 65   stderr and an e
241c0 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 72 65 74  rror.** code ret
241d0 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65  urned. Otherwise
241e0 2c 20 69 66 20 61 6c 6c 20 73 70 65 63 69 66 69  , if all specifi
241f0 65 64 20 61 72 67 75 6d 65 6e 74 73 20 61 72 65  ed arguments are
24200 20 70 72 65 73 65 6e 74 20 69 6e 0a 2a 2a 20 74   present in.** t
24210 68 65 20 61 72 63 68 69 76 65 2c 20 53 51 4c 49  he archive, SQLI
24220 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
24230 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  d..**.** This fu
24240 6e 63 74 69 6f 6e 20 73 74 72 69 70 73 20 61 6e  nction strips an
24250 79 20 74 72 61 69 6c 69 6e 67 20 27 2f 27 20 63  y trailing '/' c
24260 68 61 72 61 63 74 65 72 73 20 66 72 6f 6d 20 65  haracters from e
24270 61 63 68 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a  ach argument..**
24280 20 54 68 69 73 20 69 73 20 63 6f 6e 73 69 73 74   This is consist
24290 65 6e 74 20 77 69 74 68 20 74 68 65 20 77 61 79  ent with the way
242a0 20 74 68 65 20 5b 74 61 72 5d 20 63 6f 6d 6d 61   the [tar] comma
242b0 6e 64 20 73 65 65 6d 73 20 74 6f 20 77 6f 72 6b  nd seems to work
242c0 20 6f 6e 0a 2a 2a 20 4c 69 6e 75 78 2e 0a 2a 2f   on.** Linux..*/
242d0 0a 73 74 61 74 69 63 20 69 6e 74 20 61 72 43 68  .static int arCh
242e0 65 63 6b 45 6e 74 72 69 65 73 28 41 72 43 6f 6d  eckEntries(ArCom
242f0 6d 61 6e 64 20 2a 70 41 72 29 7b 0a 20 20 69 6e  mand *pAr){.  in
24300 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
24310 3b 0a 20 20 69 66 28 20 70 41 72 2d 3e 6e 41 72  ;.  if( pAr->nAr
24320 67 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 2c 20  g ){.    int i, 
24330 6a 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  j;.    sqlite3_s
24340 74 6d 74 20 2a 70 54 65 73 74 20 3d 20 30 3b 0a  tmt *pTest = 0;.
24350 0a 20 20 20 20 73 68 65 6c 6c 50 72 65 70 61 72  .    shellPrepar
24360 65 50 72 69 6e 74 66 28 70 41 72 2d 3e 64 62 2c  ePrintf(pAr->db,
24370 20 26 72 63 2c 20 26 70 54 65 73 74 2c 0a 20 20   &rc, &pTest,.  
24380 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 6e 61        "SELECT na
24390 6d 65 20 46 52 4f 4d 20 25 73 20 57 48 45 52 45  me FROM %s WHERE
243a0 20 6e 61 6d 65 3d 24 6e 61 6d 65 22 2c 20 0a 20   name=$name", . 
243b0 20 20 20 20 20 20 20 70 41 72 2d 3e 7a 53 72 63         pAr->zSrc
243c0 54 61 62 6c 65 0a 20 20 20 20 29 3b 0a 20 20 20  Table.    );.   
243d0 20 6a 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e   j = sqlite3_bin
243e0 64 5f 70 61 72 61 6d 65 74 65 72 5f 69 6e 64 65  d_parameter_inde
243f0 78 28 70 54 65 73 74 2c 20 22 24 6e 61 6d 65 22  x(pTest, "$name"
24400 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  );.    for(i=0; 
24410 69 3c 70 41 72 2d 3e 6e 41 72 67 20 26 26 20 72  i<pAr->nArg && r
24420 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 2b  c==SQLITE_OK; i+
24430 2b 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a  +){.      char *
24440 7a 20 3d 20 70 41 72 2d 3e 61 7a 41 72 67 5b 69  z = pAr->azArg[i
24450 5d 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d  ];.      int n =
24460 20 73 74 72 6c 65 6e 33 30 28 7a 29 3b 0a 20 20   strlen30(z);.  
24470 20 20 20 20 69 6e 74 20 62 4f 6b 20 3d 20 30 3b      int bOk = 0;
24480 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 6e 3e  .      while( n>
24490 30 20 26 26 20 7a 5b 6e 2d 31 5d 3d 3d 27 2f 27  0 && z[n-1]=='/'
244a0 20 29 20 6e 2d 2d 3b 0a 20 20 20 20 20 20 7a 5b   ) n--;.      z[
244b0 6e 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 20  n] = '\0';.     
244c0 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65   sqlite3_bind_te
244d0 78 74 28 70 54 65 73 74 2c 20 6a 2c 20 7a 2c 20  xt(pTest, j, z, 
244e0 2d 31 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49  -1, SQLITE_STATI
244f0 43 29 3b 0a 20 20 20 20 20 20 69 66 28 20 53 51  C);.      if( SQ
24500 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65  LITE_ROW==sqlite
24510 33 5f 73 74 65 70 28 70 54 65 73 74 29 20 29 7b  3_step(pTest) ){
24520 0a 20 20 20 20 20 20 20 20 62 4f 6b 20 3d 20 31  .        bOk = 1
24530 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
24540 73 68 65 6c 6c 52 65 73 65 74 28 26 72 63 2c 20  shellReset(&rc, 
24550 70 54 65 73 74 29 3b 0a 20 20 20 20 20 20 69 66  pTest);.      if
24560 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
24570 26 26 20 62 4f 6b 3d 3d 30 20 29 7b 0a 20 20 20  && bOk==0 ){.   
24580 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
24590 28 73 74 64 65 72 72 2c 20 22 6e 6f 74 20 66 6f  (stderr, "not fo
245a0 75 6e 64 20 69 6e 20 61 72 63 68 69 76 65 3a 20  und in archive: 
245b0 25 73 5c 6e 22 2c 20 7a 29 3b 0a 20 20 20 20 20  %s\n", z);.     
245c0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45     rc = SQLITE_E
245d0 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20  RROR;.      }.  
245e0 20 20 7d 0a 20 20 20 20 73 68 65 6c 6c 46 69 6e    }.    shellFin
245f0 61 6c 69 7a 65 28 26 72 63 2c 20 70 54 65 73 74  alize(&rc, pTest
24600 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
24610 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72  rc;.}../*.** For
24620 6d 61 74 20 61 20 57 48 45 52 45 20 63 6c 61 75  mat a WHERE clau
24630 73 65 20 74 68 61 74 20 63 61 6e 20 62 65 20 75  se that can be u
24640 73 65 64 20 61 67 61 69 6e 73 74 20 74 68 65 20  sed against the 
24650 22 73 71 6c 61 72 22 20 74 61 62 6c 65 20 74 6f  "sqlar" table to
24660 0a 2a 2a 20 69 64 65 6e 74 69 66 79 20 61 6c 6c  .** identify all
24670 20 61 72 63 68 69 76 65 20 6d 65 6d 62 65 72 73   archive members
24680 20 74 68 61 74 20 6d 61 74 63 68 20 74 68 65 20   that match the 
24690 63 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74  command argument
246a0 73 20 68 65 6c 64 0a 2a 2a 20 69 6e 20 28 2a 70  s held.** in (*p
246b0 41 72 29 2e 20 4c 65 61 76 65 20 74 68 69 73 20  Ar). Leave this 
246c0 57 48 45 52 45 20 63 6c 61 75 73 65 20 69 6e 20  WHERE clause in 
246d0 28 2a 70 7a 57 68 65 72 65 29 20 62 65 66 6f 72  (*pzWhere) befor
246e0 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 20  e returning..** 
246f0 54 68 65 20 63 61 6c 6c 65 72 20 69 73 20 72 65  The caller is re
24700 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 65 76  sponsible for ev
24710 65 6e 74 75 61 6c 6c 79 20 63 61 6c 6c 69 6e 67  entually calling
24720 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 29 20   sqlite3_free() 
24730 6f 6e 0a 2a 2a 20 61 6e 79 20 6e 6f 6e 2d 4e 55  on.** any non-NU
24740 4c 4c 20 28 2a 70 7a 57 68 65 72 65 29 20 76 61  LL (*pzWhere) va
24750 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  lue..*/.static v
24760 6f 69 64 20 61 72 57 68 65 72 65 43 6c 61 75 73  oid arWhereClaus
24770 65 28 0a 20 20 69 6e 74 20 2a 70 52 63 2c 20 0a  e(.  int *pRc, .
24780 20 20 41 72 43 6f 6d 6d 61 6e 64 20 2a 70 41 72    ArCommand *pAr
24790 2c 20 0a 20 20 63 68 61 72 20 2a 2a 70 7a 57 68  , .  char **pzWh
247a0 65 72 65 20 20 20 20 20 20 20 20 20 20 20 20 20  ere             
247b0 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4e 65 77       /* OUT: New
247c0 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f   WHERE clause */
247d0 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 57 68 65  .){.  char *zWhe
247e0 72 65 20 3d 20 30 3b 0a 20 20 69 66 28 20 2a 70  re = 0;.  if( *p
247f0 52 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  Rc==SQLITE_OK ){
24800 0a 20 20 20 20 69 66 28 20 70 41 72 2d 3e 6e 41  .    if( pAr->nA
24810 72 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a  rg==0 ){.      z
24820 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33 5f  Where = sqlite3_
24830 6d 70 72 69 6e 74 66 28 22 31 22 29 3b 0a 20 20  mprintf("1");.  
24840 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
24850 6e 74 20 69 3b 0a 20 20 20 20 20 20 63 6f 6e 73  nt i;.      cons
24860 74 20 63 68 61 72 20 2a 7a 53 65 70 20 3d 20 22  t char *zSep = "
24870 22 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  ";.      for(i=0
24880 3b 20 69 3c 70 41 72 2d 3e 6e 41 72 67 3b 20 69  ; i<pAr->nArg; i
24890 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e  ++){.        con
248a0 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 70 41 72  st char *z = pAr
248b0 2d 3e 61 7a 41 72 67 5b 69 5d 3b 0a 20 20 20 20  ->azArg[i];.    
248c0 20 20 20 20 7a 57 68 65 72 65 20 3d 20 73 71 6c      zWhere = sql
248d0 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20  ite3_mprintf(.  
248e0 20 20 20 20 20 20 20 20 22 25 7a 25 73 20 6e 61          "%z%s na
248f0 6d 65 20 3d 20 27 25 71 27 20 4f 52 20 73 75 62  me = '%q' OR sub
24900 73 74 72 28 6e 61 6d 65 2c 31 2c 25 64 29 20 3d  str(name,1,%d) =
24910 20 27 25 71 2f 27 22 2c 20 0a 20 20 20 20 20 20   '%q/'", .      
24920 20 20 20 20 7a 57 68 65 72 65 2c 20 7a 53 65 70      zWhere, zSep
24930 2c 20 7a 2c 20 73 74 72 6c 65 6e 33 30 28 7a 29  , z, strlen30(z)
24940 2b 31 2c 20 7a 0a 20 20 20 20 20 20 20 20 29 3b  +1, z.        );
24950 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 57 68  .        if( zWh
24960 65 72 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ere==0 ){.      
24970 20 20 20 20 2a 70 52 63 20 3d 20 53 51 4c 49 54      *pRc = SQLIT
24980 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20  E_NOMEM;.       
24990 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
249a0 20 20 7d 0a 20 20 20 20 20 20 20 20 7a 53 65 70    }.        zSep
249b0 20 3d 20 22 20 4f 52 20 22 3b 0a 20 20 20 20 20   = " OR ";.     
249c0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a   }.    }.  }.  *
249d0 70 7a 57 68 65 72 65 20 3d 20 7a 57 68 65 72 65  pzWhere = zWhere
249e0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65  ;.}../*.** Imple
249f0 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 2e 61 72  mentation of .ar
24a00 20 22 6c 69 73 54 22 20 63 6f 6d 6d 61 6e 64 2e   "lisT" command.
24a10 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20   .*/.static int 
24a20 61 72 4c 69 73 74 43 6f 6d 6d 61 6e 64 28 41 72  arListCommand(Ar
24a30 43 6f 6d 6d 61 6e 64 20 2a 70 41 72 29 7b 0a 20  Command *pAr){. 
24a40 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71   const char *zSq
24a50 6c 20 3d 20 22 53 45 4c 45 43 54 20 25 73 20 46  l = "SELECT %s F
24a60 52 4f 4d 20 25 73 20 57 48 45 52 45 20 25 73 22  ROM %s WHERE %s"
24a70 3b 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ; .  const char 
24a80 2a 61 7a 43 6f 6c 73 5b 5d 20 3d 20 7b 0a 20 20  *azCols[] = {.  
24a90 20 20 22 6e 61 6d 65 22 2c 0a 20 20 20 20 22 6c    "name",.    "l
24aa0 73 6d 6f 64 65 28 6d 6f 64 65 29 2c 20 73 7a 2c  smode(mode), sz,
24ab0 20 64 61 74 65 74 69 6d 65 28 6d 74 69 6d 65 2c   datetime(mtime,
24ac0 20 27 75 6e 69 78 65 70 6f 63 68 27 29 2c 20 6e   'unixepoch'), n
24ad0 61 6d 65 22 0a 20 20 7d 3b 0a 0a 20 20 63 68 61  ame".  };..  cha
24ae0 72 20 2a 7a 57 68 65 72 65 20 3d 20 30 3b 0a 20  r *zWhere = 0;. 
24af0 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
24b00 53 71 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72  Sql = 0;.  int r
24b10 63 3b 0a 0a 20 20 72 63 20 3d 20 61 72 43 68 65  c;..  rc = arChe
24b20 63 6b 45 6e 74 72 69 65 73 28 70 41 72 29 3b 0a  ckEntries(pAr);.
24b30 20 20 61 72 57 68 65 72 65 43 6c 61 75 73 65 28    arWhereClause(
24b40 26 72 63 2c 20 70 41 72 2c 20 26 7a 57 68 65 72  &rc, pAr, &zWher
24b50 65 29 3b 0a 0a 20 20 73 68 65 6c 6c 50 72 65 70  e);..  shellPrep
24b60 61 72 65 50 72 69 6e 74 66 28 70 41 72 2d 3e 64  arePrintf(pAr->d
24b70 62 2c 20 26 72 63 2c 20 26 70 53 71 6c 2c 20 7a  b, &rc, &pSql, z
24b80 53 71 6c 2c 20 61 7a 43 6f 6c 73 5b 70 41 72 2d  Sql, azCols[pAr-
24b90 3e 62 56 65 72 62 6f 73 65 5d 2c 0a 20 20 20 20  >bVerbose],.    
24ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24bb0 20 70 41 72 2d 3e 7a 53 72 63 54 61 62 6c 65 2c   pAr->zSrcTable,
24bc0 20 7a 57 68 65 72 65 29 3b 0a 20 20 69 66 28 20   zWhere);.  if( 
24bd0 70 41 72 2d 3e 62 44 72 79 52 75 6e 20 29 7b 0a  pAr->bDryRun ){.
24be0 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
24bf0 70 41 72 2d 3e 70 2d 3e 6f 75 74 2c 20 22 25 73  pAr->p->out, "%s
24c00 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f 73 71 6c  \n", sqlite3_sql
24c10 28 70 53 71 6c 29 29 3b 0a 20 20 7d 65 6c 73 65  (pSql));.  }else
24c20 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 72 63 3d  {.    while( rc=
24c30 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 53 51  =SQLITE_OK && SQ
24c40 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65  LITE_ROW==sqlite
24c50 33 5f 73 74 65 70 28 70 53 71 6c 29 20 29 7b 0a  3_step(pSql) ){.
24c60 20 20 20 20 20 20 69 66 28 20 70 41 72 2d 3e 62        if( pAr->b
24c70 56 65 72 62 6f 73 65 20 29 7b 0a 20 20 20 20 20  Verbose ){.     
24c80 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70     utf8_printf(p
24c90 41 72 2d 3e 70 2d 3e 6f 75 74 2c 20 22 25 73 20  Ar->p->out, "%s 
24ca0 25 20 31 30 64 20 20 25 73 20 20 25 73 5c 6e 22  % 10d  %s  %s\n"
24cb0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  ,.            sq
24cc0 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
24cd0 74 28 70 53 71 6c 2c 20 30 29 2c 0a 20 20 20 20  t(pSql, 0),.    
24ce0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
24cf0 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 71 6c 2c  column_int(pSql,
24d00 20 31 29 2c 20 0a 20 20 20 20 20 20 20 20 20 20   1), .          
24d10 20 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e    sqlite3_column
24d20 5f 74 65 78 74 28 70 53 71 6c 2c 20 32 29 2c 0a  _text(pSql, 2),.
24d30 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
24d40 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28  te3_column_text(
24d50 70 53 71 6c 2c 20 33 29 0a 20 20 20 20 20 20 20  pSql, 3).       
24d60 20 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   );.      }else{
24d70 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72  .        utf8_pr
24d80 69 6e 74 66 28 70 41 72 2d 3e 70 2d 3e 6f 75 74  intf(pAr->p->out
24d90 2c 20 22 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65  , "%s\n", sqlite
24da0 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53  3_column_text(pS
24db0 71 6c 2c 20 30 29 29 3b 0a 20 20 20 20 20 20 7d  ql, 0));.      }
24dc0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 68 65  .    }.  }.  she
24dd0 6c 6c 46 69 6e 61 6c 69 7a 65 28 26 72 63 2c 20  llFinalize(&rc, 
24de0 70 53 71 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20  pSql);.  return 
24df0 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 6d  rc;.}.../*.** Im
24e00 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
24e10 2e 61 72 20 22 65 58 74 72 61 63 74 22 20 63 6f  .ar "eXtract" co
24e20 6d 6d 61 6e 64 2e 20 0a 2a 2f 0a 73 74 61 74 69  mmand. .*/.stati
24e30 63 20 69 6e 74 20 61 72 45 78 74 72 61 63 74 43  c int arExtractC
24e40 6f 6d 6d 61 6e 64 28 41 72 43 6f 6d 6d 61 6e 64  ommand(ArCommand
24e50 20 2a 70 41 72 29 7b 0a 20 20 63 6f 6e 73 74 20   *pAr){.  const 
24e60 63 68 61 72 20 2a 7a 53 71 6c 31 20 3d 20 0a 20  char *zSql1 = . 
24e70 20 20 20 22 53 45 4c 45 43 54 20 22 0a 20 20 20     "SELECT ".   
24e80 20 22 20 28 24 64 69 72 20 7c 7c 20 6e 61 6d 65   " ($dir || name
24e90 29 2c 22 0a 20 20 20 20 22 20 77 72 69 74 65 66  ),".    " writef
24ea0 69 6c 65 28 28 24 64 69 72 20 7c 7c 20 6e 61 6d  ile(($dir || nam
24eb0 65 29 2c 20 25 73 2c 20 6d 6f 64 65 2c 20 6d 74  e), %s, mode, mt
24ec0 69 6d 65 29 20 22 0a 20 20 20 20 22 46 52 4f 4d  ime) ".    "FROM
24ed0 20 25 73 20 57 48 45 52 45 20 28 25 73 29 20 41   %s WHERE (%s) A
24ee0 4e 44 20 28 64 61 74 61 20 49 53 20 4e 55 4c 4c  ND (data IS NULL
24ef0 20 4f 52 20 24 64 69 72 4f 6e 6c 79 20 3d 20 30   OR $dirOnly = 0
24f00 29 22 3b 0a 0a 20 20 63 6f 6e 73 74 20 63 68 61  )";..  const cha
24f10 72 20 2a 61 7a 45 78 74 72 61 41 72 67 5b 5d 20  r *azExtraArg[] 
24f20 3d 20 7b 20 0a 20 20 20 20 22 73 71 6c 61 72 5f  = { .    "sqlar_
24f30 75 6e 63 6f 6d 70 72 65 73 73 28 64 61 74 61 2c  uncompress(data,
24f40 20 73 7a 29 22 2c 0a 20 20 20 20 22 64 61 74 61   sz)",.    "data
24f50 22 0a 20 20 7d 3b 0a 0a 20 20 73 71 6c 69 74 65  ".  };..  sqlite
24f60 33 5f 73 74 6d 74 20 2a 70 53 71 6c 20 3d 20 30  3_stmt *pSql = 0
24f70 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
24f80 49 54 45 5f 4f 4b 3b 0a 20 20 63 68 61 72 20 2a  ITE_OK;.  char *
24f90 7a 44 69 72 20 3d 20 30 3b 0a 20 20 63 68 61 72  zDir = 0;.  char
24fa0 20 2a 7a 57 68 65 72 65 20 3d 20 30 3b 0a 20 20   *zWhere = 0;.  
24fb0 69 6e 74 20 69 2c 20 6a 3b 0a 0a 20 20 2f 2a 20  int i, j;..  /* 
24fc0 49 66 20 61 72 67 75 6d 65 6e 74 73 20 61 72 65  If arguments are
24fd0 20 73 70 65 63 69 66 69 65 64 2c 20 63 68 65 63   specified, chec
24fe0 6b 20 74 68 61 74 20 74 68 65 79 20 61 63 74 75  k that they actu
24ff0 61 6c 6c 79 20 65 78 69 73 74 20 77 69 74 68 69  ally exist withi
25000 6e 0a 20 20 2a 2a 20 74 68 65 20 61 72 63 68 69  n.  ** the archi
25010 76 65 20 62 65 66 6f 72 65 20 70 72 6f 63 65 65  ve before procee
25020 64 69 6e 67 2e 20 41 6e 64 20 66 6f 72 6d 75 6c  ding. And formul
25030 61 74 65 20 61 20 57 48 45 52 45 20 63 6c 61 75  ate a WHERE clau
25040 73 65 20 74 6f 0a 20 20 2a 2a 20 6d 61 74 63 68  se to.  ** match
25050 20 74 68 65 6d 2e 20 20 2a 2f 0a 20 20 72 63 20   them.  */.  rc 
25060 3d 20 61 72 43 68 65 63 6b 45 6e 74 72 69 65 73  = arCheckEntries
25070 28 70 41 72 29 3b 0a 20 20 61 72 57 68 65 72 65  (pAr);.  arWhere
25080 43 6c 61 75 73 65 28 26 72 63 2c 20 70 41 72 2c  Clause(&rc, pAr,
25090 20 26 7a 57 68 65 72 65 29 3b 0a 0a 20 20 69 66   &zWhere);..  if
250a0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
250b0 29 7b 0a 20 20 20 20 69 66 28 20 70 41 72 2d 3e  ){.    if( pAr->
250c0 7a 44 69 72 20 29 7b 0a 20 20 20 20 20 20 7a 44  zDir ){.      zD
250d0 69 72 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  ir = sqlite3_mpr
250e0 69 6e 74 66 28 22 25 73 2f 22 2c 20 70 41 72 2d  intf("%s/", pAr-
250f0 3e 7a 44 69 72 29 3b 0a 20 20 20 20 7d 65 6c 73  >zDir);.    }els
25100 65 7b 0a 20 20 20 20 20 20 7a 44 69 72 20 3d 20  e{.      zDir = 
25110 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
25120 22 22 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  "");.    }.    i
25130 66 28 20 7a 44 69 72 3d 3d 30 20 29 20 72 63 20  f( zDir==0 ) rc 
25140 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
25150 20 20 7d 0a 0a 20 20 73 68 65 6c 6c 50 72 65 70    }..  shellPrep
25160 61 72 65 50 72 69 6e 74 66 28 70 41 72 2d 3e 64  arePrintf(pAr->d
25170 62 2c 20 26 72 63 2c 20 26 70 53 71 6c 2c 20 7a  b, &rc, &pSql, z
25180 53 71 6c 31 2c 20 0a 20 20 20 20 20 20 61 7a 45  Sql1, .      azE
25190 78 74 72 61 41 72 67 5b 70 41 72 2d 3e 62 5a 69  xtraArg[pAr->bZi
251a0 70 5d 2c 20 70 41 72 2d 3e 7a 53 72 63 54 61 62  p], pAr->zSrcTab
251b0 6c 65 2c 20 7a 57 68 65 72 65 0a 20 20 29 3b 0a  le, zWhere.  );.
251c0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
251d0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 6a 20 3d 20  E_OK ){.    j = 
251e0 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61 72  sqlite3_bind_par
251f0 61 6d 65 74 65 72 5f 69 6e 64 65 78 28 70 53 71  ameter_index(pSq
25200 6c 2c 20 22 24 64 69 72 22 29 3b 0a 20 20 20 20  l, "$dir");.    
25210 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78  sqlite3_bind_tex
25220 74 28 70 53 71 6c 2c 20 6a 2c 20 7a 44 69 72 2c  t(pSql, j, zDir,
25230 20 2d 31 2c 20 53 51 4c 49 54 45 5f 53 54 41 54   -1, SQLITE_STAT
25240 49 43 29 3b 0a 0a 20 20 20 20 2f 2a 20 52 75 6e  IC);..    /* Run
25250 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   the SELECT stat
25260 65 6d 65 6e 74 20 74 77 69 63 65 2e 20 54 68 65  ement twice. The
25270 20 66 69 72 73 74 20 74 69 6d 65 2c 20 77 72 69   first time, wri
25280 74 65 66 69 6c 65 28 29 20 69 73 20 63 61 6c 6c  tefile() is call
25290 65 64 0a 20 20 20 20 2a 2a 20 66 6f 72 20 61 6c  ed.    ** for al
252a0 6c 20 61 72 63 68 69 76 65 20 6d 65 6d 62 65 72  l archive member
252b0 73 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65  s that should be
252c0 20 65 78 74 72 61 63 74 65 64 2e 20 54 68 65 20   extracted. The 
252d0 73 65 63 6f 6e 64 20 74 69 6d 65 2c 0a 20 20 20  second time,.   
252e0 20 2a 2a 20 6f 6e 6c 79 20 66 6f 72 20 74 68 65   ** only for the
252f0 20 64 69 72 65 63 74 6f 72 69 65 73 2e 20 54 68   directories. Th
25300 69 73 20 69 73 20 62 65 63 61 75 73 65 20 74 68  is is because th
25310 65 20 74 69 6d 65 73 74 61 6d 70 73 20 66 6f 72  e timestamps for
25320 0a 20 20 20 20 2a 2a 20 65 78 74 72 61 63 74 65  .    ** extracte
25330 64 20 64 69 72 65 63 74 6f 72 69 65 73 20 6d 75  d directories mu
25340 73 74 20 62 65 20 72 65 73 65 74 20 61 66 74 65  st be reset afte
25350 72 20 74 68 65 79 20 61 72 65 20 70 6f 70 75 6c  r they are popul
25360 61 74 65 64 20 28 61 73 0a 20 20 20 20 2a 2a 20  ated (as.    ** 
25370 70 6f 70 75 6c 61 74 69 6e 67 20 74 68 65 6d 20  populating them 
25380 63 68 61 6e 67 65 73 20 74 68 65 20 74 69 6d 65  changes the time
25390 73 74 61 6d 70 29 2e 20 20 2a 2f 0a 20 20 20 20  stamp).  */.    
253a0 66 6f 72 28 69 3d 30 3b 20 69 3c 32 3b 20 69 2b  for(i=0; i<2; i+
253b0 2b 29 7b 0a 20 20 20 20 20 20 6a 20 3d 20 73 71  +){.      j = sq
253c0 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d  lite3_bind_param
253d0 65 74 65 72 5f 69 6e 64 65 78 28 70 53 71 6c 2c  eter_index(pSql,
253e0 20 22 24 64 69 72 4f 6e 6c 79 22 29 3b 0a 20 20   "$dirOnly");.  
253f0 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64      sqlite3_bind
25400 5f 69 6e 74 28 70 53 71 6c 2c 20 6a 2c 20 69 29  _int(pSql, j, i)
25410 3b 0a 20 20 20 20 20 20 69 66 28 20 70 41 72 2d  ;.      if( pAr-
25420 3e 62 44 72 79 52 75 6e 20 29 7b 0a 20 20 20 20  >bDryRun ){.    
25430 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
25440 70 41 72 2d 3e 70 2d 3e 6f 75 74 2c 20 22 25 73  pAr->p->out, "%s
25450 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f 73 71 6c  \n", sqlite3_sql
25460 28 70 53 71 6c 29 29 3b 0a 20 20 20 20 20 20 7d  (pSql));.      }
25470 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 77 68  else{.        wh
25480 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ile( rc==SQLITE_
25490 4f 4b 20 26 26 20 53 51 4c 49 54 45 5f 52 4f 57  OK && SQLITE_ROW
254a0 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70  ==sqlite3_step(p
254b0 53 71 6c 29 20 29 7b 0a 20 20 20 20 20 20 20 20  Sql) ){.        
254c0 20 20 69 66 28 20 69 3d 3d 30 20 26 26 20 70 41    if( i==0 && pA
254d0 72 2d 3e 62 56 65 72 62 6f 73 65 20 29 7b 0a 20  r->bVerbose ){. 
254e0 20 20 20 20 20 20 20 20 20 20 20 75 74 66 38 5f             utf8_
254f0 70 72 69 6e 74 66 28 70 41 72 2d 3e 70 2d 3e 6f  printf(pAr->p->o
25500 75 74 2c 20 22 25 73 5c 6e 22 2c 20 73 71 6c 69  ut, "%s\n", sqli
25510 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28  te3_column_text(
25520 70 53 71 6c 2c 20 30 29 29 3b 0a 20 20 20 20 20  pSql, 0));.     
25530 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
25540 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
25550 68 65 6c 6c 52 65 73 65 74 28 26 72 63 2c 20 70  hellReset(&rc, p
25560 53 71 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Sql);.    }.    
25570 73 68 65 6c 6c 46 69 6e 61 6c 69 7a 65 28 26 72  shellFinalize(&r
25580 63 2c 20 70 53 71 6c 29 3b 0a 20 20 7d 0a 0a 20  c, pSql);.  }.. 
25590 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 44   sqlite3_free(zD
255a0 69 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  ir);.  sqlite3_f
255b0 72 65 65 28 7a 57 68 65 72 65 29 3b 0a 20 20 72  ree(zWhere);.  r
255c0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
255d0 2a 2a 20 52 75 6e 20 74 68 65 20 53 51 4c 20 73  ** Run the SQL s
255e0 74 61 74 65 6d 65 6e 74 20 69 6e 20 7a 53 71 6c  tatement in zSql
255f0 2e 20 20 4f 72 20 69 66 20 64 6f 69 6e 67 20 61  .  Or if doing a
25600 20 2d 2d 64 72 79 72 75 6e 2c 20 6d 65 72 65 6c   --dryrun, merel
25610 79 20 70 72 69 6e 74 20 69 74 20 6f 75 74 2e 0a  y print it out..
25620 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 72  */.static int ar
25630 45 78 65 63 53 71 6c 28 41 72 43 6f 6d 6d 61 6e  ExecSql(ArComman
25640 64 20 2a 70 41 72 2c 20 63 6f 6e 73 74 20 63 68  d *pAr, const ch
25650 61 72 20 2a 7a 53 71 6c 29 7b 0a 20 20 69 6e 74  ar *zSql){.  int
25660 20 72 63 3b 0a 20 20 69 66 28 20 70 41 72 2d 3e   rc;.  if( pAr->
25670 62 44 72 79 52 75 6e 20 29 7b 0a 20 20 20 20 75  bDryRun ){.    u
25680 74 66 38 5f 70 72 69 6e 74 66 28 70 41 72 2d 3e  tf8_printf(pAr->
25690 70 2d 3e 6f 75 74 2c 20 22 25 73 5c 6e 22 2c 20  p->out, "%s\n", 
256a0 7a 53 71 6c 29 3b 0a 20 20 20 20 72 63 20 3d 20  zSql);.    rc = 
256b0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c  SQLITE_OK;.  }el
256c0 73 65 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 45  se{.    char *zE
256d0 72 72 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d  rr = 0;.    rc =
256e0 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 41   sqlite3_exec(pA
256f0 72 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 30 2c 20  r->db, zSql, 0, 
25700 30 2c 20 26 7a 45 72 72 29 3b 0a 20 20 20 20 69  0, &zErr);.    i
25710 66 28 20 7a 45 72 72 20 29 7b 0a 20 20 20 20 20  f( zErr ){.     
25720 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64   utf8_printf(std
25730 6f 75 74 2c 20 22 45 52 52 4f 52 3a 20 25 73 5c  out, "ERROR: %s\
25740 6e 22 2c 20 7a 45 72 72 29 3b 0a 20 20 20 20 20  n", zErr);.     
25750 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 45   sqlite3_free(zE
25760 72 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  rr);.    }.  }. 
25770 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a   return rc;.}...
25780 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61  /*.** Implementa
25790 74 69 6f 6e 20 6f 66 20 2e 61 72 20 22 63 72 65  tion of .ar "cre
257a0 61 74 65 22 20 61 6e 64 20 22 75 70 64 61 74 65  ate" and "update
257b0 22 20 63 6f 6d 6d 61 6e 64 73 2e 0a 2a 2a 0a 2a  " commands..**.*
257c0 2a 20 43 72 65 61 74 65 20 74 68 65 20 22 73 71  * Create the "sq
257d0 6c 61 72 22 20 74 61 62 6c 65 20 69 6e 20 74 68  lar" table in th
257e0 65 20 64 61 74 61 62 61 73 65 20 69 66 20 69 74  e database if it
257f0 20 64 6f 65 73 20 6e 6f 74 20 61 6c 72 65 61 64   does not alread
25800 79 20 65 78 69 73 74 2e 0a 2a 2a 20 54 68 65 6e  y exist..** Then
25810 20 61 64 64 20 65 61 63 68 20 66 69 6c 65 20 69   add each file i
25820 6e 20 74 68 65 20 61 7a 46 69 6c 65 5b 5d 20 61  n the azFile[] a
25830 72 72 61 79 20 74 6f 20 74 68 65 20 61 72 63 68  rray to the arch
25840 69 76 65 2e 20 44 69 72 65 63 74 6f 72 69 65 73  ive. Directories
25850 0a 2a 2a 20 61 72 65 20 61 64 64 65 64 20 72 65  .** are added re
25860 63 75 72 73 69 76 65 6c 79 2e 20 49 66 20 61 72  cursively. If ar
25870 67 75 6d 65 6e 74 20 62 56 65 72 62 6f 73 65 20  gument bVerbose 
25880 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 61 20 6d  is non-zero, a m
25890 65 73 73 61 67 65 20 69 73 0a 2a 2a 20 70 72 69  essage is.** pri
258a0 6e 74 65 64 20 6f 6e 20 73 74 64 6f 75 74 20 66  nted on stdout f
258b0 6f 72 20 65 61 63 68 20 66 69 6c 65 20 61 72 63  or each file arc
258c0 68 69 76 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  hived..**.** The
258d0 20 63 72 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20   create command 
258e0 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 75  is the same as u
258f0 70 64 61 74 65 2c 20 65 78 63 65 70 74 20 74 68  pdate, except th
25900 61 74 20 69 74 20 64 72 6f 70 73 0a 2a 2a 20 61  at it drops.** a
25910 6e 79 20 65 78 69 73 74 69 6e 67 20 22 73 71 6c  ny existing "sql
25920 61 72 22 20 74 61 62 6c 65 20 62 65 66 6f 72 65  ar" table before
25930 20 62 65 67 69 6e 6e 69 6e 67 2e 0a 2a 2f 0a 73   beginning..*/.s
25940 74 61 74 69 63 20 69 6e 74 20 61 72 43 72 65 61  tatic int arCrea
25950 74 65 4f 72 55 70 64 61 74 65 43 6f 6d 6d 61 6e  teOrUpdateComman
25960 64 28 0a 20 20 41 72 43 6f 6d 6d 61 6e 64 20 2a  d(.  ArCommand *
25970 70 41 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  pAr,            
25980 20 20 20 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20       /* Command 
25990 61 72 67 75 6d 65 6e 74 73 20 61 6e 64 20 6f 70  arguments and op
259a0 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 62  tions */.  int b
259b0 55 70 64 61 74 65 20 20 20 20 20 20 20 20 20 20  Update          
259c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 74 72             /* tr
259d0 75 65 20 66 6f 72 20 61 20 2d 2d 63 72 65 61 74  ue for a --creat
259e0 65 2e 20 20 66 61 6c 73 65 20 66 6f 72 20 2d 2d  e.  false for --
259f0 75 70 64 61 74 65 20 2a 2f 0a 29 7b 0a 20 20 63  update */.){.  c
25a00 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 72 65 61  onst char *zCrea
25a10 74 65 20 3d 20 0a 20 20 20 20 20 20 22 43 52 45  te = .      "CRE
25a20 41 54 45 20 54 41 42 4c 45 20 49 46 20 4e 4f 54  ATE TABLE IF NOT
25a30 20 45 58 49 53 54 53 20 73 71 6c 61 72 28 5c 6e   EXISTS sqlar(\n
25a40 22 0a 20 20 20 20 20 20 22 20 20 6e 61 6d 65 20  ".      "  name 
25a50 54 45 58 54 20 50 52 49 4d 41 52 59 20 4b 45 59  TEXT PRIMARY KEY
25a60 2c 20 20 2d 2d 20 6e 61 6d 65 20 6f 66 20 74 68  ,  -- name of th
25a70 65 20 66 69 6c 65 5c 6e 22 0a 20 20 20 20 20 20  e file\n".      
25a80 22 20 20 6d 6f 64 65 20 49 4e 54 2c 20 20 20 20  "  mode INT,    
25a90 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20 61 63             -- ac
25aa0 63 65 73 73 20 70 65 72 6d 69 73 73 69 6f 6e 73  cess permissions
25ab0 5c 6e 22 0a 20 20 20 20 20 20 22 20 20 6d 74 69  \n".      "  mti
25ac0 6d 65 20 49 4e 54 2c 20 20 20 20 20 20 20 20 20  me INT,         
25ad0 20 20 20 20 20 2d 2d 20 6c 61 73 74 20 6d 6f 64       -- last mod
25ae0 69 66 69 63 61 74 69 6f 6e 20 74 69 6d 65 5c 6e  ification time\n
25af0 22 0a 20 20 20 20 20 20 22 20 20 73 7a 20 49 4e  ".      "  sz IN
25b00 54 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  T,              
25b10 20 20 20 2d 2d 20 6f 72 69 67 69 6e 61 6c 20 66     -- original f
25b20 69 6c 65 20 73 69 7a 65 5c 6e 22 0a 20 20 20 20  ile size\n".    
25b30 20 20 22 20 20 64 61 74 61 20 42 4c 4f 42 20 20    "  data BLOB  
25b40 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20               -- 
25b50 63 6f 6d 70 72 65 73 73 65 64 20 63 6f 6e 74 65  compressed conte
25b60 6e 74 5c 6e 22 0a 20 20 20 20 20 20 22 29 22 3b  nt\n".      ")";
25b70 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
25b80 44 72 6f 70 20 3d 20 22 44 52 4f 50 20 54 41 42  Drop = "DROP TAB
25b90 4c 45 20 49 46 20 45 58 49 53 54 53 20 73 71 6c  LE IF EXISTS sql
25ba0 61 72 22 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  ar";.  const cha
25bb0 72 20 2a 7a 49 6e 73 65 72 74 46 6d 74 20 3d 20  r *zInsertFmt = 
25bc0 0a 20 20 20 20 20 22 52 45 50 4c 41 43 45 20 49  .     "REPLACE I
25bd0 4e 54 4f 20 73 71 6c 61 72 28 6e 61 6d 65 2c 6d  NTO sqlar(name,m
25be0 6f 64 65 2c 6d 74 69 6d 65 2c 73 7a 2c 64 61 74  ode,mtime,sz,dat
25bf0 61 29 5c 6e 22 0a 20 20 20 20 20 22 20 20 53 45  a)\n".     "  SE
25c00 4c 45 43 54 5c 6e 22 0a 20 20 20 20 20 22 20 20  LECT\n".     "  
25c10 20 20 25 73 2c 5c 6e 22 0a 20 20 20 20 20 22 20    %s,\n".     " 
25c20 20 20 20 6d 6f 64 65 2c 5c 6e 22 0a 20 20 20 20     mode,\n".    
25c30 20 22 20 20 20 20 6d 74 69 6d 65 2c 5c 6e 22 0a   "    mtime,\n".
25c40 20 20 20 20 20 22 20 20 20 20 43 41 53 45 20 73       "    CASE s
25c50 75 62 73 74 72 28 6c 73 6d 6f 64 65 28 6d 6f 64  ubstr(lsmode(mod
25c60 65 29 2c 31 2c 31 29 5c 6e 22 0a 20 20 20 20 20  e),1,1)\n".     
25c70 22 20 20 20 20 20 20 57 48 45 4e 20 27 2d 27 20  "      WHEN '-' 
25c80 54 48 45 4e 20 6c 65 6e 67 74 68 28 64 61 74 61  THEN length(data
25c90 29 5c 6e 22 0a 20 20 20 20 20 22 20 20 20 20 20  )\n".     "     
25ca0 20 57 48 45 4e 20 27 64 27 20 54 48 45 4e 20 30   WHEN 'd' THEN 0
25cb0 5c 6e 22 0a 20 20 20 20 20 22 20 20 20 20 20 20  \n".     "      
25cc0 45 4c 53 45 20 2d 31 20 45 4e 44 2c 5c 6e 22 0a  ELSE -1 END,\n".
25cd0 20 20 20 20 20 22 20 20 20 20 43 41 53 45 20 57       "    CASE W
25ce0 48 45 4e 20 6c 73 6d 6f 64 65 28 6d 6f 64 65 29  HEN lsmode(mode)
25cf0 20 4c 49 4b 45 20 27 64 25 25 27 20 54 48 45 4e   LIKE 'd%%' THEN
25d00 20 4e 55 4c 4c 20 65 6c 73 65 20 64 61 74 61 20   NULL else data 
25d10 45 4e 44 5c 6e 22 0a 20 20 20 20 20 22 20 20 46  END\n".     "  F
25d20 52 4f 4d 20 66 73 64 69 72 28 25 51 2c 25 51 29  ROM fsdir(%Q,%Q)
25d30 5c 6e 22 0a 20 20 20 20 20 22 20 20 57 48 45 52  \n".     "  WHER
25d40 45 20 6c 73 6d 6f 64 65 28 6d 6f 64 65 29 20 4e  E lsmode(mode) N
25d50 4f 54 20 4c 49 4b 45 20 27 3f 25 25 27 3b 22 3b  OT LIKE '?%%';";
25d60 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
25d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25d80 20 20 20 2f 2a 20 46 6f 72 20 69 74 65 72 61 74     /* For iterat
25d90 69 6e 67 20 74 68 72 6f 75 67 68 20 61 7a 46 69  ing through azFi
25da0 6c 65 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 72 63  le[] */.  int rc
25db0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
25dc0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
25dd0 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 72  urn code */..  r
25de0 63 20 3d 20 61 72 45 78 65 63 53 71 6c 28 70 41  c = arExecSql(pA
25df0 72 2c 20 22 53 41 56 45 50 4f 49 4e 54 20 61 72  r, "SAVEPOINT ar
25e00 3b 22 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  ;");.  if( rc!=S
25e10 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
25e20 6e 20 72 63 3b 0a 20 20 69 66 28 20 62 55 70 64  n rc;.  if( bUpd
25e30 61 74 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63  ate==0 ){.    rc
25e40 20 3d 20 61 72 45 78 65 63 53 71 6c 28 70 41 72   = arExecSql(pAr
25e50 2c 20 7a 44 72 6f 70 29 3b 0a 20 20 20 20 69 66  , zDrop);.    if
25e60 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
25e70 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d  ) return rc;.  }
25e80 0a 20 20 72 63 20 3d 20 61 72 45 78 65 63 53 71  .  rc = arExecSq
25e90 6c 28 70 41 72 2c 20 7a 43 72 65 61 74 65 29 3b  l(pAr, zCreate);
25ea0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41  .  for(i=0; i<pA
25eb0 72 2d 3e 6e 41 72 67 20 26 26 20 72 63 3d 3d 53  r->nArg && rc==S
25ec0 51 4c 49 54 45 5f 4f 4b 3b 20 69 2b 2b 29 7b 0a  QLITE_OK; i++){.
25ed0 20 20 20 20 63 68 61 72 20 2a 7a 53 71 6c 20 3d      char *zSql =
25ee0 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
25ef0 28 7a 49 6e 73 65 72 74 46 6d 74 2c 0a 20 20 20  (zInsertFmt,.   
25f00 20 20 20 20 20 70 41 72 2d 3e 62 56 65 72 62 6f       pAr->bVerbo
25f10 73 65 20 3f 20 22 73 68 65 6c 6c 5f 70 75 74 73  se ? "shell_puts
25f20 6e 6c 28 6e 61 6d 65 29 22 20 3a 20 22 6e 61 6d  nl(name)" : "nam
25f30 65 22 2c 0a 20 20 20 20 20 20 20 20 70 41 72 2d  e",.        pAr-
25f40 3e 61 7a 41 72 67 5b 69 5d 2c 20 70 41 72 2d 3e  >azArg[i], pAr->
25f50 7a 44 69 72 29 3b 0a 20 20 20 20 72 63 20 3d 20  zDir);.    rc = 
25f60 61 72 45 78 65 63 53 71 6c 28 70 41 72 2c 20 7a  arExecSql(pAr, z
25f70 53 71 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Sql);.    sqlite
25f80 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20  3_free(zSql);.  
25f90 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  }.  if( rc!=SQLI
25fa0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 72 45  TE_OK ){.    arE
25fb0 78 65 63 53 71 6c 28 70 41 72 2c 20 22 52 4f 4c  xecSql(pAr, "ROL
25fc0 4c 42 41 43 4b 20 54 4f 20 61 72 3b 20 52 45 4c  LBACK TO ar; REL
25fd0 45 41 53 45 20 61 72 3b 22 29 3b 0a 20 20 7d 65  EASE ar;");.  }e
25fe0 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 61 72  lse{.    rc = ar
25ff0 45 78 65 63 53 71 6c 28 70 41 72 2c 20 22 52 45  ExecSql(pAr, "RE
26000 4c 45 41 53 45 20 61 72 3b 22 29 3b 0a 20 20 7d  LEASE ar;");.  }
26010 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
26020 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74  ./*.** Implement
26030 61 74 69 6f 6e 20 6f 66 20 22 2e 61 72 22 20 64  ation of ".ar" d
26040 6f 74 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a 73  ot command..*/.s
26050 74 61 74 69 63 20 69 6e 74 20 61 72 44 6f 74 43  tatic int arDotC
26060 6f 6d 6d 61 6e 64 28 0a 20 20 53 68 65 6c 6c 53  ommand(.  ShellS
26070 74 61 74 65 20 2a 70 53 74 61 74 65 2c 20 20 20  tate *pState,   
26080 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
26090 72 65 6e 74 20 73 68 65 6c 6c 20 74 6f 6f 6c 20  rent shell tool 
260a0 73 74 61 74 65 20 2a 2f 0a 20 20 63 68 61 72 20  state */.  char 
260b0 2a 2a 61 7a 41 72 67 2c 20 20 20 20 20 20 20 20  **azArg,        
260c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72             /* Ar
260d0 72 61 79 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ray of arguments
260e0 20 70 61 73 73 65 64 20 74 6f 20 64 6f 74 20 63   passed to dot c
260f0 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
26100 6e 41 72 67 20 20 20 20 20 20 20 20 20 20 20 20  nArg            
26110 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
26120 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73  umber of entries
26130 20 69 6e 20 61 7a 41 72 67 5b 5d 20 2a 2f 0a 29   in azArg[] */.)
26140 7b 0a 20 20 41 72 43 6f 6d 6d 61 6e 64 20 63 6d  {.  ArCommand cm
26150 64 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 6d  d;.  int rc;.  m
26160 65 6d 73 65 74 28 26 63 6d 64 2c 20 30 2c 20 73  emset(&cmd, 0, s
26170 69 7a 65 6f 66 28 63 6d 64 29 29 3b 0a 20 20 72  izeof(cmd));.  r
26180 63 20 3d 20 61 72 50 61 72 73 65 43 6f 6d 6d 61  c = arParseComma
26190 6e 64 28 61 7a 41 72 67 2c 20 6e 41 72 67 2c 20  nd(azArg, nArg, 
261a0 26 63 6d 64 29 3b 0a 20 20 69 66 28 20 72 63 3d  &cmd);.  if( rc=
261b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
261c0 20 20 69 6e 74 20 65 44 62 54 79 70 65 20 3d 20    int eDbType = 
261d0 53 48 45 4c 4c 5f 4f 50 45 4e 5f 55 4e 53 50 45  SHELL_OPEN_UNSPE
261e0 43 3b 0a 20 20 20 20 63 6d 64 2e 70 20 3d 20 70  C;.    cmd.p = p
261f0 53 74 61 74 65 3b 0a 20 20 20 20 63 6d 64 2e 64  State;.    cmd.d
26200 62 20 3d 20 70 53 74 61 74 65 2d 3e 64 62 3b 0a  b = pState->db;.
26210 20 20 20 20 69 66 28 20 63 6d 64 2e 7a 46 69 6c      if( cmd.zFil
26220 65 20 29 7b 0a 20 20 20 20 20 20 65 44 62 54 79  e ){.      eDbTy
26230 70 65 20 3d 20 64 65 64 75 63 65 44 61 74 61 62  pe = deduceDatab
26240 61 73 65 54 79 70 65 28 63 6d 64 2e 7a 46 69 6c  aseType(cmd.zFil
26250 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  e);.    }else{. 
26260 20 20 20 20 20 65 44 62 54 79 70 65 20 3d 20 70       eDbType = p
26270 53 74 61 74 65 2d 3e 6f 70 65 6e 4d 6f 64 65 3b  State->openMode;
26280 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 65  .    }.    if( e
26290 44 62 54 79 70 65 3d 3d 53 48 45 4c 4c 5f 4f 50  DbType==SHELL_OP
262a0 45 4e 5f 5a 49 50 46 49 4c 45 20 29 7b 0a 20 20  EN_ZIPFILE ){.  
262b0 20 20 20 20 69 66 28 20 63 6d 64 2e 7a 46 69 6c      if( cmd.zFil
262c0 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e==0 ){.        
262d0 63 6d 64 2e 7a 53 72 63 54 61 62 6c 65 20 3d 20  cmd.zSrcTable = 
262e0 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
262f0 22 7a 69 70 22 29 3b 0a 20 20 20 20 20 20 7d 65  "zip");.      }e
26300 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63 6d 64  lse{.        cmd
26310 2e 7a 53 72 63 54 61 62 6c 65 20 3d 20 73 71 6c  .zSrcTable = sql
26320 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 7a 69  ite3_mprintf("zi
26330 70 66 69 6c 65 28 25 51 29 22 2c 20 63 6d 64 2e  pfile(%Q)", cmd.
26340 7a 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 7d 0a  zFile);.      }.
26350 20 20 20 20 20 20 69 66 28 20 63 6d 64 2e 65 43        if( cmd.eC
26360 6d 64 3d 3d 41 52 5f 43 4d 44 5f 43 52 45 41 54  md==AR_CMD_CREAT
26370 45 20 7c 7c 20 63 6d 64 2e 65 43 6d 64 3d 3d 41  E || cmd.eCmd==A
26380 52 5f 43 4d 44 5f 55 50 44 41 54 45 20 29 7b 0a  R_CMD_UPDATE ){.
26390 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69          utf8_pri
263a0 6e 74 66 28 73 74 64 65 72 72 2c 20 22 7a 69 70  ntf(stderr, "zip
263b0 20 61 72 63 68 69 76 65 73 20 61 72 65 20 72 65   archives are re
263c0 61 64 2d 6f 6e 6c 79 5c 6e 22 29 3b 0a 20 20 20  ad-only\n");.   
263d0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
263e0 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20  _ERROR;.        
263f0 67 6f 74 6f 20 65 6e 64 5f 61 72 5f 63 6f 6d 6d  goto end_ar_comm
26400 61 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  and;.      }.   
26410 20 20 20 63 6d 64 2e 62 5a 69 70 20 3d 20 31 3b     cmd.bZip = 1;
26420 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63  .    }else if( c
26430 6d 64 2e 7a 46 69 6c 65 20 29 7b 0a 20 20 20 20  md.zFile ){.    
26440 20 20 69 6e 74 20 66 6c 61 67 73 3b 0a 20 20 20    int flags;.   
26450 20 20 20 69 66 28 20 63 6d 64 2e 62 41 70 70 65     if( cmd.bAppe
26460 6e 64 20 29 20 65 44 62 54 79 70 65 20 3d 20 53  nd ) eDbType = S
26470 48 45 4c 4c 5f 4f 50 45 4e 5f 41 50 50 45 4e 44  HELL_OPEN_APPEND
26480 56 46 53 3b 0a 20 20 20 20 20 20 69 66 28 20 63  VFS;.      if( c
26490 6d 64 2e 65 43 6d 64 3d 3d 41 52 5f 43 4d 44 5f  md.eCmd==AR_CMD_
264a0 43 52 45 41 54 45 20 7c 7c 20 63 6d 64 2e 65 43  CREATE || cmd.eC
264b0 6d 64 3d 3d 41 52 5f 43 4d 44 5f 55 50 44 41 54  md==AR_CMD_UPDAT
264c0 45 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6c 61  E ){.        fla
264d0 67 73 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs = SQLITE_OPEN
264e0 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54  _READWRITE|SQLIT
264f0 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 3b 0a 20  E_OPEN_CREATE;. 
26500 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
26510 20 20 20 20 66 6c 61 67 73 20 3d 20 53 51 4c 49      flags = SQLI
26520 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59  TE_OPEN_READONLY
26530 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
26540 63 6d 64 2e 64 62 20 3d 20 30 3b 0a 20 20 20 20  cmd.db = 0;.    
26550 20 20 69 66 28 20 63 6d 64 2e 62 44 72 79 52 75    if( cmd.bDryRu
26560 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66  n ){.        utf
26570 38 5f 70 72 69 6e 74 66 28 70 53 74 61 74 65 2d  8_printf(pState-
26580 3e 6f 75 74 2c 20 22 2d 2d 20 6f 70 65 6e 20 64  >out, "-- open d
26590 61 74 61 62 61 73 65 20 27 25 73 27 25 73 5c 6e  atabase '%s'%s\n
265a0 22 2c 20 63 6d 64 2e 7a 46 69 6c 65 2c 0a 20 20  ", cmd.zFile,.  
265b0 20 20 20 20 20 20 20 20 20 20 20 65 44 62 54 79             eDbTy
265c0 70 65 3d 3d 53 48 45 4c 4c 5f 4f 50 45 4e 5f 41  pe==SHELL_OPEN_A
265d0 50 50 45 4e 44 56 46 53 20 3f 20 22 20 75 73 69  PPENDVFS ? " usi
265e0 6e 67 20 27 61 70 6e 64 76 66 73 27 22 20 3a 20  ng 'apndvfs'" : 
265f0 22 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  "");.      }.   
26600 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
26610 6f 70 65 6e 5f 76 32 28 63 6d 64 2e 7a 46 69 6c  open_v2(cmd.zFil
26620 65 2c 20 26 63 6d 64 2e 64 62 2c 20 66 6c 61 67  e, &cmd.db, flag
26630 73 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  s, .            
26640 20 65 44 62 54 79 70 65 3d 3d 53 48 45 4c 4c 5f   eDbType==SHELL_
26650 4f 50 45 4e 5f 41 50 50 45 4e 44 56 46 53 20 3f  OPEN_APPENDVFS ?
26660 20 22 61 70 6e 64 76 66 73 22 20 3a 20 30 29 3b   "apndvfs" : 0);
26670 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
26680 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
26690 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
266a0 73 74 64 65 72 72 2c 20 22 63 61 6e 6e 6f 74 20  stderr, "cannot 
266b0 6f 70 65 6e 20 66 69 6c 65 3a 20 25 73 20 28 25  open file: %s (%
266c0 73 29 5c 6e 22 2c 20 0a 20 20 20 20 20 20 20 20  s)\n", .        
266d0 20 20 20 20 63 6d 64 2e 7a 46 69 6c 65 2c 20 73      cmd.zFile, s
266e0 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 63 6d  qlite3_errmsg(cm
266f0 64 2e 64 62 29 0a 20 20 20 20 20 20 20 20 29 3b  d.db).        );
26700 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e  .        goto en
26710 64 5f 61 72 5f 63 6f 6d 6d 61 6e 64 3b 0a 20 20  d_ar_command;.  
26720 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
26730 74 65 33 5f 66 69 6c 65 69 6f 5f 69 6e 69 74 28  te3_fileio_init(
26740 63 6d 64 2e 64 62 2c 20 30 2c 20 30 29 3b 0a 23  cmd.db, 0, 0);.#
26750 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 56  ifdef SQLITE_HAV
26760 45 5f 5a 4c 49 42 0a 20 20 20 20 20 20 73 71 6c  E_ZLIB.      sql
26770 69 74 65 33 5f 73 71 6c 61 72 5f 69 6e 69 74 28  ite3_sqlar_init(
26780 63 6d 64 2e 64 62 2c 20 30 2c 20 30 29 3b 0a 23  cmd.db, 0, 0);.#
26790 65 6e 64 69 66 0a 20 20 20 20 20 20 73 71 6c 69  endif.      sqli
267a0 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
267b0 69 6f 6e 28 63 6d 64 2e 64 62 2c 20 22 73 68 65  ion(cmd.db, "she
267c0 6c 6c 5f 70 75 74 73 6e 6c 22 2c 20 31 2c 20 53  ll_putsnl", 1, S
267d0 51 4c 49 54 45 5f 55 54 46 38 2c 20 63 6d 64 2e  QLITE_UTF8, cmd.
267e0 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  p,.             
267f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26800 20 73 68 65 6c 6c 50 75 74 73 46 75 6e 63 2c 20   shellPutsFunc, 
26810 30 2c 20 30 29 3b 0a 0a 20 20 20 20 7d 0a 20 20  0, 0);..    }.  
26820 20 20 69 66 28 20 63 6d 64 2e 7a 53 72 63 54 61    if( cmd.zSrcTa
26830 62 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ble==0 ){.      
26840 69 66 28 20 63 6d 64 2e 65 43 6d 64 21 3d 41 52  if( cmd.eCmd!=AR
26850 5f 43 4d 44 5f 43 52 45 41 54 45 0a 20 20 20 20  _CMD_CREATE.    
26860 20 20 20 26 26 20 73 71 6c 69 74 65 33 5f 74 61     && sqlite3_ta
26870 62 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d 65 74 61 64  ble_column_metad
26880 61 74 61 28 63 6d 64 2e 64 62 2c 30 2c 22 73 71  ata(cmd.db,0,"sq
26890 6c 61 72 22 2c 22 6e 61 6d 65 22 2c 30 2c 30 2c  lar","name",0,0,
268a0 30 2c 30 2c 30 29 0a 20 20 20 20 20 20 29 7b 0a  0,0,0).      ){.
268b0 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69          utf8_pri
268c0 6e 74 66 28 73 74 64 65 72 72 2c 20 22 64 61 74  ntf(stderr, "dat
268d0 61 62 61 73 65 20 64 6f 65 73 20 6e 6f 74 20 63  abase does not c
268e0 6f 6e 74 61 69 6e 20 61 6e 20 27 73 71 6c 61 72  ontain an 'sqlar
268f0 27 20 74 61 62 6c 65 5c 6e 22 29 3b 0a 20 20 20  ' table\n");.   
26900 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
26910 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20  _ERROR;.        
26920 67 6f 74 6f 20 65 6e 64 5f 61 72 5f 63 6f 6d 6d  goto end_ar_comm
26930 61 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  and;.      }.   
26940 20 20 20 63 6d 64 2e 7a 53 72 63 54 61 62 6c 65     cmd.zSrcTable
26950 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
26960 74 66 28 22 73 71 6c 61 72 22 29 3b 0a 20 20 20  tf("sqlar");.   
26970 20 7d 0a 0a 20 20 20 20 73 77 69 74 63 68 28 20   }..    switch( 
26980 63 6d 64 2e 65 43 6d 64 20 29 7b 0a 20 20 20 20  cmd.eCmd ){.    
26990 20 20 63 61 73 65 20 41 52 5f 43 4d 44 5f 43 52    case AR_CMD_CR
269a0 45 41 54 45 3a 0a 20 20 20 20 20 20 20 20 72 63  EATE:.        rc
269b0 20 3d 20 61 72 43 72 65 61 74 65 4f 72 55 70 64   = arCreateOrUpd
269c0 61 74 65 43 6f 6d 6d 61 6e 64 28 26 63 6d 64 2c  ateCommand(&cmd,
269d0 20 30 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65   0);.        bre
269e0 61 6b 3b 0a 0a 20 20 20 20 20 20 63 61 73 65 20  ak;..      case 
269f0 41 52 5f 43 4d 44 5f 45 58 54 52 41 43 54 3a 0a  AR_CMD_EXTRACT:.
26a00 20 20 20 20 20 20 20 20 72 63 20 3d 20 61 72 45          rc = arE
26a10 78 74 72 61 63 74 43 6f 6d 6d 61 6e 64 28 26 63  xtractCommand(&c
26a20 6d 64 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  md);.        bre
26a30 61 6b 3b 0a 0a 20 20 20 20 20 20 63 61 73 65 20  ak;..      case 
26a40 41 52 5f 43 4d 44 5f 4c 49 53 54 3a 0a 20 20 20  AR_CMD_LIST:.   
26a50 20 20 20 20 20 72 63 20 3d 20 61 72 4c 69 73 74       rc = arList
26a60 43 6f 6d 6d 61 6e 64 28 26 63 6d 64 29 3b 0a 20  Command(&cmd);. 
26a70 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20         break;.. 
26a80 20 20 20 20 20 63 61 73 65 20 41 52 5f 43 4d 44       case AR_CMD
26a90 5f 48 45 4c 50 3a 0a 20 20 20 20 20 20 20 20 61  _HELP:.        a
26aa0 72 55 73 61 67 65 28 70 53 74 61 74 65 2d 3e 6f  rUsage(pState->o
26ab0 75 74 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  ut);.        bre
26ac0 61 6b 3b 0a 0a 20 20 20 20 20 20 64 65 66 61 75  ak;..      defau
26ad0 6c 74 3a 0a 20 20 20 20 20 20 20 20 61 73 73 65  lt:.        asse
26ae0 72 74 28 20 63 6d 64 2e 65 43 6d 64 3d 3d 41 52  rt( cmd.eCmd==AR
26af0 5f 43 4d 44 5f 55 50 44 41 54 45 20 29 3b 0a 20  _CMD_UPDATE );. 
26b00 20 20 20 20 20 20 20 72 63 20 3d 20 61 72 43 72         rc = arCr
26b10 65 61 74 65 4f 72 55 70 64 61 74 65 43 6f 6d 6d  eateOrUpdateComm
26b20 61 6e 64 28 26 63 6d 64 2c 20 31 29 3b 0a 20 20  and(&cmd, 1);.  
26b30 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
26b40 20 7d 0a 20 20 7d 0a 65 6e 64 5f 61 72 5f 63 6f   }.  }.end_ar_co
26b50 6d 6d 61 6e 64 3a 0a 20 20 69 66 28 20 63 6d 64  mmand:.  if( cmd
26b60 2e 64 62 21 3d 70 53 74 61 74 65 2d 3e 64 62 20  .db!=pState->db 
26b70 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63  ){.    sqlite3_c
26b80 6c 6f 73 65 28 63 6d 64 2e 64 62 29 3b 0a 20 20  lose(cmd.db);.  
26b90 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  }.  sqlite3_free
26ba0 28 63 6d 64 2e 7a 53 72 63 54 61 62 6c 65 29 3b  (cmd.zSrcTable);
26bb0 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
26bc0 0a 2f 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 22  ./* End of the "
26bd0 2e 61 72 63 68 69 76 65 22 20 6f 72 20 22 2e 61  .archive" or ".a
26be0 72 22 20 63 6f 6d 6d 61 6e 64 20 6c 6f 67 69 63  r" command logic
26bf0 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
26c00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
26c10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
26c20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
26c30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
26c40 2a 2a 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a 20 21  ***/.#endif /* !
26c50 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
26c60 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
26c70 29 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c  ) && defined(SQL
26c80 49 54 45 5f 48 41 56 45 5f 5a 4c 49 42 29 20 2a  ITE_HAVE_ZLIB) *
26c90 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 61 6e 20  /.../*.** If an 
26ca0 69 6e 70 75 74 20 6c 69 6e 65 20 62 65 67 69 6e  input line begin
26cb0 73 20 77 69 74 68 20 22 2e 22 20 74 68 65 6e 20  s with "." then 
26cc0 69 6e 76 6f 6b 65 20 74 68 69 73 20 72 6f 75 74  invoke this rout
26cd0 69 6e 65 20 74 6f 0a 2a 2a 20 70 72 6f 63 65 73  ine to.** proces
26ce0 73 20 74 68 61 74 20 6c 69 6e 65 2e 0a 2a 2a 0a  s that line..**.
26cf0 2a 2a 20 52 65 74 75 72 6e 20 31 20 6f 6e 20 65  ** Return 1 on e
26d00 72 72 6f 72 2c 20 32 20 74 6f 20 65 78 69 74 2c  rror, 2 to exit,
26d10 20 61 6e 64 20 30 20 6f 74 68 65 72 77 69 73 65   and 0 otherwise
26d20 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
26d30 64 6f 5f 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 28  do_meta_command(
26d40 63 68 61 72 20 2a 7a 4c 69 6e 65 2c 20 53 68 65  char *zLine, She
26d50 6c 6c 53 74 61 74 65 20 2a 70 29 7b 0a 20 20 69  llState *p){.  i
26d60 6e 74 20 68 20 3d 20 31 3b 0a 20 20 69 6e 74 20  nt h = 1;.  int 
26d70 6e 41 72 67 20 3d 20 30 3b 0a 20 20 69 6e 74 20  nArg = 0;.  int 
26d80 6e 2c 20 63 3b 0a 20 20 69 6e 74 20 72 63 20 3d  n, c;.  int rc =
26d90 20 30 3b 0a 20 20 63 68 61 72 20 2a 61 7a 41 72   0;.  char *azAr
26da0 67 5b 35 30 5d 3b 0a 0a 23 69 66 6e 64 65 66 20  g[50];..#ifndef 
26db0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
26dc0 55 41 4c 54 41 42 4c 45 0a 20 20 69 66 28 20 70  UALTABLE.  if( p
26dd0 2d 3e 65 78 70 65 72 74 2e 70 45 78 70 65 72 74  ->expert.pExpert
26de0 20 29 7b 0a 20 20 20 20 65 78 70 65 72 74 46 69   ){.    expertFi
26df0 6e 69 73 68 28 70 2c 20 31 2c 20 30 29 3b 0a 20  nish(p, 1, 0);. 
26e00 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
26e10 50 61 72 73 65 20 74 68 65 20 69 6e 70 75 74 20  Parse the input 
26e20 6c 69 6e 65 20 69 6e 74 6f 20 74 6f 6b 65 6e 73  line into tokens
26e30 2e 0a 20 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20  ..  */.  while( 
26e40 7a 4c 69 6e 65 5b 68 5d 20 26 26 20 6e 41 72 67  zLine[h] && nArg
26e50 3c 41 72 72 61 79 53 69 7a 65 28 61 7a 41 72 67  <ArraySize(azArg
26e60 29 20 29 7b 0a 20 20 20 20 77 68 69 6c 65 28 20  ) ){.    while( 
26e70 49 73 53 70 61 63 65 28 7a 4c 69 6e 65 5b 68 5d  IsSpace(zLine[h]
26e80 29 20 29 7b 20 68 2b 2b 3b 20 7d 0a 20 20 20 20  ) ){ h++; }.    
26e90 69 66 28 20 7a 4c 69 6e 65 5b 68 5d 3d 3d 30 20  if( zLine[h]==0 
26ea0 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 66 28  ) break;.    if(
26eb0 20 7a 4c 69 6e 65 5b 68 5d 3d 3d 27 5c 27 27 20   zLine[h]=='\'' 
26ec0 7c 7c 20 7a 4c 69 6e 65 5b 68 5d 3d 3d 27 22 27  || zLine[h]=='"'
26ed0 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 64 65   ){.      int de
26ee0 6c 69 6d 20 3d 20 7a 4c 69 6e 65 5b 68 2b 2b 5d  lim = zLine[h++]
26ef0 3b 0a 20 20 20 20 20 20 61 7a 41 72 67 5b 6e 41  ;.      azArg[nA
26f00 72 67 2b 2b 5d 20 3d 20 26 7a 4c 69 6e 65 5b 68  rg++] = &zLine[h
26f10 5d 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  ];.      while( 
26f20 7a 4c 69 6e 65 5b 68 5d 20 26 26 20 7a 4c 69 6e  zLine[h] && zLin
26f30 65 5b 68 5d 21 3d 64 65 6c 69 6d 20 29 7b 0a 20  e[h]!=delim ){. 
26f40 20 20 20 20 20 20 20 69 66 28 20 7a 4c 69 6e 65         if( zLine
26f50 5b 68 5d 3d 3d 27 5c 5c 27 20 26 26 20 64 65 6c  [h]=='\\' && del
26f60 69 6d 3d 3d 27 22 27 20 26 26 20 7a 4c 69 6e 65  im=='"' && zLine
26f70 5b 68 2b 31 5d 21 3d 30 20 29 20 68 2b 2b 3b 0a  [h+1]!=0 ) h++;.
26f80 20 20 20 20 20 20 20 20 68 2b 2b 3b 0a 20 20 20          h++;.   
26f90 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 7a     }.      if( z
26fa0 4c 69 6e 65 5b 68 5d 3d 3d 64 65 6c 69 6d 20 29  Line[h]==delim )
26fb0 7b 0a 20 20 20 20 20 20 20 20 7a 4c 69 6e 65 5b  {.        zLine[
26fc0 68 2b 2b 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  h++] = 0;.      
26fd0 7d 0a 20 20 20 20 20 20 69 66 28 20 64 65 6c 69  }.      if( deli
26fe0 6d 3d 3d 27 22 27 20 29 20 72 65 73 6f 6c 76 65  m=='"' ) resolve
26ff0 5f 62 61 63 6b 73 6c 61 73 68 65 73 28 61 7a 41  _backslashes(azA
27000 72 67 5b 6e 41 72 67 2d 31 5d 29 3b 0a 20 20 20  rg[nArg-1]);.   
27010 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 7a   }else{.      az
27020 41 72 67 5b 6e 41 72 67 2b 2b 5d 20 3d 20 26 7a  Arg[nArg++] = &z
27030 4c 69 6e 65 5b 68 5d 3b 0a 20 20 20 20 20 20 77  Line[h];.      w
27040 68 69 6c 65 28 20 7a 4c 69 6e 65 5b 68 5d 20 26  hile( zLine[h] &
27050 26 20 21 49 73 53 70 61 63 65 28 7a 4c 69 6e 65  & !IsSpace(zLine
27060 5b 68 5d 29 20 29 7b 20 68 2b 2b 3b 20 7d 0a 20  [h]) ){ h++; }. 
27070 20 20 20 20 20 69 66 28 20 7a 4c 69 6e 65 5b 68       if( zLine[h
27080 5d 20 29 20 7a 4c 69 6e 65 5b 68 2b 2b 5d 20 3d  ] ) zLine[h++] =
27090 20 30 3b 0a 20 20 20 20 20 20 72 65 73 6f 6c 76   0;.      resolv
270a0 65 5f 62 61 63 6b 73 6c 61 73 68 65 73 28 61 7a  e_backslashes(az
270b0 41 72 67 5b 6e 41 72 67 2d 31 5d 29 3b 0a 20 20  Arg[nArg-1]);.  
270c0 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 72    }.  }..  /* Pr
270d0 6f 63 65 73 73 20 74 68 65 20 69 6e 70 75 74 20  ocess the input 
270e0 6c 69 6e 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  line..  */.  if(
270f0 20 6e 41 72 67 3d 3d 30 20 29 20 72 65 74 75 72   nArg==0 ) retur
27100 6e 20 30 3b 20 2f 2a 20 6e 6f 20 74 6f 6b 65 6e  n 0; /* no token
27110 73 2c 20 6e 6f 20 65 72 72 6f 72 20 2a 2f 0a 20  s, no error */. 
27120 20 6e 20 3d 20 73 74 72 6c 65 6e 33 30 28 61 7a   n = strlen30(az
27130 41 72 67 5b 30 5d 29 3b 0a 20 20 63 20 3d 20 61  Arg[0]);.  c = a
27140 7a 41 72 67 5b 30 5d 5b 30 5d 3b 0a 0a 23 69 66  zArg[0][0];..#if
27150 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
27160 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20  _AUTHORIZATION. 
27170 20 69 66 28 20 63 3d 3d 27 61 27 20 26 26 20 73   if( c=='a' && s
27180 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c  trncmp(azArg[0],
27190 20 22 61 75 74 68 22 2c 20 6e 29 3d 3d 30 20 29   "auth", n)==0 )
271a0 7b 0a 20 20 20 20 69 66 28 20 6e 41 72 67 21 3d  {.    if( nArg!=
271b0 32 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70  2 ){.      raw_p
271c0 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55  rintf(stderr, "U
271d0 73 61 67 65 3a 20 2e 61 75 74 68 20 4f 4e 7c 4f  sage: .auth ON|O
271e0 46 46 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 63  FF\n");.      rc
271f0 20 3d 20 31 3b 0a 20 20 20 20 20 20 67 6f 74 6f   = 1;.      goto
27200 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78   meta_command_ex
27210 69 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6f 70  it;.    }.    op
27220 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a 20 20 20  en_db(p, 0);.   
27230 20 69 66 28 20 62 6f 6f 6c 65 61 6e 56 61 6c 75   if( booleanValu
27240 65 28 61 7a 41 72 67 5b 31 5d 29 20 29 7b 0a 20  e(azArg[1]) ){. 
27250 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 65 74       sqlite3_set
27260 5f 61 75 74 68 6f 72 69 7a 65 72 28 70 2d 3e 64  _authorizer(p->d
27270 62 2c 20 73 68 65 6c 6c 41 75 74 68 2c 20 70 29  b, shellAuth, p)
27280 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
27290 20 20 20 73 71 6c 69 74 65 33 5f 73 65 74 5f 61     sqlite3_set_a
272a0 75 74 68 6f 72 69 7a 65 72 28 70 2d 3e 64 62 2c  uthorizer(p->db,
272b0 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20   0, 0);.    }.  
272c0 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 0a 23 69  }else.#endif..#i
272d0 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
272e0 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
272f0 42 4c 45 29 20 26 26 20 64 65 66 69 6e 65 64 28  BLE) && defined(
27300 53 51 4c 49 54 45 5f 48 41 56 45 5f 5a 4c 49 42  SQLITE_HAVE_ZLIB
27310 29 0a 20 20 69 66 28 20 63 3d 3d 27 61 27 20 26  ).  if( c=='a' &
27320 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b  & strncmp(azArg[
27330 30 5d 2c 20 22 61 72 63 68 69 76 65 22 2c 20 6e  0], "archive", n
27340 29 3d 3d 30 20 29 7b 0a 20 20 20 20 6f 70 65 6e  )==0 ){.    open
27350 5f 64 62 28 70 2c 20 30 29 3b 0a 20 20 20 20 72  _db(p, 0);.    r
27360 63 20 3d 20 61 72 44 6f 74 43 6f 6d 6d 61 6e 64  c = arDotCommand
27370 28 70 2c 20 61 7a 41 72 67 2c 20 6e 41 72 67 29  (p, azArg, nArg)
27380 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66  ;.  }else.#endif
27390 0a 0a 20 20 69 66 28 20 28 63 3d 3d 27 62 27 20  ..  if( (c=='b' 
273a0 26 26 20 6e 3e 3d 33 20 26 26 20 73 74 72 6e 63  && n>=3 && strnc
273b0 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 62 61  mp(azArg[0], "ba
273c0 63 6b 75 70 22 2c 20 6e 29 3d 3d 30 29 0a 20 20  ckup", n)==0).  
273d0 20 7c 7c 20 28 63 3d 3d 27 73 27 20 26 26 20 6e   || (c=='s' && n
273e0 3e 3d 33 20 26 26 20 73 74 72 6e 63 6d 70 28 61  >=3 && strncmp(a
273f0 7a 41 72 67 5b 30 5d 2c 20 22 73 61 76 65 22 2c  zArg[0], "save",
27400 20 6e 29 3d 3d 30 29 0a 20 20 29 7b 0a 20 20 20   n)==0).  ){.   
27410 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 65   const char *zDe
27420 73 74 46 69 6c 65 20 3d 20 30 3b 0a 20 20 20 20  stFile = 0;.    
27430 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 20  const char *zDb 
27440 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  = 0;.    sqlite3
27450 20 2a 70 44 65 73 74 3b 0a 20 20 20 20 73 71 6c   *pDest;.    sql
27460 69 74 65 33 5f 62 61 63 6b 75 70 20 2a 70 42 61  ite3_backup *pBa
27470 63 6b 75 70 3b 0a 20 20 20 20 69 6e 74 20 6a 3b  ckup;.    int j;
27480 0a 20 20 20 20 66 6f 72 28 6a 3d 31 3b 20 6a 3c  .    for(j=1; j<
27490 6e 41 72 67 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  nArg; j++){.    
274a0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20    const char *z 
274b0 3d 20 61 7a 41 72 67 5b 6a 5d 3b 0a 20 20 20 20  = azArg[j];.    
274c0 20 20 69 66 28 20 7a 5b 30 5d 3d 3d 27 2d 27 20    if( z[0]=='-' 
274d0 29 7b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65  ){.        while
274e0 28 20 7a 5b 30 5d 3d 3d 27 2d 27 20 29 20 7a 2b  ( z[0]=='-' ) z+
274f0 2b 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f  +;.        /* No
27500 20 6f 70 74 69 6f 6e 73 20 74 6f 20 70 72 6f 63   options to proc
27510 65 73 73 20 61 74 20 74 68 69 73 20 74 69 6d 65  ess at this time
27520 20 2a 2f 0a 20 20 20 20 20 20 20 20 7b 0a 20 20   */.        {.  
27530 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69          utf8_pri
27540 6e 74 66 28 73 74 64 65 72 72 2c 20 22 75 6e 6b  ntf(stderr, "unk
27550 6e 6f 77 6e 20 6f 70 74 69 6f 6e 3a 20 25 73 5c  nown option: %s\
27560 6e 22 2c 20 61 7a 41 72 67 5b 6a 5d 29 3b 0a 20  n", azArg[j]);. 
27570 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
27580 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  1;.        }.   
27590 20 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 44 65     }else if( zDe
275a0 73 74 46 69 6c 65 3d 3d 30 20 29 7b 0a 20 20 20  stFile==0 ){.   
275b0 20 20 20 20 20 7a 44 65 73 74 46 69 6c 65 20 3d       zDestFile =
275c0 20 61 7a 41 72 67 5b 6a 5d 3b 0a 20 20 20 20 20   azArg[j];.     
275d0 20 7d 65 6c 73 65 20 69 66 28 20 7a 44 62 3d 3d   }else if( zDb==
275e0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 44 62  0 ){.        zDb
275f0 20 3d 20 7a 44 65 73 74 46 69 6c 65 3b 0a 20 20   = zDestFile;.  
27600 20 20 20 20 20 20 7a 44 65 73 74 46 69 6c 65 20        zDestFile 
27610 3d 20 61 7a 41 72 67 5b 6a 5d 3b 0a 20 20 20 20  = azArg[j];.    
27620 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
27630 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65   raw_printf(stde
27640 72 72 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 61 72  rr, "too many ar
27650 67 75 6d 65 6e 74 73 20 74 6f 20 2e 62 61 63 6b  guments to .back
27660 75 70 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20 20  up\n");.        
27670 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20  return 1;.      
27680 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
27690 7a 44 65 73 74 46 69 6c 65 3d 3d 30 20 29 7b 0a  zDestFile==0 ){.
276a0 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
276b0 28 73 74 64 65 72 72 2c 20 22 6d 69 73 73 69 6e  (stderr, "missin
276c0 67 20 46 49 4c 45 4e 41 4d 45 20 61 72 67 75 6d  g FILENAME argum
276d0 65 6e 74 20 6f 6e 20 2e 62 61 63 6b 75 70 5c 6e  ent on .backup\n
276e0 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ");.      return
276f0 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   1;.    }.    if
27700 28 20 7a 44 62 3d 3d 30 20 29 20 7a 44 62 20 3d  ( zDb==0 ) zDb =
27710 20 22 6d 61 69 6e 22 3b 0a 20 20 20 20 72 63 20   "main";.    rc 
27720 3d 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 7a  = sqlite3_open(z
27730 44 65 73 74 46 69 6c 65 2c 20 26 70 44 65 73 74  DestFile, &pDest
27740 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
27750 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
27760 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74    utf8_printf(st
27770 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 63 61  derr, "Error: ca
27780 6e 6e 6f 74 20 6f 70 65 6e 20 5c 22 25 73 5c 22  nnot open \"%s\"
27790 5c 6e 22 2c 20 7a 44 65 73 74 46 69 6c 65 29 3b  \n", zDestFile);
277a0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63  .      sqlite3_c
277b0 6c 6f 73 65 28 70 44 65 73 74 29 3b 0a 20 20 20  lose(pDest);.   
277c0 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
277d0 20 7d 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28 70   }.    open_db(p
277e0 2c 20 30 29 3b 0a 20 20 20 20 70 42 61 63 6b 75  , 0);.    pBacku
277f0 70 20 3d 20 73 71 6c 69 74 65 33 5f 62 61 63 6b  p = sqlite3_back
27800 75 70 5f 69 6e 69 74 28 70 44 65 73 74 2c 20 22  up_init(pDest, "
27810 6d 61 69 6e 22 2c 20 70 2d 3e 64 62 2c 20 7a 44  main", p->db, zD
27820 62 29 3b 0a 20 20 20 20 69 66 28 20 70 42 61 63  b);.    if( pBac
27830 6b 75 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  kup==0 ){.      
27840 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65  utf8_printf(stde
27850 72 72 2c 20 22 45 72 72 6f 72 3a 20 25 73 5c 6e  rr, "Error: %s\n
27860 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73  ", sqlite3_errms
27870 67 28 70 44 65 73 74 29 29 3b 0a 20 20 20 20 20  g(pDest));.     
27880 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 70   sqlite3_close(p
27890 44 65 73 74 29 3b 0a 20 20 20 20 20 20 72 65 74  Dest);.      ret
278a0 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 1;.    }.   
278b0 20 77 68 69 6c 65 28 20 20 28 72 63 20 3d 20 73   while(  (rc = s
278c0 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 5f 73 74  qlite3_backup_st
278d0 65 70 28 70 42 61 63 6b 75 70 2c 31 30 30 29 29  ep(pBackup,100))
278e0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 7d 0a  ==SQLITE_OK ){}.
278f0 20 20 20 20 73 71 6c 69 74 65 33 5f 62 61 63 6b      sqlite3_back
27900 75 70 5f 66 69 6e 69 73 68 28 70 42 61 63 6b 75  up_finish(pBacku
27910 70 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  p);.    if( rc==
27920 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20  SQLITE_DONE ){. 
27930 20 20 20 20 20 72 63 20 3d 20 30 3b 0a 20 20 20       rc = 0;.   
27940 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 75 74   }else{.      ut
27950 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  f8_printf(stderr
27960 2c 20 22 45 72 72 6f 72 3a 20 25 73 5c 6e 22 2c  , "Error: %s\n",
27970 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
27980 70 44 65 73 74 29 29 3b 0a 20 20 20 20 20 20 72  pDest));.      r
27990 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  c = 1;.    }.   
279a0 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 70   sqlite3_close(p
279b0 44 65 73 74 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a  Dest);.  }else..
279c0 20 20 69 66 28 20 63 3d 3d 27 62 27 20 26 26 20    if( c=='b' && 
279d0 6e 3e 3d 33 20 26 26 20 73 74 72 6e 63 6d 70 28  n>=3 && strncmp(
279e0 61 7a 41 72 67 5b 30 5d 2c 20 22 62 61 69 6c 22  azArg[0], "bail"
279f0 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69  , n)==0 ){.    i
27a00 66 28 20 6e 41 72 67 3d 3d 32 20 29 7b 0a 20 20  f( nArg==2 ){.  
27a10 20 20 20 20 62 61 69 6c 5f 6f 6e 5f 65 72 72 6f      bail_on_erro
27a20 72 20 3d 20 62 6f 6f 6c 65 61 6e 56 61 6c 75 65  r = booleanValue
27a30 28 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20  (azArg[1]);.    
27a40 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 61 77  }else{.      raw
27a50 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
27a60 22 55 73 61 67 65 3a 20 2e 62 61 69 6c 20 6f 6e  "Usage: .bail on
27a70 7c 6f 66 66 5c 6e 22 29 3b 0a 20 20 20 20 20 20  |off\n");.      
27a80 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  rc = 1;.    }.  
27a90 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d  }else..  if( c==
27aa0 27 62 27 20 26 26 20 6e 3e 3d 33 20 26 26 20 73  'b' && n>=3 && s
27ab0 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c  trncmp(azArg[0],
27ac0 20 22 62 69 6e 61 72 79 22 2c 20 6e 29 3d 3d 30   "binary", n)==0
27ad0 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 41 72 67   ){.    if( nArg
27ae0 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ==2 ){.      if(
27af0 20 62 6f 6f 6c 65 61 6e 56 61 6c 75 65 28 61 7a   booleanValue(az
27b00 41 72 67 5b 31 5d 29 20 29 7b 0a 20 20 20 20 20  Arg[1]) ){.     
27b10 20 20 20 73 65 74 42 69 6e 61 72 79 4d 6f 64 65     setBinaryMode
27b20 28 70 2d 3e 6f 75 74 2c 20 31 29 3b 0a 20 20 20  (p->out, 1);.   
27b30 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
27b40 20 20 73 65 74 54 65 78 74 4d 6f 64 65 28 70 2d    setTextMode(p-
27b50 3e 6f 75 74 2c 20 31 29 3b 0a 20 20 20 20 20 20  >out, 1);.      
27b60 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
27b70 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74     raw_printf(st
27b80 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 62  derr, "Usage: .b
27b90 69 6e 61 72 79 20 6f 6e 7c 6f 66 66 5c 6e 22 29  inary on|off\n")
27ba0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a  ;.      rc = 1;.
27bb0 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20      }.  }else.. 
27bc0 20 69 66 28 20 63 3d 3d 27 63 27 20 26 26 20 73   if( c=='c' && s
27bd0 74 72 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 22  trcmp(azArg[0],"
27be0 63 64 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69  cd")==0 ){.    i
27bf0 66 28 20 6e 41 72 67 3d 3d 32 20 29 7b 0a 23 69  f( nArg==2 ){.#i
27c00 66 20 64 65 66 69 6e 65 64 28 5f 57 49 4e 33 32  f defined(_WIN32
27c10 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 57 49 4e  ) || defined(WIN
27c20 33 32 29 0a 20 20 20 20 20 20 77 63 68 61 72 5f  32).      wchar_
27c30 74 20 2a 7a 20 3d 20 73 71 6c 69 74 65 33 5f 77  t *z = sqlite3_w
27c40 69 6e 33 32 5f 75 74 66 38 5f 74 6f 5f 75 6e 69  in32_utf8_to_uni
27c50 63 6f 64 65 28 61 7a 41 72 67 5b 31 5d 29 3b 0a  code(azArg[1]);.
27c60 20 20 20 20 20 20 72 63 20 3d 20 21 53 65 74 43        rc = !SetC
27c70 75 72 72 65 6e 74 44 69 72 65 63 74 6f 72 79 57  urrentDirectoryW
27c80 28 7a 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  (z);.      sqlit
27c90 65 33 5f 66 72 65 65 28 7a 29 3b 0a 23 65 6c 73  e3_free(z);.#els
27ca0 65 0a 20 20 20 20 20 20 72 63 20 3d 20 63 68 64  e.      rc = chd
27cb0 69 72 28 61 7a 41 72 67 5b 31 5d 29 3b 0a 23 65  ir(azArg[1]);.#e
27cc0 6e 64 69 66 0a 20 20 20 20 20 20 69 66 28 20 72  ndif.      if( r
27cd0 63 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66  c ){.        utf
27ce0 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  8_printf(stderr,
27cf0 20 22 43 61 6e 6e 6f 74 20 63 68 61 6e 67 65 20   "Cannot change 
27d00 74 6f 20 64 69 72 65 63 74 6f 72 79 20 5c 22 25  to directory \"%
27d10 73 5c 22 5c 6e 22 2c 20 61 7a 41 72 67 5b 31 5d  s\"\n", azArg[1]
27d20 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
27d30 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
27d40 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 61 77 5f  else{.      raw_
27d50 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
27d60 55 73 61 67 65 3a 20 2e 63 64 20 44 49 52 45 43  Usage: .cd DIREC
27d70 54 4f 52 59 5c 6e 22 29 3b 0a 20 20 20 20 20 20  TORY\n");.      
27d80 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  rc = 1;.    }.  
27d90 7d 65 6c 73 65 0a 0a 20 20 2f 2a 20 54 68 65 20  }else..  /* The 
27da0 75 6e 64 6f 63 75 6d 65 6e 74 65 64 20 22 2e 62  undocumented ".b
27db0 72 65 61 6b 70 6f 69 6e 74 22 20 63 6f 6d 6d 61  reakpoint" comma
27dc0 6e 64 20 63 61 75 73 65 73 20 61 20 63 61 6c 6c  nd causes a call
27dd0 20 74 6f 20 74 68 65 20 6e 6f 2d 6f 70 0a 20 20   to the no-op.  
27de0 2a 2a 20 72 6f 75 74 69 6e 65 20 6e 61 6d 65 64  ** routine named
27df0 20 74 65 73 74 5f 62 72 65 61 6b 70 6f 69 6e 74   test_breakpoint
27e00 28 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63  ()..  */.  if( c
27e10 3d 3d 27 62 27 20 26 26 20 6e 3e 3d 33 20 26 26  =='b' && n>=3 &&
27e20 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30   strncmp(azArg[0
27e30 5d 2c 20 22 62 72 65 61 6b 70 6f 69 6e 74 22 2c  ], "breakpoint",
27e40 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 74 65   n)==0 ){.    te
27e50 73 74 5f 62 72 65 61 6b 70 6f 69 6e 74 28 29 3b  st_breakpoint();
27e60 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20  .  }else..  if( 
27e70 63 3d 3d 27 63 27 20 26 26 20 6e 3e 3d 33 20 26  c=='c' && n>=3 &
27e80 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b  & strncmp(azArg[
27e90 30 5d 2c 20 22 63 68 61 6e 67 65 73 22 2c 20 6e  0], "changes", n
27ea0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  )==0 ){.    if( 
27eb0 6e 41 72 67 3d 3d 32 20 29 7b 0a 20 20 20 20 20  nArg==2 ){.     
27ec0 20 73 65 74 4f 72 43 6c 65 61 72 46 6c 61 67 28   setOrClearFlag(
27ed0 70 2c 20 53 48 46 4c 47 5f 43 6f 75 6e 74 43 68  p, SHFLG_CountCh
27ee0 61 6e 67 65 73 2c 20 61 7a 41 72 67 5b 31 5d 29  anges, azArg[1])
27ef0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
27f00 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74     raw_printf(st
27f10 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 63  derr, "Usage: .c
27f20 68 61 6e 67 65 73 20 6f 6e 7c 6f 66 66 5c 6e 22  hanges on|off\n"
27f30 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b  );.      rc = 1;
27f40 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a  .    }.  }else..
27f50 20 20 2f 2a 20 43 61 6e 63 65 6c 20 6f 75 74 70    /* Cancel outp
27f60 75 74 20 72 65 64 69 72 65 63 74 69 6f 6e 2c 20  ut redirection, 
27f70 69 66 20 69 74 20 69 73 20 63 75 72 72 65 6e 74  if it is current
27f80 6c 79 20 73 65 74 20 28 62 79 20 2e 74 65 73 74  ly set (by .test
27f90 63 61 73 65 29 0a 20 20 2a 2a 20 54 68 65 6e 20  case).  ** Then 
27fa0 72 65 61 64 20 74 68 65 20 63 6f 6e 74 65 6e 74  read the content
27fb0 20 6f 66 20 74 68 65 20 74 65 73 74 63 61 73 65   of the testcase
27fc0 2d 6f 75 74 2e 74 78 74 20 66 69 6c 65 20 61 6e  -out.txt file an
27fd0 64 20 63 6f 6d 70 61 72 65 20 61 67 61 69 6e 73  d compare agains
27fe0 74 0a 20 20 2a 2a 20 61 7a 41 72 67 5b 31 5d 2e  t.  ** azArg[1].
27ff0 20 20 49 66 20 74 68 65 72 65 20 61 72 65 20 64    If there are d
28000 69 66 66 65 72 65 6e 63 65 73 2c 20 72 65 70 6f  ifferences, repo
28010 72 74 20 61 6e 20 65 72 72 6f 72 20 61 6e 64 20  rt an error and 
28020 65 78 69 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  exit..  */.  if(
28030 20 63 3d 3d 27 63 27 20 26 26 20 6e 3e 3d 33 20   c=='c' && n>=3 
28040 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67  && strncmp(azArg
28050 5b 30 5d 2c 20 22 63 68 65 63 6b 22 2c 20 6e 29  [0], "check", n)
28060 3d 3d 30 20 29 7b 0a 20 20 20 20 63 68 61 72 20  ==0 ){.    char 
28070 2a 7a 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 6f  *zRes = 0;.    o
28080 75 74 70 75 74 5f 72 65 73 65 74 28 70 29 3b 0a  utput_reset(p);.
28090 20 20 20 20 69 66 28 20 6e 41 72 67 21 3d 32 20      if( nArg!=2 
280a0 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69  ){.      raw_pri
280b0 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55 73 61  ntf(stderr, "Usa
280c0 67 65 3a 20 2e 63 68 65 63 6b 20 47 4c 4f 42 2d  ge: .check GLOB-
280d0 50 41 54 54 45 52 4e 5c 6e 22 29 3b 0a 20 20 20  PATTERN\n");.   
280e0 20 20 20 72 63 20 3d 20 32 3b 0a 20 20 20 20 7d     rc = 2;.    }
280f0 65 6c 73 65 20 69 66 28 20 28 7a 52 65 73 20 3d  else if( (zRes =
28100 20 72 65 61 64 46 69 6c 65 28 22 74 65 73 74 63   readFile("testc
28110 61 73 65 2d 6f 75 74 2e 74 78 74 22 2c 20 30 29  ase-out.txt", 0)
28120 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 61  )==0 ){.      ra
28130 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  w_printf(stderr,
28140 20 22 45 72 72 6f 72 3a 20 63 61 6e 6e 6f 74 20   "Error: cannot 
28150 72 65 61 64 20 27 74 65 73 74 63 61 73 65 2d 6f  read 'testcase-o
28160 75 74 2e 74 78 74 27 5c 6e 22 29 3b 0a 20 20 20  ut.txt'\n");.   
28170 20 20 20 72 63 20 3d 20 32 3b 0a 20 20 20 20 7d     rc = 2;.    }
28180 65 6c 73 65 20 69 66 28 20 74 65 73 74 63 61 73  else if( testcas
28190 65 5f 67 6c 6f 62 28 61 7a 41 72 67 5b 31 5d 2c  e_glob(azArg[1],
281a0 7a 52 65 73 29 3d 3d 30 20 29 7b 0a 20 20 20 20  zRes)==0 ){.    
281b0 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74    utf8_printf(st
281c0 64 65 72 72 2c 0a 20 20 20 20 20 20 20 20 20 20  derr,.          
281d0 20 20 20 20 20 20 20 22 74 65 73 74 63 61 73 65         "testcase
281e0 2d 25 73 20 46 41 49 4c 45 44 5c 6e 20 45 78 70  -%s FAILED\n Exp
281f0 65 63 74 65 64 3a 20 5b 25 73 5d 5c 6e 20 20 20  ected: [%s]\n   
28200 20 20 20 47 6f 74 3a 20 5b 25 73 5d 5c 6e 22 2c     Got: [%s]\n",
28210 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
28220 20 20 70 2d 3e 7a 54 65 73 74 63 61 73 65 2c 20    p->zTestcase, 
28230 61 7a 41 72 67 5b 31 5d 2c 20 7a 52 65 73 29 3b  azArg[1], zRes);
28240 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20  .      rc = 1;. 
28250 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
28260 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 6f  utf8_printf(stdo
28270 75 74 2c 20 22 74 65 73 74 63 61 73 65 2d 25 73  ut, "testcase-%s
28280 20 6f 6b 5c 6e 22 2c 20 70 2d 3e 7a 54 65 73 74   ok\n", p->zTest
28290 63 61 73 65 29 3b 0a 20 20 20 20 20 20 70 2d 3e  case);.      p->
282a0 6e 43 68 65 63 6b 2b 2b 3b 0a 20 20 20 20 7d 0a  nCheck++;.    }.
282b0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
282c0 28 7a 52 65 73 29 3b 0a 20 20 7d 65 6c 73 65 0a  (zRes);.  }else.
282d0 0a 20 20 69 66 28 20 63 3d 3d 27 63 27 20 26 26  .  if( c=='c' &&
282e0 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30   strncmp(azArg[0
282f0 5d 2c 20 22 63 6c 6f 6e 65 22 2c 20 6e 29 3d 3d  ], "clone", n)==
28300 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 41 72  0 ){.    if( nAr
28310 67 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 74 72  g==2 ){.      tr
28320 79 54 6f 43 6c 6f 6e 65 28 70 2c 20 61 7a 41 72  yToClone(p, azAr
28330 67 5b 31 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65  g[1]);.    }else
28340 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e  {.      raw_prin
28350 74 66 28 73 74 64 65 72 72 2c 20 22 55 73 61 67  tf(stderr, "Usag
28360 65 3a 20 2e 63 6c 6f 6e 65 20 46 49 4c 45 4e 41  e: .clone FILENA
28370 4d 45 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 63  ME\n");.      rc
28380 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65   = 1;.    }.  }e
28390 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 64  lse..  if( c=='d
283a0 27 20 26 26 20 6e 3e 31 20 26 26 20 73 74 72 6e  ' && n>1 && strn
283b0 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 64  cmp(azArg[0], "d
283c0 61 74 61 62 61 73 65 73 22 2c 20 6e 29 3d 3d 30  atabases", n)==0
283d0 20 29 7b 0a 20 20 20 20 53 68 65 6c 6c 53 74 61   ){.    ShellSta
283e0 74 65 20 64 61 74 61 3b 0a 20 20 20 20 63 68 61  te data;.    cha
283f0 72 20 2a 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a  r *zErrMsg = 0;.
28400 20 20 20 20 6f 70 65 6e 5f 64 62 28 70 2c 20 30      open_db(p, 0
28410 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 64  );.    memcpy(&d
28420 61 74 61 2c 20 70 2c 20 73 69 7a 65 6f 66 28 64  ata, p, sizeof(d
28430 61 74 61 29 29 3b 0a 20 20 20 20 64 61 74 61 2e  ata));.    data.
28440 73 68 6f 77 48 65 61 64 65 72 20 3d 20 30 3b 0a  showHeader = 0;.
28450 20 20 20 20 64 61 74 61 2e 63 4d 6f 64 65 20 3d      data.cMode =
28460 20 64 61 74 61 2e 6d 6f 64 65 20 3d 20 4d 4f 44   data.mode = MOD
28470 45 5f 4c 69 73 74 3b 0a 20 20 20 20 73 71 6c 69  E_List;.    sqli
28480 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
28490 65 6f 66 28 64 61 74 61 2e 63 6f 6c 53 65 70 61  eof(data.colSepa
284a0 72 61 74 6f 72 29 2c 64 61 74 61 2e 63 6f 6c 53  rator),data.colS
284b0 65 70 61 72 61 74 6f 72 2c 22 3a 20 22 29 3b 0a  eparator,": ");.
284c0 20 20 20 20 64 61 74 61 2e 63 6e 74 20 3d 20 30      data.cnt = 0
284d0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 65 78  ;.    sqlite3_ex
284e0 65 63 28 70 2d 3e 64 62 2c 20 22 53 45 4c 45 43  ec(p->db, "SELEC
284f0 54 20 6e 61 6d 65 2c 20 66 69 6c 65 20 46 52 4f  T name, file FRO
28500 4d 20 70 72 61 67 6d 61 5f 64 61 74 61 62 61 73  M pragma_databas
28510 65 5f 6c 69 73 74 22 2c 0a 20 20 20 20 20 20 20  e_list",.       
28520 20 20 20 20 20 20 20 20 20 20 63 61 6c 6c 62 61            callba
28530 63 6b 2c 20 26 64 61 74 61 2c 20 26 7a 45 72 72  ck, &data, &zErr
28540 4d 73 67 29 3b 0a 20 20 20 20 69 66 28 20 7a 45  Msg);.    if( zE
28550 72 72 4d 73 67 20 29 7b 0a 20 20 20 20 20 20 75  rrMsg ){.      u
28560 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72  tf8_printf(stder
28570 72 2c 22 45 72 72 6f 72 3a 20 25 73 5c 6e 22 2c  r,"Error: %s\n",
28580 20 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20   zErrMsg);.     
28590 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 45   sqlite3_free(zE
285a0 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 72 63  rrMsg);.      rc
285b0 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65   = 1;.    }.  }e
285c0 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 64  lse..  if( c=='d
285d0 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41  ' && strncmp(azA
285e0 72 67 5b 30 5d 2c 20 22 64 62 69 6e 66 6f 22 2c  rg[0], "dbinfo",
285f0 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63   n)==0 ){.    rc
28600 20 3d 20 73 68 65 6c 6c 5f 64 62 69 6e 66 6f 5f   = shell_dbinfo_
28610 63 6f 6d 6d 61 6e 64 28 70 2c 20 6e 41 72 67 2c  command(p, nArg,
28620 20 61 7a 41 72 67 29 3b 0a 20 20 7d 65 6c 73 65   azArg);.  }else
28630 0a 0a 20 20 69 66 28 20 63 3d 3d 27 64 27 20 26  ..  if( c=='d' &
28640 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b  & strncmp(azArg[
28650 30 5d 2c 20 22 64 75 6d 70 22 2c 20 6e 29 3d 3d  0], "dump", n)==
28660 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  0 ){.    const c
28670 68 61 72 20 2a 7a 4c 69 6b 65 20 3d 20 30 3b 0a  har *zLike = 0;.
28680 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69      int i;.    i
28690 6e 74 20 73 61 76 65 64 53 68 6f 77 48 65 61 64  nt savedShowHead
286a0 65 72 20 3d 20 70 2d 3e 73 68 6f 77 48 65 61 64  er = p->showHead
286b0 65 72 3b 0a 20 20 20 20 53 68 65 6c 6c 43 6c 65  er;.    ShellCle
286c0 61 72 46 6c 61 67 28 70 2c 20 53 48 46 4c 47 5f  arFlag(p, SHFLG_
286d0 50 72 65 73 65 72 76 65 52 6f 77 69 64 7c 53 48  PreserveRowid|SH
286e0 46 4c 47 5f 4e 65 77 6c 69 6e 65 73 29 3b 0a 20  FLG_Newlines);. 
286f0 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 41     for(i=1; i<nA
28700 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  rg; i++){.      
28710 69 66 28 20 61 7a 41 72 67 5b 69 5d 5b 30 5d 3d  if( azArg[i][0]=
28720 3d 27 2d 27 20 29 7b 0a 20 20 20 20 20 20 20 20  ='-' ){.        
28730 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20  const char *z = 
28740 61 7a 41 72 67 5b 69 5d 2b 31 3b 0a 20 20 20 20  azArg[i]+1;.    
28750 20 20 20 20 69 66 28 20 7a 5b 30 5d 3d 3d 27 2d      if( z[0]=='-
28760 27 20 29 20 7a 2b 2b 3b 0a 20 20 20 20 20 20 20  ' ) z++;.       
28770 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 22 70   if( strcmp(z,"p
28780 72 65 73 65 72 76 65 2d 72 6f 77 69 64 73 22 29  reserve-rowids")
28790 3d 3d 30 20 29 7b 0a 23 69 66 64 65 66 20 53 51  ==0 ){.#ifdef SQ
287a0 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
287b0 4c 54 41 42 4c 45 0a 20 20 20 20 20 20 20 20 20  LTABLE.         
287c0 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65   raw_printf(stde
287d0 72 72 2c 20 22 54 68 65 20 2d 2d 70 72 65 73 65  rr, "The --prese
287e0 72 76 65 2d 72 6f 77 69 64 73 20 6f 70 74 69 6f  rve-rowids optio
287f0 6e 20 69 73 20 6e 6f 74 20 63 6f 6d 70 61 74 69  n is not compati
28800 62 6c 65 22 0a 20 20 20 20 20 20 20 20 20 20 20  ble".           
28810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28820 20 20 22 20 77 69 74 68 20 53 51 4c 49 54 45 5f    " with SQLITE_
28830 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
28840 45 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 20  E\n");.         
28850 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20   rc = 1;.       
28860 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d     goto meta_com
28870 6d 61 6e 64 5f 65 78 69 74 3b 0a 23 65 6c 73 65  mand_exit;.#else
28880 0a 20 20 20 20 20 20 20 20 20 20 53 68 65 6c 6c  .          Shell
28890 53 65 74 46 6c 61 67 28 70 2c 20 53 48 46 4c 47  SetFlag(p, SHFLG
288a0 5f 50 72 65 73 65 72 76 65 52 6f 77 69 64 29 3b  _PreserveRowid);
288b0 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20  .#endif.        
288c0 7d 65 6c 73 65 0a 20 20 20 20 20 20 20 20 69 66  }else.        if
288d0 28 20 73 74 72 63 6d 70 28 7a 2c 22 6e 65 77 6c  ( strcmp(z,"newl
288e0 69 6e 65 73 22 29 3d 3d 30 20 29 7b 0a 20 20 20  ines")==0 ){.   
288f0 20 20 20 20 20 20 20 53 68 65 6c 6c 53 65 74 46         ShellSetF
28900 6c 61 67 28 70 2c 20 53 48 46 4c 47 5f 4e 65 77  lag(p, SHFLG_New
28910 6c 69 6e 65 73 29 3b 0a 20 20 20 20 20 20 20 20  lines);.        
28920 7d 65 6c 73 65 0a 20 20 20 20 20 20 20 20 7b 0a  }else.        {.
28930 20 20 20 20 20 20 20 20 20 20 72 61 77 5f 70 72            raw_pr
28940 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55 6e  intf(stderr, "Un
28950 6b 6e 6f 77 6e 20 6f 70 74 69 6f 6e 20 5c 22 25  known option \"%
28960 73 5c 22 20 6f 6e 20 5c 22 2e 64 75 6d 70 5c 22  s\" on \".dump\"
28970 5c 6e 22 2c 20 61 7a 41 72 67 5b 69 5d 29 3b 0a  \n", azArg[i]);.
28980 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 31            rc = 1
28990 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  ;.          goto
289a0 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78   meta_command_ex
289b0 69 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  it;.        }.  
289c0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 4c      }else if( zL
289d0 69 6b 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ike ){.        r
289e0 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  aw_printf(stderr
289f0 2c 20 22 55 73 61 67 65 3a 20 2e 64 75 6d 70 20  , "Usage: .dump 
28a00 3f 2d 2d 70 72 65 73 65 72 76 65 2d 72 6f 77 69  ?--preserve-rowi
28a10 64 73 3f 20 22 0a 20 20 20 20 20 20 20 20 20 20  ds? ".          
28a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28a30 20 22 3f 2d 2d 6e 65 77 6c 69 6e 65 73 3f 20 3f   "?--newlines? ?
28a40 4c 49 4b 45 2d 50 41 54 54 45 52 4e 3f 5c 6e 22  LIKE-PATTERN?\n"
28a50 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
28a60 31 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  1;.        goto 
28a70 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69  meta_command_exi
28a80 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  t;.      }else{.
28a90 20 20 20 20 20 20 20 20 7a 4c 69 6b 65 20 3d 20          zLike = 
28aa0 61 7a 41 72 67 5b 69 5d 3b 0a 20 20 20 20 20 20  azArg[i];.      
28ab0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 6f 70 65 6e  }.    }.    open
28ac0 5f 64 62 28 70 2c 20 30 29 3b 0a 20 20 20 20 2f  _db(p, 0);.    /
28ad0 2a 20 57 68 65 6e 20 70 6c 61 79 69 6e 67 20 62  * When playing b
28ae0 61 63 6b 20 61 20 22 64 75 6d 70 22 2c 20 74 68  ack a "dump", th
28af0 65 20 63 6f 6e 74 65 6e 74 20 6d 69 67 68 74 20  e content might 
28b00 61 70 70 65 61 72 20 69 6e 20 61 6e 20 6f 72 64  appear in an ord
28b10 65 72 0a 20 20 20 20 2a 2a 20 77 68 69 63 68 20  er.    ** which 
28b20 63 61 75 73 65 73 20 69 6d 6d 65 64 69 61 74 65  causes immediate
28b30 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e   foreign key con
28b40 73 74 72 61 69 6e 74 73 20 74 6f 20 62 65 20 76  straints to be v
28b50 69 6f 6c 61 74 65 64 2e 0a 20 20 20 20 2a 2a 20  iolated..    ** 
28b60 53 6f 20 64 69 73 61 62 6c 65 20 66 6f 72 65 69  So disable forei
28b70 67 6e 2d 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e  gn-key constrain
28b80 74 20 65 6e 66 6f 72 63 65 6d 65 6e 74 20 74 6f  t enforcement to
28b90 20 70 72 65 76 65 6e 74 20 70 72 6f 62 6c 65 6d   prevent problem
28ba0 73 2e 20 2a 2f 0a 20 20 20 20 72 61 77 5f 70 72  s. */.    raw_pr
28bb0 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 50 52  intf(p->out, "PR
28bc0 41 47 4d 41 20 66 6f 72 65 69 67 6e 5f 6b 65 79  AGMA foreign_key
28bd0 73 3d 4f 46 46 3b 5c 6e 22 29 3b 0a 20 20 20 20  s=OFF;\n");.    
28be0 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  raw_printf(p->ou
28bf0 74 2c 20 22 42 45 47 49 4e 20 54 52 41 4e 53 41  t, "BEGIN TRANSA
28c00 43 54 49 4f 4e 3b 5c 6e 22 29 3b 0a 20 20 20 20  CTION;\n");.    
28c10 70 2d 3e 77 72 69 74 61 62 6c 65 53 63 68 65 6d  p->writableSchem
28c20 61 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 73 68  a = 0;.    p->sh
28c30 6f 77 48 65 61 64 65 72 20 3d 20 30 3b 0a 20 20  owHeader = 0;.  
28c40 20 20 2f 2a 20 53 65 74 20 77 72 69 74 61 62 6c    /* Set writabl
28c50 65 5f 73 63 68 65 6d 61 3d 4f 4e 20 73 69 6e 63  e_schema=ON sinc
28c60 65 20 64 6f 69 6e 67 20 73 6f 20 66 6f 72 63 65  e doing so force
28c70 73 20 53 51 4c 69 74 65 20 74 6f 20 69 6e 69 74  s SQLite to init
28c80 69 61 6c 69 7a 65 0a 20 20 20 20 2a 2a 20 61 73  ialize.    ** as
28c90 20 6d 75 63 68 20 6f 66 20 74 68 65 20 73 63 68   much of the sch
28ca0 65 6d 61 20 61 73 20 69 74 20 63 61 6e 20 65 76  ema as it can ev
28cb0 65 6e 20 69 66 20 74 68 65 20 73 71 6c 69 74 65  en if the sqlite
28cc0 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 69 73  _master table is
28cd0 0a 20 20 20 20 2a 2a 20 63 6f 72 72 75 70 74 2e  .    ** corrupt.
28ce0 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   */.    sqlite3_
28cf0 65 78 65 63 28 70 2d 3e 64 62 2c 20 22 53 41 56  exec(p->db, "SAV
28d00 45 50 4f 49 4e 54 20 64 75 6d 70 3b 20 50 52 41  EPOINT dump; PRA
28d10 47 4d 41 20 77 72 69 74 61 62 6c 65 5f 73 63 68  GMA writable_sch
28d20 65 6d 61 3d 4f 4e 22 2c 20 30 2c 20 30 2c 20 30  ema=ON", 0, 0, 0
28d30 29 3b 0a 20 20 20 20 70 2d 3e 6e 45 72 72 20 3d  );.    p->nErr =
28d40 20 30 3b 0a 20 20 20 20 69 66 28 20 7a 4c 69 6b   0;.    if( zLik
28d50 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 75  e==0 ){.      ru
28d60 6e 5f 73 63 68 65 6d 61 5f 64 75 6d 70 5f 71 75  n_schema_dump_qu
28d70 65 72 79 28 70 2c 0a 20 20 20 20 20 20 20 20 22  ery(p,.        "
28d80 53 45 4c 45 43 54 20 6e 61 6d 65 2c 20 74 79 70  SELECT name, typ
28d90 65 2c 20 73 71 6c 20 46 52 4f 4d 20 73 71 6c 69  e, sql FROM sqli
28da0 74 65 5f 6d 61 73 74 65 72 20 22 0a 20 20 20 20  te_master ".    
28db0 20 20 20 20 22 57 48 45 52 45 20 73 71 6c 20 4e      "WHERE sql N
28dc0 4f 54 20 4e 55 4c 4c 20 41 4e 44 20 74 79 70 65  OT NULL AND type
28dd0 3d 3d 27 74 61 62 6c 65 27 20 41 4e 44 20 6e 61  =='table' AND na
28de0 6d 65 21 3d 27 73 71 6c 69 74 65 5f 73 65 71 75  me!='sqlite_sequ
28df0 65 6e 63 65 27 22 0a 20 20 20 20 20 20 29 3b 0a  ence'".      );.
28e00 20 20 20 20 20 20 72 75 6e 5f 73 63 68 65 6d 61        run_schema
28e10 5f 64 75 6d 70 5f 71 75 65 72 79 28 70 2c 0a 20  _dump_query(p,. 
28e20 20 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 6e         "SELECT n
28e30 61 6d 65 2c 20 74 79 70 65 2c 20 73 71 6c 20 46  ame, type, sql F
28e40 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  ROM sqlite_maste
28e50 72 20 22 0a 20 20 20 20 20 20 20 20 22 57 48 45  r ".        "WHE
28e60 52 45 20 6e 61 6d 65 3d 3d 27 73 71 6c 69 74 65  RE name=='sqlite
28e70 5f 73 65 71 75 65 6e 63 65 27 22 0a 20 20 20 20  _sequence'".    
28e80 20 20 29 3b 0a 20 20 20 20 20 20 72 75 6e 5f 74    );.      run_t
28e90 61 62 6c 65 5f 64 75 6d 70 5f 71 75 65 72 79 28  able_dump_query(
28ea0 70 2c 0a 20 20 20 20 20 20 20 20 22 53 45 4c 45  p,.        "SELE
28eb0 43 54 20 73 71 6c 20 46 52 4f 4d 20 73 71 6c 69  CT sql FROM sqli
28ec0 74 65 5f 6d 61 73 74 65 72 20 22 0a 20 20 20 20  te_master ".    
28ed0 20 20 20 20 22 57 48 45 52 45 20 73 71 6c 20 4e      "WHERE sql N
28ee0 4f 54 20 4e 55 4c 4c 20 41 4e 44 20 74 79 70 65  OT NULL AND type
28ef0 20 49 4e 20 28 27 69 6e 64 65 78 27 2c 27 74 72   IN ('index','tr
28f00 69 67 67 65 72 27 2c 27 76 69 65 77 27 29 22 2c  igger','view')",
28f10 20 30 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20   0.      );.    
28f20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 61  }else{.      cha
28f30 72 20 2a 7a 53 71 6c 3b 0a 20 20 20 20 20 20 7a  r *zSql;.      z
28f40 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  Sql = sqlite3_mp
28f50 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20 22  rintf(.        "
28f60 53 45 4c 45 43 54 20 6e 61 6d 65 2c 20 74 79 70  SELECT name, typ
28f70 65 2c 20 73 71 6c 20 46 52 4f 4d 20 73 71 6c 69  e, sql FROM sqli
28f80 74 65 5f 6d 61 73 74 65 72 20 22 0a 20 20 20 20  te_master ".    
28f90 20 20 20 20 22 57 48 45 52 45 20 74 62 6c 5f 6e      "WHERE tbl_n
28fa0 61 6d 65 20 4c 49 4b 45 20 25 51 20 41 4e 44 20  ame LIKE %Q AND 
28fb0 74 79 70 65 3d 3d 27 74 61 62 6c 65 27 22 0a 20  type=='table'". 
28fc0 20 20 20 20 20 20 20 22 20 20 41 4e 44 20 73 71         "  AND sq
28fd0 6c 20 4e 4f 54 20 4e 55 4c 4c 22 2c 20 7a 4c 69  l NOT NULL", zLi
28fe0 6b 65 29 3b 0a 20 20 20 20 20 20 72 75 6e 5f 73  ke);.      run_s
28ff0 63 68 65 6d 61 5f 64 75 6d 70 5f 71 75 65 72 79  chema_dump_query
29000 28 70 2c 7a 53 71 6c 29 3b 0a 20 20 20 20 20 20  (p,zSql);.      
29010 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71  sqlite3_free(zSq
29020 6c 29 3b 0a 20 20 20 20 20 20 7a 53 71 6c 20 3d  l);.      zSql =
29030 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
29040 28 0a 20 20 20 20 20 20 20 20 22 53 45 4c 45 43  (.        "SELEC
29050 54 20 73 71 6c 20 46 52 4f 4d 20 73 71 6c 69 74  T sql FROM sqlit
29060 65 5f 6d 61 73 74 65 72 20 22 0a 20 20 20 20 20  e_master ".     
29070 20 20 20 22 57 48 45 52 45 20 73 71 6c 20 4e 4f     "WHERE sql NO
29080 54 20 4e 55 4c 4c 22 0a 20 20 20 20 20 20 20 20  T NULL".        
29090 22 20 20 41 4e 44 20 74 79 70 65 20 49 4e 20 28  "  AND type IN (
290a0 27 69 6e 64 65 78 27 2c 27 74 72 69 67 67 65 72  'index','trigger
290b0 27 2c 27 76 69 65 77 27 29 22 0a 20 20 20 20 20  ','view')".     
290c0 20 20 20 22 20 20 41 4e 44 20 74 62 6c 5f 6e 61     "  AND tbl_na
290d0 6d 65 20 4c 49 4b 45 20 25 51 22 2c 20 7a 4c 69  me LIKE %Q", zLi
290e0 6b 65 29 3b 0a 20 20 20 20 20 20 72 75 6e 5f 74  ke);.      run_t
290f0 61 62 6c 65 5f 64 75 6d 70 5f 71 75 65 72 79 28  able_dump_query(
29100 70 2c 20 7a 53 71 6c 2c 20 30 29 3b 0a 20 20 20  p, zSql, 0);.   
29110 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
29120 7a 53 71 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20  zSql);.    }.   
29130 20 69 66 28 20 70 2d 3e 77 72 69 74 61 62 6c 65   if( p->writable
29140 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20 20  Schema ){.      
29150 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  raw_printf(p->ou
29160 74 2c 20 22 50 52 41 47 4d 41 20 77 72 69 74 61  t, "PRAGMA writa
29170 62 6c 65 5f 73 63 68 65 6d 61 3d 4f 46 46 3b 5c  ble_schema=OFF;\
29180 6e 22 29 3b 0a 20 20 20 20 20 20 70 2d 3e 77 72  n");.      p->wr
29190 69 74 61 62 6c 65 53 63 68 65 6d 61 20 3d 20 30  itableSchema = 0
291a0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
291b0 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20  te3_exec(p->db, 
291c0 22 50 52 41 47 4d 41 20 77 72 69 74 61 62 6c 65  "PRAGMA writable
291d0 5f 73 63 68 65 6d 61 3d 4f 46 46 3b 22 2c 20 30  _schema=OFF;", 0
291e0 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  , 0, 0);.    sql
291f0 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c  ite3_exec(p->db,
29200 20 22 52 45 4c 45 41 53 45 20 64 75 6d 70 3b 22   "RELEASE dump;"
29210 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
29220 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  raw_printf(p->ou
29230 74 2c 20 70 2d 3e 6e 45 72 72 20 3f 20 22 52 4f  t, p->nErr ? "RO
29240 4c 4c 42 41 43 4b 3b 20 2d 2d 20 64 75 65 20 74  LLBACK; -- due t
29250 6f 20 65 72 72 6f 72 73 5c 6e 22 20 3a 20 22 43  o errors\n" : "C
29260 4f 4d 4d 49 54 3b 5c 6e 22 29 3b 0a 20 20 20 20  OMMIT;\n");.    
29270 70 2d 3e 73 68 6f 77 48 65 61 64 65 72 20 3d 20  p->showHeader = 
29280 73 61 76 65 64 53 68 6f 77 48 65 61 64 65 72 3b  savedShowHeader;
29290 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20  .  }else..  if( 
292a0 63 3d 3d 27 65 27 20 26 26 20 73 74 72 6e 63 6d  c=='e' && strncm
292b0 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 65 63 68  p(azArg[0], "ech
292c0 6f 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20  o", n)==0 ){.   
292d0 20 69 66 28 20 6e 41 72 67 3d 3d 32 20 29 7b 0a   if( nArg==2 ){.
292e0 20 20 20 20 20 20 73 65 74 4f 72 43 6c 65 61 72        setOrClear
292f0 46 6c 61 67 28 70 2c 20 53 48 46 4c 47 5f 45 63  Flag(p, SHFLG_Ec
29300 68 6f 2c 20 61 7a 41 72 67 5b 31 5d 29 3b 0a 20  ho, azArg[1]);. 
29310 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
29320 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72  raw_printf(stder
29330 72 2c 20 22 55 73 61 67 65 3a 20 2e 65 63 68 6f  r, "Usage: .echo
29340 20 6f 6e 7c 6f 66 66 5c 6e 22 29 3b 0a 20 20 20   on|off\n");.   
29350 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d     rc = 1;.    }
29360 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20  .  }else..  if( 
29370 63 3d 3d 27 65 27 20 26 26 20 73 74 72 6e 63 6d  c=='e' && strncm
29380 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 65 71 70  p(azArg[0], "eqp
29390 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ", n)==0 ){.    
293a0 69 66 28 20 6e 41 72 67 3d 3d 32 20 29 7b 0a 20  if( nArg==2 ){. 
293b0 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28       if( strcmp(
293c0 61 7a 41 72 67 5b 31 5d 2c 22 66 75 6c 6c 22 29  azArg[1],"full")
293d0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ==0 ){.        p
293e0 2d 3e 61 75 74 6f 45 51 50 20 3d 20 41 55 54 4f  ->autoEQP = AUTO
293f0 45 51 50 5f 66 75 6c 6c 3b 0a 20 20 20 20 20 20  EQP_full;.      
29400 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
29410 28 61 7a 41 72 67 5b 31 5d 2c 22 74 72 69 67 67  (azArg[1],"trigg
29420 65 72 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  er")==0 ){.     
29430 20 20 20 70 2d 3e 61 75 74 6f 45 51 50 20 3d 20     p->autoEQP = 
29440 41 55 54 4f 45 51 50 5f 74 72 69 67 67 65 72 3b  AUTOEQP_trigger;
29450 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
29460 20 20 20 20 20 20 70 2d 3e 61 75 74 6f 45 51 50        p->autoEQP
29470 20 3d 20 62 6f 6f 6c 65 61 6e 56 61 6c 75 65 28   = booleanValue(
29480 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20 20  azArg[1]);.     
29490 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
294a0 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73      raw_printf(s
294b0 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e  tderr, "Usage: .
294c0 65 71 70 20 6f 66 66 7c 6f 6e 7c 74 72 69 67 67  eqp off|on|trigg
294d0 65 72 7c 66 75 6c 6c 5c 6e 22 29 3b 0a 20 20 20  er|full\n");.   
294e0 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d     rc = 1;.    }
294f0 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20  .  }else..  if( 
29500 63 3d 3d 27 65 27 20 26 26 20 73 74 72 6e 63 6d  c=='e' && strncm
29510 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 65 78 69  p(azArg[0], "exi
29520 74 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20  t", n)==0 ){.   
29530 20 69 66 28 20 6e 41 72 67 3e 31 20 26 26 20 28   if( nArg>1 && (
29540 72 63 20 3d 20 28 69 6e 74 29 69 6e 74 65 67 65  rc = (int)intege
29550 72 56 61 6c 75 65 28 61 7a 41 72 67 5b 31 5d 29  rValue(azArg[1])
29560 29 21 3d 30 20 29 20 65 78 69 74 28 72 63 29 3b  )!=0 ) exit(rc);
29570 0a 20 20 20 20 72 63 20 3d 20 32 3b 0a 20 20 7d  .    rc = 2;.  }
29580 65 6c 73 65 0a 0a 20 20 2f 2a 20 54 68 65 20 22  else..  /* The "
29590 2e 65 78 70 6c 61 69 6e 22 20 63 6f 6d 6d 61 6e  .explain" comman
295a0 64 20 69 73 20 61 75 74 6f 6d 61 74 69 63 20 6e  d is automatic n
295b0 6f 77 2e 20 20 49 74 20 69 73 20 6c 61 72 67 65  ow.  It is large
295c0 6c 79 20 70 6f 69 6e 74 6c 65 73 73 2e 20 20 49  ly pointless.  I
295d0 74 0a 20 20 2a 2a 20 72 65 74 61 69 6e 65 64 20  t.  ** retained 
295e0 70 75 72 65 6c 79 20 66 6f 72 20 62 61 63 6b 77  purely for backw
295f0 61 72 64 73 20 63 6f 6d 70 61 74 69 62 69 6c 69  ards compatibili
29600 74 79 20 2a 2f 0a 20 20 69 66 28 20 63 3d 3d 27  ty */.  if( c=='
29610 65 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a  e' && strncmp(az
29620 41 72 67 5b 30 5d 2c 20 22 65 78 70 6c 61 69 6e  Arg[0], "explain
29630 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ", n)==0 ){.    
29640 69 6e 74 20 76 61 6c 20 3d 20 31 3b 0a 20 20 20  int val = 1;.   
29650 20 69 66 28 20 6e 41 72 67 3e 3d 32 20 29 7b 0a   if( nArg>=2 ){.
29660 20 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70        if( strcmp
29670 28 61 7a 41 72 67 5b 31 5d 2c 22 61 75 74 6f 22  (azArg[1],"auto"
29680 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
29690 76 61 6c 20 3d 20 39 39 3b 0a 20 20 20 20 20 20  val = 99;.      
296a0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 76  }else{.        v
296b0 61 6c 20 3d 20 20 62 6f 6f 6c 65 61 6e 56 61 6c  al =  booleanVal
296c0 75 65 28 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20  ue(azArg[1]);.  
296d0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
296e0 69 66 28 20 76 61 6c 3d 3d 31 20 26 26 20 70 2d  if( val==1 && p-
296f0 3e 6d 6f 64 65 21 3d 4d 4f 44 45 5f 45 78 70 6c  >mode!=MODE_Expl
29700 61 69 6e 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  ain ){.      p->
29710 6e 6f 72 6d 61 6c 4d 6f 64 65 20 3d 20 70 2d 3e  normalMode = p->
29720 6d 6f 64 65 3b 0a 20 20 20 20 20 20 70 2d 3e 6d  mode;.      p->m
29730 6f 64 65 20 3d 20 4d 4f 44 45 5f 45 78 70 6c 61  ode = MODE_Expla
29740 69 6e 3b 0a 20 20 20 20 20 20 70 2d 3e 61 75 74  in;.      p->aut
29750 6f 45 78 70 6c 61 69 6e 20 3d 20 30 3b 0a 20 20  oExplain = 0;.  
29760 20 20 7d 65 6c 73 65 20 69 66 28 20 76 61 6c 3d    }else if( val=
29770 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
29780 70 2d 3e 6d 6f 64 65 3d 3d 4d 4f 44 45 5f 45 78  p->mode==MODE_Ex
29790 70 6c 61 69 6e 20 29 20 70 2d 3e 6d 6f 64 65 20  plain ) p->mode 
297a0 3d 20 70 2d 3e 6e 6f 72 6d 61 6c 4d 6f 64 65 3b  = p->normalMode;
297b0 0a 20 20 20 20 20 20 70 2d 3e 61 75 74 6f 45 78  .      p->autoEx
297c0 70 6c 61 69 6e 20 3d 20 30 3b 0a 20 20 20 20 7d  plain = 0;.    }
297d0 65 6c 73 65 20 69 66 28 20 76 61 6c 3d 3d 39 39  else if( val==99
297e0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d   ){.      if( p-
297f0 3e 6d 6f 64 65 3d 3d 4d 4f 44 45 5f 45 78 70 6c  >mode==MODE_Expl
29800 61 69 6e 20 29 20 70 2d 3e 6d 6f 64 65 20 3d 20  ain ) p->mode = 
29810 70 2d 3e 6e 6f 72 6d 61 6c 4d 6f 64 65 3b 0a 20  p->normalMode;. 
29820 20 20 20 20 20 70 2d 3e 61 75 74 6f 45 78 70 6c       p->autoExpl
29830 61 69 6e 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  ain = 1;.    }. 
29840 20 7d 65 6c 73 65 0a 0a 23 69 66 6e 64 65 66 20   }else..#ifndef 
29850 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
29860 55 41 4c 54 41 42 4c 45 0a 20 20 69 66 28 20 63  UALTABLE.  if( c
29870 3d 3d 27 65 27 20 26 26 20 73 74 72 6e 63 6d 70  =='e' && strncmp
29880 28 61 7a 41 72 67 5b 30 5d 2c 20 22 65 78 70 65  (azArg[0], "expe
29890 72 74 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20  rt", n)==0 ){.  
298a0 20 20 6f 70 65 6e 5f 64 62 28 70 2c 20 30 29 3b    open_db(p, 0);
298b0 0a 20 20 20 20 65 78 70 65 72 74 44 6f 74 43 6f  .    expertDotCo
298c0 6d 6d 61 6e 64 28 70 2c 20 61 7a 41 72 67 2c 20  mmand(p, azArg, 
298d0 6e 41 72 67 29 3b 0a 20 20 7d 65 6c 73 65 0a 23  nArg);.  }else.#
298e0 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 63 3d 3d  endif..  if( c==
298f0 27 66 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61  'f' && strncmp(a
29900 7a 41 72 67 5b 30 5d 2c 20 22 66 75 6c 6c 73 63  zArg[0], "fullsc
29910 68 65 6d 61 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a  hema", n)==0 ){.
29920 20 20 20 20 53 68 65 6c 6c 53 74 61 74 65 20 64      ShellState d
29930 61 74 61 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a  ata;.    char *z
29940 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 20 20  ErrMsg = 0;.    
29950 69 6e 74 20 64 6f 53 74 61 74 73 20 3d 20 30 3b  int doStats = 0;
29960 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74  .    memcpy(&dat
29970 61 2c 20 70 2c 20 73 69 7a 65 6f 66 28 64 61 74  a, p, sizeof(dat
29980 61 29 29 3b 0a 20 20 20 20 64 61 74 61 2e 73 68  a));.    data.sh
29990 6f 77 48 65 61 64 65 72 20 3d 20 30 3b 0a 20 20  owHeader = 0;.  
299a0 20 20 64 61 74 61 2e 63 4d 6f 64 65 20 3d 20 64    data.cMode = d
299b0 61 74 61 2e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f  ata.mode = MODE_
299c0 53 65 6d 69 3b 0a 20 20 20 20 69 66 28 20 6e 41  Semi;.    if( nA
299d0 72 67 3d 3d 32 20 26 26 20 6f 70 74 69 6f 6e 4d  rg==2 && optionM
299e0 61 74 63 68 28 61 7a 41 72 67 5b 31 5d 2c 20 22  atch(azArg[1], "
299f0 69 6e 64 65 6e 74 22 29 20 29 7b 0a 20 20 20 20  indent") ){.    
29a00 20 20 64 61 74 61 2e 63 4d 6f 64 65 20 3d 20 64    data.cMode = d
29a10 61 74 61 2e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f  ata.mode = MODE_
29a20 50 72 65 74 74 79 3b 0a 20 20 20 20 20 20 6e 41  Pretty;.      nA
29a30 72 67 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  rg = 1;.    }.  
29a40 20 20 69 66 28 20 6e 41 72 67 21 3d 31 20 29 7b    if( nArg!=1 ){
29a50 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74  .      raw_print
29a60 66 28 73 74 64 65 72 72 2c 20 22 55 73 61 67 65  f(stderr, "Usage
29a70 3a 20 2e 66 75 6c 6c 73 63 68 65 6d 61 20 3f 2d  : .fullschema ?-
29a80 2d 69 6e 64 65 6e 74 3f 5c 6e 22 29 3b 0a 20 20  -indent?\n");.  
29a90 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
29aa0 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d    goto meta_comm
29ab0 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a  and_exit;.    }.
29ac0 20 20 20 20 6f 70 65 6e 5f 64 62 28 70 2c 20 30      open_db(p, 0
29ad0 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
29ae0 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c 0a  te3_exec(p->db,.
29af0 20 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 73         "SELECT s
29b00 71 6c 20 46 52 4f 4d 22 0a 20 20 20 20 20 20 20  ql FROM".       
29b10 22 20 20 28 53 45 4c 45 43 54 20 73 71 6c 20 73  "  (SELECT sql s
29b20 71 6c 2c 20 74 79 70 65 20 74 79 70 65 2c 20 74  ql, type type, t
29b30 62 6c 5f 6e 61 6d 65 20 74 62 6c 5f 6e 61 6d 65  bl_name tbl_name
29b40 2c 20 6e 61 6d 65 20 6e 61 6d 65 2c 20 72 6f 77  , name name, row
29b50 69 64 20 78 22 0a 20 20 20 20 20 20 20 22 20 20  id x".       "  
29b60 20 20 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d     FROM sqlite_m
29b70 61 73 74 65 72 20 55 4e 49 4f 4e 20 41 4c 4c 22  aster UNION ALL"
29b80 0a 20 20 20 20 20 20 20 22 20 20 20 53 45 4c 45  .       "   SELE
29b90 43 54 20 73 71 6c 2c 20 74 79 70 65 2c 20 74 62  CT sql, type, tb
29ba0 6c 5f 6e 61 6d 65 2c 20 6e 61 6d 65 2c 20 72 6f  l_name, name, ro
29bb0 77 69 64 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f  wid FROM sqlite_
29bc0 74 65 6d 70 5f 6d 61 73 74 65 72 29 20 22 0a 20  temp_master) ". 
29bd0 20 20 20 20 20 20 22 57 48 45 52 45 20 74 79 70        "WHERE typ
29be0 65 21 3d 27 6d 65 74 61 27 20 41 4e 44 20 73 71  e!='meta' AND sq
29bf0 6c 20 4e 4f 54 4e 55 4c 4c 20 41 4e 44 20 6e 61  l NOTNULL AND na
29c00 6d 65 20 4e 4f 54 20 4c 49 4b 45 20 27 73 71 6c  me NOT LIKE 'sql
29c10 69 74 65 5f 25 27 20 22 0a 20 20 20 20 20 20 20  ite_%' ".       
29c20 22 4f 52 44 45 52 20 42 59 20 72 6f 77 69 64 22  "ORDER BY rowid"
29c30 2c 0a 20 20 20 20 20 20 20 63 61 6c 6c 62 61 63  ,.       callbac
29c40 6b 2c 20 26 64 61 74 61 2c 20 26 7a 45 72 72 4d  k, &data, &zErrM
29c50 73 67 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66  sg.    );.    if
29c60 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
29c70 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
29c80 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20  _stmt *pStmt;.  
29c90 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
29ca0 5f 70 72 65 70 61 72 65 5f 76 32 28 70 2d 3e 64  _prepare_v2(p->d
29cb0 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  b,.             
29cc0 20 20 22 53 45 4c 45 43 54 20 72 6f 77 69 64 20    "SELECT rowid 
29cd0 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74  FROM sqlite_mast
29ce0 65 72 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  er".            
29cf0 20 20 20 22 20 57 48 45 52 45 20 6e 61 6d 65 20     " WHERE name 
29d00 47 4c 4f 42 20 27 73 71 6c 69 74 65 5f 73 74 61  GLOB 'sqlite_sta
29d10 74 5b 31 33 34 5d 27 22 2c 0a 20 20 20 20 20 20  t[134]'",.      
29d20 20 20 20 20 20 20 20 20 20 2d 31 2c 20 26 70 53           -1, &pS
29d30 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 64  tmt, 0);.      d
29d40 6f 53 74 61 74 73 20 3d 20 73 71 6c 69 74 65 33  oStats = sqlite3
29d50 5f 73 74 65 70 28 70 53 74 6d 74 29 3d 3d 53 51  _step(pStmt)==SQ
29d60 4c 49 54 45 5f 52 4f 57 3b 0a 20 20 20 20 20 20  LITE_ROW;.      
29d70 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
29d80 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 7d 0a 20  (pStmt);.    }. 
29d90 20 20 20 69 66 28 20 64 6f 53 74 61 74 73 3d 3d     if( doStats==
29da0 30 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70  0 ){.      raw_p
29db0 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 2f  rintf(p->out, "/
29dc0 2a 20 4e 6f 20 53 54 41 54 20 74 61 62 6c 65 73  * No STAT tables
29dd0 20 61 76 61 69 6c 61 62 6c 65 20 2a 2f 5c 6e 22   available */\n"
29de0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
29df0 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70      raw_printf(p
29e00 2d 3e 6f 75 74 2c 20 22 41 4e 41 4c 59 5a 45 20  ->out, "ANALYZE 
29e10 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 3b 5c 6e  sqlite_master;\n
29e20 22 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ");.      sqlite
29e30 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20 22 53  3_exec(p->db, "S
29e40 45 4c 45 43 54 20 27 41 4e 41 4c 59 5a 45 20 73  ELECT 'ANALYZE s
29e50 71 6c 69 74 65 5f 6d 61 73 74 65 72 27 22 2c 0a  qlite_master'",.
29e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29e70 20 20 20 63 61 6c 6c 62 61 63 6b 2c 20 26 64 61     callback, &da
29e80 74 61 2c 20 26 7a 45 72 72 4d 73 67 29 3b 0a 20  ta, &zErrMsg);. 
29e90 20 20 20 20 20 64 61 74 61 2e 63 4d 6f 64 65 20       data.cMode 
29ea0 3d 20 64 61 74 61 2e 6d 6f 64 65 20 3d 20 4d 4f  = data.mode = MO
29eb0 44 45 5f 49 6e 73 65 72 74 3b 0a 20 20 20 20 20  DE_Insert;.     
29ec0 20 64 61 74 61 2e 7a 44 65 73 74 54 61 62 6c 65   data.zDestTable
29ed0 20 3d 20 22 73 71 6c 69 74 65 5f 73 74 61 74 31   = "sqlite_stat1
29ee0 22 3b 0a 20 20 20 20 20 20 73 68 65 6c 6c 5f 65  ";.      shell_e
29ef0 78 65 63 28 70 2d 3e 64 62 2c 20 22 53 45 4c 45  xec(p->db, "SELE
29f00 43 54 20 2a 20 46 52 4f 4d 20 73 71 6c 69 74 65  CT * FROM sqlite
29f10 5f 73 74 61 74 31 22 2c 0a 20 20 20 20 20 20 20  _stat1",.       
29f20 20 20 20 20 20 20 20 20 20 20 73 68 65 6c 6c 5f            shell_
29f30 63 61 6c 6c 62 61 63 6b 2c 20 26 64 61 74 61 2c  callback, &data,
29f40 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20  &zErrMsg);.     
29f50 20 64 61 74 61 2e 7a 44 65 73 74 54 61 62 6c 65   data.zDestTable
29f60 20 3d 20 22 73 71 6c 69 74 65 5f 73 74 61 74 33   = "sqlite_stat3
29f70 22 3b 0a 20 20 20 20 20 20 73 68 65 6c 6c 5f 65  ";.      shell_e
29f80 78 65 63 28 70 2d 3e 64 62 2c 20 22 53 45 4c 45  xec(p->db, "SELE
29f90 43 54 20 2a 20 46 52 4f 4d 20 73 71 6c 69 74 65  CT * FROM sqlite
29fa0 5f 73 74 61 74 33 22 2c 0a 20 20 20 20 20 20 20  _stat3",.       
29fb0 20 20 20 20 20 20 20 20 20 20 73 68 65 6c 6c 5f            shell_
29fc0 63 61 6c 6c 62 61 63 6b 2c 20 26 64 61 74 61 2c  callback, &data,
29fd0 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20  &zErrMsg);.     
29fe0 20 64 61 74 61 2e 7a 44 65 73 74 54 61 62 6c 65   data.zDestTable
29ff0 20 3d 20 22 73 71 6c 69 74 65 5f 73 74 61 74 34   = "sqlite_stat4
2a000 22 3b 0a 20 20 20 20 20 20 73 68 65 6c 6c 5f 65  ";.      shell_e
2a010 78 65 63 28 70 2d 3e 64 62 2c 20 22 53 45 4c 45  xec(p->db, "SELE
2a020 43 54 20 2a 20 46 52 4f 4d 20 73 71 6c 69 74 65  CT * FROM sqlite
2a030 5f 73 74 61 74 34 22 2c 0a 20 20 20 20 20 20 20  _stat4",.       
2a040 20 20 20 20 20 20 20 20 20 20 73 68 65 6c 6c 5f            shell_
2a050 63 61 6c 6c 62 61 63 6b 2c 20 26 64 61 74 61 2c  callback, &data,
2a060 20 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20   &zErrMsg);.    
2a070 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e    raw_printf(p->
2a080 6f 75 74 2c 20 22 41 4e 41 4c 59 5a 45 20 73 71  out, "ANALYZE sq
2a090 6c 69 74 65 5f 6d 61 73 74 65 72 3b 5c 6e 22 29  lite_master;\n")
2a0a0 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a  ;.    }.  }else.
2a0b0 0a 20 20 69 66 28 20 63 3d 3d 27 68 27 20 26 26  .  if( c=='h' &&
2a0c0 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30   strncmp(azArg[0
2a0d0 5d 2c 20 22 68 65 61 64 65 72 73 22 2c 20 6e 29  ], "headers", n)
2a0e0 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6e  ==0 ){.    if( n
2a0f0 41 72 67 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20  Arg==2 ){.      
2a100 70 2d 3e 73 68 6f 77 48 65 61 64 65 72 20 3d 20  p->showHeader = 
2a110 62 6f 6f 6c 65 61 6e 56 61 6c 75 65 28 61 7a 41  booleanValue(azA
2a120 72 67 5b 31 5d 29 3b 0a 20 20 20 20 7d 65 6c 73  rg[1]);.    }els
2a130 65 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69  e{.      raw_pri
2a140 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55 73 61  ntf(stderr, "Usa
2a150 67 65 3a 20 2e 68 65 61 64 65 72 73 20 6f 6e 7c  ge: .headers on|
2a160 6f 66 66 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72  off\n");.      r
2a170 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  c = 1;.    }.  }
2a180 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27  else..  if( c=='
2a190 68 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a  h' && strncmp(az
2a1a0 41 72 67 5b 30 5d 2c 20 22 68 65 6c 70 22 2c 20  Arg[0], "help", 
2a1b0 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 75 74 66  n)==0 ){.    utf
2a1c0 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  8_printf(p->out,
2a1d0 20 22 25 73 22 2c 20 7a 48 65 6c 70 29 3b 0a 20   "%s", zHelp);. 
2a1e0 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d   }else..  if( c=
2a1f0 3d 27 69 27 20 26 26 20 73 74 72 6e 63 6d 70 28  ='i' && strncmp(
2a200 61 7a 41 72 67 5b 30 5d 2c 20 22 69 6d 70 6f 72  azArg[0], "impor
2a210 74 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20  t", n)==0 ){.   
2a220 20 63 68 61 72 20 2a 7a 54 61 62 6c 65 3b 20 20   char *zTable;  
2a230 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2a240 49 6e 73 65 72 74 20 64 61 74 61 20 69 6e 74 6f  Insert data into
2a250 20 74 68 69 73 20 74 61 62 6c 65 20 2a 2f 0a 20   this table */. 
2a260 20 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 3b 20     char *zFile; 
2a270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2a280 2a 20 4e 61 6d 65 20 6f 66 20 66 69 6c 65 20 74  * Name of file t
2a290 6f 20 65 78 74 72 61 20 63 6f 6e 74 65 6e 74 20  o extra content 
2a2a0 66 72 6f 6d 20 2a 2f 0a 20 20 20 20 73 71 6c 69  from */.    sqli
2a2b0 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20  te3_stmt *pStmt 
2a2c0 3d 20 4e 55 4c 4c 3b 20 2f 2a 20 41 20 73 74 61  = NULL; /* A sta
2a2d0 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 69 6e  tement */.    in
2a2e0 74 20 6e 43 6f 6c 3b 20 20 20 20 20 20 20 20 20  t nCol;         
2a2f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
2a300 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69  ber of columns i
2a310 6e 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20  n the table */. 
2a320 20 20 20 69 6e 74 20 6e 42 79 74 65 3b 20 20 20     int nByte;   
2a330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2a340 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
2a350 73 20 69 6e 20 61 6e 20 53 51 4c 20 73 74 72 69  s in an SQL stri
2a360 6e 67 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 2c  ng */.    int i,
2a370 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   j;             
2a380 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
2a390 75 6e 74 65 72 73 20 2a 2f 0a 20 20 20 20 69 6e  unters */.    in
2a3a0 74 20 6e 65 65 64 43 6f 6d 6d 69 74 3b 20 20 20  t needCommit;   
2a3b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
2a3c0 65 20 74 6f 20 43 4f 4d 4d 49 54 20 6f 72 20 52  e to COMMIT or R
2a3d0 4f 4c 4c 42 41 43 4b 20 61 74 20 65 6e 64 20 2a  OLLBACK at end *
2a3e0 2f 0a 20 20 20 20 69 6e 74 20 6e 53 65 70 3b 20  /.    int nSep; 
2a3f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a400 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
2a410 79 74 65 73 20 69 6e 20 70 2d 3e 63 6f 6c 53 65  ytes in p->colSe
2a420 70 61 72 61 74 6f 72 5b 5d 20 2a 2f 0a 20 20 20  parator[] */.   
2a430 20 63 68 61 72 20 2a 7a 53 71 6c 3b 20 20 20 20   char *zSql;    
2a440 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2a450 41 6e 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  An SQL statement
2a460 20 2a 2f 0a 20 20 20 20 49 6d 70 6f 72 74 43 74   */.    ImportCt
2a470 78 20 73 43 74 78 3b 20 20 20 20 20 20 20 20 20  x sCtx;         
2a480 20 20 20 20 2f 2a 20 52 65 61 64 65 72 20 63 6f      /* Reader co
2a490 6e 74 65 78 74 20 2a 2f 0a 20 20 20 20 63 68 61  ntext */.    cha
2a4a0 72 20 2a 28 53 51 4c 49 54 45 5f 43 44 45 43 4c  r *(SQLITE_CDECL
2a4b0 20 2a 78 52 65 61 64 29 28 49 6d 70 6f 72 74 43   *xRead)(ImportC
2a4c0 74 78 2a 29 3b 20 2f 2a 20 46 75 6e 63 20 74 6f  tx*); /* Func to
2a4d0 20 72 65 61 64 20 6f 6e 65 20 76 61 6c 75 65 20   read one value 
2a4e0 2a 2f 0a 20 20 20 20 69 6e 74 20 28 53 51 4c 49  */.    int (SQLI
2a4f0 54 45 5f 43 44 45 43 4c 20 2a 78 43 6c 6f 73 65  TE_CDECL *xClose
2a500 72 29 28 46 49 4c 45 2a 29 3b 20 20 20 20 20 20  r)(FILE*);      
2a510 2f 2a 20 46 75 6e 63 20 74 6f 20 63 6c 6f 73 65  /* Func to close
2a520 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 20 20 69 66   file */..    if
2a530 28 20 6e 41 72 67 21 3d 33 20 29 7b 0a 20 20 20  ( nArg!=3 ){.   
2a540 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74     raw_printf(st
2a550 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 69  derr, "Usage: .i
2a560 6d 70 6f 72 74 20 46 49 4c 45 20 54 41 42 4c 45  mport FILE TABLE
2a570 5c 6e 22 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f  \n");.      goto
2a580 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78   meta_command_ex
2a590 69 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 46  it;.    }.    zF
2a5a0 69 6c 65 20 3d 20 61 7a 41 72 67 5b 31 5d 3b 0a  ile = azArg[1];.
2a5b0 20 20 20 20 7a 54 61 62 6c 65 20 3d 20 61 7a 41      zTable = azA
2a5c0 72 67 5b 32 5d 3b 0a 20 20 20 20 73 65 65 6e 49  rg[2];.    seenI
2a5d0 6e 74 65 72 72 75 70 74 20 3d 20 30 3b 0a 20 20  nterrupt = 0;.  
2a5e0 20 20 6d 65 6d 73 65 74 28 26 73 43 74 78 2c 20    memset(&sCtx, 
2a5f0 30 2c 20 73 69 7a 65 6f 66 28 73 43 74 78 29 29  0, sizeof(sCtx))
2a600 3b 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28 70 2c  ;.    open_db(p,
2a610 20 30 29 3b 0a 20 20 20 20 6e 53 65 70 20 3d 20   0);.    nSep = 
2a620 73 74 72 6c 65 6e 33 30 28 70 2d 3e 63 6f 6c 53  strlen30(p->colS
2a630 65 70 61 72 61 74 6f 72 29 3b 0a 20 20 20 20 69  eparator);.    i
2a640 66 28 20 6e 53 65 70 3d 3d 30 20 29 7b 0a 20 20  f( nSep==0 ){.  
2a650 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73      raw_printf(s
2a660 74 64 65 72 72 2c 0a 20 20 20 20 20 20 20 20 20  tderr,.         
2a670 20 20 20 20 20 20 20 20 22 45 72 72 6f 72 3a 20          "Error: 
2a680 6e 6f 6e 2d 6e 75 6c 6c 20 63 6f 6c 75 6d 6e 20  non-null column 
2a690 73 65 70 61 72 61 74 6f 72 20 72 65 71 75 69 72  separator requir
2a6a0 65 64 20 66 6f 72 20 69 6d 70 6f 72 74 5c 6e 22  ed for import\n"
2a6b0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
2a6c0 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  1;.    }.    if(
2a6d0 20 6e 53 65 70 3e 31 20 29 7b 0a 20 20 20 20 20   nSep>1 ){.     
2a6e0 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65   raw_printf(stde
2a6f0 72 72 2c 20 22 45 72 72 6f 72 3a 20 6d 75 6c 74  rr, "Error: mult
2a700 69 2d 63 68 61 72 61 63 74 65 72 20 63 6f 6c 75  i-character colu
2a710 6d 6e 20 73 65 70 61 72 61 74 6f 72 73 20 6e 6f  mn separators no
2a720 74 20 61 6c 6c 6f 77 65 64 22 0a 20 20 20 20 20  t allowed".     
2a730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a740 20 22 20 66 6f 72 20 69 6d 70 6f 72 74 5c 6e 22   " for import\n"
2a750 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
2a760 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 53 65  1;.    }.    nSe
2a770 70 20 3d 20 73 74 72 6c 65 6e 33 30 28 70 2d 3e  p = strlen30(p->
2a780 72 6f 77 53 65 70 61 72 61 74 6f 72 29 3b 0a 20  rowSeparator);. 
2a790 20 20 20 69 66 28 20 6e 53 65 70 3d 3d 30 20 29     if( nSep==0 )
2a7a0 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e  {.      raw_prin
2a7b0 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f  tf(stderr, "Erro
2a7c0 72 3a 20 6e 6f 6e 2d 6e 75 6c 6c 20 72 6f 77 20  r: non-null row 
2a7d0 73 65 70 61 72 61 74 6f 72 20 72 65 71 75 69 72  separator requir
2a7e0 65 64 20 66 6f 72 20 69 6d 70 6f 72 74 5c 6e 22  ed for import\n"
2a7f0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
2a800 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  1;.    }.    if(
2a810 20 6e 53 65 70 3d 3d 32 20 26 26 20 70 2d 3e 6d   nSep==2 && p->m
2a820 6f 64 65 3d 3d 4d 4f 44 45 5f 43 73 76 20 26 26  ode==MODE_Csv &&
2a830 20 73 74 72 63 6d 70 28 70 2d 3e 72 6f 77 53 65   strcmp(p->rowSe
2a840 70 61 72 61 74 6f 72 2c 20 53 45 50 5f 43 72 4c  parator, SEP_CrL
2a850 66 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f  f)==0 ){.      /
2a860 2a 20 57 68 65 6e 20 69 6d 70 6f 72 74 69 6e 67  * When importing
2a870 20 43 53 56 20 28 6f 6e 6c 79 29 2c 20 69 66 20   CSV (only), if 
2a880 74 68 65 20 72 6f 77 20 73 65 70 61 72 61 74 6f  the row separato
2a890 72 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 0a  r is set to the.
2a8a0 20 20 20 20 20 20 2a 2a 20 64 65 66 61 75 6c 74        ** default
2a8b0 20 6f 75 74 70 75 74 20 72 6f 77 20 73 65 70 61   output row sepa
2a8c0 72 61 74 6f 72 2c 20 63 68 61 6e 67 65 20 69 74  rator, change it
2a8d0 20 74 6f 20 74 68 65 20 64 65 66 61 75 6c 74 20   to the default 
2a8e0 69 6e 70 75 74 0a 20 20 20 20 20 20 2a 2a 20 72  input.      ** r
2a8f0 6f 77 20 73 65 70 61 72 61 74 6f 72 2e 20 20 54  ow separator.  T
2a900 68 69 73 20 61 76 6f 69 64 73 20 68 61 76 69 6e  his avoids havin
2a910 67 20 74 6f 20 6d 61 69 6e 74 61 69 6e 20 64 69  g to maintain di
2a920 66 66 65 72 65 6e 74 20 69 6e 70 75 74 0a 20 20  fferent input.  
2a930 20 20 20 20 2a 2a 20 61 6e 64 20 6f 75 74 70 75      ** and outpu
2a940 74 20 72 6f 77 20 73 65 70 61 72 61 74 6f 72 73  t row separators
2a950 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  . */.      sqlit
2a960 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
2a970 6f 66 28 70 2d 3e 72 6f 77 53 65 70 61 72 61 74  of(p->rowSeparat
2a980 6f 72 29 2c 20 70 2d 3e 72 6f 77 53 65 70 61 72  or), p->rowSepar
2a990 61 74 6f 72 2c 20 53 45 50 5f 52 6f 77 29 3b 0a  ator, SEP_Row);.
2a9a0 20 20 20 20 20 20 6e 53 65 70 20 3d 20 73 74 72        nSep = str
2a9b0 6c 65 6e 33 30 28 70 2d 3e 72 6f 77 53 65 70 61  len30(p->rowSepa
2a9c0 72 61 74 6f 72 29 3b 0a 20 20 20 20 7d 0a 20 20  rator);.    }.  
2a9d0 20 20 69 66 28 20 6e 53 65 70 3e 31 20 29 7b 0a    if( nSep>1 ){.
2a9e0 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
2a9f0 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a  (stderr, "Error:
2aa00 20 6d 75 6c 74 69 2d 63 68 61 72 61 63 74 65 72   multi-character
2aa10 20 72 6f 77 20 73 65 70 61 72 61 74 6f 72 73 20   row separators 
2aa20 6e 6f 74 20 61 6c 6c 6f 77 65 64 22 0a 20 20 20  not allowed".   
2aa30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2aa40 20 20 20 22 20 66 6f 72 20 69 6d 70 6f 72 74 5c     " for import\
2aa50 6e 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  n");.      retur
2aa60 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  n 1;.    }.    s
2aa70 43 74 78 2e 7a 46 69 6c 65 20 3d 20 7a 46 69 6c  Ctx.zFile = zFil
2aa80 65 3b 0a 20 20 20 20 73 43 74 78 2e 6e 4c 69 6e  e;.    sCtx.nLin
2aa90 65 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 73  e = 1;.    if( s
2aaa0 43 74 78 2e 7a 46 69 6c 65 5b 30 5d 3d 3d 27 7c  Ctx.zFile[0]=='|
2aab0 27 20 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  ' ){.#ifdef SQLI
2aac0 54 45 5f 4f 4d 49 54 5f 50 4f 50 45 4e 0a 20 20  TE_OMIT_POPEN.  
2aad0 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73      raw_printf(s
2aae0 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 70  tderr, "Error: p
2aaf0 69 70 65 73 20 61 72 65 20 6e 6f 74 20 73 75 70  ipes are not sup
2ab00 70 6f 72 74 65 64 20 69 6e 20 74 68 69 73 20 4f  ported in this O
2ab10 53 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 65 74  S\n");.      ret
2ab20 75 72 6e 20 31 3b 0a 23 65 6c 73 65 0a 20 20 20  urn 1;.#else.   
2ab30 20 20 20 73 43 74 78 2e 69 6e 20 3d 20 70 6f 70     sCtx.in = pop
2ab40 65 6e 28 73 43 74 78 2e 7a 46 69 6c 65 2b 31 2c  en(sCtx.zFile+1,
2ab50 20 22 72 22 29 3b 0a 20 20 20 20 20 20 73 43 74   "r");.      sCt
2ab60 78 2e 7a 46 69 6c 65 20 3d 20 22 3c 70 69 70 65  x.zFile = "<pipe
2ab70 3e 22 3b 0a 20 20 20 20 20 20 78 43 6c 6f 73 65  >";.      xClose
2ab80 72 20 3d 20 70 63 6c 6f 73 65 3b 0a 23 65 6e 64  r = pclose;.#end
2ab90 69 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  if.    }else{.  
2aba0 20 20 20 20 73 43 74 78 2e 69 6e 20 3d 20 66 6f      sCtx.in = fo
2abb0 70 65 6e 28 73 43 74 78 2e 7a 46 69 6c 65 2c 20  pen(sCtx.zFile, 
2abc0 22 72 62 22 29 3b 0a 20 20 20 20 20 20 78 43 6c  "rb");.      xCl
2abd0 6f 73 65 72 20 3d 20 66 63 6c 6f 73 65 3b 0a 20  oser = fclose;. 
2abe0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e     }.    if( p->
2abf0 6d 6f 64 65 3d 3d 4d 4f 44 45 5f 41 73 63 69 69  mode==MODE_Ascii
2ac00 20 29 7b 0a 20 20 20 20 20 20 78 52 65 61 64 20   ){.      xRead 
2ac10 3d 20 61 73 63 69 69 5f 72 65 61 64 5f 6f 6e 65  = ascii_read_one
2ac20 5f 66 69 65 6c 64 3b 0a 20 20 20 20 7d 65 6c 73  _field;.    }els
2ac30 65 7b 0a 20 20 20 20 20 20 78 52 65 61 64 20 3d  e{.      xRead =
2ac40 20 63 73 76 5f 72 65 61 64 5f 6f 6e 65 5f 66 69   csv_read_one_fi
2ac50 65 6c 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  eld;.    }.    i
2ac60 66 28 20 73 43 74 78 2e 69 6e 3d 3d 30 20 29 7b  f( sCtx.in==0 ){
2ac70 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e  .      utf8_prin
2ac80 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f  tf(stderr, "Erro
2ac90 72 3a 20 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 5c  r: cannot open \
2aca0 22 25 73 5c 22 5c 6e 22 2c 20 7a 46 69 6c 65 29  "%s\"\n", zFile)
2acb0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  ;.      return 1
2acc0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 43 74 78  ;.    }.    sCtx
2acd0 2e 63 43 6f 6c 53 65 70 20 3d 20 70 2d 3e 63 6f  .cColSep = p->co
2ace0 6c 53 65 70 61 72 61 74 6f 72 5b 30 5d 3b 0a 20  lSeparator[0];. 
2acf0 20 20 20 73 43 74 78 2e 63 52 6f 77 53 65 70 20     sCtx.cRowSep 
2ad00 3d 20 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f  = p->rowSeparato
2ad10 72 5b 30 5d 3b 0a 20 20 20 20 7a 53 71 6c 20 3d  r[0];.    zSql =
2ad20 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
2ad30 28 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  ("SELECT * FROM 
2ad40 25 73 22 2c 20 7a 54 61 62 6c 65 29 3b 0a 20 20  %s", zTable);.  
2ad50 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29 7b    if( zSql==0 ){
2ad60 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74  .      raw_print
2ad70 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72  f(stderr, "Error
2ad80 3a 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 5c  : out of memory\
2ad90 6e 22 29 3b 0a 20 20 20 20 20 20 78 43 6c 6f 73  n");.      xClos
2ada0 65 72 28 73 43 74 78 2e 69 6e 29 3b 0a 20 20 20  er(sCtx.in);.   
2adb0 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
2adc0 20 7d 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 73   }.    nByte = s
2add0 74 72 6c 65 6e 33 30 28 7a 53 71 6c 29 3b 0a 20  trlen30(zSql);. 
2ade0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
2adf0 70 72 65 70 61 72 65 5f 76 32 28 70 2d 3e 64 62  prepare_v2(p->db
2ae00 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74  , zSql, -1, &pSt
2ae10 6d 74 2c 20 30 29 3b 0a 20 20 20 20 69 6d 70 6f  mt, 0);.    impo
2ae20 72 74 5f 61 70 70 65 6e 64 5f 63 68 61 72 28 26  rt_append_char(&
2ae30 73 43 74 78 2c 20 30 29 3b 20 20 20 20 2f 2a 20  sCtx, 0);    /* 
2ae40 54 6f 20 65 6e 73 75 72 65 20 73 43 74 78 2e 7a  To ensure sCtx.z
2ae50 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 2a 2f   is allocated */
2ae60 0a 20 20 20 20 69 66 28 20 72 63 20 26 26 20 73  .    if( rc && s
2ae70 71 6c 69 74 65 33 5f 73 74 72 67 6c 6f 62 28 22  qlite3_strglob("
2ae80 6e 6f 20 73 75 63 68 20 74 61 62 6c 65 3a 20 2a  no such table: *
2ae90 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73  ", sqlite3_errms
2aea0 67 28 70 2d 3e 64 62 29 29 3d 3d 30 20 29 7b 0a  g(p->db))==0 ){.
2aeb0 20 20 20 20 20 20 63 68 61 72 20 2a 7a 43 72 65        char *zCre
2aec0 61 74 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  ate = sqlite3_mp
2aed0 72 69 6e 74 66 28 22 43 52 45 41 54 45 20 54 41  rintf("CREATE TA
2aee0 42 4c 45 20 25 73 22 2c 20 7a 54 61 62 6c 65 29  BLE %s", zTable)
2aef0 3b 0a 20 20 20 20 20 20 63 68 61 72 20 63 53 65  ;.      char cSe
2af00 70 20 3d 20 27 28 27 3b 0a 20 20 20 20 20 20 77  p = '(';.      w
2af10 68 69 6c 65 28 20 78 52 65 61 64 28 26 73 43 74  hile( xRead(&sCt
2af20 78 29 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 43  x) ){.        zC
2af30 72 65 61 74 65 20 3d 20 73 71 6c 69 74 65 33 5f  reate = sqlite3_
2af40 6d 70 72 69 6e 74 66 28 22 25 7a 25 63 5c 6e 20  mprintf("%z%c\n 
2af50 20 5c 22 25 77 5c 22 20 54 45 58 54 22 2c 20 7a   \"%w\" TEXT", z
2af60 43 72 65 61 74 65 2c 20 63 53 65 70 2c 20 73 43  Create, cSep, sC
2af70 74 78 2e 7a 29 3b 0a 20 20 20 20 20 20 20 20 63  tx.z);.        c
2af80 53 65 70 20 3d 20 27 2c 27 3b 0a 20 20 20 20 20  Sep = ',';.     
2af90 20 20 20 69 66 28 20 73 43 74 78 2e 63 54 65 72     if( sCtx.cTer
2afa0 6d 21 3d 73 43 74 78 2e 63 43 6f 6c 53 65 70 20  m!=sCtx.cColSep 
2afb0 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d  ) break;.      }
2afc0 0a 20 20 20 20 20 20 69 66 28 20 63 53 65 70 3d  .      if( cSep=
2afd0 3d 27 28 27 20 29 7b 0a 20 20 20 20 20 20 20 20  ='(' ){.        
2afe0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 72  sqlite3_free(zCr
2aff0 65 61 74 65 29 3b 0a 20 20 20 20 20 20 20 20 73  eate);.        s
2b000 71 6c 69 74 65 33 5f 66 72 65 65 28 73 43 74 78  qlite3_free(sCtx
2b010 2e 7a 29 3b 0a 20 20 20 20 20 20 20 20 78 43 6c  .z);.        xCl
2b020 6f 73 65 72 28 73 43 74 78 2e 69 6e 29 3b 0a 20  oser(sCtx.in);. 
2b030 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e         utf8_prin
2b040 74 66 28 73 74 64 65 72 72 2c 22 25 73 3a 20 65  tf(stderr,"%s: e
2b050 6d 70 74 79 20 66 69 6c 65 5c 6e 22 2c 20 73 43  mpty file\n", sC
2b060 74 78 2e 7a 46 69 6c 65 29 3b 0a 20 20 20 20 20  tx.zFile);.     
2b070 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
2b080 20 20 20 7d 0a 20 20 20 20 20 20 7a 43 72 65 61     }.      zCrea
2b090 74 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  te = sqlite3_mpr
2b0a0 69 6e 74 66 28 22 25 7a 5c 6e 29 22 2c 20 7a 43  intf("%z\n)", zC
2b0b0 72 65 61 74 65 29 3b 0a 20 20 20 20 20 20 72 63  reate);.      rc
2b0c0 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28   = sqlite3_exec(
2b0d0 70 2d 3e 64 62 2c 20 7a 43 72 65 61 74 65 2c 20  p->db, zCreate, 
2b0e0 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  0, 0, 0);.      
2b0f0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 72  sqlite3_free(zCr
2b100 65 61 74 65 29 3b 0a 20 20 20 20 20 20 69 66 28  eate);.      if(
2b110 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 75   rc ){.        u
2b120 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72  tf8_printf(stder
2b130 72 2c 20 22 43 52 45 41 54 45 20 54 41 42 4c 45  r, "CREATE TABLE
2b140 20 25 73 28 2e 2e 2e 29 20 66 61 69 6c 65 64 3a   %s(...) failed:
2b150 20 25 73 5c 6e 22 2c 20 7a 54 61 62 6c 65 2c 0a   %s\n", zTable,.
2b160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b170 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70  sqlite3_errmsg(p
2b180 2d 3e 64 62 29 29 3b 0a 20 20 20 20 20 20 20 20  ->db));.        
2b190 73 71 6c 69 74 65 33 5f 66 72 65 65 28 73 43 74  sqlite3_free(sCt
2b1a0 78 2e 7a 29 3b 0a 20 20 20 20 20 20 20 20 78 43  x.z);.        xC
2b1b0 6c 6f 73 65 72 28 73 43 74 78 2e 69 6e 29 3b 0a  loser(sCtx.in);.
2b1c0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31          return 1
2b1d0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2b1e0 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65  rc = sqlite3_pre
2b1f0 70 61 72 65 5f 76 32 28 70 2d 3e 64 62 2c 20 7a  pare_v2(p->db, z
2b200 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c  Sql, -1, &pStmt,
2b210 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73   0);.    }.    s
2b220 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c  qlite3_free(zSql
2b230 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b  );.    if( rc ){
2b240 0a 20 20 20 20 20 20 69 66 20 28 70 53 74 6d 74  .      if (pStmt
2b250 29 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69  ) sqlite3_finali
2b260 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20  ze(pStmt);.     
2b270 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64   utf8_printf(std
2b280 65 72 72 2c 22 45 72 72 6f 72 3a 20 25 73 5c 6e  err,"Error: %s\n
2b290 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73  ", sqlite3_errms
2b2a0 67 28 70 2d 3e 64 62 29 29 3b 0a 20 20 20 20 20  g(p->db));.     
2b2b0 20 78 43 6c 6f 73 65 72 28 73 43 74 78 2e 69 6e   xCloser(sCtx.in
2b2c0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
2b2d0 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 43 6f  1;.    }.    nCo
2b2e0 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  l = sqlite3_colu
2b2f0 6d 6e 5f 63 6f 75 6e 74 28 70 53 74 6d 74 29 3b  mn_count(pStmt);
2b300 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e  .    sqlite3_fin
2b310 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20  alize(pStmt);.  
2b320 20 20 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20    pStmt = 0;.   
2b330 20 69 66 28 20 6e 43 6f 6c 3d 3d 30 20 29 20 72   if( nCol==0 ) r
2b340 65 74 75 72 6e 20 30 3b 20 2f 2a 20 6e 6f 20 63  eturn 0; /* no c
2b350 6f 6c 75 6d 6e 73 2c 20 6e 6f 20 65 72 72 6f 72  olumns, no error
2b360 20 2a 2f 0a 20 20 20 20 7a 53 71 6c 20 3d 20 73   */.    zSql = s
2b370 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28  qlite3_malloc64(
2b380 20 6e 42 79 74 65 2a 32 20 2b 20 32 30 20 2b 20   nByte*2 + 20 + 
2b390 6e 43 6f 6c 2a 32 20 29 3b 0a 20 20 20 20 69 66  nCol*2 );.    if
2b3a0 28 20 7a 53 71 6c 3d 3d 30 20 29 7b 0a 20 20 20  ( zSql==0 ){.   
2b3b0 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74     raw_printf(st
2b3c0 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 6f 75  derr, "Error: ou
2b3d0 74 20 6f 66 20 6d 65 6d 6f 72 79 5c 6e 22 29 3b  t of memory\n");
2b3e0 0a 20 20 20 20 20 20 78 43 6c 6f 73 65 72 28 73  .      xCloser(s
2b3f0 43 74 78 2e 69 6e 29 3b 0a 20 20 20 20 20 20 72  Ctx.in);.      r
2b400 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
2b410 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
2b420 6e 74 66 28 6e 42 79 74 65 2b 32 30 2c 20 7a 53  ntf(nByte+20, zS
2b430 71 6c 2c 20 22 49 4e 53 45 52 54 20 49 4e 54 4f  ql, "INSERT INTO
2b440 20 5c 22 25 77 5c 22 20 56 41 4c 55 45 53 28 3f   \"%w\" VALUES(?
2b450 22 2c 20 7a 54 61 62 6c 65 29 3b 0a 20 20 20 20  ", zTable);.    
2b460 6a 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a 53 71  j = strlen30(zSq
2b470 6c 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b  l);.    for(i=1;
2b480 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20   i<nCol; i++){. 
2b490 20 20 20 20 20 7a 53 71 6c 5b 6a 2b 2b 5d 20 3d       zSql[j++] =
2b4a0 20 27 2c 27 3b 0a 20 20 20 20 20 20 7a 53 71 6c   ',';.      zSql
2b4b0 5b 6a 2b 2b 5d 20 3d 20 27 3f 27 3b 0a 20 20 20  [j++] = '?';.   
2b4c0 20 7d 0a 20 20 20 20 7a 53 71 6c 5b 6a 2b 2b 5d   }.    zSql[j++]
2b4d0 20 3d 20 27 29 27 3b 0a 20 20 20 20 7a 53 71 6c   = ')';.    zSql
2b4e0 5b 6a 5d 20 3d 20 30 3b 0a 20 20 20 20 72 63 20  [j] = 0;.    rc 
2b4f0 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72  = sqlite3_prepar
2b500 65 5f 76 32 28 70 2d 3e 64 62 2c 20 7a 53 71 6c  e_v2(p->db, zSql
2b510 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29  , -1, &pStmt, 0)
2b520 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
2b530 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20 69 66  ee(zSql);.    if
2b540 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 75 74  ( rc ){.      ut
2b550 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  f8_printf(stderr
2b560 2c 20 22 45 72 72 6f 72 3a 20 25 73 5c 6e 22 2c  , "Error: %s\n",
2b570 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
2b580 70 2d 3e 64 62 29 29 3b 0a 20 20 20 20 20 20 69  p->db));.      i
2b590 66 20 28 70 53 74 6d 74 29 20 73 71 6c 69 74 65  f (pStmt) sqlite
2b5a0 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74  3_finalize(pStmt
2b5b0 29 3b 0a 20 20 20 20 20 20 78 43 6c 6f 73 65 72  );.      xCloser
2b5c0 28 73 43 74 78 2e 69 6e 29 3b 0a 20 20 20 20 20  (sCtx.in);.     
2b5d0 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
2b5e0 0a 20 20 20 20 6e 65 65 64 43 6f 6d 6d 69 74 20  .    needCommit 
2b5f0 3d 20 73 71 6c 69 74 65 33 5f 67 65 74 5f 61 75  = sqlite3_get_au
2b600 74 6f 63 6f 6d 6d 69 74 28 70 2d 3e 64 62 29 3b  tocommit(p->db);
2b610 0a 20 20 20 20 69 66 28 20 6e 65 65 64 43 6f 6d  .    if( needCom
2b620 6d 69 74 20 29 20 73 71 6c 69 74 65 33 5f 65 78  mit ) sqlite3_ex
2b630 65 63 28 70 2d 3e 64 62 2c 20 22 42 45 47 49 4e  ec(p->db, "BEGIN
2b640 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20  ", 0, 0, 0);.   
2b650 20 64 6f 7b 0a 20 20 20 20 20 20 69 6e 74 20 73   do{.      int s
2b660 74 61 72 74 4c 69 6e 65 20 3d 20 73 43 74 78 2e  tartLine = sCtx.
2b670 6e 4c 69 6e 65 3b 0a 20 20 20 20 20 20 66 6f 72  nLine;.      for
2b680 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b  (i=0; i<nCol; i+
2b690 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72  +){.        char
2b6a0 20 2a 7a 20 3d 20 78 52 65 61 64 28 26 73 43 74   *z = xRead(&sCt
2b6b0 78 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a 0a 20  x);.        /*. 
2b6c0 20 20 20 20 20 20 20 2a 2a 20 44 69 64 20 77 65         ** Did we
2b6d0 20 72 65 61 63 68 20 65 6e 64 2d 6f 66 2d 66 69   reach end-of-fi
2b6e0 6c 65 20 62 65 66 6f 72 65 20 66 69 6e 64 69 6e  le before findin
2b6f0 67 20 61 6e 79 20 63 6f 6c 75 6d 6e 73 3f 0a 20  g any columns?. 
2b700 20 20 20 20 20 20 20 2a 2a 20 49 66 20 73 6f 2c         ** If so,
2b710 20 73 74 6f 70 20 69 6e 73 74 65 61 64 20 6f 66   stop instead of
2b720 20 4e 55 4c 4c 20 66 69 6c 6c 69 6e 67 20 74 68   NULL filling th
2b730 65 20 72 65 6d 61 69 6e 69 6e 67 20 63 6f 6c 75  e remaining colu
2b740 6d 6e 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  mns..        */.
2b750 20 20 20 20 20 20 20 20 69 66 28 20 7a 3d 3d 30          if( z==0
2b760 20 26 26 20 69 3d 3d 30 20 29 20 62 72 65 61 6b   && i==0 ) break
2b770 3b 0a 20 20 20 20 20 20 20 20 2f 2a 0a 20 20 20  ;.        /*.   
2b780 20 20 20 20 20 2a 2a 20 44 69 64 20 77 65 20 72       ** Did we r
2b790 65 61 63 68 20 65 6e 64 2d 6f 66 2d 66 69 6c 65  each end-of-file
2b7a0 20 4f 52 20 65 6e 64 2d 6f 66 2d 6c 69 6e 65 20   OR end-of-line 
2b7b0 62 65 66 6f 72 65 20 66 69 6e 64 69 6e 67 20 61  before finding a
2b7c0 6e 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 6f  ny.        ** co
2b7d0 6c 75 6d 6e 73 20 69 6e 20 41 53 43 49 49 20 6d  lumns in ASCII m
2b7e0 6f 64 65 3f 20 20 49 66 20 73 6f 2c 20 73 74 6f  ode?  If so, sto
2b7f0 70 20 69 6e 73 74 65 61 64 20 6f 66 20 4e 55 4c  p instead of NUL
2b800 4c 20 66 69 6c 6c 69 6e 67 0a 20 20 20 20 20 20  L filling.      
2b810 20 20 2a 2a 20 74 68 65 20 72 65 6d 61 69 6e 69    ** the remaini
2b820 6e 67 20 63 6f 6c 75 6d 6e 73 2e 0a 20 20 20 20  ng columns..    
2b830 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
2b840 66 28 20 70 2d 3e 6d 6f 64 65 3d 3d 4d 4f 44 45  f( p->mode==MODE
2b850 5f 41 73 63 69 69 20 26 26 20 28 7a 3d 3d 30 20  _Ascii && (z==0 
2b860 7c 7c 20 7a 5b 30 5d 3d 3d 30 29 20 26 26 20 69  || z[0]==0) && i
2b870 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
2b880 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e       sqlite3_bin
2b890 64 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 69 2b  d_text(pStmt, i+
2b8a0 31 2c 20 7a 2c 20 2d 31 2c 20 53 51 4c 49 54 45  1, z, -1, SQLITE
2b8b0 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20  _TRANSIENT);.   
2b8c0 20 20 20 20 20 69 66 28 20 69 3c 6e 43 6f 6c 2d       if( i<nCol-
2b8d0 31 20 26 26 20 73 43 74 78 2e 63 54 65 72 6d 21  1 && sCtx.cTerm!
2b8e0 3d 73 43 74 78 2e 63 43 6f 6c 53 65 70 20 29 7b  =sCtx.cColSep ){
2b8f0 0a 20 20 20 20 20 20 20 20 20 20 75 74 66 38 5f  .          utf8_
2b900 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
2b910 25 73 3a 25 64 3a 20 65 78 70 65 63 74 65 64 20  %s:%d: expected 
2b920 25 64 20 63 6f 6c 75 6d 6e 73 20 62 75 74 20 66  %d columns but f
2b930 6f 75 6e 64 20 25 64 20 2d 20 22 0a 20 20 20 20  ound %d - ".    
2b940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b950 20 20 20 20 20 20 22 66 69 6c 6c 69 6e 67 20 74        "filling t
2b960 68 65 20 72 65 73 74 20 77 69 74 68 20 4e 55 4c  he rest with NUL
2b970 4c 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  L\n",.          
2b980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b990 73 43 74 78 2e 7a 46 69 6c 65 2c 20 73 74 61 72  sCtx.zFile, star
2b9a0 74 4c 69 6e 65 2c 20 6e 43 6f 6c 2c 20 69 2b 31  tLine, nCol, i+1
2b9b0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 20 2b  );.          i +
2b9c0 3d 20 32 3b 0a 20 20 20 20 20 20 20 20 20 20 77  = 2;.          w
2b9d0 68 69 6c 65 28 20 69 3c 3d 6e 43 6f 6c 20 29 7b  hile( i<=nCol ){
2b9e0 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 6e 75   sqlite3_bind_nu
2b9f0 6c 6c 28 70 53 74 6d 74 2c 20 69 29 3b 20 69 2b  ll(pStmt, i); i+
2ba00 2b 3b 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20  +; }.        }. 
2ba10 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
2ba20 20 73 43 74 78 2e 63 54 65 72 6d 3d 3d 73 43 74   sCtx.cTerm==sCt
2ba30 78 2e 63 43 6f 6c 53 65 70 20 29 7b 0a 20 20 20  x.cColSep ){.   
2ba40 20 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 20       do{.       
2ba50 20 20 20 78 52 65 61 64 28 26 73 43 74 78 29 3b     xRead(&sCtx);
2ba60 0a 20 20 20 20 20 20 20 20 20 20 69 2b 2b 3b 0a  .          i++;.
2ba70 20 20 20 20 20 20 20 20 7d 77 68 69 6c 65 28 20          }while( 
2ba80 73 43 74 78 2e 63 54 65 72 6d 3d 3d 73 43 74 78  sCtx.cTerm==sCtx
2ba90 2e 63 43 6f 6c 53 65 70 20 29 3b 0a 20 20 20 20  .cColSep );.    
2baa0 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
2bab0 73 74 64 65 72 72 2c 20 22 25 73 3a 25 64 3a 20  stderr, "%s:%d: 
2bac0 65 78 70 65 63 74 65 64 20 25 64 20 63 6f 6c 75  expected %d colu
2bad0 6d 6e 73 20 62 75 74 20 66 6f 75 6e 64 20 25 64  mns but found %d
2bae0 20 2d 20 22 0a 20 20 20 20 20 20 20 20 20 20 20   - ".           
2baf0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 65 78               "ex
2bb00 74 72 61 73 20 69 67 6e 6f 72 65 64 5c 6e 22 2c  tras ignored\n",
2bb10 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2bb20 20 20 20 20 20 20 20 20 20 73 43 74 78 2e 7a 46           sCtx.zF
2bb30 69 6c 65 2c 20 73 74 61 72 74 4c 69 6e 65 2c 20  ile, startLine, 
2bb40 6e 43 6f 6c 2c 20 69 29 3b 0a 20 20 20 20 20 20  nCol, i);.      
2bb50 7d 0a 20 20 20 20 20 20 69 66 28 20 69 3e 3d 6e  }.      if( i>=n
2bb60 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 73  Col ){.        s
2bb70 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d  qlite3_step(pStm
2bb80 74 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  t);.        rc =
2bb90 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70   sqlite3_reset(p
2bba0 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 20 20 69  Stmt);.        i
2bbb0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2bbc0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 74   ){.          ut
2bbd0 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  f8_printf(stderr
2bbe0 2c 20 22 25 73 3a 25 64 3a 20 49 4e 53 45 52 54  , "%s:%d: INSERT
2bbf0 20 66 61 69 6c 65 64 3a 20 25 73 5c 6e 22 2c 20   failed: %s\n", 
2bc00 73 43 74 78 2e 7a 46 69 6c 65 2c 0a 20 20 20 20  sCtx.zFile,.    
2bc10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bc20 20 20 73 74 61 72 74 4c 69 6e 65 2c 20 73 71 6c    startLine, sql
2bc30 69 74 65 33 5f 65 72 72 6d 73 67 28 70 2d 3e 64  ite3_errmsg(p->d
2bc40 62 29 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  b));.        }. 
2bc50 20 20 20 20 20 7d 0a 20 20 20 20 7d 77 68 69 6c       }.    }whil
2bc60 65 28 20 73 43 74 78 2e 63 54 65 72 6d 21 3d 45  e( sCtx.cTerm!=E
2bc70 4f 46 20 29 3b 0a 0a 20 20 20 20 78 43 6c 6f 73  OF );..    xClos
2bc80 65 72 28 73 43 74 78 2e 69 6e 29 3b 0a 20 20 20  er(sCtx.in);.   
2bc90 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 73 43   sqlite3_free(sC
2bca0 74 78 2e 7a 29 3b 0a 20 20 20 20 73 71 6c 69 74  tx.z);.    sqlit
2bcb0 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d  e3_finalize(pStm
2bcc0 74 29 3b 0a 20 20 20 20 69 66 28 20 6e 65 65 64  t);.    if( need
2bcd0 43 6f 6d 6d 69 74 20 29 20 73 71 6c 69 74 65 33  Commit ) sqlite3
2bce0 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20 22 43 4f  _exec(p->db, "CO
2bcf0 4d 4d 49 54 22 2c 20 30 2c 20 30 2c 20 30 29 3b  MMIT", 0, 0, 0);
2bd00 0a 20 20 7d 65 6c 73 65 0a 0a 23 69 66 6e 64 65  .  }else..#ifnde
2bd10 66 20 53 51 4c 49 54 45 5f 55 4e 54 45 53 54 41  f SQLITE_UNTESTA
2bd20 42 4c 45 0a 20 20 69 66 28 20 63 3d 3d 27 69 27  BLE.  if( c=='i'
2bd30 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72   && strncmp(azAr
2bd40 67 5b 30 5d 2c 20 22 69 6d 70 6f 73 74 65 72 22  g[0], "imposter"
2bd50 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 63  , n)==0 ){.    c
2bd60 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 20 20 63  har *zSql;.    c
2bd70 68 61 72 20 2a 7a 43 6f 6c 6c 69 73 74 20 3d 20  har *zCollist = 
2bd80 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  0;.    sqlite3_s
2bd90 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 20 20  tmt *pStmt;.    
2bda0 69 6e 74 20 74 6e 75 6d 20 3d 20 30 3b 0a 20 20  int tnum = 0;.  
2bdb0 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 66 28    int i;.    if(
2bdc0 20 6e 41 72 67 21 3d 33 20 29 7b 0a 20 20 20 20   nArg!=3 ){.    
2bdd0 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74    utf8_printf(st
2bde0 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 69  derr, "Usage: .i
2bdf0 6d 70 6f 73 74 65 72 20 49 4e 44 45 58 20 49 4d  mposter INDEX IM
2be00 50 4f 53 54 45 52 5c 6e 22 29 3b 0a 20 20 20 20  POSTER\n");.    
2be10 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20    rc = 1;.      
2be20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e  goto meta_comman
2be30 64 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a 20 20  d_exit;.    }.  
2be40 20 20 6f 70 65 6e 5f 64 62 28 70 2c 20 30 29 3b    open_db(p, 0);
2be50 0a 20 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69  .    zSql = sqli
2be60 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 53 45 4c  te3_mprintf("SEL
2be70 45 43 54 20 72 6f 6f 74 70 61 67 65 20 46 52 4f  ECT rootpage FRO
2be80 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 22  M sqlite_master"
2be90 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2bea0 20 20 20 20 20 20 20 20 20 20 20 20 22 20 57 48              " WH
2beb0 45 52 45 20 6e 61 6d 65 3d 27 25 71 27 20 41 4e  ERE name='%q' AN
2bec0 44 20 74 79 70 65 3d 27 69 6e 64 65 78 27 22 2c  D type='index'",
2bed0 20 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20   azArg[1]);.    
2bee0 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f  sqlite3_prepare_
2bef0 76 32 28 70 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20  v2(p->db, zSql, 
2bf00 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a  -1, &pStmt, 0);.
2bf10 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
2bf20 28 7a 53 71 6c 29 3b 0a 20 20 20 20 69 66 28 20  (zSql);.    if( 
2bf30 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74  sqlite3_step(pSt
2bf40 6d 74 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20  mt)==SQLITE_ROW 
2bf50 29 7b 0a 20 20 20 20 20 20 74 6e 75 6d 20 3d 20  ){.      tnum = 
2bf60 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69  sqlite3_column_i
2bf70 6e 74 28 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20  nt(pStmt, 0);.  
2bf80 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f    }.    sqlite3_
2bf90 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b  finalize(pStmt);
2bfa0 0a 20 20 20 20 69 66 28 20 74 6e 75 6d 3d 3d 30  .    if( tnum==0
2bfb0 20 29 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70   ){.      utf8_p
2bfc0 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 6e  rintf(stderr, "n
2bfd0 6f 20 73 75 63 68 20 69 6e 64 65 78 3a 20 5c 22  o such index: \"
2bfe0 25 73 5c 22 5c 6e 22 2c 20 61 7a 41 72 67 5b 31  %s\"\n", azArg[1
2bff0 5d 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31  ]);.      rc = 1
2c000 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 65 74  ;.      goto met
2c010 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a  a_command_exit;.
2c020 20 20 20 20 7d 0a 20 20 20 20 7a 53 71 6c 20 3d      }.    zSql =
2c030 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
2c040 28 22 50 52 41 47 4d 41 20 69 6e 64 65 78 5f 78  ("PRAGMA index_x
2c050 69 6e 66 6f 3d 27 25 71 27 22 2c 20 61 7a 41 72  info='%q'", azAr
2c060 67 5b 31 5d 29 3b 0a 20 20 20 20 72 63 20 3d 20  g[1]);.    rc = 
2c070 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f  sqlite3_prepare_
2c080 76 32 28 70 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20  v2(p->db, zSql, 
2c090 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a  -1, &pStmt, 0);.
2c0a0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
2c0b0 28 7a 53 71 6c 29 3b 0a 20 20 20 20 69 20 3d 20  (zSql);.    i = 
2c0c0 30 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 73 71  0;.    while( sq
2c0d0 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74  lite3_step(pStmt
2c0e0 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b  )==SQLITE_ROW ){
2c0f0 0a 20 20 20 20 20 20 63 68 61 72 20 7a 4c 61 62  .      char zLab
2c100 65 6c 5b 32 30 5d 3b 0a 20 20 20 20 20 20 63 6f  el[20];.      co
2c110 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 20 3d  nst char *zCol =
2c120 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71   (const char*)sq
2c130 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
2c140 74 28 70 53 74 6d 74 2c 32 29 3b 0a 20 20 20 20  t(pStmt,2);.    
2c150 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28    i++;.      if(
2c160 20 7a 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20 20   zCol==0 ){.    
2c170 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f      if( sqlite3_
2c180 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 74 6d 74  column_int(pStmt
2c190 2c 31 29 3d 3d 2d 31 20 29 7b 0a 20 20 20 20 20  ,1)==-1 ){.     
2c1a0 20 20 20 20 20 7a 43 6f 6c 20 3d 20 22 5f 52 4f       zCol = "_RO
2c1b0 57 49 44 5f 22 3b 0a 20 20 20 20 20 20 20 20 7d  WID_";.        }
2c1c0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
2c1d0 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
2c1e0 28 73 69 7a 65 6f 66 28 7a 4c 61 62 65 6c 29 2c  (sizeof(zLabel),
2c1f0 7a 4c 61 62 65 6c 2c 22 65 78 70 72 25 64 22 2c  zLabel,"expr%d",
2c200 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 43  i);.          zC
2c210 6f 6c 20 3d 20 7a 4c 61 62 65 6c 3b 0a 20 20 20  ol = zLabel;.   
2c220 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
2c230 20 20 20 20 20 69 66 28 20 7a 43 6f 6c 6c 69 73       if( zCollis
2c240 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  t==0 ){.        
2c250 7a 43 6f 6c 6c 69 73 74 20 3d 20 73 71 6c 69 74  zCollist = sqlit
2c260 65 33 5f 6d 70 72 69 6e 74 66 28 22 5c 22 25 77  e3_mprintf("\"%w
2c270 5c 22 22 2c 20 7a 43 6f 6c 29 3b 0a 20 20 20 20  \"", zCol);.    
2c280 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2c290 20 7a 43 6f 6c 6c 69 73 74 20 3d 20 73 71 6c 69   zCollist = sqli
2c2a0 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 7a 2c  te3_mprintf("%z,
2c2b0 5c 22 25 77 5c 22 22 2c 20 7a 43 6f 6c 6c 69 73  \"%w\"", zCollis
2c2c0 74 2c 20 7a 43 6f 6c 29 3b 0a 20 20 20 20 20 20  t, zCol);.      
2c2d0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  }.    }.    sqli
2c2e0 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74  te3_finalize(pSt
2c2f0 6d 74 29 3b 0a 20 20 20 20 7a 53 71 6c 20 3d 20  mt);.    zSql = 
2c300 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
2c310 0a 20 20 20 20 20 20 20 20 20 20 22 43 52 45 41  .          "CREA
2c320 54 45 20 54 41 42 4c 45 20 5c 22 25 77 5c 22 28  TE TABLE \"%w\"(
2c330 25 73 2c 50 52 49 4d 41 52 59 20 4b 45 59 28 25  %s,PRIMARY KEY(%
2c340 73 29 29 57 49 54 48 4f 55 54 20 52 4f 57 49 44  s))WITHOUT ROWID
2c350 22 2c 0a 20 20 20 20 20 20 20 20 20 20 61 7a 41  ",.          azA
2c360 72 67 5b 32 5d 2c 20 7a 43 6f 6c 6c 69 73 74 2c  rg[2], zCollist,
2c370 20 7a 43 6f 6c 6c 69 73 74 29 3b 0a 20 20 20 20   zCollist);.    
2c380 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f  sqlite3_free(zCo
2c390 6c 6c 69 73 74 29 3b 0a 20 20 20 20 72 63 20 3d  llist);.    rc =
2c3a0 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f   sqlite3_test_co
2c3b0 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53  ntrol(SQLITE_TES
2c3c0 54 43 54 52 4c 5f 49 4d 50 4f 53 54 45 52 2c 20  TCTRL_IMPOSTER, 
2c3d0 70 2d 3e 64 62 2c 20 22 6d 61 69 6e 22 2c 20 31  p->db, "main", 1
2c3e0 2c 20 74 6e 75 6d 29 3b 0a 20 20 20 20 69 66 28  , tnum);.    if(
2c3f0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2c400 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
2c410 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c  ite3_exec(p->db,
2c420 20 7a 53 71 6c 2c 20 30 2c 20 30 2c 20 30 29 3b   zSql, 0, 0, 0);
2c430 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 74  .      sqlite3_t
2c440 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49  est_control(SQLI
2c450 54 45 5f 54 45 53 54 43 54 52 4c 5f 49 4d 50 4f  TE_TESTCTRL_IMPO
2c460 53 54 45 52 2c 20 70 2d 3e 64 62 2c 20 22 6d 61  STER, p->db, "ma
2c470 69 6e 22 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  in", 0, 0);.    
2c480 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
2c490 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
2c4a0 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72 20 69  stderr, "Error i
2c4b0 6e 20 5b 25 73 5d 3a 20 25 73 5c 6e 22 2c 20 7a  n [%s]: %s\n", z
2c4c0 53 71 6c 2c 20 73 71 6c 69 74 65 33 5f 65 72 72  Sql, sqlite3_err
2c4d0 6d 73 67 28 70 2d 3e 64 62 29 29 3b 0a 20 20 20  msg(p->db));.   
2c4e0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2c4f0 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74    utf8_printf(st
2c500 64 6f 75 74 2c 20 22 25 73 3b 5c 6e 22 2c 20 7a  dout, "%s;\n", z
2c510 53 71 6c 29 3b 0a 20 20 20 20 20 20 20 20 72 61  Sql);.        ra
2c520 77 5f 70 72 69 6e 74 66 28 73 74 64 6f 75 74 2c  w_printf(stdout,
2c530 0a 20 20 20 20 20 20 20 20 20 20 20 22 57 41 52  .           "WAR
2c540 4e 49 4e 47 3a 20 77 72 69 74 69 6e 67 20 74 6f  NING: writing to
2c550 20 61 6e 20 69 6d 70 6f 73 74 65 72 20 74 61 62   an imposter tab
2c560 6c 65 20 77 69 6c 6c 20 63 6f 72 72 75 70 74 20  le will corrupt 
2c570 74 68 65 20 69 6e 64 65 78 21 5c 6e 22 0a 20 20  the index!\n".  
2c580 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d        );.      }
2c590 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
2c5a0 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64    raw_printf(std
2c5b0 65 72 72 2c 20 22 53 51 4c 49 54 45 5f 54 45 53  err, "SQLITE_TES
2c5c0 54 43 54 52 4c 5f 49 4d 50 4f 53 54 45 52 20 72  TCTRL_IMPOSTER r
2c5d0 65 74 75 72 6e 73 20 25 64 5c 6e 22 2c 20 72 63  eturns %d\n", rc
2c5e0 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b  );.      rc = 1;
2c5f0 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
2c600 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20  e3_free(zSql);. 
2c610 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 20 2f 2a   }else.#endif /*
2c620 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
2c630 5f 4f 4d 49 54 5f 54 45 53 54 5f 43 4f 4e 54 52  _OMIT_TEST_CONTR
2c640 4f 4c 29 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53  OL) */..#ifdef S
2c650 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49 4f 54  QLITE_ENABLE_IOT
2c660 52 41 43 45 0a 20 20 69 66 28 20 63 3d 3d 27 69  RACE.  if( c=='i
2c670 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41  ' && strncmp(azA
2c680 72 67 5b 30 5d 2c 20 22 69 6f 74 72 61 63 65 22  rg[0], "iotrace"
2c690 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 53  , n)==0 ){.    S
2c6a0 51 4c 49 54 45 5f 41 50 49 20 65 78 74 65 72 6e  QLITE_API extern
2c6b0 20 76 6f 69 64 20 28 53 51 4c 49 54 45 5f 43 44   void (SQLITE_CD
2c6c0 45 43 4c 20 2a 73 71 6c 69 74 65 33 49 6f 54 72  ECL *sqlite3IoTr
2c6d0 61 63 65 29 28 63 6f 6e 73 74 20 63 68 61 72 2a  ace)(const char*
2c6e0 2c 20 2e 2e 2e 29 3b 0a 20 20 20 20 69 66 28 20  , ...);.    if( 
2c6f0 69 6f 74 72 61 63 65 20 26 26 20 69 6f 74 72 61  iotrace && iotra
2c700 63 65 21 3d 73 74 64 6f 75 74 20 29 20 66 63 6c  ce!=stdout ) fcl
2c710 6f 73 65 28 69 6f 74 72 61 63 65 29 3b 0a 20 20  ose(iotrace);.  
2c720 20 20 69 6f 74 72 61 63 65 20 3d 20 30 3b 0a 20    iotrace = 0;. 
2c730 20 20 20 69 66 28 20 6e 41 72 67 3c 32 20 29 7b     if( nArg<2 ){
2c740 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 49 6f  .      sqlite3Io
2c750 54 72 61 63 65 20 3d 20 30 3b 0a 20 20 20 20 7d  Trace = 0;.    }
2c760 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
2c770 61 7a 41 72 67 5b 31 5d 2c 20 22 2d 22 29 3d 3d  azArg[1], "-")==
2c780 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
2c790 65 33 49 6f 54 72 61 63 65 20 3d 20 69 6f 74 72  e3IoTrace = iotr
2c7a0 61 63 65 50 72 69 6e 74 66 3b 0a 20 20 20 20 20  acePrintf;.     
2c7b0 20 69 6f 74 72 61 63 65 20 3d 20 73 74 64 6f 75   iotrace = stdou
2c7c0 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  t;.    }else{.  
2c7d0 20 20 20 20 69 6f 74 72 61 63 65 20 3d 20 66 6f      iotrace = fo
2c7e0 70 65 6e 28 61 7a 41 72 67 5b 31 5d 2c 20 22 77  pen(azArg[1], "w
2c7f0 22 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 6f  ");.      if( io
2c800 74 72 61 63 65 3d 3d 30 20 29 7b 0a 20 20 20 20  trace==0 ){.    
2c810 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
2c820 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20  stderr, "Error: 
2c830 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 5c 22 25 73  cannot open \"%s
2c840 5c 22 5c 6e 22 2c 20 61 7a 41 72 67 5b 31 5d 29  \"\n", azArg[1])
2c850 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
2c860 33 49 6f 54 72 61 63 65 20 3d 20 30 3b 0a 20 20  3IoTrace = 0;.  
2c870 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
2c880 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2c890 20 20 20 73 71 6c 69 74 65 33 49 6f 54 72 61 63     sqlite3IoTrac
2c8a0 65 20 3d 20 69 6f 74 72 61 63 65 50 72 69 6e 74  e = iotracePrint
2c8b0 66 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  f;.      }.    }
2c8c0 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a  .  }else.#endif.
2c8d0 0a 20 20 69 66 28 20 63 3d 3d 27 6c 27 20 26 26  .  if( c=='l' &&
2c8e0 20 6e 3e 3d 35 20 26 26 20 73 74 72 6e 63 6d 70   n>=5 && strncmp
2c8f0 28 61 7a 41 72 67 5b 30 5d 2c 20 22 6c 69 6d 69  (azArg[0], "limi
2c900 74 73 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20  ts", n)==0 ){.  
2c910 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73    static const s
2c920 74 72 75 63 74 20 7b 0a 20 20 20 20 20 20 20 63  truct {.       c
2c930 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4c 69 6d 69  onst char *zLimi
2c940 74 4e 61 6d 65 3b 20 20 20 2f 2a 20 4e 61 6d 65  tName;   /* Name
2c950 20 6f 66 20 61 20 6c 69 6d 69 74 20 2a 2f 0a 20   of a limit */. 
2c960 20 20 20 20 20 20 69 6e 74 20 6c 69 6d 69 74 43        int limitC
2c970 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ode;            
2c980 2f 2a 20 49 6e 74 65 67 65 72 20 63 6f 64 65 20  /* Integer code 
2c990 66 6f 72 20 74 68 61 74 20 6c 69 6d 69 74 20 2a  for that limit *
2c9a0 2f 0a 20 20 20 20 7d 20 61 4c 69 6d 69 74 5b 5d  /.    } aLimit[]
2c9b0 20 3d 20 7b 0a 20 20 20 20 20 20 7b 20 22 6c 65   = {.      { "le
2c9c0 6e 67 74 68 22 2c 20 20 20 20 20 20 20 20 20 20  ngth",          
2c9d0 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d        SQLITE_LIM
2c9e0 49 54 5f 4c 45 4e 47 54 48 20 20 20 20 20 20 20  IT_LENGTH       
2c9f0 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
2ca00 20 20 20 20 20 20 7b 20 22 73 71 6c 5f 6c 65 6e        { "sql_len
2ca10 67 74 68 22 2c 20 20 20 20 20 20 20 20 20 20 20  gth",           
2ca20 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 53 51   SQLITE_LIMIT_SQ
2ca30 4c 5f 4c 45 4e 47 54 48 20 20 20 20 20 20 20 20  L_LENGTH        
2ca40 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20          },.     
2ca50 20 7b 20 22 63 6f 6c 75 6d 6e 22 2c 20 20 20 20   { "column",    
2ca60 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
2ca70 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 20  TE_LIMIT_COLUMN 
2ca80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ca90 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 65     },.      { "e
2caa0 78 70 72 5f 64 65 70 74 68 22 2c 20 20 20 20 20  xpr_depth",     
2cab0 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4c 49         SQLITE_LI
2cac0 4d 49 54 5f 45 58 50 52 5f 44 45 50 54 48 20 20  MIT_EXPR_DEPTH  
2cad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
2cae0 0a 20 20 20 20 20 20 7b 20 22 63 6f 6d 70 6f 75  .      { "compou
2caf0 6e 64 5f 73 65 6c 65 63 74 22 2c 20 20 20 20 20  nd_select",     
2cb00 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43    SQLITE_LIMIT_C
2cb10 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20 20  OMPOUND_SELECT  
2cb20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
2cb30 20 20 7b 20 22 76 64 62 65 5f 6f 70 22 2c 20 20    { "vdbe_op",  
2cb40 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
2cb50 49 54 45 5f 4c 49 4d 49 54 5f 56 44 42 45 5f 4f  ITE_LIMIT_VDBE_O
2cb60 50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  P               
2cb70 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22      },.      { "
2cb80 66 75 6e 63 74 69 6f 6e 5f 61 72 67 22 2c 20 20  function_arg",  
2cb90 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4c          SQLITE_L
2cba0 49 4d 49 54 5f 46 55 4e 43 54 49 4f 4e 5f 41 52  IMIT_FUNCTION_AR
2cbb0 47 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  G              }
2cbc0 2c 0a 20 20 20 20 20 20 7b 20 22 61 74 74 61 63  ,.      { "attac
2cbd0 68 65 64 22 2c 20 20 20 20 20 20 20 20 20 20 20  hed",           
2cbe0 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f     SQLITE_LIMIT_
2cbf0 41 54 54 41 43 48 45 44 20 20 20 20 20 20 20 20  ATTACHED        
2cc00 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
2cc10 20 20 20 7b 20 22 6c 69 6b 65 5f 70 61 74 74 65     { "like_patte
2cc20 72 6e 5f 6c 65 6e 67 74 68 22 2c 20 20 20 53 51  rn_length",   SQ
2cc30 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 49 4b 45 5f  LITE_LIMIT_LIKE_
2cc40 50 41 54 54 45 52 4e 5f 4c 45 4e 47 54 48 20 20  PATTERN_LENGTH  
2cc50 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20       },.      { 
2cc60 22 76 61 72 69 61 62 6c 65 5f 6e 75 6d 62 65 72  "variable_number
2cc70 22 2c 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f  ",       SQLITE_
2cc80 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e  LIMIT_VARIABLE_N
2cc90 55 4d 42 45 52 20 20 20 20 20 20 20 20 20 20 20  UMBER           
2cca0 7d 2c 0a 20 20 20 20 20 20 7b 20 22 74 72 69 67  },.      { "trig
2ccb0 67 65 72 5f 64 65 70 74 68 22 2c 20 20 20 20 20  ger_depth",     
2ccc0 20 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54      SQLITE_LIMIT
2ccd0 5f 54 52 49 47 47 45 52 5f 44 45 50 54 48 20 20  _TRIGGER_DEPTH  
2cce0 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
2ccf0 20 20 20 20 7b 20 22 77 6f 72 6b 65 72 5f 74 68      { "worker_th
2cd00 72 65 61 64 73 22 2c 20 20 20 20 20 20 20 20 53  reads",        S
2cd10 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 57 4f 52 4b  QLITE_LIMIT_WORK
2cd20 45 52 5f 54 48 52 45 41 44 53 20 20 20 20 20 20  ER_THREADS      
2cd30 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7d 3b 0a        },.    };.
2cd40 20 20 20 20 69 6e 74 20 69 2c 20 6e 32 3b 0a 20      int i, n2;. 
2cd50 20 20 20 6f 70 65 6e 5f 64 62 28 70 2c 20 30 29     open_db(p, 0)
2cd60 3b 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3d 3d  ;.    if( nArg==
2cd70 31 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69  1 ){.      for(i
2cd80 3d 30 3b 20 69 3c 41 72 72 61 79 53 69 7a 65 28  =0; i<ArraySize(
2cd90 61 4c 69 6d 69 74 29 3b 20 69 2b 2b 29 7b 0a 20  aLimit); i++){. 
2cda0 20 20 20 20 20 20 20 70 72 69 6e 74 66 28 22 25         printf("%
2cdb0 32 30 73 20 25 64 5c 6e 22 2c 20 61 4c 69 6d 69  20s %d\n", aLimi
2cdc0 74 5b 69 5d 2e 7a 4c 69 6d 69 74 4e 61 6d 65 2c  t[i].zLimitName,
2cdd0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2cde0 73 71 6c 69 74 65 33 5f 6c 69 6d 69 74 28 70 2d  sqlite3_limit(p-
2cdf0 3e 64 62 2c 20 61 4c 69 6d 69 74 5b 69 5d 2e 6c  >db, aLimit[i].l
2ce00 69 6d 69 74 43 6f 64 65 2c 20 2d 31 29 29 3b 0a  imitCode, -1));.
2ce10 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
2ce20 65 20 69 66 28 20 6e 41 72 67 3e 33 20 29 7b 0a  e if( nArg>3 ){.
2ce30 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
2ce40 28 73 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a  (stderr, "Usage:
2ce50 20 2e 6c 69 6d 69 74 20 4e 41 4d 45 20 3f 4e 45   .limit NAME ?NE
2ce60 57 2d 56 41 4c 55 45 3f 5c 6e 22 29 3b 0a 20 20  W-VALUE?\n");.  
2ce70 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
2ce80 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d    goto meta_comm
2ce90 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20 7d 65  and_exit;.    }e
2cea0 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  lse{.      int i
2ceb0 4c 69 6d 69 74 20 3d 20 2d 31 3b 0a 20 20 20 20  Limit = -1;.    
2cec0 20 20 6e 32 20 3d 20 73 74 72 6c 65 6e 33 30 28    n2 = strlen30(
2ced0 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20 20  azArg[1]);.     
2cee0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 41 72 72 61   for(i=0; i<Arra
2cef0 79 53 69 7a 65 28 61 4c 69 6d 69 74 29 3b 20 69  ySize(aLimit); i
2cf00 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
2cf10 20 73 71 6c 69 74 65 33 5f 73 74 72 6e 69 63 6d   sqlite3_strnicm
2cf20 70 28 61 4c 69 6d 69 74 5b 69 5d 2e 7a 4c 69 6d  p(aLimit[i].zLim
2cf30 69 74 4e 61 6d 65 2c 20 61 7a 41 72 67 5b 31 5d  itName, azArg[1]
2cf40 2c 20 6e 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20  , n2)==0 ){.    
2cf50 20 20 20 20 20 20 69 66 28 20 69 4c 69 6d 69 74        if( iLimit
2cf60 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  <0 ){.          
2cf70 20 20 69 4c 69 6d 69 74 20 3d 20 69 3b 0a 20 20    iLimit = i;.  
2cf80 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
2cf90 20 20 20 20 20 20 20 20 20 20 20 75 74 66 38 5f             utf8_
2cfa0 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
2cfb0 61 6d 62 69 67 75 6f 75 73 20 6c 69 6d 69 74 3a  ambiguous limit:
2cfc0 20 5c 22 25 73 5c 22 5c 6e 22 2c 20 61 7a 41 72   \"%s\"\n", azAr
2cfd0 67 5b 31 5d 29 3b 0a 20 20 20 20 20 20 20 20 20  g[1]);.         
2cfe0 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20     rc = 1;.     
2cff0 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 65 74 61         goto meta
2d000 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20  _command_exit;. 
2d010 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2d020 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
2d030 20 20 20 69 66 28 20 69 4c 69 6d 69 74 3c 30 20     if( iLimit<0 
2d040 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f  ){.        utf8_
2d050 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
2d060 75 6e 6b 6e 6f 77 6e 20 6c 69 6d 69 74 3a 20 5c  unknown limit: \
2d070 22 25 73 5c 22 5c 6e 22 0a 20 20 20 20 20 20 20  "%s\"\n".       
2d080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d090 20 22 65 6e 74 65 72 20 5c 22 2e 6c 69 6d 69 74   "enter \".limit
2d0a0 73 5c 22 20 77 69 74 68 20 6e 6f 20 61 72 67 75  s\" with no argu
2d0b0 6d 65 6e 74 73 20 66 6f 72 20 61 20 6c 69 73 74  ments for a list
2d0c0 2e 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  .\n",.          
2d0d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
2d0e0 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20 20 20  zArg[1]);.      
2d0f0 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20    rc = 1;.      
2d100 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d    goto meta_comm
2d110 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20 20 20  and_exit;.      
2d120 7d 0a 20 20 20 20 20 20 69 66 28 20 6e 41 72 67  }.      if( nArg
2d130 3d 3d 33 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ==3 ){.        s
2d140 71 6c 69 74 65 33 5f 6c 69 6d 69 74 28 70 2d 3e  qlite3_limit(p->
2d150 64 62 2c 20 61 4c 69 6d 69 74 5b 69 4c 69 6d 69  db, aLimit[iLimi
2d160 74 5d 2e 6c 69 6d 69 74 43 6f 64 65 2c 0a 20 20  t].limitCode,.  
2d170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d180 20 20 20 20 28 69 6e 74 29 69 6e 74 65 67 65 72      (int)integer
2d190 56 61 6c 75 65 28 61 7a 41 72 67 5b 32 5d 29 29  Value(azArg[2]))
2d1a0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2d1b0 70 72 69 6e 74 66 28 22 25 32 30 73 20 25 64 5c  printf("%20s %d\
2d1c0 6e 22 2c 20 61 4c 69 6d 69 74 5b 69 4c 69 6d 69  n", aLimit[iLimi
2d1d0 74 5d 2e 7a 4c 69 6d 69 74 4e 61 6d 65 2c 0a 20  t].zLimitName,. 
2d1e0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
2d1f0 74 65 33 5f 6c 69 6d 69 74 28 70 2d 3e 64 62 2c  te3_limit(p->db,
2d200 20 61 4c 69 6d 69 74 5b 69 4c 69 6d 69 74 5d 2e   aLimit[iLimit].
2d210 6c 69 6d 69 74 43 6f 64 65 2c 20 2d 31 29 29 3b  limitCode, -1));
2d220 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a  .    }.  }else..
2d230 20 20 69 66 28 20 63 3d 3d 27 6c 27 20 26 26 20    if( c=='l' && 
2d240 6e 3e 32 20 26 26 20 73 74 72 6e 63 6d 70 28 61  n>2 && strncmp(a
2d250 7a 41 72 67 5b 30 5d 2c 20 22 6c 69 6e 74 22 2c  zArg[0], "lint",
2d260 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 6f 70   n)==0 ){.    op
2d270 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a 20 20 20  en_db(p, 0);.   
2d280 20 6c 69 6e 74 44 6f 74 43 6f 6d 6d 61 6e 64 28   lintDotCommand(
2d290 70 2c 20 61 7a 41 72 67 2c 20 6e 41 72 67 29 3b  p, azArg, nArg);
2d2a0 0a 20 20 7d 65 6c 73 65 0a 0a 23 69 66 6e 64 65  .  }else..#ifnde
2d2b0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f  f SQLITE_OMIT_LO
2d2c0 41 44 5f 45 58 54 45 4e 53 49 4f 4e 0a 20 20 69  AD_EXTENSION.  i
2d2d0 66 28 20 63 3d 3d 27 6c 27 20 26 26 20 73 74 72  f( c=='l' && str
2d2e0 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22  ncmp(azArg[0], "
2d2f0 6c 6f 61 64 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a  load", n)==0 ){.
2d300 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
2d310 7a 46 69 6c 65 2c 20 2a 7a 50 72 6f 63 3b 0a 20  zFile, *zProc;. 
2d320 20 20 20 63 68 61 72 20 2a 7a 45 72 72 4d 73 67     char *zErrMsg
2d330 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 6e 41   = 0;.    if( nA
2d340 72 67 3c 32 20 29 7b 0a 20 20 20 20 20 20 72 61  rg<2 ){.      ra
2d350 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  w_printf(stderr,
2d360 20 22 55 73 61 67 65 3a 20 2e 6c 6f 61 64 20 46   "Usage: .load F
2d370 49 4c 45 20 3f 45 4e 54 52 59 50 4f 49 4e 54 3f  ILE ?ENTRYPOINT?
2d380 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  \n");.      rc =
2d390 20 31 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d   1;.      goto m
2d3a0 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74  eta_command_exit
2d3b0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 46 69 6c  ;.    }.    zFil
2d3c0 65 20 3d 20 61 7a 41 72 67 5b 31 5d 3b 0a 20 20  e = azArg[1];.  
2d3d0 20 20 7a 50 72 6f 63 20 3d 20 6e 41 72 67 3e 3d    zProc = nArg>=
2d3e0 33 20 3f 20 61 7a 41 72 67 5b 32 5d 20 3a 20 30  3 ? azArg[2] : 0
2d3f0 3b 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28 70 2c  ;.    open_db(p,
2d400 20 30 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71   0);.    rc = sq
2d410 6c 69 74 65 33 5f 6c 6f 61 64 5f 65 78 74 65 6e  lite3_load_exten
2d420 73 69 6f 6e 28 70 2d 3e 64 62 2c 20 7a 46 69 6c  sion(p->db, zFil
2d430 65 2c 20 7a 50 72 6f 63 2c 20 26 7a 45 72 72 4d  e, zProc, &zErrM
2d440 73 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  sg);.    if( rc!
2d450 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2d460 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
2d470 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20  stderr, "Error: 
2d480 25 73 5c 6e 22 2c 20 7a 45 72 72 4d 73 67 29 3b  %s\n", zErrMsg);
2d490 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
2d4a0 72 65 65 28 7a 45 72 72 4d 73 67 29 3b 0a 20 20  ree(zErrMsg);.  
2d4b0 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
2d4c0 7d 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66  }.  }else.#endif
2d4d0 0a 0a 20 20 69 66 28 20 63 3d 3d 27 6c 27 20 26  ..  if( c=='l' &
2d4e0 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b  & strncmp(azArg[
2d4f0 30 5d 2c 20 22 6c 6f 67 22 2c 20 6e 29 3d 3d 30  0], "log", n)==0
2d500 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 41 72 67   ){.    if( nArg
2d510 21 3d 32 20 29 7b 0a 20 20 20 20 20 20 72 61 77  !=2 ){.      raw
2d520 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
2d530 22 55 73 61 67 65 3a 20 2e 6c 6f 67 20 46 49 4c  "Usage: .log FIL
2d540 45 4e 41 4d 45 5c 6e 22 29 3b 0a 20 20 20 20 20  ENAME\n");.     
2d550 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c   rc = 1;.    }el
2d560 73 65 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20  se{.      const 
2d570 63 68 61 72 20 2a 7a 46 69 6c 65 20 3d 20 61 7a  char *zFile = az
2d580 41 72 67 5b 31 5d 3b 0a 20 20 20 20 20 20 6f 75  Arg[1];.      ou
2d590 74 70 75 74 5f 66 69 6c 65 5f 63 6c 6f 73 65 28  tput_file_close(
2d5a0 70 2d 3e 70 4c 6f 67 29 3b 0a 20 20 20 20 20 20  p->pLog);.      
2d5b0 70 2d 3e 70 4c 6f 67 20 3d 20 6f 75 74 70 75 74  p->pLog = output
2d5c0 5f 66 69 6c 65 5f 6f 70 65 6e 28 7a 46 69 6c 65  _file_open(zFile
2d5d0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  );.    }.  }else
2d5e0 0a 0a 20 20 69 66 28 20 63 3d 3d 27 6d 27 20 26  ..  if( c=='m' &
2d5f0 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b  & strncmp(azArg[
2d600 30 5d 2c 20 22 6d 6f 64 65 22 2c 20 6e 29 3d 3d  0], "mode", n)==
2d610 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  0 ){.    const c
2d620 68 61 72 20 2a 7a 4d 6f 64 65 20 3d 20 6e 41 72  har *zMode = nAr
2d630 67 3e 3d 32 20 3f 20 61 7a 41 72 67 5b 31 5d 20  g>=2 ? azArg[1] 
2d640 3a 20 22 22 3b 0a 20 20 20 20 69 6e 74 20 6e 32  : "";.    int n2
2d650 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a 4d 6f 64   = strlen30(zMod
2d660 65 29 3b 0a 20 20 20 20 69 6e 74 20 63 32 20 3d  e);.    int c2 =
2d670 20 7a 4d 6f 64 65 5b 30 5d 3b 0a 20 20 20 20 69   zMode[0];.    i
2d680 66 28 20 63 32 3d 3d 27 6c 27 20 26 26 20 6e 32  f( c2=='l' && n2
2d690 3e 32 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a  >2 && strncmp(az
2d6a0 41 72 67 5b 31 5d 2c 22 6c 69 6e 65 73 22 2c 6e  Arg[1],"lines",n
2d6b0 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  2)==0 ){.      p
2d6c0 2d 3e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 4c 69  ->mode = MODE_Li
2d6d0 6e 65 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ne;.      sqlite
2d6e0 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
2d6f0 66 28 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f  f(p->rowSeparato
2d700 72 29 2c 20 70 2d 3e 72 6f 77 53 65 70 61 72 61  r), p->rowSepara
2d710 74 6f 72 2c 20 53 45 50 5f 52 6f 77 29 3b 0a 20  tor, SEP_Row);. 
2d720 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 32 3d     }else if( c2=
2d730 3d 27 63 27 20 26 26 20 73 74 72 6e 63 6d 70 28  ='c' && strncmp(
2d740 61 7a 41 72 67 5b 31 5d 2c 22 63 6f 6c 75 6d 6e  azArg[1],"column
2d750 73 22 2c 6e 32 29 3d 3d 30 20 29 7b 0a 20 20 20  s",n2)==0 ){.   
2d760 20 20 20 70 2d 3e 6d 6f 64 65 20 3d 20 4d 4f 44     p->mode = MOD
2d770 45 5f 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20  E_Column;.      
2d780 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
2d790 28 73 69 7a 65 6f 66 28 70 2d 3e 72 6f 77 53 65  (sizeof(p->rowSe
2d7a0 70 61 72 61 74 6f 72 29 2c 20 70 2d 3e 72 6f 77  parator), p->row
2d7b0 53 65 70 61 72 61 74 6f 72 2c 20 53 45 50 5f 52  Separator, SEP_R
2d7c0 6f 77 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  ow);.    }else i
2d7d0 66 28 20 63 32 3d 3d 27 6c 27 20 26 26 20 6e 32  f( c2=='l' && n2
2d7e0 3e 32 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a  >2 && strncmp(az
2d7f0 41 72 67 5b 31 5d 2c 22 6c 69 73 74 22 2c 6e 32  Arg[1],"list",n2
2d800 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d  )==0 ){.      p-
2d810 3e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 4c 69 73  >mode = MODE_Lis
2d820 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  t;.      sqlite3
2d830 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66  _snprintf(sizeof
2d840 28 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72  (p->colSeparator
2d850 29 2c 20 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74  ), p->colSeparat
2d860 6f 72 2c 20 53 45 50 5f 43 6f 6c 75 6d 6e 29 3b  or, SEP_Column);
2d870 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
2d880 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 70  nprintf(sizeof(p
2d890 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 29 2c  ->rowSeparator),
2d8a0 20 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72   p->rowSeparator
2d8b0 2c 20 53 45 50 5f 52 6f 77 29 3b 0a 20 20 20 20  , SEP_Row);.    
2d8c0 7d 65 6c 73 65 20 69 66 28 20 63 32 3d 3d 27 68  }else if( c2=='h
2d8d0 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41  ' && strncmp(azA
2d8e0 72 67 5b 31 5d 2c 22 68 74 6d 6c 22 2c 6e 32 29  rg[1],"html",n2)
2d8f0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  ==0 ){.      p->
2d900 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 48 74 6d 6c  mode = MODE_Html
2d910 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
2d920 63 32 3d 3d 27 74 27 20 26 26 20 73 74 72 6e 63  c2=='t' && strnc
2d930 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 22 74 63 6c  mp(azArg[1],"tcl
2d940 22 2c 6e 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ",n2)==0 ){.    
2d950 20 20 70 2d 3e 6d 6f 64 65 20 3d 20 4d 4f 44 45    p->mode = MODE
2d960 5f 54 63 6c 3b 0a 20 20 20 20 20 20 73 71 6c 69  _Tcl;.      sqli
2d970 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
2d980 65 6f 66 28 70 2d 3e 63 6f 6c 53 65 70 61 72 61  eof(p->colSepara
2d990 74 6f 72 29 2c 20 70 2d 3e 63 6f 6c 53 65 70 61  tor), p->colSepa
2d9a0 72 61 74 6f 72 2c 20 53 45 50 5f 53 70 61 63 65  rator, SEP_Space
2d9b0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
2d9c0 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66  _snprintf(sizeof
2d9d0 28 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72  (p->rowSeparator
2d9e0 29 2c 20 70 2d 3e 72 6f 77 53 65 70 61 72 61 74  ), p->rowSeparat
2d9f0 6f 72 2c 20 53 45 50 5f 52 6f 77 29 3b 0a 20 20  or, SEP_Row);.  
2da00 20 20 7d 65 6c 73 65 20 69 66 28 20 63 32 3d 3d    }else if( c2==
2da10 27 63 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61  'c' && strncmp(a
2da20 7a 41 72 67 5b 31 5d 2c 22 63 73 76 22 2c 6e 32  zArg[1],"csv",n2
2da30 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d  )==0 ){.      p-
2da40 3e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 43 73 76  >mode = MODE_Csv
2da50 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
2da60 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
2da70 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 29  p->colSeparator)
2da80 2c 20 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f  , p->colSeparato
2da90 72 2c 20 53 45 50 5f 43 6f 6d 6d 61 29 3b 0a 20  r, SEP_Comma);. 
2daa0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
2dab0 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 70 2d 3e  rintf(sizeof(p->
2dac0 72 6f 77 53 65 70 61 72 61 74 6f 72 29 2c 20 70  rowSeparator), p
2dad0 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 2c 20  ->rowSeparator, 
2dae0 53 45 50 5f 43 72 4c 66 29 3b 0a 20 20 20 20 7d  SEP_CrLf);.    }
2daf0 65 6c 73 65 20 69 66 28 20 63 32 3d 3d 27 74 27  else if( c2=='t'
2db00 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72   && strncmp(azAr
2db10 67 5b 31 5d 2c 22 74 61 62 73 22 2c 6e 32 29 3d  g[1],"tabs",n2)=
2db20 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6d  =0 ){.      p->m
2db30 6f 64 65 20 3d 20 4d 4f 44 45 5f 4c 69 73 74 3b  ode = MODE_List;
2db40 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
2db50 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 70  nprintf(sizeof(p
2db60 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 29 2c  ->colSeparator),
2db70 20 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72   p->colSeparator
2db80 2c 20 53 45 50 5f 54 61 62 29 3b 0a 20 20 20 20  , SEP_Tab);.    
2db90 7d 65 6c 73 65 20 69 66 28 20 63 32 3d 3d 27 69  }else if( c2=='i
2dba0 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41  ' && strncmp(azA
2dbb0 72 67 5b 31 5d 2c 22 69 6e 73 65 72 74 22 2c 6e  rg[1],"insert",n
2dbc0 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  2)==0 ){.      p
2dbd0 2d 3e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 49 6e  ->mode = MODE_In
2dbe0 73 65 72 74 3b 0a 20 20 20 20 20 20 73 65 74 5f  sert;.      set_
2dbf0 74 61 62 6c 65 5f 6e 61 6d 65 28 70 2c 20 6e 41  table_name(p, nA
2dc00 72 67 3e 3d 33 20 3f 20 61 7a 41 72 67 5b 32 5d  rg>=3 ? azArg[2]
2dc10 20 3a 20 22 74 61 62 6c 65 22 29 3b 0a 20 20 20   : "table");.   
2dc20 20 7d 65 6c 73 65 20 69 66 28 20 63 32 3d 3d 27   }else if( c2=='
2dc30 71 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a  q' && strncmp(az
2dc40 41 72 67 5b 31 5d 2c 22 71 75 6f 74 65 22 2c 6e  Arg[1],"quote",n
2dc50 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  2)==0 ){.      p
2dc60 2d 3e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 51 75  ->mode = MODE_Qu
2dc70 6f 74 65 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  ote;.    }else i
2dc80 66 28 20 63 32 3d 3d 27 61 27 20 26 26 20 73 74  f( c2=='a' && st
2dc90 72 6e 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 22  rncmp(azArg[1],"
2dca0 61 73 63 69 69 22 2c 6e 32 29 3d 3d 30 20 29 7b  ascii",n2)==0 ){
2dcb0 0a 20 20 20 20 20 20 70 2d 3e 6d 6f 64 65 20 3d  .      p->mode =
2dcc0 20 4d 4f 44 45 5f 41 73 63 69 69 3b 0a 20 20 20   MODE_Ascii;.   
2dcd0 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
2dce0 6e 74 66 28 73 69 7a 65 6f 66 28 70 2d 3e 63 6f  ntf(sizeof(p->co
2dcf0 6c 53 65 70 61 72 61 74 6f 72 29 2c 20 70 2d 3e  lSeparator), p->
2dd00 63 6f 6c 53 65 70 61 72 61 74 6f 72 2c 20 53 45  colSeparator, SE
2dd10 50 5f 55 6e 69 74 29 3b 0a 20 20 20 20 20 20 73  P_Unit);.      s
2dd20 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
2dd30 73 69 7a 65 6f 66 28 70 2d 3e 72 6f 77 53 65 70  sizeof(p->rowSep
2dd40 61 72 61 74 6f 72 29 2c 20 70 2d 3e 72 6f 77 53  arator), p->rowS
2dd50 65 70 61 72 61 74 6f 72 2c 20 53 45 50 5f 52 65  eparator, SEP_Re
2dd60 63 6f 72 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65  cord);.    }else
2dd70 20 69 66 28 20 6e 41 72 67 3d 3d 31 20 29 7b 0a   if( nArg==1 ){.
2dd80 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
2dd90 28 70 2d 3e 6f 75 74 2c 20 22 63 75 72 72 65 6e  (p->out, "curren
2dda0 74 20 6f 75 74 70 75 74 20 6d 6f 64 65 3a 20 25  t output mode: %
2ddb0 73 5c 6e 22 2c 20 6d 6f 64 65 44 65 73 63 72 5b  s\n", modeDescr[
2ddc0 70 2d 3e 6d 6f 64 65 5d 29 3b 0a 20 20 20 20 7d  p->mode]);.    }
2ddd0 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 61 77 5f  else{.      raw_
2dde0 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
2ddf0 45 72 72 6f 72 3a 20 6d 6f 64 65 20 73 68 6f 75  Error: mode shou
2de00 6c 64 20 62 65 20 6f 6e 65 20 6f 66 3a 20 22 0a  ld be one of: ".
2de10 20 20 20 20 20 20 20 20 20 22 61 73 63 69 69 20           "ascii 
2de20 63 6f 6c 75 6d 6e 20 63 73 76 20 68 74 6d 6c 20  column csv html 
2de30 69 6e 73 65 72 74 20 6c 69 6e 65 20 6c 69 73 74  insert line list
2de40 20 71 75 6f 74 65 20 74 61 62 73 20 74 63 6c 5c   quote tabs tcl\
2de50 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  n");.      rc = 
2de60 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e  1;.    }.    p->
2de70 63 4d 6f 64 65 20 3d 20 70 2d 3e 6d 6f 64 65 3b  cMode = p->mode;
2de80 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20  .  }else..  if( 
2de90 63 3d 3d 27 6e 27 20 26 26 20 73 74 72 6e 63 6d  c=='n' && strncm
2dea0 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 6e 75 6c  p(azArg[0], "nul
2deb0 6c 76 61 6c 75 65 22 2c 20 6e 29 3d 3d 30 20 29  lvalue", n)==0 )
2dec0 7b 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3d 3d  {.    if( nArg==
2ded0 32 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  2 ){.      sqlit
2dee0 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
2def0 6f 66 28 70 2d 3e 6e 75 6c 6c 56 61 6c 75 65 29  of(p->nullValue)
2df00 2c 20 70 2d 3e 6e 75 6c 6c 56 61 6c 75 65 2c 0a  , p->nullValue,.
2df10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2df20 20 20 20 20 20 20 20 22 25 2e 2a 73 22 2c 20 28         "%.*s", (
2df30 69 6e 74 29 41 72 72 61 79 53 69 7a 65 28 70 2d  int)ArraySize(p-
2df40 3e 6e 75 6c 6c 56 61 6c 75 65 29 2d 31 2c 20 61  >nullValue)-1, a
2df50 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20 7d 65  zArg[1]);.    }e
2df60 6c 73 65 7b 0a 20 20 20 20 20 20 72 61 77 5f 70  lse{.      raw_p
2df70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55  rintf(stderr, "U
2df80 73 61 67 65 3a 20 2e 6e 75 6c 6c 76 61 6c 75 65  sage: .nullvalue
2df90 20 53 54 52 49 4e 47 5c 6e 22 29 3b 0a 20 20 20   STRING\n");.   
2dfa0 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d     rc = 1;.    }
2dfb0 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20  .  }else..  if( 
2dfc0 63 3d 3d 27 6f 27 20 26 26 20 73 74 72 6e 63 6d  c=='o' && strncm
2dfd0 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 6f 70 65  p(azArg[0], "ope
2dfe0 6e 22 2c 20 6e 29 3d 3d 30 20 26 26 20 6e 3e 3d  n", n)==0 && n>=
2dff0 32 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  2 ){.    char *z
2e000 4e 65 77 46 69 6c 65 6e 61 6d 65 3b 20 20 2f 2a  NewFilename;  /*
2e010 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74   Name of the dat
2e020 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 6f 70  abase file to op
2e030 65 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 4e  en */.    int iN
2e040 61 6d 65 20 3d 20 31 3b 20 20 20 20 20 20 20 2f  ame = 1;       /
2e050 2a 20 49 6e 64 65 78 20 69 6e 20 61 7a 41 72 67  * Index in azArg
2e060 5b 5d 20 6f 66 20 74 68 65 20 66 69 6c 65 6e 61  [] of the filena
2e070 6d 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 65  me */.    int ne
2e080 77 46 6c 61 67 20 3d 20 30 3b 20 20 20 20 20 2f  wFlag = 0;     /
2e090 2a 20 54 72 75 65 20 74 6f 20 64 65 6c 65 74 65  * True to delete
2e0a0 20 66 69 6c 65 20 62 65 66 6f 72 65 20 6f 70 65   file before ope
2e0b0 6e 69 6e 67 20 2a 2f 0a 20 20 20 20 2f 2a 20 43  ning */.    /* C
2e0c0 6c 6f 73 65 20 74 68 65 20 65 78 69 73 74 69 6e  lose the existin
2e0d0 67 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  g database */.  
2e0e0 20 20 73 65 73 73 69 6f 6e 5f 63 6c 6f 73 65 5f    session_close_
2e0f0 61 6c 6c 28 70 29 3b 0a 20 20 20 20 73 71 6c 69  all(p);.    sqli
2e100 74 65 33 5f 63 6c 6f 73 65 28 70 2d 3e 64 62 29  te3_close(p->db)
2e110 3b 0a 20 20 20 20 70 2d 3e 64 62 20 3d 20 30 3b  ;.    p->db = 0;
2e120 0a 20 20 20 20 70 2d 3e 7a 44 62 46 69 6c 65 6e  .    p->zDbFilen
2e130 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c  ame = 0;.    sql
2e140 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 7a 46 72  ite3_free(p->zFr
2e150 65 65 4f 6e 43 6c 6f 73 65 29 3b 0a 20 20 20 20  eeOnClose);.    
2e160 70 2d 3e 7a 46 72 65 65 4f 6e 43 6c 6f 73 65 20  p->zFreeOnClose 
2e170 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 6f 70 65 6e  = 0;.    p->open
2e180 4d 6f 64 65 20 3d 20 53 48 45 4c 4c 5f 4f 50 45  Mode = SHELL_OPE
2e190 4e 5f 55 4e 53 50 45 43 3b 0a 20 20 20 20 2f 2a  N_UNSPEC;.    /*
2e1a0 20 43 68 65 63 6b 20 66 6f 72 20 63 6f 6d 6d 61   Check for comma
2e1b0 6e 64 2d 6c 69 6e 65 20 61 72 67 75 6d 65 6e 74  nd-line argument
2e1c0 73 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 4e 61  s */.    for(iNa
2e1d0 6d 65 3d 31 3b 20 69 4e 61 6d 65 3c 6e 41 72 67  me=1; iName<nArg
2e1e0 20 26 26 20 61 7a 41 72 67 5b 69 4e 61 6d 65 5d   && azArg[iName]
2e1f0 5b 30 5d 3d 3d 27 2d 27 3b 20 69 4e 61 6d 65 2b  [0]=='-'; iName+
2e200 2b 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20  +){.      const 
2e210 63 68 61 72 20 2a 7a 20 3d 20 61 7a 41 72 67 5b  char *z = azArg[
2e220 69 4e 61 6d 65 5d 3b 0a 20 20 20 20 20 20 69 66  iName];.      if
2e230 28 20 6f 70 74 69 6f 6e 4d 61 74 63 68 28 7a 2c  ( optionMatch(z,
2e240 22 6e 65 77 22 29 20 29 7b 0a 20 20 20 20 20 20  "new") ){.      
2e250 20 20 6e 65 77 46 6c 61 67 20 3d 20 31 3b 0a 23    newFlag = 1;.#
2e260 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 56  ifdef SQLITE_HAV
2e270 45 5f 5a 49 50 0a 20 20 20 20 20 20 7d 65 6c 73  E_ZIP.      }els
2e280 65 20 69 66 28 20 6f 70 74 69 6f 6e 4d 61 74 63  e if( optionMatc
2e290 68 28 7a 2c 20 22 7a 69 70 22 29 20 29 7b 0a 20  h(z, "zip") ){. 
2e2a0 20 20 20 20 20 20 20 70 2d 3e 6f 70 65 6e 4d 6f         p->openMo
2e2b0 64 65 20 3d 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f  de = SHELL_OPEN_
2e2c0 5a 49 50 46 49 4c 45 3b 0a 23 65 6e 64 69 66 0a  ZIPFILE;.#endif.
2e2d0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
2e2e0 6f 70 74 69 6f 6e 4d 61 74 63 68 28 7a 2c 20 22  optionMatch(z, "
2e2f0 61 70 70 65 6e 64 22 29 20 29 7b 0a 20 20 20 20  append") ){.    
2e300 20 20 20 20 70 2d 3e 6f 70 65 6e 4d 6f 64 65 20      p->openMode 
2e310 3d 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f 41 50 50  = SHELL_OPEN_APP
2e320 45 4e 44 56 46 53 3b 0a 20 20 20 20 20 20 7d 65  ENDVFS;.      }e
2e330 6c 73 65 20 69 66 28 20 7a 5b 30 5d 3d 3d 27 2d  lse if( z[0]=='-
2e340 27 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66  ' ){.        utf
2e350 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  8_printf(stderr,
2e360 20 22 75 6e 6b 6e 6f 77 6e 20 6f 70 74 69 6f 6e   "unknown option
2e370 3a 20 25 73 5c 6e 22 2c 20 7a 29 3b 0a 20 20 20  : %s\n", z);.   
2e380 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20       rc = 1;.   
2e390 20 20 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63       goto meta_c
2e3a0 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20  ommand_exit;.   
2e3b0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 2f     }.    }.    /
2e3c0 2a 20 49 66 20 61 20 66 69 6c 65 6e 61 6d 65 20  * If a filename 
2e3d0 69 73 20 73 70 65 63 69 66 69 65 64 2c 20 74 72  is specified, tr
2e3e0 79 20 74 6f 20 6f 70 65 6e 20 69 74 20 66 69 72  y to open it fir
2e3f0 73 74 20 2a 2f 0a 20 20 20 20 7a 4e 65 77 46 69  st */.    zNewFi
2e400 6c 65 6e 61 6d 65 20 3d 20 6e 41 72 67 3e 69 4e  lename = nArg>iN
2e410 61 6d 65 20 3f 20 73 71 6c 69 74 65 33 5f 6d 70  ame ? sqlite3_mp
2e420 72 69 6e 74 66 28 22 25 73 22 2c 20 61 7a 41 72  rintf("%s", azAr
2e430 67 5b 69 4e 61 6d 65 5d 29 20 3a 20 30 3b 0a 20  g[iName]) : 0;. 
2e440 20 20 20 69 66 28 20 7a 4e 65 77 46 69 6c 65 6e     if( zNewFilen
2e450 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ame ){.      if(
2e460 20 6e 65 77 46 6c 61 67 20 29 20 73 68 65 6c 6c   newFlag ) shell
2e470 44 65 6c 65 74 65 46 69 6c 65 28 7a 4e 65 77 46  DeleteFile(zNewF
2e480 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ilename);.      
2e490 70 2d 3e 7a 44 62 46 69 6c 65 6e 61 6d 65 20 3d  p->zDbFilename =
2e4a0 20 7a 4e 65 77 46 69 6c 65 6e 61 6d 65 3b 0a 20   zNewFilename;. 
2e4b0 20 20 20 20 20 6f 70 65 6e 5f 64 62 28 70 2c 20       open_db(p, 
2e4c0 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  1);.      if( p-
2e4d0 3e 64 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  >db==0 ){.      
2e4e0 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74    utf8_printf(st
2e4f0 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 63 61  derr, "Error: ca
2e500 6e 6e 6f 74 20 6f 70 65 6e 20 27 25 73 27 5c 6e  nnot open '%s'\n
2e510 22 2c 20 7a 4e 65 77 46 69 6c 65 6e 61 6d 65 29  ", zNewFilename)
2e520 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
2e530 33 5f 66 72 65 65 28 7a 4e 65 77 46 69 6c 65 6e  3_free(zNewFilen
2e540 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ame);.      }els
2e550 65 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 7a 46  e{.        p->zF
2e560 72 65 65 4f 6e 43 6c 6f 73 65 20 3d 20 7a 4e 65  reeOnClose = zNe
2e570 77 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 20 20 20  wFilename;.     
2e580 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
2e590 20 70 2d 3e 64 62 3d 3d 30 20 29 7b 0a 20 20 20   p->db==0 ){.   
2e5a0 20 20 20 2f 2a 20 41 73 20 61 20 66 61 6c 6c 2d     /* As a fall-
2e5b0 62 61 63 6b 20 6f 70 65 6e 20 61 20 54 45 4d 50  back open a TEMP
2e5c0 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 20   database */.   
2e5d0 20 20 20 70 2d 3e 7a 44 62 46 69 6c 65 6e 61 6d     p->zDbFilenam
2e5e0 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 6f 70 65  e = 0;.      ope
2e5f0 6e 5f 64 62 28 70 2c 20 30 29 3b 0a 20 20 20 20  n_db(p, 0);.    
2e600 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28  }.  }else..  if(
2e610 20 63 3d 3d 27 6f 27 0a 20 20 20 26 26 20 28 73   c=='o'.   && (s
2e620 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c  trncmp(azArg[0],
2e630 20 22 6f 75 74 70 75 74 22 2c 20 6e 29 3d 3d 30   "output", n)==0
2e640 20 7c 7c 20 73 74 72 6e 63 6d 70 28 61 7a 41 72   || strncmp(azAr
2e650 67 5b 30 5d 2c 20 22 6f 6e 63 65 22 2c 20 6e 29  g[0], "once", n)
2e660 3d 3d 30 29 0a 20 20 29 7b 0a 20 20 20 20 63 6f  ==0).  ){.    co
2e670 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 20  nst char *zFile 
2e680 3d 20 6e 41 72 67 3e 3d 32 20 3f 20 61 7a 41 72  = nArg>=2 ? azAr
2e690 67 5b 31 5d 20 3a 20 22 73 74 64 6f 75 74 22 3b  g[1] : "stdout";
2e6a0 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3e 32 20  .    if( nArg>2 
2e6b0 29 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72  ){.      utf8_pr
2e6c0 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55 73  intf(stderr, "Us
2e6d0 61 67 65 3a 20 2e 25 73 20 46 49 4c 45 5c 6e 22  age: .%s FILE\n"
2e6e0 2c 20 61 7a 41 72 67 5b 30 5d 29 3b 0a 20 20 20  , azArg[0]);.   
2e6f0 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20     rc = 1;.     
2e700 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61   goto meta_comma
2e710 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a 20  nd_exit;.    }. 
2e720 20 20 20 69 66 28 20 6e 3e 31 20 26 26 20 73 74     if( n>1 && st
2e730 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20  rncmp(azArg[0], 
2e740 22 6f 6e 63 65 22 2c 20 6e 29 3d 3d 30 20 29 7b  "once", n)==0 ){
2e750 0a 20 20 20 20 20 20 69 66 28 20 6e 41 72 67 3c  .      if( nArg<
2e760 32 20 29 7b 0a 20 20 20 20 20 20 20 20 72 61 77  2 ){.        raw
2e770 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
2e780 22 55 73 61 67 65 3a 20 2e 6f 6e 63 65 20 46 49  "Usage: .once FI
2e790 4c 45 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20 20  LE\n");.        
2e7a0 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  rc = 1;.        
2e7b0 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e  goto meta_comman
2e7c0 64 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 7d 0a  d_exit;.      }.
2e7d0 20 20 20 20 20 20 70 2d 3e 6f 75 74 43 6f 75 6e        p->outCoun
2e7e0 74 20 3d 20 32 3b 0a 20 20 20 20 7d 65 6c 73 65  t = 2;.    }else
2e7f0 7b 0a 20 20 20 20 20 20 70 2d 3e 6f 75 74 43 6f  {.      p->outCo
2e800 75 6e 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  unt = 0;.    }. 
2e810 20 20 20 6f 75 74 70 75 74 5f 72 65 73 65 74 28     output_reset(
2e820 70 29 3b 0a 20 20 20 20 69 66 28 20 7a 46 69 6c  p);.    if( zFil
2e830 65 5b 30 5d 3d 3d 27 7c 27 20 29 7b 0a 23 69 66  e[0]=='|' ){.#if
2e840 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
2e850 50 4f 50 45 4e 0a 20 20 20 20 20 20 72 61 77 5f  POPEN.      raw_
2e860 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
2e870 45 72 72 6f 72 3a 20 70 69 70 65 73 20 61 72 65  Error: pipes are
2e880 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 20 69   not supported i
2e890 6e 20 74 68 69 73 20 4f 53 5c 6e 22 29 3b 0a 20  n this OS\n");. 
2e8a0 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20       rc = 1;.   
2e8b0 20 20 20 70 2d 3e 6f 75 74 20 3d 20 73 74 64 6f     p->out = stdo
2e8c0 75 74 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20  ut;.#else.      
2e8d0 70 2d 3e 6f 75 74 20 3d 20 70 6f 70 65 6e 28 7a  p->out = popen(z
2e8e0 46 69 6c 65 20 2b 20 31 2c 20 22 77 22 29 3b 0a  File + 1, "w");.
2e8f0 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6f 75 74        if( p->out
2e900 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 75  ==0 ){.        u
2e910 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72  tf8_printf(stder
2e920 72 2c 22 45 72 72 6f 72 3a 20 63 61 6e 6e 6f 74  r,"Error: cannot
2e930 20 6f 70 65 6e 20 70 69 70 65 20 5c 22 25 73 5c   open pipe \"%s\
2e940 22 5c 6e 22 2c 20 7a 46 69 6c 65 20 2b 20 31 29  "\n", zFile + 1)
2e950 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6f 75 74  ;.        p->out
2e960 20 3d 20 73 74 64 6f 75 74 3b 0a 20 20 20 20 20   = stdout;.     
2e970 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20     rc = 1;.     
2e980 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2e990 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
2e9a0 28 73 69 7a 65 6f 66 28 70 2d 3e 6f 75 74 66 69  (sizeof(p->outfi
2e9b0 6c 65 29 2c 20 70 2d 3e 6f 75 74 66 69 6c 65 2c  le), p->outfile,
2e9c0 20 22 25 73 22 2c 20 7a 46 69 6c 65 29 3b 0a 20   "%s", zFile);. 
2e9d0 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
2e9e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
2e9f0 2d 3e 6f 75 74 20 3d 20 6f 75 74 70 75 74 5f 66  ->out = output_f
2ea00 69 6c 65 5f 6f 70 65 6e 28 7a 46 69 6c 65 29 3b  ile_open(zFile);
2ea10 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6f 75  .      if( p->ou
2ea20 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  t==0 ){.        
2ea30 69 66 28 20 73 74 72 63 6d 70 28 7a 46 69 6c 65  if( strcmp(zFile
2ea40 2c 22 6f 66 66 22 29 21 3d 30 20 29 7b 0a 20 20  ,"off")!=0 ){.  
2ea50 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69          utf8_pri
2ea60 6e 74 66 28 73 74 64 65 72 72 2c 22 45 72 72 6f  ntf(stderr,"Erro
2ea70 72 3a 20 63 61 6e 6e 6f 74 20 77 72 69 74 65 20  r: cannot write 
2ea80 74 6f 20 5c 22 25 73 5c 22 5c 6e 22 2c 20 7a 46  to \"%s\"\n", zF
2ea90 69 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ile);.        }.
2eaa0 20 20 20 20 20 20 20 20 70 2d 3e 6f 75 74 20 3d          p->out =
2eab0 20 73 74 64 6f 75 74 3b 0a 20 20 20 20 20 20 20   stdout;.       
2eac0 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d   rc = 1;.      }
2ead0 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20   else {.        
2eae0 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
2eaf0 28 73 69 7a 65 6f 66 28 70 2d 3e 6f 75 74 66 69  (sizeof(p->outfi
2eb00 6c 65 29 2c 20 70 2d 3e 6f 75 74 66 69 6c 65 2c  le), p->outfile,
2eb10 20 22 25 73 22 2c 20 7a 46 69 6c 65 29 3b 0a 20   "%s", zFile);. 
2eb20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
2eb30 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27  else..  if( c=='
2eb40 70 27 20 26 26 20 6e 3e 3d 33 20 26 26 20 73 74  p' && n>=3 && st
2eb50 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20  rncmp(azArg[0], 
2eb60 22 70 72 69 6e 74 22 2c 20 6e 29 3d 3d 30 20 29  "print", n)==0 )
2eb70 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
2eb80 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 41 72 67   for(i=1; i<nArg
2eb90 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
2eba0 28 20 69 3e 31 20 29 20 72 61 77 5f 70 72 69 6e  ( i>1 ) raw_prin
2ebb0 74 66 28 70 2d 3e 6f 75 74 2c 20 22 20 22 29 3b  tf(p->out, " ");
2ebc0 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e  .      utf8_prin
2ebd0 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c  tf(p->out, "%s",
2ebe0 20 61 7a 41 72 67 5b 69 5d 29 3b 0a 20 20 20 20   azArg[i]);.    
2ebf0 7d 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66  }.    raw_printf
2ec00 28 70 2d 3e 6f 75 74 2c 20 22 5c 6e 22 29 3b 0a  (p->out, "\n");.
2ec10 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63    }else..  if( c
2ec20 3d 3d 27 70 27 20 26 26 20 73 74 72 6e 63 6d 70  =='p' && strncmp
2ec30 28 61 7a 41 72 67 5b 30 5d 2c 20 22 70 72 6f 6d  (azArg[0], "prom
2ec40 70 74 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20  pt", n)==0 ){.  
2ec50 20 20 69 66 28 20 6e 41 72 67 20 3e 3d 20 32 29    if( nArg >= 2)
2ec60 20 7b 0a 20 20 20 20 20 20 73 74 72 6e 63 70 79   {.      strncpy
2ec70 28 6d 61 69 6e 50 72 6f 6d 70 74 2c 61 7a 41 72  (mainPrompt,azAr
2ec80 67 5b 31 5d 2c 28 69 6e 74 29 41 72 72 61 79 53  g[1],(int)ArrayS
2ec90 69 7a 65 28 6d 61 69 6e 50 72 6f 6d 70 74 29 2d  ize(mainPrompt)-
2eca0 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  1);.    }.    if
2ecb0 28 20 6e 41 72 67 20 3e 3d 20 33 29 20 7b 0a 20  ( nArg >= 3) {. 
2ecc0 20 20 20 20 20 73 74 72 6e 63 70 79 28 63 6f 6e       strncpy(con
2ecd0 74 69 6e 75 65 50 72 6f 6d 70 74 2c 61 7a 41 72  tinuePrompt,azAr
2ece0 67 5b 32 5d 2c 28 69 6e 74 29 41 72 72 61 79 53  g[2],(int)ArrayS
2ecf0 69 7a 65 28 63 6f 6e 74 69 6e 75 65 50 72 6f 6d  ize(continueProm
2ed00 70 74 29 2d 31 29 3b 0a 20 20 20 20 7d 0a 20 20  pt)-1);.    }.  
2ed10 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d  }else..  if( c==
2ed20 27 71 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61  'q' && strncmp(a
2ed30 7a 41 72 67 5b 30 5d 2c 20 22 71 75 69 74 22 2c  zArg[0], "quit",
2ed40 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63   n)==0 ){.    rc
2ed50 20 3d 20 32 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20   = 2;.  }else.. 
2ed60 20 69 66 28 20 63 3d 3d 27 72 27 20 26 26 20 6e   if( c=='r' && n
2ed70 3e 3d 33 20 26 26 20 73 74 72 6e 63 6d 70 28 61  >=3 && strncmp(a
2ed80 7a 41 72 67 5b 30 5d 2c 20 22 72 65 61 64 22 2c  zArg[0], "read",
2ed90 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 46 49   n)==0 ){.    FI
2eda0 4c 45 20 2a 61 6c 74 3b 0a 20 20 20 20 69 66 28  LE *alt;.    if(
2edb0 20 6e 41 72 67 21 3d 32 20 29 7b 0a 20 20 20 20   nArg!=2 ){.    
2edc0 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64    raw_printf(std
2edd0 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 72 65  err, "Usage: .re
2ede0 61 64 20 46 49 4c 45 5c 6e 22 29 3b 0a 20 20 20  ad FILE\n");.   
2edf0 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20     rc = 1;.     
2ee00 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61   goto meta_comma
2ee10 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a 20  nd_exit;.    }. 
2ee20 20 20 20 61 6c 74 20 3d 20 66 6f 70 65 6e 28 61     alt = fopen(a
2ee30 7a 41 72 67 5b 31 5d 2c 20 22 72 62 22 29 3b 0a  zArg[1], "rb");.
2ee40 20 20 20 20 69 66 28 20 61 6c 74 3d 3d 30 20 29      if( alt==0 )
2ee50 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69  {.      utf8_pri
2ee60 6e 74 66 28 73 74 64 65 72 72 2c 22 45 72 72 6f  ntf(stderr,"Erro
2ee70 72 3a 20 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 5c  r: cannot open \
2ee80 22 25 73 5c 22 5c 6e 22 2c 20 61 7a 41 72 67 5b  "%s\"\n", azArg[
2ee90 31 5d 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  1]);.      rc = 
2eea0 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  1;.    }else{.  
2eeb0 20 20 20 20 72 63 20 3d 20 70 72 6f 63 65 73 73      rc = process
2eec0 5f 69 6e 70 75 74 28 70 2c 20 61 6c 74 29 3b 0a  _input(p, alt);.
2eed0 20 20 20 20 20 20 66 63 6c 6f 73 65 28 61 6c 74        fclose(alt
2eee0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  );.    }.  }else
2eef0 0a 0a 20 20 69 66 28 20 63 3d 3d 27 72 27 20 26  ..  if( c=='r' &
2ef00 26 20 6e 3e 3d 33 20 26 26 20 73 74 72 6e 63 6d  & n>=3 && strncm
2ef10 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 72 65 73  p(azArg[0], "res
2ef20 74 6f 72 65 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a  tore", n)==0 ){.
2ef30 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
2ef40 7a 53 72 63 46 69 6c 65 3b 0a 20 20 20 20 63 6f  zSrcFile;.    co
2ef50 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 3b 0a 20  nst char *zDb;. 
2ef60 20 20 20 73 71 6c 69 74 65 33 20 2a 70 53 72 63     sqlite3 *pSrc
2ef70 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 61  ;.    sqlite3_ba
2ef80 63 6b 75 70 20 2a 70 42 61 63 6b 75 70 3b 0a 20  ckup *pBackup;. 
2ef90 20 20 20 69 6e 74 20 6e 54 69 6d 65 6f 75 74 20     int nTimeout 
2efa0 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28 20 6e 41  = 0;..    if( nA
2efb0 72 67 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 7a  rg==2 ){.      z
2efc0 53 72 63 46 69 6c 65 20 3d 20 61 7a 41 72 67 5b  SrcFile = azArg[
2efd0 31 5d 3b 0a 20 20 20 20 20 20 7a 44 62 20 3d 20  1];.      zDb = 
2efe0 22 6d 61 69 6e 22 3b 0a 20 20 20 20 7d 65 6c 73  "main";.    }els
2eff0 65 20 69 66 28 20 6e 41 72 67 3d 3d 33 20 29 7b  e if( nArg==3 ){
2f000 0a 20 20 20 20 20 20 7a 53 72 63 46 69 6c 65 20  .      zSrcFile 
2f010 3d 20 61 7a 41 72 67 5b 32 5d 3b 0a 20 20 20 20  = azArg[2];.    
2f020 20 20 7a 44 62 20 3d 20 61 7a 41 72 67 5b 31 5d    zDb = azArg[1]
2f030 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
2f040 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74     raw_printf(st
2f050 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 72  derr, "Usage: .r
2f060 65 73 74 6f 72 65 20 3f 44 42 3f 20 46 49 4c 45  estore ?DB? FILE
2f070 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  \n");.      rc =
2f080 20 31 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d   1;.      goto m
2f090 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74  eta_command_exit
2f0a0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
2f0b0 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 7a 53   sqlite3_open(zS
2f0c0 72 63 46 69 6c 65 2c 20 26 70 53 72 63 29 3b 0a  rcFile, &pSrc);.
2f0d0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
2f0e0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 75  TE_OK ){.      u
2f0f0 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72  tf8_printf(stder
2f100 72 2c 20 22 45 72 72 6f 72 3a 20 63 61 6e 6e 6f  r, "Error: canno
2f110 74 20 6f 70 65 6e 20 5c 22 25 73 5c 22 5c 6e 22  t open \"%s\"\n"
2f120 2c 20 7a 53 72 63 46 69 6c 65 29 3b 0a 20 20 20  , zSrcFile);.   
2f130 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65     sqlite3_close
2f140 28 70 53 72 63 29 3b 0a 20 20 20 20 20 20 72 65  (pSrc);.      re
2f150 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20  turn 1;.    }.  
2f160 20 20 6f 70 65 6e 5f 64 62 28 70 2c 20 30 29 3b    open_db(p, 0);
2f170 0a 20 20 20 20 70 42 61 63 6b 75 70 20 3d 20 73  .    pBackup = s
2f180 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 5f 69 6e  qlite3_backup_in
2f190 69 74 28 70 2d 3e 64 62 2c 20 7a 44 62 2c 20 70  it(p->db, zDb, p
2f1a0 53 72 63 2c 20 22 6d 61 69 6e 22 29 3b 0a 20 20  Src, "main");.  
2f1b0 20 20 69 66 28 20 70 42 61 63 6b 75 70 3d 3d 30    if( pBackup==0
2f1c0 20 29 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70   ){.      utf8_p
2f1d0 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45  rintf(stderr, "E
2f1e0 72 72 6f 72 3a 20 25 73 5c 6e 22 2c 20 73 71 6c  rror: %s\n", sql
2f1f0 69 74 65 33 5f 65 72 72 6d 73 67 28 70 2d 3e 64  ite3_errmsg(p->d
2f200 62 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  b));.      sqlit
2f210 65 33 5f 63 6c 6f 73 65 28 70 53 72 63 29 3b 0a  e3_close(pSrc);.
2f220 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
2f230 20 20 20 20 7d 0a 20 20 20 20 77 68 69 6c 65 28      }.    while(
2f240 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62   (rc = sqlite3_b
2f250 61 63 6b 75 70 5f 73 74 65 70 28 70 42 61 63 6b  ackup_step(pBack
2f260 75 70 2c 31 30 30 29 29 3d 3d 53 51 4c 49 54 45  up,100))==SQLITE
2f270 5f 4f 4b 0a 20 20 20 20 20 20 20 20 20 20 7c 7c  _OK.          ||
2f280 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59   rc==SQLITE_BUSY
2f290 20 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 72    ){.      if( r
2f2a0 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 29  c==SQLITE_BUSY )
2f2b0 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 54  {.        if( nT
2f2c0 69 6d 65 6f 75 74 2b 2b 20 3e 3d 20 33 20 29 20  imeout++ >= 3 ) 
2f2d0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 73  break;.        s
2f2e0 71 6c 69 74 65 33 5f 73 6c 65 65 70 28 31 30 30  qlite3_sleep(100
2f2f0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
2f300 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 61 63  .    sqlite3_bac
2f310 6b 75 70 5f 66 69 6e 69 73 68 28 70 42 61 63 6b  kup_finish(pBack
2f320 75 70 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  up);.    if( rc=
2f330 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a  =SQLITE_DONE ){.
2f340 20 20 20 20 20 20 72 63 20 3d 20 30 3b 0a 20 20        rc = 0;.  
2f350 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63 3d 3d    }else if( rc==
2f360 53 51 4c 49 54 45 5f 42 55 53 59 20 7c 7c 20 72  SQLITE_BUSY || r
2f370 63 3d 3d 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44  c==SQLITE_LOCKED
2f380 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72   ){.      raw_pr
2f390 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72  intf(stderr, "Er
2f3a0 72 6f 72 3a 20 73 6f 75 72 63 65 20 64 61 74 61  ror: source data
2f3b0 62 61 73 65 20 69 73 20 62 75 73 79 5c 6e 22 29  base is busy\n")
2f3c0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a  ;.      rc = 1;.
2f3d0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2f3e0 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64   utf8_printf(std
2f3f0 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 25 73 5c  err, "Error: %s\
2f400 6e 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d  n", sqlite3_errm
2f410 73 67 28 70 2d 3e 64 62 29 29 3b 0a 20 20 20 20  sg(p->db));.    
2f420 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a    rc = 1;.    }.
2f430 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73      sqlite3_clos
2f440 65 28 70 53 72 63 29 3b 0a 20 20 7d 65 6c 73 65  e(pSrc);.  }else
2f450 0a 0a 0a 20 20 69 66 28 20 63 3d 3d 27 73 27 20  ...  if( c=='s' 
2f460 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67  && strncmp(azArg
2f470 5b 30 5d 2c 20 22 73 63 61 6e 73 74 61 74 73 22  [0], "scanstats"
2f480 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69  , n)==0 ){.    i
2f490 66 28 20 6e 41 72 67 3d 3d 32 20 29 7b 0a 20 20  f( nArg==2 ){.  
2f4a0 20 20 20 20 70 2d 3e 73 63 61 6e 73 74 61 74 73      p->scanstats
2f4b0 4f 6e 20 3d 20 62 6f 6f 6c 65 61 6e 56 61 6c 75  On = booleanValu
2f4c0 65 28 61 7a 41 72 67 5b 31 5d 29 3b 0a 23 69 66  e(azArg[1]);.#if
2f4d0 6e 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  ndef SQLITE_ENAB
2f4e0 4c 45 5f 53 54 4d 54 5f 53 43 41 4e 53 54 41 54  LE_STMT_SCANSTAT
2f4f0 55 53 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69  US.      raw_pri
2f500 6e 74 66 28 73 74 64 65 72 72 2c 20 22 57 61 72  ntf(stderr, "War
2f510 6e 69 6e 67 3a 20 2e 73 63 61 6e 73 74 61 74 73  ning: .scanstats
2f520 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 20 69   not available i
2f530 6e 20 74 68 69 73 20 62 75 69 6c 64 2e 5c 6e 22  n this build.\n"
2f540 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 65  );.#endif.    }e
2f550 6c 73 65 7b 0a 20 20 20 20 20 20 72 61 77 5f 70  lse{.      raw_p
2f560 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55  rintf(stderr, "U
2f570 73 61 67 65 3a 20 2e 73 63 61 6e 73 74 61 74 73  sage: .scanstats
2f580 20 6f 6e 7c 6f 66 66 5c 6e 22 29 3b 0a 20 20 20   on|off\n");.   
2f590 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d     rc = 1;.    }
2f5a0 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20  .  }else..  if( 
2f5b0 63 3d 3d 27 73 27 20 26 26 20 73 74 72 6e 63 6d  c=='s' && strncm
2f5c0 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 73 63 68  p(azArg[0], "sch
2f5d0 65 6d 61 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20  ema", n)==0 ){. 
2f5e0 20 20 20 53 68 65 6c 6c 54 65 78 74 20 73 53 65     ShellText sSe
2f5f0 6c 65 63 74 3b 0a 20 20 20 20 53 68 65 6c 6c 53  lect;.    ShellS
2f600 74 61 74 65 20 64 61 74 61 3b 0a 20 20 20 20 63  tate data;.    c
2f610 68 61 72 20 2a 7a 45 72 72 4d 73 67 20 3d 20 30  har *zErrMsg = 0
2f620 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
2f630 20 2a 7a 44 69 76 20 3d 20 22 28 22 3b 0a 20 20   *zDiv = "(";.  
2f640 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
2f650 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74  ame = 0;.    int
2f660 20 69 53 63 68 65 6d 61 20 3d 20 30 3b 0a 20 20   iSchema = 0;.  
2f670 20 20 69 6e 74 20 62 44 65 62 75 67 20 3d 20 30    int bDebug = 0
2f680 3b 0a 20 20 20 20 69 6e 74 20 69 69 3b 0a 0a 20  ;.    int ii;.. 
2f690 20 20 20 6f 70 65 6e 5f 64 62 28 70 2c 20 30 29     open_db(p, 0)
2f6a0 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61  ;.    memcpy(&da
2f6b0 74 61 2c 20 70 2c 20 73 69 7a 65 6f 66 28 64 61  ta, p, sizeof(da
2f6c0 74 61 29 29 3b 0a 20 20 20 20 64 61 74 61 2e 73  ta));.    data.s
2f6d0 68 6f 77 48 65 61 64 65 72 20 3d 20 30 3b 0a 20  howHeader = 0;. 
2f6e0 20 20 20 64 61 74 61 2e 63 4d 6f 64 65 20 3d 20     data.cMode = 
2f6f0 64 61 74 61 2e 6d 6f 64 65 20 3d 20 4d 4f 44 45  data.mode = MODE
2f700 5f 53 65 6d 69 3b 0a 20 20 20 20 69 6e 69 74 54  _Semi;.    initT
2f710 65 78 74 28 26 73 53 65 6c 65 63 74 29 3b 0a 20  ext(&sSelect);. 
2f720 20 20 20 66 6f 72 28 69 69 3d 31 3b 20 69 69 3c     for(ii=1; ii<
2f730 6e 41 72 67 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  nArg; ii++){.   
2f740 20 20 20 69 66 28 20 6f 70 74 69 6f 6e 4d 61 74     if( optionMat
2f750 63 68 28 61 7a 41 72 67 5b 69 69 5d 2c 22 69 6e  ch(azArg[ii],"in
2f760 64 65 6e 74 22 29 20 29 7b 0a 20 20 20 20 20 20  dent") ){.      
2f770 20 20 64 61 74 61 2e 63 4d 6f 64 65 20 3d 20 64    data.cMode = d
2f780 61 74 61 2e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f  ata.mode = MODE_
2f790 50 72 65 74 74 79 3b 0a 20 20 20 20 20 20 7d 65  Pretty;.      }e
2f7a0 6c 73 65 20 69 66 28 20 6f 70 74 69 6f 6e 4d 61  lse if( optionMa
2f7b0 74 63 68 28 61 7a 41 72 67 5b 69 69 5d 2c 22 64  tch(azArg[ii],"d
2f7c0 65 62 75 67 22 29 20 29 7b 0a 20 20 20 20 20 20  ebug") ){.      
2f7d0 20 20 62 44 65 62 75 67 20 3d 20 31 3b 0a 20 20    bDebug = 1;.  
2f7e0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 4e      }else if( zN
2f7f0 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ame==0 ){.      
2f800 20 20 7a 4e 61 6d 65 20 3d 20 61 7a 41 72 67 5b    zName = azArg[
2f810 69 69 5d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ii];.      }else
2f820 7b 0a 20 20 20 20 20 20 20 20 72 61 77 5f 70 72  {.        raw_pr
2f830 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55 73  intf(stderr, "Us
2f840 61 67 65 3a 20 2e 73 63 68 65 6d 61 20 3f 2d 2d  age: .schema ?--
2f850 69 6e 64 65 6e 74 3f 20 3f 4c 49 4b 45 2d 50 41  indent? ?LIKE-PA
2f860 54 54 45 52 4e 3f 5c 6e 22 29 3b 0a 20 20 20 20  TTERN?\n");.    
2f870 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
2f880 20 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f      goto meta_co
2f890 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20  mmand_exit;.    
2f8a0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
2f8b0 28 20 7a 4e 61 6d 65 21 3d 30 20 29 7b 0a 20 20  ( zName!=0 ){.  
2f8c0 20 20 20 20 69 6e 74 20 69 73 4d 61 73 74 65 72      int isMaster
2f8d0 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 72 6c 69   = sqlite3_strli
2f8e0 6b 65 28 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74  ke(zName, "sqlit
2f8f0 65 5f 6d 61 73 74 65 72 22 2c 20 30 29 3d 3d 30  e_master", 0)==0
2f900 3b 0a 20 20 20 20 20 20 69 66 28 20 69 73 4d 61  ;.      if( isMa
2f910 73 74 65 72 20 7c 7c 20 73 71 6c 69 74 65 33 5f  ster || sqlite3_
2f920 73 74 72 6c 69 6b 65 28 7a 4e 61 6d 65 2c 22 73  strlike(zName,"s
2f930 71 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65  qlite_temp_maste
2f940 72 22 2c 30 29 3d 3d 30 20 29 7b 0a 20 20 20 20  r",0)==0 ){.    
2f950 20 20 20 20 63 68 61 72 20 2a 6e 65 77 5f 61 72      char *new_ar
2f960 67 76 5b 32 5d 2c 20 2a 6e 65 77 5f 63 6f 6c 76  gv[2], *new_colv
2f970 5b 32 5d 3b 0a 20 20 20 20 20 20 20 20 6e 65 77  [2];.        new
2f980 5f 61 72 67 76 5b 30 5d 20 3d 20 73 71 6c 69 74  _argv[0] = sqlit
2f990 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20 20  e3_mprintf(.    
2f9a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f9b0 20 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20    "CREATE TABLE 
2f9c0 25 73 20 28 5c 6e 22 0a 20 20 20 20 20 20 20 20  %s (\n".        
2f9d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20                " 
2f9e0 20 74 79 70 65 20 74 65 78 74 2c 5c 6e 22 0a 20   type text,\n". 
2f9f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fa00 20 20 20 20 20 22 20 20 6e 61 6d 65 20 74 65 78       "  name tex
2fa10 74 2c 5c 6e 22 0a 20 20 20 20 20 20 20 20 20 20  t,\n".          
2fa20 20 20 20 20 20 20 20 20 20 20 20 20 22 20 20 74              "  t
2fa30 62 6c 5f 6e 61 6d 65 20 74 65 78 74 2c 5c 6e 22  bl_name text,\n"
2fa40 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2fa50 20 20 20 20 20 20 20 22 20 20 72 6f 6f 74 70 61         "  rootpa
2fa60 67 65 20 69 6e 74 65 67 65 72 2c 5c 6e 22 0a 20  ge integer,\n". 
2fa70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fa80 20 20 20 20 20 22 20 20 73 71 6c 20 74 65 78 74       "  sql text
2fa90 5c 6e 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  \n".            
2faa0 20 20 20 20 20 20 20 20 20 20 22 29 22 2c 20 69            ")", i
2fab0 73 4d 61 73 74 65 72 20 3f 20 22 73 71 6c 69 74  sMaster ? "sqlit
2fac0 65 5f 6d 61 73 74 65 72 22 20 3a 20 22 73 71 6c  e_master" : "sql
2fad0 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72 22  ite_temp_master"
2fae0 29 3b 0a 20 20 20 20 20 20 20 20 6e 65 77 5f 61  );.        new_a
2faf0 72 67 76 5b 31 5d 20 3d 20 30 3b 0a 20 20 20 20  rgv[1] = 0;.    
2fb00 20 20 20 20 6e 65 77 5f 63 6f 6c 76 5b 30 5d 20      new_colv[0] 
2fb10 3d 20 22 73 71 6c 22 3b 0a 20 20 20 20 20 20 20  = "sql";.       
2fb20 20 6e 65 77 5f 63 6f 6c 76 5b 31 5d 20 3d 20 30   new_colv[1] = 0
2fb30 3b 0a 20 20 20 20 20 20 20 20 63 61 6c 6c 62 61  ;.        callba
2fb40 63 6b 28 26 64 61 74 61 2c 20 31 2c 20 6e 65 77  ck(&data, 1, new
2fb50 5f 61 72 67 76 2c 20 6e 65 77 5f 63 6f 6c 76 29  _argv, new_colv)
2fb60 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
2fb70 33 5f 66 72 65 65 28 6e 65 77 5f 61 72 67 76 5b  3_free(new_argv[
2fb80 30 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  0]);.      }.   
2fb90 20 7d 0a 20 20 20 20 69 66 28 20 7a 44 69 76 20   }.    if( zDiv 
2fba0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
2fbb0 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30  _stmt *pStmt = 0
2fbc0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
2fbd0 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28  ite3_prepare_v2(
2fbe0 70 2d 3e 64 62 2c 20 22 53 45 4c 45 43 54 20 6e  p->db, "SELECT n
2fbf0 61 6d 65 20 46 52 4f 4d 20 70 72 61 67 6d 61 5f  ame FROM pragma_
2fc00 64 61 74 61 62 61 73 65 5f 6c 69 73 74 22 2c 0a  database_list",.
2fc10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fc20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 31                -1
2fc30 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20  , &pStmt, 0);.  
2fc40 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
2fc50 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
2fc60 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72  f(stderr, "Error
2fc70 3a 20 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65 33  : %s\n", sqlite3
2fc80 5f 65 72 72 6d 73 67 28 70 2d 3e 64 62 29 29 3b  _errmsg(p->db));
2fc90 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2fca0 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29  _finalize(pStmt)
2fcb0 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 31  ;.        rc = 1
2fcc0 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d  ;.        goto m
2fcd0 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74  eta_command_exit
2fce0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2fcf0 61 70 70 65 6e 64 54 65 78 74 28 26 73 53 65 6c  appendText(&sSel
2fd00 65 63 74 2c 20 22 53 45 4c 45 43 54 20 73 71 6c  ect, "SELECT sql
2fd10 20 46 52 4f 4d 22 2c 20 30 29 3b 0a 20 20 20 20   FROM", 0);.    
2fd20 20 20 69 53 63 68 65 6d 61 20 3d 20 30 3b 0a 20    iSchema = 0;. 
2fd30 20 20 20 20 20 77 68 69 6c 65 28 20 73 71 6c 69       while( sqli
2fd40 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3d  te3_step(pStmt)=
2fd50 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20  =SQLITE_ROW ){. 
2fd60 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61         const cha
2fd70 72 20 2a 7a 44 62 20 3d 20 28 63 6f 6e 73 74 20  r *zDb = (const 
2fd80 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f  char*)sqlite3_co
2fd90 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c  lumn_text(pStmt,
2fda0 20 30 29 3b 0a 20 20 20 20 20 20 20 20 63 68 61   0);.        cha
2fdb0 72 20 7a 53 63 4e 75 6d 5b 33 30 5d 3b 0a 20 20  r zScNum[30];.  
2fdc0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
2fdd0 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 53  printf(sizeof(zS
2fde0 63 4e 75 6d 29 2c 20 7a 53 63 4e 75 6d 2c 20 22  cNum), zScNum, "
2fdf0 25 64 22 2c 20 2b 2b 69 53 63 68 65 6d 61 29 3b  %d", ++iSchema);
2fe00 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 54  .        appendT
2fe10 65 78 74 28 26 73 53 65 6c 65 63 74 2c 20 7a 44  ext(&sSelect, zD
2fe20 69 76 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  iv, 0);.        
2fe30 7a 44 69 76 20 3d 20 22 20 55 4e 49 4f 4e 20 41  zDiv = " UNION A
2fe40 4c 4c 20 22 3b 0a 20 20 20 20 20 20 20 20 61 70  LL ";.        ap
2fe50 70 65 6e 64 54 65 78 74 28 26 73 53 65 6c 65 63  pendText(&sSelec
2fe60 74 2c 20 22 53 45 4c 45 43 54 20 73 68 65 6c 6c  t, "SELECT shell
2fe70 5f 61 64 64 5f 73 63 68 65 6d 61 28 73 71 6c 2c  _add_schema(sql,
2fe80 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69  ", 0);.        i
2fe90 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63  f( sqlite3_stric
2fea0 6d 70 28 7a 44 62 2c 20 22 6d 61 69 6e 22 29 21  mp(zDb, "main")!
2feb0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
2fec0 61 70 70 65 6e 64 54 65 78 74 28 26 73 53 65 6c  appendText(&sSel
2fed0 65 63 74 2c 20 7a 44 62 2c 20 27 22 27 29 3b 0a  ect, zDb, '"');.
2fee0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
2fef0 20 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 54           appendT
2ff00 65 78 74 28 26 73 53 65 6c 65 63 74 2c 20 22 4e  ext(&sSelect, "N
2ff10 55 4c 4c 22 2c 20 30 29 3b 0a 20 20 20 20 20 20  ULL", 0);.      
2ff20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 70 70 65    }.        appe
2ff30 6e 64 54 65 78 74 28 26 73 53 65 6c 65 63 74 2c  ndText(&sSelect,
2ff40 20 22 2c 6e 61 6d 65 29 20 41 53 20 73 71 6c 2c   ",name) AS sql,
2ff50 20 74 79 70 65 2c 20 74 62 6c 5f 6e 61 6d 65 2c   type, tbl_name,
2ff60 20 6e 61 6d 65 2c 20 72 6f 77 69 64 2c 22 2c 20   name, rowid,", 
2ff70 30 29 3b 0a 20 20 20 20 20 20 20 20 61 70 70 65  0);.        appe
2ff80 6e 64 54 65 78 74 28 26 73 53 65 6c 65 63 74 2c  ndText(&sSelect,
2ff90 20 7a 53 63 4e 75 6d 2c 20 30 29 3b 0a 20 20 20   zScNum, 0);.   
2ffa0 20 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28       appendText(
2ffb0 26 73 53 65 6c 65 63 74 2c 20 22 20 41 53 20 73  &sSelect, " AS s
2ffc0 6e 75 6d 2c 20 22 2c 20 30 29 3b 0a 20 20 20 20  num, ", 0);.    
2ffd0 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26      appendText(&
2ffe0 73 53 65 6c 65 63 74 2c 20 7a 44 62 2c 20 27 5c  sSelect, zDb, '\
2fff0 27 27 29 3b 0a 20 20 20 20 20 20 20 20 61 70 70  '');.        app
30000 65 6e 64 54 65 78 74 28 26 73 53 65 6c 65 63 74  endText(&sSelect
30010 2c 20 22 20 41 53 20 73 6e 61 6d 65 20 46 52 4f  , " AS sname FRO
30020 4d 20 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  M ", 0);.       
30030 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 53 65   appendText(&sSe
30040 6c 65 63 74 2c 20 7a 44 62 2c 20 27 22 27 29 3b  lect, zDb, '"');
30050 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 54  .        appendT
30060 65 78 74 28 26 73 53 65 6c 65 63 74 2c 20 22 2e  ext(&sSelect, ".
30070 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 22 2c 20  sqlite_master", 
30080 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
30090 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69    sqlite3_finali
300a0 7a 65 28 70 53 74 6d 74 29 3b 0a 23 69 66 64 65  ze(pStmt);.#ifde
300b0 66 20 53 51 4c 49 54 45 5f 49 4e 54 52 4f 53 50  f SQLITE_INTROSP
300c0 45 43 54 49 4f 4e 5f 50 52 41 47 4d 41 53 0a 20  ECTION_PRAGMAS. 
300d0 20 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 20 29       if( zName )
300e0 7b 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e 64  {.        append
300f0 54 65 78 74 28 26 73 53 65 6c 65 63 74 2c 0a 20  Text(&sSelect,. 
30100 20 20 20 20 20 20 20 20 20 20 22 20 55 4e 49 4f            " UNIO
30110 4e 20 41 4c 4c 20 53 45 4c 45 43 54 20 73 68 65  N ALL SELECT she
30120 6c 6c 5f 6d 6f 64 75 6c 65 5f 73 63 68 65 6d 61  ll_module_schema
30130 28 6e 61 6d 65 29 2c 22 0a 20 20 20 20 20 20 20  (name),".       
30140 20 20 20 20 22 20 27 74 61 62 6c 65 27 2c 20 6e      " 'table', n
30150 61 6d 65 2c 20 6e 61 6d 65 2c 20 6e 61 6d 65 2c  ame, name, name,
30160 20 39 65 2b 39 39 2c 20 27 6d 61 69 6e 27 20 46   9e+99, 'main' F
30170 52 4f 4d 20 70 72 61 67 6d 61 5f 6d 6f 64 75 6c  ROM pragma_modul
30180 65 5f 6c 69 73 74 22 2c 20 30 29 3b 0a 20 20 20  e_list", 0);.   
30190 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
301a0 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 53    appendText(&sS
301b0 65 6c 65 63 74 2c 20 22 29 20 57 48 45 52 45 20  elect, ") WHERE 
301c0 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  ", 0);.      if(
301d0 20 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20   zName ){.      
301e0 20 20 63 68 61 72 20 2a 7a 51 61 72 67 20 3d 20    char *zQarg = 
301f0 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
30200 22 25 51 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  "%Q", zName);.  
30210 20 20 20 20 20 20 69 66 28 20 73 74 72 63 68 72        if( strchr
30220 28 7a 4e 61 6d 65 2c 20 27 2e 27 29 20 29 7b 0a  (zName, '.') ){.
30230 20 20 20 20 20 20 20 20 20 20 61 70 70 65 6e 64            append
30240 54 65 78 74 28 26 73 53 65 6c 65 63 74 2c 20 22  Text(&sSelect, "
30250 6c 6f 77 65 72 28 70 72 69 6e 74 66 28 27 25 73  lower(printf('%s
30260 2e 25 73 27 2c 73 6e 61 6d 65 2c 74 62 6c 5f 6e  .%s',sname,tbl_n
30270 61 6d 65 29 29 22 2c 20 30 29 3b 0a 20 20 20 20  ame))", 0);.    
30280 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
30290 20 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28       appendText(
302a0 26 73 53 65 6c 65 63 74 2c 20 22 6c 6f 77 65 72  &sSelect, "lower
302b0 28 74 62 6c 5f 6e 61 6d 65 29 22 2c 20 30 29 3b  (tbl_name)", 0);
302c0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
302d0 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73     appendText(&s
302e0 53 65 6c 65 63 74 2c 20 73 74 72 63 68 72 28 7a  Select, strchr(z
302f0 4e 61 6d 65 2c 20 27 2a 27 29 20 3f 20 22 20 47  Name, '*') ? " G
30300 4c 4f 42 20 22 20 3a 20 22 20 4c 49 4b 45 20 22  LOB " : " LIKE "
30310 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 61 70  , 0);.        ap
30320 70 65 6e 64 54 65 78 74 28 26 73 53 65 6c 65 63  pendText(&sSelec
30330 74 2c 20 7a 51 61 72 67 2c 20 30 29 3b 0a 20 20  t, zQarg, 0);.  
30340 20 20 20 20 20 20 61 70 70 65 6e 64 54 65 78 74        appendText
30350 28 26 73 53 65 6c 65 63 74 2c 20 22 20 41 4e 44  (&sSelect, " AND
30360 20 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20   ", 0);.        
30370 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 51 61  sqlite3_free(zQa
30380 72 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  rg);.      }.   
30390 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73     appendText(&s
303a0 53 65 6c 65 63 74 2c 20 22 74 79 70 65 21 3d 27  Select, "type!='
303b0 6d 65 74 61 27 20 41 4e 44 20 73 71 6c 20 49 53  meta' AND sql IS
303c0 20 4e 4f 54 20 4e 55 4c 4c 22 0a 20 20 20 20 20   NOT NULL".     
303d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
303e0 20 20 20 20 20 20 22 20 4f 52 44 45 52 20 42 59        " ORDER BY
303f0 20 73 6e 75 6d 2c 20 72 6f 77 69 64 22 2c 20 30   snum, rowid", 0
30400 29 3b 0a 20 20 20 20 20 20 69 66 28 20 62 44 65  );.      if( bDe
30410 62 75 67 20 29 7b 0a 20 20 20 20 20 20 20 20 75  bug ){.        u
30420 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  tf8_printf(p->ou
30430 74 2c 20 22 53 51 4c 3a 20 25 73 3b 5c 6e 22 2c  t, "SQL: %s;\n",
30440 20 73 53 65 6c 65 63 74 2e 7a 29 3b 0a 20 20 20   sSelect.z);.   
30450 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
30460 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65    rc = sqlite3_e
30470 78 65 63 28 70 2d 3e 64 62 2c 20 73 53 65 6c 65  xec(p->db, sSele
30480 63 74 2e 7a 2c 20 63 61 6c 6c 62 61 63 6b 2c 20  ct.z, callback, 
30490 26 64 61 74 61 2c 20 26 7a 45 72 72 4d 73 67 29  &data, &zErrMsg)
304a0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
304b0 66 72 65 65 54 65 78 74 28 26 73 53 65 6c 65 63  freeText(&sSelec
304c0 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  t);.    }.    if
304d0 28 20 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20  ( zErrMsg ){.   
304e0 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73     utf8_printf(s
304f0 74 64 65 72 72 2c 22 45 72 72 6f 72 3a 20 25 73  tderr,"Error: %s
30500 5c 6e 22 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20  \n", zErrMsg);. 
30510 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
30520 65 28 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20  e(zErrMsg);.    
30530 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 65    rc = 1;.    }e
30540 6c 73 65 20 69 66 28 20 72 63 20 21 3d 20 53 51  lse if( rc != SQ
30550 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
30560 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65   raw_printf(stde
30570 72 72 2c 22 45 72 72 6f 72 3a 20 71 75 65 72 79  rr,"Error: query
30580 69 6e 67 20 73 63 68 65 6d 61 20 69 6e 66 6f 72  ing schema infor
30590 6d 61 74 69 6f 6e 5c 6e 22 29 3b 0a 20 20 20 20  mation\n");.    
305a0 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 65    rc = 1;.    }e
305b0 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
305c0 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  0;.    }.  }else
305d0 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  ..#if defined(SQ
305e0 4c 49 54 45 5f 44 45 42 55 47 29 20 26 26 20 64  LITE_DEBUG) && d
305f0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
30600 41 42 4c 45 5f 53 45 4c 45 43 54 54 52 41 43 45  ABLE_SELECTTRACE
30610 29 0a 20 20 69 66 28 20 63 3d 3d 27 73 27 20 26  ).  if( c=='s' &
30620 26 20 6e 3d 3d 31 31 20 26 26 20 73 74 72 6e 63  & n==11 && strnc
30630 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 73 65  mp(azArg[0], "se
30640 6c 65 63 74 74 72 61 63 65 22 2c 20 6e 29 3d 3d  lecttrace", n)==
30650 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
30660 53 65 6c 65 63 74 54 72 61 63 65 20 3d 20 28 69  SelectTrace = (i
30670 6e 74 29 69 6e 74 65 67 65 72 56 61 6c 75 65 28  nt)integerValue(
30680 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 7d 65 6c  azArg[1]);.  }el
30690 73 65 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 64  se.#endif..#if d
306a0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
306b0 41 42 4c 45 5f 53 45 53 53 49 4f 4e 29 0a 20 20  ABLE_SESSION).  
306c0 69 66 28 20 63 3d 3d 27 73 27 20 26 26 20 73 74  if( c=='s' && st
306d0 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 22  rncmp(azArg[0],"
306e0 73 65 73 73 69 6f 6e 22 2c 6e 29 3d 3d 30 20 26  session",n)==0 &
306f0 26 20 6e 3e 3d 33 20 29 7b 0a 20 20 20 20 4f 70  & n>=3 ){.    Op
30700 65 6e 53 65 73 73 69 6f 6e 20 2a 70 53 65 73 73  enSession *pSess
30710 69 6f 6e 20 3d 20 26 70 2d 3e 61 53 65 73 73 69  ion = &p->aSessi
30720 6f 6e 5b 30 5d 3b 0a 20 20 20 20 63 68 61 72 20  on[0];.    char 
30730 2a 2a 61 7a 43 6d 64 20 3d 20 26 61 7a 41 72 67  **azCmd = &azArg
30740 5b 31 5d 3b 0a 20 20 20 20 69 6e 74 20 69 53 65  [1];.    int iSe
30750 73 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 6e  s = 0;.    int n
30760 43 6d 64 20 3d 20 6e 41 72 67 20 2d 20 31 3b 0a  Cmd = nArg - 1;.
30770 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69      int i;.    i
30780 66 28 20 6e 41 72 67 3c 3d 31 20 29 20 67 6f 74  f( nArg<=1 ) got
30790 6f 20 73 65 73 73 69 6f 6e 5f 73 79 6e 74 61 78  o session_syntax
307a0 5f 65 72 72 6f 72 3b 0a 20 20 20 20 6f 70 65 6e  _error;.    open
307b0 5f 64 62 28 70 2c 20 30 29 3b 0a 20 20 20 20 69  _db(p, 0);.    i
307c0 66 28 20 6e 41 72 67 3e 3d 33 20 29 7b 0a 20 20  f( nArg>=3 ){.  
307d0 20 20 20 20 66 6f 72 28 69 53 65 73 3d 30 3b 20      for(iSes=0; 
307e0 69 53 65 73 3c 70 2d 3e 6e 53 65 73 73 69 6f 6e  iSes<p->nSession
307f0 3b 20 69 53 65 73 2b 2b 29 7b 0a 20 20 20 20 20  ; iSes++){.     
30800 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 70 2d     if( strcmp(p-
30810 3e 61 53 65 73 73 69 6f 6e 5b 69 53 65 73 5d 2e  >aSession[iSes].
30820 7a 4e 61 6d 65 2c 20 61 7a 41 72 67 5b 31 5d 29  zName, azArg[1])
30830 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
30840 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69     }.      if( i
30850 53 65 73 3c 70 2d 3e 6e 53 65 73 73 69 6f 6e 20  Ses<p->nSession 
30860 29 7b 0a 20 20 20 20 20 20 20 20 70 53 65 73 73  ){.        pSess
30870 69 6f 6e 20 3d 20 26 70 2d 3e 61 53 65 73 73 69  ion = &p->aSessi
30880 6f 6e 5b 69 53 65 73 5d 3b 0a 20 20 20 20 20 20  on[iSes];.      
30890 20 20 61 7a 43 6d 64 2b 2b 3b 0a 20 20 20 20 20    azCmd++;.     
308a0 20 20 20 6e 43 6d 64 2d 2d 3b 0a 20 20 20 20 20     nCmd--;.     
308b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
308c0 70 53 65 73 73 69 6f 6e 20 3d 20 26 70 2d 3e 61  pSession = &p->a
308d0 53 65 73 73 69 6f 6e 5b 30 5d 3b 0a 20 20 20 20  Session[0];.    
308e0 20 20 20 20 69 53 65 73 20 3d 20 30 3b 0a 20 20      iSes = 0;.  
308f0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
30900 20 2f 2a 20 2e 73 65 73 73 69 6f 6e 20 61 74 74   /* .session att
30910 61 63 68 20 54 41 42 4c 45 0a 20 20 20 20 2a 2a  ach TABLE.    **
30920 20 49 6e 76 6f 6b 65 20 74 68 65 20 73 71 6c 69   Invoke the sqli
30930 74 65 33 73 65 73 73 69 6f 6e 5f 61 74 74 61 63  te3session_attac
30940 68 28 29 20 69 6e 74 65 72 66 61 63 65 20 74 6f  h() interface to
30950 20 61 74 74 61 63 68 20 61 20 70 61 72 74 69 63   attach a partic
30960 75 6c 61 72 0a 20 20 20 20 2a 2a 20 74 61 62 6c  ular.    ** tabl
30970 65 20 73 6f 20 74 68 61 74 20 69 74 20 69 73 20  e so that it is 
30980 6e 65 76 65 72 20 66 69 6c 74 65 72 65 64 2e 0a  never filtered..
30990 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73      */.    if( s
309a0 74 72 63 6d 70 28 61 7a 43 6d 64 5b 30 5d 2c 22  trcmp(azCmd[0],"
309b0 61 74 74 61 63 68 22 29 3d 3d 30 20 29 7b 0a 20  attach")==0 ){. 
309c0 20 20 20 20 20 69 66 28 20 6e 43 6d 64 21 3d 32       if( nCmd!=2
309d0 20 29 20 67 6f 74 6f 20 73 65 73 73 69 6f 6e 5f   ) goto session_
309e0 73 79 6e 74 61 78 5f 65 72 72 6f 72 3b 0a 20 20  syntax_error;.  
309f0 20 20 20 20 69 66 28 20 70 53 65 73 73 69 6f 6e      if( pSession
30a00 2d 3e 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ->p==0 ){.      
30a10 20 20 73 65 73 73 69 6f 6e 5f 6e 6f 74 5f 6f 70    session_not_op
30a20 65 6e 3a 0a 20 20 20 20 20 20 20 20 72 61 77 5f  en:.        raw_
30a30 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
30a40 45 52 52 4f 52 3a 20 4e 6f 20 73 65 73 73 69 6f  ERROR: No sessio
30a50 6e 73 20 61 72 65 20 6f 70 65 6e 5c 6e 22 29 3b  ns are open\n");
30a60 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
30a70 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
30a80 65 33 73 65 73 73 69 6f 6e 5f 61 74 74 61 63 68  e3session_attach
30a90 28 70 53 65 73 73 69 6f 6e 2d 3e 70 2c 20 61 7a  (pSession->p, az
30aa0 43 6d 64 5b 31 5d 29 3b 0a 20 20 20 20 20 20 20  Cmd[1]);.       
30ab0 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
30ac0 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
30ad0 73 74 64 65 72 72 2c 20 22 45 52 52 4f 52 3a 20  stderr, "ERROR: 
30ae0 73 71 6c 69 74 65 33 73 65 73 73 69 6f 6e 5f 61  sqlite3session_a
30af0 74 74 61 63 68 28 29 20 72 65 74 75 72 6e 73 20  ttach() returns 
30b00 25 64 5c 6e 22 2c 20 72 63 29 3b 0a 20 20 20 20  %d\n", rc);.    
30b10 20 20 20 20 20 20 72 63 20 3d 20 30 3b 0a 20 20        rc = 0;.  
30b20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
30b30 20 20 20 20 7d 65 6c 73 65 0a 0a 20 20 20 20 2f      }else..    /
30b40 2a 20 2e 73 65 73 73 69 6f 6e 20 63 68 61 6e 67  * .session chang
30b50 65 73 65 74 20 46 49 4c 45 0a 20 20 20 20 2a 2a  eset FILE.    **
30b60 20 2e 73 65 73 73 69 6f 6e 20 70 61 74 63 68 73   .session patchs
30b70 65 74 20 46 49 4c 45 0a 20 20 20 20 2a 2a 20 57  et FILE.    ** W
30b80 72 69 74 65 20 61 20 63 68 61 6e 67 65 73 65 74  rite a changeset
30b90 20 6f 72 20 70 61 74 63 68 73 65 74 20 69 6e 74   or patchset int
30ba0 6f 20 61 20 66 69 6c 65 2e 20 20 54 68 65 20 66  o a file.  The f
30bb0 69 6c 65 20 69 73 20 6f 76 65 72 77 72 69 74 74  ile is overwritt
30bc0 65 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  en..    */.    i
30bd0 66 28 20 73 74 72 63 6d 70 28 61 7a 43 6d 64 5b  f( strcmp(azCmd[
30be0 30 5d 2c 22 63 68 61 6e 67 65 73 65 74 22 29 3d  0],"changeset")=
30bf0 3d 30 20 7c 7c 20 73 74 72 63 6d 70 28 61 7a 43  =0 || strcmp(azC
30c00 6d 64 5b 30 5d 2c 22 70 61 74 63 68 73 65 74 22  md[0],"patchset"
30c10 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 46 49  )==0 ){.      FI
30c20 4c 45 20 2a 6f 75 74 20 3d 20 30 3b 0a 20 20 20  LE *out = 0;.   
30c30 20 20 20 69 66 28 20 6e 43 6d 64 21 3d 32 20 29     if( nCmd!=2 )
30c40 20 67 6f 74 6f 20 73 65 73 73 69 6f 6e 5f 73 79   goto session_sy
30c50 6e 74 61 78 5f 65 72 72 6f 72 3b 0a 20 20 20 20  ntax_error;.    
30c60 20 20 69 66 28 20 70 53 65 73 73 69 6f 6e 2d 3e    if( pSession->
30c70 70 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65 73 73  p==0 ) goto sess
30c80 69 6f 6e 5f 6e 6f 74 5f 6f 70 65 6e 3b 0a 20 20  ion_not_open;.  
30c90 20 20 20 20 6f 75 74 20 3d 20 66 6f 70 65 6e 28      out = fopen(
30ca0 61 7a 43 6d 64 5b 31 5d 2c 20 22 77 62 22 29 3b  azCmd[1], "wb");
30cb0 0a 20 20 20 20 20 20 69 66 28 20 6f 75 74 3d 3d  .      if( out==
30cc0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66  0 ){.        utf
30cd0 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  8_printf(stderr,
30ce0 20 22 45 52 52 4f 52 3a 20 63 61 6e 6e 6f 74 20   "ERROR: cannot 
30cf0 6f 70 65 6e 20 5c 22 25 73 5c 22 20 66 6f 72 20  open \"%s\" for 
30d00 77 72 69 74 69 6e 67 5c 6e 22 2c 20 61 7a 43 6d  writing\n", azCm
30d10 64 5b 31 5d 29 3b 0a 20 20 20 20 20 20 7d 65 6c  d[1]);.      }el
30d20 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  se{.        int 
30d30 73 7a 43 68 6e 67 3b 0a 20 20 20 20 20 20 20 20  szChng;.        
30d40 76 6f 69 64 20 2a 70 43 68 6e 67 3b 0a 20 20 20  void *pChng;.   
30d50 20 20 20 20 20 69 66 28 20 61 7a 43 6d 64 5b 30       if( azCmd[0
30d60 5d 5b 30 5d 3d 3d 27 63 27 20 29 7b 0a 20 20 20  ][0]=='c' ){.   
30d70 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
30d80 74 65 33 73 65 73 73 69 6f 6e 5f 63 68 61 6e 67  te3session_chang
30d90 65 73 65 74 28 70 53 65 73 73 69 6f 6e 2d 3e 70  eset(pSession->p
30da0 2c 20 26 73 7a 43 68 6e 67 2c 20 26 70 43 68 6e  , &szChng, &pChn
30db0 67 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  g);.        }els
30dc0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  e{.          rc 
30dd0 3d 20 73 71 6c 69 74 65 33 73 65 73 73 69 6f 6e  = sqlite3session
30de0 5f 70 61 74 63 68 73 65 74 28 70 53 65 73 73 69  _patchset(pSessi
30df0 6f 6e 2d 3e 70 2c 20 26 73 7a 43 68 6e 67 2c 20  on->p, &szChng, 
30e00 26 70 43 68 6e 67 29 3b 0a 20 20 20 20 20 20 20  &pChng);.       
30e10 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 72   }.        if( r
30e20 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  c ){.          p
30e30 72 69 6e 74 66 28 22 45 72 72 6f 72 3a 20 65 72  rintf("Error: er
30e40 72 6f 72 20 63 6f 64 65 20 25 64 5c 6e 22 2c 20  ror code %d\n", 
30e50 72 63 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  rc);.          r
30e60 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  c = 0;.        }
30e70 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 43 68  .        if( pCh
30e80 6e 67 0a 20 20 20 20 20 20 20 20 20 20 26 26 20  ng.          && 
30e90 66 77 72 69 74 65 28 70 43 68 6e 67 2c 20 73 7a  fwrite(pChng, sz
30ea0 43 68 6e 67 2c 20 31 2c 20 6f 75 74 29 21 3d 31  Chng, 1, out)!=1
30eb0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 61   ){.          ra
30ec0 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  w_printf(stderr,
30ed0 20 22 45 52 52 4f 52 3a 20 46 61 69 6c 65 64 20   "ERROR: Failed 
30ee0 74 6f 20 77 72 69 74 65 20 65 6e 74 69 72 65 20  to write entire 
30ef0 25 64 2d 62 79 74 65 20 6f 75 74 70 75 74 5c 6e  %d-byte output\n
30f00 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
30f10 20 20 20 20 20 73 7a 43 68 6e 67 29 3b 0a 20 20       szChng);.  
30f20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
30f30 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 68  sqlite3_free(pCh
30f40 6e 67 29 3b 0a 20 20 20 20 20 20 20 20 66 63 6c  ng);.        fcl
30f50 6f 73 65 28 6f 75 74 29 3b 0a 20 20 20 20 20 20  ose(out);.      
30f60 7d 0a 20 20 20 20 7d 65 6c 73 65 0a 0a 20 20 20  }.    }else..   
30f70 20 2f 2a 20 2e 73 65 73 73 69 6f 6e 20 63 6c 6f   /* .session clo
30f80 73 65 0a 20 20 20 20 2a 2a 20 43 6c 6f 73 65 20  se.    ** Close 
30f90 74 68 65 20 69 64 65 6e 74 69 66 69 65 64 20 73  the identified s
30fa0 65 73 73 69 6f 6e 0a 20 20 20 20 2a 2f 0a 20 20  ession.    */.  
30fb0 20 20 69 66 28 20 73 74 72 63 6d 70 28 61 7a 43    if( strcmp(azC
30fc0 6d 64 5b 30 5d 2c 20 22 63 6c 6f 73 65 22 29 3d  md[0], "close")=
30fd0 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
30fe0 6e 43 6d 64 21 3d 31 20 29 20 67 6f 74 6f 20 73  nCmd!=1 ) goto s
30ff0 65 73 73 69 6f 6e 5f 73 79 6e 74 61 78 5f 65 72  ession_syntax_er
31000 72 6f 72 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ror;.      if( p
31010 2d 3e 6e 53 65 73 73 69 6f 6e 20 29 7b 0a 20 20  ->nSession ){.  
31020 20 20 20 20 20 20 73 65 73 73 69 6f 6e 5f 63 6c        session_cl
31030 6f 73 65 28 70 53 65 73 73 69 6f 6e 29 3b 0a 20  ose(pSession);. 
31040 20 20 20 20 20 20 20 70 2d 3e 61 53 65 73 73 69         p->aSessi
31050 6f 6e 5b 69 53 65 73 5d 20 3d 20 70 2d 3e 61 53  on[iSes] = p->aS
31060 65 73 73 69 6f 6e 5b 2d 2d 70 2d 3e 6e 53 65 73  ession[--p->nSes
31070 73 69 6f 6e 5d 3b 0a 20 20 20 20 20 20 7d 0a 20  sion];.      }. 
31080 20 20 20 7d 65 6c 73 65 0a 0a 20 20 20 20 2f 2a     }else..    /*
31090 20 2e 73 65 73 73 69 6f 6e 20 65 6e 61 62 6c 65   .session enable
310a0 20 3f 42 4f 4f 4c 45 41 4e 3f 0a 20 20 20 20 2a   ?BOOLEAN?.    *
310b0 2a 20 51 75 65 72 79 20 6f 72 20 73 65 74 20 74  * Query or set t
310c0 68 65 20 65 6e 61 62 6c 65 20 66 6c 61 67 0a 20  he enable flag. 
310d0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 74     */.    if( st
310e0 72 63 6d 70 28 61 7a 43 6d 64 5b 30 5d 2c 20 22  rcmp(azCmd[0], "
310f0 65 6e 61 62 6c 65 22 29 3d 3d 30 20 29 7b 0a 20  enable")==0 ){. 
31100 20 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20       int ii;.   
31110 20 20 20 69 66 28 20 6e 43 6d 64 3e 32 20 29 20     if( nCmd>2 ) 
31120 67 6f 74 6f 20 73 65 73 73 69 6f 6e 5f 73 79 6e  goto session_syn
31130 74 61 78 5f 65 72 72 6f 72 3b 0a 20 20 20 20 20  tax_error;.     
31140 20 69 69 20 3d 20 6e 43 6d 64 3d 3d 31 20 3f 20   ii = nCmd==1 ? 
31150 2d 31 20 3a 20 62 6f 6f 6c 65 61 6e 56 61 6c 75  -1 : booleanValu
31160 65 28 61 7a 43 6d 64 5b 31 5d 29 3b 0a 20 20 20  e(azCmd[1]);.   
31170 20 20 20 69 66 28 20 70 2d 3e 6e 53 65 73 73 69     if( p->nSessi
31180 6f 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 69 69  on ){.        ii
31190 20 3d 20 73 71 6c 69 74 65 33 73 65 73 73 69 6f   = sqlite3sessio
311a0 6e 5f 65 6e 61 62 6c 65 28 70 53 65 73 73 69 6f  n_enable(pSessio
311b0 6e 2d 3e 70 2c 20 69 69 29 3b 0a 20 20 20 20 20  n->p, ii);.     
311c0 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70     utf8_printf(p
311d0 2d 3e 6f 75 74 2c 20 22 73 65 73 73 69 6f 6e 20  ->out, "session 
311e0 25 73 20 65 6e 61 62 6c 65 20 66 6c 61 67 20 3d  %s enable flag =
311f0 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20   %d\n",.        
31200 20 20 20 20 20 20 20 20 20 20 20 20 70 53 65 73              pSes
31210 73 69 6f 6e 2d 3e 7a 4e 61 6d 65 2c 20 69 69 29  sion->zName, ii)
31220 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
31230 6c 73 65 0a 0a 20 20 20 20 2f 2a 20 2e 73 65 73  lse..    /* .ses
31240 73 69 6f 6e 20 66 69 6c 74 65 72 20 47 4c 4f 42  sion filter GLOB
31250 20 2e 2e 2e 2e 0a 20 20 20 20 2a 2a 20 53 65 74   .....    ** Set
31260 20 61 20 6c 69 73 74 20 6f 66 20 47 4c 4f 42 20   a list of GLOB 
31270 70 61 74 74 65 72 6e 73 20 6f 66 20 74 61 62 6c  patterns of tabl
31280 65 20 6e 61 6d 65 73 20 74 6f 20 62 65 20 65 78  e names to be ex
31290 63 6c 75 64 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  cluded..    */. 
312a0 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 61 7a     if( strcmp(az
312b0 43 6d 64 5b 30 5d 2c 20 22 66 69 6c 74 65 72 22  Cmd[0], "filter"
312c0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e  )==0 ){.      in
312d0 74 20 69 69 2c 20 6e 42 79 74 65 3b 0a 20 20 20  t ii, nByte;.   
312e0 20 20 20 69 66 28 20 6e 43 6d 64 3c 32 20 29 20     if( nCmd<2 ) 
312f0 67 6f 74 6f 20 73 65 73 73 69 6f 6e 5f 73 79 6e  goto session_syn
31300 74 61 78 5f 65 72 72 6f 72 3b 0a 20 20 20 20 20  tax_error;.     
31310 20 69 66 28 20 70 2d 3e 6e 53 65 73 73 69 6f 6e   if( p->nSession
31320 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28   ){.        for(
31330 69 69 3d 30 3b 20 69 69 3c 70 53 65 73 73 69 6f  ii=0; ii<pSessio
31340 6e 2d 3e 6e 46 69 6c 74 65 72 3b 20 69 69 2b 2b  n->nFilter; ii++
31350 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
31360 69 74 65 33 5f 66 72 65 65 28 70 53 65 73 73 69  ite3_free(pSessi
31370 6f 6e 2d 3e 61 7a 46 69 6c 74 65 72 5b 69 69 5d  on->azFilter[ii]
31380 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
31390 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
313a0 65 28 70 53 65 73 73 69 6f 6e 2d 3e 61 7a 46 69  e(pSession->azFi
313b0 6c 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20 6e  lter);.        n
313c0 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 70 53  Byte = sizeof(pS
313d0 65 73 73 69 6f 6e 2d 3e 61 7a 46 69 6c 74 65 72  ession->azFilter
313e0 5b 30 5d 29 2a 28 6e 43 6d 64 2d 31 29 3b 0a 20  [0])*(nCmd-1);. 
313f0 20 20 20 20 20 20 20 70 53 65 73 73 69 6f 6e 2d         pSession-
31400 3e 61 7a 46 69 6c 74 65 72 20 3d 20 73 71 6c 69  >azFilter = sqli
31410 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 6e 42 79 74  te3_malloc( nByt
31420 65 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  e );.        if(
31430 20 70 53 65 73 73 69 6f 6e 2d 3e 61 7a 46 69 6c   pSession->azFil
31440 74 65 72 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ter==0 ){.      
31450 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73      raw_printf(s
31460 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 6f  tderr, "Error: o
31470 75 74 20 6f 72 20 6d 65 6d 6f 72 79 5c 6e 22 29  ut or memory\n")
31480 3b 0a 20 20 20 20 20 20 20 20 20 20 65 78 69 74  ;.          exit
31490 28 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  (1);.        }. 
314a0 20 20 20 20 20 20 20 66 6f 72 28 69 69 3d 31 3b         for(ii=1;
314b0 20 69 69 3c 6e 43 6d 64 3b 20 69 69 2b 2b 29 7b   ii<nCmd; ii++){
314c0 0a 20 20 20 20 20 20 20 20 20 20 70 53 65 73 73  .          pSess
314d0 69 6f 6e 2d 3e 61 7a 46 69 6c 74 65 72 5b 69 69  ion->azFilter[ii
314e0 2d 31 5d 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  -1] = sqlite3_mp
314f0 72 69 6e 74 66 28 22 25 73 22 2c 20 61 7a 43 6d  rintf("%s", azCm
31500 64 5b 69 69 5d 29 3b 0a 20 20 20 20 20 20 20 20  d[ii]);.        
31510 7d 0a 20 20 20 20 20 20 20 20 70 53 65 73 73 69  }.        pSessi
31520 6f 6e 2d 3e 6e 46 69 6c 74 65 72 20 3d 20 69 69  on->nFilter = ii
31530 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  -1;.      }.    
31540 7d 65 6c 73 65 0a 0a 20 20 20 20 2f 2a 20 2e 73  }else..    /* .s
31550 65 73 73 69 6f 6e 20 69 6e 64 69 72 65 63 74 20  ession indirect 
31560 3f 42 4f 4f 4c 45 41 4e 3f 0a 20 20 20 20 2a 2a  ?BOOLEAN?.    **
31570 20 51 75 65 72 79 20 6f 72 20 73 65 74 20 74 68   Query or set th
31580 65 20 69 6e 64 69 72 65 63 74 20 66 6c 61 67 0a  e indirect flag.
31590 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73      */.    if( s
315a0 74 72 63 6d 70 28 61 7a 43 6d 64 5b 30 5d 2c 20  trcmp(azCmd[0], 
315b0 22 69 6e 64 69 72 65 63 74 22 29 3d 3d 30 20 29  "indirect")==0 )
315c0 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 69 3b 0a  {.      int ii;.
315d0 20 20 20 20 20 20 69 66 28 20 6e 43 6d 64 3e 32        if( nCmd>2
315e0 20 29 20 67 6f 74 6f 20 73 65 73 73 69 6f 6e 5f   ) goto session_
315f0 73 79 6e 74 61 78 5f 65 72 72 6f 72 3b 0a 20 20  syntax_error;.  
31600 20 20 20 20 69 69 20 3d 20 6e 43 6d 64 3d 3d 31      ii = nCmd==1
31610 20 3f 20 2d 31 20 3a 20 62 6f 6f 6c 65 61 6e 56   ? -1 : booleanV
31620 61 6c 75 65 28 61 7a 43 6d 64 5b 31 5d 29 3b 0a  alue(azCmd[1]);.
31630 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6e 53 65        if( p->nSe
31640 73 73 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 20  ssion ){.       
31650 20 69 69 20 3d 20 73 71 6c 69 74 65 33 73 65 73   ii = sqlite3ses
31660 73 69 6f 6e 5f 69 6e 64 69 72 65 63 74 28 70 53  sion_indirect(pS
31670 65 73 73 69 6f 6e 2d 3e 70 2c 20 69 69 29 3b 0a  ession->p, ii);.
31680 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69          utf8_pri
31690 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 73 65 73  ntf(p->out, "ses
316a0 73 69 6f 6e 20 25 73 20 69 6e 64 69 72 65 63 74  sion %s indirect
316b0 20 66 6c 61 67 20 3d 20 25 64 5c 6e 22 2c 0a 20   flag = %d\n",. 
316c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
316d0 20 20 20 70 53 65 73 73 69 6f 6e 2d 3e 7a 4e 61     pSession->zNa
316e0 6d 65 2c 20 69 69 29 3b 0a 20 20 20 20 20 20 7d  me, ii);.      }
316f0 0a 20 20 20 20 7d 65 6c 73 65 0a 0a 20 20 20 20  .    }else..    
31700 2f 2a 20 2e 73 65 73 73 69 6f 6e 20 69 73 65 6d  /* .session isem
31710 70 74 79 0a 20 20 20 20 2a 2a 20 44 65 74 65 72  pty.    ** Deter
31720 6d 69 6e 65 20 69 66 20 74 68 65 20 73 65 73 73  mine if the sess
31730 69 6f 6e 20 69 73 20 65 6d 70 74 79 0a 20 20 20  ion is empty.   
31740 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 74 72 63   */.    if( strc
31750 6d 70 28 61 7a 43 6d 64 5b 30 5d 2c 20 22 69 73  mp(azCmd[0], "is
31760 65 6d 70 74 79 22 29 3d 3d 30 20 29 7b 0a 20 20  empty")==0 ){.  
31770 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20      int ii;.    
31780 20 20 69 66 28 20 6e 43 6d 64 21 3d 31 20 29 20    if( nCmd!=1 ) 
31790 67 6f 74 6f 20 73 65 73 73 69 6f 6e 5f 73 79 6e  goto session_syn
317a0 74 61 78 5f 65 72 72 6f 72 3b 0a 20 20 20 20 20  tax_error;.     
317b0 20 69 66 28 20 70 2d 3e 6e 53 65 73 73 69 6f 6e   if( p->nSession
317c0 20 29 7b 0a 20 20 20 20 20 20 20 20 69 69 20 3d   ){.        ii =
317d0 20 73 71 6c 69 74 65 33 73 65 73 73 69 6f 6e 5f   sqlite3session_
317e0 69 73 65 6d 70 74 79 28 70 53 65 73 73 69 6f 6e  isempty(pSession
317f0 2d 3e 70 29 3b 0a 20 20 20 20 20 20 20 20 75 74  ->p);.        ut
31800 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  f8_printf(p->out
31810 2c 20 22 73 65 73 73 69 6f 6e 20 25 73 20 69 73  , "session %s is
31820 65 6d 70 74 79 20 66 6c 61 67 20 3d 20 25 64 5c  empty flag = %d\
31830 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
31840 20 20 20 20 20 20 20 20 70 53 65 73 73 69 6f 6e          pSession
31850 2d 3e 7a 4e 61 6d 65 2c 20 69 69 29 3b 0a 20 20  ->zName, ii);.  
31860 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 0a      }.    }else.
31870 0a 20 20 20 20 2f 2a 20 2e 73 65 73 73 69 6f 6e  .    /* .session
31880 20 6c 69 73 74 0a 20 20 20 20 2a 2a 20 4c 69 73   list.    ** Lis
31890 74 20 61 6c 6c 20 63 75 72 72 65 6e 74 6c 79 20  t all currently 
318a0 6f 70 65 6e 20 73 65 73 73 69 6f 6e 73 0a 20 20  open sessions.  
318b0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 74 72    */.    if( str
318c0 63 6d 70 28 61 7a 43 6d 64 5b 30 5d 2c 22 6c 69  cmp(azCmd[0],"li
318d0 73 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  st")==0 ){.     
318e0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
318f0 53 65 73 73 69 6f 6e 3b 20 69 2b 2b 29 7b 0a 20  Session; i++){. 
31900 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e         utf8_prin
31910 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 64 20 25  tf(p->out, "%d %
31920 73 5c 6e 22 2c 20 69 2c 20 70 2d 3e 61 53 65 73  s\n", i, p->aSes
31930 73 69 6f 6e 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a  sion[i].zName);.
31940 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
31950 65 0a 0a 20 20 20 20 2f 2a 20 2e 73 65 73 73 69  e..    /* .sessi
31960 6f 6e 20 6f 70 65 6e 20 44 42 20 4e 41 4d 45 0a  on open DB NAME.
31970 20 20 20 20 2a 2a 20 4f 70 65 6e 20 61 20 6e 65      ** Open a ne
31980 77 20 73 65 73 73 69 6f 6e 20 63 61 6c 6c 65 64  w session called
31990 20 4e 41 4d 45 20 6f 6e 20 74 68 65 20 61 74 74   NAME on the att
319a0 61 63 68 65 64 20 64 61 74 61 62 61 73 65 20 44  ached database D
319b0 42 2e 0a 20 20 20 20 2a 2a 20 44 42 20 69 73 20  B..    ** DB is 
319c0 6e 6f 72 6d 61 6c 6c 79 20 22 6d 61 69 6e 22 2e  normally "main".
319d0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
319e0 73 74 72 63 6d 70 28 61 7a 43 6d 64 5b 30 5d 2c  strcmp(azCmd[0],
319f0 22 6f 70 65 6e 22 29 3d 3d 30 20 29 7b 0a 20 20  "open")==0 ){.  
31a00 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b      char *zName;
31a10 0a 20 20 20 20 20 20 69 66 28 20 6e 43 6d 64 21  .      if( nCmd!
31a20 3d 33 20 29 20 67 6f 74 6f 20 73 65 73 73 69 6f  =3 ) goto sessio
31a30 6e 5f 73 79 6e 74 61 78 5f 65 72 72 6f 72 3b 0a  n_syntax_error;.
31a40 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 61 7a        zName = az
31a50 43 6d 64 5b 32 5d 3b 0a 20 20 20 20 20 20 69 66  Cmd[2];.      if
31a60 28 20 7a 4e 61 6d 65 5b 30 5d 3d 3d 30 20 29 20  ( zName[0]==0 ) 
31a70 67 6f 74 6f 20 73 65 73 73 69 6f 6e 5f 73 79 6e  goto session_syn
31a80 74 61 78 5f 65 72 72 6f 72 3b 0a 20 20 20 20 20  tax_error;.     
31a90 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
31aa0 53 65 73 73 69 6f 6e 3b 20 69 2b 2b 29 7b 0a 20  Session; i++){. 
31ab0 20 20 20 20 20 20 20 69 66 28 20 73 74 72 63 6d         if( strcm
31ac0 70 28 70 2d 3e 61 53 65 73 73 69 6f 6e 5b 69 5d  p(p->aSession[i]
31ad0 2e 7a 4e 61 6d 65 2c 7a 4e 61 6d 65 29 3d 3d 30  .zName,zName)==0
31ae0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 74   ){.          ut
31af0 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  f8_printf(stderr
31b00 2c 20 22 53 65 73 73 69 6f 6e 20 5c 22 25 73 5c  , "Session \"%s\
31b10 22 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73  " already exists
31b20 5c 6e 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  \n", zName);.   
31b30 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 65 74 61         goto meta
31b40 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20  _command_exit;. 
31b50 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
31b60 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6e 53  .      if( p->nS
31b70 65 73 73 69 6f 6e 3e 3d 41 72 72 61 79 53 69 7a  ession>=ArraySiz
31b80 65 28 70 2d 3e 61 53 65 73 73 69 6f 6e 29 20 29  e(p->aSession) )
31b90 7b 0a 20 20 20 20 20 20 20 20 72 61 77 5f 70 72  {.        raw_pr
31ba0 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 4d 61  intf(stderr, "Ma
31bb0 78 69 6d 75 6d 20 6f 66 20 25 64 20 73 65 73 73  ximum of %d sess
31bc0 69 6f 6e 73 5c 6e 22 2c 20 41 72 72 61 79 53 69  ions\n", ArraySi
31bd0 7a 65 28 70 2d 3e 61 53 65 73 73 69 6f 6e 29 29  ze(p->aSession))
31be0 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d  ;.        goto m
31bf0 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74  eta_command_exit
31c00 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
31c10 70 53 65 73 73 69 6f 6e 20 3d 20 26 70 2d 3e 61  pSession = &p->a
31c20 53 65 73 73 69 6f 6e 5b 70 2d 3e 6e 53 65 73 73  Session[p->nSess
31c30 69 6f 6e 5d 3b 0a 20 20 20 20 20 20 72 63 20 3d  ion];.      rc =
31c40 20 73 71 6c 69 74 65 33 73 65 73 73 69 6f 6e 5f   sqlite3session_
31c50 63 72 65 61 74 65 28 70 2d 3e 64 62 2c 20 61 7a  create(p->db, az
31c60 43 6d 64 5b 31 5d 2c 20 26 70 53 65 73 73 69 6f  Cmd[1], &pSessio
31c70 6e 2d 3e 70 29 3b 0a 20 20 20 20 20 20 69 66 28  n->p);.      if(
31c80 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 72   rc ){.        r
31c90 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  aw_printf(stderr
31ca0 2c 20 22 43 61 6e 6e 6f 74 20 6f 70 65 6e 20 73  , "Cannot open s
31cb0 65 73 73 69 6f 6e 3a 20 65 72 72 6f 72 20 63 6f  ession: error co
31cc0 64 65 3d 25 64 5c 6e 22 2c 20 72 63 29 3b 0a 20  de=%d\n", rc);. 
31cd0 20 20 20 20 20 20 20 72 63 20 3d 20 30 3b 0a 20         rc = 0;. 
31ce0 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 65 74 61         goto meta
31cf0 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20  _command_exit;. 
31d00 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 53 65       }.      pSe
31d10 73 73 69 6f 6e 2d 3e 6e 46 69 6c 74 65 72 20 3d  ssion->nFilter =
31d20 20 30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   0;.      sqlite
31d30 33 73 65 73 73 69 6f 6e 5f 74 61 62 6c 65 5f 66  3session_table_f
31d40 69 6c 74 65 72 28 70 53 65 73 73 69 6f 6e 2d 3e  ilter(pSession->
31d50 70 2c 20 73 65 73 73 69 6f 6e 5f 66 69 6c 74 65  p, session_filte
31d60 72 2c 20 70 53 65 73 73 69 6f 6e 29 3b 0a 20 20  r, pSession);.  
31d70 20 20 20 20 70 2d 3e 6e 53 65 73 73 69 6f 6e 2b      p->nSession+
31d80 2b 3b 0a 20 20 20 20 20 20 70 53 65 73 73 69 6f  +;.      pSessio
31d90 6e 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74  n->zName = sqlit
31da0 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 22 2c  e3_mprintf("%s",
31db0 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c   zName);.    }el
31dc0 73 65 0a 20 20 20 20 2f 2a 20 49 66 20 6e 6f 20  se.    /* If no 
31dd0 63 6f 6d 6d 61 6e 64 20 6e 61 6d 65 20 6d 61 74  command name mat
31de0 63 68 65 73 2c 20 73 68 6f 77 20 61 20 73 79 6e  ches, show a syn
31df0 74 61 78 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20  tax error */.   
31e00 20 73 65 73 73 69 6f 6e 5f 73 79 6e 74 61 78 5f   session_syntax_
31e10 65 72 72 6f 72 3a 0a 20 20 20 20 73 65 73 73 69  error:.    sessi
31e20 6f 6e 5f 68 65 6c 70 28 70 29 3b 0a 20 20 7d 65  on_help(p);.  }e
31e30 6c 73 65 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64  lse.#endif..#ifd
31e40 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
31e50 20 20 2f 2a 20 55 6e 64 6f 63 75 6d 65 6e 74 65    /* Undocumente
31e60 64 20 63 6f 6d 6d 61 6e 64 73 20 66 6f 72 20 69  d commands for i
31e70 6e 74 65 72 6e 61 6c 20 74 65 73 74 69 6e 67 2e  nternal testing.
31e80 20 20 53 75 62 6a 65 63 74 20 74 6f 20 63 68 61    Subject to cha
31e90 6e 67 65 0a 20 20 2a 2a 20 77 69 74 68 6f 75 74  nge.  ** without
31ea0 20 6e 6f 74 69 63 65 2e 20 2a 2f 0a 20 20 69 66   notice. */.  if
31eb0 28 20 63 3d 3d 27 73 27 20 26 26 20 6e 3e 3d 31  ( c=='s' && n>=1
31ec0 30 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41  0 && strncmp(azA
31ed0 72 67 5b 30 5d 2c 20 22 73 65 6c 66 74 65 73 74  rg[0], "selftest
31ee0 2d 22 2c 20 39 29 3d 3d 30 20 29 7b 0a 20 20 20  -", 9)==0 ){.   
31ef0 20 69 66 28 20 73 74 72 6e 63 6d 70 28 61 7a 41   if( strncmp(azA
31f00 72 67 5b 30 5d 2b 39 2c 20 22 62 6f 6f 6c 65 61  rg[0]+9, "boolea
31f10 6e 22 2c 20 6e 2d 39 29 3d 3d 30 20 29 7b 0a 20  n", n-9)==0 ){. 
31f20 20 20 20 20 20 69 6e 74 20 69 2c 20 76 3b 0a 20       int i, v;. 
31f30 20 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c       for(i=1; i<
31f40 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nArg; i++){.    
31f50 20 20 20 20 76 20 3d 20 62 6f 6f 6c 65 61 6e 56      v = booleanV
31f60 61 6c 75 65 28 61 7a 41 72 67 5b 69 5d 29 3b 0a  alue(azArg[i]);.
31f70 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69          utf8_pri
31f80 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 3a  ntf(p->out, "%s:
31f90 20 25 64 20 30 78 25 78 5c 6e 22 2c 20 61 7a 41   %d 0x%x\n", azA
31fa0 72 67 5b 69 5d 2c 20 76 2c 20 76 29 3b 0a 20 20  rg[i], v, v);.  
31fb0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
31fc0 69 66 28 20 73 74 72 6e 63 6d 70 28 61 7a 41 72  if( strncmp(azAr
31fd0 67 5b 30 5d 2b 39 2c 20 22 69 6e 74 65 67 65 72  g[0]+9, "integer
31fe0 22 2c 20 6e 2d 39 29 3d 3d 30 20 29 7b 0a 20 20  ", n-9)==0 ){.  
31ff0 20 20 20 20 69 6e 74 20 69 3b 20 73 71 6c 69 74      int i; sqlit
32000 65 33 5f 69 6e 74 36 34 20 76 3b 0a 20 20 20 20  e3_int64 v;.    
32010 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 41 72    for(i=1; i<nAr
32020 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  g; i++){.       
32030 20 63 68 61 72 20 7a 42 75 66 5b 32 30 30 5d 3b   char zBuf[200];
32040 0a 20 20 20 20 20 20 20 20 76 20 3d 20 69 6e 74  .        v = int
32050 65 67 65 72 56 61 6c 75 65 28 61 7a 41 72 67 5b  egerValue(azArg[
32060 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  i]);.        sql
32070 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
32080 7a 65 6f 66 28 7a 42 75 66 29 2c 7a 42 75 66 2c  zeof(zBuf),zBuf,
32090 22 25 73 3a 20 25 6c 6c 64 20 30 78 25 6c 6c 78  "%s: %lld 0x%llx
320a0 5c 6e 22 2c 20 61 7a 41 72 67 5b 69 5d 2c 76 2c  \n", azArg[i],v,
320b0 76 29 3b 0a 20 20 20 20 20 20 20 20 75 74 66 38  v);.        utf8
320c0 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
320d0 22 25 73 22 2c 20 7a 42 75 66 29 3b 0a 20 20 20  "%s", zBuf);.   
320e0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c     }.    }.  }el
320f0 73 65 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28  se.#endif..  if(
32100 20 63 3d 3d 27 73 27 20 26 26 20 6e 3e 3d 34 20   c=='s' && n>=4 
32110 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67  && strncmp(azArg
32120 5b 30 5d 2c 22 73 65 6c 66 74 65 73 74 22 2c 6e  [0],"selftest",n
32130 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20  )==0 ){.    int 
32140 62 49 73 49 6e 69 74 20 3d 20 30 3b 20 20 20 20  bIsInit = 0;    
32150 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20       /* True to 
32160 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 53  initialize the S
32170 45 4c 46 54 45 53 54 20 74 61 62 6c 65 20 2a 2f  ELFTEST table */
32180 0a 20 20 20 20 69 6e 74 20 62 56 65 72 62 6f 73  .    int bVerbos
32190 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a  e = 0;        /*
321a0 20 56 65 72 62 6f 73 65 20 6f 75 74 70 75 74 20   Verbose output 
321b0 2a 2f 0a 20 20 20 20 69 6e 74 20 62 53 65 6c 66  */.    int bSelf
321c0 74 65 73 74 45 78 69 73 74 73 3b 20 20 20 20 20  testExists;     
321d0 2f 2a 20 54 72 75 65 20 69 66 20 53 45 4c 46 54  /* True if SELFT
321e0 45 53 54 20 61 6c 72 65 61 64 79 20 65 78 69 73  EST already exis
321f0 74 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 2c  ts */.    int i,
32200 20 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   k;             
32210 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
32220 65 72 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  ers */.    int n
32230 54 65 73 74 20 3d 20 30 3b 20 20 20 20 20 20 20  Test = 0;       
32240 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
32250 20 74 65 73 74 73 20 72 75 6e 73 20 2a 2f 0a 20   tests runs */. 
32260 20 20 20 69 6e 74 20 6e 45 72 72 20 3d 20 30 3b     int nErr = 0;
32270 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
32280 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73 20  umber of errors 
32290 73 65 65 6e 20 2a 2f 0a 20 20 20 20 53 68 65 6c  seen */.    Shel
322a0 6c 54 65 78 74 20 73 74 72 3b 20 20 20 20 20 20  lText str;      
322b0 20 20 20 20 20 2f 2a 20 41 6e 73 77 65 72 20 66       /* Answer f
322c0 6f 72 20 61 20 71 75 65 72 79 20 2a 2f 0a 20 20  or a query */.  
322d0 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
322e0 70 53 74 6d 74 20 3d 20 30 3b 20 2f 2a 20 51 75  pStmt = 0; /* Qu
322f0 65 72 79 20 61 67 61 69 6e 73 74 20 74 68 65 20  ery against the 
32300 53 45 4c 46 54 45 53 54 20 74 61 62 6c 65 20 2a  SELFTEST table *
32310 2f 0a 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28 70  /..    open_db(p
32320 2c 30 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 31  ,0);.    for(i=1
32330 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a  ; i<nArg; i++){.
32340 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
32350 20 2a 7a 20 3d 20 61 7a 41 72 67 5b 69 5d 3b 0a   *z = azArg[i];.
32360 20 20 20 20 20 20 69 66 28 20 7a 5b 30 5d 3d 3d        if( z[0]==
32370 27 2d 27 20 26 26 20 7a 5b 31 5d 3d 3d 27 2d 27  '-' && z[1]=='-'
32380 20 29 20 7a 2b 2b 3b 0a 20 20 20 20 20 20 69 66   ) z++;.      if
32390 28 20 73 74 72 63 6d 70 28 7a 2c 22 2d 69 6e 69  ( strcmp(z,"-ini
323a0 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  t")==0 ){.      
323b0 20 20 62 49 73 49 6e 69 74 20 3d 20 31 3b 0a 20    bIsInit = 1;. 
323c0 20 20 20 20 20 7d 65 6c 73 65 0a 20 20 20 20 20       }else.     
323d0 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 22 2d   if( strcmp(z,"-
323e0 76 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  v")==0 ){.      
323f0 20 20 62 56 65 72 62 6f 73 65 2b 2b 3b 0a 20 20    bVerbose++;.  
32400 20 20 20 20 7d 65 6c 73 65 0a 20 20 20 20 20 20      }else.      
32410 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70  {.        utf8_p
32420 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55  rintf(stderr, "U
32430 6e 6b 6e 6f 77 6e 20 6f 70 74 69 6f 6e 20 5c 22  nknown option \"
32440 25 73 5c 22 20 6f 6e 20 5c 22 25 73 5c 22 5c 6e  %s\" on \"%s\"\n
32450 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
32460 20 20 20 20 20 20 20 61 7a 41 72 67 5b 69 5d 2c         azArg[i],
32470 20 61 7a 41 72 67 5b 30 5d 29 3b 0a 20 20 20 20   azArg[0]);.    
32480 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73      raw_printf(s
32490 74 64 65 72 72 2c 20 22 53 68 6f 75 6c 64 20 62  tderr, "Should b
324a0 65 20 6f 6e 65 20 6f 66 3a 20 2d 2d 69 6e 69 74  e one of: --init
324b0 20 2d 76 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20   -v\n");.       
324c0 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20   rc = 1;.       
324d0 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61   goto meta_comma
324e0 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 7d  nd_exit;.      }
324f0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73  .    }.    if( s
32500 71 6c 69 74 65 33 5f 74 61 62 6c 65 5f 63 6f 6c  qlite3_table_col
32510 75 6d 6e 5f 6d 65 74 61 64 61 74 61 28 70 2d 3e  umn_metadata(p->
32520 64 62 2c 22 6d 61 69 6e 22 2c 22 73 65 6c 66 74  db,"main","selft
32530 65 73 74 22 2c 30 2c 30 2c 30 2c 30 2c 30 2c 30  est",0,0,0,0,0,0
32540 29 0a 20 20 20 20 20 20 20 20 20 20 20 21 3d 20  ).           != 
32550 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
32560 20 20 20 62 53 65 6c 66 74 65 73 74 45 78 69 73     bSelftestExis
32570 74 73 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  ts = 0;.    }els
32580 65 7b 0a 20 20 20 20 20 20 62 53 65 6c 66 74 65  e{.      bSelfte
32590 73 74 45 78 69 73 74 73 20 3d 20 31 3b 0a 20 20  stExists = 1;.  
325a0 20 20 7d 0a 20 20 20 20 69 66 28 20 62 49 73 49    }.    if( bIsI
325b0 6e 69 74 20 29 7b 0a 20 20 20 20 20 20 63 72 65  nit ){.      cre
325c0 61 74 65 53 65 6c 66 74 65 73 74 54 61 62 6c 65  ateSelftestTable
325d0 28 70 29 3b 0a 20 20 20 20 20 20 62 53 65 6c 66  (p);.      bSelf
325e0 74 65 73 74 45 78 69 73 74 73 20 3d 20 31 3b 0a  testExists = 1;.
325f0 20 20 20 20 7d 0a 20 20 20 20 69 6e 69 74 54 65      }.    initTe
32600 78 74 28 26 73 74 72 29 3b 0a 20 20 20 20 61 70  xt(&str);.    ap
32610 70 65 6e 64 54 65 78 74 28 26 73 74 72 2c 20 22  pendText(&str, "
32620 78 22 2c 20 30 29 3b 0a 20 20 20 20 66 6f 72 28  x", 0);.    for(
32630 6b 3d 62 53 65 6c 66 74 65 73 74 45 78 69 73 74  k=bSelftestExist
32640 73 3b 20 6b 3e 3d 30 3b 20 6b 2d 2d 29 7b 0a 20  s; k>=0; k--){. 
32650 20 20 20 20 20 69 66 28 20 6b 3d 3d 31 20 29 7b       if( k==1 ){
32660 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
32670 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32  lite3_prepare_v2
32680 28 70 2d 3e 64 62 2c 0a 20 20 20 20 20 20 20 20  (p->db,.        
32690 20 20 20 20 22 53 45 4c 45 43 54 20 74 6e 6f 2c      "SELECT tno,
326a0 6f 70 2c 63 6d 64 2c 61 6e 73 20 46 52 4f 4d 20  op,cmd,ans FROM 
326b0 73 65 6c 66 74 65 73 74 20 4f 52 44 45 52 20 42  selftest ORDER B
326c0 59 20 74 6e 6f 22 2c 0a 20 20 20 20 20 20 20 20  Y tno",.        
326d0 20 20 20 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20      -1, &pStmt, 
326e0 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  0);.      }else{
326f0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
32700 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32  lite3_prepare_v2
32710 28 70 2d 3e 64 62 2c 0a 20 20 20 20 20 20 20 20  (p->db,.        
32720 20 20 22 56 41 4c 55 45 53 28 30 2c 27 6d 65 6d    "VALUES(0,'mem
32730 6f 27 2c 27 4d 69 73 73 69 6e 67 20 53 45 4c 46  o','Missing SELF
32740 54 45 53 54 20 74 61 62 6c 65 20 2d 20 64 65 66  TEST table - def
32750 61 75 6c 74 20 63 68 65 63 6b 73 20 6f 6e 6c 79  ault checks only
32760 27 2c 27 27 29 2c 22 0a 20 20 20 20 20 20 20 20  ',''),".        
32770 20 20 22 20 20 20 20 20 20 28 31 2c 27 72 75 6e    "      (1,'run
32780 27 2c 27 50 52 41 47 4d 41 20 69 6e 74 65 67 72  ','PRAGMA integr
32790 69 74 79 5f 63 68 65 63 6b 27 2c 27 6f 6b 27 29  ity_check','ok')
327a0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 2d 31 2c  ",.          -1,
327b0 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20   &pStmt, 0);.   
327c0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72     }.      if( r
327d0 63 20 29 7b 0a 20 20 20 20 20 20 20 20 72 61 77  c ){.        raw
327e0 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
327f0 22 45 72 72 6f 72 20 71 75 65 72 79 69 6e 67 20  "Error querying 
32800 74 68 65 20 73 65 6c 66 74 65 73 74 20 74 61 62  the selftest tab
32810 6c 65 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20 20  le\n");.        
32820 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  rc = 1;.        
32830 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
32840 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 20  (pStmt);.       
32850 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61   goto meta_comma
32860 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 7d  nd_exit;.      }
32870 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 31 3b 20  .      for(i=1; 
32880 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74  sqlite3_step(pSt
32890 6d 74 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 3b  mt)==SQLITE_ROW;
328a0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   i++){.        i
328b0 6e 74 20 74 6e 6f 20 3d 20 73 71 6c 69 74 65 33  nt tno = sqlite3
328c0 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 74 6d  _column_int(pStm
328d0 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 63  t, 0);.        c
328e0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 70 20 3d  onst char *zOp =
328f0 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71   (const char*)sq
32900 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
32910 74 28 70 53 74 6d 74 2c 20 31 29 3b 0a 20 20 20  t(pStmt, 1);.   
32920 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
32930 2a 7a 53 71 6c 20 3d 20 28 63 6f 6e 73 74 20 63  *zSql = (const c
32940 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c  har*)sqlite3_col
32950 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 20  umn_text(pStmt, 
32960 32 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73  2);.        cons
32970 74 20 63 68 61 72 20 2a 7a 41 6e 73 20 3d 20 28  t char *zAns = (
32980 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69  const char*)sqli
32990 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28  te3_column_text(
329a0 70 53 74 6d 74 2c 20 33 29 3b 0a 0a 20 20 20 20  pStmt, 3);..    
329b0 20 20 20 20 6b 20 3d 20 30 3b 0a 20 20 20 20 20      k = 0;.     
329c0 20 20 20 69 66 28 20 62 56 65 72 62 6f 73 65 3e     if( bVerbose>
329d0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63  0 ){.          c
329e0 68 61 72 20 2a 7a 51 75 6f 74 65 20 3d 20 73 71  har *zQuote = sq
329f0 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25  lite3_mprintf("%
32a00 71 22 2c 20 7a 53 71 6c 29 3b 0a 20 20 20 20 20  q", zSql);.     
32a10 20 20 20 20 20 70 72 69 6e 74 66 28 22 25 64 3a       printf("%d:
32a20 20 25 73 20 25 73 5c 6e 22 2c 20 74 6e 6f 2c 20   %s %s\n", tno, 
32a30 7a 4f 70 2c 20 7a 53 71 6c 29 3b 0a 20 20 20 20  zOp, zSql);.    
32a40 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
32a50 65 65 28 7a 51 75 6f 74 65 29 3b 0a 20 20 20 20  ee(zQuote);.    
32a60 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
32a70 28 20 73 74 72 63 6d 70 28 7a 4f 70 2c 22 6d 65  ( strcmp(zOp,"me
32a80 6d 6f 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  mo")==0 ){.     
32a90 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
32aa0 28 70 2d 3e 6f 75 74 2c 20 22 25 73 5c 6e 22 2c  (p->out, "%s\n",
32ab0 20 7a 53 71 6c 29 3b 0a 20 20 20 20 20 20 20 20   zSql);.        
32ac0 7d 65 6c 73 65 0a 20 20 20 20 20 20 20 20 69 66  }else.        if
32ad0 28 20 73 74 72 63 6d 70 28 7a 4f 70 2c 22 72 75  ( strcmp(zOp,"ru
32ae0 6e 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  n")==0 ){.      
32af0 20 20 20 20 63 68 61 72 20 2a 7a 45 72 72 4d 73      char *zErrMs
32b00 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  g = 0;.         
32b10 20 73 74 72 2e 6e 20 3d 20 30 3b 0a 20 20 20 20   str.n = 0;.    
32b20 20 20 20 20 20 20 73 74 72 2e 7a 5b 30 5d 20 3d        str.z[0] =
32b30 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63   0;.          rc
32b40 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28   = sqlite3_exec(
32b50 70 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 63 61 70  p->db, zSql, cap
32b60 74 75 72 65 4f 75 74 70 75 74 43 61 6c 6c 62 61  tureOutputCallba
32b70 63 6b 2c 20 26 73 74 72 2c 20 26 7a 45 72 72 4d  ck, &str, &zErrM
32b80 73 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6e  sg);.          n
32b90 54 65 73 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20  Test++;.        
32ba0 20 20 69 66 28 20 62 56 65 72 62 6f 73 65 20 29    if( bVerbose )
32bb0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 75 74  {.            ut
32bc0 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  f8_printf(p->out
32bd0 2c 20 22 52 65 73 75 6c 74 3a 20 25 73 5c 6e 22  , "Result: %s\n"
32be0 2c 20 73 74 72 2e 7a 29 3b 0a 20 20 20 20 20 20  , str.z);.      
32bf0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
32c00 69 66 28 20 72 63 20 7c 7c 20 7a 45 72 72 4d 73  if( rc || zErrMs
32c10 67 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  g ){.           
32c20 20 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 20   nErr++;.       
32c30 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20       rc = 1;.   
32c40 20 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72           utf8_pr
32c50 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 64  intf(p->out, "%d
32c60 3a 20 65 72 72 6f 72 2d 63 6f 64 65 2d 25 64 3a  : error-code-%d:
32c70 20 25 73 5c 6e 22 2c 20 74 6e 6f 2c 20 72 63 2c   %s\n", tno, rc,
32c80 20 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20   zErrMsg);.     
32c90 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
32ca0 72 65 65 28 7a 45 72 72 4d 73 67 29 3b 0a 20 20  ree(zErrMsg);.  
32cb0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
32cc0 28 20 73 74 72 63 6d 70 28 7a 41 6e 73 2c 73 74  ( strcmp(zAns,st
32cd0 72 2e 7a 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  r.z)!=0 ){.     
32ce0 20 20 20 20 20 20 20 6e 45 72 72 2b 2b 3b 0a 20         nErr++;. 
32cf0 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
32d00 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 75  1;.            u
32d10 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  tf8_printf(p->ou
32d20 74 2c 20 22 25 64 3a 20 45 78 70 65 63 74 65 64  t, "%d: Expected
32d30 3a 20 5b 25 73 5d 5c 6e 22 2c 20 74 6e 6f 2c 20  : [%s]\n", tno, 
32d40 7a 41 6e 73 29 3b 0a 20 20 20 20 20 20 20 20 20  zAns);.         
32d50 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70     utf8_printf(p
32d60 2d 3e 6f 75 74 2c 20 22 25 64 3a 20 20 20 20 20  ->out, "%d:     
32d70 20 47 6f 74 3a 20 5b 25 73 5d 5c 6e 22 2c 20 74   Got: [%s]\n", t
32d80 6e 6f 2c 20 73 74 72 2e 7a 29 3b 0a 20 20 20 20  no, str.z);.    
32d90 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
32da0 7d 65 6c 73 65 0a 20 20 20 20 20 20 20 20 7b 0a  }else.        {.
32db0 20 20 20 20 20 20 20 20 20 20 75 74 66 38 5f 70            utf8_p
32dc0 72 69 6e 74 66 28 73 74 64 65 72 72 2c 0a 20 20  rintf(stderr,.  
32dd0 20 20 20 20 20 20 20 20 20 20 22 55 6e 6b 6e 6f            "Unkno
32de0 77 6e 20 6f 70 65 72 61 74 69 6f 6e 20 5c 22 25  wn operation \"%
32df0 73 5c 22 20 6f 6e 20 73 65 6c 66 74 65 73 74 20  s\" on selftest 
32e00 6c 69 6e 65 20 25 64 5c 6e 22 2c 20 7a 4f 70 2c  line %d\n", zOp,
32e10 20 74 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 20   tno);.         
32e20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20   rc = 1;.       
32e30 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
32e40 20 20 7d 0a 20 20 20 20 20 20 7d 20 2f 2a 20 45    }.      } /* E
32e50 6e 64 20 6c 6f 6f 70 20 6f 76 65 72 20 72 6f 77  nd loop over row
32e60 73 20 6f 66 20 63 6f 6e 74 65 6e 74 20 66 72 6f  s of content fro
32e70 6d 20 53 45 4c 46 54 45 53 54 20 2a 2f 0a 20 20  m SELFTEST */.  
32e80 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61      sqlite3_fina
32e90 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20  lize(pStmt);.   
32ea0 20 7d 20 2f 2a 20 45 6e 64 20 6c 6f 6f 70 20 6f   } /* End loop o
32eb0 76 65 72 20 6b 20 2a 2f 0a 20 20 20 20 66 72 65  ver k */.    fre
32ec0 65 54 65 78 74 28 26 73 74 72 29 3b 0a 20 20 20  eText(&str);.   
32ed0 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e   utf8_printf(p->
32ee0 6f 75 74 2c 20 22 25 64 20 65 72 72 6f 72 73 20  out, "%d errors 
32ef0 6f 75 74 20 6f 66 20 25 64 20 74 65 73 74 73 5c  out of %d tests\
32f00 6e 22 2c 20 6e 45 72 72 2c 20 6e 54 65 73 74 29  n", nErr, nTest)
32f10 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28  ;.  }else..  if(
32f20 20 63 3d 3d 27 73 27 20 26 26 20 73 74 72 6e 63   c=='s' && strnc
32f30 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 73 65  mp(azArg[0], "se
32f40 70 61 72 61 74 6f 72 22 2c 20 6e 29 3d 3d 30 20  parator", n)==0 
32f50 29 7b 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3c  ){.    if( nArg<
32f60 32 20 7c 7c 20 6e 41 72 67 3e 33 20 29 7b 0a 20  2 || nArg>3 ){. 
32f70 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
32f80 73 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20  stderr, "Usage: 
32f90 2e 73 65 70 61 72 61 74 6f 72 20 43 4f 4c 20 3f  .separator COL ?
32fa0 52 4f 57 3f 5c 6e 22 29 3b 0a 20 20 20 20 20 20  ROW?\n");.      
32fb0 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  rc = 1;.    }.  
32fc0 20 20 69 66 28 20 6e 41 72 67 3e 3d 32 20 29 7b    if( nArg>=2 ){
32fd0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
32fe0 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 70  nprintf(sizeof(p
32ff0 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 29 2c  ->colSeparator),
33000 20 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72   p->colSeparator
33010 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
33020 20 20 20 20 20 20 20 20 20 22 25 2e 2a 73 22 2c           "%.*s",
33030 20 28 69 6e 74 29 41 72 72 61 79 53 69 7a 65 28   (int)ArraySize(
33040 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 29  p->colSeparator)
33050 2d 31 2c 20 61 7a 41 72 67 5b 31 5d 29 3b 0a 20  -1, azArg[1]);. 
33060 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 41 72     }.    if( nAr
33070 67 3e 3d 33 20 29 7b 0a 20 20 20 20 20 20 73 71  g>=3 ){.      sq
33080 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
33090 69 7a 65 6f 66 28 70 2d 3e 72 6f 77 53 65 70 61  izeof(p->rowSepa
330a0 72 61 74 6f 72 29 2c 20 70 2d 3e 72 6f 77 53 65  rator), p->rowSe
330b0 70 61 72 61 74 6f 72 2c 0a 20 20 20 20 20 20 20  parator,.       
330c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
330d0 22 25 2e 2a 73 22 2c 20 28 69 6e 74 29 41 72 72  "%.*s", (int)Arr
330e0 61 79 53 69 7a 65 28 70 2d 3e 72 6f 77 53 65 70  aySize(p->rowSep
330f0 61 72 61 74 6f 72 29 2d 31 2c 20 61 7a 41 72 67  arator)-1, azArg
33100 5b 32 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  [2]);.    }.  }e
33110 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 73  lse..  if( c=='s
33120 27 20 26 26 20 6e 3e 3d 34 20 26 26 20 73 74 72  ' && n>=4 && str
33130 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 22 73  ncmp(azArg[0],"s
33140 68 61 33 73 75 6d 22 2c 6e 29 3d 3d 30 20 29 7b  ha3sum",n)==0 ){
33150 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
33160 2a 7a 4c 69 6b 65 20 3d 20 30 3b 20 20 20 2f 2a  *zLike = 0;   /*
33170 20 57 68 69 63 68 20 74 61 62 6c 65 20 74 6f 20   Which table to 
33180 63 68 65 63 6b 73 75 6d 2e 20 30 20 6d 65 61 6e  checksum. 0 mean
33190 73 20 65 76 65 72 79 74 68 69 6e 67 20 2a 2f 0a  s everything */.
331a0 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20      int i;      
331b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
331c0 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
331d0 20 20 20 20 69 6e 74 20 62 53 63 68 65 6d 61 20      int bSchema 
331e0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  = 0;         /* 
331f0 41 6c 73 6f 20 68 61 73 68 20 74 68 65 20 73 63  Also hash the sc
33200 68 65 6d 61 20 2a 2f 0a 20 20 20 20 69 6e 74 20  hema */.    int 
33210 62 53 65 70 61 72 61 74 65 20 3d 20 30 3b 20 20  bSeparate = 0;  
33220 20 20 20 20 20 2f 2a 20 48 61 73 68 20 65 61 63       /* Hash eac
33230 68 20 74 61 62 6c 65 20 73 65 70 61 72 61 74 65  h table separate
33240 6c 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 53  ly */.    int iS
33250 69 7a 65 20 3d 20 32 32 34 3b 20 20 20 20 20 20  ize = 224;      
33260 20 20 20 2f 2a 20 48 61 73 68 20 61 6c 67 6f 72     /* Hash algor
33270 69 74 68 6d 20 74 6f 20 75 73 65 20 2a 2f 0a 20  ithm to use */. 
33280 20 20 20 69 6e 74 20 62 44 65 62 75 67 20 3d 20     int bDebug = 
33290 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f  0;          /* O
332a0 6e 6c 79 20 73 68 6f 77 20 74 68 65 20 71 75 65  nly show the que
332b0 72 79 20 74 68 61 74 20 77 6f 75 6c 64 20 68 61  ry that would ha
332c0 76 65 20 72 75 6e 20 2a 2f 0a 20 20 20 20 73 71  ve run */.    sq
332d0 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
332e0 74 3b 20 20 20 20 20 2f 2a 20 46 6f 72 20 71 75  t;     /* For qu
332f0 65 72 79 69 6e 67 20 74 61 62 6c 65 73 20 6e 61  erying tables na
33300 6d 65 73 20 2a 2f 0a 20 20 20 20 63 68 61 72 20  mes */.    char 
33310 2a 7a 53 71 6c 3b 20 20 20 20 20 20 20 20 20 20  *zSql;          
33320 20 20 20 20 2f 2a 20 53 51 4c 20 74 6f 20 62 65      /* SQL to be
33330 20 72 75 6e 20 2a 2f 0a 20 20 20 20 63 68 61 72   run */.    char
33340 20 2a 7a 53 65 70 3b 20 20 20 20 20 20 20 20 20   *zSep;         
33350 20 20 20 20 20 2f 2a 20 53 65 70 61 72 61 74 6f       /* Separato
33360 72 20 2a 2f 0a 20 20 20 20 53 68 65 6c 6c 54 65  r */.    ShellTe
33370 78 74 20 73 53 71 6c 3b 20 20 20 20 20 20 20 20  xt sSql;        
33380 20 20 2f 2a 20 43 6f 6d 70 6c 65 74 65 20 53 51    /* Complete SQ
33390 4c 20 66 6f 72 20 74 68 65 20 71 75 65 72 79 20  L for the query 
333a0 74 6f 20 72 75 6e 20 74 68 65 20 68 61 73 68 20  to run the hash 
333b0 2a 2f 0a 20 20 20 20 53 68 65 6c 6c 54 65 78 74  */.    ShellText
333c0 20 73 51 75 65 72 79 3b 20 20 20 20 20 20 20 20   sQuery;        
333d0 2f 2a 20 53 65 74 20 6f 66 20 71 75 65 72 69 65  /* Set of querie
333e0 73 20 75 73 65 64 20 74 6f 20 72 65 61 64 20 61  s used to read a
333f0 6c 6c 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20  ll content */.  
33400 20 20 6f 70 65 6e 5f 64 62 28 70 2c 20 30 29 3b    open_db(p, 0);
33410 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c  .    for(i=1; i<
33420 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nArg; i++){.    
33430 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20    const char *z 
33440 3d 20 61 7a 41 72 67 5b 69 5d 3b 0a 20 20 20 20  = azArg[i];.    
33450 20 20 69 66 28 20 7a 5b 30 5d 3d 3d 27 2d 27 20    if( z[0]=='-' 
33460 29 7b 0a 20 20 20 20 20 20 20 20 7a 2b 2b 3b 0a  ){.        z++;.
33470 20 20 20 20 20 20 20 20 69 66 28 20 7a 5b 30 5d          if( z[0]
33480 3d 3d 27 2d 27 20 29 20 7a 2b 2b 3b 0a 20 20 20  =='-' ) z++;.   
33490 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28       if( strcmp(
334a0 7a 2c 22 73 63 68 65 6d 61 22 29 3d 3d 30 20 29  z,"schema")==0 )
334b0 7b 0a 20 20 20 20 20 20 20 20 20 20 62 53 63 68  {.          bSch
334c0 65 6d 61 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  ema = 1;.       
334d0 20 7d 65 6c 73 65 0a 20 20 20 20 20 20 20 20 69   }else.        i
334e0 66 28 20 73 74 72 63 6d 70 28 7a 2c 22 73 68 61  f( strcmp(z,"sha
334f0 33 2d 32 32 34 22 29 3d 3d 30 20 7c 7c 20 73 74  3-224")==0 || st
33500 72 63 6d 70 28 7a 2c 22 73 68 61 33 2d 32 35 36  rcmp(z,"sha3-256
33510 22 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 7c  ")==0.         |
33520 7c 20 73 74 72 63 6d 70 28 7a 2c 22 73 68 61 33  | strcmp(z,"sha3
33530 2d 33 38 34 22 29 3d 3d 30 20 7c 7c 20 73 74 72  -384")==0 || str
33540 63 6d 70 28 7a 2c 22 73 68 61 33 2d 35 31 32 22  cmp(z,"sha3-512"
33550 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 29 7b 0a  )==0.        ){.
33560 20 20 20 20 20 20 20 20 20 20 69 53 69 7a 65 20            iSize 
33570 3d 20 61 74 6f 69 28 26 7a 5b 35 5d 29 3b 0a 20  = atoi(&z[5]);. 
33580 20 20 20 20 20 20 20 7d 65 6c 73 65 0a 20 20 20         }else.   
33590 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28       if( strcmp(
335a0 7a 2c 22 64 65 62 75 67 22 29 3d 3d 30 20 29 7b  z,"debug")==0 ){
335b0 0a 20 20 20 20 20 20 20 20 20 20 62 44 65 62 75  .          bDebu
335c0 67 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d  g = 1;.        }
335d0 65 6c 73 65 0a 20 20 20 20 20 20 20 20 7b 0a 20  else.        {. 
335e0 20 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72           utf8_pr
335f0 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55 6e  intf(stderr, "Un
33600 6b 6e 6f 77 6e 20 6f 70 74 69 6f 6e 20 5c 22 25  known option \"%
33610 73 5c 22 20 6f 6e 20 5c 22 25 73 5c 22 5c 6e 22  s\" on \"%s\"\n"
33620 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
33630 20 20 20 20 20 20 20 20 61 7a 41 72 67 5b 69 5d          azArg[i]
33640 2c 20 61 7a 41 72 67 5b 30 5d 29 3b 0a 20 20 20  , azArg[0]);.   
33650 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74         raw_print
33660 66 28 73 74 64 65 72 72 2c 20 22 53 68 6f 75 6c  f(stderr, "Shoul
33670 64 20 62 65 20 6f 6e 65 20 6f 66 3a 20 2d 2d 73  d be one of: --s
33680 63 68 65 6d 61 22 0a 20 20 20 20 20 20 20 20 20  chema".         
33690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
336a0 20 20 20 20 22 20 2d 2d 73 68 61 33 2d 32 32 34      " --sha3-224
336b0 20 2d 2d 73 68 61 33 2d 32 35 35 20 2d 2d 73 68   --sha3-255 --sh
336c0 61 33 2d 33 38 34 20 2d 2d 73 68 61 33 2d 35 31  a3-384 --sha3-51
336d0 32 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 20  2\n");.         
336e0 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20   rc = 1;.       
336f0 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d     goto meta_com
33700 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20 20  mand_exit;.     
33710 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
33720 20 69 66 28 20 7a 4c 69 6b 65 20 29 7b 0a 20 20   if( zLike ){.  
33730 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
33740 28 73 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a  (stderr, "Usage:
33750 20 2e 73 68 61 33 73 75 6d 20 3f 4f 50 54 49 4f   .sha3sum ?OPTIO
33760 4e 53 3f 20 3f 4c 49 4b 45 2d 50 41 54 54 45 52  NS? ?LIKE-PATTER
33770 4e 3f 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20 20  N?\n");.        
33780 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  rc = 1;.        
33790 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e  goto meta_comman
337a0 64 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 7d 65  d_exit;.      }e
337b0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 4c 69  lse{.        zLi
337c0 6b 65 20 3d 20 7a 3b 0a 20 20 20 20 20 20 20 20  ke = z;.        
337d0 62 53 65 70 61 72 61 74 65 20 3d 20 31 3b 0a 20  bSeparate = 1;. 
337e0 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
337f0 65 33 5f 73 74 72 6c 69 6b 65 28 22 73 71 6c 69  e3_strlike("sqli
33800 74 65 5f 25 22 2c 20 7a 4c 69 6b 65 2c 20 30 29  te_%", zLike, 0)
33810 3d 3d 30 20 29 20 62 53 63 68 65 6d 61 20 3d 20  ==0 ) bSchema = 
33820 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
33830 0a 20 20 20 20 69 66 28 20 62 53 63 68 65 6d 61  .    if( bSchema
33840 20 29 7b 0a 20 20 20 20 20 20 7a 53 71 6c 20 3d   ){.      zSql =
33850 20 22 53 45 4c 45 43 54 20 6c 6f 77 65 72 28 6e   "SELECT lower(n
33860 61 6d 65 29 20 46 52 4f 4d 20 73 71 6c 69 74 65  ame) FROM sqlite
33870 5f 6d 61 73 74 65 72 22 0a 20 20 20 20 20 20 20  _master".       
33880 20 20 20 20 20 20 22 20 57 48 45 52 45 20 74 79        " WHERE ty
33890 70 65 3d 27 74 61 62 6c 65 27 20 41 4e 44 20 63  pe='table' AND c
338a0 6f 61 6c 65 73 63 65 28 72 6f 6f 74 70 61 67 65  oalesce(rootpage
338b0 2c 30 29 3e 31 22 0a 20 20 20 20 20 20 20 20 20  ,0)>1".         
338c0 20 20 20 20 22 20 55 4e 49 4f 4e 20 41 4c 4c 20      " UNION ALL 
338d0 53 45 4c 45 43 54 20 27 73 71 6c 69 74 65 5f 6d  SELECT 'sqlite_m
338e0 61 73 74 65 72 27 22 0a 20 20 20 20 20 20 20 20  aster'".        
338f0 20 20 20 20 20 22 20 4f 52 44 45 52 20 42 59 20       " ORDER BY 
33900 31 20 63 6f 6c 6c 61 74 65 20 6e 6f 63 61 73 65  1 collate nocase
33910 22 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  ";.    }else{.  
33920 20 20 20 20 7a 53 71 6c 20 3d 20 22 53 45 4c 45      zSql = "SELE
33930 43 54 20 6c 6f 77 65 72 28 6e 61 6d 65 29 20 46  CT lower(name) F
33940 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  ROM sqlite_maste
33950 72 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r".             
33960 22 20 57 48 45 52 45 20 74 79 70 65 3d 27 74 61  " WHERE type='ta
33970 62 6c 65 27 20 41 4e 44 20 63 6f 61 6c 65 73 63  ble' AND coalesc
33980 65 28 72 6f 6f 74 70 61 67 65 2c 30 29 3e 31 22  e(rootpage,0)>1"
33990 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20  .             " 
339a0 41 4e 44 20 6e 61 6d 65 20 4e 4f 54 20 4c 49 4b  AND name NOT LIK
339b0 45 20 27 73 71 6c 69 74 65 5f 25 27 22 0a 20 20  E 'sqlite_%'".  
339c0 20 20 20 20 20 20 20 20 20 20 20 22 20 4f 52 44             " ORD
339d0 45 52 20 42 59 20 31 20 63 6f 6c 6c 61 74 65 20  ER BY 1 collate 
339e0 6e 6f 63 61 73 65 22 3b 0a 20 20 20 20 7d 0a 20  nocase";.    }. 
339f0 20 20 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61     sqlite3_prepa
33a00 72 65 5f 76 32 28 70 2d 3e 64 62 2c 20 7a 53 71  re_v2(p->db, zSq
33a10 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30  l, -1, &pStmt, 0
33a20 29 3b 0a 20 20 20 20 69 6e 69 74 54 65 78 74 28  );.    initText(
33a30 26 73 51 75 65 72 79 29 3b 0a 20 20 20 20 69 6e  &sQuery);.    in
33a40 69 74 54 65 78 74 28 26 73 53 71 6c 29 3b 0a 20  itText(&sSql);. 
33a50 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73     appendText(&s
33a60 53 71 6c 2c 20 22 57 49 54 48 20 5b 73 68 61 33  Sql, "WITH [sha3
33a70 73 75 6d 24 71 75 65 72 79 5d 28 61 2c 62 29 20  sum$query](a,b) 
33a80 41 53 28 22 2c 30 29 3b 0a 20 20 20 20 7a 53 65  AS(",0);.    zSe
33a90 70 20 3d 20 22 56 41 4c 55 45 53 28 22 3b 0a 20  p = "VALUES(";. 
33aa0 20 20 20 77 68 69 6c 65 28 20 53 51 4c 49 54 45     while( SQLITE
33ab0 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74  _ROW==sqlite3_st
33ac0 65 70 28 70 53 74 6d 74 29 20 29 7b 0a 20 20 20  ep(pStmt) ){.   
33ad0 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
33ae0 54 61 62 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  Tab = (const cha
33af0 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  r*)sqlite3_colum
33b00 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 30 29 3b  n_text(pStmt,0);
33b10 0a 20 20 20 20 20 20 69 66 28 20 7a 4c 69 6b 65  .      if( zLike
33b20 20 26 26 20 73 71 6c 69 74 65 33 5f 73 74 72 6c   && sqlite3_strl
33b30 69 6b 65 28 7a 4c 69 6b 65 2c 20 7a 54 61 62 2c  ike(zLike, zTab,
33b40 20 30 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75   0)!=0 ) continu
33b50 65 3b 0a 20 20 20 20 20 20 69 66 28 20 73 74 72  e;.      if( str
33b60 6e 63 6d 70 28 7a 54 61 62 2c 20 22 73 71 6c 69  ncmp(zTab, "sqli
33b70 74 65 5f 22 2c 37 29 21 3d 30 20 29 7b 0a 20 20  te_",7)!=0 ){.  
33b80 20 20 20 20 20 20 61 70 70 65 6e 64 54 65 78 74        appendText
33b90 28 26 73 51 75 65 72 79 2c 22 53 45 4c 45 43 54  (&sQuery,"SELECT
33ba0 20 2a 20 46 52 4f 4d 20 22 2c 20 30 29 3b 0a 20   * FROM ", 0);. 
33bb0 20 20 20 20 20 20 20 61 70 70 65 6e 64 54 65 78         appendTex
33bc0 74 28 26 73 51 75 65 72 79 2c 7a 54 61 62 2c 27  t(&sQuery,zTab,'
33bd0 22 27 29 3b 0a 20 20 20 20 20 20 20 20 61 70 70  "');.        app
33be0 65 6e 64 54 65 78 74 28 26 73 51 75 65 72 79 2c  endText(&sQuery,
33bf0 22 20 4e 4f 54 20 49 4e 44 45 58 45 44 3b 22 2c  " NOT INDEXED;",
33c00 20 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   0);.      }else
33c10 20 69 66 28 20 73 74 72 63 6d 70 28 7a 54 61 62   if( strcmp(zTab
33c20 2c 20 22 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  , "sqlite_master
33c30 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ")==0 ){.       
33c40 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 51 75   appendText(&sQu
33c50 65 72 79 2c 22 53 45 4c 45 43 54 20 74 79 70 65  ery,"SELECT type
33c60 2c 6e 61 6d 65 2c 74 62 6c 5f 6e 61 6d 65 2c 73  ,name,tbl_name,s
33c70 71 6c 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d  ql FROM sqlite_m
33c80 61 73 74 65 72 22 0a 20 20 20 20 20 20 20 20 20  aster".         
33c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33ca0 20 20 22 20 4f 52 44 45 52 20 42 59 20 6e 61 6d    " ORDER BY nam
33cb0 65 3b 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  e;", 0);.      }
33cc0 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
33cd0 7a 54 61 62 2c 20 22 73 71 6c 69 74 65 5f 73 65  zTab, "sqlite_se
33ce0 71 75 65 6e 63 65 22 29 3d 3d 30 20 29 7b 0a 20  quence")==0 ){. 
33cf0 20 20 20 20 20 20 20 61 70 70 65 6e 64 54 65 78         appendTex
33d00 74 28 26 73 51 75 65 72 79 2c 22 53 45 4c 45 43  t(&sQuery,"SELEC
33d10 54 20 6e 61 6d 65 2c 73 65 71 20 46 52 4f 4d 20  T name,seq FROM 
33d20 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 22  sqlite_sequence"
33d30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
33d40 20 20 20 20 20 20 20 20 20 20 20 20 22 20 4f 52              " OR
33d50 44 45 52 20 42 59 20 6e 61 6d 65 3b 22 2c 20 30  DER BY name;", 0
33d60 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
33d70 66 28 20 73 74 72 63 6d 70 28 7a 54 61 62 2c 20  f( strcmp(zTab, 
33d80 22 73 71 6c 69 74 65 5f 73 74 61 74 31 22 29 3d  "sqlite_stat1")=
33d90 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61 70  =0 ){.        ap
33da0 70 65 6e 64 54 65 78 74 28 26 73 51 75 65 72 79  pendText(&sQuery
33db0 2c 22 53 45 4c 45 43 54 20 74 62 6c 2c 69 64 78  ,"SELECT tbl,idx
33dc0 2c 73 74 61 74 20 46 52 4f 4d 20 73 71 6c 69 74  ,stat FROM sqlit
33dd0 65 5f 73 74 61 74 31 22 0a 20 20 20 20 20 20 20  e_stat1".       
33de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33df0 20 20 20 20 22 20 4f 52 44 45 52 20 42 59 20 74      " ORDER BY t
33e00 62 6c 2c 69 64 78 3b 22 2c 20 30 29 3b 0a 20 20  bl,idx;", 0);.  
33e10 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74      }else if( st
33e20 72 63 6d 70 28 7a 54 61 62 2c 20 22 73 71 6c 69  rcmp(zTab, "sqli
33e30 74 65 5f 73 74 61 74 33 22 29 3d 3d 30 0a 20 20  te_stat3")==0.  
33e40 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73 74             || st
33e50 72 63 6d 70 28 7a 54 61 62 2c 20 22 73 71 6c 69  rcmp(zTab, "sqli
33e60 74 65 5f 73 74 61 74 34 22 29 3d 3d 30 20 29 7b  te_stat4")==0 ){
33e70 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 54  .        appendT
33e80 65 78 74 28 26 73 51 75 65 72 79 2c 20 22 53 45  ext(&sQuery, "SE
33e90 4c 45 43 54 20 2a 20 46 52 4f 4d 20 22 2c 20 30  LECT * FROM ", 0
33ea0 29 3b 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e  );.        appen
33eb0 64 54 65 78 74 28 26 73 51 75 65 72 79 2c 20 7a  dText(&sQuery, z
33ec0 54 61 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  Tab, 0);.       
33ed0 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 51 75   appendText(&sQu
33ee0 65 72 79 2c 20 22 20 4f 52 44 45 52 20 42 59 20  ery, " ORDER BY 
33ef0 74 62 6c 2c 20 69 64 78 2c 20 72 6f 77 69 64 3b  tbl, idx, rowid;
33f00 5c 6e 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  \n", 0);.      }
33f10 0a 20 20 20 20 20 20 61 70 70 65 6e 64 54 65 78  .      appendTex
33f20 74 28 26 73 53 71 6c 2c 20 7a 53 65 70 2c 20 30  t(&sSql, zSep, 0
33f30 29 3b 0a 20 20 20 20 20 20 61 70 70 65 6e 64 54  );.      appendT
33f40 65 78 74 28 26 73 53 71 6c 2c 20 73 51 75 65 72  ext(&sSql, sQuer
33f50 79 2e 7a 2c 20 27 5c 27 27 29 3b 0a 20 20 20 20  y.z, '\'');.    
33f60 20 20 73 51 75 65 72 79 2e 6e 20 3d 20 30 3b 0a    sQuery.n = 0;.
33f70 20 20 20 20 20 20 61 70 70 65 6e 64 54 65 78 74        appendText
33f80 28 26 73 53 71 6c 2c 20 22 2c 22 2c 20 30 29 3b  (&sSql, ",", 0);
33f90 0a 20 20 20 20 20 20 61 70 70 65 6e 64 54 65 78  .      appendTex
33fa0 74 28 26 73 53 71 6c 2c 20 7a 54 61 62 2c 20 27  t(&sSql, zTab, '
33fb0 5c 27 27 29 3b 0a 20 20 20 20 20 20 7a 53 65 70  \'');.      zSep
33fc0 20 3d 20 22 29 2c 28 22 3b 0a 20 20 20 20 7d 0a   = "),(";.    }.
33fd0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61      sqlite3_fina
33fe0 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20  lize(pStmt);.   
33ff0 20 69 66 28 20 62 53 65 70 61 72 61 74 65 20 29   if( bSeparate )
34000 7b 0a 20 20 20 20 20 20 7a 53 71 6c 20 3d 20 73  {.      zSql = s
34010 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a  qlite3_mprintf(.
34020 20 20 20 20 20 20 20 20 20 20 22 25 73 29 29 22            "%s))"
34030 0a 20 20 20 20 20 20 20 20 20 20 22 20 53 45 4c  .          " SEL
34040 45 43 54 20 6c 6f 77 65 72 28 68 65 78 28 73 68  ECT lower(hex(sh
34050 61 33 5f 71 75 65 72 79 28 61 2c 25 64 29 29 29  a3_query(a,%d)))
34060 20 41 53 20 68 61 73 68 2c 20 62 20 41 53 20 6c   AS hash, b AS l
34070 61 62 65 6c 22 0a 20 20 20 20 20 20 20 20 20 20  abel".          
34080 22 20 20 20 46 52 4f 4d 20 5b 73 68 61 33 73 75  "   FROM [sha3su
34090 6d 24 71 75 65 72 79 5d 22 2c 0a 20 20 20 20 20  m$query]",.     
340a0 20 20 20 20 20 73 53 71 6c 2e 7a 2c 20 69 53 69       sSql.z, iSi
340b0 7a 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ze);.    }else{.
340c0 20 20 20 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c        zSql = sql
340d0 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20  ite3_mprintf(.  
340e0 20 20 20 20 20 20 20 20 22 25 73 29 29 22 0a 20          "%s))". 
340f0 20 20 20 20 20 20 20 20 20 22 20 53 45 4c 45 43           " SELEC
34100 54 20 6c 6f 77 65 72 28 68 65 78 28 73 68 61 33  T lower(hex(sha3
34110 5f 71 75 65 72 79 28 67 72 6f 75 70 5f 63 6f 6e  _query(group_con
34120 63 61 74 28 61 2c 27 27 29 2c 25 64 29 29 29 20  cat(a,''),%d))) 
34130 41 53 20 68 61 73 68 22 0a 20 20 20 20 20 20 20  AS hash".       
34140 20 20 20 22 20 20 20 46 52 4f 4d 20 5b 73 68 61     "   FROM [sha
34150 33 73 75 6d 24 71 75 65 72 79 5d 22 2c 0a 20 20  3sum$query]",.  
34160 20 20 20 20 20 20 20 20 73 53 71 6c 2e 7a 2c 20          sSql.z, 
34170 69 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20  iSize);.    }.  
34180 20 20 66 72 65 65 54 65 78 74 28 26 73 51 75 65    freeText(&sQue
34190 72 79 29 3b 0a 20 20 20 20 66 72 65 65 54 65 78  ry);.    freeTex
341a0 74 28 26 73 53 71 6c 29 3b 0a 20 20 20 20 69 66  t(&sSql);.    if
341b0 28 20 62 44 65 62 75 67 20 29 7b 0a 20 20 20 20  ( bDebug ){.    
341c0 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d    utf8_printf(p-
341d0 3e 6f 75 74 2c 20 22 25 73 5c 6e 22 2c 20 7a 53  >out, "%s\n", zS
341e0 71 6c 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ql);.    }else{.
341f0 20 20 20 20 20 20 73 68 65 6c 6c 5f 65 78 65 63        shell_exec
34200 28 70 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 73 68  (p->db, zSql, sh
34210 65 6c 6c 5f 63 61 6c 6c 62 61 63 6b 2c 20 70 2c  ell_callback, p,
34220 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73   0);.    }.    s
34230 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c  qlite3_free(zSql
34240 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66  );.  }else..  if
34250 28 20 63 3d 3d 27 73 27 0a 20 20 20 26 26 20 28  ( c=='s'.   && (
34260 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d  strncmp(azArg[0]
34270 2c 20 22 73 68 65 6c 6c 22 2c 20 6e 29 3d 3d 30  , "shell", n)==0
34280 20 7c 7c 20 73 74 72 6e 63 6d 70 28 61 7a 41 72   || strncmp(azAr
34290 67 5b 30 5d 2c 22 73 79 73 74 65 6d 22 2c 6e 29  g[0],"system",n)
342a0 3d 3d 30 29 0a 20 20 29 7b 0a 20 20 20 20 63 68  ==0).  ){.    ch
342b0 61 72 20 2a 7a 43 6d 64 3b 0a 20 20 20 20 69 6e  ar *zCmd;.    in
342c0 74 20 69 2c 20 78 3b 0a 20 20 20 20 69 66 28 20  t i, x;.    if( 
342d0 6e 41 72 67 3c 32 20 29 7b 0a 20 20 20 20 20 20  nArg<2 ){.      
342e0 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72  raw_printf(stder
342f0 72 2c 20 22 55 73 61 67 65 3a 20 2e 73 79 73 74  r, "Usage: .syst
34300 65 6d 20 43 4f 4d 4d 41 4e 44 5c 6e 22 29 3b 0a  em COMMAND\n");.
34310 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
34320 20 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f      goto meta_co
34330 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20  mmand_exit;.    
34340 7d 0a 20 20 20 20 7a 43 6d 64 20 3d 20 73 71 6c  }.    zCmd = sql
34350 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 73 74 72  ite3_mprintf(str
34360 63 68 72 28 61 7a 41 72 67 5b 31 5d 2c 27 20 27  chr(azArg[1],' '
34370 29 3d 3d 30 3f 22 25 73 22 3a 22 5c 22 25 73 5c  )==0?"%s":"\"%s\
34380 22 22 2c 20 61 7a 41 72 67 5b 31 5d 29 3b 0a 20  "", azArg[1]);. 
34390 20 20 20 66 6f 72 28 69 3d 32 3b 20 69 3c 6e 41     for(i=2; i<nA
343a0 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  rg; i++){.      
343b0 7a 43 6d 64 20 3d 20 73 71 6c 69 74 65 33 5f 6d  zCmd = sqlite3_m
343c0 70 72 69 6e 74 66 28 73 74 72 63 68 72 28 61 7a  printf(strchr(az
343d0 41 72 67 5b 69 5d 2c 27 20 27 29 3d 3d 30 3f 22  Arg[i],' ')==0?"
343e0 25 7a 20 25 73 22 3a 22 25 7a 20 5c 22 25 73 5c  %z %s":"%z \"%s\
343f0 22 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  "",.            
34400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34410 20 7a 43 6d 64 2c 20 61 7a 41 72 67 5b 69 5d 29   zCmd, azArg[i])
34420 3b 0a 20 20 20 20 7d 0a 20 20 20 20 78 20 3d 20  ;.    }.    x = 
34430 73 79 73 74 65 6d 28 7a 43 6d 64 29 3b 0a 20 20  system(zCmd);.  
34440 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
34450 43 6d 64 29 3b 0a 20 20 20 20 69 66 28 20 78 20  Cmd);.    if( x 
34460 29 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64  ) raw_printf(std
34470 65 72 72 2c 20 22 53 79 73 74 65 6d 20 63 6f 6d  err, "System com
34480 6d 61 6e 64 20 72 65 74 75 72 6e 73 20 25 64 5c  mand returns %d\
34490 6e 22 2c 20 78 29 3b 0a 20 20 7d 65 6c 73 65 0a  n", x);.  }else.
344a0 0a 20 20 69 66 28 20 63 3d 3d 27 73 27 20 26 26  .  if( c=='s' &&
344b0 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30   strncmp(azArg[0
344c0 5d 2c 20 22 73 68 6f 77 22 2c 20 6e 29 3d 3d 30  ], "show", n)==0
344d0 20 29 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63   ){.    static c
344e0 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 42 6f 6f  onst char *azBoo
344f0 6c 5b 5d 20 3d 20 7b 20 22 6f 66 66 22 2c 20 22  l[] = { "off", "
34500 6f 6e 22 2c 20 22 74 72 69 67 67 65 72 22 2c 20  on", "trigger", 
34510 22 66 75 6c 6c 22 7d 3b 0a 20 20 20 20 69 6e 74  "full"};.    int
34520 20 69 3b 0a 20 20 20 20 69 66 28 20 6e 41 72 67   i;.    if( nArg
34530 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 72 61 77  !=1 ){.      raw
34540 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
34550 22 55 73 61 67 65 3a 20 2e 73 68 6f 77 5c 6e 22  "Usage: .show\n"
34560 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b  );.      rc = 1;
34570 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 65 74 61  .      goto meta
34580 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20  _command_exit;. 
34590 20 20 20 7d 0a 20 20 20 20 75 74 66 38 5f 70 72     }.    utf8_pr
345a0 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 31  intf(p->out, "%1
345b0 32 2e 31 32 73 3a 20 25 73 5c 6e 22 2c 22 65 63  2.12s: %s\n","ec
345c0 68 6f 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ho",.           
345d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
345e0 20 20 20 20 20 20 20 61 7a 42 6f 6f 6c 5b 53 68         azBool[Sh
345f0 65 6c 6c 48 61 73 46 6c 61 67 28 70 2c 20 53 48  ellHasFlag(p, SH
34600 46 4c 47 5f 45 63 68 6f 29 5d 29 3b 0a 20 20 20  FLG_Echo)]);.   
34610 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e   utf8_printf(p->
34620 6f 75 74 2c 20 22 25 31 32 2e 31 32 73 3a 20 25  out, "%12.12s: %
34630 73 5c 6e 22 2c 22 65 71 70 22 2c 20 61 7a 42 6f  s\n","eqp", azBo
34640 6f 6c 5b 70 2d 3e 61 75 74 6f 45 51 50 26 33 5d  ol[p->autoEQP&3]
34650 29 3b 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e  );.    utf8_prin
34660 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 31 32 2e  tf(p->out, "%12.
34670 31 32 73 3a 20 25 73 5c 6e 22 2c 22 65 78 70 6c  12s: %s\n","expl
34680 61 69 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 70  ain",.         p
34690 2d 3e 6d 6f 64 65 3d 3d 4d 4f 44 45 5f 45 78 70  ->mode==MODE_Exp
346a0 6c 61 69 6e 20 3f 20 22 6f 6e 22 20 3a 20 70 2d  lain ? "on" : p-
346b0 3e 61 75 74 6f 45 78 70 6c 61 69 6e 20 3f 20 22  >autoExplain ? "
346c0 61 75 74 6f 22 20 3a 20 22 6f 66 66 22 29 3b 0a  auto" : "off");.
346d0 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
346e0 70 2d 3e 6f 75 74 2c 22 25 31 32 2e 31 32 73 3a  p->out,"%12.12s:
346f0 20 25 73 5c 6e 22 2c 22 68 65 61 64 65 72 73 22   %s\n","headers"
34700 2c 20 61 7a 42 6f 6f 6c 5b 70 2d 3e 73 68 6f 77  , azBool[p->show
34710 48 65 61 64 65 72 21 3d 30 5d 29 3b 0a 20 20 20  Header!=0]);.   
34720 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e   utf8_printf(p->
34730 6f 75 74 2c 20 22 25 31 32 2e 31 32 73 3a 20 25  out, "%12.12s: %
34740 73 5c 6e 22 2c 22 6d 6f 64 65 22 2c 20 6d 6f 64  s\n","mode", mod
34750 65 44 65 73 63 72 5b 70 2d 3e 6d 6f 64 65 5d 29  eDescr[p->mode])
34760 3b 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74  ;.    utf8_print
34770 66 28 70 2d 3e 6f 75 74 2c 20 22 25 31 32 2e 31  f(p->out, "%12.1
34780 32 73 3a 20 22 2c 20 22 6e 75 6c 6c 76 61 6c 75  2s: ", "nullvalu
34790 65 22 29 3b 0a 20 20 20 20 20 20 6f 75 74 70 75  e");.      outpu
347a0 74 5f 63 5f 73 74 72 69 6e 67 28 70 2d 3e 6f 75  t_c_string(p->ou
347b0 74 2c 20 70 2d 3e 6e 75 6c 6c 56 61 6c 75 65 29  t, p->nullValue)
347c0 3b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e  ;.      raw_prin
347d0 74 66 28 70 2d 3e 6f 75 74 2c 20 22 5c 6e 22 29  tf(p->out, "\n")
347e0 3b 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74  ;.    utf8_print
347f0 66 28 70 2d 3e 6f 75 74 2c 22 25 31 32 2e 31 32  f(p->out,"%12.12
34800 73 3a 20 25 73 5c 6e 22 2c 22 6f 75 74 70 75 74  s: %s\n","output
34810 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ",.            s
34820 74 72 6c 65 6e 33 30 28 70 2d 3e 6f 75 74 66 69  trlen30(p->outfi
34830 6c 65 29 20 3f 20 70 2d 3e 6f 75 74 66 69 6c 65  le) ? p->outfile
34840 20 3a 20 22 73 74 64 6f 75 74 22 29 3b 0a 20 20   : "stdout");.  
34850 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d    utf8_printf(p-
34860 3e 6f 75 74 2c 22 25 31 32 2e 31 32 73 3a 20 22  >out,"%12.12s: "
34870 2c 20 22 63 6f 6c 73 65 70 61 72 61 74 6f 72 22  , "colseparator"
34880 29 3b 0a 20 20 20 20 20 20 6f 75 74 70 75 74 5f  );.      output_
34890 63 5f 73 74 72 69 6e 67 28 70 2d 3e 6f 75 74 2c  c_string(p->out,
348a0 20 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72   p->colSeparator
348b0 29 3b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69  );.      raw_pri
348c0 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 5c 6e 22  ntf(p->out, "\n"
348d0 29 3b 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e  );.    utf8_prin
348e0 74 66 28 70 2d 3e 6f 75 74 2c 22 25 31 32 2e 31  tf(p->out,"%12.1
348f0 32 73 3a 20 22 2c 20 22 72 6f 77 73 65 70 61 72  2s: ", "rowsepar
34900 61 74 6f 72 22 29 3b 0a 20 20 20 20 20 20 6f 75  ator");.      ou
34910 74 70 75 74 5f 63 5f 73 74 72 69 6e 67 28 70 2d  tput_c_string(p-
34920 3e 6f 75 74 2c 20 70 2d 3e 72 6f 77 53 65 70 61  >out, p->rowSepa
34930 72 61 74 6f 72 29 3b 0a 20 20 20 20 20 20 72 61  rator);.      ra
34940 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  w_printf(p->out,
34950 20 22 5c 6e 22 29 3b 0a 20 20 20 20 75 74 66 38   "\n");.    utf8
34960 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
34970 22 25 31 32 2e 31 32 73 3a 20 25 73 5c 6e 22 2c  "%12.12s: %s\n",
34980 22 73 74 61 74 73 22 2c 20 61 7a 42 6f 6f 6c 5b  "stats", azBool[
34990 70 2d 3e 73 74 61 74 73 4f 6e 21 3d 30 5d 29 3b  p->statsOn!=0]);
349a0 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66  .    utf8_printf
349b0 28 70 2d 3e 6f 75 74 2c 20 22 25 31 32 2e 31 32  (p->out, "%12.12
349c0 73 3a 20 22 2c 20 22 77 69 64 74 68 22 29 3b 0a  s: ", "width");.
349d0 20 20 20 20 66 6f 72 20 28 69 3d 30 3b 69 3c 28      for (i=0;i<(
349e0 69 6e 74 29 41 72 72 61 79 53 69 7a 65 28 70 2d  int)ArraySize(p-
349f0 3e 63 6f 6c 57 69 64 74 68 29 20 26 26 20 70 2d  >colWidth) && p-
34a00 3e 63 6f 6c 57 69 64 74 68 5b 69 5d 20 21 3d 20  >colWidth[i] != 
34a10 30 3b 69 2b 2b 29 20 7b 0a 20 20 20 20 20 20 72  0;i++) {.      r
34a20 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  aw_printf(p->out
34a30 2c 20 22 25 64 20 22 2c 20 70 2d 3e 63 6f 6c 57  , "%d ", p->colW
34a40 69 64 74 68 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a  idth[i]);.    }.
34a50 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70      raw_printf(p
34a60 2d 3e 6f 75 74 2c 20 22 5c 6e 22 29 3b 0a 20 20  ->out, "\n");.  
34a70 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d    utf8_printf(p-
34a80 3e 6f 75 74 2c 20 22 25 31 32 2e 31 32 73 3a 20  >out, "%12.12s: 
34a90 25 73 5c 6e 22 2c 20 22 66 69 6c 65 6e 61 6d 65  %s\n", "filename
34aa0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
34ab0 20 20 20 70 2d 3e 7a 44 62 46 69 6c 65 6e 61 6d     p->zDbFilenam
34ac0 65 20 3f 20 70 2d 3e 7a 44 62 46 69 6c 65 6e 61  e ? p->zDbFilena
34ad0 6d 65 20 3a 20 22 22 29 3b 0a 20 20 7d 65 6c 73  me : "");.  }els
34ae0 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 73 27 20  e..  if( c=='s' 
34af0 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67  && strncmp(azArg
34b00 5b 30 5d 2c 20 22 73 74 61 74 73 22 2c 20 6e 29  [0], "stats", n)
34b10 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6e  ==0 ){.    if( n
34b20 41 72 67 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20  Arg==2 ){.      
34b30 70 2d 3e 73 74 61 74 73 4f 6e 20 3d 20 62 6f 6f  p->statsOn = boo
34b40 6c 65 61 6e 56 61 6c 75 65 28 61 7a 41 72 67 5b  leanValue(azArg[
34b50 31 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  1]);.    }else i
34b60 66 28 20 6e 41 72 67 3d 3d 31 20 29 7b 0a 20 20  f( nArg==1 ){.  
34b70 20 20 20 20 64 69 73 70 6c 61 79 5f 73 74 61 74      display_stat
34b80 73 28 70 2d 3e 64 62 2c 20 70 2c 20 30 29 3b 0a  s(p->db, p, 0);.
34b90 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
34ba0 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65   raw_printf(stde
34bb0 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 73 74 61  rr, "Usage: .sta
34bc0 74 73 20 3f 6f 6e 7c 6f 66 66 3f 5c 6e 22 29 3b  ts ?on|off?\n");
34bd0 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20  .      rc = 1;. 
34be0 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20     }.  }else..  
34bf0 69 66 28 20 28 63 3d 3d 27 74 27 20 26 26 20 6e  if( (c=='t' && n
34c00 3e 31 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a  >1 && strncmp(az
34c10 41 72 67 5b 30 5d 2c 20 22 74 61 62 6c 65 73 22  Arg[0], "tables"
34c20 2c 20 6e 29 3d 3d 30 29 0a 20 20 20 7c 7c 20 28  , n)==0).   || (
34c30 63 3d 3d 27 69 27 20 26 26 20 28 73 74 72 6e 63  c=='i' && (strnc
34c40 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 69 6e  mp(azArg[0], "in
34c50 64 69 63 65 73 22 2c 20 6e 29 3d 3d 30 0a 20 20  dices", n)==0.  
34c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
34c70 7c 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b  | strncmp(azArg[
34c80 30 5d 2c 20 22 69 6e 64 65 78 65 73 22 2c 20 6e  0], "indexes", n
34c90 29 3d 3d 30 29 20 29 0a 20 20 29 7b 0a 20 20 20  )==0) ).  ){.   
34ca0 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
34cb0 53 74 6d 74 3b 0a 20 20 20 20 63 68 61 72 20 2a  Stmt;.    char *
34cc0 2a 61 7a 52 65 73 75 6c 74 3b 0a 20 20 20 20 69  *azResult;.    i
34cd0 6e 74 20 6e 52 6f 77 2c 20 6e 41 6c 6c 6f 63 3b  nt nRow, nAlloc;
34ce0 0a 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20  .    int ii;.   
34cf0 20 53 68 65 6c 6c 54 65 78 74 20 73 3b 0a 20 20   ShellText s;.  
34d00 20 20 69 6e 69 74 54 65 78 74 28 26 73 29 3b 0a    initText(&s);.
34d10 20 20 20 20 6f 70 65 6e 5f 64 62 28 70 2c 20 30      open_db(p, 0
34d20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
34d30 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 70  te3_prepare_v2(p
34d40 2d 3e 64 62 2c 20 22 50 52 41 47 4d 41 20 64 61  ->db, "PRAGMA da
34d50 74 61 62 61 73 65 5f 6c 69 73 74 22 2c 20 2d 31  tabase_list", -1
34d60 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20  , &pStmt, 0);.  
34d70 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
34d80 6e 20 73 68 65 6c 6c 44 61 74 61 62 61 73 65 45  n shellDatabaseE
34d90 72 72 6f 72 28 70 2d 3e 64 62 29 3b 0a 0a 20 20  rror(p->db);..  
34da0 20 20 69 66 28 20 6e 41 72 67 3e 32 20 26 26 20    if( nArg>2 && 
34db0 63 3d 3d 27 69 27 20 29 7b 0a 20 20 20 20 20 20  c=='i' ){.      
34dc0 2f 2a 20 49 74 20 69 73 20 61 6e 20 68 69 73 74  /* It is an hist
34dd0 6f 72 69 63 61 6c 20 61 63 63 69 64 65 6e 74 20  orical accident 
34de0 74 68 61 74 20 74 68 65 20 2e 69 6e 64 65 78 65  that the .indexe
34df0 73 20 63 6f 6d 6d 61 6e 64 20 73 68 6f 77 73 20  s command shows 
34e00 61 6e 20 65 72 72 6f 72 0a 20 20 20 20 20 20 2a  an error.      *
34e10 2a 20 77 68 65 6e 20 63 61 6c 6c 65 64 20 77 69  * when called wi
34e20 74 68 20 74 68 65 20 77 72 6f 6e 67 20 6e 75 6d  th the wrong num
34e30 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
34e40 20 77 68 65 72 65 61 73 20 74 68 65 20 2e 74 61   whereas the .ta
34e50 62 6c 65 73 0a 20 20 20 20 20 20 2a 2a 20 63 6f  bles.      ** co
34e60 6d 6d 61 6e 64 20 64 6f 65 73 20 6e 6f 74 2e 20  mmand does not. 
34e70 2a 2f 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69  */.      raw_pri
34e80 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55 73 61  ntf(stderr, "Usa
34e90 67 65 3a 20 2e 69 6e 64 65 78 65 73 20 3f 4c 49  ge: .indexes ?LI
34ea0 4b 45 2d 50 41 54 54 45 52 4e 3f 5c 6e 22 29 3b  KE-PATTERN?\n");
34eb0 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20  .      rc = 1;. 
34ec0 20 20 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63       goto meta_c
34ed0 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20  ommand_exit;.   
34ee0 20 7d 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b   }.    for(ii=0;
34ef0 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53   sqlite3_step(pS
34f00 74 6d 74 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57  tmt)==SQLITE_ROW
34f10 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 63  ; ii++){.      c
34f20 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 4e 61  onst char *zDbNa
34f30 6d 65 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  me = (const char
34f40 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  *)sqlite3_column
34f50 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 31 29 3b  _text(pStmt, 1);
34f60 0a 20 20 20 20 20 20 69 66 28 20 7a 44 62 4e 61  .      if( zDbNa
34f70 6d 65 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  me==0 ) continue
34f80 3b 0a 20 20 20 20 20 20 69 66 28 20 73 2e 7a 20  ;.      if( s.z 
34f90 26 26 20 73 2e 7a 5b 30 5d 20 29 20 61 70 70 65  && s.z[0] ) appe
34fa0 6e 64 54 65 78 74 28 26 73 2c 20 22 20 55 4e 49  ndText(&s, " UNI
34fb0 4f 4e 20 41 4c 4c 20 22 2c 20 30 29 3b 0a 20 20  ON ALL ", 0);.  
34fc0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f      if( sqlite3_
34fd0 73 74 72 69 63 6d 70 28 7a 44 62 4e 61 6d 65 2c  stricmp(zDbName,
34fe0 20 22 6d 61 69 6e 22 29 3d 3d 30 20 29 7b 0a 20   "main")==0 ){. 
34ff0 20 20 20 20 20 20 20 61 70 70 65 6e 64 54 65 78         appendTex
35000 74 28 26 73 2c 20 22 53 45 4c 45 43 54 20 6e 61  t(&s, "SELECT na
35010 6d 65 20 46 52 4f 4d 20 22 2c 20 30 29 3b 0a 20  me FROM ", 0);. 
35020 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
35030 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26      appendText(&
35040 73 2c 20 22 53 45 4c 45 43 54 20 22 2c 20 30 29  s, "SELECT ", 0)
35050 3b 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e 64  ;.        append
35060 54 65 78 74 28 26 73 2c 20 7a 44 62 4e 61 6d 65  Text(&s, zDbName
35070 2c 20 27 5c 27 27 29 3b 0a 20 20 20 20 20 20 20  , '\'');.       
35080 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 2c 20   appendText(&s, 
35090 22 7c 7c 27 2e 27 7c 7c 6e 61 6d 65 20 46 52 4f  "||'.'||name FRO
350a0 4d 20 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  M ", 0);.      }
350b0 0a 20 20 20 20 20 20 61 70 70 65 6e 64 54 65 78  .      appendTex
350c0 74 28 26 73 2c 20 7a 44 62 4e 61 6d 65 2c 20 27  t(&s, zDbName, '
350d0 22 27 29 3b 0a 20 20 20 20 20 20 61 70 70 65 6e  "');.      appen
350e0 64 54 65 78 74 28 26 73 2c 20 22 2e 73 71 6c 69  dText(&s, ".sqli
350f0 74 65 5f 6d 61 73 74 65 72 20 22 2c 20 30 29 3b  te_master ", 0);
35100 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27 74  .      if( c=='t
35110 27 20 29 7b 0a 20 20 20 20 20 20 20 20 61 70 70  ' ){.        app
35120 65 6e 64 54 65 78 74 28 26 73 2c 22 20 57 48 45  endText(&s," WHE
35130 52 45 20 74 79 70 65 20 49 4e 20 28 27 74 61 62  RE type IN ('tab
35140 6c 65 27 2c 27 76 69 65 77 27 29 22 0a 20 20 20  le','view')".   
35150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35160 20 20 20 22 20 20 20 41 4e 44 20 6e 61 6d 65 20     "   AND name 
35170 4e 4f 54 20 4c 49 4b 45 20 27 73 71 6c 69 74 65  NOT LIKE 'sqlite
35180 5f 25 27 22 0a 20 20 20 20 20 20 20 20 20 20 20  _%'".           
35190 20 20 20 20 20 20 20 20 20 20 20 22 20 20 20 41             "   A
351a0 4e 44 20 6e 61 6d 65 20 4c 49 4b 45 20 3f 31 22  ND name LIKE ?1"
351b0 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  , 0);.      }els
351c0 65 7b 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e  e{.        appen
351d0 64 54 65 78 74 28 26 73 2c 22 20 57 48 45 52 45  dText(&s," WHERE
351e0 20 74 79 70 65 3d 27 69 6e 64 65 78 27 22 0a 20   type='index'". 
351f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35200 20 20 20 20 20 22 20 20 20 41 4e 44 20 74 62 6c       "   AND tbl
35210 5f 6e 61 6d 65 20 4c 49 4b 45 20 3f 31 22 2c 20  _name LIKE ?1", 
35220 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
35230 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  }.    rc = sqlit
35240 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d  e3_finalize(pStm
35250 74 29 3b 0a 20 20 20 20 61 70 70 65 6e 64 54 65  t);.    appendTe
35260 78 74 28 26 73 2c 20 22 20 4f 52 44 45 52 20 42  xt(&s, " ORDER B
35270 59 20 31 22 2c 20 30 29 3b 0a 20 20 20 20 72 63  Y 1", 0);.    rc
35280 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61   = sqlite3_prepa
35290 72 65 5f 76 32 28 70 2d 3e 64 62 2c 20 73 2e 7a  re_v2(p->db, s.z
352a0 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29  , -1, &pStmt, 0)
352b0 3b 0a 20 20 20 20 66 72 65 65 54 65 78 74 28 26  ;.    freeText(&
352c0 73 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  s);.    if( rc )
352d0 20 72 65 74 75 72 6e 20 73 68 65 6c 6c 44 61 74   return shellDat
352e0 61 62 61 73 65 45 72 72 6f 72 28 70 2d 3e 64 62  abaseError(p->db
352f0 29 3b 0a 0a 20 20 20 20 2f 2a 20 52 75 6e 20 74  );..    /* Run t
35300 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  he SQL statement
35310 20 70 72 65 70 61 72 65 64 20 62 79 20 74 68 65   prepared by the
35320 20 61 62 6f 76 65 20 62 6c 6f 63 6b 2e 20 53 74   above block. St
35330 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 0a  ore the results.
35340 20 20 20 20 2a 2a 20 61 73 20 61 6e 20 61 72 72      ** as an arr
35350 61 79 20 6f 66 20 6e 75 6c 2d 74 65 72 6d 69 6e  ay of nul-termin
35360 61 74 65 64 20 73 74 72 69 6e 67 73 20 69 6e 20  ated strings in 
35370 61 7a 52 65 73 75 6c 74 5b 5d 2e 20 20 2a 2f 0a  azResult[].  */.
35380 20 20 20 20 6e 52 6f 77 20 3d 20 6e 41 6c 6c 6f      nRow = nAllo
35390 63 20 3d 20 30 3b 0a 20 20 20 20 61 7a 52 65 73  c = 0;.    azRes
353a0 75 6c 74 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  ult = 0;.    if(
353b0 20 6e 41 72 67 3e 31 20 29 7b 0a 20 20 20 20 20   nArg>1 ){.     
353c0 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65   sqlite3_bind_te
353d0 78 74 28 70 53 74 6d 74 2c 20 31 2c 20 61 7a 41  xt(pStmt, 1, azA
353e0 72 67 5b 31 5d 2c 20 2d 31 2c 20 53 51 4c 49 54  rg[1], -1, SQLIT
353f0 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20  E_TRANSIENT);.  
35400 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
35410 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74  qlite3_bind_text
35420 28 70 53 74 6d 74 2c 20 31 2c 20 22 25 22 2c 20  (pStmt, 1, "%", 
35430 2d 31 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49  -1, SQLITE_STATI
35440 43 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 77 68  C);.    }.    wh
35450 69 6c 65 28 20 73 71 6c 69 74 65 33 5f 73 74 65  ile( sqlite3_ste
35460 70 28 70 53 74 6d 74 29 3d 3d 53 51 4c 49 54 45  p(pStmt)==SQLITE
35470 5f 52 4f 57 20 29 7b 0a 20 20 20 20 20 20 69 66  _ROW ){.      if
35480 28 20 6e 52 6f 77 3e 3d 6e 41 6c 6c 6f 63 20 29  ( nRow>=nAlloc )
35490 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a  {.        char *
354a0 2a 61 7a 4e 65 77 3b 0a 20 20 20 20 20 20 20 20  *azNew;.        
354b0 69 6e 74 20 6e 32 20 3d 20 6e 41 6c 6c 6f 63 2a  int n2 = nAlloc*
354c0 32 20 2b 20 31 30 3b 0a 20 20 20 20 20 20 20 20  2 + 10;.        
354d0 61 7a 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 5f  azNew = sqlite3_
354e0 72 65 61 6c 6c 6f 63 36 34 28 61 7a 52 65 73 75  realloc64(azResu
354f0 6c 74 2c 20 73 69 7a 65 6f 66 28 61 7a 52 65 73  lt, sizeof(azRes
35500 75 6c 74 5b 30 5d 29 2a 6e 32 29 3b 0a 20 20 20  ult[0])*n2);.   
35510 20 20 20 20 20 69 66 28 20 61 7a 4e 65 77 3d 3d       if( azNew==
35520 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  0 ){.          r
35530 63 20 3d 20 73 68 65 6c 6c 4e 6f 6d 65 6d 45 72  c = shellNomemEr
35540 72 6f 72 28 29 3b 0a 20 20 20 20 20 20 20 20 20  ror();.         
35550 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
35560 7d 0a 20 20 20 20 20 20 20 20 6e 41 6c 6c 6f 63  }.        nAlloc
35570 20 3d 20 6e 32 3b 0a 20 20 20 20 20 20 20 20 61   = n2;.        a
35580 7a 52 65 73 75 6c 74 20 3d 20 61 7a 4e 65 77 3b  zResult = azNew;
35590 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
355a0 7a 52 65 73 75 6c 74 5b 6e 52 6f 77 5d 20 3d 20  zResult[nRow] = 
355b0 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
355c0 22 25 73 22 2c 20 73 71 6c 69 74 65 33 5f 63 6f  "%s", sqlite3_co
355d0 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c  lumn_text(pStmt,
355e0 20 30 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20   0));.      if( 
355f0 30 3d 3d 61 7a 52 65 73 75 6c 74 5b 6e 52 6f 77  0==azResult[nRow
35600 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  ] ){.        rc 
35610 3d 20 73 68 65 6c 6c 4e 6f 6d 65 6d 45 72 72 6f  = shellNomemErro
35620 72 28 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  r();.        bre
35630 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
35640 20 20 6e 52 6f 77 2b 2b 3b 0a 20 20 20 20 7d 0a    nRow++;.    }.
35650 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f      if( sqlite3_
35660 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 21  finalize(pStmt)!
35670 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
35680 20 20 20 20 72 63 20 3d 20 73 68 65 6c 6c 44 61      rc = shellDa
35690 74 61 62 61 73 65 45 72 72 6f 72 28 70 2d 3e 64  tabaseError(p->d
356a0 62 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  b);.    }..    /
356b0 2a 20 50 72 65 74 74 79 2d 70 72 69 6e 74 20 74  * Pretty-print t
356c0 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 61  he contents of a
356d0 72 72 61 79 20 61 7a 52 65 73 75 6c 74 5b 5d 20  rray azResult[] 
356e0 74 6f 20 74 68 65 20 6f 75 74 70 75 74 20 2a 2f  to the output */
356f0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 30 20 26  .    if( rc==0 &
35700 26 20 6e 52 6f 77 3e 30 20 29 7b 0a 20 20 20 20  & nRow>0 ){.    
35710 20 20 69 6e 74 20 6c 65 6e 2c 20 6d 61 78 6c 65    int len, maxle
35720 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74  n = 0;.      int
35730 20 69 2c 20 6a 3b 0a 20 20 20 20 20 20 69 6e 74   i, j;.      int
35740 20 6e 50 72 69 6e 74 43 6f 6c 2c 20 6e 50 72 69   nPrintCol, nPri
35750 6e 74 52 6f 77 3b 0a 20 20 20 20 20 20 66 6f 72  ntRow;.      for
35760 28 69 3d 30 3b 20 69 3c 6e 52 6f 77 3b 20 69 2b  (i=0; i<nRow; i+
35770 2b 29 7b 0a 20 20 20 20 20 20 20 20 6c 65 6e 20  +){.        len 
35780 3d 20 73 74 72 6c 65 6e 33 30 28 61 7a 52 65 73  = strlen30(azRes
35790 75 6c 74 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20  ult[i]);.       
357a0 20 69 66 28 20 6c 65 6e 3e 6d 61 78 6c 65 6e 20   if( len>maxlen 
357b0 29 20 6d 61 78 6c 65 6e 20 3d 20 6c 65 6e 3b 0a  ) maxlen = len;.
357c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 50        }.      nP
357d0 72 69 6e 74 43 6f 6c 20 3d 20 38 30 2f 28 6d 61  rintCol = 80/(ma
357e0 78 6c 65 6e 2b 32 29 3b 0a 20 20 20 20 20 20 69  xlen+2);.      i
357f0 66 28 20 6e 50 72 69 6e 74 43 6f 6c 3c 31 20 29  f( nPrintCol<1 )
35800 20 6e 50 72 69 6e 74 43 6f 6c 20 3d 20 31 3b 0a   nPrintCol = 1;.
35810 20 20 20 20 20 20 6e 50 72 69 6e 74 52 6f 77 20        nPrintRow 
35820 3d 20 28 6e 52 6f 77 20 2b 20 6e 50 72 69 6e 74  = (nRow + nPrint
35830 43 6f 6c 20 2d 20 31 29 2f 6e 50 72 69 6e 74 43  Col - 1)/nPrintC
35840 6f 6c 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  ol;.      for(i=
35850 30 3b 20 69 3c 6e 50 72 69 6e 74 52 6f 77 3b 20  0; i<nPrintRow; 
35860 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 66 6f  i++){.        fo
35870 72 28 6a 3d 69 3b 20 6a 3c 6e 52 6f 77 3b 20 6a  r(j=i; j<nRow; j
35880 2b 3d 6e 50 72 69 6e 74 52 6f 77 29 7b 0a 20 20  +=nPrintRow){.  
35890 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 53          char *zS
358a0 70 20 3d 20 6a 3c 6e 50 72 69 6e 74 52 6f 77 20  p = j<nPrintRow 
358b0 3f 20 22 22 20 3a 20 22 20 20 22 3b 0a 20 20 20  ? "" : "  ";.   
358c0 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e         utf8_prin
358d0 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 25 2d  tf(p->out, "%s%-
358e0 2a 73 22 2c 20 7a 53 70 2c 20 6d 61 78 6c 65 6e  *s", zSp, maxlen
358f0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
35900 20 20 20 20 20 20 20 20 61 7a 52 65 73 75 6c 74          azResult
35910 5b 6a 5d 20 3f 20 61 7a 52 65 73 75 6c 74 5b 6a  [j] ? azResult[j
35920 5d 3a 22 22 29 3b 0a 20 20 20 20 20 20 20 20 7d  ]:"");.        }
35930 0a 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69  .        raw_pri
35940 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 5c 6e 22  ntf(p->out, "\n"
35950 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
35960 0a 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20  ..    for(ii=0; 
35970 69 69 3c 6e 52 6f 77 3b 20 69 69 2b 2b 29 20 73  ii<nRow; ii++) s
35980 71 6c 69 74 65 33 5f 66 72 65 65 28 61 7a 52 65  qlite3_free(azRe
35990 73 75 6c 74 5b 69 69 5d 29 3b 0a 20 20 20 20 73  sult[ii]);.    s
359a0 71 6c 69 74 65 33 5f 66 72 65 65 28 61 7a 52 65  qlite3_free(azRe
359b0 73 75 6c 74 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a  sult);.  }else..
359c0 20 20 2f 2a 20 42 65 67 69 6e 20 72 65 64 69 72    /* Begin redir
359d0 65 63 74 69 6e 67 20 6f 75 74 70 75 74 20 74 6f  ecting output to
359e0 20 74 68 65 20 66 69 6c 65 20 22 74 65 73 74 63   the file "testc
359f0 61 73 65 2d 6f 75 74 2e 74 78 74 22 20 2a 2f 0a  ase-out.txt" */.
35a00 20 20 69 66 28 20 63 3d 3d 27 74 27 20 26 26 20    if( c=='t' && 
35a10 73 74 72 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c  strcmp(azArg[0],
35a20 22 74 65 73 74 63 61 73 65 22 29 3d 3d 30 20 29  "testcase")==0 )
35a30 7b 0a 20 20 20 20 6f 75 74 70 75 74 5f 72 65 73  {.    output_res
35a40 65 74 28 70 29 3b 0a 20 20 20 20 70 2d 3e 6f 75  et(p);.    p->ou
35a50 74 20 3d 20 6f 75 74 70 75 74 5f 66 69 6c 65 5f  t = output_file_
35a60 6f 70 65 6e 28 22 74 65 73 74 63 61 73 65 2d 6f  open("testcase-o
35a70 75 74 2e 74 78 74 22 29 3b 0a 20 20 20 20 69 66  ut.txt");.    if
35a80 28 20 70 2d 3e 6f 75 74 3d 3d 30 20 29 7b 0a 20  ( p->out==0 ){. 
35a90 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
35aa0 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20  stderr, "Error: 
35ab0 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 27 74 65 73  cannot open 'tes
35ac0 74 63 61 73 65 2d 6f 75 74 2e 74 78 74 27 5c 6e  tcase-out.txt'\n
35ad0 22 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ");.    }.    if
35ae0 28 20 6e 41 72 67 3e 3d 32 20 29 7b 0a 20 20 20  ( nArg>=2 ){.   
35af0 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
35b00 6e 74 66 28 73 69 7a 65 6f 66 28 70 2d 3e 7a 54  ntf(sizeof(p->zT
35b10 65 73 74 63 61 73 65 29 2c 20 70 2d 3e 7a 54 65  estcase), p->zTe
35b20 73 74 63 61 73 65 2c 20 22 25 73 22 2c 20 61 7a  stcase, "%s", az
35b30 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20 7d 65 6c  Arg[1]);.    }el
35b40 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
35b50 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
35b60 66 28 70 2d 3e 7a 54 65 73 74 63 61 73 65 29 2c  f(p->zTestcase),
35b70 20 70 2d 3e 7a 54 65 73 74 63 61 73 65 2c 20 22   p->zTestcase, "
35b80 3f 22 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  ?");.    }.  }el
35b90 73 65 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  se..#ifndef SQLI
35ba0 54 45 5f 55 4e 54 45 53 54 41 42 4c 45 0a 20 20  TE_UNTESTABLE.  
35bb0 69 66 28 20 63 3d 3d 27 74 27 20 26 26 20 6e 3e  if( c=='t' && n>
35bc0 3d 38 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a  =8 && strncmp(az
35bd0 41 72 67 5b 30 5d 2c 20 22 74 65 73 74 63 74 72  Arg[0], "testctr
35be0 6c 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20  l", n)==0 ){.   
35bf0 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 74   static const st
35c00 72 75 63 74 20 7b 0a 20 20 20 20 20 20 20 63 6f  ruct {.       co
35c10 6e 73 74 20 63 68 61 72 20 2a 7a 43 74 72 6c 4e  nst char *zCtrlN
35c20 61 6d 65 3b 20 20 20 2f 2a 20 4e 61 6d 65 20 6f  ame;   /* Name o
35c30 66 20 61 20 74 65 73 74 2d 63 6f 6e 74 72 6f 6c  f a test-control
35c40 20 6f 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20   option */.     
35c50 20 20 69 6e 74 20 63 74 72 6c 43 6f 64 65 3b 20    int ctrlCode; 
35c60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
35c70 74 65 67 65 72 20 63 6f 64 65 20 66 6f 72 20 74  teger code for t
35c80 68 61 74 20 6f 70 74 69 6f 6e 20 2a 2f 0a 20 20  hat option */.  
35c90 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
35ca0 2a 7a 55 73 61 67 65 3b 20 20 20 20 20 20 2f 2a  *zUsage;      /*
35cb0 20 55 73 61 67 65 20 6e 6f 74 65 73 20 2a 2f 0a   Usage notes */.
35cc0 20 20 20 20 7d 20 61 43 74 72 6c 5b 5d 20 3d 20      } aCtrl[] = 
35cd0 7b 0a 20 20 20 20 20 20 7b 20 22 61 6c 77 61 79  {.      { "alway
35ce0 73 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  s",             
35cf0 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
35d00 41 4c 57 41 59 53 2c 20 20 20 20 20 20 20 20 22  ALWAYS,        "
35d10 42 4f 4f 4c 45 41 4e 22 20 20 20 20 20 20 20 20  BOOLEAN"        
35d20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22      },.      { "
35d30 61 73 73 65 72 74 22 2c 20 20 20 20 20 20 20 20  assert",        
35d40 20 20 20 20 20 53 51 4c 49 54 45 5f 54 45 53 54       SQLITE_TEST
35d50 43 54 52 4c 5f 41 53 53 45 52 54 2c 20 20 20 20  CTRL_ASSERT,    
35d60 20 20 20 20 22 42 4f 4f 4c 45 41 4e 22 20 20 20      "BOOLEAN"   
35d70 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
35d80 2f 2a 7b 20 22 62 65 6e 69 67 6e 5f 6d 61 6c 6c  /*{ "benign_mall
35d90 6f 63 5f 68 6f 6f 6b 73 22 2c 53 51 4c 49 54 45  oc_hooks",SQLITE
35da0 5f 54 45 53 54 43 54 52 4c 5f 42 45 4e 49 47 4e  _TESTCTRL_BENIGN
35db0 5f 4d 41 4c 4c 4f 43 5f 48 4f 4f 4b 53 2c 20 22  _MALLOC_HOOKS, "
35dc0 22 20 20 20 20 20 20 20 20 20 20 7d 2c 2a 2f 0a  "          },*/.
35dd0 20 20 20 20 2f 2a 7b 20 22 62 69 74 76 65 63 5f      /*{ "bitvec_
35de0 74 65 73 74 22 2c 20 20 20 20 20 20 20 20 53 51  test",        SQ
35df0 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 42 49  LITE_TESTCTRL_BI
35e00 54 56 45 43 5f 54 45 53 54 2c 20 20 20 22 22 20  TVEC_TEST,   "" 
35e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
35e20 2c 2a 2f 0a 20 20 20 20 20 20 7b 20 22 62 79 74  ,*/.      { "byt
35e30 65 6f 72 64 65 72 22 2c 20 20 20 20 20 20 20 20  eorder",        
35e40 20 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52    SQLITE_TESTCTR
35e50 4c 5f 42 59 54 45 4f 52 44 45 52 2c 20 20 20 20  L_BYTEORDER,    
35e60 20 22 22 20 20 20 20 20 20 20 20 20 20 20 20 20   ""             
35e70 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 2f 2a 7b        },.    /*{
35e80 20 22 66 61 75 6c 74 5f 69 6e 73 74 61 6c 6c 22   "fault_install"
35e90 2c 20 20 20 20 20 20 53 51 4c 49 54 45 5f 54 45  ,      SQLITE_TE
35ea0 53 54 43 54 52 4c 5f 46 41 55 4c 54 5f 49 4e 53  STCTRL_FAULT_INS
35eb0 54 41 4c 4c 2c 20 22 22 20 20 20 20 20 20 20 20  TALL, ""        
35ec0 20 20 20 20 20 20 20 20 7d 2c 20 2a 2f 0a 20 20          }, */.  
35ed0 20 20 20 20 7b 20 22 69 6d 70 6f 73 74 65 72 22      { "imposter"
35ee0 2c 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49  ,           SQLI
35ef0 54 45 5f 54 45 53 54 43 54 52 4c 5f 49 4d 50 4f  TE_TESTCTRL_IMPO
35f00 53 54 45 52 2c 20 20 20 22 53 43 48 45 4d 41 20  STER,   "SCHEMA 
35f10 4f 4e 2f 4f 46 46 20 52 4f 4f 54 50 41 47 45 22  ON/OFF ROOTPAGE"
35f20 7d 2c 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  },.#ifdef SQLITE
35f30 5f 4e 5f 4b 45 59 57 4f 52 44 0a 20 20 20 20 20  _N_KEYWORD.     
35f40 20 7b 20 22 69 73 6b 65 79 77 6f 72 64 22 2c 20   { "iskeyword", 
35f50 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
35f60 54 45 53 54 43 54 52 4c 5f 49 53 4b 45 59 57 4f  TESTCTRL_ISKEYWO
35f70 52 44 2c 20 20 20 20 20 22 49 44 45 4e 54 49 46  RD,     "IDENTIF
35f80 49 45 52 22 20 20 20 20 20 20 20 20 20 7d 2c 0a  IER"         },.
35f90 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7b 20 22  #endif.      { "
35fa0 6c 6f 63 61 6c 74 69 6d 65 5f 66 61 75 6c 74 22  localtime_fault"
35fb0 2c 20 20 20 20 53 51 4c 49 54 45 5f 54 45 53 54  ,    SQLITE_TEST
35fc0 43 54 52 4c 5f 4c 4f 43 41 4c 54 49 4d 45 5f 46  CTRL_LOCALTIME_F
35fd0 41 55 4c 54 2c 22 42 4f 4f 4c 45 41 4e 22 20 20  AULT,"BOOLEAN"  
35fe0 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
35ff0 20 20 7b 20 22 6e 65 76 65 72 5f 63 6f 72 72 75    { "never_corru
36000 70 74 22 2c 20 20 20 20 20 20 53 51 4c 49 54 45  pt",      SQLITE
36010 5f 54 45 53 54 43 54 52 4c 5f 4e 45 56 45 52 5f  _TESTCTRL_NEVER_
36020 43 4f 52 52 55 50 54 2c 20 22 42 4f 4f 4c 45 41  CORRUPT, "BOOLEA
36030 4e 22 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c  N"            },
36040 0a 20 20 20 20 20 20 7b 20 22 6f 70 74 69 6d 69  .      { "optimi
36050 7a 61 74 69 6f 6e 73 22 2c 20 20 20 20 20 20 53  zations",      S
36060 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4f  QLITE_TESTCTRL_O
36070 50 54 49 4d 49 5a 41 54 49 4f 4e 53 2c 20 22 44  PTIMIZATIONS, "D
36080 49 53 41 42 4c 45 2d 4d 41 53 4b 22 20 20 20 20  ISABLE-MASK"    
36090 20 20 20 7d 2c 0a 23 69 66 64 65 66 20 59 59 43     },.#ifdef YYC
360a0 4f 56 45 52 41 47 45 0a 20 20 20 20 20 20 7b 20  OVERAGE.      { 
360b0 22 70 61 72 73 65 72 5f 63 6f 76 65 72 61 67 65  "parser_coverage
360c0 22 2c 20 20 20 20 53 51 4c 49 54 45 5f 54 45 53  ",    SQLITE_TES
360d0 54 43 54 52 4c 5f 50 41 52 53 45 52 5f 43 4f 56  TCTRL_PARSER_COV
360e0 45 52 41 47 45 2c 20 22 22 20 20 20 20 20 20 20  ERAGE, ""       
360f0 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 23 65 6e            },.#en
36100 64 69 66 0a 20 20 20 20 20 20 7b 20 22 70 65 6e  dif.      { "pen
36110 64 69 6e 67 5f 62 79 74 65 22 2c 20 20 20 20 20  ding_byte",     
36120 20 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52    SQLITE_TESTCTR
36130 4c 5f 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20  L_PENDING_BYTE, 
36140 20 22 4f 46 46 53 45 54 20 20 22 20 20 20 20 20   "OFFSET  "     
36150 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b        },.      {
36160 20 22 70 72 6e 67 5f 72 65 73 65 74 22 2c 20 20   "prng_reset",  
36170 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 54 45         SQLITE_TE
36180 53 54 43 54 52 4c 5f 50 52 4e 47 5f 52 45 53 45  STCTRL_PRNG_RESE
36190 54 2c 20 20 20 20 22 22 20 20 20 20 20 20 20 20  T,    ""        
361a0 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
361b0 20 20 20 20 7b 20 22 70 72 6e 67 5f 72 65 73 74      { "prng_rest
361c0 6f 72 65 22 2c 20 20 20 20 20 20 20 53 51 4c 49  ore",       SQLI
361d0 54 45 5f 54 45 53 54 43 54 52 4c 5f 50 52 4e 47  TE_TESTCTRL_PRNG
361e0 5f 52 45 53 54 4f 52 45 2c 20 20 22 22 20 20 20  _RESTORE,  ""   
361f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36200 7d 2c 0a 20 20 20 20 20 20 7b 20 22 70 72 6e 67  },.      { "prng
36210 5f 73 61 76 65 22 2c 20 20 20 20 20 20 20 20 20  _save",         
36220 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c   SQLITE_TESTCTRL
36230 5f 50 52 4e 47 5f 53 41 56 45 2c 20 20 20 20 20  _PRNG_SAVE,     
36240 22 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ""              
36250 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20       },.      { 
36260 22 72 65 73 65 72 76 65 22 2c 20 20 20 20 20 20  "reserve",      
36270 20 20 20 20 20 20 53 51 4c 49 54 45 5f 54 45 53        SQLITE_TES
36280 54 43 54 52 4c 5f 52 45 53 45 52 56 45 2c 20 20  TCTRL_RESERVE,  
36290 20 20 20 20 20 22 42 59 54 45 53 2d 4f 46 2d 52       "BYTES-OF-R
362a0 45 53 45 52 56 45 22 20 20 20 7d 2c 0a 20 20 20  ESERVE"   },.   
362b0 20 7d 3b 0a 20 20 20 20 69 6e 74 20 74 65 73 74   };.    int test
362c0 63 74 72 6c 20 3d 20 2d 31 3b 0a 20 20 20 20 69  ctrl = -1;.    i
362d0 6e 74 20 69 43 74 72 6c 20 3d 20 2d 31 3b 0a 20  nt iCtrl = -1;. 
362e0 20 20 20 69 6e 74 20 72 63 32 20 3d 20 30 3b 20     int rc2 = 0; 
362f0 20 20 20 2f 2a 20 30 3a 20 75 73 61 67 65 2e 20     /* 0: usage. 
36300 20 31 3a 20 25 64 20 20 32 3a 20 25 78 20 20 33   1: %d  2: %x  3
36310 3a 20 6e 6f 2d 6f 75 74 70 75 74 20 2a 2f 0a 20  : no-output */. 
36320 20 20 20 69 6e 74 20 69 73 4f 6b 20 3d 20 30 3b     int isOk = 0;
36330 0a 20 20 20 20 69 6e 74 20 69 2c 20 6e 32 3b 0a  .    int i, n2;.
36340 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
36350 7a 43 6d 64 20 3d 20 30 3b 0a 0a 20 20 20 20 6f  zCmd = 0;..    o
36360 70 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a 20 20  pen_db(p, 0);.  
36370 20 20 7a 43 6d 64 20 3d 20 6e 41 72 67 3e 3d 32    zCmd = nArg>=2
36380 20 3f 20 61 7a 41 72 67 5b 31 5d 20 3a 20 22 68   ? azArg[1] : "h
36390 65 6c 70 22 3b 0a 0a 20 20 20 20 2f 2a 20 54 68  elp";..    /* Th
363a0 65 20 61 72 67 75 6d 65 6e 74 20 63 61 6e 20 6f  e argument can o
363b0 70 74 69 6f 6e 61 6c 6c 79 20 62 65 67 69 6e 20  ptionally begin 
363c0 77 69 74 68 20 22 2d 22 20 6f 72 20 22 2d 2d 22  with "-" or "--"
363d0 20 2a 2f 0a 20 20 20 20 69 66 28 20 7a 43 6d 64   */.    if( zCmd
363e0 5b 30 5d 3d 3d 27 2d 27 20 26 26 20 7a 43 6d 64  [0]=='-' && zCmd
363f0 5b 31 5d 20 29 7b 0a 20 20 20 20 20 20 7a 43 6d  [1] ){.      zCm
36400 64 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 7a  d++;.      if( z
36410 43 6d 64 5b 30 5d 3d 3d 27 2d 27 20 26 26 20 7a  Cmd[0]=='-' && z
36420 43 6d 64 5b 31 5d 20 29 20 7a 43 6d 64 2b 2b 3b  Cmd[1] ) zCmd++;
36430 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 2d  .    }..    /* -
36440 2d 68 65 6c 70 20 6c 69 73 74 73 20 61 6c 6c 20  -help lists all 
36450 74 65 73 74 2d 63 6f 6e 74 72 6f 6c 73 20 2a 2f  test-controls */
36460 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28  .    if( strcmp(
36470 7a 43 6d 64 2c 22 68 65 6c 70 22 29 3d 3d 30 20  zCmd,"help")==0 
36480 29 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72  ){.      utf8_pr
36490 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 41 76  intf(p->out, "Av
364a0 61 69 6c 61 62 6c 65 20 74 65 73 74 2d 63 6f 6e  ailable test-con
364b0 74 72 6f 6c 73 3a 5c 6e 22 29 3b 0a 20 20 20 20  trols:\n");.    
364c0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 41 72 72    for(i=0; i<Arr
364d0 61 79 53 69 7a 65 28 61 43 74 72 6c 29 3b 20 69  aySize(aCtrl); i
364e0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66  ++){.        utf
364f0 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  8_printf(p->out,
36500 20 22 20 20 2e 74 65 73 74 63 74 72 6c 20 25 73   "  .testctrl %s
36510 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20   %s\n",.        
36520 20 20 20 20 20 20 20 20 20 20 20 20 61 43 74 72              aCtr
36530 6c 5b 69 5d 2e 7a 43 74 72 6c 4e 61 6d 65 2c 20  l[i].zCtrlName, 
36540 61 43 74 72 6c 5b 69 5d 2e 7a 55 73 61 67 65 29  aCtrl[i].zUsage)
36550 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
36560 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 67 6f  rc = 1;.      go
36570 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f  to meta_command_
36580 65 78 69 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  exit;.    }..   
36590 20 2f 2a 20 63 6f 6e 76 65 72 74 20 74 65 73 74   /* convert test
365a0 63 74 72 6c 20 74 65 78 74 20 6f 70 74 69 6f 6e  ctrl text option
365b0 20 74 6f 20 76 61 6c 75 65 2e 20 61 6c 6c 6f 77   to value. allow
365c0 20 61 6e 79 20 75 6e 69 71 75 65 20 70 72 65 66   any unique pref
365d0 69 78 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65  ix.    ** of the
365e0 20 6f 70 74 69 6f 6e 20 6e 61 6d 65 2c 20 6f 72   option name, or
365f0 20 61 20 6e 75 6d 65 72 69 63 61 6c 20 76 61 6c   a numerical val
36600 75 65 2e 20 2a 2f 0a 20 20 20 20 6e 32 20 3d 20  ue. */.    n2 = 
36610 73 74 72 6c 65 6e 33 30 28 7a 43 6d 64 29 3b 0a  strlen30(zCmd);.
36620 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 41      for(i=0; i<A
36630 72 72 61 79 53 69 7a 65 28 61 43 74 72 6c 29 3b  rraySize(aCtrl);
36640 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
36650 20 73 74 72 6e 63 6d 70 28 7a 43 6d 64 2c 20 61   strncmp(zCmd, a
36660 43 74 72 6c 5b 69 5d 2e 7a 43 74 72 6c 4e 61 6d  Ctrl[i].zCtrlNam
36670 65 2c 20 6e 32 29 3d 3d 30 20 29 7b 0a 20 20 20  e, n2)==0 ){.   
36680 20 20 20 20 20 69 66 28 20 74 65 73 74 63 74 72       if( testctr
36690 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  l<0 ){.         
366a0 20 74 65 73 74 63 74 72 6c 20 3d 20 61 43 74 72   testctrl = aCtr
366b0 6c 5b 69 5d 2e 63 74 72 6c 43 6f 64 65 3b 0a 20  l[i].ctrlCode;. 
366c0 20 20 20 20 20 20 20 20 20 69 43 74 72 6c 20 3d           iCtrl =
366d0 20 69 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73   i;.        }els
366e0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 75 74 66  e{.          utf
366f0 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  8_printf(stderr,
36700 20 22 45 72 72 6f 72 3a 20 61 6d 62 69 67 75 6f   "Error: ambiguo
36710 75 73 20 74 65 73 74 2d 63 6f 6e 74 72 6f 6c 3a  us test-control:
36720 20 5c 22 25 73 5c 22 5c 6e 22 0a 20 20 20 20 20   \"%s\"\n".     
36730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36740 20 20 20 20 20 20 20 20 20 22 55 73 65 20 5c 22           "Use \"
36750 2e 74 65 73 74 63 74 72 6c 20 2d 2d 68 65 6c 70  .testctrl --help
36760 5c 22 20 66 6f 72 20 68 65 6c 70 5c 6e 22 2c 20  \" for help\n", 
36770 7a 43 6d 64 29 3b 0a 20 20 20 20 20 20 20 20 20  zCmd);.         
36780 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20   rc = 1;.       
36790 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d     goto meta_com
367a0 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20 20  mand_exit;.     
367b0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
367c0 20 7d 0a 20 20 20 20 69 66 28 20 74 65 73 74 63   }.    if( testc
367d0 74 72 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20 75  trl<0 ){.      u
367e0 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72  tf8_printf(stder
367f0 72 2c 22 45 72 72 6f 72 3a 20 75 6e 6b 6e 6f 77  r,"Error: unknow
36800 6e 20 74 65 73 74 2d 63 6f 6e 74 72 6f 6c 3a 20  n test-control: 
36810 25 73 5c 6e 22 0a 20 20 20 20 20 20 20 20 20 20  %s\n".          
36820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
36830 55 73 65 20 5c 22 2e 74 65 73 74 63 74 72 6c 20  Use \".testctrl 
36840 2d 2d 68 65 6c 70 5c 22 20 66 6f 72 20 68 65 6c  --help\" for hel
36850 70 5c 6e 22 2c 20 7a 43 6d 64 29 3b 0a 20 20 20  p\n", zCmd);.   
36860 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 77   }else{.      sw
36870 69 74 63 68 28 74 65 73 74 63 74 72 6c 29 7b 0a  itch(testctrl){.
36880 0a 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69  .        /* sqli
36890 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c  te3_test_control
368a0 28 69 6e 74 2c 20 64 62 2c 20 69 6e 74 29 20 2a  (int, db, int) *
368b0 2f 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 53  /.        case S
368c0 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4f  QLITE_TESTCTRL_O
368d0 50 54 49 4d 49 5a 41 54 49 4f 4e 53 3a 0a 20 20  PTIMIZATIONS:.  
368e0 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
368f0 45 5f 54 45 53 54 43 54 52 4c 5f 52 45 53 45 52  E_TESTCTRL_RESER
36900 56 45 3a 0a 20 20 20 20 20 20 20 20 20 20 69 66  VE:.          if
36910 28 20 6e 41 72 67 3d 3d 33 20 29 7b 0a 20 20 20  ( nArg==3 ){.   
36920 20 20 20 20 20 20 20 20 20 69 6e 74 20 6f 70 74           int opt
36930 20 3d 20 28 69 6e 74 29 73 74 72 74 6f 6c 28 61   = (int)strtol(a
36940 7a 41 72 67 5b 32 5d 2c 20 30 2c 20 30 29 3b 0a  zArg[2], 0, 0);.
36950 20 20 20 20 20 20 20 20 20 20 20 20 72 63 32 20              rc2 
36960 3d 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63  = sqlite3_test_c
36970 6f 6e 74 72 6f 6c 28 74 65 73 74 63 74 72 6c 2c  ontrol(testctrl,
36980 20 70 2d 3e 64 62 2c 20 6f 70 74 29 3b 0a 20 20   p->db, opt);.  
36990 20 20 20 20 20 20 20 20 20 20 69 73 4f 6b 20 3d            isOk =
369a0 20 33 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a   3;.          }.
369b0 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
369c0 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c  ..        /* sql
369d0 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f  ite3_test_contro
369e0 6c 28 69 6e 74 29 20 2a 2f 0a 20 20 20 20 20 20  l(int) */.      
369f0 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45    case SQLITE_TE
36a00 53 54 43 54 52 4c 5f 50 52 4e 47 5f 53 41 56 45  STCTRL_PRNG_SAVE
36a10 3a 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 53  :.        case S
36a20 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 50  QLITE_TESTCTRL_P
36a30 52 4e 47 5f 52 45 53 54 4f 52 45 3a 0a 20 20 20  RNG_RESTORE:.   
36a40 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
36a50 5f 54 45 53 54 43 54 52 4c 5f 50 52 4e 47 5f 52  _TESTCTRL_PRNG_R
36a60 45 53 45 54 3a 0a 20 20 20 20 20 20 20 20 63 61  ESET:.        ca
36a70 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54  se SQLITE_TESTCT
36a80 52 4c 5f 42 59 54 45 4f 52 44 45 52 3a 0a 20 20  RL_BYTEORDER:.  
36a90 20 20 20 20 20 20 20 20 69 66 28 20 6e 41 72 67          if( nArg
36aa0 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==2 ){.         
36ab0 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33     rc2 = sqlite3
36ac0 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 74 65  _test_control(te
36ad0 73 74 63 74 72 6c 29 3b 0a 20 20 20 20 20 20 20  stctrl);.       
36ae0 20 20 20 20 20 69 73 4f 6b 20 3d 20 74 65 73 74       isOk = test
36af0 63 74 72 6c 3d 3d 53 51 4c 49 54 45 5f 54 45 53  ctrl==SQLITE_TES
36b00 54 43 54 52 4c 5f 42 59 54 45 4f 52 44 45 52 20  TCTRL_BYTEORDER 
36b10 3f 20 31 20 3a 20 33 3b 0a 20 20 20 20 20 20 20  ? 1 : 3;.       
36b20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 62     }.          b
36b30 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20 20 20 2f  reak;..        /
36b40 2a 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63  * sqlite3_test_c
36b50 6f 6e 74 72 6f 6c 28 69 6e 74 2c 20 75 69 6e 74  ontrol(int, uint
36b60 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 61 73  ) */.        cas
36b70 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  e SQLITE_TESTCTR
36b80 4c 5f 50 45 4e 44 49 4e 47 5f 42 59 54 45 3a 0a  L_PENDING_BYTE:.
36b90 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6e 41            if( nA
36ba0 72 67 3d 3d 33 20 29 7b 0a 20 20 20 20 20 20 20  rg==3 ){.       
36bb0 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 69 6e       unsigned in
36bc0 74 20 6f 70 74 20 3d 20 28 75 6e 73 69 67 6e 65  t opt = (unsigne
36bd0 64 20 69 6e 74 29 69 6e 74 65 67 65 72 56 61 6c  d int)integerVal
36be0 75 65 28 61 7a 41 72 67 5b 32 5d 29 3b 0a 20 20  ue(azArg[2]);.  
36bf0 20 20 20 20 20 20 20 20 20 20 72 63 32 20 3d 20            rc2 = 
36c00 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e  sqlite3_test_con
36c10 74 72 6f 6c 28 74 65 73 74 63 74 72 6c 2c 20 6f  trol(testctrl, o
36c20 70 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  pt);.           
36c30 20 69 73 4f 6b 20 3d 20 33 3b 0a 20 20 20 20 20   isOk = 3;.     
36c40 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
36c50 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20 20   break;..       
36c60 20 2f 2a 20 73 71 6c 69 74 65 33 5f 74 65 73 74   /* sqlite3_test
36c70 5f 63 6f 6e 74 72 6f 6c 28 69 6e 74 2c 20 69 6e  _control(int, in
36c80 74 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 61  t) */.        ca
36c90 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54  se SQLITE_TESTCT
36ca0 52 4c 5f 41 53 53 45 52 54 3a 0a 20 20 20 20 20  RL_ASSERT:.     
36cb0 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54     case SQLITE_T
36cc0 45 53 54 43 54 52 4c 5f 41 4c 57 41 59 53 3a 0a  ESTCTRL_ALWAYS:.
36cd0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6e 41            if( nA
36ce0 72 67 3d 3d 33 20 29 7b 0a 20 20 20 20 20 20 20  rg==3 ){.       
36cf0 20 20 20 20 20 69 6e 74 20 6f 70 74 20 3d 20 62       int opt = b
36d00 6f 6f 6c 65 61 6e 56 61 6c 75 65 28 61 7a 41 72  ooleanValue(azAr
36d10 67 5b 32 5d 29 3b 0a 20 20 20 20 20 20 20 20 20  g[2]);.         
36d20 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33     rc2 = sqlite3
36d30 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 74 65  _test_control(te
36d40 73 74 63 74 72 6c 2c 20 6f 70 74 29 3b 0a 20 20  stctrl, opt);.  
36d50 20 20 20 20 20 20 20 20 20 20 69 73 4f 6b 20 3d            isOk =
36d60 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a   1;.          }.
36d70 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
36d80 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c  ..        /* sql
36d90 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f  ite3_test_contro
36da0 6c 28 69 6e 74 2c 20 69 6e 74 29 20 2a 2f 0a 20  l(int, int) */. 
36db0 20 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49         case SQLI
36dc0 54 45 5f 54 45 53 54 43 54 52 4c 5f 4c 4f 43 41  TE_TESTCTRL_LOCA
36dd0 4c 54 49 4d 45 5f 46 41 55 4c 54 3a 0a 20 20 20  LTIME_FAULT:.   
36de0 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
36df0 5f 54 45 53 54 43 54 52 4c 5f 4e 45 56 45 52 5f  _TESTCTRL_NEVER_
36e00 43 4f 52 52 55 50 54 3a 0a 20 20 20 20 20 20 20  CORRUPT:.       
36e10 20 20 20 69 66 28 20 6e 41 72 67 3d 3d 33 20 29     if( nArg==3 )
36e20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e  {.            in
36e30 74 20 6f 70 74 20 3d 20 62 6f 6f 6c 65 61 6e 56  t opt = booleanV
36e40 61 6c 75 65 28 61 7a 41 72 67 5b 32 5d 29 3b 0a  alue(azArg[2]);.
36e50 20 20 20 20 20 20 20 20 20 20 20 20 72 63 32 20              rc2 
36e60 3d 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63  = sqlite3_test_c
36e70 6f 6e 74 72 6f 6c 28 74 65 73 74 63 74 72 6c 2c  ontrol(testctrl,
36e80 20 6f 70 74 29 3b 0a 20 20 20 20 20 20 20 20 20   opt);.         
36e90 20 20 20 69 73 4f 6b 20 3d 20 33 3b 0a 20 20 20     isOk = 3;.   
36ea0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
36eb0 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20     break;..     
36ec0 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 74 65     /* sqlite3_te
36ed0 73 74 5f 63 6f 6e 74 72 6f 6c 28 69 6e 74 2c 20  st_control(int, 
36ee0 63 68 61 72 20 2a 29 20 2a 2f 0a 23 69 66 64 65  char *) */.#ifde
36ef0 66 20 53 51 4c 49 54 45 5f 4e 5f 4b 45 59 57 4f  f SQLITE_N_KEYWO
36f00 52 44 0a 20 20 20 20 20 20 20 20 63 61 73 65 20  RD.        case 
36f10 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
36f20 49 53 4b 45 59 57 4f 52 44 3a 0a 20 20 20 20 20  ISKEYWORD:.     
36f30 20 20 20 20 20 69 66 28 20 6e 41 72 67 3d 3d 33       if( nArg==3
36f40 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
36f50 63 6f 6e 73 74 20 63 68 61 72 20 2a 6f 70 74 20  const char *opt 
36f60 3d 20 61 7a 41 72 67 5b 32 5d 3b 0a 20 20 20 20  = azArg[2];.    
36f70 20 20 20 20 20 20 20 20 72 63 32 20 3d 20 73 71          rc2 = sq
36f80 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72  lite3_test_contr
36f90 6f 6c 28 74 65 73 74 63 74 72 6c 2c 20 6f 70 74  ol(testctrl, opt
36fa0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
36fb0 73 4f 6b 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  sOk = 1;.       
36fc0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 62     }.          b
36fd0 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  reak;.#endif..  
36fe0 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
36ff0 45 5f 54 45 53 54 43 54 52 4c 5f 49 4d 50 4f 53  E_TESTCTRL_IMPOS
37000 54 45 52 3a 0a 20 20 20 20 20 20 20 20 20 20 69  TER:.          i
37010 66 28 20 6e 41 72 67 3d 3d 35 20 29 7b 0a 20 20  f( nArg==5 ){.  
37020 20 20 20 20 20 20 20 20 20 20 72 63 32 20 3d 20            rc2 = 
37030 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e  sqlite3_test_con
37040 74 72 6f 6c 28 74 65 73 74 63 74 72 6c 2c 20 70  trol(testctrl, p
37050 2d 3e 64 62 2c 0a 20 20 20 20 20 20 20 20 20 20  ->db,.          
37060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37070 61 7a 41 72 67 5b 32 5d 2c 0a 20 20 20 20 20 20  azArg[2],.      
37080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37090 20 20 20 20 69 6e 74 65 67 65 72 56 61 6c 75 65      integerValue
370a0 28 61 7a 41 72 67 5b 33 5d 29 2c 0a 20 20 20 20  (azArg[3]),.    
370b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
370c0 20 20 20 20 20 20 69 6e 74 65 67 65 72 56 61 6c        integerVal
370d0 75 65 28 61 7a 41 72 67 5b 34 5d 29 29 3b 0a 20  ue(azArg[4]));. 
370e0 20 20 20 20 20 20 20 20 20 20 20 69 73 4f 6b 20             isOk 
370f0 3d 20 33 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  = 3;.          }
37100 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
37110 3b 0a 0a 23 69 66 64 65 66 20 59 59 43 4f 56 45  ;..#ifdef YYCOVE
37120 52 41 47 45 0a 20 20 20 20 20 20 20 20 63 61 73  RAGE.        cas
37130 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  e SQLITE_TESTCTR
37140 4c 5f 50 41 52 53 45 52 5f 43 4f 56 45 52 41 47  L_PARSER_COVERAG
37150 45 3a 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  E:.          if(
37160 20 6e 41 72 67 3d 3d 32 20 29 7b 0a 20 20 20 20   nArg==2 ){.    
37170 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
37180 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 74 65 73  test_control(tes
37190 74 63 74 72 6c 2c 20 70 2d 3e 6f 75 74 29 3b 0a  tctrl, p->out);.
371a0 20 20 20 20 20 20 20 20 20 20 20 20 69 73 4f 6b              isOk
371b0 20 3d 20 33 3b 0a 20 20 20 20 20 20 20 20 20 20   = 3;.          
371c0 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7d  }.#endif.      }
371d0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
371e0 73 4f 6b 3d 3d 30 20 26 26 20 69 43 74 72 6c 3e  sOk==0 && iCtrl>
371f0 3d 30 20 29 7b 0a 20 20 20 20 20 20 75 74 66 38  =0 ){.      utf8
37200 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
37210 22 55 73 61 67 65 3a 20 2e 74 65 73 74 63 74 72  "Usage: .testctr
37220 6c 20 25 73 20 25 73 5c 6e 22 2c 20 7a 43 6d 64  l %s %s\n", zCmd
37230 2c 20 61 43 74 72 6c 5b 69 43 74 72 6c 5d 2e 7a  , aCtrl[iCtrl].z
37240 55 73 61 67 65 29 3b 0a 20 20 20 20 20 20 72 63  Usage);.      rc
37250 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20   = 1;.    }else 
37260 69 66 28 20 69 73 4f 6b 3d 3d 31 20 29 7b 0a 20  if( isOk==1 ){. 
37270 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
37280 70 2d 3e 6f 75 74 2c 20 22 25 64 5c 6e 22 2c 20  p->out, "%d\n", 
37290 72 63 32 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  rc2);.    }else 
372a0 69 66 28 20 69 73 4f 6b 3d 3d 32 20 29 7b 0a 20  if( isOk==2 ){. 
372b0 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
372c0 70 2d 3e 6f 75 74 2c 20 22 30 78 25 30 38 78 5c  p->out, "0x%08x\
372d0 6e 22 2c 20 72 63 32 29 3b 0a 20 20 20 20 7d 0a  n", rc2);.    }.
372e0 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 20 2f    }else.#endif /
372f0 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  * !defined(SQLIT
37300 45 5f 55 4e 54 45 53 54 41 42 4c 45 29 20 2a 2f  E_UNTESTABLE) */
37310 0a 0a 20 20 69 66 28 20 63 3d 3d 27 74 27 20 26  ..  if( c=='t' &
37320 26 20 6e 3e 34 20 26 26 20 73 74 72 6e 63 6d 70  & n>4 && strncmp
37330 28 61 7a 41 72 67 5b 30 5d 2c 20 22 74 69 6d 65  (azArg[0], "time
37340 6f 75 74 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20  out", n)==0 ){. 
37350 20 20 20 6f 70 65 6e 5f 64 62 28 70 2c 20 30 29     open_db(p, 0)
37360 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 75  ;.    sqlite3_bu
37370 73 79 5f 74 69 6d 65 6f 75 74 28 70 2d 3e 64 62  sy_timeout(p->db
37380 2c 20 6e 41 72 67 3e 3d 32 20 3f 20 28 69 6e 74  , nArg>=2 ? (int
37390 29 69 6e 74 65 67 65 72 56 61 6c 75 65 28 61 7a  )integerValue(az
373a0 41 72 67 5b 31 5d 29 20 3a 20 30 29 3b 0a 20 20  Arg[1]) : 0);.  
373b0 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d  }else..  if( c==
373c0 27 74 27 20 26 26 20 6e 3e 3d 35 20 26 26 20 73  't' && n>=5 && s
373d0 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c  trncmp(azArg[0],
373e0 20 22 74 69 6d 65 72 22 2c 20 6e 29 3d 3d 30 20   "timer", n)==0 
373f0 29 7b 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3d  ){.    if( nArg=
37400 3d 32 20 29 7b 0a 20 20 20 20 20 20 65 6e 61 62  =2 ){.      enab
37410 6c 65 54 69 6d 65 72 20 3d 20 62 6f 6f 6c 65 61  leTimer = boolea
37420 6e 56 61 6c 75 65 28 61 7a 41 72 67 5b 31 5d 29  nValue(azArg[1])
37430 3b 0a 20 20 20 20 20 20 69 66 28 20 65 6e 61 62  ;.      if( enab
37440 6c 65 54 69 6d 65 72 20 26 26 20 21 48 41 53 5f  leTimer && !HAS_
37450 54 49 4d 45 52 20 29 7b 0a 20 20 20 20 20 20 20  TIMER ){.       
37460 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65   raw_printf(stde
37470 72 72 2c 20 22 45 72 72 6f 72 3a 20 74 69 6d 65  rr, "Error: time
37480 72 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 20  r not available 
37490 6f 6e 20 74 68 69 73 20 73 79 73 74 65 6d 2e 5c  on this system.\
374a0 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 65 6e 61  n");.        ena
374b0 62 6c 65 54 69 6d 65 72 20 3d 20 30 3b 0a 20 20  bleTimer = 0;.  
374c0 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
374d0 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74  .      raw_print
374e0 66 28 73 74 64 65 72 72 2c 20 22 55 73 61 67 65  f(stderr, "Usage
374f0 3a 20 2e 74 69 6d 65 72 20 6f 6e 7c 6f 66 66 5c  : .timer on|off\
37500 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  n");.      rc = 
37510 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  1;.    }.  }else
37520 0a 0a 20 20 69 66 28 20 63 3d 3d 27 74 27 20 26  ..  if( c=='t' &
37530 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b  & strncmp(azArg[
37540 30 5d 2c 20 22 74 72 61 63 65 22 2c 20 6e 29 3d  0], "trace", n)=
37550 3d 30 20 29 7b 0a 20 20 20 20 6f 70 65 6e 5f 64  =0 ){.    open_d
37560 62 28 70 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  b(p, 0);.    if(
37570 20 6e 41 72 67 21 3d 32 20 29 7b 0a 20 20 20 20   nArg!=2 ){.    
37580 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64    raw_printf(std
37590 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 74 72  err, "Usage: .tr
375a0 61 63 65 20 46 49 4c 45 7c 6f 66 66 5c 6e 22 29  ace FILE|off\n")
375b0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a  ;.      rc = 1;.
375c0 20 20 20 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f        goto meta_
375d0 63 6f 6d 6d 61 6e 64 5f 65