/ Hex Artifact Content
Login

Artifact be819b84dc08e65bec15836cea6bf05303abe2ed7b46208bde76ef5ee0cdeb3d:


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 69 66 6e 64 65  .# endif.# ifnde
0d60: 66 20 75 6e 6c 69 6e 6b 0a 23 20 20 64 65 66 69  f unlink.#  defi
0d70: 6e 65 20 75 6e 6c 69 6e 6b 20 5f 75 6e 6c 69 6e  ne unlink _unlin
0d80: 6b 0a 23 20 65 6e 64 69 66 0a 23 20 75 6e 64 65  k.# endif.# unde
0d90: 66 20 70 6f 70 65 6e 0a 23 20 64 65 66 69 6e 65  f popen.# define
0da0: 20 70 6f 70 65 6e 20 5f 70 6f 70 65 6e 0a 23 20   popen _popen.# 
0db0: 75 6e 64 65 66 20 70 63 6c 6f 73 65 0a 23 20 64  undef pclose.# d
0dc0: 65 66 69 6e 65 20 70 63 6c 6f 73 65 20 5f 70 63  efine pclose _pc
0dd0: 6c 6f 73 65 0a 23 65 6c 73 65 0a 20 2f 2a 20 4d  lose.#else. /* M
0de0: 61 6b 65 20 73 75 72 65 20 69 73 61 74 74 79 28  ake sure isatty(
0df0: 29 20 68 61 73 20 61 20 70 72 6f 74 6f 74 79 70  ) has a prototyp
0e00: 65 2e 20 2a 2f 0a 20 65 78 74 65 72 6e 20 69 6e  e. */. extern in
0e10: 74 20 69 73 61 74 74 79 28 69 6e 74 29 3b 0a 0a  t isatty(int);..
0e20: 23 20 69 66 20 21 64 65 66 69 6e 65 64 28 5f 5f  # if !defined(__
0e30: 52 54 50 5f 5f 29 20 26 26 20 21 64 65 66 69 6e  RTP__) && !defin
0e40: 65 64 28 5f 57 52 53 5f 4b 45 52 4e 45 4c 29 0a  ed(_WRS_KERNEL).
0e50: 20 20 2f 2a 20 70 6f 70 65 6e 20 61 6e 64 20 70    /* popen and p
0e60: 63 6c 6f 73 65 20 61 72 65 20 6e 6f 74 20 43 38  close are not C8
0e70: 39 20 66 75 6e 63 74 69 6f 6e 73 20 61 6e 64 20  9 functions and 
0e80: 73 6f 20 61 72 65 0a 20 20 2a 2a 20 73 6f 6d 65  so are.  ** some
0e90: 74 69 6d 65 73 20 6f 6d 69 74 74 65 64 20 66 72  times omitted fr
0ea0: 6f 6d 20 74 68 65 20 3c 73 74 64 69 6f 2e 68 3e  om the <stdio.h>
0eb0: 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 20 65 78   header */.   ex
0ec0: 74 65 72 6e 20 46 49 4c 45 20 2a 70 6f 70 65 6e  tern FILE *popen
0ed0: 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 63 6f 6e  (const char*,con
0ee0: 73 74 20 63 68 61 72 2a 29 3b 0a 20 20 20 65 78  st char*);.   ex
0ef0: 74 65 72 6e 20 69 6e 74 20 70 63 6c 6f 73 65 28  tern int pclose(
0f00: 46 49 4c 45 2a 29 3b 0a 23 20 65 6c 73 65 0a 23  FILE*);.# else.#
0f10: 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f    define SQLITE_
0f20: 4f 4d 49 54 5f 50 4f 50 45 4e 20 31 0a 23 20 65  OMIT_POPEN 1.# e
0f30: 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a 23 69 66  ndif.#endif..#if
0f40: 20 64 65 66 69 6e 65 64 28 5f 57 49 4e 33 32 5f   defined(_WIN32_
0f50: 57 43 45 29 0a 2f 2a 20 57 69 6e 64 6f 77 73 20  WCE)./* Windows 
0f60: 43 45 20 28 61 72 6d 2d 77 69 6e 63 65 2d 6d 69  CE (arm-wince-mi
0f70: 6e 67 77 33 32 63 65 2d 67 63 63 29 20 64 6f 65  ngw32ce-gcc) doe
0f80: 73 20 6e 6f 74 20 70 72 6f 76 69 64 65 20 69 73  s not provide is
0f90: 61 74 74 79 28 29 0a 20 2a 20 74 68 75 73 20 77  atty(). * thus w
0fa0: 65 20 61 6c 77 61 79 73 20 61 73 73 75 6d 65 20  e always assume 
0fb0: 74 68 61 74 20 77 65 20 68 61 76 65 20 61 20 63  that we have a c
0fc0: 6f 6e 73 6f 6c 65 2e 20 54 68 61 74 20 63 61 6e  onsole. That can
0fd0: 20 62 65 0a 20 2a 20 6f 76 65 72 72 69 64 64 65   be. * overridde
0fe0: 6e 20 77 69 74 68 20 74 68 65 20 2d 62 61 74 63  n with the -batc
0ff0: 68 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20 6f  h command line o
1000: 70 74 69 6f 6e 2e 0a 20 2a 2f 0a 23 64 65 66 69  ption.. */.#defi
1010: 6e 65 20 69 73 61 74 74 79 28 78 29 20 31 0a 23  ne isatty(x) 1.#
1020: 65 6e 64 69 66 0a 0a 2f 2a 20 63 74 79 70 65 20  endif../* ctype 
1030: 6d 61 63 72 6f 73 20 74 68 61 74 20 77 6f 72 6b  macros that work
1040: 20 77 69 74 68 20 73 69 67 6e 65 64 20 63 68 61   with signed cha
1050: 72 61 63 74 65 72 73 20 2a 2f 0a 23 64 65 66 69  racters */.#defi
1060: 6e 65 20 49 73 53 70 61 63 65 28 58 29 20 20 69  ne IsSpace(X)  i
1070: 73 73 70 61 63 65 28 28 75 6e 73 69 67 6e 65 64  sspace((unsigned
1080: 20 63 68 61 72 29 58 29 0a 23 64 65 66 69 6e 65   char)X).#define
1090: 20 49 73 44 69 67 69 74 28 58 29 20 20 69 73 64   IsDigit(X)  isd
10a0: 69 67 69 74 28 28 75 6e 73 69 67 6e 65 64 20 63  igit((unsigned c
10b0: 68 61 72 29 58 29 0a 23 64 65 66 69 6e 65 20 54  har)X).#define T
10c0: 6f 4c 6f 77 65 72 28 58 29 20 20 28 63 68 61 72  oLower(X)  (char
10d0: 29 74 6f 6c 6f 77 65 72 28 28 75 6e 73 69 67 6e  )tolower((unsign
10e0: 65 64 20 63 68 61 72 29 58 29 0a 0a 23 69 66 20  ed char)X)..#if 
10f0: 64 65 66 69 6e 65 64 28 5f 57 49 4e 33 32 29 20  defined(_WIN32) 
1100: 7c 7c 20 64 65 66 69 6e 65 64 28 57 49 4e 33 32  || defined(WIN32
1110: 29 0a 23 69 6e 63 6c 75 64 65 20 3c 77 69 6e 64  ).#include <wind
1120: 6f 77 73 2e 68 3e 0a 0a 2f 2a 20 73 74 72 69 6e  ows.h>../* strin
1130: 67 20 63 6f 6e 76 65 72 73 69 6f 6e 20 72 6f 75  g conversion rou
1140: 74 69 6e 65 73 20 6f 6e 6c 79 20 6e 65 65 64 65  tines only neede
1150: 64 20 6f 6e 20 57 69 6e 33 32 20 2a 2f 0a 65 78  d on Win32 */.ex
1160: 74 65 72 6e 20 63 68 61 72 20 2a 73 71 6c 69 74  tern char *sqlit
1170: 65 33 5f 77 69 6e 33 32 5f 75 6e 69 63 6f 64 65  e3_win32_unicode
1180: 5f 74 6f 5f 75 74 66 38 28 4c 50 43 57 53 54 52  _to_utf8(LPCWSTR
1190: 29 3b 0a 65 78 74 65 72 6e 20 63 68 61 72 20 2a  );.extern char *
11a0: 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 6d 62  sqlite3_win32_mb
11b0: 63 73 5f 74 6f 5f 75 74 66 38 5f 76 32 28 63 6f  cs_to_utf8_v2(co
11c0: 6e 73 74 20 63 68 61 72 20 2a 2c 20 69 6e 74 29  nst char *, int)
11d0: 3b 0a 65 78 74 65 72 6e 20 63 68 61 72 20 2a 73  ;.extern char *s
11e0: 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 75 74 66  qlite3_win32_utf
11f0: 38 5f 74 6f 5f 6d 62 63 73 5f 76 32 28 63 6f 6e  8_to_mbcs_v2(con
1200: 73 74 20 63 68 61 72 20 2a 2c 20 69 6e 74 29 3b  st char *, int);
1210: 0a 65 78 74 65 72 6e 20 4c 50 57 53 54 52 20 73  .extern LPWSTR s
1220: 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 75 74 66  qlite3_win32_utf
1230: 38 5f 74 6f 5f 75 6e 69 63 6f 64 65 28 63 6f 6e  8_to_unicode(con
1240: 73 74 20 63 68 61 72 20 2a 7a 54 65 78 74 29 3b  st char *zText);
1250: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 4f 6e 20 57  .#endif../* On W
1260: 69 6e 64 6f 77 73 2c 20 77 65 20 6e 6f 72 6d 61  indows, we norma
1270: 6c 6c 79 20 72 75 6e 20 77 69 74 68 20 6f 75 74  lly run with out
1280: 70 75 74 20 6d 6f 64 65 20 6f 66 20 54 45 58 54  put mode of TEXT
1290: 20 73 6f 20 74 68 61 74 20 5c 6e 20 63 68 61 72   so that \n char
12a0: 61 63 74 65 72 73 0a 2a 2a 20 61 72 65 20 61 75  acters.** are au
12b0: 74 6f 6d 61 74 69 63 61 6c 6c 79 20 74 72 61 6e  tomatically tran
12c0: 73 6c 61 74 65 64 20 69 6e 74 6f 20 5c 72 5c 6e  slated into \r\n
12d0: 2e 20 20 48 6f 77 65 76 65 72 2c 20 74 68 69 73  .  However, this
12e0: 20 62 65 68 61 76 69 6f 72 20 6e 65 65 64 73 0a   behavior needs.
12f0: 2a 2a 20 74 6f 20 62 65 20 64 69 73 61 62 6c 65  ** to be disable
1300: 64 20 69 6e 20 73 6f 6d 65 20 63 61 73 65 73 20  d in some cases 
1310: 28 65 78 3a 20 77 68 65 6e 20 67 65 6e 65 72 61  (ex: when genera
1320: 74 69 6e 67 20 43 53 56 20 6f 75 74 70 75 74 20  ting CSV output 
1330: 61 6e 64 20 77 68 65 6e 0a 2a 2a 20 72 65 6e 64  and when.** rend
1340: 65 72 69 6e 67 20 71 75 6f 74 65 64 20 73 74 72  ering quoted str
1350: 69 6e 67 73 20 74 68 61 74 20 63 6f 6e 74 61 69  ings that contai
1360: 6e 20 5c 6e 20 63 68 61 72 61 63 74 65 72 73 29  n \n characters)
1370: 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  .  The following
1380: 0a 2a 2a 20 72 6f 75 74 69 6e 65 73 20 74 61 6b  .** routines tak
1390: 65 20 63 61 72 65 20 6f 66 20 74 68 61 74 2e 0a  e care of that..
13a0: 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f  */.#if defined(_
13b0: 57 49 4e 33 32 29 20 7c 7c 20 64 65 66 69 6e 65  WIN32) || define
13c0: 64 28 57 49 4e 33 32 29 0a 73 74 61 74 69 63 20  d(WIN32).static 
13d0: 76 6f 69 64 20 73 65 74 42 69 6e 61 72 79 4d 6f  void setBinaryMo
13e0: 64 65 28 46 49 4c 45 20 2a 66 69 6c 65 2c 20 69  de(FILE *file, i
13f0: 6e 74 20 69 73 4f 75 74 70 75 74 29 7b 0a 20 20  nt isOutput){.  
1400: 69 66 28 20 69 73 4f 75 74 70 75 74 20 29 20 66  if( isOutput ) f
1410: 66 6c 75 73 68 28 66 69 6c 65 29 3b 0a 20 20 5f  flush(file);.  _
1420: 73 65 74 6d 6f 64 65 28 5f 66 69 6c 65 6e 6f 28  setmode(_fileno(
1430: 66 69 6c 65 29 2c 20 5f 4f 5f 42 49 4e 41 52 59  file), _O_BINARY
1440: 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64  );.}.static void
1450: 20 73 65 74 54 65 78 74 4d 6f 64 65 28 46 49 4c   setTextMode(FIL
1460: 45 20 2a 66 69 6c 65 2c 20 69 6e 74 20 69 73 4f  E *file, int isO
1470: 75 74 70 75 74 29 7b 0a 20 20 69 66 28 20 69 73  utput){.  if( is
1480: 4f 75 74 70 75 74 20 29 20 66 66 6c 75 73 68 28  Output ) fflush(
1490: 66 69 6c 65 29 3b 0a 20 20 5f 73 65 74 6d 6f 64  file);.  _setmod
14a0: 65 28 5f 66 69 6c 65 6e 6f 28 66 69 6c 65 29 2c  e(_fileno(file),
14b0: 20 5f 4f 5f 54 45 58 54 29 3b 0a 7d 0a 23 65 6c   _O_TEXT);.}.#el
14c0: 73 65 0a 23 20 64 65 66 69 6e 65 20 73 65 74 42  se.# define setB
14d0: 69 6e 61 72 79 4d 6f 64 65 28 58 2c 59 29 0a 23  inaryMode(X,Y).#
14e0: 20 64 65 66 69 6e 65 20 73 65 74 54 65 78 74 4d   define setTextM
14f0: 6f 64 65 28 58 2c 59 29 0a 23 65 6e 64 69 66 0a  ode(X,Y).#endif.
1500: 0a 0a 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65  ../* True if the
1510: 20 74 69 6d 65 72 20 69 73 20 65 6e 61 62 6c 65   timer is enable
1520: 64 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  d */.static int 
1530: 65 6e 61 62 6c 65 54 69 6d 65 72 20 3d 20 30 3b  enableTimer = 0;
1540: 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20  ../* Return the 
1550: 63 75 72 72 65 6e 74 20 77 61 6c 6c 2d 63 6c 6f  current wall-clo
1560: 63 6b 20 74 69 6d 65 20 2a 2f 0a 73 74 61 74 69  ck time */.stati
1570: 63 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20  c sqlite3_int64 
1580: 74 69 6d 65 4f 66 44 61 79 28 76 6f 69 64 29 7b  timeOfDay(void){
1590: 0a 20 20 73 74 61 74 69 63 20 73 71 6c 69 74 65  .  static sqlite
15a0: 33 5f 76 66 73 20 2a 63 6c 6f 63 6b 56 66 73 20  3_vfs *clockVfs 
15b0: 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69  = 0;.  sqlite3_i
15c0: 6e 74 36 34 20 74 3b 0a 20 20 69 66 28 20 63 6c  nt64 t;.  if( cl
15d0: 6f 63 6b 56 66 73 3d 3d 30 20 29 20 63 6c 6f 63  ockVfs==0 ) cloc
15e0: 6b 56 66 73 20 3d 20 73 71 6c 69 74 65 33 5f 76  kVfs = sqlite3_v
15f0: 66 73 5f 66 69 6e 64 28 30 29 3b 0a 20 20 69 66  fs_find(0);.  if
1600: 28 20 63 6c 6f 63 6b 56 66 73 2d 3e 69 56 65 72  ( clockVfs->iVer
1610: 73 69 6f 6e 3e 3d 32 20 26 26 20 63 6c 6f 63 6b  sion>=2 && clock
1620: 56 66 73 2d 3e 78 43 75 72 72 65 6e 74 54 69 6d  Vfs->xCurrentTim
1630: 65 49 6e 74 36 34 21 3d 30 20 29 7b 0a 20 20 20  eInt64!=0 ){.   
1640: 20 63 6c 6f 63 6b 56 66 73 2d 3e 78 43 75 72 72   clockVfs->xCurr
1650: 65 6e 74 54 69 6d 65 49 6e 74 36 34 28 63 6c 6f  entTimeInt64(clo
1660: 63 6b 56 66 73 2c 20 26 74 29 3b 0a 20 20 7d 65  ckVfs, &t);.  }e
1670: 6c 73 65 7b 0a 20 20 20 20 64 6f 75 62 6c 65 20  lse{.    double 
1680: 72 3b 0a 20 20 20 20 63 6c 6f 63 6b 56 66 73 2d  r;.    clockVfs-
1690: 3e 78 43 75 72 72 65 6e 74 54 69 6d 65 28 63 6c  >xCurrentTime(cl
16a0: 6f 63 6b 56 66 73 2c 20 26 72 29 3b 0a 20 20 20  ockVfs, &r);.   
16b0: 20 74 20 3d 20 28 73 71 6c 69 74 65 33 5f 69 6e   t = (sqlite3_in
16c0: 74 36 34 29 28 72 2a 38 36 34 30 30 30 30 30 2e  t64)(r*86400000.
16d0: 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  0);.  }.  return
16e0: 20 74 3b 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69   t;.}..#if !defi
16f0: 6e 65 64 28 5f 57 49 4e 33 32 29 20 26 26 20 21  ned(_WIN32) && !
1700: 64 65 66 69 6e 65 64 28 57 49 4e 33 32 29 20 26  defined(WIN32) &
1710: 26 20 21 64 65 66 69 6e 65 64 28 5f 5f 6d 69 6e  & !defined(__min
1720: 75 78 29 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79  ux).#include <sy
1730: 73 2f 74 69 6d 65 2e 68 3e 0a 23 69 6e 63 6c 75  s/time.h>.#inclu
1740: 64 65 20 3c 73 79 73 2f 72 65 73 6f 75 72 63 65  de <sys/resource
1750: 2e 68 3e 0a 0a 2f 2a 20 56 78 57 6f 72 6b 73 20  .h>../* VxWorks 
1760: 64 6f 65 73 20 6e 6f 74 20 73 75 70 70 6f 72 74  does not support
1770: 20 67 65 74 72 75 73 61 67 65 28 29 20 61 73 20   getrusage() as 
1780: 66 61 72 20 61 73 20 77 65 20 63 61 6e 20 64 65  far as we can de
1790: 74 65 72 6d 69 6e 65 20 2a 2f 0a 23 69 66 20 64  termine */.#if d
17a0: 65 66 69 6e 65 64 28 5f 57 52 53 5f 4b 45 52 4e  efined(_WRS_KERN
17b0: 45 4c 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f  EL) || defined(_
17c0: 5f 52 54 50 5f 5f 29 0a 73 74 72 75 63 74 20 72  _RTP__).struct r
17d0: 75 73 61 67 65 20 7b 0a 20 20 73 74 72 75 63 74  usage {.  struct
17e0: 20 74 69 6d 65 76 61 6c 20 72 75 5f 75 74 69 6d   timeval ru_utim
17f0: 65 3b 20 2f 2a 20 75 73 65 72 20 43 50 55 20 74  e; /* user CPU t
1800: 69 6d 65 20 75 73 65 64 20 2a 2f 0a 20 20 73 74  ime used */.  st
1810: 72 75 63 74 20 74 69 6d 65 76 61 6c 20 72 75 5f  ruct timeval ru_
1820: 73 74 69 6d 65 3b 20 2f 2a 20 73 79 73 74 65 6d  stime; /* system
1830: 20 43 50 55 20 74 69 6d 65 20 75 73 65 64 20 2a   CPU time used *
1840: 2f 0a 7d 3b 0a 23 64 65 66 69 6e 65 20 67 65 74  /.};.#define get
1850: 72 75 73 61 67 65 28 41 2c 42 29 20 6d 65 6d 73  rusage(A,B) mems
1860: 65 74 28 42 2c 30 2c 73 69 7a 65 6f 66 28 2a 42  et(B,0,sizeof(*B
1870: 29 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 53 61  )).#endif../* Sa
1880: 76 65 64 20 72 65 73 6f 75 72 63 65 20 69 6e 66  ved resource inf
1890: 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 74 68 65  ormation for the
18a0: 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 61 6e   beginning of an
18b0: 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 73 74   operation */.st
18c0: 61 74 69 63 20 73 74 72 75 63 74 20 72 75 73 61  atic struct rusa
18d0: 67 65 20 73 42 65 67 69 6e 3b 20 20 2f 2a 20 43  ge sBegin;  /* C
18e0: 50 55 20 74 69 6d 65 20 61 74 20 73 74 61 72 74  PU time at start
18f0: 20 2a 2f 0a 73 74 61 74 69 63 20 73 71 6c 69 74   */.static sqlit
1900: 65 33 5f 69 6e 74 36 34 20 69 42 65 67 69 6e 3b  e3_int64 iBegin;
1910: 20 20 2f 2a 20 57 61 6c 6c 2d 63 6c 6f 63 6b 20    /* Wall-clock 
1920: 74 69 6d 65 20 61 74 20 73 74 61 72 74 20 2a 2f  time at start */
1930: 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 74 69  ../*.** Begin ti
1940: 6d 69 6e 67 20 61 6e 20 6f 70 65 72 61 74 69 6f  ming an operatio
1950: 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  n.*/.static void
1960: 20 62 65 67 69 6e 54 69 6d 65 72 28 76 6f 69 64   beginTimer(void
1970: 29 7b 0a 20 20 69 66 28 20 65 6e 61 62 6c 65 54  ){.  if( enableT
1980: 69 6d 65 72 20 29 7b 0a 20 20 20 20 67 65 74 72  imer ){.    getr
1990: 75 73 61 67 65 28 52 55 53 41 47 45 5f 53 45 4c  usage(RUSAGE_SEL
19a0: 46 2c 20 26 73 42 65 67 69 6e 29 3b 0a 20 20 20  F, &sBegin);.   
19b0: 20 69 42 65 67 69 6e 20 3d 20 74 69 6d 65 4f 66   iBegin = timeOf
19c0: 44 61 79 28 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  Day();.  }.}../*
19d0: 20 52 65 74 75 72 6e 20 74 68 65 20 64 69 66 66   Return the diff
19e0: 65 72 65 6e 63 65 20 6f 66 20 74 77 6f 20 74 69  erence of two ti
19f0: 6d 65 5f 73 74 72 75 63 74 73 20 69 6e 20 73 65  me_structs in se
1a00: 63 6f 6e 64 73 20 2a 2f 0a 73 74 61 74 69 63 20  conds */.static 
1a10: 64 6f 75 62 6c 65 20 74 69 6d 65 44 69 66 66 28  double timeDiff(
1a20: 73 74 72 75 63 74 20 74 69 6d 65 76 61 6c 20 2a  struct timeval *
1a30: 70 53 74 61 72 74 2c 20 73 74 72 75 63 74 20 74  pStart, struct t
1a40: 69 6d 65 76 61 6c 20 2a 70 45 6e 64 29 7b 0a 20  imeval *pEnd){. 
1a50: 20 72 65 74 75 72 6e 20 28 70 45 6e 64 2d 3e 74   return (pEnd->t
1a60: 76 5f 75 73 65 63 20 2d 20 70 53 74 61 72 74 2d  v_usec - pStart-
1a70: 3e 74 76 5f 75 73 65 63 29 2a 30 2e 30 30 30 30  >tv_usec)*0.0000
1a80: 30 31 20 2b 0a 20 20 20 20 20 20 20 20 20 28 64  01 +.         (d
1a90: 6f 75 62 6c 65 29 28 70 45 6e 64 2d 3e 74 76 5f  ouble)(pEnd->tv_
1aa0: 73 65 63 20 2d 20 70 53 74 61 72 74 2d 3e 74 76  sec - pStart->tv
1ab0: 5f 73 65 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  _sec);.}../*.** 
1ac0: 50 72 69 6e 74 20 74 68 65 20 74 69 6d 69 6e 67  Print the timing
1ad0: 20 72 65 73 75 6c 74 73 2e 0a 2a 2f 0a 73 74 61   results..*/.sta
1ae0: 74 69 63 20 76 6f 69 64 20 65 6e 64 54 69 6d 65  tic void endTime
1af0: 72 28 76 6f 69 64 29 7b 0a 20 20 69 66 28 20 65  r(void){.  if( e
1b00: 6e 61 62 6c 65 54 69 6d 65 72 20 29 7b 0a 20 20  nableTimer ){.  
1b10: 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
1b20: 69 45 6e 64 20 3d 20 74 69 6d 65 4f 66 44 61 79  iEnd = timeOfDay
1b30: 28 29 3b 0a 20 20 20 20 73 74 72 75 63 74 20 72  ();.    struct r
1b40: 75 73 61 67 65 20 73 45 6e 64 3b 0a 20 20 20 20  usage sEnd;.    
1b50: 67 65 74 72 75 73 61 67 65 28 52 55 53 41 47 45  getrusage(RUSAGE
1b60: 5f 53 45 4c 46 2c 20 26 73 45 6e 64 29 3b 0a 20  _SELF, &sEnd);. 
1b70: 20 20 20 70 72 69 6e 74 66 28 22 52 75 6e 20 54     printf("Run T
1b80: 69 6d 65 3a 20 72 65 61 6c 20 25 2e 33 66 20 75  ime: real %.3f u
1b90: 73 65 72 20 25 66 20 73 79 73 20 25 66 5c 6e 22  ser %f sys %f\n"
1ba0: 2c 0a 20 20 20 20 20 20 20 28 69 45 6e 64 20 2d  ,.       (iEnd -
1bb0: 20 69 42 65 67 69 6e 29 2a 30 2e 30 30 31 2c 0a   iBegin)*0.001,.
1bc0: 20 20 20 20 20 20 20 74 69 6d 65 44 69 66 66 28         timeDiff(
1bd0: 26 73 42 65 67 69 6e 2e 72 75 5f 75 74 69 6d 65  &sBegin.ru_utime
1be0: 2c 20 26 73 45 6e 64 2e 72 75 5f 75 74 69 6d 65  , &sEnd.ru_utime
1bf0: 29 2c 0a 20 20 20 20 20 20 20 74 69 6d 65 44 69  ),.       timeDi
1c00: 66 66 28 26 73 42 65 67 69 6e 2e 72 75 5f 73 74  ff(&sBegin.ru_st
1c10: 69 6d 65 2c 20 26 73 45 6e 64 2e 72 75 5f 73 74  ime, &sEnd.ru_st
1c20: 69 6d 65 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 64  ime));.  }.}..#d
1c30: 65 66 69 6e 65 20 42 45 47 49 4e 5f 54 49 4d 45  efine BEGIN_TIME
1c40: 52 20 62 65 67 69 6e 54 69 6d 65 72 28 29 0a 23  R beginTimer().#
1c50: 64 65 66 69 6e 65 20 45 4e 44 5f 54 49 4d 45 52  define END_TIMER
1c60: 20 65 6e 64 54 69 6d 65 72 28 29 0a 23 64 65 66   endTimer().#def
1c70: 69 6e 65 20 48 41 53 5f 54 49 4d 45 52 20 31 0a  ine HAS_TIMER 1.
1c80: 0a 23 65 6c 69 66 20 28 64 65 66 69 6e 65 64 28  .#elif (defined(
1c90: 5f 57 49 4e 33 32 29 20 7c 7c 20 64 65 66 69 6e  _WIN32) || defin
1ca0: 65 64 28 57 49 4e 33 32 29 29 0a 0a 2f 2a 20 53  ed(WIN32))../* S
1cb0: 61 76 65 64 20 72 65 73 6f 75 72 63 65 20 69 6e  aved resource in
1cc0: 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 74 68  formation for th
1cd0: 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 61  e beginning of a
1ce0: 6e 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 73  n operation */.s
1cf0: 74 61 74 69 63 20 48 41 4e 44 4c 45 20 68 50 72  tatic HANDLE hPr
1d00: 6f 63 65 73 73 3b 0a 73 74 61 74 69 63 20 46 49  ocess;.static FI
1d10: 4c 45 54 49 4d 45 20 66 74 4b 65 72 6e 65 6c 42  LETIME ftKernelB
1d20: 65 67 69 6e 3b 0a 73 74 61 74 69 63 20 46 49 4c  egin;.static FIL
1d30: 45 54 49 4d 45 20 66 74 55 73 65 72 42 65 67 69  ETIME ftUserBegi
1d40: 6e 3b 0a 73 74 61 74 69 63 20 73 71 6c 69 74 65  n;.static sqlite
1d50: 33 5f 69 6e 74 36 34 20 66 74 57 61 6c 6c 42 65  3_int64 ftWallBe
1d60: 67 69 6e 3b 0a 74 79 70 65 64 65 66 20 42 4f 4f  gin;.typedef BOO
1d70: 4c 20 28 57 49 4e 41 50 49 20 2a 47 45 54 50 52  L (WINAPI *GETPR
1d80: 4f 43 54 49 4d 45 53 29 28 48 41 4e 44 4c 45 2c  OCTIMES)(HANDLE,
1d90: 20 4c 50 46 49 4c 45 54 49 4d 45 2c 20 4c 50 46   LPFILETIME, LPF
1da0: 49 4c 45 54 49 4d 45 2c 0a 20 20 20 20 20 20 20  ILETIME,.       
1db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 4c 50 46               LPF
1dd0: 49 4c 45 54 49 4d 45 2c 20 4c 50 46 49 4c 45 54  ILETIME, LPFILET
1de0: 49 4d 45 29 3b 0a 73 74 61 74 69 63 20 47 45 54  IME);.static GET
1df0: 50 52 4f 43 54 49 4d 45 53 20 67 65 74 50 72 6f  PROCTIMES getPro
1e00: 63 65 73 73 54 69 6d 65 73 41 64 64 72 20 3d 20  cessTimesAddr = 
1e10: 4e 55 4c 4c 3b 0a 0a 2f 2a 0a 2a 2a 20 43 68 65  NULL;../*.** Che
1e20: 63 6b 20 74 6f 20 73 65 65 20 69 66 20 77 65 20  ck to see if we 
1e30: 68 61 76 65 20 74 69 6d 65 72 20 73 75 70 70 6f  have timer suppo
1e40: 72 74 2e 20 20 52 65 74 75 72 6e 20 31 20 69 66  rt.  Return 1 if
1e50: 20 6e 65 63 65 73 73 61 72 79 0a 2a 2a 20 73 75   necessary.** su
1e60: 70 70 6f 72 74 20 66 6f 75 6e 64 20 28 6f 72 20  pport found (or 
1e70: 66 6f 75 6e 64 20 70 72 65 76 69 6f 75 73 6c 79  found previously
1e80: 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
1e90: 20 68 61 73 54 69 6d 65 72 28 76 6f 69 64 29 7b   hasTimer(void){
1ea0: 0a 20 20 69 66 28 20 67 65 74 50 72 6f 63 65 73  .  if( getProces
1eb0: 73 54 69 6d 65 73 41 64 64 72 20 29 7b 0a 20 20  sTimesAddr ){.  
1ec0: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 20    return 1;.  } 
1ed0: 65 6c 73 65 20 7b 0a 20 20 20 20 2f 2a 20 47 65  else {.    /* Ge
1ee0: 74 50 72 6f 63 65 73 73 54 69 6d 65 73 28 29 20  tProcessTimes() 
1ef0: 69 73 6e 27 74 20 73 75 70 70 6f 72 74 65 64 20  isn't supported 
1f00: 69 6e 20 57 49 4e 39 35 20 61 6e 64 20 73 6f 6d  in WIN95 and som
1f10: 65 20 6f 74 68 65 72 20 57 69 6e 64 6f 77 73 0a  e other Windows.
1f20: 20 20 20 20 2a 2a 20 76 65 72 73 69 6f 6e 73 2e      ** versions.
1f30: 20 53 65 65 20 69 66 20 74 68 65 20 76 65 72 73   See if the vers
1f40: 69 6f 6e 20 77 65 20 61 72 65 20 72 75 6e 6e 69  ion we are runni
1f50: 6e 67 20 6f 6e 20 68 61 73 20 69 74 2c 20 61 6e  ng on has it, an
1f60: 64 20 69 66 20 69 74 0a 20 20 20 20 2a 2a 20 64  d if it.    ** d
1f70: 6f 65 73 2c 20 73 61 76 65 20 6f 66 66 20 61 20  oes, save off a 
1f80: 70 6f 69 6e 74 65 72 20 74 6f 20 69 74 20 61 6e  pointer to it an
1f90: 64 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 72  d the current pr
1fa0: 6f 63 65 73 73 20 68 61 6e 64 6c 65 2e 0a 20 20  ocess handle..  
1fb0: 20 20 2a 2f 0a 20 20 20 20 68 50 72 6f 63 65 73    */.    hProces
1fc0: 73 20 3d 20 47 65 74 43 75 72 72 65 6e 74 50 72  s = GetCurrentPr
1fd0: 6f 63 65 73 73 28 29 3b 0a 20 20 20 20 69 66 28  ocess();.    if(
1fe0: 20 68 50 72 6f 63 65 73 73 20 29 7b 0a 20 20 20   hProcess ){.   
1ff0: 20 20 20 48 49 4e 53 54 41 4e 43 45 20 68 69 6e     HINSTANCE hin
2000: 73 74 4c 69 62 20 3d 20 4c 6f 61 64 4c 69 62 72  stLib = LoadLibr
2010: 61 72 79 28 54 45 58 54 28 22 4b 65 72 6e 65 6c  ary(TEXT("Kernel
2020: 33 32 2e 64 6c 6c 22 29 29 3b 0a 20 20 20 20 20  32.dll"));.     
2030: 20 69 66 28 20 4e 55 4c 4c 20 21 3d 20 68 69 6e   if( NULL != hin
2040: 73 74 4c 69 62 20 29 7b 0a 20 20 20 20 20 20 20  stLib ){.       
2050: 20 67 65 74 50 72 6f 63 65 73 73 54 69 6d 65 73   getProcessTimes
2060: 41 64 64 72 20 3d 0a 20 20 20 20 20 20 20 20 20  Addr =.         
2070: 20 20 20 28 47 45 54 50 52 4f 43 54 49 4d 45 53     (GETPROCTIMES
2080: 29 20 47 65 74 50 72 6f 63 41 64 64 72 65 73 73  ) GetProcAddress
2090: 28 68 69 6e 73 74 4c 69 62 2c 20 22 47 65 74 50  (hinstLib, "GetP
20a0: 72 6f 63 65 73 73 54 69 6d 65 73 22 29 3b 0a 20  rocessTimes");. 
20b0: 20 20 20 20 20 20 20 69 66 28 20 4e 55 4c 4c 20         if( NULL 
20c0: 21 3d 20 67 65 74 50 72 6f 63 65 73 73 54 69 6d  != getProcessTim
20d0: 65 73 41 64 64 72 20 29 7b 0a 20 20 20 20 20 20  esAddr ){.      
20e0: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
20f0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2100: 46 72 65 65 4c 69 62 72 61 72 79 28 68 69 6e 73  FreeLibrary(hins
2110: 74 4c 69 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20  tLib);.      }. 
2120: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
2130: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65  n 0;.}../*.** Be
2140: 67 69 6e 20 74 69 6d 69 6e 67 20 61 6e 20 6f 70  gin timing an op
2150: 65 72 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69  eration.*/.stati
2160: 63 20 76 6f 69 64 20 62 65 67 69 6e 54 69 6d 65  c void beginTime
2170: 72 28 76 6f 69 64 29 7b 0a 20 20 69 66 28 20 65  r(void){.  if( e
2180: 6e 61 62 6c 65 54 69 6d 65 72 20 26 26 20 67 65  nableTimer && ge
2190: 74 50 72 6f 63 65 73 73 54 69 6d 65 73 41 64 64  tProcessTimesAdd
21a0: 72 20 29 7b 0a 20 20 20 20 46 49 4c 45 54 49 4d  r ){.    FILETIM
21b0: 45 20 66 74 43 72 65 61 74 69 6f 6e 2c 20 66 74  E ftCreation, ft
21c0: 45 78 69 74 3b 0a 20 20 20 20 67 65 74 50 72 6f  Exit;.    getPro
21d0: 63 65 73 73 54 69 6d 65 73 41 64 64 72 28 68 50  cessTimesAddr(hP
21e0: 72 6f 63 65 73 73 2c 26 66 74 43 72 65 61 74 69  rocess,&ftCreati
21f0: 6f 6e 2c 26 66 74 45 78 69 74 2c 0a 20 20 20 20  on,&ftExit,.    
2200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2210: 20 20 20 20 26 66 74 4b 65 72 6e 65 6c 42 65 67      &ftKernelBeg
2220: 69 6e 2c 26 66 74 55 73 65 72 42 65 67 69 6e 29  in,&ftUserBegin)
2230: 3b 0a 20 20 20 20 66 74 57 61 6c 6c 42 65 67 69  ;.    ftWallBegi
2240: 6e 20 3d 20 74 69 6d 65 4f 66 44 61 79 28 29 3b  n = timeOfDay();
2250: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72  .  }.}../* Retur
2260: 6e 20 74 68 65 20 64 69 66 66 65 72 65 6e 63 65  n the difference
2270: 20 6f 66 20 74 77 6f 20 46 49 4c 45 54 49 4d 45   of two FILETIME
2280: 20 73 74 72 75 63 74 73 20 69 6e 20 73 65 63 6f   structs in seco
2290: 6e 64 73 20 2a 2f 0a 73 74 61 74 69 63 20 64 6f  nds */.static do
22a0: 75 62 6c 65 20 74 69 6d 65 44 69 66 66 28 46 49  uble timeDiff(FI
22b0: 4c 45 54 49 4d 45 20 2a 70 53 74 61 72 74 2c 20  LETIME *pStart, 
22c0: 46 49 4c 45 54 49 4d 45 20 2a 70 45 6e 64 29 7b  FILETIME *pEnd){
22d0: 0a 20 20 73 71 6c 69 74 65 5f 69 6e 74 36 34 20  .  sqlite_int64 
22e0: 69 36 34 53 74 61 72 74 20 3d 20 2a 28 28 73 71  i64Start = *((sq
22f0: 6c 69 74 65 5f 69 6e 74 36 34 20 2a 29 20 70 53  lite_int64 *) pS
2300: 74 61 72 74 29 3b 0a 20 20 73 71 6c 69 74 65 5f  tart);.  sqlite_
2310: 69 6e 74 36 34 20 69 36 34 45 6e 64 20 3d 20 2a  int64 i64End = *
2320: 28 28 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 2a  ((sqlite_int64 *
2330: 29 20 70 45 6e 64 29 3b 0a 20 20 72 65 74 75 72  ) pEnd);.  retur
2340: 6e 20 28 64 6f 75 62 6c 65 29 20 28 28 69 36 34  n (double) ((i64
2350: 45 6e 64 20 2d 20 69 36 34 53 74 61 72 74 29 20  End - i64Start) 
2360: 2f 20 31 30 30 30 30 30 30 30 2e 30 29 3b 0a 7d  / 10000000.0);.}
2370: 0a 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 74 68  ../*.** Print th
2380: 65 20 74 69 6d 69 6e 67 20 72 65 73 75 6c 74 73  e timing results
2390: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
23a0: 20 65 6e 64 54 69 6d 65 72 28 76 6f 69 64 29 7b   endTimer(void){
23b0: 0a 20 20 69 66 28 20 65 6e 61 62 6c 65 54 69 6d  .  if( enableTim
23c0: 65 72 20 26 26 20 67 65 74 50 72 6f 63 65 73 73  er && getProcess
23d0: 54 69 6d 65 73 41 64 64 72 29 7b 0a 20 20 20 20  TimesAddr){.    
23e0: 46 49 4c 45 54 49 4d 45 20 66 74 43 72 65 61 74  FILETIME ftCreat
23f0: 69 6f 6e 2c 20 66 74 45 78 69 74 2c 20 66 74 4b  ion, ftExit, ftK
2400: 65 72 6e 65 6c 45 6e 64 2c 20 66 74 55 73 65 72  ernelEnd, ftUser
2410: 45 6e 64 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  End;.    sqlite3
2420: 5f 69 6e 74 36 34 20 66 74 57 61 6c 6c 45 6e 64  _int64 ftWallEnd
2430: 20 3d 20 74 69 6d 65 4f 66 44 61 79 28 29 3b 0a   = timeOfDay();.
2440: 20 20 20 20 67 65 74 50 72 6f 63 65 73 73 54 69      getProcessTi
2450: 6d 65 73 41 64 64 72 28 68 50 72 6f 63 65 73 73  mesAddr(hProcess
2460: 2c 26 66 74 43 72 65 61 74 69 6f 6e 2c 26 66 74  ,&ftCreation,&ft
2470: 45 78 69 74 2c 26 66 74 4b 65 72 6e 65 6c 45 6e  Exit,&ftKernelEn
2480: 64 2c 26 66 74 55 73 65 72 45 6e 64 29 3b 0a 20  d,&ftUserEnd);. 
2490: 20 20 20 70 72 69 6e 74 66 28 22 52 75 6e 20 54     printf("Run T
24a0: 69 6d 65 3a 20 72 65 61 6c 20 25 2e 33 66 20 75  ime: real %.3f u
24b0: 73 65 72 20 25 66 20 73 79 73 20 25 66 5c 6e 22  ser %f sys %f\n"
24c0: 2c 0a 20 20 20 20 20 20 20 28 66 74 57 61 6c 6c  ,.       (ftWall
24d0: 45 6e 64 20 2d 20 66 74 57 61 6c 6c 42 65 67 69  End - ftWallBegi
24e0: 6e 29 2a 30 2e 30 30 31 2c 0a 20 20 20 20 20 20  n)*0.001,.      
24f0: 20 74 69 6d 65 44 69 66 66 28 26 66 74 55 73 65   timeDiff(&ftUse
2500: 72 42 65 67 69 6e 2c 20 26 66 74 55 73 65 72 45  rBegin, &ftUserE
2510: 6e 64 29 2c 0a 20 20 20 20 20 20 20 74 69 6d 65  nd),.       time
2520: 44 69 66 66 28 26 66 74 4b 65 72 6e 65 6c 42 65  Diff(&ftKernelBe
2530: 67 69 6e 2c 20 26 66 74 4b 65 72 6e 65 6c 45 6e  gin, &ftKernelEn
2540: 64 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 64 65 66  d));.  }.}..#def
2550: 69 6e 65 20 42 45 47 49 4e 5f 54 49 4d 45 52 20  ine BEGIN_TIMER 
2560: 62 65 67 69 6e 54 69 6d 65 72 28 29 0a 23 64 65  beginTimer().#de
2570: 66 69 6e 65 20 45 4e 44 5f 54 49 4d 45 52 20 65  fine END_TIMER e
2580: 6e 64 54 69 6d 65 72 28 29 0a 23 64 65 66 69 6e  ndTimer().#defin
2590: 65 20 48 41 53 5f 54 49 4d 45 52 20 68 61 73 54  e HAS_TIMER hasT
25a0: 69 6d 65 72 28 29 0a 0a 23 65 6c 73 65 0a 23 64  imer()..#else.#d
25b0: 65 66 69 6e 65 20 42 45 47 49 4e 5f 54 49 4d 45  efine BEGIN_TIME
25c0: 52 0a 23 64 65 66 69 6e 65 20 45 4e 44 5f 54 49  R.#define END_TI
25d0: 4d 45 52 0a 23 64 65 66 69 6e 65 20 48 41 53 5f  MER.#define HAS_
25e0: 54 49 4d 45 52 20 30 0a 23 65 6e 64 69 66 0a 0a  TIMER 0.#endif..
25f0: 2f 2a 0a 2a 2a 20 55 73 65 64 20 74 6f 20 70 72  /*.** Used to pr
2600: 65 76 65 6e 74 20 77 61 72 6e 69 6e 67 73 20 61  event warnings a
2610: 62 6f 75 74 20 75 6e 75 73 65 64 20 70 61 72 61  bout unused para
2620: 6d 65 74 65 72 73 0a 2a 2f 0a 23 64 65 66 69 6e  meters.*/.#defin
2630: 65 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54  e UNUSED_PARAMET
2640: 45 52 28 78 29 20 28 76 6f 69 64 29 28 78 29 0a  ER(x) (void)(x).
2650: 0a 2f 2a 0a 2a 2a 20 4e 75 6d 62 65 72 20 6f 66  ./*.** Number of
2660: 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 61 6e 20   elements in an 
2670: 61 72 72 61 79 0a 2a 2f 0a 23 64 65 66 69 6e 65  array.*/.#define
2680: 20 41 72 72 61 79 53 69 7a 65 28 58 29 20 20 28   ArraySize(X)  (
2690: 69 6e 74 29 28 73 69 7a 65 6f 66 28 58 29 2f 73  int)(sizeof(X)/s
26a0: 69 7a 65 6f 66 28 58 5b 30 5d 29 29 0a 0a 2f 2a  izeof(X[0]))../*
26b0: 0a 2a 2a 20 49 66 20 74 68 65 20 66 6f 6c 6c 6f  .** If the follo
26c0: 77 69 6e 67 20 66 6c 61 67 20 69 73 20 73 65 74  wing flag is set
26d0: 2c 20 74 68 65 6e 20 63 6f 6d 6d 61 6e 64 20 65  , then command e
26e0: 78 65 63 75 74 69 6f 6e 20 73 74 6f 70 73 0a 2a  xecution stops.*
26f0: 2a 20 61 74 20 61 6e 20 65 72 72 6f 72 20 69 66  * at an error if
2700: 20 77 65 20 61 72 65 20 6e 6f 74 20 69 6e 74 65   we are not inte
2710: 72 61 63 74 69 76 65 2e 0a 2a 2f 0a 73 74 61 74  ractive..*/.stat
2720: 69 63 20 69 6e 74 20 62 61 69 6c 5f 6f 6e 5f 65  ic int bail_on_e
2730: 72 72 6f 72 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a  rror = 0;../*.**
2740: 20 54 68 72 65 61 74 20 73 74 64 69 6e 20 61 73   Threat stdin as
2750: 20 61 6e 20 69 6e 74 65 72 61 63 74 69 76 65 20   an interactive 
2760: 69 6e 70 75 74 20 69 66 20 74 68 65 20 66 6f 6c  input if the fol
2770: 6c 6f 77 69 6e 67 20 76 61 72 69 61 62 6c 65 0a  lowing variable.
2780: 2a 2a 20 69 73 20 74 72 75 65 2e 20 20 4f 74 68  ** is true.  Oth
2790: 65 72 77 69 73 65 2c 20 61 73 73 75 6d 65 20 73  erwise, assume s
27a0: 74 64 69 6e 20 69 73 20 63 6f 6e 6e 65 63 74 65  tdin is connecte
27b0: 64 20 74 6f 20 61 20 66 69 6c 65 20 6f 72 20 70  d to a file or p
27c0: 69 70 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ipe..*/.static i
27d0: 6e 74 20 73 74 64 69 6e 5f 69 73 5f 69 6e 74 65  nt stdin_is_inte
27e0: 72 61 63 74 69 76 65 20 3d 20 31 3b 0a 0a 2f 2a  ractive = 1;../*
27f0: 0a 2a 2a 20 4f 6e 20 57 69 6e 64 6f 77 73 20 73  .** On Windows s
2800: 79 73 74 65 6d 73 20 77 65 20 68 61 76 65 20 74  ystems we have t
2810: 6f 20 6b 6e 6f 77 20 69 66 20 73 74 61 6e 64 61  o know if standa
2820: 72 64 20 6f 75 74 70 75 74 20 69 73 20 61 20 63  rd output is a c
2830: 6f 6e 73 6f 6c 65 0a 2a 2a 20 69 6e 20 6f 72 64  onsole.** in ord
2840: 65 72 20 74 6f 20 74 72 61 6e 73 6c 61 74 65 20  er to translate 
2850: 55 54 46 2d 38 20 69 6e 74 6f 20 4d 42 43 53 2e  UTF-8 into MBCS.
2860: 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20    The following 
2870: 76 61 72 69 61 62 6c 65 20 69 73 0a 2a 2a 20 74  variable is.** t
2880: 72 75 65 20 69 66 20 74 72 61 6e 73 6c 61 74 69  rue if translati
2890: 6f 6e 20 69 73 20 72 65 71 75 69 72 65 64 2e 0a  on is required..
28a0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 74  */.static int st
28b0: 64 6f 75 74 5f 69 73 5f 63 6f 6e 73 6f 6c 65 20  dout_is_console 
28c0: 3d 20 31 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  = 1;../*.** The 
28d0: 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 74 68 65  following is the
28e0: 20 6f 70 65 6e 20 53 51 4c 69 74 65 20 64 61 74   open SQLite dat
28f0: 61 62 61 73 65 2e 20 20 57 65 20 6d 61 6b 65 20  abase.  We make 
2900: 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20  a pointer.** to 
2910: 74 68 69 73 20 64 61 74 61 62 61 73 65 20 61 20  this database a 
2920: 73 74 61 74 69 63 20 76 61 72 69 61 62 6c 65 20  static variable 
2930: 73 6f 20 74 68 61 74 20 69 74 20 63 61 6e 20 62  so that it can b
2940: 65 20 61 63 63 65 73 73 65 64 0a 2a 2a 20 62 79  e accessed.** by
2950: 20 74 68 65 20 53 49 47 49 4e 54 20 68 61 6e 64   the SIGINT hand
2960: 6c 65 72 20 74 6f 20 69 6e 74 65 72 72 75 70 74  ler to interrupt
2970: 20 64 61 74 61 62 61 73 65 20 70 72 6f 63 65 73   database proces
2980: 73 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  sing..*/.static 
2990: 73 71 6c 69 74 65 33 20 2a 67 6c 6f 62 61 6c 44  sqlite3 *globalD
29a0: 62 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 54 72  b = 0;../*.** Tr
29b0: 75 65 20 69 66 20 61 6e 20 69 6e 74 65 72 72 75  ue if an interru
29c0: 70 74 20 28 43 6f 6e 74 72 6f 6c 2d 43 29 20 68  pt (Control-C) h
29d0: 61 73 20 62 65 65 6e 20 72 65 63 65 69 76 65 64  as been received
29e0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 6c 61  ..*/.static vola
29f0: 74 69 6c 65 20 69 6e 74 20 73 65 65 6e 49 6e 74  tile int seenInt
2a00: 65 72 72 75 70 74 20 3d 20 30 3b 0a 0a 2f 2a 0a  errupt = 0;../*.
2a10: 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 6e  ** This is the n
2a20: 61 6d 65 20 6f 66 20 6f 75 72 20 70 72 6f 67 72  ame of our progr
2a30: 61 6d 2e 20 49 74 20 69 73 20 73 65 74 20 69 6e  am. It is set in
2a40: 20 6d 61 69 6e 28 29 2c 20 75 73 65 64 0a 2a 2a   main(), used.**
2a50: 20 69 6e 20 61 20 6e 75 6d 62 65 72 20 6f 66 20   in a number of 
2a60: 6f 74 68 65 72 20 70 6c 61 63 65 73 2c 20 6d 6f  other places, mo
2a70: 73 74 6c 79 20 66 6f 72 20 65 72 72 6f 72 20 6d  stly for error m
2a80: 65 73 73 61 67 65 73 2e 0a 2a 2f 0a 73 74 61 74  essages..*/.stat
2a90: 69 63 20 63 68 61 72 20 2a 41 72 67 76 30 3b 0a  ic char *Argv0;.
2aa0: 0a 2f 2a 0a 2a 2a 20 50 72 6f 6d 70 74 20 73 74  ./*.** Prompt st
2ab0: 72 69 6e 67 73 2e 20 49 6e 69 74 69 61 6c 69 7a  rings. Initializ
2ac0: 65 64 20 69 6e 20 6d 61 69 6e 2e 20 53 65 74 74  ed in main. Sett
2ad0: 61 62 6c 65 20 77 69 74 68 0a 2a 2a 20 20 20 2e  able with.**   .
2ae0: 70 72 6f 6d 70 74 20 6d 61 69 6e 20 63 6f 6e 74  prompt main cont
2af0: 69 6e 75 65 0a 2a 2f 0a 73 74 61 74 69 63 20 63  inue.*/.static c
2b00: 68 61 72 20 6d 61 69 6e 50 72 6f 6d 70 74 5b 32  har mainPrompt[2
2b10: 30 5d 3b 20 20 20 20 20 2f 2a 20 46 69 72 73 74  0];     /* First
2b20: 20 6c 69 6e 65 20 70 72 6f 6d 70 74 2e 20 64 65   line prompt. de
2b30: 66 61 75 6c 74 3a 20 22 73 71 6c 69 74 65 3e 20  fault: "sqlite> 
2b40: 22 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20  "*/.static char 
2b50: 63 6f 6e 74 69 6e 75 65 50 72 6f 6d 70 74 5b 32  continuePrompt[2
2b60: 30 5d 3b 20 2f 2a 20 43 6f 6e 74 69 6e 75 61 74  0]; /* Continuat
2b70: 69 6f 6e 20 70 72 6f 6d 70 74 2e 20 64 65 66 61  ion prompt. defa
2b80: 75 6c 74 3a 20 22 20 20 20 2e 2e 2e 3e 20 22 20  ult: "   ...> " 
2b90: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 6e 64 65 72  */../*.** Render
2ba0: 20 6f 75 74 70 75 74 20 6c 69 6b 65 20 66 70 72   output like fpr
2bb0: 69 6e 74 66 28 29 2e 20 20 45 78 63 65 70 74 2c  intf().  Except,
2bc0: 20 69 66 20 74 68 65 20 6f 75 74 70 75 74 20 69   if the output i
2bd0: 73 20 67 6f 69 6e 67 20 74 6f 20 74 68 65 0a 2a  s going to the.*
2be0: 2a 20 63 6f 6e 73 6f 6c 65 20 61 6e 64 20 69 66  * console and if
2bf0: 20 74 68 69 73 20 69 73 20 72 75 6e 6e 69 6e 67   this is running
2c00: 20 6f 6e 20 61 20 57 69 6e 64 6f 77 73 20 6d 61   on a Windows ma
2c10: 63 68 69 6e 65 2c 20 74 72 61 6e 73 6c 61 74 65  chine, translate
2c20: 20 74 68 65 0a 2a 2a 20 6f 75 74 70 75 74 20 66   the.** output f
2c30: 72 6f 6d 20 55 54 46 2d 38 20 69 6e 74 6f 20 4d  rom UTF-8 into M
2c40: 42 43 53 2e 0a 2a 2f 0a 23 69 66 20 64 65 66 69  BCS..*/.#if defi
2c50: 6e 65 64 28 5f 57 49 4e 33 32 29 20 7c 7c 20 64  ned(_WIN32) || d
2c60: 65 66 69 6e 65 64 28 57 49 4e 33 32 29 0a 76 6f  efined(WIN32).vo
2c70: 69 64 20 75 74 66 38 5f 70 72 69 6e 74 66 28 46  id utf8_printf(F
2c80: 49 4c 45 20 2a 6f 75 74 2c 20 63 6f 6e 73 74 20  ILE *out, const 
2c90: 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e  char *zFormat, .
2ca0: 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61  ..){.  va_list a
2cb0: 70 3b 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70  p;.  va_start(ap
2cc0: 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 69 66  , zFormat);.  if
2cd0: 28 20 73 74 64 6f 75 74 5f 69 73 5f 63 6f 6e 73  ( stdout_is_cons
2ce0: 6f 6c 65 20 26 26 20 28 6f 75 74 3d 3d 73 74 64  ole && (out==std
2cf0: 6f 75 74 20 7c 7c 20 6f 75 74 3d 3d 73 74 64 65  out || out==stde
2d00: 72 72 29 20 29 7b 0a 20 20 20 20 63 68 61 72 20  rr) ){.    char 
2d10: 2a 7a 31 20 3d 20 73 71 6c 69 74 65 33 5f 76 6d  *z1 = sqlite3_vm
2d20: 70 72 69 6e 74 66 28 7a 46 6f 72 6d 61 74 2c 20  printf(zFormat, 
2d30: 61 70 29 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a  ap);.    char *z
2d40: 32 20 3d 20 73 71 6c 69 74 65 33 5f 77 69 6e 33  2 = sqlite3_win3
2d50: 32 5f 75 74 66 38 5f 74 6f 5f 6d 62 63 73 5f 76  2_utf8_to_mbcs_v
2d60: 32 28 7a 31 2c 20 30 29 3b 0a 20 20 20 20 73 71  2(z1, 0);.    sq
2d70: 6c 69 74 65 33 5f 66 72 65 65 28 7a 31 29 3b 0a  lite3_free(z1);.
2d80: 20 20 20 20 66 70 75 74 73 28 7a 32 2c 20 6f 75      fputs(z2, ou
2d90: 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  t);.    sqlite3_
2da0: 66 72 65 65 28 7a 32 29 3b 0a 20 20 7d 65 6c 73  free(z2);.  }els
2db0: 65 7b 0a 20 20 20 20 76 66 70 72 69 6e 74 66 28  e{.    vfprintf(
2dc0: 6f 75 74 2c 20 7a 46 6f 72 6d 61 74 2c 20 61 70  out, zFormat, ap
2dd0: 29 3b 0a 20 20 7d 0a 20 20 76 61 5f 65 6e 64 28  );.  }.  va_end(
2de0: 61 70 29 3b 0a 7d 0a 23 65 6c 69 66 20 21 64 65  ap);.}.#elif !de
2df0: 66 69 6e 65 64 28 75 74 66 38 5f 70 72 69 6e 74  fined(utf8_print
2e00: 66 29 0a 23 20 64 65 66 69 6e 65 20 75 74 66 38  f).# define utf8
2e10: 5f 70 72 69 6e 74 66 20 66 70 72 69 6e 74 66 0a  _printf fprintf.
2e20: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65  #endif../*.** Re
2e30: 6e 64 65 72 20 6f 75 74 70 75 74 20 6c 69 6b 65  nder output like
2e40: 20 66 70 72 69 6e 74 66 28 29 2e 20 20 54 68 69   fprintf().  Thi
2e50: 73 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20  s should not be 
2e60: 75 73 65 64 20 6f 6e 20 61 6e 79 74 68 69 6e 67  used on anything
2e70: 20 74 68 61 74 0a 2a 2a 20 69 6e 63 6c 75 64 65   that.** include
2e80: 73 20 73 74 72 69 6e 67 20 66 6f 72 6d 61 74 74  s string formatt
2e90: 69 6e 67 20 28 65 2e 67 2e 20 22 25 73 22 29 2e  ing (e.g. "%s").
2ea0: 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64  .*/.#if !defined
2eb0: 28 72 61 77 5f 70 72 69 6e 74 66 29 0a 23 20 64  (raw_printf).# d
2ec0: 65 66 69 6e 65 20 72 61 77 5f 70 72 69 6e 74 66  efine raw_printf
2ed0: 20 66 70 72 69 6e 74 66 0a 23 65 6e 64 69 66 0a   fprintf.#endif.
2ee0: 0a 2f 2a 20 49 6e 64 69 63 61 74 65 20 6f 75 74  ./* Indicate out
2ef0: 2d 6f 66 2d 6d 65 6d 6f 72 79 20 61 6e 64 20 65  -of-memory and e
2f00: 78 69 74 2e 20 2a 2f 0a 73 74 61 74 69 63 20 76  xit. */.static v
2f10: 6f 69 64 20 73 68 65 6c 6c 5f 6f 75 74 5f 6f 66  oid shell_out_of
2f20: 5f 6d 65 6d 6f 72 79 28 76 6f 69 64 29 7b 0a 20  _memory(void){. 
2f30: 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65   raw_printf(stde
2f40: 72 72 2c 22 45 72 72 6f 72 3a 20 6f 75 74 20 6f  rr,"Error: out o
2f50: 66 20 6d 65 6d 6f 72 79 5c 6e 22 29 3b 0a 20 20  f memory\n");.  
2f60: 65 78 69 74 28 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  exit(1);.}../*.*
2f70: 2a 20 57 72 69 74 65 20 49 2f 4f 20 74 72 61 63  * Write I/O trac
2f80: 65 73 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77  es to the follow
2f90: 69 6e 67 20 73 74 72 65 61 6d 2e 0a 2a 2f 0a 23  ing stream..*/.#
2fa0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
2fb0: 42 4c 45 5f 49 4f 54 52 41 43 45 0a 73 74 61 74  BLE_IOTRACE.stat
2fc0: 69 63 20 46 49 4c 45 20 2a 69 6f 74 72 61 63 65  ic FILE *iotrace
2fd0: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a   = 0;.#endif../*
2fe0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
2ff0: 20 77 6f 72 6b 73 20 6c 69 6b 65 20 70 72 69 6e   works like prin
3000: 74 66 20 69 6e 20 74 68 61 74 20 69 74 73 20 66  tf in that its f
3010: 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73  irst argument is
3020: 20 61 0a 2a 2a 20 66 6f 72 6d 61 74 20 73 74 72   a.** format str
3030: 69 6e 67 20 61 6e 64 20 73 75 62 73 65 71 75 65  ing and subseque
3040: 6e 74 20 61 72 67 75 6d 65 6e 74 73 20 61 72 65  nt arguments are
3050: 20 76 61 6c 75 65 73 20 74 6f 20 62 65 20 73 75   values to be su
3060: 62 73 74 69 74 75 74 65 64 0a 2a 2a 20 69 6e 20  bstituted.** in 
3070: 70 6c 61 63 65 20 6f 66 20 25 20 66 69 65 6c 64  place of % field
3080: 73 2e 20 20 54 68 65 20 72 65 73 75 6c 74 20 6f  s.  The result o
3090: 66 20 66 6f 72 6d 61 74 74 69 6e 67 20 74 68 69  f formatting thi
30a0: 73 20 73 74 72 69 6e 67 0a 2a 2a 20 69 73 20 77  s string.** is w
30b0: 72 69 74 74 65 6e 20 74 6f 20 69 6f 74 72 61 63  ritten to iotrac
30c0: 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  e..*/.#ifdef SQL
30d0: 49 54 45 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41  ITE_ENABLE_IOTRA
30e0: 43 45 0a 73 74 61 74 69 63 20 76 6f 69 64 20 53  CE.static void S
30f0: 51 4c 49 54 45 5f 43 44 45 43 4c 20 69 6f 74 72  QLITE_CDECL iotr
3100: 61 63 65 50 72 69 6e 74 66 28 63 6f 6e 73 74 20  acePrintf(const 
3110: 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e  char *zFormat, .
3120: 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61  ..){.  va_list a
3130: 70 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20  p;.  char *z;.  
3140: 69 66 28 20 69 6f 74 72 61 63 65 3d 3d 30 20 29  if( iotrace==0 )
3150: 20 72 65 74 75 72 6e 3b 0a 20 20 76 61 5f 73 74   return;.  va_st
3160: 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29  art(ap, zFormat)
3170: 3b 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f  ;.  z = sqlite3_
3180: 76 6d 70 72 69 6e 74 66 28 7a 46 6f 72 6d 61 74  vmprintf(zFormat
3190: 2c 20 61 70 29 3b 0a 20 20 76 61 5f 65 6e 64 28  , ap);.  va_end(
31a0: 61 70 29 3b 0a 20 20 75 74 66 38 5f 70 72 69 6e  ap);.  utf8_prin
31b0: 74 66 28 69 6f 74 72 61 63 65 2c 20 22 25 73 22  tf(iotrace, "%s"
31c0: 2c 20 7a 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  , z);.  sqlite3_
31d0: 66 72 65 65 28 7a 29 3b 0a 7d 0a 23 65 6e 64 69  free(z);.}.#endi
31e0: 66 0a 0a 2f 2a 0a 2a 2a 20 4f 75 74 70 75 74 20  f../*.** Output 
31f0: 73 74 72 69 6e 67 20 7a 55 74 66 20 74 6f 20 73  string zUtf to s
3200: 74 72 65 61 6d 20 70 4f 75 74 20 61 73 20 77 20  tream pOut as w 
3210: 63 68 61 72 61 63 74 65 72 73 2e 20 20 49 66 20  characters.  If 
3220: 77 20 69 73 20 6e 65 67 61 74 69 76 65 2c 0a 2a  w is negative,.*
3230: 2a 20 74 68 65 6e 20 72 69 67 68 74 2d 6a 75 73  * then right-jus
3240: 74 69 66 79 20 74 68 65 20 74 65 78 74 2e 20 20  tify the text.  
3250: 57 20 69 73 20 74 68 65 20 77 69 64 74 68 20 69  W is the width i
3260: 6e 20 55 54 46 2d 38 20 63 68 61 72 61 63 74 65  n UTF-8 characte
3270: 72 73 2c 20 6e 6f 74 0a 2a 2a 20 69 6e 20 62 79  rs, not.** in by
3280: 74 65 73 2e 20 20 54 68 69 73 20 69 73 20 64 69  tes.  This is di
3290: 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 74 68 65  fferent from the
32a0: 20 25 2a 2e 2a 73 20 73 70 65 63 69 66 69 63 61   %*.*s specifica
32b0: 74 69 6f 6e 20 69 6e 20 70 72 69 6e 74 66 0a 2a  tion in printf.*
32c0: 2a 20 73 69 6e 63 65 20 77 69 74 68 20 25 2a 2e  * since with %*.
32d0: 2a 73 20 74 68 65 20 77 69 64 74 68 20 69 73 20  *s the width is 
32e0: 6d 65 61 73 75 72 65 64 20 69 6e 20 62 79 74 65  measured in byte
32f0: 73 2c 20 6e 6f 74 20 63 68 61 72 61 63 74 65 72  s, not character
3300: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
3310: 64 20 75 74 66 38 5f 77 69 64 74 68 5f 70 72 69  d utf8_width_pri
3320: 6e 74 28 46 49 4c 45 20 2a 70 4f 75 74 2c 20 69  nt(FILE *pOut, i
3330: 6e 74 20 77 2c 20 63 6f 6e 73 74 20 63 68 61 72  nt w, const char
3340: 20 2a 7a 55 74 66 29 7b 0a 20 20 69 6e 74 20 69   *zUtf){.  int i
3350: 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 69 6e 74  ;.  int n;.  int
3360: 20 61 77 20 3d 20 77 3c 30 20 3f 20 2d 77 20 3a   aw = w<0 ? -w :
3370: 20 77 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b   w;.  char zBuf[
3380: 31 30 30 30 5d 3b 0a 20 20 69 66 28 20 61 77 3e  1000];.  if( aw>
3390: 28 69 6e 74 29 73 69 7a 65 6f 66 28 7a 42 75 66  (int)sizeof(zBuf
33a0: 29 2f 33 20 29 20 61 77 20 3d 20 28 69 6e 74 29  )/3 ) aw = (int)
33b0: 73 69 7a 65 6f 66 28 7a 42 75 66 29 2f 33 3b 0a  sizeof(zBuf)/3;.
33c0: 20 20 66 6f 72 28 69 3d 6e 3d 30 3b 20 7a 55 74    for(i=n=0; zUt
33d0: 66 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  f[i]; i++){.    
33e0: 69 66 28 20 28 7a 55 74 66 5b 69 5d 26 30 78 63  if( (zUtf[i]&0xc
33f0: 30 29 21 3d 30 78 38 30 20 29 7b 0a 20 20 20 20  0)!=0x80 ){.    
3400: 20 20 6e 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28    n++;.      if(
3410: 20 6e 3d 3d 61 77 20 29 7b 0a 20 20 20 20 20 20   n==aw ){.      
3420: 20 20 64 6f 7b 20 69 2b 2b 3b 20 7d 77 68 69 6c    do{ i++; }whil
3430: 65 28 20 28 7a 55 74 66 5b 69 5d 26 30 78 63 30  e( (zUtf[i]&0xc0
3440: 29 3d 3d 30 78 38 30 20 29 3b 0a 20 20 20 20 20  )==0x80 );.     
3450: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
3460: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  }.    }.  }.  if
3470: 28 20 6e 3e 3d 61 77 20 29 7b 0a 20 20 20 20 75  ( n>=aw ){.    u
3480: 74 66 38 5f 70 72 69 6e 74 66 28 70 4f 75 74 2c  tf8_printf(pOut,
3490: 20 22 25 2e 2a 73 22 2c 20 69 2c 20 7a 55 74 66   "%.*s", i, zUtf
34a0: 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 77  );.  }else if( w
34b0: 3c 30 20 29 7b 0a 20 20 20 20 75 74 66 38 5f 70  <0 ){.    utf8_p
34c0: 72 69 6e 74 66 28 70 4f 75 74 2c 20 22 25 2a 73  rintf(pOut, "%*s
34d0: 25 73 22 2c 20 61 77 2d 6e 2c 20 22 22 2c 20 7a  %s", aw-n, "", z
34e0: 55 74 66 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Utf);.  }else{. 
34f0: 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70     utf8_printf(p
3500: 4f 75 74 2c 20 22 25 73 25 2a 73 22 2c 20 7a 55  Out, "%s%*s", zU
3510: 74 66 2c 20 61 77 2d 6e 2c 20 22 22 29 3b 0a 20  tf, aw-n, "");. 
3520: 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65 74   }.}.../*.** Det
3530: 65 72 6d 69 6e 65 73 20 69 66 20 61 20 73 74 72  ermines if a str
3540: 69 6e 67 20 69 73 20 61 20 6e 75 6d 62 65 72 20  ing is a number 
3550: 6f 66 20 6e 6f 74 2e 0a 2a 2f 0a 73 74 61 74 69  of not..*/.stati
3560: 63 20 69 6e 74 20 69 73 4e 75 6d 62 65 72 28 63  c int isNumber(c
3570: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e  onst char *z, in
3580: 74 20 2a 72 65 61 6c 6e 75 6d 29 7b 0a 20 20 69  t *realnum){.  i
3590: 66 28 20 2a 7a 3d 3d 27 2d 27 20 7c 7c 20 2a 7a  f( *z=='-' || *z
35a0: 3d 3d 27 2b 27 20 29 20 7a 2b 2b 3b 0a 20 20 69  =='+' ) z++;.  i
35b0: 66 28 20 21 49 73 44 69 67 69 74 28 2a 7a 29 20  f( !IsDigit(*z) 
35c0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
35d0: 0a 20 20 7d 0a 20 20 7a 2b 2b 3b 0a 20 20 69 66  .  }.  z++;.  if
35e0: 28 20 72 65 61 6c 6e 75 6d 20 29 20 2a 72 65 61  ( realnum ) *rea
35f0: 6c 6e 75 6d 20 3d 20 30 3b 0a 20 20 77 68 69 6c  lnum = 0;.  whil
3600: 65 28 20 49 73 44 69 67 69 74 28 2a 7a 29 20 29  e( IsDigit(*z) )
3610: 7b 20 7a 2b 2b 3b 20 7d 0a 20 20 69 66 28 20 2a  { z++; }.  if( *
3620: 7a 3d 3d 27 2e 27 20 29 7b 0a 20 20 20 20 7a 2b  z=='.' ){.    z+
3630: 2b 3b 0a 20 20 20 20 69 66 28 20 21 49 73 44 69  +;.    if( !IsDi
3640: 67 69 74 28 2a 7a 29 20 29 20 72 65 74 75 72 6e  git(*z) ) return
3650: 20 30 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 49   0;.    while( I
3660: 73 44 69 67 69 74 28 2a 7a 29 20 29 7b 20 7a 2b  sDigit(*z) ){ z+
3670: 2b 3b 20 7d 0a 20 20 20 20 69 66 28 20 72 65 61  +; }.    if( rea
3680: 6c 6e 75 6d 20 29 20 2a 72 65 61 6c 6e 75 6d 20  lnum ) *realnum 
3690: 3d 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 2a  = 1;.  }.  if( *
36a0: 7a 3d 3d 27 65 27 20 7c 7c 20 2a 7a 3d 3d 27 45  z=='e' || *z=='E
36b0: 27 20 29 7b 0a 20 20 20 20 7a 2b 2b 3b 0a 20 20  ' ){.    z++;.  
36c0: 20 20 69 66 28 20 2a 7a 3d 3d 27 2b 27 20 7c 7c    if( *z=='+' ||
36d0: 20 2a 7a 3d 3d 27 2d 27 20 29 20 7a 2b 2b 3b 0a   *z=='-' ) z++;.
36e0: 20 20 20 20 69 66 28 20 21 49 73 44 69 67 69 74      if( !IsDigit
36f0: 28 2a 7a 29 20 29 20 72 65 74 75 72 6e 20 30 3b  (*z) ) return 0;
3700: 0a 20 20 20 20 77 68 69 6c 65 28 20 49 73 44 69  .    while( IsDi
3710: 67 69 74 28 2a 7a 29 20 29 7b 20 7a 2b 2b 3b 20  git(*z) ){ z++; 
3720: 7d 0a 20 20 20 20 69 66 28 20 72 65 61 6c 6e 75  }.    if( realnu
3730: 6d 20 29 20 2a 72 65 61 6c 6e 75 6d 20 3d 20 31  m ) *realnum = 1
3740: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 2a  ;.  }.  return *
3750: 7a 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  z==0;.}../*.** C
3760: 6f 6d 70 75 74 65 20 61 20 73 74 72 69 6e 67 20  ompute a string 
3770: 6c 65 6e 67 74 68 20 74 68 61 74 20 69 73 20 6c  length that is l
3780: 69 6d 69 74 65 64 20 74 6f 20 77 68 61 74 20 63  imited to what c
3790: 61 6e 20 62 65 20 73 74 6f 72 65 64 20 69 6e 0a  an be stored in.
37a0: 2a 2a 20 6c 6f 77 65 72 20 33 30 20 62 69 74 73  ** lower 30 bits
37b0: 20 6f 66 20 61 20 33 32 2d 62 69 74 20 73 69 67   of a 32-bit sig
37c0: 6e 65 64 20 69 6e 74 65 67 65 72 2e 0a 2a 2f 0a  ned integer..*/.
37d0: 73 74 61 74 69 63 20 69 6e 74 20 73 74 72 6c 65  static int strle
37e0: 6e 33 30 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  n30(const char *
37f0: 7a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  z){.  const char
3800: 20 2a 7a 32 20 3d 20 7a 3b 0a 20 20 77 68 69 6c   *z2 = z;.  whil
3810: 65 28 20 2a 7a 32 20 29 7b 20 7a 32 2b 2b 3b 20  e( *z2 ){ z2++; 
3820: 7d 0a 20 20 72 65 74 75 72 6e 20 30 78 33 66 66  }.  return 0x3ff
3830: 66 66 66 66 66 20 26 20 28 69 6e 74 29 28 7a 32  fffff & (int)(z2
3840: 20 2d 20 7a 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   - z);.}../*.** 
3850: 52 65 74 75 72 6e 20 74 68 65 20 6c 65 6e 67 74  Return the lengt
3860: 68 20 6f 66 20 61 20 73 74 72 69 6e 67 20 69 6e  h of a string in
3870: 20 63 68 61 72 61 63 74 65 72 73 2e 20 20 4d 75   characters.  Mu
3880: 6c 74 69 62 79 74 65 20 55 54 46 38 20 63 68 61  ltibyte UTF8 cha
3890: 72 61 63 74 65 72 73 0a 2a 2a 20 63 6f 75 6e 74  racters.** count
38a0: 20 61 73 20 61 20 73 69 6e 67 6c 65 20 63 68 61   as a single cha
38b0: 72 61 63 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  racter..*/.stati
38c0: 63 20 69 6e 74 20 73 74 72 6c 65 6e 43 68 61 72  c int strlenChar
38d0: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b  (const char *z){
38e0: 0a 20 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20  .  int n = 0;.  
38f0: 77 68 69 6c 65 28 20 2a 7a 20 29 7b 0a 20 20 20  while( *z ){.   
3900: 20 69 66 28 20 28 30 78 63 30 26 2a 28 7a 2b 2b   if( (0xc0&*(z++
3910: 29 29 21 3d 30 78 38 30 20 29 20 6e 2b 2b 3b 0a  ))!=0x80 ) n++;.
3920: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a    }.  return n;.
3930: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
3940: 75 74 69 6e 65 20 72 65 61 64 73 20 61 20 6c 69  utine reads a li
3950: 6e 65 20 6f 66 20 74 65 78 74 20 66 72 6f 6d 20  ne of text from 
3960: 46 49 4c 45 20 69 6e 2c 20 73 74 6f 72 65 73 0a  FILE in, stores.
3970: 2a 2a 20 74 68 65 20 74 65 78 74 20 69 6e 20 6d  ** the text in m
3980: 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66  emory obtained f
3990: 72 6f 6d 20 6d 61 6c 6c 6f 63 28 29 20 61 6e 64  rom malloc() and
39a0: 20 72 65 74 75 72 6e 73 20 61 20 70 6f 69 6e 74   returns a point
39b0: 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 74 65 78  er.** to the tex
39c0: 74 2e 20 20 4e 55 4c 4c 20 69 73 20 72 65 74 75  t.  NULL is retu
39d0: 72 6e 65 64 20 61 74 20 65 6e 64 20 6f 66 20 66  rned at end of f
39e0: 69 6c 65 2c 20 6f 72 20 69 66 20 6d 61 6c 6c 6f  ile, or if mallo
39f0: 63 28 29 0a 2a 2a 20 66 61 69 6c 73 2e 0a 2a 2a  c().** fails..**
3a00: 0a 2a 2a 20 49 66 20 7a 4c 69 6e 65 20 69 73 20  .** If zLine is 
3a10: 6e 6f 74 20 4e 55 4c 4c 20 74 68 65 6e 20 69 74  not NULL then it
3a20: 20 69 73 20 61 20 6d 61 6c 6c 6f 63 65 64 20 62   is a malloced b
3a30: 75 66 66 65 72 20 72 65 74 75 72 6e 65 64 20 66  uffer returned f
3a40: 72 6f 6d 0a 2a 2a 20 61 20 70 72 65 76 69 6f 75  rom.** a previou
3a50: 73 20 63 61 6c 6c 20 74 6f 20 74 68 69 73 20 72  s call to this r
3a60: 6f 75 74 69 6e 65 20 74 68 61 74 20 6d 61 79 20  outine that may 
3a70: 62 65 20 72 65 75 73 65 64 2e 0a 2a 2f 0a 73 74  be reused..*/.st
3a80: 61 74 69 63 20 63 68 61 72 20 2a 6c 6f 63 61 6c  atic char *local
3a90: 5f 67 65 74 6c 69 6e 65 28 63 68 61 72 20 2a 7a  _getline(char *z
3aa0: 4c 69 6e 65 2c 20 46 49 4c 45 20 2a 69 6e 29 7b  Line, FILE *in){
3ab0: 0a 20 20 69 6e 74 20 6e 4c 69 6e 65 20 3d 20 7a  .  int nLine = z
3ac0: 4c 69 6e 65 3d 3d 30 20 3f 20 30 20 3a 20 31 30  Line==0 ? 0 : 10
3ad0: 30 3b 0a 20 20 69 6e 74 20 6e 20 3d 20 30 3b 0a  0;.  int n = 0;.
3ae0: 0a 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20  .  while( 1 ){. 
3af0: 20 20 20 69 66 28 20 6e 2b 31 30 30 3e 6e 4c 69     if( n+100>nLi
3b00: 6e 65 20 29 7b 0a 20 20 20 20 20 20 6e 4c 69 6e  ne ){.      nLin
3b10: 65 20 3d 20 6e 4c 69 6e 65 2a 32 20 2b 20 31 30  e = nLine*2 + 10
3b20: 30 3b 0a 20 20 20 20 20 20 7a 4c 69 6e 65 20 3d  0;.      zLine =
3b30: 20 72 65 61 6c 6c 6f 63 28 7a 4c 69 6e 65 2c 20   realloc(zLine, 
3b40: 6e 4c 69 6e 65 29 3b 0a 20 20 20 20 20 20 69 66  nLine);.      if
3b50: 28 20 7a 4c 69 6e 65 3d 3d 30 20 29 20 72 65 74  ( zLine==0 ) ret
3b60: 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 0;.    }.   
3b70: 20 69 66 28 20 66 67 65 74 73 28 26 7a 4c 69 6e   if( fgets(&zLin
3b80: 65 5b 6e 5d 2c 20 6e 4c 69 6e 65 20 2d 20 6e 2c  e[n], nLine - n,
3b90: 20 69 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20   in)==0 ){.     
3ba0: 20 69 66 28 20 6e 3d 3d 30 20 29 7b 0a 20 20 20   if( n==0 ){.   
3bb0: 20 20 20 20 20 66 72 65 65 28 7a 4c 69 6e 65 29       free(zLine)
3bc0: 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
3bd0: 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
3be0: 20 20 7a 4c 69 6e 65 5b 6e 5d 20 3d 20 30 3b 0a    zLine[n] = 0;.
3bf0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
3c00: 20 7d 0a 20 20 20 20 77 68 69 6c 65 28 20 7a 4c   }.    while( zL
3c10: 69 6e 65 5b 6e 5d 20 29 20 6e 2b 2b 3b 0a 20 20  ine[n] ) n++;.  
3c20: 20 20 69 66 28 20 6e 3e 30 20 26 26 20 7a 4c 69    if( n>0 && zLi
3c30: 6e 65 5b 6e 2d 31 5d 3d 3d 27 5c 6e 27 20 29 7b  ne[n-1]=='\n' ){
3c40: 0a 20 20 20 20 20 20 6e 2d 2d 3b 0a 20 20 20 20  .      n--;.    
3c50: 20 20 69 66 28 20 6e 3e 30 20 26 26 20 7a 4c 69    if( n>0 && zLi
3c60: 6e 65 5b 6e 2d 31 5d 3d 3d 27 5c 72 27 20 29 20  ne[n-1]=='\r' ) 
3c70: 6e 2d 2d 3b 0a 20 20 20 20 20 20 7a 4c 69 6e 65  n--;.      zLine
3c80: 5b 6e 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 62  [n] = 0;.      b
3c90: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
3ca0: 23 69 66 20 64 65 66 69 6e 65 64 28 5f 57 49 4e  #if defined(_WIN
3cb0: 33 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 57  32) || defined(W
3cc0: 49 4e 33 32 29 0a 20 20 2f 2a 20 46 6f 72 20 69  IN32).  /* For i
3cd0: 6e 74 65 72 61 63 74 69 76 65 20 69 6e 70 75 74  nteractive input
3ce0: 20 6f 6e 20 57 69 6e 64 6f 77 73 20 73 79 73 74   on Windows syst
3cf0: 65 6d 73 2c 20 74 72 61 6e 73 6c 61 74 65 20 74  ems, translate t
3d00: 68 65 0a 20 20 2a 2a 20 6d 75 6c 74 69 2d 62 79  he.  ** multi-by
3d10: 74 65 20 63 68 61 72 61 63 74 65 72 73 65 74 20  te characterset 
3d20: 63 68 61 72 61 63 74 65 72 73 20 69 6e 74 6f 20  characters into 
3d30: 55 54 46 2d 38 2e 20 2a 2f 0a 20 20 69 66 28 20  UTF-8. */.  if( 
3d40: 73 74 64 69 6e 5f 69 73 5f 69 6e 74 65 72 61 63  stdin_is_interac
3d50: 74 69 76 65 20 26 26 20 69 6e 3d 3d 73 74 64 69  tive && in==stdi
3d60: 6e 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  n ){.    char *z
3d70: 54 72 61 6e 73 20 3d 20 73 71 6c 69 74 65 33 5f  Trans = sqlite3_
3d80: 77 69 6e 33 32 5f 6d 62 63 73 5f 74 6f 5f 75 74  win32_mbcs_to_ut
3d90: 66 38 5f 76 32 28 7a 4c 69 6e 65 2c 20 30 29 3b  f8_v2(zLine, 0);
3da0: 0a 20 20 20 20 69 66 28 20 7a 54 72 61 6e 73 20  .    if( zTrans 
3db0: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 54 72  ){.      int nTr
3dc0: 61 6e 73 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a  ans = strlen30(z
3dd0: 54 72 61 6e 73 29 2b 31 3b 0a 20 20 20 20 20 20  Trans)+1;.      
3de0: 69 66 28 20 6e 54 72 61 6e 73 3e 6e 4c 69 6e 65  if( nTrans>nLine
3df0: 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 4c 69 6e   ){.        zLin
3e00: 65 20 3d 20 72 65 61 6c 6c 6f 63 28 7a 4c 69 6e  e = realloc(zLin
3e10: 65 2c 20 6e 54 72 61 6e 73 29 3b 0a 20 20 20 20  e, nTrans);.    
3e20: 20 20 20 20 69 66 28 20 7a 4c 69 6e 65 3d 3d 30      if( zLine==0
3e30: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
3e40: 6c 69 74 65 33 5f 66 72 65 65 28 7a 54 72 61 6e  lite3_free(zTran
3e50: 73 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  s);.          re
3e60: 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 20 20  turn 0;.        
3e70: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
3e80: 6d 65 6d 63 70 79 28 7a 4c 69 6e 65 2c 20 7a 54  memcpy(zLine, zT
3e90: 72 61 6e 73 2c 20 6e 54 72 61 6e 73 29 3b 0a 20  rans, nTrans);. 
3ea0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
3eb0: 65 28 7a 54 72 61 6e 73 29 3b 0a 20 20 20 20 7d  e(zTrans);.    }
3ec0: 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 64  .  }.#endif /* d
3ed0: 65 66 69 6e 65 64 28 5f 57 49 4e 33 32 29 20 7c  efined(_WIN32) |
3ee0: 7c 20 64 65 66 69 6e 65 64 28 57 49 4e 33 32 29  | defined(WIN32)
3ef0: 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 7a 4c 69   */.  return zLi
3f00: 6e 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  ne;.}../*.** Ret
3f10: 72 69 65 76 65 20 61 20 73 69 6e 67 6c 65 20 6c  rieve a single l
3f20: 69 6e 65 20 6f 66 20 69 6e 70 75 74 20 74 65 78  ine of input tex
3f30: 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 69 6e 3d 3d  t..**.** If in==
3f40: 30 20 74 68 65 6e 20 72 65 61 64 20 66 72 6f 6d  0 then read from
3f50: 20 73 74 61 6e 64 61 72 64 20 69 6e 70 75 74 20   standard input 
3f60: 61 6e 64 20 70 72 6f 6d 70 74 20 62 65 66 6f 72  and prompt befor
3f70: 65 20 65 61 63 68 20 6c 69 6e 65 2e 0a 2a 2a 20  e each line..** 
3f80: 49 66 20 69 73 43 6f 6e 74 69 6e 75 61 74 69 6f  If isContinuatio
3f90: 6e 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20  n is true, then 
3fa0: 61 20 63 6f 6e 74 69 6e 75 61 74 69 6f 6e 20 70  a continuation p
3fb0: 72 6f 6d 70 74 20 69 73 20 61 70 70 72 6f 70 72  rompt is appropr
3fc0: 69 61 74 65 2e 0a 2a 2a 20 49 66 20 69 73 43 6f  iate..** If isCo
3fd0: 6e 74 69 6e 75 61 74 69 6f 6e 20 69 73 20 7a 65  ntinuation is ze
3fe0: 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 6d 61 69  ro, then the mai
3ff0: 6e 20 70 72 6f 6d 70 74 20 73 68 6f 75 6c 64 20  n prompt should 
4000: 62 65 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  be used..**.** I
4010: 66 20 7a 50 72 69 6f 72 20 69 73 20 6e 6f 74 20  f zPrior is not 
4020: 4e 55 4c 4c 20 74 68 65 6e 20 69 74 20 69 73 20  NULL then it is 
4030: 61 20 62 75 66 66 65 72 20 66 72 6f 6d 20 61 20  a buffer from a 
4040: 70 72 69 6f 72 20 63 61 6c 6c 20 74 6f 20 74 68  prior call to th
4050: 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74 68  is.** routine th
4060: 61 74 20 63 61 6e 20 62 65 20 72 65 75 73 65 64  at can be reused
4070: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 73 75  ..**.** The resu
4080: 6c 74 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20  lt is stored in 
4090: 73 70 61 63 65 20 6f 62 74 61 69 6e 65 64 20 66  space obtained f
40a0: 72 6f 6d 20 6d 61 6c 6c 6f 63 28 29 20 61 6e 64  rom malloc() and
40b0: 20 6d 75 73 74 20 65 69 74 68 65 72 0a 2a 2a 20   must either.** 
40c0: 62 65 20 66 72 65 65 64 20 62 79 20 74 68 65 20  be freed by the 
40d0: 63 61 6c 6c 65 72 20 6f 72 20 65 6c 73 65 20 70  caller or else p
40e0: 61 73 73 65 64 20 62 61 63 6b 20 69 6e 74 6f 20  assed back into 
40f0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 76 69 61  this routine via
4100: 20 74 68 65 0a 2a 2a 20 7a 50 72 69 6f 72 20 61   the.** zPrior a
4110: 72 67 75 6d 65 6e 74 20 66 6f 72 20 72 65 75 73  rgument for reus
4120: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61  e..*/.static cha
4130: 72 20 2a 6f 6e 65 5f 69 6e 70 75 74 5f 6c 69 6e  r *one_input_lin
4140: 65 28 46 49 4c 45 20 2a 69 6e 2c 20 63 68 61 72  e(FILE *in, char
4150: 20 2a 7a 50 72 69 6f 72 2c 20 69 6e 74 20 69 73   *zPrior, int is
4160: 43 6f 6e 74 69 6e 75 61 74 69 6f 6e 29 7b 0a 20  Continuation){. 
4170: 20 63 68 61 72 20 2a 7a 50 72 6f 6d 70 74 3b 0a   char *zPrompt;.
4180: 20 20 63 68 61 72 20 2a 7a 52 65 73 75 6c 74 3b    char *zResult;
4190: 0a 20 20 69 66 28 20 69 6e 21 3d 30 20 29 7b 0a  .  if( in!=0 ){.
41a0: 20 20 20 20 7a 52 65 73 75 6c 74 20 3d 20 6c 6f      zResult = lo
41b0: 63 61 6c 5f 67 65 74 6c 69 6e 65 28 7a 50 72 69  cal_getline(zPri
41c0: 6f 72 2c 20 69 6e 29 3b 0a 20 20 7d 65 6c 73 65  or, in);.  }else
41d0: 7b 0a 20 20 20 20 7a 50 72 6f 6d 70 74 20 3d 20  {.    zPrompt = 
41e0: 69 73 43 6f 6e 74 69 6e 75 61 74 69 6f 6e 20 3f  isContinuation ?
41f0: 20 63 6f 6e 74 69 6e 75 65 50 72 6f 6d 70 74 20   continuePrompt 
4200: 3a 20 6d 61 69 6e 50 72 6f 6d 70 74 3b 0a 23 69  : mainPrompt;.#i
4210: 66 20 53 48 45 4c 4c 5f 55 53 45 5f 4c 4f 43 41  f SHELL_USE_LOCA
4220: 4c 5f 47 45 54 4c 49 4e 45 0a 20 20 20 20 70 72  L_GETLINE.    pr
4230: 69 6e 74 66 28 22 25 73 22 2c 20 7a 50 72 6f 6d  intf("%s", zProm
4240: 70 74 29 3b 0a 20 20 20 20 66 66 6c 75 73 68 28  pt);.    fflush(
4250: 73 74 64 6f 75 74 29 3b 0a 20 20 20 20 7a 52 65  stdout);.    zRe
4260: 73 75 6c 74 20 3d 20 6c 6f 63 61 6c 5f 67 65 74  sult = local_get
4270: 6c 69 6e 65 28 7a 50 72 69 6f 72 2c 20 73 74 64  line(zPrior, std
4280: 69 6e 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 66  in);.#else.    f
4290: 72 65 65 28 7a 50 72 69 6f 72 29 3b 0a 20 20 20  ree(zPrior);.   
42a0: 20 7a 52 65 73 75 6c 74 20 3d 20 73 68 65 6c 6c   zResult = shell
42b0: 5f 72 65 61 64 6c 69 6e 65 28 7a 50 72 6f 6d 70  _readline(zPromp
42c0: 74 29 3b 0a 20 20 20 20 69 66 28 20 7a 52 65 73  t);.    if( zRes
42d0: 75 6c 74 20 26 26 20 2a 7a 52 65 73 75 6c 74 20  ult && *zResult 
42e0: 29 20 73 68 65 6c 6c 5f 61 64 64 5f 68 69 73 74  ) shell_add_hist
42f0: 6f 72 79 28 7a 52 65 73 75 6c 74 29 3b 0a 23 65  ory(zResult);.#e
4300: 6e 64 69 66 0a 20 20 7d 0a 20 20 72 65 74 75 72  ndif.  }.  retur
4310: 6e 20 7a 52 65 73 75 6c 74 3b 0a 7d 0a 0a 0a 2f  n zResult;.}.../
4320: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
4330: 76 61 6c 75 65 20 6f 66 20 61 20 68 65 78 61 64  value of a hexad
4340: 65 63 69 6d 61 6c 20 64 69 67 69 74 2e 20 20 52  ecimal digit.  R
4350: 65 74 75 72 6e 20 2d 31 20 69 66 20 74 68 65 20  eturn -1 if the 
4360: 69 6e 70 75 74 0a 2a 2a 20 69 73 20 6e 6f 74 20  input.** is not 
4370: 61 20 68 65 78 20 64 69 67 69 74 2e 0a 2a 2f 0a  a hex digit..*/.
4380: 73 74 61 74 69 63 20 69 6e 74 20 68 65 78 44 69  static int hexDi
4390: 67 69 74 56 61 6c 75 65 28 63 68 61 72 20 63 29  gitValue(char c)
43a0: 7b 0a 20 20 69 66 28 20 63 3e 3d 27 30 27 20 26  {.  if( c>='0' &
43b0: 26 20 63 3c 3d 27 39 27 20 29 20 72 65 74 75 72  & c<='9' ) retur
43c0: 6e 20 63 20 2d 20 27 30 27 3b 0a 20 20 69 66 28  n c - '0';.  if(
43d0: 20 63 3e 3d 27 61 27 20 26 26 20 63 3c 3d 27 66   c>='a' && c<='f
43e0: 27 20 29 20 72 65 74 75 72 6e 20 63 20 2d 20 27  ' ) return c - '
43f0: 61 27 20 2b 20 31 30 3b 0a 20 20 69 66 28 20 63  a' + 10;.  if( c
4400: 3e 3d 27 41 27 20 26 26 20 63 3c 3d 27 46 27 20  >='A' && c<='F' 
4410: 29 20 72 65 74 75 72 6e 20 63 20 2d 20 27 41 27  ) return c - 'A'
4420: 20 2b 20 31 30 3b 0a 20 20 72 65 74 75 72 6e 20   + 10;.  return 
4430: 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 74  -1;.}../*.** Int
4440: 65 72 70 72 65 74 20 7a 41 72 67 20 61 73 20 61  erpret zArg as a
4450: 6e 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 2c  n integer value,
4460: 20 70 6f 73 73 69 62 6c 79 20 77 69 74 68 20 73   possibly with s
4470: 75 66 66 69 78 65 73 2e 0a 2a 2f 0a 73 74 61 74  uffixes..*/.stat
4480: 69 63 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  ic sqlite3_int64
4490: 20 69 6e 74 65 67 65 72 56 61 6c 75 65 28 63 6f   integerValue(co
44a0: 6e 73 74 20 63 68 61 72 20 2a 7a 41 72 67 29 7b  nst char *zArg){
44b0: 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
44c0: 20 76 20 3d 20 30 3b 0a 20 20 73 74 61 74 69 63   v = 0;.  static
44d0: 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20 7b 20   const struct { 
44e0: 63 68 61 72 20 2a 7a 53 75 66 66 69 78 3b 20 69  char *zSuffix; i
44f0: 6e 74 20 69 4d 75 6c 74 3b 20 7d 20 61 4d 75 6c  nt iMult; } aMul
4500: 74 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 20 22 4b  t[] = {.    { "K
4510: 69 42 22 2c 20 31 30 32 34 20 7d 2c 0a 20 20 20  iB", 1024 },.   
4520: 20 7b 20 22 4d 69 42 22 2c 20 31 30 32 34 2a 31   { "MiB", 1024*1
4530: 30 32 34 20 7d 2c 0a 20 20 20 20 7b 20 22 47 69  024 },.    { "Gi
4540: 42 22 2c 20 31 30 32 34 2a 31 30 32 34 2a 31 30  B", 1024*1024*10
4550: 32 34 20 7d 2c 0a 20 20 20 20 7b 20 22 4b 42 22  24 },.    { "KB"
4560: 2c 20 20 31 30 30 30 20 7d 2c 0a 20 20 20 20 7b  ,  1000 },.    {
4570: 20 22 4d 42 22 2c 20 20 31 30 30 30 30 30 30 20   "MB",  1000000 
4580: 7d 2c 0a 20 20 20 20 7b 20 22 47 42 22 2c 20 20  },.    { "GB",  
4590: 31 30 30 30 30 30 30 30 30 30 20 7d 2c 0a 20 20  1000000000 },.  
45a0: 20 20 7b 20 22 4b 22 2c 20 20 20 31 30 30 30 20    { "K",   1000 
45b0: 7d 2c 0a 20 20 20 20 7b 20 22 4d 22 2c 20 20 20  },.    { "M",   
45c0: 31 30 30 30 30 30 30 20 7d 2c 0a 20 20 20 20 7b  1000000 },.    {
45d0: 20 22 47 22 2c 20 20 20 31 30 30 30 30 30 30 30   "G",   10000000
45e0: 30 30 20 7d 2c 0a 20 20 7d 3b 0a 20 20 69 6e 74  00 },.  };.  int
45f0: 20 69 3b 0a 20 20 69 6e 74 20 69 73 4e 65 67 20   i;.  int isNeg 
4600: 3d 20 30 3b 0a 20 20 69 66 28 20 7a 41 72 67 5b  = 0;.  if( zArg[
4610: 30 5d 3d 3d 27 2d 27 20 29 7b 0a 20 20 20 20 69  0]=='-' ){.    i
4620: 73 4e 65 67 20 3d 20 31 3b 0a 20 20 20 20 7a 41  sNeg = 1;.    zA
4630: 72 67 2b 2b 3b 0a 20 20 7d 65 6c 73 65 20 69 66  rg++;.  }else if
4640: 28 20 7a 41 72 67 5b 30 5d 3d 3d 27 2b 27 20 29  ( zArg[0]=='+' )
4650: 7b 0a 20 20 20 20 7a 41 72 67 2b 2b 3b 0a 20 20  {.    zArg++;.  
4660: 7d 0a 20 20 69 66 28 20 7a 41 72 67 5b 30 5d 3d  }.  if( zArg[0]=
4670: 3d 27 30 27 20 26 26 20 7a 41 72 67 5b 31 5d 3d  ='0' && zArg[1]=
4680: 3d 27 78 27 20 29 7b 0a 20 20 20 20 69 6e 74 20  ='x' ){.    int 
4690: 78 3b 0a 20 20 20 20 7a 41 72 67 20 2b 3d 20 32  x;.    zArg += 2
46a0: 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28 78 20  ;.    while( (x 
46b0: 3d 20 68 65 78 44 69 67 69 74 56 61 6c 75 65 28  = hexDigitValue(
46c0: 7a 41 72 67 5b 30 5d 29 29 3e 3d 30 20 29 7b 0a  zArg[0]))>=0 ){.
46d0: 20 20 20 20 20 20 76 20 3d 20 28 76 3c 3c 34 29        v = (v<<4)
46e0: 20 2b 20 78 3b 0a 20 20 20 20 20 20 7a 41 72 67   + x;.      zArg
46f0: 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  ++;.    }.  }els
4700: 65 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 49 73  e{.    while( Is
4710: 44 69 67 69 74 28 7a 41 72 67 5b 30 5d 29 20 29  Digit(zArg[0]) )
4720: 7b 0a 20 20 20 20 20 20 76 20 3d 20 76 2a 31 30  {.      v = v*10
4730: 20 2b 20 7a 41 72 67 5b 30 5d 20 2d 20 27 30 27   + zArg[0] - '0'
4740: 3b 0a 20 20 20 20 20 20 7a 41 72 67 2b 2b 3b 0a  ;.      zArg++;.
4750: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28      }.  }.  for(
4760: 69 3d 30 3b 20 69 3c 41 72 72 61 79 53 69 7a 65  i=0; i<ArraySize
4770: 28 61 4d 75 6c 74 29 3b 20 69 2b 2b 29 7b 0a 20  (aMult); i++){. 
4780: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73     if( sqlite3_s
4790: 74 72 69 63 6d 70 28 61 4d 75 6c 74 5b 69 5d 2e  tricmp(aMult[i].
47a0: 7a 53 75 66 66 69 78 2c 20 7a 41 72 67 29 3d 3d  zSuffix, zArg)==
47b0: 30 20 29 7b 0a 20 20 20 20 20 20 76 20 2a 3d 20  0 ){.      v *= 
47c0: 61 4d 75 6c 74 5b 69 5d 2e 69 4d 75 6c 74 3b 0a  aMult[i].iMult;.
47d0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
47e0: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
47f0: 69 73 4e 65 67 3f 20 2d 76 20 3a 20 76 3b 0a 7d  isNeg? -v : v;.}
4800: 0a 0a 2f 2a 0a 2a 2a 20 41 20 76 61 72 69 61 62  ../*.** A variab
4810: 6c 65 20 6c 65 6e 67 74 68 20 73 74 72 69 6e 67  le length string
4820: 20 74 6f 20 77 68 69 63 68 20 6f 6e 65 20 63 61   to which one ca
4830: 6e 20 61 70 70 65 6e 64 20 74 65 78 74 2e 0a 2a  n append text..*
4840: 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
4850: 20 53 68 65 6c 6c 54 65 78 74 20 53 68 65 6c 6c   ShellText Shell
4860: 54 65 78 74 3b 0a 73 74 72 75 63 74 20 53 68 65  Text;.struct She
4870: 6c 6c 54 65 78 74 20 7b 0a 20 20 63 68 61 72 20  llText {.  char 
4880: 2a 7a 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 69  *z;.  int n;.  i
4890: 6e 74 20 6e 41 6c 6c 6f 63 3b 0a 7d 3b 0a 0a 2f  nt nAlloc;.};../
48a0: 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20  *.** Initialize 
48b0: 61 6e 64 20 64 65 73 74 72 6f 79 20 61 20 53 68  and destroy a Sh
48c0: 65 6c 6c 54 65 78 74 20 6f 62 6a 65 63 74 0a 2a  ellText object.*
48d0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69 6e  /.static void in
48e0: 69 74 54 65 78 74 28 53 68 65 6c 6c 54 65 78 74  itText(ShellText
48f0: 20 2a 70 29 7b 0a 20 20 6d 65 6d 73 65 74 28 70   *p){.  memset(p
4900: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29  , 0, sizeof(*p))
4910: 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  ;.}.static void 
4920: 66 72 65 65 54 65 78 74 28 53 68 65 6c 6c 54 65  freeText(ShellTe
4930: 78 74 20 2a 70 29 7b 0a 20 20 66 72 65 65 28 70  xt *p){.  free(p
4940: 2d 3e 7a 29 3b 0a 20 20 69 6e 69 74 54 65 78 74  ->z);.  initText
4950: 28 70 29 3b 0a 7d 0a 0a 2f 2a 20 7a 49 6e 20 69  (p);.}../* zIn i
4960: 73 20 65 69 74 68 65 72 20 61 20 70 6f 69 6e 74  s either a point
4970: 65 72 20 74 6f 20 61 20 4e 55 4c 4c 2d 74 65 72  er to a NULL-ter
4980: 6d 69 6e 61 74 65 64 20 73 74 72 69 6e 67 20 69  minated string i
4990: 6e 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65  n memory obtaine
49a0: 64 0a 2a 2a 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63  d.** from malloc
49b0: 28 29 2c 20 6f 72 20 61 20 4e 55 4c 4c 20 70 6f  (), or a NULL po
49c0: 69 6e 74 65 72 2e 20 54 68 65 20 73 74 72 69 6e  inter. The strin
49d0: 67 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20  g pointed to by 
49e0: 7a 41 70 70 65 6e 64 20 69 73 0a 2a 2a 20 61 64  zAppend is.** ad
49f0: 64 65 64 20 74 6f 20 7a 49 6e 2c 20 61 6e 64 20  ded to zIn, and 
4a00: 74 68 65 20 72 65 73 75 6c 74 20 72 65 74 75 72  the result retur
4a10: 6e 65 64 20 69 6e 20 6d 65 6d 6f 72 79 20 6f 62  ned in memory ob
4a20: 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c  tained from mall
4a30: 6f 63 28 29 2e 0a 2a 2a 20 7a 49 6e 2c 20 69 66  oc()..** zIn, if
4a40: 20 69 74 20 77 61 73 20 6e 6f 74 20 4e 55 4c 4c   it was not NULL
4a50: 2c 20 69 73 20 66 72 65 65 64 2e 0a 2a 2a 0a 2a  , is freed..**.*
4a60: 2a 20 49 66 20 74 68 65 20 74 68 69 72 64 20 61  * If the third a
4a70: 72 67 75 6d 65 6e 74 2c 20 71 75 6f 74 65 2c 20  rgument, quote, 
4a80: 69 73 20 6e 6f 74 20 27 5c 30 27 2c 20 74 68 65  is not '\0', the
4a90: 6e 20 69 74 20 69 73 20 75 73 65 64 20 61 73 20  n it is used as 
4aa0: 61 0a 2a 2a 20 71 75 6f 74 65 20 63 68 61 72 61  a.** quote chara
4ab0: 63 74 65 72 20 66 6f 72 20 7a 41 70 70 65 6e 64  cter for zAppend
4ac0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
4ad0: 20 61 70 70 65 6e 64 54 65 78 74 28 53 68 65 6c   appendText(Shel
4ae0: 6c 54 65 78 74 20 2a 70 2c 20 63 68 61 72 20 63  lText *p, char c
4af0: 6f 6e 73 74 20 2a 7a 41 70 70 65 6e 64 2c 20 63  onst *zAppend, c
4b00: 68 61 72 20 71 75 6f 74 65 29 7b 0a 20 20 69 6e  har quote){.  in
4b10: 74 20 6c 65 6e 3b 0a 20 20 69 6e 74 20 69 3b 0a  t len;.  int i;.
4b20: 20 20 69 6e 74 20 6e 41 70 70 65 6e 64 20 3d 20    int nAppend = 
4b30: 73 74 72 6c 65 6e 33 30 28 7a 41 70 70 65 6e 64  strlen30(zAppend
4b40: 29 3b 0a 0a 20 20 6c 65 6e 20 3d 20 6e 41 70 70  );..  len = nApp
4b50: 65 6e 64 2b 70 2d 3e 6e 2b 31 3b 0a 20 20 69 66  end+p->n+1;.  if
4b60: 28 20 71 75 6f 74 65 20 29 7b 0a 20 20 20 20 6c  ( quote ){.    l
4b70: 65 6e 20 2b 3d 20 32 3b 0a 20 20 20 20 66 6f 72  en += 2;.    for
4b80: 28 69 3d 30 3b 20 69 3c 6e 41 70 70 65 6e 64 3b  (i=0; i<nAppend;
4b90: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
4ba0: 20 7a 41 70 70 65 6e 64 5b 69 5d 3d 3d 71 75 6f   zAppend[i]==quo
4bb0: 74 65 20 29 20 6c 65 6e 2b 2b 3b 0a 20 20 20 20  te ) len++;.    
4bc0: 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e  }.  }..  if( p->
4bd0: 6e 2b 6c 65 6e 3e 3d 70 2d 3e 6e 41 6c 6c 6f 63  n+len>=p->nAlloc
4be0: 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 41 6c 6c 6f   ){.    p->nAllo
4bf0: 63 20 3d 20 70 2d 3e 6e 41 6c 6c 6f 63 2a 32 20  c = p->nAlloc*2 
4c00: 2b 20 6c 65 6e 20 2b 20 32 30 3b 0a 20 20 20 20  + len + 20;.    
4c10: 70 2d 3e 7a 20 3d 20 72 65 61 6c 6c 6f 63 28 70  p->z = realloc(p
4c20: 2d 3e 7a 2c 20 70 2d 3e 6e 41 6c 6c 6f 63 29 3b  ->z, p->nAlloc);
4c30: 0a 20 20 20 20 69 66 28 20 70 2d 3e 7a 3d 3d 30  .    if( p->z==0
4c40: 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74   ){.      memset
4c50: 28 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70  (p, 0, sizeof(*p
4c60: 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ));.      return
4c70: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69  ;.    }.  }..  i
4c80: 66 28 20 71 75 6f 74 65 20 29 7b 0a 20 20 20 20  f( quote ){.    
4c90: 63 68 61 72 20 2a 7a 43 73 72 20 3d 20 70 2d 3e  char *zCsr = p->
4ca0: 7a 2b 70 2d 3e 6e 3b 0a 20 20 20 20 2a 7a 43 73  z+p->n;.    *zCs
4cb0: 72 2b 2b 20 3d 20 71 75 6f 74 65 3b 0a 20 20 20  r++ = quote;.   
4cc0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 70 70   for(i=0; i<nApp
4cd0: 65 6e 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  end; i++){.     
4ce0: 20 2a 7a 43 73 72 2b 2b 20 3d 20 7a 41 70 70 65   *zCsr++ = zAppe
4cf0: 6e 64 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66 28  nd[i];.      if(
4d00: 20 7a 41 70 70 65 6e 64 5b 69 5d 3d 3d 71 75 6f   zAppend[i]==quo
4d10: 74 65 20 29 20 2a 7a 43 73 72 2b 2b 20 3d 20 71  te ) *zCsr++ = q
4d20: 75 6f 74 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  uote;.    }.    
4d30: 2a 7a 43 73 72 2b 2b 20 3d 20 71 75 6f 74 65 3b  *zCsr++ = quote;
4d40: 0a 20 20 20 20 70 2d 3e 6e 20 3d 20 28 69 6e 74  .    p->n = (int
4d50: 29 28 7a 43 73 72 20 2d 20 70 2d 3e 7a 29 3b 0a  )(zCsr - p->z);.
4d60: 20 20 20 20 2a 7a 43 73 72 20 3d 20 27 5c 30 27      *zCsr = '\0'
4d70: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6d  ;.  }else{.    m
4d80: 65 6d 63 70 79 28 70 2d 3e 7a 2b 70 2d 3e 6e 2c  emcpy(p->z+p->n,
4d90: 20 7a 41 70 70 65 6e 64 2c 20 6e 41 70 70 65 6e   zAppend, nAppen
4da0: 64 29 3b 0a 20 20 20 20 70 2d 3e 6e 20 2b 3d 20  d);.    p->n += 
4db0: 6e 41 70 70 65 6e 64 3b 0a 20 20 20 20 70 2d 3e  nAppend;.    p->
4dc0: 7a 5b 70 2d 3e 6e 5d 20 3d 20 27 5c 30 27 3b 0a  z[p->n] = '\0';.
4dd0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74    }.}../*.** Att
4de0: 65 6d 70 74 20 74 6f 20 64 65 74 65 72 6d 69 6e  empt to determin
4df0: 65 20 69 66 20 69 64 65 6e 74 69 66 69 65 72 20  e if identifier 
4e00: 7a 4e 61 6d 65 20 6e 65 65 64 73 20 74 6f 20 62  zName needs to b
4e10: 65 20 71 75 6f 74 65 64 2c 20 65 69 74 68 65 72  e quoted, either
4e20: 0a 2a 2a 20 62 65 63 61 75 73 65 20 69 74 20 63  .** because it c
4e30: 6f 6e 74 61 69 6e 73 20 6e 6f 6e 2d 61 6c 70 68  ontains non-alph
4e40: 61 6e 75 6d 65 72 69 63 20 63 68 61 72 61 63 74  anumeric charact
4e50: 65 72 73 2c 20 6f 72 20 62 65 63 61 75 73 65 20  ers, or because 
4e60: 69 74 20 69 73 20 61 6e 0a 2a 2a 20 53 51 4c 69  it is an.** SQLi
4e70: 74 65 20 6b 65 79 77 6f 72 64 2e 20 20 42 65 20  te keyword.  Be 
4e80: 63 6f 6e 73 65 72 76 61 74 69 76 65 20 69 6e 20  conservative in 
4e90: 74 68 69 73 20 65 73 74 69 6d 61 74 65 3a 20 20  this estimate:  
4ea0: 57 68 65 6e 20 69 6e 20 64 6f 75 62 74 20 61 73  When in doubt as
4eb0: 73 75 6d 65 0a 2a 2a 20 74 68 61 74 20 71 75 6f  sume.** that quo
4ec0: 74 69 6e 67 20 69 73 20 72 65 71 75 69 72 65 64  ting is required
4ed0: 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 27  ..**.** Return '
4ee0: 22 27 20 69 66 20 71 75 6f 74 69 6e 67 20 69 73  "' if quoting is
4ef0: 20 72 65 71 75 69 72 65 64 2e 20 20 52 65 74 75   required.  Retu
4f00: 72 6e 20 30 20 69 66 20 6e 6f 20 71 75 6f 74 69  rn 0 if no quoti
4f10: 6e 67 20 69 73 20 72 65 71 75 69 72 65 64 2e 0a  ng is required..
4f20: 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 71  */.static char q
4f30: 75 6f 74 65 43 68 61 72 28 63 6f 6e 73 74 20 63  uoteChar(const c
4f40: 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 2f  har *zName){.  /
4f50: 2a 20 41 6c 6c 20 53 51 4c 69 74 65 20 6b 65 79  * All SQLite key
4f60: 77 6f 72 64 73 2c 20 69 6e 20 61 6c 70 68 61 62  words, in alphab
4f70: 65 74 69 63 61 6c 20 6f 72 64 65 72 20 2a 2f 0a  etical order */.
4f80: 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63    static const c
4f90: 68 61 72 20 2a 61 7a 4b 65 79 77 6f 72 64 73 5b  har *azKeywords[
4fa0: 5d 20 3d 20 7b 0a 20 20 20 20 22 41 42 4f 52 54  ] = {.    "ABORT
4fb0: 22 2c 20 22 41 43 54 49 4f 4e 22 2c 20 22 41 44  ", "ACTION", "AD
4fc0: 44 22 2c 20 22 41 46 54 45 52 22 2c 20 22 41 4c  D", "AFTER", "AL
4fd0: 4c 22 2c 20 22 41 4c 54 45 52 22 2c 20 22 41 4e  L", "ALTER", "AN
4fe0: 41 4c 59 5a 45 22 2c 20 22 41 4e 44 22 2c 20 22  ALYZE", "AND", "
4ff0: 41 53 22 2c 0a 20 20 20 20 22 41 53 43 22 2c 20  AS",.    "ASC", 
5000: 22 41 54 54 41 43 48 22 2c 20 22 41 55 54 4f 49  "ATTACH", "AUTOI
5010: 4e 43 52 45 4d 45 4e 54 22 2c 20 22 42 45 46 4f  NCREMENT", "BEFO
5020: 52 45 22 2c 20 22 42 45 47 49 4e 22 2c 20 22 42  RE", "BEGIN", "B
5030: 45 54 57 45 45 4e 22 2c 20 22 42 59 22 2c 0a 20  ETWEEN", "BY",. 
5040: 20 20 20 22 43 41 53 43 41 44 45 22 2c 20 22 43     "CASCADE", "C
5050: 41 53 45 22 2c 20 22 43 41 53 54 22 2c 20 22 43  ASE", "CAST", "C
5060: 48 45 43 4b 22 2c 20 22 43 4f 4c 4c 41 54 45 22  HECK", "COLLATE"
5070: 2c 20 22 43 4f 4c 55 4d 4e 22 2c 20 22 43 4f 4d  , "COLUMN", "COM
5080: 4d 49 54 22 2c 0a 20 20 20 20 22 43 4f 4e 46 4c  MIT",.    "CONFL
5090: 49 43 54 22 2c 20 22 43 4f 4e 53 54 52 41 49 4e  ICT", "CONSTRAIN
50a0: 54 22 2c 20 22 43 52 45 41 54 45 22 2c 20 22 43  T", "CREATE", "C
50b0: 52 4f 53 53 22 2c 20 22 43 55 52 52 45 4e 54 5f  ROSS", "CURRENT_
50c0: 44 41 54 45 22 2c 0a 20 20 20 20 22 43 55 52 52  DATE",.    "CURR
50d0: 45 4e 54 5f 54 49 4d 45 22 2c 20 22 43 55 52 52  ENT_TIME", "CURR
50e0: 45 4e 54 5f 54 49 4d 45 53 54 41 4d 50 22 2c 20  ENT_TIMESTAMP", 
50f0: 22 44 41 54 41 42 41 53 45 22 2c 20 22 44 45 46  "DATABASE", "DEF
5100: 41 55 4c 54 22 2c 20 22 44 45 46 45 52 52 41 42  AULT", "DEFERRAB
5110: 4c 45 22 2c 0a 20 20 20 20 22 44 45 46 45 52 52  LE",.    "DEFERR
5120: 45 44 22 2c 20 22 44 45 4c 45 54 45 22 2c 20 22  ED", "DELETE", "
5130: 44 45 53 43 22 2c 20 22 44 45 54 41 43 48 22 2c  DESC", "DETACH",
5140: 20 22 44 49 53 54 49 4e 43 54 22 2c 20 22 44 4f   "DISTINCT", "DO
5150: 22 2c 20 22 44 52 4f 50 22 2c 20 22 45 41 43 48  ", "DROP", "EACH
5160: 22 2c 0a 20 20 20 20 22 45 4c 53 45 22 2c 20 22  ",.    "ELSE", "
5170: 45 4e 44 22 2c 20 22 45 53 43 41 50 45 22 2c 20  END", "ESCAPE", 
5180: 22 45 58 43 45 50 54 22 2c 20 22 45 58 43 4c 55  "EXCEPT", "EXCLU
5190: 53 49 56 45 22 2c 20 22 45 58 49 53 54 53 22 2c  SIVE", "EXISTS",
51a0: 20 22 45 58 50 4c 41 49 4e 22 2c 0a 20 20 20 20   "EXPLAIN",.    
51b0: 22 46 41 49 4c 22 2c 20 22 46 4f 52 22 2c 20 22  "FAIL", "FOR", "
51c0: 46 4f 52 45 49 47 4e 22 2c 20 22 46 52 4f 4d 22  FOREIGN", "FROM"
51d0: 2c 20 22 46 55 4c 4c 22 2c 20 22 47 4c 4f 42 22  , "FULL", "GLOB"
51e0: 2c 20 22 47 52 4f 55 50 22 2c 20 22 48 41 56 49  , "GROUP", "HAVI
51f0: 4e 47 22 2c 20 22 49 46 22 2c 0a 20 20 20 20 22  NG", "IF",.    "
5200: 49 47 4e 4f 52 45 22 2c 20 22 49 4d 4d 45 44 49  IGNORE", "IMMEDI
5210: 41 54 45 22 2c 20 22 49 4e 22 2c 20 22 49 4e 44  ATE", "IN", "IND
5220: 45 58 22 2c 20 22 49 4e 44 45 58 45 44 22 2c 20  EX", "INDEXED", 
5230: 22 49 4e 49 54 49 41 4c 4c 59 22 2c 20 22 49 4e  "INITIALLY", "IN
5240: 4e 45 52 22 2c 0a 20 20 20 20 22 49 4e 53 45 52  NER",.    "INSER
5250: 54 22 2c 20 22 49 4e 53 54 45 41 44 22 2c 20 22  T", "INSTEAD", "
5260: 49 4e 54 45 52 53 45 43 54 22 2c 20 22 49 4e 54  INTERSECT", "INT
5270: 4f 22 2c 20 22 49 53 22 2c 20 22 49 53 4e 55 4c  O", "IS", "ISNUL
5280: 4c 22 2c 20 22 4a 4f 49 4e 22 2c 20 22 4b 45 59  L", "JOIN", "KEY
5290: 22 2c 0a 20 20 20 20 22 4c 45 46 54 22 2c 20 22  ",.    "LEFT", "
52a0: 4c 49 4b 45 22 2c 20 22 4c 49 4d 49 54 22 2c 0a  LIKE", "LIMIT",.
52b0: 20 20 20 20 22 4d 41 54 43 48 22 2c 20 22 4e 41      "MATCH", "NA
52c0: 54 55 52 41 4c 22 2c 20 22 4e 4f 22 2c 20 22 4e  TURAL", "NO", "N
52d0: 4f 54 22 2c 20 22 4e 4f 54 48 49 4e 47 22 2c 20  OT", "NOTHING", 
52e0: 22 4e 4f 54 4e 55 4c 4c 22 2c 0a 20 20 20 20 22  "NOTNULL",.    "
52f0: 4e 55 4c 4c 22 2c 20 22 4f 46 22 2c 20 22 4f 46  NULL", "OF", "OF
5300: 46 53 45 54 22 2c 20 22 4f 4e 22 2c 20 22 4f 52  FSET", "ON", "OR
5310: 22 2c 20 22 4f 52 44 45 52 22 2c 20 22 4f 55 54  ", "ORDER", "OUT
5320: 45 52 22 2c 20 22 50 4c 41 4e 22 2c 20 22 50 52  ER", "PLAN", "PR
5330: 41 47 4d 41 22 2c 0a 20 20 20 20 22 50 52 49 4d  AGMA",.    "PRIM
5340: 41 52 59 22 2c 20 22 51 55 45 52 59 22 2c 20 22  ARY", "QUERY", "
5350: 52 41 49 53 45 22 2c 20 22 52 45 43 55 52 53 49  RAISE", "RECURSI
5360: 56 45 22 2c 20 22 52 45 46 45 52 45 4e 43 45 53  VE", "REFERENCES
5370: 22 2c 20 22 52 45 47 45 58 50 22 2c 0a 20 20 20  ", "REGEXP",.   
5380: 20 22 52 45 49 4e 44 45 58 22 2c 20 22 52 45 4c   "REINDEX", "REL
5390: 45 41 53 45 22 2c 20 22 52 45 4e 41 4d 45 22 2c  EASE", "RENAME",
53a0: 20 22 52 45 50 4c 41 43 45 22 2c 20 22 52 45 53   "REPLACE", "RES
53b0: 54 52 49 43 54 22 2c 20 22 52 49 47 48 54 22 2c  TRICT", "RIGHT",
53c0: 0a 20 20 20 20 22 52 4f 4c 4c 42 41 43 4b 22 2c  .    "ROLLBACK",
53d0: 20 22 52 4f 57 22 2c 20 22 53 41 56 45 50 4f 49   "ROW", "SAVEPOI
53e0: 4e 54 22 2c 20 22 53 45 4c 45 43 54 22 2c 20 22  NT", "SELECT", "
53f0: 53 45 54 22 2c 20 22 54 41 42 4c 45 22 2c 20 22  SET", "TABLE", "
5400: 54 45 4d 50 22 2c 0a 20 20 20 20 22 54 45 4d 50  TEMP",.    "TEMP
5410: 4f 52 41 52 59 22 2c 20 22 54 48 45 4e 22 2c 20  ORARY", "THEN", 
5420: 22 54 4f 22 2c 20 22 54 52 41 4e 53 41 43 54 49  "TO", "TRANSACTI
5430: 4f 4e 22 2c 20 22 54 52 49 47 47 45 52 22 2c 20  ON", "TRIGGER", 
5440: 22 55 4e 49 4f 4e 22 2c 20 22 55 4e 49 51 55 45  "UNION", "UNIQUE
5450: 22 2c 0a 20 20 20 20 22 55 50 44 41 54 45 22 2c  ",.    "UPDATE",
5460: 20 22 55 53 49 4e 47 22 2c 20 22 56 41 43 55 55   "USING", "VACUU
5470: 4d 22 2c 20 22 56 41 4c 55 45 53 22 2c 20 22 56  M", "VALUES", "V
5480: 49 45 57 22 2c 20 22 56 49 52 54 55 41 4c 22 2c  IEW", "VIRTUAL",
5490: 20 22 57 48 45 4e 22 2c 20 22 57 48 45 52 45 22   "WHEN", "WHERE"
54a0: 2c 0a 20 20 20 20 22 57 49 54 48 22 2c 20 22 57  ,.    "WITH", "W
54b0: 49 54 48 4f 55 54 22 2c 0a 20 20 7d 3b 0a 20 20  ITHOUT",.  };.  
54c0: 69 6e 74 20 69 2c 20 6c 77 72 2c 20 75 70 72 2c  int i, lwr, upr,
54d0: 20 6d 69 64 2c 20 63 3b 0a 20 20 69 66 28 20 21   mid, c;.  if( !
54e0: 69 73 61 6c 70 68 61 28 28 75 6e 73 69 67 6e 65  isalpha((unsigne
54f0: 64 20 63 68 61 72 29 7a 4e 61 6d 65 5b 30 5d 29  d char)zName[0])
5500: 20 26 26 20 7a 4e 61 6d 65 5b 30 5d 21 3d 27 5f   && zName[0]!='_
5510: 27 20 29 20 72 65 74 75 72 6e 20 27 22 27 3b 0a  ' ) return '"';.
5520: 20 20 66 6f 72 28 69 3d 30 3b 20 7a 4e 61 6d 65    for(i=0; zName
5530: 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  [i]; i++){.    i
5540: 66 28 20 21 69 73 61 6c 6e 75 6d 28 28 75 6e 73  f( !isalnum((uns
5550: 69 67 6e 65 64 20 63 68 61 72 29 7a 4e 61 6d 65  igned char)zName
5560: 5b 69 5d 29 20 26 26 20 7a 4e 61 6d 65 5b 69 5d  [i]) && zName[i]
5570: 21 3d 27 5f 27 20 29 20 72 65 74 75 72 6e 20 27  !='_' ) return '
5580: 22 27 3b 0a 20 20 7d 0a 20 20 6c 77 72 20 3d 20  "';.  }.  lwr = 
5590: 30 3b 0a 20 20 75 70 72 20 3d 20 73 69 7a 65 6f  0;.  upr = sizeo
55a0: 66 28 61 7a 4b 65 79 77 6f 72 64 73 29 2f 73 69  f(azKeywords)/si
55b0: 7a 65 6f 66 28 61 7a 4b 65 79 77 6f 72 64 73 5b  zeof(azKeywords[
55c0: 30 5d 29 20 2d 20 31 3b 0a 20 20 77 68 69 6c 65  0]) - 1;.  while
55d0: 28 20 6c 77 72 3c 3d 75 70 72 20 29 7b 0a 20 20  ( lwr<=upr ){.  
55e0: 20 20 6d 69 64 20 3d 20 28 6c 77 72 2b 75 70 72    mid = (lwr+upr
55f0: 29 2f 32 3b 0a 20 20 20 20 63 20 3d 20 73 71 6c  )/2;.    c = sql
5600: 69 74 65 33 5f 73 74 72 69 63 6d 70 28 61 7a 4b  ite3_stricmp(azK
5610: 65 79 77 6f 72 64 73 5b 6d 69 64 5d 2c 20 7a 4e  eywords[mid], zN
5620: 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 63 3d  ame);.    if( c=
5630: 3d 30 20 29 20 72 65 74 75 72 6e 20 27 22 27 3b  =0 ) return '"';
5640: 0a 20 20 20 20 69 66 28 20 63 3c 30 20 29 7b 0a  .    if( c<0 ){.
5650: 20 20 20 20 20 20 6c 77 72 20 3d 20 6d 69 64 2b        lwr = mid+
5660: 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  1;.    }else{.  
5670: 20 20 20 20 75 70 72 20 3d 20 6d 69 64 2d 31 3b      upr = mid-1;
5680: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
5690: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
56a0: 43 6f 6e 73 74 72 75 63 74 20 61 20 66 61 6b 65  Construct a fake
56b0: 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 61 6e 64   object name and
56c0: 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 74 6f 20   column list to 
56d0: 64 65 73 63 72 69 62 65 20 74 68 65 20 73 74 72  describe the str
56e0: 75 63 74 75 72 65 0a 2a 2a 20 6f 66 20 74 68 65  ucture.** of the
56f0: 20 76 69 65 77 2c 20 76 69 72 74 75 61 6c 20 74   view, virtual t
5700: 61 62 6c 65 2c 20 6f 72 20 74 61 62 6c 65 20 76  able, or table v
5710: 61 6c 75 65 64 20 66 75 6e 63 74 69 6f 6e 20 7a  alued function z
5720: 53 63 68 65 6d 61 2e 7a 4e 61 6d 65 2e 0a 2a 2f  Schema.zName..*/
5730: 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 73 68  .static char *sh
5740: 65 6c 6c 46 61 6b 65 53 63 68 65 6d 61 28 0a 20  ellFakeSchema(. 
5750: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20   sqlite3 *db,   
5760: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
5770: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
5780: 69 6f 6e 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ion containing t
5790: 68 65 20 76 74 61 62 20 2a 2f 0a 20 20 63 6f 6e  he vtab */.  con
57a0: 73 74 20 63 68 61 72 20 2a 7a 53 63 68 65 6d 61  st char *zSchema
57b0: 2c 20 20 20 20 2f 2a 20 53 63 68 65 6d 61 20 6f  ,    /* Schema o
57c0: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68  f the database h
57d0: 6f 6c 64 69 6e 67 20 74 68 65 20 76 74 61 62 20  olding the vtab 
57e0: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
57f0: 2a 7a 4e 61 6d 65 20 20 20 20 20 20 20 2f 2a 20  *zName       /* 
5800: 54 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  The name of the 
5810: 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 2a 2f  virtual table */
5820: 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  .){.  sqlite3_st
5830: 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20  mt *pStmt = 0;. 
5840: 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 53   char *zSql;.  S
5850: 68 65 6c 6c 54 65 78 74 20 73 3b 0a 20 20 63 68  hellText s;.  ch
5860: 61 72 20 63 51 75 6f 74 65 3b 0a 20 20 63 68 61  ar cQuote;.  cha
5870: 72 20 2a 7a 44 69 76 20 3d 20 22 28 22 3b 0a 20  r *zDiv = "(";. 
5880: 20 69 6e 74 20 6e 52 6f 77 20 3d 20 30 3b 0a 0a   int nRow = 0;..
5890: 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33    zSql = sqlite3
58a0: 5f 6d 70 72 69 6e 74 66 28 22 50 52 41 47 4d 41  _mprintf("PRAGMA
58b0: 20 5c 22 25 77 5c 22 2e 74 61 62 6c 65 5f 69 6e   \"%w\".table_in
58c0: 66 6f 3d 25 51 3b 22 2c 0a 20 20 20 20 20 20 20  fo=%Q;",.       
58d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
58e0: 20 20 7a 53 63 68 65 6d 61 20 3f 20 7a 53 63 68    zSchema ? zSch
58f0: 65 6d 61 20 3a 20 22 6d 61 69 6e 22 2c 20 7a 4e  ema : "main", zN
5900: 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  ame);.  sqlite3_
5910: 70 72 65 70 61 72 65 5f 76 32 28 64 62 2c 20 7a  prepare_v2(db, z
5920: 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c  Sql, -1, &pStmt,
5930: 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66   0);.  sqlite3_f
5940: 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 69 6e 69  ree(zSql);.  ini
5950: 74 54 65 78 74 28 26 73 29 3b 0a 20 20 69 66 28  tText(&s);.  if(
5960: 20 7a 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20   zSchema ){.    
5970: 63 51 75 6f 74 65 20 3d 20 71 75 6f 74 65 43 68  cQuote = quoteCh
5980: 61 72 28 7a 53 63 68 65 6d 61 29 3b 0a 20 20 20  ar(zSchema);.   
5990: 20 69 66 28 20 63 51 75 6f 74 65 20 26 26 20 73   if( cQuote && s
59a0: 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28 7a  qlite3_stricmp(z
59b0: 53 63 68 65 6d 61 2c 22 74 65 6d 70 22 29 3d 3d  Schema,"temp")==
59c0: 30 20 29 20 63 51 75 6f 74 65 20 3d 20 30 3b 0a  0 ) cQuote = 0;.
59d0: 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26      appendText(&
59e0: 73 2c 20 7a 53 63 68 65 6d 61 2c 20 63 51 75 6f  s, zSchema, cQuo
59f0: 74 65 29 3b 0a 20 20 20 20 61 70 70 65 6e 64 54  te);.    appendT
5a00: 65 78 74 28 26 73 2c 20 22 2e 22 2c 20 30 29 3b  ext(&s, ".", 0);
5a10: 0a 20 20 7d 0a 20 20 63 51 75 6f 74 65 20 3d 20  .  }.  cQuote = 
5a20: 71 75 6f 74 65 43 68 61 72 28 7a 4e 61 6d 65 29  quoteChar(zName)
5a30: 3b 0a 20 20 61 70 70 65 6e 64 54 65 78 74 28 26  ;.  appendText(&
5a40: 73 2c 20 7a 4e 61 6d 65 2c 20 63 51 75 6f 74 65  s, zName, cQuote
5a50: 29 3b 0a 20 20 77 68 69 6c 65 28 20 73 71 6c 69  );.  while( sqli
5a60: 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3d  te3_step(pStmt)=
5a70: 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20  =SQLITE_ROW ){. 
5a80: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
5a90: 43 6f 6c 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  Col = (const cha
5aa0: 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  r*)sqlite3_colum
5ab0: 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 31 29  n_text(pStmt, 1)
5ac0: 3b 0a 20 20 20 20 6e 52 6f 77 2b 2b 3b 0a 20 20  ;.    nRow++;.  
5ad0: 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 2c    appendText(&s,
5ae0: 20 7a 44 69 76 2c 20 30 29 3b 0a 20 20 20 20 7a   zDiv, 0);.    z
5af0: 44 69 76 20 3d 20 22 2c 22 3b 0a 20 20 20 20 63  Div = ",";.    c
5b00: 51 75 6f 74 65 20 3d 20 71 75 6f 74 65 43 68 61  Quote = quoteCha
5b10: 72 28 7a 43 6f 6c 29 3b 0a 20 20 20 20 61 70 70  r(zCol);.    app
5b20: 65 6e 64 54 65 78 74 28 26 73 2c 20 7a 43 6f 6c  endText(&s, zCol
5b30: 2c 20 63 51 75 6f 74 65 29 3b 0a 20 20 7d 0a 20  , cQuote);.  }. 
5b40: 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 2c 20   appendText(&s, 
5b50: 22 29 22 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74  ")", 0);.  sqlit
5b60: 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d  e3_finalize(pStm
5b70: 74 29 3b 0a 20 20 69 66 28 20 6e 52 6f 77 3d 3d  t);.  if( nRow==
5b80: 30 20 29 7b 0a 20 20 20 20 66 72 65 65 54 65 78  0 ){.    freeTex
5b90: 74 28 26 73 29 3b 0a 20 20 20 20 73 2e 7a 20 3d  t(&s);.    s.z =
5ba0: 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
5bb0: 20 73 2e 7a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53   s.z;.}../*.** S
5bc0: 51 4c 20 66 75 6e 63 74 69 6f 6e 3a 20 20 73 68  QL function:  sh
5bd0: 65 6c 6c 5f 6d 6f 64 75 6c 65 5f 73 63 68 65 6d  ell_module_schem
5be0: 61 28 58 29 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  a(X).**.** Retur
5bf0: 6e 20 61 20 66 61 6b 65 20 73 63 68 65 6d 61 20  n a fake schema 
5c00: 66 6f 72 20 74 68 65 20 74 61 62 6c 65 2d 76 61  for the table-va
5c10: 6c 75 65 64 20 66 75 6e 63 74 69 6f 6e 20 6f 72  lued function or
5c20: 20 65 70 6f 6e 79 6d 6f 75 73 20 76 69 72 74 75   eponymous virtu
5c30: 61 6c 0a 2a 2a 20 74 61 62 6c 65 20 58 2e 0a 2a  al.** table X..*
5c40: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 68  /.static void sh
5c50: 65 6c 6c 4d 6f 64 75 6c 65 53 63 68 65 6d 61 28  ellModuleSchema(
5c60: 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  .  sqlite3_conte
5c70: 78 74 20 2a 70 43 74 78 2c 0a 20 20 69 6e 74 20  xt *pCtx,.  int 
5c80: 6e 56 61 6c 2c 0a 20 20 73 71 6c 69 74 65 33 5f  nVal,.  sqlite3_
5c90: 76 61 6c 75 65 20 2a 2a 61 70 56 61 6c 0a 29 7b  value **apVal.){
5ca0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
5cb0: 4e 61 6d 65 20 3d 20 28 63 6f 6e 73 74 20 63 68  Name = (const ch
5cc0: 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75  ar*)sqlite3_valu
5cd0: 65 5f 74 65 78 74 28 61 70 56 61 6c 5b 30 5d 29  e_text(apVal[0])
5ce0: 3b 0a 20 20 63 68 61 72 20 2a 7a 46 61 6b 65 20  ;.  char *zFake 
5cf0: 3d 20 73 68 65 6c 6c 46 61 6b 65 53 63 68 65 6d  = shellFakeSchem
5d00: 61 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  a(sqlite3_contex
5d10: 74 5f 64 62 5f 68 61 6e 64 6c 65 28 70 43 74 78  t_db_handle(pCtx
5d20: 29 2c 20 30 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  ), 0, zName);.  
5d30: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
5d40: 28 6e 56 61 6c 29 3b 0a 20 20 69 66 28 20 7a 46  (nVal);.  if( zF
5d50: 61 6b 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ake ){.    sqlit
5d60: 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 70  e3_result_text(p
5d70: 43 74 78 2c 20 73 71 6c 69 74 65 33 5f 6d 70 72  Ctx, sqlite3_mpr
5d80: 69 6e 74 66 28 22 2f 2a 20 25 73 20 2a 2f 22 2c  intf("/* %s */",
5d90: 20 7a 46 61 6b 65 29 2c 0a 20 20 20 20 20 20 20   zFake),.       
5da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5db0: 20 2d 31 2c 20 73 71 6c 69 74 65 33 5f 66 72 65   -1, sqlite3_fre
5dc0: 65 29 3b 0a 20 20 20 20 66 72 65 65 28 7a 46 61  e);.    free(zFa
5dd0: 6b 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ke);.  }.}../*.*
5de0: 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 3a 20  * SQL function: 
5df0: 20 73 68 65 6c 6c 5f 61 64 64 5f 73 63 68 65 6d   shell_add_schem
5e00: 61 28 53 2c 58 29 0a 2a 2a 0a 2a 2a 20 41 64 64  a(S,X).**.** Add
5e10: 20 74 68 65 20 73 63 68 65 6d 61 20 6e 61 6d 65   the schema name
5e20: 20 58 20 74 6f 20 74 68 65 20 43 52 45 41 54 45   X to the CREATE
5e30: 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 20 53 20   statement in S 
5e40: 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20 72  and return the r
5e50: 65 73 75 6c 74 2e 0a 2a 2a 20 45 78 61 6d 70 6c  esult..** Exampl
5e60: 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 43 52 45  es:.**.**    CRE
5e70: 41 54 45 20 54 41 42 4c 45 20 74 31 28 78 29 20  ATE TABLE t1(x) 
5e80: 20 20 2d 3e 20 20 20 43 52 45 41 54 45 20 54 41    ->   CREATE TA
5e90: 42 4c 45 20 78 79 7a 2e 74 31 28 78 29 3b 0a 2a  BLE xyz.t1(x);.*
5ea0: 2a 0a 2a 2a 20 41 6c 73 6f 20 77 6f 72 6b 73 20  *.** Also works 
5eb0: 6f 6e 0a 2a 2a 0a 2a 2a 20 20 20 20 43 52 45 41  on.**.**    CREA
5ec0: 54 45 20 49 4e 44 45 58 0a 2a 2a 20 20 20 20 43  TE INDEX.**    C
5ed0: 52 45 41 54 45 20 55 4e 49 51 55 45 20 49 4e 44  REATE UNIQUE IND
5ee0: 45 58 0a 2a 2a 20 20 20 20 43 52 45 41 54 45 20  EX.**    CREATE 
5ef0: 56 49 45 57 0a 2a 2a 20 20 20 20 43 52 45 41 54  VIEW.**    CREAT
5f00: 45 20 54 52 49 47 47 45 52 0a 2a 2a 20 20 20 20  E TRIGGER.**    
5f10: 43 52 45 41 54 45 20 56 49 52 54 55 41 4c 20 54  CREATE VIRTUAL T
5f20: 41 42 4c 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ABLE.**.** This 
5f30: 55 44 46 20 69 73 20 75 73 65 64 20 62 79 20 74  UDF is used by t
5f40: 68 65 20 2e 73 63 68 65 6d 61 20 63 6f 6d 6d 61  he .schema comma
5f50: 6e 64 20 74 6f 20 69 6e 73 65 72 74 20 74 68 65  nd to insert the
5f60: 20 73 63 68 65 6d 61 20 6e 61 6d 65 20 6f 66 0a   schema name of.
5f70: 2a 2a 20 61 74 74 61 63 68 65 64 20 64 61 74 61  ** attached data
5f80: 62 61 73 65 73 20 69 6e 74 6f 20 74 68 65 20 6d  bases into the m
5f90: 69 64 64 6c 65 20 6f 66 20 74 68 65 20 73 71 6c  iddle of the sql
5fa0: 69 74 65 5f 6d 61 73 74 65 72 2e 73 71 6c 20 66  ite_master.sql f
5fb0: 69 65 6c 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ield..*/.static 
5fc0: 76 6f 69 64 20 73 68 65 6c 6c 41 64 64 53 63 68  void shellAddSch
5fd0: 65 6d 61 4e 61 6d 65 28 0a 20 20 73 71 6c 69 74  emaName(.  sqlit
5fe0: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78  e3_context *pCtx
5ff0: 2c 0a 20 20 69 6e 74 20 6e 56 61 6c 2c 0a 20 20  ,.  int nVal,.  
6000: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
6010: 61 70 56 61 6c 0a 29 7b 0a 20 20 73 74 61 74 69  apVal.){.  stati
6020: 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 50  c const char *aP
6030: 72 65 66 69 78 5b 5d 20 3d 20 7b 0a 20 20 20 20  refix[] = {.    
6040: 20 22 54 41 42 4c 45 22 2c 0a 20 20 20 20 20 22   "TABLE",.     "
6050: 49 4e 44 45 58 22 2c 0a 20 20 20 20 20 22 55 4e  INDEX",.     "UN
6060: 49 51 55 45 20 49 4e 44 45 58 22 2c 0a 20 20 20  IQUE INDEX",.   
6070: 20 20 22 56 49 45 57 22 2c 0a 20 20 20 20 20 22    "VIEW",.     "
6080: 54 52 49 47 47 45 52 22 2c 0a 20 20 20 20 20 22  TRIGGER",.     "
6090: 56 49 52 54 55 41 4c 20 54 41 42 4c 45 22 0a 20  VIRTUAL TABLE". 
60a0: 20 7d 3b 0a 20 20 69 6e 74 20 69 20 3d 20 30 3b   };.  int i = 0;
60b0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
60c0: 49 6e 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  In = (const char
60d0: 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  *)sqlite3_value_
60e0: 74 65 78 74 28 61 70 56 61 6c 5b 30 5d 29 3b 0a  text(apVal[0]);.
60f0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53    const char *zS
6100: 63 68 65 6d 61 20 3d 20 28 63 6f 6e 73 74 20 63  chema = (const c
6110: 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c  har*)sqlite3_val
6120: 75 65 5f 74 65 78 74 28 61 70 56 61 6c 5b 31 5d  ue_text(apVal[1]
6130: 29 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  );.  const char 
6140: 2a 7a 4e 61 6d 65 20 3d 20 28 63 6f 6e 73 74 20  *zName = (const 
6150: 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61  char*)sqlite3_va
6160: 6c 75 65 5f 74 65 78 74 28 61 70 56 61 6c 5b 32  lue_text(apVal[2
6170: 5d 29 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  ]);.  sqlite3 *d
6180: 62 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74  b = sqlite3_cont
6190: 65 78 74 5f 64 62 5f 68 61 6e 64 6c 65 28 70 43  ext_db_handle(pC
61a0: 74 78 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  tx);.  UNUSED_PA
61b0: 52 41 4d 45 54 45 52 28 6e 56 61 6c 29 3b 0a 20  RAMETER(nVal);. 
61c0: 20 69 66 28 20 7a 49 6e 21 3d 30 20 26 26 20 73   if( zIn!=0 && s
61d0: 74 72 6e 63 6d 70 28 7a 49 6e 2c 20 22 43 52 45  trncmp(zIn, "CRE
61e0: 41 54 45 20 22 2c 20 37 29 3d 3d 30 20 29 7b 0a  ATE ", 7)==0 ){.
61f0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 28      for(i=0; i<(
6200: 69 6e 74 29 28 73 69 7a 65 6f 66 28 61 50 72 65  int)(sizeof(aPre
6210: 66 69 78 29 2f 73 69 7a 65 6f 66 28 61 50 72 65  fix)/sizeof(aPre
6220: 66 69 78 5b 30 5d 29 29 3b 20 69 2b 2b 29 7b 0a  fix[0])); i++){.
6230: 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 73 74        int n = st
6240: 72 6c 65 6e 33 30 28 61 50 72 65 66 69 78 5b 69  rlen30(aPrefix[i
6250: 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 74  ]);.      if( st
6260: 72 6e 63 6d 70 28 7a 49 6e 2b 37 2c 20 61 50 72  rncmp(zIn+7, aPr
6270: 65 66 69 78 5b 69 5d 2c 20 6e 29 3d 3d 30 20 26  efix[i], n)==0 &
6280: 26 20 7a 49 6e 5b 6e 2b 37 5d 3d 3d 27 20 27 20  & zIn[n+7]==' ' 
6290: 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  ){.        char 
62a0: 2a 7a 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  *z = 0;.        
62b0: 63 68 61 72 20 2a 7a 46 61 6b 65 20 3d 20 30 3b  char *zFake = 0;
62c0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 53 63  .        if( zSc
62d0: 68 65 6d 61 20 29 7b 0a 20 20 20 20 20 20 20 20  hema ){.        
62e0: 20 20 63 68 61 72 20 63 51 75 6f 74 65 20 3d 20    char cQuote = 
62f0: 71 75 6f 74 65 43 68 61 72 28 7a 53 63 68 65 6d  quoteChar(zSchem
6300: 61 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  a);.          if
6310: 28 20 63 51 75 6f 74 65 20 26 26 20 73 71 6c 69  ( cQuote && sqli
6320: 74 65 33 5f 73 74 72 69 63 6d 70 28 7a 53 63 68  te3_stricmp(zSch
6330: 65 6d 61 2c 22 74 65 6d 70 22 29 21 3d 30 20 29  ema,"temp")!=0 )
6340: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 20  {.            z 
6350: 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
6360: 66 28 22 25 2e 2a 73 20 5c 22 25 77 5c 22 2e 25  f("%.*s \"%w\".%
6370: 73 22 2c 20 6e 2b 37 2c 20 7a 49 6e 2c 20 7a 53  s", n+7, zIn, zS
6380: 63 68 65 6d 61 2c 20 7a 49 6e 2b 6e 2b 38 29 3b  chema, zIn+n+8);
6390: 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
63a0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 20  {.            z 
63b0: 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
63c0: 66 28 22 25 2e 2a 73 20 25 73 2e 25 73 22 2c 20  f("%.*s %s.%s", 
63d0: 6e 2b 37 2c 20 7a 49 6e 2c 20 7a 53 63 68 65 6d  n+7, zIn, zSchem
63e0: 61 2c 20 7a 49 6e 2b 6e 2b 38 29 3b 0a 20 20 20  a, zIn+n+8);.   
63f0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
6400: 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a   }.        if( z
6410: 4e 61 6d 65 0a 20 20 20 20 20 20 20 20 20 26 26  Name.         &&
6420: 20 61 50 72 65 66 69 78 5b 69 5d 5b 30 5d 3d 3d   aPrefix[i][0]==
6430: 27 56 27 0a 20 20 20 20 20 20 20 20 20 26 26 20  'V'.         && 
6440: 28 7a 46 61 6b 65 20 3d 20 73 68 65 6c 6c 46 61  (zFake = shellFa
6450: 6b 65 53 63 68 65 6d 61 28 64 62 2c 20 7a 53 63  keSchema(db, zSc
6460: 68 65 6d 61 2c 20 7a 4e 61 6d 65 29 29 21 3d 30  hema, zName))!=0
6470: 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20  .        ){.    
6480: 20 20 20 20 20 20 69 66 28 20 7a 3d 3d 30 20 29        if( z==0 )
6490: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 20  {.            z 
64a0: 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
64b0: 66 28 22 25 73 5c 6e 2f 2a 20 25 73 20 2a 2f 22  f("%s\n/* %s */"
64c0: 2c 20 7a 49 6e 2c 20 7a 46 61 6b 65 29 3b 0a 20  , zIn, zFake);. 
64d0: 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
64e0: 20 20 20 20 20 20 20 20 20 20 20 20 7a 20 3d 20              z = 
64f0: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
6500: 22 25 7a 5c 6e 2f 2a 20 25 73 20 2a 2f 22 2c 20  "%z\n/* %s */", 
6510: 7a 2c 20 7a 46 61 6b 65 29 3b 0a 20 20 20 20 20  z, zFake);.     
6520: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
6530: 20 66 72 65 65 28 7a 46 61 6b 65 29 3b 0a 20 20   free(zFake);.  
6540: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
6550: 69 66 28 20 7a 20 29 7b 0a 20 20 20 20 20 20 20  if( z ){.       
6560: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
6570: 74 5f 74 65 78 74 28 70 43 74 78 2c 20 7a 2c 20  t_text(pCtx, z, 
6580: 2d 31 2c 20 73 71 6c 69 74 65 33 5f 66 72 65 65  -1, sqlite3_free
6590: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  );.          ret
65a0: 75 72 6e 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  urn;.        }. 
65b0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
65c0: 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  .  sqlite3_resul
65d0: 74 5f 76 61 6c 75 65 28 70 43 74 78 2c 20 61 70  t_value(pCtx, ap
65e0: 56 61 6c 5b 30 5d 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  Val[0]);.}../*.*
65f0: 2a 20 54 68 65 20 73 6f 75 72 63 65 20 63 6f 64  * The source cod
6600: 65 20 66 6f 72 20 73 65 76 65 72 61 6c 20 72 75  e for several ru
6610: 6e 2d 74 69 6d 65 20 6c 6f 61 64 61 62 6c 65 20  n-time loadable 
6620: 65 78 74 65 6e 73 69 6f 6e 73 20 69 73 20 69 6e  extensions is in
6630: 73 65 72 74 65 64 0a 2a 2a 20 62 65 6c 6f 77 20  serted.** below 
6640: 62 79 20 74 68 65 20 2e 2e 2f 74 6f 6f 6c 2f 6d  by the ../tool/m
6650: 6b 73 68 65 6c 6c 63 2e 74 63 6c 20 73 63 72 69  kshellc.tcl scri
6660: 70 74 2e 20 20 42 65 66 6f 72 65 20 70 72 6f 63  pt.  Before proc
6670: 65 73 73 69 6e 67 20 74 68 61 74 20 69 6e 63 6c  essing that incl
6680: 75 64 65 64 0a 2a 2a 20 63 6f 64 65 2c 20 77 65  uded.** code, we
6690: 20 6e 65 65 64 20 74 6f 20 6f 76 65 72 72 69 64   need to overrid
66a0: 65 20 73 6f 6d 65 20 6d 61 63 72 6f 73 20 74 6f  e some macros to
66b0: 20 6d 61 6b 65 20 74 68 65 20 69 6e 63 6c 75 64   make the includ
66c0: 65 64 20 70 72 6f 67 72 61 6d 20 63 6f 64 65 0a  ed program code.
66d0: 2a 2a 20 77 6f 72 6b 20 68 65 72 65 20 69 6e 20  ** work here in 
66e0: 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 20 74 68  the middle of th
66f0: 69 73 20 72 65 67 75 6c 61 72 20 70 72 6f 67 72  is regular progr
6700: 61 6d 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 53  am..*/.#define S
6710: 51 4c 49 54 45 5f 45 58 54 45 4e 53 49 4f 4e 5f  QLITE_EXTENSION_
6720: 49 4e 49 54 31 0a 23 64 65 66 69 6e 65 20 53 51  INIT1.#define SQ
6730: 4c 49 54 45 5f 45 58 54 45 4e 53 49 4f 4e 5f 49  LITE_EXTENSION_I
6740: 4e 49 54 32 28 58 29 20 28 76 6f 69 64 29 28 58  NIT2(X) (void)(X
6750: 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f  )..#if defined(_
6760: 57 49 4e 33 32 29 20 26 26 20 64 65 66 69 6e 65  WIN32) && define
6770: 64 28 5f 4d 53 43 5f 56 45 52 29 0a 49 4e 43 4c  d(_MSC_VER).INCL
6780: 55 44 45 20 74 65 73 74 5f 77 69 6e 64 69 72 65  UDE test_windire
6790: 6e 74 2e 68 0a 49 4e 43 4c 55 44 45 20 74 65 73  nt.h.INCLUDE tes
67a0: 74 5f 77 69 6e 64 69 72 65 6e 74 2e 63 0a 23 64  t_windirent.c.#d
67b0: 65 66 69 6e 65 20 64 69 72 65 6e 74 20 44 49 52  efine dirent DIR
67c0: 45 4e 54 0a 23 65 6e 64 69 66 0a 49 4e 43 4c 55  ENT.#endif.INCLU
67d0: 44 45 20 2e 2e 2f 65 78 74 2f 6d 69 73 63 2f 73  DE ../ext/misc/s
67e0: 68 61 74 68 72 65 65 2e 63 0a 49 4e 43 4c 55 44  hathree.c.INCLUD
67f0: 45 20 2e 2e 2f 65 78 74 2f 6d 69 73 63 2f 66 69  E ../ext/misc/fi
6800: 6c 65 69 6f 2e 63 0a 49 4e 43 4c 55 44 45 20 2e  leio.c.INCLUDE .
6810: 2e 2f 65 78 74 2f 6d 69 73 63 2f 63 6f 6d 70 6c  ./ext/misc/compl
6820: 65 74 69 6f 6e 2e 63 0a 49 4e 43 4c 55 44 45 20  etion.c.INCLUDE 
6830: 2e 2e 2f 65 78 74 2f 6d 69 73 63 2f 61 70 70 65  ../ext/misc/appe
6840: 6e 64 76 66 73 2e 63 0a 23 69 66 64 65 66 20 53  ndvfs.c.#ifdef S
6850: 51 4c 49 54 45 5f 48 41 56 45 5f 5a 4c 49 42 0a  QLITE_HAVE_ZLIB.
6860: 49 4e 43 4c 55 44 45 20 2e 2e 2f 65 78 74 2f 6d  INCLUDE ../ext/m
6870: 69 73 63 2f 7a 69 70 66 69 6c 65 2e 63 0a 49 4e  isc/zipfile.c.IN
6880: 43 4c 55 44 45 20 2e 2e 2f 65 78 74 2f 6d 69 73  CLUDE ../ext/mis
6890: 63 2f 73 71 6c 61 72 2e 63 0a 23 65 6e 64 69 66  c/sqlar.c.#endif
68a0: 0a 49 4e 43 4c 55 44 45 20 2e 2e 2f 65 78 74 2f  .INCLUDE ../ext/
68b0: 65 78 70 65 72 74 2f 73 71 6c 69 74 65 33 65 78  expert/sqlite3ex
68c0: 70 65 72 74 2e 68 0a 49 4e 43 4c 55 44 45 20 2e  pert.h.INCLUDE .
68d0: 2e 2f 65 78 74 2f 65 78 70 65 72 74 2f 73 71 6c  ./ext/expert/sql
68e0: 69 74 65 33 65 78 70 65 72 74 2e 63 0a 0a 23 69  ite3expert.c..#i
68f0: 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
6900: 5f 45 4e 41 42 4c 45 5f 53 45 53 53 49 4f 4e 29  _ENABLE_SESSION)
6910: 0a 2f 2a 0a 2a 2a 20 53 74 61 74 65 20 69 6e 66  ./*.** State inf
6920: 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 61 20 73  ormation for a s
6930: 69 6e 67 6c 65 20 6f 70 65 6e 20 73 65 73 73 69  ingle open sessi
6940: 6f 6e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  on.*/.typedef st
6950: 72 75 63 74 20 4f 70 65 6e 53 65 73 73 69 6f 6e  ruct OpenSession
6960: 20 4f 70 65 6e 53 65 73 73 69 6f 6e 3b 0a 73 74   OpenSession;.st
6970: 72 75 63 74 20 4f 70 65 6e 53 65 73 73 69 6f 6e  ruct OpenSession
6980: 20 7b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65   {.  char *zName
6990: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
69a0: 20 53 79 6d 62 6f 6c 69 63 20 6e 61 6d 65 20 66   Symbolic name f
69b0: 6f 72 20 74 68 69 73 20 73 65 73 73 69 6f 6e 20  or this session 
69c0: 2a 2f 0a 20 20 69 6e 74 20 6e 46 69 6c 74 65 72  */.  int nFilter
69d0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
69e0: 20 4e 75 6d 62 65 72 20 6f 66 20 78 46 69 6c 74   Number of xFilt
69f0: 65 72 20 72 65 6a 65 63 74 69 6f 6e 20 47 4c 4f  er rejection GLO
6a00: 42 20 70 61 74 74 65 72 6e 73 20 2a 2f 0a 20 20  B patterns */.  
6a10: 63 68 61 72 20 2a 2a 61 7a 46 69 6c 74 65 72 3b  char **azFilter;
6a20: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61           /* Arra
6a30: 79 20 6f 66 20 78 46 69 6c 74 65 72 20 72 65 6a  y of xFilter rej
6a40: 65 63 74 69 6f 6e 20 47 4c 4f 42 20 70 61 74 74  ection GLOB patt
6a50: 65 72 6e 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65  erns */.  sqlite
6a60: 33 5f 73 65 73 73 69 6f 6e 20 2a 70 3b 20 20 20  3_session *p;   
6a70: 20 20 20 2f 2a 20 54 68 65 20 6f 70 65 6e 20 73     /* The open s
6a80: 65 73 73 69 6f 6e 20 2a 2f 0a 7d 3b 0a 23 65 6e  ession */.};.#en
6a90: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 53 68 65 6c 6c  dif../*.** Shell
6aa0: 20 6f 75 74 70 75 74 20 6d 6f 64 65 20 69 6e 66   output mode inf
6ab0: 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 62 65  ormation from be
6ac0: 66 6f 72 65 20 22 2e 65 78 70 6c 61 69 6e 20 6f  fore ".explain o
6ad0: 6e 22 2c 0a 2a 2a 20 73 61 76 65 64 20 73 6f 20  n",.** saved so 
6ae0: 74 68 61 74 20 69 74 20 63 61 6e 20 62 65 20 72  that it can be r
6af0: 65 73 74 6f 72 65 64 20 62 79 20 22 2e 65 78 70  estored by ".exp
6b00: 6c 61 69 6e 20 6f 66 66 22 0a 2a 2f 0a 74 79 70  lain off".*/.typ
6b10: 65 64 65 66 20 73 74 72 75 63 74 20 53 61 76 65  edef struct Save
6b20: 64 4d 6f 64 65 49 6e 66 6f 20 53 61 76 65 64 4d  dModeInfo SavedM
6b30: 6f 64 65 49 6e 66 6f 3b 0a 73 74 72 75 63 74 20  odeInfo;.struct 
6b40: 53 61 76 65 64 4d 6f 64 65 49 6e 66 6f 20 7b 0a  SavedModeInfo {.
6b50: 20 20 69 6e 74 20 76 61 6c 69 64 3b 20 20 20 20    int valid;    
6b60: 20 20 20 20 20 20 2f 2a 20 49 73 20 74 68 65 72        /* Is ther
6b70: 65 20 6c 65 67 69 74 20 64 61 74 61 20 69 6e 20  e legit data in 
6b80: 68 65 72 65 3f 20 2a 2f 0a 20 20 69 6e 74 20 6d  here? */.  int m
6b90: 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f  ode;           /
6ba0: 2a 20 4d 6f 64 65 20 70 72 69 6f 72 20 74 6f 20  * Mode prior to 
6bb0: 22 2e 65 78 70 6c 61 69 6e 20 6f 6e 22 20 2a 2f  ".explain on" */
6bc0: 0a 20 20 69 6e 74 20 73 68 6f 77 48 65 61 64 65  .  int showHeade
6bd0: 72 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 22 2e  r;     /* The ".
6be0: 68 65 61 64 65 72 22 20 73 65 74 74 69 6e 67 20  header" setting 
6bf0: 70 72 69 6f 72 20 74 6f 20 22 2e 65 78 70 6c 61  prior to ".expla
6c00: 69 6e 20 6f 6e 22 20 2a 2f 0a 20 20 69 6e 74 20  in on" */.  int 
6c10: 63 6f 6c 57 69 64 74 68 5b 31 30 30 5d 3b 20 20  colWidth[100];  
6c20: 2f 2a 20 43 6f 6c 75 6d 6e 20 77 69 64 74 68 73  /* Column widths
6c30: 20 70 72 69 6f 72 20 74 6f 20 22 2e 65 78 70 6c   prior to ".expl
6c40: 61 69 6e 20 6f 6e 22 20 2a 2f 0a 7d 3b 0a 0a 74  ain on" */.};..t
6c50: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 45 78  ypedef struct Ex
6c60: 70 65 72 74 49 6e 66 6f 20 45 78 70 65 72 74 49  pertInfo ExpertI
6c70: 6e 66 6f 3b 0a 73 74 72 75 63 74 20 45 78 70 65  nfo;.struct Expe
6c80: 72 74 49 6e 66 6f 20 7b 0a 20 20 73 71 6c 69 74  rtInfo {.  sqlit
6c90: 65 33 65 78 70 65 72 74 20 2a 70 45 78 70 65 72  e3expert *pExper
6ca0: 74 3b 0a 20 20 69 6e 74 20 62 56 65 72 62 6f 73  t;.  int bVerbos
6cb0: 65 3b 0a 7d 3b 0a 0a 2f 2a 20 41 20 73 69 6e 67  e;.};../* A sing
6cc0: 6c 65 20 6c 69 6e 65 20 69 6e 20 74 68 65 20 45  le line in the E
6cd0: 51 50 20 6f 75 74 70 75 74 20 2a 2f 0a 74 79 70  QP output */.typ
6ce0: 65 64 65 66 20 73 74 72 75 63 74 20 45 51 50 47  edef struct EQPG
6cf0: 72 61 70 68 52 6f 77 20 45 51 50 47 72 61 70 68  raphRow EQPGraph
6d00: 52 6f 77 3b 0a 73 74 72 75 63 74 20 45 51 50 47  Row;.struct EQPG
6d10: 72 61 70 68 52 6f 77 20 7b 0a 20 20 69 6e 74 20  raphRow {.  int 
6d20: 69 53 65 6c 65 63 74 49 64 3b 20 20 20 20 20 20  iSelectId;      
6d30: 20 20 2f 2a 20 54 68 65 20 53 65 6c 65 63 74 49    /* The SelectI
6d40: 44 20 66 6f 72 20 74 68 69 73 20 72 6f 77 20 2a  D for this row *
6d50: 2f 0a 20 20 45 51 50 47 72 61 70 68 52 6f 77 20  /.  EQPGraphRow 
6d60: 2a 70 4e 65 78 74 3b 20 20 20 2f 2a 20 4e 65 78  *pNext;   /* Nex
6d70: 74 20 72 6f 77 20 69 6e 20 73 65 71 75 65 6e 63  t row in sequenc
6d80: 65 20 2a 2f 0a 20 20 63 68 61 72 20 7a 54 65 78  e */.  char zTex
6d90: 74 5b 31 5d 3b 20 20 20 20 20 20 20 20 2f 2a 20  t[1];        /* 
6da0: 54 65 78 74 20 74 6f 20 64 69 73 70 6c 61 79 20  Text to display 
6db0: 66 6f 72 20 74 68 69 73 20 72 6f 77 20 2a 2f 0a  for this row */.
6dc0: 7d 3b 0a 0a 2f 2a 20 41 6c 6c 20 45 51 50 20 6f  };../* All EQP o
6dd0: 75 74 70 75 74 20 69 73 20 63 6f 6c 6c 65 63 74  utput is collect
6de0: 65 64 20 69 6e 74 6f 20 61 6e 20 69 6e 73 74 61  ed into an insta
6df0: 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  nce of the follo
6e00: 77 69 6e 67 20 2a 2f 0a 74 79 70 65 64 65 66 20  wing */.typedef 
6e10: 73 74 72 75 63 74 20 45 51 50 47 72 61 70 68 20  struct EQPGraph 
6e20: 45 51 50 47 72 61 70 68 3b 0a 73 74 72 75 63 74  EQPGraph;.struct
6e30: 20 45 51 50 47 72 61 70 68 20 7b 0a 20 20 45 51   EQPGraph {.  EQ
6e40: 50 47 72 61 70 68 52 6f 77 20 2a 70 52 6f 77 3b  PGraphRow *pRow;
6e50: 20 20 20 20 2f 2a 20 4c 69 6e 6b 65 64 20 6c 69      /* Linked li
6e60: 73 74 20 6f 66 20 61 6c 6c 20 72 6f 77 73 20 6f  st of all rows o
6e70: 66 20 74 68 65 20 45 51 50 20 6f 75 74 70 75 74  f the EQP output
6e80: 20 2a 2f 0a 20 20 45 51 50 47 72 61 70 68 52 6f   */.  EQPGraphRo
6e90: 77 20 2a 70 4c 61 73 74 3b 20 20 20 2f 2a 20 4c  w *pLast;   /* L
6ea0: 61 73 74 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74  ast element of t
6eb0: 68 65 20 70 52 6f 77 20 6c 69 73 74 20 2a 2f 0a  he pRow list */.
6ec0: 20 20 63 68 61 72 20 7a 50 72 65 66 69 78 5b 31    char zPrefix[1
6ed0: 30 30 5d 3b 20 20 20 20 2f 2a 20 47 72 61 70 68  00];    /* Graph
6ee0: 20 70 72 65 66 69 78 20 2a 2f 0a 7d 3b 0a 0a 2f   prefix */.};../
6ef0: 2a 0a 2a 2a 20 53 74 61 74 65 20 69 6e 66 6f 72  *.** State infor
6f00: 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65  mation about the
6f10: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
6f20: 74 69 6f 6e 20 69 73 20 63 6f 6e 74 61 69 6e 65  tion is containe
6f30: 64 20 69 6e 20 61 6e 0a 2a 2a 20 69 6e 73 74 61  d in an.** insta
6f40: 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  nce of the follo
6f50: 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 2e 0a  wing structure..
6f60: 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  */.typedef struc
6f70: 74 20 53 68 65 6c 6c 53 74 61 74 65 20 53 68 65  t ShellState She
6f80: 6c 6c 53 74 61 74 65 3b 0a 73 74 72 75 63 74 20  llState;.struct 
6f90: 53 68 65 6c 6c 53 74 61 74 65 20 7b 0a 20 20 73  ShellState {.  s
6fa0: 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20  qlite3 *db;     
6fb0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74        /* The dat
6fc0: 61 62 61 73 65 20 2a 2f 0a 20 20 75 38 20 61 75  abase */.  u8 au
6fd0: 74 6f 45 78 70 6c 61 69 6e 3b 20 20 20 20 20 20  toExplain;      
6fe0: 20 20 2f 2a 20 41 75 74 6f 6d 61 74 69 63 61 6c    /* Automatical
6ff0: 6c 79 20 74 75 72 6e 20 6f 6e 20 2e 65 78 70 6c  ly turn on .expl
7000: 61 69 6e 20 6d 6f 64 65 20 2a 2f 0a 20 20 75 38  ain mode */.  u8
7010: 20 61 75 74 6f 45 51 50 3b 20 20 20 20 20 20 20   autoEQP;       
7020: 20 20 20 20 20 2f 2a 20 52 75 6e 20 45 58 50 4c       /* Run EXPL
7030: 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 20 70  AIN QUERY PLAN p
7040: 72 69 6f 72 20 74 6f 20 73 65 61 63 68 20 53 51  rior to seach SQ
7050: 4c 20 73 74 6d 74 20 2a 2f 0a 20 20 75 38 20 73  L stmt */.  u8 s
7060: 74 61 74 73 4f 6e 3b 20 20 20 20 20 20 20 20 20  tatsOn;         
7070: 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 64 69     /* True to di
7080: 73 70 6c 61 79 20 6d 65 6d 6f 72 79 20 73 74 61  splay memory sta
7090: 74 73 20 62 65 66 6f 72 65 20 65 61 63 68 20 66  ts before each f
70a0: 69 6e 61 6c 69 7a 65 20 2a 2f 0a 20 20 75 38 20  inalize */.  u8 
70b0: 73 63 61 6e 73 74 61 74 73 4f 6e 3b 20 20 20 20  scanstatsOn;    
70c0: 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 64      /* True to d
70d0: 69 73 70 6c 61 79 20 73 63 61 6e 20 73 74 61 74  isplay scan stat
70e0: 73 20 62 65 66 6f 72 65 20 65 61 63 68 20 66 69  s before each fi
70f0: 6e 61 6c 69 7a 65 20 2a 2f 0a 20 20 75 38 20 6f  nalize */.  u8 o
7100: 70 65 6e 4d 6f 64 65 3b 20 20 20 20 20 20 20 20  penMode;        
7110: 20 20 20 2f 2a 20 53 48 45 4c 4c 5f 4f 50 45 4e     /* SHELL_OPEN
7120: 5f 4e 4f 52 4d 41 4c 2c 20 5f 41 50 50 45 4e 44  _NORMAL, _APPEND
7130: 56 46 53 2c 20 6f 72 20 5f 5a 49 50 46 49 4c 45  VFS, or _ZIPFILE
7140: 20 2a 2f 0a 20 20 75 38 20 64 6f 58 64 67 4f 70   */.  u8 doXdgOp
7150: 65 6e 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  en;          /* 
7160: 49 6e 76 6f 6b 65 20 73 74 61 72 74 2f 6f 70 65  Invoke start/ope
7170: 6e 2f 78 64 67 2d 6f 70 65 6e 20 69 6e 20 6f 75  n/xdg-open in ou
7180: 74 70 75 74 5f 72 65 73 65 74 28 29 20 2a 2f 0a  tput_reset() */.
7190: 20 20 75 38 20 6e 45 71 70 4c 65 76 65 6c 3b 20    u8 nEqpLevel; 
71a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 70 74           /* Dept
71b0: 68 20 6f 66 20 74 68 65 20 45 51 50 20 6f 75 74  h of the EQP out
71c0: 70 75 74 20 67 72 61 70 68 20 2a 2f 0a 20 20 75  put graph */.  u
71d0: 6e 73 69 67 6e 65 64 20 6d 45 71 70 4c 69 6e 65  nsigned mEqpLine
71e0: 73 3b 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66  s;    /* Mask of
71f0: 20 76 65 72 69 74 69 63 61 6c 20 6c 69 6e 65 73   veritical lines
7200: 20 69 6e 20 74 68 65 20 45 51 50 20 6f 75 74 70   in the EQP outp
7210: 75 74 20 67 72 61 70 68 20 2a 2f 0a 20 20 69 6e  ut graph */.  in
7220: 74 20 6f 75 74 43 6f 75 6e 74 3b 20 20 20 20 20  t outCount;     
7230: 20 20 20 20 20 2f 2a 20 52 65 76 65 72 74 20 74       /* Revert t
7240: 6f 20 73 74 64 6f 75 74 20 77 68 65 6e 20 72 65  o stdout when re
7250: 61 63 68 69 6e 67 20 7a 65 72 6f 20 2a 2f 0a 20  aching zero */. 
7260: 20 69 6e 74 20 63 6e 74 3b 20 20 20 20 20 20 20   int cnt;       
7270: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
7280: 72 20 6f 66 20 72 65 63 6f 72 64 73 20 64 69 73  r of records dis
7290: 70 6c 61 79 65 64 20 73 6f 20 66 61 72 20 2a 2f  played so far */
72a0: 0a 20 20 46 49 4c 45 20 2a 6f 75 74 3b 20 20 20  .  FILE *out;   
72b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
72c0: 74 65 20 72 65 73 75 6c 74 73 20 68 65 72 65 20  te results here 
72d0: 2a 2f 0a 20 20 46 49 4c 45 20 2a 74 72 61 63 65  */.  FILE *trace
72e0: 4f 75 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 4f  Out;        /* O
72f0: 75 74 70 75 74 20 66 6f 72 20 73 71 6c 69 74 65  utput for sqlite
7300: 33 5f 74 72 61 63 65 28 29 20 2a 2f 0a 20 20 69  3_trace() */.  i
7310: 6e 74 20 6e 45 72 72 3b 20 20 20 20 20 20 20 20  nt nErr;        
7320: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
7330: 6f 66 20 65 72 72 6f 72 73 20 73 65 65 6e 20 2a  of errors seen *
7340: 2f 0a 20 20 69 6e 74 20 6d 6f 64 65 3b 20 20 20  /.  int mode;   
7350: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e             /* An
7360: 20 6f 75 74 70 75 74 20 6d 6f 64 65 20 73 65 74   output mode set
7370: 74 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 6d 6f  ting */.  int mo
7380: 64 65 50 72 69 6f 72 3b 20 20 20 20 20 20 20 20  dePrior;        
7390: 20 2f 2a 20 53 61 76 65 64 20 6d 6f 64 65 20 2a   /* Saved mode *
73a0: 2f 0a 20 20 69 6e 74 20 63 4d 6f 64 65 3b 20 20  /.  int cMode;  
73b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 74 65             /* te
73c0: 6d 70 6f 72 61 72 79 20 6f 75 74 70 75 74 20 6d  mporary output m
73d0: 6f 64 65 20 66 6f 72 20 74 68 65 20 63 75 72 72  ode for the curr
73e0: 65 6e 74 20 71 75 65 72 79 20 2a 2f 0a 20 20 69  ent query */.  i
73f0: 6e 74 20 6e 6f 72 6d 61 6c 4d 6f 64 65 3b 20 20  nt normalMode;  
7400: 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20        /* Output 
7410: 6d 6f 64 65 20 62 65 66 6f 72 65 20 22 2e 65 78  mode before ".ex
7420: 70 6c 61 69 6e 20 6f 6e 22 20 2a 2f 0a 20 20 69  plain on" */.  i
7430: 6e 74 20 77 72 69 74 61 62 6c 65 53 63 68 65 6d  nt writableSchem
7440: 61 3b 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66  a;    /* True if
7450: 20 50 52 41 47 4d 41 20 77 72 69 74 61 62 6c 65   PRAGMA writable
7460: 5f 73 63 68 65 6d 61 3d 4f 4e 20 2a 2f 0a 20 20  _schema=ON */.  
7470: 69 6e 74 20 73 68 6f 77 48 65 61 64 65 72 3b 20  int showHeader; 
7480: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74         /* True t
7490: 6f 20 73 68 6f 77 20 63 6f 6c 75 6d 6e 20 6e 61  o show column na
74a0: 6d 65 73 20 69 6e 20 4c 69 73 74 20 6f 72 20 43  mes in List or C
74b0: 6f 6c 75 6d 6e 20 6d 6f 64 65 20 2a 2f 0a 20 20  olumn mode */.  
74c0: 69 6e 74 20 6e 43 68 65 63 6b 3b 20 20 20 20 20  int nCheck;     
74d0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
74e0: 20 6f 66 20 22 2e 63 68 65 63 6b 22 20 63 6f 6d   of ".check" com
74f0: 6d 61 6e 64 73 20 72 75 6e 20 2a 2f 0a 20 20 75  mands run */.  u
7500: 6e 73 69 67 6e 65 64 20 73 68 65 6c 6c 46 6c 67  nsigned shellFlg
7510: 73 3b 20 20 20 20 2f 2a 20 56 61 72 69 6f 75 73  s;    /* Various
7520: 20 66 6c 61 67 73 20 2a 2f 0a 20 20 63 68 61 72   flags */.  char
7530: 20 2a 7a 44 65 73 74 54 61 62 6c 65 3b 20 20 20   *zDestTable;   
7540: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 64 65     /* Name of de
7550: 73 74 69 6e 61 74 69 6f 6e 20 74 61 62 6c 65 20  stination table 
7560: 77 68 65 6e 20 4d 4f 44 45 5f 49 6e 73 65 72 74  when MODE_Insert
7570: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 54 65 6d   */.  char *zTem
7580: 70 46 69 6c 65 3b 20 20 20 20 20 20 20 2f 2a 20  pFile;       /* 
7590: 54 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 74  Temporary file t
75a0: 68 61 74 20 6d 69 67 68 74 20 6e 65 65 64 20 64  hat might need d
75b0: 65 6c 65 74 69 6e 67 20 2a 2f 0a 20 20 63 68 61  eleting */.  cha
75c0: 72 20 7a 54 65 73 74 63 61 73 65 5b 33 30 5d 3b  r zTestcase[30];
75d0: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 63      /* Name of c
75e0: 75 72 72 65 6e 74 20 74 65 73 74 20 63 61 73 65  urrent test case
75f0: 20 2a 2f 0a 20 20 63 68 61 72 20 63 6f 6c 53 65   */.  char colSe
7600: 70 61 72 61 74 6f 72 5b 32 30 5d 3b 20 2f 2a 20  parator[20]; /* 
7610: 43 6f 6c 75 6d 6e 20 73 65 70 61 72 61 74 6f 72  Column separator
7620: 20 63 68 61 72 61 63 74 65 72 20 66 6f 72 20 73   character for s
7630: 65 76 65 72 61 6c 20 6d 6f 64 65 73 20 2a 2f 0a  everal modes */.
7640: 20 20 63 68 61 72 20 72 6f 77 53 65 70 61 72 61    char rowSepara
7650: 74 6f 72 5b 32 30 5d 3b 20 2f 2a 20 52 6f 77 20  tor[20]; /* Row 
7660: 73 65 70 61 72 61 74 6f 72 20 63 68 61 72 61 63  separator charac
7670: 74 65 72 20 66 6f 72 20 4d 4f 44 45 5f 41 73 63  ter for MODE_Asc
7680: 69 69 20 2a 2f 0a 20 20 63 68 61 72 20 63 6f 6c  ii */.  char col
7690: 53 65 70 50 72 69 6f 72 5b 32 30 5d 3b 20 20 2f  SepPrior[20];  /
76a0: 2a 20 53 61 76 65 64 20 63 6f 6c 75 6d 6e 20 73  * Saved column s
76b0: 65 70 61 72 61 74 6f 72 20 2a 2f 0a 20 20 63 68  eparator */.  ch
76c0: 61 72 20 72 6f 77 53 65 70 50 72 69 6f 72 5b 32  ar rowSepPrior[2
76d0: 30 5d 3b 20 20 2f 2a 20 53 61 76 65 64 20 72 6f  0];  /* Saved ro
76e0: 77 20 73 65 70 61 72 61 74 6f 72 20 2a 2f 0a 20  w separator */. 
76f0: 20 69 6e 74 20 63 6f 6c 57 69 64 74 68 5b 31 30   int colWidth[10
7700: 30 5d 3b 20 20 20 20 20 2f 2a 20 52 65 71 75 65  0];     /* Reque
7710: 73 74 65 64 20 77 69 64 74 68 20 6f 66 20 65 61  sted width of ea
7720: 63 68 20 63 6f 6c 75 6d 6e 20 77 68 65 6e 20 69  ch column when i
7730: 6e 20 63 6f 6c 75 6d 6e 20 6d 6f 64 65 2a 2f 0a  n column mode*/.
7740: 20 20 69 6e 74 20 61 63 74 75 61 6c 57 69 64 74    int actualWidt
7750: 68 5b 31 30 30 5d 3b 20 20 2f 2a 20 41 63 74 75  h[100];  /* Actu
7760: 61 6c 20 77 69 64 74 68 20 6f 66 20 65 61 63 68  al width of each
7770: 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 63 68 61   column */.  cha
7780: 72 20 6e 75 6c 6c 56 61 6c 75 65 5b 32 30 5d 3b  r nullValue[20];
7790: 20 20 20 20 2f 2a 20 54 68 65 20 74 65 78 74 20      /* The text 
77a0: 74 6f 20 70 72 69 6e 74 20 77 68 65 6e 20 61 20  to print when a 
77b0: 4e 55 4c 4c 20 63 6f 6d 65 73 20 62 61 63 6b 20  NULL comes back 
77c0: 66 72 6f 6d 0a 20 20 20 20 20 20 20 20 20 20 20  from.           
77d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
77e0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f   the database */
77f0: 0a 20 20 63 68 61 72 20 6f 75 74 66 69 6c 65 5b  .  char outfile[
7800: 46 49 4c 45 4e 41 4d 45 5f 4d 41 58 5d 3b 20 2f  FILENAME_MAX]; /
7810: 2a 20 46 69 6c 65 6e 61 6d 65 20 66 6f 72 20 2a  * Filename for *
7820: 6f 75 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  out */.  const c
7830: 68 61 72 20 2a 7a 44 62 46 69 6c 65 6e 61 6d 65  har *zDbFilename
7840: 3b 20 20 20 20 2f 2a 20 6e 61 6d 65 20 6f 66 20  ;    /* name of 
7850: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
7860: 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 46 72  e */.  char *zFr
7870: 65 65 4f 6e 43 6c 6f 73 65 3b 20 20 20 20 20 20  eeOnClose;      
7880: 20 20 20 2f 2a 20 46 69 6c 65 6e 61 6d 65 20 74     /* Filename t
7890: 6f 20 66 72 65 65 20 77 68 65 6e 20 63 6c 6f 73  o free when clos
78a0: 69 6e 67 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ing */.  const c
78b0: 68 61 72 20 2a 7a 56 66 73 3b 20 20 20 20 20 20  har *zVfs;      
78c0: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
78d0: 56 46 53 20 74 6f 20 75 73 65 20 2a 2f 0a 20 20  VFS to use */.  
78e0: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
78f0: 74 6d 74 3b 20 20 20 2f 2a 20 43 75 72 72 65 6e  tmt;   /* Curren
7900: 74 20 73 74 61 74 65 6d 65 6e 74 20 69 66 20 61  t statement if a
7910: 6e 79 2e 20 2a 2f 0a 20 20 46 49 4c 45 20 2a 70  ny. */.  FILE *p
7920: 4c 6f 67 3b 20 20 20 20 20 20 20 20 20 20 20 20  Log;            
7930: 2f 2a 20 57 72 69 74 65 20 6c 6f 67 20 6f 75 74  /* Write log out
7940: 70 75 74 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e  put here */.  in
7950: 74 20 2a 61 69 49 6e 64 65 6e 74 3b 20 20 20 20  t *aiIndent;    
7960: 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66       /* Array of
7970: 20 69 6e 64 65 6e 74 73 20 75 73 65 64 20 69 6e   indents used in
7980: 20 4d 4f 44 45 5f 45 78 70 6c 61 69 6e 20 2a 2f   MODE_Explain */
7990: 0a 20 20 69 6e 74 20 6e 49 6e 64 65 6e 74 3b 20  .  int nIndent; 
79a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
79b0: 65 20 6f 66 20 61 72 72 61 79 20 61 69 49 6e 64  e of array aiInd
79c0: 65 6e 74 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 69  ent[] */.  int i
79d0: 49 6e 64 65 6e 74 3b 20 20 20 20 20 20 20 20 20  Indent;         
79e0: 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 75    /* Index of cu
79f0: 72 72 65 6e 74 20 6f 70 20 69 6e 20 61 69 49 6e  rrent op in aiIn
7a00: 64 65 6e 74 5b 5d 20 2a 2f 0a 20 20 45 51 50 47  dent[] */.  EQPG
7a10: 72 61 70 68 20 73 47 72 61 70 68 3b 20 20 20 20  raph sGraph;    
7a20: 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f     /* Informatio
7a30: 6e 20 66 6f 72 20 74 68 65 20 67 72 61 70 68 69  n for the graphi
7a40: 63 61 6c 20 45 58 50 4c 41 49 4e 20 51 55 45 52  cal EXPLAIN QUER
7a50: 59 20 50 4c 41 4e 20 2a 2f 0a 23 69 66 20 64 65  Y PLAN */.#if de
7a60: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
7a70: 42 4c 45 5f 53 45 53 53 49 4f 4e 29 0a 20 20 69  BLE_SESSION).  i
7a80: 6e 74 20 6e 53 65 73 73 69 6f 6e 3b 20 20 20 20  nt nSession;    
7a90: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
7aa0: 65 72 20 6f 66 20 61 63 74 69 76 65 20 73 65 73  er of active ses
7ab0: 73 69 6f 6e 73 20 2a 2f 0a 20 20 4f 70 65 6e 53  sions */.  OpenS
7ac0: 65 73 73 69 6f 6e 20 61 53 65 73 73 69 6f 6e 5b  ession aSession[
7ad0: 34 5d 3b 20 20 2f 2a 20 41 72 72 61 79 20 6f 66  4];  /* Array of
7ae0: 20 73 65 73 73 69 6f 6e 73 2e 20 20 5b 30 5d 20   sessions.  [0] 
7af0: 69 73 20 69 6e 20 66 6f 63 75 73 2e 20 2a 2f 0a  is in focus. */.
7b00: 23 65 6e 64 69 66 0a 20 20 45 78 70 65 72 74 49  #endif.  ExpertI
7b10: 6e 66 6f 20 65 78 70 65 72 74 3b 20 20 20 20 20  nfo expert;     
7b20: 20 20 20 2f 2a 20 56 61 6c 69 64 20 69 66 20 70     /* Valid if p
7b30: 72 65 76 69 6f 75 73 20 63 6f 6d 6d 61 6e 64 20  revious command 
7b40: 77 61 73 20 22 2e 65 78 70 65 72 74 20 4f 50 54  was ".expert OPT
7b50: 2e 2e 2e 22 20 2a 2f 0a 7d 3b 0a 0a 0a 2f 2a 20  ..." */.};.../* 
7b60: 41 6c 6c 6f 77 65 64 20 76 61 6c 75 65 73 20 66  Allowed values f
7b70: 6f 72 20 53 68 65 6c 6c 53 74 61 74 65 2e 61 75  or ShellState.au
7b80: 74 6f 45 51 50 0a 2a 2f 0a 23 64 65 66 69 6e 65  toEQP.*/.#define
7b90: 20 41 55 54 4f 45 51 50 5f 6f 66 66 20 20 20 20   AUTOEQP_off    
7ba0: 20 20 30 0a 23 64 65 66 69 6e 65 20 41 55 54 4f    0.#define AUTO
7bb0: 45 51 50 5f 6f 6e 20 20 20 20 20 20 20 31 0a 23  EQP_on       1.#
7bc0: 64 65 66 69 6e 65 20 41 55 54 4f 45 51 50 5f 74  define AUTOEQP_t
7bd0: 72 69 67 67 65 72 20 20 32 0a 23 64 65 66 69 6e  rigger  2.#defin
7be0: 65 20 41 55 54 4f 45 51 50 5f 66 75 6c 6c 20 20  e AUTOEQP_full  
7bf0: 20 20 20 33 0a 0a 2f 2a 20 41 6c 6c 6f 77 65 64     3../* Allowed
7c00: 20 76 61 6c 75 65 73 20 66 6f 72 20 53 68 65 6c   values for Shel
7c10: 6c 53 74 61 74 65 2e 6f 70 65 6e 4d 6f 64 65 0a  lState.openMode.
7c20: 2a 2f 0a 23 64 65 66 69 6e 65 20 53 48 45 4c 4c  */.#define SHELL
7c30: 5f 4f 50 45 4e 5f 55 4e 53 50 45 43 20 20 20 20  _OPEN_UNSPEC    
7c40: 20 30 20 20 20 20 20 20 2f 2a 20 4e 6f 20 6f 70   0      /* No op
7c50: 65 6e 2d 6d 6f 64 65 20 73 70 65 63 69 66 69 65  en-mode specifie
7c60: 64 20 2a 2f 0a 23 64 65 66 69 6e 65 20 53 48 45  d */.#define SHE
7c70: 4c 4c 5f 4f 50 45 4e 5f 4e 4f 52 4d 41 4c 20 20  LL_OPEN_NORMAL  
7c80: 20 20 20 31 20 20 20 20 20 20 2f 2a 20 4e 6f 72     1      /* Nor
7c90: 6d 61 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c  mal database fil
7ca0: 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 53 48 45  e */.#define SHE
7cb0: 4c 4c 5f 4f 50 45 4e 5f 41 50 50 45 4e 44 56 46  LL_OPEN_APPENDVF
7cc0: 53 20 20 32 20 20 20 20 20 20 2f 2a 20 55 73 65  S  2      /* Use
7cd0: 20 61 70 70 65 6e 64 76 66 73 20 2a 2f 0a 23 64   appendvfs */.#d
7ce0: 65 66 69 6e 65 20 53 48 45 4c 4c 5f 4f 50 45 4e  efine SHELL_OPEN
7cf0: 5f 5a 49 50 46 49 4c 45 20 20 20 20 33 20 20 20  _ZIPFILE    3   
7d00: 20 20 20 2f 2a 20 55 73 65 20 74 68 65 20 7a 69     /* Use the zi
7d10: 70 66 69 6c 65 20 76 69 72 74 75 61 6c 20 74 61  pfile virtual ta
7d20: 62 6c 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 53  ble */.#define S
7d30: 48 45 4c 4c 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e  HELL_OPEN_READON
7d40: 4c 59 20 20 20 34 20 20 20 20 20 20 2f 2a 20 4f  LY   4      /* O
7d50: 70 65 6e 20 61 20 6e 6f 72 6d 61 6c 20 64 61 74  pen a normal dat
7d60: 61 62 61 73 65 20 72 65 61 64 2d 6f 6e 6c 79 20  abase read-only 
7d70: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 73 65 20  */../*.** These 
7d80: 61 72 65 20 74 68 65 20 61 6c 6c 6f 77 65 64 20  are the allowed 
7d90: 73 68 65 6c 6c 46 6c 67 73 20 76 61 6c 75 65 73  shellFlgs values
7da0: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 53 48 46 4c  .*/.#define SHFL
7db0: 47 5f 50 61 67 65 63 61 63 68 65 20 20 20 20 20  G_Pagecache     
7dc0: 20 30 78 30 30 30 30 30 30 30 31 20 2f 2a 20 54   0x00000001 /* T
7dd0: 68 65 20 2d 2d 70 61 67 65 63 61 63 68 65 20 6f  he --pagecache o
7de0: 70 74 69 6f 6e 20 69 73 20 75 73 65 64 20 2a 2f  ption is used */
7df0: 0a 23 64 65 66 69 6e 65 20 53 48 46 4c 47 5f 4c  .#define SHFLG_L
7e00: 6f 6f 6b 61 73 69 64 65 20 20 20 20 20 20 30 78  ookaside      0x
7e10: 30 30 30 30 30 30 30 32 20 2f 2a 20 4c 6f 6f 6b  00000002 /* Look
7e20: 61 73 69 64 65 20 6d 65 6d 6f 72 79 20 69 73 20  aside memory is 
7e30: 75 73 65 64 20 2a 2f 0a 23 64 65 66 69 6e 65 20  used */.#define 
7e40: 53 48 46 4c 47 5f 42 61 63 6b 73 6c 61 73 68 20  SHFLG_Backslash 
7e50: 20 20 20 20 20 30 78 30 30 30 30 30 30 30 34 20       0x00000004 
7e60: 2f 2a 20 54 68 65 20 2d 2d 62 61 63 6b 73 6c 61  /* The --backsla
7e70: 73 68 20 6f 70 74 69 6f 6e 20 69 73 20 75 73 65  sh option is use
7e80: 64 20 2a 2f 0a 23 64 65 66 69 6e 65 20 53 48 46  d */.#define SHF
7e90: 4c 47 5f 50 72 65 73 65 72 76 65 52 6f 77 69 64  LG_PreserveRowid
7ea0: 20 20 30 78 30 30 30 30 30 30 30 38 20 2f 2a 20    0x00000008 /* 
7eb0: 2e 64 75 6d 70 20 70 72 65 73 65 72 76 65 73 20  .dump preserves 
7ec0: 72 6f 77 69 64 20 76 61 6c 75 65 73 20 2a 2f 0a  rowid values */.
7ed0: 23 64 65 66 69 6e 65 20 53 48 46 4c 47 5f 4e 65  #define SHFLG_Ne
7ee0: 77 6c 69 6e 65 73 20 20 20 20 20 20 20 30 78 30  wlines       0x0
7ef0: 30 30 30 30 30 31 30 20 2f 2a 20 2e 64 75 6d 70  0000010 /* .dump
7f00: 20 2d 2d 6e 65 77 6c 69 6e 65 20 66 6c 61 67 20   --newline flag 
7f10: 2a 2f 0a 23 64 65 66 69 6e 65 20 53 48 46 4c 47  */.#define SHFLG
7f20: 5f 43 6f 75 6e 74 43 68 61 6e 67 65 73 20 20 20  _CountChanges   
7f30: 30 78 30 30 30 30 30 30 32 30 20 2f 2a 20 2e 63  0x00000020 /* .c
7f40: 68 61 6e 67 65 73 20 73 65 74 74 69 6e 67 20 2a  hanges setting *
7f50: 2f 0a 23 64 65 66 69 6e 65 20 53 48 46 4c 47 5f  /.#define SHFLG_
7f60: 45 63 68 6f 20 20 20 20 20 20 20 20 20 20 20 30  Echo           0
7f70: 78 30 30 30 30 30 30 34 30 20 2f 2a 20 2e 65 63  x00000040 /* .ec
7f80: 68 6f 20 6f 72 20 2d 2d 65 63 68 6f 20 73 65 74  ho or --echo set
7f90: 74 69 6e 67 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 4d  ting */../*.** M
7fa0: 61 63 72 6f 73 20 66 6f 72 20 74 65 73 74 69 6e  acros for testin
7fb0: 67 20 61 6e 64 20 73 65 74 74 69 6e 67 20 73 68  g and setting sh
7fc0: 65 6c 6c 46 6c 67 73 0a 2a 2f 0a 23 64 65 66 69  ellFlgs.*/.#defi
7fd0: 6e 65 20 53 68 65 6c 6c 48 61 73 46 6c 61 67 28  ne ShellHasFlag(
7fe0: 50 2c 58 29 20 20 20 20 28 28 28 50 29 2d 3e 73  P,X)    (((P)->s
7ff0: 68 65 6c 6c 46 6c 67 73 20 26 20 28 58 29 29 21  hellFlgs & (X))!
8000: 3d 30 29 0a 23 64 65 66 69 6e 65 20 53 68 65 6c  =0).#define Shel
8010: 6c 53 65 74 46 6c 61 67 28 50 2c 58 29 20 20 20  lSetFlag(P,X)   
8020: 20 28 28 50 29 2d 3e 73 68 65 6c 6c 46 6c 67 73   ((P)->shellFlgs
8030: 7c 3d 28 58 29 29 0a 23 64 65 66 69 6e 65 20 53  |=(X)).#define S
8040: 68 65 6c 6c 43 6c 65 61 72 46 6c 61 67 28 50 2c  hellClearFlag(P,
8050: 58 29 20 20 28 28 50 29 2d 3e 73 68 65 6c 6c 46  X)  ((P)->shellF
8060: 6c 67 73 26 3d 28 7e 28 58 29 29 29 0a 0a 2f 2a  lgs&=(~(X)))../*
8070: 0a 2a 2a 20 54 68 65 73 65 20 61 72 65 20 74 68  .** These are th
8080: 65 20 61 6c 6c 6f 77 65 64 20 6d 6f 64 65 73 2e  e allowed modes.
8090: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 4f 44 45  .*/.#define MODE
80a0: 5f 4c 69 6e 65 20 20 20 20 20 30 20 20 2f 2a 20  _Line     0  /* 
80b0: 4f 6e 65 20 63 6f 6c 75 6d 6e 20 70 65 72 20 6c  One column per l
80c0: 69 6e 65 2e 20 20 42 6c 61 6e 6b 20 6c 69 6e 65  ine.  Blank line
80d0: 20 62 65 74 77 65 65 6e 20 72 65 63 6f 72 64 73   between records
80e0: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 4f 44 45   */.#define MODE
80f0: 5f 43 6f 6c 75 6d 6e 20 20 20 31 20 20 2f 2a 20  _Column   1  /* 
8100: 4f 6e 65 20 72 65 63 6f 72 64 20 70 65 72 20 6c  One record per l
8110: 69 6e 65 20 69 6e 20 6e 65 61 74 20 63 6f 6c 75  ine in neat colu
8120: 6d 6e 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4d  mns */.#define M
8130: 4f 44 45 5f 4c 69 73 74 20 20 20 20 20 32 20 20  ODE_List     2  
8140: 2f 2a 20 4f 6e 65 20 72 65 63 6f 72 64 20 70 65  /* One record pe
8150: 72 20 6c 69 6e 65 20 77 69 74 68 20 61 20 73 65  r line with a se
8160: 70 61 72 61 74 6f 72 20 2a 2f 0a 23 64 65 66 69  parator */.#defi
8170: 6e 65 20 4d 4f 44 45 5f 53 65 6d 69 20 20 20 20  ne MODE_Semi    
8180: 20 33 20 20 2f 2a 20 53 61 6d 65 20 61 73 20 4d   3  /* Same as M
8190: 4f 44 45 5f 4c 69 73 74 20 62 75 74 20 61 70 70  ODE_List but app
81a0: 65 6e 64 20 22 3b 22 20 74 6f 20 65 61 63 68 20  end ";" to each 
81b0: 6c 69 6e 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20  line */.#define 
81c0: 4d 4f 44 45 5f 48 74 6d 6c 20 20 20 20 20 34 20  MODE_Html     4 
81d0: 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 6e 20   /* Generate an 
81e0: 58 48 54 4d 4c 20 74 61 62 6c 65 20 2a 2f 0a 23  XHTML table */.#
81f0: 64 65 66 69 6e 65 20 4d 4f 44 45 5f 49 6e 73 65  define MODE_Inse
8200: 72 74 20 20 20 35 20 20 2f 2a 20 47 65 6e 65 72  rt   5  /* Gener
8210: 61 74 65 20 53 51 4c 20 22 69 6e 73 65 72 74 22  ate SQL "insert"
8220: 20 73 74 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 23   statements */.#
8230: 64 65 66 69 6e 65 20 4d 4f 44 45 5f 51 75 6f 74  define MODE_Quot
8240: 65 20 20 20 20 36 20 20 2f 2a 20 51 75 6f 74 65  e    6  /* Quote
8250: 20 76 61 6c 75 65 73 20 61 73 20 66 6f 72 20 53   values as for S
8260: 51 4c 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 4f  QL */.#define MO
8270: 44 45 5f 54 63 6c 20 20 20 20 20 20 37 20 20 2f  DE_Tcl      7  /
8280: 2a 20 47 65 6e 65 72 61 74 65 20 41 4e 53 49 2d  * Generate ANSI-
8290: 43 20 6f 72 20 54 43 4c 20 71 75 6f 74 65 64 20  C or TCL quoted 
82a0: 65 6c 65 6d 65 6e 74 73 20 2a 2f 0a 23 64 65 66  elements */.#def
82b0: 69 6e 65 20 4d 4f 44 45 5f 43 73 76 20 20 20 20  ine MODE_Csv    
82c0: 20 20 38 20 20 2f 2a 20 51 75 6f 74 65 20 73 74    8  /* Quote st
82d0: 72 69 6e 67 73 2c 20 6e 75 6d 62 65 72 73 20 61  rings, numbers a
82e0: 72 65 20 70 6c 61 69 6e 20 2a 2f 0a 23 64 65 66  re plain */.#def
82f0: 69 6e 65 20 4d 4f 44 45 5f 45 78 70 6c 61 69 6e  ine MODE_Explain
8300: 20 20 39 20 20 2f 2a 20 4c 69 6b 65 20 4d 4f 44    9  /* Like MOD
8310: 45 5f 43 6f 6c 75 6d 6e 2c 20 62 75 74 20 64 6f  E_Column, but do
8320: 20 6e 6f 74 20 74 72 75 6e 63 61 74 65 20 64 61   not truncate da
8330: 74 61 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 4f  ta */.#define MO
8340: 44 45 5f 41 73 63 69 69 20 20 20 31 30 20 20 2f  DE_Ascii   10  /
8350: 2a 20 55 73 65 20 41 53 43 49 49 20 75 6e 69 74  * Use ASCII unit
8360: 20 61 6e 64 20 72 65 63 6f 72 64 20 73 65 70 61   and record sepa
8370: 72 61 74 6f 72 73 20 28 30 78 31 46 2f 30 78 31  rators (0x1F/0x1
8380: 45 29 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 4f  E) */.#define MO
8390: 44 45 5f 50 72 65 74 74 79 20 20 31 31 20 20 2f  DE_Pretty  11  /
83a0: 2a 20 50 72 65 74 74 79 2d 70 72 69 6e 74 20 73  * Pretty-print s
83b0: 63 68 65 6d 61 73 20 2a 2f 0a 23 64 65 66 69 6e  chemas */.#defin
83c0: 65 20 4d 4f 44 45 5f 45 51 50 20 20 20 20 20 31  e MODE_EQP     1
83d0: 32 20 20 2f 2a 20 43 6f 6e 76 65 72 74 73 20 45  2  /* Converts E
83e0: 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41  XPLAIN QUERY PLA
83f0: 4e 20 6f 75 74 70 75 74 20 69 6e 74 6f 20 61 20  N output into a 
8400: 67 72 61 70 68 20 2a 2f 0a 0a 73 74 61 74 69 63  graph */..static
8410: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 6d 6f 64   const char *mod
8420: 65 44 65 73 63 72 5b 5d 20 3d 20 7b 0a 20 20 22  eDescr[] = {.  "
8430: 6c 69 6e 65 22 2c 0a 20 20 22 63 6f 6c 75 6d 6e  line",.  "column
8440: 22 2c 0a 20 20 22 6c 69 73 74 22 2c 0a 20 20 22  ",.  "list",.  "
8450: 73 65 6d 69 22 2c 0a 20 20 22 68 74 6d 6c 22 2c  semi",.  "html",
8460: 0a 20 20 22 69 6e 73 65 72 74 22 2c 0a 20 20 22  .  "insert",.  "
8470: 71 75 6f 74 65 22 2c 0a 20 20 22 74 63 6c 22 2c  quote",.  "tcl",
8480: 0a 20 20 22 63 73 76 22 2c 0a 20 20 22 65 78 70  .  "csv",.  "exp
8490: 6c 61 69 6e 22 2c 0a 20 20 22 61 73 63 69 69 22  lain",.  "ascii"
84a0: 2c 0a 20 20 22 70 72 65 74 74 79 70 72 69 6e 74  ,.  "prettyprint
84b0: 22 2c 0a 20 20 22 65 71 70 22 0a 7d 3b 0a 0a 2f  ",.  "eqp".};../
84c0: 2a 0a 2a 2a 20 54 68 65 73 65 20 61 72 65 20 74  *.** These are t
84d0: 68 65 20 63 6f 6c 75 6d 6e 2f 72 6f 77 2f 6c 69  he column/row/li
84e0: 6e 65 20 73 65 70 61 72 61 74 6f 72 73 20 75 73  ne separators us
84f0: 65 64 20 62 79 20 74 68 65 20 76 61 72 69 6f 75  ed by the variou
8500: 73 0a 2a 2a 20 69 6d 70 6f 72 74 2f 65 78 70 6f  s.** import/expo
8510: 72 74 20 6d 6f 64 65 73 2e 0a 2a 2f 0a 23 64 65  rt modes..*/.#de
8520: 66 69 6e 65 20 53 45 50 5f 43 6f 6c 75 6d 6e 20  fine SEP_Column 
8530: 20 20 20 22 7c 22 0a 23 64 65 66 69 6e 65 20 53     "|".#define S
8540: 45 50 5f 52 6f 77 20 20 20 20 20 20 20 22 5c 6e  EP_Row       "\n
8550: 22 0a 23 64 65 66 69 6e 65 20 53 45 50 5f 54 61  ".#define SEP_Ta
8560: 62 20 20 20 20 20 20 20 22 5c 74 22 0a 23 64 65  b       "\t".#de
8570: 66 69 6e 65 20 53 45 50 5f 53 70 61 63 65 20 20  fine SEP_Space  
8580: 20 20 20 22 20 22 0a 23 64 65 66 69 6e 65 20 53     " ".#define S
8590: 45 50 5f 43 6f 6d 6d 61 20 20 20 20 20 22 2c 22  EP_Comma     ","
85a0: 0a 23 64 65 66 69 6e 65 20 53 45 50 5f 43 72 4c  .#define SEP_CrL
85b0: 66 20 20 20 20 20 20 22 5c 72 5c 6e 22 0a 23 64  f      "\r\n".#d
85c0: 65 66 69 6e 65 20 53 45 50 5f 55 6e 69 74 20 20  efine SEP_Unit  
85d0: 20 20 20 20 22 5c 78 31 46 22 0a 23 64 65 66 69      "\x1F".#defi
85e0: 6e 65 20 53 45 50 5f 52 65 63 6f 72 64 20 20 20  ne SEP_Record   
85f0: 20 22 5c 78 31 45 22 0a 0a 2f 2a 0a 2a 2a 20 41   "\x1E"../*.** A
8600: 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20 74 68   callback for th
8610: 65 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 29 20  e sqlite3_log() 
8620: 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2f 0a 73 74  interface..*/.st
8630: 61 74 69 63 20 76 6f 69 64 20 73 68 65 6c 6c 4c  atic void shellL
8640: 6f 67 28 76 6f 69 64 20 2a 70 41 72 67 2c 20 69  og(void *pArg, i
8650: 6e 74 20 69 45 72 72 43 6f 64 65 2c 20 63 6f 6e  nt iErrCode, con
8660: 73 74 20 63 68 61 72 20 2a 7a 4d 73 67 29 7b 0a  st char *zMsg){.
8670: 20 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 20    ShellState *p 
8680: 3d 20 28 53 68 65 6c 6c 53 74 61 74 65 2a 29 70  = (ShellState*)p
8690: 41 72 67 3b 0a 20 20 69 66 28 20 70 2d 3e 70 4c  Arg;.  if( p->pL
86a0: 6f 67 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  og==0 ) return;.
86b0: 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d    utf8_printf(p-
86c0: 3e 70 4c 6f 67 2c 20 22 28 25 64 29 20 25 73 5c  >pLog, "(%d) %s\
86d0: 6e 22 2c 20 69 45 72 72 43 6f 64 65 2c 20 7a 4d  n", iErrCode, zM
86e0: 73 67 29 3b 0a 20 20 66 66 6c 75 73 68 28 70 2d  sg);.  fflush(p-
86f0: 3e 70 4c 6f 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  >pLog);.}../*.**
8700: 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 3a 20 20   SQL function:  
8710: 73 68 65 6c 6c 5f 70 75 74 73 6e 6c 28 58 29 0a  shell_putsnl(X).
8720: 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20  **.** Write the 
8730: 74 65 78 74 20 58 20 74 6f 20 74 68 65 20 73 63  text X to the sc
8740: 72 65 65 6e 20 28 6f 72 20 77 68 61 74 65 76 65  reen (or whateve
8750: 72 20 6f 75 74 70 75 74 20 69 73 20 62 65 69 6e  r output is bein
8760: 67 20 64 69 72 65 63 74 65 64 29 0a 2a 2a 20 61  g directed).** a
8770: 64 64 69 6e 67 20 61 20 6e 65 77 6c 69 6e 65 20  dding a newline 
8780: 61 74 20 74 68 65 20 65 6e 64 2c 20 61 6e 64 20  at the end, and 
8790: 74 68 65 6e 20 72 65 74 75 72 6e 20 58 2e 0a 2a  then return X..*
87a0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 68  /.static void sh
87b0: 65 6c 6c 50 75 74 73 46 75 6e 63 28 0a 20 20 73  ellPutsFunc(.  s
87c0: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
87d0: 70 43 74 78 2c 0a 20 20 69 6e 74 20 6e 56 61 6c  pCtx,.  int nVal
87e0: 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  ,.  sqlite3_valu
87f0: 65 20 2a 2a 61 70 56 61 6c 0a 29 7b 0a 20 20 53  e **apVal.){.  S
8800: 68 65 6c 6c 53 74 61 74 65 20 2a 70 20 3d 20 28  hellState *p = (
8810: 53 68 65 6c 6c 53 74 61 74 65 2a 29 73 71 6c 69  ShellState*)sqli
8820: 74 65 33 5f 75 73 65 72 5f 64 61 74 61 28 70 43  te3_user_data(pC
8830: 74 78 29 3b 0a 20 20 28 76 6f 69 64 29 6e 56 61  tx);.  (void)nVa
8840: 6c 3b 0a 20 20 75 74 66 38 5f 70 72 69 6e 74 66  l;.  utf8_printf
8850: 28 70 2d 3e 6f 75 74 2c 20 22 25 73 5c 6e 22 2c  (p->out, "%s\n",
8860: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74   sqlite3_value_t
8870: 65 78 74 28 61 70 56 61 6c 5b 30 5d 29 29 3b 0a  ext(apVal[0]));.
8880: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
8890: 5f 76 61 6c 75 65 28 70 43 74 78 2c 20 61 70 56  _value(pCtx, apV
88a0: 61 6c 5b 30 5d 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  al[0]);.}../*.**
88b0: 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 3a 20 20   SQL function:  
88c0: 20 65 64 69 74 28 56 41 4c 55 45 29 0a 2a 2a 20   edit(VALUE).** 
88d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
88e0: 65 64 69 74 28 56 41 4c 55 45 2c 45 44 49 54 4f  edit(VALUE,EDITO
88f0: 52 29 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 73  R).**.** These s
8900: 74 65 70 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  teps:.**.**     
8910: 28 31 29 20 57 72 69 74 65 20 56 41 4c 55 45 20  (1) Write VALUE 
8920: 69 6e 74 6f 20 61 20 74 65 6d 70 6f 72 61 72 79  into a temporary
8930: 20 66 69 6c 65 2e 0a 2a 2a 20 20 20 20 20 28 32   file..**     (2
8940: 29 20 52 75 6e 20 70 72 6f 67 72 61 6d 20 45 44  ) Run program ED
8950: 49 54 4f 52 20 6f 6e 20 74 68 61 74 20 74 65 6d  ITOR on that tem
8960: 70 6f 72 61 72 79 20 66 69 6c 65 2e 0a 2a 2a 20  porary file..** 
8970: 20 20 20 20 28 33 29 20 52 65 61 64 20 74 68 65      (3) Read the
8980: 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20   temporary file 
8990: 62 61 63 6b 20 61 6e 64 20 72 65 74 75 72 6e 20  back and return 
89a0: 69 74 73 20 63 6f 6e 74 65 6e 74 20 61 73 20 74  its content as t
89b0: 68 65 20 72 65 73 75 6c 74 2e 0a 2a 2a 20 20 20  he result..**   
89c0: 20 20 28 34 29 20 44 65 6c 65 74 65 20 74 68 65    (4) Delete the
89d0: 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 0a   temporary file.
89e0: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 45 44 49  **.** If the EDI
89f0: 54 4f 52 20 61 72 67 75 6d 65 6e 74 20 69 73 20  TOR argument is 
8a00: 6f 6d 69 74 74 65 64 2c 20 75 73 65 20 74 68 65  omitted, use the
8a10: 20 76 61 6c 75 65 20 69 6e 20 74 68 65 20 56 49   value in the VI
8a20: 53 55 41 4c 0a 2a 2a 20 65 6e 76 69 72 6f 6e 6d  SUAL.** environm
8a30: 65 6e 74 20 76 61 72 69 61 62 6c 65 2e 20 20 49  ent variable.  I
8a40: 66 20 73 74 69 6c 6c 20 74 68 65 72 65 20 69 73  f still there is
8a50: 20 6e 6f 20 45 44 49 54 4f 52 2c 20 74 68 72 6f   no EDITOR, thro
8a60: 75 67 68 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a  ugh an error..**
8a70: 0a 2a 2a 20 41 6c 73 6f 20 74 68 72 6f 77 20 61  .** Also throw a
8a80: 6e 20 65 72 72 6f 72 20 69 66 20 74 68 65 20 45  n error if the E
8a90: 44 49 54 4f 52 20 70 72 6f 67 72 61 6d 20 72 65  DITOR program re
8aa0: 74 75 72 6e 73 20 61 20 6e 6f 6e 2d 7a 65 72 6f  turns a non-zero
8ab0: 20 65 78 69 74 20 63 6f 64 65 2e 0a 2a 2f 0a 23   exit code..*/.#
8ac0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f  ifndef SQLITE_NO
8ad0: 48 41 56 45 5f 53 59 53 54 45 4d 0a 73 74 61 74  HAVE_SYSTEM.stat
8ae0: 69 63 20 76 6f 69 64 20 65 64 69 74 46 75 6e 63  ic void editFunc
8af0: 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74  (.  sqlite3_cont
8b00: 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20  ext *context,.  
8b10: 69 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69  int argc,.  sqli
8b20: 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76  te3_value **argv
8b30: 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  .){.  const char
8b40: 20 2a 7a 45 64 69 74 6f 72 3b 0a 20 20 63 68 61   *zEditor;.  cha
8b50: 72 20 2a 7a 54 65 6d 70 46 69 6c 65 20 3d 20 30  r *zTempFile = 0
8b60: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  ;.  sqlite3 *db;
8b70: 0a 20 20 63 68 61 72 20 2a 7a 43 6d 64 20 3d 20  .  char *zCmd = 
8b80: 30 3b 0a 20 20 69 6e 74 20 62 42 69 6e 3b 0a 20  0;.  int bBin;. 
8b90: 20 69 6e 74 20 72 63 3b 0a 20 20 46 49 4c 45 20   int rc;.  FILE 
8ba0: 2a 66 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  *f = 0;.  sqlite
8bb0: 33 5f 69 6e 74 36 34 20 73 7a 3b 0a 20 20 73 71  3_int64 sz;.  sq
8bc0: 6c 69 74 65 33 5f 69 6e 74 36 34 20 78 3b 0a 20  lite3_int64 x;. 
8bd0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
8be0: 70 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 61 72  p = 0;..  if( ar
8bf0: 67 63 3d 3d 32 20 29 7b 0a 20 20 20 20 7a 45 64  gc==2 ){.    zEd
8c00: 69 74 6f 72 20 3d 20 28 63 6f 6e 73 74 20 63 68  itor = (const ch
8c10: 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75  ar*)sqlite3_valu
8c20: 65 5f 74 65 78 74 28 61 72 67 76 5b 31 5d 29 3b  e_text(argv[1]);
8c30: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 45  .  }else{.    zE
8c40: 64 69 74 6f 72 20 3d 20 67 65 74 65 6e 76 28 22  ditor = getenv("
8c50: 56 49 53 55 41 4c 22 29 3b 0a 20 20 7d 0a 20 20  VISUAL");.  }.  
8c60: 69 66 28 20 7a 45 64 69 74 6f 72 3d 3d 30 20 29  if( zEditor==0 )
8c70: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65  {.    sqlite3_re
8c80: 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65  sult_error(conte
8c90: 78 74 2c 20 22 6e 6f 20 65 64 69 74 6f 72 20 66  xt, "no editor f
8ca0: 6f 72 20 65 64 69 74 28 29 22 2c 20 2d 31 29 3b  or edit()", -1);
8cb0: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
8cc0: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 76  .  if( sqlite3_v
8cd0: 61 6c 75 65 5f 74 79 70 65 28 61 72 67 76 5b 30  alue_type(argv[0
8ce0: 5d 29 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 20  ])==SQLITE_NULL 
8cf0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72  ){.    sqlite3_r
8d00: 65 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74  esult_error(cont
8d10: 65 78 74 2c 20 22 4e 55 4c 4c 20 69 6e 70 75 74  ext, "NULL input
8d20: 20 74 6f 20 65 64 69 74 28 29 22 2c 20 2d 31 29   to edit()", -1)
8d30: 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
8d40: 7d 0a 20 20 64 62 20 3d 20 73 71 6c 69 74 65 33  }.  db = sqlite3
8d50: 5f 63 6f 6e 74 65 78 74 5f 64 62 5f 68 61 6e 64  _context_db_hand
8d60: 6c 65 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 7a  le(context);.  z
8d70: 54 65 6d 70 46 69 6c 65 20 3d 20 30 3b 0a 20 20  TempFile = 0;.  
8d80: 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e  sqlite3_file_con
8d90: 74 72 6f 6c 28 64 62 2c 20 30 2c 20 53 51 4c 49  trol(db, 0, SQLI
8da0: 54 45 5f 46 43 4e 54 4c 5f 54 45 4d 50 46 49 4c  TE_FCNTL_TEMPFIL
8db0: 45 4e 41 4d 45 2c 20 26 7a 54 65 6d 70 46 69 6c  ENAME, &zTempFil
8dc0: 65 29 3b 0a 20 20 69 66 28 20 7a 54 65 6d 70 46  e);.  if( zTempF
8dd0: 69 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  ile==0 ){.    sq
8de0: 6c 69 74 65 33 5f 75 69 6e 74 36 34 20 72 20 3d  lite3_uint64 r =
8df0: 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   0;.    sqlite3_
8e00: 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f  randomness(sizeo
8e10: 66 28 72 29 2c 20 26 72 29 3b 0a 20 20 20 20 7a  f(r), &r);.    z
8e20: 54 65 6d 70 46 69 6c 65 20 3d 20 73 71 6c 69 74  TempFile = sqlit
8e30: 65 33 5f 6d 70 72 69 6e 74 66 28 22 74 65 6d 70  e3_mprintf("temp
8e40: 25 6c 6c 78 22 2c 20 72 29 3b 0a 20 20 20 20 69  %llx", r);.    i
8e50: 66 28 20 7a 54 65 6d 70 46 69 6c 65 3d 3d 30 20  f( zTempFile==0 
8e60: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
8e70: 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f 6e 6f  _result_error_no
8e80: 6d 65 6d 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20  mem(context);.  
8e90: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
8ea0: 7d 0a 20 20 7d 0a 20 20 62 42 69 6e 20 3d 20 73  }.  }.  bBin = s
8eb0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70  qlite3_value_typ
8ec0: 65 28 61 72 67 76 5b 30 5d 29 3d 3d 53 51 4c 49  e(argv[0])==SQLI
8ed0: 54 45 5f 42 4c 4f 42 3b 0a 20 20 66 20 3d 20 66  TE_BLOB;.  f = f
8ee0: 6f 70 65 6e 28 7a 54 65 6d 70 46 69 6c 65 2c 20  open(zTempFile, 
8ef0: 62 42 69 6e 20 3f 20 22 77 62 22 20 3a 20 22 77  bBin ? "wb" : "w
8f00: 22 29 3b 0a 20 20 69 66 28 20 66 3d 3d 30 20 29  ");.  if( f==0 )
8f10: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65  {.    sqlite3_re
8f20: 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65  sult_error(conte
8f30: 78 74 2c 20 22 65 64 69 74 28 29 20 63 61 6e 6e  xt, "edit() cann
8f40: 6f 74 20 6f 70 65 6e 20 74 65 6d 70 20 66 69 6c  ot open temp fil
8f50: 65 22 2c 20 2d 31 29 3b 0a 20 20 20 20 67 6f 74  e", -1);.    got
8f60: 6f 20 65 64 69 74 5f 66 75 6e 63 5f 65 6e 64 3b  o edit_func_end;
8f70: 0a 20 20 7d 0a 20 20 73 7a 20 3d 20 73 71 6c 69  .  }.  sz = sqli
8f80: 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28  te3_value_bytes(
8f90: 61 72 67 76 5b 30 5d 29 3b 0a 20 20 69 66 28 20  argv[0]);.  if( 
8fa0: 62 42 69 6e 20 29 7b 0a 20 20 20 20 78 20 3d 20  bBin ){.    x = 
8fb0: 66 77 72 69 74 65 28 73 71 6c 69 74 65 33 5f 76  fwrite(sqlite3_v
8fc0: 61 6c 75 65 5f 62 6c 6f 62 28 61 72 67 76 5b 30  alue_blob(argv[0
8fd0: 5d 29 2c 20 31 2c 20 73 7a 2c 20 66 29 3b 0a 20  ]), 1, sz, f);. 
8fe0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 78 20 3d 20   }else{.    x = 
8ff0: 66 77 72 69 74 65 28 73 71 6c 69 74 65 33 5f 76  fwrite(sqlite3_v
9000: 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30  alue_text(argv[0
9010: 5d 29 2c 20 31 2c 20 73 7a 2c 20 66 29 3b 0a 20  ]), 1, sz, f);. 
9020: 20 7d 0a 20 20 66 63 6c 6f 73 65 28 66 29 3b 0a   }.  fclose(f);.
9030: 20 20 66 20 3d 20 30 3b 0a 20 20 69 66 28 20 78    f = 0;.  if( x
9040: 21 3d 73 7a 20 29 7b 0a 20 20 20 20 73 71 6c 69  !=sz ){.    sqli
9050: 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72  te3_result_error
9060: 28 63 6f 6e 74 65 78 74 2c 20 22 65 64 69 74 28  (context, "edit(
9070: 29 20 63 6f 75 6c 64 20 6e 6f 74 20 77 72 69 74  ) could not writ
9080: 65 20 74 68 65 20 77 68 6f 6c 65 20 66 69 6c 65  e the whole file
9090: 22 2c 20 2d 31 29 3b 0a 20 20 20 20 67 6f 74 6f  ", -1);.    goto
90a0: 20 65 64 69 74 5f 66 75 6e 63 5f 65 6e 64 3b 0a   edit_func_end;.
90b0: 20 20 7d 0a 20 20 7a 43 6d 64 20 3d 20 73 71 6c    }.  zCmd = sql
90c0: 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73  ite3_mprintf("%s
90d0: 20 5c 22 25 73 5c 22 22 2c 20 7a 45 64 69 74 6f   \"%s\"", zEdito
90e0: 72 2c 20 7a 54 65 6d 70 46 69 6c 65 29 3b 0a 20  r, zTempFile);. 
90f0: 20 69 66 28 20 7a 43 6d 64 3d 3d 30 20 29 7b 0a   if( zCmd==0 ){.
9100: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
9110: 6c 74 5f 65 72 72 6f 72 5f 6e 6f 6d 65 6d 28 63  lt_error_nomem(c
9120: 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 67 6f 74  ontext);.    got
9130: 6f 20 65 64 69 74 5f 66 75 6e 63 5f 65 6e 64 3b  o edit_func_end;
9140: 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 79 73 74  .  }.  rc = syst
9150: 65 6d 28 7a 43 6d 64 29 3b 0a 20 20 73 71 6c 69  em(zCmd);.  sqli
9160: 74 65 33 5f 66 72 65 65 28 7a 43 6d 64 29 3b 0a  te3_free(zCmd);.
9170: 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
9180: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65  sqlite3_result_e
9190: 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c 20 22 45  rror(context, "E
91a0: 44 49 54 4f 52 20 72 65 74 75 72 6e 65 64 20 6e  DITOR returned n
91b0: 6f 6e 2d 7a 65 72 6f 22 2c 20 2d 31 29 3b 0a 20  on-zero", -1);. 
91c0: 20 20 20 67 6f 74 6f 20 65 64 69 74 5f 66 75 6e     goto edit_fun
91d0: 63 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 66 20 3d  c_end;.  }.  f =
91e0: 20 66 6f 70 65 6e 28 7a 54 65 6d 70 46 69 6c 65   fopen(zTempFile
91f0: 2c 20 62 42 69 6e 20 3f 20 22 72 62 22 20 3a 20  , bBin ? "rb" : 
9200: 22 72 22 29 3b 0a 20 20 69 66 28 20 66 3d 3d 30  "r");.  if( f==0
9210: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
9220: 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e  result_error(con
9230: 74 65 78 74 2c 0a 20 20 20 20 20 20 22 65 64 69  text,.      "edi
9240: 74 28 29 20 63 61 6e 6e 6f 74 20 72 65 6f 70 65  t() cannot reope
9250: 6e 20 74 65 6d 70 20 66 69 6c 65 20 61 66 74 65  n temp file afte
9260: 72 20 65 64 69 74 22 2c 20 2d 31 29 3b 0a 20 20  r edit", -1);.  
9270: 20 20 67 6f 74 6f 20 65 64 69 74 5f 66 75 6e 63    goto edit_func
9280: 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 66 73 65 65  _end;.  }.  fsee
9290: 6b 28 66 2c 20 30 2c 20 53 45 45 4b 5f 45 4e 44  k(f, 0, SEEK_END
92a0: 29 3b 0a 20 20 73 7a 20 3d 20 66 74 65 6c 6c 28  );.  sz = ftell(
92b0: 66 29 3b 0a 20 20 72 65 77 69 6e 64 28 66 29 3b  f);.  rewind(f);
92c0: 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 5f 6d  .  p = sqlite3_m
92d0: 61 6c 6c 6f 63 36 34 28 20 73 7a 2b 28 62 42 69  alloc64( sz+(bBi
92e0: 6e 3d 3d 30 29 20 29 3b 0a 20 20 69 66 28 20 70  n==0) );.  if( p
92f0: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
9300: 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f  e3_result_error_
9310: 6e 6f 6d 65 6d 28 63 6f 6e 74 65 78 74 29 3b 0a  nomem(context);.
9320: 20 20 20 20 67 6f 74 6f 20 65 64 69 74 5f 66 75      goto edit_fu
9330: 6e 63 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 69 66  nc_end;.  }.  if
9340: 28 20 62 42 69 6e 20 29 7b 0a 20 20 20 20 78 20  ( bBin ){.    x 
9350: 3d 20 66 72 65 61 64 28 70 2c 20 31 2c 20 73 7a  = fread(p, 1, sz
9360: 2c 20 66 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  , f);.  }else{. 
9370: 20 20 20 78 20 3d 20 66 72 65 61 64 28 70 2c 20     x = fread(p, 
9380: 31 2c 20 73 7a 2c 20 66 29 3b 0a 20 20 20 20 70  1, sz, f);.    p
9390: 5b 73 7a 5d 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  [sz] = 0;.  }.  
93a0: 66 63 6c 6f 73 65 28 66 29 3b 0a 20 20 66 20 3d  fclose(f);.  f =
93b0: 20 30 3b 0a 20 20 69 66 28 20 78 21 3d 73 7a 20   0;.  if( x!=sz 
93c0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72  ){.    sqlite3_r
93d0: 65 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74  esult_error(cont
93e0: 65 78 74 2c 20 22 63 6f 75 6c 64 20 6e 6f 74 20  ext, "could not 
93f0: 72 65 61 64 20 62 61 63 6b 20 74 68 65 20 77 68  read back the wh
9400: 6f 6c 65 20 66 69 6c 65 22 2c 20 2d 31 29 3b 0a  ole file", -1);.
9410: 20 20 20 20 67 6f 74 6f 20 65 64 69 74 5f 66 75      goto edit_fu
9420: 6e 63 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 69 66  nc_end;.  }.  if
9430: 28 20 62 42 69 6e 20 29 7b 0a 20 20 20 20 73 71  ( bBin ){.    sq
9440: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 62 6c 6f  lite3_result_blo
9450: 62 36 34 28 63 6f 6e 74 65 78 74 2c 20 70 2c 20  b64(context, p, 
9460: 73 7a 2c 20 73 71 6c 69 74 65 33 5f 66 72 65 65  sz, sqlite3_free
9470: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
9480: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74  sqlite3_result_t
9490: 65 78 74 36 34 28 63 6f 6e 74 65 78 74 2c 20 28  ext64(context, (
94a0: 63 6f 6e 73 74 20 63 68 61 72 2a 29 70 2c 20 73  const char*)p, s
94b0: 7a 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  z,.             
94c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
94d0: 69 74 65 33 5f 66 72 65 65 2c 20 53 51 4c 49 54  ite3_free, SQLIT
94e0: 45 5f 55 54 46 38 29 3b 0a 20 20 7d 0a 20 20 70  E_UTF8);.  }.  p
94f0: 20 3d 20 30 3b 0a 0a 65 64 69 74 5f 66 75 6e 63   = 0;..edit_func
9500: 5f 65 6e 64 3a 0a 20 20 69 66 28 20 66 20 29 20  _end:.  if( f ) 
9510: 66 63 6c 6f 73 65 28 66 29 3b 0a 20 20 75 6e 6c  fclose(f);.  unl
9520: 69 6e 6b 28 7a 54 65 6d 70 46 69 6c 65 29 3b 0a  ink(zTempFile);.
9530: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
9540: 54 65 6d 70 46 69 6c 65 29 3b 0a 20 20 73 71 6c  TempFile);.  sql
9550: 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 7d 0a  ite3_free(p);.}.
9560: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
9570: 5f 4e 4f 48 41 56 45 5f 53 59 53 54 45 4d 20 2a  _NOHAVE_SYSTEM *
9580: 2f 0a 0a 2f 2a 0a 2a 2a 20 53 61 76 65 20 6f 72  /../*.** Save or
9590: 20 72 65 73 74 6f 72 65 20 74 68 65 20 63 75 72   restore the cur
95a0: 72 65 6e 74 20 6f 75 74 70 75 74 20 6d 6f 64 65  rent output mode
95b0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
95c0: 6f 75 74 70 75 74 4d 6f 64 65 50 75 73 68 28 53  outputModePush(S
95d0: 68 65 6c 6c 53 74 61 74 65 20 2a 70 29 7b 0a 20  hellState *p){. 
95e0: 20 70 2d 3e 6d 6f 64 65 50 72 69 6f 72 20 3d 20   p->modePrior = 
95f0: 70 2d 3e 6d 6f 64 65 3b 0a 20 20 6d 65 6d 63 70  p->mode;.  memcp
9600: 79 28 70 2d 3e 63 6f 6c 53 65 70 50 72 69 6f 72  y(p->colSepPrior
9610: 2c 20 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f  , p->colSeparato
9620: 72 2c 20 73 69 7a 65 6f 66 28 70 2d 3e 63 6f 6c  r, sizeof(p->col
9630: 53 65 70 61 72 61 74 6f 72 29 29 3b 0a 20 20 6d  Separator));.  m
9640: 65 6d 63 70 79 28 70 2d 3e 72 6f 77 53 65 70 50  emcpy(p->rowSepP
9650: 72 69 6f 72 2c 20 70 2d 3e 72 6f 77 53 65 70 61  rior, p->rowSepa
9660: 72 61 74 6f 72 2c 20 73 69 7a 65 6f 66 28 70 2d  rator, sizeof(p-
9670: 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 29 29 3b  >rowSeparator));
9680: 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6f  .}.static void o
9690: 75 74 70 75 74 4d 6f 64 65 50 6f 70 28 53 68 65  utputModePop(She
96a0: 6c 6c 53 74 61 74 65 20 2a 70 29 7b 0a 20 20 70  llState *p){.  p
96b0: 2d 3e 6d 6f 64 65 20 3d 20 70 2d 3e 6d 6f 64 65  ->mode = p->mode
96c0: 50 72 69 6f 72 3b 0a 20 20 6d 65 6d 63 70 79 28  Prior;.  memcpy(
96d0: 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 2c  p->colSeparator,
96e0: 20 70 2d 3e 63 6f 6c 53 65 70 50 72 69 6f 72 2c   p->colSepPrior,
96f0: 20 73 69 7a 65 6f 66 28 70 2d 3e 63 6f 6c 53 65   sizeof(p->colSe
9700: 70 61 72 61 74 6f 72 29 29 3b 0a 20 20 6d 65 6d  parator));.  mem
9710: 63 70 79 28 70 2d 3e 72 6f 77 53 65 70 61 72 61  cpy(p->rowSepara
9720: 74 6f 72 2c 20 70 2d 3e 72 6f 77 53 65 70 50 72  tor, p->rowSepPr
9730: 69 6f 72 2c 20 73 69 7a 65 6f 66 28 70 2d 3e 72  ior, sizeof(p->r
9740: 6f 77 53 65 70 61 72 61 74 6f 72 29 29 3b 0a 7d  owSeparator));.}
9750: 0a 0a 2f 2a 0a 2a 2a 20 4f 75 74 70 75 74 20 74  ../*.** Output t
9760: 68 65 20 67 69 76 65 6e 20 73 74 72 69 6e 67 20  he given string 
9770: 61 73 20 61 20 68 65 78 2d 65 6e 63 6f 64 65 64  as a hex-encoded
9780: 20 62 6c 6f 62 20 28 65 67 2e 20 58 27 31 32 33   blob (eg. X'123
9790: 34 27 20 29 0a 2a 2f 0a 73 74 61 74 69 63 20 76  4' ).*/.static v
97a0: 6f 69 64 20 6f 75 74 70 75 74 5f 68 65 78 5f 62  oid output_hex_b
97b0: 6c 6f 62 28 46 49 4c 45 20 2a 6f 75 74 2c 20 63  lob(FILE *out, c
97c0: 6f 6e 73 74 20 76 6f 69 64 20 2a 70 42 6c 6f 62  onst void *pBlob
97d0: 2c 20 69 6e 74 20 6e 42 6c 6f 62 29 7b 0a 20 20  , int nBlob){.  
97e0: 69 6e 74 20 69 3b 0a 20 20 63 68 61 72 20 2a 7a  int i;.  char *z
97f0: 42 6c 6f 62 20 3d 20 28 63 68 61 72 20 2a 29 70  Blob = (char *)p
9800: 42 6c 6f 62 3b 0a 20 20 72 61 77 5f 70 72 69 6e  Blob;.  raw_prin
9810: 74 66 28 6f 75 74 2c 22 58 27 22 29 3b 0a 20 20  tf(out,"X'");.  
9820: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 42 6c 6f 62  for(i=0; i<nBlob
9830: 3b 20 69 2b 2b 29 7b 20 72 61 77 5f 70 72 69 6e  ; i++){ raw_prin
9840: 74 66 28 6f 75 74 2c 22 25 30 32 78 22 2c 7a 42  tf(out,"%02x",zB
9850: 6c 6f 62 5b 69 5d 26 30 78 66 66 29 3b 20 7d 0a  lob[i]&0xff); }.
9860: 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74    raw_printf(out
9870: 2c 22 27 22 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ,"'");.}../*.** 
9880: 46 69 6e 64 20 61 20 73 74 72 69 6e 67 20 74 68  Find a string th
9890: 61 74 20 69 73 20 6e 6f 74 20 66 6f 75 6e 64 20  at is not found 
98a0: 61 6e 79 77 68 65 72 65 20 69 6e 20 7a 5b 5d 2e  anywhere in z[].
98b0: 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74    Return a point
98c0: 65 72 0a 2a 2a 20 74 6f 20 74 68 61 74 20 73 74  er.** to that st
98d0: 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 72 79 20  ring..**.** Try 
98e0: 74 6f 20 75 73 65 20 7a 41 20 61 6e 64 20 7a 42  to use zA and zB
98f0: 20 66 69 72 73 74 2e 20 20 49 66 20 62 6f 74 68   first.  If both
9900: 20 6f 66 20 74 68 6f 73 65 20 61 72 65 20 61 6c   of those are al
9910: 72 65 61 64 79 20 66 6f 75 6e 64 20 69 6e 20 7a  ready found in z
9920: 5b 5d 0a 2a 2a 20 74 68 65 6e 20 6d 61 6b 65 20  [].** then make 
9930: 75 70 20 73 6f 6d 65 20 73 74 72 69 6e 67 20 61  up some string a
9940: 6e 64 20 73 74 6f 72 65 20 69 74 20 69 6e 20 74  nd store it in t
9950: 68 65 20 62 75 66 66 65 72 20 7a 42 75 66 2e 0a  he buffer zBuf..
9960: 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  */.static const 
9970: 63 68 61 72 20 2a 75 6e 75 73 65 64 5f 73 74 72  char *unused_str
9980: 69 6e 67 28 0a 20 20 63 6f 6e 73 74 20 63 68 61  ing(.  const cha
9990: 72 20 2a 7a 2c 20 20 20 20 20 20 20 20 20 20 20  r *z,           
99a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75           /* Resu
99b0: 6c 74 20 6d 75 73 74 20 6e 6f 74 20 61 70 70 65  lt must not appe
99c0: 61 72 20 61 6e 79 77 68 65 72 65 20 69 6e 20 7a  ar anywhere in z
99d0: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
99e0: 20 2a 7a 41 2c 20 63 6f 6e 73 74 20 63 68 61 72   *zA, const char
99f0: 20 2a 7a 42 2c 20 20 20 2f 2a 20 54 72 79 20 74   *zB,   /* Try t
9a00: 68 65 73 65 20 66 69 72 73 74 20 2a 2f 0a 20 20  hese first */.  
9a10: 63 68 61 72 20 2a 7a 42 75 66 20 20 20 20 20 20  char *zBuf      
9a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9a30: 20 20 2f 2a 20 53 70 61 63 65 20 74 6f 20 73 74    /* Space to st
9a40: 6f 72 65 20 61 20 67 65 6e 65 72 61 74 65 64 20  ore a generated 
9a50: 73 74 72 69 6e 67 20 2a 2f 0a 29 7b 0a 20 20 75  string */.){.  u
9a60: 6e 73 69 67 6e 65 64 20 69 20 3d 20 30 3b 0a 20  nsigned i = 0;. 
9a70: 20 69 66 28 20 73 74 72 73 74 72 28 7a 2c 20 7a   if( strstr(z, z
9a80: 41 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 7a  A)==0 ) return z
9a90: 41 3b 0a 20 20 69 66 28 20 73 74 72 73 74 72 28  A;.  if( strstr(
9aa0: 7a 2c 20 7a 42 29 3d 3d 30 20 29 20 72 65 74 75  z, zB)==0 ) retu
9ab0: 72 6e 20 7a 42 3b 0a 20 20 64 6f 7b 0a 20 20 20  rn zB;.  do{.   
9ac0: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
9ad0: 66 28 32 30 2c 7a 42 75 66 2c 22 28 25 73 25 75  f(20,zBuf,"(%s%u
9ae0: 29 22 2c 20 7a 41 2c 20 69 2b 2b 29 3b 0a 20 20  )", zA, i++);.  
9af0: 7d 77 68 69 6c 65 28 20 73 74 72 73 74 72 28 7a  }while( strstr(z
9b00: 2c 7a 42 75 66 29 21 3d 30 20 29 3b 0a 20 20 72  ,zBuf)!=0 );.  r
9b10: 65 74 75 72 6e 20 7a 42 75 66 3b 0a 7d 0a 0a 2f  eturn zBuf;.}../
9b20: 2a 0a 2a 2a 20 4f 75 74 70 75 74 20 74 68 65 20  *.** Output the 
9b30: 67 69 76 65 6e 20 73 74 72 69 6e 67 20 61 73 20  given string as 
9b40: 61 20 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20  a quoted string 
9b50: 75 73 69 6e 67 20 53 51 4c 20 71 75 6f 74 69 6e  using SQL quotin
9b60: 67 20 63 6f 6e 76 65 6e 74 69 6f 6e 73 2e 0a 2a  g conventions..*
9b70: 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20 6f  *.** See also: o
9b80: 75 74 70 75 74 5f 71 75 6f 74 65 64 5f 65 73 63  utput_quoted_esc
9b90: 61 70 65 64 5f 73 74 72 69 6e 67 28 29 0a 2a 2f  aped_string().*/
9ba0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6f 75 74  .static void out
9bb0: 70 75 74 5f 71 75 6f 74 65 64 5f 73 74 72 69 6e  put_quoted_strin
9bc0: 67 28 46 49 4c 45 20 2a 6f 75 74 2c 20 63 6f 6e  g(FILE *out, con
9bd0: 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69  st char *z){.  i
9be0: 6e 74 20 69 3b 0a 20 20 63 68 61 72 20 63 3b 0a  nt i;.  char c;.
9bf0: 20 20 73 65 74 42 69 6e 61 72 79 4d 6f 64 65 28    setBinaryMode(
9c00: 6f 75 74 2c 20 31 29 3b 0a 20 20 66 6f 72 28 69  out, 1);.  for(i
9c10: 3d 30 3b 20 28 63 20 3d 20 7a 5b 69 5d 29 21 3d  =0; (c = z[i])!=
9c20: 30 20 26 26 20 63 21 3d 27 5c 27 27 3b 20 69 2b  0 && c!='\''; i+
9c30: 2b 29 7b 7d 0a 20 20 69 66 28 20 63 3d 3d 30 20  +){}.  if( c==0 
9c40: 29 7b 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e  ){.    utf8_prin
9c50: 74 66 28 6f 75 74 2c 22 27 25 73 27 22 2c 7a 29  tf(out,"'%s'",z)
9c60: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
9c70: 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22  aw_printf(out, "
9c80: 27 22 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  '");.    while( 
9c90: 2a 7a 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28  *z ){.      for(
9ca0: 69 3d 30 3b 20 28 63 20 3d 20 7a 5b 69 5d 29 21  i=0; (c = z[i])!
9cb0: 3d 30 20 26 26 20 63 21 3d 27 5c 27 27 3b 20 69  =0 && c!='\''; i
9cc0: 2b 2b 29 7b 7d 0a 20 20 20 20 20 20 69 66 28 20  ++){}.      if( 
9cd0: 63 3d 3d 27 5c 27 27 20 29 20 69 2b 2b 3b 0a 20  c=='\'' ) i++;. 
9ce0: 20 20 20 20 20 69 66 28 20 69 20 29 7b 0a 20 20       if( i ){.  
9cf0: 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
9d00: 66 28 6f 75 74 2c 20 22 25 2e 2a 73 22 2c 20 69  f(out, "%.*s", i
9d10: 2c 20 7a 29 3b 0a 20 20 20 20 20 20 20 20 7a 20  , z);.        z 
9d20: 2b 3d 20 69 3b 0a 20 20 20 20 20 20 7d 0a 20 20  += i;.      }.  
9d30: 20 20 20 20 69 66 28 20 63 3d 3d 27 5c 27 27 20      if( c=='\'' 
9d40: 29 7b 0a 20 20 20 20 20 20 20 20 72 61 77 5f 70  ){.        raw_p
9d50: 72 69 6e 74 66 28 6f 75 74 2c 20 22 27 22 29 3b  rintf(out, "'");
9d60: 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  .        continu
9d70: 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  e;.      }.     
9d80: 20 69 66 28 20 63 3d 3d 30 20 29 7b 0a 20 20 20   if( c==0 ){.   
9d90: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
9da0: 20 20 7d 0a 20 20 20 20 20 20 7a 2b 2b 3b 0a 20    }.      z++;. 
9db0: 20 20 20 7d 0a 20 20 20 20 72 61 77 5f 70 72 69     }.    raw_pri
9dc0: 6e 74 66 28 6f 75 74 2c 20 22 27 22 29 3b 0a 20  ntf(out, "'");. 
9dd0: 20 7d 0a 20 20 73 65 74 54 65 78 74 4d 6f 64 65   }.  setTextMode
9de0: 28 6f 75 74 2c 20 31 29 3b 0a 7d 0a 0a 2f 2a 0a  (out, 1);.}../*.
9df0: 2a 2a 20 4f 75 74 70 75 74 20 74 68 65 20 67 69  ** Output the gi
9e00: 76 65 6e 20 73 74 72 69 6e 67 20 61 73 20 61 20  ven string as a 
9e10: 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20 75 73  quoted string us
9e20: 69 6e 67 20 53 51 4c 20 71 75 6f 74 69 6e 67 20  ing SQL quoting 
9e30: 63 6f 6e 76 65 6e 74 69 6f 6e 73 2e 0a 2a 2a 20  conventions..** 
9e40: 41 64 64 69 74 69 6f 6e 61 6c 6c 6c 79 20 2c 20  Additionallly , 
9e50: 65 73 63 61 70 65 20 74 68 65 20 22 5c 6e 22 20  escape the "\n" 
9e60: 61 6e 64 20 22 5c 72 22 20 63 68 61 72 61 63 74  and "\r" charact
9e70: 65 72 73 20 73 6f 20 74 68 61 74 20 74 68 65 79  ers so that they
9e80: 20 64 6f 20 6e 6f 74 0a 2a 2a 20 67 65 74 20 63   do not.** get c
9e90: 6f 72 72 75 70 74 65 64 20 62 79 20 65 6e 64 2d  orrupted by end-
9ea0: 6f 66 2d 6c 69 6e 65 20 74 72 61 6e 73 6c 61 74  of-line translat
9eb0: 69 6f 6e 20 66 61 63 69 6c 69 74 69 65 73 20 69  ion facilities i
9ec0: 6e 20 73 6f 6d 65 20 6f 70 65 72 61 74 69 6e 67  n some operating
9ed0: 0a 2a 2a 20 73 79 73 74 65 6d 73 2e 0a 2a 2a 0a  .** systems..**.
9ee0: 2a 2a 20 54 68 69 73 20 69 73 20 6c 69 6b 65 20  ** This is like 
9ef0: 6f 75 74 70 75 74 5f 71 75 6f 74 65 64 5f 73 74  output_quoted_st
9f00: 72 69 6e 67 28 29 20 62 75 74 20 77 69 74 68 20  ring() but with 
9f10: 74 68 65 20 61 64 64 69 74 69 6f 6e 20 6f 66 20  the addition of 
9f20: 74 68 65 20 5c 72 5c 6e 0a 2a 2a 20 65 73 63 61  the \r\n.** esca
9f30: 70 65 20 6d 65 63 68 61 6e 69 73 6d 2e 0a 2a 2f  pe mechanism..*/
9f40: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6f 75 74  .static void out
9f50: 70 75 74 5f 71 75 6f 74 65 64 5f 65 73 63 61 70  put_quoted_escap
9f60: 65 64 5f 73 74 72 69 6e 67 28 46 49 4c 45 20 2a  ed_string(FILE *
9f70: 6f 75 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  out, const char 
9f80: 2a 7a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  *z){.  int i;.  
9f90: 63 68 61 72 20 63 3b 0a 20 20 73 65 74 42 69 6e  char c;.  setBin
9fa0: 61 72 79 4d 6f 64 65 28 6f 75 74 2c 20 31 29 3b  aryMode(out, 1);
9fb0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 28 63 20 3d  .  for(i=0; (c =
9fc0: 20 7a 5b 69 5d 29 21 3d 30 20 26 26 20 63 21 3d   z[i])!=0 && c!=
9fd0: 27 5c 27 27 20 26 26 20 63 21 3d 27 5c 6e 27 20  '\'' && c!='\n' 
9fe0: 26 26 20 63 21 3d 27 5c 72 27 3b 20 69 2b 2b 29  && c!='\r'; i++)
9ff0: 7b 7d 0a 20 20 69 66 28 20 63 3d 3d 30 20 29 7b  {}.  if( c==0 ){
a000: 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66  .    utf8_printf
a010: 28 6f 75 74 2c 22 27 25 73 27 22 2c 7a 29 3b 0a  (out,"'%s'",z);.
a020: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 6f 6e    }else{.    con
a030: 73 74 20 63 68 61 72 20 2a 7a 4e 4c 20 3d 20 30  st char *zNL = 0
a040: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
a050: 20 2a 7a 43 52 20 3d 20 30 3b 0a 20 20 20 20 69   *zCR = 0;.    i
a060: 6e 74 20 6e 4e 4c 20 3d 20 30 3b 0a 20 20 20 20  nt nNL = 0;.    
a070: 69 6e 74 20 6e 43 52 20 3d 20 30 3b 0a 20 20 20  int nCR = 0;.   
a080: 20 63 68 61 72 20 7a 42 75 66 31 5b 32 30 5d 2c   char zBuf1[20],
a090: 20 7a 42 75 66 32 5b 32 30 5d 3b 0a 20 20 20 20   zBuf2[20];.    
a0a0: 66 6f 72 28 69 3d 30 3b 20 7a 5b 69 5d 3b 20 69  for(i=0; z[i]; i
a0b0: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 7a  ++){.      if( z
a0c0: 5b 69 5d 3d 3d 27 5c 6e 27 20 29 20 6e 4e 4c 2b  [i]=='\n' ) nNL+
a0d0: 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 5b 69  +;.      if( z[i
a0e0: 5d 3d 3d 27 5c 72 27 20 29 20 6e 43 52 2b 2b 3b  ]=='\r' ) nCR++;
a0f0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e  .    }.    if( n
a100: 4e 4c 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f  NL ){.      raw_
a110: 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 72 65 70  printf(out, "rep
a120: 6c 61 63 65 28 22 29 3b 0a 20 20 20 20 20 20 7a  lace(");.      z
a130: 4e 4c 20 3d 20 75 6e 75 73 65 64 5f 73 74 72 69  NL = unused_stri
a140: 6e 67 28 7a 2c 20 22 5c 5c 6e 22 2c 20 22 5c 5c  ng(z, "\\n", "\\
a150: 30 31 32 22 2c 20 7a 42 75 66 31 29 3b 0a 20 20  012", zBuf1);.  
a160: 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 43 52 20    }.    if( nCR 
a170: 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69  ){.      raw_pri
a180: 6e 74 66 28 6f 75 74 2c 20 22 72 65 70 6c 61 63  ntf(out, "replac
a190: 65 28 22 29 3b 0a 20 20 20 20 20 20 7a 43 52 20  e(");.      zCR 
a1a0: 3d 20 75 6e 75 73 65 64 5f 73 74 72 69 6e 67 28  = unused_string(
a1b0: 7a 2c 20 22 5c 5c 72 22 2c 20 22 5c 5c 30 31 35  z, "\\r", "\\015
a1c0: 22 2c 20 7a 42 75 66 32 29 3b 0a 20 20 20 20 7d  ", zBuf2);.    }
a1d0: 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28  .    raw_printf(
a1e0: 6f 75 74 2c 20 22 27 22 29 3b 0a 20 20 20 20 77  out, "'");.    w
a1f0: 68 69 6c 65 28 20 2a 7a 20 29 7b 0a 20 20 20 20  hile( *z ){.    
a200: 20 20 66 6f 72 28 69 3d 30 3b 20 28 63 20 3d 20    for(i=0; (c = 
a210: 7a 5b 69 5d 29 21 3d 30 20 26 26 20 63 21 3d 27  z[i])!=0 && c!='
a220: 5c 6e 27 20 26 26 20 63 21 3d 27 5c 72 27 20 26  \n' && c!='\r' &
a230: 26 20 63 21 3d 27 5c 27 27 3b 20 69 2b 2b 29 7b  & c!='\''; i++){
a240: 7d 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27  }.      if( c=='
a250: 5c 27 27 20 29 20 69 2b 2b 3b 0a 20 20 20 20 20  \'' ) i++;.     
a260: 20 69 66 28 20 69 20 29 7b 0a 20 20 20 20 20 20   if( i ){.      
a270: 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 6f 75    utf8_printf(ou
a280: 74 2c 20 22 25 2e 2a 73 22 2c 20 69 2c 20 7a 29  t, "%.*s", i, z)
a290: 3b 0a 20 20 20 20 20 20 20 20 7a 20 2b 3d 20 69  ;.        z += i
a2a0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
a2b0: 69 66 28 20 63 3d 3d 27 5c 27 27 20 29 7b 0a 20  if( c=='\'' ){. 
a2c0: 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74         raw_print
a2d0: 66 28 6f 75 74 2c 20 22 27 22 29 3b 0a 20 20 20  f(out, "'");.   
a2e0: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
a2f0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
a300: 20 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20   c==0 ){.       
a310: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
a320: 20 20 20 20 20 20 7a 2b 2b 3b 0a 20 20 20 20 20        z++;.     
a330: 20 69 66 28 20 63 3d 3d 27 5c 6e 27 20 29 7b 0a   if( c=='\n' ){.
a340: 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e          raw_prin
a350: 74 66 28 6f 75 74 2c 20 22 25 73 22 2c 20 7a 4e  tf(out, "%s", zN
a360: 4c 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74  L);.        cont
a370: 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20  inue;.      }.  
a380: 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f      raw_printf(o
a390: 75 74 2c 20 22 25 73 22 2c 20 7a 43 52 29 3b 0a  ut, "%s", zCR);.
a3a0: 20 20 20 20 7d 0a 20 20 20 20 72 61 77 5f 70 72      }.    raw_pr
a3b0: 69 6e 74 66 28 6f 75 74 2c 20 22 27 22 29 3b 0a  intf(out, "'");.
a3c0: 20 20 20 20 69 66 28 20 6e 43 52 20 29 7b 0a 20      if( nCR ){. 
a3d0: 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
a3e0: 6f 75 74 2c 20 22 2c 27 25 73 27 2c 63 68 61 72  out, ",'%s',char
a3f0: 28 31 33 29 29 22 2c 20 7a 43 52 29 3b 0a 20 20  (13))", zCR);.  
a400: 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 4e 4c 20    }.    if( nNL 
a410: 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69  ){.      raw_pri
a420: 6e 74 66 28 6f 75 74 2c 20 22 2c 27 25 73 27 2c  ntf(out, ",'%s',
a430: 63 68 61 72 28 31 30 29 29 22 2c 20 7a 4e 4c 29  char(10))", zNL)
a440: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 65  ;.    }.  }.  se
a450: 74 54 65 78 74 4d 6f 64 65 28 6f 75 74 2c 20 31  tTextMode(out, 1
a460: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 75 74 70  );.}../*.** Outp
a470: 75 74 20 74 68 65 20 67 69 76 65 6e 20 73 74 72  ut the given str
a480: 69 6e 67 20 61 73 20 61 20 71 75 6f 74 65 64 20  ing as a quoted 
a490: 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 43 20 6f  according to C o
a4a0: 72 20 54 43 4c 20 71 75 6f 74 69 6e 67 20 72 75  r TCL quoting ru
a4b0: 6c 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  les..*/.static v
a4c0: 6f 69 64 20 6f 75 74 70 75 74 5f 63 5f 73 74 72  oid output_c_str
a4d0: 69 6e 67 28 46 49 4c 45 20 2a 6f 75 74 2c 20 63  ing(FILE *out, c
a4e0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20  onst char *z){. 
a4f0: 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 63 3b   unsigned int c;
a500: 0a 20 20 66 70 75 74 63 28 27 22 27 2c 20 6f 75  .  fputc('"', ou
a510: 74 29 3b 0a 20 20 77 68 69 6c 65 28 20 28 63 20  t);.  while( (c 
a520: 3d 20 2a 28 7a 2b 2b 29 29 21 3d 30 20 29 7b 0a  = *(z++))!=0 ){.
a530: 20 20 20 20 69 66 28 20 63 3d 3d 27 5c 5c 27 20      if( c=='\\' 
a540: 29 7b 0a 20 20 20 20 20 20 66 70 75 74 63 28 63  ){.      fputc(c
a550: 2c 20 6f 75 74 29 3b 0a 20 20 20 20 20 20 66 70  , out);.      fp
a560: 75 74 63 28 63 2c 20 6f 75 74 29 3b 0a 20 20 20  utc(c, out);.   
a570: 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 22   }else if( c=='"
a580: 27 20 29 7b 0a 20 20 20 20 20 20 66 70 75 74 63  ' ){.      fputc
a590: 28 27 5c 5c 27 2c 20 6f 75 74 29 3b 0a 20 20 20  ('\\', out);.   
a5a0: 20 20 20 66 70 75 74 63 28 27 22 27 2c 20 6f 75     fputc('"', ou
a5b0: 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  t);.    }else if
a5c0: 28 20 63 3d 3d 27 5c 74 27 20 29 7b 0a 20 20 20  ( c=='\t' ){.   
a5d0: 20 20 20 66 70 75 74 63 28 27 5c 5c 27 2c 20 6f     fputc('\\', o
a5e0: 75 74 29 3b 0a 20 20 20 20 20 20 66 70 75 74 63  ut);.      fputc
a5f0: 28 27 74 27 2c 20 6f 75 74 29 3b 0a 20 20 20 20  ('t', out);.    
a600: 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 5c 6e  }else if( c=='\n
a610: 27 20 29 7b 0a 20 20 20 20 20 20 66 70 75 74 63  ' ){.      fputc
a620: 28 27 5c 5c 27 2c 20 6f 75 74 29 3b 0a 20 20 20  ('\\', out);.   
a630: 20 20 20 66 70 75 74 63 28 27 6e 27 2c 20 6f 75     fputc('n', ou
a640: 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  t);.    }else if
a650: 28 20 63 3d 3d 27 5c 72 27 20 29 7b 0a 20 20 20  ( c=='\r' ){.   
a660: 20 20 20 66 70 75 74 63 28 27 5c 5c 27 2c 20 6f     fputc('\\', o
a670: 75 74 29 3b 0a 20 20 20 20 20 20 66 70 75 74 63  ut);.      fputc
a680: 28 27 72 27 2c 20 6f 75 74 29 3b 0a 20 20 20 20  ('r', out);.    
a690: 7d 65 6c 73 65 20 69 66 28 20 21 69 73 70 72 69  }else if( !ispri
a6a0: 6e 74 28 63 26 30 78 66 66 29 20 29 7b 0a 20 20  nt(c&0xff) ){.  
a6b0: 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f      raw_printf(o
a6c0: 75 74 2c 20 22 5c 5c 25 30 33 6f 22 2c 20 63 26  ut, "\\%03o", c&
a6d0: 30 78 66 66 29 3b 0a 20 20 20 20 7d 65 6c 73 65  0xff);.    }else
a6e0: 7b 0a 20 20 20 20 20 20 66 70 75 74 63 28 63 2c  {.      fputc(c,
a6f0: 20 6f 75 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d   out);.    }.  }
a700: 0a 20 20 66 70 75 74 63 28 27 22 27 2c 20 6f 75  .  fputc('"', ou
a710: 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 75 74  t);.}../*.** Out
a720: 70 75 74 20 74 68 65 20 67 69 76 65 6e 20 73 74  put the given st
a730: 72 69 6e 67 20 77 69 74 68 20 63 68 61 72 61 63  ring with charac
a740: 74 65 72 73 20 74 68 61 74 20 61 72 65 20 73 70  ters that are sp
a750: 65 63 69 61 6c 20 74 6f 0a 2a 2a 20 48 54 4d 4c  ecial to.** HTML
a760: 20 65 73 63 61 70 65 64 2e 0a 2a 2f 0a 73 74 61   escaped..*/.sta
a770: 74 69 63 20 76 6f 69 64 20 6f 75 74 70 75 74 5f  tic void output_
a780: 68 74 6d 6c 5f 73 74 72 69 6e 67 28 46 49 4c 45  html_string(FILE
a790: 20 2a 6f 75 74 2c 20 63 6f 6e 73 74 20 63 68 61   *out, const cha
a7a0: 72 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  r *z){.  int i;.
a7b0: 20 20 69 66 28 20 7a 3d 3d 30 20 29 20 7a 20 3d    if( z==0 ) z =
a7c0: 20 22 22 3b 0a 20 20 77 68 69 6c 65 28 20 2a 7a   "";.  while( *z
a7d0: 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   ){.    for(i=0;
a7e0: 20 20 20 7a 5b 69 5d 0a 20 20 20 20 20 20 20 20     z[i].        
a7f0: 20 20 20 20 26 26 20 7a 5b 69 5d 21 3d 27 3c 27      && z[i]!='<'
a800: 0a 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20  .            && 
a810: 7a 5b 69 5d 21 3d 27 26 27 0a 20 20 20 20 20 20  z[i]!='&'.      
a820: 20 20 20 20 20 20 26 26 20 7a 5b 69 5d 21 3d 27        && z[i]!='
a830: 3e 27 0a 20 20 20 20 20 20 20 20 20 20 20 20 26  >'.            &
a840: 26 20 7a 5b 69 5d 21 3d 27 5c 22 27 0a 20 20 20  & z[i]!='\"'.   
a850: 20 20 20 20 20 20 20 20 20 26 26 20 7a 5b 69 5d           && z[i]
a860: 21 3d 27 5c 27 27 3b 0a 20 20 20 20 20 20 20 20  !='\'';.        
a870: 69 2b 2b 29 7b 7d 0a 20 20 20 20 69 66 28 20 69  i++){}.    if( i
a880: 3e 30 20 29 7b 0a 20 20 20 20 20 20 75 74 66 38  >0 ){.      utf8
a890: 5f 70 72 69 6e 74 66 28 6f 75 74 2c 22 25 2e 2a  _printf(out,"%.*
a8a0: 73 22 2c 69 2c 7a 29 3b 0a 20 20 20 20 7d 0a 20  s",i,z);.    }. 
a8b0: 20 20 20 69 66 28 20 7a 5b 69 5d 3d 3d 27 3c 27     if( z[i]=='<'
a8c0: 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72   ){.      raw_pr
a8d0: 69 6e 74 66 28 6f 75 74 2c 22 26 6c 74 3b 22 29  intf(out,"&lt;")
a8e0: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
a8f0: 7a 5b 69 5d 3d 3d 27 26 27 20 29 7b 0a 20 20 20  z[i]=='&' ){.   
a900: 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75     raw_printf(ou
a910: 74 2c 22 26 61 6d 70 3b 22 29 3b 0a 20 20 20 20  t,"&amp;");.    
a920: 7d 65 6c 73 65 20 69 66 28 20 7a 5b 69 5d 3d 3d  }else if( z[i]==
a930: 27 3e 27 20 29 7b 0a 20 20 20 20 20 20 72 61 77  '>' ){.      raw
a940: 5f 70 72 69 6e 74 66 28 6f 75 74 2c 22 26 67 74  _printf(out,"&gt
a950: 3b 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  ;");.    }else i
a960: 66 28 20 7a 5b 69 5d 3d 3d 27 5c 22 27 20 29 7b  f( z[i]=='\"' ){
a970: 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74  .      raw_print
a980: 66 28 6f 75 74 2c 22 26 71 75 6f 74 3b 22 29 3b  f(out,"&quot;");
a990: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 7a  .    }else if( z
a9a0: 5b 69 5d 3d 3d 27 5c 27 27 20 29 7b 0a 20 20 20  [i]=='\'' ){.   
a9b0: 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75     raw_printf(ou
a9c0: 74 2c 22 26 23 33 39 3b 22 29 3b 0a 20 20 20 20  t,"&#39;");.    
a9d0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 62 72 65  }else{.      bre
a9e0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 20  ak;.    }.    z 
a9f0: 2b 3d 20 69 20 2b 20 31 3b 0a 20 20 7d 0a 7d 0a  += i + 1;.  }.}.
aa00: 0a 2f 2a 0a 2a 2a 20 49 66 20 61 20 66 69 65 6c  ./*.** If a fiel
aa10: 64 20 63 6f 6e 74 61 69 6e 73 20 61 6e 79 20 63  d contains any c
aa20: 68 61 72 61 63 74 65 72 20 69 64 65 6e 74 69 66  haracter identif
aa30: 69 65 64 20 62 79 20 61 20 31 20 69 6e 20 74 68  ied by a 1 in th
aa40: 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 61  e following.** a
aa50: 72 72 61 79 2c 20 74 68 65 6e 20 74 68 65 20 73  rray, then the s
aa60: 74 72 69 6e 67 20 6d 75 73 74 20 62 65 20 71 75  tring must be qu
aa70: 6f 74 65 64 20 66 6f 72 20 43 53 56 2e 0a 2a 2f  oted for CSV..*/
aa80: 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68  .static const ch
aa90: 61 72 20 6e 65 65 64 43 73 76 51 75 6f 74 65 5b  ar needCsvQuote[
aaa0: 5d 20 3d 20 7b 0a 20 20 31 2c 20 31 2c 20 31 2c  ] = {.  1, 1, 1,
aab0: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
aac0: 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c    1, 1, 1, 1, 1,
aad0: 20 31 2c 20 31 2c 20 31 2c 0a 20 20 31 2c 20 31   1, 1, 1,.  1, 1
aae0: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c  , 1, 1, 1, 1, 1,
aaf0: 20 31 2c 20 20 20 31 2c 20 31 2c 20 31 2c 20 31   1,   1, 1, 1, 1
ab00: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 0a 20 20  , 1, 1, 1, 1,.  
ab10: 31 2c 20 30 2c 20 31 2c 20 30 2c 20 30 2c 20 30  1, 0, 1, 0, 0, 0
ab20: 2c 20 30 2c 20 31 2c 20 20 20 30 2c 20 30 2c 20  , 0, 1,   0, 0, 
ab30: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
ab40: 2c 0a 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20  ,.  0, 0, 0, 0, 
ab50: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 20 20 30 2c  0, 0, 0, 0,   0,
ab60: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
ab70: 30 2c 20 30 2c 0a 20 20 30 2c 20 30 2c 20 30 2c  0, 0,.  0, 0, 0,
ab80: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
ab90: 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c    0, 0, 0, 0, 0,
aba0: 20 30 2c 20 30 2c 20 30 2c 0a 20 20 30 2c 20 30   0, 0, 0,.  0, 0
abb0: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
abc0: 20 30 2c 20 20 20 30 2c 20 30 2c 20 30 2c 20 30   0,   0, 0, 0, 0
abd0: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 0a 20 20  , 0, 0, 0, 0,.  
abe0: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
abf0: 2c 20 30 2c 20 30 2c 20 20 20 30 2c 20 30 2c 20  , 0, 0,   0, 0, 
ac00: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
ac10: 2c 0a 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20  ,.  0, 0, 0, 0, 
ac20: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 20 20 30 2c  0, 0, 0, 0,   0,
ac30: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
ac40: 30 2c 20 31 2c 0a 20 20 31 2c 20 31 2c 20 31 2c  0, 1,.  1, 1, 1,
ac50: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
ac60: 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c    1, 1, 1, 1, 1,
ac70: 20 31 2c 20 31 2c 20 31 2c 0a 20 20 31 2c 20 31   1, 1, 1,.  1, 1
ac80: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c  , 1, 1, 1, 1, 1,
ac90: 20 31 2c 20 20 20 31 2c 20 31 2c 20 31 2c 20 31   1,   1, 1, 1, 1
aca0: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 0a 20 20  , 1, 1, 1, 1,.  
acb0: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
acc0: 2c 20 31 2c 20 31 2c 20 20 20 31 2c 20 31 2c 20  , 1, 1,   1, 1, 
acd0: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
ace0: 2c 0a 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20  ,.  1, 1, 1, 1, 
acf0: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 20 20 31 2c  1, 1, 1, 1,   1,
ad00: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
ad10: 31 2c 20 31 2c 0a 20 20 31 2c 20 31 2c 20 31 2c  1, 1,.  1, 1, 1,
ad20: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
ad30: 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c    1, 1, 1, 1, 1,
ad40: 20 31 2c 20 31 2c 20 31 2c 0a 20 20 31 2c 20 31   1, 1, 1,.  1, 1
ad50: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c  , 1, 1, 1, 1, 1,
ad60: 20 31 2c 20 20 20 31 2c 20 31 2c 20 31 2c 20 31   1,   1, 1, 1, 1
ad70: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 0a 20 20  , 1, 1, 1, 1,.  
ad80: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
ad90: 2c 20 31 2c 20 31 2c 20 20 20 31 2c 20 31 2c 20  , 1, 1,   1, 1, 
ada0: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
adb0: 2c 0a 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20  ,.  1, 1, 1, 1, 
adc0: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 20 20 31 2c  1, 1, 1, 1,   1,
add0: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
ade0: 31 2c 20 31 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  1, 1,.};../*.** 
adf0: 4f 75 74 70 75 74 20 61 20 73 69 6e 67 6c 65 20  Output a single 
ae00: 74 65 72 6d 20 6f 66 20 43 53 56 2e 20 20 41 63  term of CSV.  Ac
ae10: 74 75 61 6c 6c 79 2c 20 70 2d 3e 63 6f 6c 53 65  tually, p->colSe
ae20: 70 61 72 61 74 6f 72 20 69 73 20 75 73 65 64 20  parator is used 
ae30: 66 6f 72 0a 2a 2a 20 74 68 65 20 73 65 70 61 72  for.** the separ
ae40: 61 74 6f 72 2c 20 77 68 69 63 68 20 6d 61 79 20  ator, which may 
ae50: 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 61 20  or may not be a 
ae60: 63 6f 6d 6d 61 2e 20 20 70 2d 3e 6e 75 6c 6c 56  comma.  p->nullV
ae70: 61 6c 75 65 20 69 73 0a 2a 2a 20 74 68 65 20 6e  alue is.** the n
ae80: 75 6c 6c 20 76 61 6c 75 65 2e 20 20 53 74 72 69  ull value.  Stri
ae90: 6e 67 73 20 61 72 65 20 71 75 6f 74 65 64 20 69  ngs are quoted i
aea0: 66 20 6e 65 63 65 73 73 61 72 79 2e 20 20 54 68  f necessary.  Th
aeb0: 65 20 73 65 70 61 72 61 74 6f 72 0a 2a 2a 20 69  e separator.** i
aec0: 73 20 6f 6e 6c 79 20 69 73 73 75 65 64 20 69 66  s only issued if
aed0: 20 62 53 65 70 20 69 73 20 74 72 75 65 2e 0a 2a   bSep is true..*
aee0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6f 75  /.static void ou
aef0: 74 70 75 74 5f 63 73 76 28 53 68 65 6c 6c 53 74  tput_csv(ShellSt
af00: 61 74 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68  ate *p, const ch
af10: 61 72 20 2a 7a 2c 20 69 6e 74 20 62 53 65 70 29  ar *z, int bSep)
af20: 7b 0a 20 20 46 49 4c 45 20 2a 6f 75 74 20 3d 20  {.  FILE *out = 
af30: 70 2d 3e 6f 75 74 3b 0a 20 20 69 66 28 20 7a 3d  p->out;.  if( z=
af40: 3d 30 20 29 7b 0a 20 20 20 20 75 74 66 38 5f 70  =0 ){.    utf8_p
af50: 72 69 6e 74 66 28 6f 75 74 2c 22 25 73 22 2c 70  rintf(out,"%s",p
af60: 2d 3e 6e 75 6c 6c 56 61 6c 75 65 29 3b 0a 20 20  ->nullValue);.  
af70: 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 69  }else{.    int i
af80: 3b 0a 20 20 20 20 69 6e 74 20 6e 53 65 70 20 3d  ;.    int nSep =
af90: 20 73 74 72 6c 65 6e 33 30 28 70 2d 3e 63 6f 6c   strlen30(p->col
afa0: 53 65 70 61 72 61 74 6f 72 29 3b 0a 20 20 20 20  Separator);.    
afb0: 66 6f 72 28 69 3d 30 3b 20 7a 5b 69 5d 3b 20 69  for(i=0; z[i]; i
afc0: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e  ++){.      if( n
afd0: 65 65 64 43 73 76 51 75 6f 74 65 5b 28 28 75 6e  eedCsvQuote[((un
afe0: 73 69 67 6e 65 64 20 63 68 61 72 2a 29 7a 29 5b  signed char*)z)[
aff0: 69 5d 5d 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  i]].         || 
b000: 28 7a 5b 69 5d 3d 3d 70 2d 3e 63 6f 6c 53 65 70  (z[i]==p->colSep
b010: 61 72 61 74 6f 72 5b 30 5d 20 26 26 0a 20 20 20  arator[0] &&.   
b020: 20 20 20 20 20 20 20 20 20 20 28 6e 53 65 70 3d            (nSep=
b030: 3d 31 20 7c 7c 20 6d 65 6d 63 6d 70 28 7a 2c 20  =1 || memcmp(z, 
b040: 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 2c  p->colSeparator,
b050: 20 6e 53 65 70 29 3d 3d 30 29 29 20 29 7b 0a 20   nSep)==0)) ){. 
b060: 20 20 20 20 20 20 20 69 20 3d 20 30 3b 0a 20 20         i = 0;.  
b070: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
b080: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
b090: 66 28 20 69 3d 3d 30 20 29 7b 0a 20 20 20 20 20  f( i==0 ){.     
b0a0: 20 63 68 61 72 20 2a 7a 51 75 6f 74 65 64 20 3d   char *zQuoted =
b0b0: 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
b0c0: 28 22 5c 22 25 77 5c 22 22 2c 20 7a 29 3b 0a 20  ("\"%w\"", z);. 
b0d0: 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
b0e0: 28 6f 75 74 2c 20 22 25 73 22 2c 20 7a 51 75 6f  (out, "%s", zQuo
b0f0: 74 65 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ted);.      sqli
b100: 74 65 33 5f 66 72 65 65 28 7a 51 75 6f 74 65 64  te3_free(zQuoted
b110: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
b120: 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
b130: 6f 75 74 2c 20 22 25 73 22 2c 20 7a 29 3b 0a 20  out, "%s", z);. 
b140: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 62     }.  }.  if( b
b150: 53 65 70 20 29 7b 0a 20 20 20 20 75 74 66 38 5f  Sep ){.    utf8_
b160: 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
b170: 25 73 22 2c 20 70 2d 3e 63 6f 6c 53 65 70 61 72  %s", p->colSepar
b180: 61 74 6f 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  ator);.  }.}../*
b190: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
b1a0: 20 72 75 6e 73 20 77 68 65 6e 20 74 68 65 20 75   runs when the u
b1b0: 73 65 72 20 70 72 65 73 73 65 73 20 43 74 72 6c  ser presses Ctrl
b1c0: 2d 43 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  -C.*/.static voi
b1d0: 64 20 69 6e 74 65 72 72 75 70 74 5f 68 61 6e 64  d interrupt_hand
b1e0: 6c 65 72 28 69 6e 74 20 4e 6f 74 55 73 65 64 29  ler(int NotUsed)
b1f0: 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  {.  UNUSED_PARAM
b200: 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20  ETER(NotUsed);. 
b210: 20 73 65 65 6e 49 6e 74 65 72 72 75 70 74 2b 2b   seenInterrupt++
b220: 3b 0a 20 20 69 66 28 20 73 65 65 6e 49 6e 74 65  ;.  if( seenInte
b230: 72 72 75 70 74 3e 32 20 29 20 65 78 69 74 28 31  rrupt>2 ) exit(1
b240: 29 3b 0a 20 20 69 66 28 20 67 6c 6f 62 61 6c 44  );.  if( globalD
b250: 62 20 29 20 73 71 6c 69 74 65 33 5f 69 6e 74 65  b ) sqlite3_inte
b260: 72 72 75 70 74 28 67 6c 6f 62 61 6c 44 62 29 3b  rrupt(globalDb);
b270: 0a 7d 0a 0a 23 69 66 20 28 64 65 66 69 6e 65 64  .}..#if (defined
b280: 28 5f 57 49 4e 33 32 29 20 7c 7c 20 64 65 66 69  (_WIN32) || defi
b290: 6e 65 64 28 57 49 4e 33 32 29 29 20 26 26 20 21  ned(WIN32)) && !
b2a0: 64 65 66 69 6e 65 64 28 5f 57 49 4e 33 32 5f 57  defined(_WIN32_W
b2b0: 43 45 29 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  CE)./*.** This r
b2c0: 6f 75 74 69 6e 65 20 72 75 6e 73 20 66 6f 72 20  outine runs for 
b2d0: 63 6f 6e 73 6f 6c 65 20 65 76 65 6e 74 73 20 28  console events (
b2e0: 65 2e 67 2e 20 43 74 72 6c 2d 43 29 20 6f 6e 20  e.g. Ctrl-C) on 
b2f0: 57 69 6e 33 32 0a 2a 2f 0a 73 74 61 74 69 63 20  Win32.*/.static 
b300: 42 4f 4f 4c 20 57 49 4e 41 50 49 20 43 6f 6e 73  BOOL WINAPI Cons
b310: 6f 6c 65 43 74 72 6c 48 61 6e 64 6c 65 72 28 0a  oleCtrlHandler(.
b320: 20 20 44 57 4f 52 44 20 64 77 43 74 72 6c 54 79    DWORD dwCtrlTy
b330: 70 65 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65  pe /* One of the
b340: 20 43 54 52 4c 5f 2a 5f 45 56 45 4e 54 20 63 6f   CTRL_*_EVENT co
b350: 6e 73 74 61 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20  nstants */.){.  
b360: 69 66 28 20 64 77 43 74 72 6c 54 79 70 65 3d 3d  if( dwCtrlType==
b370: 43 54 52 4c 5f 43 5f 45 56 45 4e 54 20 29 7b 0a  CTRL_C_EVENT ){.
b380: 20 20 20 20 69 6e 74 65 72 72 75 70 74 5f 68 61      interrupt_ha
b390: 6e 64 6c 65 72 28 30 29 3b 0a 20 20 20 20 72 65  ndler(0);.    re
b3a0: 74 75 72 6e 20 54 52 55 45 3b 0a 20 20 7d 0a 20  turn TRUE;.  }. 
b3b0: 20 72 65 74 75 72 6e 20 46 41 4c 53 45 3b 0a 7d   return FALSE;.}
b3c0: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66  .#endif..#ifndef
b3d0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
b3e0: 48 4f 52 49 5a 41 54 49 4f 4e 0a 2f 2a 0a 2a 2a  HORIZATION./*.**
b3f0: 20 57 68 65 6e 20 74 68 65 20 22 2e 61 75 74 68   When the ".auth
b400: 20 4f 4e 22 20 69 73 20 73 65 74 2c 20 74 68 65   ON" is set, the
b410: 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 75 74 68 6f   following autho
b420: 72 69 7a 65 72 20 63 61 6c 6c 62 61 63 6b 20 69  rizer callback i
b430: 73 0a 2a 2a 20 69 6e 76 6f 6b 65 64 2e 20 20 49  s.** invoked.  I
b440: 74 20 61 6c 77 61 79 73 20 72 65 74 75 72 6e 73  t always returns
b450: 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73   SQLITE_OK..*/.s
b460: 74 61 74 69 63 20 69 6e 74 20 73 68 65 6c 6c 41  tatic int shellA
b470: 75 74 68 28 0a 20 20 76 6f 69 64 20 2a 70 43 6c  uth(.  void *pCl
b480: 69 65 6e 74 44 61 74 61 2c 0a 20 20 69 6e 74 20  ientData,.  int 
b490: 6f 70 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  op,.  const char
b4a0: 20 2a 7a 41 31 2c 0a 20 20 63 6f 6e 73 74 20 63   *zA1,.  const c
b4b0: 68 61 72 20 2a 7a 41 32 2c 0a 20 20 63 6f 6e 73  har *zA2,.  cons
b4c0: 74 20 63 68 61 72 20 2a 7a 41 33 2c 0a 20 20 63  t char *zA3,.  c
b4d0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 34 0a 29  onst char *zA4.)
b4e0: 7b 0a 20 20 53 68 65 6c 6c 53 74 61 74 65 20 2a  {.  ShellState *
b4f0: 70 20 3d 20 28 53 68 65 6c 6c 53 74 61 74 65 2a  p = (ShellState*
b500: 29 70 43 6c 69 65 6e 74 44 61 74 61 3b 0a 20 20  )pClientData;.  
b510: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
b520: 72 20 2a 61 7a 41 63 74 69 6f 6e 5b 5d 20 3d 20  r *azAction[] = 
b530: 7b 20 30 2c 0a 20 20 20 20 20 22 43 52 45 41 54  { 0,.     "CREAT
b540: 45 5f 49 4e 44 45 58 22 2c 20 20 20 20 20 20 20  E_INDEX",       
b550: 20 20 22 43 52 45 41 54 45 5f 54 41 42 4c 45 22    "CREATE_TABLE"
b560: 2c 20 20 20 20 20 20 20 20 20 22 43 52 45 41 54  ,         "CREAT
b570: 45 5f 54 45 4d 50 5f 49 4e 44 45 58 22 2c 0a 20  E_TEMP_INDEX",. 
b580: 20 20 20 20 22 43 52 45 41 54 45 5f 54 45 4d 50      "CREATE_TEMP
b590: 5f 54 41 42 4c 45 22 2c 20 20 20 20 22 43 52 45  _TABLE",    "CRE
b5a0: 41 54 45 5f 54 45 4d 50 5f 54 52 49 47 47 45 52  ATE_TEMP_TRIGGER
b5b0: 22 2c 20 20 22 43 52 45 41 54 45 5f 54 45 4d 50  ",  "CREATE_TEMP
b5c0: 5f 56 49 45 57 22 2c 0a 20 20 20 20 20 22 43 52  _VIEW",.     "CR
b5d0: 45 41 54 45 5f 54 52 49 47 47 45 52 22 2c 20 20  EATE_TRIGGER",  
b5e0: 20 20 20 20 20 22 43 52 45 41 54 45 5f 56 49 45       "CREATE_VIE
b5f0: 57 22 2c 20 20 20 20 20 20 20 20 20 20 22 44 45  W",          "DE
b600: 4c 45 54 45 22 2c 0a 20 20 20 20 20 22 44 52 4f  LETE",.     "DRO
b610: 50 5f 49 4e 44 45 58 22 2c 20 20 20 20 20 20 20  P_INDEX",       
b620: 20 20 20 20 22 44 52 4f 50 5f 54 41 42 4c 45 22      "DROP_TABLE"
b630: 2c 20 20 20 20 20 20 20 20 20 20 20 22 44 52 4f  ,           "DRO
b640: 50 5f 54 45 4d 50 5f 49 4e 44 45 58 22 2c 0a 20  P_TEMP_INDEX",. 
b650: 20 20 20 20 22 44 52 4f 50 5f 54 45 4d 50 5f 54      "DROP_TEMP_T
b660: 41 42 4c 45 22 2c 20 20 20 20 20 20 22 44 52 4f  ABLE",      "DRO
b670: 50 5f 54 45 4d 50 5f 54 52 49 47 47 45 52 22 2c  P_TEMP_TRIGGER",
b680: 20 20 20 20 22 44 52 4f 50 5f 54 45 4d 50 5f 56      "DROP_TEMP_V
b690: 49 45 57 22 2c 0a 20 20 20 20 20 22 44 52 4f 50  IEW",.     "DROP
b6a0: 5f 54 52 49 47 47 45 52 22 2c 20 20 20 20 20 20  _TRIGGER",      
b6b0: 20 20 20 22 44 52 4f 50 5f 56 49 45 57 22 2c 20     "DROP_VIEW", 
b6c0: 20 20 20 20 20 20 20 20 20 20 20 22 49 4e 53 45             "INSE
b6d0: 52 54 22 2c 0a 20 20 20 20 20 22 50 52 41 47 4d  RT",.     "PRAGM
b6e0: 41 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  A",             
b6f0: 20 20 22 52 45 41 44 22 2c 20 20 20 20 20 20 20    "READ",       
b700: 20 20 20 20 20 20 20 20 20 20 22 53 45 4c 45 43            "SELEC
b710: 54 22 2c 0a 20 20 20 20 20 22 54 52 41 4e 53 41  T",.     "TRANSA
b720: 43 54 49 4f 4e 22 2c 20 20 20 20 20 20 20 20 20  CTION",         
b730: 20 22 55 50 44 41 54 45 22 2c 20 20 20 20 20 20   "UPDATE",      
b740: 20 20 20 20 20 20 20 20 20 22 41 54 54 41 43 48           "ATTACH
b750: 22 2c 0a 20 20 20 20 20 22 44 45 54 41 43 48 22  ",.     "DETACH"
b760: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
b770: 22 41 4c 54 45 52 5f 54 41 42 4c 45 22 2c 20 20  "ALTER_TABLE",  
b780: 20 20 20 20 20 20 20 20 22 52 45 49 4e 44 45 58          "REINDEX
b790: 22 2c 0a 20 20 20 20 20 22 41 4e 41 4c 59 5a 45  ",.     "ANALYZE
b7a0: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
b7b0: 22 43 52 45 41 54 45 5f 56 54 41 42 4c 45 22 2c  "CREATE_VTABLE",
b7c0: 20 20 20 20 20 20 20 20 22 44 52 4f 50 5f 56 54          "DROP_VT
b7d0: 41 42 4c 45 22 2c 0a 20 20 20 20 20 22 46 55 4e  ABLE",.     "FUN
b7e0: 43 54 49 4f 4e 22 2c 20 20 20 20 20 20 20 20 20  CTION",         
b7f0: 20 20 20 20 22 53 41 56 45 50 4f 49 4e 54 22 2c      "SAVEPOINT",
b800: 20 20 20 20 20 20 20 20 20 20 20 20 22 52 45 43              "REC
b810: 55 52 53 49 56 45 22 0a 20 20 7d 3b 0a 20 20 69  URSIVE".  };.  i
b820: 6e 74 20 69 3b 0a 20 20 63 6f 6e 73 74 20 63 68  nt i;.  const ch
b830: 61 72 20 2a 61 7a 5b 34 5d 3b 0a 20 20 61 7a 5b  ar *az[4];.  az[
b840: 30 5d 20 3d 20 7a 41 31 3b 0a 20 20 61 7a 5b 31  0] = zA1;.  az[1
b850: 5d 20 3d 20 7a 41 32 3b 0a 20 20 61 7a 5b 32 5d  ] = zA2;.  az[2]
b860: 20 3d 20 7a 41 33 3b 0a 20 20 61 7a 5b 33 5d 20   = zA3;.  az[3] 
b870: 3d 20 7a 41 34 3b 0a 20 20 75 74 66 38 5f 70 72  = zA4;.  utf8_pr
b880: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 61 75  intf(p->out, "au
b890: 74 68 6f 72 69 7a 65 72 3a 20 25 73 22 2c 20 61  thorizer: %s", a
b8a0: 7a 41 63 74 69 6f 6e 5b 6f 70 5d 29 3b 0a 20 20  zAction[op]);.  
b8b0: 66 6f 72 28 69 3d 30 3b 20 69 3c 34 3b 20 69 2b  for(i=0; i<4; i+
b8c0: 2b 29 7b 0a 20 20 20 20 72 61 77 5f 70 72 69 6e  +){.    raw_prin
b8d0: 74 66 28 70 2d 3e 6f 75 74 2c 20 22 20 22 29 3b  tf(p->out, " ");
b8e0: 0a 20 20 20 20 69 66 28 20 61 7a 5b 69 5d 20 29  .    if( az[i] )
b8f0: 7b 0a 20 20 20 20 20 20 6f 75 74 70 75 74 5f 63  {.      output_c
b900: 5f 73 74 72 69 6e 67 28 70 2d 3e 6f 75 74 2c 20  _string(p->out, 
b910: 61 7a 5b 69 5d 29 3b 0a 20 20 20 20 7d 65 6c 73  az[i]);.    }els
b920: 65 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69  e{.      raw_pri
b930: 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 4e 55 4c  ntf(p->out, "NUL
b940: 4c 22 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  L");.    }.  }. 
b950: 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f   raw_printf(p->o
b960: 75 74 2c 20 22 5c 6e 22 29 3b 0a 20 20 72 65 74  ut, "\n");.  ret
b970: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
b980: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 50  .#endif../*.** P
b990: 72 69 6e 74 20 61 20 73 63 68 65 6d 61 20 73 74  rint a schema st
b9a0: 61 74 65 6d 65 6e 74 2e 20 20 50 61 72 74 20 6f  atement.  Part o
b9b0: 66 20 4d 4f 44 45 5f 53 65 6d 69 20 61 6e 64 20  f MODE_Semi and 
b9c0: 4d 4f 44 45 5f 50 72 65 74 74 79 20 6f 75 74 70  MODE_Pretty outp
b9d0: 75 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ut..**.** This r
b9e0: 6f 75 74 69 6e 65 20 63 6f 6e 76 65 72 74 73 20  outine converts 
b9f0: 73 6f 6d 65 20 43 52 45 41 54 45 20 54 41 42 4c  some CREATE TABL
ba00: 45 20 73 74 61 74 65 6d 65 6e 74 73 20 66 6f 72  E statements for
ba10: 20 73 68 61 64 6f 77 20 74 61 62 6c 65 73 0a 2a   shadow tables.*
ba20: 2a 20 69 6e 20 46 54 53 33 2f 34 2f 35 20 69 6e  * in FTS3/4/5 in
ba30: 74 6f 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  to CREATE TABLE 
ba40: 49 46 20 4e 4f 54 20 45 58 49 53 54 53 20 73 74  IF NOT EXISTS st
ba50: 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 73 74 61  atements..*/.sta
ba60: 74 69 63 20 76 6f 69 64 20 70 72 69 6e 74 53 63  tic void printSc
ba70: 68 65 6d 61 4c 69 6e 65 28 46 49 4c 45 20 2a 6f  hemaLine(FILE *o
ba80: 75 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ut, const char *
ba90: 7a 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  z, const char *z
baa0: 54 61 69 6c 29 7b 0a 20 20 69 66 28 20 73 71 6c  Tail){.  if( sql
bab0: 69 74 65 33 5f 73 74 72 67 6c 6f 62 28 22 43 52  ite3_strglob("CR
bac0: 45 41 54 45 20 54 41 42 4c 45 20 5b 27 5c 22 5d  EATE TABLE ['\"]
bad0: 2a 22 2c 20 7a 29 3d 3d 30 20 29 7b 0a 20 20 20  *", z)==0 ){.   
bae0: 20 75 74 66 38 5f 70 72 69 6e 74 66 28 6f 75 74   utf8_printf(out
baf0: 2c 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20  , "CREATE TABLE 
bb00: 49 46 20 4e 4f 54 20 45 58 49 53 54 53 20 25 73  IF NOT EXISTS %s
bb10: 25 73 22 2c 20 7a 2b 31 33 2c 20 7a 54 61 69 6c  %s", z+13, zTail
bb20: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
bb30: 75 74 66 38 5f 70 72 69 6e 74 66 28 6f 75 74 2c  utf8_printf(out,
bb40: 20 22 25 73 25 73 22 2c 20 7a 2c 20 7a 54 61 69   "%s%s", z, zTai
bb50: 6c 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63  l);.  }.}.static
bb60: 20 76 6f 69 64 20 70 72 69 6e 74 53 63 68 65 6d   void printSchem
bb70: 61 4c 69 6e 65 4e 28 46 49 4c 45 20 2a 6f 75 74  aLineN(FILE *out
bb80: 2c 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6e  , char *z, int n
bb90: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54  , const char *zT
bba0: 61 69 6c 29 7b 0a 20 20 63 68 61 72 20 63 20 3d  ail){.  char c =
bbb0: 20 7a 5b 6e 5d 3b 0a 20 20 7a 5b 6e 5d 20 3d 20   z[n];.  z[n] = 
bbc0: 30 3b 0a 20 20 70 72 69 6e 74 53 63 68 65 6d 61  0;.  printSchema
bbd0: 4c 69 6e 65 28 6f 75 74 2c 20 7a 2c 20 7a 54 61  Line(out, z, zTa
bbe0: 69 6c 29 3b 0a 20 20 7a 5b 6e 5d 20 3d 20 63 3b  il);.  z[n] = c;
bbf0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
bc00: 20 74 72 75 65 20 69 66 20 73 74 72 69 6e 67 20   true if string 
bc10: 7a 5b 5d 20 68 61 73 20 6e 6f 74 68 69 6e 67 20  z[] has nothing 
bc20: 62 75 74 20 77 68 69 74 65 73 70 61 63 65 20 61  but whitespace a
bc30: 6e 64 20 63 6f 6d 6d 65 6e 74 73 20 74 6f 20 74  nd comments to t
bc40: 68 65 0a 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65  he.** end of the
bc50: 20 66 69 72 73 74 20 6c 69 6e 65 2e 0a 2a 2f 0a   first line..*/.
bc60: 73 74 61 74 69 63 20 69 6e 74 20 77 73 54 6f 45  static int wsToE
bc70: 6f 6c 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  ol(const char *z
bc80: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f  ){.  int i;.  fo
bc90: 72 28 69 3d 30 3b 20 7a 5b 69 5d 3b 20 69 2b 2b  r(i=0; z[i]; i++
bca0: 29 7b 0a 20 20 20 20 69 66 28 20 7a 5b 69 5d 3d  ){.    if( z[i]=
bcb0: 3d 27 5c 6e 27 20 29 20 72 65 74 75 72 6e 20 31  ='\n' ) return 1
bcc0: 3b 0a 20 20 20 20 69 66 28 20 49 73 53 70 61 63  ;.    if( IsSpac
bcd0: 65 28 7a 5b 69 5d 29 20 29 20 63 6f 6e 74 69 6e  e(z[i]) ) contin
bce0: 75 65 3b 0a 20 20 20 20 69 66 28 20 7a 5b 69 5d  ue;.    if( z[i]
bcf0: 3d 3d 27 2d 27 20 26 26 20 7a 5b 69 2b 31 5d 3d  =='-' && z[i+1]=
bd00: 3d 27 2d 27 20 29 20 72 65 74 75 72 6e 20 31 3b  ='-' ) return 1;
bd10: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
bd20: 20 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d   }.  return 1;.}
bd30: 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65  ../*.** Add a ne
bd40: 77 20 65 6e 74 72 79 20 74 6f 20 74 68 65 20 45  w entry to the E
bd50: 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41  XPLAIN QUERY PLA
bd60: 4e 20 64 61 74 61 0a 2a 2f 0a 73 74 61 74 69 63  N data.*/.static
bd70: 20 76 6f 69 64 20 65 71 70 5f 61 70 70 65 6e 64   void eqp_append
bd80: 28 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 2c 20  (ShellState *p, 
bd90: 69 6e 74 20 69 53 65 6c 65 63 74 49 64 2c 20 63  int iSelectId, c
bda0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 65 78 74  onst char *zText
bdb0: 29 7b 0a 20 20 45 51 50 47 72 61 70 68 52 6f 77  ){.  EQPGraphRow
bdc0: 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20 6e 54   *pNew;.  int nT
bdd0: 65 78 74 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a  ext = strlen30(z
bde0: 54 65 78 74 29 3b 0a 20 20 70 4e 65 77 20 3d 20  Text);.  pNew = 
bdf0: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34  sqlite3_malloc64
be00: 28 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20  ( sizeof(*pNew) 
be10: 2b 20 6e 54 65 78 74 20 29 3b 0a 20 20 69 66 28  + nText );.  if(
be20: 20 70 4e 65 77 3d 3d 30 20 29 20 73 68 65 6c 6c   pNew==0 ) shell
be30: 5f 6f 75 74 5f 6f 66 5f 6d 65 6d 6f 72 79 28 29  _out_of_memory()
be40: 3b 0a 20 20 70 4e 65 77 2d 3e 69 53 65 6c 65 63  ;.  pNew->iSelec
be50: 74 49 64 20 3d 20 69 53 65 6c 65 63 74 49 64 3b  tId = iSelectId;
be60: 0a 20 20 6d 65 6d 63 70 79 28 70 4e 65 77 2d 3e  .  memcpy(pNew->
be70: 7a 54 65 78 74 2c 20 7a 54 65 78 74 2c 20 6e 54  zText, zText, nT
be80: 65 78 74 2b 31 29 3b 0a 20 20 70 4e 65 77 2d 3e  ext+1);.  pNew->
be90: 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 69 66 28  pNext = 0;.  if(
bea0: 20 70 2d 3e 73 47 72 61 70 68 2e 70 4c 61 73 74   p->sGraph.pLast
beb0: 20 29 7b 0a 20 20 20 20 70 2d 3e 73 47 72 61 70   ){.    p->sGrap
bec0: 68 2e 70 4c 61 73 74 2d 3e 70 4e 65 78 74 20 3d  h.pLast->pNext =
bed0: 20 70 4e 65 77 3b 0a 20 20 7d 65 6c 73 65 7b 0a   pNew;.  }else{.
bee0: 20 20 20 20 70 2d 3e 73 47 72 61 70 68 2e 70 52      p->sGraph.pR
bef0: 6f 77 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 20  ow = pNew;.  }. 
bf00: 20 70 2d 3e 73 47 72 61 70 68 2e 70 4c 61 73 74   p->sGraph.pLast
bf10: 20 3d 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a   = pNew;.}../*.*
bf20: 2a 20 46 72 65 65 20 61 6e 64 20 72 65 73 65 74  * Free and reset
bf30: 20 74 68 65 20 45 58 50 4c 41 49 4e 20 51 55 45   the EXPLAIN QUE
bf40: 52 59 20 50 4c 41 4e 20 64 61 74 61 20 74 68 61  RY PLAN data tha
bf50: 74 20 68 61 73 20 62 65 65 6e 20 63 6f 6c 6c 65  t has been colle
bf60: 63 74 65 64 0a 2a 2a 20 69 6e 20 70 2d 3e 73 47  cted.** in p->sG
bf70: 72 61 70 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  raph..*/.static 
bf80: 76 6f 69 64 20 65 71 70 5f 72 65 73 65 74 28 53  void eqp_reset(S
bf90: 68 65 6c 6c 53 74 61 74 65 20 2a 70 29 7b 0a 20  hellState *p){. 
bfa0: 20 45 51 50 47 72 61 70 68 52 6f 77 20 2a 70 52   EQPGraphRow *pR
bfb0: 6f 77 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 66 6f  ow, *pNext;.  fo
bfc0: 72 28 70 52 6f 77 20 3d 20 70 2d 3e 73 47 72 61  r(pRow = p->sGra
bfd0: 70 68 2e 70 52 6f 77 3b 20 70 52 6f 77 3b 20 70  ph.pRow; pRow; p
bfe0: 52 6f 77 20 3d 20 70 4e 65 78 74 29 7b 0a 20 20  Row = pNext){.  
bff0: 20 20 70 4e 65 78 74 20 3d 20 70 52 6f 77 2d 3e    pNext = pRow->
c000: 70 4e 65 78 74 3b 0a 20 20 20 20 73 71 6c 69 74  pNext;.    sqlit
c010: 65 33 5f 66 72 65 65 28 70 52 6f 77 29 3b 0a 20  e3_free(pRow);. 
c020: 20 7d 0a 20 20 6d 65 6d 73 65 74 28 26 70 2d 3e   }.  memset(&p->
c030: 73 47 72 61 70 68 2c 20 30 2c 20 73 69 7a 65 6f  sGraph, 0, sizeo
c040: 66 28 70 2d 3e 73 47 72 61 70 68 29 29 3b 0a 7d  f(p->sGraph));.}
c050: 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20  ../* Return the 
c060: 6e 65 78 74 20 45 58 50 4c 41 49 4e 20 51 55 45  next EXPLAIN QUE
c070: 52 59 20 50 4c 41 4e 20 6c 69 6e 65 20 77 69 74  RY PLAN line wit
c080: 68 20 69 53 65 6c 65 63 74 49 64 20 74 68 61 74  h iSelectId that
c090: 20 6f 63 63 75 72 73 20 61 66 74 65 72 0a 2a 2a   occurs after.**
c0a0: 20 70 4f 6c 64 2c 20 6f 72 20 72 65 74 75 72 6e   pOld, or return
c0b0: 20 74 68 65 20 66 69 72 73 74 20 73 75 63 68 20   the first such 
c0c0: 6c 69 6e 65 20 69 66 20 70 4f 6c 64 20 69 73 20  line if pOld is 
c0d0: 4e 55 4c 4c 0a 2a 2f 0a 73 74 61 74 69 63 20 45  NULL.*/.static E
c0e0: 51 50 47 72 61 70 68 52 6f 77 20 2a 65 71 70 5f  QPGraphRow *eqp_
c0f0: 6e 65 78 74 5f 72 6f 77 28 53 68 65 6c 6c 53 74  next_row(ShellSt
c100: 61 74 65 20 2a 70 2c 20 69 6e 74 20 69 53 65 6c  ate *p, int iSel
c110: 65 63 74 49 64 2c 20 45 51 50 47 72 61 70 68 52  ectId, EQPGraphR
c120: 6f 77 20 2a 70 4f 6c 64 29 7b 0a 20 20 45 51 50  ow *pOld){.  EQP
c130: 47 72 61 70 68 52 6f 77 20 2a 70 52 6f 77 20 3d  GraphRow *pRow =
c140: 20 70 4f 6c 64 20 3f 20 70 4f 6c 64 2d 3e 70 4e   pOld ? pOld->pN
c150: 65 78 74 20 3a 20 70 2d 3e 73 47 72 61 70 68 2e  ext : p->sGraph.
c160: 70 52 6f 77 3b 0a 20 20 77 68 69 6c 65 28 20 70  pRow;.  while( p
c170: 52 6f 77 20 26 26 20 70 52 6f 77 2d 3e 69 53 65  Row && pRow->iSe
c180: 6c 65 63 74 49 64 21 3d 69 53 65 6c 65 63 74 49  lectId!=iSelectI
c190: 64 20 29 20 70 52 6f 77 20 3d 20 70 52 6f 77 2d  d ) pRow = pRow-
c1a0: 3e 70 4e 65 78 74 3b 0a 20 20 72 65 74 75 72 6e  >pNext;.  return
c1b0: 20 70 52 6f 77 3b 0a 7d 0a 0a 2f 2a 20 52 65 6e   pRow;.}../* Ren
c1c0: 64 65 72 20 61 20 73 69 6e 67 6c 65 20 6c 65 76  der a single lev
c1d0: 65 6c 20 6f 66 20 74 68 65 20 67 72 61 70 68 20  el of the graph 
c1e0: 73 68 65 6c 6c 20 68 61 76 69 6e 67 20 69 53 65  shell having iSe
c1f0: 6c 65 63 74 49 64 2e 20 20 43 61 6c 6c 65 64 0a  lectId.  Called.
c200: 2a 2a 20 72 65 63 75 72 73 69 76 65 6c 79 20 74  ** recursively t
c210: 6f 20 72 65 6e 64 65 72 20 73 75 62 6c 65 76 65  o render subleve
c220: 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ls..*/.static vo
c230: 69 64 20 65 71 70 5f 72 65 6e 64 65 72 5f 6c 65  id eqp_render_le
c240: 76 65 6c 28 53 68 65 6c 6c 53 74 61 74 65 20 2a  vel(ShellState *
c250: 70 2c 20 69 6e 74 20 69 53 65 6c 65 63 74 49 64  p, int iSelectId
c260: 29 7b 0a 20 20 45 51 50 47 72 61 70 68 52 6f 77  ){.  EQPGraphRow
c270: 20 2a 70 52 6f 77 2c 20 2a 70 4e 65 78 74 3b 0a   *pRow, *pNext;.
c280: 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e    int i;.  int n
c290: 20 3d 20 73 74 72 6c 65 6e 33 30 28 70 2d 3e 73   = strlen30(p->s
c2a0: 47 72 61 70 68 2e 7a 50 72 65 66 69 78 29 3b 0a  Graph.zPrefix);.
c2b0: 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 66 6f 72    char *z;.  for
c2c0: 28 70 52 6f 77 20 3d 20 65 71 70 5f 6e 65 78 74  (pRow = eqp_next
c2d0: 5f 72 6f 77 28 70 2c 20 69 53 65 6c 65 63 74 49  _row(p, iSelectI
c2e0: 64 2c 20 30 29 3b 20 70 52 6f 77 3b 20 70 52 6f  d, 0); pRow; pRo
c2f0: 77 20 3d 20 70 4e 65 78 74 29 7b 0a 20 20 20 20  w = pNext){.    
c300: 70 4e 65 78 74 20 3d 20 65 71 70 5f 6e 65 78 74  pNext = eqp_next
c310: 5f 72 6f 77 28 70 2c 20 69 53 65 6c 65 63 74 49  _row(p, iSelectI
c320: 64 2c 20 70 52 6f 77 29 3b 0a 20 20 20 20 7a 20  d, pRow);.    z 
c330: 3d 20 70 52 6f 77 2d 3e 7a 54 65 78 74 3b 0a 20  = pRow->zText;. 
c340: 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70     utf8_printf(p
c350: 2d 3e 6f 75 74 2c 20 22 25 73 25 73 25 73 5c 6e  ->out, "%s%s%s\n
c360: 22 2c 20 70 2d 3e 73 47 72 61 70 68 2e 7a 50 72  ", p->sGraph.zPr
c370: 65 66 69 78 2c 20 70 4e 65 78 74 20 3f 20 22 7c  efix, pNext ? "|
c380: 2d 2d 22 20 3a 20 22 60 2d 2d 22 2c 20 7a 29 3b  --" : "`--", z);
c390: 0a 20 20 20 20 69 66 28 20 6e 3c 73 69 7a 65 6f  .    if( n<sizeo
c3a0: 66 28 70 2d 3e 73 47 72 61 70 68 2e 7a 50 72 65  f(p->sGraph.zPre
c3b0: 66 69 78 29 2d 37 20 26 26 20 28 7a 20 3d 20 73  fix)-7 && (z = s
c3c0: 74 72 73 74 72 28 7a 2c 20 22 20 53 55 42 51 55  trstr(z, " SUBQU
c3d0: 45 52 22 29 29 21 3d 30 20 29 7b 0a 20 20 20 20  ER"))!=0 ){.    
c3e0: 20 20 6d 65 6d 63 70 79 28 26 70 2d 3e 73 47 72    memcpy(&p->sGr
c3f0: 61 70 68 2e 7a 50 72 65 66 69 78 5b 6e 5d 2c 20  aph.zPrefix[n], 
c400: 70 4e 65 78 74 20 3f 20 22 7c 20 20 22 20 3a 20  pNext ? "|  " : 
c410: 22 20 20 20 22 2c 20 34 29 3b 0a 20 20 20 20 20  "   ", 4);.     
c420: 20 69 66 28 20 73 74 72 6e 63 6d 70 28 7a 2c 20   if( strncmp(z, 
c430: 22 20 53 55 42 51 55 45 52 59 20 22 2c 20 39 29  " SUBQUERY ", 9)
c440: 3d 3d 30 20 26 26 20 28 69 20 3d 20 61 74 6f 69  ==0 && (i = atoi
c450: 28 7a 2b 31 30 29 29 3e 69 53 65 6c 65 63 74 49  (z+10))>iSelectI
c460: 64 20 29 7b 0a 20 20 20 20 20 20 20 20 65 71 70  d ){.        eqp
c470: 5f 72 65 6e 64 65 72 5f 6c 65 76 65 6c 28 70 2c  _render_level(p,
c480: 20 69 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   i);.      }else
c490: 20 69 66 28 20 73 74 72 6e 63 6d 70 28 7a 2c 20   if( strncmp(z, 
c4a0: 22 20 53 55 42 51 55 45 52 49 45 53 20 22 2c 20  " SUBQUERIES ", 
c4b0: 31 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  12)==0 ){.      
c4c0: 20 20 69 20 3d 20 61 74 6f 69 28 7a 2b 31 32 29    i = atoi(z+12)
c4d0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 3e  ;.        if( i>
c4e0: 69 53 65 6c 65 63 74 49 64 20 29 7b 0a 20 20 20  iSelectId ){.   
c4f0: 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e         utf8_prin
c500: 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 7c 2d  tf(p->out, "%s|-
c510: 2d 53 55 42 51 55 45 52 59 20 25 64 5c 6e 22 2c  -SUBQUERY %d\n",
c520: 20 70 2d 3e 73 47 72 61 70 68 2e 7a 50 72 65 66   p->sGraph.zPref
c530: 69 78 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20  ix, i);.        
c540: 20 20 6d 65 6d 63 70 79 28 26 70 2d 3e 73 47 72    memcpy(&p->sGr
c550: 61 70 68 2e 7a 50 72 65 66 69 78 5b 6e 2b 33 5d  aph.zPrefix[n+3]
c560: 2c 22 7c 20 20 22 2c 34 29 3b 0a 20 20 20 20 20  ,"|  ",4);.     
c570: 20 20 20 20 20 65 71 70 5f 72 65 6e 64 65 72 5f       eqp_render_
c580: 6c 65 76 65 6c 28 70 2c 20 69 29 3b 0a 20 20 20  level(p, i);.   
c590: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7a       }.        z
c5a0: 20 3d 20 73 74 72 73 74 72 28 7a 2c 20 22 20 41   = strstr(z, " A
c5b0: 4e 44 20 22 29 3b 0a 20 20 20 20 20 20 20 20 69  ND ");.        i
c5c0: 66 28 20 7a 20 26 26 20 28 69 20 3d 20 61 74 6f  f( z && (i = ato
c5d0: 69 28 7a 2b 35 29 29 3e 69 53 65 6c 65 63 74 49  i(z+5))>iSelectI
c5e0: 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  d ){.          p
c5f0: 2d 3e 73 47 72 61 70 68 2e 7a 50 72 65 66 69 78  ->sGraph.zPrefix
c600: 5b 6e 2b 33 5d 20 3d 20 30 3b 0a 20 20 20 20 20  [n+3] = 0;.     
c610: 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
c620: 28 70 2d 3e 6f 75 74 2c 20 22 25 73 60 2d 2d 53  (p->out, "%s`--S
c630: 55 42 51 55 45 52 59 20 25 64 5c 6e 22 2c 20 70  UBQUERY %d\n", p
c640: 2d 3e 73 47 72 61 70 68 2e 7a 50 72 65 66 69 78  ->sGraph.zPrefix
c650: 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , i);.          
c660: 6d 65 6d 63 70 79 28 26 70 2d 3e 73 47 72 61 70  memcpy(&p->sGrap
c670: 68 2e 7a 50 72 65 66 69 78 5b 6e 2b 33 5d 2c 22  h.zPrefix[n+3],"
c680: 20 20 20 22 2c 34 29 3b 0a 20 20 20 20 20 20 20     ",4);.       
c690: 20 20 20 65 71 70 5f 72 65 6e 64 65 72 5f 6c 65     eqp_render_le
c6a0: 76 65 6c 28 70 2c 20 69 29 3b 0a 20 20 20 20 20  vel(p, i);.     
c6b0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
c6c0: 20 20 20 70 2d 3e 73 47 72 61 70 68 2e 7a 50 72     p->sGraph.zPr
c6d0: 65 66 69 78 5b 6e 5d 20 3d 20 30 3b 0a 20 20 20  efix[n] = 0;.   
c6e0: 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
c6f0: 44 69 73 70 6c 61 79 20 61 6e 64 20 72 65 73 65  Display and rese
c700: 74 20 74 68 65 20 45 58 50 4c 41 49 4e 20 51 55  t the EXPLAIN QU
c710: 45 52 59 20 50 4c 41 4e 20 64 61 74 61 0a 2a 2f  ERY PLAN data.*/
c720: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 71 70  .static void eqp
c730: 5f 72 65 6e 64 65 72 28 53 68 65 6c 6c 53 74 61  _render(ShellSta
c740: 74 65 20 2a 70 29 7b 0a 20 20 45 51 50 47 72 61  te *p){.  EQPGra
c750: 70 68 52 6f 77 20 2a 70 52 6f 77 20 3d 20 70 2d  phRow *pRow = p-
c760: 3e 73 47 72 61 70 68 2e 70 52 6f 77 3b 0a 20 20  >sGraph.pRow;.  
c770: 69 66 28 20 70 52 6f 77 20 29 7b 0a 20 20 20 20  if( pRow ){.    
c780: 69 66 28 20 70 52 6f 77 2d 3e 7a 54 65 78 74 5b  if( pRow->zText[
c790: 30 5d 3d 3d 27 2d 27 20 29 7b 0a 20 20 20 20 20  0]=='-' ){.     
c7a0: 20 69 66 28 20 70 52 6f 77 2d 3e 70 4e 65 78 74   if( pRow->pNext
c7b0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 65  ==0 ){.        e
c7c0: 71 70 5f 72 65 73 65 74 28 70 29 3b 0a 20 20 20  qp_reset(p);.   
c7d0: 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
c7e0: 20 20 20 7d 0a 20 20 20 20 20 20 75 74 66 38 5f     }.      utf8_
c7f0: 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
c800: 25 73 5c 6e 22 2c 20 70 52 6f 77 2d 3e 7a 54 65  %s\n", pRow->zTe
c810: 78 74 2b 33 29 3b 0a 20 20 20 20 20 20 70 2d 3e  xt+3);.      p->
c820: 73 47 72 61 70 68 2e 70 52 6f 77 20 3d 20 70 52  sGraph.pRow = pR
c830: 6f 77 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20  ow->pNext;.     
c840: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 52   sqlite3_free(pR
c850: 6f 77 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ow);.    }else{.
c860: 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
c870: 66 28 70 2d 3e 6f 75 74 2c 20 22 51 55 45 52 59  f(p->out, "QUERY
c880: 20 50 4c 41 4e 5c 6e 22 29 3b 0a 20 20 20 20 7d   PLAN\n");.    }
c890: 0a 20 20 20 20 70 2d 3e 73 47 72 61 70 68 2e 7a  .    p->sGraph.z
c8a0: 50 72 65 66 69 78 5b 30 5d 20 3d 20 30 3b 0a 20  Prefix[0] = 0;. 
c8b0: 20 20 20 65 71 70 5f 72 65 6e 64 65 72 5f 6c 65     eqp_render_le
c8c0: 76 65 6c 28 70 2c 20 30 29 3b 0a 20 20 20 20 65  vel(p, 0);.    e
c8d0: 71 70 5f 72 65 73 65 74 28 70 29 3b 0a 20 20 7d  qp_reset(p);.  }
c8e0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69  .}../*.** This i
c8f0: 73 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 72  s the callback r
c900: 6f 75 74 69 6e 65 20 74 68 61 74 20 74 68 65 20  outine that the 
c910: 73 68 65 6c 6c 0a 2a 2a 20 69 6e 76 6f 6b 65 73  shell.** invokes
c920: 20 66 6f 72 20 65 61 63 68 20 72 6f 77 20 6f 66   for each row of
c930: 20 61 20 71 75 65 72 79 20 72 65 73 75 6c 74 2e   a query result.
c940: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
c950: 68 65 6c 6c 5f 63 61 6c 6c 62 61 63 6b 28 0a 20  hell_callback(. 
c960: 20 76 6f 69 64 20 2a 70 41 72 67 2c 0a 20 20 69   void *pArg,.  i
c970: 6e 74 20 6e 41 72 67 2c 20 20 20 20 20 20 20 20  nt nArg,        
c980: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 73  /* Number of res
c990: 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20  ult columns */. 
c9a0: 20 63 68 61 72 20 2a 2a 61 7a 41 72 67 2c 20 20   char **azArg,  
c9b0: 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63    /* Text of eac
c9c0: 68 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 20  h result column 
c9d0: 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 7a 43 6f  */.  char **azCo
c9e0: 6c 2c 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20  l,    /* Column 
c9f0: 6e 61 6d 65 73 20 2a 2f 0a 20 20 69 6e 74 20 2a  names */.  int *
ca00: 61 69 54 79 70 65 20 20 20 20 20 20 2f 2a 20 43  aiType      /* C
ca10: 6f 6c 75 6d 6e 20 74 79 70 65 73 20 2a 2f 0a 29  olumn types */.)
ca20: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 53 68 65  {.  int i;.  She
ca30: 6c 6c 53 74 61 74 65 20 2a 70 20 3d 20 28 53 68  llState *p = (Sh
ca40: 65 6c 6c 53 74 61 74 65 2a 29 70 41 72 67 3b 0a  ellState*)pArg;.
ca50: 0a 20 20 69 66 28 20 61 7a 41 72 67 3d 3d 30 20  .  if( azArg==0 
ca60: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 73 77  ) return 0;.  sw
ca70: 69 74 63 68 28 20 70 2d 3e 63 4d 6f 64 65 20 29  itch( p->cMode )
ca80: 7b 0a 20 20 20 20 63 61 73 65 20 4d 4f 44 45 5f  {.    case MODE_
ca90: 4c 69 6e 65 3a 20 7b 0a 20 20 20 20 20 20 69 6e  Line: {.      in
caa0: 74 20 77 20 3d 20 35 3b 0a 20 20 20 20 20 20 69  t w = 5;.      i
cab0: 66 28 20 61 7a 41 72 67 3d 3d 30 20 29 20 62 72  f( azArg==0 ) br
cac0: 65 61 6b 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  eak;.      for(i
cad0: 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29  =0; i<nArg; i++)
cae0: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6c 65  {.        int le
caf0: 6e 20 3d 20 73 74 72 6c 65 6e 33 30 28 61 7a 43  n = strlen30(azC
cb00: 6f 6c 5b 69 5d 20 3f 20 61 7a 43 6f 6c 5b 69 5d  ol[i] ? azCol[i]
cb10: 20 3a 20 22 22 29 3b 0a 20 20 20 20 20 20 20 20   : "");.        
cb20: 69 66 28 20 6c 65 6e 3e 77 20 29 20 77 20 3d 20  if( len>w ) w = 
cb30: 6c 65 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  len;.      }.   
cb40: 20 20 20 69 66 28 20 70 2d 3e 63 6e 74 2b 2b 3e     if( p->cnt++>
cb50: 30 20 29 20 75 74 66 38 5f 70 72 69 6e 74 66 28  0 ) utf8_printf(
cb60: 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20 70 2d  p->out, "%s", p-
cb70: 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 29 3b 0a  >rowSeparator);.
cb80: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
cb90: 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nArg; i++){.   
cba0: 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
cbb0: 28 70 2d 3e 6f 75 74 2c 22 25 2a 73 20 3d 20 25  (p->out,"%*s = %
cbc0: 73 25 73 22 2c 20 77 2c 20 61 7a 43 6f 6c 5b 69  s%s", w, azCol[i
cbd0: 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ],.             
cbe0: 20 20 20 61 7a 41 72 67 5b 69 5d 20 3f 20 61 7a     azArg[i] ? az
cbf0: 41 72 67 5b 69 5d 20 3a 20 70 2d 3e 6e 75 6c 6c  Arg[i] : p->null
cc00: 56 61 6c 75 65 2c 20 70 2d 3e 72 6f 77 53 65 70  Value, p->rowSep
cc10: 61 72 61 74 6f 72 29 3b 0a 20 20 20 20 20 20 7d  arator);.      }
cc20: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
cc30: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 4d 4f 44    }.    case MOD
cc40: 45 5f 45 78 70 6c 61 69 6e 3a 0a 20 20 20 20 63  E_Explain:.    c
cc50: 61 73 65 20 4d 4f 44 45 5f 43 6f 6c 75 6d 6e 3a  ase MODE_Column:
cc60: 20 7b 0a 20 20 20 20 20 20 73 74 61 74 69 63 20   {.      static 
cc70: 63 6f 6e 73 74 20 69 6e 74 20 61 45 78 70 6c 61  const int aExpla
cc80: 69 6e 57 69 64 74 68 73 5b 5d 20 3d 20 7b 34 2c  inWidths[] = {4,
cc90: 20 31 33 2c 20 34 2c 20 34 2c 20 34 2c 20 31 33   13, 4, 4, 4, 13
cca0: 2c 20 32 2c 20 31 33 7d 3b 0a 20 20 20 20 20 20  , 2, 13};.      
ccb0: 63 6f 6e 73 74 20 69 6e 74 20 2a 63 6f 6c 57 69  const int *colWi
ccc0: 64 74 68 3b 0a 20 20 20 20 20 20 69 6e 74 20 73  dth;.      int s
ccd0: 68 6f 77 48 64 72 3b 0a 20 20 20 20 20 20 63 68  howHdr;.      ch
cce0: 61 72 20 2a 72 6f 77 53 65 70 3b 0a 20 20 20 20  ar *rowSep;.    
ccf0: 20 20 69 66 28 20 70 2d 3e 63 4d 6f 64 65 3d 3d    if( p->cMode==
cd00: 4d 4f 44 45 5f 43 6f 6c 75 6d 6e 20 29 7b 0a 20  MODE_Column ){. 
cd10: 20 20 20 20 20 20 20 63 6f 6c 57 69 64 74 68 20         colWidth 
cd20: 3d 20 70 2d 3e 63 6f 6c 57 69 64 74 68 3b 0a 20  = p->colWidth;. 
cd30: 20 20 20 20 20 20 20 73 68 6f 77 48 64 72 20 3d         showHdr =
cd40: 20 70 2d 3e 73 68 6f 77 48 65 61 64 65 72 3b 0a   p->showHeader;.
cd50: 20 20 20 20 20 20 20 20 72 6f 77 53 65 70 20 3d          rowSep =
cd60: 20 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72   p->rowSeparator
cd70: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
cd80: 20 20 20 20 20 20 20 63 6f 6c 57 69 64 74 68 20         colWidth 
cd90: 3d 20 61 45 78 70 6c 61 69 6e 57 69 64 74 68 73  = aExplainWidths
cda0: 3b 0a 20 20 20 20 20 20 20 20 73 68 6f 77 48 64  ;.        showHd
cdb0: 72 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 72  r = 1;.        r
cdc0: 6f 77 53 65 70 20 3d 20 53 45 50 5f 52 6f 77 3b  owSep = SEP_Row;
cdd0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
cde0: 66 28 20 70 2d 3e 63 6e 74 2b 2b 3d 3d 30 20 29  f( p->cnt++==0 )
cdf0: 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  {.        for(i=
ce00: 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b  0; i<nArg; i++){
ce10: 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 77  .          int w
ce20: 2c 20 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 69  , n;.          i
ce30: 66 28 20 69 3c 41 72 72 61 79 53 69 7a 65 28 70  f( i<ArraySize(p
ce40: 2d 3e 63 6f 6c 57 69 64 74 68 29 20 29 7b 0a 20  ->colWidth) ){. 
ce50: 20 20 20 20 20 20 20 20 20 20 20 77 20 3d 20 63             w = c
ce60: 6f 6c 57 69 64 74 68 5b 69 5d 3b 0a 20 20 20 20  olWidth[i];.    
ce70: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
ce80: 20 20 20 20 20 20 20 20 20 77 20 3d 20 30 3b 0a           w = 0;.
ce90: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
cea0: 20 20 20 20 20 20 69 66 28 20 77 3d 3d 30 20 29        if( w==0 )
ceb0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 77 20  {.            w 
cec0: 3d 20 73 74 72 6c 65 6e 43 68 61 72 28 61 7a 43  = strlenChar(azC
ced0: 6f 6c 5b 69 5d 20 3f 20 61 7a 43 6f 6c 5b 69 5d  ol[i] ? azCol[i]
cee0: 20 3a 20 22 22 29 3b 0a 20 20 20 20 20 20 20 20   : "");.        
cef0: 20 20 20 20 69 66 28 20 77 3c 31 30 20 29 20 77      if( w<10 ) w
cf00: 20 3d 20 31 30 3b 0a 20 20 20 20 20 20 20 20 20   = 10;.         
cf10: 20 20 20 6e 20 3d 20 73 74 72 6c 65 6e 43 68 61     n = strlenCha
cf20: 72 28 61 7a 41 72 67 20 26 26 20 61 7a 41 72 67  r(azArg && azArg
cf30: 5b 69 5d 20 3f 20 61 7a 41 72 67 5b 69 5d 20 3a  [i] ? azArg[i] :
cf40: 20 70 2d 3e 6e 75 6c 6c 56 61 6c 75 65 29 3b 0a   p->nullValue);.
cf50: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
cf60: 77 3c 6e 20 29 20 77 20 3d 20 6e 3b 0a 20 20 20  w<n ) w = n;.   
cf70: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
cf80: 20 20 20 69 66 28 20 69 3c 41 72 72 61 79 53 69     if( i<ArraySi
cf90: 7a 65 28 70 2d 3e 61 63 74 75 61 6c 57 69 64 74  ze(p->actualWidt
cfa0: 68 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  h) ){.          
cfb0: 20 20 70 2d 3e 61 63 74 75 61 6c 57 69 64 74 68    p->actualWidth
cfc0: 5b 69 5d 20 3d 20 77 3b 0a 20 20 20 20 20 20 20  [i] = w;.       
cfd0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69     }.          i
cfe0: 66 28 20 73 68 6f 77 48 64 72 20 29 7b 0a 20 20  f( showHdr ){.  
cff0: 20 20 20 20 20 20 20 20 20 20 75 74 66 38 5f 77            utf8_w
d000: 69 64 74 68 5f 70 72 69 6e 74 28 70 2d 3e 6f 75  idth_print(p->ou
d010: 74 2c 20 77 2c 20 61 7a 43 6f 6c 5b 69 5d 29 3b  t, w, azCol[i]);
d020: 0a 20 20 20 20 20 20 20 20 20 20 20 20 75 74 66  .            utf
d030: 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  8_printf(p->out,
d040: 20 22 25 73 22 2c 20 69 3d 3d 6e 41 72 67 2d 31   "%s", i==nArg-1
d050: 20 3f 20 72 6f 77 53 65 70 20 3a 20 22 20 20 22   ? rowSep : "  "
d060: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
d070: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
d080: 20 69 66 28 20 73 68 6f 77 48 64 72 20 29 7b 0a   if( showHdr ){.
d090: 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d            for(i=
d0a0: 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b  0; i<nArg; i++){
d0b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74  .            int
d0c0: 20 77 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   w;.            
d0d0: 69 66 28 20 69 3c 41 72 72 61 79 53 69 7a 65 28  if( i<ArraySize(
d0e0: 70 2d 3e 61 63 74 75 61 6c 57 69 64 74 68 29 20  p->actualWidth) 
d0f0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
d100: 20 20 77 20 3d 20 70 2d 3e 61 63 74 75 61 6c 57    w = p->actualW
d110: 69 64 74 68 5b 69 5d 3b 0a 20 20 20 20 20 20 20  idth[i];.       
d120: 20 20 20 20 20 20 20 20 69 66 28 20 77 3c 30 20          if( w<0 
d130: 29 20 77 20 3d 20 2d 77 3b 0a 20 20 20 20 20 20  ) w = -w;.      
d140: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
d150: 20 20 20 20 20 20 20 20 20 20 20 20 77 20 3d 20              w = 
d160: 31 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  10;.            
d170: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 75 74  }.            ut
d180: 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  f8_printf(p->out
d190: 2c 22 25 2d 2a 2e 2a 73 25 73 22 2c 77 2c 77 2c  ,"%-*.*s%s",w,w,
d1a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
d1b0: 20 20 20 20 22 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d      "-----------
d1c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d1d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d1e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 22  ---------------"
d1f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
d200: 20 20 20 20 22 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d      "-----------
d210: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d220: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d230: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 22  ---------------"
d240: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
d250: 20 20 20 20 20 20 69 3d 3d 6e 41 72 67 2d 31 20        i==nArg-1 
d260: 3f 20 72 6f 77 53 65 70 20 3a 20 22 20 20 22 29  ? rowSep : "  ")
d270: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
d280: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
d290: 20 20 20 20 20 20 69 66 28 20 61 7a 41 72 67 3d        if( azArg=
d2a0: 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
d2b0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72    for(i=0; i<nAr
d2c0: 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  g; i++){.       
d2d0: 20 69 6e 74 20 77 3b 0a 20 20 20 20 20 20 20 20   int w;.        
d2e0: 69 66 28 20 69 3c 41 72 72 61 79 53 69 7a 65 28  if( i<ArraySize(
d2f0: 70 2d 3e 61 63 74 75 61 6c 57 69 64 74 68 29 20  p->actualWidth) 
d300: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 77 20  ){.           w 
d310: 3d 20 70 2d 3e 61 63 74 75 61 6c 57 69 64 74 68  = p->actualWidth
d320: 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  [i];.        }el
d330: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 77  se{.           w
d340: 20 3d 20 31 30 3b 0a 20 20 20 20 20 20 20 20 7d   = 10;.        }
d350: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e  .        if( p->
d360: 63 4d 6f 64 65 3d 3d 4d 4f 44 45 5f 45 78 70 6c  cMode==MODE_Expl
d370: 61 69 6e 20 26 26 20 61 7a 41 72 67 5b 69 5d 20  ain && azArg[i] 
d380: 26 26 20 73 74 72 6c 65 6e 43 68 61 72 28 61 7a  && strlenChar(az
d390: 41 72 67 5b 69 5d 29 3e 77 20 29 7b 0a 20 20 20  Arg[i])>w ){.   
d3a0: 20 20 20 20 20 20 20 77 20 3d 20 73 74 72 6c 65         w = strle
d3b0: 6e 43 68 61 72 28 61 7a 41 72 67 5b 69 5d 29 3b  nChar(azArg[i]);
d3c0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
d3d0: 20 20 20 69 66 28 20 69 3d 3d 31 20 26 26 20 70     if( i==1 && p
d3e0: 2d 3e 61 69 49 6e 64 65 6e 74 20 26 26 20 70 2d  ->aiIndent && p-
d3f0: 3e 70 53 74 6d 74 20 29 7b 0a 20 20 20 20 20 20  >pStmt ){.      
d400: 20 20 20 20 69 66 28 20 70 2d 3e 69 49 6e 64 65      if( p->iInde
d410: 6e 74 3c 70 2d 3e 6e 49 6e 64 65 6e 74 20 29 7b  nt<p->nIndent ){
d420: 0a 20 20 20 20 20 20 20 20 20 20 20 20 75 74 66  .            utf
d430: 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  8_printf(p->out,
d440: 20 22 25 2a 2e 73 22 2c 20 70 2d 3e 61 69 49 6e   "%*.s", p->aiIn
d450: 64 65 6e 74 5b 70 2d 3e 69 49 6e 64 65 6e 74 5d  dent[p->iIndent]
d460: 2c 20 22 22 29 3b 0a 20 20 20 20 20 20 20 20 20  , "");.         
d470: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e   }.          p->
d480: 69 49 6e 64 65 6e 74 2b 2b 3b 0a 20 20 20 20 20  iIndent++;.     
d490: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 75 74 66     }.        utf
d4a0: 38 5f 77 69 64 74 68 5f 70 72 69 6e 74 28 70 2d  8_width_print(p-
d4b0: 3e 6f 75 74 2c 20 77 2c 20 61 7a 41 72 67 5b 69  >out, w, azArg[i
d4c0: 5d 20 3f 20 61 7a 41 72 67 5b 69 5d 20 3a 20 70  ] ? azArg[i] : p
d4d0: 2d 3e 6e 75 6c 6c 56 61 6c 75 65 29 3b 0a 20 20  ->nullValue);.  
d4e0: 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
d4f0: 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20  f(p->out, "%s", 
d500: 69 3d 3d 6e 41 72 67 2d 31 20 3f 20 72 6f 77 53  i==nArg-1 ? rowS
d510: 65 70 20 3a 20 22 20 20 22 29 3b 0a 20 20 20 20  ep : "  ");.    
d520: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
d530: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
d540: 4d 4f 44 45 5f 53 65 6d 69 3a 20 7b 20 20 20 2f  MODE_Semi: {   /
d550: 2a 20 2e 73 63 68 65 6d 61 20 61 6e 64 20 2e 66  * .schema and .f
d560: 75 6c 6c 73 63 68 65 6d 61 20 6f 75 74 70 75 74  ullschema output
d570: 20 2a 2f 0a 20 20 20 20 20 20 70 72 69 6e 74 53   */.      printS
d580: 63 68 65 6d 61 4c 69 6e 65 28 70 2d 3e 6f 75 74  chemaLine(p->out
d590: 2c 20 61 7a 41 72 67 5b 30 5d 2c 20 22 3b 5c 6e  , azArg[0], ";\n
d5a0: 22 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ");.      break;
d5b0: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
d5c0: 4d 4f 44 45 5f 50 72 65 74 74 79 3a 20 7b 20 20  MODE_Pretty: {  
d5d0: 2f 2a 20 2e 73 63 68 65 6d 61 20 61 6e 64 20 2e  /* .schema and .
d5e0: 66 75 6c 6c 73 63 68 65 6d 61 20 77 69 74 68 20  fullschema with 
d5f0: 2d 2d 69 6e 64 65 6e 74 20 2a 2f 0a 20 20 20 20  --indent */.    
d600: 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20 20    char *z;.     
d610: 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 69 6e   int j;.      in
d620: 74 20 6e 50 61 72 65 6e 20 3d 20 30 3b 0a 20 20  t nParen = 0;.  
d630: 20 20 20 20 63 68 61 72 20 63 45 6e 64 20 3d 20      char cEnd = 
d640: 30 3b 0a 20 20 20 20 20 20 63 68 61 72 20 63 3b  0;.      char c;
d650: 0a 20 20 20 20 20 20 69 6e 74 20 6e 4c 69 6e 65  .      int nLine
d660: 20 3d 20 30 3b 0a 20 20 20 20 20 20 61 73 73 65   = 0;.      asse
d670: 72 74 28 20 6e 41 72 67 3d 3d 31 20 29 3b 0a 20  rt( nArg==1 );. 
d680: 20 20 20 20 20 69 66 28 20 61 7a 41 72 67 5b 30       if( azArg[0
d690: 5d 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  ]==0 ) break;.  
d6a0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f      if( sqlite3_
d6b0: 73 74 72 6c 69 6b 65 28 22 43 52 45 41 54 45 20  strlike("CREATE 
d6c0: 56 49 45 57 25 22 2c 20 61 7a 41 72 67 5b 30 5d  VIEW%", azArg[0]
d6d0: 2c 20 30 29 3d 3d 30 0a 20 20 20 20 20 20 20 7c  , 0)==0.       |
d6e0: 7c 20 73 71 6c 69 74 65 33 5f 73 74 72 6c 69 6b  | sqlite3_strlik
d6f0: 65 28 22 43 52 45 41 54 45 20 54 52 49 47 25 22  e("CREATE TRIG%"
d700: 2c 20 61 7a 41 72 67 5b 30 5d 2c 20 30 29 3d 3d  , azArg[0], 0)==
d710: 30 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20  0.      ){.     
d720: 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70     utf8_printf(p
d730: 2d 3e 6f 75 74 2c 20 22 25 73 3b 5c 6e 22 2c 20  ->out, "%s;\n", 
d740: 61 7a 41 72 67 5b 30 5d 29 3b 0a 20 20 20 20 20  azArg[0]);.     
d750: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
d760: 7d 0a 20 20 20 20 20 20 7a 20 3d 20 73 71 6c 69  }.      z = sqli
d770: 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 22  te3_mprintf("%s"
d780: 2c 20 61 7a 41 72 67 5b 30 5d 29 3b 0a 20 20 20  , azArg[0]);.   
d790: 20 20 20 6a 20 3d 20 30 3b 0a 20 20 20 20 20 20     j = 0;.      
d7a0: 66 6f 72 28 69 3d 30 3b 20 49 73 53 70 61 63 65  for(i=0; IsSpace
d7b0: 28 7a 5b 69 5d 29 3b 20 69 2b 2b 29 7b 7d 0a 20  (z[i]); i++){}. 
d7c0: 20 20 20 20 20 66 6f 72 28 3b 20 28 63 20 3d 20       for(; (c = 
d7d0: 7a 5b 69 5d 29 21 3d 30 3b 20 69 2b 2b 29 7b 0a  z[i])!=0; i++){.
d7e0: 20 20 20 20 20 20 20 20 69 66 28 20 49 73 53 70          if( IsSp
d7f0: 61 63 65 28 63 29 20 29 7b 0a 20 20 20 20 20 20  ace(c) ){.      
d800: 20 20 20 20 69 66 28 20 7a 5b 6a 2d 31 5d 3d 3d      if( z[j-1]==
d810: 27 5c 72 27 20 29 20 7a 5b 6a 2d 31 5d 20 3d 20  '\r' ) z[j-1] = 
d820: 27 5c 6e 27 3b 0a 20 20 20 20 20 20 20 20 20 20  '\n';.          
d830: 69 66 28 20 49 73 53 70 61 63 65 28 7a 5b 6a 2d  if( IsSpace(z[j-
d840: 31 5d 29 20 7c 7c 20 7a 5b 6a 2d 31 5d 3d 3d 27  1]) || z[j-1]=='
d850: 28 27 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  (' ) continue;. 
d860: 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
d870: 20 28 63 3d 3d 27 28 27 20 7c 7c 20 63 3d 3d 27   (c=='(' || c=='
d880: 29 27 29 20 26 26 20 6a 3e 30 20 26 26 20 49 73  )') && j>0 && Is
d890: 53 70 61 63 65 28 7a 5b 6a 2d 31 5d 29 20 29 7b  Space(z[j-1]) ){
d8a0: 0a 20 20 20 20 20 20 20 20 20 20 6a 2d 2d 3b 0a  .          j--;.
d8b0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
d8c0: 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 63 3b 0a 20 20    z[j++] = c;.  
d8d0: 20 20 20 20 7d 0a 20 20 20 20 20 20 77 68 69 6c      }.      whil
d8e0: 65 28 20 6a 3e 30 20 26 26 20 49 73 53 70 61 63  e( j>0 && IsSpac
d8f0: 65 28 7a 5b 6a 2d 31 5d 29 20 29 7b 20 6a 2d 2d  e(z[j-1]) ){ j--
d900: 3b 20 7d 0a 20 20 20 20 20 20 7a 5b 6a 5d 20 3d  ; }.      z[j] =
d910: 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 73 74   0;.      if( st
d920: 72 6c 65 6e 33 30 28 7a 29 3e 3d 37 39 20 29 7b  rlen30(z)>=79 ){
d930: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 6a  .        for(i=j
d940: 3d 30 3b 20 28 63 20 3d 20 7a 5b 69 5d 29 21 3d  =0; (c = z[i])!=
d950: 30 3b 20 69 2b 2b 29 7b 20 20 2f 2a 20 43 6f 70  0; i++){  /* Cop
d960: 79 20 63 68 61 6e 67 65 73 20 66 72 6f 6d 20 7a  y changes from z
d970: 5b 69 5d 20 62 61 63 6b 20 74 6f 20 7a 5b 6a 5d  [i] back to z[j]
d980: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66   */.          if
d990: 28 20 63 3d 3d 63 45 6e 64 20 29 7b 0a 20 20 20  ( c==cEnd ){.   
d9a0: 20 20 20 20 20 20 20 20 20 63 45 6e 64 20 3d 20           cEnd = 
d9b0: 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  0;.          }el
d9c0: 73 65 20 69 66 28 20 63 3d 3d 27 22 27 20 7c 7c  se if( c=='"' ||
d9d0: 20 63 3d 3d 27 5c 27 27 20 7c 7c 20 63 3d 3d 27   c=='\'' || c=='
d9e0: 60 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  `' ){.          
d9f0: 20 20 63 45 6e 64 20 3d 20 63 3b 0a 20 20 20 20    cEnd = c;.    
da00: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
da10: 63 3d 3d 27 5b 27 20 29 7b 0a 20 20 20 20 20 20  c=='[' ){.      
da20: 20 20 20 20 20 20 63 45 6e 64 20 3d 20 27 5d 27        cEnd = ']'
da30: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
da40: 65 20 69 66 28 20 63 3d 3d 27 2d 27 20 26 26 20  e if( c=='-' && 
da50: 7a 5b 69 2b 31 5d 3d 3d 27 2d 27 20 29 7b 0a 20  z[i+1]=='-' ){. 
da60: 20 20 20 20 20 20 20 20 20 20 20 63 45 6e 64 20             cEnd 
da70: 3d 20 27 5c 6e 27 3b 0a 20 20 20 20 20 20 20 20  = '\n';.        
da80: 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27    }else if( c=='
da90: 28 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  (' ){.          
daa0: 20 20 6e 50 61 72 65 6e 2b 2b 3b 0a 20 20 20 20    nParen++;.    
dab0: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
dac0: 63 3d 3d 27 29 27 20 29 7b 0a 20 20 20 20 20 20  c==')' ){.      
dad0: 20 20 20 20 20 20 6e 50 61 72 65 6e 2d 2d 3b 0a        nParen--;.
dae0: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
daf0: 6e 4c 69 6e 65 3e 30 20 26 26 20 6e 50 61 72 65  nLine>0 && nPare
db00: 6e 3d 3d 30 20 26 26 20 6a 3e 30 20 29 7b 0a 20  n==0 && j>0 ){. 
db10: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 72 69               pri
db20: 6e 74 53 63 68 65 6d 61 4c 69 6e 65 4e 28 70 2d  ntSchemaLineN(p-
db30: 3e 6f 75 74 2c 20 7a 2c 20 6a 2c 20 22 5c 6e 22  >out, z, j, "\n"
db40: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
db50: 20 6a 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20   j = 0;.        
db60: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
db70: 7d 0a 20 20 20 20 20 20 20 20 20 20 7a 5b 6a 2b  }.          z[j+
db80: 2b 5d 20 3d 20 63 3b 0a 20 20 20 20 20 20 20 20  +] = c;.        
db90: 20 20 69 66 28 20 6e 50 61 72 65 6e 3d 3d 31 20    if( nParen==1 
dba0: 26 26 20 63 45 6e 64 3d 3d 30 0a 20 20 20 20 20  && cEnd==0.     
dbb0: 20 20 20 20 20 20 26 26 20 28 63 3d 3d 27 28 27        && (c=='('
dbc0: 20 7c 7c 20 63 3d 3d 27 5c 6e 27 20 7c 7c 20 28   || c=='\n' || (
dbd0: 63 3d 3d 27 2c 27 20 26 26 20 21 77 73 54 6f 45  c==',' && !wsToE
dbe0: 6f 6c 28 7a 2b 69 2b 31 29 29 29 0a 20 20 20 20  ol(z+i+1))).    
dbf0: 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
dc00: 20 20 20 20 20 69 66 28 20 63 3d 3d 27 5c 6e 27       if( c=='\n'
dc10: 20 29 20 6a 2d 2d 3b 0a 20 20 20 20 20 20 20 20   ) j--;.        
dc20: 20 20 20 20 70 72 69 6e 74 53 63 68 65 6d 61 4c      printSchemaL
dc30: 69 6e 65 4e 28 70 2d 3e 6f 75 74 2c 20 7a 2c 20  ineN(p->out, z, 
dc40: 6a 2c 20 22 5c 6e 20 20 22 29 3b 0a 20 20 20 20  j, "\n  ");.    
dc50: 20 20 20 20 20 20 20 20 6a 20 3d 20 30 3b 0a 20          j = 0;. 
dc60: 20 20 20 20 20 20 20 20 20 20 20 6e 4c 69 6e 65             nLine
dc70: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ++;.            
dc80: 77 68 69 6c 65 28 20 49 73 53 70 61 63 65 28 7a  while( IsSpace(z
dc90: 5b 69 2b 31 5d 29 20 29 7b 20 69 2b 2b 3b 20 7d  [i+1]) ){ i++; }
dca0: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
dcb0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7a       }.        z
dcc0: 5b 6a 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  [j] = 0;.      }
dcd0: 0a 20 20 20 20 20 20 70 72 69 6e 74 53 63 68 65  .      printSche
dce0: 6d 61 4c 69 6e 65 28 70 2d 3e 6f 75 74 2c 20 7a  maLine(p->out, z
dcf0: 2c 20 22 3b 5c 6e 22 29 3b 0a 20 20 20 20 20 20  , ";\n");.      
dd00: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 29 3b  sqlite3_free(z);
dd10: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
dd20: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 4d 4f 44    }.    case MOD
dd30: 45 5f 4c 69 73 74 3a 20 7b 0a 20 20 20 20 20 20  E_List: {.      
dd40: 69 66 28 20 70 2d 3e 63 6e 74 2b 2b 3d 3d 30 20  if( p->cnt++==0 
dd50: 26 26 20 70 2d 3e 73 68 6f 77 48 65 61 64 65 72  && p->showHeader
dd60: 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28   ){.        for(
dd70: 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b  i=0; i<nArg; i++
dd80: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 74 66  ){.          utf
dd90: 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  8_printf(p->out,
dda0: 22 25 73 25 73 22 2c 61 7a 43 6f 6c 5b 69 5d 2c  "%s%s",azCol[i],
ddb0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
ddc0: 20 20 20 69 3d 3d 6e 41 72 67 2d 31 20 3f 20 70     i==nArg-1 ? p
ddd0: 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 20 3a  ->rowSeparator :
dde0: 20 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72   p->colSeparator
ddf0: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
de00: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 61     }.      if( a
de10: 7a 41 72 67 3d 3d 30 20 29 20 62 72 65 61 6b 3b  zArg==0 ) break;
de20: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
de30: 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20  i<nArg; i++){.  
de40: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20        char *z = 
de50: 61 7a 41 72 67 5b 69 5d 3b 0a 20 20 20 20 20 20  azArg[i];.      
de60: 20 20 69 66 28 20 7a 3d 3d 30 20 29 20 7a 20 3d    if( z==0 ) z =
de70: 20 70 2d 3e 6e 75 6c 6c 56 61 6c 75 65 3b 0a 20   p->nullValue;. 
de80: 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e         utf8_prin
de90: 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c  tf(p->out, "%s",
dea0: 20 7a 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   z);.        if(
deb0: 20 69 3c 6e 41 72 67 2d 31 20 29 7b 0a 20 20 20   i<nArg-1 ){.   
dec0: 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e         utf8_prin
ded0: 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c  tf(p->out, "%s",
dee0: 20 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72   p->colSeparator
def0: 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
df00: 7b 0a 20 20 20 20 20 20 20 20 20 20 75 74 66 38  {.          utf8
df10: 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
df20: 22 25 73 22 2c 20 70 2d 3e 72 6f 77 53 65 70 61  "%s", p->rowSepa
df30: 72 61 74 6f 72 29 3b 0a 20 20 20 20 20 20 20 20  rator);.        
df40: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
df50: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
df60: 20 63 61 73 65 20 4d 4f 44 45 5f 48 74 6d 6c 3a   case MODE_Html:
df70: 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e   {.      if( p->
df80: 63 6e 74 2b 2b 3d 3d 30 20 26 26 20 70 2d 3e 73  cnt++==0 && p->s
df90: 68 6f 77 48 65 61 64 65 72 20 29 7b 0a 20 20 20  howHeader ){.   
dfa0: 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
dfb0: 70 2d 3e 6f 75 74 2c 22 3c 54 52 3e 22 29 3b 0a  p->out,"<TR>");.
dfc0: 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
dfd0: 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20   i<nArg; i++){. 
dfe0: 20 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69           raw_pri
dff0: 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 3c 54 48 3e  ntf(p->out,"<TH>
e000: 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6f 75  ");.          ou
e010: 74 70 75 74 5f 68 74 6d 6c 5f 73 74 72 69 6e 67  tput_html_string
e020: 28 70 2d 3e 6f 75 74 2c 20 61 7a 43 6f 6c 5b 69  (p->out, azCol[i
e030: 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 61  ]);.          ra
e040: 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  w_printf(p->out,
e050: 22 3c 2f 54 48 3e 5c 6e 22 29 3b 0a 20 20 20 20  "</TH>\n");.    
e060: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 61      }.        ra
e070: 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  w_printf(p->out,
e080: 22 3c 2f 54 52 3e 5c 6e 22 29 3b 0a 20 20 20 20  "</TR>\n");.    
e090: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 61 7a    }.      if( az
e0a0: 41 72 67 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  Arg==0 ) break;.
e0b0: 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
e0c0: 28 70 2d 3e 6f 75 74 2c 22 3c 54 52 3e 22 29 3b  (p->out,"<TR>");
e0d0: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
e0e0: 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20  i<nArg; i++){.  
e0f0: 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
e100: 28 70 2d 3e 6f 75 74 2c 22 3c 54 44 3e 22 29 3b  (p->out,"<TD>");
e110: 0a 20 20 20 20 20 20 20 20 6f 75 74 70 75 74 5f  .        output_
e120: 68 74 6d 6c 5f 73 74 72 69 6e 67 28 70 2d 3e 6f  html_string(p->o
e130: 75 74 2c 20 61 7a 41 72 67 5b 69 5d 20 3f 20 61  ut, azArg[i] ? a
e140: 7a 41 72 67 5b 69 5d 20 3a 20 70 2d 3e 6e 75 6c  zArg[i] : p->nul
e150: 6c 56 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 20  lValue);.       
e160: 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f   raw_printf(p->o
e170: 75 74 2c 22 3c 2f 54 44 3e 5c 6e 22 29 3b 0a 20  ut,"</TD>\n");. 
e180: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 61 77       }.      raw
e190: 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22  _printf(p->out,"
e1a0: 3c 2f 54 52 3e 5c 6e 22 29 3b 0a 20 20 20 20 20  </TR>\n");.     
e1b0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
e1c0: 20 20 63 61 73 65 20 4d 4f 44 45 5f 54 63 6c 3a    case MODE_Tcl:
e1d0: 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e   {.      if( p->
e1e0: 63 6e 74 2b 2b 3d 3d 30 20 26 26 20 70 2d 3e 73  cnt++==0 && p->s
e1f0: 68 6f 77 48 65 61 64 65 72 20 29 7b 0a 20 20 20  howHeader ){.   
e200: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
e210: 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nArg; i++){.    
e220: 20 20 20 20 20 20 6f 75 74 70 75 74 5f 63 5f 73        output_c_s
e230: 74 72 69 6e 67 28 70 2d 3e 6f 75 74 2c 61 7a 43  tring(p->out,azC
e240: 6f 6c 5b 69 5d 20 3f 20 61 7a 43 6f 6c 5b 69 5d  ol[i] ? azCol[i]
e250: 20 3a 20 22 22 29 3b 0a 20 20 20 20 20 20 20 20   : "");.        
e260: 20 20 69 66 28 69 3c 6e 41 72 67 2d 31 29 20 75    if(i<nArg-1) u
e270: 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  tf8_printf(p->ou
e280: 74 2c 20 22 25 73 22 2c 20 70 2d 3e 63 6f 6c 53  t, "%s", p->colS
e290: 65 70 61 72 61 74 6f 72 29 3b 0a 20 20 20 20 20  eparator);.     
e2a0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 75 74 66     }.        utf
e2b0: 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  8_printf(p->out,
e2c0: 20 22 25 73 22 2c 20 70 2d 3e 72 6f 77 53 65 70   "%s", p->rowSep
e2d0: 61 72 61 74 6f 72 29 3b 0a 20 20 20 20 20 20 7d  arator);.      }
e2e0: 0a 20 20 20 20 20 20 69 66 28 20 61 7a 41 72 67  .      if( azArg
e2f0: 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
e300: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41     for(i=0; i<nA
e310: 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  rg; i++){.      
e320: 20 20 6f 75 74 70 75 74 5f 63 5f 73 74 72 69 6e    output_c_strin
e330: 67 28 70 2d 3e 6f 75 74 2c 20 61 7a 41 72 67 5b  g(p->out, azArg[
e340: 69 5d 20 3f 20 61 7a 41 72 67 5b 69 5d 20 3a 20  i] ? azArg[i] : 
e350: 70 2d 3e 6e 75 6c 6c 56 61 6c 75 65 29 3b 0a 20  p->nullValue);. 
e360: 20 20 20 20 20 20 20 69 66 28 69 3c 6e 41 72 67         if(i<nArg
e370: 2d 31 29 20 75 74 66 38 5f 70 72 69 6e 74 66 28  -1) utf8_printf(
e380: 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20 70 2d  p->out, "%s", p-
e390: 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 29 3b 0a  >colSeparator);.
e3a0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 75 74        }.      ut
e3b0: 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  f8_printf(p->out
e3c0: 2c 20 22 25 73 22 2c 20 70 2d 3e 72 6f 77 53 65  , "%s", p->rowSe
e3d0: 70 61 72 61 74 6f 72 29 3b 0a 20 20 20 20 20 20  parator);.      
e3e0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
e3f0: 20 63 61 73 65 20 4d 4f 44 45 5f 43 73 76 3a 20   case MODE_Csv: 
e400: 7b 0a 20 20 20 20 20 20 73 65 74 42 69 6e 61 72  {.      setBinar
e410: 79 4d 6f 64 65 28 70 2d 3e 6f 75 74 2c 20 31 29  yMode(p->out, 1)
e420: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 63  ;.      if( p->c
e430: 6e 74 2b 2b 3d 3d 30 20 26 26 20 70 2d 3e 73 68  nt++==0 && p->sh
e440: 6f 77 48 65 61 64 65 72 20 29 7b 0a 20 20 20 20  owHeader ){.    
e450: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
e460: 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Arg; i++){.     
e470: 20 20 20 20 20 6f 75 74 70 75 74 5f 63 73 76 28       output_csv(
e480: 70 2c 20 61 7a 43 6f 6c 5b 69 5d 20 3f 20 61 7a  p, azCol[i] ? az
e490: 43 6f 6c 5b 69 5d 20 3a 20 22 22 2c 20 69 3c 6e  Col[i] : "", i<n
e4a0: 41 72 67 2d 31 29 3b 0a 20 20 20 20 20 20 20 20  Arg-1);.        
e4b0: 7d 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70  }.        utf8_p
e4c0: 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25  rintf(p->out, "%
e4d0: 73 22 2c 20 70 2d 3e 72 6f 77 53 65 70 61 72 61  s", p->rowSepara
e4e0: 74 6f 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  tor);.      }.  
e4f0: 20 20 20 20 69 66 28 20 6e 41 72 67 3e 30 20 29      if( nArg>0 )
e500: 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  {.        for(i=
e510: 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b  0; i<nArg; i++){
e520: 0a 20 20 20 20 20 20 20 20 20 20 6f 75 74 70 75  .          outpu
e530: 74 5f 63 73 76 28 70 2c 20 61 7a 41 72 67 5b 69  t_csv(p, azArg[i
e540: 5d 2c 20 69 3c 6e 41 72 67 2d 31 29 3b 0a 20 20  ], i<nArg-1);.  
e550: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
e560: 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f  utf8_printf(p->o
e570: 75 74 2c 20 22 25 73 22 2c 20 70 2d 3e 72 6f 77  ut, "%s", p->row
e580: 53 65 70 61 72 61 74 6f 72 29 3b 0a 20 20 20 20  Separator);.    
e590: 20 20 7d 0a 20 20 20 20 20 20 73 65 74 54 65 78    }.      setTex
e5a0: 74 4d 6f 64 65 28 70 2d 3e 6f 75 74 2c 20 31 29  tMode(p->out, 1)
e5b0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
e5c0: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 4d 4f     }.    case MO
e5d0: 44 45 5f 49 6e 73 65 72 74 3a 20 7b 0a 20 20 20  DE_Insert: {.   
e5e0: 20 20 20 69 66 28 20 61 7a 41 72 67 3d 3d 30 20     if( azArg==0 
e5f0: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 75  ) break;.      u
e600: 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  tf8_printf(p->ou
e610: 74 2c 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 25  t,"INSERT INTO %
e620: 73 22 2c 70 2d 3e 7a 44 65 73 74 54 61 62 6c 65  s",p->zDestTable
e630: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  );.      if( p->
e640: 73 68 6f 77 48 65 61 64 65 72 20 29 7b 0a 20 20  showHeader ){.  
e650: 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
e660: 28 70 2d 3e 6f 75 74 2c 22 28 22 29 3b 0a 20 20  (p->out,"(");.  
e670: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
e680: 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nArg; i++){.   
e690: 20 20 20 20 20 20 20 69 66 28 20 69 3e 30 20 29         if( i>0 )
e6a0: 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f   raw_printf(p->o
e6b0: 75 74 2c 20 22 2c 22 29 3b 0a 20 20 20 20 20 20  ut, ",");.      
e6c0: 20 20 20 20 69 66 28 20 71 75 6f 74 65 43 68 61      if( quoteCha
e6d0: 72 28 61 7a 43 6f 6c 5b 69 5d 29 20 29 7b 0a 20  r(azCol[i]) ){. 
e6e0: 20 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20             char 
e6f0: 2a 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  *z = sqlite3_mpr
e700: 69 6e 74 66 28 22 5c 22 25 77 5c 22 22 2c 20 61  intf("\"%w\"", a
e710: 7a 43 6f 6c 5b 69 5d 29 3b 0a 20 20 20 20 20 20  zCol[i]);.      
e720: 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
e730: 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20  f(p->out, "%s", 
e740: 7a 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  z);.            
e750: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 29 3b  sqlite3_free(z);
e760: 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
e770: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 61  {.            ra
e780: 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  w_printf(p->out,
e790: 20 22 25 73 22 2c 20 61 7a 43 6f 6c 5b 69 5d 29   "%s", azCol[i])
e7a0: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
e7b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
e7c0: 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  raw_printf(p->ou
e7d0: 74 2c 22 29 22 29 3b 0a 20 20 20 20 20 20 7d 0a  t,")");.      }.
e7e0: 20 20 20 20 20 20 70 2d 3e 63 6e 74 2b 2b 3b 0a        p->cnt++;.
e7f0: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
e800: 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nArg; i++){.   
e810: 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
e820: 70 2d 3e 6f 75 74 2c 20 69 3e 30 20 3f 20 22 2c  p->out, i>0 ? ",
e830: 22 20 3a 20 22 20 56 41 4c 55 45 53 28 22 29 3b  " : " VALUES(");
e840: 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 61 7a  .        if( (az
e850: 41 72 67 5b 69 5d 3d 3d 30 29 20 7c 7c 20 28 61  Arg[i]==0) || (a
e860: 69 54 79 70 65 20 26 26 20 61 69 54 79 70 65 5b  iType && aiType[
e870: 69 5d 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 29  i]==SQLITE_NULL)
e880: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 74   ){.          ut
e890: 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  f8_printf(p->out
e8a0: 2c 22 4e 55 4c 4c 22 29 3b 0a 20 20 20 20 20 20  ,"NULL");.      
e8b0: 20 20 7d 65 6c 73 65 20 69 66 28 20 61 69 54 79    }else if( aiTy
e8c0: 70 65 20 26 26 20 61 69 54 79 70 65 5b 69 5d 3d  pe && aiType[i]=
e8d0: 3d 53 51 4c 49 54 45 5f 54 45 58 54 20 29 7b 0a  =SQLITE_TEXT ){.
e8e0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 53 68            if( Sh
e8f0: 65 6c 6c 48 61 73 46 6c 61 67 28 70 2c 20 53 48  ellHasFlag(p, SH
e900: 46 4c 47 5f 4e 65 77 6c 69 6e 65 73 29 20 29 7b  FLG_Newlines) ){
e910: 0a 20 20 20 20 20 20 20 20 20 20 20 20 6f 75 74  .            out
e920: 70 75 74 5f 71 75 6f 74 65 64 5f 73 74 72 69 6e  put_quoted_strin
e930: 67 28 70 2d 3e 6f 75 74 2c 20 61 7a 41 72 67 5b  g(p->out, azArg[
e940: 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  i]);.          }
e950: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
e960: 20 20 6f 75 74 70 75 74 5f 71 75 6f 74 65 64 5f    output_quoted_
e970: 65 73 63 61 70 65 64 5f 73 74 72 69 6e 67 28 70  escaped_string(p
e980: 2d 3e 6f 75 74 2c 20 61 7a 41 72 67 5b 69 5d 29  ->out, azArg[i])
e990: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
e9a0: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
e9b0: 61 69 54 79 70 65 20 26 26 20 61 69 54 79 70 65  aiType && aiType
e9c0: 5b 69 5d 3d 3d 53 51 4c 49 54 45 5f 49 4e 54 45  [i]==SQLITE_INTE
e9d0: 47 45 52 20 29 7b 0a 20 20 20 20 20 20 20 20 20  GER ){.         
e9e0: 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e   utf8_printf(p->
e9f0: 6f 75 74 2c 22 25 73 22 2c 20 61 7a 41 72 67 5b  out,"%s", azArg[
ea00: 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  i]);.        }el
ea10: 73 65 20 69 66 28 20 61 69 54 79 70 65 20 26 26  se if( aiType &&
ea20: 20 61 69 54 79 70 65 5b 69 5d 3d 3d 53 51 4c 49   aiType[i]==SQLI
ea30: 54 45 5f 46 4c 4f 41 54 20 29 7b 0a 20 20 20 20  TE_FLOAT ){.    
ea40: 20 20 20 20 20 20 63 68 61 72 20 7a 5b 35 30 5d        char z[50]
ea50: 3b 0a 20 20 20 20 20 20 20 20 20 20 64 6f 75 62  ;.          doub
ea60: 6c 65 20 72 20 3d 20 73 71 6c 69 74 65 33 5f 63  le r = sqlite3_c
ea70: 6f 6c 75 6d 6e 5f 64 6f 75 62 6c 65 28 70 2d 3e  olumn_double(p->
ea80: 70 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20 20 20  pStmt, i);.     
ea90: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
eaa0: 72 69 6e 74 66 28 35 30 2c 7a 2c 22 25 21 2e 32  rintf(50,z,"%!.2
eab0: 30 67 22 2c 20 72 29 3b 0a 20 20 20 20 20 20 20  0g", r);.       
eac0: 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d     raw_printf(p-
ead0: 3e 6f 75 74 2c 20 22 25 73 22 2c 20 7a 29 3b 0a  >out, "%s", z);.
eae0: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
eaf0: 28 20 61 69 54 79 70 65 20 26 26 20 61 69 54 79  ( aiType && aiTy
eb00: 70 65 5b 69 5d 3d 3d 53 51 4c 49 54 45 5f 42 4c  pe[i]==SQLITE_BL
eb10: 4f 42 20 26 26 20 70 2d 3e 70 53 74 6d 74 20 29  OB && p->pStmt )
eb20: 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73  {.          cons
eb30: 74 20 76 6f 69 64 20 2a 70 42 6c 6f 62 20 3d 20  t void *pBlob = 
eb40: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62  sqlite3_column_b
eb50: 6c 6f 62 28 70 2d 3e 70 53 74 6d 74 2c 20 69 29  lob(p->pStmt, i)
eb60: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  ;.          int 
eb70: 6e 42 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33 5f  nBlob = sqlite3_
eb80: 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 28 70 2d 3e  column_bytes(p->
eb90: 70 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20 20 20  pStmt, i);.     
eba0: 20 20 20 20 20 6f 75 74 70 75 74 5f 68 65 78 5f       output_hex_
ebb0: 62 6c 6f 62 28 70 2d 3e 6f 75 74 2c 20 70 42 6c  blob(p->out, pBl
ebc0: 6f 62 2c 20 6e 42 6c 6f 62 29 3b 0a 20 20 20 20  ob, nBlob);.    
ebd0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69 73      }else if( is
ebe0: 4e 75 6d 62 65 72 28 61 7a 41 72 67 5b 69 5d 2c  Number(azArg[i],
ebf0: 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20   0) ){.         
ec00: 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e   utf8_printf(p->
ec10: 6f 75 74 2c 22 25 73 22 2c 20 61 7a 41 72 67 5b  out,"%s", azArg[
ec20: 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  i]);.        }el
ec30: 73 65 20 69 66 28 20 53 68 65 6c 6c 48 61 73 46  se if( ShellHasF
ec40: 6c 61 67 28 70 2c 20 53 48 46 4c 47 5f 4e 65 77  lag(p, SHFLG_New
ec50: 6c 69 6e 65 73 29 20 29 7b 0a 20 20 20 20 20 20  lines) ){.      
ec60: 20 20 20 20 6f 75 74 70 75 74 5f 71 75 6f 74 65      output_quote
ec70: 64 5f 73 74 72 69 6e 67 28 70 2d 3e 6f 75 74 2c  d_string(p->out,
ec80: 20 61 7a 41 72 67 5b 69 5d 29 3b 0a 20 20 20 20   azArg[i]);.    
ec90: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
eca0: 20 20 20 20 20 6f 75 74 70 75 74 5f 71 75 6f 74       output_quot
ecb0: 65 64 5f 65 73 63 61 70 65 64 5f 73 74 72 69 6e  ed_escaped_strin
ecc0: 67 28 70 2d 3e 6f 75 74 2c 20 61 7a 41 72 67 5b  g(p->out, azArg[
ecd0: 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  i]);.        }. 
ece0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 61 77       }.      raw
ecf0: 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22  _printf(p->out,"
ed00: 29 3b 5c 6e 22 29 3b 0a 20 20 20 20 20 20 62 72  );\n");.      br
ed10: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
ed20: 61 73 65 20 4d 4f 44 45 5f 51 75 6f 74 65 3a 20  ase MODE_Quote: 
ed30: 7b 0a 20 20 20 20 20 20 69 66 28 20 61 7a 41 72  {.      if( azAr
ed40: 67 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  g==0 ) break;.  
ed50: 20 20 20 20 69 66 28 20 70 2d 3e 63 6e 74 3d 3d      if( p->cnt==
ed60: 30 20 26 26 20 70 2d 3e 73 68 6f 77 48 65 61 64  0 && p->showHead
ed70: 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6f  er ){.        fo
ed80: 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69  r(i=0; i<nArg; i
ed90: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  ++){.          i
eda0: 66 28 20 69 3e 30 20 29 20 72 61 77 5f 70 72 69  f( i>0 ) raw_pri
edb0: 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 2c 22 29  ntf(p->out, ",")
edc0: 3b 0a 20 20 20 20 20 20 20 20 20 20 6f 75 74 70  ;.          outp
edd0: 75 74 5f 71 75 6f 74 65 64 5f 73 74 72 69 6e 67  ut_quoted_string
ede0: 28 70 2d 3e 6f 75 74 2c 20 61 7a 43 6f 6c 5b 69  (p->out, azCol[i
edf0: 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ]);.        }.  
ee00: 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
ee10: 28 70 2d 3e 6f 75 74 2c 22 5c 6e 22 29 3b 0a 20  (p->out,"\n");. 
ee20: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e       }.      p->
ee30: 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 66 6f 72  cnt++;.      for
ee40: 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b  (i=0; i<nArg; i+
ee50: 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
ee60: 69 3e 30 20 29 20 72 61 77 5f 70 72 69 6e 74 66  i>0 ) raw_printf
ee70: 28 70 2d 3e 6f 75 74 2c 20 22 2c 22 29 3b 0a 20  (p->out, ",");. 
ee80: 20 20 20 20 20 20 20 69 66 28 20 28 61 7a 41 72         if( (azAr
ee90: 67 5b 69 5d 3d 3d 30 29 20 7c 7c 20 28 61 69 54  g[i]==0) || (aiT
eea0: 79 70 65 20 26 26 20 61 69 54 79 70 65 5b 69 5d  ype && aiType[i]
eeb0: 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 29 20 29  ==SQLITE_NULL) )
eec0: 7b 0a 20 20 20 20 20 20 20 20 20 20 75 74 66 38  {.          utf8
eed0: 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22  _printf(p->out,"
eee0: 4e 55 4c 4c 22 29 3b 0a 20 20 20 20 20 20 20 20  NULL");.        
eef0: 7d 65 6c 73 65 20 69 66 28 20 61 69 54 79 70 65  }else if( aiType
ef00: 20 26 26 20 61 69 54 79 70 65 5b 69 5d 3d 3d 53   && aiType[i]==S
ef10: 51 4c 49 54 45 5f 54 45 58 54 20 29 7b 0a 20 20  QLITE_TEXT ){.  
ef20: 20 20 20 20 20 20 20 20 6f 75 74 70 75 74 5f 71          output_q
ef30: 75 6f 74 65 64 5f 73 74 72 69 6e 67 28 70 2d 3e  uoted_string(p->
ef40: 6f 75 74 2c 20 61 7a 41 72 67 5b 69 5d 29 3b 0a  out, azArg[i]);.
ef50: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
ef60: 28 20 61 69 54 79 70 65 20 26 26 20 61 69 54 79  ( aiType && aiTy
ef70: 70 65 5b 69 5d 3d 3d 53 51 4c 49 54 45 5f 49 4e  pe[i]==SQLITE_IN
ef80: 54 45 47 45 52 20 29 7b 0a 20 20 20 20 20 20 20  TEGER ){.       
ef90: 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70     utf8_printf(p
efa0: 2d 3e 6f 75 74 2c 22 25 73 22 2c 20 61 7a 41 72  ->out,"%s", azAr
efb0: 67 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d  g[i]);.        }
efc0: 65 6c 73 65 20 69 66 28 20 61 69 54 79 70 65 20  else if( aiType 
efd0: 26 26 20 61 69 54 79 70 65 5b 69 5d 3d 3d 53 51  && aiType[i]==SQ
efe0: 4c 49 54 45 5f 46 4c 4f 41 54 20 29 7b 0a 20 20  LITE_FLOAT ){.  
eff0: 20 20 20 20 20 20 20 20 63 68 61 72 20 7a 5b 35          char z[5
f000: 30 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 64 6f  0];.          do
f010: 75 62 6c 65 20 72 20 3d 20 73 71 6c 69 74 65 33  uble r = sqlite3
f020: 5f 63 6f 6c 75 6d 6e 5f 64 6f 75 62 6c 65 28 70  _column_double(p
f030: 2d 3e 70 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20  ->pStmt, i);.   
f040: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73         sqlite3_s
f050: 6e 70 72 69 6e 74 66 28 35 30 2c 7a 2c 22 25 21  nprintf(50,z,"%!
f060: 2e 32 30 67 22 2c 20 72 29 3b 0a 20 20 20 20 20  .20g", r);.     
f070: 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
f080: 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20 7a 29  p->out, "%s", z)
f090: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
f0a0: 69 66 28 20 61 69 54 79 70 65 20 26 26 20 61 69  if( aiType && ai
f0b0: 54 79 70 65 5b 69 5d 3d 3d 53 51 4c 49 54 45 5f  Type[i]==SQLITE_
f0c0: 42 4c 4f 42 20 26 26 20 70 2d 3e 70 53 74 6d 74  BLOB && p->pStmt
f0d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6f   ){.          co
f0e0: 6e 73 74 20 76 6f 69 64 20 2a 70 42 6c 6f 62 20  nst void *pBlob 
f0f0: 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
f100: 5f 62 6c 6f 62 28 70 2d 3e 70 53 74 6d 74 2c 20  _blob(p->pStmt, 
f110: 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e  i);.          in
f120: 74 20 6e 42 6c 6f 62 20 3d 20 73 71 6c 69 74 65  t nBlob = sqlite
f130: 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 28 70  3_column_bytes(p
f140: 2d 3e 70 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20  ->pStmt, i);.   
f150: 20 20 20 20 20 20 20 6f 75 74 70 75 74 5f 68 65         output_he
f160: 78 5f 62 6c 6f 62 28 70 2d 3e 6f 75 74 2c 20 70  x_blob(p->out, p
f170: 42 6c 6f 62 2c 20 6e 42 6c 6f 62 29 3b 0a 20 20  Blob, nBlob);.  
f180: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
f190: 69 73 4e 75 6d 62 65 72 28 61 7a 41 72 67 5b 69  isNumber(azArg[i
f1a0: 5d 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20  ], 0) ){.       
f1b0: 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70     utf8_printf(p
f1c0: 2d 3e 6f 75 74 2c 22 25 73 22 2c 20 61 7a 41 72  ->out,"%s", azAr
f1d0: 67 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d  g[i]);.        }
f1e0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
f1f0: 6f 75 74 70 75 74 5f 71 75 6f 74 65 64 5f 73 74  output_quoted_st
f200: 72 69 6e 67 28 70 2d 3e 6f 75 74 2c 20 61 7a 41  ring(p->out, azA
f210: 72 67 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20  rg[i]);.        
f220: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
f230: 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  raw_printf(p->ou
f240: 74 2c 22 5c 6e 22 29 3b 0a 20 20 20 20 20 20 62  t,"\n");.      b
f250: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
f260: 63 61 73 65 20 4d 4f 44 45 5f 41 73 63 69 69 3a  case MODE_Ascii:
f270: 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e   {.      if( p->
f280: 63 6e 74 2b 2b 3d 3d 30 20 26 26 20 70 2d 3e 73  cnt++==0 && p->s
f290: 68 6f 77 48 65 61 64 65 72 20 29 7b 0a 20 20 20  howHeader ){.   
f2a0: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
f2b0: 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nArg; i++){.    
f2c0: 20 20 20 20 20 20 69 66 28 20 69 3e 30 20 29 20        if( i>0 ) 
f2d0: 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f  utf8_printf(p->o
f2e0: 75 74 2c 20 22 25 73 22 2c 20 70 2d 3e 63 6f 6c  ut, "%s", p->col
f2f0: 53 65 70 61 72 61 74 6f 72 29 3b 0a 20 20 20 20  Separator);.    
f300: 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
f310: 66 28 70 2d 3e 6f 75 74 2c 22 25 73 22 2c 61 7a  f(p->out,"%s",az
f320: 43 6f 6c 5b 69 5d 20 3f 20 61 7a 43 6f 6c 5b 69  Col[i] ? azCol[i
f330: 5d 20 3a 20 22 22 29 3b 0a 20 20 20 20 20 20 20  ] : "");.       
f340: 20 7d 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f   }.        utf8_
f350: 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
f360: 25 73 22 2c 20 70 2d 3e 72 6f 77 53 65 70 61 72  %s", p->rowSepar
f370: 61 74 6f 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ator);.      }. 
f380: 20 20 20 20 20 69 66 28 20 61 7a 41 72 67 3d 3d       if( azArg==
f390: 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  0 ) break;.     
f3a0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67   for(i=0; i<nArg
f3b0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
f3c0: 69 66 28 20 69 3e 30 20 29 20 75 74 66 38 5f 70  if( i>0 ) utf8_p
f3d0: 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25  rintf(p->out, "%
f3e0: 73 22 2c 20 70 2d 3e 63 6f 6c 53 65 70 61 72 61  s", p->colSepara
f3f0: 74 6f 72 29 3b 0a 20 20 20 20 20 20 20 20 75 74  tor);.        ut
f400: 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  f8_printf(p->out
f410: 2c 22 25 73 22 2c 61 7a 41 72 67 5b 69 5d 20 3f  ,"%s",azArg[i] ?
f420: 20 61 7a 41 72 67 5b 69 5d 20 3a 20 70 2d 3e 6e   azArg[i] : p->n
f430: 75 6c 6c 56 61 6c 75 65 29 3b 0a 20 20 20 20 20  ullValue);.     
f440: 20 7d 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72   }.      utf8_pr
f450: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73  intf(p->out, "%s
f460: 22 2c 20 70 2d 3e 72 6f 77 53 65 70 61 72 61 74  ", p->rowSeparat
f470: 6f 72 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  or);.      break
f480: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
f490: 20 4d 4f 44 45 5f 45 51 50 3a 20 7b 0a 20 20 20   MODE_EQP: {.   
f4a0: 20 20 20 65 71 70 5f 61 70 70 65 6e 64 28 70 2c     eqp_append(p,
f4b0: 20 61 74 6f 69 28 61 7a 41 72 67 5b 30 5d 29 2c   atoi(azArg[0]),
f4c0: 20 61 7a 41 72 67 5b 33 5d 29 3b 0a 20 20 20 20   azArg[3]);.    
f4d0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
f4e0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
f4f0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ../*.** This is 
f500: 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 72 6f 75  the callback rou
f510: 74 69 6e 65 20 74 68 61 74 20 74 68 65 20 53 51  tine that the SQ
f520: 4c 69 74 65 20 6c 69 62 72 61 72 79 0a 2a 2a 20  Lite library.** 
f530: 69 6e 76 6f 6b 65 73 20 66 6f 72 20 65 61 63 68  invokes for each
f540: 20 72 6f 77 20 6f 66 20 61 20 71 75 65 72 79 20   row of a query 
f550: 72 65 73 75 6c 74 2e 0a 2a 2f 0a 73 74 61 74 69  result..*/.stati
f560: 63 20 69 6e 74 20 63 61 6c 6c 62 61 63 6b 28 76  c int callback(v
f570: 6f 69 64 20 2a 70 41 72 67 2c 20 69 6e 74 20 6e  oid *pArg, int n
f580: 41 72 67 2c 20 63 68 61 72 20 2a 2a 61 7a 41 72  Arg, char **azAr
f590: 67 2c 20 63 68 61 72 20 2a 2a 61 7a 43 6f 6c 29  g, char **azCol)
f5a0: 7b 0a 20 20 2f 2a 20 73 69 6e 63 65 20 77 65 20  {.  /* since we 
f5b0: 64 6f 6e 27 74 20 68 61 76 65 20 74 79 70 65 20  don't have type 
f5c0: 69 6e 66 6f 2c 20 63 61 6c 6c 20 74 68 65 20 73  info, call the s
f5d0: 68 65 6c 6c 5f 63 61 6c 6c 62 61 63 6b 20 77 69  hell_callback wi
f5e0: 74 68 20 61 20 4e 55 4c 4c 20 76 61 6c 75 65 20  th a NULL value 
f5f0: 2a 2f 0a 20 20 72 65 74 75 72 6e 20 73 68 65 6c  */.  return shel
f600: 6c 5f 63 61 6c 6c 62 61 63 6b 28 70 41 72 67 2c  l_callback(pArg,
f610: 20 6e 41 72 67 2c 20 61 7a 41 72 67 2c 20 61 7a   nArg, azArg, az
f620: 43 6f 6c 2c 20 4e 55 4c 4c 29 3b 0a 7d 0a 0a 2f  Col, NULL);.}../
f630: 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65  *.** This is the
f640: 20 63 61 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e   callback routin
f650: 65 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 65  e from sqlite3_e
f660: 78 65 63 28 29 20 74 68 61 74 20 61 70 70 65 6e  xec() that appen
f670: 64 73 20 61 6c 6c 0a 2a 2a 20 6f 75 74 70 75 74  ds all.** output
f680: 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f 66   onto the end of
f690: 20 61 20 53 68 65 6c 6c 54 65 78 74 20 6f 62 6a   a ShellText obj
f6a0: 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ect..*/.static i
f6b0: 6e 74 20 63 61 70 74 75 72 65 4f 75 74 70 75 74  nt captureOutput
f6c0: 43 61 6c 6c 62 61 63 6b 28 76 6f 69 64 20 2a 70  Callback(void *p
f6d0: 41 72 67 2c 20 69 6e 74 20 6e 41 72 67 2c 20 63  Arg, int nArg, c
f6e0: 68 61 72 20 2a 2a 61 7a 41 72 67 2c 20 63 68 61  har **azArg, cha
f6f0: 72 20 2a 2a 61 7a 29 7b 0a 20 20 53 68 65 6c 6c  r **az){.  Shell
f700: 54 65 78 74 20 2a 70 20 3d 20 28 53 68 65 6c 6c  Text *p = (Shell
f710: 54 65 78 74 2a 29 70 41 72 67 3b 0a 20 20 69 6e  Text*)pArg;.  in
f720: 74 20 69 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  t i;.  UNUSED_PA
f730: 52 41 4d 45 54 45 52 28 61 7a 29 3b 0a 20 20 69  RAMETER(az);.  i
f740: 66 28 20 61 7a 41 72 67 3d 3d 30 20 29 20 72 65  f( azArg==0 ) re
f750: 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 2d  turn 0;.  if( p-
f760: 3e 6e 20 29 20 61 70 70 65 6e 64 54 65 78 74 28  >n ) appendText(
f770: 70 2c 20 22 7c 22 2c 20 30 29 3b 0a 20 20 66 6f  p, "|", 0);.  fo
f780: 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69  r(i=0; i<nArg; i
f790: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 69 20 29  ++){.    if( i )
f7a0: 20 61 70 70 65 6e 64 54 65 78 74 28 70 2c 20 22   appendText(p, "
f7b0: 2c 22 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  ,", 0);.    if( 
f7c0: 61 7a 41 72 67 5b 69 5d 20 29 20 61 70 70 65 6e  azArg[i] ) appen
f7d0: 64 54 65 78 74 28 70 2c 20 61 7a 41 72 67 5b 69  dText(p, azArg[i
f7e0: 5d 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74  ], 0);.  }.  ret
f7f0: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
f800: 47 65 6e 65 72 61 74 65 20 61 6e 20 61 70 70 72  Generate an appr
f810: 6f 70 72 69 61 74 65 20 53 45 4c 46 54 45 53 54  opriate SELFTEST
f820: 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20 6d 61   table in the ma
f830: 69 6e 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a  in database..*/.
f840: 73 74 61 74 69 63 20 76 6f 69 64 20 63 72 65 61  static void crea
f850: 74 65 53 65 6c 66 74 65 73 74 54 61 62 6c 65 28  teSelftestTable(
f860: 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 29 7b 0a  ShellState *p){.
f870: 20 20 63 68 61 72 20 2a 7a 45 72 72 4d 73 67 20    char *zErrMsg 
f880: 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 65  = 0;.  sqlite3_e
f890: 78 65 63 28 70 2d 3e 64 62 2c 0a 20 20 20 20 22  xec(p->db,.    "
f8a0: 53 41 56 45 50 4f 49 4e 54 20 73 65 6c 66 74 65  SAVEPOINT selfte
f8b0: 73 74 5f 69 6e 69 74 3b 5c 6e 22 0a 20 20 20 20  st_init;\n".    
f8c0: 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 49 46  "CREATE TABLE IF
f8d0: 20 4e 4f 54 20 45 58 49 53 54 53 20 73 65 6c 66   NOT EXISTS self
f8e0: 74 65 73 74 28 5c 6e 22 0a 20 20 20 20 22 20 20  test(\n".    "  
f8f0: 74 6e 6f 20 49 4e 54 45 47 45 52 20 50 52 49 4d  tno INTEGER PRIM
f900: 41 52 59 20 4b 45 59 2c 5c 6e 22 20 20 20 2f 2a  ARY KEY,\n"   /*
f910: 20 54 65 73 74 20 6e 75 6d 62 65 72 20 2a 2f 0a   Test number */.
f920: 20 20 20 20 22 20 20 6f 70 20 54 45 58 54 2c 5c      "  op TEXT,\
f930: 6e 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n"              
f940: 20 20 20 20 20 2f 2a 20 4f 70 65 72 61 74 6f 72       /* Operator
f950: 3a 20 20 6d 65 6d 6f 20 72 75 6e 20 2a 2f 0a 20  :  memo run */. 
f960: 20 20 20 22 20 20 63 6d 64 20 54 45 58 54 2c 5c     "  cmd TEXT,\
f970: 6e 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n"              
f980: 20 20 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 74      /* Command t
f990: 65 78 74 20 2a 2f 0a 20 20 20 20 22 20 20 61 6e  ext */.    "  an
f9a0: 73 20 54 45 58 54 5c 6e 22 20 20 20 20 20 20 20  s TEXT\n"       
f9b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
f9c0: 65 73 69 72 65 64 20 61 6e 73 77 65 72 20 2a 2f  esired answer */
f9d0: 0a 20 20 20 20 22 29 3b 22 0a 20 20 20 20 22 43  .    ");".    "C
f9e0: 52 45 41 54 45 20 54 45 4d 50 20 54 41 42 4c 45  REATE TEMP TABLE
f9f0: 20 5b 5f 73 68 65 6c 6c 24 73 65 6c 66 5d 28 6f   [_shell$self](o
fa00: 70 2c 63 6d 64 2c 61 6e 73 29 3b 5c 6e 22 0a 20  p,cmd,ans);\n". 
fa10: 20 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20     "INSERT INTO 
fa20: 5b 5f 73 68 65 6c 6c 24 73 65 6c 66 5d 28 72 6f  [_shell$self](ro
fa30: 77 69 64 2c 6f 70 2c 63 6d 64 29 5c 6e 22 0a 20  wid,op,cmd)\n". 
fa40: 20 20 20 22 20 20 56 41 4c 55 45 53 28 63 6f 61     "  VALUES(coa
fa50: 6c 65 73 63 65 28 28 53 45 4c 45 43 54 20 28 6d  lesce((SELECT (m
fa60: 61 78 28 74 6e 6f 29 2b 31 30 30 29 2f 31 30 20  ax(tno)+100)/10 
fa70: 46 52 4f 4d 20 73 65 6c 66 74 65 73 74 29 2c 31  FROM selftest),1
fa80: 30 29 2c 5c 6e 22 0a 20 20 20 20 22 20 20 20 20  0),\n".    "    
fa90: 20 20 20 20 20 27 6d 65 6d 6f 27 2c 27 54 65 73       'memo','Tes
faa0: 74 73 20 67 65 6e 65 72 61 74 65 64 20 62 79 20  ts generated by 
fab0: 2d 2d 69 6e 69 74 27 29 3b 5c 6e 22 0a 20 20 20  --init');\n".   
fac0: 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 5b 5f   "INSERT INTO [_
fad0: 73 68 65 6c 6c 24 73 65 6c 66 5d 5c 6e 22 0a 20  shell$self]\n". 
fae0: 20 20 20 22 20 20 53 45 4c 45 43 54 20 27 72 75     "  SELECT 'ru
faf0: 6e 27 2c 5c 6e 22 0a 20 20 20 20 22 20 20 20 20  n',\n".    "    
fb00: 27 53 45 4c 45 43 54 20 68 65 78 28 73 68 61 33  'SELECT hex(sha3
fb10: 5f 71 75 65 72 79 28 27 27 53 45 4c 45 43 54 20  _query(''SELECT 
fb20: 74 79 70 65 2c 6e 61 6d 65 2c 74 62 6c 5f 6e 61  type,name,tbl_na
fb30: 6d 65 2c 73 71 6c 20 22 0a 20 20 20 20 20 20 20  me,sql ".       
fb40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fb50: 20 20 20 20 20 20 20 20 20 20 22 46 52 4f 4d 20            "FROM 
fb60: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 4f 52  sqlite_master OR
fb70: 44 45 52 20 42 59 20 32 27 27 2c 32 32 34 29 29  DER BY 2'',224))
fb80: 27 2c 5c 6e 22 0a 20 20 20 20 22 20 20 20 20 68  ',\n".    "    h
fb90: 65 78 28 73 68 61 33 5f 71 75 65 72 79 28 27 53  ex(sha3_query('S
fba0: 45 4c 45 43 54 20 74 79 70 65 2c 6e 61 6d 65 2c  ELECT type,name,
fbb0: 74 62 6c 5f 6e 61 6d 65 2c 73 71 6c 20 22 0a 20  tbl_name,sql ". 
fbc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fbd0: 20 20 20 20 20 20 20 20 20 22 46 52 4f 4d 20 73           "FROM s
fbe0: 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 4f 52 44  qlite_master ORD
fbf0: 45 52 20 42 59 20 32 27 2c 32 32 34 29 29 3b 5c  ER BY 2',224));\
fc00: 6e 22 0a 20 20 20 20 22 49 4e 53 45 52 54 20 49  n".    "INSERT I
fc10: 4e 54 4f 20 5b 5f 73 68 65 6c 6c 24 73 65 6c 66  NTO [_shell$self
fc20: 5d 5c 6e 22 0a 20 20 20 20 22 20 20 53 45 4c 45  ]\n".    "  SELE
fc30: 43 54 20 27 72 75 6e 27 2c 22 0a 20 20 20 20 22  CT 'run',".    "
fc40: 20 20 20 20 27 53 45 4c 45 43 54 20 68 65 78 28      'SELECT hex(
fc50: 73 68 61 33 5f 71 75 65 72 79 28 27 27 53 45 4c  sha3_query(''SEL
fc60: 45 43 54 20 2a 20 46 52 4f 4d 20 5c 22 27 20 7c  ECT * FROM \"' |
fc70: 7c 22 0a 20 20 20 20 22 20 20 20 20 20 20 20 20  |".    "        
fc80: 70 72 69 6e 74 66 28 27 25 77 27 2c 6e 61 6d 65  printf('%w',name
fc90: 29 20 7c 7c 20 27 5c 22 20 4e 4f 54 20 49 4e 44  ) || '\" NOT IND
fca0: 45 58 45 44 27 27 2c 32 32 34 29 29 27 2c 5c 6e  EXED'',224))',\n
fcb0: 22 0a 20 20 20 20 22 20 20 20 20 68 65 78 28 73  ".    "    hex(s
fcc0: 68 61 33 5f 71 75 65 72 79 28 70 72 69 6e 74 66  ha3_query(printf
fcd0: 28 27 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  ('SELECT * FROM 
fce0: 5c 22 25 77 5c 22 20 4e 4f 54 20 49 4e 44 45 58  \"%w\" NOT INDEX
fcf0: 45 44 27 2c 6e 61 6d 65 29 2c 32 32 34 29 29 5c  ED',name),224))\
fd00: 6e 22 0a 20 20 20 20 22 20 20 46 52 4f 4d 20 28  n".    "  FROM (
fd10: 5c 6e 22 0a 20 20 20 20 22 20 20 20 20 53 45 4c  \n".    "    SEL
fd20: 45 43 54 20 6e 61 6d 65 20 46 52 4f 4d 20 73 71  ECT name FROM sq
fd30: 6c 69 74 65 5f 6d 61 73 74 65 72 5c 6e 22 0a 20  lite_master\n". 
fd40: 20 20 20 22 20 20 20 20 20 57 48 45 52 45 20 74     "     WHERE t
fd50: 79 70 65 3d 27 74 61 62 6c 65 27 5c 6e 22 0a 20  ype='table'\n". 
fd60: 20 20 20 22 20 20 20 20 20 20 20 41 4e 44 20 6e     "       AND n
fd70: 61 6d 65 3c 3e 27 73 65 6c 66 74 65 73 74 27 5c  ame<>'selftest'\
fd80: 6e 22 0a 20 20 20 20 22 20 20 20 20 20 20 20 41  n".    "       A
fd90: 4e 44 20 63 6f 61 6c 65 73 63 65 28 72 6f 6f 74  ND coalesce(root
fda0: 70 61 67 65 2c 30 29 3e 30 5c 6e 22 0a 20 20 20  page,0)>0\n".   
fdb0: 20 22 20 20 29 5c 6e 22 0a 20 20 20 20 22 20 4f   "  )\n".    " O
fdc0: 52 44 45 52 20 42 59 20 6e 61 6d 65 3b 5c 6e 22  RDER BY name;\n"
fdd0: 0a 20 20 20 20 22 49 4e 53 45 52 54 20 49 4e 54  .    "INSERT INT
fde0: 4f 20 5b 5f 73 68 65 6c 6c 24 73 65 6c 66 5d 5c  O [_shell$self]\
fdf0: 6e 22 0a 20 20 20 20 22 20 20 56 41 4c 55 45 53  n".    "  VALUES
fe00: 28 27 72 75 6e 27 2c 27 50 52 41 47 4d 41 20 69  ('run','PRAGMA i
fe10: 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 27 2c  ntegrity_check',
fe20: 27 6f 6b 27 29 3b 5c 6e 22 0a 20 20 20 20 22 49  'ok');\n".    "I
fe30: 4e 53 45 52 54 20 49 4e 54 4f 20 73 65 6c 66 74  NSERT INTO selft
fe40: 65 73 74 28 74 6e 6f 2c 6f 70 2c 63 6d 64 2c 61  est(tno,op,cmd,a
fe50: 6e 73 29 22 0a 20 20 20 20 22 20 20 53 45 4c 45  ns)".    "  SELE
fe60: 43 54 20 72 6f 77 69 64 2a 31 30 2c 6f 70 2c 63  CT rowid*10,op,c
fe70: 6d 64 2c 61 6e 73 20 46 52 4f 4d 20 5b 5f 73 68  md,ans FROM [_sh
fe80: 65 6c 6c 24 73 65 6c 66 5d 3b 5c 6e 22 0a 20 20  ell$self];\n".  
fe90: 20 20 22 44 52 4f 50 20 54 41 42 4c 45 20 5b 5f    "DROP TABLE [_
fea0: 73 68 65 6c 6c 24 73 65 6c 66 5d 3b 22 0a 20 20  shell$self];".  
feb0: 20 20 2c 30 2c 30 2c 26 7a 45 72 72 4d 73 67 29    ,0,0,&zErrMsg)
fec0: 3b 0a 20 20 69 66 28 20 7a 45 72 72 4d 73 67 20  ;.  if( zErrMsg 
fed0: 29 7b 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e  ){.    utf8_prin
fee0: 74 66 28 73 74 64 65 72 72 2c 20 22 53 45 4c 46  tf(stderr, "SELF
fef0: 54 45 53 54 20 69 6e 69 74 69 61 6c 69 7a 61 74  TEST initializat
ff00: 69 6f 6e 20 66 61 69 6c 75 72 65 3a 20 25 73 5c  ion failure: %s\
ff10: 6e 22 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20 20  n", zErrMsg);.  
ff20: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
ff30: 45 72 72 4d 73 67 29 3b 0a 20 20 7d 0a 20 20 73  ErrMsg);.  }.  s
ff40: 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64  qlite3_exec(p->d
ff50: 62 2c 20 22 52 45 4c 45 41 53 45 20 73 65 6c 66  b, "RELEASE self
ff60: 74 65 73 74 5f 69 6e 69 74 22 2c 30 2c 30 2c 30  test_init",0,0,0
ff70: 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  );.}.../*.** Set
ff80: 20 74 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e   the destination
ff90: 20 74 61 62 6c 65 20 66 69 65 6c 64 20 6f 66 20   table field of 
ffa0: 74 68 65 20 53 68 65 6c 6c 53 74 61 74 65 20 73  the ShellState s
ffb0: 74 72 75 63 74 75 72 65 20 74 6f 0a 2a 2a 20 74  tructure to.** t
ffc0: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74  he name of the t
ffd0: 61 62 6c 65 20 67 69 76 65 6e 2e 20 20 45 73 63  able given.  Esc
ffe0: 61 70 65 20 61 6e 79 20 71 75 6f 74 65 20 63 68  ape any quote ch
fff0: 61 72 61 63 74 65 72 73 20 69 6e 20 74 68 65 0a  aracters in the.
10000 2a 2a 20 74 61 62 6c 65 20 6e 61 6d 65 2e 0a 2a  ** table name..*
10010 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65  /.static void se
10020 74 5f 74 61 62 6c 65 5f 6e 61 6d 65 28 53 68 65  t_table_name(She
10030 6c 6c 53 74 61 74 65 20 2a 70 2c 20 63 6f 6e 73  llState *p, cons
10040 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a  t char *zName){.
10050 20 20 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 63 68    int i, n;.  ch
10060 61 72 20 63 51 75 6f 74 65 3b 0a 20 20 63 68 61  ar cQuote;.  cha
10070 72 20 2a 7a 3b 0a 0a 20 20 69 66 28 20 70 2d 3e  r *z;..  if( p->
10080 7a 44 65 73 74 54 61 62 6c 65 20 29 7b 0a 20 20  zDestTable ){.  
10090 20 20 66 72 65 65 28 70 2d 3e 7a 44 65 73 74 54    free(p->zDestT
100a0 61 62 6c 65 29 3b 0a 20 20 20 20 70 2d 3e 7a 44  able);.    p->zD
100b0 65 73 74 54 61 62 6c 65 20 3d 20 30 3b 0a 20 20  estTable = 0;.  
100c0 7d 0a 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30  }.  if( zName==0
100d0 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 63 51 75   ) return;.  cQu
100e0 6f 74 65 20 3d 20 71 75 6f 74 65 43 68 61 72 28  ote = quoteChar(
100f0 7a 4e 61 6d 65 29 3b 0a 20 20 6e 20 3d 20 73 74  zName);.  n = st
10100 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 3b 0a 20  rlen30(zName);. 
10110 20 69 66 28 20 63 51 75 6f 74 65 20 29 20 6e 20   if( cQuote ) n 
10120 2b 3d 20 6e 2b 32 3b 0a 20 20 7a 20 3d 20 70 2d  += n+2;.  z = p-
10130 3e 7a 44 65 73 74 54 61 62 6c 65 20 3d 20 6d 61  >zDestTable = ma
10140 6c 6c 6f 63 28 20 6e 2b 31 20 29 3b 0a 20 20 69  lloc( n+1 );.  i
10150 66 28 20 7a 3d 3d 30 20 29 20 73 68 65 6c 6c 5f  f( z==0 ) shell_
10160 6f 75 74 5f 6f 66 5f 6d 65 6d 6f 72 79 28 29 3b  out_of_memory();
10170 0a 20 20 6e 20 3d 20 30 3b 0a 20 20 69 66 28 20  .  n = 0;.  if( 
10180 63 51 75 6f 74 65 20 29 20 7a 5b 6e 2b 2b 5d 20  cQuote ) z[n++] 
10190 3d 20 63 51 75 6f 74 65 3b 0a 20 20 66 6f 72 28  = cQuote;.  for(
101a0 69 3d 30 3b 20 7a 4e 61 6d 65 5b 69 5d 3b 20 69  i=0; zName[i]; i
101b0 2b 2b 29 7b 0a 20 20 20 20 7a 5b 6e 2b 2b 5d 20  ++){.    z[n++] 
101c0 3d 20 7a 4e 61 6d 65 5b 69 5d 3b 0a 20 20 20 20  = zName[i];.    
101d0 69 66 28 20 7a 4e 61 6d 65 5b 69 5d 3d 3d 63 51  if( zName[i]==cQ
101e0 75 6f 74 65 20 29 20 7a 5b 6e 2b 2b 5d 20 3d 20  uote ) z[n++] = 
101f0 63 51 75 6f 74 65 3b 0a 20 20 7d 0a 20 20 69 66  cQuote;.  }.  if
10200 28 20 63 51 75 6f 74 65 20 29 20 7a 5b 6e 2b 2b  ( cQuote ) z[n++
10210 5d 20 3d 20 63 51 75 6f 74 65 3b 0a 20 20 7a 5b  ] = cQuote;.  z[
10220 6e 5d 20 3d 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  n] = 0;.}.../*.*
10230 2a 20 45 78 65 63 75 74 65 20 61 20 71 75 65 72  * Execute a quer
10240 79 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74  y statement that
10250 20 77 69 6c 6c 20 67 65 6e 65 72 61 74 65 20 53   will generate S
10260 51 4c 20 6f 75 74 70 75 74 2e 20 20 50 72 69 6e  QL output.  Prin
10270 74 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20  t.** the result 
10280 63 6f 6c 75 6d 6e 73 2c 20 63 6f 6d 6d 61 2d 73  columns, comma-s
10290 65 70 61 72 61 74 65 64 2c 20 6f 6e 20 61 20 6c  eparated, on a l
102a0 69 6e 65 20 61 6e 64 20 74 68 65 6e 20 61 64 64  ine and then add
102b0 20 61 0a 2a 2a 20 73 65 6d 69 63 6f 6c 6f 6e 20   a.** semicolon 
102c0 74 65 72 6d 69 6e 61 74 6f 72 20 74 6f 20 74 68  terminator to th
102d0 65 20 65 6e 64 20 6f 66 20 74 68 61 74 20 6c 69  e end of that li
102e0 6e 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ne..**.** If the
102f0 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   number of colum
10300 6e 73 20 69 73 20 31 20 61 6e 64 20 74 68 61 74  ns is 1 and that
10310 20 63 6f 6c 75 6d 6e 20 63 6f 6e 74 61 69 6e 73   column contains
10320 20 74 65 78 74 20 22 2d 2d 22 0a 2a 2a 20 74 68   text "--".** th
10330 65 6e 20 77 72 69 74 65 20 74 68 65 20 73 65 6d  en write the sem
10340 69 63 6f 6c 6f 6e 20 6f 6e 20 61 20 73 65 70 61  icolon on a sepa
10350 72 61 74 65 20 6c 69 6e 65 2e 20 20 54 68 61 74  rate line.  That
10360 20 77 61 79 2c 20 69 66 20 61 0a 2a 2a 20 22 2d   way, if a.** "-
10370 2d 22 20 63 6f 6d 6d 65 6e 74 20 6f 63 63 75 72  -" comment occur
10380 73 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  s at the end of 
10390 74 68 65 20 73 74 61 74 65 6d 65 6e 74 2c 20 74  the statement, t
103a0 68 65 20 63 6f 6d 6d 65 6e 74 0a 2a 2a 20 77 6f  he comment.** wo
103b0 6e 27 74 20 63 6f 6e 73 75 6d 65 20 74 68 65 20  n't consume the 
103c0 73 65 6d 69 63 6f 6c 6f 6e 20 74 65 72 6d 69 6e  semicolon termin
103d0 61 74 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ator..*/.static 
103e0 69 6e 74 20 72 75 6e 5f 74 61 62 6c 65 5f 64 75  int run_table_du
103f0 6d 70 5f 71 75 65 72 79 28 0a 20 20 53 68 65 6c  mp_query(.  Shel
10400 6c 53 74 61 74 65 20 2a 70 2c 20 20 20 20 20 20  lState *p,      
10410 20 20 20 20 20 2f 2a 20 51 75 65 72 79 20 63 6f       /* Query co
10420 6e 74 65 78 74 20 2a 2f 0a 20 20 63 6f 6e 73 74  ntext */.  const
10430 20 63 68 61 72 20 2a 7a 53 65 6c 65 63 74 2c 20   char *zSelect, 
10440 20 20 20 20 2f 2a 20 53 45 4c 45 43 54 20 73 74      /* SELECT st
10450 61 74 65 6d 65 6e 74 20 74 6f 20 65 78 74 72 61  atement to extra
10460 63 74 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20  ct content */.  
10470 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 72  const char *zFir
10480 73 74 52 6f 77 20 20 20 20 2f 2a 20 50 72 69 6e  stRow    /* Prin
10490 74 20 62 65 66 6f 72 65 20 66 69 72 73 74 20 72  t before first r
104a0 6f 77 2c 20 69 66 20 6e 6f 74 20 4e 55 4c 4c 20  ow, if not NULL 
104b0 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  */.){.  sqlite3_
104c0 73 74 6d 74 20 2a 70 53 65 6c 65 63 74 3b 0a 20  stmt *pSelect;. 
104d0 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 6e   int rc;.  int n
104e0 52 65 73 75 6c 74 3b 0a 20 20 69 6e 74 20 69 3b  Result;.  int i;
104f0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
10500 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
10510 5f 70 72 65 70 61 72 65 5f 76 32 28 70 2d 3e 64  _prepare_v2(p->d
10520 62 2c 20 7a 53 65 6c 65 63 74 2c 20 2d 31 2c 20  b, zSelect, -1, 
10530 26 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20  &pSelect, 0);.  
10540 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
10550 4b 20 7c 7c 20 21 70 53 65 6c 65 63 74 20 29 7b  K || !pSelect ){
10560 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66  .    utf8_printf
10570 28 70 2d 3e 6f 75 74 2c 20 22 2f 2a 2a 2a 2a 20  (p->out, "/**** 
10580 45 52 52 4f 52 3a 20 28 25 64 29 20 25 73 20 2a  ERROR: (%d) %s *
10590 2a 2a 2a 2a 2f 5c 6e 22 2c 20 72 63 2c 0a 20 20  ****/\n", rc,.  
105a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
105b0 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 2d 3e  lite3_errmsg(p->
105c0 64 62 29 29 3b 0a 20 20 20 20 69 66 28 20 28 72  db));.    if( (r
105d0 63 26 30 78 66 66 29 21 3d 53 51 4c 49 54 45 5f  c&0xff)!=SQLITE_
105e0 43 4f 52 52 55 50 54 20 29 20 70 2d 3e 6e 45 72  CORRUPT ) p->nEr
105f0 72 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  r++;.    return 
10600 72 63 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73  rc;.  }.  rc = s
10610 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 65 6c  qlite3_step(pSel
10620 65 63 74 29 3b 0a 20 20 6e 52 65 73 75 6c 74 20  ect);.  nResult 
10630 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
10640 5f 63 6f 75 6e 74 28 70 53 65 6c 65 63 74 29 3b  _count(pSelect);
10650 0a 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51  .  while( rc==SQ
10660 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20  LITE_ROW ){.    
10670 69 66 28 20 7a 46 69 72 73 74 52 6f 77 20 29 7b  if( zFirstRow ){
10680 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e  .      utf8_prin
10690 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c  tf(p->out, "%s",
106a0 20 7a 46 69 72 73 74 52 6f 77 29 3b 0a 20 20 20   zFirstRow);.   
106b0 20 20 20 7a 46 69 72 73 74 52 6f 77 20 3d 20 30     zFirstRow = 0
106c0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 20 3d 20  ;.    }.    z = 
106d0 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c  (const char*)sql
106e0 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  ite3_column_text
106f0 28 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20  (pSelect, 0);.  
10700 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d    utf8_printf(p-
10710 3e 6f 75 74 2c 20 22 25 73 22 2c 20 7a 29 3b 0a  >out, "%s", z);.
10720 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e      for(i=1; i<n
10730 52 65 73 75 6c 74 3b 20 69 2b 2b 29 7b 0a 20 20  Result; i++){.  
10740 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
10750 70 2d 3e 6f 75 74 2c 20 22 2c 25 73 22 2c 20 73  p->out, ",%s", s
10760 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
10770 78 74 28 70 53 65 6c 65 63 74 2c 20 69 29 29 3b  xt(pSelect, i));
10780 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 7a  .    }.    if( z
10790 3d 3d 30 20 29 20 7a 20 3d 20 22 22 3b 0a 20 20  ==0 ) z = "";.  
107a0 20 20 77 68 69 6c 65 28 20 7a 5b 30 5d 20 26 26    while( z[0] &&
107b0 20 28 7a 5b 30 5d 21 3d 27 2d 27 20 7c 7c 20 7a   (z[0]!='-' || z
107c0 5b 31 5d 21 3d 27 2d 27 29 20 29 20 7a 2b 2b 3b  [1]!='-') ) z++;
107d0 0a 20 20 20 20 69 66 28 20 7a 5b 30 5d 20 29 7b  .    if( z[0] ){
107e0 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74  .      raw_print
107f0 66 28 70 2d 3e 6f 75 74 2c 20 22 5c 6e 3b 5c 6e  f(p->out, "\n;\n
10800 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ");.    }else{. 
10810 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
10820 70 2d 3e 6f 75 74 2c 20 22 3b 5c 6e 22 29 3b 0a  p->out, ";\n");.
10830 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73      }.    rc = s
10840 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 65 6c  qlite3_step(pSel
10850 65 63 74 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  ect);.  }.  rc =
10860 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
10870 65 28 70 53 65 6c 65 63 74 29 3b 0a 20 20 69 66  e(pSelect);.  if
10880 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
10890 29 7b 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e  ){.    utf8_prin
108a0 74 66 28 70 2d 3e 6f 75 74 2c 20 22 2f 2a 2a 2a  tf(p->out, "/***
108b0 2a 20 45 52 52 4f 52 3a 20 28 25 64 29 20 25 73  * ERROR: (%d) %s
108c0 20 2a 2a 2a 2a 2a 2f 5c 6e 22 2c 20 72 63 2c 0a   *****/\n", rc,.
108d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
108e0 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70  sqlite3_errmsg(p
108f0 2d 3e 64 62 29 29 3b 0a 20 20 20 20 69 66 28 20  ->db));.    if( 
10900 28 72 63 26 30 78 66 66 29 21 3d 53 51 4c 49 54  (rc&0xff)!=SQLIT
10910 45 5f 43 4f 52 52 55 50 54 20 29 20 70 2d 3e 6e  E_CORRUPT ) p->n
10920 45 72 72 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74  Err++;.  }.  ret
10930 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
10940 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20   Allocate space 
10950 61 6e 64 20 73 61 76 65 20 6f 66 66 20 63 75 72  and save off cur
10960 72 65 6e 74 20 65 72 72 6f 72 20 73 74 72 69 6e  rent error strin
10970 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61  g..*/.static cha
10980 72 20 2a 73 61 76 65 5f 65 72 72 5f 6d 73 67 28  r *save_err_msg(
10990 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 20  .  sqlite3 *db  
109a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
109b0 61 62 61 73 65 20 74 6f 20 71 75 65 72 79 20 2a  abase to query *
109c0 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 45 72 72 4d  /.){.  int nErrM
109d0 73 67 20 3d 20 31 2b 73 74 72 6c 65 6e 33 30 28  sg = 1+strlen30(
109e0 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 64  sqlite3_errmsg(d
109f0 62 29 29 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72  b));.  char *zEr
10a00 72 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d  rMsg = sqlite3_m
10a10 61 6c 6c 6f 63 36 34 28 6e 45 72 72 4d 73 67 29  alloc64(nErrMsg)
10a20 3b 0a 20 20 69 66 28 20 7a 45 72 72 4d 73 67 20  ;.  if( zErrMsg 
10a30 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a 45  ){.    memcpy(zE
10a40 72 72 4d 73 67 2c 20 73 71 6c 69 74 65 33 5f 65  rrMsg, sqlite3_e
10a50 72 72 6d 73 67 28 64 62 29 2c 20 6e 45 72 72 4d  rrmsg(db), nErrM
10a60 73 67 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  sg);.  }.  retur
10a70 6e 20 7a 45 72 72 4d 73 67 3b 0a 7d 0a 0a 23 69  n zErrMsg;.}..#i
10a80 66 64 65 66 20 5f 5f 6c 69 6e 75 78 5f 5f 0a 2f  fdef __linux__./
10a90 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20  *.** Attempt to 
10aa0 64 69 73 70 6c 61 79 20 49 2f 4f 20 73 74 61 74  display I/O stat
10ab0 73 20 6f 6e 20 4c 69 6e 75 78 20 75 73 69 6e 67  s on Linux using
10ac0 20 2f 70 72 6f 63 2f 50 49 44 2f 69 6f 0a 2a 2f   /proc/PID/io.*/
10ad0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64 69 73  .static void dis
10ae0 70 6c 61 79 4c 69 6e 75 78 49 6f 53 74 61 74 73  playLinuxIoStats
10af0 28 46 49 4c 45 20 2a 6f 75 74 29 7b 0a 20 20 46  (FILE *out){.  F
10b00 49 4c 45 20 2a 69 6e 3b 0a 20 20 63 68 61 72 20  ILE *in;.  char 
10b10 7a 5b 32 30 30 5d 3b 0a 20 20 73 71 6c 69 74 65  z[200];.  sqlite
10b20 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
10b30 66 28 7a 29 2c 20 7a 2c 20 22 2f 70 72 6f 63 2f  f(z), z, "/proc/
10b40 25 64 2f 69 6f 22 2c 20 67 65 74 70 69 64 28 29  %d/io", getpid()
10b50 29 3b 0a 20 20 69 6e 20 3d 20 66 6f 70 65 6e 28  );.  in = fopen(
10b60 7a 2c 20 22 72 62 22 29 3b 0a 20 20 69 66 28 20  z, "rb");.  if( 
10b70 69 6e 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  in==0 ) return;.
10b80 20 20 77 68 69 6c 65 28 20 66 67 65 74 73 28 7a    while( fgets(z
10b90 2c 20 73 69 7a 65 6f 66 28 7a 29 2c 20 69 6e 29  , sizeof(z), in)
10ba0 21 3d 30 20 29 7b 0a 20 20 20 20 73 74 61 74 69  !=0 ){.    stati
10bb0 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20 7b  c const struct {
10bc0 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
10bd0 72 20 2a 7a 50 61 74 74 65 72 6e 3b 0a 20 20 20  r *zPattern;.   
10be0 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
10bf0 44 65 73 63 3b 0a 20 20 20 20 7d 20 61 54 72 61  Desc;.    } aTra
10c00 6e 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 7b  ns[] = {.      {
10c10 20 22 72 63 68 61 72 3a 20 22 2c 20 20 20 20 20   "rchar: ",     
10c20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 42 79               "By
10c30 74 65 73 20 72 65 63 65 69 76 65 64 20 62 79 20  tes received by 
10c40 72 65 61 64 28 29 3a 22 20 7d 2c 0a 20 20 20 20  read():" },.    
10c50 20 20 7b 20 22 77 63 68 61 72 3a 20 22 2c 20 20    { "wchar: ",  
10c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10c70 22 42 79 74 65 73 20 73 65 6e 74 20 74 6f 20 77  "Bytes sent to w
10c80 72 69 74 65 28 29 3a 22 20 20 20 20 7d 2c 0a 20  rite():"    },. 
10c90 20 20 20 20 20 7b 20 22 73 79 73 63 72 3a 20 22       { "syscr: "
10ca0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
10cb0 20 20 20 22 52 65 61 64 28 29 20 73 79 73 74 65     "Read() syste
10cc0 6d 20 63 61 6c 6c 73 3a 22 20 20 20 20 20 20 7d  m calls:"      }
10cd0 2c 0a 20 20 20 20 20 20 7b 20 22 73 79 73 63 77  ,.      { "syscw
10ce0 3a 20 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  : ",            
10cf0 20 20 20 20 20 20 22 57 72 69 74 65 28 29 20 73        "Write() s
10d00 79 73 74 65 6d 20 63 61 6c 6c 73 3a 22 20 20 20  ystem calls:"   
10d10 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 72 65    },.      { "re
10d20 61 64 5f 62 79 74 65 73 3a 20 22 2c 20 20 20 20  ad_bytes: ",    
10d30 20 20 20 20 20 20 20 20 20 22 42 79 74 65 73 20           "Bytes 
10d40 72 65 61 64 20 66 72 6f 6d 20 73 74 6f 72 61 67  read from storag
10d50 65 3a 22 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20  e:"  },.      { 
10d60 22 77 72 69 74 65 5f 62 79 74 65 73 3a 20 22 2c  "write_bytes: ",
10d70 20 20 20 20 20 20 20 20 20 20 20 20 22 42 79 74              "Byt
10d80 65 73 20 77 72 69 74 74 65 6e 20 74 6f 20 73 74  es written to st
10d90 6f 72 61 67 65 3a 22 20 7d 2c 0a 20 20 20 20 20  orage:" },.     
10da0 20 7b 20 22 63 61 6e 63 65 6c 6c 65 64 5f 77 72   { "cancelled_wr
10db0 69 74 65 5f 62 79 74 65 73 3a 20 22 2c 20 20 22  ite_bytes: ",  "
10dc0 43 61 6e 63 65 6c 6c 65 64 20 77 72 69 74 65 20  Cancelled write 
10dd0 62 79 74 65 73 3a 22 20 20 20 20 7d 2c 0a 20 20  bytes:"    },.  
10de0 20 20 7d 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a    };.    int i;.
10df0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 41      for(i=0; i<A
10e00 72 72 61 79 53 69 7a 65 28 61 54 72 61 6e 73 29  rraySize(aTrans)
10e10 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e  ; i++){.      in
10e20 74 20 6e 20 3d 20 73 74 72 6c 65 6e 33 30 28 61  t n = strlen30(a
10e30 54 72 61 6e 73 5b 69 5d 2e 7a 50 61 74 74 65 72  Trans[i].zPatter
10e40 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 74  n);.      if( st
10e50 72 6e 63 6d 70 28 61 54 72 61 6e 73 5b 69 5d 2e  rncmp(aTrans[i].
10e60 7a 50 61 74 74 65 72 6e 2c 20 7a 2c 20 6e 29 3d  zPattern, z, n)=
10e70 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74  =0 ){.        ut
10e80 66 38 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22  f8_printf(out, "
10e90 25 2d 33 36 73 20 25 73 22 2c 20 61 54 72 61 6e  %-36s %s", aTran
10ea0 73 5b 69 5d 2e 7a 44 65 73 63 2c 20 26 7a 5b 6e  s[i].zDesc, &z[n
10eb0 5d 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  ]);.        brea
10ec0 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
10ed0 0a 20 20 7d 0a 20 20 66 63 6c 6f 73 65 28 69 6e  .  }.  fclose(in
10ee0 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  );.}.#endif../*.
10ef0 2a 2a 20 44 69 73 70 6c 61 79 20 61 20 73 69 6e  ** Display a sin
10f00 67 6c 65 20 6c 69 6e 65 20 6f 66 20 73 74 61 74  gle line of stat
10f10 75 73 20 75 73 69 6e 67 20 36 34 2d 62 69 74 20  us using 64-bit 
10f20 76 61 6c 75 65 73 2e 0a 2a 2f 0a 73 74 61 74 69  values..*/.stati
10f30 63 20 76 6f 69 64 20 64 69 73 70 6c 61 79 53 74  c void displaySt
10f40 61 74 4c 69 6e 65 28 0a 20 20 53 68 65 6c 6c 53  atLine(.  ShellS
10f50 74 61 74 65 20 2a 70 2c 20 20 20 20 20 20 20 20  tate *p,        
10f60 20 20 20 20 2f 2a 20 54 68 65 20 73 68 65 6c 6c      /* The shell
10f70 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 63 68   context */.  ch
10f80 61 72 20 2a 7a 4c 61 62 65 6c 2c 20 20 20 20 20  ar *zLabel,     
10f90 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 62 65 6c          /* Label
10fa0 20 66 6f 72 20 74 68 69 73 20 6f 6e 65 20 6c 69   for this one li
10fb0 6e 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 46  ne */.  char *zF
10fc0 6f 72 6d 61 74 2c 20 20 20 20 20 20 20 20 20 20  ormat,          
10fd0 20 20 2f 2a 20 46 6f 72 6d 61 74 20 66 6f 72 20    /* Format for 
10fe0 74 68 65 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20  the result */.  
10ff0 69 6e 74 20 69 53 74 61 74 75 73 43 74 72 6c 2c  int iStatusCtrl,
11000 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68 69            /* Whi
11010 63 68 20 73 74 61 74 75 73 20 74 6f 20 64 69 73  ch status to dis
11020 70 6c 61 79 20 2a 2f 0a 20 20 69 6e 74 20 62 52  play */.  int bR
11030 65 73 65 74 20 20 20 20 20 20 20 20 20 20 20 20  eset            
11040 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 72      /* True to r
11050 65 73 65 74 20 74 68 65 20 73 74 61 74 73 20 2a  eset the stats *
11060 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69  /.){.  sqlite3_i
11070 6e 74 36 34 20 69 43 75 72 20 3d 20 2d 31 3b 0a  nt64 iCur = -1;.
11080 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
11090 69 48 69 77 74 72 20 3d 20 2d 31 3b 0a 20 20 69  iHiwtr = -1;.  i
110a0 6e 74 20 69 2c 20 6e 50 65 72 63 65 6e 74 3b 0a  nt i, nPercent;.
110b0 20 20 63 68 61 72 20 7a 4c 69 6e 65 5b 32 30 30    char zLine[200
110c0 5d 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 61  ];.  sqlite3_sta
110d0 74 75 73 36 34 28 69 53 74 61 74 75 73 43 74 72  tus64(iStatusCtr
110e0 6c 2c 20 26 69 43 75 72 2c 20 26 69 48 69 77 74  l, &iCur, &iHiwt
110f0 72 2c 20 62 52 65 73 65 74 29 3b 0a 20 20 66 6f  r, bReset);.  fo
11100 72 28 69 3d 30 2c 20 6e 50 65 72 63 65 6e 74 3d  r(i=0, nPercent=
11110 30 3b 20 7a 46 6f 72 6d 61 74 5b 69 5d 3b 20 69  0; zFormat[i]; i
11120 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 7a 46 6f  ++){.    if( zFo
11130 72 6d 61 74 5b 69 5d 3d 3d 27 25 27 20 29 20 6e  rmat[i]=='%' ) n
11140 50 65 72 63 65 6e 74 2b 2b 3b 0a 20 20 7d 0a 20  Percent++;.  }. 
11150 20 69 66 28 20 6e 50 65 72 63 65 6e 74 3e 31 20   if( nPercent>1 
11160 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  ){.    sqlite3_s
11170 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a  nprintf(sizeof(z
11180 4c 69 6e 65 29 2c 20 7a 4c 69 6e 65 2c 20 7a 46  Line), zLine, zF
11190 6f 72 6d 61 74 2c 20 69 43 75 72 2c 20 69 48 69  ormat, iCur, iHi
111a0 77 74 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  wtr);.  }else{. 
111b0 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
111c0 6e 74 66 28 73 69 7a 65 6f 66 28 7a 4c 69 6e 65  ntf(sizeof(zLine
111d0 29 2c 20 7a 4c 69 6e 65 2c 20 7a 46 6f 72 6d 61  ), zLine, zForma
111e0 74 2c 20 69 48 69 77 74 72 29 3b 0a 20 20 7d 0a  t, iHiwtr);.  }.
111f0 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e    raw_printf(p->
11200 6f 75 74 2c 20 22 25 2d 33 36 73 20 25 73 5c 6e  out, "%-36s %s\n
11210 22 2c 20 7a 4c 61 62 65 6c 2c 20 7a 4c 69 6e 65  ", zLabel, zLine
11220 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 70  );.}../*.** Disp
11230 6c 61 79 20 6d 65 6d 6f 72 79 20 73 74 61 74 73  lay memory stats
11240 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
11250 64 69 73 70 6c 61 79 5f 73 74 61 74 73 28 0a 20  display_stats(. 
11260 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20   sqlite3 *db,   
11270 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11280 44 61 74 61 62 61 73 65 20 74 6f 20 71 75 65 72  Database to quer
11290 79 20 2a 2f 0a 20 20 53 68 65 6c 6c 53 74 61 74  y */.  ShellStat
112a0 65 20 2a 70 41 72 67 2c 20 20 20 20 20 20 20 20  e *pArg,        
112b0 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
112c0 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 2f 0a 20   ShellState */. 
112d0 20 69 6e 74 20 62 52 65 73 65 74 20 20 20 20 20   int bReset     
112e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
112f0 54 72 75 65 20 74 6f 20 72 65 73 65 74 20 74 68  True to reset th
11300 65 20 73 74 61 74 73 20 2a 2f 0a 29 7b 0a 20 20  e stats */.){.  
11310 69 6e 74 20 69 43 75 72 3b 0a 20 20 69 6e 74 20  int iCur;.  int 
11320 69 48 69 77 74 72 3b 0a 20 20 46 49 4c 45 20 2a  iHiwtr;.  FILE *
11330 6f 75 74 3b 0a 20 20 69 66 28 20 70 41 72 67 3d  out;.  if( pArg=
11340 3d 30 20 7c 7c 20 70 41 72 67 2d 3e 6f 75 74 3d  =0 || pArg->out=
11350 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
11360 20 6f 75 74 20 3d 20 70 41 72 67 2d 3e 6f 75 74   out = pArg->out
11370 3b 0a 0a 20 20 69 66 28 20 70 41 72 67 2d 3e 70  ;..  if( pArg->p
11380 53 74 6d 74 20 26 26 20 28 70 41 72 67 2d 3e 73  Stmt && (pArg->s
11390 74 61 74 73 4f 6e 20 26 20 32 29 20 29 7b 0a 20  tatsOn & 2) ){. 
113a0 20 20 20 69 6e 74 20 6e 43 6f 6c 2c 20 69 2c 20     int nCol, i, 
113b0 78 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  x;.    sqlite3_s
113c0 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 70 41 72  tmt *pStmt = pAr
113d0 67 2d 3e 70 53 74 6d 74 3b 0a 20 20 20 20 63 68  g->pStmt;.    ch
113e0 61 72 20 7a 5b 31 30 30 5d 3b 0a 20 20 20 20 6e  ar z[100];.    n
113f0 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  Col = sqlite3_co
11400 6c 75 6d 6e 5f 63 6f 75 6e 74 28 70 53 74 6d 74  lumn_count(pStmt
11410 29 3b 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74  );.    raw_print
11420 66 28 6f 75 74 2c 20 22 25 2d 33 36 73 20 25 64  f(out, "%-36s %d
11430 5c 6e 22 2c 20 22 4e 75 6d 62 65 72 20 6f 66 20  \n", "Number of 
11440 6f 75 74 70 75 74 20 63 6f 6c 75 6d 6e 73 3a 22  output columns:"
11450 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 66 6f 72  , nCol);.    for
11460 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b  (i=0; i<nCol; i+
11470 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  +){.      sqlite
11480 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
11490 66 28 7a 29 2c 7a 2c 22 43 6f 6c 75 6d 6e 20 25  f(z),z,"Column %
114a0 64 20 25 6e 6e 61 6d 65 3a 22 2c 20 69 2c 20 26  d %nname:", i, &
114b0 78 29 3b 0a 20 20 20 20 20 20 75 74 66 38 5f 70  x);.      utf8_p
114c0 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 2d 33 36  rintf(out, "%-36
114d0 73 20 25 73 5c 6e 22 2c 20 7a 2c 20 73 71 6c 69  s %s\n", z, sqli
114e0 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 28  te3_column_name(
114f0 70 53 74 6d 74 2c 69 29 29 3b 0a 23 69 66 6e 64  pStmt,i));.#ifnd
11500 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44  ef SQLITE_OMIT_D
11510 45 43 4c 54 59 50 45 0a 20 20 20 20 20 20 73 71  ECLTYPE.      sq
11520 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 33  lite3_snprintf(3
11530 30 2c 20 7a 2b 78 2c 20 22 64 65 63 6c 61 72 65  0, z+x, "declare
11540 64 20 74 79 70 65 3a 22 29 3b 0a 20 20 20 20 20  d type:");.     
11550 20 75 74 66 38 5f 70 72 69 6e 74 66 28 6f 75 74   utf8_printf(out
11560 2c 20 22 25 2d 33 36 73 20 25 73 5c 6e 22 2c 20  , "%-36s %s\n", 
11570 7a 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  z, sqlite3_colum
11580 6e 5f 64 65 63 6c 74 79 70 65 28 70 53 74 6d 74  n_decltype(pStmt
11590 2c 20 69 29 29 3b 0a 23 65 6e 64 69 66 0a 23 69  , i));.#endif.#i
115a0 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
115b0 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41  LE_COLUMN_METADA
115c0 54 41 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  TA.      sqlite3
115d0 5f 73 6e 70 72 69 6e 74 66 28 33 30 2c 20 7a 2b  _snprintf(30, z+
115e0 78 2c 20 22 64 61 74 61 62 61 73 65 20 6e 61 6d  x, "database nam
115f0 65 3a 22 29 3b 0a 20 20 20 20 20 20 75 74 66 38  e:");.      utf8
11600 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 2d  _printf(out, "%-
11610 33 36 73 20 25 73 5c 6e 22 2c 20 7a 2c 20 73 71  36s %s\n", z, sq
11620 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 61 74  lite3_column_dat
11630 61 62 61 73 65 5f 6e 61 6d 65 28 70 53 74 6d 74  abase_name(pStmt
11640 2c 69 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ,i));.      sqli
11650 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 33 30 2c  te3_snprintf(30,
11660 20 7a 2b 78 2c 20 22 74 61 62 6c 65 20 6e 61 6d   z+x, "table nam
11670 65 3a 22 29 3b 0a 20 20 20 20 20 20 75 74 66 38  e:");.      utf8
11680 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 2d  _printf(out, "%-
11690 33 36 73 20 25 73 5c 6e 22 2c 20 7a 2c 20 73 71  36s %s\n", z, sq
116a0 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 61 62  lite3_column_tab
116b0 6c 65 5f 6e 61 6d 65 28 70 53 74 6d 74 2c 69 29  le_name(pStmt,i)
116c0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
116d0 5f 73 6e 70 72 69 6e 74 66 28 33 30 2c 20 7a 2b  _snprintf(30, z+
116e0 78 2c 20 22 6f 72 69 67 69 6e 20 6e 61 6d 65 3a  x, "origin name:
116f0 22 29 3b 0a 20 20 20 20 20 20 75 74 66 38 5f 70  ");.      utf8_p
11700 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 2d 33 36  rintf(out, "%-36
11710 73 20 25 73 5c 6e 22 2c 20 7a 2c 20 73 71 6c 69  s %s\n", z, sqli
11720 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6f 72 69 67 69  te3_column_origi
11730 6e 5f 6e 61 6d 65 28 70 53 74 6d 74 2c 69 29 29  n_name(pStmt,i))
11740 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20  ;.#endif.    }. 
11750 20 7d 0a 0a 20 20 64 69 73 70 6c 61 79 53 74 61   }..  displaySta
11760 74 4c 69 6e 65 28 70 41 72 67 2c 20 22 4d 65 6d  tLine(pArg, "Mem
11770 6f 72 79 20 55 73 65 64 3a 22 2c 0a 20 20 20 20  ory Used:",.    
11780 20 22 25 6c 6c 64 20 28 6d 61 78 20 25 6c 6c 64   "%lld (max %lld
11790 29 20 62 79 74 65 73 22 2c 20 53 51 4c 49 54 45  ) bytes", SQLITE
117a0 5f 53 54 41 54 55 53 5f 4d 45 4d 4f 52 59 5f 55  _STATUS_MEMORY_U
117b0 53 45 44 2c 20 62 52 65 73 65 74 29 3b 0a 20 20  SED, bReset);.  
117c0 64 69 73 70 6c 61 79 53 74 61 74 4c 69 6e 65 28  displayStatLine(
117d0 70 41 72 67 2c 20 22 4e 75 6d 62 65 72 20 6f 66  pArg, "Number of
117e0 20 4f 75 74 73 74 61 6e 64 69 6e 67 20 41 6c 6c   Outstanding All
117f0 6f 63 61 74 69 6f 6e 73 3a 22 2c 0a 20 20 20 20  ocations:",.    
11800 20 22 25 6c 6c 64 20 28 6d 61 78 20 25 6c 6c 64   "%lld (max %lld
11810 29 22 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 55  )", SQLITE_STATU
11820 53 5f 4d 41 4c 4c 4f 43 5f 43 4f 55 4e 54 2c 20  S_MALLOC_COUNT, 
11830 62 52 65 73 65 74 29 3b 0a 20 20 69 66 28 20 70  bReset);.  if( p
11840 41 72 67 2d 3e 73 68 65 6c 6c 46 6c 67 73 20 26  Arg->shellFlgs &
11850 20 53 48 46 4c 47 5f 50 61 67 65 63 61 63 68 65   SHFLG_Pagecache
11860 20 29 7b 0a 20 20 20 20 64 69 73 70 6c 61 79 53   ){.    displayS
11870 74 61 74 4c 69 6e 65 28 70 41 72 67 2c 20 22 4e  tatLine(pArg, "N
11880 75 6d 62 65 72 20 6f 66 20 50 63 61 63 68 65 20  umber of Pcache 
11890 50 61 67 65 73 20 55 73 65 64 3a 22 2c 0a 20 20  Pages Used:",.  
118a0 20 20 20 20 20 22 25 6c 6c 64 20 28 6d 61 78 20       "%lld (max 
118b0 25 6c 6c 64 29 20 70 61 67 65 73 22 2c 20 53 51  %lld) pages", SQ
118c0 4c 49 54 45 5f 53 54 41 54 55 53 5f 50 41 47 45  LITE_STATUS_PAGE
118d0 43 41 43 48 45 5f 55 53 45 44 2c 20 62 52 65 73  CACHE_USED, bRes
118e0 65 74 29 3b 0a 20 20 7d 0a 20 20 64 69 73 70 6c  et);.  }.  displ
118f0 61 79 53 74 61 74 4c 69 6e 65 28 70 41 72 67 2c  ayStatLine(pArg,
11900 20 22 4e 75 6d 62 65 72 20 6f 66 20 50 63 61 63   "Number of Pcac
11910 68 65 20 4f 76 65 72 66 6c 6f 77 20 42 79 74 65  he Overflow Byte
11920 73 3a 22 2c 0a 20 20 20 20 20 22 25 6c 6c 64 20  s:",.     "%lld 
11930 28 6d 61 78 20 25 6c 6c 64 29 20 62 79 74 65 73  (max %lld) bytes
11940 22 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 55 53  ", SQLITE_STATUS
11950 5f 50 41 47 45 43 41 43 48 45 5f 4f 56 45 52 46  _PAGECACHE_OVERF
11960 4c 4f 57 2c 20 62 52 65 73 65 74 29 3b 0a 20 20  LOW, bReset);.  
11970 64 69 73 70 6c 61 79 53 74 61 74 4c 69 6e 65 28  displayStatLine(
11980 70 41 72 67 2c 20 22 4c 61 72 67 65 73 74 20 41  pArg, "Largest A
11990 6c 6c 6f 63 61 74 69 6f 6e 3a 22 2c 0a 20 20 20  llocation:",.   
119a0 20 20 22 25 6c 6c 64 20 62 79 74 65 73 22 2c 20    "%lld bytes", 
119b0 53 51 4c 49 54 45 5f 53 54 41 54 55 53 5f 4d 41  SQLITE_STATUS_MA
119c0 4c 4c 4f 43 5f 53 49 5a 45 2c 20 62 52 65 73 65  LLOC_SIZE, bRese
119d0 74 29 3b 0a 20 20 64 69 73 70 6c 61 79 53 74 61  t);.  displaySta
119e0 74 4c 69 6e 65 28 70 41 72 67 2c 20 22 4c 61 72  tLine(pArg, "Lar
119f0 67 65 73 74 20 50 63 61 63 68 65 20 41 6c 6c 6f  gest Pcache Allo
11a00 63 61 74 69 6f 6e 3a 22 2c 0a 20 20 20 20 20 22  cation:",.     "
11a10 25 6c 6c 64 20 62 79 74 65 73 22 2c 20 53 51 4c  %lld bytes", SQL
11a20 49 54 45 5f 53 54 41 54 55 53 5f 50 41 47 45 43  ITE_STATUS_PAGEC
11a30 41 43 48 45 5f 53 49 5a 45 2c 20 62 52 65 73 65  ACHE_SIZE, bRese
11a40 74 29 3b 0a 23 69 66 64 65 66 20 59 59 54 52 41  t);.#ifdef YYTRA
11a50 43 4b 4d 41 58 53 54 41 43 4b 44 45 50 54 48 0a  CKMAXSTACKDEPTH.
11a60 20 20 64 69 73 70 6c 61 79 53 74 61 74 4c 69 6e    displayStatLin
11a70 65 28 70 41 72 67 2c 20 22 44 65 65 70 65 73 74  e(pArg, "Deepest
11a80 20 50 61 72 73 65 72 20 53 74 61 63 6b 3a 22 2c   Parser Stack:",
11a90 0a 20 20 20 20 20 22 25 6c 6c 64 20 28 6d 61 78  .     "%lld (max
11aa0 20 25 6c 6c 64 29 22 2c 20 53 51 4c 49 54 45 5f   %lld)", SQLITE_
11ab0 53 54 41 54 55 53 5f 50 41 52 53 45 52 5f 53 54  STATUS_PARSER_ST
11ac0 41 43 4b 2c 20 62 52 65 73 65 74 29 3b 0a 23 65  ACK, bReset);.#e
11ad0 6e 64 69 66 0a 0a 20 20 69 66 28 20 64 62 20 29  ndif..  if( db )
11ae0 7b 0a 20 20 20 20 69 66 28 20 70 41 72 67 2d 3e  {.    if( pArg->
11af0 73 68 65 6c 6c 46 6c 67 73 20 26 20 53 48 46 4c  shellFlgs & SHFL
11b00 47 5f 4c 6f 6f 6b 61 73 69 64 65 20 29 7b 0a 20  G_Lookaside ){. 
11b10 20 20 20 20 20 69 48 69 77 74 72 20 3d 20 69 43       iHiwtr = iC
11b20 75 72 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 73  ur = -1;.      s
11b30 71 6c 69 74 65 33 5f 64 62 5f 73 74 61 74 75 73  qlite3_db_status
11b40 28 64 62 2c 20 53 51 4c 49 54 45 5f 44 42 53 54  (db, SQLITE_DBST
11b50 41 54 55 53 5f 4c 4f 4f 4b 41 53 49 44 45 5f 55  ATUS_LOOKASIDE_U
11b60 53 45 44 2c 0a 20 20 20 20 20 20 20 20 20 20 20  SED,.           
11b70 20 20 20 20 20 20 20 20 20 20 20 20 20 26 69 43               &iC
11b80 75 72 2c 20 26 69 48 69 77 74 72 2c 20 62 52 65  ur, &iHiwtr, bRe
11b90 73 65 74 29 3b 0a 20 20 20 20 20 20 72 61 77 5f  set);.      raw_
11ba0 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74  printf(pArg->out
11bb0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
11bc0 22 4c 6f 6f 6b 61 73 69 64 65 20 53 6c 6f 74 73  "Lookaside Slots
11bd0 20 55 73 65 64 3a 20 20 20 20 20 20 20 20 20 20   Used:          
11be0 20 20 20 20 20 20 25 64 20 28 6d 61 78 20 25 64        %d (max %d
11bf0 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  )\n",.          
11c00 20 20 20 20 69 43 75 72 2c 20 69 48 69 77 74 72      iCur, iHiwtr
11c10 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
11c20 5f 64 62 5f 73 74 61 74 75 73 28 64 62 2c 20 53  _db_status(db, S
11c30 51 4c 49 54 45 5f 44 42 53 54 41 54 55 53 5f 4c  QLITE_DBSTATUS_L
11c40 4f 4f 4b 41 53 49 44 45 5f 48 49 54 2c 0a 20 20  OOKASIDE_HIT,.  
11c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11c60 20 20 20 20 20 20 26 69 43 75 72 2c 20 26 69 48        &iCur, &iH
11c70 69 77 74 72 2c 20 62 52 65 73 65 74 29 3b 0a 20  iwtr, bReset);. 
11c80 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
11c90 70 41 72 67 2d 3e 6f 75 74 2c 20 22 53 75 63 63  pArg->out, "Succ
11ca0 65 73 73 66 75 6c 20 6c 6f 6f 6b 61 73 69 64 65  essful lookaside
11cb0 20 61 74 74 65 6d 70 74 73 3a 20 20 20 20 20 20   attempts:      
11cc0 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20   %d\n",.        
11cd0 20 20 20 20 20 20 69 48 69 77 74 72 29 3b 0a 20        iHiwtr);. 
11ce0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 64 62 5f       sqlite3_db_
11cf0 73 74 61 74 75 73 28 64 62 2c 20 53 51 4c 49 54  status(db, SQLIT
11d00 45 5f 44 42 53 54 41 54 55 53 5f 4c 4f 4f 4b 41  E_DBSTATUS_LOOKA
11d10 53 49 44 45 5f 4d 49 53 53 5f 53 49 5a 45 2c 0a  SIDE_MISS_SIZE,.
11d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11d30 20 20 20 20 20 20 20 20 26 69 43 75 72 2c 20 26          &iCur, &
11d40 69 48 69 77 74 72 2c 20 62 52 65 73 65 74 29 3b  iHiwtr, bReset);
11d50 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74  .      raw_print
11d60 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22 4c 6f  f(pArg->out, "Lo
11d70 6f 6b 61 73 69 64 65 20 66 61 69 6c 75 72 65 73  okaside failures
11d80 20 64 75 65 20 74 6f 20 73 69 7a 65 3a 20 20 20   due to size:   
11d90 20 20 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20     %d\n",.      
11da0 20 20 20 20 20 20 20 20 69 48 69 77 74 72 29 3b          iHiwtr);
11db0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 64  .      sqlite3_d
11dc0 62 5f 73 74 61 74 75 73 28 64 62 2c 20 53 51 4c  b_status(db, SQL
11dd0 49 54 45 5f 44 42 53 54 41 54 55 53 5f 4c 4f 4f  ITE_DBSTATUS_LOO
11de0 4b 41 53 49 44 45 5f 4d 49 53 53 5f 46 55 4c 4c  KASIDE_MISS_FULL
11df0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
11e00 20 20 20 20 20 20 20 20 20 20 26 69 43 75 72 2c            &iCur,
11e10 20 26 69 48 69 77 74 72 2c 20 62 52 65 73 65 74   &iHiwtr, bReset
11e20 29 3b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69  );.      raw_pri
11e30 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22  ntf(pArg->out, "
11e40 4c 6f 6f 6b 61 73 69 64 65 20 66 61 69 6c 75 72  Lookaside failur
11e50 65 73 20 64 75 65 20 74 6f 20 4f 4f 4d 3a 20 20  es due to OOM:  
11e60 20 20 20 20 20 25 64 5c 6e 22 2c 0a 20 20 20 20       %d\n",.    
11e70 20 20 20 20 20 20 20 20 20 20 69 48 69 77 74 72            iHiwtr
11e80 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 48 69  );.    }.    iHi
11e90 77 74 72 20 3d 20 69 43 75 72 20 3d 20 2d 31 3b  wtr = iCur = -1;
11ea0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 64 62 5f  .    sqlite3_db_
11eb0 73 74 61 74 75 73 28 64 62 2c 20 53 51 4c 49 54  status(db, SQLIT
11ec0 45 5f 44 42 53 54 41 54 55 53 5f 43 41 43 48 45  E_DBSTATUS_CACHE
11ed0 5f 55 53 45 44 2c 20 26 69 43 75 72 2c 20 26 69  _USED, &iCur, &i
11ee0 48 69 77 74 72 2c 20 62 52 65 73 65 74 29 3b 0a  Hiwtr, bReset);.
11ef0 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70      raw_printf(p
11f00 41 72 67 2d 3e 6f 75 74 2c 20 22 50 61 67 65 72  Arg->out, "Pager
11f10 20 48 65 61 70 20 55 73 61 67 65 3a 20 20 20 20   Heap Usage:    
11f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11f30 25 64 20 62 79 74 65 73 5c 6e 22 2c 0a 20 20 20  %d bytes\n",.   
11f40 20 20 20 20 20 20 20 20 20 69 43 75 72 29 3b 0a           iCur);.
11f50 20 20 20 20 69 48 69 77 74 72 20 3d 20 69 43 75      iHiwtr = iCu
11f60 72 20 3d 20 2d 31 3b 0a 20 20 20 20 73 71 6c 69  r = -1;.    sqli
11f70 74 65 33 5f 64 62 5f 73 74 61 74 75 73 28 64 62  te3_db_status(db
11f80 2c 20 53 51 4c 49 54 45 5f 44 42 53 54 41 54 55  , SQLITE_DBSTATU
11f90 53 5f 43 41 43 48 45 5f 48 49 54 2c 20 26 69 43  S_CACHE_HIT, &iC
11fa0 75 72 2c 20 26 69 48 69 77 74 72 2c 20 31 29 3b  ur, &iHiwtr, 1);
11fb0 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28  .    raw_printf(
11fc0 70 41 72 67 2d 3e 6f 75 74 2c 20 22 50 61 67 65  pArg->out, "Page
11fd0 20 63 61 63 68 65 20 68 69 74 73 3a 20 20 20 20   cache hits:    
11fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11ff0 20 25 64 5c 6e 22 2c 20 69 43 75 72 29 3b 0a 20   %d\n", iCur);. 
12000 20 20 20 69 48 69 77 74 72 20 3d 20 69 43 75 72     iHiwtr = iCur
12010 20 3d 20 2d 31 3b 0a 20 20 20 20 73 71 6c 69 74   = -1;.    sqlit
12020 65 33 5f 64 62 5f 73 74 61 74 75 73 28 64 62 2c  e3_db_status(db,
12030 20 53 51 4c 49 54 45 5f 44 42 53 54 41 54 55 53   SQLITE_DBSTATUS
12040 5f 43 41 43 48 45 5f 4d 49 53 53 2c 20 26 69 43  _CACHE_MISS, &iC
12050 75 72 2c 20 26 69 48 69 77 74 72 2c 20 31 29 3b  ur, &iHiwtr, 1);
12060 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28  .    raw_printf(
12070 70 41 72 67 2d 3e 6f 75 74 2c 20 22 50 61 67 65  pArg->out, "Page
12080 20 63 61 63 68 65 20 6d 69 73 73 65 73 3a 20 20   cache misses:  
12090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
120a0 20 25 64 5c 6e 22 2c 20 69 43 75 72 29 3b 0a 20   %d\n", iCur);. 
120b0 20 20 20 69 48 69 77 74 72 20 3d 20 69 43 75 72     iHiwtr = iCur
120c0 20 3d 20 2d 31 3b 0a 20 20 20 20 73 71 6c 69 74   = -1;.    sqlit
120d0 65 33 5f 64 62 5f 73 74 61 74 75 73 28 64 62 2c  e3_db_status(db,
120e0 20 53 51 4c 49 54 45 5f 44 42 53 54 41 54 55 53   SQLITE_DBSTATUS
120f0 5f 43 41 43 48 45 5f 57 52 49 54 45 2c 20 26 69  _CACHE_WRITE, &i
12100 43 75 72 2c 20 26 69 48 69 77 74 72 2c 20 31 29  Cur, &iHiwtr, 1)
12110 3b 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66  ;.    raw_printf
12120 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22 50 61 67  (pArg->out, "Pag
12130 65 20 63 61 63 68 65 20 77 72 69 74 65 73 3a 20  e cache writes: 
12140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12150 20 20 25 64 5c 6e 22 2c 20 69 43 75 72 29 3b 0a    %d\n", iCur);.
12160 20 20 20 20 69 48 69 77 74 72 20 3d 20 69 43 75      iHiwtr = iCu
12170 72 20 3d 20 2d 31 3b 0a 20 20 20 20 73 71 6c 69  r = -1;.    sqli
12180 74 65 33 5f 64 62 5f 73 74 61 74 75 73 28 64 62  te3_db_status(db
12190 2c 20 53 51 4c 49 54 45 5f 44 42 53 54 41 54 55  , SQLITE_DBSTATU
121a0 53 5f 43 41 43 48 45 5f 53 50 49 4c 4c 2c 20 26  S_CACHE_SPILL, &
121b0 69 43 75 72 2c 20 26 69 48 69 77 74 72 2c 20 31  iCur, &iHiwtr, 1
121c0 29 3b 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74  );.    raw_print
121d0 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22 50 61  f(pArg->out, "Pa
121e0 67 65 20 63 61 63 68 65 20 73 70 69 6c 6c 73 3a  ge cache spills:
121f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12200 20 20 20 25 64 5c 6e 22 2c 20 69 43 75 72 29 3b     %d\n", iCur);
12210 0a 20 20 20 20 69 48 69 77 74 72 20 3d 20 69 43  .    iHiwtr = iC
12220 75 72 20 3d 20 2d 31 3b 0a 20 20 20 20 73 71 6c  ur = -1;.    sql
12230 69 74 65 33 5f 64 62 5f 73 74 61 74 75 73 28 64  ite3_db_status(d
12240 62 2c 20 53 51 4c 49 54 45 5f 44 42 53 54 41 54  b, SQLITE_DBSTAT
12250 55 53 5f 53 43 48 45 4d 41 5f 55 53 45 44 2c 20  US_SCHEMA_USED, 
12260 26 69 43 75 72 2c 20 26 69 48 69 77 74 72 2c 20  &iCur, &iHiwtr, 
12270 62 52 65 73 65 74 29 3b 0a 20 20 20 20 72 61 77  bReset);.    raw
12280 5f 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75  _printf(pArg->ou
12290 74 2c 20 22 53 63 68 65 6d 61 20 48 65 61 70 20  t, "Schema Heap 
122a0 55 73 61 67 65 3a 20 20 20 20 20 20 20 20 20 20  Usage:          
122b0 20 20 20 20 20 20 20 20 20 25 64 20 62 79 74 65           %d byte
122c0 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  s\n",.          
122d0 20 20 69 43 75 72 29 3b 0a 20 20 20 20 69 48 69    iCur);.    iHi
122e0 77 74 72 20 3d 20 69 43 75 72 20 3d 20 2d 31 3b  wtr = iCur = -1;
122f0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 64 62 5f  .    sqlite3_db_
12300 73 74 61 74 75 73 28 64 62 2c 20 53 51 4c 49 54  status(db, SQLIT
12310 45 5f 44 42 53 54 41 54 55 53 5f 53 54 4d 54 5f  E_DBSTATUS_STMT_
12320 55 53 45 44 2c 20 26 69 43 75 72 2c 20 26 69 48  USED, &iCur, &iH
12330 69 77 74 72 2c 20 62 52 65 73 65 74 29 3b 0a 20  iwtr, bReset);. 
12340 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 41     raw_printf(pA
12350 72 67 2d 3e 6f 75 74 2c 20 22 53 74 61 74 65 6d  rg->out, "Statem
12360 65 6e 74 20 48 65 61 70 2f 4c 6f 6f 6b 61 73 69  ent Heap/Lookasi
12370 64 65 20 55 73 61 67 65 3a 20 20 20 20 20 20 25  de Usage:      %
12380 64 20 62 79 74 65 73 5c 6e 22 2c 0a 20 20 20 20  d bytes\n",.    
12390 20 20 20 20 20 20 20 20 69 43 75 72 29 3b 0a 20          iCur);. 
123a0 20 7d 0a 0a 20 20 69 66 28 20 70 41 72 67 2d 3e   }..  if( pArg->
123b0 70 53 74 6d 74 20 29 7b 0a 20 20 20 20 69 43 75  pStmt ){.    iCu
123c0 72 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  r = sqlite3_stmt
123d0 5f 73 74 61 74 75 73 28 70 41 72 67 2d 3e 70 53  _status(pArg->pS
123e0 74 6d 74 2c 20 53 51 4c 49 54 45 5f 53 54 4d 54  tmt, SQLITE_STMT
123f0 53 54 41 54 55 53 5f 46 55 4c 4c 53 43 41 4e 5f  STATUS_FULLSCAN_
12400 53 54 45 50 2c 0a 20 20 20 20 20 20 20 20 20 20  STEP,.          
12410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12420 20 20 20 20 20 62 52 65 73 65 74 29 3b 0a 20 20       bReset);.  
12430 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 41 72    raw_printf(pAr
12440 67 2d 3e 6f 75 74 2c 20 22 46 75 6c 6c 73 63 61  g->out, "Fullsca
12450 6e 20 53 74 65 70 73 3a 20 20 20 20 20 20 20 20  n Steps:        
12460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 25 64                %d
12470 5c 6e 22 2c 20 69 43 75 72 29 3b 0a 20 20 20 20  \n", iCur);.    
12480 69 43 75 72 20 3d 20 73 71 6c 69 74 65 33 5f 73  iCur = sqlite3_s
12490 74 6d 74 5f 73 74 61 74 75 73 28 70 41 72 67 2d  tmt_status(pArg-
124a0 3e 70 53 74 6d 74 2c 20 53 51 4c 49 54 45 5f 53  >pStmt, SQLITE_S
124b0 54 4d 54 53 54 41 54 55 53 5f 53 4f 52 54 2c 20  TMTSTATUS_SORT, 
124c0 62 52 65 73 65 74 29 3b 0a 20 20 20 20 72 61 77  bReset);.    raw
124d0 5f 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75  _printf(pArg->ou
124e0 74 2c 20 22 53 6f 72 74 20 4f 70 65 72 61 74 69  t, "Sort Operati
124f0 6f 6e 73 3a 20 20 20 20 20 20 20 20 20 20 20 20  ons:            
12500 20 20 20 20 20 20 20 20 20 25 64 5c 6e 22 2c 20           %d\n", 
12510 69 43 75 72 29 3b 0a 20 20 20 20 69 43 75 72 20  iCur);.    iCur 
12520 3d 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73  = sqlite3_stmt_s
12530 74 61 74 75 73 28 70 41 72 67 2d 3e 70 53 74 6d  tatus(pArg->pStm
12540 74 2c 20 53 51 4c 49 54 45 5f 53 54 4d 54 53 54  t, SQLITE_STMTST
12550 41 54 55 53 5f 41 55 54 4f 49 4e 44 45 58 2c 62  ATUS_AUTOINDEX,b
12560 52 65 73 65 74 29 3b 0a 20 20 20 20 72 61 77 5f  Reset);.    raw_
12570 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74  printf(pArg->out
12580 2c 20 22 41 75 74 6f 69 6e 64 65 78 20 49 6e 73  , "Autoindex Ins
12590 65 72 74 73 3a 20 20 20 20 20 20 20 20 20 20 20  erts:           
125a0 20 20 20 20 20 20 20 20 25 64 5c 6e 22 2c 20 69          %d\n", i
125b0 43 75 72 29 3b 0a 20 20 20 20 69 43 75 72 20 3d  Cur);.    iCur =
125c0 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 74   sqlite3_stmt_st
125d0 61 74 75 73 28 70 41 72 67 2d 3e 70 53 74 6d 74  atus(pArg->pStmt
125e0 2c 20 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41  , SQLITE_STMTSTA
125f0 54 55 53 5f 56 4d 5f 53 54 45 50 2c 20 62 52 65  TUS_VM_STEP, bRe
12600 73 65 74 29 3b 0a 20 20 20 20 72 61 77 5f 70 72  set);.    raw_pr
12610 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20  intf(pArg->out, 
12620 22 56 69 72 74 75 61 6c 20 4d 61 63 68 69 6e 65  "Virtual Machine
12630 20 53 74 65 70 73 3a 20 20 20 20 20 20 20 20 20   Steps:         
12640 20 20 20 20 20 20 25 64 5c 6e 22 2c 20 69 43 75        %d\n", iCu
12650 72 29 3b 0a 20 20 20 20 69 43 75 72 20 3d 20 73  r);.    iCur = s
12660 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 74 61 74  qlite3_stmt_stat
12670 75 73 28 70 41 72 67 2d 3e 70 53 74 6d 74 2c 20  us(pArg->pStmt, 
12680 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55  SQLITE_STMTSTATU
12690 53 5f 52 45 50 52 45 50 41 52 45 2c 20 62 52 65  S_REPREPARE, bRe
126a0 73 65 74 29 3b 0a 20 20 20 20 72 61 77 5f 70 72  set);.    raw_pr
126b0 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20  intf(pArg->out, 
126c0 22 52 65 70 72 65 70 61 72 65 20 6f 70 65 72 61  "Reprepare opera
126d0 74 69 6f 6e 73 3a 20 20 20 20 20 20 20 20 20 20  tions:          
126e0 20 20 20 20 20 20 25 64 5c 6e 22 2c 20 69 43 75        %d\n", iCu
126f0 72 29 3b 0a 20 20 20 20 69 43 75 72 20 3d 20 73  r);.    iCur = s
12700 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 74 61 74  qlite3_stmt_stat
12710 75 73 28 70 41 72 67 2d 3e 70 53 74 6d 74 2c 20  us(pArg->pStmt, 
12720 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55  SQLITE_STMTSTATU
12730 53 5f 52 55 4e 2c 20 62 52 65 73 65 74 29 3b 0a  S_RUN, bReset);.
12740 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70      raw_printf(p
12750 41 72 67 2d 3e 6f 75 74 2c 20 22 4e 75 6d 62 65  Arg->out, "Numbe
12760 72 20 6f 66 20 74 69 6d 65 73 20 72 75 6e 3a 20  r of times run: 
12770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12780 25 64 5c 6e 22 2c 20 69 43 75 72 29 3b 0a 20 20  %d\n", iCur);.  
12790 20 20 69 43 75 72 20 3d 20 73 71 6c 69 74 65 33    iCur = sqlite3
127a0 5f 73 74 6d 74 5f 73 74 61 74 75 73 28 70 41 72  _stmt_status(pAr
127b0 67 2d 3e 70 53 74 6d 74 2c 20 53 51 4c 49 54 45  g->pStmt, SQLITE
127c0 5f 53 54 4d 54 53 54 41 54 55 53 5f 4d 45 4d 55  _STMTSTATUS_MEMU
127d0 53 45 44 2c 20 62 52 65 73 65 74 29 3b 0a 20 20  SED, bReset);.  
127e0 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 41 72    raw_printf(pAr
127f0 67 2d 3e 6f 75 74 2c 20 22 4d 65 6d 6f 72 79 20  g->out, "Memory 
12800 75 73 65 64 20 62 79 20 70 72 65 70 61 72 65 64  used by prepared
12810 20 73 74 6d 74 3a 20 20 20 20 20 20 20 20 25 64   stmt:        %d
12820 5c 6e 22 2c 20 69 43 75 72 29 3b 0a 20 20 7d 0a  \n", iCur);.  }.
12830 0a 23 69 66 64 65 66 20 5f 5f 6c 69 6e 75 78 5f  .#ifdef __linux_
12840 5f 0a 20 20 64 69 73 70 6c 61 79 4c 69 6e 75 78  _.  displayLinux
12850 49 6f 53 74 61 74 73 28 70 41 72 67 2d 3e 6f 75  IoStats(pArg->ou
12860 74 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a  t);.#endif..  /*
12870 20 44 6f 20 6e 6f 74 20 72 65 6d 6f 76 65 20 74   Do not remove t
12880 68 69 73 20 6d 61 63 68 69 6e 65 20 72 65 61 64  his machine read
12890 61 62 6c 65 20 63 6f 6d 6d 65 6e 74 3a 20 65 78  able comment: ex
128a0 74 72 61 2d 73 74 61 74 73 2d 6f 75 74 70 75 74  tra-stats-output
128b0 2d 68 65 72 65 20 2a 2f 0a 0a 20 20 72 65 74 75  -here */..  retu
128c0 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  rn 0;.}../*.** D
128d0 69 73 70 6c 61 79 20 73 63 61 6e 20 73 74 61 74  isplay scan stat
128e0 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
128f0 64 20 64 69 73 70 6c 61 79 5f 73 63 61 6e 73 74  d display_scanst
12900 61 74 73 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  ats(.  sqlite3 *
12910 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  db,             
12920 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
12930 73 65 20 74 6f 20 71 75 65 72 79 20 2a 2f 0a 20  se to query */. 
12940 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 41 72   ShellState *pAr
12950 67 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g               
12960 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 53   /* Pointer to S
12970 68 65 6c 6c 53 74 61 74 65 20 2a 2f 0a 29 7b 0a  hellState */.){.
12980 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 45  #ifndef SQLITE_E
12990 4e 41 42 4c 45 5f 53 54 4d 54 5f 53 43 41 4e 53  NABLE_STMT_SCANS
129a0 54 41 54 55 53 0a 20 20 55 4e 55 53 45 44 5f 50  TATUS.  UNUSED_P
129b0 41 52 41 4d 45 54 45 52 28 64 62 29 3b 0a 20 20  ARAMETER(db);.  
129c0 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
129d0 28 70 41 72 67 29 3b 0a 23 65 6c 73 65 0a 20 20  (pArg);.#else.  
129e0 69 6e 74 20 69 2c 20 6b 2c 20 6e 2c 20 6d 78 3b  int i, k, n, mx;
129f0 0a 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 41  .  raw_printf(pA
12a00 72 67 2d 3e 6f 75 74 2c 20 22 2d 2d 2d 2d 2d 2d  rg->out, "------
12a10 2d 2d 20 73 63 61 6e 73 74 61 74 73 20 2d 2d 2d  -- scanstats ---
12a20 2d 2d 2d 2d 2d 5c 6e 22 29 3b 0a 20 20 6d 78 20  -----\n");.  mx 
12a30 3d 20 30 3b 0a 20 20 66 6f 72 28 6b 3d 30 3b 20  = 0;.  for(k=0; 
12a40 6b 3c 3d 6d 78 3b 20 6b 2b 2b 29 7b 0a 20 20 20  k<=mx; k++){.   
12a50 20 64 6f 75 62 6c 65 20 72 45 73 74 4c 6f 6f 70   double rEstLoop
12a60 20 3d 20 31 2e 30 3b 0a 20 20 20 20 66 6f 72 28   = 1.0;.    for(
12a70 69 3d 6e 3d 30 3b 20 31 3b 20 69 2b 2b 29 7b 0a  i=n=0; 1; i++){.
12a80 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74        sqlite3_st
12a90 6d 74 20 2a 70 20 3d 20 70 41 72 67 2d 3e 70 53  mt *p = pArg->pS
12aa0 74 6d 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  tmt;.      sqlit
12ab0 65 33 5f 69 6e 74 36 34 20 6e 4c 6f 6f 70 2c 20  e3_int64 nLoop, 
12ac0 6e 56 69 73 69 74 3b 0a 20 20 20 20 20 20 64 6f  nVisit;.      do
12ad0 75 62 6c 65 20 72 45 73 74 3b 0a 20 20 20 20 20  uble rEst;.     
12ae0 20 69 6e 74 20 69 53 69 64 3b 0a 20 20 20 20 20   int iSid;.     
12af0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 78   const char *zEx
12b00 70 6c 61 69 6e 3b 0a 20 20 20 20 20 20 69 66 28  plain;.      if(
12b10 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 63   sqlite3_stmt_sc
12b20 61 6e 73 74 61 74 75 73 28 70 2c 20 69 2c 20 53  anstatus(p, i, S
12b30 51 4c 49 54 45 5f 53 43 41 4e 53 54 41 54 5f 4e  QLITE_SCANSTAT_N
12b40 4c 4f 4f 50 2c 20 28 76 6f 69 64 2a 29 26 6e 4c  LOOP, (void*)&nL
12b50 6f 6f 70 29 20 29 7b 0a 20 20 20 20 20 20 20 20  oop) ){.        
12b60 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
12b70 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d       sqlite3_stm
12b80 74 5f 73 63 61 6e 73 74 61 74 75 73 28 70 2c 20  t_scanstatus(p, 
12b90 69 2c 20 53 51 4c 49 54 45 5f 53 43 41 4e 53 54  i, SQLITE_SCANST
12ba0 41 54 5f 53 45 4c 45 43 54 49 44 2c 20 28 76 6f  AT_SELECTID, (vo
12bb0 69 64 2a 29 26 69 53 69 64 29 3b 0a 20 20 20 20  id*)&iSid);.    
12bc0 20 20 69 66 28 20 69 53 69 64 3e 6d 78 20 29 20    if( iSid>mx ) 
12bd0 6d 78 20 3d 20 69 53 69 64 3b 0a 20 20 20 20 20  mx = iSid;.     
12be0 20 69 66 28 20 69 53 69 64 21 3d 6b 20 29 20 63   if( iSid!=k ) c
12bf0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69  ontinue;.      i
12c00 66 28 20 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20  f( n==0 ){.     
12c10 20 20 20 72 45 73 74 4c 6f 6f 70 20 3d 20 28 64     rEstLoop = (d
12c20 6f 75 62 6c 65 29 6e 4c 6f 6f 70 3b 0a 20 20 20  ouble)nLoop;.   
12c30 20 20 20 20 20 69 66 28 20 6b 3e 30 20 29 20 72       if( k>0 ) r
12c40 61 77 5f 70 72 69 6e 74 66 28 70 41 72 67 2d 3e  aw_printf(pArg->
12c50 6f 75 74 2c 20 22 2d 2d 2d 2d 2d 2d 2d 2d 20 73  out, "-------- s
12c60 75 62 71 75 65 72 79 20 25 64 20 2d 2d 2d 2d 2d  ubquery %d -----
12c70 2d 2d 5c 6e 22 2c 20 6b 29 3b 0a 20 20 20 20 20  --\n", k);.     
12c80 20 7d 0a 20 20 20 20 20 20 6e 2b 2b 3b 0a 20 20   }.      n++;.  
12c90 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74      sqlite3_stmt
12ca0 5f 73 63 61 6e 73 74 61 74 75 73 28 70 2c 20 69  _scanstatus(p, i
12cb0 2c 20 53 51 4c 49 54 45 5f 53 43 41 4e 53 54 41  , SQLITE_SCANSTA
12cc0 54 5f 4e 56 49 53 49 54 2c 20 28 76 6f 69 64 2a  T_NVISIT, (void*
12cd0 29 26 6e 56 69 73 69 74 29 3b 0a 20 20 20 20 20  )&nVisit);.     
12ce0 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 63   sqlite3_stmt_sc
12cf0 61 6e 73 74 61 74 75 73 28 70 2c 20 69 2c 20 53  anstatus(p, i, S
12d00 51 4c 49 54 45 5f 53 43 41 4e 53 54 41 54 5f 45  QLITE_SCANSTAT_E
12d10 53 54 2c 20 28 76 6f 69 64 2a 29 26 72 45 73 74  ST, (void*)&rEst
12d20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
12d30 5f 73 74 6d 74 5f 73 63 61 6e 73 74 61 74 75 73  _stmt_scanstatus
12d40 28 70 2c 20 69 2c 20 53 51 4c 49 54 45 5f 53 43  (p, i, SQLITE_SC
12d50 41 4e 53 54 41 54 5f 45 58 50 4c 41 49 4e 2c 20  ANSTAT_EXPLAIN, 
12d60 28 76 6f 69 64 2a 29 26 7a 45 78 70 6c 61 69 6e  (void*)&zExplain
12d70 29 3b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72  );.      utf8_pr
12d80 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20  intf(pArg->out, 
12d90 22 4c 6f 6f 70 20 25 32 64 3a 20 25 73 5c 6e 22  "Loop %2d: %s\n"
12da0 2c 20 6e 2c 20 7a 45 78 70 6c 61 69 6e 29 3b 0a  , n, zExplain);.
12db0 20 20 20 20 20 20 72 45 73 74 4c 6f 6f 70 20 2a        rEstLoop *
12dc0 3d 20 72 45 73 74 3b 0a 20 20 20 20 20 20 72 61  = rEst;.      ra
12dd0 77 5f 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f  w_printf(pArg->o
12de0 75 74 2c 0a 20 20 20 20 20 20 20 20 20 20 22 20  ut,.          " 
12df0 20 20 20 20 20 20 20 20 6e 4c 6f 6f 70 3d 25 2d          nLoop=%-
12e00 38 6c 6c 64 20 6e 52 6f 77 3d 25 2d 38 6c 6c 64  8lld nRow=%-8lld
12e10 20 65 73 74 52 6f 77 3d 25 2d 38 6c 6c 64 20 65   estRow=%-8lld e
12e20 73 74 52 6f 77 2f 4c 6f 6f 70 3d 25 2d 38 67 5c  stRow/Loop=%-8g\
12e30 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 6e 4c  n",.          nL
12e40 6f 6f 70 2c 20 6e 56 69 73 69 74 2c 20 28 73 71  oop, nVisit, (sq
12e50 6c 69 74 65 33 5f 69 6e 74 36 34 29 28 72 45 73  lite3_int64)(rEs
12e60 74 4c 6f 6f 70 2b 30 2e 35 29 2c 20 72 45 73 74  tLoop+0.5), rEst
12e70 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a  .      );.    }.
12e80 20 20 7d 0a 20 20 72 61 77 5f 70 72 69 6e 74 66    }.  raw_printf
12e90 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22 2d 2d 2d  (pArg->out, "---
12ea0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12eb0 2d 2d 2d 2d 2d 2d 2d 2d 5c 6e 22 29 3b 0a 23 65  --------\n");.#e
12ec0 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61  ndif.}../*.** Pa
12ed0 72 61 6d 65 74 65 72 20 61 7a 41 72 72 61 79 20  rameter azArray 
12ee0 70 6f 69 6e 74 73 20 74 6f 20 61 20 7a 65 72 6f  points to a zero
12ef0 2d 74 65 72 6d 69 6e 61 74 65 64 20 61 72 72 61  -terminated arra
12f00 79 20 6f 66 20 73 74 72 69 6e 67 73 2e 20 7a 53  y of strings. zS
12f10 74 72 0a 2a 2a 20 70 6f 69 6e 74 73 20 74 6f 20  tr.** points to 
12f20 61 20 73 69 6e 67 6c 65 20 6e 75 6c 2d 74 65 72  a single nul-ter
12f30 6d 69 6e 61 74 65 64 20 73 74 72 69 6e 67 2e 20  minated string. 
12f40 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20  Return non-zero 
12f50 69 66 20 7a 53 74 72 0a 2a 2a 20 69 73 20 65 71  if zStr.** is eq
12f60 75 61 6c 2c 20 61 63 63 6f 72 64 69 6e 67 20 74  ual, according t
12f70 6f 20 73 74 72 63 6d 70 28 29 2c 20 74 6f 20 61  o strcmp(), to a
12f80 6e 79 20 6f 66 20 74 68 65 20 73 74 72 69 6e 67  ny of the string
12f90 73 20 69 6e 20 74 68 65 20 61 72 72 61 79 2e 0a  s in the array..
12fa0 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65  ** Otherwise, re
12fb0 74 75 72 6e 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74  turn zero..*/.st
12fc0 61 74 69 63 20 69 6e 74 20 73 74 72 5f 69 6e 5f  atic int str_in_
12fd0 61 72 72 61 79 28 63 6f 6e 73 74 20 63 68 61 72  array(const char
12fe0 20 2a 7a 53 74 72 2c 20 63 6f 6e 73 74 20 63 68   *zStr, const ch
12ff0 61 72 20 2a 2a 61 7a 41 72 72 61 79 29 7b 0a 20  ar **azArray){. 
13000 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d   int i;.  for(i=
13010 30 3b 20 61 7a 41 72 72 61 79 5b 69 5d 3b 20 69  0; azArray[i]; i
13020 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 30 3d 3d  ++){.    if( 0==
13030 73 74 72 63 6d 70 28 7a 53 74 72 2c 20 61 7a 41  strcmp(zStr, azA
13040 72 72 61 79 5b 69 5d 29 20 29 20 72 65 74 75 72  rray[i]) ) retur
13050 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  n 1;.  }.  retur
13060 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66  n 0;.}../*.** If
13070 20 63 6f 6d 70 69 6c 65 64 20 73 74 61 74 65 6d   compiled statem
13080 65 6e 74 20 70 53 71 6c 20 61 70 70 65 61 72 73  ent pSql appears
13090 20 74 6f 20 62 65 20 61 6e 20 45 58 50 4c 41 49   to be an EXPLAI
130a0 4e 20 73 74 61 74 65 6d 65 6e 74 2c 20 61 6c 6c  N statement, all
130b0 6f 63 61 74 65 0a 2a 2a 20 61 6e 64 20 70 6f 70  ocate.** and pop
130c0 75 6c 61 74 65 20 74 68 65 20 53 68 65 6c 6c 53  ulate the ShellS
130d0 74 61 74 65 2e 61 69 49 6e 64 65 6e 74 5b 5d 20  tate.aiIndent[] 
130e0 61 72 72 61 79 20 77 69 74 68 20 74 68 65 20 6e  array with the n
130f0 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 73 70 61 63  umber of.** spac
13100 65 73 20 65 61 63 68 20 6f 70 63 6f 64 65 20 73  es each opcode s
13110 68 6f 75 6c 64 20 62 65 20 69 6e 64 65 6e 74 65  hould be indente
13120 64 20 62 65 66 6f 72 65 20 69 74 20 69 73 20 6f  d before it is o
13130 75 74 70 75 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  utput..**.** The
13140 20 69 6e 64 65 6e 74 69 6e 67 20 72 75 6c 65 73   indenting rules
13150 20 61 72 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20   are:.**.**     
13160 2a 20 46 6f 72 20 65 61 63 68 20 22 4e 65 78 74  * For each "Next
13170 22 2c 20 22 50 72 65 76 22 2c 20 22 56 4e 65 78  ", "Prev", "VNex
13180 74 22 20 6f 72 20 22 56 50 72 65 76 22 20 69 6e  t" or "VPrev" in
13190 73 74 72 75 63 74 69 6f 6e 2c 20 69 6e 64 65 6e  struction, inden
131a0 74 0a 2a 2a 20 20 20 20 20 20 20 61 6c 6c 20 6f  t.**       all o
131b0 70 63 6f 64 65 73 20 74 68 61 74 20 6f 63 63 75  pcodes that occu
131c0 72 20 62 65 74 77 65 65 6e 20 74 68 65 20 70 32  r between the p2
131d0 20 6a 75 6d 70 20 64 65 73 74 69 6e 61 74 69 6f   jump destinatio
131e0 6e 20 61 6e 64 20 74 68 65 20 6f 70 63 6f 64 65  n and the opcode
131f0 0a 2a 2a 20 20 20 20 20 20 20 69 74 73 65 6c 66  .**       itself
13200 20 62 79 20 32 20 73 70 61 63 65 73 2e 0a 2a 2a   by 2 spaces..**
13210 0a 2a 2a 20 20 20 20 20 2a 20 46 6f 72 20 65 61  .**     * For ea
13220 63 68 20 22 47 6f 74 6f 22 2c 20 69 66 20 74 68  ch "Goto", if th
13230 65 20 6a 75 6d 70 20 64 65 73 74 69 6e 61 74 69  e jump destinati
13240 6f 6e 20 69 73 20 65 61 72 6c 69 65 72 20 69 6e  on is earlier in
13250 20 74 68 65 20 70 72 6f 67 72 61 6d 0a 2a 2a 20   the program.** 
13260 20 20 20 20 20 20 61 6e 64 20 65 6e 64 73 20 6f        and ends o
13270 6e 20 6f 6e 65 20 6f 66 3a 0a 2a 2a 20 20 20 20  n one of:.**    
13280 20 20 20 20 20 20 59 69 65 6c 64 20 20 53 65 65        Yield  See
13290 6b 47 74 20 20 53 65 65 6b 4c 74 20 20 52 6f 77  kGt  SeekLt  Row
132a0 53 65 74 52 65 61 64 20 20 52 65 77 69 6e 64 0a  SetRead  Rewind.
132b0 2a 2a 20 20 20 20 20 20 20 6f 72 20 69 66 20 74  **       or if t
132c0 68 65 20 50 31 20 70 61 72 61 6d 65 74 65 72 20  he P1 parameter 
132d0 69 73 20 6f 6e 65 20 69 6e 73 74 65 61 64 20 6f  is one instead o
132e0 66 20 7a 65 72 6f 2c 0a 2a 2a 20 20 20 20 20 20  f zero,.**      
132f0 20 74 68 65 6e 20 69 6e 64 65 6e 74 20 61 6c 6c   then indent all
13300 20 6f 70 63 6f 64 65 73 20 62 65 74 77 65 65 6e   opcodes between
13310 20 74 68 65 20 65 61 72 6c 69 65 72 20 69 6e 73   the earlier ins
13320 74 72 75 63 74 69 6f 6e 0a 2a 2a 20 20 20 20 20  truction.**     
13330 20 20 61 6e 64 20 22 47 6f 74 6f 22 20 62 79 20    and "Goto" by 
13340 32 20 73 70 61 63 65 73 2e 0a 2a 2f 0a 73 74 61  2 spaces..*/.sta
13350 74 69 63 20 76 6f 69 64 20 65 78 70 6c 61 69 6e  tic void explain
13360 5f 64 61 74 61 5f 70 72 65 70 61 72 65 28 53 68  _data_prepare(Sh
13370 65 6c 6c 53 74 61 74 65 20 2a 70 2c 20 73 71 6c  ellState *p, sql
13380 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 71 6c 29  ite3_stmt *pSql)
13390 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
133a0 7a 53 71 6c 3b 20 20 20 20 20 20 20 20 20 20 20  zSql;           
133b0 20 20 20 20 2f 2a 20 54 68 65 20 74 65 78 74 20      /* The text 
133c0 6f 66 20 74 68 65 20 53 51 4c 20 73 74 61 74 65  of the SQL state
133d0 6d 65 6e 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  ment */.  const 
133e0 63 68 61 72 20 2a 7a 3b 20 20 20 20 20 20 20 20  char *z;        
133f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65            /* Use
13400 64 20 74 6f 20 63 68 65 63 6b 20 69 66 20 74 68  d to check if th
13410 69 73 20 69 73 20 61 6e 20 45 58 50 4c 41 49 4e  is is an EXPLAIN
13420 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 62 59 69 65   */.  int *abYie
13430 6c 64 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ld = 0;         
13440 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
13450 20 6f 70 20 69 73 20 61 6e 20 4f 50 5f 59 69 65   op is an OP_Yie
13460 6c 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 6c 6c  ld */.  int nAll
13470 6f 63 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  oc = 0;         
13480 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f 63          /* Alloc
13490 61 74 65 64 20 73 69 7a 65 20 6f 66 20 70 2d 3e  ated size of p->
134a0 61 69 49 6e 64 65 6e 74 5b 5d 2c 20 61 62 59 69  aiIndent[], abYi
134b0 65 6c 64 20 2a 2f 0a 20 20 69 6e 74 20 69 4f 70  eld */.  int iOp
134c0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
134d0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
134e0 78 20 6f 66 20 6f 70 65 72 61 74 69 6f 6e 20 69  x of operation i
134f0 6e 20 70 2d 3e 61 69 49 6e 64 65 6e 74 5b 5d 20  n p->aiIndent[] 
13500 2a 2f 0a 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  */..  const char
13510 20 2a 61 7a 4e 65 78 74 5b 5d 20 3d 20 7b 20 22   *azNext[] = { "
13520 4e 65 78 74 22 2c 20 22 50 72 65 76 22 2c 20 22  Next", "Prev", "
13530 56 50 72 65 76 22 2c 20 22 56 4e 65 78 74 22 2c  VPrev", "VNext",
13540 20 22 53 6f 72 74 65 72 4e 65 78 74 22 2c 0a 20   "SorterNext",. 
13550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13560 20 20 20 20 20 20 20 20 20 20 22 4e 65 78 74 49            "NextI
13570 66 4f 70 65 6e 22 2c 20 22 50 72 65 76 49 66 4f  fOpen", "PrevIfO
13580 70 65 6e 22 2c 20 30 20 7d 3b 0a 20 20 63 6f 6e  pen", 0 };.  con
13590 73 74 20 63 68 61 72 20 2a 61 7a 59 69 65 6c 64  st char *azYield
135a0 5b 5d 20 3d 20 7b 20 22 59 69 65 6c 64 22 2c 20  [] = { "Yield", 
135b0 22 53 65 65 6b 4c 54 22 2c 20 22 53 65 65 6b 47  "SeekLT", "SeekG
135c0 54 22 2c 20 22 52 6f 77 53 65 74 52 65 61 64 22  T", "RowSetRead"
135d0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
135e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 52                "R
135f0 65 77 69 6e 64 22 2c 20 30 20 7d 3b 0a 20 20 63  ewind", 0 };.  c
13600 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 47 6f 74  onst char *azGot
13610 6f 5b 5d 20 3d 20 7b 20 22 47 6f 74 6f 22 2c 20  o[] = { "Goto", 
13620 30 20 7d 3b 0a 0a 20 20 2f 2a 20 54 72 79 20 74  0 };..  /* Try t
13630 6f 20 66 69 67 75 72 65 20 6f 75 74 20 69 66 20  o figure out if 
13640 74 68 69 73 20 69 73 20 72 65 61 6c 6c 79 20 61  this is really a
13650 6e 20 45 58 50 4c 41 49 4e 20 73 74 61 74 65 6d  n EXPLAIN statem
13660 65 6e 74 2e 20 49 66 20 74 68 69 73 0a 20 20 2a  ent. If this.  *
13670 2a 20 63 61 6e 6e 6f 74 20 62 65 20 76 65 72 69  * cannot be veri
13680 66 69 65 64 2c 20 72 65 74 75 72 6e 20 65 61 72  fied, return ear
13690 6c 79 2e 20 20 2a 2f 0a 20 20 69 66 28 20 73 71  ly.  */.  if( sq
136a0 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75  lite3_column_cou
136b0 6e 74 28 70 53 71 6c 29 21 3d 38 20 29 7b 0a 20  nt(pSql)!=8 ){. 
136c0 20 20 20 70 2d 3e 63 4d 6f 64 65 20 3d 20 70 2d     p->cMode = p-
136d0 3e 6d 6f 64 65 3b 0a 20 20 20 20 72 65 74 75 72  >mode;.    retur
136e0 6e 3b 0a 20 20 7d 0a 20 20 7a 53 71 6c 20 3d 20  n;.  }.  zSql = 
136f0 73 71 6c 69 74 65 33 5f 73 71 6c 28 70 53 71 6c  sqlite3_sql(pSql
13700 29 3b 0a 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30  );.  if( zSql==0
13710 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72   ) return;.  for
13720 28 7a 3d 7a 53 71 6c 3b 20 2a 7a 3d 3d 27 20 27  (z=zSql; *z==' '
13730 20 7c 7c 20 2a 7a 3d 3d 27 5c 74 27 20 7c 7c 20   || *z=='\t' || 
13740 2a 7a 3d 3d 27 5c 6e 27 20 7c 7c 20 2a 7a 3d 3d  *z=='\n' || *z==
13750 27 5c 66 27 20 7c 7c 20 2a 7a 3d 3d 27 5c 72 27  '\f' || *z=='\r'
13760 3b 20 7a 2b 2b 29 3b 0a 20 20 69 66 28 20 73 71  ; z++);.  if( sq
13770 6c 69 74 65 33 5f 73 74 72 6e 69 63 6d 70 28 7a  lite3_strnicmp(z
13780 2c 20 22 65 78 70 6c 61 69 6e 22 2c 20 37 29 20  , "explain", 7) 
13790 29 7b 0a 20 20 20 20 70 2d 3e 63 4d 6f 64 65 20  ){.    p->cMode 
137a0 3d 20 70 2d 3e 6d 6f 64 65 3b 0a 20 20 20 20 72  = p->mode;.    r
137b0 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 66 6f  eturn;.  }..  fo
137c0 72 28 69 4f 70 3d 30 3b 20 53 51 4c 49 54 45 5f  r(iOp=0; SQLITE_
137d0 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65  ROW==sqlite3_ste
137e0 70 28 70 53 71 6c 29 3b 20 69 4f 70 2b 2b 29 7b  p(pSql); iOp++){
137f0 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
13800 69 6e 74 20 69 41 64 64 72 20 3d 20 73 71 6c 69  int iAddr = sqli
13810 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70  te3_column_int(p
13820 53 71 6c 2c 20 30 29 3b 0a 20 20 20 20 63 6f 6e  Sql, 0);.    con
13830 73 74 20 63 68 61 72 20 2a 7a 4f 70 20 3d 20 28  st char *zOp = (
13840 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69  const char*)sqli
13850 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28  te3_column_text(
13860 70 53 71 6c 2c 20 31 29 3b 0a 0a 20 20 20 20 2f  pSql, 1);..    /
13870 2a 20 53 65 74 20 70 32 20 74 6f 20 74 68 65 20  * Set p2 to the 
13880 50 32 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20  P2 field of the 
13890 63 75 72 72 65 6e 74 20 6f 70 63 6f 64 65 2e 20  current opcode. 
138a0 54 68 65 6e 2c 20 61 73 73 75 6d 69 6e 67 20 74  Then, assuming t
138b0 68 61 74 0a 20 20 20 20 2a 2a 20 70 32 20 69 73  hat.    ** p2 is
138c0 20 61 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 20   an instruction 
138d0 61 64 64 72 65 73 73 2c 20 73 65 74 20 76 61 72  address, set var
138e0 69 61 62 6c 65 20 70 32 6f 70 20 74 6f 20 74 68  iable p2op to th
138f0 65 20 69 6e 64 65 78 20 6f 66 20 74 68 61 74 0a  e index of that.
13900 20 20 20 20 2a 2a 20 69 6e 73 74 72 75 63 74 69      ** instructi
13910 6f 6e 20 69 6e 20 74 68 65 20 61 69 49 6e 64 65  on in the aiInde
13920 6e 74 5b 5d 20 61 72 72 61 79 2e 20 70 32 20 61  nt[] array. p2 a
13930 6e 64 20 70 32 6f 70 20 6d 61 79 20 62 65 20 64  nd p2op may be d
13940 69 66 66 65 72 65 6e 74 20 69 66 0a 20 20 20 20  ifferent if.    
13950 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20 69  ** the current i
13960 6e 73 74 72 75 63 74 69 6f 6e 20 69 73 20 70 61  nstruction is pa
13970 72 74 20 6f 66 20 61 20 73 75 62 2d 70 72 6f 67  rt of a sub-prog
13980 72 61 6d 20 67 65 6e 65 72 61 74 65 64 20 62 79  ram generated by
13990 20 61 6e 0a 20 20 20 20 2a 2a 20 53 51 4c 20 74   an.    ** SQL t
139a0 72 69 67 67 65 72 20 6f 72 20 66 6f 72 65 69 67  rigger or foreig
139b0 6e 20 6b 65 79 2e 20 20 2a 2f 0a 20 20 20 20 69  n key.  */.    i
139c0 6e 74 20 70 32 20 3d 20 73 71 6c 69 74 65 33 5f  nt p2 = sqlite3_
139d0 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 71 6c 2c  column_int(pSql,
139e0 20 33 29 3b 0a 20 20 20 20 69 6e 74 20 70 32 6f   3);.    int p2o
139f0 70 20 3d 20 28 70 32 20 2b 20 28 69 4f 70 2d 69  p = (p2 + (iOp-i
13a00 41 64 64 72 29 29 3b 0a 0a 20 20 20 20 2f 2a 20  Addr));..    /* 
13a10 47 72 6f 77 20 74 68 65 20 70 2d 3e 61 69 49 6e  Grow the p->aiIn
13a20 64 65 6e 74 20 61 72 72 61 79 20 61 73 20 72 65  dent array as re
13a30 71 75 69 72 65 64 20 2a 2f 0a 20 20 20 20 69 66  quired */.    if
13a40 28 20 69 4f 70 3e 3d 6e 41 6c 6c 6f 63 20 29 7b  ( iOp>=nAlloc ){
13a50 0a 20 20 20 20 20 20 69 66 28 20 69 4f 70 3d 3d  .      if( iOp==
13a60 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  0 ){.        /* 
13a70 44 6f 20 66 75 72 74 68 65 72 20 76 65 72 66 69  Do further verfi
13a80 63 61 74 69 6f 6e 20 74 68 61 74 20 74 68 69 73  cation that this
13a90 20 69 73 20 65 78 70 6c 61 69 6e 20 6f 75 74 70   is explain outp
13aa0 75 74 2e 20 20 41 62 6f 72 74 20 69 66 0a 20 20  ut.  Abort if.  
13ab0 20 20 20 20 20 20 2a 2a 20 69 74 20 69 73 20 6e        ** it is n
13ac0 6f 74 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 74  ot */.        st
13ad0 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
13ae0 2a 65 78 70 6c 61 69 6e 43 6f 6c 73 5b 5d 20 3d  *explainCols[] =
13af0 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 22 61   {.           "a
13b00 64 64 72 22 2c 20 22 6f 70 63 6f 64 65 22 2c 20  ddr", "opcode", 
13b10 22 70 31 22 2c 20 22 70 32 22 2c 20 22 70 33 22  "p1", "p2", "p3"
13b20 2c 20 22 70 34 22 2c 20 22 70 35 22 2c 20 22 63  , "p4", "p5", "c
13b30 6f 6d 6d 65 6e 74 22 20 7d 3b 0a 20 20 20 20 20  omment" };.     
13b40 20 20 20 69 6e 74 20 6a 6a 3b 0a 20 20 20 20 20     int jj;.     
13b50 20 20 20 66 6f 72 28 6a 6a 3d 30 3b 20 6a 6a 3c     for(jj=0; jj<
13b60 41 72 72 61 79 53 69 7a 65 28 65 78 70 6c 61 69  ArraySize(explai
13b70 6e 43 6f 6c 73 29 3b 20 6a 6a 2b 2b 29 7b 0a 20  nCols); jj++){. 
13b80 20 20 20 20 20 20 20 20 20 69 66 28 20 73 74 72           if( str
13b90 63 6d 70 28 73 71 6c 69 74 65 33 5f 63 6f 6c 75  cmp(sqlite3_colu
13ba0 6d 6e 5f 6e 61 6d 65 28 70 53 71 6c 2c 6a 6a 29  mn_name(pSql,jj)
13bb0 2c 65 78 70 6c 61 69 6e 43 6f 6c 73 5b 6a 6a 5d  ,explainCols[jj]
13bc0 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
13bd0 20 20 20 20 70 2d 3e 63 4d 6f 64 65 20 3d 20 70      p->cMode = p
13be0 2d 3e 6d 6f 64 65 3b 0a 20 20 20 20 20 20 20 20  ->mode;.        
13bf0 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 65      sqlite3_rese
13c00 74 28 70 53 71 6c 29 3b 0a 20 20 20 20 20 20 20  t(pSql);.       
13c10 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
13c20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
13c30 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
13c40 20 6e 41 6c 6c 6f 63 20 2b 3d 20 31 30 30 3b 0a   nAlloc += 100;.
13c50 20 20 20 20 20 20 70 2d 3e 61 69 49 6e 64 65 6e        p->aiInden
13c60 74 20 3d 20 28 69 6e 74 2a 29 73 71 6c 69 74 65  t = (int*)sqlite
13c70 33 5f 72 65 61 6c 6c 6f 63 36 34 28 70 2d 3e 61  3_realloc64(p->a
13c80 69 49 6e 64 65 6e 74 2c 20 6e 41 6c 6c 6f 63 2a  iIndent, nAlloc*
13c90 73 69 7a 65 6f 66 28 69 6e 74 29 29 3b 0a 20 20  sizeof(int));.  
13ca0 20 20 20 20 61 62 59 69 65 6c 64 20 3d 20 28 69      abYield = (i
13cb0 6e 74 2a 29 73 71 6c 69 74 65 33 5f 72 65 61 6c  nt*)sqlite3_real
13cc0 6c 6f 63 36 34 28 61 62 59 69 65 6c 64 2c 20 6e  loc64(abYield, n
13cd0 41 6c 6c 6f 63 2a 73 69 7a 65 6f 66 28 69 6e 74  Alloc*sizeof(int
13ce0 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 62  ));.    }.    ab
13cf0 59 69 65 6c 64 5b 69 4f 70 5d 20 3d 20 73 74 72  Yield[iOp] = str
13d00 5f 69 6e 5f 61 72 72 61 79 28 7a 4f 70 2c 20 61  _in_array(zOp, a
13d10 7a 59 69 65 6c 64 29 3b 0a 20 20 20 20 70 2d 3e  zYield);.    p->
13d20 61 69 49 6e 64 65 6e 74 5b 69 4f 70 5d 20 3d 20  aiIndent[iOp] = 
13d30 30 3b 0a 20 20 20 20 70 2d 3e 6e 49 6e 64 65 6e  0;.    p->nInden
13d40 74 20 3d 20 69 4f 70 2b 31 3b 0a 0a 20 20 20 20  t = iOp+1;..    
13d50 69 66 28 20 73 74 72 5f 69 6e 5f 61 72 72 61 79  if( str_in_array
13d60 28 7a 4f 70 2c 20 61 7a 4e 65 78 74 29 20 29 7b  (zOp, azNext) ){
13d70 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 70 32 6f  .      for(i=p2o
13d80 70 3b 20 69 3c 69 4f 70 3b 20 69 2b 2b 29 20 70  p; i<iOp; i++) p
13d90 2d 3e 61 69 49 6e 64 65 6e 74 5b 69 5d 20 2b 3d  ->aiIndent[i] +=
13da0 20 32 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   2;.    }.    if
13db0 28 20 73 74 72 5f 69 6e 5f 61 72 72 61 79 28 7a  ( str_in_array(z
13dc0 4f 70 2c 20 61 7a 47 6f 74 6f 29 20 26 26 20 70  Op, azGoto) && p
13dd0 32 6f 70 3c 70 2d 3e 6e 49 6e 64 65 6e 74 0a 20  2op<p->nIndent. 
13de0 20 20 20 20 26 26 20 28 61 62 59 69 65 6c 64 5b      && (abYield[
13df0 70 32 6f 70 5d 20 7c 7c 20 73 71 6c 69 74 65 33  p2op] || sqlite3
13e00 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 71 6c  _column_int(pSql
13e10 2c 20 32 29 29 0a 20 20 20 20 29 7b 0a 20 20 20  , 2)).    ){.   
13e20 20 20 20 66 6f 72 28 69 3d 70 32 6f 70 3b 20 69     for(i=p2op; i
13e30 3c 69 4f 70 3b 20 69 2b 2b 29 20 70 2d 3e 61 69  <iOp; i++) p->ai
13e40 49 6e 64 65 6e 74 5b 69 5d 20 2b 3d 20 32 3b 0a  Indent[i] += 2;.
13e50 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 2d 3e      }.  }..  p->
13e60 69 49 6e 64 65 6e 74 20 3d 20 30 3b 0a 20 20 73  iIndent = 0;.  s
13e70 71 6c 69 74 65 33 5f 66 72 65 65 28 61 62 59 69  qlite3_free(abYi
13e80 65 6c 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  eld);.  sqlite3_
13e90 72 65 73 65 74 28 70 53 71 6c 29 3b 0a 7d 0a 0a  reset(pSql);.}..
13ea0 2f 2a 0a 2a 2a 20 46 72 65 65 20 74 68 65 20 61  /*.** Free the a
13eb0 72 72 61 79 20 61 6c 6c 6f 63 61 74 65 64 20 62  rray allocated b
13ec0 79 20 65 78 70 6c 61 69 6e 5f 64 61 74 61 5f 70  y explain_data_p
13ed0 72 65 70 61 72 65 28 29 2e 0a 2a 2f 0a 73 74 61  repare()..*/.sta
13ee0 74 69 63 20 76 6f 69 64 20 65 78 70 6c 61 69 6e  tic void explain
13ef0 5f 64 61 74 61 5f 64 65 6c 65 74 65 28 53 68 65  _data_delete(She
13f00 6c 6c 53 74 61 74 65 20 2a 70 29 7b 0a 20 20 73  llState *p){.  s
13f10 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 61  qlite3_free(p->a
13f20 69 49 6e 64 65 6e 74 29 3b 0a 20 20 70 2d 3e 61  iIndent);.  p->a
13f30 69 49 6e 64 65 6e 74 20 3d 20 30 3b 0a 20 20 70  iIndent = 0;.  p
13f40 2d 3e 6e 49 6e 64 65 6e 74 20 3d 20 30 3b 0a 20  ->nIndent = 0;. 
13f50 20 70 2d 3e 69 49 6e 64 65 6e 74 20 3d 20 30 3b   p->iIndent = 0;
13f60 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 61 62 6c  .}../*.** Disabl
13f70 65 20 61 6e 64 20 72 65 73 74 6f 72 65 20 2e 77  e and restore .w
13f80 68 65 72 65 74 72 61 63 65 20 61 6e 64 20 2e 73  heretrace and .s
13f90 65 6c 65 63 74 74 72 61 63 65 20 73 65 74 74 69  electtrace setti
13fa0 6e 67 73 2e 0a 2a 2f 0a 23 69 66 20 64 65 66 69  ngs..*/.#if defi
13fb0 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47  ned(SQLITE_DEBUG
13fc0 29 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c  ) && defined(SQL
13fd0 49 54 45 5f 45 4e 41 42 4c 45 5f 53 45 4c 45 43  ITE_ENABLE_SELEC
13fe0 54 54 52 41 43 45 29 0a 65 78 74 65 72 6e 20 69  TTRACE).extern i
13ff0 6e 74 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  nt sqlite3Select
14000 54 72 61 63 65 3b 0a 73 74 61 74 69 63 20 69 6e  Trace;.static in
14010 74 20 73 61 76 65 64 53 65 6c 65 63 74 54 72 61  t savedSelectTra
14020 63 65 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 64  ce;.#endif.#if d
14030 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45  efined(SQLITE_DE
14040 42 55 47 29 20 26 26 20 64 65 66 69 6e 65 64 28  BUG) && defined(
14050 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 57 48  SQLITE_ENABLE_WH
14060 45 52 45 54 52 41 43 45 29 0a 65 78 74 65 72 6e  ERETRACE).extern
14070 20 69 6e 74 20 73 71 6c 69 74 65 33 57 68 65 72   int sqlite3Wher
14080 65 54 72 61 63 65 3b 0a 73 74 61 74 69 63 20 69  eTrace;.static i
14090 6e 74 20 73 61 76 65 64 57 68 65 72 65 54 72 61  nt savedWhereTra
140a0 63 65 3b 0a 23 65 6e 64 69 66 0a 73 74 61 74 69  ce;.#endif.stati
140b0 63 20 76 6f 69 64 20 64 69 73 61 62 6c 65 5f 64  c void disable_d
140c0 65 62 75 67 5f 74 72 61 63 65 5f 6d 6f 64 65 73  ebug_trace_modes
140d0 28 76 6f 69 64 29 7b 0a 23 69 66 20 64 65 66 69  (void){.#if defi
140e0 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47  ned(SQLITE_DEBUG
140f0 29 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c  ) && defined(SQL
14100 49 54 45 5f 45 4e 41 42 4c 45 5f 53 45 4c 45 43  ITE_ENABLE_SELEC
14110 54 54 52 41 43 45 29 0a 20 20 73 61 76 65 64 53  TTRACE).  savedS
14120 65 6c 65 63 74 54 72 61 63 65 20 3d 20 73 71 6c  electTrace = sql
14130 69 74 65 33 53 65 6c 65 63 74 54 72 61 63 65 3b  ite3SelectTrace;
14140 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  .  sqlite3Select
14150 54 72 61 63 65 20 3d 20 30 3b 0a 23 65 6e 64 69  Trace = 0;.#endi
14160 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  f.#if defined(SQ
14170 4c 49 54 45 5f 44 45 42 55 47 29 20 26 26 20 64  LITE_DEBUG) && d
14180 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
14190 41 42 4c 45 5f 57 48 45 52 45 54 52 41 43 45 29  ABLE_WHERETRACE)
141a0 0a 20 20 73 61 76 65 64 57 68 65 72 65 54 72 61  .  savedWhereTra
141b0 63 65 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72  ce = sqlite3Wher
141c0 65 54 72 61 63 65 3b 0a 20 20 73 71 6c 69 74 65  eTrace;.  sqlite
141d0 33 57 68 65 72 65 54 72 61 63 65 20 3d 20 30 3b  3WhereTrace = 0;
141e0 0a 23 65 6e 64 69 66 0a 7d 0a 73 74 61 74 69 63  .#endif.}.static
141f0 20 76 6f 69 64 20 72 65 73 74 6f 72 65 5f 64 65   void restore_de
14200 62 75 67 5f 74 72 61 63 65 5f 6d 6f 64 65 73 28  bug_trace_modes(
14210 76 6f 69 64 29 7b 0a 23 69 66 20 64 65 66 69 6e  void){.#if defin
14220 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29  ed(SQLITE_DEBUG)
14230 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49   && defined(SQLI
14240 54 45 5f 45 4e 41 42 4c 45 5f 53 45 4c 45 43 54  TE_ENABLE_SELECT
14250 54 52 41 43 45 29 0a 20 20 73 71 6c 69 74 65 33  TRACE).  sqlite3
14260 53 65 6c 65 63 74 54 72 61 63 65 20 3d 20 73 61  SelectTrace = sa
14270 76 65 64 53 65 6c 65 63 74 54 72 61 63 65 3b 0a  vedSelectTrace;.
14280 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e  #endif.#if defin
14290 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29  ed(SQLITE_DEBUG)
142a0 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49   && defined(SQLI
142b0 54 45 5f 45 4e 41 42 4c 45 5f 57 48 45 52 45 54  TE_ENABLE_WHERET
142c0 52 41 43 45 29 0a 20 20 73 71 6c 69 74 65 33 57  RACE).  sqlite3W
142d0 68 65 72 65 54 72 61 63 65 20 3d 20 73 61 76 65  hereTrace = save
142e0 64 57 68 65 72 65 54 72 61 63 65 3b 0a 23 65 6e  dWhereTrace;.#en
142f0 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 75 6e  dif.}../*.** Run
14300 20 61 20 70 72 65 70 61 72 65 64 20 73 74 61 74   a prepared stat
14310 65 6d 65 6e 74 0a 2a 2f 0a 73 74 61 74 69 63 20  ement.*/.static 
14320 76 6f 69 64 20 65 78 65 63 5f 70 72 65 70 61 72  void exec_prepar
14330 65 64 5f 73 74 6d 74 28 0a 20 20 53 68 65 6c 6c  ed_stmt(.  Shell
14340 53 74 61 74 65 20 2a 70 41 72 67 2c 20 20 20 20  State *pArg,    
14350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14360 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
14370 6f 69 6e 74 65 72 20 74 6f 20 53 68 65 6c 6c 53  ointer to ShellS
14380 74 61 74 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  tate */.  sqlite
14390 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 20 20  3_stmt *pStmt   
143a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
143b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74             /* St
143c0 61 74 6d 65 6e 74 20 74 6f 20 72 75 6e 20 2a 2f  atment to run */
143d0 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  .){.  int rc;.. 
143e0 20 2f 2a 20 70 65 72 66 6f 72 6d 20 74 68 65 20   /* perform the 
143f0 66 69 72 73 74 20 73 74 65 70 2e 20 20 74 68 69  first step.  thi
14400 73 20 77 69 6c 6c 20 74 65 6c 6c 20 75 73 20 69  s will tell us i
14410 66 20 77 65 0a 20 20 2a 2a 20 68 61 76 65 20 61  f we.  ** have a
14420 20 72 65 73 75 6c 74 20 73 65 74 20 6f 72 20 6e   result set or n
14430 6f 74 20 61 6e 64 20 68 6f 77 20 77 69 64 65 20  ot and how wide 
14440 69 74 20 69 73 2e 0a 20 20 2a 2f 0a 20 20 72 63  it is..  */.  rc
14450 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28   = sqlite3_step(
14460 70 53 74 6d 74 29 3b 0a 20 20 2f 2a 20 69 66 20  pStmt);.  /* if 
14470 77 65 20 68 61 76 65 20 61 20 72 65 73 75 6c 74  we have a result
14480 20 73 65 74 2e 2e 2e 20 2a 2f 0a 20 20 69 66 28   set... */.  if(
14490 20 53 51 4c 49 54 45 5f 52 4f 57 20 3d 3d 20 72   SQLITE_ROW == r
144a0 63 20 29 7b 0a 20 20 20 20 2f 2a 20 61 6c 6c 6f  c ){.    /* allo
144b0 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 20 63  cate space for c
144c0 6f 6c 20 6e 61 6d 65 20 70 74 72 2c 20 76 61 6c  ol name ptr, val
144d0 75 65 20 70 74 72 2c 20 61 6e 64 20 74 79 70 65  ue ptr, and type
144e0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6c   */.    int nCol
144f0 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
14500 6e 5f 63 6f 75 6e 74 28 70 53 74 6d 74 29 3b 0a  n_count(pStmt);.
14510 20 20 20 20 76 6f 69 64 20 2a 70 44 61 74 61 20      void *pData 
14520 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  = sqlite3_malloc
14530 36 34 28 33 2a 6e 43 6f 6c 2a 73 69 7a 65 6f 66  64(3*nCol*sizeof
14540 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 20 2b 20  (const char*) + 
14550 31 29 3b 0a 20 20 20 20 69 66 28 20 21 70 44 61  1);.    if( !pDa
14560 74 61 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  ta ){.      rc =
14570 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
14580 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
14590 63 68 61 72 20 2a 2a 61 7a 43 6f 6c 73 20 3d 20  char **azCols = 
145a0 28 63 68 61 72 20 2a 2a 29 70 44 61 74 61 3b 20  (char **)pData; 
145b0 20 20 20 20 20 2f 2a 20 4e 61 6d 65 73 20 6f 66       /* Names of
145c0 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20   result columns 
145d0 2a 2f 0a 20 20 20 20 20 20 63 68 61 72 20 2a 2a  */.      char **
145e0 61 7a 56 61 6c 73 20 3d 20 26 61 7a 43 6f 6c 73  azVals = &azCols
145f0 5b 6e 43 6f 6c 5d 3b 20 20 20 20 20 20 20 2f 2a  [nCol];       /*
14600 20 52 65 73 75 6c 74 73 20 2a 2f 0a 20 20 20 20   Results */.    
14610 20 20 69 6e 74 20 2a 61 69 54 79 70 65 73 20 3d    int *aiTypes =
14620 20 28 69 6e 74 20 2a 29 26 61 7a 56 61 6c 73 5b   (int *)&azVals[
14630 6e 43 6f 6c 5d 3b 20 2f 2a 20 52 65 73 75 6c 74  nCol]; /* Result
14640 20 74 79 70 65 73 20 2a 2f 0a 20 20 20 20 20 20   types */.      
14650 69 6e 74 20 69 2c 20 78 3b 0a 20 20 20 20 20 20  int i, x;.      
14660 61 73 73 65 72 74 28 73 69 7a 65 6f 66 28 69 6e  assert(sizeof(in
14670 74 29 20 3c 3d 20 73 69 7a 65 6f 66 28 63 68 61  t) <= sizeof(cha
14680 72 20 2a 29 29 3b 0a 20 20 20 20 20 20 2f 2a 20  r *));.      /* 
14690 73 61 76 65 20 6f 66 66 20 70 74 72 73 20 74 6f  save off ptrs to
146a0 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f   column names */
146b0 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
146c0 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  i<nCol; i++){.  
146d0 20 20 20 20 20 20 61 7a 43 6f 6c 73 5b 69 5d 20        azCols[i] 
146e0 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65  = (char *)sqlite
146f0 33 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 28 70 53  3_column_name(pS
14700 74 6d 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 7d  tmt, i);.      }
14710 0a 20 20 20 20 20 20 64 6f 7b 0a 20 20 20 20 20  .      do{.     
14720 20 20 20 2f 2a 20 65 78 74 72 61 63 74 20 74 68     /* extract th
14730 65 20 64 61 74 61 20 61 6e 64 20 64 61 74 61 20  e data and data 
14740 74 79 70 65 73 20 2a 2f 0a 20 20 20 20 20 20 20  types */.       
14750 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c   for(i=0; i<nCol
14760 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
14770 20 20 61 69 54 79 70 65 73 5b 69 5d 20 3d 20 78    aiTypes[i] = x
14780 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
14790 6e 5f 74 79 70 65 28 70 53 74 6d 74 2c 20 69 29  n_type(pStmt, i)
147a0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
147b0 78 3d 3d 53 51 4c 49 54 45 5f 42 4c 4f 42 20 26  x==SQLITE_BLOB &
147c0 26 20 70 41 72 67 20 26 26 20 70 41 72 67 2d 3e  & pArg && pArg->
147d0 63 4d 6f 64 65 3d 3d 4d 4f 44 45 5f 49 6e 73 65  cMode==MODE_Inse
147e0 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  rt ){.          
147f0 20 20 61 7a 56 61 6c 73 5b 69 5d 20 3d 20 22 22    azVals[i] = ""
14800 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
14810 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61  e{.            a
14820 7a 56 61 6c 73 5b 69 5d 20 3d 20 28 63 68 61 72  zVals[i] = (char
14830 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  *)sqlite3_column
14840 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 69 29 3b  _text(pStmt, i);
14850 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
14860 20 20 20 20 20 20 20 69 66 28 20 21 61 7a 56 61         if( !azVa
14870 6c 73 5b 69 5d 20 26 26 20 28 61 69 54 79 70 65  ls[i] && (aiType
14880 73 5b 69 5d 21 3d 53 51 4c 49 54 45 5f 4e 55 4c  s[i]!=SQLITE_NUL
14890 4c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  L) ){.          
148a0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
148b0 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 20  MEM;.           
148c0 20 62 72 65 61 6b 3b 20 2f 2a 20 66 72 6f 6d 20   break; /* from 
148d0 66 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  for */.         
148e0 20 7d 0a 20 20 20 20 20 20 20 20 7d 20 2f 2a 20   }.        } /* 
148f0 65 6e 64 20 66 6f 72 20 2a 2f 0a 0a 20 20 20 20  end for */..    
14900 20 20 20 20 2f 2a 20 69 66 20 64 61 74 61 20 61      /* if data a
14910 6e 64 20 74 79 70 65 73 20 65 78 74 72 61 63 74  nd types extract
14920 65 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2e  ed successfully.
14930 2e 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66  .. */.        if
14940 28 20 53 51 4c 49 54 45 5f 52 4f 57 20 3d 3d 20  ( SQLITE_ROW == 
14950 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  rc ){.          
14960 2f 2a 20 63 61 6c 6c 20 74 68 65 20 73 75 70 70  /* call the supp
14970 6c 69 65 64 20 63 61 6c 6c 62 61 63 6b 20 77 69  lied callback wi
14980 74 68 20 74 68 65 20 72 65 73 75 6c 74 20 72 6f  th the result ro
14990 77 20 64 61 74 61 20 2a 2f 0a 20 20 20 20 20 20  w data */.      
149a0 20 20 20 20 69 66 28 20 73 68 65 6c 6c 5f 63 61      if( shell_ca
149b0 6c 6c 62 61 63 6b 28 70 41 72 67 2c 20 6e 43 6f  llback(pArg, nCo
149c0 6c 2c 20 61 7a 56 61 6c 73 2c 20 61 7a 43 6f 6c  l, azVals, azCol
149d0 73 2c 20 61 69 54 79 70 65 73 29 20 29 7b 0a 20  s, aiTypes) ){. 
149e0 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
149f0 53 51 4c 49 54 45 5f 41 42 4f 52 54 3b 0a 20 20  SQLITE_ABORT;.  
14a00 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
14a10 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
14a20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74  sqlite3_step(pSt
14a30 6d 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  mt);.          }
14a40 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
14a50 20 7d 20 77 68 69 6c 65 28 20 53 51 4c 49 54 45   } while( SQLITE
14a60 5f 52 4f 57 20 3d 3d 20 72 63 20 29 3b 0a 20 20  _ROW == rc );.  
14a70 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
14a80 28 70 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20  (pData);.    }. 
14a90 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51   }.}..#ifndef SQ
14aa0 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
14ab0 4c 54 41 42 4c 45 0a 2f 2a 0a 2a 2a 20 54 68 69  LTABLE./*.** Thi
14ac0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
14ad0 6c 6c 65 64 20 74 6f 20 70 72 6f 63 65 73 73 20  lled to process 
14ae0 53 51 4c 20 69 66 20 74 68 65 20 70 72 65 76 69  SQL if the previ
14af0 6f 75 73 20 73 68 65 6c 6c 20 63 6f 6d 6d 61 6e  ous shell comman
14b00 64 0a 2a 2a 20 77 61 73 20 22 2e 65 78 70 65 72  d.** was ".exper
14b10 74 22 2e 20 49 74 20 70 61 73 73 65 73 20 74 68  t". It passes th
14b20 65 20 53 51 4c 20 69 6e 20 74 68 65 20 73 65 63  e SQL in the sec
14b30 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 64 69 72  ond argument dir
14b40 65 63 74 6c 79 20 74 6f 0a 2a 2a 20 74 68 65 20  ectly to.** the 
14b50 73 71 6c 69 74 65 33 65 78 70 65 72 74 20 6f 62  sqlite3expert ob
14b60 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73  ject..**.** If s
14b70 75 63 63 65 73 73 66 75 6c 2c 20 53 51 4c 49 54  uccessful, SQLIT
14b80 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
14b90 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 61 6e 20  . Otherwise, an 
14ba0 53 51 4c 69 74 65 20 65 72 72 6f 72 0a 2a 2a 20  SQLite error.** 
14bb0 63 6f 64 65 2e 20 49 6e 20 74 68 69 73 20 63 61  code. In this ca
14bc0 73 65 2c 20 28 2a 70 7a 45 72 72 29 20 6d 61 79  se, (*pzErr) may
14bd0 20 62 65 20 73 65 74 20 74 6f 20 70 6f 69 6e 74   be set to point
14be0 20 74 6f 20 61 20 62 75 66 66 65 72 20 63 6f 6e   to a buffer con
14bf0 74 61 69 6e 69 6e 67 0a 2a 2a 20 61 6e 20 45 6e  taining.** an En
14c00 67 6c 69 73 68 20 6c 61 6e 67 75 61 67 65 20 65  glish language e
14c10 72 72 6f 72 20 6d 65 73 73 61 67 65 2e 20 49 74  rror message. It
14c20 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69   is the responsi
14c30 62 69 6c 69 74 79 20 6f 66 20 74 68 65 0a 2a 2a  bility of the.**
14c40 20 63 61 6c 6c 65 72 20 74 6f 20 65 76 65 6e 74   caller to event
14c50 75 61 6c 6c 79 20 66 72 65 65 20 74 68 69 73 20  ually free this 
14c60 62 75 66 66 65 72 20 75 73 69 6e 67 20 73 71 6c  buffer using sql
14c70 69 74 65 33 5f 66 72 65 65 28 29 2e 0a 2a 2f 0a  ite3_free()..*/.
14c80 73 74 61 74 69 63 20 69 6e 74 20 65 78 70 65 72  static int exper
14c90 74 48 61 6e 64 6c 65 53 51 4c 28 0a 20 20 53 68  tHandleSQL(.  Sh
14ca0 65 6c 6c 53 74 61 74 65 20 2a 70 53 74 61 74 65  ellState *pState
14cb0 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  , .  const char 
14cc0 2a 7a 53 71 6c 2c 20 0a 20 20 63 68 61 72 20 2a  *zSql, .  char *
14cd0 2a 70 7a 45 72 72 0a 29 7b 0a 20 20 61 73 73 65  *pzErr.){.  asse
14ce0 72 74 28 20 70 53 74 61 74 65 2d 3e 65 78 70 65  rt( pState->expe
14cf0 72 74 2e 70 45 78 70 65 72 74 20 29 3b 0a 20 20  rt.pExpert );.  
14d00 61 73 73 65 72 74 28 20 70 7a 45 72 72 3d 3d 30  assert( pzErr==0
14d10 20 7c 7c 20 2a 70 7a 45 72 72 3d 3d 30 20 29 3b   || *pzErr==0 );
14d20 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
14d30 33 5f 65 78 70 65 72 74 5f 73 71 6c 28 70 53 74  3_expert_sql(pSt
14d40 61 74 65 2d 3e 65 78 70 65 72 74 2e 70 45 78 70  ate->expert.pExp
14d50 65 72 74 2c 20 7a 53 71 6c 2c 20 70 7a 45 72 72  ert, zSql, pzErr
14d60 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  );.}../*.** This
14d70 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
14d80 6c 65 64 20 65 69 74 68 65 72 20 74 6f 20 73 69  led either to si
14d90 6c 65 6e 74 6c 79 20 63 6c 65 61 6e 20 75 70 20  lently clean up 
14da0 74 68 65 20 6f 62 6a 65 63 74 0a 2a 2a 20 63 72  the object.** cr
14db0 65 61 74 65 64 20 62 79 20 74 68 65 20 22 2e 65  eated by the ".e
14dc0 78 70 65 72 74 22 20 63 6f 6d 6d 61 6e 64 20 28  xpert" command (
14dd0 69 66 20 62 43 61 6e 63 65 6c 3d 3d 31 29 2c 20  if bCancel==1), 
14de0 6f 72 20 74 6f 20 67 65 6e 65 72 61 74 65 20 61  or to generate a
14df0 20 0a 2a 2a 20 72 65 70 6f 72 74 20 66 72 6f 6d   .** report from
14e00 20 69 74 20 61 6e 64 20 74 68 65 6e 20 63 6c 65   it and then cle
14e10 61 6e 20 69 74 20 75 70 20 28 69 66 20 62 43 61  an it up (if bCa
14e20 6e 63 65 6c 3d 3d 30 29 2e 0a 2a 2a 0a 2a 2a 20  ncel==0)..**.** 
14e30 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 53  If successful, S
14e40 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
14e50 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c  rned. Otherwise,
14e60 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
14e70 0a 2a 2a 20 63 6f 64 65 2e 20 49 6e 20 74 68 69  .** code. In thi
14e80 73 20 63 61 73 65 2c 20 28 2a 70 7a 45 72 72 29  s case, (*pzErr)
14e90 20 6d 61 79 20 62 65 20 73 65 74 20 74 6f 20 70   may be set to p
14ea0 6f 69 6e 74 20 74 6f 20 61 20 62 75 66 66 65 72  oint to a buffer
14eb0 20 63 6f 6e 74 61 69 6e 69 6e 67 0a 2a 2a 20 61   containing.** a
14ec0 6e 20 45 6e 67 6c 69 73 68 20 6c 61 6e 67 75 61  n English langua
14ed0 67 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  ge error message
14ee0 2e 20 49 74 20 69 73 20 74 68 65 20 72 65 73 70  . It is the resp
14ef0 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68  onsibility of th
14f00 65 0a 2a 2a 20 63 61 6c 6c 65 72 20 74 6f 20 65  e.** caller to e
14f10 76 65 6e 74 75 61 6c 6c 79 20 66 72 65 65 20 74  ventually free t
14f20 68 69 73 20 62 75 66 66 65 72 20 75 73 69 6e 67  his buffer using
14f30 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 29 2e   sqlite3_free().
14f40 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65  .*/.static int e
14f50 78 70 65 72 74 46 69 6e 69 73 68 28 0a 20 20 53  xpertFinish(.  S
14f60 68 65 6c 6c 53 74 61 74 65 20 2a 70 53 74 61 74  hellState *pStat
14f70 65 2c 0a 20 20 69 6e 74 20 62 43 61 6e 63 65 6c  e,.  int bCancel
14f80 2c 0a 20 20 63 68 61 72 20 2a 2a 70 7a 45 72 72  ,.  char **pzErr
14f90 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  .){.  int rc = S
14fa0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 73 71 6c 69  QLITE_OK;.  sqli
14fb0 74 65 33 65 78 70 65 72 74 20 2a 70 20 3d 20 70  te3expert *p = p
14fc0 53 74 61 74 65 2d 3e 65 78 70 65 72 74 2e 70 45  State->expert.pE
14fd0 78 70 65 72 74 3b 0a 20 20 61 73 73 65 72 74 28  xpert;.  assert(
14fe0 20 70 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20   p );.  assert( 
14ff0 62 43 61 6e 63 65 6c 20 7c 7c 20 70 7a 45 72 72  bCancel || pzErr
15000 3d 3d 30 20 7c 7c 20 2a 70 7a 45 72 72 3d 3d 30  ==0 || *pzErr==0
15010 20 29 3b 0a 20 20 69 66 28 20 62 43 61 6e 63 65   );.  if( bCance
15020 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 46 49 4c 45  l==0 ){.    FILE
15030 20 2a 6f 75 74 20 3d 20 70 53 74 61 74 65 2d 3e   *out = pState->
15040 6f 75 74 3b 0a 20 20 20 20 69 6e 74 20 62 56 65  out;.    int bVe
15050 72 62 6f 73 65 20 3d 20 70 53 74 61 74 65 2d 3e  rbose = pState->
15060 65 78 70 65 72 74 2e 62 56 65 72 62 6f 73 65 3b  expert.bVerbose;
15070 0a 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ..    rc = sqlit
15080 65 33 5f 65 78 70 65 72 74 5f 61 6e 61 6c 79 7a  e3_expert_analyz
15090 65 28 70 2c 20 70 7a 45 72 72 29 3b 0a 20 20 20  e(p, pzErr);.   
150a0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
150b0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  OK ){.      int 
150c0 6e 51 75 65 72 79 20 3d 20 73 71 6c 69 74 65 33  nQuery = sqlite3
150d0 5f 65 78 70 65 72 74 5f 63 6f 75 6e 74 28 70 29  _expert_count(p)
150e0 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 0a  ;.      int i;..
150f0 20 20 20 20 20 20 69 66 28 20 62 56 65 72 62 6f        if( bVerbo
15100 73 65 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f  se ){.        co
15110 6e 73 74 20 63 68 61 72 20 2a 7a 43 61 6e 64 20  nst char *zCand 
15120 3d 20 73 71 6c 69 74 65 33 5f 65 78 70 65 72 74  = sqlite3_expert
15130 5f 72 65 70 6f 72 74 28 70 2c 30 2c 45 58 50 45  _report(p,0,EXPE
15140 52 54 5f 52 45 50 4f 52 54 5f 43 41 4e 44 49 44  RT_REPORT_CANDID
15150 41 54 45 53 29 3b 0a 20 20 20 20 20 20 20 20 72  ATES);.        r
15160 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22  aw_printf(out, "
15170 2d 2d 20 43 61 6e 64 69 64 61 74 65 73 20 2d 2d  -- Candidates --
15180 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15190 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 5c 6e 22 29 3b  -----------\n");
151a0 0a 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69  .        raw_pri
151b0 6e 74 66 28 6f 75 74 2c 20 22 25 73 5c 6e 22 2c  ntf(out, "%s\n",
151c0 20 7a 43 61 6e 64 29 3b 0a 20 20 20 20 20 20 7d   zCand);.      }
151d0 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
151e0 69 3c 6e 51 75 65 72 79 3b 20 69 2b 2b 29 7b 0a  i<nQuery; i++){.
151f0 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68          const ch
15200 61 72 20 2a 7a 53 71 6c 20 3d 20 73 71 6c 69 74  ar *zSql = sqlit
15210 65 33 5f 65 78 70 65 72 74 5f 72 65 70 6f 72 74  e3_expert_report
15220 28 70 2c 20 69 2c 20 45 58 50 45 52 54 5f 52 45  (p, i, EXPERT_RE
15230 50 4f 52 54 5f 53 51 4c 29 3b 0a 20 20 20 20 20  PORT_SQL);.     
15240 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
15250 49 64 78 20 3d 20 73 71 6c 69 74 65 33 5f 65 78  Idx = sqlite3_ex
15260 70 65 72 74 5f 72 65 70 6f 72 74 28 70 2c 20 69  pert_report(p, i
15270 2c 20 45 58 50 45 52 54 5f 52 45 50 4f 52 54 5f  , EXPERT_REPORT_
15280 49 4e 44 45 58 45 53 29 3b 0a 20 20 20 20 20 20  INDEXES);.      
15290 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45    const char *zE
152a0 51 50 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 70  QP = sqlite3_exp
152b0 65 72 74 5f 72 65 70 6f 72 74 28 70 2c 20 69 2c  ert_report(p, i,
152c0 20 45 58 50 45 52 54 5f 52 45 50 4f 52 54 5f 50   EXPERT_REPORT_P
152d0 4c 41 4e 29 3b 0a 20 20 20 20 20 20 20 20 69 66  LAN);.        if
152e0 28 20 7a 49 64 78 3d 3d 30 20 29 20 7a 49 64 78  ( zIdx==0 ) zIdx
152f0 20 3d 20 22 28 6e 6f 20 6e 65 77 20 69 6e 64 65   = "(no new inde
15300 78 65 73 29 5c 6e 22 3b 0a 20 20 20 20 20 20 20  xes)\n";.       
15310 20 69 66 28 20 62 56 65 72 62 6f 73 65 20 29 7b   if( bVerbose ){
15320 0a 20 20 20 20 20 20 20 20 20 20 72 61 77 5f 70  .          raw_p
15330 72 69 6e 74 66 28 6f 75 74 2c 20 22 2d 2d 20 51  rintf(out, "-- Q
15340 75 65 72 79 20 25 64 20 2d 2d 2d 2d 2d 2d 2d 2d  uery %d --------
15350 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15360 2d 2d 2d 2d 2d 2d 2d 2d 5c 6e 22 2c 69 2b 31 29  --------\n",i+1)
15370 3b 0a 20 20 20 20 20 20 20 20 20 20 72 61 77 5f  ;.          raw_
15380 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 73 5c  printf(out, "%s\
15390 6e 5c 6e 22 2c 20 7a 53 71 6c 29 3b 0a 20 20 20  n\n", zSql);.   
153a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72       }.        r
153b0 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22  aw_printf(out, "
153c0 25 73 5c 6e 22 2c 20 7a 49 64 78 29 3b 0a 20 20  %s\n", zIdx);.  
153d0 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
153e0 28 6f 75 74 2c 20 22 25 73 5c 6e 22 2c 20 7a 45  (out, "%s\n", zE
153f0 51 50 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  QP);.      }.   
15400 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
15410 5f 65 78 70 65 72 74 5f 64 65 73 74 72 6f 79 28  _expert_destroy(
15420 70 29 3b 0a 20 20 70 53 74 61 74 65 2d 3e 65 78  p);.  pState->ex
15430 70 65 72 74 2e 70 45 78 70 65 72 74 20 3d 20 30  pert.pExpert = 0
15440 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
15450 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e  ../*.** Implemen
15460 74 61 74 69 6f 6e 20 6f 66 20 22 2e 65 78 70 65  tation of ".expe
15470 72 74 22 20 64 6f 74 20 63 6f 6d 6d 61 6e 64 2e  rt" dot command.
15480 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65  .*/.static int e
15490 78 70 65 72 74 44 6f 74 43 6f 6d 6d 61 6e 64 28  xpertDotCommand(
154a0 0a 20 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 70  .  ShellState *p
154b0 53 74 61 74 65 2c 20 20 20 20 20 20 20 20 20 20  State,          
154c0 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 73 68     /* Current sh
154d0 65 6c 6c 20 74 6f 6f 6c 20 73 74 61 74 65 20 2a  ell tool state *
154e0 2f 0a 20 20 63 68 61 72 20 2a 2a 61 7a 41 72 67  /.  char **azArg
154f0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
15500 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20      /* Array of 
15510 61 72 67 75 6d 65 6e 74 73 20 70 61 73 73 65 64  arguments passed
15520 20 74 6f 20 64 6f 74 20 63 6f 6d 6d 61 6e 64 20   to dot command 
15530 2a 2f 0a 20 20 69 6e 74 20 6e 41 72 67 20 20 20  */.  int nArg   
15540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15550 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
15560 66 20 65 6e 74 72 69 65 73 20 69 6e 20 61 7a 41  f entries in azA
15570 72 67 5b 5d 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  rg[] */.){.  int
15580 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
15590 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 20 3d 20  .  char *zErr = 
155a0 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  0;.  int i;.  in
155b0 74 20 69 53 61 6d 70 6c 65 20 3d 20 30 3b 0a 0a  t iSample = 0;..
155c0 20 20 61 73 73 65 72 74 28 20 70 53 74 61 74 65    assert( pState
155d0 2d 3e 65 78 70 65 72 74 2e 70 45 78 70 65 72 74  ->expert.pExpert
155e0 3d 3d 30 20 29 3b 0a 20 20 6d 65 6d 73 65 74 28  ==0 );.  memset(
155f0 26 70 53 74 61 74 65 2d 3e 65 78 70 65 72 74 2c  &pState->expert,
15600 20 30 2c 20 73 69 7a 65 6f 66 28 45 78 70 65 72   0, sizeof(Exper
15610 74 49 6e 66 6f 29 29 3b 0a 0a 20 20 66 6f 72 28  tInfo));..  for(
15620 69 3d 31 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  i=1; rc==SQLITE_
15630 4f 4b 20 26 26 20 69 3c 6e 41 72 67 3b 20 69 2b  OK && i<nArg; i+
15640 2b 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 20  +){.    char *z 
15650 3d 20 61 7a 41 72 67 5b 69 5d 3b 0a 20 20 20 20  = azArg[i];.    
15660 69 6e 74 20 6e 3b 0a 20 20 20 20 69 66 28 20 7a  int n;.    if( z
15670 5b 30 5d 3d 3d 27 2d 27 20 26 26 20 7a 5b 31 5d  [0]=='-' && z[1]
15680 3d 3d 27 2d 27 20 29 20 7a 2b 2b 3b 0a 20 20 20  =='-' ) z++;.   
15690 20 6e 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a 29   n = strlen30(z)
156a0 3b 0a 20 20 20 20 69 66 28 20 6e 3e 3d 32 20 26  ;.    if( n>=2 &
156b0 26 20 30 3d 3d 73 74 72 6e 63 6d 70 28 7a 2c 20  & 0==strncmp(z, 
156c0 22 2d 76 65 72 62 6f 73 65 22 2c 20 6e 29 20 29  "-verbose", n) )
156d0 7b 0a 20 20 20 20 20 20 70 53 74 61 74 65 2d 3e  {.      pState->
156e0 65 78 70 65 72 74 2e 62 56 65 72 62 6f 73 65 20  expert.bVerbose 
156f0 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65  = 1;.    }.    e
15700 6c 73 65 20 69 66 28 20 6e 3e 3d 32 20 26 26 20  lse if( n>=2 && 
15710 30 3d 3d 73 74 72 6e 63 6d 70 28 7a 2c 20 22 2d  0==strncmp(z, "-
15720 73 61 6d 70 6c 65 22 2c 20 6e 29 20 29 7b 0a 20  sample", n) ){. 
15730 20 20 20 20 20 69 66 28 20 69 3d 3d 28 6e 41 72       if( i==(nAr
15740 67 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20  g-1) ){.        
15750 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72  raw_printf(stder
15760 72 2c 20 22 6f 70 74 69 6f 6e 20 72 65 71 75 69  r, "option requi
15770 72 65 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 3a  res an argument:
15780 20 25 73 5c 6e 22 2c 20 7a 29 3b 0a 20 20 20 20   %s\n", z);.    
15790 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
157a0 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 65 6c  ERROR;.      }el
157b0 73 65 7b 0a 20 20 20 20 20 20 20 20 69 53 61 6d  se{.        iSam
157c0 70 6c 65 20 3d 20 28 69 6e 74 29 69 6e 74 65 67  ple = (int)integ
157d0 65 72 56 61 6c 75 65 28 61 7a 41 72 67 5b 2b 2b  erValue(azArg[++
157e0 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  i]);.        if(
157f0 20 69 53 61 6d 70 6c 65 3c 30 20 7c 7c 20 69 53   iSample<0 || iS
15800 61 6d 70 6c 65 3e 31 30 30 20 29 7b 0a 20 20 20  ample>100 ){.   
15810 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74         raw_print
15820 66 28 73 74 64 65 72 72 2c 20 22 76 61 6c 75 65  f(stderr, "value
15830 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 3a 20 25   out of range: %
15840 73 5c 6e 22 2c 20 61 7a 41 72 67 5b 69 5d 29 3b  s\n", azArg[i]);
15850 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
15860 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
15870 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
15880 20 20 20 20 7d 0a 20 20 20 20 65 6c 73 65 7b 0a      }.    else{.
15890 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
158a0 28 73 74 64 65 72 72 2c 20 22 75 6e 6b 6e 6f 77  (stderr, "unknow
158b0 6e 20 6f 70 74 69 6f 6e 3a 20 25 73 5c 6e 22 2c  n option: %s\n",
158c0 20 7a 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20   z);.      rc = 
158d0 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
158e0 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72    }.  }..  if( r
158f0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
15900 20 20 20 20 70 53 74 61 74 65 2d 3e 65 78 70 65      pState->expe
15910 72 74 2e 70 45 78 70 65 72 74 20 3d 20 73 71 6c  rt.pExpert = sql
15920 69 74 65 33 5f 65 78 70 65 72 74 5f 6e 65 77 28  ite3_expert_new(
15930 70 53 74 61 74 65 2d 3e 64 62 2c 20 26 7a 45 72  pState->db, &zEr
15940 72 29 3b 0a 20 20 20 20 69 66 28 20 70 53 74 61  r);.    if( pSta
15950 74 65 2d 3e 65 78 70 65 72 74 2e 70 45 78 70 65  te->expert.pExpe
15960 72 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  rt==0 ){.      r
15970 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  aw_printf(stderr
15980 2c 20 22 73 71 6c 69 74 65 33 5f 65 78 70 65 72  , "sqlite3_exper
15990 74 5f 6e 65 77 3a 20 25 73 5c 6e 22 2c 20 7a 45  t_new: %s\n", zE
159a0 72 72 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  rr);.      rc = 
159b0 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
159c0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
159d0 71 6c 69 74 65 33 5f 65 78 70 65 72 74 5f 63 6f  qlite3_expert_co
159e0 6e 66 69 67 28 0a 20 20 20 20 20 20 20 20 20 20  nfig(.          
159f0 70 53 74 61 74 65 2d 3e 65 78 70 65 72 74 2e 70  pState->expert.p
15a00 45 78 70 65 72 74 2c 20 45 58 50 45 52 54 5f 43  Expert, EXPERT_C
15a10 4f 4e 46 49 47 5f 53 41 4d 50 4c 45 2c 20 69 53  ONFIG_SAMPLE, iS
15a20 61 6d 70 6c 65 0a 20 20 20 20 20 20 29 3b 0a 20  ample.      );. 
15a30 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75     }.  }..  retu
15a40 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20  rn rc;.}.#endif 
15a50 2f 2a 20 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /* ifndef SQLITE
15a60 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
15a70 4c 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 45 78 65  LE */../*.** Exe
15a80 63 75 74 65 20 61 20 73 74 61 74 65 6d 65 6e 74  cute a statement
15a90 20 6f 72 20 73 65 74 20 6f 66 20 73 74 61 74 65   or set of state
15aa0 6d 65 6e 74 73 2e 20 20 50 72 69 6e 74 0a 2a 2a  ments.  Print.**
15ab0 20 61 6e 79 20 72 65 73 75 6c 74 20 72 6f 77 73   any result rows
15ac0 2f 63 6f 6c 75 6d 6e 73 20 64 65 70 65 6e 64 69  /columns dependi
15ad0 6e 67 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e  ng on the curren
15ae0 74 20 6d 6f 64 65 0a 2a 2a 20 73 65 74 20 76 69  t mode.** set vi
15af0 61 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 63  a the supplied c
15b00 61 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54  allback..**.** T
15b10 68 69 73 20 69 73 20 76 65 72 79 20 73 69 6d 69  his is very simi
15b20 6c 61 72 20 74 6f 20 53 51 4c 69 74 65 27 73 20  lar to SQLite's 
15b30 62 75 69 6c 74 2d 69 6e 20 73 71 6c 69 74 65 33  built-in sqlite3
15b40 5f 65 78 65 63 28 29 0a 2a 2a 20 66 75 6e 63 74  _exec().** funct
15b50 69 6f 6e 20 65 78 63 65 70 74 20 69 74 20 74 61  ion except it ta
15b60 6b 65 73 20 61 20 73 6c 69 67 68 74 6c 79 20 64  kes a slightly d
15b70 69 66 66 65 72 65 6e 74 20 63 61 6c 6c 62 61 63  ifferent callbac
15b80 6b 0a 2a 2a 20 61 6e 64 20 63 61 6c 6c 62 61 63  k.** and callbac
15b90 6b 20 64 61 74 61 20 61 72 67 75 6d 65 6e 74 2e  k data argument.
15ba0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
15bb0 68 65 6c 6c 5f 65 78 65 63 28 0a 20 20 53 68 65  hell_exec(.  She
15bc0 6c 6c 53 74 61 74 65 20 2a 70 41 72 67 2c 20 20  llState *pArg,  
15bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15be0 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
15bf0 72 20 74 6f 20 53 68 65 6c 6c 53 74 61 74 65 20  r to ShellState 
15c00 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
15c10 2a 7a 53 71 6c 2c 20 20 20 20 20 20 20 20 20 20  *zSql,          
15c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
15c30 2a 20 53 51 4c 20 74 6f 20 62 65 20 65 76 61 6c  * SQL to be eval
15c40 75 61 74 65 64 20 2a 2f 0a 20 20 63 68 61 72 20  uated */.  char 
15c50 2a 2a 70 7a 45 72 72 4d 73 67 20 20 20 20 20 20  **pzErrMsg      
15c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15c70 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 6d 73       /* Error ms
15c80 67 20 77 72 69 74 74 65 6e 20 68 65 72 65 20 2a  g written here *
15c90 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73  /.){.  sqlite3_s
15ca0 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 4e 55 4c  tmt *pStmt = NUL
15cb0 4c 3b 20 20 20 20 20 2f 2a 20 53 74 61 74 65 6d  L;     /* Statem
15cc0 65 6e 74 20 74 6f 20 65 78 65 63 75 74 65 2e 20  ent to execute. 
15cd0 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  */.  int rc = SQ
15ce0 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
15cf0 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 43       /* Return C
15d00 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 32  ode */.  int rc2
15d10 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
15d20 7a 4c 65 66 74 6f 76 65 72 3b 20 20 20 20 20 20  zLeftover;      
15d30 20 20 20 20 2f 2a 20 54 61 69 6c 20 6f 66 20 75      /* Tail of u
15d40 6e 70 72 6f 63 65 73 73 65 64 20 53 51 4c 20 2a  nprocessed SQL *
15d50 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  /.  sqlite3 *db 
15d60 3d 20 70 41 72 67 2d 3e 64 62 3b 0a 0a 20 20 69  = pArg->db;..  i
15d70 66 28 20 70 7a 45 72 72 4d 73 67 20 29 7b 0a 20  f( pzErrMsg ){. 
15d80 20 20 20 2a 70 7a 45 72 72 4d 73 67 20 3d 20 4e     *pzErrMsg = N
15d90 55 4c 4c 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65  ULL;.  }..#ifnde
15da0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
15db0 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 69 66 28  RTUALTABLE.  if(
15dc0 20 70 41 72 67 2d 3e 65 78 70 65 72 74 2e 70 45   pArg->expert.pE
15dd0 78 70 65 72 74 20 29 7b 0a 20 20 20 20 72 63 20  xpert ){.    rc 
15de0 3d 20 65 78 70 65 72 74 48 61 6e 64 6c 65 53 51  = expertHandleSQ
15df0 4c 28 70 41 72 67 2c 20 7a 53 71 6c 2c 20 70 7a  L(pArg, zSql, pz
15e00 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 72 65 74  ErrMsg);.    ret
15e10 75 72 6e 20 65 78 70 65 72 74 46 69 6e 69 73 68  urn expertFinish
15e20 28 70 41 72 67 2c 20 28 72 63 21 3d 53 51 4c 49  (pArg, (rc!=SQLI
15e30 54 45 5f 4f 4b 29 2c 20 70 7a 45 72 72 4d 73 67  TE_OK), pzErrMsg
15e40 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  );.  }.#endif.. 
15e50 20 77 68 69 6c 65 28 20 7a 53 71 6c 5b 30 5d 20   while( zSql[0] 
15e60 26 26 20 28 53 51 4c 49 54 45 5f 4f 4b 20 3d 3d  && (SQLITE_OK ==
15e70 20 72 63 29 20 29 7b 0a 20 20 20 20 73 74 61 74   rc) ){.    stat
15e80 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  ic const char *z
15e90 53 74 6d 74 53 71 6c 3b 0a 20 20 20 20 72 63 20  StmtSql;.    rc 
15ea0 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72  = sqlite3_prepar
15eb0 65 5f 76 32 28 64 62 2c 20 7a 53 71 6c 2c 20 2d  e_v2(db, zSql, -
15ec0 31 2c 20 26 70 53 74 6d 74 2c 20 26 7a 4c 65 66  1, &pStmt, &zLef
15ed0 74 6f 76 65 72 29 3b 0a 20 20 20 20 69 66 28 20  tover);.    if( 
15ee0 53 51 4c 49 54 45 5f 4f 4b 20 21 3d 20 72 63 20  SQLITE_OK != rc 
15ef0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 7a 45  ){.      if( pzE
15f00 72 72 4d 73 67 20 29 7b 0a 20 20 20 20 20 20 20  rrMsg ){.       
15f10 20 2a 70 7a 45 72 72 4d 73 67 20 3d 20 73 61 76   *pzErrMsg = sav
15f20 65 5f 65 72 72 5f 6d 73 67 28 64 62 29 3b 0a 20  e_err_msg(db);. 
15f30 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
15f40 7b 0a 20 20 20 20 20 20 69 66 28 20 21 70 53 74  {.      if( !pSt
15f50 6d 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  mt ){.        /*
15f60 20 74 68 69 73 20 68 61 70 70 65 6e 73 20 66 6f   this happens fo
15f70 72 20 61 20 63 6f 6d 6d 65 6e 74 20 6f 72 20 77  r a comment or w
15f80 68 69 74 65 2d 73 70 61 63 65 20 2a 2f 0a 20 20  hite-space */.  
15f90 20 20 20 20 20 20 7a 53 71 6c 20 3d 20 7a 4c 65        zSql = zLe
15fa0 66 74 6f 76 65 72 3b 0a 20 20 20 20 20 20 20 20  ftover;.        
15fb0 77 68 69 6c 65 28 20 49 73 53 70 61 63 65 28 7a  while( IsSpace(z
15fc0 53 71 6c 5b 30 5d 29 20 29 20 7a 53 71 6c 2b 2b  Sql[0]) ) zSql++
15fd0 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e  ;.        contin
15fe0 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ue;.      }.    
15ff0 20 20 7a 53 74 6d 74 53 71 6c 20 3d 20 73 71 6c    zStmtSql = sql
16000 69 74 65 33 5f 73 71 6c 28 70 53 74 6d 74 29 3b  ite3_sql(pStmt);
16010 0a 20 20 20 20 20 20 69 66 28 20 7a 53 74 6d 74  .      if( zStmt
16020 53 71 6c 3d 3d 30 20 29 20 7a 53 74 6d 74 53 71  Sql==0 ) zStmtSq
16030 6c 20 3d 20 22 22 3b 0a 20 20 20 20 20 20 77 68  l = "";.      wh
16040 69 6c 65 28 20 49 73 53 70 61 63 65 28 7a 53 74  ile( IsSpace(zSt
16050 6d 74 53 71 6c 5b 30 5d 29 20 29 20 7a 53 74 6d  mtSql[0]) ) zStm
16060 74 53 71 6c 2b 2b 3b 0a 0a 20 20 20 20 20 20 2f  tSql++;..      /
16070 2a 20 73 61 76 65 20 6f 66 66 20 74 68 65 20 70  * save off the p
16080 72 65 70 61 72 65 64 20 73 74 61 74 6d 65 6e 74  repared statment
16090 20 68 61 6e 64 6c 65 20 61 6e 64 20 72 65 73 65   handle and rese
160a0 74 20 72 6f 77 20 63 6f 75 6e 74 20 2a 2f 0a 20  t row count */. 
160b0 20 20 20 20 20 69 66 28 20 70 41 72 67 20 29 7b       if( pArg ){
160c0 0a 20 20 20 20 20 20 20 20 70 41 72 67 2d 3e 70  .        pArg->p
160d0 53 74 6d 74 20 3d 20 70 53 74 6d 74 3b 0a 20 20  Stmt = pStmt;.  
160e0 20 20 20 20 20 20 70 41 72 67 2d 3e 63 6e 74 20        pArg->cnt 
160f0 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  = 0;.      }..  
16100 20 20 20 20 2f 2a 20 65 63 68 6f 20 74 68 65 20      /* echo the 
16110 73 71 6c 20 73 74 61 74 65 6d 65 6e 74 20 69 66  sql statement if
16120 20 65 63 68 6f 20 6f 6e 20 2a 2f 0a 20 20 20 20   echo on */.    
16130 20 20 69 66 28 20 70 41 72 67 20 26 26 20 53 68    if( pArg && Sh
16140 65 6c 6c 48 61 73 46 6c 61 67 28 70 41 72 67 2c  ellHasFlag(pArg,
16150 20 53 48 46 4c 47 5f 45 63 68 6f 29 20 29 7b 0a   SHFLG_Echo) ){.
16160 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69          utf8_pri
16170 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22  ntf(pArg->out, "
16180 25 73 5c 6e 22 2c 20 7a 53 74 6d 74 53 71 6c 20  %s\n", zStmtSql 
16190 3f 20 7a 53 74 6d 74 53 71 6c 20 3a 20 7a 53 71  ? zStmtSql : zSq
161a0 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  l);.      }..   
161b0 20 20 20 2f 2a 20 53 68 6f 77 20 74 68 65 20 45     /* Show the E
161c0 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41  XPLAIN QUERY PLA
161d0 4e 20 69 66 20 2e 65 71 70 20 69 73 20 6f 6e 20  N if .eqp is on 
161e0 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 41 72  */.      if( pAr
161f0 67 20 26 26 20 70 41 72 67 2d 3e 61 75 74 6f 45  g && pArg->autoE
16200 51 50 20 26 26 20 73 71 6c 69 74 65 33 5f 73 74  QP && sqlite3_st
16210 72 6c 69 6b 65 28 22 45 58 50 4c 41 49 4e 25 22  rlike("EXPLAIN%"
16220 2c 7a 53 74 6d 74 53 71 6c 2c 30 29 21 3d 30 20  ,zStmtSql,0)!=0 
16230 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
16240 65 33 5f 73 74 6d 74 20 2a 70 45 78 70 6c 61 69  e3_stmt *pExplai
16250 6e 3b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  n;.        char 
16260 2a 7a 45 51 50 3b 0a 20 20 20 20 20 20 20 20 69  *zEQP;.        i
16270 6e 74 20 74 72 69 67 67 65 72 45 51 50 20 3d 20  nt triggerEQP = 
16280 30 3b 0a 20 20 20 20 20 20 20 20 64 69 73 61 62  0;.        disab
16290 6c 65 5f 64 65 62 75 67 5f 74 72 61 63 65 5f 6d  le_debug_trace_m
162a0 6f 64 65 73 28 29 3b 0a 20 20 20 20 20 20 20 20  odes();.        
162b0 73 71 6c 69 74 65 33 5f 64 62 5f 63 6f 6e 66 69  sqlite3_db_confi
162c0 67 28 64 62 2c 20 53 51 4c 49 54 45 5f 44 42 43  g(db, SQLITE_DBC
162d0 4f 4e 46 49 47 5f 54 52 49 47 47 45 52 5f 45 51  ONFIG_TRIGGER_EQ
162e0 50 2c 20 2d 31 2c 20 26 74 72 69 67 67 65 72 45  P, -1, &triggerE
162f0 51 50 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  QP);.        if(
16300 20 70 41 72 67 2d 3e 61 75 74 6f 45 51 50 3e 3d   pArg->autoEQP>=
16310 41 55 54 4f 45 51 50 5f 74 72 69 67 67 65 72 20  AUTOEQP_trigger 
16320 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
16330 69 74 65 33 5f 64 62 5f 63 6f 6e 66 69 67 28 64  ite3_db_config(d
16340 62 2c 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46  b, SQLITE_DBCONF
16350 49 47 5f 54 52 49 47 47 45 52 5f 45 51 50 2c 20  IG_TRIGGER_EQP, 
16360 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d  1, 0);.        }
16370 0a 20 20 20 20 20 20 20 20 7a 45 51 50 20 3d 20  .        zEQP = 
16380 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
16390 22 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50  "EXPLAIN QUERY P
163a0 4c 41 4e 20 25 73 22 2c 20 7a 53 74 6d 74 53 71  LAN %s", zStmtSq
163b0 6c 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  l);.        rc =
163c0 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
163d0 5f 76 32 28 64 62 2c 20 7a 45 51 50 2c 20 2d 31  _v2(db, zEQP, -1
163e0 2c 20 26 70 45 78 70 6c 61 69 6e 2c 20 30 29 3b  , &pExplain, 0);
163f0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
16400 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
16410 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 73          while( s
16420 71 6c 69 74 65 33 5f 73 74 65 70 28 70 45 78 70  qlite3_step(pExp
16430 6c 61 69 6e 29 3d 3d 53 51 4c 49 54 45 5f 52 4f  lain)==SQLITE_RO
16440 57 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  W ){.           
16450 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 51   const char *zEQ
16460 50 4c 69 6e 65 20 3d 20 28 63 6f 6e 73 74 20 63  PLine = (const c
16470 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c  har*)sqlite3_col
16480 75 6d 6e 5f 74 65 78 74 28 70 45 78 70 6c 61 69  umn_text(pExplai
16490 6e 2c 33 29 3b 0a 20 20 20 20 20 20 20 20 20 20  n,3);.          
164a0 20 20 69 6e 74 20 69 53 65 6c 65 63 74 49 64 20    int iSelectId 
164b0 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
164c0 5f 69 6e 74 28 70 45 78 70 6c 61 69 6e 2c 20 30  _int(pExplain, 0
164d0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
164e0 66 28 20 7a 45 51 50 4c 69 6e 65 5b 30 5d 3d 3d  f( zEQPLine[0]==
164f0 27 2d 27 20 29 20 65 71 70 5f 72 65 6e 64 65 72  '-' ) eqp_render
16500 28 70 41 72 67 29 3b 0a 20 20 20 20 20 20 20 20  (pArg);.        
16510 20 20 20 20 65 71 70 5f 61 70 70 65 6e 64 28 70      eqp_append(p
16520 41 72 67 2c 20 69 53 65 6c 65 63 74 49 64 2c 20  Arg, iSelectId, 
16530 7a 45 51 50 4c 69 6e 65 29 3b 0a 20 20 20 20 20  zEQPLine);.     
16540 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
16550 20 65 71 70 5f 72 65 6e 64 65 72 28 70 41 72 67   eqp_render(pArg
16560 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
16570 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e       sqlite3_fin
16580 61 6c 69 7a 65 28 70 45 78 70 6c 61 69 6e 29 3b  alize(pExplain);
16590 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
165a0 5f 66 72 65 65 28 7a 45 51 50 29 3b 0a 20 20 20  _free(zEQP);.   
165b0 20 20 20 20 20 69 66 28 20 70 41 72 67 2d 3e 61       if( pArg->a
165c0 75 74 6f 45 51 50 3e 3d 41 55 54 4f 45 51 50 5f  utoEQP>=AUTOEQP_
165d0 66 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  full ){.        
165e0 20 20 2f 2a 20 41 6c 73 6f 20 64 6f 20 61 6e 20    /* Also do an 
165f0 45 58 50 4c 41 49 4e 20 66 6f 72 20 22 2e 65 71  EXPLAIN for ".eq
16600 70 20 66 75 6c 6c 22 20 6d 6f 64 65 20 2a 2f 0a  p full" mode */.
16610 20 20 20 20 20 20 20 20 20 20 7a 45 51 50 20 3d            zEQP =
16620 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
16630 28 22 45 58 50 4c 41 49 4e 20 25 73 22 2c 20 7a  ("EXPLAIN %s", z
16640 53 74 6d 74 53 71 6c 29 3b 0a 20 20 20 20 20 20  StmtSql);.      
16650 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
16660 5f 70 72 65 70 61 72 65 5f 76 32 28 64 62 2c 20  _prepare_v2(db, 
16670 7a 45 51 50 2c 20 2d 31 2c 20 26 70 45 78 70 6c  zEQP, -1, &pExpl
16680 61 69 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ain, 0);.       
16690 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
166a0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
166b0 20 20 20 20 70 41 72 67 2d 3e 63 4d 6f 64 65 20      pArg->cMode 
166c0 3d 20 4d 4f 44 45 5f 45 78 70 6c 61 69 6e 3b 0a  = MODE_Explain;.
166d0 20 20 20 20 20 20 20 20 20 20 20 20 65 78 70 6c              expl
166e0 61 69 6e 5f 64 61 74 61 5f 70 72 65 70 61 72 65  ain_data_prepare
166f0 28 70 41 72 67 2c 20 70 45 78 70 6c 61 69 6e 29  (pArg, pExplain)
16700 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 65 78  ;.            ex
16710 65 63 5f 70 72 65 70 61 72 65 64 5f 73 74 6d 74  ec_prepared_stmt
16720 28 70 41 72 67 2c 20 70 45 78 70 6c 61 69 6e 29  (pArg, pExplain)
16730 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 65 78  ;.            ex
16740 70 6c 61 69 6e 5f 64 61 74 61 5f 64 65 6c 65 74  plain_data_delet
16750 65 28 70 41 72 67 29 3b 0a 20 20 20 20 20 20 20  e(pArg);.       
16760 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73     }.          s
16770 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
16780 70 45 78 70 6c 61 69 6e 29 3b 0a 20 20 20 20 20  pExplain);.     
16790 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
167a0 65 28 7a 45 51 50 29 3b 0a 20 20 20 20 20 20 20  e(zEQP);.       
167b0 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70   }.        if( p
167c0 41 72 67 2d 3e 61 75 74 6f 45 51 50 3e 3d 41 55  Arg->autoEQP>=AU
167d0 54 4f 45 51 50 5f 74 72 69 67 67 65 72 20 26 26  TOEQP_trigger &&
167e0 20 74 72 69 67 67 65 72 45 51 50 3d 3d 30 20 29   triggerEQP==0 )
167f0 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
16800 74 65 33 5f 64 62 5f 63 6f 6e 66 69 67 28 64 62  te3_db_config(db
16810 2c 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49  , SQLITE_DBCONFI
16820 47 5f 54 52 49 47 47 45 52 5f 45 51 50 2c 20 30  G_TRIGGER_EQP, 0
16830 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
16840 2f 2a 20 52 65 70 72 65 70 61 72 65 20 70 53 74  /* Reprepare pSt
16850 6d 74 20 62 65 66 6f 72 65 20 72 65 61 63 74 69  mt before reacti
16860 76 69 6e 67 20 74 72 61 63 65 20 6d 6f 64 65 73  ving trace modes
16870 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 73 71   */.          sq
16880 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
16890 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 20 20 20  Stmt);.         
168a0 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
168b0 5f 76 32 28 64 62 2c 20 7a 53 71 6c 2c 20 2d 31  _v2(db, zSql, -1
168c0 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20  , &pStmt, 0);.  
168d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
168e0 72 65 73 74 6f 72 65 5f 64 65 62 75 67 5f 74 72  restore_debug_tr
168f0 61 63 65 5f 6d 6f 64 65 73 28 29 3b 0a 20 20 20  ace_modes();.   
16900 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20     }..      if( 
16910 70 41 72 67 20 29 7b 0a 20 20 20 20 20 20 20 20  pArg ){.        
16920 70 41 72 67 2d 3e 63 4d 6f 64 65 20 3d 20 70 41  pArg->cMode = pA
16930 72 67 2d 3e 6d 6f 64 65 3b 0a 20 20 20 20 20 20  rg->mode;.      
16940 20 20 69 66 28 20 70 41 72 67 2d 3e 61 75 74 6f    if( pArg->auto
16950 45 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20 20  Explain ){.     
16960 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
16970 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 70 53  _column_count(pS
16980 74 6d 74 29 3d 3d 38 0a 20 20 20 20 20 20 20 20  tmt)==8.        
16990 20 20 20 26 26 20 73 71 6c 69 74 65 33 5f 73 74     && sqlite3_st
169a0 72 6c 69 6b 65 28 22 45 58 50 4c 41 49 4e 25 22  rlike("EXPLAIN%"
169b0 2c 20 7a 53 74 6d 74 53 71 6c 2c 30 29 3d 3d 30  , zStmtSql,0)==0
169c0 0a 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20  .          ){.  
169d0 20 20 20 20 20 20 20 20 20 20 70 41 72 67 2d 3e            pArg->
169e0 63 4d 6f 64 65 20 3d 20 4d 4f 44 45 5f 45 78 70  cMode = MODE_Exp
169f0 6c 61 69 6e 3b 0a 20 20 20 20 20 20 20 20 20 20  lain;.          
16a00 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  }.          if( 
16a10 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63  sqlite3_column_c
16a20 6f 75 6e 74 28 70 53 74 6d 74 29 3d 3d 34 0a 20  ount(pStmt)==4. 
16a30 20 20 20 20 20 20 20 20 20 20 26 26 20 73 71 6c            && sql
16a40 69 74 65 33 5f 73 74 72 6c 69 6b 65 28 22 45 58  ite3_strlike("EX
16a50 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e  PLAIN QUERY PLAN
16a60 25 22 2c 20 7a 53 74 6d 74 53 71 6c 2c 30 29 3d  %", zStmtSql,0)=
16a70 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
16a80 20 20 70 41 72 67 2d 3e 63 4d 6f 64 65 20 3d 20    pArg->cMode = 
16a90 4d 4f 44 45 5f 45 51 50 3b 0a 20 20 20 20 20 20  MODE_EQP;.      
16aa0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
16ab0 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74  .        /* If t
16ac0 68 65 20 73 68 65 6c 6c 20 69 73 20 63 75 72 72  he shell is curr
16ad0 65 6e 74 6c 79 20 69 6e 20 22 2e 65 78 70 6c 61  ently in ".expla
16ae0 69 6e 22 20 6d 6f 64 65 2c 20 67 61 74 68 65 72  in" mode, gather
16af0 20 74 68 65 20 65 78 74 72 61 0a 20 20 20 20 20   the extra.     
16b00 20 20 20 2a 2a 20 64 61 74 61 20 72 65 71 75 69     ** data requi
16b10 72 65 64 20 74 6f 20 61 64 64 20 69 6e 64 65 6e  red to add inden
16b20 74 73 20 74 6f 20 74 68 65 20 6f 75 74 70 75 74  ts to the output
16b30 2e 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20  .*/.        if( 
16b40 70 41 72 67 2d 3e 63 4d 6f 64 65 3d 3d 4d 4f 44  pArg->cMode==MOD
16b50 45 5f 45 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20  E_Explain ){.   
16b60 20 20 20 20 20 20 20 65 78 70 6c 61 69 6e 5f 64         explain_d
16b70 61 74 61 5f 70 72 65 70 61 72 65 28 70 41 72 67  ata_prepare(pArg
16b80 2c 20 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20  , pStmt);.      
16b90 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20    }.      }..   
16ba0 20 20 20 65 78 65 63 5f 70 72 65 70 61 72 65 64     exec_prepared
16bb0 5f 73 74 6d 74 28 70 41 72 67 2c 20 70 53 74 6d  _stmt(pArg, pStm
16bc0 74 29 3b 0a 20 20 20 20 20 20 65 78 70 6c 61 69  t);.      explai
16bd0 6e 5f 64 61 74 61 5f 64 65 6c 65 74 65 28 70 41  n_data_delete(pA
16be0 72 67 29 3b 0a 20 20 20 20 20 20 65 71 70 5f 72  rg);.      eqp_r
16bf0 65 6e 64 65 72 28 70 41 72 67 29 3b 0a 0a 20 20  ender(pArg);..  
16c00 20 20 20 20 2f 2a 20 70 72 69 6e 74 20 75 73 61      /* print usa
16c10 67 65 20 73 74 61 74 73 20 69 66 20 73 74 61 74  ge stats if stat
16c20 73 20 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 69 66  s on */.      if
16c30 28 20 70 41 72 67 20 26 26 20 70 41 72 67 2d 3e  ( pArg && pArg->
16c40 73 74 61 74 73 4f 6e 20 29 7b 0a 20 20 20 20 20  statsOn ){.     
16c50 20 20 20 64 69 73 70 6c 61 79 5f 73 74 61 74 73     display_stats
16c60 28 64 62 2c 20 70 41 72 67 2c 20 30 29 3b 0a 20  (db, pArg, 0);. 
16c70 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
16c80 20 70 72 69 6e 74 20 6c 6f 6f 70 2d 63 6f 75 6e   print loop-coun
16c90 74 65 72 73 20 69 66 20 72 65 71 75 69 72 65 64  ters if required
16ca0 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 41   */.      if( pA
16cb0 72 67 20 26 26 20 70 41 72 67 2d 3e 73 63 61 6e  rg && pArg->scan
16cc0 73 74 61 74 73 4f 6e 20 29 7b 0a 20 20 20 20 20  statsOn ){.     
16cd0 20 20 20 64 69 73 70 6c 61 79 5f 73 63 61 6e 73     display_scans
16ce0 74 61 74 73 28 64 62 2c 20 70 41 72 67 29 3b 0a  tats(db, pArg);.
16cf0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
16d00 2a 20 46 69 6e 61 6c 69 7a 65 20 74 68 65 20 73  * Finalize the s
16d10 74 61 74 65 6d 65 6e 74 20 6a 75 73 74 20 65 78  tatement just ex
16d20 65 63 75 74 65 64 2e 20 49 66 20 74 68 69 73 20  ecuted. If this 
16d30 66 61 69 6c 73 2c 20 73 61 76 65 20 61 0a 20 20  fails, save a.  
16d40 20 20 20 20 2a 2a 20 63 6f 70 79 20 6f 66 20 74      ** copy of t
16d50 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  he error message
16d60 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 73 65 74  . Otherwise, set
16d70 20 7a 53 71 6c 20 74 6f 20 70 6f 69 6e 74 20 74   zSql to point t
16d80 6f 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 6e  o the.      ** n
16d90 65 78 74 20 73 74 61 74 65 6d 65 6e 74 20 74 6f  ext statement to
16da0 20 65 78 65 63 75 74 65 2e 20 2a 2f 0a 20 20 20   execute. */.   
16db0 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33     rc2 = sqlite3
16dc0 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29  _finalize(pStmt)
16dd0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
16de0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 20 72  SQLITE_NOMEM ) r
16df0 63 20 3d 20 72 63 32 3b 0a 20 20 20 20 20 20 69  c = rc2;.      i
16e00 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
16e10 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 53 71 6c   ){.        zSql
16e20 20 3d 20 7a 4c 65 66 74 6f 76 65 72 3b 0a 20 20   = zLeftover;.  
16e30 20 20 20 20 20 20 77 68 69 6c 65 28 20 49 73 53        while( IsS
16e40 70 61 63 65 28 7a 53 71 6c 5b 30 5d 29 20 29 20  pace(zSql[0]) ) 
16e50 7a 53 71 6c 2b 2b 3b 0a 20 20 20 20 20 20 7d 65  zSql++;.      }e
16e60 6c 73 65 20 69 66 28 20 70 7a 45 72 72 4d 73 67  lse if( pzErrMsg
16e70 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 7a 45   ){.        *pzE
16e80 72 72 4d 73 67 20 3d 20 73 61 76 65 5f 65 72 72  rrMsg = save_err
16e90 5f 6d 73 67 28 64 62 29 3b 0a 20 20 20 20 20 20  _msg(db);.      
16ea0 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 63 6c 65 61  }..      /* clea
16eb0 72 20 73 61 76 65 64 20 73 74 6d 74 20 68 61 6e  r saved stmt han
16ec0 64 6c 65 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  dle */.      if(
16ed0 20 70 41 72 67 20 29 7b 0a 20 20 20 20 20 20 20   pArg ){.       
16ee0 20 70 41 72 67 2d 3e 70 53 74 6d 74 20 3d 20 4e   pArg->pStmt = N
16ef0 55 4c 4c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ULL;.      }.   
16f00 20 7d 0a 20 20 7d 20 2f 2a 20 65 6e 64 20 77 68   }.  } /* end wh
16f10 69 6c 65 20 2a 2f 0a 0a 20 20 72 65 74 75 72 6e  ile */..  return
16f20 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
16f30 6c 65 61 73 65 20 6d 65 6d 6f 72 79 20 70 72 65  lease memory pre
16f40 76 69 6f 75 73 6c 79 20 61 6c 6c 6f 63 61 74 65  viously allocate
16f50 64 20 62 79 20 74 61 62 6c 65 43 6f 6c 75 6d 6e  d by tableColumn
16f60 4c 69 73 74 28 29 2e 0a 2a 2f 0a 73 74 61 74 69  List()..*/.stati
16f70 63 20 76 6f 69 64 20 66 72 65 65 43 6f 6c 75 6d  c void freeColum
16f80 6e 4c 69 73 74 28 63 68 61 72 20 2a 2a 61 7a 43  nList(char **azC
16f90 6f 6c 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  ol){.  int i;.  
16fa0 66 6f 72 28 69 3d 31 3b 20 61 7a 43 6f 6c 5b 69  for(i=1; azCol[i
16fb0 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  ]; i++){.    sql
16fc0 69 74 65 33 5f 66 72 65 65 28 61 7a 43 6f 6c 5b  ite3_free(azCol[
16fd0 69 5d 29 3b 0a 20 20 7d 0a 20 20 2f 2a 20 61 7a  i]);.  }.  /* az
16fe0 43 6f 6c 5b 30 5d 20 69 73 20 61 20 73 74 61 74  Col[0] is a stat
16ff0 69 63 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20 73  ic string */.  s
17000 71 6c 69 74 65 33 5f 66 72 65 65 28 61 7a 43 6f  qlite3_free(azCo
17010 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  l);.}../*.** Ret
17020 75 72 6e 20 61 20 6c 69 73 74 20 6f 66 20 70 6f  urn a list of po
17030 69 6e 74 65 72 73 20 74 6f 20 73 74 72 69 6e 67  inters to string
17040 73 20 77 68 69 63 68 20 61 72 65 20 74 68 65 20  s which are the 
17050 6e 61 6d 65 73 20 6f 66 20 61 6c 6c 0a 2a 2a 20  names of all.** 
17060 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 61 62 6c 65  columns in table
17070 20 7a 54 61 62 2e 20 20 20 54 68 65 20 6d 65 6d   zTab.   The mem
17080 6f 72 79 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  ory to hold the 
17090 6e 61 6d 65 73 20 69 73 20 64 79 6e 61 6d 69 63  names is dynamic
170a0 61 6c 6c 79 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65  ally.** allocate
170b0 64 20 61 6e 64 20 6d 75 73 74 20 62 65 20 72 65  d and must be re
170c0 6c 65 61 73 65 64 20 62 79 20 74 68 65 20 63 61  leased by the ca
170d0 6c 6c 65 72 20 75 73 69 6e 67 20 61 20 73 75 62  ller using a sub
170e0 73 65 71 75 65 6e 74 20 63 61 6c 6c 0a 2a 2a 20  sequent call.** 
170f0 74 6f 20 66 72 65 65 43 6f 6c 75 6d 6e 4c 69 73  to freeColumnLis
17100 74 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61  t()..**.** The a
17110 7a 43 6f 6c 5b 30 5d 20 65 6e 74 72 79 20 69 73  zCol[0] entry is
17120 20 75 73 75 61 6c 6c 79 20 4e 55 4c 4c 2e 20 20   usually NULL.  
17130 48 6f 77 65 76 65 72 2c 20 69 66 20 7a 54 61 62  However, if zTab
17140 20 63 6f 6e 74 61 69 6e 73 20 61 20 72 6f 77 69   contains a rowi
17150 64 0a 2a 2a 20 76 61 6c 75 65 20 74 68 61 74 20  d.** value that 
17160 6e 65 65 64 73 20 74 6f 20 62 65 20 70 72 65 73  needs to be pres
17170 65 72 76 65 64 2c 20 74 68 65 6e 20 61 7a 43 6f  erved, then azCo
17180 6c 5b 30 5d 20 69 73 20 66 69 6c 6c 65 64 20 69  l[0] is filled i
17190 6e 20 77 69 74 68 20 74 68 65 0a 2a 2a 20 6e 61  n with the.** na
171a0 6d 65 20 6f 66 20 74 68 65 20 72 6f 77 69 64 20  me of the rowid 
171b0 63 6f 6c 75 6d 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68  column..**.** Th
171c0 65 20 66 69 72 73 74 20 72 65 67 75 6c 61 72 20  e first regular 
171d0 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 74 61  column in the ta
171e0 62 6c 65 20 69 73 20 61 7a 43 6f 6c 5b 31 5d 2e  ble is azCol[1].
171f0 20 20 54 68 65 20 6c 69 73 74 20 69 73 20 74 65    The list is te
17200 72 6d 69 6e 61 74 65 64 0a 2a 2a 20 62 79 20 61  rminated.** by a
17210 6e 20 65 6e 74 72 79 20 77 69 74 68 20 61 7a 43  n entry with azC
17220 6f 6c 5b 69 5d 3d 3d 30 2e 0a 2a 2f 0a 73 74 61  ol[i]==0..*/.sta
17230 74 69 63 20 63 68 61 72 20 2a 2a 74 61 62 6c 65  tic char **table
17240 43 6f 6c 75 6d 6e 4c 69 73 74 28 53 68 65 6c 6c  ColumnList(Shell
17250 53 74 61 74 65 20 2a 70 2c 20 63 6f 6e 73 74 20  State *p, const 
17260 63 68 61 72 20 2a 7a 54 61 62 29 7b 0a 20 20 63  char *zTab){.  c
17270 68 61 72 20 2a 2a 61 7a 43 6f 6c 20 3d 20 30 3b  har **azCol = 0;
17280 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
17290 2a 70 53 74 6d 74 3b 0a 20 20 63 68 61 72 20 2a  *pStmt;.  char *
172a0 7a 53 71 6c 3b 0a 20 20 69 6e 74 20 6e 43 6f 6c  zSql;.  int nCol
172b0 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 41 6c 6c   = 0;.  int nAll
172c0 6f 63 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 50  oc = 0;.  int nP
172d0 4b 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20  K = 0;       /* 
172e0 4e 75 6d 62 65 72 20 6f 66 20 50 52 49 4d 41 52  Number of PRIMAR
172f0 59 20 4b 45 59 20 63 6f 6c 75 6d 6e 73 20 73 65  Y KEY columns se
17300 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 73 49 50  en */.  int isIP
17310 4b 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 54 72  K = 0;     /* Tr
17320 75 65 20 69 66 20 6f 6e 65 20 50 52 49 4d 41 52  ue if one PRIMAR
17330 59 20 4b 45 59 20 63 6f 6c 75 6d 6e 20 6f 66 20  Y KEY column of 
17340 74 79 70 65 20 49 4e 54 45 47 45 52 20 2a 2f 0a  type INTEGER */.
17350 20 20 69 6e 74 20 70 72 65 73 65 72 76 65 52 6f    int preserveRo
17360 77 69 64 20 3d 20 53 68 65 6c 6c 48 61 73 46 6c  wid = ShellHasFl
17370 61 67 28 70 2c 20 53 48 46 4c 47 5f 50 72 65 73  ag(p, SHFLG_Pres
17380 65 72 76 65 52 6f 77 69 64 29 3b 0a 20 20 69 6e  erveRowid);.  in
17390 74 20 72 63 3b 0a 0a 20 20 7a 53 71 6c 20 3d 20  t rc;..  zSql = 
173a0 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
173b0 22 50 52 41 47 4d 41 20 74 61 62 6c 65 5f 69 6e  "PRAGMA table_in
173c0 66 6f 3d 25 51 22 2c 20 7a 54 61 62 29 3b 0a 20  fo=%Q", zTab);. 
173d0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72   rc = sqlite3_pr
173e0 65 70 61 72 65 5f 76 32 28 70 2d 3e 64 62 2c 20  epare_v2(p->db, 
173f0 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74  zSql, -1, &pStmt
17400 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  , 0);.  sqlite3_
17410 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 69 66  free(zSql);.  if
17420 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 30 3b  ( rc ) return 0;
17430 0a 20 20 77 68 69 6c 65 28 20 73 71 6c 69 74 65  .  while( sqlite
17440 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3d 3d 53  3_step(pStmt)==S
17450 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20  QLITE_ROW ){.   
17460 20 69 66 28 20 6e 43 6f 6c 3e 3d 6e 41 6c 6c 6f   if( nCol>=nAllo
17470 63 2d 32 20 29 7b 0a 20 20 20 20 20 20 6e 41 6c  c-2 ){.      nAl
17480 6c 6f 63 20 3d 20 6e 41 6c 6c 6f 63 2a 32 20 2b  loc = nAlloc*2 +
17490 20 6e 43 6f 6c 20 2b 20 31 30 3b 0a 20 20 20 20   nCol + 10;.    
174a0 20 20 61 7a 43 6f 6c 20 3d 20 73 71 6c 69 74 65    azCol = sqlite
174b0 33 5f 72 65 61 6c 6c 6f 63 28 61 7a 43 6f 6c 2c  3_realloc(azCol,
174c0 20 6e 41 6c 6c 6f 63 2a 73 69 7a 65 6f 66 28 61   nAlloc*sizeof(a
174d0 7a 43 6f 6c 5b 30 5d 29 29 3b 0a 20 20 20 20 20  zCol[0]));.     
174e0 20 69 66 28 20 61 7a 43 6f 6c 3d 3d 30 20 29 20   if( azCol==0 ) 
174f0 73 68 65 6c 6c 5f 6f 75 74 5f 6f 66 5f 6d 65 6d  shell_out_of_mem
17500 6f 72 79 28 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ory();.    }.   
17510 20 61 7a 43 6f 6c 5b 2b 2b 6e 43 6f 6c 5d 20 3d   azCol[++nCol] =
17520 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
17530 28 22 25 73 22 2c 20 73 71 6c 69 74 65 33 5f 63  ("%s", sqlite3_c
17540 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74  olumn_text(pStmt
17550 2c 20 31 29 29 3b 0a 20 20 20 20 69 66 28 20 73  , 1));.    if( s
17560 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e  qlite3_column_in
17570 74 28 70 53 74 6d 74 2c 20 35 29 20 29 7b 0a 20  t(pStmt, 5) ){. 
17580 20 20 20 20 20 6e 50 4b 2b 2b 3b 0a 20 20 20 20       nPK++;.    
17590 20 20 69 66 28 20 6e 50 4b 3d 3d 31 0a 20 20 20    if( nPK==1.   
175a0 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 5f 73      && sqlite3_s
175b0 74 72 69 63 6d 70 28 28 63 6f 6e 73 74 20 63 68  tricmp((const ch
175c0 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75  ar*)sqlite3_colu
175d0 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 32 29  mn_text(pStmt,2)
175e0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
175f0 20 20 20 20 20 20 20 20 20 20 20 20 22 49 4e 54              "INT
17600 45 47 45 52 22 29 3d 3d 30 0a 20 20 20 20 20 20  EGER")==0.      
17610 29 7b 0a 20 20 20 20 20 20 20 20 69 73 49 50 4b  ){.        isIPK
17620 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73   = 1;.      }els
17630 65 7b 0a 20 20 20 20 20 20 20 20 69 73 49 50 4b  e{.        isIPK
17640 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
17650 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
17660 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74  3_finalize(pStmt
17670 29 3b 0a 20 20 69 66 28 20 61 7a 43 6f 6c 3d 3d  );.  if( azCol==
17680 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
17690 61 7a 43 6f 6c 5b 30 5d 20 3d 20 30 3b 0a 20 20  azCol[0] = 0;.  
176a0 61 7a 43 6f 6c 5b 6e 43 6f 6c 2b 31 5d 20 3d 20  azCol[nCol+1] = 
176b0 30 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 64 65 63  0;..  /* The dec
176c0 69 73 69 6f 6e 20 6f 66 20 77 68 65 74 68 65 72  ision of whether
176d0 20 6f 72 20 6e 6f 74 20 61 20 72 6f 77 69 64 20   or not a rowid 
176e0 72 65 61 6c 6c 79 20 6e 65 65 64 73 20 74 6f 20  really needs to 
176f0 62 65 20 70 72 65 73 65 72 76 65 64 0a 20 20 2a  be preserved.  *
17700 2a 20 69 73 20 74 72 69 63 6b 79 2e 20 20 57 65  * is tricky.  We
17710 20 6e 65 76 65 72 20 6e 65 65 64 20 74 6f 20 70   never need to p
17720 72 65 73 65 72 76 65 20 61 20 72 6f 77 69 64 20  reserve a rowid 
17730 66 6f 72 20 61 20 57 49 54 48 4f 55 54 20 52 4f  for a WITHOUT RO
17740 57 49 44 20 74 61 62 6c 65 0a 20 20 2a 2a 20 6f  WID table.  ** o
17750 72 20 61 20 74 61 62 6c 65 20 77 69 74 68 20 61  r a table with a
17760 6e 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  n INTEGER PRIMAR
17770 59 20 4b 45 59 2e 20 20 57 65 20 61 72 65 20 75  Y KEY.  We are u
17780 6e 61 62 6c 65 20 74 6f 20 70 72 65 73 65 72 76  nable to preserv
17790 65 0a 20 20 2a 2a 20 72 6f 77 69 64 73 20 6f 6e  e.  ** rowids on
177a0 20 74 61 62 6c 65 73 20 77 68 65 72 65 20 74 68   tables where th
177b0 65 20 72 6f 77 69 64 20 69 73 20 69 6e 61 63 63  e rowid is inacc
177c0 65 73 73 69 62 6c 65 20 62 65 63 61 75 73 65 20  essible because 
177d0 74 68 65 72 65 20 61 72 65 20 6f 74 68 65 72 0a  there are other.
177e0 20 20 2a 2a 20 63 6f 6c 75 6d 6e 73 20 69 6e 20    ** columns in 
177f0 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 64 20  the table named 
17800 22 72 6f 77 69 64 22 2c 20 22 5f 72 6f 77 69 64  "rowid", "_rowid
17810 5f 22 2c 20 61 6e 64 20 22 6f 69 64 22 2e 0a 20  _", and "oid".. 
17820 20 2a 2f 0a 20 20 69 66 28 20 70 72 65 73 65 72   */.  if( preser
17830 76 65 52 6f 77 69 64 20 26 26 20 69 73 49 50 4b  veRowid && isIPK
17840 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 61 20   ){.    /* If a 
17850 73 69 6e 67 6c 65 20 50 52 49 4d 41 52 59 20 4b  single PRIMARY K
17860 45 59 20 63 6f 6c 75 6d 6e 20 77 69 74 68 20 74  EY column with t
17870 79 70 65 20 49 4e 54 45 47 45 52 20 77 61 73 20  ype INTEGER was 
17880 73 65 65 6e 2c 20 74 68 65 6e 20 69 74 0a 20 20  seen, then it.  
17890 20 20 2a 2a 20 6d 69 67 68 74 20 62 65 20 61 6e    ** might be an
178a0 20 61 6c 69 73 65 20 66 6f 72 20 74 68 65 20 52   alise for the R
178b0 4f 57 49 44 2e 20 20 42 75 74 20 69 74 20 6d 69  OWID.  But it mi
178c0 67 68 74 20 61 6c 73 6f 20 62 65 20 61 20 57 49  ght also be a WI
178d0 54 48 4f 55 54 20 52 4f 57 49 44 0a 20 20 20 20  THOUT ROWID.    
178e0 2a 2a 20 74 61 62 6c 65 20 6f 72 20 61 20 49 4e  ** table or a IN
178f0 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
17900 59 20 44 45 53 43 20 63 6f 6c 75 6d 6e 2c 20 6e  Y DESC column, n
17910 65 69 74 68 65 72 20 6f 66 20 77 68 69 63 68 20  either of which 
17920 61 72 65 0a 20 20 20 20 2a 2a 20 52 4f 57 49 44  are.    ** ROWID
17930 20 61 6c 69 61 73 65 73 2e 20 20 54 6f 20 64 69   aliases.  To di
17940 73 74 69 6e 67 75 69 73 68 20 74 68 65 73 65 20  stinguish these 
17950 63 61 73 65 73 2c 20 63 68 65 63 6b 20 74 6f 20  cases, check to 
17960 73 65 65 20 69 66 0a 20 20 20 20 2a 2a 20 74 68  see if.    ** th
17970 65 72 65 20 69 73 20 61 20 22 70 6b 22 20 65 6e  ere is a "pk" en
17980 74 72 79 20 69 6e 20 22 50 52 41 47 4d 41 20 69  try in "PRAGMA i
17990 6e 64 65 78 5f 6c 69 73 74 22 2e 20 20 54 68 65  ndex_list".  The
179a0 72 65 20 77 69 6c 6c 20 62 65 0a 20 20 20 20 2a  re will be.    *
179b0 2a 20 6e 6f 20 22 70 6b 22 20 69 6e 64 65 78 20  * no "pk" index 
179c0 69 66 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b  if the PRIMARY K
179d0 45 59 20 72 65 61 6c 6c 79 20 69 73 20 61 6e 20  EY really is an 
179e0 61 6c 69 61 73 20 66 6f 72 20 74 68 65 20 52 4f  alias for the RO
179f0 57 49 44 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  WID..    */.    
17a00 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d  zSql = sqlite3_m
17a10 70 72 69 6e 74 66 28 22 53 45 4c 45 43 54 20 31  printf("SELECT 1
17a20 20 46 52 4f 4d 20 70 72 61 67 6d 61 5f 69 6e 64   FROM pragma_ind
17a30 65 78 5f 6c 69 73 74 28 25 51 29 22 0a 20 20 20  ex_list(%Q)".   
17a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17a50 20 20 20 20 20 20 20 20 22 20 57 48 45 52 45 20          " WHERE 
17a60 6f 72 69 67 69 6e 3d 27 70 6b 27 22 2c 20 7a 54  origin='pk'", zT
17a70 61 62 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  ab);.    rc = sq
17a80 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32  lite3_prepare_v2
17a90 28 70 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31  (p->db, zSql, -1
17aa0 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20  , &pStmt, 0);.  
17ab0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
17ac0 53 71 6c 29 3b 0a 20 20 20 20 69 66 28 20 72 63  Sql);.    if( rc
17ad0 20 29 7b 0a 20 20 20 20 20 20 66 72 65 65 43 6f   ){.      freeCo
17ae0 6c 75 6d 6e 4c 69 73 74 28 61 7a 43 6f 6c 29 3b  lumnList(azCol);
17af0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
17b00 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
17b10 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74  sqlite3_step(pSt
17b20 6d 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  mt);.    sqlite3
17b30 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29  _finalize(pStmt)
17b40 3b 0a 20 20 20 20 70 72 65 73 65 72 76 65 52 6f  ;.    preserveRo
17b50 77 69 64 20 3d 20 72 63 3d 3d 53 51 4c 49 54 45  wid = rc==SQLITE
17b60 5f 52 4f 57 3b 0a 20 20 7d 0a 20 20 69 66 28 20  _ROW;.  }.  if( 
17b70 70 72 65 73 65 72 76 65 52 6f 77 69 64 20 29 7b  preserveRowid ){
17b80 0a 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 70 72 65  .    /* Only pre
17b90 73 65 72 76 65 20 74 68 65 20 72 6f 77 69 64 20  serve the rowid 
17ba0 69 66 20 77 65 20 63 61 6e 20 66 69 6e 64 20 61  if we can find a
17bb0 20 6e 61 6d 65 20 74 6f 20 75 73 65 20 66 6f 72   name to use for
17bc0 20 74 68 65 0a 20 20 20 20 2a 2a 20 72 6f 77 69   the.    ** rowi
17bd0 64 20 2a 2f 0a 20 20 20 20 73 74 61 74 69 63 20  d */.    static 
17be0 63 68 61 72 20 2a 61 7a 52 6f 77 69 64 5b 5d 20  char *azRowid[] 
17bf0 3d 20 7b 20 22 72 6f 77 69 64 22 2c 20 22 5f 72  = { "rowid", "_r
17c00 6f 77 69 64 5f 22 2c 20 22 6f 69 64 22 20 7d 3b  owid_", "oid" };
17c10 0a 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20  .    int i, j;. 
17c20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 33 3b     for(j=0; j<3;
17c30 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 66 6f 72   j++){.      for
17c40 28 69 3d 31 3b 20 69 3c 3d 6e 43 6f 6c 3b 20 69  (i=1; i<=nCol; i
17c50 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
17c60 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70   sqlite3_stricmp
17c70 28 61 7a 52 6f 77 69 64 5b 6a 5d 2c 61 7a 43 6f  (azRowid[j],azCo
17c80 6c 5b 69 5d 29 3d 3d 30 20 29 20 62 72 65 61 6b  l[i])==0 ) break
17c90 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
17ca0 69 66 28 20 69 3e 6e 43 6f 6c 20 29 7b 0a 20 20  if( i>nCol ){.  
17cb0 20 20 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73        /* At this
17cc0 20 70 6f 69 6e 74 2c 20 77 65 20 6b 6e 6f 77 20   point, we know 
17cd0 74 68 61 74 20 61 7a 52 6f 77 69 64 5b 6a 5d 20  that azRowid[j] 
17ce0 69 73 20 6e 6f 74 20 74 68 65 20 6e 61 6d 65 20  is not the name 
17cf0 6f 66 20 61 6e 79 0a 20 20 20 20 20 20 20 20 2a  of any.        *
17d00 2a 20 6f 72 64 69 6e 61 72 79 20 63 6f 6c 75 6d  * ordinary colum
17d10 6e 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 20  n in the table. 
17d20 20 56 65 72 69 66 79 20 74 68 61 74 20 61 7a 52   Verify that azR
17d30 6f 77 69 64 5b 6a 5d 20 69 73 20 61 20 76 61 6c  owid[j] is a val
17d40 69 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 61  id.        ** na
17d50 6d 65 20 66 6f 72 20 74 68 65 20 72 6f 77 69 64  me for the rowid
17d60 20 62 65 66 6f 72 65 20 61 64 64 69 6e 67 20 69   before adding i
17d70 74 20 74 6f 20 61 7a 43 6f 6c 5b 30 5d 2e 20 20  t to azCol[0].  
17d80 57 49 54 48 4f 55 54 20 52 4f 57 49 44 0a 20 20  WITHOUT ROWID.  
17d90 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 73 20        ** tables 
17da0 77 69 6c 6c 20 66 61 69 6c 20 74 68 69 73 20 6c  will fail this l
17db0 61 73 74 20 63 68 65 63 6b 20 2a 2f 0a 20 20 20  ast check */.   
17dc0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
17dd0 33 5f 74 61 62 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d  3_table_column_m
17de0 65 74 61 64 61 74 61 28 70 2d 3e 64 62 2c 30 2c  etadata(p->db,0,
17df0 7a 54 61 62 2c 61 7a 52 6f 77 69 64 5b 6a 5d 2c  zTab,azRowid[j],
17e00 30 2c 30 2c 30 2c 30 2c 30 29 3b 0a 20 20 20 20  0,0,0,0,0);.    
17e10 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
17e20 54 45 5f 4f 4b 20 29 20 61 7a 43 6f 6c 5b 30 5d  TE_OK ) azCol[0]
17e30 20 3d 20 61 7a 52 6f 77 69 64 5b 6a 5d 3b 0a 20   = azRowid[j];. 
17e40 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
17e50 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
17e60 20 20 72 65 74 75 72 6e 20 61 7a 43 6f 6c 3b 0a    return azCol;.
17e70 7d 0a 0a 2f 2a 0a 2a 2a 20 54 6f 67 67 6c 65 20  }../*.** Toggle 
17e80 74 68 65 20 72 65 76 65 72 73 65 5f 75 6e 6f 72  the reverse_unor
17e90 64 65 72 65 64 5f 73 65 6c 65 63 74 73 20 73 65  dered_selects se
17ea0 74 74 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  tting..*/.static
17eb0 20 76 6f 69 64 20 74 6f 67 67 6c 65 53 65 6c 65   void toggleSele
17ec0 63 74 4f 72 64 65 72 28 73 71 6c 69 74 65 33 20  ctOrder(sqlite3 
17ed0 2a 64 62 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  *db){.  sqlite3_
17ee0 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b  stmt *pStmt = 0;
17ef0 0a 20 20 69 6e 74 20 69 53 65 74 74 69 6e 67 20  .  int iSetting 
17f00 3d 20 30 3b 0a 20 20 63 68 61 72 20 7a 53 74 6d  = 0;.  char zStm
17f10 74 5b 31 30 30 5d 3b 0a 20 20 73 71 6c 69 74 65  t[100];.  sqlite
17f20 33 5f 70 72 65 70 61 72 65 5f 76 32 28 64 62 2c  3_prepare_v2(db,
17f30 20 22 50 52 41 47 4d 41 20 72 65 76 65 72 73 65   "PRAGMA reverse
17f40 5f 75 6e 6f 72 64 65 72 65 64 5f 73 65 6c 65 63  _unordered_selec
17f50 74 73 22 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c  ts", -1, &pStmt,
17f60 20 30 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74   0);.  if( sqlit
17f70 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3d 3d  e3_step(pStmt)==
17f80 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20  SQLITE_ROW ){.  
17f90 20 20 69 53 65 74 74 69 6e 67 20 3d 20 73 71 6c    iSetting = sql
17fa0 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28  ite3_column_int(
17fb0 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 7d 0a 20  pStmt, 0);.  }. 
17fc0 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
17fd0 65 28 70 53 74 6d 74 29 3b 0a 20 20 73 71 6c 69  e(pStmt);.  sqli
17fe0 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
17ff0 65 6f 66 28 7a 53 74 6d 74 29 2c 20 7a 53 74 6d  eof(zStmt), zStm
18000 74 2c 0a 20 20 20 20 20 20 20 22 50 52 41 47 4d  t,.       "PRAGM
18010 41 20 72 65 76 65 72 73 65 5f 75 6e 6f 72 64 65  A reverse_unorde
18020 72 65 64 5f 73 65 6c 65 63 74 73 28 25 64 29 22  red_selects(%d)"
18030 2c 20 21 69 53 65 74 74 69 6e 67 29 3b 0a 20 20  , !iSetting);.  
18040 73 71 6c 69 74 65 33 5f 65 78 65 63 28 64 62 2c  sqlite3_exec(db,
18050 20 7a 53 74 6d 74 2c 20 30 2c 20 30 2c 20 30 29   zStmt, 0, 0, 0)
18060 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
18070 69 73 20 61 20 64 69 66 66 65 72 65 6e 74 20 63  is a different c
18080 61 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65 20  allback routine 
18090 75 73 65 64 20 66 6f 72 20 64 75 6d 70 69 6e 67  used for dumping
180a0 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a   the database..*
180b0 2a 20 45 61 63 68 20 72 6f 77 20 72 65 63 65 69  * Each row recei
180c0 76 65 64 20 62 79 20 74 68 69 73 20 63 61 6c 6c  ved by this call
180d0 62 61 63 6b 20 63 6f 6e 73 69 73 74 73 20 6f 66  back consists of
180e0 20 61 20 74 61 62 6c 65 20 6e 61 6d 65 2c 0a 2a   a table name,.*
180f0 2a 20 74 68 65 20 74 61 62 6c 65 20 74 79 70 65  * the table type
18100 20 28 22 69 6e 64 65 78 22 20 6f 72 20 22 74 61   ("index" or "ta
18110 62 6c 65 22 29 20 61 6e 64 20 53 51 4c 20 74 6f  ble") and SQL to
18120 20 63 72 65 61 74 65 20 74 68 65 20 74 61 62 6c   create the tabl
18130 65 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  e..** This routi
18140 6e 65 20 73 68 6f 75 6c 64 20 70 72 69 6e 74 20  ne should print 
18150 74 65 78 74 20 73 75 66 66 69 63 69 65 6e 74 20  text sufficient 
18160 74 6f 20 72 65 63 72 65 61 74 65 20 74 68 65 20  to recreate the 
18170 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  table..*/.static
18180 20 69 6e 74 20 64 75 6d 70 5f 63 61 6c 6c 62 61   int dump_callba
18190 63 6b 28 76 6f 69 64 20 2a 70 41 72 67 2c 20 69  ck(void *pArg, i
181a0 6e 74 20 6e 41 72 67 2c 20 63 68 61 72 20 2a 2a  nt nArg, char **
181b0 61 7a 41 72 67 2c 20 63 68 61 72 20 2a 2a 61 7a  azArg, char **az
181c0 4e 6f 74 55 73 65 64 29 7b 0a 20 20 69 6e 74 20  NotUsed){.  int 
181d0 72 63 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  rc;.  const char
181e0 20 2a 7a 54 61 62 6c 65 3b 0a 20 20 63 6f 6e 73   *zTable;.  cons
181f0 74 20 63 68 61 72 20 2a 7a 54 79 70 65 3b 0a 20  t char *zType;. 
18200 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71   const char *zSq
18210 6c 3b 0a 20 20 53 68 65 6c 6c 53 74 61 74 65 20  l;.  ShellState 
18220 2a 70 20 3d 20 28 53 68 65 6c 6c 53 74 61 74 65  *p = (ShellState
18230 20 2a 29 70 41 72 67 3b 0a 0a 20 20 55 4e 55 53   *)pArg;..  UNUS
18240 45 44 5f 50 41 52 41 4d 45 54 45 52 28 61 7a 4e  ED_PARAMETER(azN
18250 6f 74 55 73 65 64 29 3b 0a 20 20 69 66 28 20 6e  otUsed);.  if( n
18260 41 72 67 21 3d 33 20 7c 7c 20 61 7a 41 72 67 3d  Arg!=3 || azArg=
18270 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
18280 20 7a 54 61 62 6c 65 20 3d 20 61 7a 41 72 67 5b   zTable = azArg[
18290 30 5d 3b 0a 20 20 7a 54 79 70 65 20 3d 20 61 7a  0];.  zType = az
182a0 41 72 67 5b 31 5d 3b 0a 20 20 7a 53 71 6c 20 3d  Arg[1];.  zSql =
182b0 20 61 7a 41 72 67 5b 32 5d 3b 0a 0a 20 20 69 66   azArg[2];..  if
182c0 28 20 73 74 72 63 6d 70 28 7a 54 61 62 6c 65 2c  ( strcmp(zTable,
182d0 20 22 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63   "sqlite_sequenc
182e0 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 61  e")==0 ){.    ra
182f0 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  w_printf(p->out,
18300 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 73 71   "DELETE FROM sq
18310 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 3b 5c 6e  lite_sequence;\n
18320 22 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  ");.  }else if( 
18330 73 71 6c 69 74 65 33 5f 73 74 72 67 6c 6f 62 28  sqlite3_strglob(
18340 22 73 71 6c 69 74 65 5f 73 74 61 74 3f 22 2c 20  "sqlite_stat?", 
18350 7a 54 61 62 6c 65 29 3d 3d 30 20 29 7b 0a 20 20  zTable)==0 ){.  
18360 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e    raw_printf(p->
18370 6f 75 74 2c 20 22 41 4e 41 4c 59 5a 45 20 73 71  out, "ANALYZE sq
18380 6c 69 74 65 5f 6d 61 73 74 65 72 3b 5c 6e 22 29  lite_master;\n")
18390 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74  ;.  }else if( st
183a0 72 6e 63 6d 70 28 7a 54 61 62 6c 65 2c 20 22 73  rncmp(zTable, "s
183b0 71 6c 69 74 65 5f 22 2c 20 37 29 3d 3d 30 20 29  qlite_", 7)==0 )
183c0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
183d0 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 6e    }else if( strn
183e0 63 6d 70 28 7a 53 71 6c 2c 20 22 43 52 45 41 54  cmp(zSql, "CREAT
183f0 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 22  E VIRTUAL TABLE"
18400 2c 20 32 30 29 3d 3d 30 20 29 7b 0a 20 20 20 20  , 20)==0 ){.    
18410 63 68 61 72 20 2a 7a 49 6e 73 3b 0a 20 20 20 20  char *zIns;.    
18420 69 66 28 20 21 70 2d 3e 77 72 69 74 61 62 6c 65  if( !p->writable
18430 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20 20  Schema ){.      
18440 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  raw_printf(p->ou
18450 74 2c 20 22 50 52 41 47 4d 41 20 77 72 69 74 61  t, "PRAGMA writa
18460 62 6c 65 5f 73 63 68 65 6d 61 3d 4f 4e 3b 5c 6e  ble_schema=ON;\n
18470 22 29 3b 0a 20 20 20 20 20 20 70 2d 3e 77 72 69  ");.      p->wri
18480 74 61 62 6c 65 53 63 68 65 6d 61 20 3d 20 31 3b  tableSchema = 1;
18490 0a 20 20 20 20 7d 0a 20 20 20 20 7a 49 6e 73 20  .    }.    zIns 
184a0 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
184b0 66 28 0a 20 20 20 20 20 20 20 22 49 4e 53 45 52  f(.       "INSER
184c0 54 20 49 4e 54 4f 20 73 71 6c 69 74 65 5f 6d 61  T INTO sqlite_ma
184d0 73 74 65 72 28 74 79 70 65 2c 6e 61 6d 65 2c 74  ster(type,name,t
184e0 62 6c 5f 6e 61 6d 65 2c 72 6f 6f 74 70 61 67 65  bl_name,rootpage
184f0 2c 73 71 6c 29 22 0a 20 20 20 20 20 20 20 22 56  ,sql)".       "V
18500 41 4c 55 45 53 28 27 74 61 62 6c 65 27 2c 27 25  ALUES('table','%
18510 71 27 2c 27 25 71 27 2c 30 2c 27 25 71 27 29 3b  q','%q',0,'%q');
18520 22 2c 0a 20 20 20 20 20 20 20 7a 54 61 62 6c 65  ",.       zTable
18530 2c 20 7a 54 61 62 6c 65 2c 20 7a 53 71 6c 29 3b  , zTable, zSql);
18540 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66  .    utf8_printf
18550 28 70 2d 3e 6f 75 74 2c 20 22 25 73 5c 6e 22 2c  (p->out, "%s\n",
18560 20 7a 49 6e 73 29 3b 0a 20 20 20 20 73 71 6c 69   zIns);.    sqli
18570 74 65 33 5f 66 72 65 65 28 7a 49 6e 73 29 3b 0a  te3_free(zIns);.
18580 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
18590 7d 65 6c 73 65 7b 0a 20 20 20 20 70 72 69 6e 74  }else{.    print
185a0 53 63 68 65 6d 61 4c 69 6e 65 28 70 2d 3e 6f 75  SchemaLine(p->ou
185b0 74 2c 20 7a 53 71 6c 2c 20 22 3b 5c 6e 22 29 3b  t, zSql, ";\n");
185c0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 73 74 72 63  .  }..  if( strc
185d0 6d 70 28 7a 54 79 70 65 2c 20 22 74 61 62 6c 65  mp(zType, "table
185e0 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 53 68 65  ")==0 ){.    She
185f0 6c 6c 54 65 78 74 20 73 53 65 6c 65 63 74 3b 0a  llText sSelect;.
18600 20 20 20 20 53 68 65 6c 6c 54 65 78 74 20 73 54      ShellText sT
18610 61 62 6c 65 3b 0a 20 20 20 20 63 68 61 72 20 2a  able;.    char *
18620 2a 61 7a 43 6f 6c 3b 0a 20 20 20 20 69 6e 74 20  *azCol;.    int 
18630 69 3b 0a 20 20 20 20 63 68 61 72 20 2a 73 61 76  i;.    char *sav
18640 65 64 44 65 73 74 54 61 62 6c 65 3b 0a 20 20 20  edDestTable;.   
18650 20 69 6e 74 20 73 61 76 65 64 4d 6f 64 65 3b 0a   int savedMode;.
18660 0a 20 20 20 20 61 7a 43 6f 6c 20 3d 20 74 61 62  .    azCol = tab
18670 6c 65 43 6f 6c 75 6d 6e 4c 69 73 74 28 70 2c 20  leColumnList(p, 
18680 7a 54 61 62 6c 65 29 3b 0a 20 20 20 20 69 66 28  zTable);.    if(
18690 20 61 7a 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20   azCol==0 ){.   
186a0 20 20 20 70 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20     p->nErr++;.  
186b0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
186c0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 6c 77 61    }..    /* Alwa
186d0 79 73 20 71 75 6f 74 65 20 74 68 65 20 74 61 62  ys quote the tab
186e0 6c 65 20 6e 61 6d 65 2c 20 65 76 65 6e 20 69 66  le name, even if
186f0 20 69 74 20 61 70 70 65 61 72 73 20 74 6f 20 62   it appears to b
18700 65 20 70 75 72 65 20 61 73 63 69 69 2c 0a 20 20  e pure ascii,.  
18710 20 20 2a 2a 20 69 6e 20 63 61 73 65 20 69 74 20    ** in case it 
18720 69 73 20 61 20 6b 65 79 77 6f 72 64 2e 20 45 78  is a keyword. Ex
18730 3a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 22  :  INSERT INTO "
18740 74 61 62 6c 65 22 20 2e 2e 2e 20 2a 2f 0a 20 20  table" ... */.  
18750 20 20 69 6e 69 74 54 65 78 74 28 26 73 54 61 62    initText(&sTab
18760 6c 65 29 3b 0a 20 20 20 20 61 70 70 65 6e 64 54  le);.    appendT
18770 65 78 74 28 26 73 54 61 62 6c 65 2c 20 7a 54 61  ext(&sTable, zTa
18780 62 6c 65 2c 20 71 75 6f 74 65 43 68 61 72 28 7a  ble, quoteChar(z
18790 54 61 62 6c 65 29 29 3b 0a 20 20 20 20 2f 2a 20  Table));.    /* 
187a0 49 66 20 70 72 65 73 65 72 76 69 6e 67 20 74 68  If preserving th
187b0 65 20 72 6f 77 69 64 2c 20 61 64 64 20 61 20 63  e rowid, add a c
187c0 6f 6c 75 6d 6e 20 6c 69 73 74 20 61 66 74 65 72  olumn list after
187d0 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 2e   the table name.
187e0 0a 20 20 20 20 2a 2a 20 49 6e 20 6f 74 68 65 72  .    ** In other
187f0 20 77 6f 72 64 73 3a 20 20 22 49 4e 53 45 52 54   words:  "INSERT
18800 20 49 4e 54 4f 20 74 61 62 28 72 6f 77 69 64 2c   INTO tab(rowid,
18810 61 2c 62 2c 63 2c 2e 2e 2e 29 20 56 41 4c 55 45  a,b,c,...) VALUE
18820 53 28 2e 2e 2e 29 22 0a 20 20 20 20 2a 2a 20 69  S(...)".    ** i
18830 6e 73 74 65 61 64 20 6f 66 20 74 68 65 20 75 73  nstead of the us
18840 75 61 6c 20 22 49 4e 53 45 52 54 20 49 4e 54 4f  ual "INSERT INTO
18850 20 74 61 62 20 56 41 4c 55 45 53 28 2e 2e 2e 29   tab VALUES(...)
18860 22 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  "..    */.    if
18870 28 20 61 7a 43 6f 6c 5b 30 5d 20 29 7b 0a 20 20  ( azCol[0] ){.  
18880 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26      appendText(&
18890 73 54 61 62 6c 65 2c 20 22 28 22 2c 20 30 29 3b  sTable, "(", 0);
188a0 0a 20 20 20 20 20 20 61 70 70 65 6e 64 54 65 78  .      appendTex
188b0 74 28 26 73 54 61 62 6c 65 2c 20 61 7a 43 6f 6c  t(&sTable, azCol
188c0 5b 30 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 66  [0], 0);.      f
188d0 6f 72 28 69 3d 31 3b 20 61 7a 43 6f 6c 5b 69 5d  or(i=1; azCol[i]
188e0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
188f0 61 70 70 65 6e 64 54 65 78 74 28 26 73 54 61 62  appendText(&sTab
18900 6c 65 2c 20 22 2c 22 2c 20 30 29 3b 0a 20 20 20  le, ",", 0);.   
18910 20 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28       appendText(
18920 26 73 54 61 62 6c 65 2c 20 61 7a 43 6f 6c 5b 69  &sTable, azCol[i
18930 5d 2c 20 71 75 6f 74 65 43 68 61 72 28 61 7a 43  ], quoteChar(azC
18940 6f 6c 5b 69 5d 29 29 3b 0a 20 20 20 20 20 20 7d  ol[i]));.      }
18950 0a 20 20 20 20 20 20 61 70 70 65 6e 64 54 65 78  .      appendTex
18960 74 28 26 73 54 61 62 6c 65 2c 20 22 29 22 2c 20  t(&sTable, ")", 
18970 30 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  0);.    }..    /
18980 2a 20 42 75 69 6c 64 20 61 6e 20 61 70 70 72 6f  * Build an appro
18990 70 72 69 61 74 65 20 53 45 4c 45 43 54 20 73 74  priate SELECT st
189a0 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 69  atement */.    i
189b0 6e 69 74 54 65 78 74 28 26 73 53 65 6c 65 63 74  nitText(&sSelect
189c0 29 3b 0a 20 20 20 20 61 70 70 65 6e 64 54 65 78  );.    appendTex
189d0 74 28 26 73 53 65 6c 65 63 74 2c 20 22 53 45 4c  t(&sSelect, "SEL
189e0 45 43 54 20 22 2c 20 30 29 3b 0a 20 20 20 20 69  ECT ", 0);.    i
189f0 66 28 20 61 7a 43 6f 6c 5b 30 5d 20 29 7b 0a 20  f( azCol[0] ){. 
18a00 20 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28       appendText(
18a10 26 73 53 65 6c 65 63 74 2c 20 61 7a 43 6f 6c 5b  &sSelect, azCol[
18a20 30 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 61 70  0], 0);.      ap
18a30 70 65 6e 64 54 65 78 74 28 26 73 53 65 6c 65 63  pendText(&sSelec
18a40 74 2c 20 22 2c 22 2c 20 30 29 3b 0a 20 20 20 20  t, ",", 0);.    
18a50 7d 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 61  }.    for(i=1; a
18a60 7a 43 6f 6c 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20  zCol[i]; i++){. 
18a70 20 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28       appendText(
18a80 26 73 53 65 6c 65 63 74 2c 20 61 7a 43 6f 6c 5b  &sSelect, azCol[
18a90 69 5d 2c 20 71 75 6f 74 65 43 68 61 72 28 61 7a  i], quoteChar(az
18aa0 43 6f 6c 5b 69 5d 29 29 3b 0a 20 20 20 20 20 20  Col[i]));.      
18ab0 69 66 28 20 61 7a 43 6f 6c 5b 69 2b 31 5d 20 29  if( azCol[i+1] )
18ac0 7b 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e 64  {.        append
18ad0 54 65 78 74 28 26 73 53 65 6c 65 63 74 2c 20 22  Text(&sSelect, "
18ae0 2c 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  ,", 0);.      }.
18af0 20 20 20 20 7d 0a 20 20 20 20 66 72 65 65 43 6f      }.    freeCo
18b00 6c 75 6d 6e 4c 69 73 74 28 61 7a 43 6f 6c 29 3b  lumnList(azCol);
18b10 0a 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28  .    appendText(
18b20 26 73 53 65 6c 65 63 74 2c 20 22 20 46 52 4f 4d  &sSelect, " FROM
18b30 20 22 2c 20 30 29 3b 0a 20 20 20 20 61 70 70 65   ", 0);.    appe
18b40 6e 64 54 65 78 74 28 26 73 53 65 6c 65 63 74 2c  ndText(&sSelect,
18b50 20 7a 54 61 62 6c 65 2c 20 71 75 6f 74 65 43 68   zTable, quoteCh
18b60 61 72 28 7a 54 61 62 6c 65 29 29 3b 0a 0a 20 20  ar(zTable));..  
18b70 20 20 73 61 76 65 64 44 65 73 74 54 61 62 6c 65    savedDestTable
18b80 20 3d 20 70 2d 3e 7a 44 65 73 74 54 61 62 6c 65   = p->zDestTable
18b90 3b 0a 20 20 20 20 73 61 76 65 64 4d 6f 64 65 20  ;.    savedMode 
18ba0 3d 20 70 2d 3e 6d 6f 64 65 3b 0a 20 20 20 20 70  = p->mode;.    p
18bb0 2d 3e 7a 44 65 73 74 54 61 62 6c 65 20 3d 20 73  ->zDestTable = s
18bc0 54 61 62 6c 65 2e 7a 3b 0a 20 20 20 20 70 2d 3e  Table.z;.    p->
18bd0 6d 6f 64 65 20 3d 20 70 2d 3e 63 4d 6f 64 65 20  mode = p->cMode 
18be0 3d 20 4d 4f 44 45 5f 49 6e 73 65 72 74 3b 0a 20  = MODE_Insert;. 
18bf0 20 20 20 72 63 20 3d 20 73 68 65 6c 6c 5f 65 78     rc = shell_ex
18c00 65 63 28 70 2c 20 73 53 65 6c 65 63 74 2e 7a 2c  ec(p, sSelect.z,
18c10 20 30 29 3b 0a 20 20 20 20 69 66 28 20 28 72 63   0);.    if( (rc
18c20 26 30 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f 43  &0xff)==SQLITE_C
18c30 4f 52 52 55 50 54 20 29 7b 0a 20 20 20 20 20 20  ORRUPT ){.      
18c40 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  raw_printf(p->ou
18c50 74 2c 20 22 2f 2a 2a 2a 2a 2a 2a 20 43 4f 52 52  t, "/****** CORR
18c60 55 50 54 49 4f 4e 20 45 52 52 4f 52 20 2a 2a 2a  UPTION ERROR ***
18c70 2a 2a 2a 2a 2f 5c 6e 22 29 3b 0a 20 20 20 20 20  ****/\n");.     
18c80 20 74 6f 67 67 6c 65 53 65 6c 65 63 74 4f 72 64   toggleSelectOrd
18c90 65 72 28 70 2d 3e 64 62 29 3b 0a 20 20 20 20 20  er(p->db);.     
18ca0 20 73 68 65 6c 6c 5f 65 78 65 63 28 70 2c 20 73   shell_exec(p, s
18cb0 53 65 6c 65 63 74 2e 7a 2c 20 30 29 3b 0a 20 20  Select.z, 0);.  
18cc0 20 20 20 20 74 6f 67 67 6c 65 53 65 6c 65 63 74      toggleSelect
18cd0 4f 72 64 65 72 28 70 2d 3e 64 62 29 3b 0a 20 20  Order(p->db);.  
18ce0 20 20 7d 0a 20 20 20 20 70 2d 3e 7a 44 65 73 74    }.    p->zDest
18cf0 54 61 62 6c 65 20 3d 20 73 61 76 65 64 44 65 73  Table = savedDes
18d00 74 54 61 62 6c 65 3b 0a 20 20 20 20 70 2d 3e 6d  tTable;.    p->m
18d10 6f 64 65 20 3d 20 73 61 76 65 64 4d 6f 64 65 3b  ode = savedMode;
18d20 0a 20 20 20 20 66 72 65 65 54 65 78 74 28 26 73  .    freeText(&s
18d30 54 61 62 6c 65 29 3b 0a 20 20 20 20 66 72 65 65  Table);.    free
18d40 54 65 78 74 28 26 73 53 65 6c 65 63 74 29 3b 0a  Text(&sSelect);.
18d50 20 20 20 20 69 66 28 20 72 63 20 29 20 70 2d 3e      if( rc ) p->
18d60 6e 45 72 72 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65  nErr++;.  }.  re
18d70 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
18d80 20 52 75 6e 20 7a 51 75 65 72 79 2e 20 20 55 73   Run zQuery.  Us
18d90 65 20 64 75 6d 70 5f 63 61 6c 6c 62 61 63 6b 28  e dump_callback(
18da0 29 20 61 73 20 74 68 65 20 63 61 6c 6c 62 61 63  ) as the callbac
18db0 6b 20 72 6f 75 74 69 6e 65 20 73 6f 20 74 68 61  k routine so tha
18dc0 74 0a 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74  t.** the content
18dd0 73 20 6f 66 20 74 68 65 20 71 75 65 72 79 20 61  s of the query a
18de0 72 65 20 6f 75 74 70 75 74 20 61 73 20 53 51 4c  re output as SQL
18df0 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2a 0a   statements..**.
18e00 2a 2a 20 49 66 20 77 65 20 67 65 74 20 61 20 53  ** If we get a S
18e10 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 65 72  QLITE_CORRUPT er
18e20 72 6f 72 2c 20 72 65 72 75 6e 20 74 68 65 20 71  ror, rerun the q
18e30 75 65 72 79 20 61 66 74 65 72 20 61 70 70 65 6e  uery after appen
18e40 64 69 6e 67 0a 2a 2a 20 22 4f 52 44 45 52 20 42  ding.** "ORDER B
18e50 59 20 72 6f 77 69 64 20 44 45 53 43 22 20 74 6f  Y rowid DESC" to
18e60 20 74 68 65 20 65 6e 64 2e 0a 2a 2f 0a 73 74 61   the end..*/.sta
18e70 74 69 63 20 69 6e 74 20 72 75 6e 5f 73 63 68 65  tic int run_sche
18e80 6d 61 5f 64 75 6d 70 5f 71 75 65 72 79 28 0a 20  ma_dump_query(. 
18e90 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 2c 0a   ShellState *p,.
18ea0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 51    const char *zQ
18eb0 75 65 72 79 0a 29 7b 0a 20 20 69 6e 74 20 72 63  uery.){.  int rc
18ec0 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 20 3d  ;.  char *zErr =
18ed0 20 30 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   0;.  rc = sqlit
18ee0 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20 7a  e3_exec(p->db, z
18ef0 51 75 65 72 79 2c 20 64 75 6d 70 5f 63 61 6c 6c  Query, dump_call
18f00 62 61 63 6b 2c 20 70 2c 20 26 7a 45 72 72 29 3b  back, p, &zErr);
18f10 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
18f20 45 5f 43 4f 52 52 55 50 54 20 29 7b 0a 20 20 20  E_CORRUPT ){.   
18f30 20 63 68 61 72 20 2a 7a 51 32 3b 0a 20 20 20 20   char *zQ2;.    
18f40 69 6e 74 20 6c 65 6e 20 3d 20 73 74 72 6c 65 6e  int len = strlen
18f50 33 30 28 7a 51 75 65 72 79 29 3b 0a 20 20 20 20  30(zQuery);.    
18f60 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  raw_printf(p->ou
18f70 74 2c 20 22 2f 2a 2a 2a 2a 2a 2a 20 43 4f 52 52  t, "/****** CORR
18f80 55 50 54 49 4f 4e 20 45 52 52 4f 52 20 2a 2a 2a  UPTION ERROR ***
18f90 2a 2a 2a 2a 2f 5c 6e 22 29 3b 0a 20 20 20 20 69  ****/\n");.    i
18fa0 66 28 20 7a 45 72 72 20 29 7b 0a 20 20 20 20 20  f( zErr ){.     
18fb0 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e   utf8_printf(p->
18fc0 6f 75 74 2c 20 22 2f 2a 2a 2a 2a 2a 2a 20 25 73  out, "/****** %s
18fd0 20 2a 2a 2a 2a 2a 2a 2f 5c 6e 22 2c 20 7a 45 72   ******/\n", zEr
18fe0 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  r);.      sqlite
18ff0 33 5f 66 72 65 65 28 7a 45 72 72 29 3b 0a 20 20  3_free(zErr);.  
19000 20 20 20 20 7a 45 72 72 20 3d 20 30 3b 0a 20 20      zErr = 0;.  
19010 20 20 7d 0a 20 20 20 20 7a 51 32 20 3d 20 6d 61    }.    zQ2 = ma
19020 6c 6c 6f 63 28 20 6c 65 6e 2b 31 30 30 20 29 3b  lloc( len+100 );
19030 0a 20 20 20 20 69 66 28 20 7a 51 32 3d 3d 30 20  .    if( zQ2==0 
19040 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
19050 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
19060 66 28 6c 65 6e 2b 31 30 30 2c 20 7a 51 32 2c 20  f(len+100, zQ2, 
19070 22 25 73 20 4f 52 44 45 52 20 42 59 20 72 6f 77  "%s ORDER BY row
19080 69 64 20 44 45 53 43 22 2c 20 7a 51 75 65 72 79  id DESC", zQuery
19090 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
190a0 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20  te3_exec(p->db, 
190b0 7a 51 32 2c 20 64 75 6d 70 5f 63 61 6c 6c 62 61  zQ2, dump_callba
190c0 63 6b 2c 20 70 2c 20 26 7a 45 72 72 29 3b 0a 20  ck, p, &zErr);. 
190d0 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
190e0 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70     utf8_printf(p
190f0 2d 3e 6f 75 74 2c 20 22 2f 2a 2a 2a 2a 2a 2a 20  ->out, "/****** 
19100 45 52 52 4f 52 3a 20 25 73 20 2a 2a 2a 2a 2a 2a  ERROR: %s ******
19110 2f 5c 6e 22 2c 20 7a 45 72 72 29 3b 0a 20 20 20  /\n", zErr);.   
19120 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
19130 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
19140 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  T;.    }.    sql
19150 69 74 65 33 5f 66 72 65 65 28 7a 45 72 72 29 3b  ite3_free(zErr);
19160 0a 20 20 20 20 66 72 65 65 28 7a 51 32 29 3b 0a  .    free(zQ2);.
19170 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
19180 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 65 78 74 20 6f  .}../*.** Text o
19190 66 20 61 20 68 65 6c 70 20 6d 65 73 73 61 67 65  f a help message
191a0 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20  .*/.static char 
191b0 7a 48 65 6c 70 5b 5d 20 3d 0a 23 69 66 20 64 65  zHelp[] =.#if de
191c0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 48 41 56  fined(SQLITE_HAV
191d0 45 5f 5a 4c 49 42 29 20 26 26 20 21 64 65 66 69  E_ZLIB) && !defi
191e0 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
191f0 56 49 52 54 55 41 4c 54 41 42 4c 45 29 0a 20 20  VIRTUALTABLE).  
19200 22 2e 61 72 63 68 69 76 65 20 2e 2e 2e 20 20 20  ".archive ...   
19210 20 20 20 20 20 20 20 20 4d 61 6e 61 67 65 20 53          Manage S
19220 51 4c 20 61 72 63 68 69 76 65 73 3a 20 5c 22 2e  QL archives: \".
19230 61 72 63 68 69 76 65 20 2d 2d 68 65 6c 70 5c 22  archive --help\"
19240 20 66 6f 72 20 64 65 74 61 69 6c 73 5c 6e 22 0a   for details\n".
19250 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 53  #endif.#ifndef S
19260 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f  QLITE_OMIT_AUTHO
19270 52 49 5a 41 54 49 4f 4e 0a 20 20 22 2e 61 75 74  RIZATION.  ".aut
19280 68 20 4f 4e 7c 4f 46 46 20 20 20 20 20 20 20 20  h ON|OFF        
19290 20 20 20 53 68 6f 77 20 61 75 74 68 6f 72 69 7a     Show authoriz
192a0 65 72 20 63 61 6c 6c 62 61 63 6b 73 5c 6e 22 0a  er callbacks\n".
192b0 23 65 6e 64 69 66 0a 20 20 22 2e 62 61 63 6b 75  #endif.  ".backu
192c0 70 20 3f 44 42 3f 20 46 49 4c 45 20 20 20 20 20  p ?DB? FILE     
192d0 20 42 61 63 6b 75 70 20 44 42 20 28 64 65 66 61   Backup DB (defa
192e0 75 6c 74 20 5c 22 6d 61 69 6e 5c 22 29 20 74 6f  ult \"main\") to
192f0 20 46 49 4c 45 5c 6e 22 0a 20 20 22 2e 62 61 69   FILE\n".  ".bai
19300 6c 20 6f 6e 7c 6f 66 66 20 20 20 20 20 20 20 20  l on|off        
19310 20 20 20 53 74 6f 70 20 61 66 74 65 72 20 68 69     Stop after hi
19320 74 74 69 6e 67 20 61 6e 20 65 72 72 6f 72 2e 20  tting an error. 
19330 20 44 65 66 61 75 6c 74 20 4f 46 46 5c 6e 22 0a   Default OFF\n".
19340 20 20 22 2e 62 69 6e 61 72 79 20 6f 6e 7c 6f 66    ".binary on|of
19350 66 20 20 20 20 20 20 20 20 20 54 75 72 6e 20 62  f         Turn b
19360 69 6e 61 72 79 20 6f 75 74 70 75 74 20 6f 6e 20  inary output on 
19370 6f 72 20 6f 66 66 2e 20 20 44 65 66 61 75 6c 74  or off.  Default
19380 20 4f 46 46 5c 6e 22 0a 20 20 22 2e 63 64 20 44   OFF\n".  ".cd D
19390 49 52 45 43 54 4f 52 59 20 20 20 20 20 20 20 20  IRECTORY        
193a0 20 20 43 68 61 6e 67 65 20 74 68 65 20 77 6f 72    Change the wor
193b0 6b 69 6e 67 20 64 69 72 65 63 74 6f 72 79 20 74  king directory t
193c0 6f 20 44 49 52 45 43 54 4f 52 59 5c 6e 22 0a 20  o DIRECTORY\n". 
193d0 20 22 2e 63 68 61 6e 67 65 73 20 6f 6e 7c 6f 66   ".changes on|of
193e0 66 20 20 20 20 20 20 20 20 53 68 6f 77 20 6e 75  f        Show nu
193f0 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 63 68 61  mber of rows cha
19400 6e 67 65 64 20 62 79 20 53 51 4c 5c 6e 22 0a 20  nged by SQL\n". 
19410 20 22 2e 63 68 65 63 6b 20 47 4c 4f 42 20 20 20   ".check GLOB   
19420 20 20 20 20 20 20 20 20 20 46 61 69 6c 20 69 66           Fail if
19430 20 6f 75 74 70 75 74 20 73 69 6e 63 65 20 2e 74   output since .t
19440 65 73 74 63 61 73 65 20 64 6f 65 73 20 6e 6f 74  estcase does not
19450 20 6d 61 74 63 68 5c 6e 22 0a 20 20 22 2e 63 6c   match\n".  ".cl
19460 6f 6e 65 20 4e 45 57 44 42 20 20 20 20 20 20 20  one NEWDB       
19470 20 20 20 20 43 6c 6f 6e 65 20 64 61 74 61 20 69      Clone data i
19480 6e 74 6f 20 4e 45 57 44 42 20 66 72 6f 6d 20 74  nto NEWDB from t
19490 68 65 20 65 78 69 73 74 69 6e 67 20 64 61 74 61  he existing data
194a0 62 61 73 65 5c 6e 22 0a 20 20 22 2e 64 61 74 61  base\n".  ".data
194b0 62 61 73 65 73 20 20 20 20 20 20 20 20 20 20 20  bases           
194c0 20 20 4c 69 73 74 20 6e 61 6d 65 73 20 61 6e 64    List names and
194d0 20 66 69 6c 65 73 20 6f 66 20 61 74 74 61 63 68   files of attach
194e0 65 64 20 64 61 74 61 62 61 73 65 73 5c 6e 22 0a  ed databases\n".
194f0 20 20 22 2e 64 62 69 6e 66 6f 20 3f 44 42 3f 20    ".dbinfo ?DB? 
19500 20 20 20 20 20 20 20 20 20 20 53 68 6f 77 20 73            Show s
19510 74 61 74 75 73 20 69 6e 66 6f 72 6d 61 74 69 6f  tatus informatio
19520 6e 20 61 62 6f 75 74 20 74 68 65 20 64 61 74 61  n about the data
19530 62 61 73 65 5c 6e 22 0a 20 20 22 2e 64 75 6d 70  base\n".  ".dump
19540 20 3f 54 41 42 4c 45 3f 20 2e 2e 2e 20 20 20 20   ?TABLE? ...    
19550 20 20 44 75 6d 70 20 74 68 65 20 64 61 74 61 62    Dump the datab
19560 61 73 65 20 69 6e 20 61 6e 20 53 51 4c 20 74 65  ase in an SQL te
19570 78 74 20 66 6f 72 6d 61 74 5c 6e 22 0a 20 20 22  xt format\n".  "
19580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19590 20 20 20 20 20 20 20 20 20 49 66 20 54 41 42 4c           If TABL
195a0 45 20 73 70 65 63 69 66 69 65 64 2c 20 6f 6e 6c  E specified, onl
195b0 79 20 64 75 6d 70 20 74 61 62 6c 65 73 20 6d 61  y dump tables ma
195c0 74 63 68 69 6e 67 5c 6e 22 0a 20 20 22 20 20 20  tching\n".  "   
195d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
195e0 20 20 20 20 20 20 4c 49 4b 45 20 70 61 74 74 65        LIKE patte
195f0 72 6e 20 54 41 42 4c 45 2e 5c 6e 22 0a 20 20 22  rn TABLE.\n".  "
19600 2e 65 63 68 6f 20 6f 6e 7c 6f 66 66 20 20 20 20  .echo on|off    
19610 20 20 20 20 20 20 20 54 75 72 6e 20 63 6f 6d 6d         Turn comm
19620 61 6e 64 20 65 63 68 6f 20 6f 6e 20 6f 72 20 6f  and echo on or o
19630 66 66 5c 6e 22 0a 20 20 22 2e 65 71 70 20 6f 6e  ff\n".  ".eqp on
19640 7c 6f 66 66 7c 66 75 6c 6c 20 20 20 20 20 20 20  |off|full       
19650 45 6e 61 62 6c 65 20 6f 72 20 64 69 73 61 62 6c  Enable or disabl
19660 65 20 61 75 74 6f 6d 61 74 69 63 20 45 58 50 4c  e automatic EXPL
19670 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 5c 6e  AIN QUERY PLAN\n
19680 22 0a 20 20 22 2e 65 78 63 65 6c 20 20 20 20 20  ".  ".excel     
19690 20 20 20 20 20 20 20 20 20 20 20 20 44 69 73 70              Disp
196a0 6c 61 79 20 74 68 65 20 6f 75 74 70 75 74 20 6f  lay the output o
196b0 66 20 6e 65 78 74 20 63 6f 6d 6d 61 6e 64 20 69  f next command i
196c0 6e 20 61 20 73 70 72 65 61 64 73 68 65 65 74 5c  n a spreadsheet\
196d0 6e 22 0a 20 20 22 2e 65 78 69 74 20 20 20 20 20  n".  ".exit     
196e0 20 20 20 20 20 20 20 20 20 20 20 20 20 45 78 69               Exi
196f0 74 20 74 68 69 73 20 70 72 6f 67 72 61 6d 5c 6e  t this program\n
19700 22 0a 20 20 22 2e 65 78 70 65 72 74 20 20 20 20  ".  ".expert    
19710 20 20 20 20 20 20 20 20 20 20 20 20 45 58 50 45              EXPE
19720 52 49 4d 45 4e 54 41 4c 2e 20 53 75 67 67 65 73  RIMENTAL. Sugges
19730 74 20 69 6e 64 65 78 65 73 20 66 6f 72 20 73 70  t indexes for sp
19740 65 63 69 66 69 65 64 20 71 75 65 72 69 65 73 5c  ecified queries\
19750 6e 22 0a 2f 2a 20 42 65 63 61 75 73 65 20 65 78  n"./* Because ex
19760 70 6c 61 69 6e 20 6d 6f 64 65 20 63 6f 6d 65 73  plain mode comes
19770 20 6f 6e 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c   on automaticall
19780 79 20 6e 6f 77 2c 20 74 68 65 20 22 2e 65 78 70  y now, the ".exp
19790 6c 61 69 6e 22 20 6d 6f 64 65 0a 2a 2a 20 69 73  lain" mode.** is
197a0 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68   removed from th
197b0 65 20 68 65 6c 70 20 73 63 72 65 65 6e 2e 20 20  e help screen.  
197c0 49 74 20 69 73 20 73 74 69 6c 6c 20 73 75 70 70  It is still supp
197d0 6f 72 74 65 64 20 66 6f 72 20 6c 65 67 61 63 79  orted for legacy
197e0 2c 20 68 6f 77 65 76 65 72 20 2a 2f 0a 2f 2a 22  , however */./*"
197f0 2e 65 78 70 6c 61 69 6e 20 3f 6f 6e 7c 6f 66 66  .explain ?on|off
19800 7c 61 75 74 6f 3f 20 54 75 72 6e 20 45 58 50 4c  |auto? Turn EXPL
19810 41 49 4e 20 6f 75 74 70 75 74 20 6d 6f 64 65 20  AIN output mode 
19820 6f 6e 20 6f 72 20 6f 66 66 20 6f 72 20 74 6f 20  on or off or to 
19830 61 75 74 6f 6d 61 74 69 63 5c 6e 22 2a 2f 0a 20  automatic\n"*/. 
19840 20 22 2e 66 75 6c 6c 73 63 68 65 6d 61 20 3f 2d   ".fullschema ?-
19850 2d 69 6e 64 65 6e 74 3f 20 53 68 6f 77 20 73 63  -indent? Show sc
19860 68 65 6d 61 20 61 6e 64 20 74 68 65 20 63 6f 6e  hema and the con
19870 74 65 6e 74 20 6f 66 20 73 71 6c 69 74 65 5f 73  tent of sqlite_s
19880 74 61 74 20 74 61 62 6c 65 73 5c 6e 22 0a 20 20  tat tables\n".  
19890 22 2e 68 65 61 64 65 72 73 20 6f 6e 7c 6f 66 66  ".headers on|off
198a0 20 20 20 20 20 20 20 20 54 75 72 6e 20 64 69 73          Turn dis
198b0 70 6c 61 79 20 6f 66 20 68 65 61 64 65 72 73 20  play of headers 
198c0 6f 6e 20 6f 72 20 6f 66 66 5c 6e 22 0a 20 20 22  on or off\n".  "
198d0 2e 68 65 6c 70 20 20 20 20 20 20 20 20 20 20 20  .help           
198e0 20 20 20 20 20 20 20 53 68 6f 77 20 74 68 69 73         Show this
198f0 20 6d 65 73 73 61 67 65 5c 6e 22 0a 20 20 22 2e   message\n".  ".
19900 69 6d 70 6f 72 74 20 46 49 4c 45 20 54 41 42 4c  import FILE TABL
19910 45 20 20 20 20 20 49 6d 70 6f 72 74 20 64 61 74  E     Import dat
19920 61 20 66 72 6f 6d 20 46 49 4c 45 20 69 6e 74 6f  a from FILE into
19930 20 54 41 42 4c 45 5c 6e 22 0a 23 69 66 6e 64 65   TABLE\n".#ifnde
19940 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 45  f SQLITE_OMIT_TE
19950 53 54 5f 43 4f 4e 54 52 4f 4c 0a 20 20 22 2e 69  ST_CONTROL.  ".i
19960 6d 70 6f 73 74 65 72 20 49 4e 44 45 58 20 54 41  mposter INDEX TA
19970 42 4c 45 20 20 43 72 65 61 74 65 20 69 6d 70 6f  BLE  Create impo
19980 73 74 65 72 20 74 61 62 6c 65 20 54 41 42 4c 45  ster table TABLE
19990 20 6f 6e 20 69 6e 64 65 78 20 49 4e 44 45 58 5c   on index INDEX\
199a0 6e 22 0a 23 65 6e 64 69 66 0a 20 20 22 2e 69 6e  n".#endif.  ".in
199b0 64 65 78 65 73 20 3f 54 41 42 4c 45 3f 20 20 20  dexes ?TABLE?   
199c0 20 20 20 20 53 68 6f 77 20 6e 61 6d 65 73 20 6f      Show names o
199d0 66 20 61 6c 6c 20 69 6e 64 65 78 65 73 5c 6e 22  f all indexes\n"
199e0 0a 20 20 22 20 20 20 20 20 20 20 20 20 20 20 20  .  "            
199f0 20 20 20 20 20 20 20 20 20 20 20 20 20 49 66 20               If 
19a00 54 41 42 4c 45 20 73 70 65 63 69 66 69 65 64 2c  TABLE specified,
19a10 20 6f 6e 6c 79 20 73 68 6f 77 20 69 6e 64 65 78   only show index
19a20 65 73 20 66 6f 72 20 74 61 62 6c 65 73 5c 6e 22  es for tables\n"
19a30 0a 20 20 22 20 20 20 20 20 20 20 20 20 20 20 20  .  "            
19a40 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 61 74               mat
19a50 63 68 69 6e 67 20 4c 49 4b 45 20 70 61 74 74 65  ching LIKE patte
19a60 72 6e 20 54 41 42 4c 45 2e 5c 6e 22 0a 23 69 66  rn TABLE.\n".#if
19a70 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
19a80 45 5f 49 4f 54 52 41 43 45 0a 20 20 22 2e 69 6f  E_IOTRACE.  ".io
19a90 74 72 61 63 65 20 46 49 4c 45 20 20 20 20 20 20  trace FILE      
19aa0 20 20 20 20 45 6e 61 62 6c 65 20 49 2f 4f 20 64      Enable I/O d
19ab0 69 61 67 6e 6f 73 74 69 63 20 6c 6f 67 67 69 6e  iagnostic loggin
19ac0 67 20 74 6f 20 46 49 4c 45 5c 6e 22 0a 23 65 6e  g to FILE\n".#en
19ad0 64 69 66 0a 20 20 22 2e 6c 69 6d 69 74 20 3f 4c  dif.  ".limit ?L
19ae0 49 4d 49 54 3f 20 3f 56 41 4c 3f 20 20 20 44 69  IMIT? ?VAL?   Di
19af0 73 70 6c 61 79 20 6f 72 20 63 68 61 6e 67 65 20  splay or change 
19b00 74 68 65 20 76 61 6c 75 65 20 6f 66 20 61 6e 20  the value of an 
19b10 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5c 6e 22 0a  SQLITE_LIMIT\n".
19b20 20 20 22 2e 6c 69 6e 74 20 4f 50 54 49 4f 4e 53    ".lint OPTIONS
19b30 20 20 20 20 20 20 20 20 20 20 52 65 70 6f 72 74            Report
19b40 20 70 6f 74 65 6e 74 69 61 6c 20 73 63 68 65 6d   potential schem
19b50 61 20 69 73 73 75 65 73 2e 20 4f 70 74 69 6f 6e  a issues. Option
19b60 73 3a 5c 6e 22 0a 20 20 22 20 20 20 20 20 20 20  s:\n".  "       
19b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19b80 20 20 66 6b 65 79 2d 69 6e 64 65 78 65 73 20 20    fkey-indexes  
19b90 20 20 20 46 69 6e 64 20 6d 69 73 73 69 6e 67 20     Find missing 
19ba0 66 6f 72 65 69 67 6e 20 6b 65 79 20 69 6e 64 65  foreign key inde
19bb0 78 65 73 5c 6e 22 0a 23 69 66 6e 64 65 66 20 53  xes\n".#ifndef S
19bc0 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f  QLITE_OMIT_LOAD_
19bd0 45 58 54 45 4e 53 49 4f 4e 0a 20 20 22 2e 6c 6f  EXTENSION.  ".lo
19be0 61 64 20 46 49 4c 45 20 3f 45 4e 54 52 59 3f 20  ad FILE ?ENTRY? 
19bf0 20 20 20 20 4c 6f 61 64 20 61 6e 20 65 78 74 65      Load an exte
19c00 6e 73 69 6f 6e 20 6c 69 62 72 61 72 79 5c 6e 22  nsion library\n"
19c10 0a 23 65 6e 64 69 66 0a 20 20 22 2e 6c 6f 67 20  .#endif.  ".log 
19c20 46 49 4c 45 7c 6f 66 66 20 20 20 20 20 20 20 20  FILE|off        
19c30 20 20 54 75 72 6e 20 6c 6f 67 67 69 6e 67 20 6f    Turn logging o
19c40 6e 20 6f 72 20 6f 66 66 2e 20 20 46 49 4c 45 20  n or off.  FILE 
19c50 63 61 6e 20 62 65 20 73 74 64 65 72 72 2f 73 74  can be stderr/st
19c60 64 6f 75 74 5c 6e 22 0a 20 20 22 2e 6d 6f 64 65  dout\n".  ".mode
19c70 20 4d 4f 44 45 20 3f 54 41 42 4c 45 3f 20 20 20   MODE ?TABLE?   
19c80 20 20 53 65 74 20 6f 75 74 70 75 74 20 6d 6f 64    Set output mod
19c90 65 20 77 68 65 72 65 20 4d 4f 44 45 20 69 73 20  e where MODE is 
19ca0 6f 6e 65 20 6f 66 3a 5c 6e 22 0a 20 20 22 20 20  one of:\n".  "  
19cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19cc0 20 20 20 20 20 20 20 61 73 63 69 69 20 20 20 20         ascii    
19cd0 43 6f 6c 75 6d 6e 73 2f 72 6f 77 73 20 64 65 6c  Columns/rows del
19ce0 69 6d 69 74 65 64 20 62 79 20 30 78 31 46 20 61  imited by 0x1F a
19cf0 6e 64 20 30 78 31 45 5c 6e 22 0a 20 20 22 20 20  nd 0x1E\n".  "  
19d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19d10 20 20 20 20 20 20 20 63 73 76 20 20 20 20 20 20         csv      
19d20 43 6f 6d 6d 61 2d 73 65 70 61 72 61 74 65 64 20  Comma-separated 
19d30 76 61 6c 75 65 73 5c 6e 22 0a 20 20 22 20 20 20  values\n".  "   
19d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19d50 20 20 20 20 20 20 63 6f 6c 75 6d 6e 20 20 20 4c        column   L
19d60 65 66 74 2d 61 6c 69 67 6e 65 64 20 63 6f 6c 75  eft-aligned colu
19d70 6d 6e 73 2e 20 20 28 53 65 65 20 2e 77 69 64 74  mns.  (See .widt
19d80 68 29 5c 6e 22 0a 20 20 22 20 20 20 20 20 20 20  h)\n".  "       
19d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19da0 20 20 68 74 6d 6c 20 20 20 20 20 48 54 4d 4c 20    html     HTML 
19db0 3c 74 61 62 6c 65 3e 20 63 6f 64 65 5c 6e 22 0a  <table> code\n".
19dc0 20 20 22 20 20 20 20 20 20 20 20 20 20 20 20 20    "             
19dd0 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 73 65              inse
19de0 72 74 20 20 20 53 51 4c 20 69 6e 73 65 72 74 20  rt   SQL insert 
19df0 73 74 61 74 65 6d 65 6e 74 73 20 66 6f 72 20 54  statements for T
19e00 41 42 4c 45 5c 6e 22 0a 20 20 22 20 20 20 20 20  ABLE\n".  "     
19e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19e20 20 20 20 20 6c 69 6e 65 20 20 20 20 20 4f 6e 65      line     One
19e30 20 76 61 6c 75 65 20 70 65 72 20 6c 69 6e 65 5c   value per line\
19e40 6e 22 0a 20 20 22 20 20 20 20 20 20 20 20 20 20  n".  "          
19e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6c                 l
19e60 69 73 74 20 20 20 20 20 56 61 6c 75 65 73 20 64  ist     Values d
19e70 65 6c 69 6d 69 74 65 64 20 62 79 20 5c 22 7c 5c  elimited by \"|\
19e80 22 5c 6e 22 0a 20 20 22 20 20 20 20 20 20 20 20  "\n".  "        
19e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19ea0 20 71 75 6f 74 65 20 20 20 20 45 73 63 61 70 65   quote    Escape
19eb0 20 61 6e 73 77 65 72 73 20 61 73 20 66 6f 72 20   answers as for 
19ec0 53 51 4c 5c 6e 22 0a 20 20 22 20 20 20 20 20 20  SQL\n".  "      
19ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19ee0 20 20 20 74 61 62 73 20 20 20 20 20 54 61 62 2d     tabs     Tab-
19ef0 73 65 70 61 72 61 74 65 64 20 76 61 6c 75 65 73  separated values
19f00 5c 6e 22 0a 20 20 22 20 20 20 20 20 20 20 20 20  \n".  "         
19f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19f20 74 63 6c 20 20 20 20 20 20 54 43 4c 20 6c 69 73  tcl      TCL lis
19f30 74 20 65 6c 65 6d 65 6e 74 73 5c 6e 22 0a 20 20  t elements\n".  
19f40 22 2e 6e 75 6c 6c 76 61 6c 75 65 20 53 54 52 49  ".nullvalue STRI
19f50 4e 47 20 20 20 20 20 20 55 73 65 20 53 54 52 49  NG      Use STRI
19f60 4e 47 20 69 6e 20 70 6c 61 63 65 20 6f 66 20 4e  NG in place of N
19f70 55 4c 4c 20 76 61 6c 75 65 73 5c 6e 22 0a 20 20  ULL values\n".  
19f80 22 2e 6f 6e 63 65 20 28 2d 65 7c 2d 78 7c 46 49  ".once (-e|-x|FI
19f90 4c 45 29 20 20 20 20 20 4f 75 74 70 75 74 20 66  LE)     Output f
19fa0 6f 72 20 74 68 65 20 6e 65 78 74 20 53 51 4c 20  or the next SQL 
19fb0 63 6f 6d 6d 61 6e 64 20 6f 6e 6c 79 20 74 6f 20  command only to 
19fc0 46 49 4c 45 5c 6e 22 0a 20 20 22 20 20 20 20 20  FILE\n".  "     
19fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19fe0 20 20 20 20 6f 72 20 69 6e 76 6f 6b 65 20 73 79      or invoke sy
19ff0 73 74 65 6d 20 74 65 78 74 20 65 64 69 74 6f 72  stem text editor
1a000 20 28 2d 65 29 20 6f 72 20 73 70 72 65 61 64 73   (-e) or spreads
1a010 68 65 65 74 20 28 2d 78 29 5c 6e 22 0a 20 20 22  heet (-x)\n".  "
1a020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a030 20 20 20 20 20 20 20 20 20 6f 6e 20 74 68 65 20           on the 
1a040 6f 75 74 70 75 74 2e 5c 6e 22 0a 20 20 22 2e 6f  output.\n".  ".o
1a050 70 65 6e 20 3f 4f 50 54 49 4f 4e 53 3f 20 3f 46  pen ?OPTIONS? ?F
1a060 49 4c 45 3f 20 43 6c 6f 73 65 20 65 78 69 73 74  ILE? Close exist
1a070 69 6e 67 20 64 61 74 61 62 61 73 65 20 61 6e 64  ing database and
1a080 20 72 65 6f 70 65 6e 20 46 49 4c 45 5c 6e 22 0a   reopen FILE\n".
1a090 20 20 22 20 20 20 20 20 20 20 20 20 20 20 20 20    "             
1a0a0 20 20 20 20 20 20 20 20 20 20 20 20 54 68 65 20              The 
1a0b0 2d 2d 6e 65 77 20 6f 70 74 69 6f 6e 20 73 74 61  --new option sta
1a0c0 72 74 73 20 77 69 74 68 20 61 6e 20 65 6d 70 74  rts with an empt
1a0d0 79 20 66 69 6c 65 5c 6e 22 0a 20 20 22 20 20 20  y file\n".  "   
1a0e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a0f0 20 20 20 20 20 20 4f 74 68 65 72 20 6f 70 74 69        Other opti
1a100 6f 6e 73 3a 20 2d 2d 72 65 61 64 6f 6e 6c 79 20  ons: --readonly 
1a110 2d 2d 61 70 70 65 6e 64 20 2d 2d 7a 69 70 5c 6e  --append --zip\n
1a120 22 0a 20 20 22 2e 6f 75 74 70 75 74 20 3f 46 49  ".  ".output ?FI
1a130 4c 45 3f 20 20 20 20 20 20 20 20 20 53 65 6e 64  LE?         Send
1a140 20 6f 75 74 70 75 74 20 74 6f 20 46 49 4c 45 20   output to FILE 
1a150 6f 72 20 73 74 64 6f 75 74 5c 6e 22 0a 20 20 22  or stdout\n".  "
1a160 2e 70 72 69 6e 74 20 53 54 52 49 4e 47 2e 2e 2e  .print STRING...
1a170 20 20 20 20 20 20 20 50 72 69 6e 74 20 6c 69 74         Print lit
1a180 65 72 61 6c 20 53 54 52 49 4e 47 5c 6e 22 0a 20  eral STRING\n". 
1a190 20 22 2e 70 72 6f 6d 70 74 20 4d 41 49 4e 20 43   ".prompt MAIN C
1a1a0 4f 4e 54 49 4e 55 45 20 20 52 65 70 6c 61 63 65  ONTINUE  Replace
1a1b0 20 74 68 65 20 73 74 61 6e 64 61 72 64 20 70 72   the standard pr
1a1c0 6f 6d 70 74 73 5c 6e 22 0a 20 20 22 2e 71 75 69  ompts\n".  ".qui
1a1d0 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
1a1e0 20 20 20 45 78 69 74 20 74 68 69 73 20 70 72 6f     Exit this pro
1a1f0 67 72 61 6d 5c 6e 22 0a 20 20 22 2e 72 65 61 64  gram\n".  ".read
1a200 20 46 49 4c 45 4e 41 4d 45 20 20 20 20 20 20 20   FILENAME       
1a210 20 20 45 78 65 63 75 74 65 20 53 51 4c 20 69 6e    Execute SQL in
1a220 20 46 49 4c 45 4e 41 4d 45 5c 6e 22 0a 20 20 22   FILENAME\n".  "
1a230 2e 72 65 73 74 6f 72 65 20 3f 44 42 3f 20 46 49  .restore ?DB? FI
1a240 4c 45 20 20 20 20 20 52 65 73 74 6f 72 65 20 63  LE     Restore c
1a250 6f 6e 74 65 6e 74 20 6f 66 20 44 42 20 28 64 65  ontent of DB (de
1a260 66 61 75 6c 74 20 5c 22 6d 61 69 6e 5c 22 29 20  fault \"main\") 
1a270 66 72 6f 6d 20 46 49 4c 45 5c 6e 22 0a 20 20 22  from FILE\n".  "
1a280 2e 73 61 76 65 20 46 49 4c 45 20 20 20 20 20 20  .save FILE      
1a290 20 20 20 20 20 20 20 57 72 69 74 65 20 69 6e 2d         Write in-
1a2a0 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20  memory database 
1a2b0 69 6e 74 6f 20 46 49 4c 45 5c 6e 22 0a 20 20 22  into FILE\n".  "
1a2c0 2e 73 63 61 6e 73 74 61 74 73 20 6f 6e 7c 6f 66  .scanstats on|of
1a2d0 66 20 20 20 20 20 20 54 75 72 6e 20 73 71 6c 69  f      Turn sqli
1a2e0 74 65 33 5f 73 74 6d 74 5f 73 63 61 6e 73 74 61  te3_stmt_scansta
1a2f0 74 75 73 28 29 20 6d 65 74 72 69 63 73 20 6f 6e  tus() metrics on
1a300 20 6f 72 20 6f 66 66 5c 6e 22 0a 20 20 22 2e 73   or off\n".  ".s
1a310 63 68 65 6d 61 20 3f 50 41 54 54 45 52 4e 3f 20  chema ?PATTERN? 
1a320 20 20 20 20 20 53 68 6f 77 20 74 68 65 20 43 52       Show the CR
1a330 45 41 54 45 20 73 74 61 74 65 6d 65 6e 74 73 20  EATE statements 
1a340 6d 61 74 63 68 69 6e 67 20 50 41 54 54 45 52 4e  matching PATTERN
1a350 5c 6e 22 0a 20 20 22 20 20 20 20 20 20 20 20 20  \n".  "         
1a360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a370 20 41 64 64 20 2d 2d 69 6e 64 65 6e 74 20 66 6f   Add --indent fo
1a380 72 20 70 72 65 74 74 79 2d 70 72 69 6e 74 69 6e  r pretty-printin
1a390 67 5c 6e 22 0a 20 20 22 2e 73 65 6c 66 74 65 73  g\n".  ".selftes
1a3a0 74 20 3f 2d 2d 69 6e 69 74 3f 20 20 20 20 20 52  t ?--init?     R
1a3b0 75 6e 20 74 65 73 74 73 20 64 65 66 69 6e 65 64  un tests defined
1a3c0 20 69 6e 20 74 68 65 20 53 45 4c 46 54 45 53 54   in the SELFTEST
1a3d0 20 74 61 62 6c 65 5c 6e 22 0a 20 20 22 2e 73 65   table\n".  ".se
1a3e0 70 61 72 61 74 6f 72 20 43 4f 4c 20 3f 52 4f 57  parator COL ?ROW
1a3f0 3f 20 20 20 43 68 61 6e 67 65 20 74 68 65 20 63  ?   Change the c
1a400 6f 6c 75 6d 6e 20 73 65 70 61 72 61 74 6f 72 20  olumn separator 
1a410 61 6e 64 20 6f 70 74 69 6f 6e 61 6c 6c 79 20 74  and optionally t
1a420 68 65 20 72 6f 77 5c 6e 22 0a 20 20 22 20 20 20  he row\n".  "   
1a430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a440 20 20 20 20 20 20 73 65 70 61 72 61 74 6f 72 20        separator 
1a450 66 6f 72 20 62 6f 74 68 20 74 68 65 20 6f 75 74  for both the out
1a460 70 75 74 20 6d 6f 64 65 20 61 6e 64 20 2e 69 6d  put mode and .im
1a470 70 6f 72 74 5c 6e 22 0a 23 69 66 20 64 65 66 69  port\n".#if defi
1a480 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
1a490 45 5f 53 45 53 53 49 4f 4e 29 0a 20 20 22 2e 73  E_SESSION).  ".s
1a4a0 65 73 73 69 6f 6e 20 43 4d 44 20 2e 2e 2e 20 20  ession CMD ...  
1a4b0 20 20 20 20 20 43 72 65 61 74 65 20 6f 72 20 63       Create or c
1a4c0 6f 6e 74 72 6f 6c 20 73 65 73 73 69 6f 6e 73 5c  ontrol sessions\
1a4d0 6e 22 0a 23 65 6e 64 69 66 0a 20 20 22 2e 73 68  n".#endif.  ".sh
1a4e0 61 33 73 75 6d 20 3f 4f 50 54 49 4f 4e 53 2e 2e  a3sum ?OPTIONS..
1a4f0 2e 3f 20 20 43 6f 6d 70 75 74 65 20 61 20 53 48  .?  Compute a SH
1a500 41 33 20 68 61 73 68 20 6f 66 20 64 61 74 61 62  A3 hash of datab
1a510 61 73 65 20 63 6f 6e 74 65 6e 74 5c 6e 22 0a 23  ase content\n".#
1a520 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f  ifndef SQLITE_NO
1a530 48 41 56 45 5f 53 59 53 54 45 4d 0a 20 20 22 2e  HAVE_SYSTEM.  ".
1a540 73 68 65 6c 6c 20 43 4d 44 20 41 52 47 53 2e 2e  shell CMD ARGS..
1a550 2e 20 20 20 20 20 52 75 6e 20 43 4d 44 20 41 52  .     Run CMD AR
1a560 47 53 2e 2e 2e 20 69 6e 20 61 20 73 79 73 74 65  GS... in a syste
1a570 6d 20 73 68 65 6c 6c 5c 6e 22 0a 23 65 6e 64 69  m shell\n".#endi
1a580 66 0a 20 20 22 2e 73 68 6f 77 20 20 20 20 20 20  f.  ".show      
1a590 20 20 20 20 20 20 20 20 20 20 20 20 53 68 6f 77              Show
1a5a0 20 74 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c   the current val
1a5b0 75 65 73 20 66 6f 72 20 76 61 72 69 6f 75 73 20  ues for various 
1a5c0 73 65 74 74 69 6e 67 73 5c 6e 22 0a 20 20 22 2e  settings\n".  ".
1a5d0 73 74 61 74 73 20 3f 6f 6e 7c 6f 66 66 3f 20 20  stats ?on|off?  
1a5e0 20 20 20 20 20 20 53 68 6f 77 20 73 74 61 74 73        Show stats
1a5f0 20 6f 72 20 74 75 72 6e 20 73 74 61 74 73 20 6f   or turn stats o
1a600 6e 20 6f 72 20 6f 66 66 5c 6e 22 0a 23 69 66 6e  n or off\n".#ifn
1a610 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f 48 41 56  def SQLITE_NOHAV
1a620 45 5f 53 59 53 54 45 4d 0a 20 20 22 2e 73 79 73  E_SYSTEM.  ".sys
1a630 74 65 6d 20 43 4d 44 20 41 52 47 53 2e 2e 2e 20  tem CMD ARGS... 
1a640 20 20 20 52 75 6e 20 43 4d 44 20 41 52 47 53 2e     Run CMD ARGS.
1a650 2e 2e 20 69 6e 20 61 20 73 79 73 74 65 6d 20 73  .. in a system s
1a660 68 65 6c 6c 5c 6e 22 0a 23 65 6e 64 69 66 0a 20  hell\n".#endif. 
1a670 20 22 2e 74 61 62 6c 65 73 20 3f 54 41 42 4c 45   ".tables ?TABLE
1a680 3f 20 20 20 20 20 20 20 20 4c 69 73 74 20 6e 61  ?        List na
1a690 6d 65 73 20 6f 66 20 74 61 62 6c 65 73 5c 6e 22  mes of tables\n"
1a6a0 0a 20 20 22 20 20 20 20 20 20 20 20 20 20 20 20  .  "            
1a6b0 20 20 20 20 20 20 20 20 20 20 20 20 20 49 66 20               If 
1a6c0 54 41 42 4c 45 20 73 70 65 63 69 66 69 65 64 2c  TABLE specified,
1a6d0 20 6f 6e 6c 79 20 6c 69 73 74 20 74 61 62 6c 65   only list table
1a6e0 73 20 6d 61 74 63 68 69 6e 67 5c 6e 22 0a 20 20  s matching\n".  
1a6f0 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
1a700 20 20 20 20 20 20 20 20 20 20 4c 49 4b 45 20 70            LIKE p
1a710 61 74 74 65 72 6e 20 54 41 42 4c 45 2e 5c 6e 22  attern TABLE.\n"
1a720 0a 20 20 22 2e 74 65 73 74 63 61 73 65 20 4e 41  .  ".testcase NA
1a730 4d 45 20 20 20 20 20 20 20 20 20 42 65 67 69 6e  ME         Begin
1a740 20 72 65 64 69 72 65 63 74 69 6e 67 20 6f 75 74   redirecting out
1a750 70 75 74 20 74 6f 20 27 74 65 73 74 63 61 73 65  put to 'testcase
1a760 2d 6f 75 74 2e 74 78 74 27 5c 6e 22 0a 20 20 22  -out.txt'\n".  "
1a770 2e 74 69 6d 65 6f 75 74 20 4d 53 20 20 20 20 20  .timeout MS     
1a780 20 20 20 20 20 20 20 54 72 79 20 6f 70 65 6e 69         Try openi
1a790 6e 67 20 6c 6f 63 6b 65 64 20 74 61 62 6c 65 73  ng locked tables
1a7a0 20 66 6f 72 20 4d 53 20 6d 69 6c 6c 69 73 65 63   for MS millisec
1a7b0 6f 6e 64 73 5c 6e 22 0a 20 20 22 2e 74 69 6d 65  onds\n".  ".time
1a7c0 72 20 6f 6e 7c 6f 66 66 20 20 20 20 20 20 20 20  r on|off        
1a7d0 20 20 54 75 72 6e 20 53 51 4c 20 74 69 6d 65 72    Turn SQL timer
1a7e0 20 6f 6e 20 6f 72 20 6f 66 66 5c 6e 22 0a 20 20   on or off\n".  
1a7f0 22 2e 74 72 61 63 65 20 46 49 4c 45 7c 6f 66 66  ".trace FILE|off
1a800 20 20 20 20 20 20 20 20 4f 75 74 70 75 74 20 65          Output e
1a810 61 63 68 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  ach SQL statemen
1a820 74 20 61 73 20 69 74 20 69 73 20 72 75 6e 5c 6e  t as it is run\n
1a830 22 0a 20 20 22 2e 76 66 73 69 6e 66 6f 20 3f 41  ".  ".vfsinfo ?A
1a840 55 58 3f 20 20 20 20 20 20 20 20 20 49 6e 66 6f  UX?         Info
1a850 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68  rmation about th
1a860 65 20 74 6f 70 2d 6c 65 76 65 6c 20 56 46 53 5c  e top-level VFS\
1a870 6e 22 0a 20 20 22 2e 76 66 73 6c 69 73 74 20 20  n".  ".vfslist  
1a880 20 20 20 20 20 20 20 20 20 20 20 20 20 4c 69 73               Lis
1a890 74 20 61 6c 6c 20 61 76 61 69 6c 61 62 6c 65 20  t all available 
1a8a0 56 46 53 65 73 5c 6e 22 0a 20 20 22 2e 76 66 73  VFSes\n".  ".vfs
1a8b0 6e 61 6d 65 20 3f 41 55 58 3f 20 20 20 20 20 20  name ?AUX?      
1a8c0 20 20 20 50 72 69 6e 74 20 74 68 65 20 6e 61 6d     Print the nam
1a8d0 65 20 6f 66 20 74 68 65 20 56 46 53 20 73 74 61  e of the VFS sta
1a8e0 63 6b 5c 6e 22 0a 20 20 22 2e 77 69 64 74 68 20  ck\n".  ".width 
1a8f0 4e 55 4d 31 20 4e 55 4d 32 20 2e 2e 2e 20 20 20  NUM1 NUM2 ...   
1a900 53 65 74 20 63 6f 6c 75 6d 6e 20 77 69 64 74 68  Set column width
1a910 73 20 66 6f 72 20 5c 22 63 6f 6c 75 6d 6e 5c 22  s for \"column\"
1a920 20 6d 6f 64 65 5c 6e 22 0a 20 20 22 20 20 20 20   mode\n".  "    
1a930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a940 20 20 20 20 20 4e 65 67 61 74 69 76 65 20 76 61       Negative va
1a950 6c 75 65 73 20 72 69 67 68 74 2d 6a 75 73 74 69  lues right-justi
1a960 66 79 5c 6e 22 0a 3b 0a 0a 23 69 66 20 64 65 66  fy\n".;..#if def
1a970 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
1a980 4c 45 5f 53 45 53 53 49 4f 4e 29 0a 2f 2a 0a 2a  LE_SESSION)./*.*
1a990 2a 20 50 72 69 6e 74 20 68 65 6c 70 20 69 6e 66  * Print help inf
1a9a0 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 74 68 65  ormation for the
1a9b0 20 22 2e 73 65 73 73 69 6f 6e 73 22 20 63 6f 6d   ".sessions" com
1a9c0 6d 61 6e 64 0a 2a 2f 0a 76 6f 69 64 20 73 65 73  mand.*/.void ses
1a9d0 73 69 6f 6e 5f 68 65 6c 70 28 53 68 65 6c 6c 53  sion_help(ShellS
1a9e0 74 61 74 65 20 2a 70 29 7b 0a 20 20 72 61 77 5f  tate *p){.  raw_
1a9f0 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 0a 20  printf(p->out,. 
1aa00 20 20 20 22 2e 73 65 73 73 69 6f 6e 20 3f 4e 41     ".session ?NA
1aa10 4d 45 3f 20 53 55 42 43 4f 4d 4d 41 4e 44 20 3f  ME? SUBCOMMAND ?
1aa20 41 52 47 53 2e 2e 2e 3f 5c 6e 22 0a 20 20 20 20  ARGS...?\n".    
1aa30 22 49 66 20 3f 4e 41 4d 45 3f 20 69 73 20 6f 6d  "If ?NAME? is om
1aa40 69 74 74 65 64 2c 20 74 68 65 20 66 69 72 73 74  itted, the first
1aa50 20 64 65 66 69 6e 65 64 20 73 65 73 73 69 6f 6e   defined session
1aa60 20 69 73 20 75 73 65 64 2e 5c 6e 22 0a 20 20 20   is used.\n".   
1aa70 20 22 53 75 62 63 6f 6d 6d 61 6e 64 73 3a 5c 6e   "Subcommands:\n
1aa80 22 0a 20 20 20 20 22 20 20 20 61 74 74 61 63 68  ".    "   attach
1aa90 20 54 41 42 4c 45 20 20 20 20 20 20 20 20 20 20   TABLE          
1aaa0 20 20 20 41 74 74 61 63 68 20 54 41 42 4c 45 5c     Attach TABLE\
1aab0 6e 22 0a 20 20 20 20 22 20 20 20 63 68 61 6e 67  n".    "   chang
1aac0 65 73 65 74 20 46 49 4c 45 20 20 20 20 20 20 20  eset FILE       
1aad0 20 20 20 20 57 72 69 74 65 20 61 20 63 68 61 6e      Write a chan
1aae0 67 65 73 65 74 20 69 6e 74 6f 20 46 49 4c 45 5c  geset into FILE\
1aaf0 6e 22 0a 20 20 20 20 22 20 20 20 63 6c 6f 73 65  n".    "   close
1ab00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ab10 20 20 20 20 43 6c 6f 73 65 20 6f 6e 65 20 73 65      Close one se
1ab20 73 73 69 6f 6e 5c 6e 22 0a 20 20 20 20 22 20 20  ssion\n".    "  
1ab30 20 65 6e 61 62 6c 65 20 3f 42 4f 4f 4c 45 41 4e   enable ?BOOLEAN
1ab40 3f 20 20 20 20 20 20 20 20 20 53 65 74 20 6f 72  ?         Set or
1ab50 20 71 75 65 72 79 20 74 68 65 20 65 6e 61 62 6c   query the enabl
1ab60 65 20 62 69 74 5c 6e 22 0a 20 20 20 20 22 20 20  e bit\n".    "  
1ab70 20 66 69 6c 74 65 72 20 47 4c 4f 42 2e 2e 2e 20   filter GLOB... 
1ab80 20 20 20 20 20 20 20 20 20 20 52 65 6a 65 63 74            Reject
1ab90 20 74 61 62 6c 65 73 20 6d 61 74 63 68 69 6e 67   tables matching
1aba0 20 47 4c 4f 42 73 5c 6e 22 0a 20 20 20 20 22 20   GLOBs\n".    " 
1abb0 20 20 69 6e 64 69 72 65 63 74 20 3f 42 4f 4f 4c    indirect ?BOOL
1abc0 45 41 4e 3f 20 20 20 20 20 20 20 4d 61 72 6b 20  EAN?       Mark 
1abd0 6f 72 20 71 75 65 72 79 20 74 68 65 20 69 6e 64  or query the ind
1abe0 69 72 65 63 74 20 73 74 61 74 75 73 5c 6e 22 0a  irect status\n".
1abf0 20 20 20 20 22 20 20 20 69 73 65 6d 70 74 79 20      "   isempty 
1ac00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ac10 20 51 75 65 72 79 20 77 68 65 74 68 65 72 20 74   Query whether t
1ac20 68 65 20 73 65 73 73 69 6f 6e 20 69 73 20 65 6d  he session is em
1ac30 70 74 79 5c 6e 22 0a 20 20 20 20 22 20 20 20 6c  pty\n".    "   l
1ac40 69 73 74 20 20 20 20 20 20 20 20 20 20 20 20 20  ist             
1ac50 20 20 20 20 20 20 20 20 4c 69 73 74 20 63 75 72          List cur
1ac60 72 65 6e 74 6c 79 20 6f 70 65 6e 20 73 65 73 73  rently open sess
1ac70 69 6f 6e 20 6e 61 6d 65 73 5c 6e 22 0a 20 20 20  ion names\n".   
1ac80 20 22 20 20 20 6f 70 65 6e 20 44 42 20 4e 41 4d   "   open DB NAM
1ac90 45 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 70  E             Op
1aca0 65 6e 20 61 20 6e 65 77 20 73 65 73 73 69 6f 6e  en a new session
1acb0 20 6f 6e 20 44 42 5c 6e 22 0a 20 20 20 20 22 20   on DB\n".    " 
1acc0 20 20 70 61 74 63 68 73 65 74 20 46 49 4c 45 20    patchset FILE 
1acd0 20 20 20 20 20 20 20 20 20 20 20 57 72 69 74 65             Write
1ace0 20 61 20 70 61 74 63 68 73 65 74 20 69 6e 74 6f   a patchset into
1acf0 20 46 49 4c 45 5c 6e 22 0a 20 20 29 3b 0a 7d 0a   FILE\n".  );.}.
1ad00 23 65 6e 64 69 66 0a 0a 0a 2f 2a 20 46 6f 72 77  #endif.../* Forw
1ad10 61 72 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f  ard reference */
1ad20 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 63  .static int proc
1ad30 65 73 73 5f 69 6e 70 75 74 28 53 68 65 6c 6c 53  ess_input(ShellS
1ad40 74 61 74 65 20 2a 70 2c 20 46 49 4c 45 20 2a 69  tate *p, FILE *i
1ad50 6e 29 3b 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20  n);../*.** Read 
1ad60 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 66  the content of f
1ad70 69 6c 65 20 7a 4e 61 6d 65 20 69 6e 74 6f 20 6d  ile zName into m
1ad80 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66  emory obtained f
1ad90 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  rom sqlite3_mall
1ada0 6f 63 36 34 28 29 0a 2a 2a 20 61 6e 64 20 72 65  oc64().** and re
1adb0 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
1adc0 6f 20 74 68 65 20 62 75 66 66 65 72 2e 20 54 68  o the buffer. Th
1add0 65 20 63 61 6c 6c 65 72 20 69 73 20 72 65 73 70  e caller is resp
1ade0 6f 6e 73 69 62 6c 65 20 66 6f 72 20 66 72 65 65  onsible for free
1adf0 69 6e 67 0a 2a 2a 20 74 68 65 20 6d 65 6d 6f 72  ing.** the memor
1ae00 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61  y..**.** If para
1ae10 6d 65 74 65 72 20 70 6e 42 79 74 65 20 69 73 20  meter pnByte is 
1ae20 6e 6f 74 20 4e 55 4c 4c 2c 20 28 2a 70 6e 42 79  not NULL, (*pnBy
1ae30 74 65 29 20 69 73 20 73 65 74 20 74 6f 20 74 68  te) is set to th
1ae40 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
1ae50 73 0a 2a 2a 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a  s.** read..**.**
1ae60 20 46 6f 72 20 63 6f 6e 76 65 6e 69 65 6e 63 65   For convenience
1ae70 2c 20 61 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74  , a nul-terminat
1ae80 6f 72 20 62 79 74 65 20 69 73 20 61 6c 77 61 79  or byte is alway
1ae90 73 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68  s appended to th
1aea0 65 20 64 61 74 61 20 72 65 61 64 0a 2a 2a 20 66  e data read.** f
1aeb0 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 62 65 66  rom the file bef
1aec0 6f 72 65 20 74 68 65 20 62 75 66 66 65 72 20 69  ore the buffer i
1aed0 73 20 72 65 74 75 72 6e 65 64 2e 20 54 68 69 73  s returned. This
1aee0 20 62 79 74 65 20 69 73 20 6e 6f 74 20 69 6e 63   byte is not inc
1aef0 6c 75 64 65 64 20 69 6e 0a 2a 2a 20 74 68 65 20  luded in.** the 
1af00 66 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 28  final value of (
1af10 2a 70 6e 42 79 74 65 29 2c 20 69 66 20 61 70 70  *pnByte), if app
1af20 6c 69 63 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 4e  licable..**.** N
1af30 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 20  ULL is returned 
1af40 69 66 20 61 6e 79 20 65 72 72 6f 72 20 69 73 20  if any error is 
1af50 65 6e 63 6f 75 6e 74 65 72 65 64 2e 20 54 68 65  encountered. The
1af60 20 66 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20   final value of 
1af70 2a 70 6e 42 79 74 65 0a 2a 2a 20 69 73 20 75 6e  *pnByte.** is un
1af80 64 65 66 69 6e 65 64 20 69 6e 20 74 68 69 73 20  defined in this 
1af90 63 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  case..*/.static 
1afa0 63 68 61 72 20 2a 72 65 61 64 46 69 6c 65 28 63  char *readFile(c
1afb0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
1afc0 2c 20 69 6e 74 20 2a 70 6e 42 79 74 65 29 7b 0a  , int *pnByte){.
1afd0 20 20 46 49 4c 45 20 2a 69 6e 20 3d 20 66 6f 70    FILE *in = fop
1afe0 65 6e 28 7a 4e 61 6d 65 2c 20 22 72 62 22 29 3b  en(zName, "rb");
1aff0 0a 20 20 6c 6f 6e 67 20 6e 49 6e 3b 0a 20 20 73  .  long nIn;.  s
1b000 69 7a 65 5f 74 20 6e 52 65 61 64 3b 0a 20 20 63  ize_t nRead;.  c
1b010 68 61 72 20 2a 70 42 75 66 3b 0a 20 20 69 66 28  har *pBuf;.  if(
1b020 20 69 6e 3d 3d 30 20 29 20 72 65 74 75 72 6e 20   in==0 ) return 
1b030 30 3b 0a 20 20 66 73 65 65 6b 28 69 6e 2c 20 30  0;.  fseek(in, 0
1b040 2c 20 53 45 45 4b 5f 45 4e 44 29 3b 0a 20 20 6e  , SEEK_END);.  n
1b050 49 6e 20 3d 20 66 74 65 6c 6c 28 69 6e 29 3b 0a  In = ftell(in);.
1b060 20 20 72 65 77 69 6e 64 28 69 6e 29 3b 0a 20 20    rewind(in);.  
1b070 70 42 75 66 20 3d 20 73 71 6c 69 74 65 33 5f 6d  pBuf = sqlite3_m
1b080 61 6c 6c 6f 63 36 34 28 20 6e 49 6e 2b 31 20 29  alloc64( nIn+1 )
1b090 3b 0a 20 20 69 66 28 20 70 42 75 66 3d 3d 30 20  ;.  if( pBuf==0 
1b0a0 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 6e 52  ) return 0;.  nR
1b0b0 65 61 64 20 3d 20 66 72 65 61 64 28 70 42 75 66  ead = fread(pBuf
1b0c0 2c 20 6e 49 6e 2c 20 31 2c 20 69 6e 29 3b 0a 20  , nIn, 1, in);. 
1b0d0 20 66 63 6c 6f 73 65 28 69 6e 29 3b 0a 20 20 69   fclose(in);.  i
1b0e0 66 28 20 6e 52 65 61 64 21 3d 31 20 29 7b 0a 20  f( nRead!=1 ){. 
1b0f0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
1b100 70 42 75 66 29 3b 0a 20 20 20 20 72 65 74 75 72  pBuf);.    retur
1b110 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 42 75 66 5b  n 0;.  }.  pBuf[
1b120 6e 49 6e 5d 20 3d 20 30 3b 0a 20 20 69 66 28 20  nIn] = 0;.  if( 
1b130 70 6e 42 79 74 65 20 29 20 2a 70 6e 42 79 74 65  pnByte ) *pnByte
1b140 20 3d 20 6e 49 6e 3b 0a 20 20 72 65 74 75 72 6e   = nIn;.  return
1b150 20 70 42 75 66 3b 0a 7d 0a 0a 23 69 66 20 64 65   pBuf;.}..#if de
1b160 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
1b170 42 4c 45 5f 53 45 53 53 49 4f 4e 29 0a 2f 2a 0a  BLE_SESSION)./*.
1b180 2a 2a 20 43 6c 6f 73 65 20 61 20 73 69 6e 67 6c  ** Close a singl
1b190 65 20 4f 70 65 6e 53 65 73 73 69 6f 6e 20 6f 62  e OpenSession ob
1b1a0 6a 65 63 74 20 61 6e 64 20 72 65 6c 65 61 73 65  ject and release
1b1b0 20 61 6c 6c 20 6f 66 20 69 74 73 20 61 73 73 6f   all of its asso
1b1c0 63 69 61 74 65 64 0a 2a 2a 20 72 65 73 6f 75 72  ciated.** resour
1b1d0 63 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ces..*/.static v
1b1e0 6f 69 64 20 73 65 73 73 69 6f 6e 5f 63 6c 6f 73  oid session_clos
1b1f0 65 28 4f 70 65 6e 53 65 73 73 69 6f 6e 20 2a 70  e(OpenSession *p
1b200 53 65 73 73 69 6f 6e 29 7b 0a 20 20 69 6e 74 20  Session){.  int 
1b210 69 3b 0a 20 20 73 71 6c 69 74 65 33 73 65 73 73  i;.  sqlite3sess
1b220 69 6f 6e 5f 64 65 6c 65 74 65 28 70 53 65 73 73  ion_delete(pSess
1b230 69 6f 6e 2d 3e 70 29 3b 0a 20 20 73 71 6c 69 74  ion->p);.  sqlit
1b240 65 33 5f 66 72 65 65 28 70 53 65 73 73 69 6f 6e  e3_free(pSession
1b250 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 66 6f 72 28  ->zName);.  for(
1b260 69 3d 30 3b 20 69 3c 70 53 65 73 73 69 6f 6e 2d  i=0; i<pSession-
1b270 3e 6e 46 69 6c 74 65 72 3b 20 69 2b 2b 29 7b 0a  >nFilter; i++){.
1b280 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
1b290 28 70 53 65 73 73 69 6f 6e 2d 3e 61 7a 46 69 6c  (pSession->azFil
1b2a0 74 65 72 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 73  ter[i]);.  }.  s
1b2b0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 53 65 73  qlite3_free(pSes
1b2c0 73 69 6f 6e 2d 3e 61 7a 46 69 6c 74 65 72 29 3b  sion->azFilter);
1b2d0 0a 20 20 6d 65 6d 73 65 74 28 70 53 65 73 73 69  .  memset(pSessi
1b2e0 6f 6e 2c 20 30 2c 20 73 69 7a 65 6f 66 28 4f 70  on, 0, sizeof(Op
1b2f0 65 6e 53 65 73 73 69 6f 6e 29 29 3b 0a 7d 0a 23  enSession));.}.#
1b300 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f  endif../*.** Clo
1b310 73 65 20 61 6c 6c 20 4f 70 65 6e 53 65 73 73 69  se all OpenSessi
1b320 6f 6e 20 6f 62 6a 65 63 74 73 20 61 6e 64 20 72  on objects and r
1b330 65 6c 65 61 73 65 20 61 6c 6c 20 61 73 73 6f 63  elease all assoc
1b340 69 61 74 65 64 20 72 65 73 6f 75 72 63 65 73 2e  iated resources.
1b350 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28  .*/.#if defined(
1b360 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 45  SQLITE_ENABLE_SE
1b370 53 53 49 4f 4e 29 0a 73 74 61 74 69 63 20 76 6f  SSION).static vo
1b380 69 64 20 73 65 73 73 69 6f 6e 5f 63 6c 6f 73 65  id session_close
1b390 5f 61 6c 6c 28 53 68 65 6c 6c 53 74 61 74 65 20  _all(ShellState 
1b3a0 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  *p){.  int i;.  
1b3b0 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 53  for(i=0; i<p->nS
1b3c0 65 73 73 69 6f 6e 3b 20 69 2b 2b 29 7b 0a 20 20  ession; i++){.  
1b3d0 20 20 73 65 73 73 69 6f 6e 5f 63 6c 6f 73 65 28    session_close(
1b3e0 26 70 2d 3e 61 53 65 73 73 69 6f 6e 5b 69 5d 29  &p->aSession[i])
1b3f0 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6e 53 65 73 73  ;.  }.  p->nSess
1b400 69 6f 6e 20 3d 20 30 3b 0a 7d 0a 23 65 6c 73 65  ion = 0;.}.#else
1b410 0a 23 20 64 65 66 69 6e 65 20 73 65 73 73 69 6f  .# define sessio
1b420 6e 5f 63 6c 6f 73 65 5f 61 6c 6c 28 58 29 0a 23  n_close_all(X).#
1b430 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70  endif../*.** Imp
1b440 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  lementation of t
1b450 68 65 20 78 46 69 6c 74 65 72 20 66 75 6e 63 74  he xFilter funct
1b460 69 6f 6e 20 66 6f 72 20 61 6e 20 6f 70 65 6e 20  ion for an open 
1b470 73 65 73 73 69 6f 6e 2e 20 20 4f 6d 69 74 0a 2a  session.  Omit.*
1b480 2a 20 61 6e 79 20 74 61 62 6c 65 73 20 6e 61 6d  * any tables nam
1b490 65 64 20 62 79 20 22 2e 73 65 73 73 69 6f 6e 20  ed by ".session 
1b4a0 66 69 6c 74 65 72 22 20 62 75 74 20 6c 65 74 20  filter" but let 
1b4b0 61 6c 6c 20 6f 74 68 65 72 20 74 61 62 6c 65 20  all other table 
1b4c0 74 68 72 6f 75 67 68 2e 0a 2a 2f 0a 23 69 66 20  through..*/.#if 
1b4d0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
1b4e0 4e 41 42 4c 45 5f 53 45 53 53 49 4f 4e 29 0a 73  NABLE_SESSION).s
1b4f0 74 61 74 69 63 20 69 6e 74 20 73 65 73 73 69 6f  tatic int sessio
1b500 6e 5f 66 69 6c 74 65 72 28 76 6f 69 64 20 2a 70  n_filter(void *p
1b510 43 74 78 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  Ctx, const char 
1b520 2a 7a 54 61 62 29 7b 0a 20 20 4f 70 65 6e 53 65  *zTab){.  OpenSe
1b530 73 73 69 6f 6e 20 2a 70 53 65 73 73 69 6f 6e 20  ssion *pSession 
1b540 3d 20 28 4f 70 65 6e 53 65 73 73 69 6f 6e 2a 29  = (OpenSession*)
1b550 70 43 74 78 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  pCtx;.  int i;. 
1b560 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53 65 73   for(i=0; i<pSes
1b570 73 69 6f 6e 2d 3e 6e 46 69 6c 74 65 72 3b 20 69  sion->nFilter; i
1b580 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c  ++){.    if( sql
1b590 69 74 65 33 5f 73 74 72 67 6c 6f 62 28 70 53 65  ite3_strglob(pSe
1b5a0 73 73 69 6f 6e 2d 3e 61 7a 46 69 6c 74 65 72 5b  ssion->azFilter[
1b5b0 69 5d 2c 20 7a 54 61 62 29 3d 3d 30 20 29 20 72  i], zTab)==0 ) r
1b5c0 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72  eturn 0;.  }.  r
1b5d0 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69  eturn 1;.}.#endi
1b5e0 66 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20  f../*.** Try to 
1b5f0 64 65 64 75 63 65 20 74 68 65 20 74 79 70 65 20  deduce the type 
1b600 6f 66 20 66 69 6c 65 20 66 6f 72 20 7a 4e 61 6d  of file for zNam
1b610 65 20 62 61 73 65 64 20 6f 6e 20 69 74 73 20 63  e based on its c
1b620 6f 6e 74 65 6e 74 2e 20 20 52 65 74 75 72 6e 0a  ontent.  Return.
1b630 2a 2a 20 6f 6e 65 20 6f 66 20 74 68 65 20 53 48  ** one of the SH
1b640 45 4c 4c 5f 4f 50 45 4e 5f 2a 20 63 6f 6e 73 74  ELL_OPEN_* const
1b650 61 6e 74 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ants..**.** If t
1b660 68 65 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74  he file does not
1b670 20 65 78 69 73 74 20 6f 72 20 69 73 20 65 6d 70   exist or is emp
1b680 74 79 20 62 75 74 20 69 74 73 20 6e 61 6d 65 20  ty but its name 
1b690 6c 6f 6f 6b 73 20 6c 69 6b 65 20 61 20 5a 49 50  looks like a ZIP
1b6a0 0a 2a 2a 20 61 72 63 68 69 76 65 20 61 6e 64 20  .** archive and 
1b6b0 74 68 65 20 64 66 6c 74 5a 69 70 20 66 6c 61 67  the dfltZip flag
1b6c0 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 61   is true, then a
1b6d0 73 73 75 6d 65 20 69 74 20 69 73 20 61 20 5a 49  ssume it is a ZI
1b6e0 50 20 61 72 63 68 69 76 65 2e 0a 2a 2a 20 4f 74  P archive..** Ot
1b6f0 68 65 72 77 69 73 65 2c 20 61 73 73 75 6d 65 20  herwise, assume 
1b700 61 6e 20 6f 72 64 69 6e 61 72 79 20 64 61 74 61  an ordinary data
1b710 62 61 73 65 20 72 65 67 61 72 64 6c 65 73 73 20  base regardless 
1b720 6f 66 20 74 68 65 20 66 69 6c 65 6e 61 6d 65 20  of the filename 
1b730 69 66 0a 2a 2a 20 74 68 65 20 74 79 70 65 20 63  if.** the type c
1b740 61 6e 6e 6f 74 20 62 65 20 64 65 74 65 72 6d 69  annot be determi
1b750 6e 65 64 20 66 72 6f 6d 20 63 6f 6e 74 65 6e 74  ned from content
1b760 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1b770 64 65 64 75 63 65 44 61 74 61 62 61 73 65 54 79  deduceDatabaseTy
1b780 70 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  pe(const char *z
1b790 4e 61 6d 65 2c 20 69 6e 74 20 64 66 6c 74 5a 69  Name, int dfltZi
1b7a0 70 29 7b 0a 20 20 46 49 4c 45 20 2a 66 20 3d 20  p){.  FILE *f = 
1b7b0 66 6f 70 65 6e 28 7a 4e 61 6d 65 2c 20 22 72 62  fopen(zName, "rb
1b7c0 22 29 3b 0a 20 20 73 69 7a 65 5f 74 20 6e 3b 0a  ");.  size_t n;.
1b7d0 20 20 69 6e 74 20 72 63 20 3d 20 53 48 45 4c 4c    int rc = SHELL
1b7e0 5f 4f 50 45 4e 5f 55 4e 53 50 45 43 3b 0a 20 20  _OPEN_UNSPEC;.  
1b7f0 63 68 61 72 20 7a 42 75 66 5b 31 30 30 5d 3b 0a  char zBuf[100];.
1b800 20 20 69 66 28 20 66 3d 3d 30 20 29 7b 0a 20 20    if( f==0 ){.  
1b810 20 20 69 66 28 20 64 66 6c 74 5a 69 70 20 26 26    if( dfltZip &&
1b820 20 73 71 6c 69 74 65 33 5f 73 74 72 6c 69 6b 65   sqlite3_strlike
1b830 28 22 25 2e 7a 69 70 22 2c 7a 4e 61 6d 65 2c 30  ("%.zip",zName,0
1b840 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 48  )==0 ) return SH
1b850 45 4c 4c 5f 4f 50 45 4e 5f 5a 49 50 46 49 4c 45  ELL_OPEN_ZIPFILE
1b860 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 48 45  ;.    return SHE
1b870 4c 4c 5f 4f 50 45 4e 5f 4e 4f 52 4d 41 4c 3b 0a  LL_OPEN_NORMAL;.
1b880 20 20 7d 0a 20 20 66 73 65 65 6b 28 66 2c 20 2d    }.  fseek(f, -
1b890 32 35 2c 20 53 45 45 4b 5f 45 4e 44 29 3b 0a 20  25, SEEK_END);. 
1b8a0 20 6e 20 3d 20 66 72 65 61 64 28 7a 42 75 66 2c   n = fread(zBuf,
1b8b0 20 32 35 2c 20 31 2c 20 66 29 3b 0a 20 20 69 66   25, 1, f);.  if
1b8c0 28 20 6e 3d 3d 31 20 26 26 20 6d 65 6d 63 6d 70  ( n==1 && memcmp
1b8d0 28 7a 42 75 66 2c 20 22 53 74 61 72 74 2d 4f 66  (zBuf, "Start-Of
1b8e0 2d 53 51 4c 69 74 65 33 2d 22 2c 20 31 37 29 3d  -SQLite3-", 17)=
1b8f0 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  =0 ){.    rc = S
1b900 48 45 4c 4c 5f 4f 50 45 4e 5f 41 50 50 45 4e 44  HELL_OPEN_APPEND
1b910 56 46 53 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  VFS;.  }else{.  
1b920 20 20 66 73 65 65 6b 28 66 2c 20 2d 32 32 2c 20    fseek(f, -22, 
1b930 53 45 45 4b 5f 45 4e 44 29 3b 0a 20 20 20 20 6e  SEEK_END);.    n
1b940 20 3d 20 66 72 65 61 64 28 7a 42 75 66 2c 20 32   = fread(zBuf, 2
1b950 32 2c 20 31 2c 20 66 29 3b 0a 20 20 20 20 69 66  2, 1, f);.    if
1b960 28 20 6e 3d 3d 31 20 26 26 20 7a 42 75 66 5b 30  ( n==1 && zBuf[0
1b970 5d 3d 3d 30 78 35 30 20 26 26 20 7a 42 75 66 5b  ]==0x50 && zBuf[
1b980 31 5d 3d 3d 30 78 34 62 20 26 26 20 7a 42 75 66  1]==0x4b && zBuf
1b990 5b 32 5d 3d 3d 30 78 30 35 0a 20 20 20 20 20 20  [2]==0x05.      
1b9a0 20 26 26 20 7a 42 75 66 5b 33 5d 3d 3d 30 78 30   && zBuf[3]==0x0
1b9b0 36 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  6 ){.      rc = 
1b9c0 53 48 45 4c 4c 5f 4f 50 45 4e 5f 5a 49 50 46 49  SHELL_OPEN_ZIPFI
1b9d0 4c 45 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  LE;.    }else if
1b9e0 28 20 6e 3d 3d 30 20 26 26 20 64 66 6c 74 5a 69  ( n==0 && dfltZi
1b9f0 70 20 26 26 20 73 71 6c 69 74 65 33 5f 73 74 72  p && sqlite3_str
1ba00 6c 69 6b 65 28 22 25 2e 7a 69 70 22 2c 7a 4e 61  like("%.zip",zNa
1ba10 6d 65 2c 30 29 3d 3d 30 20 29 7b 0a 20 20 20 20  me,0)==0 ){.    
1ba20 20 20 72 65 74 75 72 6e 20 53 48 45 4c 4c 5f 4f    return SHELL_O
1ba30 50 45 4e 5f 5a 49 50 46 49 4c 45 3b 0a 20 20 20  PEN_ZIPFILE;.   
1ba40 20 7d 0a 20 20 7d 0a 20 20 66 63 6c 6f 73 65 28   }.  }.  fclose(
1ba50 66 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  f);.  return rc;
1ba60 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65    .}../*.** Make
1ba70 20 73 75 72 65 20 74 68 65 20 64 61 74 61 62 61   sure the databa
1ba80 73 65 20 69 73 20 6f 70 65 6e 2e 20 20 49 66 20  se is open.  If 
1ba90 69 74 20 69 73 20 6e 6f 74 2c 20 74 68 65 6e 20  it is not, then 
1baa0 6f 70 65 6e 20 69 74 2e 20 20 49 66 0a 2a 2a 20  open it.  If.** 
1bab0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 61 69  the database fai
1bac0 6c 73 20 74 6f 20 6f 70 65 6e 2c 20 70 72 69 6e  ls to open, prin
1bad0 74 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  t an error messa
1bae0 67 65 20 61 6e 64 20 65 78 69 74 2e 0a 2a 2f 0a  ge and exit..*/.
1baf0 73 74 61 74 69 63 20 76 6f 69 64 20 6f 70 65 6e  static void open
1bb00 5f 64 62 28 53 68 65 6c 6c 53 74 61 74 65 20 2a  _db(ShellState *
1bb10 70 2c 20 69 6e 74 20 6b 65 65 70 41 6c 69 76 65  p, int keepAlive
1bb20 29 7b 0a 20 20 69 66 28 20 70 2d 3e 64 62 3d 3d  ){.  if( p->db==
1bb30 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e  0 ){.    if( p->
1bb40 6f 70 65 6e 4d 6f 64 65 3d 3d 53 48 45 4c 4c 5f  openMode==SHELL_
1bb50 4f 50 45 4e 5f 55 4e 53 50 45 43 20 26 26 20 61  OPEN_UNSPEC && a
1bb60 63 63 65 73 73 28 70 2d 3e 7a 44 62 46 69 6c 65  ccess(p->zDbFile
1bb70 6e 61 6d 65 2c 30 29 3d 3d 30 20 29 7b 0a 20 20  name,0)==0 ){.  
1bb80 20 20 20 20 70 2d 3e 6f 70 65 6e 4d 6f 64 65 20      p->openMode 
1bb90 3d 20 28 75 38 29 64 65 64 75 63 65 44 61 74 61  = (u8)deduceData
1bba0 62 61 73 65 54 79 70 65 28 70 2d 3e 7a 44 62 46  baseType(p->zDbF
1bbb0 69 6c 65 6e 61 6d 65 2c 20 30 29 3b 0a 20 20 20  ilename, 0);.   
1bbc0 20 7d 0a 20 20 20 20 73 77 69 74 63 68 28 20 70   }.    switch( p
1bbd0 2d 3e 6f 70 65 6e 4d 6f 64 65 20 29 7b 0a 20 20  ->openMode ){.  
1bbe0 20 20 20 20 63 61 73 65 20 53 48 45 4c 4c 5f 4f      case SHELL_O
1bbf0 50 45 4e 5f 41 50 50 45 4e 44 56 46 53 3a 20 7b  PEN_APPENDVFS: {
1bc00 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1bc10 5f 6f 70 65 6e 5f 76 32 28 70 2d 3e 7a 44 62 46  _open_v2(p->zDbF
1bc20 69 6c 65 6e 61 6d 65 2c 20 26 70 2d 3e 64 62 2c  ilename, &p->db,
1bc30 20 0a 20 20 20 20 20 20 20 20 20 20 20 53 51 4c   .           SQL
1bc40 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
1bc50 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43  TE|SQLITE_OPEN_C
1bc60 52 45 41 54 45 2c 20 22 61 70 6e 64 76 66 73 22  REATE, "apndvfs"
1bc70 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
1bc80 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1bc90 63 61 73 65 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f  case SHELL_OPEN_
1bca0 5a 49 50 46 49 4c 45 3a 20 7b 0a 20 20 20 20 20  ZIPFILE: {.     
1bcb0 20 20 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28     sqlite3_open(
1bcc0 22 3a 6d 65 6d 6f 72 79 3a 22 2c 20 26 70 2d 3e  ":memory:", &p->
1bcd0 64 62 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  db);.        bre
1bce0 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
1bcf0 20 20 63 61 73 65 20 53 48 45 4c 4c 5f 4f 50 45    case SHELL_OPE
1bd00 4e 5f 52 45 41 44 4f 4e 4c 59 3a 20 7b 0a 20 20  N_READONLY: {.  
1bd10 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6f 70        sqlite3_op
1bd20 65 6e 5f 76 32 28 70 2d 3e 7a 44 62 46 69 6c 65  en_v2(p->zDbFile
1bd30 6e 61 6d 65 2c 20 26 70 2d 3e 64 62 2c 20 53 51  name, &p->db, SQ
1bd40 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e  LITE_OPEN_READON
1bd50 4c 59 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  LY, 0);.        
1bd60 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
1bd70 20 20 20 20 20 63 61 73 65 20 53 48 45 4c 4c 5f       case SHELL_
1bd80 4f 50 45 4e 5f 55 4e 53 50 45 43 3a 0a 20 20 20  OPEN_UNSPEC:.   
1bd90 20 20 20 63 61 73 65 20 53 48 45 4c 4c 5f 4f 50     case SHELL_OP
1bda0 45 4e 5f 4e 4f 52 4d 41 4c 3a 20 7b 0a 20 20 20  EN_NORMAL: {.   
1bdb0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6f 70 65       sqlite3_ope
1bdc0 6e 28 70 2d 3e 7a 44 62 46 69 6c 65 6e 61 6d 65  n(p->zDbFilename
1bdd0 2c 20 26 70 2d 3e 64 62 29 3b 0a 20 20 20 20 20  , &p->db);.     
1bde0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
1bdf0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 67 6c 6f 62  }.    }.    glob
1be00 61 6c 44 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20  alDb = p->db;.  
1be10 20 20 69 66 28 20 70 2d 3e 64 62 3d 3d 30 20 7c    if( p->db==0 |
1be20 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c  | SQLITE_OK!=sql
1be30 69 74 65 33 5f 65 72 72 63 6f 64 65 28 70 2d 3e  ite3_errcode(p->
1be40 64 62 29 20 29 7b 0a 20 20 20 20 20 20 75 74 66  db) ){.      utf
1be50 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  8_printf(stderr,
1be60 22 45 72 72 6f 72 3a 20 75 6e 61 62 6c 65 20 74  "Error: unable t
1be70 6f 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20  o open database 
1be80 5c 22 25 73 5c 22 3a 20 25 73 5c 6e 22 2c 0a 20  \"%s\": %s\n",. 
1be90 20 20 20 20 20 20 20 20 20 70 2d 3e 7a 44 62 46           p->zDbF
1bea0 69 6c 65 6e 61 6d 65 2c 20 73 71 6c 69 74 65 33  ilename, sqlite3
1beb0 5f 65 72 72 6d 73 67 28 70 2d 3e 64 62 29 29 3b  _errmsg(p->db));
1bec0 0a 20 20 20 20 20 20 69 66 28 20 6b 65 65 70 41  .      if( keepA
1bed0 6c 69 76 65 20 29 20 72 65 74 75 72 6e 3b 0a 20  live ) return;. 
1bee0 20 20 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20       exit(1);.  
1bef0 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
1bf00 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54  TE_OMIT_LOAD_EXT
1bf10 45 4e 53 49 4f 4e 0a 20 20 20 20 73 71 6c 69 74  ENSION.    sqlit
1bf20 65 33 5f 65 6e 61 62 6c 65 5f 6c 6f 61 64 5f 65  e3_enable_load_e
1bf30 78 74 65 6e 73 69 6f 6e 28 70 2d 3e 64 62 2c 20  xtension(p->db, 
1bf40 31 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 73  1);.#endif.    s
1bf50 71 6c 69 74 65 33 5f 66 69 6c 65 69 6f 5f 69 6e  qlite3_fileio_in
1bf60 69 74 28 70 2d 3e 64 62 2c 20 30 2c 20 30 29 3b  it(p->db, 0, 0);
1bf70 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 68 61  .    sqlite3_sha
1bf80 74 68 72 65 65 5f 69 6e 69 74 28 70 2d 3e 64 62  three_init(p->db
1bf90 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  , 0, 0);.    sql
1bfa0 69 74 65 33 5f 63 6f 6d 70 6c 65 74 69 6f 6e 5f  ite3_completion_
1bfb0 69 6e 69 74 28 70 2d 3e 64 62 2c 20 30 2c 20 30  init(p->db, 0, 0
1bfc0 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
1bfd0 5f 48 41 56 45 5f 5a 4c 49 42 0a 20 20 20 20 73  _HAVE_ZLIB.    s
1bfe0 71 6c 69 74 65 33 5f 7a 69 70 66 69 6c 65 5f 69  qlite3_zipfile_i
1bff0 6e 69 74 28 70 2d 3e 64 62 2c 20 30 2c 20 30 29  nit(p->db, 0, 0)
1c000 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 71  ;.    sqlite3_sq
1c010 6c 61 72 5f 69 6e 69 74 28 70 2d 3e 64 62 2c 20  lar_init(p->db, 
1c020 30 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20  0, 0);.#endif.  
1c030 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65    sqlite3_create
1c040 5f 66 75 6e 63 74 69 6f 6e 28 70 2d 3e 64 62 2c  _function(p->db,
1c050 20 22 73 68 65 6c 6c 5f 61 64 64 5f 73 63 68 65   "shell_add_sche
1c060 6d 61 22 2c 20 33 2c 20 53 51 4c 49 54 45 5f 55  ma", 3, SQLITE_U
1c070 54 46 38 2c 20 30 2c 0a 20 20 20 20 20 20 20 20  TF8, 0,.        
1c080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c090 20 20 20 20 73 68 65 6c 6c 41 64 64 53 63 68 65      shellAddSche
1c0a0 6d 61 4e 61 6d 65 2c 20 30 2c 20 30 29 3b 0a 20  maName, 0, 0);. 
1c0b0 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74     sqlite3_creat
1c0c0 65 5f 66 75 6e 63 74 69 6f 6e 28 70 2d 3e 64 62  e_function(p->db
1c0d0 2c 20 22 73 68 65 6c 6c 5f 6d 6f 64 75 6c 65 5f  , "shell_module_
1c0e0 73 63 68 65 6d 61 22 2c 20 31 2c 20 53 51 4c 49  schema", 1, SQLI
1c0f0 54 45 5f 55 54 46 38 2c 20 30 2c 0a 20 20 20 20  TE_UTF8, 0,.    
1c100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c110 20 20 20 20 20 20 20 20 73 68 65 6c 6c 4d 6f 64          shellMod
1c120 75 6c 65 53 63 68 65 6d 61 2c 20 30 2c 20 30 29  uleSchema, 0, 0)
1c130 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72  ;.    sqlite3_cr
1c140 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 70 2d  eate_function(p-
1c150 3e 64 62 2c 20 22 73 68 65 6c 6c 5f 70 75 74 73  >db, "shell_puts
1c160 6e 6c 22 2c 20 31 2c 20 53 51 4c 49 54 45 5f 55  nl", 1, SQLITE_U
1c170 54 46 38 2c 20 70 2c 0a 20 20 20 20 20 20 20 20  TF8, p,.        
1c180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c190 20 20 20 20 73 68 65 6c 6c 50 75 74 73 46 75 6e      shellPutsFun
1c1a0 63 2c 20 30 2c 20 30 29 3b 0a 23 69 66 6e 64 65  c, 0, 0);.#ifnde
1c1b0 66 20 53 51 4c 49 54 45 5f 4e 4f 48 41 56 45 5f  f SQLITE_NOHAVE_
1c1c0 53 59 53 54 45 4d 0a 20 20 20 20 73 71 6c 69 74  SYSTEM.    sqlit
1c1d0 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
1c1e0 6f 6e 28 70 2d 3e 64 62 2c 20 22 65 64 69 74 22  on(p->db, "edit"
1c1f0 2c 20 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  , 1, SQLITE_UTF8
1c200 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20  , 0,.           
1c210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c220 20 65 64 69 74 46 75 6e 63 2c 20 30 2c 20 30 29   editFunc, 0, 0)
1c230 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72  ;.    sqlite3_cr
1c240 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 70 2d  eate_function(p-
1c250 3e 64 62 2c 20 22 65 64 69 74 22 2c 20 32 2c 20  >db, "edit", 2, 
1c260 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 0a  SQLITE_UTF8, 0,.
1c270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c280 20 20 20 20 20 20 20 20 20 20 20 20 65 64 69 74              edit
1c290 46 75 6e 63 2c 20 30 2c 20 30 29 3b 0a 23 65 6e  Func, 0, 0);.#en
1c2a0 64 69 66 0a 20 20 20 20 69 66 28 20 70 2d 3e 6f  dif.    if( p->o
1c2b0 70 65 6e 4d 6f 64 65 3d 3d 53 48 45 4c 4c 5f 4f  penMode==SHELL_O
1c2c0 50 45 4e 5f 5a 49 50 46 49 4c 45 20 29 7b 0a 20  PEN_ZIPFILE ){. 
1c2d0 20 20 20 20 20 63 68 61 72 20 2a 7a 53 71 6c 20       char *zSql 
1c2e0 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
1c2f0 66 28 0a 20 20 20 20 20 20 20 20 20 22 43 52 45  f(.         "CRE
1c300 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c  ATE VIRTUAL TABL
1c310 45 20 7a 69 70 20 55 53 49 4e 47 20 7a 69 70 66  E zip USING zipf
1c320 69 6c 65 28 25 51 29 3b 22 2c 20 70 2d 3e 7a 44  ile(%Q);", p->zD
1c330 62 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20  bFilename);.    
1c340 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70    sqlite3_exec(p
1c350 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 30 2c 20 30  ->db, zSql, 0, 0
1c360 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
1c370 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a  te3_free(zSql);.
1c380 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 69 66      }.  }.}..#if
1c390 20 48 41 56 45 5f 52 45 41 44 4c 49 4e 45 20 7c   HAVE_READLINE |
1c3a0 7c 20 48 41 56 45 5f 45 44 49 54 4c 49 4e 45 0a  | HAVE_EDITLINE.
1c3b0 2f 2a 0a 2a 2a 20 52 65 61 64 6c 69 6e 65 20 63  /*.** Readline c
1c3c0 6f 6d 70 6c 65 74 69 6f 6e 20 63 61 6c 6c 62 61  ompletion callba
1c3d0 63 6b 73 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68  cks.*/.static ch
1c3e0 61 72 20 2a 72 65 61 64 6c 69 6e 65 5f 63 6f 6d  ar *readline_com
1c3f0 70 6c 65 74 69 6f 6e 5f 67 65 6e 65 72 61 74 6f  pletion_generato
1c400 72 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 74 65  r(const char *te
1c410 78 74 2c 20 69 6e 74 20 73 74 61 74 65 29 7b 0a  xt, int state){.
1c420 20 20 73 74 61 74 69 63 20 73 71 6c 69 74 65 33    static sqlite3
1c430 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30  _stmt *pStmt = 0
1c440 3b 0a 20 20 63 68 61 72 20 2a 7a 52 65 74 3b 0a  ;.  char *zRet;.
1c450 20 20 69 66 28 20 73 74 61 74 65 3d 3d 30 20 29    if( state==0 )
1c460 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 71 6c  {.    char *zSql
1c470 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69  ;.    sqlite3_fi
1c480 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20  nalize(pStmt);. 
1c490 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65     zSql = sqlite
1c4a0 33 5f 6d 70 72 69 6e 74 66 28 22 53 45 4c 45 43  3_mprintf("SELEC
1c4b0 54 20 44 49 53 54 49 4e 43 54 20 63 61 6e 64 69  T DISTINCT candi
1c4c0 64 61 74 65 20 43 4f 4c 4c 41 54 45 20 6e 6f 63  date COLLATE noc
1c4d0 61 73 65 22 0a 20 20 20 20 20 20 20 20 20 20 20  ase".           
1c4e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c4f0 22 20 20 46 52 4f 4d 20 63 6f 6d 70 6c 65 74 69  "  FROM completi
1c500 6f 6e 28 25 51 29 20 4f 52 44 45 52 20 42 59 20  on(%Q) ORDER BY 
1c510 31 22 2c 20 74 65 78 74 29 3b 0a 20 20 20 20 73  1", text);.    s
1c520 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76  qlite3_prepare_v
1c530 32 28 67 6c 6f 62 61 6c 44 62 2c 20 7a 53 71 6c  2(globalDb, zSql
1c540 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29  , -1, &pStmt, 0)
1c550 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
1c560 65 65 28 7a 53 71 6c 29 3b 0a 20 20 7d 0a 20 20  ee(zSql);.  }.  
1c570 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74 65 70  if( sqlite3_step
1c580 28 70 53 74 6d 74 29 3d 3d 53 51 4c 49 54 45 5f  (pStmt)==SQLITE_
1c590 52 4f 57 20 29 7b 0a 20 20 20 20 7a 52 65 74 20  ROW ){.    zRet 
1c5a0 3d 20 73 74 72 64 75 70 28 28 63 6f 6e 73 74 20  = strdup((const 
1c5b0 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f  char*)sqlite3_co
1c5c0 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c  lumn_text(pStmt,
1c5d0 20 30 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   0));.  }else{. 
1c5e0 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c     sqlite3_final
1c5f0 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20  ize(pStmt);.    
1c600 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 7a  pStmt = 0;.    z
1c610 52 65 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72  Ret = 0;.  }.  r
1c620 65 74 75 72 6e 20 7a 52 65 74 3b 0a 7d 0a 73 74  eturn zRet;.}.st
1c630 61 74 69 63 20 63 68 61 72 20 2a 2a 72 65 61 64  atic char **read
1c640 6c 69 6e 65 5f 63 6f 6d 70 6c 65 74 69 6f 6e 28  line_completion(
1c650 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 65 78  const char *zTex
1c660 74 2c 20 69 6e 74 20 69 53 74 61 72 74 2c 20 69  t, int iStart, i
1c670 6e 74 20 69 45 6e 64 29 7b 0a 20 20 72 6c 5f 61  nt iEnd){.  rl_a
1c680 74 74 65 6d 70 74 65 64 5f 63 6f 6d 70 6c 65 74  ttempted_complet
1c690 69 6f 6e 5f 6f 76 65 72 20 3d 20 31 3b 0a 20 20  ion_over = 1;.  
1c6a0 72 65 74 75 72 6e 20 72 6c 5f 63 6f 6d 70 6c 65  return rl_comple
1c6b0 74 69 6f 6e 5f 6d 61 74 63 68 65 73 28 7a 54 65  tion_matches(zTe
1c6c0 78 74 2c 20 72 65 61 64 6c 69 6e 65 5f 63 6f 6d  xt, readline_com
1c6d0 70 6c 65 74 69 6f 6e 5f 67 65 6e 65 72 61 74 6f  pletion_generato
1c6e0 72 29 3b 0a 7d 0a 0a 23 65 6c 69 66 20 48 41 56  r);.}..#elif HAV
1c6f0 45 5f 4c 49 4e 45 4e 4f 49 53 45 0a 2f 2a 0a 2a  E_LINENOISE./*.*
1c700 2a 20 4c 69 6e 65 6e 6f 69 73 65 20 63 6f 6d 70  * Linenoise comp
1c710 6c 65 74 69 6f 6e 20 63 61 6c 6c 62 61 63 6b 0a  letion callback.
1c720 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6c  */.static void l
1c730 69 6e 65 6e 6f 69 73 65 5f 63 6f 6d 70 6c 65 74  inenoise_complet
1c740 69 6f 6e 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  ion(const char *
1c750 7a 4c 69 6e 65 2c 20 6c 69 6e 65 6e 6f 69 73 65  zLine, linenoise
1c760 43 6f 6d 70 6c 65 74 69 6f 6e 73 20 2a 6c 63 29  Completions *lc)
1c770 7b 0a 20 20 69 6e 74 20 6e 4c 69 6e 65 20 3d 20  {.  int nLine = 
1c780 73 74 72 6c 65 6e 33 30 28 7a 4c 69 6e 65 29 3b  strlen30(zLine);
1c790 0a 20 20 69 6e 74 20 69 2c 20 69 53 74 61 72 74  .  int i, iStart
1c7a0 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  ;.  sqlite3_stmt
1c7b0 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 63   *pStmt = 0;.  c
1c7c0 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 63 68 61  har *zSql;.  cha
1c7d0 72 20 7a 42 75 66 5b 31 30 30 30 5d 3b 0a 0a 20  r zBuf[1000];.. 
1c7e0 20 69 66 28 20 6e 4c 69 6e 65 3e 73 69 7a 65 6f   if( nLine>sizeo
1c7f0 66 28 7a 42 75 66 29 2d 33 30 20 29 20 72 65 74  f(zBuf)-30 ) ret
1c800 75 72 6e 3b 0a 20 20 69 66 28 20 7a 4c 69 6e 65  urn;.  if( zLine
1c810 5b 30 5d 3d 3d 27 2e 27 20 29 20 72 65 74 75 72  [0]=='.' ) retur
1c820 6e 3b 0a 20 20 66 6f 72 28 69 3d 6e 4c 69 6e 65  n;.  for(i=nLine
1c830 2d 31 3b 20 69 3e 3d 30 20 26 26 20 28 69 73 61  -1; i>=0 && (isa
1c840 6c 6e 75 6d 28 7a 4c 69 6e 65 5b 69 5d 29 20 7c  lnum(zLine[i]) |
1c850 7c 20 7a 4c 69 6e 65 5b 69 5d 3d 3d 27 5f 27 29  | zLine[i]=='_')
1c860 3b 20 69 2d 2d 29 7b 7d 0a 20 20 69 66 28 20 69  ; i--){}.  if( i
1c870 3d 3d 6e 4c 69 6e 65 2d 31 20 29 20 72 65 74 75  ==nLine-1 ) retu
1c880 72 6e 3b 0a 20 20 69 53 74 61 72 74 20 3d 20 69  rn;.  iStart = i
1c890 2b 31 3b 0a 20 20 6d 65 6d 63 70 79 28 7a 42 75  +1;.  memcpy(zBu
1c8a0 66 2c 20 7a 4c 69 6e 65 2c 20 69 53 74 61 72 74  f, zLine, iStart
1c8b0 29 3b 0a 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69  );.  zSql = sqli
1c8c0 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 53 45 4c  te3_mprintf("SEL
1c8d0 45 43 54 20 44 49 53 54 49 4e 43 54 20 63 61 6e  ECT DISTINCT can
1c8e0 64 69 64 61 74 65 20 43 4f 4c 4c 41 54 45 20 6e  didate COLLATE n
1c8f0 6f 63 61 73 65 22 0a 20 20 20 20 20 20 20 20 20  ocase".         
1c900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c910 22 20 20 46 52 4f 4d 20 63 6f 6d 70 6c 65 74 69  "  FROM completi
1c920 6f 6e 28 25 51 2c 25 51 29 20 4f 52 44 45 52 20  on(%Q,%Q) ORDER 
1c930 42 59 20 31 22 2c 0a 20 20 20 20 20 20 20 20 20  BY 1",.         
1c940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c950 26 7a 4c 69 6e 65 5b 69 53 74 61 72 74 5d 2c 20  &zLine[iStart], 
1c960 7a 4c 69 6e 65 29 3b 0a 20 20 73 71 6c 69 74 65  zLine);.  sqlite
1c970 33 5f 70 72 65 70 61 72 65 5f 76 32 28 67 6c 6f  3_prepare_v2(glo
1c980 62 61 6c 44 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c  balDb, zSql, -1,
1c990 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 73   &pStmt, 0);.  s
1c9a0 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c  qlite3_free(zSql
1c9b0 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 65 78 65  );.  sqlite3_exe
1c9c0 63 28 67 6c 6f 62 61 6c 44 62 2c 20 22 50 52 41  c(globalDb, "PRA
1c9d0 47 4d 41 20 70 61 67 65 5f 63 6f 75 6e 74 22 2c  GMA page_count",
1c9e0 20 30 2c 20 30 2c 20 30 29 3b 20 2f 2a 20 4c 6f   0, 0, 0); /* Lo
1c9f0 61 64 20 74 68 65 20 73 63 68 65 6d 61 20 2a 2f  ad the schema */
1ca00 0a 20 20 77 68 69 6c 65 28 20 73 71 6c 69 74 65  .  while( sqlite
1ca10 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3d 3d 53  3_step(pStmt)==S
1ca20 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20  QLITE_ROW ){.   
1ca30 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f   const char *zCo
1ca40 6d 70 6c 65 74 69 6f 6e 20 3d 20 28 63 6f 6e 73  mpletion = (cons
1ca50 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f  t char*)sqlite3_
1ca60 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d  column_text(pStm
1ca70 74 2c 20 30 29 3b 0a 20 20 20 20 69 6e 74 20 6e  t, 0);.    int n
1ca80 43 6f 6d 70 6c 65 74 69 6f 6e 20 3d 20 73 71 6c  Completion = sql
1ca90 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65  ite3_column_byte
1caa0 73 28 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20  s(pStmt, 0);.   
1cab0 20 69 66 28 20 69 53 74 61 72 74 2b 6e 43 6f 6d   if( iStart+nCom
1cac0 70 6c 65 74 69 6f 6e 20 3c 20 73 69 7a 65 6f 66  pletion < sizeof
1cad0 28 7a 42 75 66 29 2d 31 20 29 7b 0a 20 20 20 20  (zBuf)-1 ){.    
1cae0 20 20 6d 65 6d 63 70 79 28 7a 42 75 66 2b 69 53    memcpy(zBuf+iS
1caf0 74 61 72 74 2c 20 7a 43 6f 6d 70 6c 65 74 69 6f  tart, zCompletio
1cb00 6e 2c 20 6e 43 6f 6d 70 6c 65 74 69 6f 6e 2b 31  n, nCompletion+1
1cb10 29 3b 0a 20 20 20 20 20 20 6c 69 6e 65 6e 6f 69  );.      linenoi
1cb20 73 65 41 64 64 43 6f 6d 70 6c 65 74 69 6f 6e 28  seAddCompletion(
1cb30 6c 63 2c 20 7a 42 75 66 29 3b 0a 20 20 20 20 7d  lc, zBuf);.    }
1cb40 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66  .  }.  sqlite3_f
1cb50 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a  inalize(pStmt);.
1cb60 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
1cb70 44 6f 20 43 2d 6c 61 6e 67 75 61 67 65 20 73 74  Do C-language st
1cb80 79 6c 65 20 64 65 71 75 6f 74 69 6e 67 2e 0a 2a  yle dequoting..*
1cb90 2a 0a 2a 2a 20 20 20 20 5c 61 20 20 20 20 2d 3e  *.**    \a    ->
1cba0 20 61 6c 61 72 6d 0a 2a 2a 20 20 20 20 5c 62 20   alarm.**    \b 
1cbb0 20 20 20 2d 3e 20 62 61 63 6b 73 70 61 63 65 0a     -> backspace.
1cbc0 2a 2a 20 20 20 20 5c 74 20 20 20 20 2d 3e 20 74  **    \t    -> t
1cbd0 61 62 0a 2a 2a 20 20 20 20 5c 6e 20 20 20 20 2d  ab.**    \n    -
1cbe0 3e 20 6e 65 77 6c 69 6e 65 0a 2a 2a 20 20 20 20  > newline.**    
1cbf0 5c 76 20 20 20 20 2d 3e 20 76 65 72 74 69 63 61  \v    -> vertica
1cc00 6c 20 74 61 62 0a 2a 2a 20 20 20 20 5c 66 20 20  l tab.**    \f  
1cc10 20 20 2d 3e 20 66 6f 72 6d 20 66 65 65 64 0a 2a    -> form feed.*
1cc20 2a 20 20 20 20 5c 72 20 20 20 20 2d 3e 20 63 61  *    \r    -> ca
1cc30 72 72 69 61 67 65 20 72 65 74 75 72 6e 0a 2a 2a  rriage return.**
1cc40 20 20 20 20 5c 73 20 20 20 20 2d 3e 20 73 70 61      \s    -> spa
1cc50 63 65 0a 2a 2a 20 20 20 20 5c 22 20 20 20 20 2d  ce.**    \"    -
1cc60 3e 20 22 0a 2a 2a 20 20 20 20 5c 27 20 20 20 20  > ".**    \'    
1cc70 2d 3e 20 27 0a 2a 2a 20 20 20 20 5c 5c 20 20 20  -> '.**    \\   
1cc80 20 2d 3e 20 62 61 63 6b 73 6c 61 73 68 0a 2a 2a   -> backslash.**
1cc90 20 20 20 20 5c 4e 4e 4e 20 20 2d 3e 20 61 73 63      \NNN  -> asc
1cca0 69 69 20 63 68 61 72 61 63 74 65 72 20 4e 4e 4e  ii character NNN
1ccb0 20 69 6e 20 6f 63 74 61 6c 0a 2a 2f 0a 73 74 61   in octal.*/.sta
1ccc0 74 69 63 20 76 6f 69 64 20 72 65 73 6f 6c 76 65  tic void resolve
1ccd0 5f 62 61 63 6b 73 6c 61 73 68 65 73 28 63 68 61  _backslashes(cha
1cce0 72 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 69 2c 20  r *z){.  int i, 
1ccf0 6a 3b 0a 20 20 63 68 61 72 20 63 3b 0a 20 20 77  j;.  char c;.  w
1cd00 68 69 6c 65 28 20 2a 7a 20 26 26 20 2a 7a 21 3d  hile( *z && *z!=
1cd10 27 5c 5c 27 20 29 20 7a 2b 2b 3b 0a 20 20 66 6f  '\\' ) z++;.  fo
1cd20 72 28 69 3d 6a 3d 30 3b 20 28 63 20 3d 20 7a 5b  r(i=j=0; (c = z[
1cd30 69 5d 29 21 3d 30 3b 20 69 2b 2b 2c 20 6a 2b 2b  i])!=0; i++, j++
1cd40 29 7b 0a 20 20 20 20 69 66 28 20 63 3d 3d 27 5c  ){.    if( c=='\
1cd50 5c 27 20 26 26 20 7a 5b 69 2b 31 5d 21 3d 30 20  \' && z[i+1]!=0 
1cd60 29 7b 0a 20 20 20 20 20 20 63 20 3d 20 7a 5b 2b  ){.      c = z[+
1cd70 2b 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 63  +i];.      if( c
1cd80 3d 3d 27 61 27 20 29 7b 0a 20 20 20 20 20 20 20  =='a' ){.       
1cd90 20 63 20 3d 20 27 5c 61 27 3b 0a 20 20 20 20 20   c = '\a';.     
1cda0 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 62   }else if( c=='b
1cdb0 27 20 29 7b 0a 20 20 20 20 20 20 20 20 63 20 3d  ' ){.        c =
1cdc0 20 27 5c 62 27 3b 0a 20 20 20 20 20 20 7d 65 6c   '\b';.      }el
1cdd0 73 65 20 69 66 28 20 63 3d 3d 27 74 27 20 29 7b  se if( c=='t' ){
1cde0 0a 20 20 20 20 20 20 20 20 63 20 3d 20 27 5c 74  .        c = '\t
1cdf0 27 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  ';.      }else i
1ce00 66 28 20 63 3d 3d 27 6e 27 20 29 7b 0a 20 20 20  f( c=='n' ){.   
1ce10 20 20 20 20 20 63 20 3d 20 27 5c 6e 27 3b 0a 20       c = '\n';. 
1ce20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63       }else if( c
1ce30 3d 3d 27 76 27 20 29 7b 0a 20 20 20 20 20 20 20  =='v' ){.       
1ce40 20 63 20 3d 20 27 5c 76 27 3b 0a 20 20 20 20 20   c = '\v';.     
1ce50 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 66   }else if( c=='f
1ce60 27 20 29 7b 0a 20 20 20 20 20 20 20 20 63 20 3d  ' ){.        c =
1ce70 20 27 5c 66 27 3b 0a 20 20 20 20 20 20 7d 65 6c   '\f';.      }el
1ce80 73 65 20 69 66 28 20 63 3d 3d 27 72 27 20 29 7b  se if( c=='r' ){
1ce90 0a 20 20 20 20 20 20 20 20 63 20 3d 20 27 5c 72  .        c = '\r
1cea0 27 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  ';.      }else i
1ceb0 66 28 20 63 3d 3d 27 22 27 20 29 7b 0a 20 20 20  f( c=='"' ){.   
1cec0 20 20 20 20 20 63 20 3d 20 27 22 27 3b 0a 20 20       c = '"';.  
1ced0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d      }else if( c=
1cee0 3d 27 5c 27 27 20 29 7b 0a 20 20 20 20 20 20 20  ='\'' ){.       
1cef0 20 63 20 3d 20 27 5c 27 27 3b 0a 20 20 20 20 20   c = '\'';.     
1cf00 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 5c   }else if( c=='\
1cf10 5c 27 20 29 7b 0a 20 20 20 20 20 20 20 20 63 20  \' ){.        c 
1cf20 3d 20 27 5c 5c 27 3b 0a 20 20 20 20 20 20 7d 65  = '\\';.      }e
1cf30 6c 73 65 20 69 66 28 20 63 3e 3d 27 30 27 20 26  lse if( c>='0' &
1cf40 26 20 63 3c 3d 27 37 27 20 29 7b 0a 20 20 20 20  & c<='7' ){.    
1cf50 20 20 20 20 63 20 2d 3d 20 27 30 27 3b 0a 20 20      c -= '0';.  
1cf60 20 20 20 20 20 20 69 66 28 20 7a 5b 69 2b 31 5d        if( z[i+1]
1cf70 3e 3d 27 30 27 20 26 26 20 7a 5b 69 2b 31 5d 3c  >='0' && z[i+1]<
1cf80 3d 27 37 27 20 29 7b 0a 20 20 20 20 20 20 20 20  ='7' ){.        
1cf90 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20    i++;.         
1cfa0 20 63 20 3d 20 28 63 3c 3c 33 29 20 2b 20 7a 5b   c = (c<<3) + z[
1cfb0 69 5d 20 2d 20 27 30 27 3b 0a 20 20 20 20 20 20  i] - '0';.      
1cfc0 20 20 20 20 69 66 28 20 7a 5b 69 2b 31 5d 3e 3d      if( z[i+1]>=
1cfd0 27 30 27 20 26 26 20 7a 5b 69 2b 31 5d 3c 3d 27  '0' && z[i+1]<='
1cfe0 37 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  7' ){.          
1cff0 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20    i++;.         
1d000 20 20 20 63 20 3d 20 28 63 3c 3c 33 29 20 2b 20     c = (c<<3) + 
1d010 7a 5b 69 5d 20 2d 20 27 30 27 3b 0a 20 20 20 20  z[i] - '0';.    
1d020 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1d030 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
1d040 20 20 20 20 7a 5b 6a 5d 20 3d 20 63 3b 0a 20 20      z[j] = c;.  
1d050 7d 0a 20 20 69 66 28 20 6a 3c 69 20 29 20 7a 5b  }.  if( j<i ) z[
1d060 6a 5d 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  j] = 0;.}../*.**
1d070 20 49 6e 74 65 72 70 72 65 74 20 7a 41 72 67 20   Interpret zArg 
1d080 61 73 20 65 69 74 68 65 72 20 61 6e 20 69 6e 74  as either an int
1d090 65 67 65 72 20 6f 72 20 61 20 62 6f 6f 6c 65 61  eger or a boolea
1d0a0 6e 20 76 61 6c 75 65 2e 20 20 52 65 74 75 72 6e  n value.  Return
1d0b0 20 31 20 6f 72 20 30 0a 2a 2a 20 66 6f 72 20 54   1 or 0.** for T
1d0c0 52 55 45 20 61 6e 64 20 46 41 4c 53 45 2e 20 20  RUE and FALSE.  
1d0d0 52 65 74 75 72 6e 20 74 68 65 20 69 6e 74 65 67  Return the integ
1d0e0 65 72 20 76 61 6c 75 65 20 69 66 20 61 70 70 72  er value if appr
1d0f0 6f 70 72 69 61 74 65 2e 0a 2a 2f 0a 73 74 61 74  opriate..*/.stat
1d100 69 63 20 69 6e 74 20 62 6f 6f 6c 65 61 6e 56 61  ic int booleanVa
1d110 6c 75 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  lue(const char *
1d120 7a 41 72 67 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  zArg){.  int i;.
1d130 20 20 69 66 28 20 7a 41 72 67 5b 30 5d 3d 3d 27    if( zArg[0]=='
1d140 30 27 20 26 26 20 7a 41 72 67 5b 31 5d 3d 3d 27  0' && zArg[1]=='
1d150 78 27 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d  x' ){.    for(i=
1d160 32 3b 20 68 65 78 44 69 67 69 74 56 61 6c 75 65  2; hexDigitValue
1d170 28 7a 41 72 67 5b 69 5d 29 3e 3d 30 3b 20 69 2b  (zArg[i])>=0; i+
1d180 2b 29 7b 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  +){}.  }else{.  
1d190 20 20 66 6f 72 28 69 3d 30 3b 20 7a 41 72 67 5b    for(i=0; zArg[
1d1a0 69 5d 3e 3d 27 30 27 20 26 26 20 7a 41 72 67 5b  i]>='0' && zArg[
1d1b0 69 5d 3c 3d 27 39 27 3b 20 69 2b 2b 29 7b 7d 0a  i]<='9'; i++){}.
1d1c0 20 20 7d 0a 20 20 69 66 28 20 69 3e 30 20 26 26    }.  if( i>0 &&
1d1d0 20 7a 41 72 67 5b 69 5d 3d 3d 30 20 29 20 72 65   zArg[i]==0 ) re
1d1e0 74 75 72 6e 20 28 69 6e 74 29 28 69 6e 74 65 67  turn (int)(integ
1d1f0 65 72 56 61 6c 75 65 28 7a 41 72 67 29 20 26 20  erValue(zArg) & 
1d200 30 78 66 66 66 66 66 66 66 66 29 3b 0a 20 20 69  0xffffffff);.  i
1d210 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63  f( sqlite3_stric
1d220 6d 70 28 7a 41 72 67 2c 20 22 6f 6e 22 29 3d 3d  mp(zArg, "on")==
1d230 30 20 7c 7c 20 73 71 6c 69 74 65 33 5f 73 74 72  0 || sqlite3_str
1d240 69 63 6d 70 28 7a 41 72 67 2c 22 79 65 73 22 29  icmp(zArg,"yes")
1d250 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
1d260 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73  n 1;.  }.  if( s
1d270 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28 7a  qlite3_stricmp(z
1d280 41 72 67 2c 20 22 6f 66 66 22 29 3d 3d 30 20 7c  Arg, "off")==0 |
1d290 7c 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d  | sqlite3_stricm
1d2a0 70 28 7a 41 72 67 2c 22 6e 6f 22 29 3d 3d 30 20  p(zArg,"no")==0 
1d2b0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
1d2c0 0a 20 20 7d 0a 20 20 75 74 66 38 5f 70 72 69 6e  .  }.  utf8_prin
1d2d0 74 66 28 73 74 64 65 72 72 2c 20 22 45 52 52 4f  tf(stderr, "ERRO
1d2e0 52 3a 20 4e 6f 74 20 61 20 62 6f 6f 6c 65 61 6e  R: Not a boolean
1d2f0 20 76 61 6c 75 65 3a 20 5c 22 25 73 5c 22 2e 20   value: \"%s\". 
1d300 41 73 73 75 6d 69 6e 67 20 5c 22 6e 6f 5c 22 2e  Assuming \"no\".
1d310 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 7a  \n",.          z
1d320 41 72 67 29 3b 0a 20 20 72 65 74 75 72 6e 20 30  Arg);.  return 0
1d330 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 6f  ;.}../*.** Set o
1d340 72 20 63 6c 65 61 72 20 61 20 73 68 65 6c 6c 20  r clear a shell 
1d350 66 6c 61 67 20 61 63 63 6f 72 64 69 6e 67 20 74  flag according t
1d360 6f 20 61 20 62 6f 6f 6c 65 61 6e 20 76 61 6c 75  o a boolean valu
1d370 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
1d380 64 20 73 65 74 4f 72 43 6c 65 61 72 46 6c 61 67  d setOrClearFlag
1d390 28 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 2c 20  (ShellState *p, 
1d3a0 75 6e 73 69 67 6e 65 64 20 6d 46 6c 61 67 2c 20  unsigned mFlag, 
1d3b0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 72 67  const char *zArg
1d3c0 29 7b 0a 20 20 69 66 28 20 62 6f 6f 6c 65 61 6e  ){.  if( boolean
1d3d0 56 61 6c 75 65 28 7a 41 72 67 29 20 29 7b 0a 20  Value(zArg) ){. 
1d3e0 20 20 20 53 68 65 6c 6c 53 65 74 46 6c 61 67 28     ShellSetFlag(
1d3f0 70 2c 20 6d 46 6c 61 67 29 3b 0a 20 20 7d 65 6c  p, mFlag);.  }el
1d400 73 65 7b 0a 20 20 20 20 53 68 65 6c 6c 43 6c 65  se{.    ShellCle
1d410 61 72 46 6c 61 67 28 70 2c 20 6d 46 6c 61 67 29  arFlag(p, mFlag)
1d420 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  ;.  }.}../*.** C
1d430 6c 6f 73 65 20 61 6e 20 6f 75 74 70 75 74 20 66  lose an output f
1d440 69 6c 65 2c 20 61 73 73 75 6d 69 6e 67 20 69 74  ile, assuming it
1d450 20 69 73 20 6e 6f 74 20 73 74 64 65 72 72 20 6f   is not stderr o
1d460 72 20 73 74 64 6f 75 74 0a 2a 2f 0a 73 74 61 74  r stdout.*/.stat
1d470 69 63 20 76 6f 69 64 20 6f 75 74 70 75 74 5f 66  ic void output_f
1d480 69 6c 65 5f 63 6c 6f 73 65 28 46 49 4c 45 20 2a  ile_close(FILE *
1d490 66 29 7b 0a 20 20 69 66 28 20 66 20 26 26 20 66  f){.  if( f && f
1d4a0 21 3d 73 74 64 6f 75 74 20 26 26 20 66 21 3d 73  !=stdout && f!=s
1d4b0 74 64 65 72 72 20 29 20 66 63 6c 6f 73 65 28 66  tderr ) fclose(f
1d4c0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20  );.}../*.** Try 
1d4d0 74 6f 20 6f 70 65 6e 20 61 6e 20 6f 75 74 70 75  to open an outpu
1d4e0 74 20 66 69 6c 65 2e 20 20 20 54 68 65 20 6e 61  t file.   The na
1d4f0 6d 65 73 20 22 73 74 64 6f 75 74 22 20 61 6e 64  mes "stdout" and
1d500 20 22 73 74 64 65 72 72 22 20 61 72 65 0a 2a 2a   "stderr" are.**
1d510 20 72 65 63 6f 67 6e 69 7a 65 64 20 61 6e 64 20   recognized and 
1d520 64 6f 20 74 68 65 20 72 69 67 68 74 20 74 68 69  do the right thi
1d530 6e 67 2e 20 20 4e 55 4c 4c 20 69 73 20 72 65 74  ng.  NULL is ret
1d540 75 72 6e 65 64 20 69 66 20 74 68 65 20 6f 75 74  urned if the out
1d550 70 75 74 0a 2a 2a 20 66 69 6c 65 6e 61 6d 65 20  put.** filename 
1d560 69 73 20 22 6f 66 66 22 2e 0a 2a 2f 0a 73 74 61  is "off"..*/.sta
1d570 74 69 63 20 46 49 4c 45 20 2a 6f 75 74 70 75 74  tic FILE *output
1d580 5f 66 69 6c 65 5f 6f 70 65 6e 28 63 6f 6e 73 74  _file_open(const
1d590 20 63 68 61 72 20 2a 7a 46 69 6c 65 2c 20 69 6e   char *zFile, in
1d5a0 74 20 62 54 65 78 74 4d 6f 64 65 29 7b 0a 20 20  t bTextMode){.  
1d5b0 46 49 4c 45 20 2a 66 3b 0a 20 20 69 66 28 20 73  FILE *f;.  if( s
1d5c0 74 72 63 6d 70 28 7a 46 69 6c 65 2c 22 73 74 64  trcmp(zFile,"std
1d5d0 6f 75 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  out")==0 ){.    
1d5e0 66 20 3d 20 73 74 64 6f 75 74 3b 0a 20 20 7d 65  f = stdout;.  }e
1d5f0 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a  lse if( strcmp(z
1d600 46 69 6c 65 2c 20 22 73 74 64 65 72 72 22 29 3d  File, "stderr")=
1d610 3d 30 20 29 7b 0a 20 20 20 20 66 20 3d 20 73 74  =0 ){.    f = st
1d620 64 65 72 72 3b 0a 20 20 7d 65 6c 73 65 20 69 66  derr;.  }else if
1d630 28 20 73 74 72 63 6d 70 28 7a 46 69 6c 65 2c 20  ( strcmp(zFile, 
1d640 22 6f 66 66 22 29 3d 3d 30 20 29 7b 0a 20 20 20  "off")==0 ){.   
1d650 20 66 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b   f = 0;.  }else{
1d660 0a 20 20 20 20 66 20 3d 20 66 6f 70 65 6e 28 7a  .    f = fopen(z
1d670 46 69 6c 65 2c 20 62 54 65 78 74 4d 6f 64 65 20  File, bTextMode 
1d680 3f 20 22 77 22 20 3a 20 22 77 62 22 29 3b 0a 20  ? "w" : "wb");. 
1d690 20 20 20 69 66 28 20 66 3d 3d 30 20 29 7b 0a 20     if( f==0 ){. 
1d6a0 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
1d6b0 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a  (stderr, "Error:
1d6c0 20 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 5c 22 25   cannot open \"%
1d6d0 73 5c 22 5c 6e 22 2c 20 7a 46 69 6c 65 29 3b 0a  s\"\n", zFile);.
1d6e0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
1d6f0 72 6e 20 66 3b 0a 7d 0a 0a 23 69 66 20 21 64 65  rn f;.}..#if !de
1d700 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
1d710 54 5f 54 52 41 43 45 29 20 26 26 20 21 64 65 66  T_TRACE) && !def
1d720 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
1d730 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 29  _FLOATING_POINT)
1d740 0a 2f 2a 0a 2a 2a 20 41 20 72 6f 75 74 69 6e 65  ./*.** A routine
1d750 20 66 6f 72 20 68 61 6e 64 6c 69 6e 67 20 6f 75   for handling ou
1d760 74 70 75 74 20 66 72 6f 6d 20 73 71 6c 69 74 65  tput from sqlite
1d770 33 5f 74 72 61 63 65 28 29 2e 0a 2a 2f 0a 73 74  3_trace()..*/.st
1d780 61 74 69 63 20 69 6e 74 20 73 71 6c 5f 74 72 61  atic int sql_tra
1d790 63 65 5f 63 61 6c 6c 62 61 63 6b 28 0a 20 20 75  ce_callback(.  u
1d7a0 6e 73 69 67 6e 65 64 20 6d 54 79 70 65 2c 0a 20  nsigned mType,. 
1d7b0 20 76 6f 69 64 20 2a 70 41 72 67 2c 0a 20 20 76   void *pArg,.  v
1d7c0 6f 69 64 20 2a 70 50 2c 0a 20 20 76 6f 69 64 20  oid *pP,.  void 
1d7d0 2a 70 58 0a 29 7b 0a 20 20 46 49 4c 45 20 2a 66  *pX.){.  FILE *f
1d7e0 20 3d 20 28 46 49 4c 45 2a 29 70 41 72 67 3b 0a   = (FILE*)pArg;.
1d7f0 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
1d800 45 52 28 6d 54 79 70 65 29 3b 0a 20 20 55 4e 55  ER(mType);.  UNU
1d810 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 50  SED_PARAMETER(pP
1d820 29 3b 0a 20 20 69 66 28 20 66 20 29 7b 0a 20 20  );.  if( f ){.  
1d830 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20    const char *z 
1d840 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 70  = (const char*)p
1d850 58 3b 0a 20 20 20 20 69 6e 74 20 69 20 3d 20 73  X;.    int i = s
1d860 74 72 6c 65 6e 33 30 28 7a 29 3b 0a 20 20 20 20  trlen30(z);.    
1d870 77 68 69 6c 65 28 20 69 3e 30 20 26 26 20 7a 5b  while( i>0 && z[
1d880 69 2d 31 5d 3d 3d 27 3b 27 20 29 7b 20 69 2d 2d  i-1]==';' ){ i--
1d890 3b 20 7d 0a 20 20 20 20 75 74 66 38 5f 70 72 69  ; }.    utf8_pri
1d8a0 6e 74 66 28 66 2c 20 22 25 2e 2a 73 3b 5c 6e 22  ntf(f, "%.*s;\n"
1d8b0 2c 20 69 2c 20 7a 29 3b 0a 20 20 7d 0a 20 20 72  , i, z);.  }.  r
1d8c0 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69  eturn 0;.}.#endi
1d8d0 66 0a 0a 2f 2a 0a 2a 2a 20 41 20 6e 6f 2d 6f 70  f../*.** A no-op
1d8e0 20 72 6f 75 74 69 6e 65 20 74 68 61 74 20 72 75   routine that ru
1d8f0 6e 73 20 77 69 74 68 20 74 68 65 20 22 2e 62 72  ns with the ".br
1d900 65 61 6b 70 6f 69 6e 74 22 20 64 6f 63 2d 63 6f  eakpoint" doc-co
1d910 6d 6d 61 6e 64 2e 20 20 54 68 69 73 20 69 73 0a  mmand.  This is.
1d920 2a 2a 20 61 20 75 73 65 66 75 6c 20 73 70 6f 74  ** a useful spot
1d930 20 74 6f 20 73 65 74 20 61 20 64 65 62 75 67 67   to set a debugg
1d940 65 72 20 62 72 65 61 6b 70 6f 69 6e 74 2e 0a 2a  er breakpoint..*
1d950 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74 65  /.static void te
1d960 73 74 5f 62 72 65 61 6b 70 6f 69 6e 74 28 76 6f  st_breakpoint(vo
1d970 69 64 29 7b 0a 20 20 73 74 61 74 69 63 20 69 6e  id){.  static in
1d980 74 20 6e 43 61 6c 6c 20 3d 20 30 3b 0a 20 20 6e  t nCall = 0;.  n
1d990 43 61 6c 6c 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Call++;.}../*.**
1d9a0 20 41 6e 20 6f 62 6a 65 63 74 20 75 73 65 64 20   An object used 
1d9b0 74 6f 20 72 65 61 64 20 61 20 43 53 56 20 61 6e  to read a CSV an
1d9c0 64 20 6f 74 68 65 72 20 66 69 6c 65 73 20 66 6f  d other files fo
1d9d0 72 20 69 6d 70 6f 72 74 2e 0a 2a 2f 0a 74 79 70  r import..*/.typ
1d9e0 65 64 65 66 20 73 74 72 75 63 74 20 49 6d 70 6f  edef struct Impo
1d9f0 72 74 43 74 78 20 49 6d 70 6f 72 74 43 74 78 3b  rtCtx ImportCtx;
1da00 0a 73 74 72 75 63 74 20 49 6d 70 6f 72 74 43 74  .struct ImportCt
1da10 78 20 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  x {.  const char
1da20 20 2a 7a 46 69 6c 65 3b 20 20 2f 2a 20 4e 61 6d   *zFile;  /* Nam
1da30 65 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20 66  e of the input f
1da40 69 6c 65 20 2a 2f 0a 20 20 46 49 4c 45 20 2a 69  ile */.  FILE *i
1da50 6e 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  n;           /* 
1da60 52 65 61 64 20 74 68 65 20 43 53 56 20 74 65 78  Read the CSV tex
1da70 74 20 66 72 6f 6d 20 74 68 69 73 20 69 6e 70 75  t from this inpu
1da80 74 20 73 74 72 65 61 6d 20 2a 2f 0a 20 20 63 68  t stream */.  ch
1da90 61 72 20 2a 7a 3b 20 20 20 20 20 20 20 20 20 20  ar *z;          
1daa0 20 20 2f 2a 20 41 63 63 75 6d 75 6c 61 74 65 64    /* Accumulated
1dab0 20 74 65 78 74 20 66 6f 72 20 61 20 66 69 65 6c   text for a fiel
1dac0 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20 20  d */.  int n;   
1dad0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
1dae0 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e  mber of bytes in
1daf0 20 7a 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 6c 6c   z */.  int nAll
1db00 6f 63 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 53  oc;         /* S
1db10 70 61 63 65 20 61 6c 6c 6f 63 61 74 65 64 20 66  pace allocated f
1db20 6f 72 20 7a 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20  or z[] */.  int 
1db30 6e 4c 69 6e 65 3b 20 20 20 20 20 20 20 20 20 20  nLine;          
1db40 2f 2a 20 43 75 72 72 65 6e 74 20 6c 69 6e 65 20  /* Current line 
1db50 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69 6e 74 20  number */.  int 
1db60 62 4e 6f 74 46 69 72 73 74 3b 20 20 20 20 20 20  bNotFirst;      
1db70 2f 2a 20 54 72 75 65 20 69 66 20 6f 6e 65 20 6f  /* True if one o
1db80 72 20 6d 6f 72 65 20 62 79 74 65 73 20 61 6c 72  r more bytes alr
1db90 65 61 64 79 20 72 65 61 64 20 2a 2f 0a 20 20 69  eady read */.  i
1dba0 6e 74 20 63 54 65 72 6d 3b 20 20 20 20 20 20 20  nt cTerm;       
1dbb0 20 20 20 2f 2a 20 43 68 61 72 61 63 74 65 72 20     /* Character 
1dbc0 74 68 61 74 20 74 65 72 6d 69 6e 61 74 65 64 20  that terminated 
1dbd0 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20  the most recent 
1dbe0 66 69 65 6c 64 20 2a 2f 0a 20 20 69 6e 74 20 63  field */.  int c
1dbf0 43 6f 6c 53 65 70 3b 20 20 20 20 20 20 20 20 2f  ColSep;        /
1dc00 2a 20 54 68 65 20 63 6f 6c 75 6d 6e 20 73 65 70  * The column sep
1dc10 61 72 61 74 6f 72 20 63 68 61 72 61 63 74 65 72  arator character
1dc20 2e 20 20 28 55 73 75 61 6c 6c 79 20 22 2c 22 29  .  (Usually ",")
1dc30 20 2a 2f 0a 20 20 69 6e 74 20 63 52 6f 77 53 65   */.  int cRowSe
1dc40 70 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  p;        /* The
1dc50 20 72 6f 77 20 73 65 70 61 72 61 74 6f 72 20 63   row separator c
1dc60 68 61 72 61 63 74 65 72 2e 20 20 28 55 73 75 61  haracter.  (Usua
1dc70 6c 6c 79 20 22 5c 6e 22 29 20 2a 2f 0a 7d 3b 0a  lly "\n") */.};.
1dc80 0a 2f 2a 20 41 70 70 65 6e 64 20 61 20 73 69 6e  ./* Append a sin
1dc90 67 6c 65 20 62 79 74 65 20 74 6f 20 7a 5b 5d 20  gle byte to z[] 
1dca0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69  */.static void i
1dcb0 6d 70 6f 72 74 5f 61 70 70 65 6e 64 5f 63 68 61  mport_append_cha
1dcc0 72 28 49 6d 70 6f 72 74 43 74 78 20 2a 70 2c 20  r(ImportCtx *p, 
1dcd0 69 6e 74 20 63 29 7b 0a 20 20 69 66 28 20 70 2d  int c){.  if( p-
1dce0 3e 6e 2b 31 3e 3d 70 2d 3e 6e 41 6c 6c 6f 63 20  >n+1>=p->nAlloc 
1dcf0 29 7b 0a 20 20 20 20 70 2d 3e 6e 41 6c 6c 6f 63  ){.    p->nAlloc
1dd00 20 2b 3d 20 70 2d 3e 6e 41 6c 6c 6f 63 20 2b 20   += p->nAlloc + 
1dd10 31 30 30 3b 0a 20 20 20 20 70 2d 3e 7a 20 3d 20  100;.    p->z = 
1dd20 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 36  sqlite3_realloc6
1dd30 34 28 70 2d 3e 7a 2c 20 70 2d 3e 6e 41 6c 6c 6f  4(p->z, p->nAllo
1dd40 63 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 7a  c);.    if( p->z
1dd50 3d 3d 30 20 29 20 73 68 65 6c 6c 5f 6f 75 74 5f  ==0 ) shell_out_
1dd60 6f 66 5f 6d 65 6d 6f 72 79 28 29 3b 0a 20 20 7d  of_memory();.  }
1dd70 0a 20 20 70 2d 3e 7a 5b 70 2d 3e 6e 2b 2b 5d 20  .  p->z[p->n++] 
1dd80 3d 20 28 63 68 61 72 29 63 3b 0a 7d 0a 0a 2f 2a  = (char)c;.}../*
1dd90 20 52 65 61 64 20 61 20 73 69 6e 67 6c 65 20 66   Read a single f
1dda0 69 65 6c 64 20 6f 66 20 43 53 56 20 74 65 78 74  ield of CSV text
1ddb0 2e 20 20 43 6f 6d 70 61 74 69 62 6c 65 20 77 69  .  Compatible wi
1ddc0 74 68 20 72 66 63 34 31 38 30 20 61 6e 64 20 65  th rfc4180 and e
1ddd0 78 74 65 6e 64 65 64 0a 2a 2a 20 77 69 74 68 20  xtended.** with 
1dde0 74 68 65 20 6f 70 74 69 6f 6e 20 6f 66 20 68 61  the option of ha
1ddf0 76 69 6e 67 20 61 20 73 65 70 61 72 61 74 6f 72  ving a separator
1de00 20 6f 74 68 65 72 20 74 68 61 6e 20 22 2c 22 2e   other than ",".
1de10 0a 2a 2a 0a 2a 2a 20 20 20 2b 20 20 49 6e 70 75  .**.**   +  Inpu
1de20 74 20 63 6f 6d 65 73 20 66 72 6f 6d 20 70 2d 3e  t comes from p->
1de30 69 6e 2e 0a 2a 2a 20 20 20 2b 20 20 53 74 6f 72  in..**   +  Stor
1de40 65 20 72 65 73 75 6c 74 73 20 69 6e 20 70 2d 3e  e results in p->
1de50 7a 20 6f 66 20 6c 65 6e 67 74 68 20 70 2d 3e 6e  z of length p->n
1de60 2e 20 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64  .  Space to hold
1de70 20 70 2d 3e 7a 20 63 6f 6d 65 73 0a 2a 2a 20 20   p->z comes.**  
1de80 20 20 20 20 66 72 6f 6d 20 73 71 6c 69 74 65 33      from sqlite3
1de90 5f 6d 61 6c 6c 6f 63 36 34 28 29 2e 0a 2a 2a 20  _malloc64()..** 
1dea0 20 20 2b 20 20 55 73 65 20 70 2d 3e 63 53 65 70    +  Use p->cSep
1deb0 20 61 73 20 74 68 65 20 63 6f 6c 75 6d 6e 20 73   as the column s
1dec0 65 70 61 72 61 74 6f 72 2e 20 20 54 68 65 20 64  eparator.  The d
1ded0 65 66 61 75 6c 74 20 69 73 20 22 2c 22 2e 0a 2a  efault is ","..*
1dee0 2a 20 20 20 2b 20 20 55 73 65 20 70 2d 3e 72 53  *   +  Use p->rS
1def0 65 70 20 61 73 20 74 68 65 20 72 6f 77 20 73 65  ep as the row se
1df00 70 61 72 61 74 6f 72 2e 20 20 54 68 65 20 64 65  parator.  The de
1df10 66 61 75 6c 74 20 69 73 20 22 5c 6e 22 2e 0a 2a  fault is "\n"..*
1df20 2a 20 20 20 2b 20 20 4b 65 65 70 20 74 72 61 63  *   +  Keep trac
1df30 6b 20 6f 66 20 74 68 65 20 6c 69 6e 65 20 6e 75  k of the line nu
1df40 6d 62 65 72 20 69 6e 20 70 2d 3e 6e 4c 69 6e 65  mber in p->nLine
1df50 2e 0a 2a 2a 20 20 20 2b 20 20 53 74 6f 72 65 20  ..**   +  Store 
1df60 74 68 65 20 63 68 61 72 61 63 74 65 72 20 74 68  the character th
1df70 61 74 20 74 65 72 6d 69 6e 61 74 65 73 20 74 68  at terminates th
1df80 65 20 66 69 65 6c 64 20 69 6e 20 70 2d 3e 63 54  e field in p->cT
1df90 65 72 6d 2e 20 20 53 74 6f 72 65 0a 2a 2a 20 20  erm.  Store.**  
1dfa0 20 20 20 20 45 4f 46 20 6f 6e 20 65 6e 64 2d 6f      EOF on end-o
1dfb0 66 2d 66 69 6c 65 2e 0a 2a 2a 20 20 20 2b 20 20  f-file..**   +  
1dfc0 52 65 70 6f 72 74 20 73 79 6e 74 61 78 20 65 72  Report syntax er
1dfd0 72 6f 72 73 20 6f 6e 20 73 74 64 65 72 72 0a 2a  rors on stderr.*
1dfe0 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 53  /.static char *S
1dff0 51 4c 49 54 45 5f 43 44 45 43 4c 20 63 73 76 5f  QLITE_CDECL csv_
1e000 72 65 61 64 5f 6f 6e 65 5f 66 69 65 6c 64 28 49  read_one_field(I
1e010 6d 70 6f 72 74 43 74 78 20 2a 70 29 7b 0a 20 20  mportCtx *p){.  
1e020 69 6e 74 20 63 3b 0a 20 20 69 6e 74 20 63 53 65  int c;.  int cSe
1e030 70 20 3d 20 70 2d 3e 63 43 6f 6c 53 65 70 3b 0a  p = p->cColSep;.
1e040 20 20 69 6e 74 20 72 53 65 70 20 3d 20 70 2d 3e    int rSep = p->
1e050 63 52 6f 77 53 65 70 3b 0a 20 20 70 2d 3e 6e 20  cRowSep;.  p->n 
1e060 3d 20 30 3b 0a 20 20 63 20 3d 20 66 67 65 74 63  = 0;.  c = fgetc
1e070 28 70 2d 3e 69 6e 29 3b 0a 20 20 69 66 28 20 63  (p->in);.  if( c
1e080 3d 3d 45 4f 46 20 7c 7c 20 73 65 65 6e 49 6e 74  ==EOF || seenInt
1e090 65 72 72 75 70 74 20 29 7b 0a 20 20 20 20 70 2d  errupt ){.    p-
1e0a0 3e 63 54 65 72 6d 20 3d 20 45 4f 46 3b 0a 20 20  >cTerm = EOF;.  
1e0b0 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
1e0c0 20 20 69 66 28 20 63 3d 3d 27 22 27 20 29 7b 0a    if( c=='"' ){.
1e0d0 20 20 20 20 69 6e 74 20 70 63 2c 20 70 70 63 3b      int pc, ppc;
1e0e0 0a 20 20 20 20 69 6e 74 20 73 74 61 72 74 4c 69  .    int startLi
1e0f0 6e 65 20 3d 20 70 2d 3e 6e 4c 69 6e 65 3b 0a 20  ne = p->nLine;. 
1e100 20 20 20 69 6e 74 20 63 51 75 6f 74 65 20 3d 20     int cQuote = 
1e110 63 3b 0a 20 20 20 20 70 63 20 3d 20 70 70 63 20  c;.    pc = ppc 
1e120 3d 20 30 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  = 0;.    while( 
1e130 31 20 29 7b 0a 20 20 20 20 20 20 63 20 3d 20 66  1 ){.      c = f
1e140 67 65 74 63 28 70 2d 3e 69 6e 29 3b 0a 20 20 20  getc(p->in);.   
1e150 20 20 20 69 66 28 20 63 3d 3d 72 53 65 70 20 29     if( c==rSep )
1e160 20 70 2d 3e 6e 4c 69 6e 65 2b 2b 3b 0a 20 20 20   p->nLine++;.   
1e170 20 20 20 69 66 28 20 63 3d 3d 63 51 75 6f 74 65     if( c==cQuote
1e180 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
1e190 70 63 3d 3d 63 51 75 6f 74 65 20 29 7b 0a 20 20  pc==cQuote ){.  
1e1a0 20 20 20 20 20 20 20 20 70 63 20 3d 20 30 3b 0a          pc = 0;.
1e1b0 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
1e1c0 75 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ue;.        }.  
1e1d0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
1e1e0 28 63 3d 3d 63 53 65 70 20 26 26 20 70 63 3d 3d  (c==cSep && pc==
1e1f0 63 51 75 6f 74 65 29 0a 20 20 20 20 20 20 20 7c  cQuote).       |
1e200 7c 20 28 63 3d 3d 72 53 65 70 20 26 26 20 70 63  | (c==rSep && pc
1e210 3d 3d 63 51 75 6f 74 65 29 0a 20 20 20 20 20 20  ==cQuote).      
1e220 20 7c 7c 20 28 63 3d 3d 72 53 65 70 20 26 26 20   || (c==rSep && 
1e230 70 63 3d 3d 27 5c 72 27 20 26 26 20 70 70 63 3d  pc=='\r' && ppc=
1e240 3d 63 51 75 6f 74 65 29 0a 20 20 20 20 20 20 20  =cQuote).       
1e250 7c 7c 20 28 63 3d 3d 45 4f 46 20 26 26 20 70 63  || (c==EOF && pc
1e260 3d 3d 63 51 75 6f 74 65 29 0a 20 20 20 20 20 20  ==cQuote).      
1e270 29 7b 0a 20 20 20 20 20 20 20 20 64 6f 7b 20 70  ){.        do{ p
1e280 2d 3e 6e 2d 2d 3b 20 7d 77 68 69 6c 65 28 20 70  ->n--; }while( p
1e290 2d 3e 7a 5b 70 2d 3e 6e 5d 21 3d 63 51 75 6f 74  ->z[p->n]!=cQuot
1e2a0 65 20 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  e );.        p->
1e2b0 63 54 65 72 6d 20 3d 20 63 3b 0a 20 20 20 20 20  cTerm = c;.     
1e2c0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
1e2d0 7d 0a 20 20 20 20 20 20 69 66 28 20 70 63 3d 3d  }.      if( pc==
1e2e0 63 51 75 6f 74 65 20 26 26 20 63 21 3d 27 5c 72  cQuote && c!='\r
1e2f0 27 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66  ' ){.        utf
1e300 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  8_printf(stderr,
1e310 20 22 25 73 3a 25 64 3a 20 75 6e 65 73 63 61 70   "%s:%d: unescap
1e320 65 64 20 25 63 20 63 68 61 72 61 63 74 65 72 5c  ed %c character\
1e330 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
1e340 20 20 20 20 70 2d 3e 7a 46 69 6c 65 2c 20 70 2d      p->zFile, p-
1e350 3e 6e 4c 69 6e 65 2c 20 63 51 75 6f 74 65 29 3b  >nLine, cQuote);
1e360 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
1e370 66 28 20 63 3d 3d 45 4f 46 20 29 7b 0a 20 20 20  f( c==EOF ){.   
1e380 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
1e390 28 73 74 64 65 72 72 2c 20 22 25 73 3a 25 64 3a  (stderr, "%s:%d:
1e3a0 20 75 6e 74 65 72 6d 69 6e 61 74 65 64 20 25 63   unterminated %c
1e3b0 2d 71 75 6f 74 65 64 20 66 69 65 6c 64 5c 6e 22  -quoted field\n"
1e3c0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1e3d0 20 20 70 2d 3e 7a 46 69 6c 65 2c 20 73 74 61 72    p->zFile, star
1e3e0 74 4c 69 6e 65 2c 20 63 51 75 6f 74 65 29 3b 0a  tLine, cQuote);.
1e3f0 20 20 20 20 20 20 20 20 70 2d 3e 63 54 65 72 6d          p->cTerm
1e400 20 3d 20 63 3b 0a 20 20 20 20 20 20 20 20 62 72   = c;.        br
1e410 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
1e420 20 20 20 69 6d 70 6f 72 74 5f 61 70 70 65 6e 64     import_append
1e430 5f 63 68 61 72 28 70 2c 20 63 29 3b 0a 20 20 20  _char(p, c);.   
1e440 20 20 20 70 70 63 20 3d 20 70 63 3b 0a 20 20 20     ppc = pc;.   
1e450 20 20 20 70 63 20 3d 20 63 3b 0a 20 20 20 20 7d     pc = c;.    }
1e460 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
1e470 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20   If this is the 
1e480 66 69 72 73 74 20 66 69 65 6c 64 20 62 65 69 6e  first field bein
1e490 67 20 70 61 72 73 65 64 20 61 6e 64 20 69 74 20  g parsed and it 
1e4a0 62 65 67 69 6e 73 20 77 69 74 68 20 74 68 65 0a  begins with the.
1e4b0 20 20 20 20 2a 2a 20 55 54 46 2d 38 20 42 4f 4d      ** UTF-8 BOM
1e4c0 20 20 28 30 78 45 46 20 42 42 20 42 46 29 20 74    (0xEF BB BF) t
1e4d0 68 65 6e 20 73 6b 69 70 20 74 68 65 20 42 4f 4d  hen skip the BOM
1e4e0 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 63 26 30   */.    if( (c&0
1e4f0 78 66 66 29 3d 3d 30 78 65 66 20 26 26 20 70 2d  xff)==0xef && p-
1e500 3e 62 4e 6f 74 46 69 72 73 74 3d 3d 30 20 29 7b  >bNotFirst==0 ){
1e510 0a 20 20 20 20 20 20 69 6d 70 6f 72 74 5f 61 70  .      import_ap
1e520 70 65 6e 64 5f 63 68 61 72 28 70 2c 20 63 29 3b  pend_char(p, c);
1e530 0a 20 20 20 20 20 20 63 20 3d 20 66 67 65 74 63  .      c = fgetc
1e540 28 70 2d 3e 69 6e 29 3b 0a 20 20 20 20 20 20 69  (p->in);.      i
1e550 66 28 20 28 63 26 30 78 66 66 29 3d 3d 30 78 62  f( (c&0xff)==0xb
1e560 62 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6d 70  b ){.        imp
1e570 6f 72 74 5f 61 70 70 65 6e 64 5f 63 68 61 72 28  ort_append_char(
1e580 70 2c 20 63 29 3b 0a 20 20 20 20 20 20 20 20 63  p, c);.        c
1e590 20 3d 20 66 67 65 74 63 28 70 2d 3e 69 6e 29 3b   = fgetc(p->in);
1e5a0 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 63 26  .        if( (c&
1e5b0 30 78 66 66 29 3d 3d 30 78 62 66 20 29 7b 0a 20  0xff)==0xbf ){. 
1e5c0 20 20 20 20 20 20 20 20 20 70 2d 3e 62 4e 6f 74           p->bNot
1e5d0 46 69 72 73 74 20 3d 20 31 3b 0a 20 20 20 20 20  First = 1;.     
1e5e0 20 20 20 20 20 70 2d 3e 6e 20 3d 20 30 3b 0a 20       p->n = 0;. 
1e5f0 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
1e600 63 73 76 5f 72 65 61 64 5f 6f 6e 65 5f 66 69 65  csv_read_one_fie
1e610 6c 64 28 70 29 3b 0a 20 20 20 20 20 20 20 20 7d  ld(p);.        }
1e620 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1e630 20 20 20 77 68 69 6c 65 28 20 63 21 3d 45 4f 46     while( c!=EOF
1e640 20 26 26 20 63 21 3d 63 53 65 70 20 26 26 20 63   && c!=cSep && c
1e650 21 3d 72 53 65 70 20 29 7b 0a 20 20 20 20 20 20  !=rSep ){.      
1e660 69 6d 70 6f 72 74 5f 61 70 70 65 6e 64 5f 63 68  import_append_ch
1e670 61 72 28 70 2c 20 63 29 3b 0a 20 20 20 20 20 20  ar(p, c);.      
1e680 63 20 3d 20 66 67 65 74 63 28 70 2d 3e 69 6e 29  c = fgetc(p->in)
1e690 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
1e6a0 63 3d 3d 72 53 65 70 20 29 7b 0a 20 20 20 20 20  c==rSep ){.     
1e6b0 20 70 2d 3e 6e 4c 69 6e 65 2b 2b 3b 0a 20 20 20   p->nLine++;.   
1e6c0 20 20 20 69 66 28 20 70 2d 3e 6e 3e 30 20 26 26     if( p->n>0 &&
1e6d0 20 70 2d 3e 7a 5b 70 2d 3e 6e 2d 31 5d 3d 3d 27   p->z[p->n-1]=='
1e6e0 5c 72 27 20 29 20 70 2d 3e 6e 2d 2d 3b 0a 20 20  \r' ) p->n--;.  
1e6f0 20 20 7d 0a 20 20 20 20 70 2d 3e 63 54 65 72 6d    }.    p->cTerm
1e700 20 3d 20 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20   = c;.  }.  if( 
1e710 70 2d 3e 7a 20 29 20 70 2d 3e 7a 5b 70 2d 3e 6e  p->z ) p->z[p->n
1e720 5d 20 3d 20 30 3b 0a 20 20 70 2d 3e 62 4e 6f 74  ] = 0;.  p->bNot
1e730 46 69 72 73 74 20 3d 20 31 3b 0a 20 20 72 65 74  First = 1;.  ret
1e740 75 72 6e 20 70 2d 3e 7a 3b 0a 7d 0a 0a 2f 2a 20  urn p->z;.}../* 
1e750 52 65 61 64 20 61 20 73 69 6e 67 6c 65 20 66 69  Read a single fi
1e760 65 6c 64 20 6f 66 20 41 53 43 49 49 20 64 65 6c  eld of ASCII del
1e770 69 6d 69 74 65 64 20 74 65 78 74 2e 0a 2a 2a 0a  imited text..**.
1e780 2a 2a 20 20 20 2b 20 20 49 6e 70 75 74 20 63 6f  **   +  Input co
1e790 6d 65 73 20 66 72 6f 6d 20 70 2d 3e 69 6e 2e 0a  mes from p->in..
1e7a0 2a 2a 20 20 20 2b 20 20 53 74 6f 72 65 20 72 65  **   +  Store re
1e7b0 73 75 6c 74 73 20 69 6e 20 70 2d 3e 7a 20 6f 66  sults in p->z of
1e7c0 20 6c 65 6e 67 74 68 20 70 2d 3e 6e 2e 20 20 53   length p->n.  S
1e7d0 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 70 2d 3e  pace to hold p->
1e7e0 7a 20 63 6f 6d 65 73 0a 2a 2a 20 20 20 20 20 20  z comes.**      
1e7f0 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  from sqlite3_mal
1e800 6c 6f 63 36 34 28 29 2e 0a 2a 2a 20 20 20 2b 20  loc64()..**   + 
1e810 20 55 73 65 20 70 2d 3e 63 53 65 70 20 61 73 20   Use p->cSep as 
1e820 74 68 65 20 63 6f 6c 75 6d 6e 20 73 65 70 61 72  the column separ
1e830 61 74 6f 72 2e 20 20 54 68 65 20 64 65 66 61 75  ator.  The defau
1e840 6c 74 20 69 73 20 22 5c 78 31 46 22 2e 0a 2a 2a  lt is "\x1F"..**
1e850 20 20 20 2b 20 20 55 73 65 20 70 2d 3e 72 53 65     +  Use p->rSe
1e860 70 20 61 73 20 74 68 65 20 72 6f 77 20 73 65 70  p as the row sep
1e870 61 72 61 74 6f 72 2e 20 20 54 68 65 20 64 65 66  arator.  The def
1e880 61 75 6c 74 20 69 73 20 22 5c 78 31 45 22 2e 0a  ault is "\x1E"..
1e890 2a 2a 20 20 20 2b 20 20 4b 65 65 70 20 74 72 61  **   +  Keep tra
1e8a0 63 6b 20 6f 66 20 74 68 65 20 72 6f 77 20 6e 75  ck of the row nu
1e8b0 6d 62 65 72 20 69 6e 20 70 2d 3e 6e 4c 69 6e 65  mber in p->nLine
1e8c0 2e 0a 2a 2a 20 20 20 2b 20 20 53 74 6f 72 65 20  ..**   +  Store 
1e8d0 74 68 65 20 63 68 61 72 61 63 74 65 72 20 74 68  the character th
1e8e0 61 74 20 74 65 72 6d 69 6e 61 74 65 73 20 74 68  at terminates th
1e8f0 65 20 66 69 65 6c 64 20 69 6e 20 70 2d 3e 63 54  e field in p->cT
1e900 65 72 6d 2e 20 20 53 74 6f 72 65 0a 2a 2a 20 20  erm.  Store.**  
1e910 20 20 20 20 45 4f 46 20 6f 6e 20 65 6e 64 2d 6f      EOF on end-o
1e920 66 2d 66 69 6c 65 2e 0a 2a 2a 20 20 20 2b 20 20  f-file..**   +  
1e930 52 65 70 6f 72 74 20 73 79 6e 74 61 78 20 65 72  Report syntax er
1e940 72 6f 72 73 20 6f 6e 20 73 74 64 65 72 72 0a 2a  rors on stderr.*
1e950 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 53  /.static char *S
1e960 51 4c 49 54 45 5f 43 44 45 43 4c 20 61 73 63 69  QLITE_CDECL asci
1e970 69 5f 72 65 61 64 5f 6f 6e 65 5f 66 69 65 6c 64  i_read_one_field
1e980 28 49 6d 70 6f 72 74 43 74 78 20 2a 70 29 7b 0a  (ImportCtx *p){.
1e990 20 20 69 6e 74 20 63 3b 0a 20 20 69 6e 74 20 63    int c;.  int c
1e9a0 53 65 70 20 3d 20 70 2d 3e 63 43 6f 6c 53 65 70  Sep = p->cColSep
1e9b0 3b 0a 20 20 69 6e 74 20 72 53 65 70 20 3d 20 70  ;.  int rSep = p
1e9c0 2d 3e 63 52 6f 77 53 65 70 3b 0a 20 20 70 2d 3e  ->cRowSep;.  p->
1e9d0 6e 20 3d 20 30 3b 0a 20 20 63 20 3d 20 66 67 65  n = 0;.  c = fge
1e9e0 74 63 28 70 2d 3e 69 6e 29 3b 0a 20 20 69 66 28  tc(p->in);.  if(
1e9f0 20 63 3d 3d 45 4f 46 20 7c 7c 20 73 65 65 6e 49   c==EOF || seenI
1ea00 6e 74 65 72 72 75 70 74 20 29 7b 0a 20 20 20 20  nterrupt ){.    
1ea10 70 2d 3e 63 54 65 72 6d 20 3d 20 45 4f 46 3b 0a  p->cTerm = EOF;.
1ea20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
1ea30 7d 0a 20 20 77 68 69 6c 65 28 20 63 21 3d 45 4f  }.  while( c!=EO
1ea40 46 20 26 26 20 63 21 3d 63 53 65 70 20 26 26 20  F && c!=cSep && 
1ea50 63 21 3d 72 53 65 70 20 29 7b 0a 20 20 20 20 69  c!=rSep ){.    i
1ea60 6d 70 6f 72 74 5f 61 70 70 65 6e 64 5f 63 68 61  mport_append_cha
1ea70 72 28 70 2c 20 63 29 3b 0a 20 20 20 20 63 20 3d  r(p, c);.    c =
1ea80 20 66 67 65 74 63 28 70 2d 3e 69 6e 29 3b 0a 20   fgetc(p->in);. 
1ea90 20 7d 0a 20 20 69 66 28 20 63 3d 3d 72 53 65 70   }.  if( c==rSep
1eaa0 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 4c 69 6e 65   ){.    p->nLine
1eab0 2b 2b 3b 0a 20 20 7d 0a 20 20 70 2d 3e 63 54 65  ++;.  }.  p->cTe
1eac0 72 6d 20 3d 20 63 3b 0a 20 20 69 66 28 20 70 2d  rm = c;.  if( p-
1ead0 3e 7a 20 29 20 70 2d 3e 7a 5b 70 2d 3e 6e 5d 20  >z ) p->z[p->n] 
1eae0 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d  = 0;.  return p-
1eaf0 3e 7a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 79  >z;.}../*.** Try
1eb00 20 74 6f 20 74 72 61 6e 73 66 65 72 20 64 61 74   to transfer dat
1eb10 61 20 66 6f 72 20 74 61 62 6c 65 20 7a 54 61 62  a for table zTab
1eb20 6c 65 2e 20 20 49 66 20 61 6e 20 65 72 72 6f 72  le.  If an error
1eb30 20 69 73 20 73 65 65 6e 20 77 68 69 6c 65 0a 2a   is seen while.*
1eb40 2a 20 6d 6f 76 69 6e 67 20 66 6f 72 77 61 72 64  * moving forward
1eb50 2c 20 74 72 79 20 74 6f 20 67 6f 20 62 61 63 6b  , try to go back
1eb60 77 61 72 64 73 2e 20 20 54 68 65 20 62 61 63 6b  wards.  The back
1eb70 77 61 72 64 73 20 6d 6f 76 65 6d 65 6e 74 20 77  wards movement w
1eb80 6f 6e 27 74 0a 2a 2a 20 77 6f 72 6b 20 66 6f 72  on't.** work for
1eb90 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20 74   WITHOUT ROWID t
1eba0 61 62 6c 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  ables..*/.static
1ebb0 20 76 6f 69 64 20 74 72 79 54 6f 43 6c 6f 6e 65   void tryToClone
1ebc0 44 61 74 61 28 0a 20 20 53 68 65 6c 6c 53 74 61  Data(.  ShellSta
1ebd0 74 65 20 2a 70 2c 0a 20 20 73 71 6c 69 74 65 33  te *p,.  sqlite3
1ebe0 20 2a 6e 65 77 44 62 2c 0a 20 20 63 6f 6e 73 74   *newDb,.  const
1ebf0 20 63 68 61 72 20 2a 7a 54 61 62 6c 65 0a 29 7b   char *zTable.){
1ec00 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
1ec10 2a 70 51 75 65 72 79 20 3d 20 30 3b 0a 20 20 73  *pQuery = 0;.  s
1ec20 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 49 6e  qlite3_stmt *pIn
1ec30 73 65 72 74 20 3d 20 30 3b 0a 20 20 63 68 61 72  sert = 0;.  char
1ec40 20 2a 7a 51 75 65 72 79 20 3d 20 30 3b 0a 20 20   *zQuery = 0;.  
1ec50 63 68 61 72 20 2a 7a 49 6e 73 65 72 74 20 3d 20  char *zInsert = 
1ec60 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  0;.  int rc;.  i
1ec70 6e 74 20 69 2c 20 6a 2c 20 6e 3b 0a 20 20 69 6e  nt i, j, n;.  in
1ec80 74 20 6e 54 61 62 6c 65 20 3d 20 73 74 72 6c 65  t nTable = strle
1ec90 6e 33 30 28 7a 54 61 62 6c 65 29 3b 0a 20 20 69  n30(zTable);.  i
1eca0 6e 74 20 6b 20 3d 20 30 3b 0a 20 20 69 6e 74 20  nt k = 0;.  int 
1ecb0 63 6e 74 20 3d 20 30 3b 0a 20 20 63 6f 6e 73 74  cnt = 0;.  const
1ecc0 20 69 6e 74 20 73 70 69 6e 52 61 74 65 20 3d 20   int spinRate = 
1ecd0 31 30 30 30 30 3b 0a 0a 20 20 7a 51 75 65 72 79  10000;..  zQuery
1ece0 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
1ecf0 74 66 28 22 53 45 4c 45 43 54 20 2a 20 46 52 4f  tf("SELECT * FRO
1ed00 4d 20 5c 22 25 77 5c 22 22 2c 20 7a 54 61 62 6c  M \"%w\"", zTabl
1ed10 65 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  e);.  rc = sqlit
1ed20 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 70 2d  e3_prepare_v2(p-
1ed30 3e 64 62 2c 20 7a 51 75 65 72 79 2c 20 2d 31 2c  >db, zQuery, -1,
1ed40 20 26 70 51 75 65 72 79 2c 20 30 29 3b 0a 20 20   &pQuery, 0);.  
1ed50 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 75 74  if( rc ){.    ut
1ed60 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  f8_printf(stderr
1ed70 2c 20 22 45 72 72 6f 72 20 25 64 3a 20 25 73 20  , "Error %d: %s 
1ed80 6f 6e 20 5b 25 73 5d 5c 6e 22 2c 0a 20 20 20 20  on [%s]\n",.    
1ed90 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
1eda0 65 78 74 65 6e 64 65 64 5f 65 72 72 63 6f 64 65  extended_errcode
1edb0 28 70 2d 3e 64 62 29 2c 20 73 71 6c 69 74 65 33  (p->db), sqlite3
1edc0 5f 65 72 72 6d 73 67 28 70 2d 3e 64 62 29 2c 0a  _errmsg(p->db),.
1edd0 20 20 20 20 20 20 20 20 20 20 20 20 7a 51 75 65              zQue
1ede0 72 79 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e  ry);.    goto en
1edf0 64 5f 64 61 74 61 5f 78 66 65 72 3b 0a 20 20 7d  d_data_xfer;.  }
1ee00 0a 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 5f 63  .  n = sqlite3_c
1ee10 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 70 51 75 65  olumn_count(pQue
1ee20 72 79 29 3b 0a 20 20 7a 49 6e 73 65 72 74 20 3d  ry);.  zInsert =
1ee30 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36   sqlite3_malloc6
1ee40 34 28 32 30 30 20 2b 20 6e 54 61 62 6c 65 20 2b  4(200 + nTable +
1ee50 20 6e 2a 33 29 3b 0a 20 20 69 66 28 20 7a 49 6e   n*3);.  if( zIn
1ee60 73 65 72 74 3d 3d 30 20 29 20 73 68 65 6c 6c 5f  sert==0 ) shell_
1ee70 6f 75 74 5f 6f 66 5f 6d 65 6d 6f 72 79 28 29 3b  out_of_memory();
1ee80 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69  .  sqlite3_snpri
1ee90 6e 74 66 28 32 30 30 2b 6e 54 61 62 6c 65 2c 7a  ntf(200+nTable,z
1eea0 49 6e 73 65 72 74 2c 0a 20 20 20 20 20 20 20 20  Insert,.        
1eeb0 20 20 20 20 20 20 20 20 20 20 20 22 49 4e 53 45             "INSE
1eec0 52 54 20 4f 52 20 49 47 4e 4f 52 45 20 49 4e 54  RT OR IGNORE INT
1eed0 4f 20 5c 22 25 73 5c 22 20 56 41 4c 55 45 53 28  O \"%s\" VALUES(
1eee0 3f 22 2c 20 7a 54 61 62 6c 65 29 3b 0a 20 20 69  ?", zTable);.  i
1eef0 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a 49 6e 73   = strlen30(zIns
1ef00 65 72 74 29 3b 0a 20 20 66 6f 72 28 6a 3d 31 3b  ert);.  for(j=1;
1ef10 20 6a 3c 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20   j<n; j++){.    
1ef20 6d 65 6d 63 70 79 28 7a 49 6e 73 65 72 74 2b 69  memcpy(zInsert+i
1ef30 2c 20 22 2c 3f 22 2c 20 32 29 3b 0a 20 20 20 20  , ",?", 2);.    
1ef40 69 20 2b 3d 20 32 3b 0a 20 20 7d 0a 20 20 6d 65  i += 2;.  }.  me
1ef50 6d 63 70 79 28 7a 49 6e 73 65 72 74 2b 69 2c 20  mcpy(zInsert+i, 
1ef60 22 29 3b 22 2c 20 33 29 3b 0a 20 20 72 63 20 3d  ");", 3);.  rc =
1ef70 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
1ef80 5f 76 32 28 6e 65 77 44 62 2c 20 7a 49 6e 73 65  _v2(newDb, zInse
1ef90 72 74 2c 20 2d 31 2c 20 26 70 49 6e 73 65 72 74  rt, -1, &pInsert
1efa0 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 20 29  , 0);.  if( rc )
1efb0 7b 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74  {.    utf8_print
1efc0 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72  f(stderr, "Error
1efd0 20 25 64 3a 20 25 73 20 6f 6e 20 5b 25 73 5d 5c   %d: %s on [%s]\
1efe0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
1eff0 73 71 6c 69 74 65 33 5f 65 78 74 65 6e 64 65 64  sqlite3_extended
1f000 5f 65 72 72 63 6f 64 65 28 6e 65 77 44 62 29 2c  _errcode(newDb),
1f010 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
1f020 6e 65 77 44 62 29 2c 0a 20 20 20 20 20 20 20 20  newDb),.        
1f030 20 20 20 20 7a 51 75 65 72 79 29 3b 0a 20 20 20      zQuery);.   
1f040 20 67 6f 74 6f 20 65 6e 64 5f 64 61 74 61 5f 78   goto end_data_x
1f050 66 65 72 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 6b  fer;.  }.  for(k
1f060 3d 30 3b 20 6b 3c 32 3b 20 6b 2b 2b 29 7b 0a 20  =0; k<2; k++){. 
1f070 20 20 20 77 68 69 6c 65 28 20 28 72 63 20 3d 20     while( (rc = 
1f080 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 51 75  sqlite3_step(pQu
1f090 65 72 79 29 29 3d 3d 53 51 4c 49 54 45 5f 52 4f  ery))==SQLITE_RO
1f0a0 57 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69  W ){.      for(i
1f0b0 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20  =0; i<n; i++){. 
1f0c0 20 20 20 20 20 20 20 73 77 69 74 63 68 28 20 73         switch( s
1f0d0 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 79  qlite3_column_ty
1f0e0 70 65 28 70 51 75 65 72 79 2c 20 69 29 20 29 7b  pe(pQuery, i) ){
1f0f0 0a 20 20 20 20 20 20 20 20 20 20 63 61 73 65 20  .          case 
1f100 53 51 4c 49 54 45 5f 4e 55 4c 4c 3a 20 7b 0a 20  SQLITE_NULL: {. 
1f110 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
1f120 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c 28 70 49 6e  e3_bind_null(pIn
1f130 73 65 72 74 2c 20 69 2b 31 29 3b 0a 20 20 20 20  sert, i+1);.    
1f140 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
1f150 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1f160 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
1f170 5f 49 4e 54 45 47 45 52 3a 20 7b 0a 20 20 20 20  _INTEGER: {.    
1f180 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
1f190 62 69 6e 64 5f 69 6e 74 36 34 28 70 49 6e 73 65  bind_int64(pInse
1f1a0 72 74 2c 20 69 2b 31 2c 20 73 71 6c 69 74 65 33  rt, i+1, sqlite3
1f1b0 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28 70 51  _column_int64(pQ
1f1c0 75 65 72 79 2c 69 29 29 3b 0a 20 20 20 20 20 20  uery,i));.      
1f1d0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1f1e0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1f1f0 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46     case SQLITE_F
1f200 4c 4f 41 54 3a 20 7b 0a 20 20 20 20 20 20 20 20  LOAT: {.        
1f210 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64      sqlite3_bind
1f220 5f 64 6f 75 62 6c 65 28 70 49 6e 73 65 72 74 2c  _double(pInsert,
1f230 20 69 2b 31 2c 20 73 71 6c 69 74 65 33 5f 63 6f   i+1, sqlite3_co
1f240 6c 75 6d 6e 5f 64 6f 75 62 6c 65 28 70 51 75 65  lumn_double(pQue
1f250 72 79 2c 69 29 29 3b 0a 20 20 20 20 20 20 20 20  ry,i));.        
1f260 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
1f270 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
1f280 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 58   case SQLITE_TEX
1f290 54 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  T: {.           
1f2a0 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65   sqlite3_bind_te
1f2b0 78 74 28 70 49 6e 73 65 72 74 2c 20 69 2b 31 2c  xt(pInsert, i+1,
1f2c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1f2d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63                (c
1f2e0 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74  onst char*)sqlit
1f2f0 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70  e3_column_text(p
1f300 51 75 65 72 79 2c 69 29 2c 0a 20 20 20 20 20 20  Query,i),.      
1f310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f320 20 20 20 20 20 20 20 2d 31 2c 20 53 51 4c 49 54         -1, SQLIT
1f330 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20  E_STATIC);.     
1f340 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
1f350 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1f360 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
1f370 42 4c 4f 42 3a 20 7b 0a 20 20 20 20 20 20 20 20  BLOB: {.        
1f380 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64      sqlite3_bind
1f390 5f 62 6c 6f 62 28 70 49 6e 73 65 72 74 2c 20 69  _blob(pInsert, i
1f3a0 2b 31 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  +1, sqlite3_colu
1f3b0 6d 6e 5f 62 6c 6f 62 28 70 51 75 65 72 79 2c 69  mn_blob(pQuery,i
1f3c0 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
1f3d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f3e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
1f3f0 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79  qlite3_column_by
1f400 74 65 73 28 70 51 75 65 72 79 2c 69 29 2c 0a 20  tes(pQuery,i),. 
1f410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f430 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
1f440 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20  E_STATIC);.     
1f450 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
1f460 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1f470 20 20 7d 0a 20 20 20 20 20 20 7d 20 2f 2a 20 45    }.      } /* E
1f480 6e 64 20 66 6f 72 20 2a 2f 0a 20 20 20 20 20 20  nd for */.      
1f490 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 65  rc = sqlite3_ste
1f4a0 70 28 70 49 6e 73 65 72 74 29 3b 0a 20 20 20 20  p(pInsert);.    
1f4b0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1f4c0 5f 4f 4b 20 26 26 20 72 63 21 3d 53 51 4c 49 54  _OK && rc!=SQLIT
1f4d0 45 5f 52 4f 57 20 26 26 20 72 63 21 3d 53 51 4c  E_ROW && rc!=SQL
1f4e0 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20  ITE_DONE ){.    
1f4f0 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
1f500 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72 20 25  stderr, "Error %
1f510 64 3a 20 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65  d: %s\n", sqlite
1f520 33 5f 65 78 74 65 6e 64 65 64 5f 65 72 72 63 6f  3_extended_errco
1f530 64 65 28 6e 65 77 44 62 29 2c 0a 20 20 20 20 20  de(newDb),.     
1f540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f550 20 20 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73     sqlite3_errms
1f560 67 28 6e 65 77 44 62 29 29 3b 0a 20 20 20 20 20  g(newDb));.     
1f570 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
1f580 5f 72 65 73 65 74 28 70 49 6e 73 65 72 74 29 3b  _reset(pInsert);
1f590 0a 20 20 20 20 20 20 63 6e 74 2b 2b 3b 0a 20 20  .      cnt++;.  
1f5a0 20 20 20 20 69 66 28 20 28 63 6e 74 25 73 70 69      if( (cnt%spi
1f5b0 6e 52 61 74 65 29 3d 3d 30 20 29 7b 0a 20 20 20  nRate)==0 ){.   
1f5c0 20 20 20 20 20 70 72 69 6e 74 66 28 22 25 63 5c       printf("%c\
1f5d0 62 22 2c 20 22 7c 2f 2d 5c 5c 22 5b 28 63 6e 74  b", "|/-\\"[(cnt
1f5e0 2f 73 70 69 6e 52 61 74 65 29 25 34 5d 29 3b 0a  /spinRate)%4]);.
1f5f0 20 20 20 20 20 20 20 20 66 66 6c 75 73 68 28 73          fflush(s
1f600 74 64 6f 75 74 29 3b 0a 20 20 20 20 20 20 7d 0a  tdout);.      }.
1f610 20 20 20 20 7d 20 2f 2a 20 45 6e 64 20 77 68 69      } /* End whi
1f620 6c 65 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63  le */.    if( rc
1f630 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 20  ==SQLITE_DONE ) 
1f640 62 72 65 61 6b 3b 0a 20 20 20 20 73 71 6c 69 74  break;.    sqlit
1f650 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 51 75 65  e3_finalize(pQue
1f660 72 79 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ry);.    sqlite3
1f670 5f 66 72 65 65 28 7a 51 75 65 72 79 29 3b 0a 20  _free(zQuery);. 
1f680 20 20 20 7a 51 75 65 72 79 20 3d 20 73 71 6c 69     zQuery = sqli
1f690 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 53 45 4c  te3_mprintf("SEL
1f6a0 45 43 54 20 2a 20 46 52 4f 4d 20 5c 22 25 77 5c  ECT * FROM \"%w\
1f6b0 22 20 4f 52 44 45 52 20 42 59 20 72 6f 77 69 64  " ORDER BY rowid
1f6c0 20 44 45 53 43 3b 22 2c 0a 20 20 20 20 20 20 20   DESC;",.       
1f6d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f6e0 20 20 20 20 20 20 7a 54 61 62 6c 65 29 3b 0a 20        zTable);. 
1f6f0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
1f700 70 72 65 70 61 72 65 5f 76 32 28 70 2d 3e 64 62  prepare_v2(p->db
1f710 2c 20 7a 51 75 65 72 79 2c 20 2d 31 2c 20 26 70  , zQuery, -1, &p
1f720 51 75 65 72 79 2c 20 30 29 3b 0a 20 20 20 20 69  Query, 0);.    i
1f730 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 75  f( rc ){.      u
1f740 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72  tf8_printf(stder
1f750 72 2c 20 22 57 61 72 6e 69 6e 67 3a 20 63 61 6e  r, "Warning: can
1f760 6e 6f 74 20 73 74 65 70 20 5c 22 25 73 5c 22 20  not step \"%s\" 
1f770 62 61 63 6b 77 61 72 64 73 22 2c 20 7a 54 61 62  backwards", zTab
1f780 6c 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  le);.      break
1f790 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 2f 2a 20 45  ;.    }.  } /* E
1f7a0 6e 64 20 66 6f 72 28 6b 3d 30 2e 2e 2e 29 20 2a  nd for(k=0...) *
1f7b0 2f 0a 0a 65 6e 64 5f 64 61 74 61 5f 78 66 65 72  /..end_data_xfer
1f7c0 3a 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61  :.  sqlite3_fina
1f7d0 6c 69 7a 65 28 70 51 75 65 72 79 29 3b 0a 20 20  lize(pQuery);.  
1f7e0 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
1f7f0 28 70 49 6e 73 65 72 74 29 3b 0a 20 20 73 71 6c  (pInsert);.  sql
1f800 69 74 65 33 5f 66 72 65 65 28 7a 51 75 65 72 79  ite3_free(zQuery
1f810 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
1f820 65 28 7a 49 6e 73 65 72 74 29 3b 0a 7d 0a 0a 0a  e(zInsert);.}...
1f830 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 74 72 61  /*.** Try to tra
1f840 6e 73 66 65 72 20 61 6c 6c 20 72 6f 77 73 20 6f  nsfer all rows o
1f850 66 20 74 68 65 20 73 63 68 65 6d 61 20 74 68 61  f the schema tha
1f860 74 20 6d 61 74 63 68 20 7a 57 68 65 72 65 2e 20  t match zWhere. 
1f870 20 46 6f 72 0a 2a 2a 20 65 61 63 68 20 72 6f 77   For.** each row
1f880 2c 20 69 6e 76 6f 6b 65 20 78 46 6f 72 45 61 63  , invoke xForEac
1f890 68 28 29 20 6f 6e 20 74 68 65 20 6f 62 6a 65 63  h() on the objec
1f8a0 74 20 64 65 66 69 6e 65 64 20 62 79 20 74 68 61  t defined by tha
1f8b0 74 20 72 6f 77 2e 0a 2a 2a 20 49 66 20 61 6e 20  t row..** If an 
1f8c0 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74  error is encount
1f8d0 65 72 65 64 20 77 68 69 6c 65 20 6d 6f 76 69 6e  ered while movin
1f8e0 67 20 66 6f 72 77 61 72 64 20 74 68 72 6f 75 67  g forward throug
1f8f0 68 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 5f  h the.** sqlite_
1f900 6d 61 73 74 65 72 20 74 61 62 6c 65 2c 20 74 72  master table, tr
1f910 79 20 61 67 61 69 6e 20 6d 6f 76 69 6e 67 20 62  y again moving b
1f920 61 63 6b 77 61 72 64 73 2e 0a 2a 2f 0a 73 74 61  ackwards..*/.sta
1f930 74 69 63 20 76 6f 69 64 20 74 72 79 54 6f 43 6c  tic void tryToCl
1f940 6f 6e 65 53 63 68 65 6d 61 28 0a 20 20 53 68 65  oneSchema(.  She
1f950 6c 6c 53 74 61 74 65 20 2a 70 2c 0a 20 20 73 71  llState *p,.  sq
1f960 6c 69 74 65 33 20 2a 6e 65 77 44 62 2c 0a 20 20  lite3 *newDb,.  
1f970 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 57 68 65  const char *zWhe
1f980 72 65 2c 0a 20 20 76 6f 69 64 20 28 2a 78 46 6f  re,.  void (*xFo
1f990 72 45 61 63 68 29 28 53 68 65 6c 6c 53 74 61 74  rEach)(ShellStat
1f9a0 65 2a 2c 73 71 6c 69 74 65 33 2a 2c 63 6f 6e 73  e*,sqlite3*,cons
1f9b0 74 20 63 68 61 72 2a 29 0a 29 7b 0a 20 20 73 71  t char*).){.  sq
1f9c0 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 51 75 65  lite3_stmt *pQue
1f9d0 72 79 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a  ry = 0;.  char *
1f9e0 7a 51 75 65 72 79 20 3d 20 30 3b 0a 20 20 69 6e  zQuery = 0;.  in
1f9f0 74 20 72 63 3b 0a 20 20 63 6f 6e 73 74 20 75 6e  t rc;.  const un
1fa00 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 4e 61  signed char *zNa
1fa10 6d 65 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69  me;.  const unsi
1fa20 67 6e 65 64 20 63 68 61 72 20 2a 7a 53 71 6c 3b  gned char *zSql;
1fa30 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 4d 73 67  .  char *zErrMsg
1fa40 20 3d 20 30 3b 0a 0a 20 20 7a 51 75 65 72 79 20   = 0;..  zQuery 
1fa50 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
1fa60 66 28 22 53 45 4c 45 43 54 20 6e 61 6d 65 2c 20  f("SELECT name, 
1fa70 73 71 6c 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f  sql FROM sqlite_
1fa80 6d 61 73 74 65 72 22 0a 20 20 20 20 20 20 20 20  master".        
1fa90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1faa0 20 20 20 22 20 57 48 45 52 45 20 25 73 22 2c 20     " WHERE %s", 
1fab0 7a 57 68 65 72 65 29 3b 0a 20 20 72 63 20 3d 20  zWhere);.  rc = 
1fac0 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f  sqlite3_prepare_
1fad0 76 32 28 70 2d 3e 64 62 2c 20 7a 51 75 65 72 79  v2(p->db, zQuery
1fae0 2c 20 2d 31 2c 20 26 70 51 75 65 72 79 2c 20 30  , -1, &pQuery, 0
1faf0 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  );.  if( rc ){. 
1fb00 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73     utf8_printf(s
1fb10 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 28  tderr, "Error: (
1fb20 25 64 29 20 25 73 20 6f 6e 20 5b 25 73 5d 5c 6e  %d) %s on [%s]\n
1fb30 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
1fb40 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65         sqlite3_e
1fb50 78 74 65 6e 64 65 64 5f 65 72 72 63 6f 64 65 28  xtended_errcode(
1fb60 70 2d 3e 64 62 29 2c 20 73 71 6c 69 74 65 33 5f  p->db), sqlite3_
1fb70 65 72 72 6d 73 67 28 70 2d 3e 64 62 29 2c 0a 20  errmsg(p->db),. 
1fb80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fb90 20 20 20 7a 51 75 65 72 79 29 3b 0a 20 20 20 20     zQuery);.    
1fba0 67 6f 74 6f 20 65 6e 64 5f 73 63 68 65 6d 61 5f  goto end_schema_
1fbb0 78 66 65 72 3b 0a 20 20 7d 0a 20 20 77 68 69 6c  xfer;.  }.  whil
1fbc0 65 28 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33  e( (rc = sqlite3
1fbd0 5f 73 74 65 70 28 70 51 75 65 72 79 29 29 3d 3d  _step(pQuery))==
1fbe0 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20  SQLITE_ROW ){.  
1fbf0 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65    zName = sqlite
1fc00 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 51  3_column_text(pQ
1fc10 75 65 72 79 2c 20 30 29 3b 0a 20 20 20 20 7a 53  uery, 0);.    zS
1fc20 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  ql = sqlite3_col
1fc30 75 6d 6e 5f 74 65 78 74 28 70 51 75 65 72 79 2c  umn_text(pQuery,
1fc40 20 31 29 3b 0a 20 20 20 20 70 72 69 6e 74 66 28   1);.    printf(
1fc50 22 25 73 2e 2e 2e 20 22 2c 20 7a 4e 61 6d 65 29  "%s... ", zName)
1fc60 3b 20 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29  ; fflush(stdout)
1fc70 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 65 78  ;.    sqlite3_ex
1fc80 65 63 28 6e 65 77 44 62 2c 20 28 63 6f 6e 73 74  ec(newDb, (const
1fc90 20 63 68 61 72 2a 29 7a 53 71 6c 2c 20 30 2c 20   char*)zSql, 0, 
1fca0 30 2c 20 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20  0, &zErrMsg);.  
1fcb0 20 20 69 66 28 20 7a 45 72 72 4d 73 67 20 29 7b    if( zErrMsg ){
1fcc0 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e  .      utf8_prin
1fcd0 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f  tf(stderr, "Erro
1fce0 72 3a 20 25 73 5c 6e 53 51 4c 3a 20 5b 25 73 5d  r: %s\nSQL: [%s]
1fcf0 5c 6e 22 2c 20 7a 45 72 72 4d 73 67 2c 20 7a 53  \n", zErrMsg, zS
1fd00 71 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ql);.      sqlit
1fd10 65 33 5f 66 72 65 65 28 7a 45 72 72 4d 73 67 29  e3_free(zErrMsg)
1fd20 3b 0a 20 20 20 20 20 20 7a 45 72 72 4d 73 67 20  ;.      zErrMsg 
1fd30 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  = 0;.    }.    i
1fd40 66 28 20 78 46 6f 72 45 61 63 68 20 29 7b 0a 20  f( xForEach ){. 
1fd50 20 20 20 20 20 78 46 6f 72 45 61 63 68 28 70 2c       xForEach(p,
1fd60 20 6e 65 77 44 62 2c 20 28 63 6f 6e 73 74 20 63   newDb, (const c
1fd70 68 61 72 2a 29 7a 4e 61 6d 65 29 3b 0a 20 20 20  har*)zName);.   
1fd80 20 7d 0a 20 20 20 20 70 72 69 6e 74 66 28 22 64   }.    printf("d
1fd90 6f 6e 65 5c 6e 22 29 3b 0a 20 20 7d 0a 20 20 69  one\n");.  }.  i
1fda0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f  f( rc!=SQLITE_DO
1fdb0 4e 45 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  NE ){.    sqlite
1fdc0 33 5f 66 69 6e 61 6c 69 7a 65 28 70 51 75 65 72  3_finalize(pQuer
1fdd0 79 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  y);.    sqlite3_
1fde0 66 72 65 65 28 7a 51 75 65 72 79 29 3b 0a 20 20  free(zQuery);.  
1fdf0 20 20 7a 51 75 65 72 79 20 3d 20 73 71 6c 69 74    zQuery = sqlit
1fe00 65 33 5f 6d 70 72 69 6e 74 66 28 22 53 45 4c 45  e3_mprintf("SELE
1fe10 43 54 20 6e 61 6d 65 2c 20 73 71 6c 20 46 52 4f  CT name, sql FRO
1fe20 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 22  M sqlite_master"
1fe30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1fe40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20                " 
1fe50 57 48 45 52 45 20 25 73 20 4f 52 44 45 52 20 42  WHERE %s ORDER B
1fe60 59 20 72 6f 77 69 64 20 44 45 53 43 22 2c 20 7a  Y rowid DESC", z
1fe70 57 68 65 72 65 29 3b 0a 20 20 20 20 72 63 20 3d  Where);.    rc =
1fe80 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
1fe90 5f 76 32 28 70 2d 3e 64 62 2c 20 7a 51 75 65 72  _v2(p->db, zQuer
1fea0 79 2c 20 2d 31 2c 20 26 70 51 75 65 72 79 2c 20  y, -1, &pQuery, 
1feb0 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  0);.    if( rc )
1fec0 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69  {.      utf8_pri
1fed0 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72  ntf(stderr, "Err
1fee0 6f 72 3a 20 28 25 64 29 20 25 73 20 6f 6e 20 5b  or: (%d) %s on [
1fef0 25 73 5d 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  %s]\n",.        
1ff00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
1ff10 6c 69 74 65 33 5f 65 78 74 65 6e 64 65 64 5f 65  lite3_extended_e
1ff20 72 72 63 6f 64 65 28 70 2d 3e 64 62 29 2c 20 73  rrcode(p->db), s
1ff30 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 2d  qlite3_errmsg(p-
1ff40 3e 64 62 29 2c 0a 20 20 20 20 20 20 20 20 20 20  >db),.          
1ff50 20 20 20 20 20 20 20 20 20 20 20 20 7a 51 75 65              zQue
1ff60 72 79 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  ry);.      goto 
1ff70 65 6e 64 5f 73 63 68 65 6d 61 5f 78 66 65 72 3b  end_schema_xfer;
1ff80 0a 20 20 20 20 7d 0a 20 20 20 20 77 68 69 6c 65  .    }.    while
1ff90 28 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  ( (rc = sqlite3_
1ffa0 73 74 65 70 28 70 51 75 65 72 79 29 29 3d 3d 53  step(pQuery))==S
1ffb0 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20  QLITE_ROW ){.   
1ffc0 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74     zName = sqlit
1ffd0 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70  e3_column_text(p
1ffe0 51 75 65 72 79 2c 20 30 29 3b 0a 20 20 20 20 20  Query, 0);.     
1fff0 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f   zSql = sqlite3_
20000 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 51 75 65  column_text(pQue
20010 72 79 2c 20 31 29 3b 0a 20 20 20 20 20 20 70 72  ry, 1);.      pr
20020 69 6e 74 66 28 22 25 73 2e 2e 2e 20 22 2c 20 7a  intf("%s... ", z
20030 4e 61 6d 65 29 3b 20 66 66 6c 75 73 68 28 73 74  Name); fflush(st
20040 64 6f 75 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  dout);.      sql
20050 69 74 65 33 5f 65 78 65 63 28 6e 65 77 44 62 2c  ite3_exec(newDb,
20060 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 7a 53   (const char*)zS
20070 71 6c 2c 20 30 2c 20 30 2c 20 26 7a 45 72 72 4d  ql, 0, 0, &zErrM
20080 73 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a  sg);.      if( z
20090 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20 20 20  ErrMsg ){.      
200a0 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74    utf8_printf(st
200b0 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 25 73  derr, "Error: %s
200c0 5c 6e 53 51 4c 3a 20 5b 25 73 5d 5c 6e 22 2c 20  \nSQL: [%s]\n", 
200d0 7a 45 72 72 4d 73 67 2c 20 7a 53 71 6c 29 3b 0a  zErrMsg, zSql);.
200e0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
200f0 66 72 65 65 28 7a 45 72 72 4d 73 67 29 3b 0a 20  free(zErrMsg);. 
20100 20 20 20 20 20 20 20 7a 45 72 72 4d 73 67 20 3d         zErrMsg =
20110 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
20120 20 20 69 66 28 20 78 46 6f 72 45 61 63 68 20 29    if( xForEach )
20130 7b 0a 20 20 20 20 20 20 20 20 78 46 6f 72 45 61  {.        xForEa
20140 63 68 28 70 2c 20 6e 65 77 44 62 2c 20 28 63 6f  ch(p, newDb, (co
20150 6e 73 74 20 63 68 61 72 2a 29 7a 4e 61 6d 65 29  nst char*)zName)
20160 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
20170 70 72 69 6e 74 66 28 22 64 6f 6e 65 5c 6e 22 29  printf("done\n")
20180 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 65 6e 64 5f  ;.    }.  }.end_
20190 73 63 68 65 6d 61 5f 78 66 65 72 3a 0a 20 20 73  schema_xfer:.  s
201a0 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
201b0 70 51 75 65 72 79 29 3b 0a 20 20 73 71 6c 69 74  pQuery);.  sqlit
201c0 65 33 5f 66 72 65 65 28 7a 51 75 65 72 79 29 3b  e3_free(zQuery);
201d0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61  .}../*.** Open a
201e0 20 6e 65 77 20 64 61 74 61 62 61 73 65 20 66 69   new database fi
201f0 6c 65 20 6e 61 6d 65 64 20 22 7a 4e 65 77 44 62  le named "zNewDb
20200 22 2e 20 20 54 72 79 20 74 6f 20 72 65 63 6f 76  ".  Try to recov
20210 65 72 20 61 73 20 6d 75 63 68 20 69 6e 66 6f 72  er as much infor
20220 6d 61 74 69 6f 6e 0a 2a 2a 20 61 73 20 70 6f 73  mation.** as pos
20230 73 69 62 6c 65 20 6f 75 74 20 6f 66 20 74 68 65  sible out of the
20240 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 28   main database (
20250 77 68 69 63 68 20 6d 69 67 68 74 20 62 65 20 63  which might be c
20260 6f 72 72 75 70 74 29 20 61 6e 64 20 77 72 69 74  orrupt) and writ
20270 65 20 69 74 0a 2a 2a 20 69 6e 74 6f 20 7a 4e 65  e it.** into zNe
20280 77 44 62 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  wDb..*/.static v
20290 6f 69 64 20 74 72 79 54 6f 43 6c 6f 6e 65 28 53  oid tryToClone(S
202a0 68 65 6c 6c 53 74 61 74 65 20 2a 70 2c 20 63 6f  hellState *p, co
202b0 6e 73 74 20 63 68 61 72 20 2a 7a 4e 65 77 44 62  nst char *zNewDb
202c0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73  ){.  int rc;.  s
202d0 71 6c 69 74 65 33 20 2a 6e 65 77 44 62 20 3d 20  qlite3 *newDb = 
202e0 30 3b 0a 20 20 69 66 28 20 61 63 63 65 73 73 28  0;.  if( access(
202f0 7a 4e 65 77 44 62 2c 30 29 3d 3d 30 20 29 7b 0a  zNewDb,0)==0 ){.
20300 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
20310 73 74 64 65 72 72 2c 20 22 46 69 6c 65 20 5c 22  stderr, "File \"
20320 25 73 5c 22 20 61 6c 72 65 61 64 79 20 65 78 69  %s\" already exi
20330 73 74 73 2e 5c 6e 22 2c 20 7a 4e 65 77 44 62 29  sts.\n", zNewDb)
20340 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
20350 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  }.  rc = sqlite3
20360 5f 6f 70 65 6e 28 7a 4e 65 77 44 62 2c 20 26 6e  _open(zNewDb, &n
20370 65 77 44 62 29 3b 0a 20 20 69 66 28 20 72 63 20  ewDb);.  if( rc 
20380 29 7b 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e  ){.    utf8_prin
20390 74 66 28 73 74 64 65 72 72 2c 20 22 43 61 6e 6e  tf(stderr, "Cann
203a0 6f 74 20 63 72 65 61 74 65 20 6f 75 74 70 75 74  ot create output
203b0 20 64 61 74 61 62 61 73 65 3a 20 25 73 5c 6e 22   database: %s\n"
203c0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  ,.            sq
203d0 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 6e 65 77  lite3_errmsg(new
203e0 44 62 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Db));.  }else{. 
203f0 20 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28     sqlite3_exec(
20400 70 2d 3e 64 62 2c 20 22 50 52 41 47 4d 41 20 77  p->db, "PRAGMA w
20410 72 69 74 61 62 6c 65 5f 73 63 68 65 6d 61 3d 4f  ritable_schema=O
20420 4e 3b 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  N;", 0, 0, 0);. 
20430 20 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28     sqlite3_exec(
20440 6e 65 77 44 62 2c 20 22 42 45 47 49 4e 20 45 58  newDb, "BEGIN EX
20450 43 4c 55 53 49 56 45 3b 22 2c 20 30 2c 20 30 2c  CLUSIVE;", 0, 0,
20460 20 30 29 3b 0a 20 20 20 20 74 72 79 54 6f 43 6c   0);.    tryToCl
20470 6f 6e 65 53 63 68 65 6d 61 28 70 2c 20 6e 65 77  oneSchema(p, new
20480 44 62 2c 20 22 74 79 70 65 3d 27 74 61 62 6c 65  Db, "type='table
20490 27 22 2c 20 74 72 79 54 6f 43 6c 6f 6e 65 44 61  '", tryToCloneDa
204a0 74 61 29 3b 0a 20 20 20 20 74 72 79 54 6f 43 6c  ta);.    tryToCl
204b0 6f 6e 65 53 63 68 65 6d 61 28 70 2c 20 6e 65 77  oneSchema(p, new
204c0 44 62 2c 20 22 74 79 70 65 21 3d 27 74 61 62 6c  Db, "type!='tabl
204d0 65 27 22 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  e'", 0);.    sql
204e0 69 74 65 33 5f 65 78 65 63 28 6e 65 77 44 62 2c  ite3_exec(newDb,
204f0 20 22 43 4f 4d 4d 49 54 3b 22 2c 20 30 2c 20 30   "COMMIT;", 0, 0
20500 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
20510 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20 22 50  3_exec(p->db, "P
20520 52 41 47 4d 41 20 77 72 69 74 61 62 6c 65 5f 73  RAGMA writable_s
20530 63 68 65 6d 61 3d 4f 46 46 3b 22 2c 20 30 2c 20  chema=OFF;", 0, 
20540 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  0, 0);.  }.  sql
20550 69 74 65 33 5f 63 6c 6f 73 65 28 6e 65 77 44 62  ite3_close(newDb
20560 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  );.}../*.** Chan
20570 67 65 20 74 68 65 20 6f 75 74 70 75 74 20 66 69  ge the output fi
20580 6c 65 20 62 61 63 6b 20 74 6f 20 73 74 64 6f 75  le back to stdou
20590 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  t..**.** If the 
205a0 70 2d 3e 64 6f 58 64 67 4f 70 65 6e 20 66 6c 61  p->doXdgOpen fla
205b0 67 20 69 73 20 73 65 74 2c 20 74 68 61 74 20 6d  g is set, that m
205c0 65 61 6e 73 20 74 68 65 20 6f 75 74 70 75 74 20  eans the output 
205d0 77 61 73 20 62 65 69 6e 67 0a 2a 2a 20 72 65 64  was being.** red
205e0 69 72 65 63 74 65 64 20 74 6f 20 61 20 74 65 6d  irected to a tem
205f0 70 6f 72 61 72 79 20 66 69 6c 65 20 6e 61 6d 65  porary file name
20600 64 20 62 79 20 70 2d 3e 7a 54 65 6d 70 46 69 6c  d by p->zTempFil
20610 65 2e 20 20 49 6e 20 74 68 61 74 20 63 61 73 65  e.  In that case
20620 2c 0a 2a 2a 20 6c 61 75 6e 63 68 20 73 74 61 72  ,.** launch star
20630 74 2f 6f 70 65 6e 2f 78 64 67 2d 6f 70 65 6e 20  t/open/xdg-open 
20640 6f 6e 20 74 68 61 74 20 74 65 6d 70 6f 72 61 72  on that temporar
20650 79 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  y file..*/.stati
20660 63 20 76 6f 69 64 20 6f 75 74 70 75 74 5f 72 65  c void output_re
20670 73 65 74 28 53 68 65 6c 6c 53 74 61 74 65 20 2a  set(ShellState *
20680 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 6f 75 74  p){.  if( p->out
20690 66 69 6c 65 5b 30 5d 3d 3d 27 7c 27 20 29 7b 0a  file[0]=='|' ){.
206a0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
206b0 4d 49 54 5f 50 4f 50 45 4e 0a 20 20 20 20 70 63  MIT_POPEN.    pc
206c0 6c 6f 73 65 28 70 2d 3e 6f 75 74 29 3b 0a 23 65  lose(p->out);.#e
206d0 6e 64 69 66 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ndif.  }else{.  
206e0 20 20 6f 75 74 70 75 74 5f 66 69 6c 65 5f 63 6c    output_file_cl
206f0 6f 73 65 28 70 2d 3e 6f 75 74 29 3b 0a 23 69 66  ose(p->out);.#if
20700 6e 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f 48 41  ndef SQLITE_NOHA
20710 56 45 5f 53 59 53 54 45 4d 0a 20 20 20 20 69 66  VE_SYSTEM.    if
20720 28 20 70 2d 3e 64 6f 58 64 67 4f 70 65 6e 20 29  ( p->doXdgOpen )
20730 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  {.      const ch
20740 61 72 20 2a 7a 58 64 67 4f 70 65 6e 43 6d 64 20  ar *zXdgOpenCmd 
20750 3d 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 57  =.#if defined(_W
20760 49 4e 33 32 29 0a 20 20 20 20 20 20 22 73 74 61  IN32).      "sta
20770 72 74 22 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e  rt";.#elif defin
20780 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20 20  ed(__APPLE__).  
20790 20 20 20 20 22 6f 70 65 6e 22 3b 0a 23 65 6c 73      "open";.#els
207a0 65 0a 20 20 20 20 20 20 22 78 64 67 2d 6f 70 65  e.      "xdg-ope
207b0 6e 22 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  n";.#endif.     
207c0 20 63 68 61 72 20 2a 7a 43 6d 64 3b 0a 20 20 20   char *zCmd;.   
207d0 20 20 20 7a 43 6d 64 20 3d 20 73 71 6c 69 74 65     zCmd = sqlite
207e0 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 20 25 73  3_mprintf("%s %s
207f0 22 2c 20 7a 58 64 67 4f 70 65 6e 43 6d 64 2c 20  ", zXdgOpenCmd, 
20800 70 2d 3e 7a 54 65 6d 70 46 69 6c 65 29 3b 0a 20  p->zTempFile);. 
20810 20 20 20 20 20 69 66 28 20 73 79 73 74 65 6d 28       if( system(
20820 7a 43 6d 64 29 20 29 7b 0a 20 20 20 20 20 20 20  zCmd) ){.       
20830 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64   utf8_printf(std
20840 65 72 72 2c 20 22 46 61 69 6c 65 64 3a 20 5b 25  err, "Failed: [%
20850 73 5d 5c 6e 22 2c 20 7a 43 6d 64 29 3b 0a 20 20  s]\n", zCmd);.  
20860 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
20870 74 65 33 5f 66 72 65 65 28 7a 43 6d 64 29 3b 0a  te3_free(zCmd);.
20880 20 20 20 20 20 20 6f 75 74 70 75 74 4d 6f 64 65        outputMode
20890 50 6f 70 28 70 29 3b 0a 20 20 20 20 20 20 70 2d  Pop(p);.      p-
208a0 3e 64 6f 58 64 67 4f 70 65 6e 20 3d 20 30 3b 0a  >doXdgOpen = 0;.
208b0 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20      }.#endif /* 
208c0 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
208d0 4e 4f 48 41 56 45 5f 53 59 53 54 45 4d 29 20 2a  NOHAVE_SYSTEM) *
208e0 2f 0a 20 20 7d 0a 20 20 70 2d 3e 6f 75 74 66 69  /.  }.  p->outfi
208f0 6c 65 5b 30 5d 20 3d 20 30 3b 0a 20 20 70 2d 3e  le[0] = 0;.  p->
20900 6f 75 74 20 3d 20 73 74 64 6f 75 74 3b 0a 7d 0a  out = stdout;.}.
20910 0a 2f 2a 0a 2a 2a 20 52 75 6e 20 61 6e 20 53 51  ./*.** Run an SQ
20920 4c 20 63 6f 6d 6d 61 6e 64 20 61 6e 64 20 72 65  L command and re
20930 74 75 72 6e 20 74 68 65 20 73 69 6e 67 6c 65 20  turn the single 
20940 69 6e 74 65 67 65 72 20 72 65 73 75 6c 74 2e 0a  integer result..
20950 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 62  */.static int db
20960 5f 69 6e 74 28 53 68 65 6c 6c 53 74 61 74 65 20  _int(ShellState 
20970 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  *p, const char *
20980 7a 53 71 6c 29 7b 0a 20 20 73 71 6c 69 74 65 33  zSql){.  sqlite3
20990 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20  _stmt *pStmt;.  
209a0 69 6e 74 20 72 65 73 20 3d 20 30 3b 0a 20 20 73  int res = 0;.  s
209b0 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76  qlite3_prepare_v
209c0 32 28 70 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d  2(p->db, zSql, -
209d0 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20  1, &pStmt, 0);. 
209e0 20 69 66 28 20 70 53 74 6d 74 20 26 26 20 73 71   if( pStmt && sq
209f0 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74  lite3_step(pStmt
20a00 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b  )==SQLITE_ROW ){
20a10 0a 20 20 20 20 72 65 73 20 3d 20 73 71 6c 69 74  .    res = sqlit
20a20 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53  e3_column_int(pS
20a30 74 6d 74 2c 30 29 3b 0a 20 20 7d 0a 20 20 73 71  tmt,0);.  }.  sq
20a40 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
20a50 53 74 6d 74 29 3b 0a 20 20 72 65 74 75 72 6e 20  Stmt);.  return 
20a60 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  res;.}../*.** Co
20a70 6e 76 65 72 74 20 61 20 32 2d 62 79 74 65 20 6f  nvert a 2-byte o
20a80 72 20 34 2d 62 79 74 65 20 62 69 67 2d 65 6e 64  r 4-byte big-end
20a90 69 61 6e 20 69 6e 74 65 67 65 72 20 69 6e 74 6f  ian integer into
20aa0 20 61 20 6e 61 74 69 76 65 20 69 6e 74 65 67 65   a native intege
20ab0 72 0a 2a 2f 0a 73 74 61 74 69 63 20 75 6e 73 69  r.*/.static unsi
20ac0 67 6e 65 64 20 69 6e 74 20 67 65 74 32 62 79 74  gned int get2byt
20ad0 65 49 6e 74 28 75 6e 73 69 67 6e 65 64 20 63 68  eInt(unsigned ch
20ae0 61 72 20 2a 61 29 7b 0a 20 20 72 65 74 75 72 6e  ar *a){.  return
20af0 20 28 61 5b 30 5d 3c 3c 38 29 20 2b 20 61 5b 31   (a[0]<<8) + a[1
20b00 5d 3b 0a 7d 0a 73 74 61 74 69 63 20 75 6e 73 69  ];.}.static unsi
20b10 67 6e 65 64 20 69 6e 74 20 67 65 74 34 62 79 74  gned int get4byt
20b20 65 49 6e 74 28 75 6e 73 69 67 6e 65 64 20 63 68  eInt(unsigned ch
20b30 61 72 20 2a 61 29 7b 0a 20 20 72 65 74 75 72 6e  ar *a){.  return
20b40 20 28 61 5b 30 5d 3c 3c 32 34 29 20 2b 20 28 61   (a[0]<<24) + (a
20b50 5b 31 5d 3c 3c 31 36 29 20 2b 20 28 61 5b 32 5d  [1]<<16) + (a[2]
20b60 3c 3c 38 29 20 2b 20 61 5b 33 5d 3b 0a 7d 0a 0a  <<8) + a[3];.}..
20b70 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61  /*.** Implementa
20b80 74 69 6f 6e 20 6f 66 20 74 68 65 20 22 2e 69 6e  tion of the ".in
20b90 66 6f 22 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a  fo" command..**.
20ba0 2a 2a 20 52 65 74 75 72 6e 20 31 20 6f 6e 20 65  ** Return 1 on e
20bb0 72 72 6f 72 2c 20 32 20 74 6f 20 65 78 69 74 2c  rror, 2 to exit,
20bc0 20 61 6e 64 20 30 20 6f 74 68 65 72 77 69 73 65   and 0 otherwise
20bd0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
20be0 73 68 65 6c 6c 5f 64 62 69 6e 66 6f 5f 63 6f 6d  shell_dbinfo_com
20bf0 6d 61 6e 64 28 53 68 65 6c 6c 53 74 61 74 65 20  mand(ShellState 
20c00 2a 70 2c 20 69 6e 74 20 6e 41 72 67 2c 20 63 68  *p, int nArg, ch
20c10 61 72 20 2a 2a 61 7a 41 72 67 29 7b 0a 20 20 73  ar **azArg){.  s
20c20 74 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75  tatic const stru
20c30 63 74 20 7b 20 63 6f 6e 73 74 20 63 68 61 72 20  ct { const char 
20c40 2a 7a 4e 61 6d 65 3b 20 69 6e 74 20 6f 66 73 74  *zName; int ofst
20c50 3b 20 7d 20 61 46 69 65 6c 64 5b 5d 20 3d 20 7b  ; } aField[] = {
20c60 0a 20 20 20 20 20 7b 20 22 66 69 6c 65 20 63 68  .     { "file ch
20c70 61 6e 67 65 20 63 6f 75 6e 74 65 72 3a 22 2c 20  ange counter:", 
20c80 20 32 34 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22   24  },.     { "
20c90 64 61 74 61 62 61 73 65 20 70 61 67 65 20 63 6f  database page co
20ca0 75 6e 74 3a 22 2c 20 20 32 38 20 20 7d 2c 0a 20  unt:",  28  },. 
20cb0 20 20 20 20 7b 20 22 66 72 65 65 6c 69 73 74 20      { "freelist 
20cc0 70 61 67 65 20 63 6f 75 6e 74 3a 22 2c 20 20 33  page count:",  3
20cd0 36 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 63  6  },.     { "sc
20ce0 68 65 6d 61 20 63 6f 6f 6b 69 65 3a 22 2c 20 20  hema cookie:",  
20cf0 20 20 20 20 20 20 34 30 20 20 7d 2c 0a 20 20 20        40  },.   
20d00 20 20 7b 20 22 73 63 68 65 6d 61 20 66 6f 72 6d    { "schema form
20d10 61 74 3a 22 2c 20 20 20 20 20 20 20 20 34 34 20  at:",        44 
20d20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 64 65 66 61   },.     { "defa
20d30 75 6c 74 20 63 61 63 68 65 20 73 69 7a 65 3a 22  ult cache size:"
20d40 2c 20 20 20 34 38 20 20 7d 2c 0a 20 20 20 20 20  ,   48  },.     
20d50 7b 20 22 61 75 74 6f 76 61 63 75 75 6d 20 74 6f  { "autovacuum to
20d60 70 20 72 6f 6f 74 3a 22 2c 20 20 35 32 20 20 7d  p root:",  52  }
20d70 2c 0a 20 20 20 20 20 7b 20 22 69 6e 63 72 65 6d  ,.     { "increm
20d80 65 6e 74 61 6c 20 76 61 63 75 75 6d 3a 22 2c 20  ental vacuum:", 
20d90 20 20 36 34 20 20 7d 2c 0a 20 20 20 20 20 7b 20    64  },.     { 
20da0 22 74 65 78 74 20 65 6e 63 6f 64 69 6e 67 3a 22  "text encoding:"
20db0 2c 20 20 20 20 20 20 20 20 35 36 20 20 7d 2c 0a  ,        56  },.
20dc0 20 20 20 20 20 7b 20 22 75 73 65 72 20 76 65 72       { "user ver
20dd0 73 69 6f 6e 3a 22 2c 20 20 20 20 20 20 20 20 20  sion:",         
20de0 36 30 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 61  60  },.     { "a
20df0 70 70 6c 69 63 61 74 69 6f 6e 20 69 64 3a 22 2c  pplication id:",
20e00 20 20 20 20 20 20 20 36 38 20 20 7d 2c 0a 20 20         68  },.  
20e10 20 20 20 7b 20 22 73 6f 66 74 77 61 72 65 20 76     { "software v
20e20 65 72 73 69 6f 6e 3a 22 2c 20 20 20 20 20 39 36  ersion:",     96
20e30 20 20 7d 2c 0a 20 20 7d 3b 0a 20 20 73 74 61 74    },.  };.  stat
20e40 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20  ic const struct 
20e50 7b 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e  { const char *zN
20e60 61 6d 65 3b 20 63 6f 6e 73 74 20 63 68 61 72 20  ame; const char 
20e70 2a 7a 53 71 6c 3b 20 7d 20 61 51 75 65 72 79 5b  *zSql; } aQuery[
20e80 5d 20 3d 20 7b 0a 20 20 20 20 20 7b 20 22 6e 75  ] = {.     { "nu
20e90 6d 62 65 72 20 6f 66 20 74 61 62 6c 65 73 3a 22  mber of tables:"
20ea0 2c 0a 20 20 20 20 20 20 20 22 53 45 4c 45 43 54  ,.       "SELECT
20eb0 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 25   count(*) FROM %
20ec0 73 20 57 48 45 52 45 20 74 79 70 65 3d 27 74 61  s WHERE type='ta
20ed0 62 6c 65 27 22 20 7d 2c 0a 20 20 20 20 20 7b 20  ble'" },.     { 
20ee0 22 6e 75 6d 62 65 72 20 6f 66 20 69 6e 64 65 78  "number of index
20ef0 65 73 3a 22 2c 0a 20 20 20 20 20 20 20 22 53 45  es:",.       "SE
20f00 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52  LECT count(*) FR
20f10 4f 4d 20 25 73 20 57 48 45 52 45 20 74 79 70 65  OM %s WHERE type
20f20 3d 27 69 6e 64 65 78 27 22 20 7d 2c 0a 20 20 20  ='index'" },.   
20f30 20 20 7b 20 22 6e 75 6d 62 65 72 20 6f 66 20 74    { "number of t
20f40 72 69 67 67 65 72 73 3a 22 2c 0a 20 20 20 20 20  riggers:",.     
20f50 20 20 22 53 45 4c 45 43 54 20 63 6f 75 6e 74 28    "SELECT count(
20f60 2a 29 20 46 52 4f 4d 20 25 73 20 57 48 45 52 45  *) FROM %s WHERE
20f70 20 74 79 70 65 3d 27 74 72 69 67 67 65 72 27 22   type='trigger'"
20f80 20 7d 2c 0a 20 20 20 20 20 7b 20 22 6e 75 6d 62   },.     { "numb
20f90 65 72 20 6f 66 20 76 69 65 77 73 3a 22 2c 0a 20  er of views:",. 
20fa0 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 63 6f        "SELECT co
20fb0 75 6e 74 28 2a 29 20 46 52 4f 4d 20 25 73 20 57  unt(*) FROM %s W
20fc0 48 45 52 45 20 74 79 70 65 3d 27 76 69 65 77 27  HERE type='view'
20fd0 22 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 63 68  " },.     { "sch
20fe0 65 6d 61 20 73 69 7a 65 3a 22 2c 0a 20 20 20 20  ema size:",.    
20ff0 20 20 20 22 53 45 4c 45 43 54 20 74 6f 74 61 6c     "SELECT total
21000 28 6c 65 6e 67 74 68 28 73 71 6c 29 29 20 46 52  (length(sql)) FR
21010 4f 4d 20 25 73 22 20 7d 2c 0a 20 20 7d 3b 0a 20  OM %s" },.  };. 
21020 20 69 6e 74 20 69 3b 0a 20 20 63 68 61 72 20 2a   int i;.  char *
21030 7a 53 63 68 65 6d 61 54 61 62 3b 0a 20 20 63 68  zSchemaTab;.  ch
21040 61 72 20 2a 7a 44 62 20 3d 20 6e 41 72 67 3e 3d  ar *zDb = nArg>=
21050 32 20 3f 20 61 7a 41 72 67 5b 31 5d 20 3a 20 22  2 ? azArg[1] : "
21060 6d 61 69 6e 22 3b 0a 20 20 73 71 6c 69 74 65 33  main";.  sqlite3
21070 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30  _stmt *pStmt = 0
21080 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ;.  unsigned cha
21090 72 20 61 48 64 72 5b 31 30 30 5d 3b 0a 20 20 6f  r aHdr[100];.  o
210a0 70 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a 20 20  pen_db(p, 0);.  
210b0 69 66 28 20 70 2d 3e 64 62 3d 3d 30 20 29 20 72  if( p->db==0 ) r
210c0 65 74 75 72 6e 20 31 3b 0a 20 20 73 71 6c 69 74  eturn 1;.  sqlit
210d0 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 70 2d  e3_prepare_v2(p-
210e0 3e 64 62 2c 22 53 45 4c 45 43 54 20 64 61 74 61  >db,"SELECT data
210f0 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 64 62 70   FROM sqlite_dbp
21100 61 67 65 28 3f 31 29 20 57 48 45 52 45 20 70 67  age(?1) WHERE pg
21110 6e 6f 3d 31 22 2c 0a 20 20 20 20 20 20 20 20 20  no=1",.         
21120 20 20 20 20 20 20 20 20 20 20 20 20 2d 31 2c 20              -1, 
21130 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 73 71  &pStmt, 0);.  sq
21140 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 28  lite3_bind_text(
21150 70 53 74 6d 74 2c 20 31 2c 20 7a 44 62 2c 20 2d  pStmt, 1, zDb, -
21160 31 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43  1, SQLITE_STATIC
21170 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  );.  if( sqlite3
21180 5f 73 74 65 70 28 70 53 74 6d 74 29 3d 3d 53 51  _step(pStmt)==SQ
21190 4c 49 54 45 5f 52 4f 57 0a 20 20 20 26 26 20 73  LITE_ROW.   && s
211a0 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79  qlite3_column_by
211b0 74 65 73 28 70 53 74 6d 74 2c 30 29 3e 31 30 30  tes(pStmt,0)>100
211c0 0a 20 20 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79  .  ){.    memcpy
211d0 28 61 48 64 72 2c 20 73 71 6c 69 74 65 33 5f 63  (aHdr, sqlite3_c
211e0 6f 6c 75 6d 6e 5f 62 6c 6f 62 28 70 53 74 6d 74  olumn_blob(pStmt
211f0 2c 30 29 2c 20 31 30 30 29 3b 0a 20 20 20 20 73  ,0), 100);.    s
21200 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
21210 70 53 74 6d 74 29 3b 0a 20 20 7d 65 6c 73 65 7b  pStmt);.  }else{
21220 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28  .    raw_printf(
21230 73 74 64 65 72 72 2c 20 22 75 6e 61 62 6c 65 20  stderr, "unable 
21240 74 6f 20 72 65 61 64 20 64 61 74 61 62 61 73 65  to read database
21250 20 68 65 61 64 65 72 5c 6e 22 29 3b 0a 20 20 20   header\n");.   
21260 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
21270 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 72 65  e(pStmt);.    re
21280 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 20  turn 1;.  }.  i 
21290 3d 20 67 65 74 32 62 79 74 65 49 6e 74 28 61 48  = get2byteInt(aH
212a0 64 72 2b 31 36 29 3b 0a 20 20 69 66 28 20 69 3d  dr+16);.  if( i=
212b0 3d 31 20 29 20 69 20 3d 20 36 35 35 33 36 3b 0a  =1 ) i = 65536;.
212c0 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d    utf8_printf(p-
212d0 3e 6f 75 74 2c 20 22 25 2d 32 30 73 20 25 64 5c  >out, "%-20s %d\
212e0 6e 22 2c 20 22 64 61 74 61 62 61 73 65 20 70 61  n", "database pa
212f0 67 65 20 73 69 7a 65 3a 22 2c 20 69 29 3b 0a 20  ge size:", i);. 
21300 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e   utf8_printf(p->
21310 6f 75 74 2c 20 22 25 2d 32 30 73 20 25 64 5c 6e  out, "%-20s %d\n
21320 22 2c 20 22 77 72 69 74 65 20 66 6f 72 6d 61 74  ", "write format
21330 3a 22 2c 20 61 48 64 72 5b 31 38 5d 29 3b 0a 20  :", aHdr[18]);. 
21340 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e   utf8_printf(p->
21350 6f 75 74 2c 20 22 25 2d 32 30 73 20 25 64 5c 6e  out, "%-20s %d\n
21360 22 2c 20 22 72 65 61 64 20 66 6f 72 6d 61 74 3a  ", "read format:
21370 22 2c 20 61 48 64 72 5b 31 39 5d 29 3b 0a 20 20  ", aHdr[19]);.  
21380 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f  utf8_printf(p->o
21390 75 74 2c 20 22 25 2d 32 30 73 20 25 64 5c 6e 22  ut, "%-20s %d\n"
213a0 2c 20 22 72 65 73 65 72 76 65 64 20 62 79 74 65  , "reserved byte
213b0 73 3a 22 2c 20 61 48 64 72 5b 32 30 5d 29 3b 0a  s:", aHdr[20]);.
213c0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 41 72 72    for(i=0; i<Arr
213d0 61 79 53 69 7a 65 28 61 46 69 65 6c 64 29 3b 20  aySize(aField); 
213e0 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6f 66  i++){.    int of
213f0 73 74 20 3d 20 61 46 69 65 6c 64 5b 69 5d 2e 6f  st = aField[i].o
21400 66 73 74 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65  fst;.    unsigne
21410 64 20 69 6e 74 20 76 61 6c 20 3d 20 67 65 74 34  d int val = get4
21420 62 79 74 65 49 6e 74 28 61 48 64 72 20 2b 20 6f  byteInt(aHdr + o
21430 66 73 74 29 3b 0a 20 20 20 20 75 74 66 38 5f 70  fst);.    utf8_p
21440 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25  rintf(p->out, "%
21450 2d 32 30 73 20 25 75 22 2c 20 61 46 69 65 6c 64  -20s %u", aField
21460 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 76 61 6c 29 3b  [i].zName, val);
21470 0a 20 20 20 20 73 77 69 74 63 68 28 20 6f 66 73  .    switch( ofs
21480 74 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20  t ){.      case 
21490 35 36 3a 20 7b 0a 20 20 20 20 20 20 20 20 69 66  56: {.        if
214a0 28 20 76 61 6c 3d 3d 31 20 29 20 72 61 77 5f 70  ( val==1 ) raw_p
214b0 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 20  rintf(p->out, " 
214c0 28 75 74 66 38 29 22 29 3b 0a 20 20 20 20 20 20  (utf8)");.      
214d0 20 20 69 66 28 20 76 61 6c 3d 3d 32 20 29 20 72    if( val==2 ) r
214e0 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  aw_printf(p->out
214f0 2c 20 22 20 28 75 74 66 31 36 6c 65 29 22 29 3b  , " (utf16le)");
21500 0a 20 20 20 20 20 20 20 20 69 66 28 20 76 61 6c  .        if( val
21510 3d 3d 33 20 29 20 72 61 77 5f 70 72 69 6e 74 66  ==3 ) raw_printf
21520 28 70 2d 3e 6f 75 74 2c 20 22 20 28 75 74 66 31  (p->out, " (utf1
21530 36 62 65 29 22 29 3b 0a 20 20 20 20 20 20 7d 0a  6be)");.      }.
21540 20 20 20 20 7d 0a 20 20 20 20 72 61 77 5f 70 72      }.    raw_pr
21550 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 5c 6e  intf(p->out, "\n
21560 22 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a 44  ");.  }.  if( zD
21570 62 3d 3d 30 20 29 7b 0a 20 20 20 20 7a 53 63 68  b==0 ){.    zSch
21580 65 6d 61 54 61 62 20 3d 20 73 71 6c 69 74 65 33  emaTab = sqlite3
21590 5f 6d 70 72 69 6e 74 66 28 22 6d 61 69 6e 2e 73  _mprintf("main.s
215a0 71 6c 69 74 65 5f 6d 61 73 74 65 72 22 29 3b 0a  qlite_master");.
215b0 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
215c0 6d 70 28 7a 44 62 2c 22 74 65 6d 70 22 29 3d 3d  mp(zDb,"temp")==
215d0 30 20 29 7b 0a 20 20 20 20 7a 53 63 68 65 6d 61  0 ){.    zSchema
215e0 54 61 62 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  Tab = sqlite3_mp
215f0 72 69 6e 74 66 28 22 25 73 22 2c 20 22 73 71 6c  rintf("%s", "sql
21600 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72 22  ite_temp_master"
21610 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
21620 7a 53 63 68 65 6d 61 54 61 62 20 3d 20 73 71 6c  zSchemaTab = sql
21630 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 5c 22  ite3_mprintf("\"
21640 25 77 5c 22 2e 73 71 6c 69 74 65 5f 6d 61 73 74  %w\".sqlite_mast
21650 65 72 22 2c 20 7a 44 62 29 3b 0a 20 20 7d 0a 20  er", zDb);.  }. 
21660 20 66 6f 72 28 69 3d 30 3b 20 69 3c 41 72 72 61   for(i=0; i<Arra
21670 79 53 69 7a 65 28 61 51 75 65 72 79 29 3b 20 69  ySize(aQuery); i
21680 2b 2b 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  ++){.    char *z
21690 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  Sql = sqlite3_mp
216a0 72 69 6e 74 66 28 61 51 75 65 72 79 5b 69 5d 2e  rintf(aQuery[i].
216b0 7a 53 71 6c 2c 20 7a 53 63 68 65 6d 61 54 61 62  zSql, zSchemaTab
216c0 29 3b 0a 20 20 20 20 69 6e 74 20 76 61 6c 20 3d  );.    int val =
216d0 20 64 62 5f 69 6e 74 28 70 2c 20 7a 53 71 6c 29   db_int(p, zSql)
216e0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
216f0 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20 75 74  ee(zSql);.    ut
21700 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  f8_printf(p->out
21710 2c 20 22 25 2d 32 30 73 20 25 64 5c 6e 22 2c 20  , "%-20s %d\n", 
21720 61 51 75 65 72 79 5b 69 5d 2e 7a 4e 61 6d 65 2c  aQuery[i].zName,
21730 20 76 61 6c 29 3b 0a 20 20 7d 0a 20 20 73 71 6c   val);.  }.  sql
21740 69 74 65 33 5f 66 72 65 65 28 7a 53 63 68 65 6d  ite3_free(zSchem
21750 61 54 61 62 29 3b 0a 20 20 72 65 74 75 72 6e 20  aTab);.  return 
21760 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 69 6e  0;.}../*.** Prin
21770 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 71  t the current sq
21780 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 29 20 76  lite3_errmsg() v
21790 61 6c 75 65 20 74 6f 20 73 74 64 65 72 72 20 61  alue to stderr a
217a0 6e 64 20 72 65 74 75 72 6e 20 31 2e 0a 2a 2f 0a  nd return 1..*/.
217b0 73 74 61 74 69 63 20 69 6e 74 20 73 68 65 6c 6c  static int shell
217c0 44 61 74 61 62 61 73 65 45 72 72 6f 72 28 73 71  DatabaseError(sq
217d0 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 63 6f  lite3 *db){.  co
217e0 6e 73 74 20 63 68 61 72 20 2a 7a 45 72 72 20 3d  nst char *zErr =
217f0 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
21800 64 62 29 3b 0a 20 20 75 74 66 38 5f 70 72 69 6e  db);.  utf8_prin
21810 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f  tf(stderr, "Erro
21820 72 3a 20 25 73 5c 6e 22 2c 20 7a 45 72 72 29 3b  r: %s\n", zErr);
21830 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a  .  return 1;.}..
21840 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 68  /*.** Compare th
21850 65 20 70 61 74 74 65 72 6e 20 69 6e 20 7a 47 6c  e pattern in zGl
21860 6f 62 5b 5d 20 61 67 61 69 6e 73 74 20 74 68 65  ob[] against the
21870 20 74 65 78 74 20 69 6e 20 7a 5b 5d 2e 20 20 52   text in z[].  R
21880 65 74 75 72 6e 20 54 52 55 45 0a 2a 2a 20 69 66  eturn TRUE.** if
21890 20 74 68 65 79 20 6d 61 74 63 68 20 61 6e 64 20   they match and 
218a0 46 41 4c 53 45 20 28 30 29 20 69 66 20 74 68 65  FALSE (0) if the
218b0 79 20 64 6f 20 6e 6f 74 20 6d 61 74 63 68 2e 0a  y do not match..
218c0 2a 2a 0a 2a 2a 20 47 6c 6f 62 62 69 6e 67 20 72  **.** Globbing r
218d0 75 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  ules:.**.**     
218e0 20 27 2a 27 20 20 20 20 20 20 20 4d 61 74 63 68   '*'       Match
218f0 65 73 20 61 6e 79 20 73 65 71 75 65 6e 63 65 20  es any sequence 
21900 6f 66 20 7a 65 72 6f 20 6f 72 20 6d 6f 72 65 20  of zero or more 
21910 63 68 61 72 61 63 74 65 72 73 2e 0a 2a 2a 0a 2a  characters..**.*
21920 2a 20 20 20 20 20 20 27 3f 27 20 20 20 20 20 20  *      '?'      
21930 20 4d 61 74 63 68 65 73 20 65 78 61 63 74 6c 79   Matches exactly
21940 20 6f 6e 65 20 63 68 61 72 61 63 74 65 72 2e 0a   one character..
21950 2a 2a 0a 2a 2a 20 20 20 20 20 5b 2e 2e 2e 5d 20  **.**     [...] 
21960 20 20 20 20 20 4d 61 74 63 68 65 73 20 6f 6e 65       Matches one
21970 20 63 68 61 72 61 63 74 65 72 20 66 72 6f 6d 20   character from 
21980 74 68 65 20 65 6e 63 6c 6f 73 65 64 20 6c 69 73  the enclosed lis
21990 74 20 6f 66 0a 2a 2a 20 20 20 20 20 20 20 20 20  t of.**         
219a0 20 20 20 20 20 20 20 63 68 61 72 61 63 74 65 72         character
219b0 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 5b 5e 2e  s..**.**     [^.
219c0 2e 2e 5d 20 20 20 20 20 4d 61 74 63 68 65 73 20  ..]     Matches 
219d0 6f 6e 65 20 63 68 61 72 61 63 74 65 72 20 6e 6f  one character no
219e0 74 20 69 6e 20 74 68 65 20 65 6e 63 6c 6f 73 65  t in the enclose
219f0 64 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 20 20  d list..**.**   
21a00 20 20 20 27 23 27 20 20 20 20 20 20 20 4d 61 74     '#'       Mat
21a10 63 68 65 73 20 61 6e 79 20 73 65 71 75 65 6e 63  ches any sequenc
21a20 65 20 6f 66 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  e of one or more
21a30 20 64 69 67 69 74 73 20 77 69 74 68 20 61 6e 0a   digits with an.
21a40 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
21a50 20 20 6f 70 74 69 6f 6e 61 6c 20 2b 20 6f 72 20    optional + or 
21a60 2d 20 73 69 67 6e 20 69 6e 20 66 72 6f 6e 74 0a  - sign in front.
21a70 2a 2a 0a 2a 2a 20 20 20 20 20 20 27 20 27 20 20  **.**      ' '  
21a80 20 20 20 20 20 41 6e 79 20 73 70 61 6e 20 6f 66       Any span of
21a90 20 77 68 69 74 65 73 70 61 63 65 20 6d 61 74 63   whitespace matc
21aa0 68 65 73 20 61 6e 79 20 6f 74 68 65 72 20 73 70  hes any other sp
21ab0 61 6e 20 6f 66 0a 2a 2a 20 20 20 20 20 20 20 20  an of.**        
21ac0 20 20 20 20 20 20 20 20 77 68 69 74 65 73 70 61          whitespa
21ad0 63 65 2e 0a 2a 2a 0a 2a 2a 20 45 78 74 72 61 20  ce..**.** Extra 
21ae0 77 68 69 74 65 73 70 61 63 65 20 61 74 20 74 68  whitespace at th
21af0 65 20 65 6e 64 20 6f 66 20 7a 5b 5d 20 69 73 20  e end of z[] is 
21b00 69 67 6e 6f 72 65 64 2e 0a 2a 2f 0a 73 74 61 74  ignored..*/.stat
21b10 69 63 20 69 6e 74 20 74 65 73 74 63 61 73 65 5f  ic int testcase_
21b20 67 6c 6f 62 28 63 6f 6e 73 74 20 63 68 61 72 20  glob(const char 
21b30 2a 7a 47 6c 6f 62 2c 20 63 6f 6e 73 74 20 63 68  *zGlob, const ch
21b40 61 72 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 63 2c  ar *z){.  int c,
21b50 20 63 32 3b 0a 20 20 69 6e 74 20 69 6e 76 65 72   c2;.  int inver
21b60 74 3b 0a 20 20 69 6e 74 20 73 65 65 6e 3b 0a 0a  t;.  int seen;..
21b70 20 20 77 68 69 6c 65 28 20 28 63 20 3d 20 28 2a    while( (c = (*
21b80 28 7a 47 6c 6f 62 2b 2b 29 29 29 21 3d 30 20 29  (zGlob++)))!=0 )
21b90 7b 0a 20 20 20 20 69 66 28 20 49 73 53 70 61 63  {.    if( IsSpac
21ba0 65 28 63 29 20 29 7b 0a 20 20 20 20 20 20 69 66  e(c) ){.      if
21bb0 28 20 21 49 73 53 70 61 63 65 28 2a 7a 29 20 29  ( !IsSpace(*z) )
21bc0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20   return 0;.     
21bd0 20 77 68 69 6c 65 28 20 49 73 53 70 61 63 65 28   while( IsSpace(
21be0 2a 7a 47 6c 6f 62 29 20 29 20 7a 47 6c 6f 62 2b  *zGlob) ) zGlob+
21bf0 2b 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  +;.      while( 
21c00 49 73 53 70 61 63 65 28 2a 7a 29 20 29 20 7a 2b  IsSpace(*z) ) z+
21c10 2b 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  +;.    }else if(
21c20 20 63 3d 3d 27 2a 27 20 29 7b 0a 20 20 20 20 20   c=='*' ){.     
21c30 20 77 68 69 6c 65 28 20 28 63 3d 28 2a 28 7a 47   while( (c=(*(zG
21c40 6c 6f 62 2b 2b 29 29 29 20 3d 3d 20 27 2a 27 20  lob++))) == '*' 
21c50 7c 7c 20 63 3d 3d 27 3f 27 20 29 7b 0a 20 20 20  || c=='?' ){.   
21c60 20 20 20 20 20 69 66 28 20 63 3d 3d 27 3f 27 20       if( c=='?' 
21c70 26 26 20 28 2a 28 7a 2b 2b 29 29 3d 3d 30 20 29  && (*(z++))==0 )
21c80 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20   return 0;.     
21c90 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d   }.      if( c==
21ca0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  0 ){.        ret
21cb0 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c  urn 1;.      }el
21cc0 73 65 20 69 66 28 20 63 3d 3d 27 5b 27 20 29 7b  se if( c=='[' ){
21cd0 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20  .        while( 
21ce0 2a 7a 20 26 26 20 74 65 73 74 63 61 73 65 5f 67  *z && testcase_g
21cf0 6c 6f 62 28 7a 47 6c 6f 62 2d 31 2c 7a 29 3d 3d  lob(zGlob-1,z)==
21d00 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a  0 ){.          z
21d10 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ++;.        }.  
21d20 20 20 20 20 20 20 72 65 74 75 72 6e 20 28 2a 7a        return (*z
21d30 29 21 3d 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20  )!=0;.      }.  
21d40 20 20 20 20 77 68 69 6c 65 28 20 28 63 32 20 3d      while( (c2 =
21d50 20 28 2a 28 7a 2b 2b 29 29 29 21 3d 30 20 29 7b   (*(z++)))!=0 ){
21d60 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20  .        while( 
21d70 63 32 21 3d 63 20 29 7b 0a 20 20 20 20 20 20 20  c2!=c ){.       
21d80 20 20 20 63 32 20 3d 20 2a 28 7a 2b 2b 29 3b 0a     c2 = *(z++);.
21d90 20 20 20 20 20 20 20 20 20 20 69 66 28 20 63 32            if( c2
21da0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
21db0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
21dc0 20 20 69 66 28 20 74 65 73 74 63 61 73 65 5f 67    if( testcase_g
21dd0 6c 6f 62 28 7a 47 6c 6f 62 2c 7a 29 20 29 20 72  lob(zGlob,z) ) r
21de0 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d  eturn 1;.      }
21df0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
21e00 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63  .    }else if( c
21e10 3d 3d 27 3f 27 20 29 7b 0a 20 20 20 20 20 20 69  =='?' ){.      i
21e20 66 28 20 28 2a 28 7a 2b 2b 29 29 3d 3d 30 20 29  f( (*(z++))==0 )
21e30 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
21e40 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 5b 27 20  else if( c=='[' 
21e50 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 70 72 69  ){.      int pri
21e60 6f 72 5f 63 20 3d 20 30 3b 0a 20 20 20 20 20 20  or_c = 0;.      
21e70 73 65 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20  seen = 0;.      
21e80 69 6e 76 65 72 74 20 3d 20 30 3b 0a 20 20 20 20  invert = 0;.    
21e90 20 20 63 20 3d 20 2a 28 7a 2b 2b 29 3b 0a 20 20    c = *(z++);.  
21ea0 20 20 20 20 69 66 28 20 63 3d 3d 30 20 29 20 72      if( c==0 ) r
21eb0 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 63  eturn 0;.      c
21ec0 32 20 3d 20 2a 28 7a 47 6c 6f 62 2b 2b 29 3b 0a  2 = *(zGlob++);.
21ed0 20 20 20 20 20 20 69 66 28 20 63 32 3d 3d 27 5e        if( c2=='^
21ee0 27 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 76  ' ){.        inv
21ef0 65 72 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  ert = 1;.       
21f00 20 63 32 20 3d 20 2a 28 7a 47 6c 6f 62 2b 2b 29   c2 = *(zGlob++)
21f10 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
21f20 69 66 28 20 63 32 3d 3d 27 5d 27 20 29 7b 0a 20  if( c2==']' ){. 
21f30 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27 5d         if( c==']
21f40 27 20 29 20 73 65 65 6e 20 3d 20 31 3b 0a 20 20  ' ) seen = 1;.  
21f50 20 20 20 20 20 20 63 32 20 3d 20 2a 28 7a 47 6c        c2 = *(zGl
21f60 6f 62 2b 2b 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ob++);.      }. 
21f70 20 20 20 20 20 77 68 69 6c 65 28 20 63 32 20 26       while( c2 &
21f80 26 20 63 32 21 3d 27 5d 27 20 29 7b 0a 20 20 20  & c2!=']' ){.   
21f90 20 20 20 20 20 69 66 28 20 63 32 3d 3d 27 2d 27       if( c2=='-'
21fa0 20 26 26 20 7a 47 6c 6f 62 5b 30 5d 21 3d 27 5d   && zGlob[0]!=']
21fb0 27 20 26 26 20 7a 47 6c 6f 62 5b 30 5d 21 3d 30  ' && zGlob[0]!=0
21fc0 20 26 26 20 70 72 69 6f 72 5f 63 3e 30 20 29 7b   && prior_c>0 ){
21fd0 0a 20 20 20 20 20 20 20 20 20 20 63 32 20 3d 20  .          c2 = 
21fe0 2a 28 7a 47 6c 6f 62 2b 2b 29 3b 0a 20 20 20 20  *(zGlob++);.    
21ff0 20 20 20 20 20 20 69 66 28 20 63 3e 3d 70 72 69        if( c>=pri
22000 6f 72 5f 63 20 26 26 20 63 3c 3d 63 32 20 29 20  or_c && c<=c2 ) 
22010 73 65 65 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20  seen = 1;.      
22020 20 20 20 20 70 72 69 6f 72 5f 63 20 3d 20 30 3b      prior_c = 0;
22030 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
22040 20 20 20 20 20 20 20 20 20 20 69 66 28 20 63 3d            if( c=
22050 3d 63 32 20 29 7b 0a 20 20 20 20 20 20 20 20 20  =c2 ){.         
22060 20 20 20 73 65 65 6e 20 3d 20 31 3b 0a 20 20 20     seen = 1;.   
22070 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
22080 20 20 20 70 72 69 6f 72 5f 63 20 3d 20 63 32 3b     prior_c = c2;
22090 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
220a0 20 20 20 63 32 20 3d 20 2a 28 7a 47 6c 6f 62 2b     c2 = *(zGlob+
220b0 2b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  +);.      }.    
220c0 20 20 69 66 28 20 63 32 3d 3d 30 20 7c 7c 20 28    if( c2==0 || (
220d0 73 65 65 6e 20 5e 20 69 6e 76 65 72 74 29 3d 3d  seen ^ invert)==
220e0 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
220f0 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27    }else if( c=='
22100 23 27 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  #' ){.      if( 
22110 28 7a 5b 30 5d 3d 3d 27 2d 27 20 7c 7c 20 7a 5b  (z[0]=='-' || z[
22120 30 5d 3d 3d 27 2b 27 29 20 26 26 20 49 73 44 69  0]=='+') && IsDi
22130 67 69 74 28 7a 5b 31 5d 29 20 29 20 7a 2b 2b 3b  git(z[1]) ) z++;
22140 0a 20 20 20 20 20 20 69 66 28 20 21 49 73 44 69  .      if( !IsDi
22150 67 69 74 28 7a 5b 30 5d 29 20 29 20 72 65 74 75  git(z[0]) ) retu
22160 72 6e 20 30 3b 0a 20 20 20 20 20 20 7a 2b 2b 3b  rn 0;.      z++;
22170 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 49 73  .      while( Is
22180 44 69 67 69 74 28 7a 5b 30 5d 29 20 29 7b 20 7a  Digit(z[0]) ){ z
22190 2b 2b 3b 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b  ++; }.    }else{
221a0 0a 20 20 20 20 20 20 69 66 28 20 63 21 3d 28 2a  .      if( c!=(*
221b0 28 7a 2b 2b 29 29 20 29 20 72 65 74 75 72 6e 20  (z++)) ) return 
221c0 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 77  0;.    }.  }.  w
221d0 68 69 6c 65 28 20 49 73 53 70 61 63 65 28 2a 7a  hile( IsSpace(*z
221e0 29 20 29 7b 20 7a 2b 2b 3b 20 7d 0a 20 20 72 65  ) ){ z++; }.  re
221f0 74 75 72 6e 20 2a 7a 3d 3d 30 3b 0a 7d 0a 0a 0a  turn *z==0;.}...
22200 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 68  /*.** Compare th
22210 65 20 73 74 72 69 6e 67 20 61 73 20 61 20 63 6f  e string as a co
22220 6d 6d 61 6e 64 2d 6c 69 6e 65 20 6f 70 74 69 6f  mmand-line optio
22230 6e 20 77 69 74 68 20 65 69 74 68 65 72 20 6f 6e  n with either on
22240 65 20 6f 72 20 74 77 6f 0a 2a 2a 20 69 6e 69 74  e or two.** init
22250 69 61 6c 20 22 2d 22 20 63 68 61 72 61 63 74 65  ial "-" characte
22260 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  rs..*/.static in
22270 74 20 6f 70 74 69 6f 6e 4d 61 74 63 68 28 63 6f  t optionMatch(co
22280 6e 73 74 20 63 68 61 72 20 2a 7a 53 74 72 2c 20  nst char *zStr, 
22290 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 70 74  const char *zOpt
222a0 29 7b 0a 20 20 69 66 28 20 7a 53 74 72 5b 30 5d  ){.  if( zStr[0]
222b0 21 3d 27 2d 27 20 29 20 72 65 74 75 72 6e 20 30  !='-' ) return 0
222c0 3b 0a 20 20 7a 53 74 72 2b 2b 3b 0a 20 20 69 66  ;.  zStr++;.  if
222d0 28 20 7a 53 74 72 5b 30 5d 3d 3d 27 2d 27 20 29  ( zStr[0]=='-' )
222e0 20 7a 53 74 72 2b 2b 3b 0a 20 20 72 65 74 75 72   zStr++;.  retur
222f0 6e 20 73 74 72 63 6d 70 28 7a 53 74 72 2c 20 7a  n strcmp(zStr, z
22300 4f 70 74 29 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  Opt)==0;.}../*.*
22310 2a 20 44 65 6c 65 74 65 20 61 20 66 69 6c 65 2e  * Delete a file.
22320 0a 2a 2f 0a 69 6e 74 20 73 68 65 6c 6c 44 65 6c  .*/.int shellDel
22330 65 74 65 46 69 6c 65 28 63 6f 6e 73 74 20 63 68  eteFile(const ch
22340 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a  ar *zFilename){.
22350 20 20 69 6e 74 20 72 63 3b 0a 23 69 66 64 65 66    int rc;.#ifdef
22360 20 5f 57 49 4e 33 32 0a 20 20 77 63 68 61 72 5f   _WIN32.  wchar_
22370 74 20 2a 7a 20 3d 20 73 71 6c 69 74 65 33 5f 77  t *z = sqlite3_w
22380 69 6e 33 32 5f 75 74 66 38 5f 74 6f 5f 75 6e 69  in32_utf8_to_uni
22390 63 6f 64 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b  code(zFilename);
223a0 0a 20 20 72 63 20 3d 20 5f 77 75 6e 6c 69 6e 6b  .  rc = _wunlink
223b0 28 7a 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  (z);.  sqlite3_f
223c0 72 65 65 28 7a 29 3b 0a 23 65 6c 73 65 0a 20 20  ree(z);.#else.  
223d0 72 63 20 3d 20 75 6e 6c 69 6e 6b 28 7a 46 69 6c  rc = unlink(zFil
223e0 65 6e 61 6d 65 29 3b 0a 23 65 6e 64 69 66 0a 20  ename);.#endif. 
223f0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
22400 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 64 65 6c 65  *.** Try to dele
22410 74 65 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  te the temporary
22420 20 66 69 6c 65 20 28 69 66 20 74 68 65 72 65 20   file (if there 
22430 69 73 20 6f 6e 65 29 20 61 6e 64 20 66 72 65 65  is one) and free
22440 20 74 68 65 0a 2a 2a 20 6d 65 6d 6f 72 79 20 75   the.** memory u
22450 73 65 64 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  sed to hold the 
22460 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 65 6d 70  name of the temp
22470 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   file..*/.static
22480 20 76 6f 69 64 20 63 6c 65 61 72 54 65 6d 70 46   void clearTempF
22490 69 6c 65 28 53 68 65 6c 6c 53 74 61 74 65 20 2a  ile(ShellState *
224a0 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 7a 54 65  p){.  if( p->zTe
224b0 6d 70 46 69 6c 65 3d 3d 30 20 29 20 72 65 74 75  mpFile==0 ) retu
224c0 72 6e 3b 0a 20 20 69 66 28 20 70 2d 3e 64 6f 58  rn;.  if( p->doX
224d0 64 67 4f 70 65 6e 20 29 20 72 65 74 75 72 6e 3b  dgOpen ) return;
224e0 0a 20 20 69 66 28 20 73 68 65 6c 6c 44 65 6c 65  .  if( shellDele
224f0 74 65 46 69 6c 65 28 70 2d 3e 7a 54 65 6d 70 46  teFile(p->zTempF
22500 69 6c 65 29 20 29 20 72 65 74 75 72 6e 3b 0a 20  ile) ) return;. 
22510 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d   sqlite3_free(p-
22520 3e 7a 54 65 6d 70 46 69 6c 65 29 3b 0a 20 20 70  >zTempFile);.  p
22530 2d 3e 7a 54 65 6d 70 46 69 6c 65 20 3d 20 30 3b  ->zTempFile = 0;
22540 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  .}../*.** Create
22550 20 61 20 6e 65 77 20 74 65 6d 70 20 66 69 6c 65   a new temp file
22560 20 6e 61 6d 65 20 77 69 74 68 20 74 68 65 20 67   name with the g
22570 69 76 65 6e 20 73 75 66 66 69 78 2e 0a 2a 2f 0a  iven suffix..*/.
22580 73 74 61 74 69 63 20 76 6f 69 64 20 6e 65 77 54  static void newT
22590 65 6d 70 46 69 6c 65 28 53 68 65 6c 6c 53 74 61  empFile(ShellSta
225a0 74 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61  te *p, const cha
225b0 72 20 2a 7a 53 75 66 66 69 78 29 7b 0a 20 20 63  r *zSuffix){.  c
225c0 6c 65 61 72 54 65 6d 70 46 69 6c 65 28 70 29 3b  learTempFile(p);
225d0 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
225e0 70 2d 3e 7a 54 65 6d 70 46 69 6c 65 29 3b 0a 20  p->zTempFile);. 
225f0 20 70 2d 3e 7a 54 65 6d 70 46 69 6c 65 20 3d 20   p->zTempFile = 
22600 30 3b 0a 20 20 69 66 28 20 70 2d 3e 64 62 20 29  0;.  if( p->db )
22610 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69  {.    sqlite3_fi
22620 6c 65 5f 63 6f 6e 74 72 6f 6c 28 70 2d 3e 64 62  le_control(p->db
22630 2c 20 30 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54  , 0, SQLITE_FCNT
22640 4c 5f 54 45 4d 50 46 49 4c 45 4e 41 4d 45 2c 20  L_TEMPFILENAME, 
22650 26 70 2d 3e 7a 54 65 6d 70 46 69 6c 65 29 3b 0a  &p->zTempFile);.
22660 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 7a 54 65    }.  if( p->zTe
22670 6d 70 46 69 6c 65 3d 3d 30 20 29 7b 0a 20 20 20  mpFile==0 ){.   
22680 20 73 71 6c 69 74 65 33 5f 75 69 6e 74 36 34 20   sqlite3_uint64 
22690 72 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72  r;.    sqlite3_r
226a0 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66  andomness(sizeof
226b0 28 72 29 2c 20 26 72 29 3b 0a 20 20 20 20 70 2d  (r), &r);.    p-
226c0 3e 7a 54 65 6d 70 46 69 6c 65 20 3d 20 73 71 6c  >zTempFile = sql
226d0 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 74 65  ite3_mprintf("te
226e0 6d 70 25 6c 6c 78 2e 25 73 22 2c 20 72 2c 20 7a  mp%llx.%s", r, z
226f0 53 75 66 66 69 78 29 3b 0a 20 20 7d 65 6c 73 65  Suffix);.  }else
22700 7b 0a 20 20 20 20 70 2d 3e 7a 54 65 6d 70 46 69  {.    p->zTempFi
22710 6c 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  le = sqlite3_mpr
22720 69 6e 74 66 28 22 25 7a 2e 25 73 22 2c 20 70 2d  intf("%z.%s", p-
22730 3e 7a 54 65 6d 70 46 69 6c 65 2c 20 7a 53 75 66  >zTempFile, zSuf
22740 66 69 78 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  fix);.  }.  if( 
22750 70 2d 3e 7a 54 65 6d 70 46 69 6c 65 3d 3d 30 20  p->zTempFile==0 
22760 29 7b 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74  ){.    raw_print
22770 66 28 73 74 64 65 72 72 2c 20 22 6f 75 74 20 6f  f(stderr, "out o
22780 66 20 6d 65 6d 6f 72 79 5c 6e 22 29 3b 0a 20 20  f memory\n");.  
22790 20 20 65 78 69 74 28 31 29 3b 0a 20 20 7d 0a 7d    exit(1);.  }.}
227a0 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69 6d 70  .../*.** The imp
227b0 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 53  lementation of S
227c0 51 4c 20 73 63 61 6c 61 72 20 66 75 6e 63 74 69  QL scalar functi
227d0 6f 6e 20 66 6b 65 79 5f 63 6f 6c 6c 61 74 65 5f  on fkey_collate_
227e0 63 6c 61 75 73 65 28 29 2c 20 75 73 65 64 0a 2a  clause(), used.*
227f0 2a 20 62 79 20 74 68 65 20 22 2e 6c 69 6e 74 20  * by the ".lint 
22800 66 6b 65 79 2d 69 6e 64 65 78 65 73 22 20 63 6f  fkey-indexes" co
22810 6d 6d 61 6e 64 2e 20 54 68 69 73 20 73 63 61 6c  mmand. This scal
22820 61 72 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  ar function is a
22830 6c 77 61 79 73 0a 2a 2a 20 63 61 6c 6c 65 64 20  lways.** called 
22840 77 69 74 68 20 66 6f 75 72 20 61 72 67 75 6d 65  with four argume
22850 6e 74 73 20 2d 20 74 68 65 20 70 61 72 65 6e 74  nts - the parent
22860 20 74 61 62 6c 65 20 6e 61 6d 65 2c 20 74 68 65   table name, the
22870 20 70 61 72 65 6e 74 20 63 6f 6c 75 6d 6e 20 6e   parent column n
22880 61 6d 65 2c 0a 2a 2a 20 74 68 65 20 63 68 69 6c  ame,.** the chil
22890 64 20 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64  d table name and
228a0 20 74 68 65 20 63 68 69 6c 64 20 63 6f 6c 75 6d   the child colum
228b0 6e 20 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 20 20  n name..**.**   
228c0 66 6b 65 79 5f 63 6f 6c 6c 61 74 65 5f 63 6c 61  fkey_collate_cla
228d0 75 73 65 28 27 70 61 72 65 6e 74 2d 74 61 62 27  use('parent-tab'
228e0 2c 20 27 70 61 72 65 6e 74 2d 63 6f 6c 27 2c 20  , 'parent-col', 
228f0 27 63 68 69 6c 64 2d 74 61 62 27 2c 20 27 63 68  'child-tab', 'ch
22900 69 6c 64 2d 63 6f 6c 27 29 0a 2a 2a 0a 2a 2a 20  ild-col').**.** 
22910 49 66 20 65 69 74 68 65 72 20 6f 66 20 74 68 65  If either of the
22920 20 6e 61 6d 65 64 20 74 61 62 6c 65 73 20 6f 72   named tables or
22930 20 63 6f 6c 75 6d 6e 73 20 64 6f 20 6e 6f 74 20   columns do not 
22940 65 78 69 73 74 2c 20 74 68 69 73 20 66 75 6e 63  exist, this func
22950 74 69 6f 6e 0a 2a 2a 20 72 65 74 75 72 6e 73 20  tion.** returns 
22960 61 6e 20 65 6d 70 74 79 20 73 74 72 69 6e 67 2e  an empty string.
22970 20 41 6e 20 65 6d 70 74 79 20 73 74 72 69 6e 67   An empty string
22980 20 69 73 20 61 6c 73 6f 20 72 65 74 75 72 6e 65   is also returne
22990 64 20 69 66 20 62 6f 74 68 20 74 61 62 6c 65 73  d if both tables
229a0 0a 2a 2a 20 61 6e 64 20 63 6f 6c 75 6d 6e 73 20  .** and columns 
229b0 65 78 69 73 74 20 62 75 74 20 68 61 76 65 20 74  exist but have t
229c0 68 65 20 73 61 6d 65 20 64 65 66 61 75 6c 74 20  he same default 
229d0 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
229e0 63 65 2e 20 4f 72 2c 0a 2a 2a 20 69 66 20 62 6f  ce. Or,.** if bo
229f0 74 68 20 65 78 69 73 74 20 62 75 74 20 74 68 65  th exist but the
22a00 20 64 65 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69   default collati
22a10 6f 6e 20 73 65 71 75 65 6e 63 65 73 20 61 72 65  on sequences are
22a20 20 64 69 66 66 65 72 65 6e 74 2c 20 74 68 69 73   different, this
22a30 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  .** function ret
22a40 75 72 6e 73 20 74 68 65 20 73 74 72 69 6e 67 20  urns the string 
22a50 22 20 43 4f 4c 4c 41 54 45 20 3c 70 61 72 65 6e  " COLLATE <paren
22a60 74 2d 63 6f 6c 6c 61 74 69 6f 6e 3e 22 2c 20 77  t-collation>", w
22a70 68 65 72 65 0a 2a 2a 20 3c 70 61 72 65 6e 74 2d  here.** <parent-
22a80 63 6f 6c 6c 61 74 69 6f 6e 3e 20 69 73 20 74 68  collation> is th
22a90 65 20 64 65 66 61 75 6c 74 20 63 6f 6c 6c 61 74  e default collat
22aa0 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 6f 66 20  ion sequence of 
22ab0 74 68 65 20 70 61 72 65 6e 74 20 63 6f 6c 75 6d  the parent colum
22ac0 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  n..*/.static voi
22ad0 64 20 73 68 65 6c 6c 46 6b 65 79 43 6f 6c 6c 61  d shellFkeyColla
22ae0 74 65 43 6c 61 75 73 65 28 0a 20 20 73 71 6c 69  teClause(.  sqli
22af0 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74  te3_context *pCt
22b00 78 2c 0a 20 20 69 6e 74 20 6e 56 61 6c 2c 0a 20  x,.  int nVal,. 
22b10 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
22b20 2a 61 70 56 61 6c 0a 29 7b 0a 20 20 73 71 6c 69  *apVal.){.  sqli
22b30 74 65 33 20 2a 64 62 20 3d 20 73 71 6c 69 74 65  te3 *db = sqlite
22b40 33 5f 63 6f 6e 74 65 78 74 5f 64 62 5f 68 61 6e  3_context_db_han
22b50 64 6c 65 28 70 43 74 78 29 3b 0a 20 20 63 6f 6e  dle(pCtx);.  con
22b60 73 74 20 63 68 61 72 20 2a 7a 50 61 72 65 6e 74  st char *zParent
22b70 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
22b80 7a 50 61 72 65 6e 74 43 6f 6c 3b 0a 20 20 63 6f  zParentCol;.  co
22b90 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 72 65 6e  nst char *zParen
22ba0 74 53 65 71 3b 0a 20 20 63 6f 6e 73 74 20 63 68  tSeq;.  const ch
22bb0 61 72 20 2a 7a 43 68 69 6c 64 3b 0a 20 20 63 6f  ar *zChild;.  co
22bc0 6e 73 74 20 63 68 61 72 20 2a 7a 43 68 69 6c 64  nst char *zChild
22bd0 43 6f 6c 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  Col;.  const cha
22be0 72 20 2a 7a 43 68 69 6c 64 53 65 71 20 3d 20 30  r *zChildSeq = 0
22bf0 3b 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65  ;  /* Initialize
22c00 20 74 6f 20 61 76 6f 69 64 20 66 61 6c 73 65 2d   to avoid false-
22c10 70 6f 73 69 74 69 76 65 20 77 61 72 6e 69 6e 67  positive warning
22c20 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20   */.  int rc;.. 
22c30 20 61 73 73 65 72 74 28 20 6e 56 61 6c 3d 3d 34   assert( nVal==4
22c40 20 29 3b 0a 20 20 7a 50 61 72 65 6e 74 20 3d 20   );.  zParent = 
22c50 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c  (const char*)sql
22c60 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
22c70 61 70 56 61 6c 5b 30 5d 29 3b 0a 20 20 7a 50 61  apVal[0]);.  zPa
22c80 72 65 6e 74 43 6f 6c 20 3d 20 28 63 6f 6e 73 74  rentCol = (const
22c90 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76   char*)sqlite3_v
22ca0 61 6c 75 65 5f 74 65 78 74 28 61 70 56 61 6c 5b  alue_text(apVal[
22cb0 31 5d 29 3b 0a 20 20 7a 43 68 69 6c 64 20 3d 20  1]);.  zChild = 
22cc0 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c  (const char*)sql
22cd0 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
22ce0 61 70 56 61 6c 5b 32 5d 29 3b 0a 20 20 7a 43 68  apVal[2]);.  zCh
22cf0 69 6c 64 43 6f 6c 20 3d 20 28 63 6f 6e 73 74 20  ildCol = (const 
22d00 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61  char*)sqlite3_va
22d10 6c 75 65 5f 74 65 78 74 28 61 70 56 61 6c 5b 33  lue_text(apVal[3
22d20 5d 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 72  ]);..  sqlite3_r
22d30 65 73 75 6c 74 5f 74 65 78 74 28 70 43 74 78 2c  esult_text(pCtx,
22d40 20 22 22 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f   "", -1, SQLITE_
22d50 53 54 41 54 49 43 29 3b 0a 20 20 72 63 20 3d 20  STATIC);.  rc = 
22d60 73 71 6c 69 74 65 33 5f 74 61 62 6c 65 5f 63 6f  sqlite3_table_co
22d70 6c 75 6d 6e 5f 6d 65 74 61 64 61 74 61 28 0a 20  lumn_metadata(. 
22d80 20 20 20 20 20 64 62 2c 20 22 6d 61 69 6e 22 2c       db, "main",
22d90 20 7a 50 61 72 65 6e 74 2c 20 7a 50 61 72 65 6e   zParent, zParen
22da0 74 43 6f 6c 2c 20 30 2c 20 26 7a 50 61 72 65 6e  tCol, 0, &zParen
22db0 74 53 65 71 2c 20 30 2c 20 30 2c 20 30 0a 20 20  tSeq, 0, 0, 0.  
22dc0 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
22dd0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
22de0 20 3d 20 73 71 6c 69 74 65 33 5f 74 61 62 6c 65   = sqlite3_table
22df0 5f 63 6f 6c 75 6d 6e 5f 6d 65 74 61 64 61 74 61  _column_metadata
22e00 28 0a 20 20 20 20 20 20 20 20 64 62 2c 20 22 6d  (.        db, "m
22e10 61 69 6e 22 2c 20 7a 43 68 69 6c 64 2c 20 7a 43  ain", zChild, zC
22e20 68 69 6c 64 43 6f 6c 2c 20 30 2c 20 26 7a 43 68  hildCol, 0, &zCh
22e30 69 6c 64 53 65 71 2c 20 30 2c 20 30 2c 20 30 0a  ildSeq, 0, 0, 0.
22e40 20 20 20 20 29 3b 0a 20 20 7d 0a 0a 20 20 69 66      );.  }..  if
22e50 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
22e60 26 26 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63  && sqlite3_stric
22e70 6d 70 28 7a 50 61 72 65 6e 74 53 65 71 2c 20 7a  mp(zParentSeq, z
22e80 43 68 69 6c 64 53 65 71 29 20 29 7b 0a 20 20 20  ChildSeq) ){.   
22e90 20 63 68 61 72 20 2a 7a 20 3d 20 73 71 6c 69 74   char *z = sqlit
22ea0 65 33 5f 6d 70 72 69 6e 74 66 28 22 20 43 4f 4c  e3_mprintf(" COL
22eb0 4c 41 54 45 20 25 73 22 2c 20 7a 50 61 72 65 6e  LATE %s", zParen
22ec0 74 53 65 71 29 3b 0a 20 20 20 20 73 71 6c 69 74  tSeq);.    sqlit
22ed0 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 70  e3_result_text(p
22ee0 43 74 78 2c 20 7a 2c 20 2d 31 2c 20 53 51 4c 49  Ctx, z, -1, SQLI
22ef0 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20  TE_TRANSIENT);. 
22f00 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
22f10 7a 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a  z);.  }.}.../*.*
22f20 2a 20 54 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  * The implementa
22f30 74 69 6f 6e 20 6f 66 20 64 6f 74 2d 63 6f 6d 6d  tion of dot-comm
22f40 61 6e 64 20 22 2e 6c 69 6e 74 20 66 6b 65 79 2d  and ".lint fkey-
22f50 69 6e 64 65 78 65 73 22 2e 0a 2a 2f 0a 73 74 61  indexes"..*/.sta
22f60 74 69 63 20 69 6e 74 20 6c 69 6e 74 46 6b 65 79  tic int lintFkey
22f70 49 6e 64 65 78 65 73 28 0a 20 20 53 68 65 6c 6c  Indexes(.  Shell
22f80 53 74 61 74 65 20 2a 70 53 74 61 74 65 2c 20 20  State *pState,  
22f90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
22fa0 72 72 65 6e 74 20 73 68 65 6c 6c 20 74 6f 6f 6c  rrent shell tool
22fb0 20 73 74 61 74 65 20 2a 2f 0a 20 20 63 68 61 72   state */.  char
22fc0 20 2a 2a 61 7a 41 72 67 2c 20 20 20 20 20 20 20   **azArg,       
22fd0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
22fe0 72 72 61 79 20 6f 66 20 61 72 67 75 6d 65 6e 74  rray of argument
22ff0 73 20 70 61 73 73 65 64 20 74 6f 20 64 6f 74 20  s passed to dot 
23000 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  command */.  int
23010 20 6e 41 72 67 20 20 20 20 20 20 20 20 20 20 20   nArg           
23020 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23030 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65  Number of entrie
23040 73 20 69 6e 20 61 7a 41 72 67 5b 5d 20 2a 2f 0a  s in azArg[] */.
23050 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
23060 20 3d 20 70 53 74 61 74 65 2d 3e 64 62 3b 20 20   = pState->db;  
23070 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
23080 20 68 61 6e 64 6c 65 20 74 6f 20 71 75 65 72 79   handle to query
23090 20 22 6d 61 69 6e 22 20 64 62 20 6f 66 20 2a 2f   "main" db of */
230a0 0a 20 20 46 49 4c 45 20 2a 6f 75 74 20 3d 20 70  .  FILE *out = p
230b0 53 74 61 74 65 2d 3e 6f 75 74 3b 20 20 20 20 20  State->out;     
230c0 20 20 20 2f 2a 20 53 74 72 65 61 6d 20 74 6f 20     /* Stream to 
230d0 77 72 69 74 65 20 6e 6f 6e 2d 65 72 72 6f 72 20  write non-error 
230e0 6f 75 74 70 75 74 20 74 6f 20 2a 2f 0a 20 20 69  output to */.  i
230f0 6e 74 20 62 56 65 72 62 6f 73 65 20 3d 20 30 3b  nt bVerbose = 0;
23100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
23110 2a 20 49 66 20 2d 76 65 72 62 6f 73 65 20 69 73  * If -verbose is
23120 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20 69 6e   present */.  in
23130 74 20 62 47 72 6f 75 70 42 79 50 61 72 65 6e 74  t bGroupByParent
23140 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a   = 0;         /*
23150 20 49 66 20 2d 67 72 6f 75 70 62 79 70 61 72 65   If -groupbypare
23160 6e 74 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f  nt is present */
23170 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
23180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23190 20 20 20 2f 2a 20 54 6f 20 69 74 65 72 61 74 65     /* To iterate
231a0 20 74 68 72 6f 75 67 68 20 61 7a 41 72 67 5b 5d   through azArg[]
231b0 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
231c0 20 2a 7a 49 6e 64 65 6e 74 20 3d 20 22 22 3b 20   *zIndent = ""; 
231d0 20 20 20 20 20 20 2f 2a 20 48 6f 77 20 6d 75 63        /* How muc
231e0 68 20 74 6f 20 69 6e 64 65 6e 74 20 43 52 45 41  h to indent CREA
231f0 54 45 20 49 4e 44 45 58 20 62 79 20 2a 2f 0a 20  TE INDEX by */. 
23200 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
23210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23220 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
23230 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  */.  sqlite3_stm
23240 74 20 2a 70 53 71 6c 20 3d 20 30 3b 20 20 20 20  t *pSql = 0;    
23250 20 20 20 20 20 2f 2a 20 43 6f 6d 70 69 6c 65 64       /* Compiled
23260 20 76 65 72 73 69 6f 6e 20 6f 66 20 53 51 4c 20   version of SQL 
23270 73 74 61 74 65 6d 65 6e 74 20 62 65 6c 6f 77 20  statement below 
23280 2a 2f 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 54 68  */..  /*.  ** Th
23290 69 73 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  is SELECT statem
232a0 65 6e 74 20 72 65 74 75 72 6e 73 20 6f 6e 65 20  ent returns one 
232b0 72 6f 77 20 66 6f 72 20 65 61 63 68 20 66 6f 72  row for each for
232c0 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61  eign key constra
232d0 69 6e 74 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20  int.  ** in the 
232e0 73 63 68 65 6d 61 20 6f 66 20 74 68 65 20 6d 61  schema of the ma
232f0 69 6e 20 64 61 74 61 62 61 73 65 2e 20 54 68 65  in database. The
23300 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 73 20 61   column values a
23310 72 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 30 2e  re:.  **.  ** 0.
23320 20 54 68 65 20 74 65 78 74 20 6f 66 20 61 6e 20   The text of an 
23330 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 73 69  SQL statement si
23340 6d 69 6c 61 72 20 74 6f 3a 0a 20 20 2a 2a 0a 20  milar to:.  **. 
23350 20 2a 2a 20 20 20 20 20 20 22 45 58 50 4c 41 49   **      "EXPLAI
23360 4e 20 51 55 45 52 59 20 50 4c 41 4e 20 53 45 4c  N QUERY PLAN SEL
23370 45 43 54 20 31 20 46 52 4f 4d 20 63 68 69 6c 64  ECT 1 FROM child
23380 5f 74 61 62 6c 65 20 57 48 45 52 45 20 63 68 69  _table WHERE chi
23390 6c 64 5f 6b 65 79 3d 3f 22 0a 20 20 2a 2a 0a 20  ld_key=?".  **. 
233a0 20 2a 2a 20 20 20 20 54 68 69 73 20 53 45 4c 45   **    This SELE
233b0 43 54 20 69 73 20 73 69 6d 69 6c 61 72 20 74 6f  CT is similar to
233c0 20 74 68 65 20 6f 6e 65 20 74 68 61 74 20 74 68   the one that th
233d0 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 73 20 69  e foreign keys i
233e0 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 0a 20 20  mplementation.  
233f0 2a 2a 20 20 20 20 6e 65 65 64 73 20 74 6f 20 72  **    needs to r
23400 75 6e 20 69 6e 74 65 72 6e 61 6c 6c 79 20 6f 6e  un internally on
23410 20 63 68 69 6c 64 20 74 61 62 6c 65 73 2e 20 49   child tables. I
23420 66 20 74 68 65 72 65 20 69 73 20 61 6e 20 69 6e  f there is an in
23430 64 65 78 20 74 68 61 74 20 63 61 6e 0a 20 20 2a  dex that can.  *
23440 2a 20 20 20 20 62 65 20 75 73 65 64 20 74 6f 20  *    be used to 
23450 6f 70 74 69 6d 69 7a 65 20 74 68 69 73 20 71 75  optimize this qu
23460 65 72 79 2c 20 74 68 65 6e 20 69 74 20 63 61 6e  ery, then it can
23470 20 61 6c 73 6f 20 62 65 20 75 73 65 64 20 62 79   also be used by
23480 20 74 68 65 20 46 4b 0a 20 20 2a 2a 20 20 20 20   the FK.  **    
23490 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 74  implementation t
234a0 6f 20 6f 70 74 69 6d 69 7a 65 20 44 45 4c 45 54  o optimize DELET
234b0 45 20 6f 72 20 55 50 44 41 54 45 20 73 74 61 74  E or UPDATE stat
234c0 65 6d 65 6e 74 73 20 6f 6e 20 74 68 65 20 70 61  ements on the pa
234d0 72 65 6e 74 0a 20 20 2a 2a 20 20 20 20 74 61 62  rent.  **    tab
234e0 6c 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 31 2e  le..  **.  ** 1.
234f0 20 41 20 47 4c 4f 42 20 70 61 74 74 65 72 6e 20   A GLOB pattern 
23500 73 75 69 74 61 62 6c 65 20 66 6f 72 20 73 71 6c  suitable for sql
23510 69 74 65 33 5f 73 74 72 67 6c 6f 62 28 29 2e 20  ite3_strglob(). 
23520 49 66 20 74 68 65 20 70 6c 61 6e 20 6f 75 74 70  If the plan outp
23530 75 74 20 62 79 0a 20 20 2a 2a 20 20 20 20 74 68  ut by.  **    th
23540 65 20 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20  e EXPLAIN QUERY 
23550 50 4c 41 4e 20 63 6f 6d 6d 61 6e 64 20 6d 61 74  PLAN command mat
23560 63 68 65 73 20 74 68 69 73 20 70 61 74 74 65 72  ches this patter
23570 6e 2c 20 74 68 65 6e 20 74 68 65 20 73 63 68 65  n, then the sche
23580 6d 61 0a 20 20 2a 2a 20 20 20 20 63 6f 6e 74 61  ma.  **    conta
23590 69 6e 73 20 61 6e 20 69 6e 64 65 78 20 74 68 61  ins an index tha
235a0 74 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f  t can be used to
235b0 20 6f 70 74 69 6d 69 7a 65 20 74 68 65 20 71 75   optimize the qu
235c0 65 72 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 32  ery..  **.  ** 2
235d0 2e 20 48 75 6d 61 6e 20 72 65 61 64 61 62 6c 65  . Human readable
235e0 20 74 65 78 74 20 74 68 61 74 20 64 65 73 63 72   text that descr
235f0 69 62 65 73 20 74 68 65 20 63 68 69 6c 64 20 74  ibes the child t
23600 61 62 6c 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 73  able and columns
23610 2e 20 65 2e 67 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  . e.g..  **.  **
23620 20 20 20 20 20 20 20 22 63 68 69 6c 64 5f 74 61         "child_ta
23630 62 6c 65 28 63 68 69 6c 64 5f 6b 65 79 31 2c 20  ble(child_key1, 
23640 63 68 69 6c 64 5f 6b 65 79 32 29 22 0a 20 20 2a  child_key2)".  *
23650 2a 0a 20 20 2a 2a 20 33 2e 20 48 75 6d 61 6e 20  *.  ** 3. Human 
23660 72 65 61 64 61 62 6c 65 20 74 65 78 74 20 74 68  readable text th
23670 61 74 20 64 65 73 63 72 69 62 65 73 20 74 68 65  at describes the
23680 20 70 61 72 65 6e 74 20 74 61 62 6c 65 20 61 6e   parent table an
23690 64 20 63 6f 6c 75 6d 6e 73 2e 20 65 2e 67 2e 0a  d columns. e.g..
236a0 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20    **.  **       
236b0 22 70 61 72 65 6e 74 5f 74 61 62 6c 65 28 70 61  "parent_table(pa
236c0 72 65 6e 74 5f 6b 65 79 31 2c 20 70 61 72 65 6e  rent_key1, paren
236d0 74 5f 6b 65 79 32 29 22 0a 20 20 2a 2a 0a 20 20  t_key2)".  **.  
236e0 2a 2a 20 34 2e 20 41 20 66 75 6c 6c 20 43 52 45  ** 4. A full CRE
236f0 41 54 45 20 49 4e 44 45 58 20 73 74 61 74 65 6d  ATE INDEX statem
23700 65 6e 74 20 66 6f 72 20 61 6e 20 69 6e 64 65 78  ent for an index
23710 20 74 68 61 74 20 63 6f 75 6c 64 20 62 65 20 75   that could be u
23720 73 65 64 20 74 6f 0a 20 20 2a 2a 20 20 20 20 6f  sed to.  **    o
23730 70 74 69 6d 69 7a 65 20 44 45 4c 45 54 45 20 6f  ptimize DELETE o
23740 72 20 55 50 44 41 54 45 20 73 74 61 74 65 6d 65  r UPDATE stateme
23750 6e 74 73 20 6f 6e 20 74 68 65 20 70 61 72 65 6e  nts on the paren
23760 74 20 74 61 62 6c 65 2e 20 65 2e 67 2e 0a 20 20  t table. e.g..  
23770 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 22 43  **.  **       "C
23780 52 45 41 54 45 20 49 4e 44 45 58 20 63 68 69 6c  REATE INDEX chil
23790 64 5f 74 61 62 6c 65 5f 63 68 69 6c 64 5f 6b 65  d_table_child_ke
237a0 79 20 4f 4e 20 63 68 69 6c 64 5f 74 61 62 6c 65  y ON child_table
237b0 28 63 68 69 6c 64 5f 6b 65 79 29 22 0a 20 20 2a  (child_key)".  *
237c0 2a 0a 20 20 2a 2a 20 35 2e 20 54 68 65 20 6e 61  *.  ** 5. The na
237d0 6d 65 20 6f 66 20 74 68 65 20 70 61 72 65 6e 74  me of the parent
237e0 20 74 61 62 6c 65 2e 0a 20 20 2a 2a 0a 20 20 2a   table..  **.  *
237f0 2a 20 54 68 65 73 65 20 73 69 78 20 76 61 6c 75  * These six valu
23800 65 73 20 61 72 65 20 75 73 65 64 20 62 79 20 74  es are used by t
23810 68 65 20 43 20 6c 6f 67 69 63 20 62 65 6c 6f 77  he C logic below
23820 20 74 6f 20 67 65 6e 65 72 61 74 65 20 74 68 65   to generate the
23830 20 72 65 70 6f 72 74 2e 0a 20 20 2a 2f 0a 20 20   report..  */.  
23840 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c  const char *zSql
23850 20 3d 0a 20 20 22 53 45 4c 45 43 54 20 22 0a 20   =.  "SELECT ". 
23860 20 20 20 22 20 20 20 20 20 27 45 58 50 4c 41 49     "     'EXPLAI
23870 4e 20 51 55 45 52 59 20 50 4c 41 4e 20 53 45 4c  N QUERY PLAN SEL
23880 45 43 54 20 31 20 46 52 4f 4d 20 27 20 7c 7c 20  ECT 1 FROM ' || 
23890 71 75 6f 74 65 28 73 2e 6e 61 6d 65 29 20 7c 7c  quote(s.name) ||
238a0 20 27 20 57 48 45 52 45 20 27 22 0a 20 20 20 20   ' WHERE '".    
238b0 22 20 20 7c 7c 20 67 72 6f 75 70 5f 63 6f 6e 63  "  || group_conc
238c0 61 74 28 71 75 6f 74 65 28 73 2e 6e 61 6d 65 29  at(quote(s.name)
238d0 20 7c 7c 20 27 2e 27 20 7c 7c 20 71 75 6f 74 65   || '.' || quote
238e0 28 66 2e 5b 66 72 6f 6d 5d 29 20 7c 7c 20 27 3d  (f.[from]) || '=
238f0 3f 27 20 22 0a 20 20 20 20 22 20 20 7c 7c 20 66  ?' ".    "  || f
23900 6b 65 79 5f 63 6f 6c 6c 61 74 65 5f 63 6c 61 75  key_collate_clau
23910 73 65 28 22 0a 20 20 20 20 22 20 20 20 20 20 20  se(".    "      
23920 20 66 2e 5b 74 61 62 6c 65 5d 2c 20 43 4f 41 4c   f.[table], COAL
23930 45 53 43 45 28 66 2e 5b 74 6f 5d 2c 20 70 2e 5b  ESCE(f.[to], p.[
23940 6e 61 6d 65 5d 29 2c 20 73 2e 6e 61 6d 65 2c 20  name]), s.name, 
23950 66 2e 5b 66 72 6f 6d 5d 29 2c 27 20 41 4e 44 20  f.[from]),' AND 
23960 27 29 22 0a 20 20 20 20 22 2c 20 22 0a 20 20 20  ')".    ", ".   
23970 20 22 20 20 20 20 20 27 53 45 41 52 43 48 20 54   "     'SEARCH T
23980 41 42 4c 45 20 27 20 7c 7c 20 73 2e 6e 61 6d 65  ABLE ' || s.name
23990 20 7c 7c 20 27 20 55 53 49 4e 47 20 43 4f 56 45   || ' USING COVE
239a0 52 49 4e 47 20 49 4e 44 45 58 2a 28 27 22 0a 20  RING INDEX*('". 
239b0 20 20 20 22 20 20 7c 7c 20 67 72 6f 75 70 5f 63     "  || group_c
239c0 6f 6e 63 61 74 28 27 2a 3d 3f 27 2c 20 27 20 41  oncat('*=?', ' A
239d0 4e 44 20 27 29 20 7c 7c 20 27 29 27 22 0a 20 20  ND ') || ')'".  
239e0 20 20 22 2c 20 22 0a 20 20 20 20 22 20 20 20 20    ", ".    "    
239f0 20 73 2e 6e 61 6d 65 20 20 7c 7c 20 27 28 27 20   s.name  || '(' 
23a00 7c 7c 20 67 72 6f 75 70 5f 63 6f 6e 63 61 74 28  || group_concat(
23a10 66 2e 5b 66 72 6f 6d 5d 2c 20 20 27 2c 20 27 29  f.[from],  ', ')
23a20 20 7c 7c 20 27 29 27 22 0a 20 20 20 20 22 2c 20   || ')'".    ", 
23a30 22 0a 20 20 20 20 22 20 20 20 20 20 66 2e 5b 74  ".    "     f.[t
23a40 61 62 6c 65 5d 20 7c 7c 20 27 28 27 20 7c 7c 20  able] || '(' || 
23a50 67 72 6f 75 70 5f 63 6f 6e 63 61 74 28 43 4f 41  group_concat(COA
23a60 4c 45 53 43 45 28 66 2e 5b 74 6f 5d 2c 20 70 2e  LESCE(f.[to], p.
23a70 5b 6e 61 6d 65 5d 29 29 20 7c 7c 20 27 29 27 22  [name])) || ')'"
23a80 0a 20 20 20 20 22 2c 20 22 0a 20 20 20 20 22 20  .    ", ".    " 
23a90 20 20 20 20 27 43 52 45 41 54 45 20 49 4e 44 45      'CREATE INDE
23aa0 58 20 27 20 7c 7c 20 71 75 6f 74 65 28 73 2e 6e  X ' || quote(s.n
23ab0 61 6d 65 20 7c 7c 27 5f 27 7c 7c 20 67 72 6f 75  ame ||'_'|| grou
23ac0 70 5f 63 6f 6e 63 61 74 28 66 2e 5b 66 72 6f 6d  p_concat(f.[from
23ad0 5d 2c 20 27 5f 27 29 29 22 0a 20 20 20 20 22 20  ], '_'))".    " 
23ae0 20 7c 7c 20 27 20 4f 4e 20 27 20 7c 7c 20 71 75   || ' ON ' || qu
23af0 6f 74 65 28 73 2e 6e 61 6d 65 29 20 7c 7c 20 27  ote(s.name) || '
23b00 28 27 22 0a 20 20 20 20 22 20 20 7c 7c 20 67 72  ('".    "  || gr
23b10 6f 75 70 5f 63 6f 6e 63 61 74 28 71 75 6f 74 65  oup_concat(quote
23b20 28 66 2e 5b 66 72 6f 6d 5d 29 20 7c 7c 22 0a 20  (f.[from]) ||". 
23b30 20 20 20 22 20 20 20 20 20 20 20 20 66 6b 65 79     "        fkey
23b40 5f 63 6f 6c 6c 61 74 65 5f 63 6c 61 75 73 65 28  _collate_clause(
23b50 22 0a 20 20 20 20 22 20 20 20 20 20 20 20 20 20  ".    "         
23b60 20 66 2e 5b 74 61 62 6c 65 5d 2c 20 43 4f 41 4c   f.[table], COAL
23b70 45 53 43 45 28 66 2e 5b 74 6f 5d 2c 20 70 2e 5b  ESCE(f.[to], p.[
23b80 6e 61 6d 65 5d 29 2c 20 73 2e 6e 61 6d 65 2c 20  name]), s.name, 
23b90 66 2e 5b 66 72 6f 6d 5d 29 2c 20 27 2c 20 27 29  f.[from]), ', ')
23ba0 22 0a 20 20 20 20 22 20 20 7c 7c 20 27 29 3b 27  ".    "  || ');'
23bb0 22 0a 20 20 20 20 22 2c 20 22 0a 20 20 20 20 22  ".    ", ".    "
23bc0 20 20 20 20 20 66 2e 5b 74 61 62 6c 65 5d 20 22       f.[table] "
23bd0 0a 20 20 20 20 22 46 52 4f 4d 20 73 71 6c 69 74  .    "FROM sqlit
23be0 65 5f 6d 61 73 74 65 72 20 41 53 20 73 2c 20 70  e_master AS s, p
23bf0 72 61 67 6d 61 5f 66 6f 72 65 69 67 6e 5f 6b 65  ragma_foreign_ke
23c00 79 5f 6c 69 73 74 28 73 2e 6e 61 6d 65 29 20 41  y_list(s.name) A
23c10 53 20 66 20 22 0a 20 20 20 20 22 4c 45 46 54 20  S f ".    "LEFT 
23c20 4a 4f 49 4e 20 70 72 61 67 6d 61 5f 74 61 62 6c  JOIN pragma_tabl
23c30 65 5f 69 6e 66 6f 20 41 53 20 70 20 4f 4e 20 28  e_info AS p ON (
23c40 70 6b 2d 31 3d 73 65 71 20 41 4e 44 20 70 2e 61  pk-1=seq AND p.a
23c50 72 67 3d 66 2e 5b 74 61 62 6c 65 5d 29 20 22 0a  rg=f.[table]) ".
23c60 20 20 20 20 22 47 52 4f 55 50 20 42 59 20 73 2e      "GROUP BY s.
23c70 6e 61 6d 65 2c 20 66 2e 69 64 20 22 0a 20 20 20  name, f.id ".   
23c80 20 22 4f 52 44 45 52 20 42 59 20 28 43 41 53 45   "ORDER BY (CASE
23c90 20 57 48 45 4e 20 3f 20 54 48 45 4e 20 66 2e 5b   WHEN ? THEN f.[
23ca0 74 61 62 6c 65 5d 20 45 4c 53 45 20 73 2e 6e 61  table] ELSE s.na
23cb0 6d 65 20 45 4e 44 29 22 0a 20 20 3b 0a 20 20 63  me END)".  ;.  c
23cc0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 47 6c 6f 62  onst char *zGlob
23cd0 49 50 4b 20 3d 20 22 53 45 41 52 43 48 20 54 41  IPK = "SEARCH TA
23ce0 42 4c 45 20 2a 20 55 53 49 4e 47 20 49 4e 54 45  BLE * USING INTE
23cf0 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20  GER PRIMARY KEY 
23d00 28 72 6f 77 69 64 3d 3f 29 22 3b 0a 0a 20 20 66  (rowid=?)";..  f
23d10 6f 72 28 69 3d 32 3b 20 69 3c 6e 41 72 67 3b 20  or(i=2; i<nArg; 
23d20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6e 20  i++){.    int n 
23d30 3d 20 73 74 72 6c 65 6e 33 30 28 61 7a 41 72 67  = strlen30(azArg
23d40 5b 69 5d 29 3b 0a 20 20 20 20 69 66 28 20 6e 3e  [i]);.    if( n>
23d50 31 20 26 26 20 73 71 6c 69 74 65 33 5f 73 74 72  1 && sqlite3_str
23d60 6e 69 63 6d 70 28 22 2d 76 65 72 62 6f 73 65 22  nicmp("-verbose"
23d70 2c 20 61 7a 41 72 67 5b 69 5d 2c 20 6e 29 3d 3d  , azArg[i], n)==
23d80 30 20 29 7b 0a 20 20 20 20 20 20 62 56 65 72 62  0 ){.      bVerb
23d90 6f 73 65 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  ose = 1;.    }. 
23da0 20 20 20 65 6c 73 65 20 69 66 28 20 6e 3e 31 20     else if( n>1 
23db0 26 26 20 73 71 6c 69 74 65 33 5f 73 74 72 6e 69  && sqlite3_strni
23dc0 63 6d 70 28 22 2d 67 72 6f 75 70 62 79 70 61 72  cmp("-groupbypar
23dd0 65 6e 74 22 2c 20 61 7a 41 72 67 5b 69 5d 2c 20  ent", azArg[i], 
23de0 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 62  n)==0 ){.      b
23df0 47 72 6f 75 70 42 79 50 61 72 65 6e 74 20 3d 20  GroupByParent = 
23e00 31 3b 0a 20 20 20 20 20 20 7a 49 6e 64 65 6e 74  1;.      zIndent
23e10 20 3d 20 22 20 20 20 20 22 3b 0a 20 20 20 20 7d   = "    ";.    }
23e20 0a 20 20 20 20 65 6c 73 65 7b 0a 20 20 20 20 20  .    else{.     
23e30 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65   raw_printf(stde
23e40 72 72 2c 20 22 55 73 61 67 65 3a 20 25 73 20 25  rr, "Usage: %s %
23e50 73 20 3f 2d 76 65 72 62 6f 73 65 3f 20 3f 2d 67  s ?-verbose? ?-g
23e60 72 6f 75 70 62 79 70 61 72 65 6e 74 3f 5c 6e 22  roupbyparent?\n"
23e70 2c 0a 20 20 20 20 20 20 20 20 20 20 61 7a 41 72  ,.          azAr
23e80 67 5b 30 5d 2c 20 61 7a 41 72 67 5b 31 5d 0a 20  g[0], azArg[1]. 
23e90 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 72 65       );.      re
23ea0 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
23eb0 52 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  R;.    }.  }..  
23ec0 2f 2a 20 52 65 67 69 73 74 65 72 20 74 68 65 20  /* Register the 
23ed0 66 6b 65 79 5f 63 6f 6c 6c 61 74 65 5f 63 6c 61  fkey_collate_cla
23ee0 75 73 65 28 29 20 53 51 4c 20 66 75 6e 63 74 69  use() SQL functi
23ef0 6f 6e 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c  on */.  rc = sql
23f00 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
23f10 74 69 6f 6e 28 64 62 2c 20 22 66 6b 65 79 5f 63  tion(db, "fkey_c
23f20 6f 6c 6c 61 74 65 5f 63 6c 61 75 73 65 22 2c 20  ollate_clause", 
23f30 34 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 0a  4, SQLITE_UTF8,.
23f40 20 20 20 20 20 20 30 2c 20 73 68 65 6c 6c 46 6b        0, shellFk
23f50 65 79 43 6f 6c 6c 61 74 65 43 6c 61 75 73 65 2c  eyCollateClause,
23f60 20 30 2c 20 30 0a 20 20 29 3b 0a 0a 0a 20 20 69   0, 0.  );...  i
23f70 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
23f80 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
23f90 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28  ite3_prepare_v2(
23fa0 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70  db, zSql, -1, &p
23fb0 53 71 6c 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69  Sql, 0);.  }.  i
23fc0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
23fd0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
23fe0 62 69 6e 64 5f 69 6e 74 28 70 53 71 6c 2c 20 31  bind_int(pSql, 1
23ff0 2c 20 62 47 72 6f 75 70 42 79 50 61 72 65 6e 74  , bGroupByParent
24000 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63  );.  }..  if( rc
24010 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
24020 20 20 20 69 6e 74 20 72 63 32 3b 0a 20 20 20 20     int rc2;.    
24030 63 68 61 72 20 2a 7a 50 72 65 76 20 3d 20 30 3b  char *zPrev = 0;
24040 0a 20 20 20 20 77 68 69 6c 65 28 20 53 51 4c 49  .    while( SQLI
24050 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f  TE_ROW==sqlite3_
24060 73 74 65 70 28 70 53 71 6c 29 20 29 7b 0a 20 20  step(pSql) ){.  
24070 20 20 20 20 69 6e 74 20 72 65 73 20 3d 20 2d 31      int res = -1
24080 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
24090 73 74 6d 74 20 2a 70 45 78 70 6c 61 69 6e 20 3d  stmt *pExplain =
240a0 20 30 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20   0;.      const 
240b0 63 68 61 72 20 2a 7a 45 51 50 20 3d 20 28 63 6f  char *zEQP = (co
240c0 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65  nst char*)sqlite
240d0 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53  3_column_text(pS
240e0 71 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 63 6f  ql, 0);.      co
240f0 6e 73 74 20 63 68 61 72 20 2a 7a 47 6c 6f 62 20  nst char *zGlob 
24100 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73  = (const char*)s
24110 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
24120 78 74 28 70 53 71 6c 2c 20 31 29 3b 0a 20 20 20  xt(pSql, 1);.   
24130 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
24140 46 72 6f 6d 20 3d 20 28 63 6f 6e 73 74 20 63 68  From = (const ch
24150 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75  ar*)sqlite3_colu
24160 6d 6e 5f 74 65 78 74 28 70 53 71 6c 2c 20 32 29  mn_text(pSql, 2)
24170 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  ;.      const ch
24180 61 72 20 2a 7a 54 61 72 67 65 74 20 3d 20 28 63  ar *zTarget = (c
24190 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74  onst char*)sqlit
241a0 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70  e3_column_text(p
241b0 53 71 6c 2c 20 33 29 3b 0a 20 20 20 20 20 20 63  Sql, 3);.      c
241c0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 49 20 3d  onst char *zCI =
241d0 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71   (const char*)sq
241e0 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
241f0 74 28 70 53 71 6c 2c 20 34 29 3b 0a 20 20 20 20  t(pSql, 4);.    
24200 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50    const char *zP
24210 61 72 65 6e 74 20 3d 20 28 63 6f 6e 73 74 20 63  arent = (const c
24220 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c  har*)sqlite3_col
24230 75 6d 6e 5f 74 65 78 74 28 70 53 71 6c 2c 20 35  umn_text(pSql, 5
24240 29 3b 0a 0a 20 20 20 20 20 20 72 63 20 3d 20 73  );..      rc = s
24250 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76  qlite3_prepare_v
24260 32 28 64 62 2c 20 7a 45 51 50 2c 20 2d 31 2c 20  2(db, zEQP, -1, 
24270 26 70 45 78 70 6c 61 69 6e 2c 20 30 29 3b 0a 20  &pExplain, 0);. 
24280 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
24290 49 54 45 5f 4f 4b 20 29 20 62 72 65 61 6b 3b 0a  ITE_OK ) break;.
242a0 20 20 20 20 20 20 69 66 28 20 53 51 4c 49 54 45        if( SQLITE
242b0 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74  _ROW==sqlite3_st
242c0 65 70 28 70 45 78 70 6c 61 69 6e 29 20 29 7b 0a  ep(pExplain) ){.
242d0 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68          const ch
242e0 61 72 20 2a 7a 50 6c 61 6e 20 3d 20 28 63 6f 6e  ar *zPlan = (con
242f0 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33  st char*)sqlite3
24300 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 45 78  _column_text(pEx
24310 70 6c 61 69 6e 2c 20 33 29 3b 0a 20 20 20 20 20  plain, 3);.     
24320 20 20 20 72 65 73 20 3d 20 28 0a 20 20 20 20 20     res = (.     
24330 20 20 20 20 20 20 20 20 20 30 3d 3d 73 71 6c 69           0==sqli
24340 74 65 33 5f 73 74 72 67 6c 6f 62 28 7a 47 6c 6f  te3_strglob(zGlo
24350 62 2c 20 7a 50 6c 61 6e 29 0a 20 20 20 20 20 20  b, zPlan).      
24360 20 20 20 20 20 7c 7c 20 30 3d 3d 73 71 6c 69 74       || 0==sqlit
24370 65 33 5f 73 74 72 67 6c 6f 62 28 7a 47 6c 6f 62  e3_strglob(zGlob
24380 49 50 4b 2c 20 7a 50 6c 61 6e 29 0a 20 20 20 20  IPK, zPlan).    
24390 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20      );.      }. 
243a0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
243b0 33 5f 66 69 6e 61 6c 69 7a 65 28 70 45 78 70 6c  3_finalize(pExpl
243c0 61 69 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ain);.      if( 
243d0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
243e0 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20 69 66  break;..      if
243f0 28 20 72 65 73 3c 30 20 29 7b 0a 20 20 20 20 20  ( res<0 ){.     
24400 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74     raw_printf(st
24410 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 69 6e  derr, "Error: in
24420 74 65 72 6e 61 6c 20 65 72 72 6f 72 22 29 3b 0a  ternal error");.
24430 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
24440 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
24450 20 20 20 20 69 66 28 20 62 47 72 6f 75 70 42 79      if( bGroupBy
24460 50 61 72 65 6e 74 0a 20 20 20 20 20 20 20 20 26  Parent.        &
24470 26 20 28 62 56 65 72 62 6f 73 65 20 7c 7c 20 72  & (bVerbose || r
24480 65 73 3d 3d 30 29 0a 20 20 20 20 20 20 20 20 26  es==0).        &
24490 26 20 28 7a 50 72 65 76 3d 3d 30 20 7c 7c 20 73  & (zPrev==0 || s
244a0 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28 7a  qlite3_stricmp(z
244b0 50 61 72 65 6e 74 2c 20 7a 50 72 65 76 29 29 0a  Parent, zPrev)).
244c0 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
244d0 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
244e0 6f 75 74 2c 20 22 2d 2d 20 50 61 72 65 6e 74 20  out, "-- Parent 
244f0 74 61 62 6c 65 20 25 73 5c 6e 22 2c 20 7a 50 61  table %s\n", zPa
24500 72 65 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 20  rent);.         
24510 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 50   sqlite3_free(zP
24520 72 65 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20  rev);.          
24530 7a 50 72 65 76 20 3d 20 73 71 6c 69 74 65 33 5f  zPrev = sqlite3_
24540 6d 70 72 69 6e 74 66 28 22 25 73 22 2c 20 7a 50  mprintf("%s", zP
24550 61 72 65 6e 74 29 3b 0a 20 20 20 20 20 20 20 20  arent);.        
24560 7d 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  }..        if( r
24570 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  es==0 ){.       
24580 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75     raw_printf(ou
24590 74 2c 20 22 25 73 25 73 20 2d 2d 3e 20 25 73 5c  t, "%s%s --> %s\
245a0 6e 22 2c 20 7a 49 6e 64 65 6e 74 2c 20 7a 43 49  n", zIndent, zCI
245b0 2c 20 7a 54 61 72 67 65 74 29 3b 0a 20 20 20 20  , zTarget);.    
245c0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 62 56      }else if( bV
245d0 65 72 62 6f 73 65 20 29 7b 0a 20 20 20 20 20 20  erbose ){.      
245e0 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f      raw_printf(o
245f0 75 74 2c 20 22 25 73 2f 2a 20 6e 6f 20 65 78 74  ut, "%s/* no ext
24600 72 61 20 69 6e 64 65 78 65 73 20 72 65 71 75 69  ra indexes requi
24610 72 65 64 20 66 6f 72 20 25 73 20 2d 3e 20 25 73  red for %s -> %s
24620 20 2a 2f 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20   */\n",.        
24630 20 20 20 20 20 20 7a 49 6e 64 65 6e 74 2c 20 7a        zIndent, z
24640 46 72 6f 6d 2c 20 7a 54 61 72 67 65 74 0a 20 20  From, zTarget.  
24650 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
24660 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
24670 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66   }.    sqlite3_f
24680 72 65 65 28 7a 50 72 65 76 29 3b 0a 0a 20 20 20  ree(zPrev);..   
24690 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
246a0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f  OK ){.      raw_
246b0 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
246c0 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f 65  %s\n", sqlite3_e
246d0 72 72 6d 73 67 28 64 62 29 29 3b 0a 20 20 20 20  rrmsg(db));.    
246e0 7d 0a 0a 20 20 20 20 72 63 32 20 3d 20 73 71 6c  }..    rc2 = sql
246f0 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53  ite3_finalize(pS
24700 71 6c 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  ql);.    if( rc=
24710 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63  =SQLITE_OK && rc
24720 32 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  2!=SQLITE_OK ){.
24730 20 20 20 20 20 20 72 63 20 3d 20 72 63 32 3b 0a        rc = rc2;.
24740 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
24750 28 73 74 64 65 72 72 2c 20 22 25 73 5c 6e 22 2c  (stderr, "%s\n",
24760 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
24770 64 62 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  db));.    }.  }e
24780 6c 73 65 7b 0a 20 20 20 20 72 61 77 5f 70 72 69  lse{.    raw_pri
24790 6e 74 66 28 73 74 64 65 72 72 2c 20 22 25 73 5c  ntf(stderr, "%s\
247a0 6e 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d  n", sqlite3_errm
247b0 73 67 28 64 62 29 29 3b 0a 20 20 7d 0a 0a 20 20  sg(db));.  }..  
247c0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
247d0 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69  .** Implementati
247e0 6f 6e 20 6f 66 20 22 2e 6c 69 6e 74 22 20 64 6f  on of ".lint" do
247f0 74 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a 73 74  t command..*/.st
24800 61 74 69 63 20 69 6e 74 20 6c 69 6e 74 44 6f 74  atic int lintDot
24810 43 6f 6d 6d 61 6e 64 28 0a 20 20 53 68 65 6c 6c  Command(.  Shell
24820 53 74 61 74 65 20 2a 70 53 74 61 74 65 2c 20 20  State *pState,  
24830 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
24840 72 72 65 6e 74 20 73 68 65 6c 6c 20 74 6f 6f 6c  rrent shell tool
24850 20 73 74 61 74 65 20 2a 2f 0a 20 20 63 68 61 72   state */.  char
24860 20 2a 2a 61 7a 41 72 67 2c 20 20 20 20 20 20 20   **azArg,       
24870 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
24880 72 72 61 79 20 6f 66 20 61 72 67 75 6d 65 6e 74  rray of argument
24890 73 20 70 61 73 73 65 64 20 74 6f 20 64 6f 74 20  s passed to dot 
248a0 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  command */.  int
248b0 20 6e 41 72 67 20 20 20 20 20 20 20 20 20 20 20   nArg           
248c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
248d0 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65  Number of entrie
248e0 73 20 69 6e 20 61 7a 41 72 67 5b 5d 20 2a 2f 0a  s in azArg[] */.
248f0 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 6e 20  ){.  int n;.  n 
24900 3d 20 28 6e 41 72 67 3e 3d 32 20 3f 20 73 74 72  = (nArg>=2 ? str
24910 6c 65 6e 33 30 28 61 7a 41 72 67 5b 31 5d 29 20  len30(azArg[1]) 
24920 3a 20 30 29 3b 0a 20 20 69 66 28 20 6e 3c 31 20  : 0);.  if( n<1 
24930 7c 7c 20 73 71 6c 69 74 65 33 5f 73 74 72 6e 69  || sqlite3_strni
24940 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 20 22 66  cmp(azArg[1], "f
24950 6b 65 79 2d 69 6e 64 65 78 65 73 22 2c 20 6e 29  key-indexes", n)
24960 20 29 20 67 6f 74 6f 20 75 73 61 67 65 3b 0a 20   ) goto usage;. 
24970 20 72 65 74 75 72 6e 20 6c 69 6e 74 46 6b 65 79   return lintFkey
24980 49 6e 64 65 78 65 73 28 70 53 74 61 74 65 2c 20  Indexes(pState, 
24990 61 7a 41 72 67 2c 20 6e 41 72 67 29 3b 0a 0a 20  azArg, nArg);.. 
249a0 75 73 61 67 65 3a 0a 20 20 72 61 77 5f 70 72 69  usage:.  raw_pri
249b0 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55 73 61  ntf(stderr, "Usa
249c0 67 65 20 25 73 20 73 75 62 2d 63 6f 6d 6d 61 6e  ge %s sub-comman
249d0 64 20 3f 73 77 69 74 63 68 65 73 2e 2e 2e 3f 5c  d ?switches...?\
249e0 6e 22 2c 20 61 7a 41 72 67 5b 30 5d 29 3b 0a 20  n", azArg[0]);. 
249f0 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65   raw_printf(stde
24a00 72 72 2c 20 22 57 68 65 72 65 20 73 75 62 2d 63  rr, "Where sub-c
24a10 6f 6d 6d 61 6e 64 73 20 61 72 65 3a 5c 6e 22 29  ommands are:\n")
24a20 3b 0a 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73  ;.  raw_printf(s
24a30 74 64 65 72 72 2c 20 22 20 20 20 20 66 6b 65 79  tderr, "    fkey
24a40 2d 69 6e 64 65 78 65 73 5c 6e 22 29 3b 0a 20 20  -indexes\n");.  
24a50 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
24a60 52 4f 52 3b 0a 7d 0a 0a 23 69 66 20 21 64 65 66  ROR;.}..#if !def
24a70 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
24a80 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 20 26  _VIRTUALTABLE) &
24a90 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  & defined(SQLITE
24aa0 5f 48 41 56 45 5f 5a 4c 49 42 29 0a 2f 2a 2a 2a  _HAVE_ZLIB)./***
24ab0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24ac0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24ad0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24ae0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24af0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
24b00 2a 20 54 68 65 20 22 2e 61 72 63 68 69 76 65 22  * The ".archive"
24b10 20 6f 72 20 22 2e 61 72 22 20 63 6f 6d 6d 61 6e   or ".ar" comman
24b20 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
24b30 64 20 73 68 65 6c 6c 50 72 65 70 61 72 65 28 0a  d shellPrepare(.
24b40 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 0a    sqlite3 *db, .
24b50 20 20 69 6e 74 20 2a 70 52 63 2c 20 0a 20 20 63    int *pRc, .  c
24b60 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 2c  onst char *zSql,
24b70 20 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74   .  sqlite3_stmt
24b80 20 2a 2a 70 70 53 74 6d 74 0a 29 7b 0a 20 20 2a   **ppStmt.){.  *
24b90 70 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 69 66  ppStmt = 0;.  if
24ba0 28 20 2a 70 52 63 3d 3d 53 51 4c 49 54 45 5f 4f  ( *pRc==SQLITE_O
24bb0 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 20  K ){.    int rc 
24bc0 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72  = sqlite3_prepar
24bd0 65 5f 76 32 28 64 62 2c 20 7a 53 71 6c 2c 20 2d  e_v2(db, zSql, -
24be0 31 2c 20 70 70 53 74 6d 74 2c 20 30 29 3b 0a 20  1, ppStmt, 0);. 
24bf0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
24c00 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 61  E_OK ){.      ra
24c10 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  w_printf(stderr,
24c20 20 22 73 71 6c 20 65 72 72 6f 72 3a 20 25 73 20   "sql error: %s 
24c30 28 25 64 29 5c 6e 22 2c 20 0a 20 20 20 20 20 20  (%d)\n", .      
24c40 20 20 20 20 73 71 6c 69 74 65 33 5f 65 72 72 6d      sqlite3_errm
24c50 73 67 28 64 62 29 2c 20 73 71 6c 69 74 65 33 5f  sg(db), sqlite3_
24c60 65 72 72 63 6f 64 65 28 64 62 29 0a 20 20 20 20  errcode(db).    
24c70 20 20 29 3b 0a 20 20 20 20 20 20 2a 70 52 63 20    );.      *pRc 
24c80 3d 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  = rc;.    }.  }.
24c90 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  }..static void s
24ca0 68 65 6c 6c 50 72 65 70 61 72 65 50 72 69 6e 74  hellPreparePrint
24cb0 66 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  f(.  sqlite3 *db
24cc0 2c 20 0a 20 20 69 6e 74 20 2a 70 52 63 2c 20 0a  , .  int *pRc, .
24cd0 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
24ce0 2a 70 70 53 74 6d 74 2c 0a 20 20 63 6f 6e 73 74  *ppStmt,.  const
24cf0 20 63 68 61 72 20 2a 7a 46 6d 74 2c 20 0a 20 20   char *zFmt, .  
24d00 2e 2e 2e 0a 29 7b 0a 20 20 2a 70 70 53 74 6d 74  ....){.  *ppStmt
24d10 20 3d 20 30 3b 0a 20 20 69 66 28 20 2a 70 52 63   = 0;.  if( *pRc
24d20 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
24d30 20 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20     va_list ap;. 
24d40 20 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20     char *z;.    
24d50 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6d  va_start(ap, zFm
24d60 74 29 3b 0a 20 20 20 20 7a 20 3d 20 73 71 6c 69  t);.    z = sqli
24d70 74 65 33 5f 76 6d 70 72 69 6e 74 66 28 7a 46 6d  te3_vmprintf(zFm
24d80 74 2c 20 61 70 29 3b 0a 20 20 20 20 69 66 28 20  t, ap);.    if( 
24d90 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2a 70  z==0 ){.      *p
24da0 52 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  Rc = SQLITE_NOME
24db0 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  M;.    }else{.  
24dc0 20 20 20 20 73 68 65 6c 6c 50 72 65 70 61 72 65      shellPrepare
24dd0 28 64 62 2c 20 70 52 63 2c 20 7a 2c 20 70 70 53  (db, pRc, z, ppS
24de0 74 6d 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  tmt);.      sqli
24df0 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20 20  te3_free(z);.   
24e00 20 7d 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63   }.  }.}..static
24e10 20 76 6f 69 64 20 73 68 65 6c 6c 46 69 6e 61 6c   void shellFinal
24e20 69 7a 65 28 0a 20 20 69 6e 74 20 2a 70 52 63 2c  ize(.  int *pRc,
24e30 20 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74   .  sqlite3_stmt
24e40 20 2a 70 53 74 6d 74 0a 29 7b 0a 20 20 69 66 28   *pStmt.){.  if(
24e50 20 70 53 74 6d 74 20 29 7b 0a 20 20 20 20 73 71   pStmt ){.    sq
24e60 6c 69 74 65 33 20 2a 64 62 20 3d 20 73 71 6c 69  lite3 *db = sqli
24e70 74 65 33 5f 64 62 5f 68 61 6e 64 6c 65 28 70 53  te3_db_handle(pS
24e80 74 6d 74 29 3b 0a 20 20 20 20 69 6e 74 20 72 63  tmt);.    int rc
24e90 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c   = sqlite3_final
24ea0 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20  ize(pStmt);.    
24eb0 69 66 28 20 2a 70 52 63 3d 3d 53 51 4c 49 54 45  if( *pRc==SQLITE
24ec0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28  _OK ){.      if(
24ed0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
24ee0 7b 0a 20 20 20 20 20 20 20 20 72 61 77 5f 70 72  {.        raw_pr
24ef0 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 53 51  intf(stderr, "SQ
24f00 4c 20 65 72 72 6f 72 3a 20 25 73 5c 6e 22 2c 20  L error: %s\n", 
24f10 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 64  sqlite3_errmsg(d
24f20 62 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  b));.      }.   
24f30 20 20 20 2a 70 52 63 20 3d 20 72 63 3b 0a 20 20     *pRc = rc;.  
24f40 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69    }.  }.}..stati
24f50 63 20 76 6f 69 64 20 73 68 65 6c 6c 52 65 73 65  c void shellRese
24f60 74 28 0a 20 20 69 6e 74 20 2a 70 52 63 2c 20 0a  t(.  int *pRc, .
24f70 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
24f80 70 53 74 6d 74 0a 29 7b 0a 20 20 69 6e 74 20 72  pStmt.){.  int r
24f90 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65  c = sqlite3_rese
24fa0 74 28 70 53 74 6d 74 29 3b 0a 20 20 69 66 28 20  t(pStmt);.  if( 
24fb0 2a 70 52 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  *pRc==SQLITE_OK 
24fc0 29 7b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  ){.    if( rc!=S
24fd0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
24fe0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
24ff0 73 71 6c 69 74 65 33 5f 64 62 5f 68 61 6e 64 6c  sqlite3_db_handl
25000 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20  e(pStmt);.      
25010 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72  raw_printf(stder
25020 72 2c 20 22 53 51 4c 20 65 72 72 6f 72 3a 20 25  r, "SQL error: %
25030 73 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f 65 72  s\n", sqlite3_er
25040 72 6d 73 67 28 64 62 29 29 3b 0a 20 20 20 20 7d  rmsg(db));.    }
25050 0a 20 20 20 20 2a 70 52 63 20 3d 20 72 63 3b 0a  .    *pRc = rc;.
25060 20 20 7d 0a 7d 0a 2f 2a 0a 2a 2a 20 53 74 72 75    }.}./*.** Stru
25070 63 74 75 72 65 20 72 65 70 72 65 73 65 6e 74 69  cture representi
25080 6e 67 20 61 20 73 69 6e 67 6c 65 20 22 2e 61 72  ng a single ".ar
25090 22 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a 74 79  " command..*/.ty
250a0 70 65 64 65 66 20 73 74 72 75 63 74 20 41 72 43  pedef struct ArC
250b0 6f 6d 6d 61 6e 64 20 41 72 43 6f 6d 6d 61 6e 64  ommand ArCommand
250c0 3b 0a 73 74 72 75 63 74 20 41 72 43 6f 6d 6d 61  ;.struct ArComma
250d0 6e 64 20 7b 0a 20 20 75 38 20 65 43 6d 64 3b 20  nd {.  u8 eCmd; 
250e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
250f0 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 41 52 5f         /* An AR_
25100 43 4d 44 5f 2a 20 76 61 6c 75 65 20 2a 2f 0a 20  CMD_* value */. 
25110 20 75 38 20 62 56 65 72 62 6f 73 65 3b 20 20 20   u8 bVerbose;   
25120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25130 20 2f 2a 20 54 72 75 65 20 69 66 20 2d 2d 76 65   /* True if --ve
25140 72 62 6f 73 65 20 2a 2f 0a 20 20 75 38 20 62 5a  rbose */.  u8 bZ
25150 69 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ip;             
25160 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
25170 75 65 20 69 66 20 74 68 65 20 61 72 63 68 69 76  ue if the archiv
25180 65 20 69 73 20 61 20 5a 49 50 20 2a 2f 0a 20 20  e is a ZIP */.  
25190 75 38 20 62 44 72 79 52 75 6e 3b 20 20 20 20 20  u8 bDryRun;     
251a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
251b0 2f 2a 20 54 72 75 65 20 69 66 20 2d 2d 64 72 79  /* True if --dry
251c0 2d 72 75 6e 20 2a 2f 0a 20 20 75 38 20 62 41 70  -run */.  u8 bAp
251d0 70 65 6e 64 3b 20 20 20 20 20 20 20 20 20 20 20  pend;           
251e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
251f0 65 20 69 66 20 2d 2d 61 70 70 65 6e 64 20 2a 2f  e if --append */
25200 0a 20 20 69 6e 74 20 6e 41 72 67 3b 20 20 20 20  .  int nArg;    
25210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25220 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
25230 63 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74  command argument
25240 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 53 72  s */.  char *zSr
25250 63 54 61 62 6c 65 3b 20 20 20 20 20 20 20 20 20  cTable;         
25260 20 20 20 20 20 20 20 2f 2a 20 22 73 71 6c 61 72         /* "sqlar
25270 22 2c 20 22 7a 69 70 66 69 6c 65 28 24 66 69 6c  ", "zipfile($fil
25280 65 29 22 20 6f 72 20 22 7a 69 70 22 20 2a 2f 0a  e)" or "zip" */.
25290 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
252a0 69 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ile;            
252b0 20 20 2f 2a 20 2d 2d 66 69 6c 65 20 61 72 67 75    /* --file argu
252c0 6d 65 6e 74 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f  ment, or NULL */
252d0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
252e0 44 69 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  Dir;            
252f0 20 20 20 2f 2a 20 2d 2d 64 69 72 65 63 74 6f 72     /* --director
25300 79 20 61 72 67 75 6d 65 6e 74 2c 20 6f 72 20 4e  y argument, or N
25310 55 4c 4c 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a  ULL */.  char **
25320 61 7a 41 72 67 3b 20 20 20 20 20 20 20 20 20 20  azArg;          
25330 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61           /* Arra
25340 79 20 6f 66 20 63 6f 6d 6d 61 6e 64 20 61 72 67  y of command arg
25350 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 53 68 65 6c  uments */.  Shel
25360 6c 53 74 61 74 65 20 2a 70 3b 20 20 20 20 20 20  lState *p;      
25370 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
25380 68 65 6c 6c 20 73 74 61 74 65 20 2a 2f 0a 20 20  hell state */.  
25390 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20  sqlite3 *db;    
253a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
253b0 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 74  /* Database cont
253c0 61 69 6e 69 6e 67 20 74 68 65 20 61 72 63 68 69  aining the archi
253d0 76 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  ve */.};../*.** 
253e0 50 72 69 6e 74 20 61 20 75 73 61 67 65 20 6d 65  Print a usage me
253f0 73 73 61 67 65 20 66 6f 72 20 74 68 65 20 2e 61  ssage for the .a
25400 72 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 73 74 64  r command to std
25410 65 72 72 20 61 6e 64 20 72 65 74 75 72 6e 20 53  err and return S
25420 51 4c 49 54 45 5f 45 52 52 4f 52 2e 0a 2a 2f 0a  QLITE_ERROR..*/.
25430 73 74 61 74 69 63 20 69 6e 74 20 61 72 55 73 61  static int arUsa
25440 67 65 28 46 49 4c 45 20 2a 66 29 7b 0a 20 20 72  ge(FILE *f){.  r
25450 61 77 5f 70 72 69 6e 74 66 28 66 2c 0a 22 5c 6e  aw_printf(f,."\n
25460 22 0a 22 55 73 61 67 65 3a 20 2e 61 72 20 5b 4f  "."Usage: .ar [O
25470 50 54 49 4f 4e 2e 2e 2e 5d 20 5b 46 49 4c 45 2e  PTION...] [FILE.
25480 2e 2e 5d 5c 6e 22 0a 22 54 68 65 20 2e 61 72 20  ..]\n"."The .ar 
25490 63 6f 6d 6d 61 6e 64 20 6d 61 6e 61 67 65 73 20  command manages 
254a0 73 71 6c 61 72 20 61 72 63 68 69 76 65 73 2e 5c  sqlar archives.\
254b0 6e 22 0a 22 5c 6e 22 0a 22 45 78 61 6d 70 6c 65  n"."\n"."Example
254c0 73 3a 5c 6e 22 0a 22 20 20 2e 61 72 20 2d 63 66  s:\n"."  .ar -cf
254d0 20 61 72 63 68 69 76 65 2e 73 61 72 20 66 6f 6f   archive.sar foo
254e0 20 62 61 72 20 20 20 20 23 20 43 72 65 61 74 65   bar    # Create
254f0 20 61 72 63 68 69 76 65 2e 73 61 72 20 66 72 6f   archive.sar fro
25500 6d 20 66 69 6c 65 73 20 66 6f 6f 20 61 6e 64 20  m files foo and 
25510 62 61 72 5c 6e 22 0a 22 20 20 2e 61 72 20 2d 74  bar\n"."  .ar -t
25520 66 20 61 72 63 68 69 76 65 2e 73 61 72 20 20 20  f archive.sar   
25530 20 20 20 20 20 20 20 20 20 23 20 4c 69 73 74 20           # List 
25540 6d 65 6d 62 65 72 73 20 6f 66 20 61 72 63 68 69  members of archi
25550 76 65 2e 73 61 72 5c 6e 22 0a 22 20 20 2e 61 72  ve.sar\n"."  .ar
25560 20 2d 78 76 66 20 61 72 63 68 69 76 65 2e 73 61   -xvf archive.sa
25570 72 20 20 20 20 20 20 20 20 20 20 20 23 20 56 65  r           # Ve
25580 72 62 6f 73 65 6c 79 20 65 78 74 72 61 63 74 20  rbosely extract 
25590 66 69 6c 65 73 20 66 72 6f 6d 20 61 72 63 68 69  files from archi
255a0 76 65 2e 73 61 72 5c 6e 22 0a 22 5c 6e 22 0a 22  ve.sar\n"."\n"."
255b0 45 61 63 68 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e  Each command lin
255c0 65 20 6d 75 73 74 20 66 65 61 74 75 72 65 20 65  e must feature e
255d0 78 61 63 74 6c 79 20 6f 6e 65 20 63 6f 6d 6d 61  xactly one comma
255e0 6e 64 20 6f 70 74 69 6f 6e 3a 5c 6e 22 0a 22 20  nd option:\n"." 
255f0 20 2d 63 2c 20 2d 2d 63 72 65 61 74 65 20 20 20   -c, --create   
25600 20 20 20 20 20 20 20 20 20 20 20 20 43 72 65 61              Crea
25610 74 65 20 61 20 6e 65 77 20 61 72 63 68 69 76 65  te a new archive
25620 5c 6e 22 0a 22 20 20 2d 75 2c 20 2d 2d 75 70 64  \n"."  -u, --upd
25630 61 74 65 20 20 20 20 20 20 20 20 20 20 20 20 20  ate             
25640 20 20 55 70 64 61 74 65 20 6f 72 20 61 64 64 20    Update or add 
25650 66 69 6c 65 73 20 74 6f 20 61 6e 20 65 78 69 73  files to an exis
25660 74 69 6e 67 20 61 72 63 68 69 76 65 5c 6e 22 0a  ting archive\n".
25670 22 20 20 2d 74 2c 20 2d 2d 6c 69 73 74 20 20 20  "  -t, --list   
25680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4c 69                Li
25690 73 74 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 61  st contents of a
256a0 72 63 68 69 76 65 5c 6e 22 0a 22 20 20 2d 78 2c  rchive\n"."  -x,
256b0 20 2d 2d 65 78 74 72 61 63 74 20 20 20 20 20 20   --extract      
256c0 20 20 20 20 20 20 20 20 45 78 74 72 61 63 74 20          Extract 
256d0 66 69 6c 65 73 20 66 72 6f 6d 20 61 72 63 68 69  files from archi
256e0 76 65 5c 6e 22 0a 22 5c 6e 22 0a 22 41 6e 64 20  ve\n"."\n"."And 
256f0 7a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 6f 70 74  zero or more opt
25700 69 6f 6e 61 6c 20 6f 70 74 69 6f 6e 73 3a 5c 6e  ional options:\n
25710 22 0a 22 20 20 2d 76 2c 20 2d 2d 76 65 72 62 6f  "."  -v, --verbo
25720 73 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20  se              
25730 50 72 69 6e 74 20 65 61 63 68 20 66 69 6c 65 6e  Print each filen
25740 61 6d 65 20 61 73 20 69 74 20 69 73 20 70 72 6f  ame as it is pro
25750 63 65 73 73 65 64 5c 6e 22 0a 22 20 20 2d 66 20  cessed\n"."  -f 
25760 46 49 4c 45 2c 20 2d 2d 66 69 6c 65 20 46 49 4c  FILE, --file FIL
25770 45 20 20 20 20 20 20 20 4f 70 65 72 61 74 65 20  E       Operate 
25780 6f 6e 20 61 72 63 68 69 76 65 20 46 49 4c 45 20  on archive FILE 
25790 28 64 65 66 61 75 6c 74 20 69 73 20 63 75 72 72  (default is curr
257a0 65 6e 74 20 64 62 29 5c 6e 22 0a 22 20 20 2d 61  ent db)\n"."  -a
257b0 20 46 49 4c 45 2c 20 2d 2d 61 70 70 65 6e 64 20   FILE, --append 
257c0 46 49 4c 45 20 20 20 20 20 4f 70 65 72 61 74 65  FILE     Operate
257d0 20 6f 6e 20 46 49 4c 45 20 6f 70 65 6e 65 64 20   on FILE opened 
257e0 75 73 69 6e 67 20 74 68 65 20 61 70 6e 64 76 66  using the apndvf
257f0 73 20 56 46 53 5c 6e 22 0a 22 20 20 2d 43 20 44  s VFS\n"."  -C D
25800 49 52 2c 20 2d 2d 64 69 72 65 63 74 6f 72 79 20  IR, --directory 
25810 44 49 52 20 20 20 20 43 68 61 6e 67 65 20 74 6f  DIR    Change to
25820 20 64 69 72 65 63 74 6f 72 79 20 44 49 52 20 74   directory DIR t
25830 6f 20 72 65 61 64 2f 65 78 74 72 61 63 74 20 66  o read/extract f
25840 69 6c 65 73 5c 6e 22 0a 22 20 20 2d 6e 2c 20 2d  iles\n"."  -n, -
25850 2d 64 72 79 72 75 6e 20 20 20 20 20 20 20 20 20  -dryrun         
25860 20 20 20 20 20 20 53 68 6f 77 20 74 68 65 20 53        Show the S
25870 51 4c 20 74 68 61 74 20 77 6f 75 6c 64 20 68 61  QL that would ha
25880 76 65 20 6f 63 63 75 72 72 65 64 5c 6e 22 0a 22  ve occurred\n"."
25890 5c 6e 22 0a 22 53 65 65 20 61 6c 73 6f 3a 20 68  \n"."See also: h
258a0 74 74 70 3a 2f 2f 73 71 6c 69 74 65 2e 6f 72 67  ttp://sqlite.org
258b0 2f 63 6c 69 2e 68 74 6d 6c 23 73 71 6c 61 72 5f  /cli.html#sqlar_
258c0 61 72 63 68 69 76 65 5f 73 75 70 70 6f 72 74 5c  archive_support\
258d0 6e 22 0a 22 5c 6e 22 0a 29 3b 0a 20 20 72 65 74  n"."\n".);.  ret
258e0 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
258f0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74  ;.}../*.** Print
25900 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
25910 65 20 66 6f 72 20 74 68 65 20 2e 61 72 20 63 6f  e for the .ar co
25920 6d 6d 61 6e 64 20 74 6f 20 73 74 64 65 72 72 20  mmand to stderr 
25930 61 6e 64 20 72 65 74 75 72 6e 20 0a 2a 2a 20 53  and return .** S
25940 51 4c 49 54 45 5f 45 52 52 4f 52 2e 0a 2a 2f 0a  QLITE_ERROR..*/.
25950 73 74 61 74 69 63 20 69 6e 74 20 61 72 45 72 72  static int arErr
25960 6f 72 4d 73 67 28 63 6f 6e 73 74 20 63 68 61 72  orMsg(const char
25970 20 2a 7a 46 6d 74 2c 20 2e 2e 2e 29 7b 0a 20 20   *zFmt, ...){.  
25980 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 63 68  va_list ap;.  ch
25990 61 72 20 2a 7a 3b 0a 20 20 76 61 5f 73 74 61 72  ar *z;.  va_star
259a0 74 28 61 70 2c 20 7a 46 6d 74 29 3b 0a 20 20 7a  t(ap, zFmt);.  z
259b0 20 3d 20 73 71 6c 69 74 65 33 5f 76 6d 70 72 69   = sqlite3_vmpri
259c0 6e 74 66 28 7a 46 6d 74 2c 20 61 70 29 3b 0a 20  ntf(zFmt, ap);. 
259d0 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 72   va_end(ap);.  r
259e0 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  aw_printf(stderr
259f0 2c 20 22 45 72 72 6f 72 3a 20 25 73 20 28 74 72  , "Error: %s (tr
25a00 79 20 5c 22 2e 61 72 20 2d 2d 68 65 6c 70 5c 22  y \".ar --help\"
25a10 29 5c 6e 22 2c 20 7a 29 3b 0a 20 20 73 71 6c 69  )\n", z);.  sqli
25a20 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20 72  te3_free(z);.  r
25a30 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
25a40 4f 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 56 61 6c  OR;.}../*.** Val
25a50 75 65 73 20 66 6f 72 20 41 72 43 6f 6d 6d 61 6e  ues for ArComman
25a60 64 2e 65 43 6d 64 2e 0a 2a 2f 0a 23 64 65 66 69  d.eCmd..*/.#defi
25a70 6e 65 20 41 52 5f 43 4d 44 5f 43 52 45 41 54 45  ne AR_CMD_CREATE
25a80 20 20 20 20 20 20 20 31 0a 23 64 65 66 69 6e 65         1.#define
25a90 20 41 52 5f 43 4d 44 5f 45 58 54 52 41 43 54 20   AR_CMD_EXTRACT 
25aa0 20 20 20 20 20 32 0a 23 64 65 66 69 6e 65 20 41       2.#define A
25ab0 52 5f 43 4d 44 5f 4c 49 53 54 20 20 20 20 20 20  R_CMD_LIST      
25ac0 20 20 20 33 0a 23 64 65 66 69 6e 65 20 41 52 5f     3.#define AR_
25ad0 43 4d 44 5f 55 50 44 41 54 45 20 20 20 20 20 20  CMD_UPDATE      
25ae0 20 34 0a 23 64 65 66 69 6e 65 20 41 52 5f 43 4d   4.#define AR_CM
25af0 44 5f 48 45 4c 50 20 20 20 20 20 20 20 20 20 35  D_HELP         5
25b00 0a 0a 2f 2a 0a 2a 2a 20 4f 74 68 65 72 20 28 6e  ../*.** Other (n
25b10 6f 6e 2d 63 6f 6d 6d 61 6e 64 29 20 73 77 69 74  on-command) swit
25b20 63 68 65 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  ches..*/.#define
25b30 20 41 52 5f 53 57 49 54 43 48 5f 56 45 52 42 4f   AR_SWITCH_VERBO
25b40 53 45 20 20 20 20 20 36 0a 23 64 65 66 69 6e 65  SE     6.#define
25b50 20 41 52 5f 53 57 49 54 43 48 5f 46 49 4c 45 20   AR_SWITCH_FILE 
25b60 20 20 20 20 20 20 20 37 0a 23 64 65 66 69 6e 65         7.#define
25b70 20 41 52 5f 53 57 49 54 43 48 5f 44 49 52 45 43   AR_SWITCH_DIREC
25b80 54 4f 52 59 20 20 20 38 0a 23 64 65 66 69 6e 65  TORY   8.#define
25b90 20 41 52 5f 53 57 49 54 43 48 5f 41 50 50 45 4e   AR_SWITCH_APPEN
25ba0 44 20 20 20 20 20 20 39 0a 23 64 65 66 69 6e 65  D      9.#define
25bb0 20 41 52 5f 53 57 49 54 43 48 5f 44 52 59 52 55   AR_SWITCH_DRYRU
25bc0 4e 20 20 20 20 20 31 30 0a 0a 73 74 61 74 69 63  N     10..static
25bd0 20 69 6e 74 20 61 72 50 72 6f 63 65 73 73 53 77   int arProcessSw
25be0 69 74 63 68 28 41 72 43 6f 6d 6d 61 6e 64 20 2a  itch(ArCommand *
25bf0 70 41 72 2c 20 69 6e 74 20 65 53 77 69 74 63 68  pAr, int eSwitch
25c00 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41  , const char *zA
25c10 72 67 29 7b 0a 20 20 73 77 69 74 63 68 28 20 65  rg){.  switch( e
25c20 53 77 69 74 63 68 20 29 7b 0a 20 20 20 20 63 61  Switch ){.    ca
25c30 73 65 20 41 52 5f 43 4d 44 5f 43 52 45 41 54 45  se AR_CMD_CREATE
25c40 3a 0a 20 20 20 20 63 61 73 65 20 41 52 5f 43 4d  :.    case AR_CM
25c50 44 5f 45 58 54 52 41 43 54 3a 0a 20 20 20 20 63  D_EXTRACT:.    c
25c60 61 73 65 20 41 52 5f 43 4d 44 5f 4c 49 53 54 3a  ase AR_CMD_LIST:
25c70 0a 20 20 20 20 63 61 73 65 20 41 52 5f 43 4d 44  .    case AR_CMD
25c80 5f 55 50 44 41 54 45 3a 0a 20 20 20 20 63 61 73  _UPDATE:.    cas
25c90 65 20 41 52 5f 43 4d 44 5f 48 45 4c 50 3a 0a 20  e AR_CMD_HELP:. 
25ca0 20 20 20 20 20 69 66 28 20 70 41 72 2d 3e 65 43       if( pAr->eC
25cb0 6d 64 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  md ){.        re
25cc0 74 75 72 6e 20 61 72 45 72 72 6f 72 4d 73 67 28  turn arErrorMsg(
25cd0 22 6d 75 6c 74 69 70 6c 65 20 63 6f 6d 6d 61 6e  "multiple comman
25ce0 64 20 6f 70 74 69 6f 6e 73 22 29 3b 0a 20 20 20  d options");.   
25cf0 20 20 20 7d 0a 20 20 20 20 20 20 70 41 72 2d 3e     }.      pAr->
25d00 65 43 6d 64 20 3d 20 65 53 77 69 74 63 68 3b 0a  eCmd = eSwitch;.
25d10 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20        break;..  
25d20 20 20 63 61 73 65 20 41 52 5f 53 57 49 54 43 48    case AR_SWITCH
25d30 5f 44 52 59 52 55 4e 3a 0a 20 20 20 20 20 20 70  _DRYRUN:.      p
25d40 41 72 2d 3e 62 44 72 79 52 75 6e 20 3d 20 31 3b  Ar->bDryRun = 1;
25d50 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
25d60 20 20 63 61 73 65 20 41 52 5f 53 57 49 54 43 48    case AR_SWITCH
25d70 5f 56 45 52 42 4f 53 45 3a 0a 20 20 20 20 20 20  _VERBOSE:.      
25d80 70 41 72 2d 3e 62 56 65 72 62 6f 73 65 20 3d 20  pAr->bVerbose = 
25d90 31 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  1;.      break;.
25da0 20 20 20 20 63 61 73 65 20 41 52 5f 53 57 49 54      case AR_SWIT
25db0 43 48 5f 41 50 50 45 4e 44 3a 0a 20 20 20 20 20  CH_APPEND:.     
25dc0 20 70 41 72 2d 3e 62 41 70 70 65 6e 64 20 3d 20   pAr->bAppend = 
25dd0 31 3b 0a 20 20 20 20 20 20 2f 2a 20 46 61 6c 6c  1;.      /* Fall
25de0 20 74 68 72 75 20 69 6e 74 6f 20 2d 2d 66 69 6c   thru into --fil
25df0 65 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 41 52  e */.    case AR
25e00 5f 53 57 49 54 43 48 5f 46 49 4c 45 3a 0a 20 20  _SWITCH_FILE:.  
25e10 20 20 20 20 70 41 72 2d 3e 7a 46 69 6c 65 20 3d      pAr->zFile =
25e20 20 7a 41 72 67 3b 0a 20 20 20 20 20 20 62 72 65   zArg;.      bre
25e30 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 41 52 5f  ak;.    case AR_
25e40 53 57 49 54 43 48 5f 44 49 52 45 43 54 4f 52 59  SWITCH_DIRECTORY
25e50 3a 0a 20 20 20 20 20 20 70 41 72 2d 3e 7a 44 69  :.      pAr->zDi
25e60 72 20 3d 20 7a 41 72 67 3b 0a 20 20 20 20 20 20  r = zArg;.      
25e70 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 72 65  break;.  }..  re
25e80 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
25e90 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 73 65 20 74  }../*.** Parse t
25ea0 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20  he command line 
25eb0 66 6f 72 20 61 6e 20 22 2e 61 72 22 20 63 6f 6d  for an ".ar" com
25ec0 6d 61 6e 64 2e 20 54 68 65 20 72 65 73 75 6c 74  mand. The result
25ed0 73 20 61 72 65 20 77 72 69 74 74 65 6e 20 69 6e  s are written in
25ee0 74 6f 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20  to.** structure 
25ef0 28 2a 70 41 72 29 2e 20 53 51 4c 49 54 45 5f 4f  (*pAr). SQLITE_O
25f00 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  K is returned if
25f10 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e   the command lin
25f20 65 20 69 73 20 70 61 72 73 65 64 0a 2a 2a 20 73  e is parsed.** s
25f30 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 6f 74 68  uccessfully, oth
25f40 65 72 77 69 73 65 20 61 6e 20 65 72 72 6f 72 20  erwise an error 
25f50 6d 65 73 73 61 67 65 20 69 73 20 77 72 69 74 74  message is writt
25f60 65 6e 20 74 6f 20 73 74 64 65 72 72 20 61 6e 64  en to stderr and
25f70 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 45 52 52 4f   .** SQLITE_ERRO
25f80 52 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  R returned..*/.s
25f90 74 61 74 69 63 20 69 6e 74 20 61 72 50 61 72 73  tatic int arPars
25fa0 65 43 6f 6d 6d 61 6e 64 28 0a 20 20 63 68 61 72  eCommand(.  char
25fb0 20 2a 2a 61 7a 41 72 67 2c 20 20 20 20 20 20 20   **azArg,       
25fc0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
25fd0 72 72 61 79 20 6f 66 20 61 72 67 75 6d 65 6e 74  rray of argument
25fe0 73 20 70 61 73 73 65 64 20 74 6f 20 64 6f 74 20  s passed to dot 
25ff0 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  command */.  int
26000 20 6e 41 72 67 2c 20 20 20 20 20 20 20 20 20 20   nArg,          
26010 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
26020 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65  Number of entrie
26030 73 20 69 6e 20 61 7a 41 72 67 5b 5d 20 2a 2f 0a  s in azArg[] */.
26040 20 20 41 72 43 6f 6d 6d 61 6e 64 20 2a 70 41 72    ArCommand *pAr
26050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26060 20 20 2f 2a 20 50 6f 70 75 6c 61 74 65 20 74 68    /* Populate th
26070 69 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a  is object */.){.
26080 20 20 73 74 72 75 63 74 20 41 72 53 77 69 74 63    struct ArSwitc
26090 68 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  h {.    const ch
260a0 61 72 20 2a 7a 4c 6f 6e 67 3b 0a 20 20 20 20 63  ar *zLong;.    c
260b0 68 61 72 20 63 53 68 6f 72 74 3b 0a 20 20 20 20  har cShort;.    
260c0 75 38 20 65 53 77 69 74 63 68 3b 0a 20 20 20 20  u8 eSwitch;.    
260d0 75 38 20 62 41 72 67 3b 0a 20 20 7d 20 61 53 77  u8 bArg;.  } aSw
260e0 69 74 63 68 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b  itch[] = {.    {
260f0 20 22 63 72 65 61 74 65 22 2c 20 20 20 20 27 63   "create",    'c
26100 27 2c 20 41 52 5f 43 4d 44 5f 43 52 45 41 54 45  ', AR_CMD_CREATE
26110 2c 20 20 20 20 20 20 20 30 20 7d 2c 0a 20 20 20  ,       0 },.   
26120 20 7b 20 22 65 78 74 72 61 63 74 22 2c 20 20 20   { "extract",   
26130 27 78 27 2c 20 41 52 5f 43 4d 44 5f 45 58 54 52  'x', AR_CMD_EXTR
26140 41 43 54 2c 20 20 20 20 20 20 30 20 7d 2c 0a 20  ACT,      0 },. 
26150 20 20 20 7b 20 22 6c 69 73 74 22 2c 20 20 20 20     { "list",    
26160 20 20 27 74 27 2c 20 41 52 5f 43 4d 44 5f 4c 49    't', AR_CMD_LI
26170 53 54 2c 20 20 20 20 20 20 20 20 20 30 20 7d 2c  ST,         0 },
26180 0a 20 20 20 20 7b 20 22 75 70 64 61 74 65 22 2c  .    { "update",
26190 20 20 20 20 27 75 27 2c 20 41 52 5f 43 4d 44 5f      'u', AR_CMD_
261a0 55 50 44 41 54 45 2c 20 20 20 20 20 20 20 30 20  UPDATE,       0 
261b0 7d 2c 0a 20 20 20 20 7b 20 22 68 65 6c 70 22 2c  },.    { "help",
261c0 20 20 20 20 20 20 27 68 27 2c 20 41 52 5f 43 4d        'h', AR_CM
261d0 44 5f 48 45 4c 50 2c 20 20 20 20 20 20 20 20 20  D_HELP,         
261e0 30 20 7d 2c 0a 20 20 20 20 7b 20 22 76 65 72 62  0 },.    { "verb
261f0 6f 73 65 22 2c 20 20 20 27 76 27 2c 20 41 52 5f  ose",   'v', AR_
26200 53 57 49 54 43 48 5f 56 45 52 42 4f 53 45 2c 20  SWITCH_VERBOSE, 
26210 20 20 30 20 7d 2c 0a 20 20 20 20 7b 20 22 66 69    0 },.    { "fi
26220 6c 65 22 2c 20 20 20 20 20 20 27 66 27 2c 20 41  le",      'f', A
26230 52 5f 53 57 49 54 43 48 5f 46 49 4c 45 2c 20 20  R_SWITCH_FILE,  
26240 20 20 20 20 31 20 7d 2c 0a 20 20 20 20 7b 20 22      1 },.    { "
26250 61 70 70 65 6e 64 22 2c 20 20 20 20 27 61 27 2c  append",    'a',
26260 20 41 52 5f 53 57 49 54 43 48 5f 41 50 50 45 4e   AR_SWITCH_APPEN
26270 44 2c 20 20 20 20 31 20 7d 2c 0a 20 20 20 20 7b  D,    1 },.    {
26280 20 22 64 69 72 65 63 74 6f 72 79 22 2c 20 27 43   "directory", 'C
26290 27 2c 20 41 52 5f 53 57 49 54 43 48 5f 44 49 52  ', AR_SWITCH_DIR
262a0 45 43 54 4f 52 59 2c 20 31 20 7d 2c 0a 20 20 20  ECTORY, 1 },.   
262b0 20 7b 20 22 64 72 79 72 75 6e 22 2c 20 20 20 20   { "dryrun",    
262c0 27 6e 27 2c 20 41 52 5f 53 57 49 54 43 48 5f 44  'n', AR_SWITCH_D
262d0 52 59 52 55 4e 2c 20 20 20 20 30 20 7d 2c 0a 20  RYRUN,    0 },. 
262e0 20 7d 3b 0a 20 20 69 6e 74 20 6e 53 77 69 74 63   };.  int nSwitc
262f0 68 20 3d 20 73 69 7a 65 6f 66 28 61 53 77 69 74  h = sizeof(aSwit
26300 63 68 29 20 2f 20 73 69 7a 65 6f 66 28 73 74 72  ch) / sizeof(str
26310 75 63 74 20 41 72 53 77 69 74 63 68 29 3b 0a 20  uct ArSwitch);. 
26320 20 73 74 72 75 63 74 20 41 72 53 77 69 74 63 68   struct ArSwitch
26330 20 2a 70 45 6e 64 20 3d 20 26 61 53 77 69 74 63   *pEnd = &aSwitc
26340 68 5b 6e 53 77 69 74 63 68 5d 3b 0a 0a 20 20 69  h[nSwitch];..  i
26350 66 28 20 6e 41 72 67 3c 3d 31 20 29 7b 0a 20 20  f( nArg<=1 ){.  
26360 20 20 72 65 74 75 72 6e 20 61 72 55 73 61 67 65    return arUsage
26370 28 73 74 64 65 72 72 29 3b 0a 20 20 7d 65 6c 73  (stderr);.  }els
26380 65 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 20 3d  e{.    char *z =
26390 20 61 7a 41 72 67 5b 31 5d 3b 0a 20 20 20 20 6d   azArg[1];.    m
263a0 65 6d 73 65 74 28 70 41 72 2c 20 30 2c 20 73 69  emset(pAr, 0, si
263b0 7a 65 6f 66 28 41 72 43 6f 6d 6d 61 6e 64 29 29  zeof(ArCommand))
263c0 3b 0a 0a 20 20 20 20 69 66 28 20 7a 5b 30 5d 21  ;..    if( z[0]!
263d0 3d 27 2d 27 20 29 7b 0a 20 20 20 20 20 20 2f 2a  ='-' ){.      /*
263e0 20 54 72 61 64 69 74 69 6f 6e 61 6c 20 73 74 79   Traditional sty
263f0 6c 65 20 5b 74 61 72 5d 20 69 6e 76 6f 63 61 74  le [tar] invocat
26400 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  ion */.      int
26410 20 69 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 41   i;.      int iA
26420 72 67 20 3d 20 32 3b 0a 20 20 20 20 20 20 66 6f  rg = 2;.      fo
26430 72 28 69 3d 30 3b 20 7a 5b 69 5d 3b 20 69 2b 2b  r(i=0; z[i]; i++
26440 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74  ){.        const
26450 20 63 68 61 72 20 2a 7a 41 72 67 20 3d 20 30 3b   char *zArg = 0;
26460 0a 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20  .        struct 
26470 41 72 53 77 69 74 63 68 20 2a 70 4f 70 74 3b 0a  ArSwitch *pOpt;.
26480 20 20 20 20 20 20 20 20 66 6f 72 28 70 4f 70 74          for(pOpt
26490 3d 26 61 53 77 69 74 63 68 5b 30 5d 3b 20 70 4f  =&aSwitch[0]; pO
264a0 70 74 3c 70 45 6e 64 3b 20 70 4f 70 74 2b 2b 29  pt<pEnd; pOpt++)
264b0 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
264c0 7a 5b 69 5d 3d 3d 70 4f 70 74 2d 3e 63 53 68 6f  z[i]==pOpt->cSho
264d0 72 74 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  rt ) break;.    
264e0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
264f0 28 20 70 4f 70 74 3d 3d 70 45 6e 64 20 29 7b 0a  ( pOpt==pEnd ){.
26500 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
26510 20 61 72 45 72 72 6f 72 4d 73 67 28 22 75 6e 72   arErrorMsg("unr
26520 65 63 6f 67 6e 69 7a 65 64 20 6f 70 74 69 6f 6e  ecognized option
26530 3a 20 25 63 22 2c 20 7a 5b 69 5d 29 3b 0a 20 20  : %c", z[i]);.  
26540 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
26550 69 66 28 20 70 4f 70 74 2d 3e 62 41 72 67 20 29  if( pOpt->bArg )
26560 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
26570 69 41 72 67 3e 3d 6e 41 72 67 20 29 7b 0a 20 20  iArg>=nArg ){.  
26580 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
26590 20 61 72 45 72 72 6f 72 4d 73 67 28 22 6f 70 74   arErrorMsg("opt
265a0 69 6f 6e 20 72 65 71 75 69 72 65 73 20 61 6e 20  ion requires an 
265b0 61 72 67 75 6d 65 6e 74 3a 20 25 63 22 2c 7a 5b  argument: %c",z[
265c0 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  i]);.          }
265d0 0a 20 20 20 20 20 20 20 20 20 20 7a 41 72 67 20  .          zArg 
265e0 3d 20 61 7a 41 72 67 5b 69 41 72 67 2b 2b 5d 3b  = azArg[iArg++];
265f0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
26600 20 20 20 69 66 28 20 61 72 50 72 6f 63 65 73 73     if( arProcess
26610 53 77 69 74 63 68 28 70 41 72 2c 20 70 4f 70 74  Switch(pAr, pOpt
26620 2d 3e 65 53 77 69 74 63 68 2c 20 7a 41 72 67 29  ->eSwitch, zArg)
26630 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
26640 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a  _ERROR;.      }.
26650 20 20 20 20 20 20 70 41 72 2d 3e 6e 41 72 67 20        pAr->nArg 
26660 3d 20 6e 41 72 67 2d 69 41 72 67 3b 0a 20 20 20  = nArg-iArg;.   
26670 20 20 20 69 66 28 20 70 41 72 2d 3e 6e 41 72 67     if( pAr->nArg
26680 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 41  >0 ){.        pA
26690 72 2d 3e 61 7a 41 72 67 20 3d 20 26 61 7a 41 72  r->azArg = &azAr
266a0 67 5b 69 41 72 67 5d 3b 0a 20 20 20 20 20 20 7d  g[iArg];.      }
266b0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
266c0 20 20 2f 2a 20 4e 6f 6e 2d 74 72 61 64 69 74 69    /* Non-traditi
266d0 6f 6e 61 6c 20 69 6e 76 6f 63 61 74 69 6f 6e 20  onal invocation 
266e0 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 41 72  */.      int iAr
266f0 67 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 41 72  g;.      for(iAr
26700 67 3d 31 3b 20 69 41 72 67 3c 6e 41 72 67 3b 20  g=1; iArg<nArg; 
26710 69 41 72 67 2b 2b 29 7b 0a 20 20 20 20 20 20 20  iArg++){.       
26720 20 69 6e 74 20 6e 3b 0a 20 20 20 20 20 20 20 20   int n;.        
26730 7a 20 3d 20 61 7a 41 72 67 5b 69 41 72 67 5d 3b  z = azArg[iArg];
26740 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 5b 30  .        if( z[0
26750 5d 21 3d 27 2d 27 20 29 7b 0a 20 20 20 20 20 20  ]!='-' ){.      
26760 20 20 20 20 2f 2a 20 41 6c 6c 20 72 65 6d 61 69      /* All remai
26770 6e 69 6e 67 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e  ning command lin
26780 65 20 77 6f 72 64 73 20 61 72 65 20 63 6f 6d 6d  e words are comm
26790 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 2e 20 2a  and arguments. *
267a0 2f 0a 20 20 20 20 20 20 20 20 20 20 70 41 72 2d  /.          pAr-
267b0 3e 61 7a 41 72 67 20 3d 20 26 61 7a 41 72 67 5b  >azArg = &azArg[
267c0 69 41 72 67 5d 3b 0a 20 20 20 20 20 20 20 20 20  iArg];.         
267d0 20 70 41 72 2d 3e 6e 41 72 67 20 3d 20 6e 41 72   pAr->nArg = nAr
267e0 67 2d 69 41 72 67 3b 0a 20 20 20 20 20 20 20 20  g-iArg;.        
267f0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
26800 20 7d 0a 20 20 20 20 20 20 20 20 6e 20 3d 20 73   }.        n = s
26810 74 72 6c 65 6e 33 30 28 7a 29 3b 0a 0a 20 20 20  trlen30(z);..   
26820 20 20 20 20 20 69 66 28 20 7a 5b 31 5d 21 3d 27       if( z[1]!='
26830 2d 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  -' ){.          
26840 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 20 20 20  int i;.         
26850 20 2f 2a 20 4f 6e 65 20 6f 72 20 6d 6f 72 65 20   /* One or more 
26860 73 68 6f 72 74 20 6f 70 74 69 6f 6e 73 20 2a 2f  short options */
26870 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69  .          for(i
26880 3d 31 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20  =1; i<n; i++){. 
26890 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74             const
268a0 20 63 68 61 72 20 2a 7a 41 72 67 20 3d 20 30 3b   char *zArg = 0;
268b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 74 72  .            str
268c0 75 63 74 20 41 72 53 77 69 74 63 68 20 2a 70 4f  uct ArSwitch *pO
268d0 70 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  pt;.            
268e0 66 6f 72 28 70 4f 70 74 3d 26 61 53 77 69 74 63  for(pOpt=&aSwitc
268f0 68 5b 30 5d 3b 20 70 4f 70 74 3c 70 45 6e 64 3b  h[0]; pOpt<pEnd;
26900 20 70 4f 70 74 2b 2b 29 7b 0a 20 20 20 20 20 20   pOpt++){.      
26910 20 20 20 20 20 20 20 20 69 66 28 20 7a 5b 69 5d          if( z[i]
26920 3d 3d 70 4f 70 74 2d 3e 63 53 68 6f 72 74 20 29  ==pOpt->cShort )
26930 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
26940 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
26950 20 20 69 66 28 20 70 4f 70 74 3d 3d 70 45 6e 64    if( pOpt==pEnd
26960 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
26970 20 20 72 65 74 75 72 6e 20 61 72 45 72 72 6f 72    return arError
26980 4d 73 67 28 22 75 6e 72 65 63 6f 67 6e 69 7a 65  Msg("unrecognize
26990 64 20 6f 70 74 69 6f 6e 3a 20 25 63 5c 6e 22 2c  d option: %c\n",
269a0 20 7a 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20   z[i]);.        
269b0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
269c0 20 20 69 66 28 20 70 4f 70 74 2d 3e 62 41 72 67    if( pOpt->bArg
269d0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
269e0 20 20 69 66 28 20 69 3c 28 6e 2d 31 29 20 29 7b    if( i<(n-1) ){
269f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
26a00 20 7a 41 72 67 20 3d 20 26 7a 5b 69 2b 31 5d 3b   zArg = &z[i+1];
26a10 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
26a20 20 69 20 3d 20 6e 3b 0a 20 20 20 20 20 20 20 20   i = n;.        
26a30 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
26a40 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
26a50 20 69 41 72 67 3e 3d 28 6e 41 72 67 2d 31 29 20   iArg>=(nArg-1) 
26a60 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
26a70 20 20 20 20 20 72 65 74 75 72 6e 20 61 72 45 72       return arEr
26a80 72 6f 72 4d 73 67 28 22 6f 70 74 69 6f 6e 20 72  rorMsg("option r
26a90 65 71 75 69 72 65 73 20 61 6e 20 61 72 67 75 6d  equires an argum
26aa0 65 6e 74 3a 20 25 63 5c 6e 22 2c 7a 5b 69 5d 29  ent: %c\n",z[i])
26ab0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
26ac0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
26ad0 20 20 20 20 7a 41 72 67 20 3d 20 61 7a 41 72 67      zArg = azArg
26ae0 5b 2b 2b 69 41 72 67 5d 3b 0a 20 20 20 20 20 20  [++iArg];.      
26af0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
26b00 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
26b10 20 20 20 20 69 66 28 20 61 72 50 72 6f 63 65 73      if( arProces
26b20 73 53 77 69 74 63 68 28 70 41 72 2c 20 70 4f 70  sSwitch(pAr, pOp
26b30 74 2d 3e 65 53 77 69 74 63 68 2c 20 7a 41 72 67  t->eSwitch, zArg
26b40 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ) ) return SQLIT
26b50 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20  E_ERROR;.       
26b60 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c     }.        }el
26b70 73 65 20 69 66 28 20 7a 5b 32 5d 3d 3d 27 5c 30  se if( z[2]=='\0
26b80 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  ' ){.          /
26b90 2a 20 41 20 2d 2d 20 6f 70 74 69 6f 6e 2c 20 69  * A -- option, i
26ba0 6e 64 69 63 61 74 69 6e 67 20 74 68 61 74 20 61  ndicating that a
26bb0 6c 6c 20 72 65 6d 61 69 6e 69 6e 67 20 63 6f 6d  ll remaining com
26bc0 6d 61 6e 64 20 6c 69 6e 65 20 77 6f 72 64 73 0a  mand line words.
26bd0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 72 65            ** are
26be0 20 63 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e   command argumen
26bf0 74 73 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20  ts.  */.        
26c00 20 20 70 41 72 2d 3e 61 7a 41 72 67 20 3d 20 26    pAr->azArg = &
26c10 61 7a 41 72 67 5b 69 41 72 67 2b 31 5d 3b 0a 20  azArg[iArg+1];. 
26c20 20 20 20 20 20 20 20 20 20 70 41 72 2d 3e 6e 41           pAr->nA
26c30 72 67 20 3d 20 6e 41 72 67 2d 69 41 72 67 2d 31  rg = nArg-iArg-1
26c40 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
26c50 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  k;.        }else
26c60 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  {.          /* A
26c70 20 6c 6f 6e 67 20 6f 70 74 69 6f 6e 20 2a 2f 0a   long option */.
26c80 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20            const 
26c90 63 68 61 72 20 2a 7a 41 72 67 20 3d 20 30 3b 20  char *zArg = 0; 
26ca0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
26cb0 72 67 75 6d 65 6e 74 20 66 6f 72 20 6f 70 74 69  rgument for opti
26cc0 6f 6e 2c 20 69 66 20 61 6e 79 20 2a 2f 0a 20 20  on, if any */.  
26cd0 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20 41          struct A
26ce0 72 53 77 69 74 63 68 20 2a 70 4d 61 74 63 68 20  rSwitch *pMatch 
26cf0 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 4d 61 74  = 0;      /* Mat
26d00 63 68 69 6e 67 20 6f 70 74 69 6f 6e 20 2a 2f 0a  ching option */.
26d10 20 20 20 20 20 20 20 20 20 20 73 74 72 75 63 74            struct
26d20 20 41 72 53 77 69 74 63 68 20 2a 70 4f 70 74 3b   ArSwitch *pOpt;
26d30 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
26d40 74 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20  terator */.     
26d50 20 20 20 20 20 66 6f 72 28 70 4f 70 74 3d 26 61       for(pOpt=&a
26d60 53 77 69 74 63 68 5b 30 5d 3b 20 70 4f 70 74 3c  Switch[0]; pOpt<
26d70 70 45 6e 64 3b 20 70 4f 70 74 2b 2b 29 7b 0a 20  pEnd; pOpt++){. 
26d80 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74             const
26d90 20 63 68 61 72 20 2a 7a 4c 6f 6e 67 20 3d 20 70   char *zLong = p
26da0 4f 70 74 2d 3e 7a 4c 6f 6e 67 3b 0a 20 20 20 20  Opt->zLong;.    
26db0 20 20 20 20 20 20 20 20 69 66 28 20 28 6e 2d 32          if( (n-2
26dc0 29 3c 3d 73 74 72 6c 65 6e 33 30 28 7a 4c 6f 6e  )<=strlen30(zLon
26dd0 67 29 20 26 26 20 30 3d 3d 6d 65 6d 63 6d 70 28  g) && 0==memcmp(
26de0 26 7a 5b 32 5d 2c 20 7a 4c 6f 6e 67 2c 20 6e 2d  &z[2], zLong, n-
26df0 32 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  2) ){.          
26e00 20 20 20 20 69 66 28 20 70 4d 61 74 63 68 20 29      if( pMatch )
26e10 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
26e20 20 20 72 65 74 75 72 6e 20 61 72 45 72 72 6f 72    return arError
26e30 4d 73 67 28 22 61 6d 62 69 67 75 6f 75 73 20 6f  Msg("ambiguous o
26e40 70 74 69 6f 6e 3a 20 25 73 22 2c 7a 29 3b 0a 20  ption: %s",z);. 
26e50 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c               }el
26e60 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
26e70 20 20 20 20 70 4d 61 74 63 68 20 3d 20 70 4f 70      pMatch = pOp
26e80 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t;.             
26e90 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d   }.            }
26ea0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  .          }..  
26eb0 20 20 20 20 20 20 20 20 69 66 28 20 70 4d 61 74          if( pMat
26ec0 63 68 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ch==0 ){.       
26ed0 20 20 20 20 20 72 65 74 75 72 6e 20 61 72 45 72       return arEr
26ee0 72 6f 72 4d 73 67 28 22 75 6e 72 65 63 6f 67 6e  rorMsg("unrecogn
26ef0 69 7a 65 64 20 6f 70 74 69 6f 6e 3a 20 25 73 22  ized option: %s"
26f00 2c 20 7a 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , z);.          
26f10 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  }.          if( 
26f20 70 4d 61 74 63 68 2d 3e 62 41 72 67 20 29 7b 0a  pMatch->bArg ){.
26f30 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
26f40 69 41 72 67 3e 3d 28 6e 41 72 67 2d 31 29 20 29  iArg>=(nArg-1) )
26f50 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
26f60 72 65 74 75 72 6e 20 61 72 45 72 72 6f 72 4d 73  return arErrorMs
26f70 67 28 22 6f 70 74 69 6f 6e 20 72 65 71 75 69 72  g("option requir
26f80 65 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 3a 20  es an argument: 
26f90 25 73 22 2c 20 7a 29 3b 0a 20 20 20 20 20 20 20  %s", z);.       
26fa0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
26fb0 20 20 20 7a 41 72 67 20 3d 20 61 7a 41 72 67 5b     zArg = azArg[
26fc0 2b 2b 69 41 72 67 5d 3b 0a 20 20 20 20 20 20 20  ++iArg];.       
26fd0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69     }.          i
26fe0 66 28 20 61 72 50 72 6f 63 65 73 73 53 77 69 74  f( arProcessSwit
26ff0 63 68 28 70 41 72 2c 20 70 4d 61 74 63 68 2d 3e  ch(pAr, pMatch->
27000 65 53 77 69 74 63 68 2c 20 7a 41 72 67 29 20 29  eSwitch, zArg) )
27010 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
27020 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 7d 0a  RROR;.        }.
27030 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
27040 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  }..  return SQLI
27050 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
27060 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 73  This function as
27070 73 75 6d 65 73 20 74 68 61 74 20 61 6c 6c 20 61  sumes that all a
27080 72 67 75 6d 65 6e 74 73 20 77 69 74 68 69 6e 20  rguments within 
27090 74 68 65 20 41 72 43 6f 6d 6d 61 6e 64 2e 61 7a  the ArCommand.az
270a0 41 72 67 5b 5d 0a 2a 2a 20 61 72 72 61 79 20 72  Arg[].** array r
270b0 65 66 65 72 20 74 6f 20 61 72 63 68 69 76 65 20  efer to archive 
270c0 6d 65 6d 62 65 72 73 2c 20 61 73 20 66 6f 72 20  members, as for 
270d0 74 68 65 20 2d 2d 65 78 74 72 61 63 74 20 6f 72  the --extract or
270e0 20 2d 2d 6c 69 73 74 20 63 6f 6d 6d 61 6e 64 73   --list commands
270f0 2e 20 0a 2a 2a 20 49 74 20 63 68 65 63 6b 73 20  . .** It checks 
27100 74 68 61 74 20 65 61 63 68 20 6f 66 20 74 68 65  that each of the
27110 6d 20 61 72 65 20 70 72 65 73 65 6e 74 2e 20 49  m are present. I
27120 66 20 61 6e 79 20 73 70 65 63 69 66 69 65 64 20  f any specified 
27130 66 69 6c 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 70  file is not.** p
27140 72 65 73 65 6e 74 20 69 6e 20 74 68 65 20 61 72  resent in the ar
27150 63 68 69 76 65 2c 20 61 6e 20 65 72 72 6f 72 20  chive, an error 
27160 69 73 20 70 72 69 6e 74 65 64 20 74 6f 20 73 74  is printed to st
27170 64 65 72 72 20 61 6e 64 20 61 6e 20 65 72 72 6f  derr and an erro
27180 72 0a 2a 2a 20 63 6f 64 65 20 72 65 74 75 72 6e  r.** code return
27190 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69  ed. Otherwise, i
271a0 66 20 61 6c 6c 20 73 70 65 63 69 66 69 65 64 20  f all specified 
271b0 61 72 67 75 6d 65 6e 74 73 20 61 72 65 20 70 72  arguments are pr
271c0 65 73 65 6e 74 20 69 6e 0a 2a 2a 20 74 68 65 20  esent in.** the 
271d0 61 72 63 68 69 76 65 2c 20 53 51 4c 49 54 45 5f  archive, SQLITE_
271e0 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  OK is returned..
271f0 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
27200 69 6f 6e 20 73 74 72 69 70 73 20 61 6e 79 20 74  ion strips any t
27210 72 61 69 6c 69 6e 67 20 27 2f 27 20 63 68 61 72  railing '/' char
27220 61 63 74 65 72 73 20 66 72 6f 6d 20 65 61 63 68  acters from each
27230 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 20 54 68   argument..** Th
27240 69 73 20 69 73 20 63 6f 6e 73 69 73 74 65 6e 74  is is consistent
27250 20 77 69 74 68 20 74 68 65 20 77 61 79 20 74 68   with the way th
27260 65 20 5b 74 61 72 5d 20 63 6f 6d 6d 61 6e 64 20  e [tar] command 
27270 73 65 65 6d 73 20 74 6f 20 77 6f 72 6b 20 6f 6e  seems to work on
27280 0a 2a 2a 20 4c 69 6e 75 78 2e 0a 2a 2f 0a 73 74  .** Linux..*/.st
27290 61 74 69 63 20 69 6e 74 20 61 72 43 68 65 63 6b  atic int arCheck
272a0 45 6e 74 72 69 65 73 28 41 72 43 6f 6d 6d 61 6e  Entries(ArComman
272b0 64 20 2a 70 41 72 29 7b 0a 20 20 69 6e 74 20 72  d *pAr){.  int r
272c0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
272d0 20 69 66 28 20 70 41 72 2d 3e 6e 41 72 67 20 29   if( pAr->nArg )
272e0 7b 0a 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b 0a  {.    int i, j;.
272f0 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74      sqlite3_stmt
27300 20 2a 70 54 65 73 74 20 3d 20 30 3b 0a 0a 20 20   *pTest = 0;..  
27310 20 20 73 68 65 6c 6c 50 72 65 70 61 72 65 50 72    shellPreparePr
27320 69 6e 74 66 28 70 41 72 2d 3e 64 62 2c 20 26 72  intf(pAr->db, &r
27330 63 2c 20 26 70 54 65 73 74 2c 0a 20 20 20 20 20  c, &pTest,.     
27340 20 20 20 22 53 45 4c 45 43 54 20 6e 61 6d 65 20     "SELECT name 
27350 46 52 4f 4d 20 25 73 20 57 48 45 52 45 20 6e 61  FROM %s WHERE na
27360 6d 65 3d 24 6e 61 6d 65 22 2c 20 0a 20 20 20 20  me=$name", .    
27370 20 20 20 20 70 41 72 2d 3e 7a 53 72 63 54 61 62      pAr->zSrcTab
27380 6c 65 0a 20 20 20 20 29 3b 0a 20 20 20 20 6a 20  le.    );.    j 
27390 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70  = sqlite3_bind_p
273a0 61 72 61 6d 65 74 65 72 5f 69 6e 64 65 78 28 70  arameter_index(p
273b0 54 65 73 74 2c 20 22 24 6e 61 6d 65 22 29 3b 0a  Test, "$name");.
273c0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
273d0 41 72 2d 3e 6e 41 72 67 20 26 26 20 72 63 3d 3d  Ar->nArg && rc==
273e0 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 2b 2b 29 7b  SQLITE_OK; i++){
273f0 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 20 3d  .      char *z =
27400 20 70 41 72 2d 3e 61 7a 41 72 67 5b 69 5d 3b 0a   pAr->azArg[i];.
27410 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 73 74        int n = st
27420 72 6c 65 6e 33 30 28 7a 29 3b 0a 20 20 20 20 20  rlen30(z);.     
27430 20 69 6e 74 20 62 4f 6b 20 3d 20 30 3b 0a 20 20   int bOk = 0;.  
27440 20 20 20 20 77 68 69 6c 65 28 20 6e 3e 30 20 26      while( n>0 &
27450 26 20 7a 5b 6e 2d 31 5d 3d 3d 27 2f 27 20 29 20  & z[n-1]=='/' ) 
27460 6e 2d 2d 3b 0a 20 20 20 20 20 20 7a 5b 6e 5d 20  n--;.      z[n] 
27470 3d 20 27 5c 30 27 3b 0a 20 20 20 20 20 20 73 71  = '\0';.      sq
27480 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 28  lite3_bind_text(
27490 70 54 65 73 74 2c 20 6a 2c 20 7a 2c 20 2d 31 2c  pTest, j, z, -1,
274a0 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b   SQLITE_STATIC);
274b0 0a 20 20 20 20 20 20 69 66 28 20 53 51 4c 49 54  .      if( SQLIT
274c0 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73  E_ROW==sqlite3_s
274d0 74 65 70 28 70 54 65 73 74 29 20 29 7b 0a 20 20  tep(pTest) ){.  
274e0 20 20 20 20 20 20 62 4f 6b 20 3d 20 31 3b 0a 20        bOk = 1;. 
274f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 68 65       }.      she
27500 6c 6c 52 65 73 65 74 28 26 72 63 2c 20 70 54 65  llReset(&rc, pTe
27510 73 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  st);.      if( r
27520 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
27530 62 4f 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  bOk==0 ){.      
27540 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74    utf8_printf(st
27550 64 65 72 72 2c 20 22 6e 6f 74 20 66 6f 75 6e 64  derr, "not found
27560 20 69 6e 20 61 72 63 68 69 76 65 3a 20 25 73 5c   in archive: %s\
27570 6e 22 2c 20 7a 29 3b 0a 20 20 20 20 20 20 20 20  n", z);.        
27580 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
27590 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  R;.      }.    }
275a0 0a 20 20 20 20 73 68 65 6c 6c 46 69 6e 61 6c 69  .    shellFinali
275b0 7a 65 28 26 72 63 2c 20 70 54 65 73 74 29 3b 0a  ze(&rc, pTest);.
275c0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
275d0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 6d 61 74  .}../*.** Format
275e0 20 61 20 57 48 45 52 45 20 63 6c 61 75 73 65 20   a WHERE clause 
275f0 74 68 61 74 20 63 61 6e 20 62 65 20 75 73 65 64  that can be used
27600 20 61 67 61 69 6e 73 74 20 74 68 65 20 22 73 71   against the "sq
27610 6c 61 72 22 20 74 61 62 6c 65 20 74 6f 0a 2a 2a  lar" table to.**
27620 20 69 64 65 6e 74 69 66 79 20 61 6c 6c 20 61 72   identify all ar
27630 63 68 69 76 65 20 6d 65 6d 62 65 72 73 20 74 68  chive members th
27640 61 74 20 6d 61 74 63 68 20 74 68 65 20 63 6f 6d  at match the com
27650 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 68  mand arguments h
27660 65 6c 64 0a 2a 2a 20 69 6e 20 28 2a 70 41 72 29  eld.** in (*pAr)
27670 2e 20 4c 65 61 76 65 20 74 68 69 73 20 57 48 45  . Leave this WHE
27680 52 45 20 63 6c 61 75 73 65 20 69 6e 20 28 2a 70  RE clause in (*p
27690 7a 57 68 65 72 65 29 20 62 65 66 6f 72 65 20 72  zWhere) before r
276a0 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 20 54 68 65  eturning..** The
276b0 20 63 61 6c 6c 65 72 20 69 73 20 72 65 73 70 6f   caller is respo
276c0 6e 73 69 62 6c 65 20 66 6f 72 20 65 76 65 6e 74  nsible for event
276d0 75 61 6c 6c 79 20 63 61 6c 6c 69 6e 67 20 73 71  ually calling sq
276e0 6c 69 74 65 33 5f 66 72 65 65 28 29 20 6f 6e 0a  lite3_free() on.
276f0 2a 2a 20 61 6e 79 20 6e 6f 6e 2d 4e 55 4c 4c 20  ** any non-NULL 
27700 28 2a 70 7a 57 68 65 72 65 29 20 76 61 6c 75 65  (*pzWhere) value
27710 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
27720 20 61 72 57 68 65 72 65 43 6c 61 75 73 65 28 0a   arWhereClause(.
27730 20 20 69 6e 74 20 2a 70 52 63 2c 20 0a 20 20 41    int *pRc, .  A
27740 72 43 6f 6d 6d 61 6e 64 20 2a 70 41 72 2c 20 0a  rCommand *pAr, .
27750 20 20 63 68 61 72 20 2a 2a 70 7a 57 68 65 72 65    char **pzWhere
27760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27770 20 20 2f 2a 20 4f 55 54 3a 20 4e 65 77 20 57 48    /* OUT: New WH
27780 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 29 7b  ERE clause */.){
27790 0a 20 20 63 68 61 72 20 2a 7a 57 68 65 72 65 20  .  char *zWhere 
277a0 3d 20 30 3b 0a 20 20 69 66 28 20 2a 70 52 63 3d  = 0;.  if( *pRc=
277b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
277c0 20 20 69 66 28 20 70 41 72 2d 3e 6e 41 72 67 3d    if( pAr->nArg=
277d0 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 57 68 65  =0 ){.      zWhe
277e0 72 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  re = sqlite3_mpr
277f0 69 6e 74 66 28 22 31 22 29 3b 0a 20 20 20 20 7d  intf("1");.    }
27800 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20  else{.      int 
27810 69 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  i;.      const c
27820 68 61 72 20 2a 7a 53 65 70 20 3d 20 22 22 3b 0a  har *zSep = "";.
27830 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
27840 3c 70 41 72 2d 3e 6e 41 72 67 3b 20 69 2b 2b 29  <pAr->nArg; i++)
27850 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20  {.        const 
27860 63 68 61 72 20 2a 7a 20 3d 20 70 41 72 2d 3e 61  char *z = pAr->a
27870 7a 41 72 67 5b 69 5d 3b 0a 20 20 20 20 20 20 20  zArg[i];.       
27880 20 7a 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65   zWhere = sqlite
27890 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20 20 20  3_mprintf(.     
278a0 20 20 20 20 20 22 25 7a 25 73 20 6e 61 6d 65 20       "%z%s name 
278b0 3d 20 27 25 71 27 20 4f 52 20 73 75 62 73 74 72  = '%q' OR substr
278c0 28 6e 61 6d 65 2c 31 2c 25 64 29 20 3d 20 27 25  (name,1,%d) = '%
278d0 71 2f 27 22 2c 20 0a 20 20 20 20 20 20 20 20 20  q/'", .         
278e0 20 7a 57 68 65 72 65 2c 20 7a 53 65 70 2c 20 7a   zWhere, zSep, z
278f0 2c 20 73 74 72 6c 65 6e 33 30 28 7a 29 2b 31 2c  , strlen30(z)+1,
27900 20 7a 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20   z.        );.  
27910 20 20 20 20 20 20 69 66 28 20 7a 57 68 65 72 65        if( zWhere
27920 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
27930 20 2a 70 52 63 20 3d 20 53 51 4c 49 54 45 5f 4e   *pRc = SQLITE_N
27940 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 20 20  OMEM;.          
27950 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
27960 0a 20 20 20 20 20 20 20 20 7a 53 65 70 20 3d 20  .        zSep = 
27970 22 20 4f 52 20 22 3b 0a 20 20 20 20 20 20 7d 0a  " OR ";.      }.
27980 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 7a 57      }.  }.  *pzW
27990 68 65 72 65 20 3d 20 7a 57 68 65 72 65 3b 0a 7d  here = zWhere;.}
279a0 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e  ../*.** Implemen
279b0 74 61 74 69 6f 6e 20 6f 66 20 2e 61 72 20 22 6c  tation of .ar "l
279c0 69 73 54 22 20 63 6f 6d 6d 61 6e 64 2e 20 0a 2a  isT" command. .*
279d0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 72 4c  /.static int arL
279e0 69 73 74 43 6f 6d 6d 61 6e 64 28 41 72 43 6f 6d  istCommand(ArCom
279f0 6d 61 6e 64 20 2a 70 41 72 29 7b 0a 20 20 63 6f  mand *pAr){.  co
27a00 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 20 3d  nst char *zSql =
27a10 20 22 53 45 4c 45 43 54 20 25 73 20 46 52 4f 4d   "SELECT %s FROM
27a20 20 25 73 20 57 48 45 52 45 20 25 73 22 3b 20 0a   %s WHERE %s"; .
27a30 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a    const char *az
27a40 43 6f 6c 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 22  Cols[] = {.    "
27a50 6e 61 6d 65 22 2c 0a 20 20 20 20 22 6c 73 6d 6f  name",.    "lsmo
27a60 64 65 28 6d 6f 64 65 29 2c 20 73 7a 2c 20 64 61  de(mode), sz, da
27a70 74 65 74 69 6d 65 28 6d 74 69 6d 65 2c 20 27 75  tetime(mtime, 'u
27a80 6e 69 78 65 70 6f 63 68 27 29 2c 20 6e 61 6d 65  nixepoch'), name
27a90 22 0a 20 20 7d 3b 0a 0a 20 20 63 68 61 72 20 2a  ".  };..  char *
27aa0 7a 57 68 65 72 65 20 3d 20 30 3b 0a 20 20 73 71  zWhere = 0;.  sq
27ab0 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 71 6c  lite3_stmt *pSql
27ac0 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a   = 0;.  int rc;.
27ad0 0a 20 20 72 63 20 3d 20 61 72 43 68 65 63 6b 45  .  rc = arCheckE
27ae0 6e 74 72 69 65 73 28 70 41 72 29 3b 0a 20 20 61  ntries(pAr);.  a
27af0 72 57 68 65 72 65 43 6c 61 75 73 65 28 26 72 63  rWhereClause(&rc
27b00 2c 20 70 41 72 2c 20 26 7a 57 68 65 72 65 29 3b  , pAr, &zWhere);
27b10 0a 0a 20 20 73 68 65 6c 6c 50 72 65 70 61 72 65  ..  shellPrepare
27b20 50 72 69 6e 74 66 28 70 41 72 2d 3e 64 62 2c 20  Printf(pAr->db, 
27b30 26 72 63 2c 20 26 70 53 71 6c 2c 20 7a 53 71 6c  &rc, &pSql, zSql
27b40 2c 20 61 7a 43 6f 6c 73 5b 70 41 72 2d 3e 62 56  , azCols[pAr->bV
27b50 65 72 62 6f 73 65 5d 2c 0a 20 20 20 20 20 20 20  erbose],.       
27b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 41                pA
27b70 72 2d 3e 7a 53 72 63 54 61 62 6c 65 2c 20 7a 57  r->zSrcTable, zW
27b80 68 65 72 65 29 3b 0a 20 20 69 66 28 20 70 41 72  here);.  if( pAr
27b90 2d 3e 62 44 72 79 52 75 6e 20 29 7b 0a 20 20 20  ->bDryRun ){.   
27ba0 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 41 72   utf8_printf(pAr
27bb0 2d 3e 70 2d 3e 6f 75 74 2c 20 22 25 73 5c 6e 22  ->p->out, "%s\n"
27bc0 2c 20 73 71 6c 69 74 65 33 5f 73 71 6c 28 70 53  , sqlite3_sql(pS
27bd0 71 6c 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ql));.  }else{. 
27be0 20 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51     while( rc==SQ
27bf0 4c 49 54 45 5f 4f 4b 20 26 26 20 53 51 4c 49 54  LITE_OK && SQLIT
27c00 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73  E_ROW==sqlite3_s
27c10 74 65 70 28 70 53 71 6c 29 20 29 7b 0a 20 20 20  tep(pSql) ){.   
27c20 20 20 20 69 66 28 20 70 41 72 2d 3e 62 56 65 72     if( pAr->bVer
27c30 62 6f 73 65 20 29 7b 0a 20 20 20 20 20 20 20 20  bose ){.        
27c40 75 74 66 38 5f 70 72 69 6e 74 66 28 70 41 72 2d  utf8_printf(pAr-
27c50 3e 70 2d 3e 6f 75 74 2c 20 22 25 73 20 25 20 31  >p->out, "%s % 1
27c60 30 64 20 20 25 73 20 20 25 73 5c 6e 22 2c 0a 20  0d  %s  %s\n",. 
27c70 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
27c80 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70  e3_column_text(p
27c90 53 71 6c 2c 20 30 29 2c 0a 20 20 20 20 20 20 20  Sql, 0),.       
27ca0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6f 6c       sqlite3_col
27cb0 75 6d 6e 5f 69 6e 74 28 70 53 71 6c 2c 20 31 29  umn_int(pSql, 1)
27cc0 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  , .            s
27cd0 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
27ce0 78 74 28 70 53 71 6c 2c 20 32 29 2c 0a 20 20 20  xt(pSql, 2),.   
27cf0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
27d00 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 71  _column_text(pSq
27d10 6c 2c 20 33 29 0a 20 20 20 20 20 20 20 20 29 3b  l, 3).        );
27d20 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
27d30 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
27d40 66 28 70 41 72 2d 3e 70 2d 3e 6f 75 74 2c 20 22  f(pAr->p->out, "
27d50 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f 63  %s\n", sqlite3_c
27d60 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 71 6c 2c  olumn_text(pSql,
27d70 20 30 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20   0));.      }.  
27d80 20 20 7d 0a 20 20 7d 0a 20 20 73 68 65 6c 6c 46    }.  }.  shellF
27d90 69 6e 61 6c 69 7a 65 28 26 72 63 2c 20 70 53 71  inalize(&rc, pSq
27da0 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  l);.  return rc;
27db0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65  .}.../*.** Imple
27dc0 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 2e 61 72  mentation of .ar
27dd0 20 22 65 58 74 72 61 63 74 22 20 63 6f 6d 6d 61   "eXtract" comma
27de0 6e 64 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69  nd. .*/.static i
27df0 6e 74 20 61 72 45 78 74 72 61 63 74 43 6f 6d 6d  nt arExtractComm
27e00 61 6e 64 28 41 72 43 6f 6d 6d 61 6e 64 20 2a 70  and(ArCommand *p
27e10 41 72 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  Ar){.  const cha
27e20 72 20 2a 7a 53 71 6c 31 20 3d 20 0a 20 20 20 20  r *zSql1 = .    
27e30 22 53 45 4c 45 43 54 20 22 0a 20 20 20 20 22 20  "SELECT ".    " 
27e40 28 24 64 69 72 20 7c 7c 20 6e 61 6d 65 29 2c 22  ($dir || name),"
27e50 0a 20 20 20 20 22 20 77 72 69 74 65 66 69 6c 65  .    " writefile
27e60 28 28 24 64 69 72 20 7c 7c 20 6e 61 6d 65 29 2c  (($dir || name),
27e70 20 25 73 2c 20 6d 6f 64 65 2c 20 6d 74 69 6d 65   %s, mode, mtime
27e80 29 20 22 0a 20 20 20 20 22 46 52 4f 4d 20 25 73  ) ".    "FROM %s
27e90 20 57 48 45 52 45 20 28 25 73 29 20 41 4e 44 20   WHERE (%s) AND 
27ea0 28 64 61 74 61 20 49 53 20 4e 55 4c 4c 20 4f 52  (data IS NULL OR
27eb0 20 24 64 69 72 4f 6e 6c 79 20 3d 20 30 29 22 3b   $dirOnly = 0)";
27ec0 0a 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ..  const char *
27ed0 61 7a 45 78 74 72 61 41 72 67 5b 5d 20 3d 20 7b  azExtraArg[] = {
27ee0 20 0a 20 20 20 20 22 73 71 6c 61 72 5f 75 6e 63   .    "sqlar_unc
27ef0 6f 6d 70 72 65 73 73 28 64 61 74 61 2c 20 73 7a  ompress(data, sz
27f00 29 22 2c 0a 20 20 20 20 22 64 61 74 61 22 0a 20  )",.    "data". 
27f10 20 7d 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 73   };..  sqlite3_s
27f20 74 6d 74 20 2a 70 53 71 6c 20 3d 20 30 3b 0a 20  tmt *pSql = 0;. 
27f30 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
27f40 5f 4f 4b 3b 0a 20 20 63 68 61 72 20 2a 7a 44 69  _OK;.  char *zDi
27f50 72 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a  r = 0;.  char *z
27f60 57 68 65 72 65 20 3d 20 30 3b 0a 20 20 69 6e 74  Where = 0;.  int
27f70 20 69 2c 20 6a 3b 0a 0a 20 20 2f 2a 20 49 66 20   i, j;..  /* If 
27f80 61 72 67 75 6d 65 6e 74 73 20 61 72 65 20 73 70  arguments are sp
27f90 65 63 69 66 69 65 64 2c 20 63 68 65 63 6b 20 74  ecified, check t
27fa0 68 61 74 20 74 68 65 79 20 61 63 74 75 61 6c 6c  hat they actuall
27fb0 79 20 65 78 69 73 74 20 77 69 74 68 69 6e 0a 20  y exist within. 
27fc0 20 2a 2a 20 74 68 65 20 61 72 63 68 69 76 65 20   ** the archive 
27fd0 62 65 66 6f 72 65 20 70 72 6f 63 65 65 64 69 6e  before proceedin
27fe0 67 2e 20 41 6e 64 20 66 6f 72 6d 75 6c 61 74 65  g. And formulate
27ff0 20 61 20 57 48 45 52 45 20 63 6c 61 75 73 65 20   a WHERE clause 
28000 74 6f 0a 20 20 2a 2a 20 6d 61 74 63 68 20 74 68  to.  ** match th
28010 65 6d 2e 20 20 2a 2f 0a 20 20 72 63 20 3d 20 61  em.  */.  rc = a
28020 72 43 68 65 63 6b 45 6e 74 72 69 65 73 28 70 41  rCheckEntries(pA
28030 72 29 3b 0a 20 20 61 72 57 68 65 72 65 43 6c 61  r);.  arWhereCla
28040 75 73 65 28 26 72 63 2c 20 70 41 72 2c 20 26 7a  use(&rc, pAr, &z
28050 57 68 65 72 65 29 3b 0a 0a 20 20 69 66 28 20 72  Where);..  if( r
28060 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
28070 20 20 20 20 69 66 28 20 70 41 72 2d 3e 7a 44 69      if( pAr->zDi
28080 72 20 29 7b 0a 20 20 20 20 20 20 7a 44 69 72 20  r ){.      zDir 
28090 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
280a0 66 28 22 25 73 2f 22 2c 20 70 41 72 2d 3e 7a 44  f("%s/", pAr->zD
280b0 69 72 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ir);.    }else{.
280c0 20 20 20 20 20 20 7a 44 69 72 20 3d 20 73 71 6c        zDir = sql
280d0 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 22 29  ite3_mprintf("")
280e0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
280f0 7a 44 69 72 3d 3d 30 20 29 20 72 63 20 3d 20 53  zDir==0 ) rc = S
28100 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
28110 0a 0a 20 20 73 68 65 6c 6c 50 72 65 70 61 72 65  ..  shellPrepare
28120 50 72 69 6e 74 66 28 70 41 72 2d 3e 64 62 2c 20  Printf(pAr->db, 
28130 26 72 63 2c 20 26 70 53 71 6c 2c 20 7a 53 71 6c  &rc, &pSql, zSql
28140 31 2c 20 0a 20 20 20 20 20 20 61 7a 45 78 74 72  1, .      azExtr
28150 61 41 72 67 5b 70 41 72 2d 3e 62 5a 69 70 5d 2c  aArg[pAr->bZip],
28160 20 70 41 72 2d 3e 7a 53 72 63 54 61 62 6c 65 2c   pAr->zSrcTable,
28170 20 7a 57 68 65 72 65 0a 20 20 29 3b 0a 0a 20 20   zWhere.  );..  
28180 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
28190 4b 20 29 7b 0a 20 20 20 20 6a 20 3d 20 73 71 6c  K ){.    j = sql
281a0 69 74 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65  ite3_bind_parame
281b0 74 65 72 5f 69 6e 64 65 78 28 70 53 71 6c 2c 20  ter_index(pSql, 
281c0 22 24 64 69 72 22 29 3b 0a 20 20 20 20 73 71 6c  "$dir");.    sql
281d0 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 28 70  ite3_bind_text(p
281e0 53 71 6c 2c 20 6a 2c 20 7a 44 69 72 2c 20 2d 31  Sql, j, zDir, -1
281f0 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29  , SQLITE_STATIC)
28200 3b 0a 0a 20 20 20 20 2f 2a 20 52 75 6e 20 74 68  ;..    /* Run th
28210 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
28220 6e 74 20 74 77 69 63 65 2e 20 54 68 65 20 66 69  nt twice. The fi
28230 72 73 74 20 74 69 6d 65 2c 20 77 72 69 74 65 66  rst time, writef
28240 69 6c 65 28 29 20 69 73 20 63 61 6c 6c 65 64 0a  ile() is called.
28250 20 20 20 20 2a 2a 20 66 6f 72 20 61 6c 6c 20 61      ** for all a
28260 72 63 68 69 76 65 20 6d 65 6d 62 65 72 73 20 74  rchive members t
28270 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 65 78  hat should be ex
28280 74 72 61 63 74 65 64 2e 20 54 68 65 20 73 65 63  tracted. The sec
28290 6f 6e 64 20 74 69 6d 65 2c 0a 20 20 20 20 2a 2a  ond time,.    **
282a0 20 6f 6e 6c 79 20 66 6f 72 20 74 68 65 20 64 69   only for the di
282b0 72 65 63 74 6f 72 69 65 73 2e 20 54 68 69 73 20  rectories. This 
282c0 69 73 20 62 65 63 61 75 73 65 20 74 68 65 20 74  is because the t
282d0 69 6d 65 73 74 61 6d 70 73 20 66 6f 72 0a 20 20  imestamps for.  
282e0 20 20 2a 2a 20 65 78 74 72 61 63 74 65 64 20 64    ** extracted d
282f0 69 72 65 63 74 6f 72 69 65 73 20 6d 75 73 74 20  irectories must 
28300 62 65 20 72 65 73 65 74 20 61 66 74 65 72 20 74  be reset after t
28310 68 65 79 20 61 72 65 20 70 6f 70 75 6c 61 74 65  hey are populate
28320 64 20 28 61 73 0a 20 20 20 20 2a 2a 20 70 6f 70  d (as.    ** pop
28330 75 6c 61 74 69 6e 67 20 74 68 65 6d 20 63 68 61  ulating them cha
28340 6e 67 65 73 20 74 68 65 20 74 69 6d 65 73 74 61  nges the timesta
28350 6d 70 29 2e 20 20 2a 2f 0a 20 20 20 20 66 6f 72  mp).  */.    for
28360 28 69 3d 30 3b 20 69 3c 32 3b 20 69 2b 2b 29 7b  (i=0; i<2; i++){
28370 0a 20 20 20 20 20 20 6a 20 3d 20 73 71 6c 69 74  .      j = sqlit
28380 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65  e3_bind_paramete
28390 72 5f 69 6e 64 65 78 28 70 53 71 6c 2c 20 22 24  r_index(pSql, "$
283a0 64 69 72 4f 6e 6c 79 22 29 3b 0a 20 20 20 20 20  dirOnly");.     
283b0 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e   sqlite3_bind_in
283c0 74 28 70 53 71 6c 2c 20 6a 2c 20 69 29 3b 0a 20  t(pSql, j, i);. 
283d0 20 20 20 20 20 69 66 28 20 70 41 72 2d 3e 62 44       if( pAr->bD
283e0 72 79 52 75 6e 20 29 7b 0a 20 20 20 20 20 20 20  ryRun ){.       
283f0 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 41 72   utf8_printf(pAr
28400 2d 3e 70 2d 3e 6f 75 74 2c 20 22 25 73 5c 6e 22  ->p->out, "%s\n"
28410 2c 20 73 71 6c 69 74 65 33 5f 73 71 6c 28 70 53  , sqlite3_sql(pS
28420 71 6c 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ql));.      }els
28430 65 7b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65  e{.        while
28440 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
28450 26 26 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73  && SQLITE_ROW==s
28460 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 71 6c  qlite3_step(pSql
28470 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  ) ){.          i
28480 66 28 20 69 3d 3d 30 20 26 26 20 70 41 72 2d 3e  f( i==0 && pAr->
28490 62 56 65 72 62 6f 73 65 20 29 7b 0a 20 20 20 20  bVerbose ){.    
284a0 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69          utf8_pri
284b0 6e 74 66 28 70 41 72 2d 3e 70 2d 3e 6f 75 74 2c  ntf(pAr->p->out,
284c0 20 22 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65 33   "%s\n", sqlite3
284d0 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 71  _column_text(pSq
284e0 6c 2c 20 30 29 29 3b 0a 20 20 20 20 20 20 20 20  l, 0));.        
284f0 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
28500 20 20 20 20 7d 0a 20 20 20 20 20 20 73 68 65 6c      }.      shel
28510 6c 52 65 73 65 74 28 26 72 63 2c 20 70 53 71 6c  lReset(&rc, pSql
28520 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 68 65  );.    }.    she
28530 6c 6c 46 69 6e 61 6c 69 7a 65 28 26 72 63 2c 20  llFinalize(&rc, 
28540 70 53 71 6c 29 3b 0a 20 20 7d 0a 0a 20 20 73 71  pSql);.  }..  sq
28550 6c 69 74 65 33 5f 66 72 65 65 28 7a 44 69 72 29  lite3_free(zDir)
28560 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
28570 28 7a 57 68 65 72 65 29 3b 0a 20 20 72 65 74 75  (zWhere);.  retu
28580 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
28590 52 75 6e 20 74 68 65 20 53 51 4c 20 73 74 61 74  Run the SQL stat
285a0 65 6d 65 6e 74 20 69 6e 20 7a 53 71 6c 2e 20 20  ement in zSql.  
285b0 4f 72 20 69 66 20 64 6f 69 6e 67 20 61 20 2d 2d  Or if doing a --
285c0 64 72 79 72 75 6e 2c 20 6d 65 72 65 6c 79 20 70  dryrun, merely p
285d0 72 69 6e 74 20 69 74 20 6f 75 74 2e 0a 2a 2f 0a  rint it out..*/.
285e0 73 74 61 74 69 63 20 69 6e 74 20 61 72 45 78 65  static int arExe
285f0 63 53 71 6c 28 41 72 43 6f 6d 6d 61 6e 64 20 2a  cSql(ArCommand *
28600 70 41 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  pAr, const char 
28610 2a 7a 53 71 6c 29 7b 0a 20 20 69 6e 74 20 72 63  *zSql){.  int rc
28620 3b 0a 20 20 69 66 28 20 70 41 72 2d 3e 62 44 72  ;.  if( pAr->bDr
28630 79 52 75 6e 20 29 7b 0a 20 20 20 20 75 74 66 38  yRun ){.    utf8
28640 5f 70 72 69 6e 74 66 28 70 41 72 2d 3e 70 2d 3e  _printf(pAr->p->
28650 6f 75 74 2c 20 22 25 73 5c 6e 22 2c 20 7a 53 71  out, "%s\n", zSq
28660 6c 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c  l);.    rc = SQL
28670 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b  ITE_OK;.  }else{
28680 0a 20 20 20 20 63 68 61 72 20 2a 7a 45 72 72 20  .    char *zErr 
28690 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  = 0;.    rc = sq
286a0 6c 69 74 65 33 5f 65 78 65 63 28 70 41 72 2d 3e  lite3_exec(pAr->
286b0 64 62 2c 20 7a 53 71 6c 2c 20 30 2c 20 30 2c 20  db, zSql, 0, 0, 
286c0 26 7a 45 72 72 29 3b 0a 20 20 20 20 69 66 28 20  &zErr);.    if( 
286d0 7a 45 72 72 20 29 7b 0a 20 20 20 20 20 20 75 74  zErr ){.      ut
286e0 66 38 5f 70 72 69 6e 74 66 28 73 74 64 6f 75 74  f8_printf(stdout
286f0 2c 20 22 45 52 52 4f 52 3a 20 25 73 5c 6e 22 2c  , "ERROR: %s\n",
28700 20 7a 45 72 72 29 3b 0a 20 20 20 20 20 20 73 71   zErr);.      sq
28710 6c 69 74 65 33 5f 66 72 65 65 28 7a 45 72 72 29  lite3_free(zErr)
28720 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
28730 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a  turn rc;.}.../*.
28740 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ** Implementatio
28750 6e 20 6f 66 20 2e 61 72 20 22 63 72 65 61 74 65  n of .ar "create
28760 22 20 61 6e 64 20 22 75 70 64 61 74 65 22 20 63  " and "update" c
28770 6f 6d 6d 61 6e 64 73 2e 0a 2a 2a 0a 2a 2a 20 43  ommands..**.** C
28780 72 65 61 74 65 20 74 68 65 20 22 73 71 6c 61 72  reate the "sqlar
28790 22 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20 64  " table in the d
287a0 61 74 61 62 61 73 65 20 69 66 20 69 74 20 64 6f  atabase if it do
287b0 65 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 65  es not already e
287c0 78 69 73 74 2e 0a 2a 2a 20 54 68 65 6e 20 61 64  xist..** Then ad
287d0 64 20 65 61 63 68 20 66 69 6c 65 20 69 6e 20 74  d each file in t
287e0 68 65 20 61 7a 46 69 6c 65 5b 5d 20 61 72 72 61  he azFile[] arra
287f0 79 20 74 6f 20 74 68 65 20 61 72 63 68 69 76 65  y to the archive
28800 2e 20 44 69 72 65 63 74 6f 72 69 65 73 0a 2a 2a  . Directories.**
28810 20 61 72 65 20 61 64 64 65 64 20 72 65 63 75 72   are added recur
28820 73 69 76 65 6c 79 2e 20 49 66 20 61 72 67 75 6d  sively. If argum
28830 65 6e 74 20 62 56 65 72 62 6f 73 65 20 69 73 20  ent bVerbose is 
28840 6e 6f 6e 2d 7a 65 72 6f 2c 20 61 20 6d 65 73 73  non-zero, a mess
28850 61 67 65 20 69 73 0a 2a 2a 20 70 72 69 6e 74 65  age is.** printe
28860 64 20 6f 6e 20 73 74 64 6f 75 74 20 66 6f 72 20  d on stdout for 
28870 65 61 63 68 20 66 69 6c 65 20 61 72 63 68 69 76  each file archiv
28880 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 72  ed..**.** The cr
28890 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20 69 73 20  eate command is 
288a0 74 68 65 20 73 61 6d 65 20 61 73 20 75 70 64 61  the same as upda
288b0 74 65 2c 20 65 78 63 65 70 74 20 74 68 61 74 20  te, except that 
288c0 69 74 20 64 72 6f 70 73 0a 2a 2a 20 61 6e 79 20  it drops.** any 
288d0 65 78 69 73 74 69 6e 67 20 22 73 71 6c 61 72 22  existing "sqlar"
288e0 20 74 61 62 6c 65 20 62 65 66 6f 72 65 20 62 65   table before be
288f0 67 69 6e 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74  ginning..*/.stat
28900 69 63 20 69 6e 74 20 61 72 43 72 65 61 74 65 4f  ic int arCreateO
28910 72 55 70 64 61 74 65 43 6f 6d 6d 61 6e 64 28 0a  rUpdateCommand(.
28920 20 20 41 72 43 6f 6d 6d 61 6e 64 20 2a 70 41 72    ArCommand *pAr
28930 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
28940 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67    /* Command arg
28950 75 6d 65 6e 74 73 20 61 6e 64 20 6f 70 74 69 6f  uments and optio
28960 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 62 55 70 64  ns */.  int bUpd
28970 61 74 65 20 20 20 20 20 20 20 20 20 20 20 20 20  ate             
28980 20 20 20 20 20 20 20 20 2f 2a 20 74 72 75 65 20          /* true 
28990 66 6f 72 20 61 20 2d 2d 63 72 65 61 74 65 2e 20  for a --create. 
289a0 20 66 61 6c 73 65 20 66 6f 72 20 2d 2d 75 70 64   false for --upd
289b0 61 74 65 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73  ate */.){.  cons
289c0 74 20 63 68 61 72 20 2a 7a 43 72 65 61 74 65 20  t char *zCreate 
289d0 3d 20 0a 20 20 20 20 20 20 22 43 52 45 41 54 45  = .      "CREATE
289e0 20 54 41 42 4c 45 20 49 46 20 4e 4f 54 20 45 58   TABLE IF NOT EX
289f0 49 53 54 53 20 73 71 6c 61 72 28 5c 6e 22 0a 20  ISTS sqlar(\n". 
28a00 20 20 20 20 20 22 20 20 6e 61 6d 65 20 54 45 58       "  name TEX
28a10 54 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 20  T PRIMARY KEY,  
28a20 2d 2d 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 66  -- name of the f
28a30 69 6c 65 5c 6e 22 0a 20 20 20 20 20 20 22 20 20  ile\n".      "  
28a40 6d 6f 64 65 20 49 4e 54 2c 20 20 20 20 20 20 20  mode INT,       
28a50 20 20 20 20 20 20 20 20 2d 2d 20 61 63 63 65 73          -- acces
28a60 73 20 70 65 72 6d 69 73 73 69 6f 6e 73 5c 6e 22  s permissions\n"
28a70 0a 20 20 20 20 20 20 22 20 20 6d 74 69 6d 65 20  .      "  mtime 
28a80 49 4e 54 2c 20 20 20 20 20 20 20 20 20 20 20 20  INT,            
28a90 20 20 2d 2d 20 6c 61 73 74 20 6d 6f 64 69 66 69    -- last modifi
28aa0 63 61 74 69 6f 6e 20 74 69 6d 65 5c 6e 22 0a 20  cation time\n". 
28ab0 20 20 20 20 20 22 20 20 73 7a 20 49 4e 54 2c 20       "  sz INT, 
28ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28ad0 2d 2d 20 6f 72 69 67 69 6e 61 6c 20 66 69 6c 65  -- original file
28ae0 20 73 69 7a 65 5c 6e 22 0a 20 20 20 20 20 20 22   size\n".      "
28af0 20 20 64 61 74 61 20 42 4c 4f 42 20 20 20 20 20    data BLOB     
28b00 20 20 20 20 20 20 20 20 20 20 2d 2d 20 63 6f 6d            -- com
28b10 70 72 65 73 73 65 64 20 63 6f 6e 74 65 6e 74 5c  pressed content\
28b20 6e 22 0a 20 20 20 20 20 20 22 29 22 3b 0a 20 20  n".      ")";.  
28b30 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 72 6f  const char *zDro
28b40 70 20 3d 20 22 44 52 4f 50 20 54 41 42 4c 45 20  p = "DROP TABLE 
28b50 49 46 20 45 58 49 53 54 53 20 73 71 6c 61 72 22  IF EXISTS sqlar"
28b60 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
28b70 7a 49 6e 73 65 72 74 46 6d 74 5b 32 5d 20 3d 20  zInsertFmt[2] = 
28b80 7b 0a 20 20 20 20 20 22 52 45 50 4c 41 43 45 20  {.     "REPLACE 
28b90 49 4e 54 4f 20 25 73 28 6e 61 6d 65 2c 6d 6f 64  INTO %s(name,mod
28ba0 65 2c 6d 74 69 6d 65 2c 73 7a 2c 64 61 74 61 29  e,mtime,sz,data)
28bb0 5c 6e 22 0a 20 20 20 20 20 22 20 20 53 45 4c 45  \n".     "  SELE
28bc0 43 54 5c 6e 22 0a 20 20 20 20 20 22 20 20 20 20  CT\n".     "    
28bd0 25 73 2c 5c 6e 22 0a 20 20 20 20 20 22 20 20 20  %s,\n".     "   
28be0 20 6d 6f 64 65 2c 5c 6e 22 0a 20 20 20 20 20 22   mode,\n".     "
28bf0 20 20 20 20 6d 74 69 6d 65 2c 5c 6e 22 0a 20 20      mtime,\n".  
28c00 20 20 20 22 20 20 20 20 43 41 53 45 20 73 75 62     "    CASE sub
28c10 73 74 72 28 6c 73 6d 6f 64 65 28 6d 6f 64 65 29  str(lsmode(mode)
28c20 2c 31 2c 31 29 5c 6e 22 0a 20 20 20 20 20 22 20  ,1,1)\n".     " 
28c30 20 20 20 20 20 57 48 45 4e 20 27 2d 27 20 54 48       WHEN '-' TH
28c40 45 4e 20 6c 65 6e 67 74 68 28 64 61 74 61 29 5c  EN length(data)\
28c50 6e 22 0a 20 20 20 20 20 22 20 20 20 20 20 20 57  n".     "      W
28c60 48 45 4e 20 27 64 27 20 54 48 45 4e 20 30 5c 6e  HEN 'd' THEN 0\n
28c70 22 0a 20 20 20 20 20 22 20 20 20 20 20 20 45 4c  ".     "      EL
28c80 53 45 20 2d 31 20 45 4e 44 2c 5c 6e 22 0a 20 20  SE -1 END,\n".  
28c90 20 20 20 22 20 20 20 20 73 71 6c 61 72 5f 63 6f     "    sqlar_co
28ca0 6d 70 72 65 73 73 28 64 61 74 61 29 5c 6e 22 0a  mpress(data)\n".
28cb0 20 20 20 20 20 22 20 20 46 52 4f 4d 20 66 73 64       "  FROM fsd
28cc0 69 72 28 25 51 2c 25 51 29 5c 6e 22 0a 20 20 20  ir(%Q,%Q)\n".   
28cd0 20 20 22 20 20 57 48 45 52 45 20 6c 73 6d 6f 64    "  WHERE lsmod
28ce0 65 28 6d 6f 64 65 29 20 4e 4f 54 20 4c 49 4b 45  e(mode) NOT LIKE
28cf0 20 27 3f 25 25 27 3b 22 2c 0a 20 20 20 20 20 22   '?%%';",.     "
28d00 52 45 50 4c 41 43 45 20 49 4e 54 4f 20 25 73 28  REPLACE INTO %s(
28d10 6e 61 6d 65 2c 6d 6f 64 65 2c 6d 74 69 6d 65 2c  name,mode,mtime,
28d20 64 61 74 61 29 5c 6e 22 0a 20 20 20 20 20 22 20  data)\n".     " 
28d30 20 53 45 4c 45 43 54 5c 6e 22 0a 20 20 20 20 20   SELECT\n".     
28d40 22 20 20 20 20 25 73 2c 5c 6e 22 0a 20 20 20 20  "    %s,\n".    
28d50 20 22 20 20 20 20 6d 6f 64 65 2c 5c 6e 22 0a 20   "    mode,\n". 
28d60 20 20 20 20 22 20 20 20 20 6d 74 69 6d 65 2c 5c      "    mtime,\
28d70 6e 22 0a 20 20 20 20 20 22 20 20 20 20 64 61 74  n".     "    dat
28d80 61 5c 6e 22 0a 20 20 20 20 20 22 20 20 46 52 4f  a\n".     "  FRO
28d90 4d 20 66 73 64 69 72 28 25 51 2c 25 51 29 5c 6e  M fsdir(%Q,%Q)\n
28da0 22 0a 20 20 20 20 20 22 20 20 57 48 45 52 45 20  ".     "  WHERE 
28db0 6c 73 6d 6f 64 65 28 6d 6f 64 65 29 20 4e 4f 54  lsmode(mode) NOT
28dc0 20 4c 49 4b 45 20 27 3f 25 25 27 3b 22 0a 20 20   LIKE '?%%';".  
28dd0 7d 3b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  };.  int i;     
28de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28df0 20 20 20 20 20 2f 2a 20 46 6f 72 20 69 74 65 72       /* For iter
28e00 61 74 69 6e 67 20 74 68 72 6f 75 67 68 20 61 7a  ating through az
28e10 46 69 6c 65 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20  File[] */.  int 
28e20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
28e30 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
28e40 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
28e50 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62  const char *zTab
28e60 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
28e70 2f 2a 20 53 51 4c 20 74 61 62 6c 65 20 69 6e 74  /* SQL table int
28e80 6f 20 77 68 69 63 68 20 74 6f 20 69 6e 73 65 72  o which to inser
28e90 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 53 71  t */.  char *zSq
28ea0 6c 3b 0a 20 20 63 68 61 72 20 7a 54 65 6d 70 5b  l;.  char zTemp[
28eb0 35 30 5d 3b 0a 0a 20 20 61 72 45 78 65 63 53 71  50];..  arExecSq
28ec0 6c 28 70 41 72 2c 20 22 50 52 41 47 4d 41 20 70  l(pAr, "PRAGMA p
28ed0 61 67 65 5f 73 69 7a 65 3d 35 31 32 22 29 3b 0a  age_size=512");.
28ee0 20 20 72 63 20 3d 20 61 72 45 78 65 63 53 71 6c    rc = arExecSql
28ef0 28 70 41 72 2c 20 22 53 41 56 45 50 4f 49 4e 54  (pAr, "SAVEPOINT
28f00 20 61 72 3b 22 29 3b 0a 20 20 69 66 28 20 72 63   ar;");.  if( rc
28f10 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
28f20 74 75 72 6e 20 72 63 3b 0a 20 20 7a 54 65 6d 70  turn rc;.  zTemp
28f30 5b 30 5d 20 3d 20 30 3b 20 0a 20 20 69 66 28 20  [0] = 0; .  if( 
28f40 70 41 72 2d 3e 62 5a 69 70 20 29 7b 0a 20 20 20  pAr->bZip ){.   
28f50 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74   /* Initialize t
28f60 68 65 20 7a 69 70 66 69 6c 65 20 76 69 72 74 75  he zipfile virtu
28f70 61 6c 20 74 61 62 6c 65 2c 20 69 66 20 6e 65 63  al table, if nec
28f80 65 73 73 61 72 79 20 2a 2f 0a 20 20 20 20 69 66  essary */.    if
28f90 28 20 70 41 72 2d 3e 7a 46 69 6c 65 20 29 7b 0a  ( pAr->zFile ){.
28fa0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 75 69        sqlite3_ui
28fb0 6e 74 36 34 20 72 3b 0a 20 20 20 20 20 20 73 71  nt64 r;.      sq
28fc0 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73  lite3_randomness
28fd0 28 73 69 7a 65 6f 66 28 72 29 2c 26 72 29 3b 0a  (sizeof(r),&r);.
28fe0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
28ff0 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 54  printf(sizeof(zT
29000 65 6d 70 29 2c 7a 54 65 6d 70 2c 22 7a 69 70 25  emp),zTemp,"zip%
29010 30 31 36 6c 6c 78 22 2c 72 29 3b 0a 20 20 20 20  016llx",r);.    
29020 20 20 7a 54 61 62 20 3d 20 7a 54 65 6d 70 3b 0a    zTab = zTemp;.
29030 20 20 20 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c        zSql = sql
29040 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20  ite3_mprintf(.  
29050 20 20 20 20 20 20 20 22 43 52 45 41 54 45 20 56         "CREATE V
29060 49 52 54 55 41 4c 20 54 41 42 4c 45 20 74 65 6d  IRTUAL TABLE tem
29070 70 2e 25 73 20 55 53 49 4e 47 20 7a 69 70 66 69  p.%s USING zipfi
29080 6c 65 28 25 51 29 22 2c 0a 20 20 20 20 20 20 20  le(%Q)",.       
29090 20 20 7a 54 61 62 2c 20 70 41 72 2d 3e 7a 46 69    zTab, pAr->zFi
290a0 6c 65 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  le.      );.    
290b0 20 20 72 63 20 3d 20 61 72 45 78 65 63 53 71 6c    rc = arExecSql
290c0 28 70 41 72 2c 20 7a 53 71 6c 29 3b 0a 20 20 20  (pAr, zSql);.   
290d0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
290e0 7a 53 71 6c 29 3b 0a 20 20 20 20 7d 65 6c 73 65  zSql);.    }else
290f0 7b 0a 20 20 20 20 20 20 7a 54 61 62 20 3d 20 22  {.      zTab = "
29100 7a 69 70 22 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  zip";.    }.  }e
29110 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 6e 69 74  lse{.    /* Init
29120 69 61 6c 69 7a 65 20 74 68 65 20 74 61 62 6c 65  ialize the table
29130 20 66 6f 72 20 61 6e 20 53 51 4c 41 52 20 2a 2f   for an SQLAR */
29140 0a 20 20 20 20 7a 54 61 62 20 3d 20 22 73 71 6c  .    zTab = "sql
29150 61 72 22 3b 0a 20 20 20 20 69 66 28 20 62 55 70  ar";.    if( bUp
29160 64 61 74 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  date==0 ){.     
29170 20 72 63 20 3d 20 61 72 45 78 65 63 53 71 6c 28   rc = arExecSql(
29180 70 41 72 2c 20 7a 44 72 6f 70 29 3b 0a 20 20 20  pAr, zDrop);.   
29190 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
291a0 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 65 6e 64 5f  E_OK ) goto end_
291b0 61 72 5f 74 72 61 6e 73 61 63 74 69 6f 6e 3b 0a  ar_transaction;.
291c0 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 61      }.    rc = a
291d0 72 45 78 65 63 53 71 6c 28 70 41 72 2c 20 7a 43  rExecSql(pAr, zC
291e0 72 65 61 74 65 29 3b 0a 20 20 7d 0a 20 20 66 6f  reate);.  }.  fo
291f0 72 28 69 3d 30 3b 20 69 3c 70 41 72 2d 3e 6e 41  r(i=0; i<pAr->nA
29200 72 67 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45  rg && rc==SQLITE
29210 5f 4f 4b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63  _OK; i++){.    c
29220 68 61 72 20 2a 7a 53 71 6c 32 20 3d 20 73 71 6c  har *zSql2 = sql
29230 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 7a 49 6e  ite3_mprintf(zIn
29240 73 65 72 74 46 6d 74 5b 70 41 72 2d 3e 62 5a 69  sertFmt[pAr->bZi
29250 70 5d 2c 20 7a 54 61 62 2c 0a 20 20 20 20 20 20  p], zTab,.      
29260 20 20 70 41 72 2d 3e 62 56 65 72 62 6f 73 65 20    pAr->bVerbose 
29270 3f 20 22 73 68 65 6c 6c 5f 70 75 74 73 6e 6c 28  ? "shell_putsnl(
29280 6e 61 6d 65 29 22 20 3a 20 22 6e 61 6d 65 22 2c  name)" : "name",
29290 0a 20 20 20 20 20 20 20 20 70 41 72 2d 3e 61 7a  .        pAr->az
292a0 41 72 67 5b 69 5d 2c 20 70 41 72 2d 3e 7a 44 69  Arg[i], pAr->zDi
292b0 72 29 3b 0a 20 20 20 20 72 63 20 3d 20 61 72 45  r);.    rc = arE
292c0 78 65 63 53 71 6c 28 70 41 72 2c 20 7a 53 71 6c  xecSql(pAr, zSql
292d0 32 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  2);.    sqlite3_
292e0 66 72 65 65 28 7a 53 71 6c 32 29 3b 0a 20 20 7d  free(zSql2);.  }
292f0 0a 65 6e 64 5f 61 72 5f 74 72 61 6e 73 61 63 74  .end_ar_transact
29300 69 6f 6e 3a 0a 20 20 69 66 28 20 72 63 21 3d 53  ion:.  if( rc!=S
29310 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
29320 61 72 45 78 65 63 53 71 6c 28 70 41 72 2c 20 22  arExecSql(pAr, "
29330 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 61 72 3b 20  ROLLBACK TO ar; 
29340 52 45 4c 45 41 53 45 20 61 72 3b 22 29 3b 0a 20  RELEASE ar;");. 
29350 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d   }else{.    rc =
29360 20 61 72 45 78 65 63 53 71 6c 28 70 41 72 2c 20   arExecSql(pAr, 
29370 22 52 45 4c 45 41 53 45 20 61 72 3b 22 29 3b 0a  "RELEASE ar;");.
29380 20 20 20 20 69 66 28 20 70 41 72 2d 3e 62 5a 69      if( pAr->bZi
29390 70 20 26 26 20 70 41 72 2d 3e 7a 46 69 6c 65 20  p && pAr->zFile 
293a0 29 7b 0a 20 20 20 20 20 20 7a 53 71 6c 20 3d 20  ){.      zSql = 
293b0 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
293c0 22 44 52 4f 50 20 54 41 42 4c 45 20 25 73 22 2c  "DROP TABLE %s",
293d0 20 7a 54 65 6d 70 29 3b 0a 20 20 20 20 20 20 61   zTemp);.      a
293e0 72 45 78 65 63 53 71 6c 28 70 41 72 2c 20 7a 53  rExecSql(pAr, zS
293f0 71 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ql);.      sqlit
29400 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20  e3_free(zSql);. 
29410 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
29420 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  n rc;.}../*.** I
29430 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
29440 20 22 2e 61 72 22 20 64 6f 74 20 63 6f 6d 6d 61   ".ar" dot comma
29450 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  nd..*/.static in
29460 74 20 61 72 44 6f 74 43 6f 6d 6d 61 6e 64 28 0a  t arDotCommand(.
29470 20 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 53    ShellState *pS
29480 74 61 74 65 2c 20 20 20 20 20 20 20 20 20 20 20  tate,           
29490 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 73 68 65    /* Current she
294a0 6c 6c 20 74 6f 6f 6c 20 73 74 61 74 65 20 2a 2f  ll tool state */
294b0 0a 20 20 63 68 61 72 20 2a 2a 61 7a 41 72 67 2c  .  char **azArg,
294c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
294d0 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 61     /* Array of a
294e0 72 67 75 6d 65 6e 74 73 20 70 61 73 73 65 64 20  rguments passed 
294f0 74 6f 20 64 6f 74 20 63 6f 6d 6d 61 6e 64 20 2a  to dot command *
29500 2f 0a 20 20 69 6e 74 20 6e 41 72 67 20 20 20 20  /.  int nArg    
29510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29520 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
29530 20 65 6e 74 72 69 65 73 20 69 6e 20 61 7a 41 72   entries in azAr
29540 67 5b 5d 20 2a 2f 0a 29 7b 0a 20 20 41 72 43 6f  g[] */.){.  ArCo
29550 6d 6d 61 6e 64 20 63 6d 64 3b 0a 20 20 69 6e 74  mmand cmd;.  int
29560 20 72 63 3b 0a 20 20 6d 65 6d 73 65 74 28 26 63   rc;.  memset(&c
29570 6d 64 2c 20 30 2c 20 73 69 7a 65 6f 66 28 63 6d  md, 0, sizeof(cm
29580 64 29 29 3b 0a 20 20 72 63 20 3d 20 61 72 50 61  d));.  rc = arPa
29590 72 73 65 43 6f 6d 6d 61 6e 64 28 61 7a 41 72 67  rseCommand(azArg
295a0 2c 20 6e 41 72 67 2c 20 26 63 6d 64 29 3b 0a 20  , nArg, &cmd);. 
295b0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
295c0 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 65 44  OK ){.    int eD
295d0 62 54 79 70 65 20 3d 20 53 48 45 4c 4c 5f 4f 50  bType = SHELL_OP
295e0 45 4e 5f 55 4e 53 50 45 43 3b 0a 20 20 20 20 63  EN_UNSPEC;.    c
295f0 6d 64 2e 70 20 3d 20 70 53 74 61 74 65 3b 0a 20  md.p = pState;. 
29600 20 20 20 63 6d 64 2e 64 62 20 3d 20 70 53 74 61     cmd.db = pSta
29610 74 65 2d 3e 64 62 3b 0a 20 20 20 20 69 66 28 20  te->db;.    if( 
29620 63 6d 64 2e 7a 46 69 6c 65 20 29 7b 0a 20 20 20  cmd.zFile ){.   
29630 20 20 20 65 44 62 54 79 70 65 20 3d 20 64 65 64     eDbType = ded
29640 75 63 65 44 61 74 61 62 61 73 65 54 79 70 65 28  uceDatabaseType(
29650 63 6d 64 2e 7a 46 69 6c 65 2c 20 31 29 3b 0a 20  cmd.zFile, 1);. 
29660 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
29670 65 44 62 54 79 70 65 20 3d 20 70 53 74 61 74 65  eDbType = pState
29680 2d 3e 6f 70 65 6e 4d 6f 64 65 3b 0a 20 20 20 20  ->openMode;.    
29690 7d 0a 20 20 20 20 69 66 28 20 65 44 62 54 79 70  }.    if( eDbTyp
296a0 65 3d 3d 53 48 45 4c 4c 5f 4f 50 45 4e 5f 5a 49  e==SHELL_OPEN_ZI
296b0 50 46 49 4c 45 20 29 7b 0a 20 20 20 20 20 20 69  PFILE ){.      i
296c0 66 28 20 63 6d 64 2e 65 43 6d 64 3d 3d 41 52 5f  f( cmd.eCmd==AR_
296d0 43 4d 44 5f 45 58 54 52 41 43 54 20 7c 7c 20 63  CMD_EXTRACT || c
296e0 6d 64 2e 65 43 6d 64 3d 3d 41 52 5f 43 4d 44 5f  md.eCmd==AR_CMD_
296f0 4c 49 53 54 20 29 7b 0a 20 20 20 20 20 20 20 20  LIST ){.        
29700 69 66 28 20 63 6d 64 2e 7a 46 69 6c 65 3d 3d 30  if( cmd.zFile==0
29710 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6d   ){.          cm
29720 64 2e 7a 53 72 63 54 61 62 6c 65 20 3d 20 73 71  d.zSrcTable = sq
29730 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 7a  lite3_mprintf("z
29740 69 70 22 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  ip");.        }e
29750 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 63  lse{.          c
29760 6d 64 2e 7a 53 72 63 54 61 62 6c 65 20 3d 20 73  md.zSrcTable = s
29770 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
29780 7a 69 70 66 69 6c 65 28 25 51 29 22 2c 20 63 6d  zipfile(%Q)", cm
29790 64 2e 7a 46 69 6c 65 29 3b 0a 20 20 20 20 20 20  d.zFile);.      
297a0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
297b0 20 20 63 6d 64 2e 62 5a 69 70 20 3d 20 31 3b 0a    cmd.bZip = 1;.
297c0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 6d      }else if( cm
297d0 64 2e 7a 46 69 6c 65 20 29 7b 0a 20 20 20 20 20  d.zFile ){.     
297e0 20 69 6e 74 20 66 6c 61 67 73 3b 0a 20 20 20 20   int flags;.    
297f0 20 20 69 66 28 20 63 6d 64 2e 62 41 70 70 65 6e    if( cmd.bAppen
29800 64 20 29 20 65 44 62 54 79 70 65 20 3d 20 53 48  d ) eDbType = SH
29810 45 4c 4c 5f 4f 50 45 4e 5f 41 50 50 45 4e 44 56  ELL_OPEN_APPENDV
29820 46 53 3b 0a 20 20 20 20 20 20 69 66 28 20 63 6d  FS;.      if( cm
29830 64 2e 65 43 6d 64 3d 3d 41 52 5f 43 4d 44 5f 43  d.eCmd==AR_CMD_C
29840 52 45 41 54 45 20 7c 7c 20 63 6d 64 2e 65 43 6d  REATE || cmd.eCm
29850 64 3d 3d 41 52 5f 43 4d 44 5f 55 50 44 41 54 45  d==AR_CMD_UPDATE
29860 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6c 61 67   ){.        flag
29870 73 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s = SQLITE_OPEN_
29880 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45  READWRITE|SQLITE
29890 5f 4f 50 45 4e 5f 43 52 45 41 54 45 3b 0a 20 20  _OPEN_CREATE;.  
298a0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
298b0 20 20 20 66 6c 61 67 73 20 3d 20 53 51 4c 49 54     flags = SQLIT
298c0 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 3b  E_OPEN_READONLY;
298d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63  .      }.      c
298e0 6d 64 2e 64 62 20 3d 20 30 3b 0a 20 20 20 20 20  md.db = 0;.     
298f0 20 69 66 28 20 63 6d 64 2e 62 44 72 79 52 75 6e   if( cmd.bDryRun
29900 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38   ){.        utf8
29910 5f 70 72 69 6e 74 66 28 70 53 74 61 74 65 2d 3e  _printf(pState->
29920 6f 75 74 2c 20 22 2d 2d 20 6f 70 65 6e 20 64 61  out, "-- open da
29930 74 61 62 61 73 65 20 27 25 73 27 25 73 5c 6e 22  tabase '%s'%s\n"
29940 2c 20 63 6d 64 2e 7a 46 69 6c 65 2c 0a 20 20 20  , cmd.zFile,.   
29950 20 20 20 20 20 20 20 20 20 20 65 44 62 54 79 70            eDbTyp
29960 65 3d 3d 53 48 45 4c 4c 5f 4f 50 45 4e 5f 41 50  e==SHELL_OPEN_AP
29970 50 45 4e 44 56 46 53 20 3f 20 22 20 75 73 69 6e  PENDVFS ? " usin
29980 67 20 27 61 70 6e 64 76 66 73 27 22 20 3a 20 22  g 'apndvfs'" : "
29990 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ");.      }.    
299a0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 6f    rc = sqlite3_o
299b0 70 65 6e 5f 76 32 28 63 6d 64 2e 7a 46 69 6c 65  pen_v2(cmd.zFile
299c0 2c 20 26 63 6d 64 2e 64 62 2c 20 66 6c 61 67 73  , &cmd.db, flags
299d0 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
299e0 65 44 62 54 79 70 65 3d 3d 53 48 45 4c 4c 5f 4f  eDbType==SHELL_O
299f0 50 45 4e 5f 41 50 50 45 4e 44 56 46 53 20 3f 20  PEN_APPENDVFS ? 
29a00 22 61 70 6e 64 76 66 73 22 20 3a 20 30 29 3b 0a  "apndvfs" : 0);.
29a10 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
29a20 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
29a30 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73     utf8_printf(s
29a40 74 64 65 72 72 2c 20 22 63 61 6e 6e 6f 74 20 6f  tderr, "cannot o
29a50 70 65 6e 20 66 69 6c 65 3a 20 25 73 20 28 25 73  pen file: %s (%s
29a60 29 5c 6e 22 2c 20 0a 20 20 20 20 20 20 20 20 20  )\n", .         
29a70 20 20 20 63 6d 64 2e 7a 46 69 6c 65 2c 20 73 71     cmd.zFile, sq
29a80 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 63 6d 64  lite3_errmsg(cmd
29a90 2e 64 62 29 0a 20 20 20 20 20 20 20 20 29 3b 0a  .db).        );.
29aa0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
29ab0 5f 61 72 5f 63 6f 6d 6d 61 6e 64 3b 0a 20 20 20  _ar_command;.   
29ac0 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
29ad0 65 33 5f 66 69 6c 65 69 6f 5f 69 6e 69 74 28 63  e3_fileio_init(c
29ae0 6d 64 2e 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20  md.db, 0, 0);.  
29af0 20 20 20 20 73 71 6c 69 74 65 33 5f 73 71 6c 61      sqlite3_sqla
29b00 72 5f 69 6e 69 74 28 63 6d 64 2e 64 62 2c 20 30  r_init(cmd.db, 0
29b10 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
29b20 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
29b30 69 6f 6e 28 63 6d 64 2e 64 62 2c 20 22 73 68 65  ion(cmd.db, "she
29b40 6c 6c 5f 70 75 74 73 6e 6c 22 2c 20 31 2c 20 53  ll_putsnl", 1, S
29b50 51 4c 49 54 45 5f 55 54 46 38 2c 20 63 6d 64 2e  QLITE_UTF8, cmd.
29b60 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  p,.             
29b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29b80 20 73 68 65 6c 6c 50 75 74 73 46 75 6e 63 2c 20   shellPutsFunc, 
29b90 30 2c 20 30 29 3b 0a 0a 20 20 20 20 7d 0a 20 20  0, 0);..    }.  
29ba0 20 20 69 66 28 20 63 6d 64 2e 7a 53 72 63 54 61    if( cmd.zSrcTa
29bb0 62 6c 65 3d 3d 30 20 26 26 20 63 6d 64 2e 62 5a  ble==0 && cmd.bZ
29bc0 69 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  ip==0 ){.      i
29bd0 66 28 20 63 6d 64 2e 65 43 6d 64 21 3d 41 52 5f  f( cmd.eCmd!=AR_
29be0 43 4d 44 5f 43 52 45 41 54 45 0a 20 20 20 20 20  CMD_CREATE.     
29bf0 20 20 26 26 20 73 71 6c 69 74 65 33 5f 74 61 62    && sqlite3_tab
29c00 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d 65 74 61 64 61  le_column_metada
29c10 74 61 28 63 6d 64 2e 64 62 2c 30 2c 22 73 71 6c  ta(cmd.db,0,"sql
29c20 61 72 22 2c 22 6e 61 6d 65 22 2c 30 2c 30 2c 30  ar","name",0,0,0
29c30 2c 30 2c 30 29 0a 20 20 20 20 20 20 29 7b 0a 20  ,0,0).      ){. 
29c40 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e         utf8_prin
29c50 74 66 28 73 74 64 65 72 72 2c 20 22 64 61 74 61  tf(stderr, "data
29c60 62 61 73 65 20 64 6f 65 73 20 6e 6f 74 20 63 6f  base does not co
29c70 6e 74 61 69 6e 20 61 6e 20 27 73 71 6c 61 72 27  ntain an 'sqlar'
29c80 20 74 61 62 6c 65 5c 6e 22 29 3b 0a 20 20 20 20   table\n");.    
29c90 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
29ca0 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 67  ERROR;.        g
29cb0 6f 74 6f 20 65 6e 64 5f 61 72 5f 63 6f 6d 6d 61  oto end_ar_comma
29cc0 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  nd;.      }.    
29cd0 20 20 63 6d 64 2e 7a 53 72 63 54 61 62 6c 65 20    cmd.zSrcTable 
29ce0 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
29cf0 66 28 22 73 71 6c 61 72 22 29 3b 0a 20 20 20 20  f("sqlar");.    
29d00 7d 0a 0a 20 20 20 20 73 77 69 74 63 68 28 20 63  }..    switch( c
29d10 6d 64 2e 65 43 6d 64 20 29 7b 0a 20 20 20 20 20  md.eCmd ){.     
29d20 20 63 61 73 65 20 41 52 5f 43 4d 44 5f 43 52 45   case AR_CMD_CRE
29d30 41 54 45 3a 0a 20 20 20 20 20 20 20 20 72 63 20  ATE:.        rc 
29d40 3d 20 61 72 43 72 65 61 74 65 4f 72 55 70 64 61  = arCreateOrUpda
29d50 74 65 43 6f 6d 6d 61 6e 64 28 26 63 6d 64 2c 20  teCommand(&cmd, 
29d60 30 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  0);.        brea
29d70 6b 3b 0a 0a 20 20 20 20 20 20 63 61 73 65 20 41  k;..      case A
29d80 52 5f 43 4d 44 5f 45 58 54 52 41 43 54 3a 0a 20  R_CMD_EXTRACT:. 
29d90 20 20 20 20 20 20 20 72 63 20 3d 20 61 72 45 78         rc = arEx
29da0 74 72 61 63 74 43 6f 6d 6d 61 6e 64 28 26 63 6d  tractCommand(&cm
29db0 64 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  d);.        brea
29dc0 6b 3b 0a 0a 20 20 20 20 20 20 63 61 73 65 20 41  k;..      case A
29dd0 52 5f 43 4d 44 5f 4c 49 53 54 3a 0a 20 20 20 20  R_CMD_LIST:.    
29de0 20 20 20 20 72 63 20 3d 20 61 72 4c 69 73 74 43      rc = arListC
29df0 6f 6d 6d 61 6e 64 28 26 63 6d 64 29 3b 0a 20 20  ommand(&cmd);.  
29e00 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20        break;..  
29e10 20 20 20 20 63 61 73 65 20 41 52 5f 43 4d 44 5f      case AR_CMD_
29e20 48 45 4c 50 3a 0a 20 20 20 20 20 20 20 20 61 72  HELP:.        ar
29e30 55 73 61 67 65 28 70 53 74 61 74 65 2d 3e 6f 75  Usage(pState->ou
29e40 74 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  t);.        brea
29e50 6b 3b 0a 0a 20 20 20 20 20 20 64 65 66 61 75 6c  k;..      defaul
29e60 74 3a 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  t:.        asser
29e70 74 28 20 63 6d 64 2e 65 43 6d 64 3d 3d 41 52 5f  t( cmd.eCmd==AR_
29e80 43 4d 44 5f 55 50 44 41 54 45 20 29 3b 0a 20 20  CMD_UPDATE );.  
29e90 20 20 20 20 20 20 72 63 20 3d 20 61 72 43 72 65        rc = arCre
29ea0 61 74 65 4f 72 55 70 64 61 74 65 43 6f 6d 6d 61  ateOrUpdateComma
29eb0 6e 64 28 26 63 6d 64 2c 20 31 29 3b 0a 20 20 20  nd(&cmd, 1);.   
29ec0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
29ed0 7d 0a 20 20 7d 0a 65 6e 64 5f 61 72 5f 63 6f 6d  }.  }.end_ar_com
29ee0 6d 61 6e 64 3a 0a 20 20 69 66 28 20 63 6d 64 2e  mand:.  if( cmd.
29ef0 64 62 21 3d 70 53 74 61 74 65 2d 3e 64 62 20 29  db!=pState->db )
29f00 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6c  {.    sqlite3_cl
29f10 6f 73 65 28 63 6d 64 2e 64 62 29 3b 0a 20 20 7d  ose(cmd.db);.  }
29f20 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
29f30 63 6d 64 2e 7a 53 72 63 54 61 62 6c 65 29 3b 0a  cmd.zSrcTable);.
29f40 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
29f50 2f 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 22 2e  /* End of the ".
29f60 61 72 63 68 69 76 65 22 20 6f 72 20 22 2e 61 72  archive" or ".ar
29f70 22 20 63 6f 6d 6d 61 6e 64 20 6c 6f 67 69 63 0a  " command logic.
29f80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29f90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29fa0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29fb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29fc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29fd0 2a 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64  **/.#endif /* !d
29fe0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
29ff0 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29  IT_VIRTUALTABLE)
2a000 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49   && defined(SQLI
2a010 54 45 5f 48 41 56 45 5f 5a 4c 49 42 29 20 2a 2f  TE_HAVE_ZLIB) */
2a020 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 61 6e 20 69  .../*.** If an i
2a030 6e 70 75 74 20 6c 69 6e 65 20 62 65 67 69 6e 73  nput line begins
2a040 20 77 69 74 68 20 22 2e 22 20 74 68 65 6e 20 69   with "." then i
2a050 6e 76 6f 6b 65 20 74 68 69 73 20 72 6f 75 74 69  nvoke this routi
2a060 6e 65 20 74 6f 0a 2a 2a 20 70 72 6f 63 65 73 73  ne to.** process
2a070 20 74 68 61 74 20 6c 69 6e 65 2e 0a 2a 2a 0a 2a   that line..**.*
2a080 2a 20 52 65 74 75 72 6e 20 31 20 6f 6e 20 65 72  * Return 1 on er
2a090 72 6f 72 2c 20 32 20 74 6f 20 65 78 69 74 2c 20  ror, 2 to exit, 
2a0a0 61 6e 64 20 30 20 6f 74 68 65 72 77 69 73 65 2e  and 0 otherwise.
2a0b0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64  .*/.static int d
2a0c0 6f 5f 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 28 63  o_meta_command(c
2a0d0 68 61 72 20 2a 7a 4c 69 6e 65 2c 20 53 68 65 6c  har *zLine, Shel
2a0e0 6c 53 74 61 74 65 20 2a 70 29 7b 0a 20 20 69 6e  lState *p){.  in
2a0f0 74 20 68 20 3d 20 31 3b 0a 20 20 69 6e 74 20 6e  t h = 1;.  int n
2a100 41 72 67 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e  Arg = 0;.  int n
2a110 2c 20 63 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  , c;.  int rc = 
2a120 30 3b 0a 20 20 63 68 61 72 20 2a 61 7a 41 72 67  0;.  char *azArg
2a130 5b 35 30 5d 3b 0a 0a 23 69 66 6e 64 65 66 20 53  [50];..#ifndef S
2a140 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
2a150 41 4c 54 41 42 4c 45 0a 20 20 69 66 28 20 70 2d  ALTABLE.  if( p-
2a160 3e 65 78 70 65 72 74 2e 70 45 78 70 65 72 74 20  >expert.pExpert 
2a170 29 7b 0a 20 20 20 20 65 78 70 65 72 74 46 69 6e  ){.    expertFin
2a180 69 73 68 28 70 2c 20 31 2c 20 30 29 3b 0a 20 20  ish(p, 1, 0);.  
2a190 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 50  }.#endif..  /* P
2a1a0 61 72 73 65 20 74 68 65 20 69 6e 70 75 74 20 6c  arse the input l
2a1b0 69 6e 65 20 69 6e 74 6f 20 74 6f 6b 65 6e 73 2e  ine into tokens.
2a1c0 0a 20 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 7a  .  */.  while( z
2a1d0 4c 69 6e 65 5b 68 5d 20 26 26 20 6e 41 72 67 3c  Line[h] && nArg<
2a1e0 41 72 72 61 79 53 69 7a 65 28 61 7a 41 72 67 29  ArraySize(azArg)
2a1f0 20 29 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 49   ){.    while( I
2a200 73 53 70 61 63 65 28 7a 4c 69 6e 65 5b 68 5d 29  sSpace(zLine[h])
2a210 20 29 7b 20 68 2b 2b 3b 20 7d 0a 20 20 20 20 69   ){ h++; }.    i
2a220 66 28 20 7a 4c 69 6e 65 5b 68 5d 3d 3d 30 20 29  f( zLine[h]==0 )
2a230 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 66 28 20   break;.    if( 
2a240 7a 4c 69 6e 65 5b 68 5d 3d 3d 27 5c 27 27 20 7c  zLine[h]=='\'' |
2a250 7c 20 7a 4c 69 6e 65 5b 68 5d 3d 3d 27 22 27 20  | zLine[h]=='"' 
2a260 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 64 65 6c  ){.      int del
2a270 69 6d 20 3d 20 7a 4c 69 6e 65 5b 68 2b 2b 5d 3b  im = zLine[h++];
2a280 0a 20 20 20 20 20 20 61 7a 41 72 67 5b 6e 41 72  .      azArg[nAr
2a290 67 2b 2b 5d 20 3d 20 26 7a 4c 69 6e 65 5b 68 5d  g++] = &zLine[h]
2a2a0 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 7a  ;.      while( z
2a2b0 4c 69 6e 65 5b 68 5d 20 26 26 20 7a 4c 69 6e 65  Line[h] && zLine
2a2c0 5b 68 5d 21 3d 64 65 6c 69 6d 20 29 7b 0a 20 20  [h]!=delim ){.  
2a2d0 20 20 20 20 20 20 69 66 28 20 7a 4c 69 6e 65 5b        if( zLine[
2a2e0 68 5d 3d 3d 27 5c 5c 27 20 26 26 20 64 65 6c 69  h]=='\\' && deli
2a2f0 6d 3d 3d 27 22 27 20 26 26 20 7a 4c 69 6e 65 5b  m=='"' && zLine[
2a300 68 2b 31 5d 21 3d 30 20 29 20 68 2b 2b 3b 0a 20  h+1]!=0 ) h++;. 
2a310 20 20 20 20 20 20 20 68 2b 2b 3b 0a 20 20 20 20         h++;.    
2a320 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 7a 4c    }.      if( zL
2a330 69 6e 65 5b 68 5d 3d 3d 64 65 6c 69 6d 20 29 7b  ine[h]==delim ){
2a340 0a 20 20 20 20 20 20 20 20 7a 4c 69 6e 65 5b 68  .        zLine[h
2a350 2b 2b 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  ++] = 0;.      }
2a360 0a 20 20 20 20 20 20 69 66 28 20 64 65 6c 69 6d  .      if( delim
2a370 3d 3d 27 22 27 20 29 20 72 65 73 6f 6c 76 65 5f  =='"' ) resolve_
2a380 62 61 63 6b 73 6c 61 73 68 65 73 28 61 7a 41 72  backslashes(azAr
2a390 67 5b 6e 41 72 67 2d 31 5d 29 3b 0a 20 20 20 20  g[nArg-1]);.    
2a3a0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 7a 41  }else{.      azA
2a3b0 72 67 5b 6e 41 72 67 2b 2b 5d 20 3d 20 26 7a 4c  rg[nArg++] = &zL
2a3c0 69 6e 65 5b 68 5d 3b 0a 20 20 20 20 20 20 77 68  ine[h];.      wh
2a3d0 69 6c 65 28 20 7a 4c 69 6e 65 5b 68 5d 20 26 26  ile( zLine[h] &&
2a3e0 20 21 49 73 53 70 61 63 65 28 7a 4c 69 6e 65 5b   !IsSpace(zLine[
2a3f0 68 5d 29 20 29 7b 20 68 2b 2b 3b 20 7d 0a 20 20  h]) ){ h++; }.  
2a400 20 20 20 20 69 66 28 20 7a 4c 69 6e 65 5b 68 5d      if( zLine[h]
2a410 20 29 20 7a 4c 69 6e 65 5b 68 2b 2b 5d 20 3d 20   ) zLine[h++] = 
2a420 30 3b 0a 20 20 20 20 20 20 72 65 73 6f 6c 76 65  0;.      resolve
2a430 5f 62 61 63 6b 73 6c 61 73 68 65 73 28 61 7a 41  _backslashes(azA
2a440 72 67 5b 6e 41 72 67 2d 31 5d 29 3b 0a 20 20 20  rg[nArg-1]);.   
2a450 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 72 6f   }.  }..  /* Pro
2a460 63 65 73 73 20 74 68 65 20 69 6e 70 75 74 20 6c  cess the input l
2a470 69 6e 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ine..  */.  if( 
2a480 6e 41 72 67 3d 3d 30 20 29 20 72 65 74 75 72 6e  nArg==0 ) return
2a490 20 30 3b 20 2f 2a 20 6e 6f 20 74 6f 6b 65 6e 73   0; /* no tokens
2a4a0 2c 20 6e 6f 20 65 72 72 6f 72 20 2a 2f 0a 20 20  , no error */.  
2a4b0 6e 20 3d 20 73 74 72 6c 65 6e 33 30 28 61 7a 41  n = strlen30(azA
2a4c0 72 67 5b 30 5d 29 3b 0a 20 20 63 20 3d 20 61 7a  rg[0]);.  c = az
2a4d0 41 72 67 5b 30 5d 5b 30 5d 3b 0a 20 20 63 6c 65  Arg[0][0];.  cle
2a4e0 61 72 54 65 6d 70 46 69 6c 65 28 70 29 3b 0a 0a  arTempFile(p);..
2a4f0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
2a500 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f  MIT_AUTHORIZATIO
2a510 4e 0a 20 20 69 66 28 20 63 3d 3d 27 61 27 20 26  N.  if( c=='a' &
2a520 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b  & strncmp(azArg[
2a530 30 5d 2c 20 22 61 75 74 68 22 2c 20 6e 29 3d 3d  0], "auth", n)==
2a540 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 41 72  0 ){.    if( nAr
2a550 67 21 3d 32 20 29 7b 0a 20 20 20 20 20 20 72 61  g!=2 ){.      ra
2a560 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  w_printf(stderr,
2a570 20 22 55 73 61 67 65 3a 20 2e 61 75 74 68 20 4f   "Usage: .auth O
2a580 4e 7c 4f 46 46 5c 6e 22 29 3b 0a 20 20 20 20 20  N|OFF\n");.     
2a590 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 67   rc = 1;.      g
2a5a0 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64  oto meta_command
2a5b0 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a 20 20 20  _exit;.    }.   
2a5c0 20 6f 70 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a   open_db(p, 0);.
2a5d0 20 20 20 20 69 66 28 20 62 6f 6f 6c 65 61 6e 56      if( booleanV
2a5e0 61 6c 75 65 28 61 7a 41 72 67 5b 31 5d 29 20 29  alue(azArg[1]) )
2a5f0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
2a600 73 65 74 5f 61 75 74 68 6f 72 69 7a 65 72 28 70  set_authorizer(p
2a610 2d 3e 64 62 2c 20 73 68 65 6c 6c 41 75 74 68 2c  ->db, shellAuth,
2a620 20 70 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   p);.    }else{.
2a630 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 65        sqlite3_se
2a640 74 5f 61 75 74 68 6f 72 69 7a 65 72 28 70 2d 3e  t_authorizer(p->
2a650 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d  db, 0, 0);.    }
2a660 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a  .  }else.#endif.
2a670 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
2a680 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
2a690 4c 54 41 42 4c 45 29 20 26 26 20 64 65 66 69 6e  LTABLE) && defin
2a6a0 65 64 28 53 51 4c 49 54 45 5f 48 41 56 45 5f 5a  ed(SQLITE_HAVE_Z
2a6b0 4c 49 42 29 0a 20 20 69 66 28 20 63 3d 3d 27 61  LIB).  if( c=='a
2a6c0 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41  ' && strncmp(azA
2a6d0 72 67 5b 30 5d 2c 20 22 61 72 63 68 69 76 65 22  rg[0], "archive"
2a6e0 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 6f  , n)==0 ){.    o
2a6f0 70 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a 20 20  pen_db(p, 0);.  
2a700 20 20 72 63 20 3d 20 61 72 44 6f 74 43 6f 6d 6d    rc = arDotComm
2a710 61 6e 64 28 70 2c 20 61 7a 41 72 67 2c 20 6e 41  and(p, azArg, nA
2a720 72 67 29 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e  rg);.  }else.#en
2a730 64 69 66 0a 0a 20 20 69 66 28 20 28 63 3d 3d 27  dif..  if( (c=='
2a740 62 27 20 26 26 20 6e 3e 3d 33 20 26 26 20 73 74  b' && n>=3 && st
2a750 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20  rncmp(azArg[0], 
2a760 22 62 61 63 6b 75 70 22 2c 20 6e 29 3d 3d 30 29  "backup", n)==0)
2a770 0a 20 20 20 7c 7c 20 28 63 3d 3d 27 73 27 20 26  .   || (c=='s' &
2a780 26 20 6e 3e 3d 33 20 26 26 20 73 74 72 6e 63 6d  & n>=3 && strncm
2a790 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 73 61 76  p(azArg[0], "sav
2a7a0 65 22 2c 20 6e 29 3d 3d 30 29 0a 20 20 29 7b 0a  e", n)==0).  ){.
2a7b0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
2a7c0 7a 44 65 73 74 46 69 6c 65 20 3d 20 30 3b 0a 20  zDestFile = 0;. 
2a7d0 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
2a7e0 44 62 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69  Db = 0;.    sqli
2a7f0 74 65 33 20 2a 70 44 65 73 74 3b 0a 20 20 20 20  te3 *pDest;.    
2a800 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 20 2a  sqlite3_backup *
2a810 70 42 61 63 6b 75 70 3b 0a 20 20 20 20 69 6e 74  pBackup;.    int
2a820 20 6a 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 31 3b   j;.    for(j=1;
2a830 20 6a 3c 6e 41 72 67 3b 20 6a 2b 2b 29 7b 0a 20   j<nArg; j++){. 
2a840 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
2a850 2a 7a 20 3d 20 61 7a 41 72 67 5b 6a 5d 3b 0a 20  *z = azArg[j];. 
2a860 20 20 20 20 20 69 66 28 20 7a 5b 30 5d 3d 3d 27       if( z[0]=='
2a870 2d 27 20 29 7b 0a 20 20 20 20 20 20 20 20 77 68  -' ){.        wh
2a880 69 6c 65 28 20 7a 5b 30 5d 3d 3d 27 2d 27 20 29  ile( z[0]=='-' )
2a890 20 7a 2b 2b 3b 0a 20 20 20 20 20 20 20 20 2f 2a   z++;.        /*
2a8a0 20 4e 6f 20 6f 70 74 69 6f 6e 73 20 74 6f 20 70   No options to p
2a8b0 72 6f 63 65 73 73 20 61 74 20 74 68 69 73 20 74  rocess at this t
2a8c0 69 6d 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 7b  ime */.        {
2a8d0 0a 20 20 20 20 20 20 20 20 20 20 75 74 66 38 5f  .          utf8_
2a8e0 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
2a8f0 75 6e 6b 6e 6f 77 6e 20 6f 70 74 69 6f 6e 3a 20  unknown option: 
2a900 25 73 5c 6e 22 2c 20 61 7a 41 72 67 5b 6a 5d 29  %s\n", azArg[j])
2a910 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ;.          retu
2a920 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a  rn 1;.        }.
2a930 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
2a940 7a 44 65 73 74 46 69 6c 65 3d 3d 30 20 29 7b 0a  zDestFile==0 ){.
2a950 20 20 20 20 20 20 20 20 7a 44 65 73 74 46 69 6c          zDestFil
2a960 65 20 3d 20 61 7a 41 72 67 5b 6a 5d 3b 0a 20 20  e = azArg[j];.  
2a970 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 44      }else if( zD
2a980 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  b==0 ){.        
2a990 7a 44 62 20 3d 20 7a 44 65 73 74 46 69 6c 65 3b  zDb = zDestFile;
2a9a0 0a 20 20 20 20 20 20 20 20 7a 44 65 73 74 46 69  .        zDestFi
2a9b0 6c 65 20 3d 20 61 7a 41 72 67 5b 6a 5d 3b 0a 20  le = azArg[j];. 
2a9c0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2a9d0 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73      raw_printf(s
2a9e0 74 64 65 72 72 2c 20 22 74 6f 6f 20 6d 61 6e 79  tderr, "too many
2a9f0 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 2e 62   arguments to .b
2aa00 61 63 6b 75 70 5c 6e 22 29 3b 0a 20 20 20 20 20  ackup\n");.     
2aa10 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
2aa20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
2aa30 66 28 20 7a 44 65 73 74 46 69 6c 65 3d 3d 30 20  f( zDestFile==0 
2aa40 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69  ){.      raw_pri
2aa50 6e 74 66 28 73 74 64 65 72 72 2c 20 22 6d 69 73  ntf(stderr, "mis
2aa60 73 69 6e 67 20 46 49 4c 45 4e 41 4d 45 20 61 72  sing FILENAME ar
2aa70 67 75 6d 65 6e 74 20 6f 6e 20 2e 62 61 63 6b 75  gument on .backu
2aa80 70 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 65 74  p\n");.      ret
2aa90 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 1;.    }.   
2aaa0 20 69 66 28 20 7a 44 62 3d 3d 30 20 29 20 7a 44   if( zDb==0 ) zD
2aab0 62 20 3d 20 22 6d 61 69 6e 22 3b 0a 20 20 20 20  b = "main";.    
2aac0 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 6f 70 65  rc = sqlite3_ope
2aad0 6e 28 7a 44 65 73 74 46 69 6c 65 2c 20 26 70 44  n(zDestFile, &pD
2aae0 65 73 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63  est);.    if( rc
2aaf0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
2ab00 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
2ab10 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a  (stderr, "Error:
2ab20 20 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 5c 22 25   cannot open \"%
2ab30 73 5c 22 5c 6e 22 2c 20 7a 44 65 73 74 46 69 6c  s\"\n", zDestFil
2ab40 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  e);.      sqlite
2ab50 33 5f 63 6c 6f 73 65 28 70 44 65 73 74 29 3b 0a  3_close(pDest);.
2ab60 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
2ab70 20 20 20 20 7d 0a 20 20 20 20 6f 70 65 6e 5f 64      }.    open_d
2ab80 62 28 70 2c 20 30 29 3b 0a 20 20 20 20 70 42 61  b(p, 0);.    pBa
2ab90 63 6b 75 70 20 3d 20 73 71 6c 69 74 65 33 5f 62  ckup = sqlite3_b
2aba0 61 63 6b 75 70 5f 69 6e 69 74 28 70 44 65 73 74  ackup_init(pDest
2abb0 2c 20 22 6d 61 69 6e 22 2c 20 70 2d 3e 64 62 2c  , "main", p->db,
2abc0 20 7a 44 62 29 3b 0a 20 20 20 20 69 66 28 20 70   zDb);.    if( p
2abd0 42 61 63 6b 75 70 3d 3d 30 20 29 7b 0a 20 20 20  Backup==0 ){.   
2abe0 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73     utf8_printf(s
2abf0 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 25  tderr, "Error: %
2ac00 73 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f 65 72  s\n", sqlite3_er
2ac10 72 6d 73 67 28 70 44 65 73 74 29 29 3b 0a 20 20  rmsg(pDest));.  
2ac20 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73      sqlite3_clos
2ac30 65 28 70 44 65 73 74 29 3b 0a 20 20 20 20 20 20  e(pDest);.      
2ac40 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
2ac50 20 20 20 20 77 68 69 6c 65 28 20 20 28 72 63 20      while(  (rc 
2ac60 3d 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70  = sqlite3_backup
2ac70 5f 73 74 65 70 28 70 42 61 63 6b 75 70 2c 31 30  _step(pBackup,10
2ac80 30 29 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  0))==SQLITE_OK )
2ac90 7b 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62  {}.    sqlite3_b
2aca0 61 63 6b 75 70 5f 66 69 6e 69 73 68 28 70 42 61  ackup_finish(pBa
2acb0 63 6b 75 70 29 3b 0a 20 20 20 20 69 66 28 20 72  ckup);.    if( r
2acc0 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c==SQLITE_DONE )
2acd0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 30 3b 0a  {.      rc = 0;.
2ace0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2acf0 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64   utf8_printf(std
2ad00 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 25 73 5c  err, "Error: %s\
2ad10 6e 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d  n", sqlite3_errm
2ad20 73 67 28 70 44 65 73 74 29 29 3b 0a 20 20 20 20  sg(pDest));.    
2ad30 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a    rc = 1;.    }.
2ad40 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73      sqlite3_clos
2ad50 65 28 70 44 65 73 74 29 3b 0a 20 20 7d 65 6c 73  e(pDest);.  }els
2ad60 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 62 27 20  e..  if( c=='b' 
2ad70 26 26 20 6e 3e 3d 33 20 26 26 20 73 74 72 6e 63  && n>=3 && strnc
2ad80 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 62 61  mp(azArg[0], "ba
2ad90 69 6c 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20  il", n)==0 ){.  
2ada0 20 20 69 66 28 20 6e 41 72 67 3d 3d 32 20 29 7b    if( nArg==2 ){
2adb0 0a 20 20 20 20 20 20 62 61 69 6c 5f 6f 6e 5f 65  .      bail_on_e
2adc0 72 72 6f 72 20 3d 20 62 6f 6f 6c 65 61 6e 56 61  rror = booleanVa
2add0 6c 75 65 28 61 7a 41 72 67 5b 31 5d 29 3b 0a 20  lue(azArg[1]);. 
2ade0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2adf0 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72  raw_printf(stder
2ae00 72 2c 20 22 55 73 61 67 65 3a 20 2e 62 61 69 6c  r, "Usage: .bail
2ae10 20 6f 6e 7c 6f 66 66 5c 6e 22 29 3b 0a 20 20 20   on|off\n");.   
2ae20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d     rc = 1;.    }
2ae30 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20  .  }else..  if( 
2ae40 63 3d 3d 27 62 27 20 26 26 20 6e 3e 3d 33 20 26  c=='b' && n>=3 &
2ae50 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b  & strncmp(azArg[
2ae60 30 5d 2c 20 22 62 69 6e 61 72 79 22 2c 20 6e 29  0], "binary", n)
2ae70 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6e  ==0 ){.    if( n
2ae80 41 72 67 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20  Arg==2 ){.      
2ae90 69 66 28 20 62 6f 6f 6c 65 61 6e 56 61 6c 75 65  if( booleanValue
2aea0 28 61 7a 41 72 67 5b 31 5d 29 20 29 7b 0a 20 20  (azArg[1]) ){.  
2aeb0 20 20 20 20 20 20 73 65 74 42 69 6e 61 72 79 4d        setBinaryM
2aec0 6f 64 65 28 70 2d 3e 6f 75 74 2c 20 31 29 3b 0a  ode(p->out, 1);.
2aed0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2aee0 20 20 20 20 20 73 65 74 54 65 78 74 4d 6f 64 65       setTextMode
2aef0 28 70 2d 3e 6f 75 74 2c 20 31 29 3b 0a 20 20 20  (p->out, 1);.   
2af00 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
2af10 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
2af20 28 73 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a  (stderr, "Usage:
2af30 20 2e 62 69 6e 61 72 79 20 6f 6e 7c 6f 66 66 5c   .binary on|off\
2af40 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  n");.      rc = 
2af50 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  1;.    }.  }else
2af60 0a 0a 20 20 69 66 28 20 63 3d 3d 27 63 27 20 26  ..  if( c=='c' &
2af70 26 20 73 74 72 63 6d 70 28 61 7a 41 72 67 5b 30  & strcmp(azArg[0
2af80 5d 2c 22 63 64 22 29 3d 3d 30 20 29 7b 0a 20 20  ],"cd")==0 ){.  
2af90 20 20 69 66 28 20 6e 41 72 67 3d 3d 32 20 29 7b    if( nArg==2 ){
2afa0 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 57 49  .#if defined(_WI
2afb0 4e 33 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  N32) || defined(
2afc0 57 49 4e 33 32 29 0a 20 20 20 20 20 20 77 63 68  WIN32).      wch
2afd0 61 72 5f 74 20 2a 7a 20 3d 20 73 71 6c 69 74 65  ar_t *z = sqlite
2afe0 33 5f 77 69 6e 33 32 5f 75 74 66 38 5f 74 6f 5f  3_win32_utf8_to_
2aff0 75 6e 69 63 6f 64 65 28 61 7a 41 72 67 5b 31 5d  unicode(azArg[1]
2b000 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 21 53  );.      rc = !S
2b010 65 74 43 75 72 72 65 6e 74 44 69 72 65 63 74 6f  etCurrentDirecto
2b020 72 79 57 28 7a 29 3b 0a 20 20 20 20 20 20 73 71  ryW(z);.      sq
2b030 6c 69 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a 23  lite3_free(z);.#
2b040 65 6c 73 65 0a 20 20 20 20 20 20 72 63 20 3d 20  else.      rc = 
2b050 63 68 64 69 72 28 61 7a 41 72 67 5b 31 5d 29 3b  chdir(azArg[1]);
2b060 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 69 66  .#endif.      if
2b070 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
2b080 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65  utf8_printf(stde
2b090 72 72 2c 20 22 43 61 6e 6e 6f 74 20 63 68 61 6e  rr, "Cannot chan
2b0a0 67 65 20 74 6f 20 64 69 72 65 63 74 6f 72 79 20  ge to directory 
2b0b0 5c 22 25 73 5c 22 5c 6e 22 2c 20 61 7a 41 72 67  \"%s\"\n", azArg
2b0c0 5b 31 5d 29 3b 0a 20 20 20 20 20 20 20 20 72 63  [1]);.        rc
2b0d0 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
2b0e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
2b0f0 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  aw_printf(stderr
2b100 2c 20 22 55 73 61 67 65 3a 20 2e 63 64 20 44 49  , "Usage: .cd DI
2b110 52 45 43 54 4f 52 59 5c 6e 22 29 3b 0a 20 20 20  RECTORY\n");.   
2b120 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d     rc = 1;.    }
2b130 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 2f 2a 20 54  .  }else..  /* T
2b140 68 65 20 75 6e 64 6f 63 75 6d 65 6e 74 65 64 20  he undocumented 
2b150 22 2e 62 72 65 61 6b 70 6f 69 6e 74 22 20 63 6f  ".breakpoint" co
2b160 6d 6d 61 6e 64 20 63 61 75 73 65 73 20 61 20 63  mmand causes a c
2b170 61 6c 6c 20 74 6f 20 74 68 65 20 6e 6f 2d 6f 70  all to the no-op
2b180 0a 20 20 2a 2a 20 72 6f 75 74 69 6e 65 20 6e 61  .  ** routine na
2b190 6d 65 64 20 74 65 73 74 5f 62 72 65 61 6b 70 6f  med test_breakpo
2b1a0 69 6e 74 28 29 2e 0a 20 20 2a 2f 0a 20 20 69 66  int()..  */.  if
2b1b0 28 20 63 3d 3d 27 62 27 20 26 26 20 6e 3e 3d 33  ( c=='b' && n>=3
2b1c0 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72   && strncmp(azAr
2b1d0 67 5b 30 5d 2c 20 22 62 72 65 61 6b 70 6f 69 6e  g[0], "breakpoin
2b1e0 74 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20  t", n)==0 ){.   
2b1f0 20 74 65 73 74 5f 62 72 65 61 6b 70 6f 69 6e 74   test_breakpoint
2b200 28 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69  ();.  }else..  i
2b210 66 28 20 63 3d 3d 27 63 27 20 26 26 20 6e 3e 3d  f( c=='c' && n>=
2b220 33 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41  3 && strncmp(azA
2b230 72 67 5b 30 5d 2c 20 22 63 68 61 6e 67 65 73 22  rg[0], "changes"
2b240 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69  , n)==0 ){.    i
2b250 66 28 20 6e 41 72 67 3d 3d 32 20 29 7b 0a 20 20  f( nArg==2 ){.  
2b260 20 20 20 20 73 65 74 4f 72 43 6c 65 61 72 46 6c      setOrClearFl
2b270 61 67 28 70 2c 20 53 48 46 4c 47 5f 43 6f 75 6e  ag(p, SHFLG_Coun
2b280 74 43 68 61 6e 67 65 73 2c 20 61 7a 41 72 67 5b  tChanges, azArg[
2b290 31 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  1]);.    }else{.
2b2a0 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
2b2b0 28 73 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a  (stderr, "Usage:
2b2c0 20 2e 63 68 61 6e 67 65 73 20 6f 6e 7c 6f 66 66   .changes on|off
2b2d0 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  \n");.      rc =
2b2e0 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73   1;.    }.  }els
2b2f0 65 0a 0a 20 20 2f 2a 20 43 61 6e 63 65 6c 20 6f  e..  /* Cancel o
2b300 75 74 70 75 74 20 72 65 64 69 72 65 63 74 69 6f  utput redirectio
2b310 6e 2c 20 69 66 20 69 74 20 69 73 20 63 75 72 72  n, if it is curr
2b320 65 6e 74 6c 79 20 73 65 74 20 28 62 79 20 2e 74  ently set (by .t
2b330 65 73 74 63 61 73 65 29 0a 20 20 2a 2a 20 54 68  estcase).  ** Th
2b340 65 6e 20 72 65 61 64 20 74 68 65 20 63 6f 6e 74  en read the cont
2b350 65 6e 74 20 6f 66 20 74 68 65 20 74 65 73 74 63  ent of the testc
2b360 61 73 65 2d 6f 75 74 2e 74 78 74 20 66 69 6c 65  ase-out.txt file
2b370 20 61 6e 64 20 63 6f 6d 70 61 72 65 20 61 67 61   and compare aga
2b380 69 6e 73 74 0a 20 20 2a 2a 20 61 7a 41 72 67 5b  inst.  ** azArg[
2b390 31 5d 2e 20 20 49 66 20 74 68 65 72 65 20 61 72  1].  If there ar
2b3a0 65 20 64 69 66 66 65 72 65 6e 63 65 73 2c 20 72  e differences, r
2b3b0 65 70 6f 72 74 20 61 6e 20 65 72 72 6f 72 20 61  eport an error a
2b3c0 6e 64 20 65 78 69 74 2e 0a 20 20 2a 2f 0a 20 20  nd exit..  */.  
2b3d0 69 66 28 20 63 3d 3d 27 63 27 20 26 26 20 6e 3e  if( c=='c' && n>
2b3e0 3d 33 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a  =3 && strncmp(az
2b3f0 41 72 67 5b 30 5d 2c 20 22 63 68 65 63 6b 22 2c  Arg[0], "check",
2b400 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 63 68   n)==0 ){.    ch
2b410 61 72 20 2a 7a 52 65 73 20 3d 20 30 3b 0a 20 20  ar *zRes = 0;.  
2b420 20 20 6f 75 74 70 75 74 5f 72 65 73 65 74 28 70    output_reset(p
2b430 29 3b 0a 20 20 20 20 69 66 28 20 6e 41 72 67 21  );.    if( nArg!
2b440 3d 32 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f  =2 ){.      raw_
2b450 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
2b460 55 73 61 67 65 3a 20 2e 63 68 65 63 6b 20 47 4c  Usage: .check GL
2b470 4f 42 2d 50 41 54 54 45 52 4e 5c 6e 22 29 3b 0a  OB-PATTERN\n");.
2b480 20 20 20 20 20 20 72 63 20 3d 20 32 3b 0a 20 20        rc = 2;.  
2b490 20 20 7d 65 6c 73 65 20 69 66 28 20 28 7a 52 65    }else if( (zRe
2b4a0 73 20 3d 20 72 65 61 64 46 69 6c 65 28 22 74 65  s = readFile("te
2b4b0 73 74 63 61 73 65 2d 6f 75 74 2e 74 78 74 22 2c  stcase-out.txt",
2b4c0 20 30 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20   0))==0 ){.     
2b4d0 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65   raw_printf(stde
2b4e0 72 72 2c 20 22 45 72 72 6f 72 3a 20 63 61 6e 6e  rr, "Error: cann
2b4f0 6f 74 20 72 65 61 64 20 27 74 65 73 74 63 61 73  ot read 'testcas
2b500 65 2d 6f 75 74 2e 74 78 74 27 5c 6e 22 29 3b 0a  e-out.txt'\n");.
2b510 20 20 20 20 20 20 72 63 20 3d 20 32 3b 0a 20 20        rc = 2;.  
2b520 20 20 7d 65 6c 73 65 20 69 66 28 20 74 65 73 74    }else if( test
2b530 63 61 73 65 5f 67 6c 6f 62 28 61 7a 41 72 67 5b  case_glob(azArg[
2b540 31 5d 2c 7a 52 65 73 29 3d 3d 30 20 29 7b 0a 20  1],zRes)==0 ){. 
2b550 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
2b560 28 73 74 64 65 72 72 2c 0a 20 20 20 20 20 20 20  (stderr,.       
2b570 20 20 20 20 20 20 20 20 20 20 22 74 65 73 74 63            "testc
2b580 61 73 65 2d 25 73 20 46 41 49 4c 45 44 5c 6e 20  ase-%s FAILED\n 
2b590 45 78 70 65 63 74 65 64 3a 20 5b 25 73 5d 5c 6e  Expected: [%s]\n
2b5a0 20 20 20 20 20 20 47 6f 74 3a 20 5b 25 73 5d 5c        Got: [%s]\
2b5b0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
2b5c0 20 20 20 20 20 70 2d 3e 7a 54 65 73 74 63 61 73       p->zTestcas
2b5d0 65 2c 20 61 7a 41 72 67 5b 31 5d 2c 20 7a 52 65  e, azArg[1], zRe
2b5e0 73 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31  s);.      rc = 1
2b5f0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
2b600 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73     utf8_printf(s
2b610 74 64 6f 75 74 2c 20 22 74 65 73 74 63 61 73 65  tdout, "testcase
2b620 2d 25 73 20 6f 6b 5c 6e 22 2c 20 70 2d 3e 7a 54  -%s ok\n", p->zT
2b630 65 73 74 63 61 73 65 29 3b 0a 20 20 20 20 20 20  estcase);.      
2b640 70 2d 3e 6e 43 68 65 63 6b 2b 2b 3b 0a 20 20 20  p->nCheck++;.   
2b650 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66   }.    sqlite3_f
2b660 72 65 65 28 7a 52 65 73 29 3b 0a 20 20 7d 65 6c  ree(zRes);.  }el
2b670 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 63 27  se..  if( c=='c'
2b680 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72   && strncmp(azAr
2b690 67 5b 30 5d 2c 20 22 63 6c 6f 6e 65 22 2c 20 6e  g[0], "clone", n
2b6a0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  )==0 ){.    if( 
2b6b0 6e 41 72 67 3d 3d 32 20 29 7b 0a 20 20 20 20 20  nArg==2 ){.     
2b6c0 20 74 72 79 54 6f 43 6c 6f 6e 65 28 70 2c 20 61   tryToClone(p, a
2b6d0 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20 7d 65  zArg[1]);.    }e
2b6e0 6c 73 65 7b 0a 20 20 20 20 20 20 72 61 77 5f 70  lse{.      raw_p
2b6f0 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55  rintf(stderr, "U
2b700 73 61 67 65 3a 20 2e 63 6c 6f 6e 65 20 46 49 4c  sage: .clone FIL
2b710 45 4e 41 4d 45 5c 6e 22 29 3b 0a 20 20 20 20 20  ENAME\n");.     
2b720 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20   rc = 1;.    }. 
2b730 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d   }else..  if( c=
2b740 3d 27 64 27 20 26 26 20 6e 3e 31 20 26 26 20 73  ='d' && n>1 && s
2b750 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c  trncmp(azArg[0],
2b760 20 22 64 61 74 61 62 61 73 65 73 22 2c 20 6e 29   "databases", n)
2b770 3d 3d 30 20 29 7b 0a 20 20 20 20 53 68 65 6c 6c  ==0 ){.    Shell
2b780 53 74 61 74 65 20 64 61 74 61 3b 0a 20 20 20 20  State data;.    
2b790 63 68 61 72 20 2a 7a 45 72 72 4d 73 67 20 3d 20  char *zErrMsg = 
2b7a0 30 3b 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28 70  0;.    open_db(p
2b7b0 2c 20 30 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79  , 0);.    memcpy
2b7c0 28 26 64 61 74 61 2c 20 70 2c 20 73 69 7a 65 6f  (&data, p, sizeo
2b7d0 66 28 64 61 74 61 29 29 3b 0a 20 20 20 20 64 61  f(data));.    da
2b7e0 74 61 2e 73 68 6f 77 48 65 61 64 65 72 20 3d 20  ta.showHeader = 
2b7f0 30 3b 0a 20 20 20 20 64 61 74 61 2e 63 4d 6f 64  0;.    data.cMod
2b800 65 20 3d 20 64 61 74 61 2e 6d 6f 64 65 20 3d 20  e = data.mode = 
2b810 4d 4f 44 45 5f 4c 69 73 74 3b 0a 20 20 20 20 73  MODE_List;.    s
2b820 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
2b830 73 69 7a 65 6f 66 28 64 61 74 61 2e 63 6f 6c 53  sizeof(data.colS
2b840 65 70 61 72 61 74 6f 72 29 2c 64 61 74 61 2e 63  eparator),data.c
2b850 6f 6c 53 65 70 61 72 61 74 6f 72 2c 22 3a 20 22  olSeparator,": "
2b860 29 3b 0a 20 20 20 20 64 61 74 61 2e 63 6e 74 20  );.    data.cnt 
2b870 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  = 0;.    sqlite3
2b880 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20 22 53 45  _exec(p->db, "SE
2b890 4c 45 43 54 20 6e 61 6d 65 2c 20 66 69 6c 65 20  LECT name, file 
2b8a0 46 52 4f 4d 20 70 72 61 67 6d 61 5f 64 61 74 61  FROM pragma_data
2b8b0 62 61 73 65 5f 6c 69 73 74 22 2c 0a 20 20 20 20  base_list",.    
2b8c0 20 20 20 20 20 20 20 20 20 20 20 20 20 63 61 6c               cal
2b8d0 6c 62 61 63 6b 2c 20 26 64 61 74 61 2c 20 26 7a  lback, &data, &z
2b8e0 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 69 66 28  ErrMsg);.    if(
2b8f0 20 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20   zErrMsg ){.    
2b900 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74    utf8_printf(st
2b910 64 65 72 72 2c 22 45 72 72 6f 72 3a 20 25 73 5c  derr,"Error: %s\
2b920 6e 22 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20 20  n", zErrMsg);.  
2b930 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
2b940 28 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20  (zErrMsg);.     
2b950 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20   rc = 1;.    }. 
2b960 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d   }else..  if( c=
2b970 3d 27 64 27 20 26 26 20 73 74 72 6e 63 6d 70 28  ='d' && strncmp(
2b980 61 7a 41 72 67 5b 30 5d 2c 20 22 64 62 69 6e 66  azArg[0], "dbinf
2b990 6f 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20  o", n)==0 ){.   
2b9a0 20 72 63 20 3d 20 73 68 65 6c 6c 5f 64 62 69 6e   rc = shell_dbin
2b9b0 66 6f 5f 63 6f 6d 6d 61 6e 64 28 70 2c 20 6e 41  fo_command(p, nA
2b9c0 72 67 2c 20 61 7a 41 72 67 29 3b 0a 20 20 7d 65  rg, azArg);.  }e
2b9d0 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 64  lse..  if( c=='d
2b9e0 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41  ' && strncmp(azA
2b9f0 72 67 5b 30 5d 2c 20 22 64 75 6d 70 22 2c 20 6e  rg[0], "dump", n
2ba00 29 3d 3d 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73  )==0 ){.    cons
2ba10 74 20 63 68 61 72 20 2a 7a 4c 69 6b 65 20 3d 20  t char *zLike = 
2ba20 30 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  0;.    int i;.  
2ba30 20 20 69 6e 74 20 73 61 76 65 64 53 68 6f 77 48    int savedShowH
2ba40 65 61 64 65 72 20 3d 20 70 2d 3e 73 68 6f 77 48  eader = p->showH
2ba50 65 61 64 65 72 3b 0a 20 20 20 20 53 68 65 6c 6c  eader;.    Shell
2ba60 43 6c 65 61 72 46 6c 61 67 28 70 2c 20 53 48 46  ClearFlag(p, SHF
2ba70 4c 47 5f 50 72 65 73 65 72 76 65 52 6f 77 69 64  LG_PreserveRowid
2ba80 7c 53 48 46 4c 47 5f 4e 65 77 6c 69 6e 65 73 29  |SHFLG_Newlines)
2ba90 3b 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69  ;.    for(i=1; i
2baa0 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nArg; i++){.   
2bab0 20 20 20 69 66 28 20 61 7a 41 72 67 5b 69 5d 5b     if( azArg[i][
2bac0 30 5d 3d 3d 27 2d 27 20 29 7b 0a 20 20 20 20 20  0]=='-' ){.     
2bad0 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
2bae0 20 3d 20 61 7a 41 72 67 5b 69 5d 2b 31 3b 0a 20   = azArg[i]+1;. 
2baf0 20 20 20 20 20 20 20 69 66 28 20 7a 5b 30 5d 3d         if( z[0]=
2bb00 3d 27 2d 27 20 29 20 7a 2b 2b 3b 0a 20 20 20 20  ='-' ) z++;.    
2bb10 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a      if( strcmp(z
2bb20 2c 22 70 72 65 73 65 72 76 65 2d 72 6f 77 69 64  ,"preserve-rowid
2bb30 73 22 29 3d 3d 30 20 29 7b 0a 23 69 66 64 65 66  s")==0 ){.#ifdef
2bb40 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
2bb50 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 20 20  TUALTABLE.      
2bb60 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73      raw_printf(s
2bb70 74 64 65 72 72 2c 20 22 54 68 65 20 2d 2d 70 72  tderr, "The --pr
2bb80 65 73 65 72 76 65 2d 72 6f 77 69 64 73 20 6f 70  eserve-rowids op
2bb90 74 69 6f 6e 20 69 73 20 6e 6f 74 20 63 6f 6d 70  tion is not comp
2bba0 61 74 69 62 6c 65 22 0a 20 20 20 20 20 20 20 20  atible".        
2bbb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bbc0 20 20 20 20 20 22 20 77 69 74 68 20 53 51 4c 49       " with SQLI
2bbd0 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
2bbe0 41 42 4c 45 5c 6e 22 29 3b 0a 20 20 20 20 20 20  ABLE\n");.      
2bbf0 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
2bc00 20 20 20 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f        goto meta_
2bc10 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 23 65  command_exit;.#e
2bc20 6c 73 65 0a 20 20 20 20 20 20 20 20 20 20 53 68  lse.          Sh
2bc30 65 6c 6c 53 65 74 46 6c 61 67 28 70 2c 20 53 48  ellSetFlag(p, SH
2bc40 46 4c 47 5f 50 72 65 73 65 72 76 65 52 6f 77 69  FLG_PreserveRowi
2bc50 64 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  d);.#endif.     
2bc60 20 20 20 7d 65 6c 73 65 0a 20 20 20 20 20 20 20     }else.       
2bc70 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 22 6e   if( strcmp(z,"n
2bc80 65 77 6c 69 6e 65 73 22 29 3d 3d 30 20 29 7b 0a  ewlines")==0 ){.
2bc90 20 20 20 20 20 20 20 20 20 20 53 68 65 6c 6c 53            ShellS
2bca0 65 74 46 6c 61 67 28 70 2c 20 53 48 46 4c 47 5f  etFlag(p, SHFLG_
2bcb0 4e 65 77 6c 69 6e 65 73 29 3b 0a 20 20 20 20 20  Newlines);.     
2bcc0 20 20 20 7d 65 6c 73 65 0a 20 20 20 20 20 20 20     }else.       
2bcd0 20 7b 0a 20 20 20 20 20 20 20 20 20 20 72 61 77   {.          raw
2bce0 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
2bcf0 22 55 6e 6b 6e 6f 77 6e 20 6f 70 74 69 6f 6e 20  "Unknown option 
2bd00 5c 22 25 73 5c 22 20 6f 6e 20 5c 22 2e 64 75 6d  \"%s\" on \".dum
2bd10 70 5c 22 5c 6e 22 2c 20 61 7a 41 72 67 5b 69 5d  p\"\n", azArg[i]
2bd20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  );.          rc 
2bd30 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 67  = 1;.          g
2bd40 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64  oto meta_command
2bd50 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 20 20 7d  _exit;.        }
2bd60 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
2bd70 20 7a 4c 69 6b 65 20 29 7b 0a 20 20 20 20 20 20   zLike ){.      
2bd80 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64    raw_printf(std
2bd90 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 64 75  err, "Usage: .du
2bda0 6d 70 20 3f 2d 2d 70 72 65 73 65 72 76 65 2d 72  mp ?--preserve-r
2bdb0 6f 77 69 64 73 3f 20 22 0a 20 20 20 20 20 20 20  owids? ".       
2bdc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bdd0 20 20 20 20 22 3f 2d 2d 6e 65 77 6c 69 6e 65 73      "?--newlines
2bde0 3f 20 3f 4c 49 4b 45 2d 50 41 54 54 45 52 4e 3f  ? ?LIKE-PATTERN?
2bdf0 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 72 63  \n");.        rc
2be00 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 67 6f   = 1;.        go
2be10 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f  to meta_command_
2be20 65 78 69 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73  exit;.      }els
2be30 65 7b 0a 20 20 20 20 20 20 20 20 7a 4c 69 6b 65  e{.        zLike
2be40 20 3d 20 61 7a 41 72 67 5b 69 5d 3b 0a 20 20 20   = azArg[i];.   
2be50 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 6f     }.    }.    o
2be60 70 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a 20 20  pen_db(p, 0);.  
2be70 20 20 2f 2a 20 57 68 65 6e 20 70 6c 61 79 69 6e    /* When playin
2be80 67 20 62 61 63 6b 20 61 20 22 64 75 6d 70 22 2c  g back a "dump",
2be90 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6d 69 67   the content mig
2bea0 68 74 20 61 70 70 65 61 72 20 69 6e 20 61 6e 20  ht appear in an 
2beb0 6f 72 64 65 72 0a 20 20 20 20 2a 2a 20 77 68 69  order.    ** whi
2bec0 63 68 20 63 61 75 73 65 73 20 69 6d 6d 65 64 69  ch causes immedi
2bed0 61 74 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20  ate foreign key 
2bee0 63 6f 6e 73 74 72 61 69 6e 74 73 20 74 6f 20 62  constraints to b
2bef0 65 20 76 69 6f 6c 61 74 65 64 2e 0a 20 20 20 20  e violated..    
2bf00 2a 2a 20 53 6f 20 64 69 73 61 62 6c 65 20 66 6f  ** So disable fo
2bf10 72 65 69 67 6e 2d 6b 65 79 20 63 6f 6e 73 74 72  reign-key constr
2bf20 61 69 6e 74 20 65 6e 66 6f 72 63 65 6d 65 6e 74  aint enforcement
2bf30 20 74 6f 20 70 72 65 76 65 6e 74 20 70 72 6f 62   to prevent prob
2bf40 6c 65 6d 73 2e 20 2a 2f 0a 20 20 20 20 72 61 77  lems. */.    raw
2bf50 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
2bf60 22 50 52 41 47 4d 41 20 66 6f 72 65 69 67 6e 5f  "PRAGMA foreign_
2bf70 6b 65 79 73 3d 4f 46 46 3b 5c 6e 22 29 3b 0a 20  keys=OFF;\n");. 
2bf80 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d     raw_printf(p-
2bf90 3e 6f 75 74 2c 20 22 42 45 47 49 4e 20 54 52 41  >out, "BEGIN TRA
2bfa0 4e 53 41 43 54 49 4f 4e 3b 5c 6e 22 29 3b 0a 20  NSACTION;\n");. 
2bfb0 20 20 20 70 2d 3e 77 72 69 74 61 62 6c 65 53 63     p->writableSc
2bfc0 68 65 6d 61 20 3d 20 30 3b 0a 20 20 20 20 70 2d  hema = 0;.    p-
2bfd0 3e 73 68 6f 77 48 65 61 64 65 72 20 3d 20 30 3b  >showHeader = 0;
2bfe0 0a 20 20 20 20 2f 2a 20 53 65 74 20 77 72 69 74  .    /* Set writ
2bff0 61 62 6c 65 5f 73 63 68 65 6d 61 3d 4f 4e 20 73  able_schema=ON s
2c000 69 6e 63 65 20 64 6f 69 6e 67 20 73 6f 20 66 6f  ince doing so fo
2c010 72 63 65 73 20 53 51 4c 69 74 65 20 74 6f 20 69  rces SQLite to i
2c020 6e 69 74 69 61 6c 69 7a 65 0a 20 20 20 20 2a 2a  nitialize.    **
2c030 20 61 73 20 6d 75 63 68 20 6f 66 20 74 68 65 20   as much of the 
2c040 73 63 68 65 6d 61 20 61 73 20 69 74 20 63 61 6e  schema as it can
2c050 20 65 76 65 6e 20 69 66 20 74 68 65 20 73 71 6c   even if the sql
2c060 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65  ite_master table
2c070 20 69 73 0a 20 20 20 20 2a 2a 20 63 6f 72 72 75   is.    ** corru
2c080 70 74 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  pt. */.    sqlit
2c090 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20 22  e3_exec(p->db, "
2c0a0 53 41 56 45 50 4f 49 4e 54 20 64 75 6d 70 3b 20  SAVEPOINT dump; 
2c0b0 50 52 41 47 4d 41 20 77 72 69 74 61 62 6c 65 5f  PRAGMA writable_
2c0c0 73 63 68 65 6d 61 3d 4f 4e 22 2c 20 30 2c 20 30  schema=ON", 0, 0
2c0d0 2c 20 30 29 3b 0a 20 20 20 20 70 2d 3e 6e 45 72  , 0);.    p->nEr
2c0e0 72 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 7a  r = 0;.    if( z
2c0f0 4c 69 6b 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Like==0 ){.     
2c100 20 72 75 6e 5f 73 63 68 65 6d 61 5f 64 75 6d 70   run_schema_dump
2c110 5f 71 75 65 72 79 28 70 2c 0a 20 20 20 20 20 20  _query(p,.      
2c120 20 20 22 53 45 4c 45 43 54 20 6e 61 6d 65 2c 20    "SELECT name, 
2c130 74 79 70 65 2c 20 73 71 6c 20 46 52 4f 4d 20 73  type, sql FROM s
2c140 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 22 0a 20  qlite_master ". 
2c150 20 20 20 20 20 20 20 22 57 48 45 52 45 20 73 71         "WHERE sq
2c160 6c 20 4e 4f 54 20 4e 55 4c 4c 20 41 4e 44 20 74  l NOT NULL AND t
2c170 79 70 65 3d 3d 27 74 61 62 6c 65 27 20 41 4e 44  ype=='table' AND
2c180 20 6e 61 6d 65 21 3d 27 73 71 6c 69 74 65 5f 73   name!='sqlite_s
2c190 65 71 75 65 6e 63 65 27 22 0a 20 20 20 20 20 20  equence'".      
2c1a0 29 3b 0a 20 20 20 20 20 20 72 75 6e 5f 73 63 68  );.      run_sch
2c1b0 65 6d 61 5f 64 75 6d 70 5f 71 75 65 72 79 28 70  ema_dump_query(p
2c1c0 2c 0a 20 20 20 20 20 20 20 20 22 53 45 4c 45 43  ,.        "SELEC
2c1d0 54 20 6e 61 6d 65 2c 20 74 79 70 65 2c 20 73 71  T name, type, sq
2c1e0 6c 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61  l FROM sqlite_ma
2c1f0 73 74 65 72 20 22 0a 20 20 20 20 20 20 20 20 22  ster ".        "
2c200 57 48 45 52 45 20 6e 61 6d 65 3d 3d 27 73 71 6c  WHERE name=='sql
2c210 69 74 65 5f 73 65 71 75 65 6e 63 65 27 22 0a 20  ite_sequence'". 
2c220 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 72 75       );.      ru
2c230 6e 5f 74 61 62 6c 65 5f 64 75 6d 70 5f 71 75 65  n_table_dump_que
2c240 72 79 28 70 2c 0a 20 20 20 20 20 20 20 20 22 53  ry(p,.        "S
2c250 45 4c 45 43 54 20 73 71 6c 20 46 52 4f 4d 20 73  ELECT sql FROM s
2c260 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 22 0a 20  qlite_master ". 
2c270 20 20 20 20 20 20 20 22 57 48 45 52 45 20 73 71         "WHERE sq
2c280 6c 20 4e 4f 54 20 4e 55 4c 4c 20 41 4e 44 20 74  l NOT NULL AND t
2c290 79 70 65 20 49 4e 20 28 27 69 6e 64 65 78 27 2c  ype IN ('index',
2c2a0 27 74 72 69 67 67 65 72 27 2c 27 76 69 65 77 27  'trigger','view'
2c2b0 29 22 2c 20 30 0a 20 20 20 20 20 20 29 3b 0a 20  )", 0.      );. 
2c2c0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2c2d0 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 20 20  char *zSql;.    
2c2e0 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33    zSql = sqlite3
2c2f0 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20  _mprintf(.      
2c300 20 20 22 53 45 4c 45 43 54 20 6e 61 6d 65 2c 20    "SELECT name, 
2c310 74 79 70 65 2c 20 73 71 6c 20 46 52 4f 4d 20 73  type, sql FROM s
2c320 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 22 0a 20  qlite_master ". 
2c330 20 20 20 20 20 20 20 22 57 48 45 52 45 20 74 62         "WHERE tb
2c340 6c 5f 6e 61 6d 65 20 4c 49 4b 45 20 25 51 20 41  l_name LIKE %Q A
2c350 4e 44 20 74 79 70 65 3d 3d 27 74 61 62 6c 65 27  ND type=='table'
2c360 22 0a 20 20 20 20 20 20 20 20 22 20 20 41 4e 44  ".        "  AND
2c370 20 73 71 6c 20 4e 4f 54 20 4e 55 4c 4c 22 2c 20   sql NOT NULL", 
2c380 7a 4c 69 6b 65 29 3b 0a 20 20 20 20 20 20 72 75  zLike);.      ru
2c390 6e 5f 73 63 68 65 6d 61 5f 64 75 6d 70 5f 71 75  n_schema_dump_qu
2c3a0 65 72 79 28 70 2c 7a 53 71 6c 29 3b 0a 20 20 20  ery(p,zSql);.   
2c3b0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
2c3c0 7a 53 71 6c 29 3b 0a 20 20 20 20 20 20 7a 53 71  zSql);.      zSq
2c3d0 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  l = sqlite3_mpri
2c3e0 6e 74 66 28 0a 20 20 20 20 20 20 20 20 22 53 45  ntf(.        "SE
2c3f0 4c 45 43 54 20 73 71 6c 20 46 52 4f 4d 20 73 71  LECT sql FROM sq
2c400 6c 69 74 65 5f 6d 61 73 74 65 72 20 22 0a 20 20  lite_master ".  
2c410 20 20 20 20 20 20 22 57 48 45 52 45 20 73 71 6c        "WHERE sql
2c420 20 4e 4f 54 20 4e 55 4c 4c 22 0a 20 20 20 20 20   NOT NULL".     
2c430 20 20 20 22 20 20 41 4e 44 20 74 79 70 65 20 49     "  AND type I
2c440 4e 20 28 27 69 6e 64 65 78 27 2c 27 74 72 69 67  N ('index','trig
2c450 67 65 72 27 2c 27 76 69 65 77 27 29 22 0a 20 20  ger','view')".  
2c460 20 20 20 20 20 20 22 20 20 41 4e 44 20 74 62 6c        "  AND tbl
2c470 5f 6e 61 6d 65 20 4c 49 4b 45 20 25 51 22 2c 20  _name LIKE %Q", 
2c480 7a 4c 69 6b 65 29 3b 0a 20 20 20 20 20 20 72 75  zLike);.      ru
2c490 6e 5f 74 61 62 6c 65 5f 64 75 6d 70 5f 71 75 65  n_table_dump_que
2c4a0 72 79 28 70 2c 20 7a 53 71 6c 2c 20 30 29 3b 0a  ry(p, zSql, 0);.
2c4b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
2c4c0 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20 7d 0a  ee(zSql);.    }.
2c4d0 20 20 20 20 69 66 28 20 70 2d 3e 77 72 69 74 61      if( p->writa
2c4e0 62 6c 65 53 63 68 65 6d 61 20 29 7b 0a 20 20 20  bleSchema ){.   
2c4f0 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d     raw_printf(p-
2c500 3e 6f 75 74 2c 20 22 50 52 41 47 4d 41 20 77 72  >out, "PRAGMA wr
2c510 69 74 61 62 6c 65 5f 73 63 68 65 6d 61 3d 4f 46  itable_schema=OF
2c520 46 3b 5c 6e 22 29 3b 0a 20 20 20 20 20 20 70 2d  F;\n");.      p-
2c530 3e 77 72 69 74 61 62 6c 65 53 63 68 65 6d 61 20  >writableSchema 
2c540 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  = 0;.    }.    s
2c550 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64  qlite3_exec(p->d
2c560 62 2c 20 22 50 52 41 47 4d 41 20 77 72 69 74 61  b, "PRAGMA writa
2c570 62 6c 65 5f 73 63 68 65 6d 61 3d 4f 46 46 3b 22  ble_schema=OFF;"
2c580 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
2c590 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e  sqlite3_exec(p->
2c5a0 64 62 2c 20 22 52 45 4c 45 41 53 45 20 64 75 6d  db, "RELEASE dum
2c5b0 70 3b 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  p;", 0, 0, 0);. 
2c5c0 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d     raw_printf(p-
2c5d0 3e 6f 75 74 2c 20 70 2d 3e 6e 45 72 72 20 3f 20  >out, p->nErr ? 
2c5e0 22 52 4f 4c 4c 42 41 43 4b 3b 20 2d 2d 20 64 75  "ROLLBACK; -- du
2c5f0 65 20 74 6f 20 65 72 72 6f 72 73 5c 6e 22 20 3a  e to errors\n" :
2c600 20 22 43 4f 4d 4d 49 54 3b 5c 6e 22 29 3b 0a 20   "COMMIT;\n");. 
2c610 20 20 20 70 2d 3e 73 68 6f 77 48 65 61 64 65 72     p->showHeader
2c620 20 3d 20 73 61 76 65 64 53 68 6f 77 48 65 61 64   = savedShowHead
2c630 65 72 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69  er;.  }else..  i
2c640 66 28 20 63 3d 3d 27 65 27 20 26 26 20 73 74 72  f( c=='e' && str
2c650 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22  ncmp(azArg[0], "
2c660 65 63 68 6f 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a  echo", n)==0 ){.
2c670 20 20 20 20 69 66 28 20 6e 41 72 67 3d 3d 32 20      if( nArg==2 
2c680 29 7b 0a 20 20 20 20 20 20 73 65 74 4f 72 43 6c  ){.      setOrCl
2c690 65 61 72 46 6c 61 67 28 70 2c 20 53 48 46 4c 47  earFlag(p, SHFLG
2c6a0 5f 45 63 68 6f 2c 20 61 7a 41 72 67 5b 31 5d 29  _Echo, azArg[1])
2c6b0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
2c6c0 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74     raw_printf(st
2c6d0 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 65  derr, "Usage: .e
2c6e0 63 68 6f 20 6f 6e 7c 6f 66 66 5c 6e 22 29 3b 0a  cho on|off\n");.
2c6f0 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
2c700 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69    }.  }else..  i
2c710 66 28 20 63 3d 3d 27 65 27 20 26 26 20 73 74 72  f( c=='e' && str
2c720 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22  ncmp(azArg[0], "
2c730 65 71 70 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20  eqp", n)==0 ){. 
2c740 20 20 20 69 66 28 20 6e 41 72 67 3d 3d 32 20 29     if( nArg==2 )
2c750 7b 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 63  {.      if( strc
2c760 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 22 66 75 6c  mp(azArg[1],"ful
2c770 6c 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  l")==0 ){.      
2c780 20 20 70 2d 3e 61 75 74 6f 45 51 50 20 3d 20 41    p->autoEQP = A
2c790 55 54 4f 45 51 50 5f 66 75 6c 6c 3b 0a 20 20 20  UTOEQP_full;.   
2c7a0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72     }else if( str
2c7b0 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 22 74 72  cmp(azArg[1],"tr
2c7c0 69 67 67 65 72 22 29 3d 3d 30 20 29 7b 0a 20 20  igger")==0 ){.  
2c7d0 20 20 20 20 20 20 70 2d 3e 61 75 74 6f 45 51 50        p->autoEQP
2c7e0 20 3d 20 41 55 54 4f 45 51 50 5f 74 72 69 67 67   = AUTOEQP_trigg
2c7f0 65 72 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  er;.      }else{
2c800 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 75 74 6f  .        p->auto
2c810 45 51 50 20 3d 20 28 75 38 29 62 6f 6f 6c 65 61  EQP = (u8)boolea
2c820 6e 56 61 6c 75 65 28 61 7a 41 72 67 5b 31 5d 29  nValue(azArg[1])
2c830 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
2c840 6c 73 65 7b 0a 20 20 20 20 20 20 72 61 77 5f 70  lse{.      raw_p
2c850 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55  rintf(stderr, "U
2c860 73 61 67 65 3a 20 2e 65 71 70 20 6f 66 66 7c 6f  sage: .eqp off|o
2c870 6e 7c 74 72 69 67 67 65 72 7c 66 75 6c 6c 5c 6e  n|trigger|full\n
2c880 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31  ");.      rc = 1
2c890 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a  ;.    }.  }else.
2c8a0 0a 20 20 69 66 28 20 63 3d 3d 27 65 27 20 26 26  .  if( c=='e' &&
2c8b0 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30   strncmp(azArg[0
2c8c0 5d 2c 20 22 65 78 69 74 22 2c 20 6e 29 3d 3d 30  ], "exit", n)==0
2c8d0 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 41 72 67   ){.    if( nArg
2c8e0 3e 31 20 26 26 20 28 72 63 20 3d 20 28 69 6e 74  >1 && (rc = (int
2c8f0 29 69 6e 74 65 67 65 72 56 61 6c 75 65 28 61 7a  )integerValue(az
2c900 41 72 67 5b 31 5d 29 29 21 3d 30 20 29 20 65 78  Arg[1]))!=0 ) ex
2c910 69 74 28 72 63 29 3b 0a 20 20 20 20 72 63 20 3d  it(rc);.    rc =
2c920 20 32 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 2f   2;.  }else..  /
2c930 2a 20 54 68 65 20 22 2e 65 78 70 6c 61 69 6e 22  * The ".explain"
2c940 20 63 6f 6d 6d 61 6e 64 20 69 73 20 61 75 74 6f   command is auto
2c950 6d 61 74 69 63 20 6e 6f 77 2e 20 20 49 74 20 69  matic now.  It i
2c960 73 20 6c 61 72 67 65 6c 79 20 70 6f 69 6e 74 6c  s largely pointl
2c970 65 73 73 2e 20 20 49 74 0a 20 20 2a 2a 20 72 65  ess.  It.  ** re
2c980 74 61 69 6e 65 64 20 70 75 72 65 6c 79 20 66 6f  tained purely fo
2c990 72 20 62 61 63 6b 77 61 72 64 73 20 63 6f 6d 70  r backwards comp
2c9a0 61 74 69 62 69 6c 69 74 79 20 2a 2f 0a 20 20 69  atibility */.  i
2c9b0 66 28 20 63 3d 3d 27 65 27 20 26 26 20 73 74 72  f( c=='e' && str
2c9c0 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22  ncmp(azArg[0], "
2c9d0 65 78 70 6c 61 69 6e 22 2c 20 6e 29 3d 3d 30 20  explain", n)==0 
2c9e0 29 7b 0a 20 20 20 20 69 6e 74 20 76 61 6c 20 3d  ){.    int val =
2c9f0 20 31 3b 0a 20 20 20 20 69 66 28 20 6e 41 72 67   1;.    if( nArg
2ca00 3e 3d 32 20 29 7b 0a 20 20 20 20 20 20 69 66 28  >=2 ){.      if(
2ca10 20 73 74 72 63 6d 70 28 61 7a 41 72 67 5b 31 5d   strcmp(azArg[1]
2ca20 2c 22 61 75 74 6f 22 29 3d 3d 30 20 29 7b 0a 20  ,"auto")==0 ){. 
2ca30 20 20 20 20 20 20 20 76 61 6c 20 3d 20 39 39 3b         val = 99;
2ca40 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
2ca50 20 20 20 20 20 20 76 61 6c 20 3d 20 20 62 6f 6f        val =  boo
2ca60 6c 65 61 6e 56 61 6c 75 65 28 61 7a 41 72 67 5b  leanValue(azArg[
2ca70 31 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  1]);.      }.   
2ca80 20 7d 0a 20 20 20 20 69 66 28 20 76 61 6c 3d 3d   }.    if( val==
2ca90 31 20 26 26 20 70 2d 3e 6d 6f 64 65 21 3d 4d 4f  1 && p->mode!=MO
2caa0 44 45 5f 45 78 70 6c 61 69 6e 20 29 7b 0a 20 20  DE_Explain ){.  
2cab0 20 20 20 20 70 2d 3e 6e 6f 72 6d 61 6c 4d 6f 64      p->normalMod
2cac0 65 20 3d 20 70 2d 3e 6d 6f 64 65 3b 0a 20 20 20  e = p->mode;.   
2cad0 20 20 20 70 2d 3e 6d 6f 64 65 20 3d 20 4d 4f 44     p->mode = MOD
2cae0 45 5f 45 78 70 6c 61 69 6e 3b 0a 20 20 20 20 20  E_Explain;.     
2caf0 20 70 2d 3e 61 75 74 6f 45 78 70 6c 61 69 6e 20   p->autoExplain 
2cb00 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  = 0;.    }else i
2cb10 66 28 20 76 61 6c 3d 3d 30 20 29 7b 0a 20 20 20  f( val==0 ){.   
2cb20 20 20 20 69 66 28 20 70 2d 3e 6d 6f 64 65 3d 3d     if( p->mode==
2cb30 4d 4f 44 45 5f 45 78 70 6c 61 69 6e 20 29 20 70  MODE_Explain ) p
2cb40 2d 3e 6d 6f 64 65 20 3d 20 70 2d 3e 6e 6f 72 6d  ->mode = p->norm
2cb50 61 6c 4d 6f 64 65 3b 0a 20 20 20 20 20 20 70 2d  alMode;.      p-
2cb60 3e 61 75 74 6f 45 78 70 6c 61 69 6e 20 3d 20 30  >autoExplain = 0
2cb70 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
2cb80 76 61 6c 3d 3d 39 39 20 29 7b 0a 20 20 20 20 20  val==99 ){.     
2cb90 20 69 66 28 20 70 2d 3e 6d 6f 64 65 3d 3d 4d 4f   if( p->mode==MO
2cba0 44 45 5f 45 78 70 6c 61 69 6e 20 29 20 70 2d 3e  DE_Explain ) p->
2cbb0 6d 6f 64 65 20 3d 20 70 2d 3e 6e 6f 72 6d 61 6c  mode = p->normal
2cbc0 4d 6f 64 65 3b 0a 20 20 20 20 20 20 70 2d 3e 61  Mode;.      p->a
2cbd0 75 74 6f 45 78 70 6c 61 69 6e 20 3d 20 31 3b 0a  utoExplain = 1;.
2cbe0 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 23      }.  }else..#
2cbf0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
2cc00 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
2cc10 20 20 69 66 28 20 63 3d 3d 27 65 27 20 26 26 20    if( c=='e' && 
2cc20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d  strncmp(azArg[0]
2cc30 2c 20 22 65 78 70 65 72 74 22 2c 20 6e 29 3d 3d  , "expert", n)==
2cc40 30 20 29 7b 0a 20 20 20 20 6f 70 65 6e 5f 64 62  0 ){.    open_db
2cc50 28 70 2c 20 30 29 3b 0a 20 20 20 20 65 78 70 65  (p, 0);.    expe
2cc60 72 74 44 6f 74 43 6f 6d 6d 61 6e 64 28 70 2c 20  rtDotCommand(p, 
2cc70 61 7a 41 72 67 2c 20 6e 41 72 67 29 3b 0a 20 20  azArg, nArg);.  
2cc80 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 0a 20 20  }else.#endif..  
2cc90 69 66 28 20 63 3d 3d 27 66 27 20 26 26 20 73 74  if( c=='f' && st
2cca0 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20  rncmp(azArg[0], 
2ccb0 22 66 75 6c 6c 73 63 68 65 6d 61 22 2c 20 6e 29  "fullschema", n)
2ccc0 3d 3d 30 20 29 7b 0a 20 20 20 20 53 68 65 6c 6c  ==0 ){.    Shell
2ccd0 53 74 61 74 65 20 64 61 74 61 3b 0a 20 20 20 20  State data;.    
2cce0 63 68 61 72 20 2a 7a 45 72 72 4d 73 67 20 3d 20  char *zErrMsg = 
2ccf0 30 3b 0a 20 20 20 20 69 6e 74 20 64 6f 53 74 61  0;.    int doSta
2cd00 74 73 20 3d 20 30 3b 0a 20 20 20 20 6d 65 6d 63  ts = 0;.    memc
2cd10 70 79 28 26 64 61 74 61 2c 20 70 2c 20 73 69 7a  py(&data, p, siz
2cd20 65 6f 66 28 64 61 74 61 29 29 3b 0a 20 20 20 20  eof(data));.    
2cd30 64 61 74 61 2e 73 68 6f 77 48 65 61 64 65 72 20  data.showHeader 
2cd40 3d 20 30 3b 0a 20 20 20 20 64 61 74 61 2e 63 4d  = 0;.    data.cM
2cd50 6f 64 65 20 3d 20 64 61 74 61 2e 6d 6f 64 65 20  ode = data.mode 
2cd60 3d 20 4d 4f 44 45 5f 53 65 6d 69 3b 0a 20 20 20  = MODE_Semi;.   
2cd70 20 69 66 28 20 6e 41 72 67 3d 3d 32 20 26 26 20   if( nArg==2 && 
2cd80 6f 70 74 69 6f 6e 4d 61 74 63 68 28 61 7a 41 72  optionMatch(azAr
2cd90 67 5b 31 5d 2c 20 22 69 6e 64 65 6e 74 22 29 20  g[1], "indent") 
2cda0 29 7b 0a 20 20 20 20 20 20 64 61 74 61 2e 63 4d  ){.      data.cM
2cdb0 6f 64 65 20 3d 20 64 61 74 61 2e 6d 6f 64 65 20  ode = data.mode 
2cdc0 3d 20 4d 4f 44 45 5f 50 72 65 74 74 79 3b 0a 20  = MODE_Pretty;. 
2cdd0 20 20 20 20 20 6e 41 72 67 20 3d 20 31 3b 0a 20       nArg = 1;. 
2cde0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 41 72     }.    if( nAr
2cdf0 67 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 72 61  g!=1 ){.      ra
2ce00 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  w_printf(stderr,
2ce10 20 22 55 73 61 67 65 3a 20 2e 66 75 6c 6c 73 63   "Usage: .fullsc
2ce20 68 65 6d 61 20 3f 2d 2d 69 6e 64 65 6e 74 3f 5c  hema ?--indent?\
2ce30 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  n");.      rc = 
2ce40 31 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 65  1;.      goto me
2ce50 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b  ta_command_exit;
2ce60 0a 20 20 20 20 7d 0a 20 20 20 20 6f 70 65 6e 5f  .    }.    open_
2ce70 64 62 28 70 2c 20 30 29 3b 0a 20 20 20 20 72 63  db(p, 0);.    rc
2ce80 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28   = sqlite3_exec(
2ce90 70 2d 3e 64 62 2c 0a 20 20 20 20 20 20 20 22 53  p->db,.       "S
2cea0 45 4c 45 43 54 20 73 71 6c 20 46 52 4f 4d 22 0a  ELECT sql FROM".
2ceb0 20 20 20 20 20 20 20 22 20 20 28 53 45 4c 45 43         "  (SELEC
2cec0 54 20 73 71 6c 20 73 71 6c 2c 20 74 79 70 65 20  T sql sql, type 
2ced0 74 79 70 65 2c 20 74 62 6c 5f 6e 61 6d 65 20 74  type, tbl_name t
2cee0 62 6c 5f 6e 61 6d 65 2c 20 6e 61 6d 65 20 6e 61  bl_name, name na
2cef0 6d 65 2c 20 72 6f 77 69 64 20 78 22 0a 20 20 20  me, rowid x".   
2cf00 20 20 20 20 22 20 20 20 20 20 46 52 4f 4d 20 73      "     FROM s
2cf10 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 55 4e 49  qlite_master UNI
2cf20 4f 4e 20 41 4c 4c 22 0a 20 20 20 20 20 20 20 22  ON ALL".       "
2cf30 20 20 20 53 45 4c 45 43 54 20 73 71 6c 2c 20 74     SELECT sql, t
2cf40 79 70 65 2c 20 74 62 6c 5f 6e 61 6d 65 2c 20 6e  ype, tbl_name, n
2cf50 61 6d 65 2c 20 72 6f 77 69 64 20 46 52 4f 4d 20  ame, rowid FROM 
2cf60 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74  sqlite_temp_mast
2cf70 65 72 29 20 22 0a 20 20 20 20 20 20 20 22 57 48  er) ".       "WH
2cf80 45 52 45 20 74 79 70 65 21 3d 27 6d 65 74 61 27  ERE type!='meta'
2cf90 20 41 4e 44 20 73 71 6c 20 4e 4f 54 4e 55 4c 4c   AND sql NOTNULL
2cfa0 20 41 4e 44 20 6e 61 6d 65 20 4e 4f 54 20 4c 49   AND name NOT LI
2cfb0 4b 45 20 27 73 71 6c 69 74 65 5f 25 27 20 22 0a  KE 'sqlite_%' ".
2cfc0 20 20 20 20 20 20 20 22 4f 52 44 45 52 20 42 59         "ORDER BY
2cfd0 20 72 6f 77 69 64 22 2c 0a 20 20 20 20 20 20 20   rowid",.       
2cfe0 63 61 6c 6c 62 61 63 6b 2c 20 26 64 61 74 61 2c  callback, &data,
2cff0 20 26 7a 45 72 72 4d 73 67 0a 20 20 20 20 29 3b   &zErrMsg.    );
2d000 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
2d010 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2d020 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
2d030 74 6d 74 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  tmt;.      rc = 
2d040 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f  sqlite3_prepare_
2d050 76 32 28 70 2d 3e 64 62 2c 0a 20 20 20 20 20 20  v2(p->db,.      
2d060 20 20 20 20 20 20 20 20 20 22 53 45 4c 45 43 54           "SELECT
2d070 20 72 6f 77 69 64 20 46 52 4f 4d 20 73 71 6c 69   rowid FROM sqli
2d080 74 65 5f 6d 61 73 74 65 72 22 0a 20 20 20 20 20  te_master".     
2d090 20 20 20 20 20 20 20 20 20 20 22 20 57 48 45 52            " WHER
2d0a0 45 20 6e 61 6d 65 20 47 4c 4f 42 20 27 73 71 6c  E name GLOB 'sql
2d0b0 69 74 65 5f 73 74 61 74 5b 31 33 34 5d 27 22 2c  ite_stat[134]'",
2d0c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2d0d0 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a  -1, &pStmt, 0);.
2d0e0 20 20 20 20 20 20 64 6f 53 74 61 74 73 20 3d 20        doStats = 
2d0f0 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74  sqlite3_step(pSt
2d100 6d 74 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 3b  mt)==SQLITE_ROW;
2d110 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
2d120 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a  inalize(pStmt);.
2d130 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 64 6f      }.    if( do
2d140 53 74 61 74 73 3d 3d 30 20 29 7b 0a 20 20 20 20  Stats==0 ){.    
2d150 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e    raw_printf(p->
2d160 6f 75 74 2c 20 22 2f 2a 20 4e 6f 20 53 54 41 54  out, "/* No STAT
2d170 20 74 61 62 6c 65 73 20 61 76 61 69 6c 61 62 6c   tables availabl
2d180 65 20 2a 2f 5c 6e 22 29 3b 0a 20 20 20 20 7d 65  e */\n");.    }e
2d190 6c 73 65 7b 0a 20 20 20 20 20 20 72 61 77 5f 70  lse{.      raw_p
2d1a0 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 41  rintf(p->out, "A
2d1b0 4e 41 4c 59 5a 45 20 73 71 6c 69 74 65 5f 6d 61  NALYZE sqlite_ma
2d1c0 73 74 65 72 3b 5c 6e 22 29 3b 0a 20 20 20 20 20  ster;\n");.     
2d1d0 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d   sqlite3_exec(p-
2d1e0 3e 64 62 2c 20 22 53 45 4c 45 43 54 20 27 41 4e  >db, "SELECT 'AN
2d1f0 41 4c 59 5a 45 20 73 71 6c 69 74 65 5f 6d 61 73  ALYZE sqlite_mas
2d200 74 65 72 27 22 2c 0a 20 20 20 20 20 20 20 20 20  ter'",.         
2d210 20 20 20 20 20 20 20 20 20 20 63 61 6c 6c 62 61            callba
2d220 63 6b 2c 20 26 64 61 74 61 2c 20 26 7a 45 72 72  ck, &data, &zErr
2d230 4d 73 67 29 3b 0a 20 20 20 20 20 20 64 61 74 61  Msg);.      data
2d240 2e 63 4d 6f 64 65 20 3d 20 64 61 74 61 2e 6d 6f  .cMode = data.mo
2d250 64 65 20 3d 20 4d 4f 44 45 5f 49 6e 73 65 72 74  de = MODE_Insert
2d260 3b 0a 20 20 20 20 20 20 64 61 74 61 2e 7a 44 65  ;.      data.zDe
2d270 73 74 54 61 62 6c 65 20 3d 20 22 73 71 6c 69 74  stTable = "sqlit
2d280 65 5f 73 74 61 74 31 22 3b 0a 20 20 20 20 20 20  e_stat1";.      
2d290 73 68 65 6c 6c 5f 65 78 65 63 28 70 2c 20 22 53  shell_exec(p, "S
2d2a0 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 73 71 6c  ELECT * FROM sql
2d2b0 69 74 65 5f 73 74 61 74 31 22 2c 20 26 7a 45 72  ite_stat1", &zEr
2d2c0 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 64 61 74  rMsg);.      dat
2d2d0 61 2e 7a 44 65 73 74 54 61 62 6c 65 20 3d 20 22  a.zDestTable = "
2d2e0 73 71 6c 69 74 65 5f 73 74 61 74 33 22 3b 0a 20  sqlite_stat3";. 
2d2f0 20 20 20 20 20 73 68 65 6c 6c 5f 65 78 65 63 28       shell_exec(
2d300 70 2c 20 22 53 45 4c 45 43 54 20 2a 20 46 52 4f  p, "SELECT * FRO
2d310 4d 20 73 71 6c 69 74 65 5f 73 74 61 74 33 22 2c  M sqlite_stat3",
2d320 20 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20   &zErrMsg);.    
2d330 20 20 64 61 74 61 2e 7a 44 65 73 74 54 61 62 6c    data.zDestTabl
2d340 65 20 3d 20 22 73 71 6c 69 74 65 5f 73 74 61 74  e = "sqlite_stat
2d350 34 22 3b 0a 20 20 20 20 20 20 73 68 65 6c 6c 5f  4";.      shell_
2d360 65 78 65 63 28 70 2c 20 22 53 45 4c 45 43 54 20  exec(p, "SELECT 
2d370 2a 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 73 74  * FROM sqlite_st
2d380 61 74 34 22 2c 20 26 7a 45 72 72 4d 73 67 29 3b  at4", &zErrMsg);
2d390 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74  .      raw_print
2d3a0 66 28 70 2d 3e 6f 75 74 2c 20 22 41 4e 41 4c 59  f(p->out, "ANALY
2d3b0 5a 45 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  ZE sqlite_master
2d3c0 3b 5c 6e 22 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ;\n");.    }.  }
2d3d0 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27  else..  if( c=='
2d3e0 68 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a  h' && strncmp(az
2d3f0 41 72 67 5b 30 5d 2c 20 22 68 65 61 64 65 72 73  Arg[0], "headers
2d400 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ", n)==0 ){.    
2d410 69 66 28 20 6e 41 72 67 3d 3d 32 20 29 7b 0a 20  if( nArg==2 ){. 
2d420 20 20 20 20 20 70 2d 3e 73 68 6f 77 48 65 61 64       p->showHead
2d430 65 72 20 3d 20 62 6f 6f 6c 65 61 6e 56 61 6c 75  er = booleanValu
2d440 65 28 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20  e(azArg[1]);.   
2d450 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 61   }else{.      ra
2d460 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  w_printf(stderr,
2d470 20 22 55 73 61 67 65 3a 20 2e 68 65 61 64 65 72   "Usage: .header
2d480 73 20 6f 6e 7c 6f 66 66 5c 6e 22 29 3b 0a 20 20  s on|off\n");.  
2d490 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
2d4a0 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28  }.  }else..  if(
2d4b0 20 63 3d 3d 27 68 27 20 26 26 20 73 74 72 6e 63   c=='h' && strnc
2d4c0 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 68 65  mp(azArg[0], "he
2d4d0 6c 70 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20  lp", n)==0 ){.  
2d4e0 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d    utf8_printf(p-
2d4f0 3e 6f 75 74 2c 20 22 25 73 22 2c 20 7a 48 65 6c  >out, "%s", zHel
2d500 70 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69  p);.  }else..  i
2d510 66 28 20 63 3d 3d 27 69 27 20 26 26 20 73 74 72  f( c=='i' && str
2d520 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22  ncmp(azArg[0], "
2d530 69 6d 70 6f 72 74 22 2c 20 6e 29 3d 3d 30 20 29  import", n)==0 )
2d540 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 54 61 62  {.    char *zTab
2d550 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  le;             
2d560 20 20 2f 2a 20 49 6e 73 65 72 74 20 64 61 74 61    /* Insert data
2d570 20 69 6e 74 6f 20 74 68 69 73 20 74 61 62 6c 65   into this table
2d580 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 46   */.    char *zF
2d590 69 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ile;            
2d5a0 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 66      /* Name of f
2d5b0 69 6c 65 20 74 6f 20 65 78 74 72 61 20 63 6f 6e  ile to extra con
2d5c0 74 65 6e 74 20 66 72 6f 6d 20 2a 2f 0a 20 20 20  tent from */.   
2d5d0 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
2d5e0 53 74 6d 74 20 3d 20 4e 55 4c 4c 3b 20 2f 2a 20  Stmt = NULL; /* 
2d5f0 41 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  A statement */. 
2d600 20 20 20 69 6e 74 20 6e 43 6f 6c 3b 20 20 20 20     int nCol;    
2d610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2d620 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  * Number of colu
2d630 6d 6e 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65  mns in the table
2d640 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 42 79 74   */.    int nByt
2d650 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
2d660 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
2d670 20 62 79 74 65 73 20 69 6e 20 61 6e 20 53 51 4c   bytes in an SQL
2d680 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20 20 20 69   string */.    i
2d690 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20  nt i, j;        
2d6a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
2d6b0 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20  op counters */. 
2d6c0 20 20 20 69 6e 74 20 6e 65 65 64 43 6f 6d 6d 69     int needCommi
2d6d0 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  t;             /
2d6e0 2a 20 54 72 75 65 20 74 6f 20 43 4f 4d 4d 49 54  * True to COMMIT
2d6f0 20 6f 72 20 52 4f 4c 4c 42 41 43 4b 20 61 74 20   or ROLLBACK at 
2d700 65 6e 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  end */.    int n
2d710 53 65 70 3b 20 20 20 20 20 20 20 20 20 20 20 20  Sep;            
2d720 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
2d730 20 6f 66 20 62 79 74 65 73 20 69 6e 20 70 2d 3e   of bytes in p->
2d740 63 6f 6c 53 65 70 61 72 61 74 6f 72 5b 5d 20 2a  colSeparator[] *
2d750 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 71 6c  /.    char *zSql
2d760 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2d770 20 20 2f 2a 20 41 6e 20 53 51 4c 20 73 74 61 74    /* An SQL stat
2d780 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 49 6d 70  ement */.    Imp
2d790 6f 72 74 43 74 78 20 73 43 74 78 3b 20 20 20 20  ortCtx sCtx;    
2d7a0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 61 64           /* Read
2d7b0 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  er context */.  
2d7c0 20 20 63 68 61 72 20 2a 28 53 51 4c 49 54 45 5f    char *(SQLITE_
2d7d0 43 44 45 43 4c 20 2a 78 52 65 61 64 29 28 49 6d  CDECL *xRead)(Im
2d7e0 70 6f 72 74 43 74 78 2a 29 3b 20 2f 2a 20 46 75  portCtx*); /* Fu
2d7f0 6e 63 20 74 6f 20 72 65 61 64 20 6f 6e 65 20 76  nc to read one v
2d800 61 6c 75 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20  alue */.    int 
2d810 28 53 51 4c 49 54 45 5f 43 44 45 43 4c 20 2a 78  (SQLITE_CDECL *x
2d820 43 6c 6f 73 65 72 29 28 46 49 4c 45 2a 29 3b 20  Closer)(FILE*); 
2d830 20 20 20 20 20 2f 2a 20 46 75 6e 63 20 74 6f 20       /* Func to 
2d840 63 6c 6f 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20  close file */.. 
2d850 20 20 20 69 66 28 20 6e 41 72 67 21 3d 33 20 29     if( nArg!=3 )
2d860 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e  {.      raw_prin
2d870 74 66 28 73 74 64 65 72 72 2c 20 22 55 73 61 67  tf(stderr, "Usag
2d880 65 3a 20 2e 69 6d 70 6f 72 74 20 46 49 4c 45 20  e: .import FILE 
2d890 54 41 42 4c 45 5c 6e 22 29 3b 0a 20 20 20 20 20  TABLE\n");.     
2d8a0 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61   goto meta_comma
2d8b0 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a 20  nd_exit;.    }. 
2d8c0 20 20 20 7a 46 69 6c 65 20 3d 20 61 7a 41 72 67     zFile = azArg
2d8d0 5b 31 5d 3b 0a 20 20 20 20 7a 54 61 62 6c 65 20  [1];.    zTable 
2d8e0 3d 20 61 7a 41 72 67 5b 32 5d 3b 0a 20 20 20 20  = azArg[2];.    
2d8f0 73 65 65 6e 49 6e 74 65 72 72 75 70 74 20 3d 20  seenInterrupt = 
2d900 30 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 73  0;.    memset(&s
2d910 43 74 78 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73  Ctx, 0, sizeof(s
2d920 43 74 78 29 29 3b 0a 20 20 20 20 6f 70 65 6e 5f  Ctx));.    open_
2d930 64 62 28 70 2c 20 30 29 3b 0a 20 20 20 20 6e 53  db(p, 0);.    nS
2d940 65 70 20 3d 20 73 74 72 6c 65 6e 33 30 28 70 2d  ep = strlen30(p-
2d950 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 29 3b 0a  >colSeparator);.
2d960 20 20 20 20 69 66 28 20 6e 53 65 70 3d 3d 30 20      if( nSep==0 
2d970 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69  ){.      raw_pri
2d980 6e 74 66 28 73 74 64 65 72 72 2c 0a 20 20 20 20  ntf(stderr,.    
2d990 20 20 20 20 20 20 20 20 20 20 20 20 20 22 45 72               "Er
2d9a0 72 6f 72 3a 20 6e 6f 6e 2d 6e 75 6c 6c 20 63 6f  ror: non-null co
2d9b0 6c 75 6d 6e 20 73 65 70 61 72 61 74 6f 72 20 72  lumn separator r
2d9c0 65 71 75 69 72 65 64 20 66 6f 72 20 69 6d 70 6f  equired for impo
2d9d0 72 74 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 65  rt\n");.      re
2d9e0 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20  turn 1;.    }.  
2d9f0 20 20 69 66 28 20 6e 53 65 70 3e 31 20 29 7b 0a    if( nSep>1 ){.
2da00 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
2da10 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a  (stderr, "Error:
2da20 20 6d 75 6c 74 69 2d 63 68 61 72 61 63 74 65 72   multi-character
2da30 20 63 6f 6c 75 6d 6e 20 73 65 70 61 72 61 74 6f   column separato
2da40 72 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 22 0a  rs not allowed".
2da50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2da60 20 20 20 20 20 20 22 20 66 6f 72 20 69 6d 70 6f        " for impo
2da70 72 74 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 65  rt\n");.      re
2da80 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20  turn 1;.    }.  
2da90 20 20 6e 53 65 70 20 3d 20 73 74 72 6c 65 6e 33    nSep = strlen3
2daa0 30 28 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f  0(p->rowSeparato
2dab0 72 29 3b 0a 20 20 20 20 69 66 28 20 6e 53 65 70  r);.    if( nSep
2dac0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 61 77  ==0 ){.      raw
2dad0 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
2dae0 22 45 72 72 6f 72 3a 20 6e 6f 6e 2d 6e 75 6c 6c  "Error: non-null
2daf0 20 72 6f 77 20 73 65 70 61 72 61 74 6f 72 20 72   row separator r
2db00 65 71 75 69 72 65 64 20 66 6f 72 20 69 6d 70 6f  equired for impo
2db10 72 74 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 65  rt\n");.      re
2db20 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20  turn 1;.    }.  
2db30 20 20 69 66 28 20 6e 53 65 70 3d 3d 32 20 26 26    if( nSep==2 &&
2db40 20 70 2d 3e 6d 6f 64 65 3d 3d 4d 4f 44 45 5f 43   p->mode==MODE_C
2db50 73 76 20 26 26 20 73 74 72 63 6d 70 28 70 2d 3e  sv && strcmp(p->
2db60 72 6f 77 53 65 70 61 72 61 74 6f 72 2c 20 53 45  rowSeparator, SE
2db70 50 5f 43 72 4c 66 29 3d 3d 30 20 29 7b 0a 20 20  P_CrLf)==0 ){.  
2db80 20 20 20 20 2f 2a 20 57 68 65 6e 20 69 6d 70 6f      /* When impo
2db90 72 74 69 6e 67 20 43 53 56 20 28 6f 6e 6c 79 29  rting CSV (only)
2dba0 2c 20 69 66 20 74 68 65 20 72 6f 77 20 73 65 70  , if the row sep
2dbb0 61 72 61 74 6f 72 20 69 73 20 73 65 74 20 74 6f  arator is set to
2dbc0 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 64 65   the.      ** de
2dbd0 66 61 75 6c 74 20 6f 75 74 70 75 74 20 72 6f 77  fault output row
2dbe0 20 73 65 70 61 72 61 74 6f 72 2c 20 63 68 61 6e   separator, chan
2dbf0 67 65 20 69 74 20 74 6f 20 74 68 65 20 64 65 66  ge it to the def
2dc00 61 75 6c 74 20 69 6e 70 75 74 0a 20 20 20 20 20  ault input.     
2dc10 20 2a 2a 20 72 6f 77 20 73 65 70 61 72 61 74 6f   ** row separato
2dc20 72 2e 20 20 54 68 69 73 20 61 76 6f 69 64 73 20  r.  This avoids 
2dc30 68 61 76 69 6e 67 20 74 6f 20 6d 61 69 6e 74 61  having to mainta
2dc40 69 6e 20 64 69 66 66 65 72 65 6e 74 20 69 6e 70  in different inp
2dc50 75 74 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64 20  ut.      ** and 
2dc60 6f 75 74 70 75 74 20 72 6f 77 20 73 65 70 61 72  output row separ
2dc70 61 74 6f 72 73 2e 20 2a 2f 0a 20 20 20 20 20 20  ators. */.      
2dc80 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
2dc90 28 73 69 7a 65 6f 66 28 70 2d 3e 72 6f 77 53 65  (sizeof(p->rowSe
2dca0 70 61 72 61 74 6f 72 29 2c 20 70 2d 3e 72 6f 77  parator), p->row
2dcb0 53 65 70 61 72 61 74 6f 72 2c 20 53 45 50 5f 52  Separator, SEP_R
2dcc0 6f 77 29 3b 0a 20 20 20 20 20 20 6e 53 65 70 20  ow);.      nSep 
2dcd0 3d 20 73 74 72 6c 65 6e 33 30 28 70 2d 3e 72 6f  = strlen30(p->ro
2dce0 77 53 65 70 61 72 61 74 6f 72 29 3b 0a 20 20 20  wSeparator);.   
2dcf0 20 7d 0a 20 20 20 20 69 66 28 20 6e 53 65 70 3e   }.    if( nSep>
2dd00 31 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70  1 ){.      raw_p
2dd10 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45  rintf(stderr, "E
2dd20 72 72 6f 72 3a 20 6d 75 6c 74 69 2d 63 68 61 72  rror: multi-char
2dd30 61 63 74 65 72 20 72 6f 77 20 73 65 70 61 72 61  acter row separa
2dd40 74 6f 72 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64  tors not allowed
2dd50 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ".              
2dd60 20 20 20 20 20 20 20 20 22 20 66 6f 72 20 69 6d          " for im
2dd70 70 6f 72 74 5c 6e 22 29 3b 0a 20 20 20 20 20 20  port\n");.      
2dd80 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
2dd90 20 20 20 20 73 43 74 78 2e 7a 46 69 6c 65 20 3d      sCtx.zFile =
2dda0 20 7a 46 69 6c 65 3b 0a 20 20 20 20 73 43 74 78   zFile;.    sCtx
2ddb0 2e 6e 4c 69 6e 65 20 3d 20 31 3b 0a 20 20 20 20  .nLine = 1;.    
2ddc0 69 66 28 20 73 43 74 78 2e 7a 46 69 6c 65 5b 30  if( sCtx.zFile[0
2ddd0 5d 3d 3d 27 7c 27 20 29 7b 0a 23 69 66 64 65 66  ]=='|' ){.#ifdef
2dde0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 4f 50   SQLITE_OMIT_POP
2ddf0 45 4e 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69  EN.      raw_pri
2de00 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72  ntf(stderr, "Err
2de10 6f 72 3a 20 70 69 70 65 73 20 61 72 65 20 6e 6f  or: pipes are no
2de20 74 20 73 75 70 70 6f 72 74 65 64 20 69 6e 20 74  t supported in t
2de30 68 69 73 20 4f 53 5c 6e 22 29 3b 0a 20 20 20 20  his OS\n");.    
2de40 20 20 72 65 74 75 72 6e 20 31 3b 0a 23 65 6c 73    return 1;.#els
2de50 65 0a 20 20 20 20 20 20 73 43 74 78 2e 69 6e 20  e.      sCtx.in 
2de60 3d 20 70 6f 70 65 6e 28 73 43 74 78 2e 7a 46 69  = popen(sCtx.zFi
2de70 6c 65 2b 31 2c 20 22 72 22 29 3b 0a 20 20 20 20  le+1, "r");.    
2de80 20 20 73 43 74 78 2e 7a 46 69 6c 65 20 3d 20 22    sCtx.zFile = "
2de90 3c 70 69 70 65 3e 22 3b 0a 20 20 20 20 20 20 78  <pipe>";.      x
2dea0 43 6c 6f 73 65 72 20 3d 20 70 63 6c 6f 73 65 3b  Closer = pclose;
2deb0 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73  .#endif.    }els
2dec0 65 7b 0a 20 20 20 20 20 20 73 43 74 78 2e 69 6e  e{.      sCtx.in
2ded0 20 3d 20 66 6f 70 65 6e 28 73 43 74 78 2e 7a 46   = fopen(sCtx.zF
2dee0 69 6c 65 2c 20 22 72 62 22 29 3b 0a 20 20 20 20  ile, "rb");.    
2def0 20 20 78 43 6c 6f 73 65 72 20 3d 20 66 63 6c 6f    xCloser = fclo
2df00 73 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  se;.    }.    if
2df10 28 20 70 2d 3e 6d 6f 64 65 3d 3d 4d 4f 44 45 5f  ( p->mode==MODE_
2df20 41 73 63 69 69 20 29 7b 0a 20 20 20 20 20 20 78  Ascii ){.      x
2df30 52 65 61 64 20 3d 20 61 73 63 69 69 5f 72 65 61  Read = ascii_rea
2df40 64 5f 6f 6e 65 5f 66 69 65 6c 64 3b 0a 20 20 20  d_one_field;.   
2df50 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 78 52   }else{.      xR
2df60 65 61 64 20 3d 20 63 73 76 5f 72 65 61 64 5f 6f  ead = csv_read_o
2df70 6e 65 5f 66 69 65 6c 64 3b 0a 20 20 20 20 7d 0a  ne_field;.    }.
2df80 20 20 20 20 69 66 28 20 73 43 74 78 2e 69 6e 3d      if( sCtx.in=
2df90 3d 30 20 29 7b 0a 20 20 20 20 20 20 75 74 66 38  =0 ){.      utf8
2dfa0 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
2dfb0 22 45 72 72 6f 72 3a 20 63 61 6e 6e 6f 74 20 6f  "Error: cannot o
2dfc0 70 65 6e 20 5c 22 25 73 5c 22 5c 6e 22 2c 20 7a  pen \"%s\"\n", z
2dfd0 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 72 65 74  File);.      ret
2dfe0 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 1;.    }.   
2dff0 20 73 43 74 78 2e 63 43 6f 6c 53 65 70 20 3d 20   sCtx.cColSep = 
2e000 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 5b  p->colSeparator[
2e010 30 5d 3b 0a 20 20 20 20 73 43 74 78 2e 63 52 6f  0];.    sCtx.cRo
2e020 77 53 65 70 20 3d 20 70 2d 3e 72 6f 77 53 65 70  wSep = p->rowSep
2e030 61 72 61 74 6f 72 5b 30 5d 3b 0a 20 20 20 20 7a  arator[0];.    z
2e040 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  Sql = sqlite3_mp
2e050 72 69 6e 74 66 28 22 53 45 4c 45 43 54 20 2a 20  rintf("SELECT * 
2e060 46 52 4f 4d 20 25 73 22 2c 20 7a 54 61 62 6c 65  FROM %s", zTable
2e070 29 3b 0a 20 20 20 20 69 66 28 20 7a 53 71 6c 3d  );.    if( zSql=
2e080 3d 30 20 29 7b 0a 20 20 20 20 20 20 78 43 6c 6f  =0 ){.      xClo
2e090 73 65 72 28 73 43 74 78 2e 69 6e 29 3b 0a 20 20  ser(sCtx.in);.  
2e0a0 20 20 20 20 73 68 65 6c 6c 5f 6f 75 74 5f 6f 66      shell_out_of
2e0b0 5f 6d 65 6d 6f 72 79 28 29 3b 0a 20 20 20 20 7d  _memory();.    }
2e0c0 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 73 74 72  .    nByte = str
2e0d0 6c 65 6e 33 30 28 7a 53 71 6c 29 3b 0a 20 20 20  len30(zSql);.   
2e0e0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72   rc = sqlite3_pr
2e0f0 65 70 61 72 65 5f 76 32 28 70 2d 3e 64 62 2c 20  epare_v2(p->db, 
2e100 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74  zSql, -1, &pStmt
2e110 2c 20 30 29 3b 0a 20 20 20 20 69 6d 70 6f 72 74  , 0);.    import
2e120 5f 61 70 70 65 6e 64 5f 63 68 61 72 28 26 73 43  _append_char(&sC
2e130 74 78 2c 20 30 29 3b 20 20 20 20 2f 2a 20 54 6f  tx, 0);    /* To
2e140 20 65 6e 73 75 72 65 20 73 43 74 78 2e 7a 20 69   ensure sCtx.z i
2e150 73 20 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a 20  s allocated */. 
2e160 20 20 20 69 66 28 20 72 63 20 26 26 20 73 71 6c     if( rc && sql
2e170 69 74 65 33 5f 73 74 72 67 6c 6f 62 28 22 6e 6f  ite3_strglob("no
2e180 20 73 75 63 68 20 74 61 62 6c 65 3a 20 2a 22 2c   such table: *",
2e190 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
2e1a0 70 2d 3e 64 62 29 29 3d 3d 30 20 29 7b 0a 20 20  p->db))==0 ){.  
2e1b0 20 20 20 20 63 68 61 72 20 2a 7a 43 72 65 61 74      char *zCreat
2e1c0 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  e = sqlite3_mpri
2e1d0 6e 74 66 28 22 43 52 45 41 54 45 20 54 41 42 4c  ntf("CREATE TABL
2e1e0 45 20 25 73 22 2c 20 7a 54 61 62 6c 65 29 3b 0a  E %s", zTable);.
2e1f0 20 20 20 20 20 20 63 68 61 72 20 63 53 65 70 20        char cSep 
2e200 3d 20 27 28 27 3b 0a 20 20 20 20 20 20 77 68 69  = '(';.      whi
2e210 6c 65 28 20 78 52 65 61 64 28 26 73 43 74 78 29  le( xRead(&sCtx)
2e220 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 43 72 65   ){.        zCre
2e230 61 74 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  ate = sqlite3_mp
2e240 72 69 6e 74 66 28 22 25 7a 25 63 5c 6e 20 20 5c  rintf("%z%c\n  \
2e250 22 25 77 5c 22 20 54 45 58 54 22 2c 20 7a 43 72  "%w\" TEXT", zCr
2e260 65 61 74 65 2c 20 63 53 65 70 2c 20 73 43 74 78  eate, cSep, sCtx
2e270 2e 7a 29 3b 0a 20 20 20 20 20 20 20 20 63 53 65  .z);.        cSe
2e280 70 20 3d 20 27 2c 27 3b 0a 20 20 20 20 20 20 20  p = ',';.       
2e290 20 69 66 28 20 73 43 74 78 2e 63 54 65 72 6d 21   if( sCtx.cTerm!
2e2a0 3d 73 43 74 78 2e 63 43 6f 6c 53 65 70 20 29 20  =sCtx.cColSep ) 
2e2b0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
2e2c0 20 20 20 20 20 69 66 28 20 63 53 65 70 3d 3d 27       if( cSep=='
2e2d0 28 27 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  (' ){.        sq
2e2e0 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 72 65 61  lite3_free(zCrea
2e2f0 74 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  te);.        sql
2e300 69 74 65 33 5f 66 72 65 65 28 73 43 74 78 2e 7a  ite3_free(sCtx.z
2e310 29 3b 0a 20 20 20 20 20 20 20 20 78 43 6c 6f 73  );.        xClos
2e320 65 72 28 73 43 74 78 2e 69 6e 29 3b 0a 20 20 20  er(sCtx.in);.   
2e330 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
2e340 28 73 74 64 65 72 72 2c 22 25 73 3a 20 65 6d 70  (stderr,"%s: emp
2e350 74 79 20 66 69 6c 65 5c 6e 22 2c 20 73 43 74 78  ty file\n", sCtx
2e360 2e 7a 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 20  .zFile);.       
2e370 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
2e380 20 7d 0a 20 20 20 20 20 20 7a 43 72 65 61 74 65   }.      zCreate
2e390 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
2e3a0 74 66 28 22 25 7a 5c 6e 29 22 2c 20 7a 43 72 65  tf("%z\n)", zCre
2e3b0 61 74 65 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  ate);.      rc =
2e3c0 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d   sqlite3_exec(p-
2e3d0 3e 64 62 2c 20 7a 43 72 65 61 74 65 2c 20 30 2c  >db, zCreate, 0,
2e3e0 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71   0, 0);.      sq
2e3f0 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 72 65 61  lite3_free(zCrea
2e400 74 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  te);.      if( r
2e410 63 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66  c ){.        utf
2e420 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  8_printf(stderr,
2e430 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 25   "CREATE TABLE %
2e440 73 28 2e 2e 2e 29 20 66 61 69 6c 65 64 3a 20 25  s(...) failed: %
2e450 73 5c 6e 22 2c 20 7a 54 61 62 6c 65 2c 0a 20 20  s\n", zTable,.  
2e460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
2e470 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 2d 3e  lite3_errmsg(p->
2e480 64 62 29 29 3b 0a 20 20 20 20 20 20 20 20 73 71  db));.        sq
2e490 6c 69 74 65 33 5f 66 72 65 65 28 73 43 74 78 2e  lite3_free(sCtx.
2e4a0 7a 29 3b 0a 20 20 20 20 20 20 20 20 78 43 6c 6f  z);.        xClo
2e4b0 73 65 72 28 73 43 74 78 2e 69 6e 29 3b 0a 20 20  ser(sCtx.in);.  
2e4c0 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
2e4d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63        }.      rc
2e4e0 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61   = sqlite3_prepa
2e4f0 72 65 5f 76 32 28 70 2d 3e 64 62 2c 20 7a 53 71  re_v2(p->db, zSq
2e500 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30  l, -1, &pStmt, 0
2e510 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
2e520 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b  ite3_free(zSql);
2e530 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20  .    if( rc ){. 
2e540 20 20 20 20 20 69 66 20 28 70 53 74 6d 74 29 20       if (pStmt) 
2e550 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
2e560 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 75  (pStmt);.      u
2e570 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72  tf8_printf(stder
2e580 72 2c 22 45 72 72 6f 72 3a 20 25 73 5c 6e 22 2c  r,"Error: %s\n",
2e590 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
2e5a0 70 2d 3e 64 62 29 29 3b 0a 20 20 20 20 20 20 78  p->db));.      x
2e5b0 43 6c 6f 73 65 72 28 73 43 74 78 2e 69 6e 29 3b  Closer(sCtx.in);
2e5c0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
2e5d0 0a 20 20 20 20 7d 0a 20 20 20 20 6e 43 6f 6c 20  .    }.    nCol 
2e5e0 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
2e5f0 5f 63 6f 75 6e 74 28 70 53 74 6d 74 29 3b 0a 20  _count(pStmt);. 
2e600 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c     sqlite3_final
2e610 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20  ize(pStmt);.    
2e620 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 69  pStmt = 0;.    i
2e630 66 28 20 6e 43 6f 6c 3d 3d 30 20 29 20 72 65 74  f( nCol==0 ) ret
2e640 75 72 6e 20 30 3b 20 2f 2a 20 6e 6f 20 63 6f 6c  urn 0; /* no col
2e650 75 6d 6e 73 2c 20 6e 6f 20 65 72 72 6f 72 20 2a  umns, no error *
2e660 2f 0a 20 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c  /.    zSql = sql
2e670 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 20 6e  ite3_malloc64( n
2e680 42 79 74 65 2a 32 20 2b 20 32 30 20 2b 20 6e 43  Byte*2 + 20 + nC
2e690 6f 6c 2a 32 20 29 3b 0a 20 20 20 20 69 66 28 20  ol*2 );.    if( 
2e6a0 7a 53 71 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20  zSql==0 ){.     
2e6b0 20 78 43 6c 6f 73 65 72 28 73 43 74 78 2e 69 6e   xCloser(sCtx.in
2e6c0 29 3b 0a 20 20 20 20 20 20 73 68 65 6c 6c 5f 6f  );.      shell_o
2e6d0 75 74 5f 6f 66 5f 6d 65 6d 6f 72 79 28 29 3b 0a  ut_of_memory();.
2e6e0 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
2e6f0 33 5f 73 6e 70 72 69 6e 74 66 28 6e 42 79 74 65  3_snprintf(nByte
2e700 2b 32 30 2c 20 7a 53 71 6c 2c 20 22 49 4e 53 45  +20, zSql, "INSE
2e710 52 54 20 49 4e 54 4f 20 5c 22 25 77 5c 22 20 56  RT INTO \"%w\" V
2e720 41 4c 55 45 53 28 3f 22 2c 20 7a 54 61 62 6c 65  ALUES(?", zTable
2e730 29 3b 0a 20 20 20 20 6a 20 3d 20 73 74 72 6c 65  );.    j = strle
2e740 6e 33 30 28 7a 53 71 6c 29 3b 0a 20 20 20 20 66  n30(zSql);.    f
2e750 6f 72 28 69 3d 31 3b 20 69 3c 6e 43 6f 6c 3b 20  or(i=1; i<nCol; 
2e760 69 2b 2b 29 7b 0a 20 20 20 20 20 20 7a 53 71 6c  i++){.      zSql
2e770 5b 6a 2b 2b 5d 20 3d 20 27 2c 27 3b 0a 20 20 20  [j++] = ',';.   
2e780 20 20 20 7a 53 71 6c 5b 6a 2b 2b 5d 20 3d 20 27     zSql[j++] = '
2e790 3f 27 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 53  ?';.    }.    zS
2e7a0 71 6c 5b 6a 2b 2b 5d 20 3d 20 27 29 27 3b 0a 20  ql[j++] = ')';. 
2e7b0 20 20 20 7a 53 71 6c 5b 6a 5d 20 3d 20 30 3b 0a     zSql[j] = 0;.
2e7c0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2e7d0 5f 70 72 65 70 61 72 65 5f 76 32 28 70 2d 3e 64  _prepare_v2(p->d
2e7e0 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53  b, zSql, -1, &pS
2e7f0 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  tmt, 0);.    sql
2e800 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b  ite3_free(zSql);
2e810 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20  .    if( rc ){. 
2e820 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
2e830 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a  (stderr, "Error:
2e840 20 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f   %s\n", sqlite3_
2e850 65 72 72 6d 73 67 28 70 2d 3e 64 62 29 29 3b 0a  errmsg(p->db));.
2e860 20 20 20 20 20 20 69 66 20 28 70 53 74 6d 74 29        if (pStmt)
2e870 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
2e880 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20  e(pStmt);.      
2e890 78 43 6c 6f 73 65 72 28 73 43 74 78 2e 69 6e 29  xCloser(sCtx.in)
2e8a0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  ;.      return 1
2e8b0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 65 65 64  ;.    }.    need
2e8c0 43 6f 6d 6d 69 74 20 3d 20 73 71 6c 69 74 65 33  Commit = sqlite3
2e8d0 5f 67 65 74 5f 61 75 74 6f 63 6f 6d 6d 69 74 28  _get_autocommit(
2e8e0 70 2d 3e 64 62 29 3b 0a 20 20 20 20 69 66 28 20  p->db);.    if( 
2e8f0 6e 65 65 64 43 6f 6d 6d 69 74 20 29 20 73 71 6c  needCommit ) sql
2e900 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c  ite3_exec(p->db,
2e910 20 22 42 45 47 49 4e 22 2c 20 30 2c 20 30 2c 20   "BEGIN", 0, 0, 
2e920 30 29 3b 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20  0);.    do{.    
2e930 20 20 69 6e 74 20 73 74 61 72 74 4c 69 6e 65 20    int startLine 
2e940 3d 20 73 43 74 78 2e 6e 4c 69 6e 65 3b 0a 20 20  = sCtx.nLine;.  
2e950 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
2e960 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Col; i++){.     
2e970 20 20 20 63 68 61 72 20 2a 7a 20 3d 20 78 52 65     char *z = xRe
2e980 61 64 28 26 73 43 74 78 29 3b 0a 20 20 20 20 20  ad(&sCtx);.     
2e990 20 20 20 2f 2a 0a 20 20 20 20 20 20 20 20 2a 2a     /*.        **
2e9a0 20 44 69 64 20 77 65 20 72 65 61 63 68 20 65 6e   Did we reach en
2e9b0 64 2d 6f 66 2d 66 69 6c 65 20 62 65 66 6f 72 65  d-of-file before
2e9c0 20 66 69 6e 64 69 6e 67 20 61 6e 79 20 63 6f 6c   finding any col
2e9d0 75 6d 6e 73 3f 0a 20 20 20 20 20 20 20 20 2a 2a  umns?.        **
2e9e0 20 49 66 20 73 6f 2c 20 73 74 6f 70 20 69 6e 73   If so, stop ins
2e9f0 74 65 61 64 20 6f 66 20 4e 55 4c 4c 20 66 69 6c  tead of NULL fil
2ea00 6c 69 6e 67 20 74 68 65 20 72 65 6d 61 69 6e 69  ling the remaini
2ea10 6e 67 20 63 6f 6c 75 6d 6e 73 2e 0a 20 20 20 20  ng columns..    
2ea20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
2ea30 66 28 20 7a 3d 3d 30 20 26 26 20 69 3d 3d 30 20  f( z==0 && i==0 
2ea40 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20  ) break;.       
2ea50 20 2f 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 44   /*.        ** D
2ea60 69 64 20 77 65 20 72 65 61 63 68 20 65 6e 64 2d  id we reach end-
2ea70 6f 66 2d 66 69 6c 65 20 4f 52 20 65 6e 64 2d 6f  of-file OR end-o
2ea80 66 2d 6c 69 6e 65 20 62 65 66 6f 72 65 20 66 69  f-line before fi
2ea90 6e 64 69 6e 67 20 61 6e 79 0a 20 20 20 20 20 20  nding any.      
2eaa0 20 20 2a 2a 20 63 6f 6c 75 6d 6e 73 20 69 6e 20    ** columns in 
2eab0 41 53 43 49 49 20 6d 6f 64 65 3f 20 20 49 66 20  ASCII mode?  If 
2eac0 73 6f 2c 20 73 74 6f 70 20 69 6e 73 74 65 61 64  so, stop instead
2ead0 20 6f 66 20 4e 55 4c 4c 20 66 69 6c 6c 69 6e 67   of NULL filling
2eae0 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20  .        ** the 
2eaf0 72 65 6d 61 69 6e 69 6e 67 20 63 6f 6c 75 6d 6e  remaining column
2eb00 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  s..        */.  
2eb10 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6d 6f 64        if( p->mod
2eb20 65 3d 3d 4d 4f 44 45 5f 41 73 63 69 69 20 26 26  e==MODE_Ascii &&
2eb30 20 28 7a 3d 3d 30 20 7c 7c 20 7a 5b 30 5d 3d 3d   (z==0 || z[0]==
2eb40 30 29 20 26 26 20 69 3d 3d 30 20 29 20 62 72 65  0) && i==0 ) bre
2eb50 61 6b 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  ak;.        sqli
2eb60 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 28 70 53  te3_bind_text(pS
2eb70 74 6d 74 2c 20 69 2b 31 2c 20 7a 2c 20 2d 31 2c  tmt, i+1, z, -1,
2eb80 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e   SQLITE_TRANSIEN
2eb90 54 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  T);.        if( 
2eba0 69 3c 6e 43 6f 6c 2d 31 20 26 26 20 73 43 74 78  i<nCol-1 && sCtx
2ebb0 2e 63 54 65 72 6d 21 3d 73 43 74 78 2e 63 43 6f  .cTerm!=sCtx.cCo
2ebc0 6c 53 65 70 20 29 7b 0a 20 20 20 20 20 20 20 20  lSep ){.        
2ebd0 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74    utf8_printf(st
2ebe0 64 65 72 72 2c 20 22 25 73 3a 25 64 3a 20 65 78  derr, "%s:%d: ex
2ebf0 70 65 63 74 65 64 20 25 64 20 63 6f 6c 75 6d 6e  pected %d column
2ec00 73 20 62 75 74 20 66 6f 75 6e 64 20 25 64 20 2d  s but found %d -
2ec10 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   ".             
2ec20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 66 69               "fi
2ec30 6c 6c 69 6e 67 20 74 68 65 20 72 65 73 74 20 77  lling the rest w
2ec40 69 74 68 20 4e 55 4c 4c 5c 6e 22 2c 0a 20 20 20  ith NULL\n",.   
2ec50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ec60 20 20 20 20 20 20 20 73 43 74 78 2e 7a 46 69 6c         sCtx.zFil
2ec70 65 2c 20 73 74 61 72 74 4c 69 6e 65 2c 20 6e 43  e, startLine, nC
2ec80 6f 6c 2c 20 69 2b 31 29 3b 0a 20 20 20 20 20 20  ol, i+1);.      
2ec90 20 20 20 20 69 20 2b 3d 20 32 3b 0a 20 20 20 20      i += 2;.    
2eca0 20 20 20 20 20 20 77 68 69 6c 65 28 20 69 3c 3d        while( i<=
2ecb0 6e 43 6f 6c 20 29 7b 20 73 71 6c 69 74 65 33 5f  nCol ){ sqlite3_
2ecc0 62 69 6e 64 5f 6e 75 6c 6c 28 70 53 74 6d 74 2c  bind_null(pStmt,
2ecd0 20 69 29 3b 20 69 2b 2b 3b 20 7d 0a 20 20 20 20   i); i++; }.    
2ece0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
2ecf0 20 20 20 20 69 66 28 20 73 43 74 78 2e 63 54 65      if( sCtx.cTe
2ed00 72 6d 3d 3d 73 43 74 78 2e 63 43 6f 6c 53 65 70  rm==sCtx.cColSep
2ed10 20 29 7b 0a 20 20 20 20 20 20 20 20 64 6f 7b 0a   ){.        do{.
2ed20 20 20 20 20 20 20 20 20 20 20 78 52 65 61 64 28            xRead(
2ed30 26 73 43 74 78 29 3b 0a 20 20 20 20 20 20 20 20  &sCtx);.        
2ed40 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d    i++;.        }
2ed50 77 68 69 6c 65 28 20 73 43 74 78 2e 63 54 65 72  while( sCtx.cTer
2ed60 6d 3d 3d 73 43 74 78 2e 63 43 6f 6c 53 65 70 20  m==sCtx.cColSep 
2ed70 29 3b 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f  );.        utf8_
2ed80 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
2ed90 25 73 3a 25 64 3a 20 65 78 70 65 63 74 65 64 20  %s:%d: expected 
2eda0 25 64 20 63 6f 6c 75 6d 6e 73 20 62 75 74 20 66  %d columns but f
2edb0 6f 75 6e 64 20 25 64 20 2d 20 22 0a 20 20 20 20  ound %d - ".    
2edc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2edd0 20 20 20 20 22 65 78 74 72 61 73 20 69 67 6e 6f      "extras igno
2ede0 72 65 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  red\n",.        
2edf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ee00 73 43 74 78 2e 7a 46 69 6c 65 2c 20 73 74 61 72  sCtx.zFile, star
2ee10 74 4c 69 6e 65 2c 20 6e 43 6f 6c 2c 20 69 29 3b  tLine, nCol, i);
2ee20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
2ee30 66 28 20 69 3e 3d 6e 43 6f 6c 20 29 7b 0a 20 20  f( i>=nCol ){.  
2ee40 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74        sqlite3_st
2ee50 65 70 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20  ep(pStmt);.     
2ee60 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
2ee70 72 65 73 65 74 28 70 53 74 6d 74 29 3b 0a 20 20  reset(pStmt);.  
2ee80 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
2ee90 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2eea0 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
2eeb0 28 73 74 64 65 72 72 2c 20 22 25 73 3a 25 64 3a  (stderr, "%s:%d:
2eec0 20 49 4e 53 45 52 54 20 66 61 69 6c 65 64 3a 20   INSERT failed: 
2eed0 25 73 5c 6e 22 2c 20 73 43 74 78 2e 7a 46 69 6c  %s\n", sCtx.zFil
2eee0 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
2eef0 20 20 20 20 20 20 20 20 20 73 74 61 72 74 4c 69           startLi
2ef00 6e 65 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d  ne, sqlite3_errm
2ef10 73 67 28 70 2d 3e 64 62 29 29 3b 0a 20 20 20 20  sg(p->db));.    
2ef20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
2ef30 20 20 7d 77 68 69 6c 65 28 20 73 43 74 78 2e 63    }while( sCtx.c
2ef40 54 65 72 6d 21 3d 45 4f 46 20 29 3b 0a 0a 20 20  Term!=EOF );..  
2ef50 20 20 78 43 6c 6f 73 65 72 28 73 43 74 78 2e 69    xCloser(sCtx.i
2ef60 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  n);.    sqlite3_
2ef70 66 72 65 65 28 73 43 74 78 2e 7a 29 3b 0a 20 20  free(sCtx.z);.  
2ef80 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69    sqlite3_finali
2ef90 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 69  ze(pStmt);.    i
2efa0 66 28 20 6e 65 65 64 43 6f 6d 6d 69 74 20 29 20  f( needCommit ) 
2efb0 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e  sqlite3_exec(p->
2efc0 64 62 2c 20 22 43 4f 4d 4d 49 54 22 2c 20 30 2c  db, "COMMIT", 0,
2efd0 20 30 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 0a   0, 0);.  }else.
2efe0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2eff0 55 4e 54 45 53 54 41 42 4c 45 0a 20 20 69 66 28  UNTESTABLE.  if(
2f000 20 63 3d 3d 27 69 27 20 26 26 20 73 74 72 6e 63   c=='i' && strnc
2f010 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 69 6d  mp(azArg[0], "im
2f020 70 6f 73 74 65 72 22 2c 20 6e 29 3d 3d 30 20 29  poster", n)==0 )
2f030 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 71 6c  {.    char *zSql
2f040 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c  ;.    char *zCol
2f050 6c 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 73 71  list = 0;.    sq
2f060 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
2f070 74 3b 0a 20 20 20 20 69 6e 74 20 74 6e 75 6d 20  t;.    int tnum 
2f080 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  = 0;.    int i;.
2f090 20 20 20 20 69 66 28 20 21 28 6e 41 72 67 3d 3d      if( !(nArg==
2f0a0 33 20 7c 7c 20 28 6e 41 72 67 3d 3d 32 20 26 26  3 || (nArg==2 &&
2f0b0 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70   sqlite3_stricmp
2f0c0 28 61 7a 41 72 67 5b 31 5d 2c 22 6f 66 66 22 29  (azArg[1],"off")
2f0d0 3d 3d 30 29 29 20 29 7b 0a 20 20 20 20 20 20 75  ==0)) ){.      u
2f0e0 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72  tf8_printf(stder
2f0f0 72 2c 20 22 55 73 61 67 65 3a 20 2e 69 6d 70 6f  r, "Usage: .impo
2f100 73 74 65 72 20 49 4e 44 45 58 20 49 4d 50 4f 53  ster INDEX IMPOS
2f110 54 45 52 5c 6e 22 0a 20 20 20 20 20 20 20 20 20  TER\n".         
2f120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f130 20 22 20 20 20 20 20 20 20 2e 69 6d 70 6f 73 74   "       .impost
2f140 65 72 20 6f 66 66 5c 6e 22 29 3b 0a 20 20 20 20  er off\n");.    
2f150 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20    rc = 1;.      
2f160 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e  goto meta_comman
2f170 64 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a 20 20  d_exit;.    }.  
2f180 20 20 6f 70 65 6e 5f 64 62 28 70 2c 20 30 29 3b    open_db(p, 0);
2f190 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3d 3d 32  .    if( nArg==2
2f1a0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
2f1b0 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53  3_test_control(S
2f1c0 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 49  QLITE_TESTCTRL_I
2f1d0 4d 50 4f 53 54 45 52 2c 20 70 2d 3e 64 62 2c 20  MPOSTER, p->db, 
2f1e0 22 6d 61 69 6e 22 2c 20 30 2c 20 31 29 3b 0a 20  "main", 0, 1);. 
2f1f0 20 20 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63       goto meta_c
2f200 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20  ommand_exit;.   
2f210 20 7d 0a 20 20 20 20 7a 53 71 6c 20 3d 20 73 71   }.    zSql = sq
2f220 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 53  lite3_mprintf("S
2f230 45 4c 45 43 54 20 72 6f 6f 74 70 61 67 65 20 46  ELECT rootpage F
2f240 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  ROM sqlite_maste
2f250 72 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r".             
2f260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20                " 
2f270 57 48 45 52 45 20 6e 61 6d 65 3d 27 25 71 27 20  WHERE name='%q' 
2f280 41 4e 44 20 74 79 70 65 3d 27 69 6e 64 65 78 27  AND type='index'
2f290 22 2c 20 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20  ", azArg[1]);.  
2f2a0 20 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72    sqlite3_prepar
2f2b0 65 5f 76 32 28 70 2d 3e 64 62 2c 20 7a 53 71 6c  e_v2(p->db, zSql
2f2c0 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29  , -1, &pStmt, 0)
2f2d0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
2f2e0 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20 69 66  ee(zSql);.    if
2f2f0 28 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70  ( sqlite3_step(p
2f300 53 74 6d 74 29 3d 3d 53 51 4c 49 54 45 5f 52 4f  Stmt)==SQLITE_RO
2f310 57 20 29 7b 0a 20 20 20 20 20 20 74 6e 75 6d 20  W ){.      tnum 
2f320 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
2f330 5f 69 6e 74 28 70 53 74 6d 74 2c 20 30 29 3b 0a  _int(pStmt, 0);.
2f340 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
2f350 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74  3_finalize(pStmt
2f360 29 3b 0a 20 20 20 20 69 66 28 20 74 6e 75 6d 3d  );.    if( tnum=
2f370 3d 30 20 29 7b 0a 20 20 20 20 20 20 75 74 66 38  =0 ){.      utf8
2f380 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
2f390 22 6e 6f 20 73 75 63 68 20 69 6e 64 65 78 3a 20  "no such index: 
2f3a0 5c 22 25 73 5c 22 5c 6e 22 2c 20 61 7a 41 72 67  \"%s\"\n", azArg
2f3b0 5b 31 5d 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  [1]);.      rc =
2f3c0 20 31 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d   1;.      goto m
2f3d0 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74  eta_command_exit
2f3e0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 53 71 6c  ;.    }.    zSql
2f3f0 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
2f400 74 66 28 22 50 52 41 47 4d 41 20 69 6e 64 65 78  tf("PRAGMA index
2f410 5f 78 69 6e 66 6f 3d 27 25 71 27 22 2c 20 61 7a  _xinfo='%q'", az
2f420 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20 72 63 20  Arg[1]);.    rc 
2f430 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72  = sqlite3_prepar
2f440 65 5f 76 32 28 70 2d 3e 64 62 2c 20 7a 53 71 6c  e_v2(p->db, zSql
2f450 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29  , -1, &pStmt, 0)
2f460 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
2f470 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20 69 20  ee(zSql);.    i 
2f480 3d 20 30 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  = 0;.    while( 
2f490 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74  sqlite3_step(pSt
2f4a0 6d 74 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20  mt)==SQLITE_ROW 
2f4b0 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 7a 4c  ){.      char zL
2f4c0 61 62 65 6c 5b 32 30 5d 3b 0a 20 20 20 20 20 20  abel[20];.      
2f4d0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c  const char *zCol
2f4e0 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29   = (const char*)
2f4f0 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
2f500 65 78 74 28 70 53 74 6d 74 2c 32 29 3b 0a 20 20  ext(pStmt,2);.  
2f510 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20 69      i++;.      i
2f520 66 28 20 7a 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20  f( zCol==0 ){.  
2f530 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
2f540 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 74  3_column_int(pSt
2f550 6d 74 2c 31 29 3d 3d 2d 31 20 29 7b 0a 20 20 20  mt,1)==-1 ){.   
2f560 20 20 20 20 20 20 20 7a 43 6f 6c 20 3d 20 22 5f         zCol = "_
2f570 52 4f 57 49 44 5f 22 3b 0a 20 20 20 20 20 20 20  ROWID_";.       
2f580 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2f590 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
2f5a0 74 66 28 73 69 7a 65 6f 66 28 7a 4c 61 62 65 6c  tf(sizeof(zLabel
2f5b0 29 2c 7a 4c 61 62 65 6c 2c 22 65 78 70 72 25 64  ),zLabel,"expr%d
2f5c0 22 2c 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ",i);.          
2f5d0 7a 43 6f 6c 20 3d 20 7a 4c 61 62 65 6c 3b 0a 20  zCol = zLabel;. 
2f5e0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
2f5f0 0a 20 20 20 20 20 20 69 66 28 20 7a 43 6f 6c 6c  .      if( zColl
2f600 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ist==0 ){.      
2f610 20 20 7a 43 6f 6c 6c 69 73 74 20 3d 20 73 71 6c    zCollist = sql
2f620 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 5c 22  ite3_mprintf("\"
2f630 25 77 5c 22 22 2c 20 7a 43 6f 6c 29 3b 0a 20 20  %w\"", zCol);.  
2f640 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2f650 20 20 20 7a 43 6f 6c 6c 69 73 74 20 3d 20 73 71     zCollist = sq
2f660 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25  lite3_mprintf("%
2f670 7a 2c 5c 22 25 77 5c 22 22 2c 20 7a 43 6f 6c 6c  z,\"%w\"", zColl
2f680 69 73 74 2c 20 7a 43 6f 6c 29 3b 0a 20 20 20 20  ist, zCol);.    
2f690 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71    }.    }.    sq
2f6a0 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
2f6b0 53 74 6d 74 29 3b 0a 20 20 20 20 7a 53 71 6c 20  Stmt);.    zSql 
2f6c0 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
2f6d0 66 28 0a 20 20 20 20 20 20 20 20 20 20 22 43 52  f(.          "CR
2f6e0 45 41 54 45 20 54 41 42 4c 45 20 5c 22 25 77 5c  EATE TABLE \"%w\
2f6f0 22 28 25 73 2c 50 52 49 4d 41 52 59 20 4b 45 59  "(%s,PRIMARY KEY
2f700 28 25 73 29 29 57 49 54 48 4f 55 54 20 52 4f 57  (%s))WITHOUT ROW
2f710 49 44 22 2c 0a 20 20 20 20 20 20 20 20 20 20 61  ID",.          a
2f720 7a 41 72 67 5b 32 5d 2c 20 7a 43 6f 6c 6c 69 73  zArg[2], zCollis
2f730 74 2c 20 7a 43 6f 6c 6c 69 73 74 29 3b 0a 20 20  t, zCollist);.  
2f740 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
2f750 43 6f 6c 6c 69 73 74 29 3b 0a 20 20 20 20 72 63  Collist);.    rc
2f760 20 3d 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f   = sqlite3_test_
2f770 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54  control(SQLITE_T
2f780 45 53 54 43 54 52 4c 5f 49 4d 50 4f 53 54 45 52  ESTCTRL_IMPOSTER
2f790 2c 20 70 2d 3e 64 62 2c 20 22 6d 61 69 6e 22 2c  , p->db, "main",
2f7a0 20 31 2c 20 74 6e 75 6d 29 3b 0a 20 20 20 20 69   1, tnum);.    i
2f7b0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2f7c0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
2f7d0 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64  qlite3_exec(p->d
2f7e0 62 2c 20 7a 53 71 6c 2c 20 30 2c 20 30 2c 20 30  b, zSql, 0, 0, 0
2f7f0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
2f800 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51  _test_control(SQ
2f810 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 49 4d  LITE_TESTCTRL_IM
2f820 50 4f 53 54 45 52 2c 20 70 2d 3e 64 62 2c 20 22  POSTER, p->db, "
2f830 6d 61 69 6e 22 2c 20 30 2c 20 30 29 3b 0a 20 20  main", 0, 0);.  
2f840 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
2f850 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
2f860 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72  f(stderr, "Error
2f870 20 69 6e 20 5b 25 73 5d 3a 20 25 73 5c 6e 22 2c   in [%s]: %s\n",
2f880 20 7a 53 71 6c 2c 20 73 71 6c 69 74 65 33 5f 65   zSql, sqlite3_e
2f890 72 72 6d 73 67 28 70 2d 3e 64 62 29 29 3b 0a 20  rrmsg(p->db));. 
2f8a0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2f8b0 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
2f8c0 73 74 64 6f 75 74 2c 20 22 25 73 3b 5c 6e 22 2c  stdout, "%s;\n",
2f8d0 20 7a 53 71 6c 29 3b 0a 20 20 20 20 20 20 20 20   zSql);.        
2f8e0 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 6f 75  raw_printf(stdou
2f8f0 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 22 57  t,.           "W
2f900 41 52 4e 49 4e 47 3a 20 77 72 69 74 69 6e 67 20  ARNING: writing 
2f910 74 6f 20 61 6e 20 69 6d 70 6f 73 74 65 72 20 74  to an imposter t
2f920 61 62 6c 65 20 77 69 6c 6c 20 63 6f 72 72 75 70  able will corrup
2f930 74 20 74 68 65 20 69 6e 64 65 78 21 5c 6e 22 0a  t the index!\n".
2f940 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
2f950 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
2f960 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73      raw_printf(s
2f970 74 64 65 72 72 2c 20 22 53 51 4c 49 54 45 5f 54  tderr, "SQLITE_T
2f980 45 53 54 43 54 52 4c 5f 49 4d 50 4f 53 54 45 52  ESTCTRL_IMPOSTER
2f990 20 72 65 74 75 72 6e 73 20 25 64 5c 6e 22 2c 20   returns %d\n", 
2f9a0 72 63 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  rc);.      rc = 
2f9b0 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  1;.    }.    sql
2f9c0 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b  ite3_free(zSql);
2f9d0 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 20  .  }else.#endif 
2f9e0 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  /* !defined(SQLI
2f9f0 54 45 5f 4f 4d 49 54 5f 54 45 53 54 5f 43 4f 4e  TE_OMIT_TEST_CON
2fa00 54 52 4f 4c 29 20 2a 2f 0a 0a 23 69 66 64 65 66  TROL) */..#ifdef
2fa10 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49   SQLITE_ENABLE_I
2fa20 4f 54 52 41 43 45 0a 20 20 69 66 28 20 63 3d 3d  OTRACE.  if( c==
2fa30 27 69 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61  'i' && strncmp(a
2fa40 7a 41 72 67 5b 30 5d 2c 20 22 69 6f 74 72 61 63  zArg[0], "iotrac
2fa50 65 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20  e", n)==0 ){.   
2fa60 20 53 51 4c 49 54 45 5f 41 50 49 20 65 78 74 65   SQLITE_API exte
2fa70 72 6e 20 76 6f 69 64 20 28 53 51 4c 49 54 45 5f  rn void (SQLITE_
2fa80 43 44 45 43 4c 20 2a 73 71 6c 69 74 65 33 49 6f  CDECL *sqlite3Io
2fa90 54 72 61 63 65 29 28 63 6f 6e 73 74 20 63 68 61  Trace)(const cha
2faa0 72 2a 2c 20 2e 2e 2e 29 3b 0a 20 20 20 20 69 66  r*, ...);.    if
2fab0 28 20 69 6f 74 72 61 63 65 20 26 26 20 69 6f 74  ( iotrace && iot
2fac0 72 61 63 65 21 3d 73 74 64 6f 75 74 20 29 20 66  race!=stdout ) f
2fad0 63 6c 6f 73 65 28 69 6f 74 72 61 63 65 29 3b 0a  close(iotrace);.
2fae0 20 20 20 20 69 6f 74 72 61 63 65 20 3d 20 30 3b      iotrace = 0;
2faf0 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3c 32 20  .    if( nArg<2 
2fb00 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
2fb10 49 6f 54 72 61 63 65 20 3d 20 30 3b 0a 20 20 20  IoTrace = 0;.   
2fb20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d   }else if( strcm
2fb30 70 28 61 7a 41 72 67 5b 31 5d 2c 20 22 2d 22 29  p(azArg[1], "-")
2fb40 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
2fb50 69 74 65 33 49 6f 54 72 61 63 65 20 3d 20 69 6f  ite3IoTrace = io
2fb60 74 72 61 63 65 50 72 69 6e 74 66 3b 0a 20 20 20  tracePrintf;.   
2fb70 20 20 20 69 6f 74 72 61 63 65 20 3d 20 73 74 64     iotrace = std
2fb80 6f 75 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  out;.    }else{.
2fb90 20 20 20 20 20 20 69 6f 74 72 61 63 65 20 3d 20        iotrace = 
2fba0 66 6f 70 65 6e 28 61 7a 41 72 67 5b 31 5d 2c 20  fopen(azArg[1], 
2fbb0 22 77 22 29 3b 0a 20 20 20 20 20 20 69 66 28 20  "w");.      if( 
2fbc0 69 6f 74 72 61 63 65 3d 3d 30 20 29 7b 0a 20 20  iotrace==0 ){.  
2fbd0 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
2fbe0 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72  f(stderr, "Error
2fbf0 3a 20 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 5c 22  : cannot open \"
2fc00 25 73 5c 22 5c 6e 22 2c 20 61 7a 41 72 67 5b 31  %s\"\n", azArg[1
2fc10 5d 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  ]);.        sqli
2fc20 74 65 33 49 6f 54 72 61 63 65 20 3d 20 30 3b 0a  te3IoTrace = 0;.
2fc30 20 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a          rc = 1;.
2fc40 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2fc50 20 20 20 20 20 73 71 6c 69 74 65 33 49 6f 54 72       sqlite3IoTr
2fc60 61 63 65 20 3d 20 69 6f 74 72 61 63 65 50 72 69  ace = iotracePri
2fc70 6e 74 66 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ntf;.      }.   
2fc80 20 7d 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69   }.  }else.#endi
2fc90 66 0a 0a 20 20 69 66 28 20 63 3d 3d 27 6c 27 20  f..  if( c=='l' 
2fca0 26 26 20 6e 3e 3d 35 20 26 26 20 73 74 72 6e 63  && n>=5 && strnc
2fcb0 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 6c 69  mp(azArg[0], "li
2fcc0 6d 69 74 73 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a  mits", n)==0 ){.
2fcd0 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
2fce0 20 73 74 72 75 63 74 20 7b 0a 20 20 20 20 20 20   struct {.      
2fcf0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4c 69   const char *zLi
2fd00 6d 69 74 4e 61 6d 65 3b 20 20 20 2f 2a 20 4e 61  mitName;   /* Na
2fd10 6d 65 20 6f 66 20 61 20 6c 69 6d 69 74 20 2a 2f  me of a limit */
2fd20 0a 20 20 20 20 20 20 20 69 6e 74 20 6c 69 6d 69  .       int limi
2fd30 74 43 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20  tCode;          
2fd40 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 63 6f 64    /* Integer cod
2fd50 65 20 66 6f 72 20 74 68 61 74 20 6c 69 6d 69 74  e for that limit
2fd60 20 2a 2f 0a 20 20 20 20 7d 20 61 4c 69 6d 69 74   */.    } aLimit
2fd70 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 7b 20 22  [] = {.      { "
2fd80 6c 65 6e 67 74 68 22 2c 20 20 20 20 20 20 20 20  length",        
2fd90 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4c          SQLITE_L
2fda0 49 4d 49 54 5f 4c 45 4e 47 54 48 20 20 20 20 20  IMIT_LENGTH     
2fdb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
2fdc0 2c 0a 20 20 20 20 20 20 7b 20 22 73 71 6c 5f 6c  ,.      { "sql_l
2fdd0 65 6e 67 74 68 22 2c 20 20 20 20 20 20 20 20 20  ength",         
2fde0 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f     SQLITE_LIMIT_
2fdf0 53 51 4c 5f 4c 45 4e 47 54 48 20 20 20 20 20 20  SQL_LENGTH      
2fe00 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
2fe10 20 20 20 7b 20 22 63 6f 6c 75 6d 6e 22 2c 20 20     { "column",  
2fe20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
2fe30 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d  LITE_LIMIT_COLUM
2fe40 4e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  N               
2fe50 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20       },.      { 
2fe60 22 65 78 70 72 5f 64 65 70 74 68 22 2c 20 20 20  "expr_depth",   
2fe70 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
2fe80 4c 49 4d 49 54 5f 45 58 50 52 5f 44 45 50 54 48  LIMIT_EXPR_DEPTH
2fe90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fea0 7d 2c 0a 20 20 20 20 20 20 7b 20 22 63 6f 6d 70  },.      { "comp
2feb0 6f 75 6e 64 5f 73 65 6c 65 63 74 22 2c 20 20 20  ound_select",   
2fec0 20 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54      SQLITE_LIMIT
2fed0 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54  _COMPOUND_SELECT
2fee0 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
2fef0 20 20 20 20 7b 20 22 76 64 62 65 5f 6f 70 22 2c      { "vdbe_op",
2ff00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
2ff10 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 44 42 45  QLITE_LIMIT_VDBE
2ff20 5f 4f 50 20 20 20 20 20 20 20 20 20 20 20 20 20  _OP             
2ff30 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b        },.      {
2ff40 20 22 66 75 6e 63 74 69 6f 6e 5f 61 72 67 22 2c   "function_arg",
2ff50 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
2ff60 5f 4c 49 4d 49 54 5f 46 55 4e 43 54 49 4f 4e 5f  _LIMIT_FUNCTION_
2ff70 41 52 47 20 20 20 20 20 20 20 20 20 20 20 20 20  ARG             
2ff80 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 61 74 74   },.      { "att
2ff90 61 63 68 65 64 22 2c 20 20 20 20 20 20 20 20 20  ached",         
2ffa0 20 20 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49       SQLITE_LIMI
2ffb0 54 5f 41 54 54 41 43 48 45 44 20 20 20 20 20 20  T_ATTACHED      
2ffc0 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
2ffd0 20 20 20 20 20 7b 20 22 6c 69 6b 65 5f 70 61 74       { "like_pat
2ffe0 74 65 72 6e 5f 6c 65 6e 67 74 68 22 2c 20 20 20  tern_length",   
2fff0 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 49 4b  SQLITE_LIMIT_LIK
30000 45 5f 50 41 54 54 45 52 4e 5f 4c 45 4e 47 54 48  E_PATTERN_LENGTH
30010 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20         },.      
30020 7b 20 22 76 61 72 69 61 62 6c 65 5f 6e 75 6d 62  { "variable_numb
30030 65 72 22 2c 20 20 20 20 20 20 20 53 51 4c 49 54  er",       SQLIT
30040 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c 45  E_LIMIT_VARIABLE
30050 5f 4e 55 4d 42 45 52 20 20 20 20 20 20 20 20 20  _NUMBER         
30060 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 74 72    },.      { "tr
30070 69 67 67 65 72 5f 64 65 70 74 68 22 2c 20 20 20  igger_depth",   
30080 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d        SQLITE_LIM
30090 49 54 5f 54 52 49 47 47 45 52 5f 44 45 50 54 48  IT_TRIGGER_DEPTH
300a0 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
300b0 20 20 20 20 20 20 7b 20 22 77 6f 72 6b 65 72 5f        { "worker_
300c0 74 68 72 65 61 64 73 22 2c 20 20 20 20 20 20 20  threads",       
300d0 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 57 4f   SQLITE_LIMIT_WO
300e0 52 4b 45 52 5f 54 48 52 45 41 44 53 20 20 20 20  RKER_THREADS    
300f0 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7d          },.    }
30100 3b 0a 20 20 20 20 69 6e 74 20 69 2c 20 6e 32 3b  ;.    int i, n2;
30110 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28 70 2c 20  .    open_db(p, 
30120 30 29 3b 0a 20 20 20 20 69 66 28 20 6e 41 72 67  0);.    if( nArg
30130 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 66 6f 72  ==1 ){.      for
30140 28 69 3d 30 3b 20 69 3c 41 72 72 61 79 53 69 7a  (i=0; i<ArraySiz
30150 65 28 61 4c 69 6d 69 74 29 3b 20 69 2b 2b 29 7b  e(aLimit); i++){
30160 0a 20 20 20 20 20 20 20 20 70 72 69 6e 74 66 28  .        printf(
30170 22 25 32 30 73 20 25 64 5c 6e 22 2c 20 61 4c 69  "%20s %d\n", aLi
30180 6d 69 74 5b 69 5d 2e 7a 4c 69 6d 69 74 4e 61 6d  mit[i].zLimitNam
30190 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
301a0 20 20 73 71 6c 69 74 65 33 5f 6c 69 6d 69 74 28    sqlite3_limit(
301b0 70 2d 3e 64 62 2c 20 61 4c 69 6d 69 74 5b 69 5d  p->db, aLimit[i]
301c0 2e 6c 69 6d 69 74 43 6f 64 65 2c 20 2d 31 29 29  .limitCode, -1))
301d0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
301e0 6c 73 65 20 69 66 28 20 6e 41 72 67 3e 33 20 29  lse if( nArg>3 )
301f0 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e  {.      raw_prin
30200 74 66 28 73 74 64 65 72 72 2c 20 22 55 73 61 67  tf(stderr, "Usag
30210 65 3a 20 2e 6c 69 6d 69 74 20 4e 41 4d 45 20 3f  e: .limit NAME ?
30220 4e 45 57 2d 56 41 4c 55 45 3f 5c 6e 22 29 3b 0a  NEW-VALUE?\n");.
30230 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
30240 20 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f      goto meta_co
30250 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20  mmand_exit;.    
30260 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74  }else{.      int
30270 20 69 4c 69 6d 69 74 20 3d 20 2d 31 3b 0a 20 20   iLimit = -1;.  
30280 20 20 20 20 6e 32 20 3d 20 73 74 72 6c 65 6e 33      n2 = strlen3
30290 30 28 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20  0(azArg[1]);.   
302a0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 41 72     for(i=0; i<Ar
302b0 72 61 79 53 69 7a 65 28 61 4c 69 6d 69 74 29 3b  raySize(aLimit);
302c0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   i++){.        i
302d0 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72 6e 69  f( sqlite3_strni
302e0 63 6d 70 28 61 4c 69 6d 69 74 5b 69 5d 2e 7a 4c  cmp(aLimit[i].zL
302f0 69 6d 69 74 4e 61 6d 65 2c 20 61 7a 41 72 67 5b  imitName, azArg[
30300 31 5d 2c 20 6e 32 29 3d 3d 30 20 29 7b 0a 20 20  1], n2)==0 ){.  
30310 20 20 20 20 20 20 20 20 69 66 28 20 69 4c 69 6d          if( iLim
30320 69 74 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20  it<0 ){.        
30330 20 20 20 20 69 4c 69 6d 69 74 20 3d 20 69 3b 0a      iLimit = i;.
30340 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
30350 0a 20 20 20 20 20 20 20 20 20 20 20 20 75 74 66  .            utf
30360 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  8_printf(stderr,
30370 20 22 61 6d 62 69 67 75 6f 75 73 20 6c 69 6d 69   "ambiguous limi
30380 74 3a 20 5c 22 25 73 5c 22 5c 6e 22 2c 20 61 7a  t: \"%s\"\n", az
30390 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20 20 20 20  Arg[1]);.       
303a0 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20       rc = 1;.   
303b0 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 65           goto me
303c0 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b  ta_command_exit;
303d0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
303e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
303f0 20 20 20 20 20 69 66 28 20 69 4c 69 6d 69 74 3c       if( iLimit<
30400 30 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66  0 ){.        utf
30410 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  8_printf(stderr,
30420 20 22 75 6e 6b 6e 6f 77 6e 20 6c 69 6d 69 74 3a   "unknown limit:
30430 20 5c 22 25 73 5c 22 5c 6e 22 0a 20 20 20 20 20   \"%s\"\n".     
30440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30450 20 20 20 22 65 6e 74 65 72 20 5c 22 2e 6c 69 6d     "enter \".lim
30460 69 74 73 5c 22 20 77 69 74 68 20 6e 6f 20 61 72  its\" with no ar
30470 67 75 6d 65 6e 74 73 20 66 6f 72 20 61 20 6c 69  guments for a li
30480 73 74 2e 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  st.\n",.        
30490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
304a0 20 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20   azArg[1]);.    
304b0 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
304c0 20 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f      goto meta_co
304d0 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20  mmand_exit;.    
304e0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6e 41    }.      if( nA
304f0 72 67 3d 3d 33 20 29 7b 0a 20 20 20 20 20 20 20  rg==3 ){.       
30500 20 73 71 6c 69 74 65 33 5f 6c 69 6d 69 74 28 70   sqlite3_limit(p
30510 2d 3e 64 62 2c 20 61 4c 69 6d 69 74 5b 69 4c 69  ->db, aLimit[iLi
30520 6d 69 74 5d 2e 6c 69 6d 69 74 43 6f 64 65 2c 0a  mit].limitCode,.
30530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30540 20 20 20 20 20 20 28 69 6e 74 29 69 6e 74 65 67        (int)integ
30550 65 72 56 61 6c 75 65 28 61 7a 41 72 67 5b 32 5d  erValue(azArg[2]
30560 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ));.      }.    
30570 20 20 70 72 69 6e 74 66 28 22 25 32 30 73 20 25    printf("%20s %
30580 64 5c 6e 22 2c 20 61 4c 69 6d 69 74 5b 69 4c 69  d\n", aLimit[iLi
30590 6d 69 74 5d 2e 7a 4c 69 6d 69 74 4e 61 6d 65 2c  mit].zLimitName,
305a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71  .             sq
305b0 6c 69 74 65 33 5f 6c 69 6d 69 74 28 70 2d 3e 64  lite3_limit(p->d
305c0 62 2c 20 61 4c 69 6d 69 74 5b 69 4c 69 6d 69 74  b, aLimit[iLimit
305d0 5d 2e 6c 69 6d 69 74 43 6f 64 65 2c 20 2d 31 29  ].limitCode, -1)
305e0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  );.    }.  }else
305f0 0a 0a 20 20 69 66 28 20 63 3d 3d 27 6c 27 20 26  ..  if( c=='l' &
30600 26 20 6e 3e 32 20 26 26 20 73 74 72 6e 63 6d 70  & n>2 && strncmp
30610 28 61 7a 41 72 67 5b 30 5d 2c 20 22 6c 69 6e 74  (azArg[0], "lint
30620 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ", n)==0 ){.    
30630 6f 70 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a 20  open_db(p, 0);. 
30640 20 20 20 6c 69 6e 74 44 6f 74 43 6f 6d 6d 61 6e     lintDotComman
30650 64 28 70 2c 20 61 7a 41 72 67 2c 20 6e 41 72 67  d(p, azArg, nArg
30660 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a 23 69 66 6e  );.  }else..#ifn
30670 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
30680 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 0a 20  LOAD_EXTENSION. 
30690 20 69 66 28 20 63 3d 3d 27 6c 27 20 26 26 20 73   if( c=='l' && s
306a0 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c  trncmp(azArg[0],
306b0 20 22 6c 6f 61 64 22 2c 20 6e 29 3d 3d 30 20 29   "load", n)==0 )
306c0 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  {.    const char
306d0 20 2a 7a 46 69 6c 65 2c 20 2a 7a 50 72 6f 63 3b   *zFile, *zProc;
306e0 0a 20 20 20 20 63 68 61 72 20 2a 7a 45 72 72 4d  .    char *zErrM
306f0 73 67 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  sg = 0;.    if( 
30700 6e 41 72 67 3c 32 20 29 7b 0a 20 20 20 20 20 20  nArg<2 ){.      
30710 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72  raw_printf(stder
30720 72 2c 20 22 55 73 61 67 65 3a 20 2e 6c 6f 61 64  r, "Usage: .load
30730 20 46 49 4c 45 20 3f 45 4e 54 52 59 50 4f 49 4e   FILE ?ENTRYPOIN
30740 54 3f 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 63  T?\n");.      rc
30750 20 3d 20 31 3b 0a 20 20 20 20 20 20 67 6f 74 6f   = 1;.      goto
30760 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78   meta_command_ex
30770 69 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 46  it;.    }.    zF
30780 69 6c 65 20 3d 20 61 7a 41 72 67 5b 31 5d 3b 0a  ile = azArg[1];.
30790 20 20 20 20 7a 50 72 6f 63 20 3d 20 6e 41 72 67      zProc = nArg
307a0 3e 3d 33 20 3f 20 61 7a 41 72 67 5b 32 5d 20 3a  >=3 ? azArg[2] :
307b0 20 30 3b 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28   0;.    open_db(
307c0 70 2c 20 30 29 3b 0a 20 20 20 20 72 63 20 3d 20  p, 0);.    rc = 
307d0 73 71 6c 69 74 65 33 5f 6c 6f 61 64 5f 65 78 74  sqlite3_load_ext
307e0 65 6e 73 69 6f 6e 28 70 2d 3e 64 62 2c 20 7a 46  ension(p->db, zF
307f0 69 6c 65 2c 20 7a 50 72 6f 63 2c 20 26 7a 45 72  ile, zProc, &zEr
30800 72 4d 73 67 29 3b 0a 20 20 20 20 69 66 28 20 72  rMsg);.    if( r
30810 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
30820 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
30830 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72  f(stderr, "Error
30840 3a 20 25 73 5c 6e 22 2c 20 7a 45 72 72 4d 73 67  : %s\n", zErrMsg
30850 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
30860 5f 66 72 65 65 28 7a 45 72 72 4d 73 67 29 3b 0a  _free(zErrMsg);.
30870 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
30880 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64    }.  }else.#end
30890 69 66 0a 0a 20 20 69 66 28 20 63 3d 3d 27 6c 27  if..  if( c=='l'
308a0 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72   && strncmp(azAr
308b0 67 5b 30 5d 2c 20 22 6c 6f 67 22 2c 20 6e 29 3d  g[0], "log", n)=
308c0 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 41  =0 ){.    if( nA
308d0 72 67 21 3d 32 20 29 7b 0a 20 20 20 20 20 20 72  rg!=2 ){.      r
308e0 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  aw_printf(stderr
308f0 2c 20 22 55 73 61 67 65 3a 20 2e 6c 6f 67 20 46  , "Usage: .log F
30900 49 4c 45 4e 41 4d 45 5c 6e 22 29 3b 0a 20 20 20  ILENAME\n");.   
30910 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d     rc = 1;.    }
30920 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 6f 6e 73  else{.      cons
30930 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 20 3d 20  t char *zFile = 
30940 61 7a 41 72 67 5b 31 5d 3b 0a 20 20 20 20 20 20  azArg[1];.      
30950 6f 75 74 70 75 74 5f 66 69 6c 65 5f 63 6c 6f 73  output_file_clos
30960 65 28 70 2d 3e 70 4c 6f 67 29 3b 0a 20 20 20 20  e(p->pLog);.    
30970 20 20 70 2d 3e 70 4c 6f 67 20 3d 20 6f 75 74 70    p->pLog = outp
30980 75 74 5f 66 69 6c 65 5f 6f 70 65 6e 28 7a 46 69  ut_file_open(zFi
30990 6c 65 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20  le, 0);.    }.  
309a0 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d  }else..  if( c==
309b0 27 6d 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61  'm' && strncmp(a
309c0 7a 41 72 67 5b 30 5d 2c 20 22 6d 6f 64 65 22 2c  zArg[0], "mode",
309d0 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 63 6f   n)==0 ){.    co
309e0 6e 73 74 20 63 68 61 72 20 2a 7a 4d 6f 64 65 20  nst char *zMode 
309f0 3d 20 6e 41 72 67 3e 3d 32 20 3f 20 61 7a 41 72  = nArg>=2 ? azAr
30a00 67 5b 31 5d 20 3a 20 22 22 3b 0a 20 20 20 20 69  g[1] : "";.    i
30a10 6e 74 20 6e 32 20 3d 20 73 74 72 6c 65 6e 33 30  nt n2 = strlen30
30a20 28 7a 4d 6f 64 65 29 3b 0a 20 20 20 20 69 6e 74  (zMode);.    int
30a30 20 63 32 20 3d 20 7a 4d 6f 64 65 5b 30 5d 3b 0a   c2 = zMode[0];.
30a40 20 20 20 20 69 66 28 20 63 32 3d 3d 27 6c 27 20      if( c2=='l' 
30a50 26 26 20 6e 32 3e 32 20 26 26 20 73 74 72 6e 63  && n2>2 && strnc
30a60 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 22 6c 69 6e  mp(azArg[1],"lin
30a70 65 73 22 2c 6e 32 29 3d 3d 30 20 29 7b 0a 20 20  es",n2)==0 ){.  
30a80 20 20 20 20 70 2d 3e 6d 6f 64 65 20 3d 20 4d 4f      p->mode = MO
30a90 44 45 5f 4c 69 6e 65 3b 0a 20 20 20 20 20 20 73  DE_Line;.      s
30aa0 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
30ab0 73 69 7a 65 6f 66 28 70 2d 3e 72 6f 77 53 65 70  sizeof(p->rowSep
30ac0 61 72 61 74 6f 72 29 2c 20 70 2d 3e 72 6f 77 53  arator), p->rowS
30ad0 65 70 61 72 61 74 6f 72 2c 20 53 45 50 5f 52 6f  eparator, SEP_Ro
30ae0 77 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  w);.    }else if
30af0 28 20 63 32 3d 3d 27 63 27 20 26 26 20 73 74 72  ( c2=='c' && str
30b00 6e 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 22 63  ncmp(azArg[1],"c
30b10 6f 6c 75 6d 6e 73 22 2c 6e 32 29 3d 3d 30 20 29  olumns",n2)==0 )
30b20 7b 0a 20 20 20 20 20 20 70 2d 3e 6d 6f 64 65 20  {.      p->mode 
30b30 3d 20 4d 4f 44 45 5f 43 6f 6c 75 6d 6e 3b 0a 20  = MODE_Column;. 
30b40 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
30b50 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 70 2d 3e  rintf(sizeof(p->
30b60 72 6f 77 53 65 70 61 72 61 74 6f 72 29 2c 20 70  rowSeparator), p
30b70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 2c 20  ->rowSeparator, 
30b80 53 45 50 5f 52 6f 77 29 3b 0a 20 20 20 20 7d 65  SEP_Row);.    }e
30b90 6c 73 65 20 69 66 28 20 63 32 3d 3d 27 6c 27 20  lse if( c2=='l' 
30ba0 26 26 20 6e 32 3e 32 20 26 26 20 73 74 72 6e 63  && n2>2 && strnc
30bb0 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 22 6c 69 73  mp(azArg[1],"lis
30bc0 74 22 2c 6e 32 29 3d 3d 30 20 29 7b 0a 20 20 20  t",n2)==0 ){.   
30bd0 20 20 20 70 2d 3e 6d 6f 64 65 20 3d 20 4d 4f 44     p->mode = MOD
30be0 45 5f 4c 69 73 74 3b 0a 20 20 20 20 20 20 73 71  E_List;.      sq
30bf0 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
30c00 69 7a 65 6f 66 28 70 2d 3e 63 6f 6c 53 65 70 61  izeof(p->colSepa
30c10 72 61 74 6f 72 29 2c 20 70 2d 3e 63 6f 6c 53 65  rator), p->colSe
30c20 70 61 72 61 74 6f 72 2c 20 53 45 50 5f 43 6f 6c  parator, SEP_Col
30c30 75 6d 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  umn);.      sqli
30c40 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
30c50 65 6f 66 28 70 2d 3e 72 6f 77 53 65 70 61 72 61  eof(p->rowSepara
30c60 74 6f 72 29 2c 20 70 2d 3e 72 6f 77 53 65 70 61  tor), p->rowSepa
30c70 72 61 74 6f 72 2c 20 53 45 50 5f 52 6f 77 29 3b  rator, SEP_Row);
30c80 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63  .    }else if( c
30c90 32 3d 3d 27 68 27 20 26 26 20 73 74 72 6e 63 6d  2=='h' && strncm
30ca0 70 28 61 7a 41 72 67 5b 31 5d 2c 22 68 74 6d 6c  p(azArg[1],"html
30cb0 22 2c 6e 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ",n2)==0 ){.    
30cc0 20 20 70 2d 3e 6d 6f 64 65 20 3d 20 4d 4f 44 45    p->mode = MODE
30cd0 5f 48 74 6d 6c 3b 0a 20 20 20 20 7d 65 6c 73 65  _Html;.    }else
30ce0 20 69 66 28 20 63 32 3d 3d 27 74 27 20 26 26 20   if( c2=='t' && 
30cf0 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 31 5d  strncmp(azArg[1]
30d00 2c 22 74 63 6c 22 2c 6e 32 29 3d 3d 30 20 29 7b  ,"tcl",n2)==0 ){
30d10 0a 20 20 20 20 20 20 70 2d 3e 6d 6f 64 65 20 3d  .      p->mode =
30d20 20 4d 4f 44 45 5f 54 63 6c 3b 0a 20 20 20 20 20   MODE_Tcl;.     
30d30 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
30d40 66 28 73 69 7a 65 6f 66 28 70 2d 3e 63 6f 6c 53  f(sizeof(p->colS
30d50 65 70 61 72 61 74 6f 72 29 2c 20 70 2d 3e 63 6f  eparator), p->co
30d60 6c 53 65 70 61 72 61 74 6f 72 2c 20 53 45 50 5f  lSeparator, SEP_
30d70 53 70 61 63 65 29 3b 0a 20 20 20 20 20 20 73 71  Space);.      sq
30d80 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
30d90 69 7a 65 6f 66 28 70 2d 3e 72 6f 77 53 65 70 61  izeof(p->rowSepa
30da0 72 61 74 6f 72 29 2c 20 70 2d 3e 72 6f 77 53 65  rator), p->rowSe
30db0 70 61 72 61 74 6f 72 2c 20 53 45 50 5f 52 6f 77  parator, SEP_Row
30dc0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
30dd0 20 63 32 3d 3d 27 63 27 20 26 26 20 73 74 72 6e   c2=='c' && strn
30de0 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 22 63 73  cmp(azArg[1],"cs
30df0 76 22 2c 6e 32 29 3d 3d 30 20 29 7b 0a 20 20 20  v",n2)==0 ){.   
30e00 20 20 20 70 2d 3e 6d 6f 64 65 20 3d 20 4d 4f 44     p->mode = MOD
30e10 45 5f 43 73 76 3b 0a 20 20 20 20 20 20 73 71 6c  E_Csv;.      sql
30e20 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
30e30 7a 65 6f 66 28 70 2d 3e 63 6f 6c 53 65 70 61 72  zeof(p->colSepar
30e40 61 74 6f 72 29 2c 20 70 2d 3e 63 6f 6c 53 65 70  ator), p->colSep
30e50 61 72 61 74 6f 72 2c 20 53 45 50 5f 43 6f 6d 6d  arator, SEP_Comm
30e60 61 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  a);.      sqlite
30e70 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
30e80 66 28 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f  f(p->rowSeparato
30e90 72 29 2c 20 70 2d 3e 72 6f 77 53 65 70 61 72 61  r), p->rowSepara
30ea0 74 6f 72 2c 20 53 45 50 5f 43 72 4c 66 29 3b 0a  tor, SEP_CrLf);.
30eb0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 32      }else if( c2
30ec0 3d 3d 27 74 27 20 26 26 20 73 74 72 6e 63 6d 70  =='t' && strncmp
30ed0 28 61 7a 41 72 67 5b 31 5d 2c 22 74 61 62 73 22  (azArg[1],"tabs"
30ee0 2c 6e 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ,n2)==0 ){.     
30ef0 20 70 2d 3e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f   p->mode = MODE_
30f00 4c 69 73 74 3b 0a 20 20 20 20 20 20 73 71 6c 69  List;.      sqli
30f10 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
30f20 65 6f 66 28 70 2d 3e 63 6f 6c 53 65 70 61 72 61  eof(p->colSepara
30f30 74 6f 72 29 2c 20 70 2d 3e 63 6f 6c 53 65 70 61  tor), p->colSepa
30f40 72 61 74 6f 72 2c 20 53 45 50 5f 54 61 62 29 3b  rator, SEP_Tab);
30f50 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63  .    }else if( c
30f60 32 3d 3d 27 69 27 20 26 26 20 73 74 72 6e 63 6d  2=='i' && strncm
30f70 70 28 61 7a 41 72 67 5b 31 5d 2c 22 69 6e 73 65  p(azArg[1],"inse
30f80 72 74 22 2c 6e 32 29 3d 3d 30 20 29 7b 0a 20 20  rt",n2)==0 ){.  
30f90 20 20 20 20 70 2d 3e 6d 6f 64 65 20 3d 20 4d 4f      p->mode = MO
30fa0 44 45 5f 49 6e 73 65 72 74 3b 0a 20 20 20 20 20  DE_Insert;.     
30fb0 20 73 65 74 5f 74 61 62 6c 65 5f 6e 61 6d 65 28   set_table_name(
30fc0 70 2c 20 6e 41 72 67 3e 3d 33 20 3f 20 61 7a 41  p, nArg>=3 ? azA
30fd0 72 67 5b 32 5d 20 3a 20 22 74 61 62 6c 65 22 29  rg[2] : "table")
30fe0 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
30ff0 63 32 3d 3d 27 71 27 20 26 26 20 73 74 72 6e 63  c2=='q' && strnc
31000 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 22 71 75 6f  mp(azArg[1],"quo
31010 74 65 22 2c 6e 32 29 3d 3d 30 20 29 7b 0a 20 20  te",n2)==0 ){.  
31020 20 20 20 20 70 2d 3e 6d 6f 64 65 20 3d 20 4d 4f      p->mode = MO
31030 44 45 5f 51 75 6f 74 65 3b 0a 20 20 20 20 7d 65  DE_Quote;.    }e
31040 6c 73 65 20 69 66 28 20 63 32 3d 3d 27 61 27 20  lse if( c2=='a' 
31050 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67  && strncmp(azArg
31060 5b 31 5d 2c 22 61 73 63 69 69 22 2c 6e 32 29 3d  [1],"ascii",n2)=
31070 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6d  =0 ){.      p->m
31080 6f 64 65 20 3d 20 4d 4f 44 45 5f 41 73 63 69 69  ode = MODE_Ascii
31090 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
310a0 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
310b0 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 29  p->colSeparator)
310c0 2c 20 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f  , p->colSeparato
310d0 72 2c 20 53 45 50 5f 55 6e 69 74 29 3b 0a 20 20  r, SEP_Unit);.  
310e0 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
310f0 69 6e 74 66 28 73 69 7a 65 6f 66 28 70 2d 3e 72  intf(sizeof(p->r
31100 6f 77 53 65 70 61 72 61 74 6f 72 29 2c 20 70 2d  owSeparator), p-
31110 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 2c 20 53  >rowSeparator, S
31120 45 50 5f 52 65 63 6f 72 64 29 3b 0a 20 20 20 20  EP_Record);.    
31130 7d 65 6c 73 65 20 69 66 28 20 6e 41 72 67 3d 3d  }else if( nArg==
31140 31 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70  1 ){.      raw_p
31150 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 63  rintf(p->out, "c
31160 75 72 72 65 6e 74 20 6f 75 74 70 75 74 20 6d 6f  urrent output mo
31170 64 65 3a 20 25 73 5c 6e 22 2c 20 6d 6f 64 65 44  de: %s\n", modeD
31180 65 73 63 72 5b 70 2d 3e 6d 6f 64 65 5d 29 3b 0a  escr[p->mode]);.
31190 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
311a0 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65   raw_printf(stde
311b0 72 72 2c 20 22 45 72 72 6f 72 3a 20 6d 6f 64 65  rr, "Error: mode
311c0 20 73 68 6f 75 6c 64 20 62 65 20 6f 6e 65 20 6f   should be one o
311d0 66 3a 20 22 0a 20 20 20 20 20 20 20 20 20 22 61  f: ".         "a
311e0 73 63 69 69 20 63 6f 6c 75 6d 6e 20 63 73 76 20  scii column csv 
311f0 68 74 6d 6c 20 69 6e 73 65 72 74 20 6c 69 6e 65  html insert line
31200 20 6c 69 73 74 20 71 75 6f 74 65 20 74 61 62 73   list quote tabs
31210 20 74 63 6c 5c 6e 22 29 3b 0a 20 20 20 20 20 20   tcl\n");.      
31220 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  rc = 1;.    }.  
31230 20 20 70 2d 3e 63 4d 6f 64 65 20 3d 20 70 2d 3e    p->cMode = p->
31240 6d 6f 64 65 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20  mode;.  }else.. 
31250 20 69 66 28 20 63 3d 3d 27 6e 27 20 26 26 20 73   if( c=='n' && s
31260 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c  trncmp(azArg[0],
31270 20 22 6e 75 6c 6c 76 61 6c 75 65 22 2c 20 6e 29   "nullvalue", n)
31280 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6e  ==0 ){.    if( n
31290 41 72 67 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20  Arg==2 ){.      
312a0 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
312b0 28 73 69 7a 65 6f 66 28 70 2d 3e 6e 75 6c 6c 56  (sizeof(p->nullV
312c0 61 6c 75 65 29 2c 20 70 2d 3e 6e 75 6c 6c 56 61  alue), p->nullVa
312d0 6c 75 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  lue,.           
312e0 20 20 20 20 20 20 20 20 20 20 20 20 22 25 2e 2a              "%.*
312f0 73 22 2c 20 28 69 6e 74 29 41 72 72 61 79 53 69  s", (int)ArraySi
31300 7a 65 28 70 2d 3e 6e 75 6c 6c 56 61 6c 75 65 29  ze(p->nullValue)
31310 2d 31 2c 20 61 7a 41 72 67 5b 31 5d 29 3b 0a 20  -1, azArg[1]);. 
31320 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
31330 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72  raw_printf(stder
31340 72 2c 20 22 55 73 61 67 65 3a 20 2e 6e 75 6c 6c  r, "Usage: .null
31350 76 61 6c 75 65 20 53 54 52 49 4e 47 5c 6e 22 29  value STRING\n")
31360 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a  ;.      rc = 1;.
31370 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20      }.  }else.. 
31380 20 69 66 28 20 63 3d 3d 27 6f 27 20 26 26 20 73   if( c=='o' && s
31390 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c  trncmp(azArg[0],
313a0 20 22 6f 70 65 6e 22 2c 20 6e 29 3d 3d 30 20 26   "open", n)==0 &
313b0 26 20 6e 3e 3d 32 20 29 7b 0a 20 20 20 20 63 68  & n>=2 ){.    ch
313c0 61 72 20 2a 7a 4e 65 77 46 69 6c 65 6e 61 6d 65  ar *zNewFilename
313d0 3b 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68  ;  /* Name of th
313e0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
313f0 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 20 20 69  to open */.    i
31400 6e 74 20 69 4e 61 6d 65 20 3d 20 31 3b 20 20 20  nt iName = 1;   
31410 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20      /* Index in 
31420 61 7a 41 72 67 5b 5d 20 6f 66 20 74 68 65 20 66  azArg[] of the f
31430 69 6c 65 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 69  ilename */.    i
31440 6e 74 20 6e 65 77 46 6c 61 67 20 3d 20 30 3b 20  nt newFlag = 0; 
31450 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 64      /* True to d
31460 65 6c 65 74 65 20 66 69 6c 65 20 62 65 66 6f 72  elete file befor
31470 65 20 6f 70 65 6e 69 6e 67 20 2a 2f 0a 20 20 20  e opening */.   
31480 20 2f 2a 20 43 6c 6f 73 65 20 74 68 65 20 65 78   /* Close the ex
31490 69 73 74 69 6e 67 20 64 61 74 61 62 61 73 65 20  isting database 
314a0 2a 2f 0a 20 20 20 20 73 65 73 73 69 6f 6e 5f 63  */.    session_c
314b0 6c 6f 73 65 5f 61 6c 6c 28 70 29 3b 0a 20 20 20  lose_all(p);.   
314c0 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 70   sqlite3_close(p
314d0 2d 3e 64 62 29 3b 0a 20 20 20 20 70 2d 3e 64 62  ->db);.    p->db
314e0 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 7a 44 62   = 0;.    p->zDb
314f0 46 69 6c 65 6e 61 6d 65 20 3d 20 30 3b 0a 20 20  Filename = 0;.  
31500 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
31510 2d 3e 7a 46 72 65 65 4f 6e 43 6c 6f 73 65 29 3b  ->zFreeOnClose);
31520 0a 20 20 20 20 70 2d 3e 7a 46 72 65 65 4f 6e 43  .    p->zFreeOnC
31530 6c 6f 73 65 20 3d 20 30 3b 0a 20 20 20 20 70 2d  lose = 0;.    p-
31540 3e 6f 70 65 6e 4d 6f 64 65 20 3d 20 53 48 45 4c  >openMode = SHEL
31550 4c 5f 4f 50 45 4e 5f 55 4e 53 50 45 43 3b 0a 20  L_OPEN_UNSPEC;. 
31560 20 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20     /* Check for 
31570 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20 61 72 67  command-line arg
31580 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 66 6f  uments */.    fo
31590 72 28 69 4e 61 6d 65 3d 31 3b 20 69 4e 61 6d 65  r(iName=1; iName
315a0 3c 6e 41 72 67 20 26 26 20 61 7a 41 72 67 5b 69  <nArg && azArg[i
315b0 4e 61 6d 65 5d 5b 30 5d 3d 3d 27 2d 27 3b 20 69  Name][0]=='-'; i
315c0 4e 61 6d 65 2b 2b 29 7b 0a 20 20 20 20 20 20 63  Name++){.      c
315d0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 61  onst char *z = a
315e0 7a 41 72 67 5b 69 4e 61 6d 65 5d 3b 0a 20 20 20  zArg[iName];.   
315f0 20 20 20 69 66 28 20 6f 70 74 69 6f 6e 4d 61 74     if( optionMat
31600 63 68 28 7a 2c 22 6e 65 77 22 29 20 29 7b 0a 20  ch(z,"new") ){. 
31610 20 20 20 20 20 20 20 6e 65 77 46 6c 61 67 20 3d         newFlag =
31620 20 31 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   1;.#ifdef SQLIT
31630 45 5f 48 41 56 45 5f 5a 4c 49 42 0a 20 20 20 20  E_HAVE_ZLIB.    
31640 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 74 69    }else if( opti
31650 6f 6e 4d 61 74 63 68 28 7a 2c 20 22 7a 69 70 22  onMatch(z, "zip"
31660 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e  ) ){.        p->
31670 6f 70 65 6e 4d 6f 64 65 20 3d 20 53 48 45 4c 4c  openMode = SHELL
31680 5f 4f 50 45 4e 5f 5a 49 50 46 49 4c 45 3b 0a 23  _OPEN_ZIPFILE;.#
31690 65 6e 64 69 66 0a 20 20 20 20 20 20 7d 65 6c 73  endif.      }els
316a0 65 20 69 66 28 20 6f 70 74 69 6f 6e 4d 61 74 63  e if( optionMatc
316b0 68 28 7a 2c 20 22 61 70 70 65 6e 64 22 29 20 29  h(z, "append") )
316c0 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6f 70 65  {.        p->ope
316d0 6e 4d 6f 64 65 20 3d 20 53 48 45 4c 4c 5f 4f 50  nMode = SHELL_OP
316e0 45 4e 5f 41 50 50 45 4e 44 56 46 53 3b 0a 20 20  EN_APPENDVFS;.  
316f0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70      }else if( op
31700 74 69 6f 6e 4d 61 74 63 68 28 7a 2c 20 22 72 65  tionMatch(z, "re
31710 61 64 6f 6e 6c 79 22 29 20 29 7b 0a 20 20 20 20  adonly") ){.    
31720 20 20 20 20 70 2d 3e 6f 70 65 6e 4d 6f 64 65 20      p->openMode 
31730 3d 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f 52 45 41  = SHELL_OPEN_REA
31740 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 7d 65 6c  DONLY;.      }el
31750 73 65 20 69 66 28 20 7a 5b 30 5d 3d 3d 27 2d 27  se if( z[0]=='-'
31760 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38   ){.        utf8
31770 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
31780 22 75 6e 6b 6e 6f 77 6e 20 6f 70 74 69 6f 6e 3a  "unknown option:
31790 20 25 73 5c 6e 22 2c 20 7a 29 3b 0a 20 20 20 20   %s\n", z);.    
317a0 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
317b0 20 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f      goto meta_co
317c0 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20  mmand_exit;.    
317d0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a    }.    }.    /*
317e0 20 49 66 20 61 20 66 69 6c 65 6e 61 6d 65 20 69   If a filename i
317f0 73 20 73 70 65 63 69 66 69 65 64 2c 20 74 72 79  s specified, try
31800 20 74 6f 20 6f 70 65 6e 20 69 74 20 66 69 72 73   to open it firs
31810 74 20 2a 2f 0a 20 20 20 20 7a 4e 65 77 46 69 6c  t */.    zNewFil
31820 65 6e 61 6d 65 20 3d 20 6e 41 72 67 3e 69 4e 61  ename = nArg>iNa
31830 6d 65 20 3f 20 73 71 6c 69 74 65 33 5f 6d 70 72  me ? sqlite3_mpr
31840 69 6e 74 66 28 22 25 73 22 2c 20 61 7a 41 72 67  intf("%s", azArg
31850 5b 69 4e 61 6d 65 5d 29 20 3a 20 30 3b 0a 20 20  [iName]) : 0;.  
31860 20 20 69 66 28 20 7a 4e 65 77 46 69 6c 65 6e 61    if( zNewFilena
31870 6d 65 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  me ){.      if( 
31880 6e 65 77 46 6c 61 67 20 29 20 73 68 65 6c 6c 44  newFlag ) shellD
31890 65 6c 65 74 65 46 69 6c 65 28 7a 4e 65 77 46 69  eleteFile(zNewFi
318a0 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 70  lename);.      p
318b0 2d 3e 7a 44 62 46 69 6c 65 6e 61 6d 65 20 3d 20  ->zDbFilename = 
318c0 7a 4e 65 77 46 69 6c 65 6e 61 6d 65 3b 0a 20 20  zNewFilename;.  
318d0 20 20 20 20 6f 70 65 6e 5f 64 62 28 70 2c 20 31      open_db(p, 1
318e0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  );.      if( p->
318f0 64 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  db==0 ){.       
31900 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64   utf8_printf(std
31910 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 63 61 6e  err, "Error: can
31920 6e 6f 74 20 6f 70 65 6e 20 27 25 73 27 5c 6e 22  not open '%s'\n"
31930 2c 20 7a 4e 65 77 46 69 6c 65 6e 61 6d 65 29 3b  , zNewFilename);
31940 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
31950 5f 66 72 65 65 28 7a 4e 65 77 46 69 6c 65 6e 61  _free(zNewFilena
31960 6d 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  me);.      }else
31970 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 7a 46 72  {.        p->zFr
31980 65 65 4f 6e 43 6c 6f 73 65 20 3d 20 7a 4e 65 77  eeOnClose = zNew
31990 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 20 20 20 20  Filename;.      
319a0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
319b0 70 2d 3e 64 62 3d 3d 30 20 29 7b 0a 20 20 20 20  p->db==0 ){.    
319c0 20 20 2f 2a 20 41 73 20 61 20 66 61 6c 6c 2d 62    /* As a fall-b
319d0 61 63 6b 20 6f 70 65 6e 20 61 20 54 45 4d 50 20  ack open a TEMP 
319e0 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 20 20  database */.    
319f0 20 20 70 2d 3e 7a 44 62 46 69 6c 65 6e 61 6d 65    p->zDbFilename
31a00 20 3d 20 30 3b 0a 20 20 20 20 20 20 6f 70 65 6e   = 0;.      open
31a10 5f 64 62 28 70 2c 20 30 29 3b 0a 20 20 20 20 7d  _db(p, 0);.    }
31a20 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20  .  }else..  if( 
31a30 28 63 3d 3d 27 6f 27 0a 20 20 20 20 20 20 20 20  (c=='o'.        
31a40 26 26 20 28 73 74 72 6e 63 6d 70 28 61 7a 41 72  && (strncmp(azAr
31a50 67 5b 30 5d 2c 20 22 6f 75 74 70 75 74 22 2c 20  g[0], "output", 
31a60 6e 29 3d 3d 30 7c 7c 73 74 72 6e 63 6d 70 28 61  n)==0||strncmp(a
31a70 7a 41 72 67 5b 30 5d 2c 20 22 6f 6e 63 65 22 2c  zArg[0], "once",
31a80 20 6e 29 3d 3d 30 29 29 0a 20 20 20 7c 7c 20 28   n)==0)).   || (
31a90 63 3d 3d 27 65 27 20 26 26 20 6e 3d 3d 35 20 26  c=='e' && n==5 &
31aa0 26 20 73 74 72 63 6d 70 28 61 7a 41 72 67 5b 30  & strcmp(azArg[0
31ab0 5d 2c 22 65 78 63 65 6c 22 29 3d 3d 30 29 0a 20  ],"excel")==0). 
31ac0 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   ){.    const ch
31ad0 61 72 20 2a 7a 46 69 6c 65 20 3d 20 6e 41 72 67  ar *zFile = nArg
31ae0 3e 3d 32 20 3f 20 61 7a 41 72 67 5b 31 5d 20 3a  >=2 ? azArg[1] :
31af0 20 22 73 74 64 6f 75 74 22 3b 0a 20 20 20 20 69   "stdout";.    i
31b00 6e 74 20 62 54 78 74 4d 6f 64 65 20 3d 20 30 3b  nt bTxtMode = 0;
31b10 0a 20 20 20 20 69 66 28 20 61 7a 41 72 67 5b 30  .    if( azArg[0
31b20 5d 5b 30 5d 3d 3d 27 65 27 20 29 7b 0a 20 20 20  ][0]=='e' ){.   
31b30 20 20 20 2f 2a 20 54 72 61 6e 73 66 6f 72 6d 20     /* Transform 
31b40 74 68 65 20 22 2e 65 78 63 65 6c 22 20 63 6f 6d  the ".excel" com
31b50 6d 61 6e 64 20 69 6e 74 6f 20 22 2e 6f 6e 63 65  mand into ".once
31b60 20 2d 78 22 20 2a 2f 0a 20 20 20 20 20 20 6e 41   -x" */.      nA
31b70 72 67 20 3d 20 32 3b 0a 20 20 20 20 20 20 61 7a  rg = 2;.      az
31b80 41 72 67 5b 30 5d 20 3d 20 22 6f 6e 63 65 22 3b  Arg[0] = "once";
31b90 0a 20 20 20 20 20 20 7a 46 69 6c 65 20 3d 20 61  .      zFile = a
31ba0 7a 41 72 67 5b 31 5d 20 3d 20 22 2d 78 22 3b 0a  zArg[1] = "-x";.
31bb0 20 20 20 20 20 20 6e 20 3d 20 34 3b 0a 20 20 20        n = 4;.   
31bc0 20 7d 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3e   }.    if( nArg>
31bd0 32 20 29 7b 0a 20 20 20 20 20 20 75 74 66 38 5f  2 ){.      utf8_
31be0 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
31bf0 55 73 61 67 65 3a 20 2e 25 73 20 5b 2d 65 7c 2d  Usage: .%s [-e|-
31c00 78 7c 46 49 4c 45 5d 5c 6e 22 2c 20 61 7a 41 72  x|FILE]\n", azAr
31c10 67 5b 30 5d 29 3b 0a 20 20 20 20 20 20 72 63 20  g[0]);.      rc 
31c20 3d 20 31 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  = 1;.      goto 
31c30 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69  meta_command_exi
31c40 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  t;.    }.    if(
31c50 20 6e 3e 31 20 26 26 20 73 74 72 6e 63 6d 70 28   n>1 && strncmp(
31c60 61 7a 41 72 67 5b 30 5d 2c 20 22 6f 6e 63 65 22  azArg[0], "once"
31c70 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  , n)==0 ){.     
31c80 20 69 66 28 20 6e 41 72 67 3c 32 20 29 7b 0a 20   if( nArg<2 ){. 
31c90 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74         raw_print
31ca0 66 28 73 74 64 65 72 72 2c 20 22 55 73 61 67 65  f(stderr, "Usage
31cb0 3a 20 2e 6f 6e 63 65 20 28 2d 65 7c 2d 78 7c 46  : .once (-e|-x|F
31cc0 49 4c 45 29 5c 6e 22 29 3b 0a 20 20 20 20 20 20  ILE)\n");.      
31cd0 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20    rc = 1;.      
31ce0 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d    goto meta_comm
31cf0 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20 20 20  and_exit;.      
31d00 7d 0a 20 20 20 20 20 20 70 2d 3e 6f 75 74 43 6f  }.      p->outCo
31d10 75 6e 74 20 3d 20 32 3b 0a 20 20 20 20 7d 65 6c  unt = 2;.    }el
31d20 73 65 7b 0a 20 20 20 20 20 20 70 2d 3e 6f 75 74  se{.      p->out
31d30 43 6f 75 6e 74 20 3d 20 30 3b 0a 20 20 20 20 7d  Count = 0;.    }
31d40 0a 20 20 20 20 6f 75 74 70 75 74 5f 72 65 73 65  .    output_rese
31d50 74 28 70 29 3b 0a 20 20 20 20 69 66 28 20 7a 46  t(p);.    if( zF
31d60 69 6c 65 5b 30 5d 3d 3d 27 2d 27 20 26 26 20 7a  ile[0]=='-' && z
31d70 46 69 6c 65 5b 31 5d 3d 3d 27 2d 27 20 29 20 7a  File[1]=='-' ) z
31d80 46 69 6c 65 2b 2b 3b 0a 23 69 66 6e 64 65 66 20  File++;.#ifndef 
31d90 53 51 4c 49 54 45 5f 4e 4f 48 41 56 45 5f 53 59  SQLITE_NOHAVE_SY
31da0 53 54 45 4d 0a 20 20 20 20 69 66 28 20 73 74 72  STEM.    if( str
31db0 63 6d 70 28 7a 46 69 6c 65 2c 20 22 2d 65 22 29  cmp(zFile, "-e")
31dc0 3d 3d 30 20 7c 7c 20 73 74 72 63 6d 70 28 7a 46  ==0 || strcmp(zF
31dd0 69 6c 65 2c 20 22 2d 78 22 29 3d 3d 30 20 29 7b  ile, "-x")==0 ){
31de0 0a 20 20 20 20 20 20 70 2d 3e 64 6f 58 64 67 4f  .      p->doXdgO
31df0 70 65 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 6f  pen = 1;.      o
31e00 75 74 70 75 74 4d 6f 64 65 50 75 73 68 28 70 29  utputModePush(p)
31e10 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 46 69 6c  ;.      if( zFil
31e20 65 5b 31 5d 3d 3d 27 78 27 20 29 7b 0a 20 20 20  e[1]=='x' ){.   
31e30 20 20 20 20 20 6e 65 77 54 65 6d 70 46 69 6c 65       newTempFile
31e40 28 70 2c 20 22 63 73 76 22 29 3b 0a 20 20 20 20  (p, "csv");.    
31e50 20 20 20 20 70 2d 3e 6d 6f 64 65 20 3d 20 4d 4f      p->mode = MO
31e60 44 45 5f 43 73 76 3b 0a 20 20 20 20 20 20 20 20  DE_Csv;.        
31e70 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
31e80 28 73 69 7a 65 6f 66 28 70 2d 3e 63 6f 6c 53 65  (sizeof(p->colSe
31e90 70 61 72 61 74 6f 72 29 2c 20 70 2d 3e 63 6f 6c  parator), p->col
31ea0 53 65 70 61 72 61 74 6f 72 2c 20 53 45 50 5f 43  Separator, SEP_C
31eb0 6f 6d 6d 61 29 3b 0a 20 20 20 20 20 20 20 20 73  omma);.        s
31ec0 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
31ed0 73 69 7a 65 6f 66 28 70 2d 3e 72 6f 77 53 65 70  sizeof(p->rowSep
31ee0 61 72 61 74 6f 72 29 2c 20 70 2d 3e 72 6f 77 53  arator), p->rowS
31ef0 65 70 61 72 61 74 6f 72 2c 20 53 45 50 5f 43 72  eparator, SEP_Cr
31f00 4c 66 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  Lf);.      }else
31f10 7b 0a 20 20 20 20 20 20 20 20 6e 65 77 54 65 6d  {.        newTem
31f20 70 46 69 6c 65 28 70 2c 20 22 74 78 74 22 29 3b  pFile(p, "txt");
31f30 0a 20 20 20 20 20 20 20 20 62 54 78 74 4d 6f 64  .        bTxtMod
31f40 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  e = 1;.      }. 
31f50 20 20 20 20 20 7a 46 69 6c 65 20 3d 20 70 2d 3e       zFile = p->
31f60 7a 54 65 6d 70 46 69 6c 65 3b 0a 20 20 20 20 7d  zTempFile;.    }
31f70 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
31f80 45 5f 4e 4f 48 41 56 45 5f 53 59 53 54 45 4d 20  E_NOHAVE_SYSTEM 
31f90 2a 2f 0a 20 20 20 20 69 66 28 20 7a 46 69 6c 65  */.    if( zFile
31fa0 5b 30 5d 3d 3d 27 7c 27 20 29 7b 0a 23 69 66 64  [0]=='|' ){.#ifd
31fb0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50  ef SQLITE_OMIT_P
31fc0 4f 50 45 4e 0a 20 20 20 20 20 20 72 61 77 5f 70  OPEN.      raw_p
31fd0 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45  rintf(stderr, "E
31fe0 72 72 6f 72 3a 20 70 69 70 65 73 20 61 72 65 20  rror: pipes are 
31ff0 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 20 69 6e  not supported in
32000 20 74 68 69 73 20 4f 53 5c 6e 22 29 3b 0a 20 20   this OS\n");.  
32010 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
32020 20 20 70 2d 3e 6f 75 74 20 3d 20 73 74 64 6f 75    p->out = stdou
32030 74 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 70  t;.#else.      p
32040 2d 3e 6f 75 74 20 3d 20 70 6f 70 65 6e 28 7a 46  ->out = popen(zF
32050 69 6c 65 20 2b 20 31 2c 20 22 77 22 29 3b 0a 20  ile + 1, "w");. 
32060 20 20 20 20 20 69 66 28 20 70 2d 3e 6f 75 74 3d       if( p->out=
32070 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74  =0 ){.        ut
32080 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  f8_printf(stderr
32090 2c 22 45 72 72 6f 72 3a 20 63 61 6e 6e 6f 74 20  ,"Error: cannot 
320a0 6f 70 65 6e 20 70 69 70 65 20 5c 22 25 73 5c 22  open pipe \"%s\"
320b0 5c 6e 22 2c 20 7a 46 69 6c 65 20 2b 20 31 29 3b  \n", zFile + 1);
320c0 0a 20 20 20 20 20 20 20 20 70 2d 3e 6f 75 74 20  .        p->out 
320d0 3d 20 73 74 64 6f 75 74 3b 0a 20 20 20 20 20 20  = stdout;.      
320e0 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20    rc = 1;.      
320f0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
32100 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
32110 73 69 7a 65 6f 66 28 70 2d 3e 6f 75 74 66 69 6c  sizeof(p->outfil
32120 65 29 2c 20 70 2d 3e 6f 75 74 66 69 6c 65 2c 20  e), p->outfile, 
32130 22 25 73 22 2c 20 7a 46 69 6c 65 29 3b 0a 20 20  "%s", zFile);.  
32140 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
32150 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 2d   }else{.      p-
32160 3e 6f 75 74 20 3d 20 6f 75 74 70 75 74 5f 66 69  >out = output_fi
32170 6c 65 5f 6f 70 65 6e 28 7a 46 69 6c 65 2c 20 62  le_open(zFile, b
32180 54 78 74 4d 6f 64 65 29 3b 0a 20 20 20 20 20 20  TxtMode);.      
32190 69 66 28 20 70 2d 3e 6f 75 74 3d 3d 30 20 29 7b  if( p->out==0 ){
321a0 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 74 72  .        if( str
321b0 63 6d 70 28 7a 46 69 6c 65 2c 22 6f 66 66 22 29  cmp(zFile,"off")
321c0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  !=0 ){.         
321d0 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64   utf8_printf(std
321e0 65 72 72 2c 22 45 72 72 6f 72 3a 20 63 61 6e 6e  err,"Error: cann
321f0 6f 74 20 77 72 69 74 65 20 74 6f 20 5c 22 25 73  ot write to \"%s
32200 5c 22 5c 6e 22 2c 20 7a 46 69 6c 65 29 3b 0a 20  \"\n", zFile);. 
32210 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
32220 20 70 2d 3e 6f 75 74 20 3d 20 73 74 64 6f 75 74   p->out = stdout
32230 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 31  ;.        rc = 1
32240 3b 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b  ;.      } else {
32250 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
32260 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66  _snprintf(sizeof
32270 28 70 2d 3e 6f 75 74 66 69 6c 65 29 2c 20 70 2d  (p->outfile), p-
32280 3e 6f 75 74 66 69 6c 65 2c 20 22 25 73 22 2c 20  >outfile, "%s", 
32290 7a 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 7d 0a  zFile);.      }.
322a0 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20      }.  }else.. 
322b0 20 69 66 28 20 63 3d 3d 27 70 27 20 26 26 20 6e   if( c=='p' && n
322c0 3e 3d 33 20 26 26 20 73 74 72 6e 63 6d 70 28 61  >=3 && strncmp(a
322d0 7a 41 72 67 5b 30 5d 2c 20 22 70 72 69 6e 74 22  zArg[0], "print"
322e0 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69  , n)==0 ){.    i
322f0 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d  nt i;.    for(i=
32300 31 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b  1; i<nArg; i++){
32310 0a 20 20 20 20 20 20 69 66 28 20 69 3e 31 20 29  .      if( i>1 )
32320 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f   raw_printf(p->o
32330 75 74 2c 20 22 20 22 29 3b 0a 20 20 20 20 20 20  ut, " ");.      
32340 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f  utf8_printf(p->o
32350 75 74 2c 20 22 25 73 22 2c 20 61 7a 41 72 67 5b  ut, "%s", azArg[
32360 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  i]);.    }.    r
32370 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  aw_printf(p->out
32380 2c 20 22 5c 6e 22 29 3b 0a 20 20 7d 65 6c 73 65  , "\n");.  }else
32390 0a 0a 20 20 69 66 28 20 63 3d 3d 27 70 27 20 26  ..  if( c=='p' &
323a0 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b  & strncmp(azArg[
323b0 30 5d 2c 20 22 70 72 6f 6d 70 74 22 2c 20 6e 29  0], "prompt", n)
323c0 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6e  ==0 ){.    if( n
323d0 41 72 67 20 3e 3d 20 32 29 20 7b 0a 20 20 20 20  Arg >= 2) {.    
323e0 20 20 73 74 72 6e 63 70 79 28 6d 61 69 6e 50 72    strncpy(mainPr
323f0 6f 6d 70 74 2c 61 7a 41 72 67 5b 31 5d 2c 28 69  ompt,azArg[1],(i
32400 6e 74 29 41 72 72 61 79 53 69 7a 65 28 6d 61 69  nt)ArraySize(mai
32410 6e 50 72 6f 6d 70 74 29 2d 31 29 3b 0a 20 20 20  nPrompt)-1);.   
32420 20 7d 0a 20 20 20 20 69 66 28 20 6e 41 72 67 20   }.    if( nArg 
32430 3e 3d 20 33 29 20 7b 0a 20 20 20 20 20 20 73 74  >= 3) {.      st
32440 72 6e 63 70 79 28 63 6f 6e 74 69 6e 75 65 50 72  rncpy(continuePr
32450 6f 6d 70 74 2c 61 7a 41 72 67 5b 32 5d 2c 28 69  ompt,azArg[2],(i
32460 6e 74 29 41 72 72 61 79 53 69 7a 65 28 63 6f 6e  nt)ArraySize(con
32470 74 69 6e 75 65 50 72 6f 6d 70 74 29 2d 31 29 3b  tinuePrompt)-1);
32480 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a  .    }.  }else..
32490 20 20 69 66 28 20 63 3d 3d 27 71 27 20 26 26 20    if( c=='q' && 
324a0 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d  strncmp(azArg[0]
324b0 2c 20 22 71 75 69 74 22 2c 20 6e 29 3d 3d 30 20  , "quit", n)==0 
324c0 29 7b 0a 20 20 20 20 72 63 20 3d 20 32 3b 0a 20  ){.    rc = 2;. 
324d0 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d   }else..  if( c=
324e0 3d 27 72 27 20 26 26 20 6e 3e 3d 33 20 26 26 20  ='r' && n>=3 && 
324f0 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d  strncmp(azArg[0]
32500 2c 20 22 72 65 61 64 22 2c 20 6e 29 3d 3d 30 20  , "read", n)==0 
32510 29 7b 0a 20 20 20 20 46 49 4c 45 20 2a 61 6c 74  ){.    FILE *alt
32520 3b 0a 20 20 20 20 69 66 28 20 6e 41 72 67 21 3d  ;.    if( nArg!=
32530 32 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70  2 ){.      raw_p
32540 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55  rintf(stderr, "U
32550 73 61 67 65 3a 20 2e 72 65 61 64 20 46 49 4c 45  sage: .read FILE
32560 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  \n");.      rc =
32570 20 31 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d   1;.      goto m
32580 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74  eta_command_exit
32590 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 6c 74 20  ;.    }.    alt 
325a0 3d 20 66 6f 70 65 6e 28 61 7a 41 72 67 5b 31 5d  = fopen(azArg[1]
325b0 2c 20 22 72 62 22 29 3b 0a 20 20 20 20 69 66 28  , "rb");.    if(
325c0 20 61 6c 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20   alt==0 ){.     
325d0 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64   utf8_printf(std
325e0 65 72 72 2c 22 45 72 72 6f 72 3a 20 63 61 6e 6e  err,"Error: cann
325f0 6f 74 20 6f 70 65 6e 20 5c 22 25 73 5c 22 5c 6e  ot open \"%s\"\n
32600 22 2c 20 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20  ", azArg[1]);.  
32610 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
32620 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
32630 3d 20 70 72 6f 63 65 73 73 5f 69 6e 70 75 74 28  = process_input(
32640 70 2c 20 61 6c 74 29 3b 0a 20 20 20 20 20 20 66  p, alt);.      f
32650 63 6c 6f 73 65 28 61 6c 74 29 3b 0a 20 20 20 20  close(alt);.    
32660 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28  }.  }else..  if(
32670 20 63 3d 3d 27 72 27 20 26 26 20 6e 3e 3d 33 20   c=='r' && n>=3 
32680 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67  && strncmp(azArg
32690 5b 30 5d 2c 20 22 72 65 73 74 6f 72 65 22 2c 20  [0], "restore", 
326a0 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 63 6f 6e  n)==0 ){.    con
326b0 73 74 20 63 68 61 72 20 2a 7a 53 72 63 46 69 6c  st char *zSrcFil
326c0 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  e;.    const cha
326d0 72 20 2a 7a 44 62 3b 0a 20 20 20 20 73 71 6c 69  r *zDb;.    sqli
326e0 74 65 33 20 2a 70 53 72 63 3b 0a 20 20 20 20 73  te3 *pSrc;.    s
326f0 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 20 2a 70  qlite3_backup *p
32700 42 61 63 6b 75 70 3b 0a 20 20 20 20 69 6e 74 20  Backup;.    int 
32710 6e 54 69 6d 65 6f 75 74 20 3d 20 30 3b 0a 0a 20  nTimeout = 0;.. 
32720 20 20 20 69 66 28 20 6e 41 72 67 3d 3d 32 20 29     if( nArg==2 )
32730 7b 0a 20 20 20 20 20 20 7a 53 72 63 46 69 6c 65  {.      zSrcFile
32740 20 3d 20 61 7a 41 72 67 5b 31 5d 3b 0a 20 20 20   = azArg[1];.   
32750 20 20 20 7a 44 62 20 3d 20 22 6d 61 69 6e 22 3b     zDb = "main";
32760 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e  .    }else if( n
32770 41 72 67 3d 3d 33 20 29 7b 0a 20 20 20 20 20 20  Arg==3 ){.      
32780 7a 53 72 63 46 69 6c 65 20 3d 20 61 7a 41 72 67  zSrcFile = azArg
32790 5b 32 5d 3b 0a 20 20 20 20 20 20 7a 44 62 20 3d  [2];.      zDb =
327a0 20 61 7a 41 72 67 5b 31 5d 3b 0a 20 20 20 20 7d   azArg[1];.    }
327b0 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 61 77 5f  else{.      raw_
327c0 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
327d0 55 73 61 67 65 3a 20 2e 72 65 73 74 6f 72 65 20  Usage: .restore 
327e0 3f 44 42 3f 20 46 49 4c 45 5c 6e 22 29 3b 0a 20  ?DB? FILE\n");. 
327f0 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20       rc = 1;.   
32800 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d     goto meta_com
32810 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20 7d  mand_exit;.    }
32820 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
32830 33 5f 6f 70 65 6e 28 7a 53 72 63 46 69 6c 65 2c  3_open(zSrcFile,
32840 20 26 70 53 72 63 29 3b 0a 20 20 20 20 69 66 28   &pSrc);.    if(
32850 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
32860 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69  {.      utf8_pri
32870 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72  ntf(stderr, "Err
32880 6f 72 3a 20 63 61 6e 6e 6f 74 20 6f 70 65 6e 20  or: cannot open 
32890 5c 22 25 73 5c 22 5c 6e 22 2c 20 7a 53 72 63 46  \"%s\"\n", zSrcF
328a0 69 6c 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ile);.      sqli
328b0 74 65 33 5f 63 6c 6f 73 65 28 70 53 72 63 29 3b  te3_close(pSrc);
328c0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
328d0 0a 20 20 20 20 7d 0a 20 20 20 20 6f 70 65 6e 5f  .    }.    open_
328e0 64 62 28 70 2c 20 30 29 3b 0a 20 20 20 20 70 42  db(p, 0);.    pB
328f0 61 63 6b 75 70 20 3d 20 73 71 6c 69 74 65 33 5f  ackup = sqlite3_
32900 62 61 63 6b 75 70 5f 69 6e 69 74 28 70 2d 3e 64  backup_init(p->d
32910 62 2c 20 7a 44 62 2c 20 70 53 72 63 2c 20 22 6d  b, zDb, pSrc, "m
32920 61 69 6e 22 29 3b 0a 20 20 20 20 69 66 28 20 70  ain");.    if( p
32930 42 61 63 6b 75 70 3d 3d 30 20 29 7b 0a 20 20 20  Backup==0 ){.   
32940 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73     utf8_printf(s
32950 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 25  tderr, "Error: %
32960 73 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f 65 72  s\n", sqlite3_er
32970 72 6d 73 67 28 70 2d 3e 64 62 29 29 3b 0a 20 20  rmsg(p->db));.  
32980 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73      sqlite3_clos
32990 65 28 70 53 72 63 29 3b 0a 20 20 20 20 20 20 72  e(pSrc);.      r
329a0 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
329b0 20 20 20 77 68 69 6c 65 28 20 28 72 63 20 3d 20     while( (rc = 
329c0 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 5f 73  sqlite3_backup_s
329d0 74 65 70 28 70 42 61 63 6b 75 70 2c 31 30 30 29  tep(pBackup,100)
329e0 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 20  )==SQLITE_OK.   
329f0 20 20 20 20 20 20 20 7c 7c 20 72 63 3d 3d 53 51         || rc==SQ
32a00 4c 49 54 45 5f 42 55 53 59 20 20 29 7b 0a 20 20  LITE_BUSY  ){.  
32a10 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
32a20 54 45 5f 42 55 53 59 20 29 7b 0a 20 20 20 20 20  TE_BUSY ){.     
32a30 20 20 20 69 66 28 20 6e 54 69 6d 65 6f 75 74 2b     if( nTimeout+
32a40 2b 20 3e 3d 20 33 20 29 20 62 72 65 61 6b 3b 0a  + >= 3 ) break;.
32a50 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
32a60 73 6c 65 65 70 28 31 30 30 29 3b 0a 20 20 20 20  sleep(100);.    
32a70 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71    }.    }.    sq
32a80 6c 69 74 65 33 5f 62 61 63 6b 75 70 5f 66 69 6e  lite3_backup_fin
32a90 69 73 68 28 70 42 61 63 6b 75 70 29 3b 0a 20 20  ish(pBackup);.  
32aa0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
32ab0 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 72  _DONE ){.      r
32ac0 63 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  c = 0;.    }else
32ad0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
32ae0 42 55 53 59 20 7c 7c 20 72 63 3d 3d 53 51 4c 49  BUSY || rc==SQLI
32af0 54 45 5f 4c 4f 43 4b 45 44 20 29 7b 0a 20 20 20  TE_LOCKED ){.   
32b00 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74     raw_printf(st
32b10 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 73 6f  derr, "Error: so
32b20 75 72 63 65 20 64 61 74 61 62 61 73 65 20 69 73  urce database is
32b30 20 62 75 73 79 5c 6e 22 29 3b 0a 20 20 20 20 20   busy\n");.     
32b40 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c   rc = 1;.    }el
32b50 73 65 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70  se{.      utf8_p
32b60 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45  rintf(stderr, "E
32b70 72 72 6f 72 3a 20 25 73 5c 6e 22 2c 20 73 71 6c  rror: %s\n", sql
32b80 69 74 65 33 5f 65 72 72 6d 73 67 28 70 2d 3e 64  ite3_errmsg(p->d
32b90 62 29 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  b));.      rc = 
32ba0 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  1;.    }.    sql
32bb0 69 74 65 33 5f 63 6c 6f 73 65 28 70 53 72 63 29  ite3_close(pSrc)
32bc0 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28  ;.  }else..  if(
32bd0 20 63 3d 3d 27 73 27 20 26 26 20 73 74 72 6e 63   c=='s' && strnc
32be0 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 73 63  mp(azArg[0], "sc
32bf0 61 6e 73 74 61 74 73 22 2c 20 6e 29 3d 3d 30 20  anstats", n)==0 
32c00 29 7b 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3d  ){.    if( nArg=
32c10 3d 32 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 73  =2 ){.      p->s
32c20 63 61 6e 73 74 61 74 73 4f 6e 20 3d 20 28 75 38  canstatsOn = (u8
32c30 29 62 6f 6f 6c 65 61 6e 56 61 6c 75 65 28 61 7a  )booleanValue(az
32c40 41 72 67 5b 31 5d 29 3b 0a 23 69 66 6e 64 65 66  Arg[1]);.#ifndef
32c50 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
32c60 54 4d 54 5f 53 43 41 4e 53 54 41 54 55 53 0a 20  TMT_SCANSTATUS. 
32c70 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
32c80 73 74 64 65 72 72 2c 20 22 57 61 72 6e 69 6e 67  stderr, "Warning
32c90 3a 20 2e 73 63 61 6e 73 74 61 74 73 20 6e 6f 74  : .scanstats not
32ca0 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 74 68   available in th
32cb0 69 73 20 62 75 69 6c 64 2e 5c 6e 22 29 3b 0a 23  is build.\n");.#
32cc0 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 7b  endif.    }else{
32cd0 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74  .      raw_print
32ce0 66 28 73 74 64 65 72 72 2c 20 22 55 73 61 67 65  f(stderr, "Usage
32cf0 3a 20 2e 73 63 61 6e 73 74 61 74 73 20 6f 6e 7c  : .scanstats on|
32d00 6f 66 66 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72  off\n");.      r
32d10 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  c = 1;.    }.  }
32d20 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27  else..  if( c=='
32d30 73 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a  s' && strncmp(az
32d40 41 72 67 5b 30 5d 2c 20 22 73 63 68 65 6d 61 22  Arg[0], "schema"
32d50 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 53  , n)==0 ){.    S
32d60 68 65 6c 6c 54 65 78 74 20 73 53 65 6c 65 63 74  hellText sSelect
32d70 3b 0a 20 20 20 20 53 68 65 6c 6c 53 74 61 74 65  ;.    ShellState
32d80 20 64 61 74 61 3b 0a 20 20 20 20 63 68 61 72 20   data;.    char 
32d90 2a 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20  *zErrMsg = 0;.  
32da0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
32db0 69 76 20 3d 20 22 28 22 3b 0a 20 20 20 20 63 6f  iv = "(";.    co
32dc0 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20  nst char *zName 
32dd0 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 69 53 63  = 0;.    int iSc
32de0 68 65 6d 61 20 3d 20 30 3b 0a 20 20 20 20 69 6e  hema = 0;.    in
32df0 74 20 62 44 65 62 75 67 20 3d 20 30 3b 0a 20 20  t bDebug = 0;.  
32e00 20 20 69 6e 74 20 69 69 3b 0a 0a 20 20 20 20 6f    int ii;..    o
32e10 70 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a 20 20  pen_db(p, 0);.  
32e20 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61 2c 20    memcpy(&data, 
32e30 70 2c 20 73 69 7a 65 6f 66 28 64 61 74 61 29 29  p, sizeof(data))
32e40 3b 0a 20 20 20 20 64 61 74 61 2e 73 68 6f 77 48  ;.    data.showH
32e50 65 61 64 65 72 20 3d 20 30 3b 0a 20 20 20 20 64  eader = 0;.    d
32e60 61 74 61 2e 63 4d 6f 64 65 20 3d 20 64 61 74 61  ata.cMode = data
32e70 2e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 53 65 6d  .mode = MODE_Sem
32e80 69 3b 0a 20 20 20 20 69 6e 69 74 54 65 78 74 28  i;.    initText(
32e90 26 73 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 66  &sSelect);.    f
32ea0 6f 72 28 69 69 3d 31 3b 20 69 69 3c 6e 41 72 67  or(ii=1; ii<nArg
32eb0 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  ; ii++){.      i
32ec0 66 28 20 6f 70 74 69 6f 6e 4d 61 74 63 68 28 61  f( optionMatch(a
32ed0 7a 41 72 67 5b 69 69 5d 2c 22 69 6e 64 65 6e 74  zArg[ii],"indent
32ee0 22 29 20 29 7b 0a 20 20 20 20 20 20 20 20 64 61  ") ){.        da
32ef0 74 61 2e 63 4d 6f 64 65 20 3d 20 64 61 74 61 2e  ta.cMode = data.
32f00 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 50 72 65 74  mode = MODE_Pret
32f10 74 79 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  ty;.      }else 
32f20 69 66 28 20 6f 70 74 69 6f 6e 4d 61 74 63 68 28  if( optionMatch(
32f30 61 7a 41 72 67 5b 69 69 5d 2c 22 64 65 62 75 67  azArg[ii],"debug
32f40 22 29 20 29 7b 0a 20 20 20 20 20 20 20 20 62 44  ") ){.        bD
32f50 65 62 75 67 20 3d 20 31 3b 0a 20 20 20 20 20 20  ebug = 1;.      
32f60 7d 65 6c 73 65 20 69 66 28 20 7a 4e 61 6d 65 3d  }else if( zName=
32f70 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 4e  =0 ){.        zN
32f80 61 6d 65 20 3d 20 61 7a 41 72 67 5b 69 69 5d 3b  ame = azArg[ii];
32f90 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
32fa0 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
32fb0 28 73 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a  (stderr, "Usage:
32fc0 20 2e 73 63 68 65 6d 61 20 3f 2d 2d 69 6e 64 65   .schema ?--inde
32fd0 6e 74 3f 20 3f 4c 49 4b 45 2d 50 41 54 54 45 52  nt? ?LIKE-PATTER
32fe0 4e 3f 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20 20  N?\n");.        
32ff0 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  rc = 1;.        
33000 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e  goto meta_comman
33010 64 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 7d 0a  d_exit;.      }.
33020 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 7a 4e      }.    if( zN
33030 61 6d 65 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  ame!=0 ){.      
33040 69 6e 74 20 69 73 4d 61 73 74 65 72 20 3d 20 73  int isMaster = s
33050 71 6c 69 74 65 33 5f 73 74 72 6c 69 6b 65 28 7a  qlite3_strlike(z
33060 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f 6d 61  Name, "sqlite_ma
33070 73 74 65 72 22 2c 20 27 5c 5c 27 29 3d 3d 30 3b  ster", '\\')==0;
33080 0a 20 20 20 20 20 20 69 66 28 20 69 73 4d 61 73  .      if( isMas
33090 74 65 72 20 7c 7c 20 73 71 6c 69 74 65 33 5f 73  ter || sqlite3_s
330a0 74 72 6c 69 6b 65 28 7a 4e 61 6d 65 2c 22 73 71  trlike(zName,"sq
330b0 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72  lite_temp_master
330c0 22 2c 20 27 5c 5c 27 29 3d 3d 30 20 29 7b 0a 20  ", '\\')==0 ){. 
330d0 20 20 20 20 20 20 20 63 68 61 72 20 2a 6e 65 77         char *new
330e0 5f 61 72 67 76 5b 32 5d 2c 20 2a 6e 65 77 5f 63  _argv[2], *new_c
330f0 6f 6c 76 5b 32 5d 3b 0a 20 20 20 20 20 20 20 20  olv[2];.        
33100 6e 65 77 5f 61 72 67 76 5b 30 5d 20 3d 20 73 71  new_argv[0] = sq
33110 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20  lite3_mprintf(. 
33120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33130 20 20 20 20 20 22 43 52 45 41 54 45 20 54 41 42       "CREATE TAB
33140 4c 45 20 25 73 20 28 5c 6e 22 0a 20 20 20 20 20  LE %s (\n".     
33150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33160 20 22 20 20 74 79 70 65 20 74 65 78 74 2c 5c 6e   "  type text,\n
33170 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ".              
33180 20 20 20 20 20 20 20 20 22 20 20 6e 61 6d 65 20          "  name 
33190 74 65 78 74 2c 5c 6e 22 0a 20 20 20 20 20 20 20  text,\n".       
331a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
331b0 20 20 74 62 6c 5f 6e 61 6d 65 20 74 65 78 74 2c    tbl_name text,
331c0 5c 6e 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  \n".            
331d0 20 20 20 20 20 20 20 20 20 20 22 20 20 72 6f 6f            "  roo
331e0 74 70 61 67 65 20 69 6e 74 65 67 65 72 2c 5c 6e  tpage integer,\n
331f0 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ".              
33200 20 20 20 20 20 20 20 20 22 20 20 73 71 6c 20 74          "  sql t
33210 65 78 74 5c 6e 22 0a 20 20 20 20 20 20 20 20 20  ext\n".         
33220 20 20 20 20 20 20 20 20 20 20 20 20 20 22 29 22               ")"
33230 2c 20 69 73 4d 61 73 74 65 72 20 3f 20 22 73 71  , isMaster ? "sq
33240 6c 69 74 65 5f 6d 61 73 74 65 72 22 20 3a 20 22  lite_master" : "
33250 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74  sqlite_temp_mast
33260 65 72 22 29 3b 0a 20 20 20 20 20 20 20 20 6e 65  er");.        ne
33270 77 5f 61 72 67 76 5b 31 5d 20 3d 20 30 3b 0a 20  w_argv[1] = 0;. 
33280 20 20 20 20 20 20 20 6e 65 77 5f 63 6f 6c 76 5b         new_colv[
33290 30 5d 20 3d 20 22 73 71 6c 22 3b 0a 20 20 20 20  0] = "sql";.    
332a0 20 20 20 20 6e 65 77 5f 63 6f 6c 76 5b 31 5d 20      new_colv[1] 
332b0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 63 61 6c  = 0;.        cal
332c0 6c 62 61 63 6b 28 26 64 61 74 61 2c 20 31 2c 20  lback(&data, 1, 
332d0 6e 65 77 5f 61 72 67 76 2c 20 6e 65 77 5f 63 6f  new_argv, new_co
332e0 6c 76 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  lv);.        sql
332f0 69 74 65 33 5f 66 72 65 65 28 6e 65 77 5f 61 72  ite3_free(new_ar
33300 67 76 5b 30 5d 29 3b 0a 20 20 20 20 20 20 7d 0a  gv[0]);.      }.
33310 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 7a 44      }.    if( zD
33320 69 76 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  iv ){.      sqli
33330 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20  te3_stmt *pStmt 
33340 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  = 0;.      rc = 
33350 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f  sqlite3_prepare_
33360 76 32 28 70 2d 3e 64 62 2c 20 22 53 45 4c 45 43  v2(p->db, "SELEC
33370 54 20 6e 61 6d 65 20 46 52 4f 4d 20 70 72 61 67  T name FROM prag
33380 6d 61 5f 64 61 74 61 62 61 73 65 5f 6c 69 73 74  ma_database_list
33390 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
333a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
333b0 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b   -1, &pStmt, 0);
333c0 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b  .      if( rc ){
333d0 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72  .        utf8_pr
333e0 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72  intf(stderr, "Er
333f0 72 6f 72 3a 20 25 73 5c 6e 22 2c 20 73 71 6c 69  ror: %s\n", sqli
33400 74 65 33 5f 65 72 72 6d 73 67 28 70 2d 3e 64 62  te3_errmsg(p->db
33410 29 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  ));.        sqli
33420 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74  te3_finalize(pSt
33430 6d 74 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  mt);.        rc 
33440 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  = 1;.        got
33450 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65  o meta_command_e
33460 78 69 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  xit;.      }.   
33470 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73     appendText(&s
33480 53 65 6c 65 63 74 2c 20 22 53 45 4c 45 43 54 20  Select, "SELECT 
33490 73 71 6c 20 46 52 4f 4d 22 2c 20 30 29 3b 0a 20  sql FROM", 0);. 
334a0 20 20 20 20 20 69 53 63 68 65 6d 61 20 3d 20 30       iSchema = 0
334b0 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 73  ;.      while( s
334c0 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d  qlite3_step(pStm
334d0 74 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29  t)==SQLITE_ROW )
334e0 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20  {.        const 
334f0 63 68 61 72 20 2a 7a 44 62 20 3d 20 28 63 6f 6e  char *zDb = (con
33500 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33  st char*)sqlite3
33510 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74  _column_text(pSt
33520 6d 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  mt, 0);.        
33530 63 68 61 72 20 7a 53 63 4e 75 6d 5b 33 30 5d 3b  char zScNum[30];
33540 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
33550 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66  _snprintf(sizeof
33560 28 7a 53 63 4e 75 6d 29 2c 20 7a 53 63 4e 75 6d  (zScNum), zScNum
33570 2c 20 22 25 64 22 2c 20 2b 2b 69 53 63 68 65 6d  , "%d", ++iSchem
33580 61 29 3b 0a 20 20 20 20 20 20 20 20 61 70 70 65  a);.        appe
33590 6e 64 54 65 78 74 28 26 73 53 65 6c 65 63 74 2c  ndText(&sSelect,
335a0 20 7a 44 69 76 2c 20 30 29 3b 0a 20 20 20 20 20   zDiv, 0);.     
335b0 20 20 20 7a 44 69 76 20 3d 20 22 20 55 4e 49 4f     zDiv = " UNIO
335c0 4e 20 41 4c 4c 20 22 3b 0a 20 20 20 20 20 20 20  N ALL ";.       
335d0 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 53 65   appendText(&sSe
335e0 6c 65 63 74 2c 20 22 53 45 4c 45 43 54 20 73 68  lect, "SELECT sh
335f0 65 6c 6c 5f 61 64 64 5f 73 63 68 65 6d 61 28 73  ell_add_schema(s
33600 71 6c 2c 22 2c 20 30 29 3b 0a 20 20 20 20 20 20  ql,", 0);.      
33610 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74    if( sqlite3_st
33620 72 69 63 6d 70 28 7a 44 62 2c 20 22 6d 61 69 6e  ricmp(zDb, "main
33630 22 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ")!=0 ){.       
33640 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73     appendText(&s
33650 53 65 6c 65 63 74 2c 20 7a 44 62 2c 20 27 22 27  Select, zDb, '"'
33660 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
33670 7b 0a 20 20 20 20 20 20 20 20 20 20 61 70 70 65  {.          appe
33680 6e 64 54 65 78 74 28 26 73 53 65 6c 65 63 74 2c  ndText(&sSelect,
33690 20 22 4e 55 4c 4c 22 2c 20 30 29 3b 0a 20 20 20   "NULL", 0);.   
336a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61       }.        a
336b0 70 70 65 6e 64 54 65 78 74 28 26 73 53 65 6c 65  ppendText(&sSele
336c0 63 74 2c 20 22 2c 6e 61 6d 65 29 20 41 53 20 73  ct, ",name) AS s
336d0 71 6c 2c 20 74 79 70 65 2c 20 74 62 6c 5f 6e 61  ql, type, tbl_na
336e0 6d 65 2c 20 6e 61 6d 65 2c 20 72 6f 77 69 64 2c  me, name, rowid,
336f0 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 61  ", 0);.        a
33700 70 70 65 6e 64 54 65 78 74 28 26 73 53 65 6c 65  ppendText(&sSele
33710 63 74 2c 20 7a 53 63 4e 75 6d 2c 20 30 29 3b 0a  ct, zScNum, 0);.
33720 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 54 65          appendTe
33730 78 74 28 26 73 53 65 6c 65 63 74 2c 20 22 20 41  xt(&sSelect, " A
33740 53 20 73 6e 75 6d 2c 20 22 2c 20 30 29 3b 0a 20  S snum, ", 0);. 
33750 20 20 20 20 20 20 20 61 70 70 65 6e 64 54 65 78         appendTex
33760 74 28 26 73 53 65 6c 65 63 74 2c 20 7a 44 62 2c  t(&sSelect, zDb,
33770 20 27 5c 27 27 29 3b 0a 20 20 20 20 20 20 20 20   '\'');.        
33780 61 70 70 65 6e 64 54 65 78 74 28 26 73 53 65 6c  appendText(&sSel
33790 65 63 74 2c 20 22 20 41 53 20 73 6e 61 6d 65 20  ect, " AS sname 
337a0 46 52 4f 4d 20 22 2c 20 30 29 3b 0a 20 20 20 20  FROM ", 0);.    
337b0 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26      appendText(&
337c0 73 53 65 6c 65 63 74 2c 20 7a 44 62 2c 20 27 22  sSelect, zDb, '"
337d0 27 29 3b 0a 20 20 20 20 20 20 20 20 61 70 70 65  ');.        appe
337e0 6e 64 54 65 78 74 28 26 73 53 65 6c 65 63 74 2c  ndText(&sSelect,
337f0 20 22 2e 73 71 6c 69 74 65 5f 6d 61 73 74 65 72   ".sqlite_master
33800 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ", 0);.      }. 
33810 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e       sqlite3_fin
33820 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 23 69  alize(pStmt);.#i
33830 66 64 65 66 20 53 51 4c 49 54 45 5f 49 4e 54 52  fdef SQLITE_INTR
33840 4f 53 50 45 43 54 49 4f 4e 5f 50 52 41 47 4d 41  OSPECTION_PRAGMA
33850 53 0a 20 20 20 20 20 20 69 66 28 20 7a 4e 61 6d  S.      if( zNam
33860 65 20 29 7b 0a 20 20 20 20 20 20 20 20 61 70 70  e ){.        app
33870 65 6e 64 54 65 78 74 28 26 73 53 65 6c 65 63 74  endText(&sSelect
33880 2c 0a 20 20 20 20 20 20 20 20 20 20 20 22 20 55  ,.           " U
33890 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c 45 43 54 20  NION ALL SELECT 
338a0 73 68 65 6c 6c 5f 6d 6f 64 75 6c 65 5f 73 63 68  shell_module_sch
338b0 65 6d 61 28 6e 61 6d 65 29 2c 22 0a 20 20 20 20  ema(name),".    
338c0 20 20 20 20 20 20 20 22 20 27 74 61 62 6c 65 27         " 'table'
338d0 2c 20 6e 61 6d 65 2c 20 6e 61 6d 65 2c 20 6e 61  , name, name, na
338e0 6d 65 2c 20 39 65 2b 39 39 2c 20 27 6d 61 69 6e  me, 9e+99, 'main
338f0 27 20 46 52 4f 4d 20 70 72 61 67 6d 61 5f 6d 6f  ' FROM pragma_mo
33900 64 75 6c 65 5f 6c 69 73 74 22 2c 20 30 29 3b 0a  dule_list", 0);.
33910 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
33920 20 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28       appendText(
33930 26 73 53 65 6c 65 63 74 2c 20 22 29 20 57 48 45  &sSelect, ") WHE
33940 52 45 20 22 2c 20 30 29 3b 0a 20 20 20 20 20 20  RE ", 0);.      
33950 69 66 28 20 7a 4e 61 6d 65 20 29 7b 0a 20 20 20  if( zName ){.   
33960 20 20 20 20 20 63 68 61 72 20 2a 7a 51 61 72 67       char *zQarg
33970 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
33980 74 66 28 22 25 51 22 2c 20 7a 4e 61 6d 65 29 3b  tf("%Q", zName);
33990 0a 20 20 20 20 20 20 20 20 69 6e 74 20 62 47 6c  .        int bGl
339a0 6f 62 20 3d 20 73 74 72 63 68 72 28 7a 4e 61 6d  ob = strchr(zNam
339b0 65 2c 20 27 2a 27 29 20 21 3d 20 30 20 7c 7c 20  e, '*') != 0 || 
339c0 73 74 72 63 68 72 28 7a 4e 61 6d 65 2c 20 27 3f  strchr(zName, '?
339d0 27 29 20 21 3d 20 30 20 7c 7c 0a 20 20 20 20 20  ') != 0 ||.     
339e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
339f0 74 72 63 68 72 28 7a 4e 61 6d 65 2c 20 27 5b 27  trchr(zName, '['
33a00 29 20 21 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ) != 0;.        
33a10 69 66 28 20 73 74 72 63 68 72 28 7a 4e 61 6d 65  if( strchr(zName
33a20 2c 20 27 2e 27 29 20 29 7b 0a 20 20 20 20 20 20  , '.') ){.      
33a30 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26      appendText(&
33a40 73 53 65 6c 65 63 74 2c 20 22 6c 6f 77 65 72 28  sSelect, "lower(
33a50 70 72 69 6e 74 66 28 27 25 73 2e 25 73 27 2c 73  printf('%s.%s',s
33a60 6e 61 6d 65 2c 74 62 6c 5f 6e 61 6d 65 29 29 22  name,tbl_name))"
33a70 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  , 0);.        }e
33a80 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 61  lse{.          a
33a90 70 70 65 6e 64 54 65 78 74 28 26 73 53 65 6c 65  ppendText(&sSele
33aa0 63 74 2c 20 22 6c 6f 77 65 72 28 74 62 6c 5f 6e  ct, "lower(tbl_n
33ab0 61 6d 65 29 22 2c 20 30 29 3b 0a 20 20 20 20 20  ame)", 0);.     
33ac0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 70 70     }.        app
33ad0 65 6e 64 54 65 78 74 28 26 73 53 65 6c 65 63 74  endText(&sSelect
33ae0 2c 20 62 47 6c 6f 62 20 3f 20 22 20 47 4c 4f 42  , bGlob ? " GLOB
33af0 20 22 20 3a 20 22 20 4c 49 4b 45 20 22 2c 20 30   " : " LIKE ", 0
33b00 29 3b 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e  );.        appen
33b10 64 54 65 78 74 28 26 73 53 65 6c 65 63 74 2c 20  dText(&sSelect, 
33b20 7a 51 61 72 67 2c 20 30 29 3b 0a 20 20 20 20 20  zQarg, 0);.     
33b30 20 20 20 69 66 28 20 21 62 47 6c 6f 62 20 29 7b     if( !bGlob ){
33b40 0a 20 20 20 20 20 20 20 20 20 20 61 70 70 65 6e  .          appen
33b50 64 54 65 78 74 28 26 73 53 65 6c 65 63 74 2c 20  dText(&sSelect, 
33b60 22 20 45 53 43 41 50 45 20 27 5c 5c 27 20 22 2c  " ESCAPE '\\' ",
33b70 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   0);.        }. 
33b80 20 20 20 20 20 20 20 61 70 70 65 6e 64 54 65 78         appendTex
33b90 74 28 26 73 53 65 6c 65 63 74 2c 20 22 20 41 4e  t(&sSelect, " AN
33ba0 44 20 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  D ", 0);.       
33bb0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 51   sqlite3_free(zQ
33bc0 61 72 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  arg);.      }.  
33bd0 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26      appendText(&
33be0 73 53 65 6c 65 63 74 2c 20 22 74 79 70 65 21 3d  sSelect, "type!=
33bf0 27 6d 65 74 61 27 20 41 4e 44 20 73 71 6c 20 49  'meta' AND sql I
33c00 53 20 4e 4f 54 20 4e 55 4c 4c 22 0a 20 20 20 20  S NOT NULL".    
33c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33c20 20 20 20 20 20 20 20 22 20 4f 52 44 45 52 20 42         " ORDER B
33c30 59 20 73 6e 75 6d 2c 20 72 6f 77 69 64 22 2c 20  Y snum, rowid", 
33c40 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 62 44  0);.      if( bD
33c50 65 62 75 67 20 29 7b 0a 20 20 20 20 20 20 20 20  ebug ){.        
33c60 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f  utf8_printf(p->o
33c70 75 74 2c 20 22 53 51 4c 3a 20 25 73 3b 5c 6e 22  ut, "SQL: %s;\n"
33c80 2c 20 73 53 65 6c 65 63 74 2e 7a 29 3b 0a 20 20  , sSelect.z);.  
33c90 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
33ca0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
33cb0 65 78 65 63 28 70 2d 3e 64 62 2c 20 73 53 65 6c  exec(p->db, sSel
33cc0 65 63 74 2e 7a 2c 20 63 61 6c 6c 62 61 63 6b 2c  ect.z, callback,
33cd0 20 26 64 61 74 61 2c 20 26 7a 45 72 72 4d 73 67   &data, &zErrMsg
33ce0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
33cf0 20 66 72 65 65 54 65 78 74 28 26 73 53 65 6c 65   freeText(&sSele
33d00 63 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ct);.    }.    i
33d10 66 28 20 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20  f( zErrMsg ){.  
33d20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
33d30 73 74 64 65 72 72 2c 22 45 72 72 6f 72 3a 20 25  stderr,"Error: %
33d40 73 5c 6e 22 2c 20 7a 45 72 72 4d 73 67 29 3b 0a  s\n", zErrMsg);.
33d50 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
33d60 65 65 28 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20  ee(zErrMsg);.   
33d70 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d     rc = 1;.    }
33d80 65 6c 73 65 20 69 66 28 20 72 63 20 21 3d 20 53  else if( rc != S
33d90 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
33da0 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64    raw_printf(std
33db0 65 72 72 2c 22 45 72 72 6f 72 3a 20 71 75 65 72  err,"Error: quer
33dc0 79 69 6e 67 20 73 63 68 65 6d 61 20 69 6e 66 6f  ying schema info
33dd0 72 6d 61 74 69 6f 6e 5c 6e 22 29 3b 0a 20 20 20  rmation\n");.   
33de0 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d     rc = 1;.    }
33df0 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
33e00 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73   0;.    }.  }els
33e10 65 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  e..#if defined(S
33e20 51 4c 49 54 45 5f 44 45 42 55 47 29 20 26 26 20  QLITE_DEBUG) && 
33e30 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
33e40 4e 41 42 4c 45 5f 53 45 4c 45 43 54 54 52 41 43  NABLE_SELECTTRAC
33e50 45 29 0a 20 20 69 66 28 20 63 3d 3d 27 73 27 20  E).  if( c=='s' 
33e60 26 26 20 6e 3d 3d 31 31 20 26 26 20 73 74 72 6e  && n==11 && strn
33e70 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 73  cmp(azArg[0], "s
33e80 65 6c 65 63 74 74 72 61 63 65 22 2c 20 6e 29 3d  electtrace", n)=
33e90 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
33ea0 33 53 65 6c 65 63 74 54 72 61 63 65 20 3d 20 28  3SelectTrace = (
33eb0 69 6e 74 29 69 6e 74 65 67 65 72 56 61 6c 75 65  int)integerValue
33ec0 28 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 7d 65  (azArg[1]);.  }e
33ed0 6c 73 65 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20  lse.#endif..#if 
33ee0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
33ef0 4e 41 42 4c 45 5f 53 45 53 53 49 4f 4e 29 0a 20  NABLE_SESSION). 
33f00 20 69 66 28 20 63 3d 3d 27 73 27 20 26 26 20 73   if( c=='s' && s
33f10 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c  trncmp(azArg[0],
33f20 22 73 65 73 73 69 6f 6e 22 2c 6e 29 3d 3d 30 20  "session",n)==0 
33f30 26 26 20 6e 3e 3d 33 20 29 7b 0a 20 20 20 20 4f  && n>=3 ){.    O
33f40 70 65 6e 53 65 73 73 69 6f 6e 20 2a 70 53 65 73  penSession *pSes
33f50 73 69 6f 6e 20 3d 20 26 70 2d 3e 61 53 65 73 73  sion = &p->aSess
33f60 69 6f 6e 5b 30 5d 3b 0a 20 20 20 20 63 68 61 72  ion[0];.    char
33f70 20 2a 2a 61 7a 43 6d 64 20 3d 20 26 61 7a 41 72   **azCmd = &azAr
33f80 67 5b 31 5d 3b 0a 20 20 20 20 69 6e 74 20 69 53  g[1];.    int iS
33f90 65 73 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20  es = 0;.    int 
33fa0 6e 43 6d 64 20 3d 20 6e 41 72 67 20 2d 20 31 3b  nCmd = nArg - 1;
33fb0 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
33fc0 69 66 28 20 6e 41 72 67 3c 3d 31 20 29 20 67 6f  if( nArg<=1 ) go
33fd0 74 6f 20 73 65 73 73 69 6f 6e 5f 73 79 6e 74 61  to session_synta
33fe0 78 5f 65 72 72 6f 72 3b 0a 20 20 20 20 6f 70 65  x_error;.    ope
33ff0 6e 5f 64 62 28 70 2c 20 30 29 3b 0a 20 20 20 20  n_db(p, 0);.    
34000 69 66 28 20 6e 41 72 67 3e 3d 33 20 29 7b 0a 20  if( nArg>=3 ){. 
34010 20 20 20 20 20 66 6f 72 28 69 53 65 73 3d 30 3b       for(iSes=0;
34020 20 69 53 65 73 3c 70 2d 3e 6e 53 65 73 73 69 6f   iSes<p->nSessio
34030 6e 3b 20 69 53 65 73 2b 2b 29 7b 0a 20 20 20 20  n; iSes++){.    
34040 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 70      if( strcmp(p
34050 2d 3e 61 53 65 73 73 69 6f 6e 5b 69 53 65 73 5d  ->aSession[iSes]
34060 2e 7a 4e 61 6d 65 2c 20 61 7a 41 72 67 5b 31 5d  .zName, azArg[1]
34070 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  )==0 ) break;.  
34080 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
34090 69 53 65 73 3c 70 2d 3e 6e 53 65 73 73 69 6f 6e  iSes<p->nSession
340a0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 53 65 73   ){.        pSes
340b0 73 69 6f 6e 20 3d 20 26 70 2d 3e 61 53 65 73 73  sion = &p->aSess
340c0 69 6f 6e 5b 69 53 65 73 5d 3b 0a 20 20 20 20 20  ion[iSes];.     
340d0 20 20 20 61 7a 43 6d 64 2b 2b 3b 0a 20 20 20 20     azCmd++;.    
340e0 20 20 20 20 6e 43 6d 64 2d 2d 3b 0a 20 20 20 20      nCmd--;.    
340f0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
34100 20 70 53 65 73 73 69 6f 6e 20 3d 20 26 70 2d 3e   pSession = &p->
34110 61 53 65 73 73 69 6f 6e 5b 30 5d 3b 0a 20 20 20  aSession[0];.   
34120 20 20 20 20 20 69 53 65 73 20 3d 20 30 3b 0a 20       iSes = 0;. 
34130 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
34140 20 20 2f 2a 20 2e 73 65 73 73 69 6f 6e 20 61 74    /* .session at
34150 74 61 63 68 20 54 41 42 4c 45 0a 20 20 20 20 2a  tach TABLE.    *
34160 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 73 71 6c  * Invoke the sql
34170 69 74 65 33 73 65 73 73 69 6f 6e 5f 61 74 74 61  ite3session_atta
34180 63 68 28 29 20 69 6e 74 65 72 66 61 63 65 20 74  ch() interface t
34190 6f 20 61 74 74 61 63 68 20 61 20 70 61 72 74 69  o attach a parti
341a0 63 75 6c 61 72 0a 20 20 20 20 2a 2a 20 74 61 62  cular.    ** tab
341b0 6c 65 20 73 6f 20 74 68 61 74 20 69 74 20 69 73  le so that it is
341c0 20 6e 65 76 65 72 20 66 69 6c 74 65 72 65 64 2e   never filtered.
341d0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
341e0 73 74 72 63 6d 70 28 61 7a 43 6d 64 5b 30 5d 2c  strcmp(azCmd[0],
341f0 22 61 74 74 61 63 68 22 29 3d 3d 30 20 29 7b 0a  "attach")==0 ){.
34200 20 20 20 20 20 20 69 66 28 20 6e 43 6d 64 21 3d        if( nCmd!=
34210 32 20 29 20 67 6f 74 6f 20 73 65 73 73 69 6f 6e  2 ) goto session
34220 5f 73 79 6e 74 61 78 5f 65 72 72 6f 72 3b 0a 20  _syntax_error;. 
34230 20 20 20 20 20 69 66 28 20 70 53 65 73 73 69 6f       if( pSessio
34240 6e 2d 3e 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20  n->p==0 ){.     
34250 20 20 20 73 65 73 73 69 6f 6e 5f 6e 6f 74 5f 6f     session_not_o
34260 70 65 6e 3a 0a 20 20 20 20 20 20 20 20 72 61 77  pen:.        raw
34270 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
34280 22 45 52 52 4f 52 3a 20 4e 6f 20 73 65 73 73 69  "ERROR: No sessi
34290 6f 6e 73 20 61 72 65 20 6f 70 65 6e 5c 6e 22 29  ons are open\n")
342a0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
342b0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
342c0 74 65 33 73 65 73 73 69 6f 6e 5f 61 74 74 61 63  te3session_attac
342d0 68 28 70 53 65 73 73 69 6f 6e 2d 3e 70 2c 20 61  h(pSession->p, a
342e0 7a 43 6d 64 5b 31 5d 29 3b 0a 20 20 20 20 20 20  zCmd[1]);.      
342f0 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
34300 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
34310 28 73 74 64 65 72 72 2c 20 22 45 52 52 4f 52 3a  (stderr, "ERROR:
34320 20 73 71 6c 69 74 65 33 73 65 73 73 69 6f 6e 5f   sqlite3session_
34330 61 74 74 61 63 68 28 29 20 72 65 74 75 72 6e 73  attach() returns
34340 20 25 64 5c 6e 22 2c 20 72 63 29 3b 0a 20 20 20   %d\n", rc);.   
34350 20 20 20 20 20 20 20 72 63 20 3d 20 30 3b 0a 20         rc = 0;. 
34360 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
34370 0a 20 20 20 20 7d 65 6c 73 65 0a 0a 20 20 20 20  .    }else..    
34380 2f 2a 20 2e 73 65 73 73 69 6f 6e 20 63 68 61 6e  /* .session chan
34390 67 65 73 65 74 20 46 49 4c 45 0a 20 20 20 20 2a  geset FILE.    *
343a0 2a 20 2e 73 65 73 73 69 6f 6e 20 70 61 74 63 68  * .session patch
343b0 73 65 74 20 46 49 4c 45 0a 20 20 20 20 2a 2a 20  set FILE.    ** 
343c0 57 72 69 74 65 20 61 20 63 68 61 6e 67 65 73 65  Write a changese
343d0 74 20 6f 72 20 70 61 74 63 68 73 65 74 20 69 6e  t or patchset in
343e0 74 6f 20 61 20 66 69 6c 65 2e 20 20 54 68 65 20  to a file.  The 
343f0 66 69 6c 65 20 69 73 20 6f 76 65 72 77 72 69 74  file is overwrit
34400 74 65 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ten..    */.    
34410 69 66 28 20 73 74 72 63 6d 70 28 61 7a 43 6d 64  if( strcmp(azCmd
34420 5b 30 5d 2c 22 63 68 61 6e 67 65 73 65 74 22 29  [0],"changeset")
34430 3d 3d 30 20 7c 7c 20 73 74 72 63 6d 70 28 61 7a  ==0 || strcmp(az
34440 43 6d 64 5b 30 5d 2c 22 70 61 74 63 68 73 65 74  Cmd[0],"patchset
34450 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 46  ")==0 ){.      F
34460 49 4c 45 20 2a 6f 75 74 20 3d 20 30 3b 0a 20 20  ILE *out = 0;.  
34470 20 20 20 20 69 66 28 20 6e 43 6d 64 21 3d 32 20      if( nCmd!=2 
34480 29 20 67 6f 74 6f 20 73 65 73 73 69 6f 6e 5f 73  ) goto session_s
34490 79 6e 74 61 78 5f 65 72 72 6f 72 3b 0a 20 20 20  yntax_error;.   
344a0 20 20 20 69 66 28 20 70 53 65 73 73 69 6f 6e 2d     if( pSession-
344b0 3e 70 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65 73  >p==0 ) goto ses
344c0 73 69 6f 6e 5f 6e 6f 74 5f 6f 70 65 6e 3b 0a 20  sion_not_open;. 
344d0 20 20 20 20 20 6f 75 74 20 3d 20 66 6f 70 65 6e       out = fopen
344e0 28 61 7a 43 6d 64 5b 31 5d 2c 20 22 77 62 22 29  (azCmd[1], "wb")
344f0 3b 0a 20 20 20 20 20 20 69 66 28 20 6f 75 74 3d  ;.      if( out=
34500 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74  =0 ){.        ut
34510 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  f8_printf(stderr
34520 2c 20 22 45 52 52 4f 52 3a 20 63 61 6e 6e 6f 74  , "ERROR: cannot
34530 20 6f 70 65 6e 20 5c 22 25 73 5c 22 20 66 6f 72   open \"%s\" for
34540 20 77 72 69 74 69 6e 67 5c 6e 22 2c 20 61 7a 43   writing\n", azC
34550 6d 64 5b 31 5d 29 3b 0a 20 20 20 20 20 20 7d 65  md[1]);.      }e
34560 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  lse{.        int
34570 20 73 7a 43 68 6e 67 3b 0a 20 20 20 20 20 20 20   szChng;.       
34580 20 76 6f 69 64 20 2a 70 43 68 6e 67 3b 0a 20 20   void *pChng;.  
34590 20 20 20 20 20 20 69 66 28 20 61 7a 43 6d 64 5b        if( azCmd[
345a0 30 5d 5b 30 5d 3d 3d 27 63 27 20 29 7b 0a 20 20  0][0]=='c' ){.  
345b0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
345c0 69 74 65 33 73 65 73 73 69 6f 6e 5f 63 68 61 6e  ite3session_chan
345d0 67 65 73 65 74 28 70 53 65 73 73 69 6f 6e 2d 3e  geset(pSession->
345e0 70 2c 20 26 73 7a 43 68 6e 67 2c 20 26 70 43 68  p, &szChng, &pCh
345f0 6e 67 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  ng);.        }el
34600 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63  se{.          rc
34610 20 3d 20 73 71 6c 69 74 65 33 73 65 73 73 69 6f   = sqlite3sessio
34620 6e 5f 70 61 74 63 68 73 65 74 28 70 53 65 73 73  n_patchset(pSess
34630 69 6f 6e 2d 3e 70 2c 20 26 73 7a 43 68 6e 67 2c  ion->p, &szChng,
34640 20 26 70 43 68 6e 67 29 3b 0a 20 20 20 20 20 20   &pChng);.      
34650 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
34660 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  rc ){.          
34670 70 72 69 6e 74 66 28 22 45 72 72 6f 72 3a 20 65  printf("Error: e
34680 72 72 6f 72 20 63 6f 64 65 20 25 64 5c 6e 22 2c  rror code %d\n",
34690 20 72 63 29 3b 0a 20 20 20 20 20 20 20 20 20 20   rc);.          
346a0 72 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  rc = 0;.        
346b0 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 43  }.        if( pC
346c0 68 6e 67 0a 20 20 20 20 20 20 20 20 20 20 26 26  hng.          &&
346d0 20 66 77 72 69 74 65 28 70 43 68 6e 67 2c 20 73   fwrite(pChng, s
346e0 7a 43 68 6e 67 2c 20 31 2c 20 6f 75 74 29 21 3d  zChng, 1, out)!=
346f0 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  1 ){.          r
34700 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  aw_printf(stderr
34710 2c 20 22 45 52 52 4f 52 3a 20 46 61 69 6c 65 64  , "ERROR: Failed
34720 20 74 6f 20 77 72 69 74 65 20 65 6e 74 69 72 65   to write entire
34730 20 25 64 2d 62 79 74 65 20 6f 75 74 70 75 74 5c   %d-byte output\
34740 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
34750 20 20 20 20 20 20 73 7a 43 68 6e 67 29 3b 0a 20        szChng);. 
34760 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
34770 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43   sqlite3_free(pC
34780 68 6e 67 29 3b 0a 20 20 20 20 20 20 20 20 66 63  hng);.        fc
34790 6c 6f 73 65 28 6f 75 74 29 3b 0a 20 20 20 20 20  lose(out);.     
347a0 20 7d 0a 20 20 20 20 7d 65 6c 73 65 0a 0a 20 20   }.    }else..  
347b0 20 20 2f 2a 20 2e 73 65 73 73 69 6f 6e 20 63 6c    /* .session cl
347c0 6f 73 65 0a 20 20 20 20 2a 2a 20 43 6c 6f 73 65  ose.    ** Close
347d0 20 74 68 65 20 69 64 65 6e 74 69 66 69 65 64 20   the identified 
347e0 73 65 73 73 69 6f 6e 0a 20 20 20 20 2a 2f 0a 20  session.    */. 
347f0 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 61 7a     if( strcmp(az
34800 43 6d 64 5b 30 5d 2c 20 22 63 6c 6f 73 65 22 29  Cmd[0], "close")
34810 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ==0 ){.      if(
34820 20 6e 43 6d 64 21 3d 31 20 29 20 67 6f 74 6f 20   nCmd!=1 ) goto 
34830 73 65 73 73 69 6f 6e 5f 73 79 6e 74 61 78 5f 65  session_syntax_e
34840 72 72 6f 72 3b 0a 20 20 20 20 20 20 69 66 28 20  rror;.      if( 
34850 70 2d 3e 6e 53 65 73 73 69 6f 6e 20 29 7b 0a 20  p->nSession ){. 
34860 20 20 20 20 20 20 20 73 65 73 73 69 6f 6e 5f 63         session_c
34870 6c 6f 73 65 28 70 53 65 73 73 69 6f 6e 29 3b 0a  lose(pSession);.
34880 20 20 20 20 20 20 20 20 70 2d 3e 61 53 65 73 73          p->aSess
34890 69 6f 6e 5b 69 53 65 73 5d 20 3d 20 70 2d 3e 61  ion[iSes] = p->a
348a0 53 65 73 73 69 6f 6e 5b 2d 2d 70 2d 3e 6e 53 65  Session[--p->nSe
348b0 73 73 69 6f 6e 5d 3b 0a 20 20 20 20 20 20 7d 0a  ssion];.      }.
348c0 20 20 20 20 7d 65 6c 73 65 0a 0a 20 20 20 20 2f      }else..    /
348d0 2a 20 2e 73 65 73 73 69 6f 6e 20 65 6e 61 62 6c  * .session enabl
348e0 65 20 3f 42 4f 4f 4c 45 41 4e 3f 0a 20 20 20 20  e ?BOOLEAN?.    
348f0 2a 2a 20 51 75 65 72 79 20 6f 72 20 73 65 74 20  ** Query or set 
34900 74 68 65 20 65 6e 61 62 6c 65 20 66 6c 61 67 0a  the enable flag.
34910 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73      */.    if( s
34920 74 72 63 6d 70 28 61 7a 43 6d 64 5b 30 5d 2c 20  trcmp(azCmd[0], 
34930 22 65 6e 61 62 6c 65 22 29 3d 3d 30 20 29 7b 0a  "enable")==0 ){.
34940 20 20 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20        int ii;.  
34950 20 20 20 20 69 66 28 20 6e 43 6d 64 3e 32 20 29      if( nCmd>2 )
34960 20 67 6f 74 6f 20 73 65 73 73 69 6f 6e 5f 73 79   goto session_sy
34970 6e 74 61 78 5f 65 72 72 6f 72 3b 0a 20 20 20 20  ntax_error;.    
34980 20 20 69 69 20 3d 20 6e 43 6d 64 3d 3d 31 20 3f    ii = nCmd==1 ?
34990 20 2d 31 20 3a 20 62 6f 6f 6c 65 61 6e 56 61 6c   -1 : booleanVal
349a0 75 65 28 61 7a 43 6d 64 5b 31 5d 29 3b 0a 20 20  ue(azCmd[1]);.  
349b0 20 20 20 20 69 66 28 20 70 2d 3e 6e 53 65 73 73      if( p->nSess
349c0 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ion ){.        i
349d0 69 20 3d 20 73 71 6c 69 74 65 33 73 65 73 73 69  i = sqlite3sessi
349e0 6f 6e 5f 65 6e 61 62 6c 65 28 70 53 65 73 73 69  on_enable(pSessi
349f0 6f 6e 2d 3e 70 2c 20 69 69 29 3b 0a 20 20 20 20  on->p, ii);.    
34a00 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
34a10 70 2d 3e 6f 75 74 2c 20 22 73 65 73 73 69 6f 6e  p->out, "session
34a20 20 25 73 20 65 6e 61 62 6c 65 20 66 6c 61 67 20   %s enable flag 
34a30 3d 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  = %d\n",.       
34a40 20 20 20 20 20 20 20 20 20 20 20 20 20 70 53 65               pSe
34a50 73 73 69 6f 6e 2d 3e 7a 4e 61 6d 65 2c 20 69 69  ssion->zName, ii
34a60 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
34a70 65 6c 73 65 0a 0a 20 20 20 20 2f 2a 20 2e 73 65  else..    /* .se
34a80 73 73 69 6f 6e 20 66 69 6c 74 65 72 20 47 4c 4f  ssion filter GLO
34a90 42 20 2e 2e 2e 2e 0a 20 20 20 20 2a 2a 20 53 65  B .....    ** Se
34aa0 74 20 61 20 6c 69 73 74 20 6f 66 20 47 4c 4f 42  t a list of GLOB
34ab0 20 70 61 74 74 65 72 6e 73 20 6f 66 20 74 61 62   patterns of tab
34ac0 6c 65 20 6e 61 6d 65 73 20 74 6f 20 62 65 20 65  le names to be e
34ad0 78 63 6c 75 64 65 64 2e 0a 20 20 20 20 2a 2f 0a  xcluded..    */.
34ae0 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 61      if( strcmp(a
34af0 7a 43 6d 64 5b 30 5d 2c 20 22 66 69 6c 74 65 72  zCmd[0], "filter
34b00 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  ")==0 ){.      i
34b10 6e 74 20 69 69 2c 20 6e 42 79 74 65 3b 0a 20 20  nt ii, nByte;.  
34b20 20 20 20 20 69 66 28 20 6e 43 6d 64 3c 32 20 29      if( nCmd<2 )
34b30 20 67 6f 74 6f 20 73 65 73 73 69 6f 6e 5f 73 79   goto session_sy
34b40 6e 74 61 78 5f 65 72 72 6f 72 3b 0a 20 20 20 20  ntax_error;.    
34b50 20 20 69 66 28 20 70 2d 3e 6e 53 65 73 73 69 6f    if( p->nSessio
34b60 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6f 72  n ){.        for
34b70 28 69 69 3d 30 3b 20 69 69 3c 70 53 65 73 73 69  (ii=0; ii<pSessi
34b80 6f 6e 2d 3e 6e 46 69 6c 74 65 72 3b 20 69 69 2b  on->nFilter; ii+
34b90 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71  +){.          sq
34ba0 6c 69 74 65 33 5f 66 72 65 65 28 70 53 65 73 73  lite3_free(pSess
34bb0 69 6f 6e 2d 3e 61 7a 46 69 6c 74 65 72 5b 69 69  ion->azFilter[ii
34bc0 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ]);.        }.  
34bd0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
34be0 65 65 28 70 53 65 73 73 69 6f 6e 2d 3e 61 7a 46  ee(pSession->azF
34bf0 69 6c 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20  ilter);.        
34c00 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 70  nByte = sizeof(p
34c10 53 65 73 73 69 6f 6e 2d 3e 61 7a 46 69 6c 74 65  Session->azFilte
34c20 72 5b 30 5d 29 2a 28 6e 43 6d 64 2d 31 29 3b 0a  r[0])*(nCmd-1);.
34c30 20 20 20 20 20 20 20 20 70 53 65 73 73 69 6f 6e          pSession
34c40 2d 3e 61 7a 46 69 6c 74 65 72 20 3d 20 73 71 6c  ->azFilter = sql
34c50 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 6e 42 79  ite3_malloc( nBy
34c60 74 65 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  te );.        if
34c70 28 20 70 53 65 73 73 69 6f 6e 2d 3e 61 7a 46 69  ( pSession->azFi
34c80 6c 74 65 72 3d 3d 30 20 29 7b 0a 20 20 20 20 20  lter==0 ){.     
34c90 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
34ca0 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20  stderr, "Error: 
34cb0 6f 75 74 20 6f 72 20 6d 65 6d 6f 72 79 5c 6e 22  out or memory\n"
34cc0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 65 78 69  );.          exi
34cd0 74 28 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  t(1);.        }.
34ce0 20 20 20 20 20 20 20 20 66 6f 72 28 69 69 3d 31          for(ii=1
34cf0 3b 20 69 69 3c 6e 43 6d 64 3b 20 69 69 2b 2b 29  ; ii<nCmd; ii++)
34d00 7b 0a 20 20 20 20 20 20 20 20 20 20 70 53 65 73  {.          pSes
34d10 73 69 6f 6e 2d 3e 61 7a 46 69 6c 74 65 72 5b 69  sion->azFilter[i
34d20 69 2d 31 5d 20 3d 20 73 71 6c 69 74 65 33 5f 6d  i-1] = sqlite3_m
34d30 70 72 69 6e 74 66 28 22 25 73 22 2c 20 61 7a 43  printf("%s", azC
34d40 6d 64 5b 69 69 5d 29 3b 0a 20 20 20 20 20 20 20  md[ii]);.       
34d50 20 7d 0a 20 20 20 20 20 20 20 20 70 53 65 73 73   }.        pSess
34d60 69 6f 6e 2d 3e 6e 46 69 6c 74 65 72 20 3d 20 69  ion->nFilter = i
34d70 69 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  i-1;.      }.   
34d80 20 7d 65 6c 73 65 0a 0a 20 20 20 20 2f 2a 20 2e   }else..    /* .
34d90 73 65 73 73 69 6f 6e 20 69 6e 64 69 72 65 63 74  session indirect
34da0 20 3f 42 4f 4f 4c 45 41 4e 3f 0a 20 20 20 20 2a   ?BOOLEAN?.    *
34db0 2a 20 51 75 65 72 79 20 6f 72 20 73 65 74 20 74  * Query or set t
34dc0 68 65 20 69 6e 64 69 72 65 63 74 20 66 6c 61 67  he indirect flag
34dd0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
34de0 73 74 72 63 6d 70 28 61 7a 43 6d 64 5b 30 5d 2c  strcmp(azCmd[0],
34df0 20 22 69 6e 64 69 72 65 63 74 22 29 3d 3d 30 20   "indirect")==0 
34e00 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 69 3b  ){.      int ii;
34e10 0a 20 20 20 20 20 20 69 66 28 20 6e 43 6d 64 3e  .      if( nCmd>
34e20 32 20 29 20 67 6f 74 6f 20 73 65 73 73 69 6f 6e  2 ) goto session
34e30 5f 73 79 6e 74 61 78 5f 65 72 72 6f 72 3b 0a 20  _syntax_error;. 
34e40 20 20 20 20 20 69 69 20 3d 20 6e 43 6d 64 3d 3d       ii = nCmd==
34e50 31 20 3f 20 2d 31 20 3a 20 62 6f 6f 6c 65 61 6e  1 ? -1 : boolean
34e60 56 61 6c 75 65 28 61 7a 43 6d 64 5b 31 5d 29 3b  Value(azCmd[1]);
34e70 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6e 53  .      if( p->nS
34e80 65 73 73 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20  ession ){.      
34e90 20 20 69 69 20 3d 20 73 71 6c 69 74 65 33 73 65    ii = sqlite3se
34ea0 73 73 69 6f 6e 5f 69 6e 64 69 72 65 63 74 28 70  ssion_indirect(p
34eb0 53 65 73 73 69 6f 6e 2d 3e 70 2c 20 69 69 29 3b  Session->p, ii);
34ec0 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72  .        utf8_pr
34ed0 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 73 65  intf(p->out, "se
34ee0 73 73 69 6f 6e 20 25 73 20 69 6e 64 69 72 65 63  ssion %s indirec
34ef0 74 20 66 6c 61 67 20 3d 20 25 64 5c 6e 22 2c 0a  t flag = %d\n",.
34f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34f10 20 20 20 20 70 53 65 73 73 69 6f 6e 2d 3e 7a 4e      pSession->zN
34f20 61 6d 65 2c 20 69 69 29 3b 0a 20 20 20 20 20 20  ame, ii);.      
34f30 7d 0a 20 20 20 20 7d 65 6c 73 65 0a 0a 20 20 20  }.    }else..   
34f40 20 2f 2a 20 2e 73 65 73 73 69 6f 6e 20 69 73 65   /* .session ise
34f50 6d 70 74 79 0a 20 20 20 20 2a 2a 20 44 65 74 65  mpty.    ** Dete
34f60 72 6d 69 6e 65 20 69 66 20 74 68 65 20 73 65 73  rmine if the ses
34f70 73 69 6f 6e 20 69 73 20 65 6d 70 74 79 0a 20 20  sion is empty.  
34f80 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 74 72    */.    if( str
34f90 63 6d 70 28 61 7a 43 6d 64 5b 30 5d 2c 20 22 69  cmp(azCmd[0], "i
34fa0 73 65 6d 70 74 79 22 29 3d 3d 30 20 29 7b 0a 20  sempty")==0 ){. 
34fb0 20 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20       int ii;.   
34fc0 20 20 20 69 66 28 20 6e 43 6d 64 21 3d 31 20 29     if( nCmd!=1 )
34fd0 20 67 6f 74 6f 20 73 65 73 73 69 6f 6e 5f 73 79   goto session_sy
34fe0 6e 74 61 78 5f 65 72 72 6f 72 3b 0a 20 20 20 20  ntax_error;.    
34ff0 20 20 69 66 28 20 70 2d 3e 6e 53 65 73 73 69 6f    if( p->nSessio
35000 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 69 69 20  n ){.        ii 
35010 3d 20 73 71 6c 69 74 65 33 73 65 73 73 69 6f 6e  = sqlite3session
35020 5f 69 73 65 6d 70 74 79 28 70 53 65 73 73 69 6f  _isempty(pSessio
35030 6e 2d 3e 70 29 3b 0a 20 20 20 20 20 20 20 20 75  n->p);.        u
35040 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  tf8_printf(p->ou
35050 74 2c 20 22 73 65 73 73 69 6f 6e 20 25 73 20 69  t, "session %s i
35060 73 65 6d 70 74 79 20 66 6c 61 67 20 3d 20 25 64  sempty flag = %d
35070 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
35080 20 20 20 20 20 20 20 20 20 70 53 65 73 73 69 6f           pSessio
35090 6e 2d 3e 7a 4e 61 6d 65 2c 20 69 69 29 3b 0a 20  n->zName, ii);. 
350a0 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
350b0 0a 0a 20 20 20 20 2f 2a 20 2e 73 65 73 73 69 6f  ..    /* .sessio
350c0 6e 20 6c 69 73 74 0a 20 20 20 20 2a 2a 20 4c 69  n list.    ** Li
350d0 73 74 20 61 6c 6c 20 63 75 72 72 65 6e 74 6c 79  st all currently
350e0 20 6f 70 65 6e 20 73 65 73 73 69 6f 6e 73 0a 20   open sessions. 
350f0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 74     */.    if( st
35100 72 63 6d 70 28 61 7a 43 6d 64 5b 30 5d 2c 22 6c  rcmp(azCmd[0],"l
35110 69 73 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ist")==0 ){.    
35120 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
35130 6e 53 65 73 73 69 6f 6e 3b 20 69 2b 2b 29 7b 0a  nSession; i++){.
35140 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69          utf8_pri
35150 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 64 20  ntf(p->out, "%d 
35160 25 73 5c 6e 22 2c 20 69 2c 20 70 2d 3e 61 53 65  %s\n", i, p->aSe
35170 73 73 69 6f 6e 5b 69 5d 2e 7a 4e 61 6d 65 29 3b  ssion[i].zName);
35180 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
35190 73 65 0a 0a 20 20 20 20 2f 2a 20 2e 73 65 73 73  se..    /* .sess
351a0 69 6f 6e 20 6f 70 65 6e 20 44 42 20 4e 41 4d 45  ion open DB NAME
351b0 0a 20 20 20 20 2a 2a 20 4f 70 65 6e 20 61 20 6e  .    ** Open a n
351c0 65 77 20 73 65 73 73 69 6f 6e 20 63 61 6c 6c 65  ew session calle
351d0 64 20 4e 41 4d 45 20 6f 6e 20 74 68 65 20 61 74  d NAME on the at
351e0 74 61 63 68 65 64 20 64 61 74 61 62 61 73 65 20  tached database 
351f0 44 42 2e 0a 20 20 20 20 2a 2a 20 44 42 20 69 73  DB..    ** DB is
35200 20 6e 6f 72 6d 61 6c 6c 79 20 22 6d 61 69 6e 22   normally "main"
35210 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
35220 20 73 74 72 63 6d 70 28 61 7a 43 6d 64 5b 30 5d   strcmp(azCmd[0]
35230 2c 22 6f 70 65 6e 22 29 3d 3d 30 20 29 7b 0a 20  ,"open")==0 ){. 
35240 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65       char *zName
35250 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 43 6d 64  ;.      if( nCmd
35260 21 3d 33 20 29 20 67 6f 74 6f 20 73 65 73 73 69  !=3 ) goto sessi
35270 6f 6e 5f 73 79 6e 74 61 78 5f 65 72 72 6f 72 3b  on_syntax_error;
35280 0a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 61  .      zName = a
35290 7a 43 6d 64 5b 32 5d 3b 0a 20 20 20 20 20 20 69  zCmd[2];.      i
352a0 66 28 20 7a 4e 61 6d 65 5b 30 5d 3d 3d 30 20 29  f( zName[0]==0 )
352b0 20 67 6f 74 6f 20 73 65 73 73 69 6f 6e 5f 73 79   goto session_sy
352c0 6e 74 61 78 5f 65 72 72 6f 72 3b 0a 20 20 20 20  ntax_error;.    
352d0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
352e0 6e 53 65 73 73 69 6f 6e 3b 20 69 2b 2b 29 7b 0a  nSession; i++){.
352f0 20 20 20 20 20 20 20 20 69 66 28 20 73 74 72 63          if( strc
35300 6d 70 28 70 2d 3e 61 53 65 73 73 69 6f 6e 5b 69  mp(p->aSession[i
35310 5d 2e 7a 4e 61 6d 65 2c 7a 4e 61 6d 65 29 3d 3d  ].zName,zName)==
35320 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75  0 ){.          u
35330 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72  tf8_printf(stder
35340 72 2c 20 22 53 65 73 73 69 6f 6e 20 5c 22 25 73  r, "Session \"%s
35350 5c 22 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  \" already exist
35360 73 5c 6e 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  s\n", zName);.  
35370 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 65 74          goto met
35380 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a  a_command_exit;.
35390 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
353a0 7d 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6e  }.      if( p->n
353b0 53 65 73 73 69 6f 6e 3e 3d 41 72 72 61 79 53 69  Session>=ArraySi
353c0 7a 65 28 70 2d 3e 61 53 65 73 73 69 6f 6e 29 20  ze(p->aSession) 
353d0 29 7b 0a 20 20 20 20 20 20 20 20 72 61 77 5f 70  ){.        raw_p
353e0 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 4d  rintf(stderr, "M
353f0 61 78 69 6d 75 6d 20 6f 66 20 25 64 20 73 65 73  aximum of %d ses
35400 73 69 6f 6e 73 5c 6e 22 2c 20 41 72 72 61 79 53  sions\n", ArrayS
35410 69 7a 65 28 70 2d 3e 61 53 65 73 73 69 6f 6e 29  ize(p->aSession)
35420 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  );.        goto 
35430 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69  meta_command_exi
35440 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  t;.      }.     
35450 20 70 53 65 73 73 69 6f 6e 20 3d 20 26 70 2d 3e   pSession = &p->
35460 61 53 65 73 73 69 6f 6e 5b 70 2d 3e 6e 53 65 73  aSession[p->nSes
35470 73 69 6f 6e 5d 3b 0a 20 20 20 20 20 20 72 63 20  sion];.      rc 
35480 3d 20 73 71 6c 69 74 65 33 73 65 73 73 69 6f 6e  = sqlite3session
35490 5f 63 72 65 61 74 65 28 70 2d 3e 64 62 2c 20 61  _create(p->db, a
354a0 7a 43 6d 64 5b 31 5d 2c 20 26 70 53 65 73 73 69  zCmd[1], &pSessi
354b0 6f 6e 2d 3e 70 29 3b 0a 20 20 20 20 20 20 69 66  on->p);.      if
354c0 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
354d0 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72  raw_printf(stder
354e0 72 2c 20 22 43 61 6e 6e 6f 74 20 6f 70 65 6e 20  r, "Cannot open 
354f0 73 65 73 73 69 6f 6e 3a 20 65 72 72 6f 72 20 63  session: error c
35500 6f 64 65 3d 25 64 5c 6e 22 2c 20 72 63 29 3b 0a  ode=%d\n", rc);.
35510 20 20 20 20 20 20 20 20 72 63 20 3d 20 30 3b 0a          rc = 0;.
35520 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 65 74          goto met
35530 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a  a_command_exit;.
35540 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 53        }.      pS
35550 65 73 73 69 6f 6e 2d 3e 6e 46 69 6c 74 65 72 20  ession->nFilter 
35560 3d 20 30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  = 0;.      sqlit
35570 65 33 73 65 73 73 69 6f 6e 5f 74 61 62 6c 65 5f  e3session_table_
35580 66 69 6c 74 65 72 28 70 53 65 73 73 69 6f 6e 2d  filter(pSession-
35590 3e 70 2c 20 73 65 73 73 69 6f 6e 5f 66 69 6c 74  >p, session_filt
355a0 65 72 2c 20 70 53 65 73 73 69 6f 6e 29 3b 0a 20  er, pSession);. 
355b0 20 20 20 20 20 70 2d 3e 6e 53 65 73 73 69 6f 6e       p->nSession
355c0 2b 2b 3b 0a 20 20 20 20 20 20 70 53 65 73 73 69  ++;.      pSessi
355d0 6f 6e 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69  on->zName = sqli
355e0 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 22  te3_mprintf("%s"
355f0 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65  , zName);.    }e
35600 6c 73 65 0a 20 20 20 20 2f 2a 20 49 66 20 6e 6f  lse.    /* If no
35610 20 63 6f 6d 6d 61 6e 64 20 6e 61 6d 65 20 6d 61   command name ma
35620 74 63 68 65 73 2c 20 73 68 6f 77 20 61 20 73 79  tches, show a sy
35630 6e 74 61 78 20 65 72 72 6f 72 20 2a 2f 0a 20 20  ntax error */.  
35640 20 20 73 65 73 73 69 6f 6e 5f 73 79 6e 74 61 78    session_syntax
35650 5f 65 72 72 6f 72 3a 0a 20 20 20 20 73 65 73 73  _error:.    sess
35660 69 6f 6e 5f 68 65 6c 70 28 70 29 3b 0a 20 20 7d  ion_help(p);.  }
35670 65 6c 73 65 0a 23 65 6e 64 69 66 0a 0a 23 69 66  else.#endif..#if
35680 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
35690 0a 20 20 2f 2a 20 55 6e 64 6f 63 75 6d 65 6e 74  .  /* Undocument
356a0 65 64 20 63 6f 6d 6d 61 6e 64 73 20 66 6f 72 20  ed commands for 
356b0 69 6e 74 65 72 6e 61 6c 20 74 65 73 74 69 6e 67  internal testing
356c0 2e 20 20 53 75 62 6a 65 63 74 20 74 6f 20 63 68  .  Subject to ch
356d0 61 6e 67 65 0a 20 20 2a 2a 20 77 69 74 68 6f 75  ange.  ** withou
356e0 74 20 6e 6f 74 69 63 65 2e 20 2a 2f 0a 20 20 69  t notice. */.  i
356f0 66 28 20 63 3d 3d 27 73 27 20 26 26 20 6e 3e 3d  f( c=='s' && n>=
35700 31 30 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a  10 && strncmp(az
35710 41 72 67 5b 30 5d 2c 20 22 73 65 6c 66 74 65 73  Arg[0], "selftes
35720 74 2d 22 2c 20 39 29 3d 3d 30 20 29 7b 0a 20 20  t-", 9)==0 ){.  
35730 20 20 69 66 28 20 73 74 72 6e 63 6d 70 28 61 7a    if( strncmp(az
35740 41 72 67 5b 30 5d 2b 39 2c 20 22 62 6f 6f 6c 65  Arg[0]+9, "boole
35750 61 6e 22 2c 20 6e 2d 39 29 3d 3d 30 20 29 7b 0a  an", n-9)==0 ){.
35760 20 20 20 20 20 20 69 6e 74 20 69 2c 20 76 3b 0a        int i, v;.
35770 20 20 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69        for(i=1; i
35780 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nArg; i++){.   
35790 20 20 20 20 20 76 20 3d 20 62 6f 6f 6c 65 61 6e       v = boolean
357a0 56 61 6c 75 65 28 61 7a 41 72 67 5b 69 5d 29 3b  Value(azArg[i]);
357b0 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72  .        utf8_pr
357c0 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73  intf(p->out, "%s
357d0 3a 20 25 64 20 30 78 25 78 5c 6e 22 2c 20 61 7a  : %d 0x%x\n", az
357e0 41 72 67 5b 69 5d 2c 20 76 2c 20 76 29 3b 0a 20  Arg[i], v, v);. 
357f0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
35800 20 69 66 28 20 73 74 72 6e 63 6d 70 28 61 7a 41   if( strncmp(azA
35810 72 67 5b 30 5d 2b 39 2c 20 22 69 6e 74 65 67 65  rg[0]+9, "intege
35820 72 22 2c 20 6e 2d 39 29 3d 3d 30 20 29 7b 0a 20  r", n-9)==0 ){. 
35830 20 20 20 20 20 69 6e 74 20 69 3b 20 73 71 6c 69       int i; sqli
35840 74 65 33 5f 69 6e 74 36 34 20 76 3b 0a 20 20 20  te3_int64 v;.   
35850 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 41     for(i=1; i<nA
35860 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  rg; i++){.      
35870 20 20 63 68 61 72 20 7a 42 75 66 5b 32 30 30 5d    char zBuf[200]
35880 3b 0a 20 20 20 20 20 20 20 20 76 20 3d 20 69 6e  ;.        v = in
35890 74 65 67 65 72 56 61 6c 75 65 28 61 7a 41 72 67  tegerValue(azArg
358a0 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 73 71  [i]);.        sq
358b0 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
358c0 69 7a 65 6f 66 28 7a 42 75 66 29 2c 7a 42 75 66  izeof(zBuf),zBuf
358d0 2c 22 25 73 3a 20 25 6c 6c 64 20 30 78 25 6c 6c  ,"%s: %lld 0x%ll
358e0 78 5c 6e 22 2c 20 61 7a 41 72 67 5b 69 5d 2c 76  x\n", azArg[i],v
358f0 2c 76 29 3b 0a 20 20 20 20 20 20 20 20 75 74 66  ,v);.        utf
35900 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  8_printf(p->out,
35910 20 22 25 73 22 2c 20 7a 42 75 66 29 3b 0a 20 20   "%s", zBuf);.  
35920 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65      }.    }.  }e
35930 6c 73 65 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66  lse.#endif..  if
35940 28 20 63 3d 3d 27 73 27 20 26 26 20 6e 3e 3d 34  ( c=='s' && n>=4
35950 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72   && strncmp(azAr
35960 67 5b 30 5d 2c 22 73 65 6c 66 74 65 73 74 22 2c  g[0],"selftest",
35970 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74  n)==0 ){.    int
35980 20 62 49 73 49 6e 69 74 20 3d 20 30 3b 20 20 20   bIsInit = 0;   
35990 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f        /* True to
359a0 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   initialize the 
359b0 53 45 4c 46 54 45 53 54 20 74 61 62 6c 65 20 2a  SELFTEST table *
359c0 2f 0a 20 20 20 20 69 6e 74 20 62 56 65 72 62 6f  /.    int bVerbo
359d0 73 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f  se = 0;        /
359e0 2a 20 56 65 72 62 6f 73 65 20 6f 75 74 70 75 74  * Verbose output
359f0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 62 53 65 6c   */.    int bSel
35a00 66 74 65 73 74 45 78 69 73 74 73 3b 20 20 20 20  ftestExists;    
35a10 20 2f 2a 20 54 72 75 65 20 69 66 20 53 45 4c 46   /* True if SELF
35a20 54 45 53 54 20 61 6c 72 65 61 64 79 20 65 78 69  TEST already exi
35a30 73 74 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  sts */.    int i
35a40 2c 20 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  , k;            
35a50 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
35a60 74 65 72 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ters */.    int 
35a70 6e 54 65 73 74 20 3d 20 30 3b 20 20 20 20 20 20  nTest = 0;      
35a80 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
35a90 66 20 74 65 73 74 73 20 72 75 6e 73 20 2a 2f 0a  f tests runs */.
35aa0 20 20 20 20 69 6e 74 20 6e 45 72 72 20 3d 20 30      int nErr = 0
35ab0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
35ac0 4e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73  Number of errors
35ad0 20 73 65 65 6e 20 2a 2f 0a 20 20 20 20 53 68 65   seen */.    She
35ae0 6c 6c 54 65 78 74 20 73 74 72 3b 20 20 20 20 20  llText str;     
35af0 20 20 20 20 20 20 2f 2a 20 41 6e 73 77 65 72 20        /* Answer 
35b00 66 6f 72 20 61 20 71 75 65 72 79 20 2a 2f 0a 20  for a query */. 
35b10 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20     sqlite3_stmt 
35b20 2a 70 53 74 6d 74 20 3d 20 30 3b 20 2f 2a 20 51  *pStmt = 0; /* Q
35b30 75 65 72 79 20 61 67 61 69 6e 73 74 20 74 68 65  uery against the
35b40 20 53 45 4c 46 54 45 53 54 20 74 61 62 6c 65 20   SELFTEST table 
35b50 2a 2f 0a 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28  */..    open_db(
35b60 70 2c 30 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  p,0);.    for(i=
35b70 31 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b  1; i<nArg; i++){
35b80 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
35b90 72 20 2a 7a 20 3d 20 61 7a 41 72 67 5b 69 5d 3b  r *z = azArg[i];
35ba0 0a 20 20 20 20 20 20 69 66 28 20 7a 5b 30 5d 3d  .      if( z[0]=
35bb0 3d 27 2d 27 20 26 26 20 7a 5b 31 5d 3d 3d 27 2d  ='-' && z[1]=='-
35bc0 27 20 29 20 7a 2b 2b 3b 0a 20 20 20 20 20 20 69  ' ) z++;.      i
35bd0 66 28 20 73 74 72 63 6d 70 28 7a 2c 22 2d 69 6e  f( strcmp(z,"-in
35be0 69 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  it")==0 ){.     
35bf0 20 20 20 62 49 73 49 6e 69 74 20 3d 20 31 3b 0a     bIsInit = 1;.
35c00 20 20 20 20 20 20 7d 65 6c 73 65 0a 20 20 20 20        }else.    
35c10 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 22    if( strcmp(z,"
35c20 2d 76 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  -v")==0 ){.     
35c30 20 20 20 62 56 65 72 62 6f 73 65 2b 2b 3b 0a 20     bVerbose++;. 
35c40 20 20 20 20 20 7d 65 6c 73 65 0a 20 20 20 20 20       }else.     
35c50 20 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f   {.        utf8_
35c60 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
35c70 55 6e 6b 6e 6f 77 6e 20 6f 70 74 69 6f 6e 20 5c  Unknown option \
35c80 22 25 73 5c 22 20 6f 6e 20 5c 22 25 73 5c 22 5c  "%s\" on \"%s\"\
35c90 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
35ca0 20 20 20 20 20 20 20 20 61 7a 41 72 67 5b 69 5d          azArg[i]
35cb0 2c 20 61 7a 41 72 67 5b 30 5d 29 3b 0a 20 20 20  , azArg[0]);.   
35cc0 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
35cd0 73 74 64 65 72 72 2c 20 22 53 68 6f 75 6c 64 20  stderr, "Should 
35ce0 62 65 20 6f 6e 65 20 6f 66 3a 20 2d 2d 69 6e 69  be one of: --ini
35cf0 74 20 2d 76 5c 6e 22 29 3b 0a 20 20 20 20 20 20  t -v\n");.      
35d00 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20    rc = 1;.      
35d10 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d    goto meta_comm
35d20 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20 20 20  and_exit;.      
35d30 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
35d40 73 71 6c 69 74 65 33 5f 74 61 62 6c 65 5f 63 6f  sqlite3_table_co
35d50 6c 75 6d 6e 5f 6d 65 74 61 64 61 74 61 28 70 2d  lumn_metadata(p-
35d60 3e 64 62 2c 22 6d 61 69 6e 22 2c 22 73 65 6c 66  >db,"main","self
35d70 74 65 73 74 22 2c 30 2c 30 2c 30 2c 30 2c 30 2c  test",0,0,0,0,0,
35d80 30 29 0a 20 20 20 20 20 20 20 20 20 20 20 21 3d  0).           !=
35d90 20 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20   SQLITE_OK ){.  
35da0 20 20 20 20 62 53 65 6c 66 74 65 73 74 45 78 69      bSelftestExi
35db0 73 74 73 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  sts = 0;.    }el
35dc0 73 65 7b 0a 20 20 20 20 20 20 62 53 65 6c 66 74  se{.      bSelft
35dd0 65 73 74 45 78 69 73 74 73 20 3d 20 31 3b 0a 20  estExists = 1;. 
35de0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 62 49 73     }.    if( bIs
35df0 49 6e 69 74 20 29 7b 0a 20 20 20 20 20 20 63 72  Init ){.      cr
35e00 65 61 74 65 53 65 6c 66 74 65 73 74 54 61 62 6c  eateSelftestTabl
35e10 65 28 70 29 3b 0a 20 20 20 20 20 20 62 53 65 6c  e(p);.      bSel
35e20 66 74 65 73 74 45 78 69 73 74 73 20 3d 20 31 3b  ftestExists = 1;
35e30 0a 20 20 20 20 7d 0a 20 20 20 20 69 6e 69 74 54  .    }.    initT
35e40 65 78 74 28 26 73 74 72 29 3b 0a 20 20 20 20 61  ext(&str);.    a
35e50 70 70 65 6e 64 54 65 78 74 28 26 73 74 72 2c 20  ppendText(&str, 
35e60 22 78 22 2c 20 30 29 3b 0a 20 20 20 20 66 6f 72  "x", 0);.    for
35e70 28 6b 3d 62 53 65 6c 66 74 65 73 74 45 78 69 73  (k=bSelftestExis
35e80 74 73 3b 20 6b 3e 3d 30 3b 20 6b 2d 2d 29 7b 0a  ts; k>=0; k--){.
35e90 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 31 20 29        if( k==1 )
35ea0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
35eb0 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76  qlite3_prepare_v
35ec0 32 28 70 2d 3e 64 62 2c 0a 20 20 20 20 20 20 20  2(p->db,.       
35ed0 20 20 20 20 20 22 53 45 4c 45 43 54 20 74 6e 6f       "SELECT tno
35ee0 2c 6f 70 2c 63 6d 64 2c 61 6e 73 20 46 52 4f 4d  ,op,cmd,ans FROM
35ef0 20 73 65 6c 66 74 65 73 74 20 4f 52 44 45 52 20   selftest ORDER 
35f00 42 59 20 74 6e 6f 22 2c 0a 20 20 20 20 20 20 20  BY tno",.       
35f10 20 20 20 20 20 2d 31 2c 20 26 70 53 74 6d 74 2c       -1, &pStmt,
35f20 20 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   0);.      }else
35f30 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
35f40 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76  qlite3_prepare_v
35f50 32 28 70 2d 3e 64 62 2c 0a 20 20 20 20 20 20 20  2(p->db,.       
35f60 20 20 20 22 56 41 4c 55 45 53 28 30 2c 27 6d 65     "VALUES(0,'me
35f70 6d 6f 27 2c 27 4d 69 73 73 69 6e 67 20 53 45 4c  mo','Missing SEL
35f80 46 54 45 53 54 20 74 61 62 6c 65 20 2d 20 64 65  FTEST table - de
35f90 66 61 75 6c 74 20 63 68 65 63 6b 73 20 6f 6e 6c  fault checks onl
35fa0 79 27 2c 27 27 29 2c 22 0a 20 20 20 20 20 20 20  y',''),".       
35fb0 20 20 20 22 20 20 20 20 20 20 28 31 2c 27 72 75     "      (1,'ru
35fc0 6e 27 2c 27 50 52 41 47 4d 41 20 69 6e 74 65 67  n','PRAGMA integ
35fd0 72 69 74 79 5f 63 68 65 63 6b 27 2c 27 6f 6b 27  rity_check','ok'
35fe0 29 22 2c 0a 20 20 20 20 20 20 20 20 20 20 2d 31  )",.          -1
35ff0 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20  , &pStmt, 0);.  
36000 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
36010 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 72 61  rc ){.        ra
36020 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  w_printf(stderr,
36030 20 22 45 72 72 6f 72 20 71 75 65 72 79 69 6e 67   "Error querying
36040 20 74 68 65 20 73 65 6c 66 74 65 73 74 20 74 61   the selftest ta
36050 62 6c 65 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20  ble\n");.       
36060 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20   rc = 1;.       
36070 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
36080 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20  e(pStmt);.      
36090 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d    goto meta_comm
360a0 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20 20 20  and_exit;.      
360b0 7d 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 31 3b  }.      for(i=1;
360c0 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53   sqlite3_step(pS
360d0 74 6d 74 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57  tmt)==SQLITE_ROW
360e0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
360f0 69 6e 74 20 74 6e 6f 20 3d 20 73 71 6c 69 74 65  int tno = sqlite
36100 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 74  3_column_int(pSt
36110 6d 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  mt, 0);.        
36120 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 70 20  const char *zOp 
36130 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73  = (const char*)s
36140 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
36150 78 74 28 70 53 74 6d 74 2c 20 31 29 3b 0a 20 20  xt(pStmt, 1);.  
36160 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
36170 20 2a 7a 53 71 6c 20 3d 20 28 63 6f 6e 73 74 20   *zSql = (const 
36180 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f  char*)sqlite3_co
36190 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c  lumn_text(pStmt,
361a0 20 32 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e   2);.        con
361b0 73 74 20 63 68 61 72 20 2a 7a 41 6e 73 20 3d 20  st char *zAns = 
361c0 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c  (const char*)sql
361d0 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  ite3_column_text
361e0 28 70 53 74 6d 74 2c 20 33 29 3b 0a 0a 20 20 20  (pStmt, 3);..   
361f0 20 20 20 20 20 6b 20 3d 20 30 3b 0a 20 20 20 20       k = 0;.    
36200 20 20 20 20 69 66 28 20 62 56 65 72 62 6f 73 65      if( bVerbose
36210 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  >0 ){.          
36220 63 68 61 72 20 2a 7a 51 75 6f 74 65 20 3d 20 73  char *zQuote = s
36230 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
36240 25 71 22 2c 20 7a 53 71 6c 29 3b 0a 20 20 20 20  %q", zSql);.    
36250 20 20 20 20 20 20 70 72 69 6e 74 66 28 22 25 64        printf("%d
36260 3a 20 25 73 20 25 73 5c 6e 22 2c 20 74 6e 6f 2c  : %s %s\n", tno,
36270 20 7a 4f 70 2c 20 7a 53 71 6c 29 3b 0a 20 20 20   zOp, zSql);.   
36280 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
36290 72 65 65 28 7a 51 75 6f 74 65 29 3b 0a 20 20 20  ree(zQuote);.   
362a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
362b0 66 28 20 73 74 72 63 6d 70 28 7a 4f 70 2c 22 6d  f( strcmp(zOp,"m
362c0 65 6d 6f 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  emo")==0 ){.    
362d0 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
362e0 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 5c 6e 22  f(p->out, "%s\n"
362f0 2c 20 7a 53 71 6c 29 3b 0a 20 20 20 20 20 20 20  , zSql);.       
36300 20 7d 65 6c 73 65 0a 20 20 20 20 20 20 20 20 69   }else.        i
36310 66 28 20 73 74 72 63 6d 70 28 7a 4f 70 2c 22 72  f( strcmp(zOp,"r
36320 75 6e 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  un")==0 ){.     
36330 20 20 20 20 20 63 68 61 72 20 2a 7a 45 72 72 4d       char *zErrM
36340 73 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  sg = 0;.        
36350 20 20 73 74 72 2e 6e 20 3d 20 30 3b 0a 20 20 20    str.n = 0;.   
36360 20 20 20 20 20 20 20 73 74 72 2e 7a 5b 30 5d 20         str.z[0] 
36370 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 72  = 0;.          r
36380 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63  c = sqlite3_exec
36390 28 70 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 63 61  (p->db, zSql, ca
363a0 70 74 75 72 65 4f 75 74 70 75 74 43 61 6c 6c 62  ptureOutputCallb
363b0 61 63 6b 2c 20 26 73 74 72 2c 20 26 7a 45 72 72  ack, &str, &zErr
363c0 4d 73 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Msg);.          
363d0 6e 54 65 73 74 2b 2b 3b 0a 20 20 20 20 20 20 20  nTest++;.       
363e0 20 20 20 69 66 28 20 62 56 65 72 62 6f 73 65 20     if( bVerbose 
363f0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 75  ){.            u
36400 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  tf8_printf(p->ou
36410 74 2c 20 22 52 65 73 75 6c 74 3a 20 25 73 5c 6e  t, "Result: %s\n
36420 22 2c 20 73 74 72 2e 7a 29 3b 0a 20 20 20 20 20  ", str.z);.     
36430 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
36440 20 69 66 28 20 72 63 20 7c 7c 20 7a 45 72 72 4d   if( rc || zErrM
36450 73 67 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  sg ){.          
36460 20 20 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20    nErr++;.      
36470 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
36480 20 20 20 20 20 20 20 20 20 20 75 74 66 38 5f 70            utf8_p
36490 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25  rintf(p->out, "%
364a0 64 3a 20 65 72 72 6f 72 2d 63 6f 64 65 2d 25 64  d: error-code-%d
364b0 3a 20 25 73 5c 6e 22 2c 20 74 6e 6f 2c 20 72 63  : %s\n", tno, rc
364c0 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20  , zErrMsg);.    
364d0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
364e0 66 72 65 65 28 7a 45 72 72 4d 73 67 29 3b 0a 20  free(zErrMsg);. 
364f0 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69           }else i
36500 66 28 20 73 74 72 63 6d 70 28 7a 41 6e 73 2c 73  f( strcmp(zAns,s
36510 74 72 2e 7a 29 21 3d 30 20 29 7b 0a 20 20 20 20  tr.z)!=0 ){.    
36520 20 20 20 20 20 20 20 20 6e 45 72 72 2b 2b 3b 0a          nErr++;.
36530 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
36540 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   1;.            
36550 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f  utf8_printf(p->o
36560 75 74 2c 20 22 25 64 3a 20 45 78 70 65 63 74 65  ut, "%d: Expecte
36570 64 3a 20 5b 25 73 5d 5c 6e 22 2c 20 74 6e 6f 2c  d: [%s]\n", tno,
36580 20 7a 41 6e 73 29 3b 0a 20 20 20 20 20 20 20 20   zAns);.        
36590 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
365a0 70 2d 3e 6f 75 74 2c 20 22 25 64 3a 20 20 20 20  p->out, "%d:    
365b0 20 20 47 6f 74 3a 20 5b 25 73 5d 5c 6e 22 2c 20    Got: [%s]\n", 
365c0 74 6e 6f 2c 20 73 74 72 2e 7a 29 3b 0a 20 20 20  tno, str.z);.   
365d0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
365e0 20 7d 65 6c 73 65 0a 20 20 20 20 20 20 20 20 7b   }else.        {
365f0 0a 20 20 20 20 20 20 20 20 20 20 75 74 66 38 5f  .          utf8_
36600 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 0a 20  printf(stderr,. 
36610 20 20 20 20 20 20 20 20 20 20 20 22 55 6e 6b 6e             "Unkn
36620 6f 77 6e 20 6f 70 65 72 61 74 69 6f 6e 20 5c 22  own operation \"
36630 25 73 5c 22 20 6f 6e 20 73 65 6c 66 74 65 73 74  %s\" on selftest
36640 20 6c 69 6e 65 20 25 64 5c 6e 22 2c 20 7a 4f 70   line %d\n", zOp
36650 2c 20 74 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20  , tno);.        
36660 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20    rc = 1;.      
36670 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
36680 20 20 20 7d 0a 20 20 20 20 20 20 7d 20 2f 2a 20     }.      } /* 
36690 45 6e 64 20 6c 6f 6f 70 20 6f 76 65 72 20 72 6f  End loop over ro
366a0 77 73 20 6f 66 20 63 6f 6e 74 65 6e 74 20 66 72  ws of content fr
366b0 6f 6d 20 53 45 4c 46 54 45 53 54 20 2a 2f 0a 20  om SELFTEST */. 
366c0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e       sqlite3_fin
366d0 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20  alize(pStmt);.  
366e0 20 20 7d 20 2f 2a 20 45 6e 64 20 6c 6f 6f 70 20    } /* End loop 
366f0 6f 76 65 72 20 6b 20 2a 2f 0a 20 20 20 20 66 72  over k */.    fr
36700 65 65 54 65 78 74 28 26 73 74 72 29 3b 0a 20 20  eeText(&str);.  
36710 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d    utf8_printf(p-
36720 3e 6f 75 74 2c 20 22 25 64 20 65 72 72 6f 72 73  >out, "%d errors
36730 20 6f 75 74 20 6f 66 20 25 64 20 74 65 73 74 73   out of %d tests
36740 5c 6e 22 2c 20 6e 45 72 72 2c 20 6e 54 65 73 74  \n", nErr, nTest
36750 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66  );.  }else..  if
36760 28 20 63 3d 3d 27 73 27 20 26 26 20 73 74 72 6e  ( c=='s' && strn
36770 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 73  cmp(azArg[0], "s
36780 65 70 61 72 61 74 6f 72 22 2c 20 6e 29 3d 3d 30  eparator", n)==0
36790 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 41 72 67   ){.    if( nArg
367a0 3c 32 20 7c 7c 20 6e 41 72 67 3e 33 20 29 7b 0a  <2 || nArg>3 ){.
367b0 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
367c0 28 73 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a  (stderr, "Usage:
367d0 20 2e 73 65 70 61 72 61 74 6f 72 20 43 4f 4c 20   .separator COL 
367e0 3f 52 4f 57 3f 5c 6e 22 29 3b 0a 20 20 20 20 20  ?ROW?\n");.     
367f0 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20   rc = 1;.    }. 
36800 20 20 20 69 66 28 20 6e 41 72 67 3e 3d 32 20 29     if( nArg>=2 )
36810 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
36820 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
36830 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 29  p->colSeparator)
36840 2c 20 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f  , p->colSeparato
36850 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r,.             
36860 20 20 20 20 20 20 20 20 20 20 22 25 2e 2a 73 22            "%.*s"
36870 2c 20 28 69 6e 74 29 41 72 72 61 79 53 69 7a 65  , (int)ArraySize
36880 28 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72  (p->colSeparator
36890 29 2d 31 2c 20 61 7a 41 72 67 5b 31 5d 29 3b 0a  )-1, azArg[1]);.
368a0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 41      }.    if( nA
368b0 72 67 3e 3d 33 20 29 7b 0a 20 20 20 20 20 20 73  rg>=3 ){.      s
368c0 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
368d0 73 69 7a 65 6f 66 28 70 2d 3e 72 6f 77 53 65 70  sizeof(p->rowSep
368e0 61 72 61 74 6f 72 29 2c 20 70 2d 3e 72 6f 77 53  arator), p->rowS
368f0 65 70 61 72 61 74 6f 72 2c 0a 20 20 20 20 20 20  eparator,.      
36900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36910 20 22 25 2e 2a 73 22 2c 20 28 69 6e 74 29 41 72   "%.*s", (int)Ar
36920 72 61 79 53 69 7a 65 28 70 2d 3e 72 6f 77 53 65  raySize(p->rowSe
36930 70 61 72 61 74 6f 72 29 2d 31 2c 20 61 7a 41 72  parator)-1, azAr
36940 67 5b 32 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  g[2]);.    }.  }
36950 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27  else..  if( c=='
36960 73 27 20 26 26 20 6e 3e 3d 34 20 26 26 20 73 74  s' && n>=4 && st
36970 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 22  rncmp(azArg[0],"
36980 73 68 61 33 73 75 6d 22 2c 6e 29 3d 3d 30 20 29  sha3sum",n)==0 )
36990 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  {.    const char
369a0 20 2a 7a 4c 69 6b 65 20 3d 20 30 3b 20 20 20 2f   *zLike = 0;   /
369b0 2a 20 57 68 69 63 68 20 74 61 62 6c 65 20 74 6f  * Which table to
369c0 20 63 68 65 63 6b 73 75 6d 2e 20 30 20 6d 65 61   checksum. 0 mea
369d0 6e 73 20 65 76 65 72 79 74 68 69 6e 67 20 2a 2f  ns everything */
369e0 0a 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20  .    int i;     
369f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
36a00 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
36a10 0a 20 20 20 20 69 6e 74 20 62 53 63 68 65 6d 61  .    int bSchema
36a20 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a   = 0;         /*
36a30 20 41 6c 73 6f 20 68 61 73 68 20 74 68 65 20 73   Also hash the s
36a40 63 68 65 6d 61 20 2a 2f 0a 20 20 20 20 69 6e 74  chema */.    int
36a50 20 62 53 65 70 61 72 61 74 65 20 3d 20 30 3b 20   bSeparate = 0; 
36a60 20 20 20 20 20 20 2f 2a 20 48 61 73 68 20 65 61        /* Hash ea
36a70 63 68 20 74 61 62 6c 65 20 73 65 70 61 72 61 74  ch table separat
36a80 65 6c 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  ely */.    int i
36a90 53 69 7a 65 20 3d 20 32 32 34 3b 20 20 20 20 20  Size = 224;     
36aa0 20 20 20 20 2f 2a 20 48 61 73 68 20 61 6c 67 6f      /* Hash algo
36ab0 72 69 74 68 6d 20 74 6f 20 75 73 65 20 2a 2f 0a  rithm to use */.
36ac0 20 20 20 20 69 6e 74 20 62 44 65 62 75 67 20 3d      int bDebug =
36ad0 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20   0;          /* 
36ae0 4f 6e 6c 79 20 73 68 6f 77 20 74 68 65 20 71 75  Only show the qu
36af0 65 72 79 20 74 68 61 74 20 77 6f 75 6c 64 20 68  ery that would h
36b00 61 76 65 20 72 75 6e 20 2a 2f 0a 20 20 20 20 73  ave run */.    s
36b10 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
36b20 6d 74 3b 20 20 20 20 20 2f 2a 20 46 6f 72 20 71  mt;     /* For q
36b30 75 65 72 79 69 6e 67 20 74 61 62 6c 65 73 20 6e  uerying tables n
36b40 61 6d 65 73 20 2a 2f 0a 20 20 20 20 63 68 61 72  ames */.    char
36b50 20 2a 7a 53 71 6c 3b 20 20 20 20 20 20 20 20 20   *zSql;         
36b60 20 20 20 20 20 2f 2a 20 53 51 4c 20 74 6f 20 62       /* SQL to b
36b70 65 20 72 75 6e 20 2a 2f 0a 20 20 20 20 63 68 61  e run */.    cha
36b80 72 20 2a 7a 53 65 70 3b 20 20 20 20 20 20 20 20  r *zSep;        
36b90 20 20 20 20 20 20 2f 2a 20 53 65 70 61 72 61 74        /* Separat
36ba0 6f 72 20 2a 2f 0a 20 20 20 20 53 68 65 6c 6c 54  or */.    ShellT
36bb0 65 78 74 20 73 53 71 6c 3b 20 20 20 20 20 20 20  ext sSql;       
36bc0 20 20 20 2f 2a 20 43 6f 6d 70 6c 65 74 65 20 53     /* Complete S
36bd0 51 4c 20 66 6f 72 20 74 68 65 20 71 75 65 72 79  QL for the query
36be0 20 74 6f 20 72 75 6e 20 74 68 65 20 68 61 73 68   to run the hash
36bf0 20 2a 2f 0a 20 20 20 20 53 68 65 6c 6c 54 65 78   */.    ShellTex
36c00 74 20 73 51 75 65 72 79 3b 20 20 20 20 20 20 20  t sQuery;       
36c10 20 2f 2a 20 53 65 74 20 6f 66 20 71 75 65 72 69   /* Set of queri
36c20 65 73 20 75 73 65 64 20 74 6f 20 72 65 61 64 20  es used to read 
36c30 61 6c 6c 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20  all content */. 
36c40 20 20 20 6f 70 65 6e 5f 64 62 28 70 2c 20 30 29     open_db(p, 0)
36c50 3b 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69  ;.    for(i=1; i
36c60 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nArg; i++){.   
36c70 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
36c80 20 3d 20 61 7a 41 72 67 5b 69 5d 3b 0a 20 20 20   = azArg[i];.   
36c90 20 20 20 69 66 28 20 7a 5b 30 5d 3d 3d 27 2d 27     if( z[0]=='-'
36ca0 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 2b 2b 3b   ){.        z++;
36cb0 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 5b 30  .        if( z[0
36cc0 5d 3d 3d 27 2d 27 20 29 20 7a 2b 2b 3b 0a 20 20  ]=='-' ) z++;.  
36cd0 20 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70        if( strcmp
36ce0 28 7a 2c 22 73 63 68 65 6d 61 22 29 3d 3d 30 20  (z,"schema")==0 
36cf0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 62 53 63  ){.          bSc
36d00 68 65 6d 61 20 3d 20 31 3b 0a 20 20 20 20 20 20  hema = 1;.      
36d10 20 20 7d 65 6c 73 65 0a 20 20 20 20 20 20 20 20    }else.        
36d20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 22 73 68  if( strcmp(z,"sh
36d30 61 33 2d 32 32 34 22 29 3d 3d 30 20 7c 7c 20 73  a3-224")==0 || s
36d40 74 72 63 6d 70 28 7a 2c 22 73 68 61 33 2d 32 35  trcmp(z,"sha3-25
36d50 36 22 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20  6")==0.         
36d60 7c 7c 20 73 74 72 63 6d 70 28 7a 2c 22 73 68 61  || strcmp(z,"sha
36d70 33 2d 33 38 34 22 29 3d 3d 30 20 7c 7c 20 73 74  3-384")==0 || st
36d80 72 63 6d 70 28 7a 2c 22 73 68 61 33 2d 35 31 32  rcmp(z,"sha3-512
36d90 22 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 29 7b  ")==0.        ){
36da0 0a 20 20 20 20 20 20 20 20 20 20 69 53 69 7a 65  .          iSize
36db0 20 3d 20 61 74 6f 69 28 26 7a 5b 35 5d 29 3b 0a   = atoi(&z[5]);.
36dc0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 0a 20 20          }else.  
36dd0 20 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70        if( strcmp
36de0 28 7a 2c 22 64 65 62 75 67 22 29 3d 3d 30 20 29  (z,"debug")==0 )
36df0 7b 0a 20 20 20 20 20 20 20 20 20 20 62 44 65 62  {.          bDeb
36e00 75 67 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  ug = 1;.        
36e10 7d 65 6c 73 65 0a 20 20 20 20 20 20 20 20 7b 0a  }else.        {.
36e20 20 20 20 20 20 20 20 20 20 20 75 74 66 38 5f 70            utf8_p
36e30 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55  rintf(stderr, "U
36e40 6e 6b 6e 6f 77 6e 20 6f 70 74 69 6f 6e 20 5c 22  nknown option \"
36e50 25 73 5c 22 20 6f 6e 20 5c 22 25 73 5c 22 5c 6e  %s\" on \"%s\"\n
36e60 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
36e70 20 20 20 20 20 20 20 20 20 61 7a 41 72 67 5b 69           azArg[i
36e80 5d 2c 20 61 7a 41 72 67 5b 30 5d 29 3b 0a 20 20  ], azArg[0]);.  
36e90 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e          raw_prin
36ea0 74 66 28 73 74 64 65 72 72 2c 20 22 53 68 6f 75  tf(stderr, "Shou
36eb0 6c 64 20 62 65 20 6f 6e 65 20 6f 66 3a 20 2d 2d  ld be one of: --
36ec0 73 63 68 65 6d 61 22 0a 20 20 20 20 20 20 20 20  schema".        
36ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36ee0 20 20 20 20 20 22 20 2d 2d 73 68 61 33 2d 32 32       " --sha3-22
36ef0 34 20 2d 2d 73 68 61 33 2d 32 35 35 20 2d 2d 73  4 --sha3-255 --s
36f00 68 61 33 2d 33 38 34 20 2d 2d 73 68 61 33 2d 35  ha3-384 --sha3-5
36f10 31 32 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20 20  12\n");.        
36f20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20    rc = 1;.      
36f30 20 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f      goto meta_co
36f40 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20  mmand_exit;.    
36f50 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
36f60 65 20 69 66 28 20 7a 4c 69 6b 65 20 29 7b 0a 20  e if( zLike ){. 
36f70 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74         raw_print
36f80 66 28 73 74 64 65 72 72 2c 20 22 55 73 61 67 65  f(stderr, "Usage
36f90 3a 20 2e 73 68 61 33 73 75 6d 20 3f 4f 50 54 49  : .sha3sum ?OPTI
36fa0 4f 4e 53 3f 20 3f 4c 49 4b 45 2d 50 41 54 54 45  ONS? ?LIKE-PATTE
36fb0 52 4e 3f 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20  RN?\n");.       
36fc0 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20   rc = 1;.       
36fd0 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61   goto meta_comma
36fe0 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 7d  nd_exit;.      }
36ff0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 4c  else{.        zL
37000 69 6b 65 20 3d 20 7a 3b 0a 20 20 20 20 20 20 20  ike = z;.       
37010 20 62 53 65 70 61 72 61 74 65 20 3d 20 31 3b 0a   bSeparate = 1;.
37020 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
37030 74 65 33 5f 73 74 72 6c 69 6b 65 28 22 73 71 6c  te3_strlike("sql
37040 69 74 65 5c 5c 5f 25 22 2c 20 7a 4c 69 6b 65 2c  ite\\_%", zLike,
37050 20 27 5c 5c 27 29 3d 3d 30 20 29 20 62 53 63 68   '\\')==0 ) bSch
37060 65 6d 61 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  ema = 1;.      }
37070 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 62  .    }.    if( b
37080 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20 20  Schema ){.      
37090 7a 53 71 6c 20 3d 20 22 53 45 4c 45 43 54 20 6c  zSql = "SELECT l
370a0 6f 77 65 72 28 6e 61 6d 65 29 20 46 52 4f 4d 20  ower(name) FROM 
370b0 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 22 0a 20  sqlite_master". 
370c0 20 20 20 20 20 20 20 20 20 20 20 20 22 20 57 48              " WH
370d0 45 52 45 20 74 79 70 65 3d 27 74 61 62 6c 65 27  ERE type='table'
370e0 20 41 4e 44 20 63 6f 61 6c 65 73 63 65 28 72 6f   AND coalesce(ro
370f0 6f 74 70 61 67 65 2c 30 29 3e 31 22 0a 20 20 20  otpage,0)>1".   
37100 20 20 20 20 20 20 20 20 20 20 22 20 55 4e 49 4f            " UNIO
37110 4e 20 41 4c 4c 20 53 45 4c 45 43 54 20 27 73 71  N ALL SELECT 'sq
37120 6c 69 74 65 5f 6d 61 73 74 65 72 27 22 0a 20 20  lite_master'".  
37130 20 20 20 20 20 20 20 20 20 20 20 22 20 4f 52 44             " ORD
37140 45 52 20 42 59 20 31 20 63 6f 6c 6c 61 74 65 20  ER BY 1 collate 
37150 6e 6f 63 61 73 65 22 3b 0a 20 20 20 20 7d 65 6c  nocase";.    }el
37160 73 65 7b 0a 20 20 20 20 20 20 7a 53 71 6c 20 3d  se{.      zSql =
37170 20 22 53 45 4c 45 43 54 20 6c 6f 77 65 72 28 6e   "SELECT lower(n
37180 61 6d 65 29 20 46 52 4f 4d 20 73 71 6c 69 74 65  ame) FROM sqlite
37190 5f 6d 61 73 74 65 72 22 0a 20 20 20 20 20 20 20  _master".       
371a0 20 20 20 20 20 20 22 20 57 48 45 52 45 20 74 79        " WHERE ty
371b0 70 65 3d 27 74 61 62 6c 65 27 20 41 4e 44 20 63  pe='table' AND c
371c0 6f 61 6c 65 73 63 65 28 72 6f 6f 74 70 61 67 65  oalesce(rootpage
371d0 2c 30 29 3e 31 22 0a 20 20 20 20 20 20 20 20 20  ,0)>1".         
371e0 20 20 20 20 22 20 41 4e 44 20 6e 61 6d 65 20 4e      " AND name N
371f0 4f 54 20 4c 49 4b 45 20 27 73 71 6c 69 74 65 5f  OT LIKE 'sqlite_
37200 25 27 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  %'".            
37210 20 22 20 4f 52 44 45 52 20 42 59 20 31 20 63 6f   " ORDER BY 1 co
37220 6c 6c 61 74 65 20 6e 6f 63 61 73 65 22 3b 0a 20  llate nocase";. 
37230 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
37240 5f 70 72 65 70 61 72 65 5f 76 32 28 70 2d 3e 64  _prepare_v2(p->d
37250 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53  b, zSql, -1, &pS
37260 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 69 6e 69  tmt, 0);.    ini
37270 74 54 65 78 74 28 26 73 51 75 65 72 79 29 3b 0a  tText(&sQuery);.
37280 20 20 20 20 69 6e 69 74 54 65 78 74 28 26 73 53      initText(&sS
37290 71 6c 29 3b 0a 20 20 20 20 61 70 70 65 6e 64 54  ql);.    appendT
372a0 65 78 74 28 26 73 53 71 6c 2c 20 22 57 49 54 48  ext(&sSql, "WITH
372b0 20 5b 73 68 61 33 73 75 6d 24 71 75 65 72 79 5d   [sha3sum$query]
372c0 28 61 2c 62 29 20 41 53 28 22 2c 30 29 3b 0a 20  (a,b) AS(",0);. 
372d0 20 20 20 7a 53 65 70 20 3d 20 22 56 41 4c 55 45     zSep = "VALUE
372e0 53 28 22 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  S(";.    while( 
372f0 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69  SQLITE_ROW==sqli
37300 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 20  te3_step(pStmt) 
37310 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  ){.      const c
37320 68 61 72 20 2a 7a 54 61 62 20 3d 20 28 63 6f 6e  har *zTab = (con
37330 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33  st char*)sqlite3
37340 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74  _column_text(pSt
37350 6d 74 2c 30 29 3b 0a 20 20 20 20 20 20 69 66 28  mt,0);.      if(
37360 20 7a 4c 69 6b 65 20 26 26 20 73 71 6c 69 74 65   zLike && sqlite
37370 33 5f 73 74 72 6c 69 6b 65 28 7a 4c 69 6b 65 2c  3_strlike(zLike,
37380 20 7a 54 61 62 2c 20 30 29 21 3d 30 20 29 20 63   zTab, 0)!=0 ) c
37390 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69  ontinue;.      i
373a0 66 28 20 73 74 72 6e 63 6d 70 28 7a 54 61 62 2c  f( strncmp(zTab,
373b0 20 22 73 71 6c 69 74 65 5f 22 2c 37 29 21 3d 30   "sqlite_",7)!=0
373c0 20 29 7b 0a 20 20 20 20 20 20 20 20 61 70 70 65   ){.        appe
373d0 6e 64 54 65 78 74 28 26 73 51 75 65 72 79 2c 22  ndText(&sQuery,"
373e0 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 22 2c  SELECT * FROM ",
373f0 20 30 29 3b 0a 20 20 20 20 20 20 20 20 61 70 70   0);.        app
37400 65 6e 64 54 65 78 74 28 26 73 51 75 65 72 79 2c  endText(&sQuery,
37410 7a 54 61 62 2c 27 22 27 29 3b 0a 20 20 20 20 20  zTab,'"');.     
37420 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73     appendText(&s
37430 51 75 65 72 79 2c 22 20 4e 4f 54 20 49 4e 44 45  Query," NOT INDE
37440 58 45 44 3b 22 2c 20 30 29 3b 0a 20 20 20 20 20  XED;", 0);.     
37450 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d   }else if( strcm
37460 70 28 7a 54 61 62 2c 20 22 73 71 6c 69 74 65 5f  p(zTab, "sqlite_
37470 6d 61 73 74 65 72 22 29 3d 3d 30 20 29 7b 0a 20  master")==0 ){. 
37480 20 20 20 20 20 20 20 61 70 70 65 6e 64 54 65 78         appendTex
37490 74 28 26 73 51 75 65 72 79 2c 22 53 45 4c 45 43  t(&sQuery,"SELEC
374a0 54 20 74 79 70 65 2c 6e 61 6d 65 2c 74 62 6c 5f  T type,name,tbl_
374b0 6e 61 6d 65 2c 73 71 6c 20 46 52 4f 4d 20 73 71  name,sql FROM sq
374c0 6c 69 74 65 5f 6d 61 73 74 65 72 22 0a 20 20 20  lite_master".   
374d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
374e0 20 20 20 20 20 20 20 20 22 20 4f 52 44 45 52 20          " ORDER 
374f0 42 59 20 6e 61 6d 65 3b 22 2c 20 30 29 3b 0a 20  BY name;", 0);. 
37500 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73       }else if( s
37510 74 72 63 6d 70 28 7a 54 61 62 2c 20 22 73 71 6c  trcmp(zTab, "sql
37520 69 74 65 5f 73 65 71 75 65 6e 63 65 22 29 3d 3d  ite_sequence")==
37530 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61 70 70  0 ){.        app
37540 65 6e 64 54 65 78 74 28 26 73 51 75 65 72 79 2c  endText(&sQuery,
37550 22 53 45 4c 45 43 54 20 6e 61 6d 65 2c 73 65 71  "SELECT name,seq
37560 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 73 65 71   FROM sqlite_seq
37570 75 65 6e 63 65 22 0a 20 20 20 20 20 20 20 20 20  uence".         
37580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37590 20 20 22 20 4f 52 44 45 52 20 42 59 20 6e 61 6d    " ORDER BY nam
375a0 65 3b 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  e;", 0);.      }
375b0 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
375c0 7a 54 61 62 2c 20 22 73 71 6c 69 74 65 5f 73 74  zTab, "sqlite_st
375d0 61 74 31 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  at1")==0 ){.    
375e0 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26      appendText(&
375f0 73 51 75 65 72 79 2c 22 53 45 4c 45 43 54 20 74  sQuery,"SELECT t
37600 62 6c 2c 69 64 78 2c 73 74 61 74 20 46 52 4f 4d  bl,idx,stat FROM
37610 20 73 71 6c 69 74 65 5f 73 74 61 74 31 22 0a 20   sqlite_stat1". 
37620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37630 20 20 20 20 20 20 20 20 20 20 22 20 4f 52 44 45            " ORDE
37640 52 20 42 59 20 74 62 6c 2c 69 64 78 3b 22 2c 20  R BY tbl,idx;", 
37650 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  0);.      }else 
37660 69 66 28 20 73 74 72 63 6d 70 28 7a 54 61 62 2c  if( strcmp(zTab,
37670 20 22 73 71 6c 69 74 65 5f 73 74 61 74 33 22 29   "sqlite_stat3")
37680 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 20  ==0.            
37690 20 7c 7c 20 73 74 72 63 6d 70 28 7a 54 61 62 2c   || strcmp(zTab,
376a0 20 22 73 71 6c 69 74 65 5f 73 74 61 74 34 22 29   "sqlite_stat4")
376b0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61  ==0 ){.        a
376c0 70 70 65 6e 64 54 65 78 74 28 26 73 51 75 65 72  ppendText(&sQuer
376d0 79 2c 20 22 53 45 4c 45 43 54 2