/ Hex Artifact Content
Login

Artifact bd7ea498f9d1e366ced57e229ae896c7d7ad00ae5913b8d34b6b649163b8dab9:


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 69  har *zName){.  i
4f50: 6e 74 20 69 3b 0a 20 20 69 66 28 20 21 69 73 61  nt i;.  if( !isa
4f60: 6c 70 68 61 28 28 75 6e 73 69 67 6e 65 64 20 63  lpha((unsigned c
4f70: 68 61 72 29 7a 4e 61 6d 65 5b 30 5d 29 20 26 26  har)zName[0]) &&
4f80: 20 7a 4e 61 6d 65 5b 30 5d 21 3d 27 5f 27 20 29   zName[0]!='_' )
4f90: 20 72 65 74 75 72 6e 20 27 22 27 3b 0a 20 20 66   return '"';.  f
4fa0: 6f 72 28 69 3d 30 3b 20 7a 4e 61 6d 65 5b 69 5d  or(i=0; zName[i]
4fb0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
4fc0: 21 69 73 61 6c 6e 75 6d 28 28 75 6e 73 69 67 6e  !isalnum((unsign
4fd0: 65 64 20 63 68 61 72 29 7a 4e 61 6d 65 5b 69 5d  ed char)zName[i]
4fe0: 29 20 26 26 20 7a 4e 61 6d 65 5b 69 5d 21 3d 27  ) && zName[i]!='
4ff0: 5f 27 20 29 20 72 65 74 75 72 6e 20 27 22 27 3b  _' ) return '"';
5000: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 73 71  .  }.  return sq
5010: 6c 69 74 65 33 5f 6b 65 79 77 6f 72 64 5f 63 68  lite3_keyword_ch
5020: 65 63 6b 28 7a 4e 61 6d 65 2c 20 69 29 20 3f 20  eck(zName, i) ? 
5030: 27 22 27 20 3a 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  '"' : 0;.}../*.*
5040: 2a 20 43 6f 6e 73 74 72 75 63 74 20 61 20 66 61  * Construct a fa
5050: 6b 65 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 61  ke object name a
5060: 6e 64 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 74  nd column list t
5070: 6f 20 64 65 73 63 72 69 62 65 20 74 68 65 20 73  o describe the s
5080: 74 72 75 63 74 75 72 65 0a 2a 2a 20 6f 66 20 74  tructure.** of t
5090: 68 65 20 76 69 65 77 2c 20 76 69 72 74 75 61 6c  he view, virtual
50a0: 20 74 61 62 6c 65 2c 20 6f 72 20 74 61 62 6c 65   table, or table
50b0: 20 76 61 6c 75 65 64 20 66 75 6e 63 74 69 6f 6e   valued function
50c0: 20 7a 53 63 68 65 6d 61 2e 7a 4e 61 6d 65 2e 0a   zSchema.zName..
50d0: 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a  */.static char *
50e0: 73 68 65 6c 6c 46 61 6b 65 53 63 68 65 6d 61 28  shellFakeSchema(
50f0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
5100: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
5110: 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
5120: 63 74 69 6f 6e 20 63 6f 6e 74 61 69 6e 69 6e 67  ction containing
5130: 20 74 68 65 20 76 74 61 62 20 2a 2f 0a 20 20 63   the vtab */.  c
5140: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 63 68 65  onst char *zSche
5150: 6d 61 2c 20 20 20 20 2f 2a 20 53 63 68 65 6d 61  ma,    /* Schema
5160: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
5170: 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 76 74 61   holding the vta
5180: 62 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  b */.  const cha
5190: 72 20 2a 7a 4e 61 6d 65 20 20 20 20 20 20 20 2f  r *zName       /
51a0: 2a 20 54 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  * The name of th
51b0: 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  e virtual table 
51c0: 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  */.){.  sqlite3_
51d0: 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b  stmt *pStmt = 0;
51e0: 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20  .  char *zSql;. 
51f0: 20 53 68 65 6c 6c 54 65 78 74 20 73 3b 0a 20 20   ShellText s;.  
5200: 63 68 61 72 20 63 51 75 6f 74 65 3b 0a 20 20 63  char cQuote;.  c
5210: 68 61 72 20 2a 7a 44 69 76 20 3d 20 22 28 22 3b  har *zDiv = "(";
5220: 0a 20 20 69 6e 74 20 6e 52 6f 77 20 3d 20 30 3b  .  int nRow = 0;
5230: 0a 0a 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74  ..  zSql = sqlit
5240: 65 33 5f 6d 70 72 69 6e 74 66 28 22 50 52 41 47  e3_mprintf("PRAG
5250: 4d 41 20 5c 22 25 77 5c 22 2e 74 61 62 6c 65 5f  MA \"%w\".table_
5260: 69 6e 66 6f 3d 25 51 3b 22 2c 0a 20 20 20 20 20  info=%Q;",.     
5270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5280: 20 20 20 20 7a 53 63 68 65 6d 61 20 3f 20 7a 53      zSchema ? zS
5290: 63 68 65 6d 61 20 3a 20 22 6d 61 69 6e 22 2c 20  chema : "main", 
52a0: 7a 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65  zName);.  sqlite
52b0: 33 5f 70 72 65 70 61 72 65 5f 76 32 28 64 62 2c  3_prepare_v2(db,
52c0: 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d   zSql, -1, &pStm
52d0: 74 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33  t, 0);.  sqlite3
52e0: 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 69  _free(zSql);.  i
52f0: 6e 69 74 54 65 78 74 28 26 73 29 3b 0a 20 20 69  nitText(&s);.  i
5300: 66 28 20 7a 53 63 68 65 6d 61 20 29 7b 0a 20 20  f( zSchema ){.  
5310: 20 20 63 51 75 6f 74 65 20 3d 20 71 75 6f 74 65    cQuote = quote
5320: 43 68 61 72 28 7a 53 63 68 65 6d 61 29 3b 0a 20  Char(zSchema);. 
5330: 20 20 20 69 66 28 20 63 51 75 6f 74 65 20 26 26     if( cQuote &&
5340: 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70   sqlite3_stricmp
5350: 28 7a 53 63 68 65 6d 61 2c 22 74 65 6d 70 22 29  (zSchema,"temp")
5360: 3d 3d 30 20 29 20 63 51 75 6f 74 65 20 3d 20 30  ==0 ) cQuote = 0
5370: 3b 0a 20 20 20 20 61 70 70 65 6e 64 54 65 78 74  ;.    appendText
5380: 28 26 73 2c 20 7a 53 63 68 65 6d 61 2c 20 63 51  (&s, zSchema, cQ
5390: 75 6f 74 65 29 3b 0a 20 20 20 20 61 70 70 65 6e  uote);.    appen
53a0: 64 54 65 78 74 28 26 73 2c 20 22 2e 22 2c 20 30  dText(&s, ".", 0
53b0: 29 3b 0a 20 20 7d 0a 20 20 63 51 75 6f 74 65 20  );.  }.  cQuote 
53c0: 3d 20 71 75 6f 74 65 43 68 61 72 28 7a 4e 61 6d  = quoteChar(zNam
53d0: 65 29 3b 0a 20 20 61 70 70 65 6e 64 54 65 78 74  e);.  appendText
53e0: 28 26 73 2c 20 7a 4e 61 6d 65 2c 20 63 51 75 6f  (&s, zName, cQuo
53f0: 74 65 29 3b 0a 20 20 77 68 69 6c 65 28 20 73 71  te);.  while( sq
5400: 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74  lite3_step(pStmt
5410: 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b  )==SQLITE_ROW ){
5420: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
5430: 2a 7a 43 6f 6c 20 3d 20 28 63 6f 6e 73 74 20 63  *zCol = (const c
5440: 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c  har*)sqlite3_col
5450: 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 20  umn_text(pStmt, 
5460: 31 29 3b 0a 20 20 20 20 6e 52 6f 77 2b 2b 3b 0a  1);.    nRow++;.
5470: 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26      appendText(&
5480: 73 2c 20 7a 44 69 76 2c 20 30 29 3b 0a 20 20 20  s, zDiv, 0);.   
5490: 20 7a 44 69 76 20 3d 20 22 2c 22 3b 0a 20 20 20   zDiv = ",";.   
54a0: 20 63 51 75 6f 74 65 20 3d 20 71 75 6f 74 65 43   cQuote = quoteC
54b0: 68 61 72 28 7a 43 6f 6c 29 3b 0a 20 20 20 20 61  har(zCol);.    a
54c0: 70 70 65 6e 64 54 65 78 74 28 26 73 2c 20 7a 43  ppendText(&s, zC
54d0: 6f 6c 2c 20 63 51 75 6f 74 65 29 3b 0a 20 20 7d  ol, cQuote);.  }
54e0: 0a 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73  .  appendText(&s
54f0: 2c 20 22 29 22 2c 20 30 29 3b 0a 20 20 73 71 6c  , ")", 0);.  sql
5500: 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53  ite3_finalize(pS
5510: 74 6d 74 29 3b 0a 20 20 69 66 28 20 6e 52 6f 77  tmt);.  if( nRow
5520: 3d 3d 30 20 29 7b 0a 20 20 20 20 66 72 65 65 54  ==0 ){.    freeT
5530: 65 78 74 28 26 73 29 3b 0a 20 20 20 20 73 2e 7a  ext(&s);.    s.z
5540: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 0;.  }.  retu
5550: 72 6e 20 73 2e 7a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rn s.z;.}../*.**
5560: 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 3a 20 20   SQL function:  
5570: 73 68 65 6c 6c 5f 6d 6f 64 75 6c 65 5f 73 63 68  shell_module_sch
5580: 65 6d 61 28 58 29 0a 2a 2a 0a 2a 2a 20 52 65 74  ema(X).**.** Ret
5590: 75 72 6e 20 61 20 66 61 6b 65 20 73 63 68 65 6d  urn a fake schem
55a0: 61 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 2d  a for the table-
55b0: 76 61 6c 75 65 64 20 66 75 6e 63 74 69 6f 6e 20  valued function 
55c0: 6f 72 20 65 70 6f 6e 79 6d 6f 75 73 20 76 69 72  or eponymous vir
55d0: 74 75 61 6c 0a 2a 2a 20 74 61 62 6c 65 20 58 2e  tual.** table X.
55e0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
55f0: 73 68 65 6c 6c 4d 6f 64 75 6c 65 53 63 68 65 6d  shellModuleSchem
5600: 61 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e  a(.  sqlite3_con
5610: 74 65 78 74 20 2a 70 43 74 78 2c 0a 20 20 69 6e  text *pCtx,.  in
5620: 74 20 6e 56 61 6c 2c 0a 20 20 73 71 6c 69 74 65  t nVal,.  sqlite
5630: 33 5f 76 61 6c 75 65 20 2a 2a 61 70 56 61 6c 0a  3_value **apVal.
5640: 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ){.  const char 
5650: 2a 7a 4e 61 6d 65 20 3d 20 28 63 6f 6e 73 74 20  *zName = (const 
5660: 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61  char*)sqlite3_va
5670: 6c 75 65 5f 74 65 78 74 28 61 70 56 61 6c 5b 30  lue_text(apVal[0
5680: 5d 29 3b 0a 20 20 63 68 61 72 20 2a 7a 46 61 6b  ]);.  char *zFak
5690: 65 20 3d 20 73 68 65 6c 6c 46 61 6b 65 53 63 68  e = shellFakeSch
56a0: 65 6d 61 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  ema(sqlite3_cont
56b0: 65 78 74 5f 64 62 5f 68 61 6e 64 6c 65 28 70 43  ext_db_handle(pC
56c0: 74 78 29 2c 20 30 2c 20 7a 4e 61 6d 65 29 3b 0a  tx), 0, zName);.
56d0: 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
56e0: 45 52 28 6e 56 61 6c 29 3b 0a 20 20 69 66 28 20  ER(nVal);.  if( 
56f0: 7a 46 61 6b 65 20 29 7b 0a 20 20 20 20 73 71 6c  zFake ){.    sql
5700: 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74  ite3_result_text
5710: 28 70 43 74 78 2c 20 73 71 6c 69 74 65 33 5f 6d  (pCtx, sqlite3_m
5720: 70 72 69 6e 74 66 28 22 2f 2a 20 25 73 20 2a 2f  printf("/* %s */
5730: 22 2c 20 7a 46 61 6b 65 29 2c 0a 20 20 20 20 20  ", zFake),.     
5740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5750: 20 20 20 2d 31 2c 20 73 71 6c 69 74 65 33 5f 66     -1, sqlite3_f
5760: 72 65 65 29 3b 0a 20 20 20 20 66 72 65 65 28 7a  ree);.    free(z
5770: 46 61 6b 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  Fake);.  }.}../*
5780: 0a 2a 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e  .** SQL function
5790: 3a 20 20 73 68 65 6c 6c 5f 61 64 64 5f 73 63 68  :  shell_add_sch
57a0: 65 6d 61 28 53 2c 58 29 0a 2a 2a 0a 2a 2a 20 41  ema(S,X).**.** A
57b0: 64 64 20 74 68 65 20 73 63 68 65 6d 61 20 6e 61  dd the schema na
57c0: 6d 65 20 58 20 74 6f 20 74 68 65 20 43 52 45 41  me X to the CREA
57d0: 54 45 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 20  TE statement in 
57e0: 53 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65  S and return the
57f0: 20 72 65 73 75 6c 74 2e 0a 2a 2a 20 45 78 61 6d   result..** Exam
5800: 70 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 43  ples:.**.**    C
5810: 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 78  REATE TABLE t1(x
5820: 29 20 20 20 2d 3e 20 20 20 43 52 45 41 54 45 20  )   ->   CREATE 
5830: 54 41 42 4c 45 20 78 79 7a 2e 74 31 28 78 29 3b  TABLE xyz.t1(x);
5840: 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 77 6f 72 6b  .**.** Also work
5850: 73 20 6f 6e 0a 2a 2a 0a 2a 2a 20 20 20 20 43 52  s on.**.**    CR
5860: 45 41 54 45 20 49 4e 44 45 58 0a 2a 2a 20 20 20  EATE INDEX.**   
5870: 20 43 52 45 41 54 45 20 55 4e 49 51 55 45 20 49   CREATE UNIQUE I
5880: 4e 44 45 58 0a 2a 2a 20 20 20 20 43 52 45 41 54  NDEX.**    CREAT
5890: 45 20 56 49 45 57 0a 2a 2a 20 20 20 20 43 52 45  E VIEW.**    CRE
58a0: 41 54 45 20 54 52 49 47 47 45 52 0a 2a 2a 20 20  ATE TRIGGER.**  
58b0: 20 20 43 52 45 41 54 45 20 56 49 52 54 55 41 4c    CREATE VIRTUAL
58c0: 20 54 41 42 4c 45 0a 2a 2a 0a 2a 2a 20 54 68 69   TABLE.**.** Thi
58d0: 73 20 55 44 46 20 69 73 20 75 73 65 64 20 62 79  s UDF is used by
58e0: 20 74 68 65 20 2e 73 63 68 65 6d 61 20 63 6f 6d   the .schema com
58f0: 6d 61 6e 64 20 74 6f 20 69 6e 73 65 72 74 20 74  mand to insert t
5900: 68 65 20 73 63 68 65 6d 61 20 6e 61 6d 65 20 6f  he schema name o
5910: 66 0a 2a 2a 20 61 74 74 61 63 68 65 64 20 64 61  f.** attached da
5920: 74 61 62 61 73 65 73 20 69 6e 74 6f 20 74 68 65  tabases into the
5930: 20 6d 69 64 64 6c 65 20 6f 66 20 74 68 65 20 73   middle of the s
5940: 71 6c 69 74 65 5f 6d 61 73 74 65 72 2e 73 71 6c  qlite_master.sql
5950: 20 66 69 65 6c 64 2e 0a 2a 2f 0a 73 74 61 74 69   field..*/.stati
5960: 63 20 76 6f 69 64 20 73 68 65 6c 6c 41 64 64 53  c void shellAddS
5970: 63 68 65 6d 61 4e 61 6d 65 28 0a 20 20 73 71 6c  chemaName(.  sql
5980: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43  ite3_context *pC
5990: 74 78 2c 0a 20 20 69 6e 74 20 6e 56 61 6c 2c 0a  tx,.  int nVal,.
59a0: 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
59b0: 2a 2a 61 70 56 61 6c 0a 29 7b 0a 20 20 73 74 61  **apVal.){.  sta
59c0: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tic const char *
59d0: 61 50 72 65 66 69 78 5b 5d 20 3d 20 7b 0a 20 20  aPrefix[] = {.  
59e0: 20 20 20 22 54 41 42 4c 45 22 2c 0a 20 20 20 20     "TABLE",.    
59f0: 20 22 49 4e 44 45 58 22 2c 0a 20 20 20 20 20 22   "INDEX",.     "
5a00: 55 4e 49 51 55 45 20 49 4e 44 45 58 22 2c 0a 20  UNIQUE INDEX",. 
5a10: 20 20 20 20 22 56 49 45 57 22 2c 0a 20 20 20 20      "VIEW",.    
5a20: 20 22 54 52 49 47 47 45 52 22 2c 0a 20 20 20 20   "TRIGGER",.    
5a30: 20 22 56 49 52 54 55 41 4c 20 54 41 42 4c 45 22   "VIRTUAL TABLE"
5a40: 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69 20 3d 20  .  };.  int i = 
5a50: 30 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  0;.  const char 
5a60: 2a 7a 49 6e 20 3d 20 28 63 6f 6e 73 74 20 63 68  *zIn = (const ch
5a70: 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75  ar*)sqlite3_valu
5a80: 65 5f 74 65 78 74 28 61 70 56 61 6c 5b 30 5d 29  e_text(apVal[0])
5a90: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
5aa0: 7a 53 63 68 65 6d 61 20 3d 20 28 63 6f 6e 73 74  zSchema = (const
5ab0: 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76   char*)sqlite3_v
5ac0: 61 6c 75 65 5f 74 65 78 74 28 61 70 56 61 6c 5b  alue_text(apVal[
5ad0: 31 5d 29 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  1]);.  const cha
5ae0: 72 20 2a 7a 4e 61 6d 65 20 3d 20 28 63 6f 6e 73  r *zName = (cons
5af0: 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f  t char*)sqlite3_
5b00: 76 61 6c 75 65 5f 74 65 78 74 28 61 70 56 61 6c  value_text(apVal
5b10: 5b 32 5d 29 3b 0a 20 20 73 71 6c 69 74 65 33 20  [2]);.  sqlite3 
5b20: 2a 64 62 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  *db = sqlite3_co
5b30: 6e 74 65 78 74 5f 64 62 5f 68 61 6e 64 6c 65 28  ntext_db_handle(
5b40: 70 43 74 78 29 3b 0a 20 20 55 4e 55 53 45 44 5f  pCtx);.  UNUSED_
5b50: 50 41 52 41 4d 45 54 45 52 28 6e 56 61 6c 29 3b  PARAMETER(nVal);
5b60: 0a 20 20 69 66 28 20 7a 49 6e 21 3d 30 20 26 26  .  if( zIn!=0 &&
5b70: 20 73 74 72 6e 63 6d 70 28 7a 49 6e 2c 20 22 43   strncmp(zIn, "C
5b80: 52 45 41 54 45 20 22 2c 20 37 29 3d 3d 30 20 29  REATE ", 7)==0 )
5b90: 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  {.    for(i=0; i
5ba0: 3c 28 69 6e 74 29 28 73 69 7a 65 6f 66 28 61 50  <(int)(sizeof(aP
5bb0: 72 65 66 69 78 29 2f 73 69 7a 65 6f 66 28 61 50  refix)/sizeof(aP
5bc0: 72 65 66 69 78 5b 30 5d 29 29 3b 20 69 2b 2b 29  refix[0])); i++)
5bd0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20  {.      int n = 
5be0: 73 74 72 6c 65 6e 33 30 28 61 50 72 65 66 69 78  strlen30(aPrefix
5bf0: 5b 69 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20  [i]);.      if( 
5c00: 73 74 72 6e 63 6d 70 28 7a 49 6e 2b 37 2c 20 61  strncmp(zIn+7, a
5c10: 50 72 65 66 69 78 5b 69 5d 2c 20 6e 29 3d 3d 30  Prefix[i], n)==0
5c20: 20 26 26 20 7a 49 6e 5b 6e 2b 37 5d 3d 3d 27 20   && zIn[n+7]==' 
5c30: 27 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61  ' ){.        cha
5c40: 72 20 2a 7a 20 3d 20 30 3b 0a 20 20 20 20 20 20  r *z = 0;.      
5c50: 20 20 63 68 61 72 20 2a 7a 46 61 6b 65 20 3d 20    char *zFake = 
5c60: 30 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a  0;.        if( z
5c70: 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20 20  Schema ){.      
5c80: 20 20 20 20 63 68 61 72 20 63 51 75 6f 74 65 20      char cQuote 
5c90: 3d 20 71 75 6f 74 65 43 68 61 72 28 7a 53 63 68  = quoteChar(zSch
5ca0: 65 6d 61 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ema);.          
5cb0: 69 66 28 20 63 51 75 6f 74 65 20 26 26 20 73 71  if( cQuote && sq
5cc0: 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28 7a 53  lite3_stricmp(zS
5cd0: 63 68 65 6d 61 2c 22 74 65 6d 70 22 29 21 3d 30  chema,"temp")!=0
5ce0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
5cf0: 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  z = sqlite3_mpri
5d00: 6e 74 66 28 22 25 2e 2a 73 20 5c 22 25 77 5c 22  ntf("%.*s \"%w\"
5d10: 2e 25 73 22 2c 20 6e 2b 37 2c 20 7a 49 6e 2c 20  .%s", n+7, zIn, 
5d20: 7a 53 63 68 65 6d 61 2c 20 7a 49 6e 2b 6e 2b 38  zSchema, zIn+n+8
5d30: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  );.          }el
5d40: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
5d50: 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  z = sqlite3_mpri
5d60: 6e 74 66 28 22 25 2e 2a 73 20 25 73 2e 25 73 22  ntf("%.*s %s.%s"
5d70: 2c 20 6e 2b 37 2c 20 7a 49 6e 2c 20 7a 53 63 68  , n+7, zIn, zSch
5d80: 65 6d 61 2c 20 7a 49 6e 2b 6e 2b 38 29 3b 0a 20  ema, zIn+n+8);. 
5d90: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
5da0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
5db0: 20 7a 4e 61 6d 65 0a 20 20 20 20 20 20 20 20 20   zName.         
5dc0: 26 26 20 61 50 72 65 66 69 78 5b 69 5d 5b 30 5d  && aPrefix[i][0]
5dd0: 3d 3d 27 56 27 0a 20 20 20 20 20 20 20 20 20 26  =='V'.         &
5de0: 26 20 28 7a 46 61 6b 65 20 3d 20 73 68 65 6c 6c  & (zFake = shell
5df0: 46 61 6b 65 53 63 68 65 6d 61 28 64 62 2c 20 7a  FakeSchema(db, z
5e00: 53 63 68 65 6d 61 2c 20 7a 4e 61 6d 65 29 29 21  Schema, zName))!
5e10: 3d 30 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20  =0.        ){.  
5e20: 20 20 20 20 20 20 20 20 69 66 28 20 7a 3d 3d 30          if( z==0
5e30: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
5e40: 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  z = sqlite3_mpri
5e50: 6e 74 66 28 22 25 73 5c 6e 2f 2a 20 25 73 20 2a  ntf("%s\n/* %s *
5e60: 2f 22 2c 20 7a 49 6e 2c 20 7a 46 61 6b 65 29 3b  /", zIn, zFake);
5e70: 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
5e80: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 20  {.            z 
5e90: 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
5ea0: 66 28 22 25 7a 5c 6e 2f 2a 20 25 73 20 2a 2f 22  f("%z\n/* %s */"
5eb0: 2c 20 7a 2c 20 7a 46 61 6b 65 29 3b 0a 20 20 20  , z, zFake);.   
5ec0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
5ed0: 20 20 20 66 72 65 65 28 7a 46 61 6b 65 29 3b 0a     free(zFake);.
5ee0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
5ef0: 20 20 69 66 28 20 7a 20 29 7b 0a 20 20 20 20 20    if( z ){.     
5f00: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73       sqlite3_res
5f10: 75 6c 74 5f 74 65 78 74 28 70 43 74 78 2c 20 7a  ult_text(pCtx, z
5f20: 2c 20 2d 31 2c 20 73 71 6c 69 74 65 33 5f 66 72  , -1, sqlite3_fr
5f30: 65 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  ee);.          r
5f40: 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 20 20 7d  eturn;.        }
5f50: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
5f60: 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73   }.  sqlite3_res
5f70: 75 6c 74 5f 76 61 6c 75 65 28 70 43 74 78 2c 20  ult_value(pCtx, 
5f80: 61 70 56 61 6c 5b 30 5d 29 3b 0a 7d 0a 0a 2f 2a  apVal[0]);.}../*
5f90: 0a 2a 2a 20 54 68 65 20 73 6f 75 72 63 65 20 63  .** The source c
5fa0: 6f 64 65 20 66 6f 72 20 73 65 76 65 72 61 6c 20  ode for several 
5fb0: 72 75 6e 2d 74 69 6d 65 20 6c 6f 61 64 61 62 6c  run-time loadabl
5fc0: 65 20 65 78 74 65 6e 73 69 6f 6e 73 20 69 73 20  e extensions is 
5fd0: 69 6e 73 65 72 74 65 64 0a 2a 2a 20 62 65 6c 6f  inserted.** belo
5fe0: 77 20 62 79 20 74 68 65 20 2e 2e 2f 74 6f 6f 6c  w by the ../tool
5ff0: 2f 6d 6b 73 68 65 6c 6c 63 2e 74 63 6c 20 73 63  /mkshellc.tcl sc
6000: 72 69 70 74 2e 20 20 42 65 66 6f 72 65 20 70 72  ript.  Before pr
6010: 6f 63 65 73 73 69 6e 67 20 74 68 61 74 20 69 6e  ocessing that in
6020: 63 6c 75 64 65 64 0a 2a 2a 20 63 6f 64 65 2c 20  cluded.** code, 
6030: 77 65 20 6e 65 65 64 20 74 6f 20 6f 76 65 72 72  we need to overr
6040: 69 64 65 20 73 6f 6d 65 20 6d 61 63 72 6f 73 20  ide some macros 
6050: 74 6f 20 6d 61 6b 65 20 74 68 65 20 69 6e 63 6c  to make the incl
6060: 75 64 65 64 20 70 72 6f 67 72 61 6d 20 63 6f 64  uded program cod
6070: 65 0a 2a 2a 20 77 6f 72 6b 20 68 65 72 65 20 69  e.** work here i
6080: 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 20  n the middle of 
6090: 74 68 69 73 20 72 65 67 75 6c 61 72 20 70 72 6f  this regular pro
60a0: 67 72 61 6d 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  gram..*/.#define
60b0: 20 53 51 4c 49 54 45 5f 45 58 54 45 4e 53 49 4f   SQLITE_EXTENSIO
60c0: 4e 5f 49 4e 49 54 31 0a 23 64 65 66 69 6e 65 20  N_INIT1.#define 
60d0: 53 51 4c 49 54 45 5f 45 58 54 45 4e 53 49 4f 4e  SQLITE_EXTENSION
60e0: 5f 49 4e 49 54 32 28 58 29 20 28 76 6f 69 64 29  _INIT2(X) (void)
60f0: 28 58 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  (X)..#if defined
6100: 28 5f 57 49 4e 33 32 29 20 26 26 20 64 65 66 69  (_WIN32) && defi
6110: 6e 65 64 28 5f 4d 53 43 5f 56 45 52 29 0a 49 4e  ned(_MSC_VER).IN
6120: 43 4c 55 44 45 20 74 65 73 74 5f 77 69 6e 64 69  CLUDE test_windi
6130: 72 65 6e 74 2e 68 0a 49 4e 43 4c 55 44 45 20 74  rent.h.INCLUDE t
6140: 65 73 74 5f 77 69 6e 64 69 72 65 6e 74 2e 63 0a  est_windirent.c.
6150: 23 64 65 66 69 6e 65 20 64 69 72 65 6e 74 20 44  #define dirent D
6160: 49 52 45 4e 54 0a 23 65 6e 64 69 66 0a 49 4e 43  IRENT.#endif.INC
6170: 4c 55 44 45 20 2e 2e 2f 65 78 74 2f 6d 69 73 63  LUDE ../ext/misc
6180: 2f 73 68 61 74 68 72 65 65 2e 63 0a 49 4e 43 4c  /shathree.c.INCL
6190: 55 44 45 20 2e 2e 2f 65 78 74 2f 6d 69 73 63 2f  UDE ../ext/misc/
61a0: 66 69 6c 65 69 6f 2e 63 0a 49 4e 43 4c 55 44 45  fileio.c.INCLUDE
61b0: 20 2e 2e 2f 65 78 74 2f 6d 69 73 63 2f 63 6f 6d   ../ext/misc/com
61c0: 70 6c 65 74 69 6f 6e 2e 63 0a 49 4e 43 4c 55 44  pletion.c.INCLUD
61d0: 45 20 2e 2e 2f 65 78 74 2f 6d 69 73 63 2f 61 70  E ../ext/misc/ap
61e0: 70 65 6e 64 76 66 73 2e 63 0a 23 69 66 64 65 66  pendvfs.c.#ifdef
61f0: 20 53 51 4c 49 54 45 5f 48 41 56 45 5f 5a 4c 49   SQLITE_HAVE_ZLI
6200: 42 0a 49 4e 43 4c 55 44 45 20 2e 2e 2f 65 78 74  B.INCLUDE ../ext
6210: 2f 6d 69 73 63 2f 7a 69 70 66 69 6c 65 2e 63 0a  /misc/zipfile.c.
6220: 49 4e 43 4c 55 44 45 20 2e 2e 2f 65 78 74 2f 6d  INCLUDE ../ext/m
6230: 69 73 63 2f 73 71 6c 61 72 2e 63 0a 23 65 6e 64  isc/sqlar.c.#end
6240: 69 66 0a 49 4e 43 4c 55 44 45 20 2e 2e 2f 65 78  if.INCLUDE ../ex
6250: 74 2f 65 78 70 65 72 74 2f 73 71 6c 69 74 65 33  t/expert/sqlite3
6260: 65 78 70 65 72 74 2e 68 0a 49 4e 43 4c 55 44 45  expert.h.INCLUDE
6270: 20 2e 2e 2f 65 78 74 2f 65 78 70 65 72 74 2f 73   ../ext/expert/s
6280: 71 6c 69 74 65 33 65 78 70 65 72 74 2e 63 0a 0a  qlite3expert.c..
6290: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
62a0: 54 45 5f 45 4e 41 42 4c 45 5f 53 45 53 53 49 4f  TE_ENABLE_SESSIO
62b0: 4e 29 0a 2f 2a 0a 2a 2a 20 53 74 61 74 65 20 69  N)./*.** State i
62c0: 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 61  nformation for a
62d0: 20 73 69 6e 67 6c 65 20 6f 70 65 6e 20 73 65 73   single open ses
62e0: 73 69 6f 6e 0a 2a 2f 0a 74 79 70 65 64 65 66 20  sion.*/.typedef 
62f0: 73 74 72 75 63 74 20 4f 70 65 6e 53 65 73 73 69  struct OpenSessi
6300: 6f 6e 20 4f 70 65 6e 53 65 73 73 69 6f 6e 3b 0a  on OpenSession;.
6310: 73 74 72 75 63 74 20 4f 70 65 6e 53 65 73 73 69  struct OpenSessi
6320: 6f 6e 20 7b 0a 20 20 63 68 61 72 20 2a 7a 4e 61  on {.  char *zNa
6330: 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  me;             
6340: 2f 2a 20 53 79 6d 62 6f 6c 69 63 20 6e 61 6d 65  /* Symbolic name
6350: 20 66 6f 72 20 74 68 69 73 20 73 65 73 73 69 6f   for this sessio
6360: 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 69 6c 74  n */.  int nFilt
6370: 65 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  er;             
6380: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 78 46 69  /* Number of xFi
6390: 6c 74 65 72 20 72 65 6a 65 63 74 69 6f 6e 20 47  lter rejection G
63a0: 4c 4f 42 20 70 61 74 74 65 72 6e 73 20 2a 2f 0a  LOB patterns */.
63b0: 20 20 63 68 61 72 20 2a 2a 61 7a 46 69 6c 74 65    char **azFilte
63c0: 72 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72  r;         /* Ar
63d0: 72 61 79 20 6f 66 20 78 46 69 6c 74 65 72 20 72  ray of xFilter r
63e0: 65 6a 65 63 74 69 6f 6e 20 47 4c 4f 42 20 70 61  ejection GLOB pa
63f0: 74 74 65 72 6e 73 20 2a 2f 0a 20 20 73 71 6c 69  tterns */.  sqli
6400: 74 65 33 5f 73 65 73 73 69 6f 6e 20 2a 70 3b 20  te3_session *p; 
6410: 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 70 65 6e       /* The open
6420: 20 73 65 73 73 69 6f 6e 20 2a 2f 0a 7d 3b 0a 23   session */.};.#
6430: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 53 68 65  endif../*.** She
6440: 6c 6c 20 6f 75 74 70 75 74 20 6d 6f 64 65 20 69  ll output mode i
6450: 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20  nformation from 
6460: 62 65 66 6f 72 65 20 22 2e 65 78 70 6c 61 69 6e  before ".explain
6470: 20 6f 6e 22 2c 0a 2a 2a 20 73 61 76 65 64 20 73   on",.** saved s
6480: 6f 20 74 68 61 74 20 69 74 20 63 61 6e 20 62 65  o that it can be
6490: 20 72 65 73 74 6f 72 65 64 20 62 79 20 22 2e 65   restored by ".e
64a0: 78 70 6c 61 69 6e 20 6f 66 66 22 0a 2a 2f 0a 74  xplain off".*/.t
64b0: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 53 61  ypedef struct Sa
64c0: 76 65 64 4d 6f 64 65 49 6e 66 6f 20 53 61 76 65  vedModeInfo Save
64d0: 64 4d 6f 64 65 49 6e 66 6f 3b 0a 73 74 72 75 63  dModeInfo;.struc
64e0: 74 20 53 61 76 65 64 4d 6f 64 65 49 6e 66 6f 20  t SavedModeInfo 
64f0: 7b 0a 20 20 69 6e 74 20 76 61 6c 69 64 3b 20 20  {.  int valid;  
6500: 20 20 20 20 20 20 20 20 2f 2a 20 49 73 20 74 68          /* Is th
6510: 65 72 65 20 6c 65 67 69 74 20 64 61 74 61 20 69  ere legit data i
6520: 6e 20 68 65 72 65 3f 20 2a 2f 0a 20 20 69 6e 74  n here? */.  int
6530: 20 6d 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20   mode;          
6540: 20 2f 2a 20 4d 6f 64 65 20 70 72 69 6f 72 20 74   /* Mode prior t
6550: 6f 20 22 2e 65 78 70 6c 61 69 6e 20 6f 6e 22 20  o ".explain on" 
6560: 2a 2f 0a 20 20 69 6e 74 20 73 68 6f 77 48 65 61  */.  int showHea
6570: 64 65 72 3b 20 20 20 20 20 2f 2a 20 54 68 65 20  der;     /* The 
6580: 22 2e 68 65 61 64 65 72 22 20 73 65 74 74 69 6e  ".header" settin
6590: 67 20 70 72 69 6f 72 20 74 6f 20 22 2e 65 78 70  g prior to ".exp
65a0: 6c 61 69 6e 20 6f 6e 22 20 2a 2f 0a 20 20 69 6e  lain on" */.  in
65b0: 74 20 63 6f 6c 57 69 64 74 68 5b 31 30 30 5d 3b  t colWidth[100];
65c0: 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 77 69 64 74    /* Column widt
65d0: 68 73 20 70 72 69 6f 72 20 74 6f 20 22 2e 65 78  hs prior to ".ex
65e0: 70 6c 61 69 6e 20 6f 6e 22 20 2a 2f 0a 7d 3b 0a  plain on" */.};.
65f0: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
6600: 45 78 70 65 72 74 49 6e 66 6f 20 45 78 70 65 72  ExpertInfo Exper
6610: 74 49 6e 66 6f 3b 0a 73 74 72 75 63 74 20 45 78  tInfo;.struct Ex
6620: 70 65 72 74 49 6e 66 6f 20 7b 0a 20 20 73 71 6c  pertInfo {.  sql
6630: 69 74 65 33 65 78 70 65 72 74 20 2a 70 45 78 70  ite3expert *pExp
6640: 65 72 74 3b 0a 20 20 69 6e 74 20 62 56 65 72 62  ert;.  int bVerb
6650: 6f 73 65 3b 0a 7d 3b 0a 0a 2f 2a 20 41 20 73 69  ose;.};../* A si
6660: 6e 67 6c 65 20 6c 69 6e 65 20 69 6e 20 74 68 65  ngle line in the
6670: 20 45 51 50 20 6f 75 74 70 75 74 20 2a 2f 0a 74   EQP output */.t
6680: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 45 51  ypedef struct EQ
6690: 50 47 72 61 70 68 52 6f 77 20 45 51 50 47 72 61  PGraphRow EQPGra
66a0: 70 68 52 6f 77 3b 0a 73 74 72 75 63 74 20 45 51  phRow;.struct EQ
66b0: 50 47 72 61 70 68 52 6f 77 20 7b 0a 20 20 69 6e  PGraphRow {.  in
66c0: 74 20 69 45 71 70 49 64 3b 20 20 20 20 20 20 20  t iEqpId;       
66d0: 20 20 20 20 2f 2a 20 49 44 20 66 6f 72 20 74 68      /* ID for th
66e0: 69 73 20 72 6f 77 20 2a 2f 0a 20 20 69 6e 74 20  is row */.  int 
66f0: 69 50 61 72 65 6e 74 49 64 3b 20 20 20 20 20 20  iParentId;      
6700: 20 20 2f 2a 20 49 44 20 6f 66 20 74 68 65 20 70    /* ID of the p
6710: 61 72 65 6e 74 20 72 6f 77 20 2a 2f 0a 20 20 45  arent row */.  E
6720: 51 50 47 72 61 70 68 52 6f 77 20 2a 70 4e 65 78  QPGraphRow *pNex
6730: 74 3b 20 20 20 2f 2a 20 4e 65 78 74 20 72 6f 77  t;   /* Next row
6740: 20 69 6e 20 73 65 71 75 65 6e 63 65 20 2a 2f 0a   in sequence */.
6750: 20 20 63 68 61 72 20 7a 54 65 78 74 5b 31 5d 3b    char zText[1];
6760: 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20          /* Text 
6770: 74 6f 20 64 69 73 70 6c 61 79 20 66 6f 72 20 74  to display for t
6780: 68 69 73 20 72 6f 77 20 2a 2f 0a 7d 3b 0a 0a 2f  his row */.};../
6790: 2a 20 41 6c 6c 20 45 51 50 20 6f 75 74 70 75 74  * All EQP output
67a0: 20 69 73 20 63 6f 6c 6c 65 63 74 65 64 20 69 6e   is collected in
67b0: 74 6f 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f  to an instance o
67c0: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
67d0: 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  */.typedef struc
67e0: 74 20 45 51 50 47 72 61 70 68 20 45 51 50 47 72  t EQPGraph EQPGr
67f0: 61 70 68 3b 0a 73 74 72 75 63 74 20 45 51 50 47  aph;.struct EQPG
6800: 72 61 70 68 20 7b 0a 20 20 45 51 50 47 72 61 70  raph {.  EQPGrap
6810: 68 52 6f 77 20 2a 70 52 6f 77 3b 20 20 20 20 2f  hRow *pRow;    /
6820: 2a 20 4c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66  * Linked list of
6830: 20 61 6c 6c 20 72 6f 77 73 20 6f 66 20 74 68 65   all rows of the
6840: 20 45 51 50 20 6f 75 74 70 75 74 20 2a 2f 0a 20   EQP output */. 
6850: 20 45 51 50 47 72 61 70 68 52 6f 77 20 2a 70 4c   EQPGraphRow *pL
6860: 61 73 74 3b 20 20 20 2f 2a 20 4c 61 73 74 20 65  ast;   /* Last e
6870: 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 70 52  lement of the pR
6880: 6f 77 20 6c 69 73 74 20 2a 2f 0a 20 20 63 68 61  ow list */.  cha
6890: 72 20 7a 50 72 65 66 69 78 5b 31 30 30 5d 3b 20  r zPrefix[100]; 
68a0: 20 20 20 2f 2a 20 47 72 61 70 68 20 70 72 65 66     /* Graph pref
68b0: 69 78 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  ix */.};../*.** 
68c0: 53 74 61 74 65 20 69 6e 66 6f 72 6d 61 74 69 6f  State informatio
68d0: 6e 20 61 62 6f 75 74 20 74 68 65 20 64 61 74 61  n about the data
68e0: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
68f0: 69 73 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20  is contained in 
6900: 61 6e 0a 2a 2a 20 69 6e 73 74 61 6e 63 65 20 6f  an.** instance o
6910: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
6920: 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 74 79  structure..*/.ty
6930: 70 65 64 65 66 20 73 74 72 75 63 74 20 53 68 65  pedef struct She
6940: 6c 6c 53 74 61 74 65 20 53 68 65 6c 6c 53 74 61  llState ShellSta
6950: 74 65 3b 0a 73 74 72 75 63 74 20 53 68 65 6c 6c  te;.struct Shell
6960: 53 74 61 74 65 20 7b 0a 20 20 73 71 6c 69 74 65  State {.  sqlite
6970: 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20  3 *db;          
6980: 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
6990: 20 2a 2f 0a 20 20 75 38 20 61 75 74 6f 45 78 70   */.  u8 autoExp
69a0: 6c 61 69 6e 3b 20 20 20 20 20 20 20 20 2f 2a 20  lain;        /* 
69b0: 41 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 74 75  Automatically tu
69c0: 72 6e 20 6f 6e 20 2e 65 78 70 6c 61 69 6e 20 6d  rn on .explain m
69d0: 6f 64 65 20 2a 2f 0a 20 20 75 38 20 61 75 74 6f  ode */.  u8 auto
69e0: 45 51 50 3b 20 20 20 20 20 20 20 20 20 20 20 20  EQP;            
69f0: 2f 2a 20 52 75 6e 20 45 58 50 4c 41 49 4e 20 51  /* Run EXPLAIN Q
6a00: 55 45 52 59 20 50 4c 41 4e 20 70 72 69 6f 72 20  UERY PLAN prior 
6a10: 74 6f 20 73 65 61 63 68 20 53 51 4c 20 73 74 6d  to seach SQL stm
6a20: 74 20 2a 2f 0a 20 20 75 38 20 61 75 74 6f 45 51  t */.  u8 autoEQ
6a30: 50 74 65 73 74 3b 20 20 20 20 20 20 20 20 2f 2a  Ptest;        /*
6a40: 20 61 75 74 6f 45 51 50 20 69 73 20 69 6e 20 74   autoEQP is in t
6a50: 65 73 74 20 6d 6f 64 65 20 2a 2f 0a 20 20 75 38  est mode */.  u8
6a60: 20 73 74 61 74 73 4f 6e 3b 20 20 20 20 20 20 20   statsOn;       
6a70: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20       /* True to 
6a80: 64 69 73 70 6c 61 79 20 6d 65 6d 6f 72 79 20 73  display memory s
6a90: 74 61 74 73 20 62 65 66 6f 72 65 20 65 61 63 68  tats before each
6aa0: 20 66 69 6e 61 6c 69 7a 65 20 2a 2f 0a 20 20 75   finalize */.  u
6ab0: 38 20 73 63 61 6e 73 74 61 74 73 4f 6e 3b 20 20  8 scanstatsOn;  
6ac0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f        /* True to
6ad0: 20 64 69 73 70 6c 61 79 20 73 63 61 6e 20 73 74   display scan st
6ae0: 61 74 73 20 62 65 66 6f 72 65 20 65 61 63 68 20  ats before each 
6af0: 66 69 6e 61 6c 69 7a 65 20 2a 2f 0a 20 20 75 38  finalize */.  u8
6b00: 20 6f 70 65 6e 4d 6f 64 65 3b 20 20 20 20 20 20   openMode;      
6b10: 20 20 20 20 20 2f 2a 20 53 48 45 4c 4c 5f 4f 50       /* SHELL_OP
6b20: 45 4e 5f 4e 4f 52 4d 41 4c 2c 20 5f 41 50 50 45  EN_NORMAL, _APPE
6b30: 4e 44 56 46 53 2c 20 6f 72 20 5f 5a 49 50 46 49  NDVFS, or _ZIPFI
6b40: 4c 45 20 2a 2f 0a 20 20 75 38 20 64 6f 58 64 67  LE */.  u8 doXdg
6b50: 4f 70 65 6e 3b 20 20 20 20 20 20 20 20 20 20 2f  Open;          /
6b60: 2a 20 49 6e 76 6f 6b 65 20 73 74 61 72 74 2f 6f  * Invoke start/o
6b70: 70 65 6e 2f 78 64 67 2d 6f 70 65 6e 20 69 6e 20  pen/xdg-open in 
6b80: 6f 75 74 70 75 74 5f 72 65 73 65 74 28 29 20 2a  output_reset() *
6b90: 2f 0a 20 20 75 38 20 6e 45 71 70 4c 65 76 65 6c  /.  u8 nEqpLevel
6ba0: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65  ;          /* De
6bb0: 70 74 68 20 6f 66 20 74 68 65 20 45 51 50 20 6f  pth of the EQP o
6bc0: 75 74 70 75 74 20 67 72 61 70 68 20 2a 2f 0a 20  utput graph */. 
6bd0: 20 75 6e 73 69 67 6e 65 64 20 6d 45 71 70 4c 69   unsigned mEqpLi
6be0: 6e 65 73 3b 20 20 20 20 2f 2a 20 4d 61 73 6b 20  nes;    /* Mask 
6bf0: 6f 66 20 76 65 72 69 74 69 63 61 6c 20 6c 69 6e  of veritical lin
6c00: 65 73 20 69 6e 20 74 68 65 20 45 51 50 20 6f 75  es in the EQP ou
6c10: 74 70 75 74 20 67 72 61 70 68 20 2a 2f 0a 20 20  tput graph */.  
6c20: 69 6e 74 20 6f 75 74 43 6f 75 6e 74 3b 20 20 20  int outCount;   
6c30: 20 20 20 20 20 20 20 2f 2a 20 52 65 76 65 72 74         /* Revert
6c40: 20 74 6f 20 73 74 64 6f 75 74 20 77 68 65 6e 20   to stdout when 
6c50: 72 65 61 63 68 69 6e 67 20 7a 65 72 6f 20 2a 2f  reaching zero */
6c60: 0a 20 20 69 6e 74 20 63 6e 74 3b 20 20 20 20 20  .  int cnt;     
6c70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
6c80: 62 65 72 20 6f 66 20 72 65 63 6f 72 64 73 20 64  ber of records d
6c90: 69 73 70 6c 61 79 65 64 20 73 6f 20 66 61 72 20  isplayed so far 
6ca0: 2a 2f 0a 20 20 46 49 4c 45 20 2a 6f 75 74 3b 20  */.  FILE *out; 
6cb0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
6cc0: 72 69 74 65 20 72 65 73 75 6c 74 73 20 68 65 72  rite results her
6cd0: 65 20 2a 2f 0a 20 20 46 49 4c 45 20 2a 74 72 61  e */.  FILE *tra
6ce0: 63 65 4f 75 74 3b 20 20 20 20 20 20 20 20 2f 2a  ceOut;        /*
6cf0: 20 4f 75 74 70 75 74 20 66 6f 72 20 73 71 6c 69   Output for sqli
6d00: 74 65 33 5f 74 72 61 63 65 28 29 20 2a 2f 0a 20  te3_trace() */. 
6d10: 20 69 6e 74 20 6e 45 72 72 3b 20 20 20 20 20 20   int nErr;      
6d20: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
6d30: 72 20 6f 66 20 65 72 72 6f 72 73 20 73 65 65 6e  r of errors seen
6d40: 20 2a 2f 0a 20 20 69 6e 74 20 6d 6f 64 65 3b 20   */.  int mode; 
6d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
6d60: 41 6e 20 6f 75 74 70 75 74 20 6d 6f 64 65 20 73  An output mode s
6d70: 65 74 74 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20  etting */.  int 
6d80: 6d 6f 64 65 50 72 69 6f 72 3b 20 20 20 20 20 20  modePrior;      
6d90: 20 20 20 2f 2a 20 53 61 76 65 64 20 6d 6f 64 65     /* Saved mode
6da0: 20 2a 2f 0a 20 20 69 6e 74 20 63 4d 6f 64 65 3b   */.  int cMode;
6db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
6dc0: 74 65 6d 70 6f 72 61 72 79 20 6f 75 74 70 75 74  temporary output
6dd0: 20 6d 6f 64 65 20 66 6f 72 20 74 68 65 20 63 75   mode for the cu
6de0: 72 72 65 6e 74 20 71 75 65 72 79 20 2a 2f 0a 20  rrent query */. 
6df0: 20 69 6e 74 20 6e 6f 72 6d 61 6c 4d 6f 64 65 3b   int normalMode;
6e00: 20 20 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75          /* Outpu
6e10: 74 20 6d 6f 64 65 20 62 65 66 6f 72 65 20 22 2e  t mode before ".
6e20: 65 78 70 6c 61 69 6e 20 6f 6e 22 20 2a 2f 0a 20  explain on" */. 
6e30: 20 69 6e 74 20 77 72 69 74 61 62 6c 65 53 63 68   int writableSch
6e40: 65 6d 61 3b 20 20 20 20 2f 2a 20 54 72 75 65 20  ema;    /* True 
6e50: 69 66 20 50 52 41 47 4d 41 20 77 72 69 74 61 62  if PRAGMA writab
6e60: 6c 65 5f 73 63 68 65 6d 61 3d 4f 4e 20 2a 2f 0a  le_schema=ON */.
6e70: 20 20 69 6e 74 20 73 68 6f 77 48 65 61 64 65 72    int showHeader
6e80: 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65  ;        /* True
6e90: 20 74 6f 20 73 68 6f 77 20 63 6f 6c 75 6d 6e 20   to show column 
6ea0: 6e 61 6d 65 73 20 69 6e 20 4c 69 73 74 20 6f 72  names in List or
6eb0: 20 43 6f 6c 75 6d 6e 20 6d 6f 64 65 20 2a 2f 0a   Column mode */.
6ec0: 20 20 69 6e 74 20 6e 43 68 65 63 6b 3b 20 20 20    int nCheck;   
6ed0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
6ee0: 65 72 20 6f 66 20 22 2e 63 68 65 63 6b 22 20 63  er of ".check" c
6ef0: 6f 6d 6d 61 6e 64 73 20 72 75 6e 20 2a 2f 0a 20  ommands run */. 
6f00: 20 75 6e 73 69 67 6e 65 64 20 73 68 65 6c 6c 46   unsigned shellF
6f10: 6c 67 73 3b 20 20 20 20 2f 2a 20 56 61 72 69 6f  lgs;    /* Vario
6f20: 75 73 20 66 6c 61 67 73 20 2a 2f 0a 20 20 63 68  us flags */.  ch
6f30: 61 72 20 2a 7a 44 65 73 74 54 61 62 6c 65 3b 20  ar *zDestTable; 
6f40: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
6f50: 64 65 73 74 69 6e 61 74 69 6f 6e 20 74 61 62 6c  destination tabl
6f60: 65 20 77 68 65 6e 20 4d 4f 44 45 5f 49 6e 73 65  e when MODE_Inse
6f70: 72 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 54  rt */.  char *zT
6f80: 65 6d 70 46 69 6c 65 3b 20 20 20 20 20 20 20 2f  empFile;       /
6f90: 2a 20 54 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  * Temporary file
6fa0: 20 74 68 61 74 20 6d 69 67 68 74 20 6e 65 65 64   that might need
6fb0: 20 64 65 6c 65 74 69 6e 67 20 2a 2f 0a 20 20 63   deleting */.  c
6fc0: 68 61 72 20 7a 54 65 73 74 63 61 73 65 5b 33 30  har zTestcase[30
6fd0: 5d 3b 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66  ];    /* Name of
6fe0: 20 63 75 72 72 65 6e 74 20 74 65 73 74 20 63 61   current test ca
6ff0: 73 65 20 2a 2f 0a 20 20 63 68 61 72 20 63 6f 6c  se */.  char col
7000: 53 65 70 61 72 61 74 6f 72 5b 32 30 5d 3b 20 2f  Separator[20]; /
7010: 2a 20 43 6f 6c 75 6d 6e 20 73 65 70 61 72 61 74  * Column separat
7020: 6f 72 20 63 68 61 72 61 63 74 65 72 20 66 6f 72  or character for
7030: 20 73 65 76 65 72 61 6c 20 6d 6f 64 65 73 20 2a   several modes *
7040: 2f 0a 20 20 63 68 61 72 20 72 6f 77 53 65 70 61  /.  char rowSepa
7050: 72 61 74 6f 72 5b 32 30 5d 3b 20 2f 2a 20 52 6f  rator[20]; /* Ro
7060: 77 20 73 65 70 61 72 61 74 6f 72 20 63 68 61 72  w separator char
7070: 61 63 74 65 72 20 66 6f 72 20 4d 4f 44 45 5f 41  acter for MODE_A
7080: 73 63 69 69 20 2a 2f 0a 20 20 63 68 61 72 20 63  scii */.  char c
7090: 6f 6c 53 65 70 50 72 69 6f 72 5b 32 30 5d 3b 20  olSepPrior[20]; 
70a0: 20 2f 2a 20 53 61 76 65 64 20 63 6f 6c 75 6d 6e   /* Saved column
70b0: 20 73 65 70 61 72 61 74 6f 72 20 2a 2f 0a 20 20   separator */.  
70c0: 63 68 61 72 20 72 6f 77 53 65 70 50 72 69 6f 72  char rowSepPrior
70d0: 5b 32 30 5d 3b 20 20 2f 2a 20 53 61 76 65 64 20  [20];  /* Saved 
70e0: 72 6f 77 20 73 65 70 61 72 61 74 6f 72 20 2a 2f  row separator */
70f0: 0a 20 20 69 6e 74 20 63 6f 6c 57 69 64 74 68 5b  .  int colWidth[
7100: 31 30 30 5d 3b 20 20 20 20 20 2f 2a 20 52 65 71  100];     /* Req
7110: 75 65 73 74 65 64 20 77 69 64 74 68 20 6f 66 20  uested width of 
7120: 65 61 63 68 20 63 6f 6c 75 6d 6e 20 77 68 65 6e  each column when
7130: 20 69 6e 20 63 6f 6c 75 6d 6e 20 6d 6f 64 65 2a   in column mode*
7140: 2f 0a 20 20 69 6e 74 20 61 63 74 75 61 6c 57 69  /.  int actualWi
7150: 64 74 68 5b 31 30 30 5d 3b 20 20 2f 2a 20 41 63  dth[100];  /* Ac
7160: 74 75 61 6c 20 77 69 64 74 68 20 6f 66 20 65 61  tual width of ea
7170: 63 68 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 63  ch column */.  c
7180: 68 61 72 20 6e 75 6c 6c 56 61 6c 75 65 5b 32 30  har nullValue[20
7190: 5d 3b 20 20 20 20 2f 2a 20 54 68 65 20 74 65 78  ];    /* The tex
71a0: 74 20 74 6f 20 70 72 69 6e 74 20 77 68 65 6e 20  t to print when 
71b0: 61 20 4e 55 4c 4c 20 63 6f 6d 65 73 20 62 61 63  a NULL comes bac
71c0: 6b 20 66 72 6f 6d 0a 20 20 20 20 20 20 20 20 20  k from.         
71d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
71e0: 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
71f0: 2a 2f 0a 20 20 63 68 61 72 20 6f 75 74 66 69 6c  */.  char outfil
7200: 65 5b 46 49 4c 45 4e 41 4d 45 5f 4d 41 58 5d 3b  e[FILENAME_MAX];
7210: 20 2f 2a 20 46 69 6c 65 6e 61 6d 65 20 66 6f 72   /* Filename for
7220: 20 2a 6f 75 74 20 2a 2f 0a 20 20 63 6f 6e 73 74   *out */.  const
7230: 20 63 68 61 72 20 2a 7a 44 62 46 69 6c 65 6e 61   char *zDbFilena
7240: 6d 65 3b 20 20 20 20 2f 2a 20 6e 61 6d 65 20 6f  me;    /* name o
7250: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
7260: 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ile */.  char *z
7270: 46 72 65 65 4f 6e 43 6c 6f 73 65 3b 20 20 20 20  FreeOnClose;    
7280: 20 20 20 20 20 2f 2a 20 46 69 6c 65 6e 61 6d 65       /* Filename
7290: 20 74 6f 20 66 72 65 65 20 77 68 65 6e 20 63 6c   to free when cl
72a0: 6f 73 69 6e 67 20 2a 2f 0a 20 20 63 6f 6e 73 74  osing */.  const
72b0: 20 63 68 61 72 20 2a 7a 56 66 73 3b 20 20 20 20   char *zVfs;    
72c0: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
72d0: 66 20 56 46 53 20 74 6f 20 75 73 65 20 2a 2f 0a  f VFS to use */.
72e0: 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
72f0: 70 53 74 6d 74 3b 20 20 20 2f 2a 20 43 75 72 72  pStmt;   /* Curr
7300: 65 6e 74 20 73 74 61 74 65 6d 65 6e 74 20 69 66  ent statement if
7310: 20 61 6e 79 2e 20 2a 2f 0a 20 20 46 49 4c 45 20   any. */.  FILE 
7320: 2a 70 4c 6f 67 3b 20 20 20 20 20 20 20 20 20 20  *pLog;          
7330: 20 20 2f 2a 20 57 72 69 74 65 20 6c 6f 67 20 6f    /* Write log o
7340: 75 74 70 75 74 20 68 65 72 65 20 2a 2f 0a 20 20  utput here */.  
7350: 69 6e 74 20 2a 61 69 49 6e 64 65 6e 74 3b 20 20  int *aiIndent;  
7360: 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20         /* Array 
7370: 6f 66 20 69 6e 64 65 6e 74 73 20 75 73 65 64 20  of indents used 
7380: 69 6e 20 4d 4f 44 45 5f 45 78 70 6c 61 69 6e 20  in MODE_Explain 
7390: 2a 2f 0a 20 20 69 6e 74 20 6e 49 6e 64 65 6e 74  */.  int nIndent
73a0: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  ;           /* S
73b0: 69 7a 65 20 6f 66 20 61 72 72 61 79 20 61 69 49  ize of array aiI
73c0: 6e 64 65 6e 74 5b 5d 20 2a 2f 0a 20 20 69 6e 74  ndent[] */.  int
73d0: 20 69 49 6e 64 65 6e 74 3b 20 20 20 20 20 20 20   iIndent;       
73e0: 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
73f0: 63 75 72 72 65 6e 74 20 6f 70 20 69 6e 20 61 69  current op in ai
7400: 49 6e 64 65 6e 74 5b 5d 20 2a 2f 0a 20 20 45 51  Indent[] */.  EQ
7410: 50 47 72 61 70 68 20 73 47 72 61 70 68 3b 20 20  PGraph sGraph;  
7420: 20 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74       /* Informat
7430: 69 6f 6e 20 66 6f 72 20 74 68 65 20 67 72 61 70  ion for the grap
7440: 68 69 63 61 6c 20 45 58 50 4c 41 49 4e 20 51 55  hical EXPLAIN QU
7450: 45 52 59 20 50 4c 41 4e 20 2a 2f 0a 23 69 66 20  ERY PLAN */.#if 
7460: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
7470: 4e 41 42 4c 45 5f 53 45 53 53 49 4f 4e 29 0a 20  NABLE_SESSION). 
7480: 20 69 6e 74 20 6e 53 65 73 73 69 6f 6e 3b 20 20   int nSession;  
7490: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
74a0: 6d 62 65 72 20 6f 66 20 61 63 74 69 76 65 20 73  mber of active s
74b0: 65 73 73 69 6f 6e 73 20 2a 2f 0a 20 20 4f 70 65  essions */.  Ope
74c0: 6e 53 65 73 73 69 6f 6e 20 61 53 65 73 73 69 6f  nSession aSessio
74d0: 6e 5b 34 5d 3b 20 20 2f 2a 20 41 72 72 61 79 20  n[4];  /* Array 
74e0: 6f 66 20 73 65 73 73 69 6f 6e 73 2e 20 20 5b 30  of sessions.  [0
74f0: 5d 20 69 73 20 69 6e 20 66 6f 63 75 73 2e 20 2a  ] is in focus. *
7500: 2f 0a 23 65 6e 64 69 66 0a 20 20 45 78 70 65 72  /.#endif.  Exper
7510: 74 49 6e 66 6f 20 65 78 70 65 72 74 3b 20 20 20  tInfo expert;   
7520: 20 20 20 20 20 2f 2a 20 56 61 6c 69 64 20 69 66       /* Valid if
7530: 20 70 72 65 76 69 6f 75 73 20 63 6f 6d 6d 61 6e   previous comman
7540: 64 20 77 61 73 20 22 2e 65 78 70 65 72 74 20 4f  d was ".expert O
7550: 50 54 2e 2e 2e 22 20 2a 2f 0a 7d 3b 0a 0a 0a 2f  PT..." */.};.../
7560: 2a 20 41 6c 6c 6f 77 65 64 20 76 61 6c 75 65 73  * Allowed values
7570: 20 66 6f 72 20 53 68 65 6c 6c 53 74 61 74 65 2e   for ShellState.
7580: 61 75 74 6f 45 51 50 0a 2a 2f 0a 23 64 65 66 69  autoEQP.*/.#defi
7590: 6e 65 20 41 55 54 4f 45 51 50 5f 6f 66 66 20 20  ne AUTOEQP_off  
75a0: 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20      0           
75b0: 2f 2a 20 41 75 74 6f 6d 61 74 69 63 20 45 58 50  /* Automatic EXP
75c0: 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 20  LAIN QUERY PLAN 
75d0: 69 73 20 6f 66 66 20 2a 2f 0a 23 64 65 66 69 6e  is off */.#defin
75e0: 65 20 41 55 54 4f 45 51 50 5f 6f 6e 20 20 20 20  e AUTOEQP_on    
75f0: 20 20 20 31 20 20 20 20 20 20 20 20 20 20 20 2f     1           /
7600: 2a 20 41 75 74 6f 6d 61 74 69 63 20 45 51 50 20  * Automatic EQP 
7610: 69 73 20 6f 6e 20 2a 2f 0a 23 64 65 66 69 6e 65  is on */.#define
7620: 20 41 55 54 4f 45 51 50 5f 74 72 69 67 67 65 72   AUTOEQP_trigger
7630: 20 20 32 20 20 20 20 20 20 20 20 20 20 20 2f 2a    2           /*
7640: 20 4f 6e 20 61 6e 64 20 61 6c 73 6f 20 73 68 6f   On and also sho
7650: 77 20 70 6c 61 6e 73 20 66 6f 72 20 74 72 69 67  w plans for trig
7660: 67 65 72 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20  gers */.#define 
7670: 41 55 54 4f 45 51 50 5f 66 75 6c 6c 20 20 20 20  AUTOEQP_full    
7680: 20 33 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20   3           /* 
7690: 53 68 6f 77 20 66 75 6c 6c 20 45 58 50 4c 41 49  Show full EXPLAI
76a0: 4e 20 2a 2f 0a 0a 2f 2a 20 41 6c 6c 6f 77 65 64  N */../* Allowed
76b0: 20 76 61 6c 75 65 73 20 66 6f 72 20 53 68 65 6c   values for Shel
76c0: 6c 53 74 61 74 65 2e 6f 70 65 6e 4d 6f 64 65 0a  lState.openMode.
76d0: 2a 2f 0a 23 64 65 66 69 6e 65 20 53 48 45 4c 4c  */.#define SHELL
76e0: 5f 4f 50 45 4e 5f 55 4e 53 50 45 43 20 20 20 20  _OPEN_UNSPEC    
76f0: 20 30 20 20 20 20 20 20 2f 2a 20 4e 6f 20 6f 70   0      /* No op
7700: 65 6e 2d 6d 6f 64 65 20 73 70 65 63 69 66 69 65  en-mode specifie
7710: 64 20 2a 2f 0a 23 64 65 66 69 6e 65 20 53 48 45  d */.#define SHE
7720: 4c 4c 5f 4f 50 45 4e 5f 4e 4f 52 4d 41 4c 20 20  LL_OPEN_NORMAL  
7730: 20 20 20 31 20 20 20 20 20 20 2f 2a 20 4e 6f 72     1      /* Nor
7740: 6d 61 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c  mal database fil
7750: 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 53 48 45  e */.#define SHE
7760: 4c 4c 5f 4f 50 45 4e 5f 41 50 50 45 4e 44 56 46  LL_OPEN_APPENDVF
7770: 53 20 20 32 20 20 20 20 20 20 2f 2a 20 55 73 65  S  2      /* Use
7780: 20 61 70 70 65 6e 64 76 66 73 20 2a 2f 0a 23 64   appendvfs */.#d
7790: 65 66 69 6e 65 20 53 48 45 4c 4c 5f 4f 50 45 4e  efine SHELL_OPEN
77a0: 5f 5a 49 50 46 49 4c 45 20 20 20 20 33 20 20 20  _ZIPFILE    3   
77b0: 20 20 20 2f 2a 20 55 73 65 20 74 68 65 20 7a 69     /* Use the zi
77c0: 70 66 69 6c 65 20 76 69 72 74 75 61 6c 20 74 61  pfile virtual ta
77d0: 62 6c 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 53  ble */.#define S
77e0: 48 45 4c 4c 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e  HELL_OPEN_READON
77f0: 4c 59 20 20 20 34 20 20 20 20 20 20 2f 2a 20 4f  LY   4      /* O
7800: 70 65 6e 20 61 20 6e 6f 72 6d 61 6c 20 64 61 74  pen a normal dat
7810: 61 62 61 73 65 20 72 65 61 64 2d 6f 6e 6c 79 20  abase read-only 
7820: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 73 65 20  */../*.** These 
7830: 61 72 65 20 74 68 65 20 61 6c 6c 6f 77 65 64 20  are the allowed 
7840: 73 68 65 6c 6c 46 6c 67 73 20 76 61 6c 75 65 73  shellFlgs values
7850: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 53 48 46 4c  .*/.#define SHFL
7860: 47 5f 50 61 67 65 63 61 63 68 65 20 20 20 20 20  G_Pagecache     
7870: 20 30 78 30 30 30 30 30 30 30 31 20 2f 2a 20 54   0x00000001 /* T
7880: 68 65 20 2d 2d 70 61 67 65 63 61 63 68 65 20 6f  he --pagecache o
7890: 70 74 69 6f 6e 20 69 73 20 75 73 65 64 20 2a 2f  ption is used */
78a0: 0a 23 64 65 66 69 6e 65 20 53 48 46 4c 47 5f 4c  .#define SHFLG_L
78b0: 6f 6f 6b 61 73 69 64 65 20 20 20 20 20 20 30 78  ookaside      0x
78c0: 30 30 30 30 30 30 30 32 20 2f 2a 20 4c 6f 6f 6b  00000002 /* Look
78d0: 61 73 69 64 65 20 6d 65 6d 6f 72 79 20 69 73 20  aside memory is 
78e0: 75 73 65 64 20 2a 2f 0a 23 64 65 66 69 6e 65 20  used */.#define 
78f0: 53 48 46 4c 47 5f 42 61 63 6b 73 6c 61 73 68 20  SHFLG_Backslash 
7900: 20 20 20 20 20 30 78 30 30 30 30 30 30 30 34 20       0x00000004 
7910: 2f 2a 20 54 68 65 20 2d 2d 62 61 63 6b 73 6c 61  /* The --backsla
7920: 73 68 20 6f 70 74 69 6f 6e 20 69 73 20 75 73 65  sh option is use
7930: 64 20 2a 2f 0a 23 64 65 66 69 6e 65 20 53 48 46  d */.#define SHF
7940: 4c 47 5f 50 72 65 73 65 72 76 65 52 6f 77 69 64  LG_PreserveRowid
7950: 20 20 30 78 30 30 30 30 30 30 30 38 20 2f 2a 20    0x00000008 /* 
7960: 2e 64 75 6d 70 20 70 72 65 73 65 72 76 65 73 20  .dump preserves 
7970: 72 6f 77 69 64 20 76 61 6c 75 65 73 20 2a 2f 0a  rowid values */.
7980: 23 64 65 66 69 6e 65 20 53 48 46 4c 47 5f 4e 65  #define SHFLG_Ne
7990: 77 6c 69 6e 65 73 20 20 20 20 20 20 20 30 78 30  wlines       0x0
79a0: 30 30 30 30 30 31 30 20 2f 2a 20 2e 64 75 6d 70  0000010 /* .dump
79b0: 20 2d 2d 6e 65 77 6c 69 6e 65 20 66 6c 61 67 20   --newline flag 
79c0: 2a 2f 0a 23 64 65 66 69 6e 65 20 53 48 46 4c 47  */.#define SHFLG
79d0: 5f 43 6f 75 6e 74 43 68 61 6e 67 65 73 20 20 20  _CountChanges   
79e0: 30 78 30 30 30 30 30 30 32 30 20 2f 2a 20 2e 63  0x00000020 /* .c
79f0: 68 61 6e 67 65 73 20 73 65 74 74 69 6e 67 20 2a  hanges setting *
7a00: 2f 0a 23 64 65 66 69 6e 65 20 53 48 46 4c 47 5f  /.#define SHFLG_
7a10: 45 63 68 6f 20 20 20 20 20 20 20 20 20 20 20 30  Echo           0
7a20: 78 30 30 30 30 30 30 34 30 20 2f 2a 20 2e 65 63  x00000040 /* .ec
7a30: 68 6f 20 6f 72 20 2d 2d 65 63 68 6f 20 73 65 74  ho or --echo set
7a40: 74 69 6e 67 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 4d  ting */../*.** M
7a50: 61 63 72 6f 73 20 66 6f 72 20 74 65 73 74 69 6e  acros for testin
7a60: 67 20 61 6e 64 20 73 65 74 74 69 6e 67 20 73 68  g and setting sh
7a70: 65 6c 6c 46 6c 67 73 0a 2a 2f 0a 23 64 65 66 69  ellFlgs.*/.#defi
7a80: 6e 65 20 53 68 65 6c 6c 48 61 73 46 6c 61 67 28  ne ShellHasFlag(
7a90: 50 2c 58 29 20 20 20 20 28 28 28 50 29 2d 3e 73  P,X)    (((P)->s
7aa0: 68 65 6c 6c 46 6c 67 73 20 26 20 28 58 29 29 21  hellFlgs & (X))!
7ab0: 3d 30 29 0a 23 64 65 66 69 6e 65 20 53 68 65 6c  =0).#define Shel
7ac0: 6c 53 65 74 46 6c 61 67 28 50 2c 58 29 20 20 20  lSetFlag(P,X)   
7ad0: 20 28 28 50 29 2d 3e 73 68 65 6c 6c 46 6c 67 73   ((P)->shellFlgs
7ae0: 7c 3d 28 58 29 29 0a 23 64 65 66 69 6e 65 20 53  |=(X)).#define S
7af0: 68 65 6c 6c 43 6c 65 61 72 46 6c 61 67 28 50 2c  hellClearFlag(P,
7b00: 58 29 20 20 28 28 50 29 2d 3e 73 68 65 6c 6c 46  X)  ((P)->shellF
7b10: 6c 67 73 26 3d 28 7e 28 58 29 29 29 0a 0a 2f 2a  lgs&=(~(X)))../*
7b20: 0a 2a 2a 20 54 68 65 73 65 20 61 72 65 20 74 68  .** These are th
7b30: 65 20 61 6c 6c 6f 77 65 64 20 6d 6f 64 65 73 2e  e allowed modes.
7b40: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 4f 44 45  .*/.#define MODE
7b50: 5f 4c 69 6e 65 20 20 20 20 20 30 20 20 2f 2a 20  _Line     0  /* 
7b60: 4f 6e 65 20 63 6f 6c 75 6d 6e 20 70 65 72 20 6c  One column per l
7b70: 69 6e 65 2e 20 20 42 6c 61 6e 6b 20 6c 69 6e 65  ine.  Blank line
7b80: 20 62 65 74 77 65 65 6e 20 72 65 63 6f 72 64 73   between records
7b90: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 4f 44 45   */.#define MODE
7ba0: 5f 43 6f 6c 75 6d 6e 20 20 20 31 20 20 2f 2a 20  _Column   1  /* 
7bb0: 4f 6e 65 20 72 65 63 6f 72 64 20 70 65 72 20 6c  One record per l
7bc0: 69 6e 65 20 69 6e 20 6e 65 61 74 20 63 6f 6c 75  ine in neat colu
7bd0: 6d 6e 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4d  mns */.#define M
7be0: 4f 44 45 5f 4c 69 73 74 20 20 20 20 20 32 20 20  ODE_List     2  
7bf0: 2f 2a 20 4f 6e 65 20 72 65 63 6f 72 64 20 70 65  /* One record pe
7c00: 72 20 6c 69 6e 65 20 77 69 74 68 20 61 20 73 65  r line with a se
7c10: 70 61 72 61 74 6f 72 20 2a 2f 0a 23 64 65 66 69  parator */.#defi
7c20: 6e 65 20 4d 4f 44 45 5f 53 65 6d 69 20 20 20 20  ne MODE_Semi    
7c30: 20 33 20 20 2f 2a 20 53 61 6d 65 20 61 73 20 4d   3  /* Same as M
7c40: 4f 44 45 5f 4c 69 73 74 20 62 75 74 20 61 70 70  ODE_List but app
7c50: 65 6e 64 20 22 3b 22 20 74 6f 20 65 61 63 68 20  end ";" to each 
7c60: 6c 69 6e 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20  line */.#define 
7c70: 4d 4f 44 45 5f 48 74 6d 6c 20 20 20 20 20 34 20  MODE_Html     4 
7c80: 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 6e 20   /* Generate an 
7c90: 58 48 54 4d 4c 20 74 61 62 6c 65 20 2a 2f 0a 23  XHTML table */.#
7ca0: 64 65 66 69 6e 65 20 4d 4f 44 45 5f 49 6e 73 65  define MODE_Inse
7cb0: 72 74 20 20 20 35 20 20 2f 2a 20 47 65 6e 65 72  rt   5  /* Gener
7cc0: 61 74 65 20 53 51 4c 20 22 69 6e 73 65 72 74 22  ate SQL "insert"
7cd0: 20 73 74 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 23   statements */.#
7ce0: 64 65 66 69 6e 65 20 4d 4f 44 45 5f 51 75 6f 74  define MODE_Quot
7cf0: 65 20 20 20 20 36 20 20 2f 2a 20 51 75 6f 74 65  e    6  /* Quote
7d00: 20 76 61 6c 75 65 73 20 61 73 20 66 6f 72 20 53   values as for S
7d10: 51 4c 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 4f  QL */.#define MO
7d20: 44 45 5f 54 63 6c 20 20 20 20 20 20 37 20 20 2f  DE_Tcl      7  /
7d30: 2a 20 47 65 6e 65 72 61 74 65 20 41 4e 53 49 2d  * Generate ANSI-
7d40: 43 20 6f 72 20 54 43 4c 20 71 75 6f 74 65 64 20  C or TCL quoted 
7d50: 65 6c 65 6d 65 6e 74 73 20 2a 2f 0a 23 64 65 66  elements */.#def
7d60: 69 6e 65 20 4d 4f 44 45 5f 43 73 76 20 20 20 20  ine MODE_Csv    
7d70: 20 20 38 20 20 2f 2a 20 51 75 6f 74 65 20 73 74    8  /* Quote st
7d80: 72 69 6e 67 73 2c 20 6e 75 6d 62 65 72 73 20 61  rings, numbers a
7d90: 72 65 20 70 6c 61 69 6e 20 2a 2f 0a 23 64 65 66  re plain */.#def
7da0: 69 6e 65 20 4d 4f 44 45 5f 45 78 70 6c 61 69 6e  ine MODE_Explain
7db0: 20 20 39 20 20 2f 2a 20 4c 69 6b 65 20 4d 4f 44    9  /* Like MOD
7dc0: 45 5f 43 6f 6c 75 6d 6e 2c 20 62 75 74 20 64 6f  E_Column, but do
7dd0: 20 6e 6f 74 20 74 72 75 6e 63 61 74 65 20 64 61   not truncate da
7de0: 74 61 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 4f  ta */.#define MO
7df0: 44 45 5f 41 73 63 69 69 20 20 20 31 30 20 20 2f  DE_Ascii   10  /
7e00: 2a 20 55 73 65 20 41 53 43 49 49 20 75 6e 69 74  * Use ASCII unit
7e10: 20 61 6e 64 20 72 65 63 6f 72 64 20 73 65 70 61   and record sepa
7e20: 72 61 74 6f 72 73 20 28 30 78 31 46 2f 30 78 31  rators (0x1F/0x1
7e30: 45 29 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 4f  E) */.#define MO
7e40: 44 45 5f 50 72 65 74 74 79 20 20 31 31 20 20 2f  DE_Pretty  11  /
7e50: 2a 20 50 72 65 74 74 79 2d 70 72 69 6e 74 20 73  * Pretty-print s
7e60: 63 68 65 6d 61 73 20 2a 2f 0a 23 64 65 66 69 6e  chemas */.#defin
7e70: 65 20 4d 4f 44 45 5f 45 51 50 20 20 20 20 20 31  e MODE_EQP     1
7e80: 32 20 20 2f 2a 20 43 6f 6e 76 65 72 74 73 20 45  2  /* Converts E
7e90: 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41  XPLAIN QUERY PLA
7ea0: 4e 20 6f 75 74 70 75 74 20 69 6e 74 6f 20 61 20  N output into a 
7eb0: 67 72 61 70 68 20 2a 2f 0a 0a 73 74 61 74 69 63  graph */..static
7ec0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 6d 6f 64   const char *mod
7ed0: 65 44 65 73 63 72 5b 5d 20 3d 20 7b 0a 20 20 22  eDescr[] = {.  "
7ee0: 6c 69 6e 65 22 2c 0a 20 20 22 63 6f 6c 75 6d 6e  line",.  "column
7ef0: 22 2c 0a 20 20 22 6c 69 73 74 22 2c 0a 20 20 22  ",.  "list",.  "
7f00: 73 65 6d 69 22 2c 0a 20 20 22 68 74 6d 6c 22 2c  semi",.  "html",
7f10: 0a 20 20 22 69 6e 73 65 72 74 22 2c 0a 20 20 22  .  "insert",.  "
7f20: 71 75 6f 74 65 22 2c 0a 20 20 22 74 63 6c 22 2c  quote",.  "tcl",
7f30: 0a 20 20 22 63 73 76 22 2c 0a 20 20 22 65 78 70  .  "csv",.  "exp
7f40: 6c 61 69 6e 22 2c 0a 20 20 22 61 73 63 69 69 22  lain",.  "ascii"
7f50: 2c 0a 20 20 22 70 72 65 74 74 79 70 72 69 6e 74  ,.  "prettyprint
7f60: 22 2c 0a 20 20 22 65 71 70 22 0a 7d 3b 0a 0a 2f  ",.  "eqp".};../
7f70: 2a 0a 2a 2a 20 54 68 65 73 65 20 61 72 65 20 74  *.** These are t
7f80: 68 65 20 63 6f 6c 75 6d 6e 2f 72 6f 77 2f 6c 69  he column/row/li
7f90: 6e 65 20 73 65 70 61 72 61 74 6f 72 73 20 75 73  ne separators us
7fa0: 65 64 20 62 79 20 74 68 65 20 76 61 72 69 6f 75  ed by the variou
7fb0: 73 0a 2a 2a 20 69 6d 70 6f 72 74 2f 65 78 70 6f  s.** import/expo
7fc0: 72 74 20 6d 6f 64 65 73 2e 0a 2a 2f 0a 23 64 65  rt modes..*/.#de
7fd0: 66 69 6e 65 20 53 45 50 5f 43 6f 6c 75 6d 6e 20  fine SEP_Column 
7fe0: 20 20 20 22 7c 22 0a 23 64 65 66 69 6e 65 20 53     "|".#define S
7ff0: 45 50 5f 52 6f 77 20 20 20 20 20 20 20 22 5c 6e  EP_Row       "\n
8000: 22 0a 23 64 65 66 69 6e 65 20 53 45 50 5f 54 61  ".#define SEP_Ta
8010: 62 20 20 20 20 20 20 20 22 5c 74 22 0a 23 64 65  b       "\t".#de
8020: 66 69 6e 65 20 53 45 50 5f 53 70 61 63 65 20 20  fine SEP_Space  
8030: 20 20 20 22 20 22 0a 23 64 65 66 69 6e 65 20 53     " ".#define S
8040: 45 50 5f 43 6f 6d 6d 61 20 20 20 20 20 22 2c 22  EP_Comma     ","
8050: 0a 23 64 65 66 69 6e 65 20 53 45 50 5f 43 72 4c  .#define SEP_CrL
8060: 66 20 20 20 20 20 20 22 5c 72 5c 6e 22 0a 23 64  f      "\r\n".#d
8070: 65 66 69 6e 65 20 53 45 50 5f 55 6e 69 74 20 20  efine SEP_Unit  
8080: 20 20 20 20 22 5c 78 31 46 22 0a 23 64 65 66 69      "\x1F".#defi
8090: 6e 65 20 53 45 50 5f 52 65 63 6f 72 64 20 20 20  ne SEP_Record   
80a0: 20 22 5c 78 31 45 22 0a 0a 2f 2a 0a 2a 2a 20 41   "\x1E"../*.** A
80b0: 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20 74 68   callback for th
80c0: 65 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 29 20  e sqlite3_log() 
80d0: 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2f 0a 73 74  interface..*/.st
80e0: 61 74 69 63 20 76 6f 69 64 20 73 68 65 6c 6c 4c  atic void shellL
80f0: 6f 67 28 76 6f 69 64 20 2a 70 41 72 67 2c 20 69  og(void *pArg, i
8100: 6e 74 20 69 45 72 72 43 6f 64 65 2c 20 63 6f 6e  nt iErrCode, con
8110: 73 74 20 63 68 61 72 20 2a 7a 4d 73 67 29 7b 0a  st char *zMsg){.
8120: 20 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 20    ShellState *p 
8130: 3d 20 28 53 68 65 6c 6c 53 74 61 74 65 2a 29 70  = (ShellState*)p
8140: 41 72 67 3b 0a 20 20 69 66 28 20 70 2d 3e 70 4c  Arg;.  if( p->pL
8150: 6f 67 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  og==0 ) return;.
8160: 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d    utf8_printf(p-
8170: 3e 70 4c 6f 67 2c 20 22 28 25 64 29 20 25 73 5c  >pLog, "(%d) %s\
8180: 6e 22 2c 20 69 45 72 72 43 6f 64 65 2c 20 7a 4d  n", iErrCode, zM
8190: 73 67 29 3b 0a 20 20 66 66 6c 75 73 68 28 70 2d  sg);.  fflush(p-
81a0: 3e 70 4c 6f 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  >pLog);.}../*.**
81b0: 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 3a 20 20   SQL function:  
81c0: 73 68 65 6c 6c 5f 70 75 74 73 6e 6c 28 58 29 0a  shell_putsnl(X).
81d0: 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20  **.** Write the 
81e0: 74 65 78 74 20 58 20 74 6f 20 74 68 65 20 73 63  text X to the sc
81f0: 72 65 65 6e 20 28 6f 72 20 77 68 61 74 65 76 65  reen (or whateve
8200: 72 20 6f 75 74 70 75 74 20 69 73 20 62 65 69 6e  r output is bein
8210: 67 20 64 69 72 65 63 74 65 64 29 0a 2a 2a 20 61  g directed).** a
8220: 64 64 69 6e 67 20 61 20 6e 65 77 6c 69 6e 65 20  dding a newline 
8230: 61 74 20 74 68 65 20 65 6e 64 2c 20 61 6e 64 20  at the end, and 
8240: 74 68 65 6e 20 72 65 74 75 72 6e 20 58 2e 0a 2a  then return X..*
8250: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 68  /.static void sh
8260: 65 6c 6c 50 75 74 73 46 75 6e 63 28 0a 20 20 73  ellPutsFunc(.  s
8270: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
8280: 70 43 74 78 2c 0a 20 20 69 6e 74 20 6e 56 61 6c  pCtx,.  int nVal
8290: 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  ,.  sqlite3_valu
82a0: 65 20 2a 2a 61 70 56 61 6c 0a 29 7b 0a 20 20 53  e **apVal.){.  S
82b0: 68 65 6c 6c 53 74 61 74 65 20 2a 70 20 3d 20 28  hellState *p = (
82c0: 53 68 65 6c 6c 53 74 61 74 65 2a 29 73 71 6c 69  ShellState*)sqli
82d0: 74 65 33 5f 75 73 65 72 5f 64 61 74 61 28 70 43  te3_user_data(pC
82e0: 74 78 29 3b 0a 20 20 28 76 6f 69 64 29 6e 56 61  tx);.  (void)nVa
82f0: 6c 3b 0a 20 20 75 74 66 38 5f 70 72 69 6e 74 66  l;.  utf8_printf
8300: 28 70 2d 3e 6f 75 74 2c 20 22 25 73 5c 6e 22 2c  (p->out, "%s\n",
8310: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74   sqlite3_value_t
8320: 65 78 74 28 61 70 56 61 6c 5b 30 5d 29 29 3b 0a  ext(apVal[0]));.
8330: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
8340: 5f 76 61 6c 75 65 28 70 43 74 78 2c 20 61 70 56  _value(pCtx, apV
8350: 61 6c 5b 30 5d 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  al[0]);.}../*.**
8360: 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 3a 20 20   SQL function:  
8370: 20 65 64 69 74 28 56 41 4c 55 45 29 0a 2a 2a 20   edit(VALUE).** 
8380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8390: 65 64 69 74 28 56 41 4c 55 45 2c 45 44 49 54 4f  edit(VALUE,EDITO
83a0: 52 29 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 73  R).**.** These s
83b0: 74 65 70 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  teps:.**.**     
83c0: 28 31 29 20 57 72 69 74 65 20 56 41 4c 55 45 20  (1) Write VALUE 
83d0: 69 6e 74 6f 20 61 20 74 65 6d 70 6f 72 61 72 79  into a temporary
83e0: 20 66 69 6c 65 2e 0a 2a 2a 20 20 20 20 20 28 32   file..**     (2
83f0: 29 20 52 75 6e 20 70 72 6f 67 72 61 6d 20 45 44  ) Run program ED
8400: 49 54 4f 52 20 6f 6e 20 74 68 61 74 20 74 65 6d  ITOR on that tem
8410: 70 6f 72 61 72 79 20 66 69 6c 65 2e 0a 2a 2a 20  porary file..** 
8420: 20 20 20 20 28 33 29 20 52 65 61 64 20 74 68 65      (3) Read the
8430: 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20   temporary file 
8440: 62 61 63 6b 20 61 6e 64 20 72 65 74 75 72 6e 20  back and return 
8450: 69 74 73 20 63 6f 6e 74 65 6e 74 20 61 73 20 74  its content as t
8460: 68 65 20 72 65 73 75 6c 74 2e 0a 2a 2a 20 20 20  he result..**   
8470: 20 20 28 34 29 20 44 65 6c 65 74 65 20 74 68 65    (4) Delete the
8480: 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 0a   temporary file.
8490: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 45 44 49  **.** If the EDI
84a0: 54 4f 52 20 61 72 67 75 6d 65 6e 74 20 69 73 20  TOR argument is 
84b0: 6f 6d 69 74 74 65 64 2c 20 75 73 65 20 74 68 65  omitted, use the
84c0: 20 76 61 6c 75 65 20 69 6e 20 74 68 65 20 56 49   value in the VI
84d0: 53 55 41 4c 0a 2a 2a 20 65 6e 76 69 72 6f 6e 6d  SUAL.** environm
84e0: 65 6e 74 20 76 61 72 69 61 62 6c 65 2e 20 20 49  ent variable.  I
84f0: 66 20 73 74 69 6c 6c 20 74 68 65 72 65 20 69 73  f still there is
8500: 20 6e 6f 20 45 44 49 54 4f 52 2c 20 74 68 72 6f   no EDITOR, thro
8510: 75 67 68 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a  ugh an error..**
8520: 0a 2a 2a 20 41 6c 73 6f 20 74 68 72 6f 77 20 61  .** Also throw a
8530: 6e 20 65 72 72 6f 72 20 69 66 20 74 68 65 20 45  n error if the E
8540: 44 49 54 4f 52 20 70 72 6f 67 72 61 6d 20 72 65  DITOR program re
8550: 74 75 72 6e 73 20 61 20 6e 6f 6e 2d 7a 65 72 6f  turns a non-zero
8560: 20 65 78 69 74 20 63 6f 64 65 2e 0a 2a 2f 0a 23   exit code..*/.#
8570: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f  ifndef SQLITE_NO
8580: 48 41 56 45 5f 53 59 53 54 45 4d 0a 73 74 61 74  HAVE_SYSTEM.stat
8590: 69 63 20 76 6f 69 64 20 65 64 69 74 46 75 6e 63  ic void editFunc
85a0: 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74  (.  sqlite3_cont
85b0: 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20  ext *context,.  
85c0: 69 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69  int argc,.  sqli
85d0: 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76  te3_value **argv
85e0: 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  .){.  const char
85f0: 20 2a 7a 45 64 69 74 6f 72 3b 0a 20 20 63 68 61   *zEditor;.  cha
8600: 72 20 2a 7a 54 65 6d 70 46 69 6c 65 20 3d 20 30  r *zTempFile = 0
8610: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  ;.  sqlite3 *db;
8620: 0a 20 20 63 68 61 72 20 2a 7a 43 6d 64 20 3d 20  .  char *zCmd = 
8630: 30 3b 0a 20 20 69 6e 74 20 62 42 69 6e 3b 0a 20  0;.  int bBin;. 
8640: 20 69 6e 74 20 72 63 3b 0a 20 20 46 49 4c 45 20   int rc;.  FILE 
8650: 2a 66 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  *f = 0;.  sqlite
8660: 33 5f 69 6e 74 36 34 20 73 7a 3b 0a 20 20 73 71  3_int64 sz;.  sq
8670: 6c 69 74 65 33 5f 69 6e 74 36 34 20 78 3b 0a 20  lite3_int64 x;. 
8680: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
8690: 70 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 61 72  p = 0;..  if( ar
86a0: 67 63 3d 3d 32 20 29 7b 0a 20 20 20 20 7a 45 64  gc==2 ){.    zEd
86b0: 69 74 6f 72 20 3d 20 28 63 6f 6e 73 74 20 63 68  itor = (const ch
86c0: 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75  ar*)sqlite3_valu
86d0: 65 5f 74 65 78 74 28 61 72 67 76 5b 31 5d 29 3b  e_text(argv[1]);
86e0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 45  .  }else{.    zE
86f0: 64 69 74 6f 72 20 3d 20 67 65 74 65 6e 76 28 22  ditor = getenv("
8700: 56 49 53 55 41 4c 22 29 3b 0a 20 20 7d 0a 20 20  VISUAL");.  }.  
8710: 69 66 28 20 7a 45 64 69 74 6f 72 3d 3d 30 20 29  if( zEditor==0 )
8720: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65  {.    sqlite3_re
8730: 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65  sult_error(conte
8740: 78 74 2c 20 22 6e 6f 20 65 64 69 74 6f 72 20 66  xt, "no editor f
8750: 6f 72 20 65 64 69 74 28 29 22 2c 20 2d 31 29 3b  or edit()", -1);
8760: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
8770: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 76  .  if( sqlite3_v
8780: 61 6c 75 65 5f 74 79 70 65 28 61 72 67 76 5b 30  alue_type(argv[0
8790: 5d 29 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 20  ])==SQLITE_NULL 
87a0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72  ){.    sqlite3_r
87b0: 65 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74  esult_error(cont
87c0: 65 78 74 2c 20 22 4e 55 4c 4c 20 69 6e 70 75 74  ext, "NULL input
87d0: 20 74 6f 20 65 64 69 74 28 29 22 2c 20 2d 31 29   to edit()", -1)
87e0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
87f0: 7d 0a 20 20 64 62 20 3d 20 73 71 6c 69 74 65 33  }.  db = sqlite3
8800: 5f 63 6f 6e 74 65 78 74 5f 64 62 5f 68 61 6e 64  _context_db_hand
8810: 6c 65 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 7a  le(context);.  z
8820: 54 65 6d 70 46 69 6c 65 20 3d 20 30 3b 0a 20 20  TempFile = 0;.  
8830: 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e  sqlite3_file_con
8840: 74 72 6f 6c 28 64 62 2c 20 30 2c 20 53 51 4c 49  trol(db, 0, SQLI
8850: 54 45 5f 46 43 4e 54 4c 5f 54 45 4d 50 46 49 4c  TE_FCNTL_TEMPFIL
8860: 45 4e 41 4d 45 2c 20 26 7a 54 65 6d 70 46 69 6c  ENAME, &zTempFil
8870: 65 29 3b 0a 20 20 69 66 28 20 7a 54 65 6d 70 46  e);.  if( zTempF
8880: 69 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  ile==0 ){.    sq
8890: 6c 69 74 65 33 5f 75 69 6e 74 36 34 20 72 20 3d  lite3_uint64 r =
88a0: 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   0;.    sqlite3_
88b0: 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f  randomness(sizeo
88c0: 66 28 72 29 2c 20 26 72 29 3b 0a 20 20 20 20 7a  f(r), &r);.    z
88d0: 54 65 6d 70 46 69 6c 65 20 3d 20 73 71 6c 69 74  TempFile = sqlit
88e0: 65 33 5f 6d 70 72 69 6e 74 66 28 22 74 65 6d 70  e3_mprintf("temp
88f0: 25 6c 6c 78 22 2c 20 72 29 3b 0a 20 20 20 20 69  %llx", r);.    i
8900: 66 28 20 7a 54 65 6d 70 46 69 6c 65 3d 3d 30 20  f( zTempFile==0 
8910: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
8920: 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f 6e 6f  _result_error_no
8930: 6d 65 6d 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20  mem(context);.  
8940: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
8950: 7d 0a 20 20 7d 0a 20 20 62 42 69 6e 20 3d 20 73  }.  }.  bBin = s
8960: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70  qlite3_value_typ
8970: 65 28 61 72 67 76 5b 30 5d 29 3d 3d 53 51 4c 49  e(argv[0])==SQLI
8980: 54 45 5f 42 4c 4f 42 3b 0a 20 20 66 20 3d 20 66  TE_BLOB;.  f = f
8990: 6f 70 65 6e 28 7a 54 65 6d 70 46 69 6c 65 2c 20  open(zTempFile, 
89a0: 62 42 69 6e 20 3f 20 22 77 62 22 20 3a 20 22 77  bBin ? "wb" : "w
89b0: 22 29 3b 0a 20 20 69 66 28 20 66 3d 3d 30 20 29  ");.  if( f==0 )
89c0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65  {.    sqlite3_re
89d0: 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65  sult_error(conte
89e0: 78 74 2c 20 22 65 64 69 74 28 29 20 63 61 6e 6e  xt, "edit() cann
89f0: 6f 74 20 6f 70 65 6e 20 74 65 6d 70 20 66 69 6c  ot open temp fil
8a00: 65 22 2c 20 2d 31 29 3b 0a 20 20 20 20 67 6f 74  e", -1);.    got
8a10: 6f 20 65 64 69 74 5f 66 75 6e 63 5f 65 6e 64 3b  o edit_func_end;
8a20: 0a 20 20 7d 0a 20 20 73 7a 20 3d 20 73 71 6c 69  .  }.  sz = sqli
8a30: 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28  te3_value_bytes(
8a40: 61 72 67 76 5b 30 5d 29 3b 0a 20 20 69 66 28 20  argv[0]);.  if( 
8a50: 62 42 69 6e 20 29 7b 0a 20 20 20 20 78 20 3d 20  bBin ){.    x = 
8a60: 66 77 72 69 74 65 28 73 71 6c 69 74 65 33 5f 76  fwrite(sqlite3_v
8a70: 61 6c 75 65 5f 62 6c 6f 62 28 61 72 67 76 5b 30  alue_blob(argv[0
8a80: 5d 29 2c 20 31 2c 20 73 7a 2c 20 66 29 3b 0a 20  ]), 1, sz, f);. 
8a90: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 78 20 3d 20   }else{.    x = 
8aa0: 66 77 72 69 74 65 28 73 71 6c 69 74 65 33 5f 76  fwrite(sqlite3_v
8ab0: 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30  alue_text(argv[0
8ac0: 5d 29 2c 20 31 2c 20 73 7a 2c 20 66 29 3b 0a 20  ]), 1, sz, f);. 
8ad0: 20 7d 0a 20 20 66 63 6c 6f 73 65 28 66 29 3b 0a   }.  fclose(f);.
8ae0: 20 20 66 20 3d 20 30 3b 0a 20 20 69 66 28 20 78    f = 0;.  if( x
8af0: 21 3d 73 7a 20 29 7b 0a 20 20 20 20 73 71 6c 69  !=sz ){.    sqli
8b00: 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72  te3_result_error
8b10: 28 63 6f 6e 74 65 78 74 2c 20 22 65 64 69 74 28  (context, "edit(
8b20: 29 20 63 6f 75 6c 64 20 6e 6f 74 20 77 72 69 74  ) could not writ
8b30: 65 20 74 68 65 20 77 68 6f 6c 65 20 66 69 6c 65  e the whole file
8b40: 22 2c 20 2d 31 29 3b 0a 20 20 20 20 67 6f 74 6f  ", -1);.    goto
8b50: 20 65 64 69 74 5f 66 75 6e 63 5f 65 6e 64 3b 0a   edit_func_end;.
8b60: 20 20 7d 0a 20 20 7a 43 6d 64 20 3d 20 73 71 6c    }.  zCmd = sql
8b70: 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73  ite3_mprintf("%s
8b80: 20 5c 22 25 73 5c 22 22 2c 20 7a 45 64 69 74 6f   \"%s\"", zEdito
8b90: 72 2c 20 7a 54 65 6d 70 46 69 6c 65 29 3b 0a 20  r, zTempFile);. 
8ba0: 20 69 66 28 20 7a 43 6d 64 3d 3d 30 20 29 7b 0a   if( zCmd==0 ){.
8bb0: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
8bc0: 6c 74 5f 65 72 72 6f 72 5f 6e 6f 6d 65 6d 28 63  lt_error_nomem(c
8bd0: 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 67 6f 74  ontext);.    got
8be0: 6f 20 65 64 69 74 5f 66 75 6e 63 5f 65 6e 64 3b  o edit_func_end;
8bf0: 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 79 73 74  .  }.  rc = syst
8c00: 65 6d 28 7a 43 6d 64 29 3b 0a 20 20 73 71 6c 69  em(zCmd);.  sqli
8c10: 74 65 33 5f 66 72 65 65 28 7a 43 6d 64 29 3b 0a  te3_free(zCmd);.
8c20: 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
8c30: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65  sqlite3_result_e
8c40: 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c 20 22 45  rror(context, "E
8c50: 44 49 54 4f 52 20 72 65 74 75 72 6e 65 64 20 6e  DITOR returned n
8c60: 6f 6e 2d 7a 65 72 6f 22 2c 20 2d 31 29 3b 0a 20  on-zero", -1);. 
8c70: 20 20 20 67 6f 74 6f 20 65 64 69 74 5f 66 75 6e     goto edit_fun
8c80: 63 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 66 20 3d  c_end;.  }.  f =
8c90: 20 66 6f 70 65 6e 28 7a 54 65 6d 70 46 69 6c 65   fopen(zTempFile
8ca0: 2c 20 62 42 69 6e 20 3f 20 22 72 62 22 20 3a 20  , bBin ? "rb" : 
8cb0: 22 72 22 29 3b 0a 20 20 69 66 28 20 66 3d 3d 30  "r");.  if( f==0
8cc0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
8cd0: 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e  result_error(con
8ce0: 74 65 78 74 2c 0a 20 20 20 20 20 20 22 65 64 69  text,.      "edi
8cf0: 74 28 29 20 63 61 6e 6e 6f 74 20 72 65 6f 70 65  t() cannot reope
8d00: 6e 20 74 65 6d 70 20 66 69 6c 65 20 61 66 74 65  n temp file afte
8d10: 72 20 65 64 69 74 22 2c 20 2d 31 29 3b 0a 20 20  r edit", -1);.  
8d20: 20 20 67 6f 74 6f 20 65 64 69 74 5f 66 75 6e 63    goto edit_func
8d30: 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 66 73 65 65  _end;.  }.  fsee
8d40: 6b 28 66 2c 20 30 2c 20 53 45 45 4b 5f 45 4e 44  k(f, 0, SEEK_END
8d50: 29 3b 0a 20 20 73 7a 20 3d 20 66 74 65 6c 6c 28  );.  sz = ftell(
8d60: 66 29 3b 0a 20 20 72 65 77 69 6e 64 28 66 29 3b  f);.  rewind(f);
8d70: 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 5f 6d  .  p = sqlite3_m
8d80: 61 6c 6c 6f 63 36 34 28 20 73 7a 2b 28 62 42 69  alloc64( sz+(bBi
8d90: 6e 3d 3d 30 29 20 29 3b 0a 20 20 69 66 28 20 70  n==0) );.  if( p
8da0: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
8db0: 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f  e3_result_error_
8dc0: 6e 6f 6d 65 6d 28 63 6f 6e 74 65 78 74 29 3b 0a  nomem(context);.
8dd0: 20 20 20 20 67 6f 74 6f 20 65 64 69 74 5f 66 75      goto edit_fu
8de0: 6e 63 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 69 66  nc_end;.  }.  if
8df0: 28 20 62 42 69 6e 20 29 7b 0a 20 20 20 20 78 20  ( bBin ){.    x 
8e00: 3d 20 66 72 65 61 64 28 70 2c 20 31 2c 20 73 7a  = fread(p, 1, sz
8e10: 2c 20 66 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  , f);.  }else{. 
8e20: 20 20 20 78 20 3d 20 66 72 65 61 64 28 70 2c 20     x = fread(p, 
8e30: 31 2c 20 73 7a 2c 20 66 29 3b 0a 20 20 20 20 70  1, sz, f);.    p
8e40: 5b 73 7a 5d 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  [sz] = 0;.  }.  
8e50: 66 63 6c 6f 73 65 28 66 29 3b 0a 20 20 66 20 3d  fclose(f);.  f =
8e60: 20 30 3b 0a 20 20 69 66 28 20 78 21 3d 73 7a 20   0;.  if( x!=sz 
8e70: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72  ){.    sqlite3_r
8e80: 65 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74  esult_error(cont
8e90: 65 78 74 2c 20 22 63 6f 75 6c 64 20 6e 6f 74 20  ext, "could not 
8ea0: 72 65 61 64 20 62 61 63 6b 20 74 68 65 20 77 68  read back the wh
8eb0: 6f 6c 65 20 66 69 6c 65 22 2c 20 2d 31 29 3b 0a  ole file", -1);.
8ec0: 20 20 20 20 67 6f 74 6f 20 65 64 69 74 5f 66 75      goto edit_fu
8ed0: 6e 63 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 69 66  nc_end;.  }.  if
8ee0: 28 20 62 42 69 6e 20 29 7b 0a 20 20 20 20 73 71  ( bBin ){.    sq
8ef0: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 62 6c 6f  lite3_result_blo
8f00: 62 36 34 28 63 6f 6e 74 65 78 74 2c 20 70 2c 20  b64(context, p, 
8f10: 73 7a 2c 20 73 71 6c 69 74 65 33 5f 66 72 65 65  sz, sqlite3_free
8f20: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
8f30: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74  sqlite3_result_t
8f40: 65 78 74 36 34 28 63 6f 6e 74 65 78 74 2c 20 28  ext64(context, (
8f50: 63 6f 6e 73 74 20 63 68 61 72 2a 29 70 2c 20 73  const char*)p, s
8f60: 7a 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  z,.             
8f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
8f80: 69 74 65 33 5f 66 72 65 65 2c 20 53 51 4c 49 54  ite3_free, SQLIT
8f90: 45 5f 55 54 46 38 29 3b 0a 20 20 7d 0a 20 20 70  E_UTF8);.  }.  p
8fa0: 20 3d 20 30 3b 0a 0a 65 64 69 74 5f 66 75 6e 63   = 0;..edit_func
8fb0: 5f 65 6e 64 3a 0a 20 20 69 66 28 20 66 20 29 20  _end:.  if( f ) 
8fc0: 66 63 6c 6f 73 65 28 66 29 3b 0a 20 20 75 6e 6c  fclose(f);.  unl
8fd0: 69 6e 6b 28 7a 54 65 6d 70 46 69 6c 65 29 3b 0a  ink(zTempFile);.
8fe0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
8ff0: 54 65 6d 70 46 69 6c 65 29 3b 0a 20 20 73 71 6c  TempFile);.  sql
9000: 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 7d 0a  ite3_free(p);.}.
9010: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
9020: 5f 4e 4f 48 41 56 45 5f 53 59 53 54 45 4d 20 2a  _NOHAVE_SYSTEM *
9030: 2f 0a 0a 2f 2a 0a 2a 2a 20 53 61 76 65 20 6f 72  /../*.** Save or
9040: 20 72 65 73 74 6f 72 65 20 74 68 65 20 63 75 72   restore the cur
9050: 72 65 6e 74 20 6f 75 74 70 75 74 20 6d 6f 64 65  rent output mode
9060: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
9070: 6f 75 74 70 75 74 4d 6f 64 65 50 75 73 68 28 53  outputModePush(S
9080: 68 65 6c 6c 53 74 61 74 65 20 2a 70 29 7b 0a 20  hellState *p){. 
9090: 20 70 2d 3e 6d 6f 64 65 50 72 69 6f 72 20 3d 20   p->modePrior = 
90a0: 70 2d 3e 6d 6f 64 65 3b 0a 20 20 6d 65 6d 63 70  p->mode;.  memcp
90b0: 79 28 70 2d 3e 63 6f 6c 53 65 70 50 72 69 6f 72  y(p->colSepPrior
90c0: 2c 20 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f  , p->colSeparato
90d0: 72 2c 20 73 69 7a 65 6f 66 28 70 2d 3e 63 6f 6c  r, sizeof(p->col
90e0: 53 65 70 61 72 61 74 6f 72 29 29 3b 0a 20 20 6d  Separator));.  m
90f0: 65 6d 63 70 79 28 70 2d 3e 72 6f 77 53 65 70 50  emcpy(p->rowSepP
9100: 72 69 6f 72 2c 20 70 2d 3e 72 6f 77 53 65 70 61  rior, p->rowSepa
9110: 72 61 74 6f 72 2c 20 73 69 7a 65 6f 66 28 70 2d  rator, sizeof(p-
9120: 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 29 29 3b  >rowSeparator));
9130: 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6f  .}.static void o
9140: 75 74 70 75 74 4d 6f 64 65 50 6f 70 28 53 68 65  utputModePop(She
9150: 6c 6c 53 74 61 74 65 20 2a 70 29 7b 0a 20 20 70  llState *p){.  p
9160: 2d 3e 6d 6f 64 65 20 3d 20 70 2d 3e 6d 6f 64 65  ->mode = p->mode
9170: 50 72 69 6f 72 3b 0a 20 20 6d 65 6d 63 70 79 28  Prior;.  memcpy(
9180: 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 2c  p->colSeparator,
9190: 20 70 2d 3e 63 6f 6c 53 65 70 50 72 69 6f 72 2c   p->colSepPrior,
91a0: 20 73 69 7a 65 6f 66 28 70 2d 3e 63 6f 6c 53 65   sizeof(p->colSe
91b0: 70 61 72 61 74 6f 72 29 29 3b 0a 20 20 6d 65 6d  parator));.  mem
91c0: 63 70 79 28 70 2d 3e 72 6f 77 53 65 70 61 72 61  cpy(p->rowSepara
91d0: 74 6f 72 2c 20 70 2d 3e 72 6f 77 53 65 70 50 72  tor, p->rowSepPr
91e0: 69 6f 72 2c 20 73 69 7a 65 6f 66 28 70 2d 3e 72  ior, sizeof(p->r
91f0: 6f 77 53 65 70 61 72 61 74 6f 72 29 29 3b 0a 7d  owSeparator));.}
9200: 0a 0a 2f 2a 0a 2a 2a 20 4f 75 74 70 75 74 20 74  ../*.** Output t
9210: 68 65 20 67 69 76 65 6e 20 73 74 72 69 6e 67 20  he given string 
9220: 61 73 20 61 20 68 65 78 2d 65 6e 63 6f 64 65 64  as a hex-encoded
9230: 20 62 6c 6f 62 20 28 65 67 2e 20 58 27 31 32 33   blob (eg. X'123
9240: 34 27 20 29 0a 2a 2f 0a 73 74 61 74 69 63 20 76  4' ).*/.static v
9250: 6f 69 64 20 6f 75 74 70 75 74 5f 68 65 78 5f 62  oid output_hex_b
9260: 6c 6f 62 28 46 49 4c 45 20 2a 6f 75 74 2c 20 63  lob(FILE *out, c
9270: 6f 6e 73 74 20 76 6f 69 64 20 2a 70 42 6c 6f 62  onst void *pBlob
9280: 2c 20 69 6e 74 20 6e 42 6c 6f 62 29 7b 0a 20 20  , int nBlob){.  
9290: 69 6e 74 20 69 3b 0a 20 20 63 68 61 72 20 2a 7a  int i;.  char *z
92a0: 42 6c 6f 62 20 3d 20 28 63 68 61 72 20 2a 29 70  Blob = (char *)p
92b0: 42 6c 6f 62 3b 0a 20 20 72 61 77 5f 70 72 69 6e  Blob;.  raw_prin
92c0: 74 66 28 6f 75 74 2c 22 58 27 22 29 3b 0a 20 20  tf(out,"X'");.  
92d0: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 42 6c 6f 62  for(i=0; i<nBlob
92e0: 3b 20 69 2b 2b 29 7b 20 72 61 77 5f 70 72 69 6e  ; i++){ raw_prin
92f0: 74 66 28 6f 75 74 2c 22 25 30 32 78 22 2c 7a 42  tf(out,"%02x",zB
9300: 6c 6f 62 5b 69 5d 26 30 78 66 66 29 3b 20 7d 0a  lob[i]&0xff); }.
9310: 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74    raw_printf(out
9320: 2c 22 27 22 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ,"'");.}../*.** 
9330: 46 69 6e 64 20 61 20 73 74 72 69 6e 67 20 74 68  Find a string th
9340: 61 74 20 69 73 20 6e 6f 74 20 66 6f 75 6e 64 20  at is not found 
9350: 61 6e 79 77 68 65 72 65 20 69 6e 20 7a 5b 5d 2e  anywhere in z[].
9360: 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74    Return a point
9370: 65 72 0a 2a 2a 20 74 6f 20 74 68 61 74 20 73 74  er.** to that st
9380: 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 72 79 20  ring..**.** Try 
9390: 74 6f 20 75 73 65 20 7a 41 20 61 6e 64 20 7a 42  to use zA and zB
93a0: 20 66 69 72 73 74 2e 20 20 49 66 20 62 6f 74 68   first.  If both
93b0: 20 6f 66 20 74 68 6f 73 65 20 61 72 65 20 61 6c   of those are al
93c0: 72 65 61 64 79 20 66 6f 75 6e 64 20 69 6e 20 7a  ready found in z
93d0: 5b 5d 0a 2a 2a 20 74 68 65 6e 20 6d 61 6b 65 20  [].** then make 
93e0: 75 70 20 73 6f 6d 65 20 73 74 72 69 6e 67 20 61  up some string a
93f0: 6e 64 20 73 74 6f 72 65 20 69 74 20 69 6e 20 74  nd store it in t
9400: 68 65 20 62 75 66 66 65 72 20 7a 42 75 66 2e 0a  he buffer zBuf..
9410: 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  */.static const 
9420: 63 68 61 72 20 2a 75 6e 75 73 65 64 5f 73 74 72  char *unused_str
9430: 69 6e 67 28 0a 20 20 63 6f 6e 73 74 20 63 68 61  ing(.  const cha
9440: 72 20 2a 7a 2c 20 20 20 20 20 20 20 20 20 20 20  r *z,           
9450: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75           /* Resu
9460: 6c 74 20 6d 75 73 74 20 6e 6f 74 20 61 70 70 65  lt must not appe
9470: 61 72 20 61 6e 79 77 68 65 72 65 20 69 6e 20 7a  ar anywhere in z
9480: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
9490: 20 2a 7a 41 2c 20 63 6f 6e 73 74 20 63 68 61 72   *zA, const char
94a0: 20 2a 7a 42 2c 20 20 20 2f 2a 20 54 72 79 20 74   *zB,   /* Try t
94b0: 68 65 73 65 20 66 69 72 73 74 20 2a 2f 0a 20 20  hese first */.  
94c0: 63 68 61 72 20 2a 7a 42 75 66 20 20 20 20 20 20  char *zBuf      
94d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
94e0: 20 20 2f 2a 20 53 70 61 63 65 20 74 6f 20 73 74    /* Space to st
94f0: 6f 72 65 20 61 20 67 65 6e 65 72 61 74 65 64 20  ore a generated 
9500: 73 74 72 69 6e 67 20 2a 2f 0a 29 7b 0a 20 20 75  string */.){.  u
9510: 6e 73 69 67 6e 65 64 20 69 20 3d 20 30 3b 0a 20  nsigned i = 0;. 
9520: 20 69 66 28 20 73 74 72 73 74 72 28 7a 2c 20 7a   if( strstr(z, z
9530: 41 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 7a  A)==0 ) return z
9540: 41 3b 0a 20 20 69 66 28 20 73 74 72 73 74 72 28  A;.  if( strstr(
9550: 7a 2c 20 7a 42 29 3d 3d 30 20 29 20 72 65 74 75  z, zB)==0 ) retu
9560: 72 6e 20 7a 42 3b 0a 20 20 64 6f 7b 0a 20 20 20  rn zB;.  do{.   
9570: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
9580: 66 28 32 30 2c 7a 42 75 66 2c 22 28 25 73 25 75  f(20,zBuf,"(%s%u
9590: 29 22 2c 20 7a 41 2c 20 69 2b 2b 29 3b 0a 20 20  )", zA, i++);.  
95a0: 7d 77 68 69 6c 65 28 20 73 74 72 73 74 72 28 7a  }while( strstr(z
95b0: 2c 7a 42 75 66 29 21 3d 30 20 29 3b 0a 20 20 72  ,zBuf)!=0 );.  r
95c0: 65 74 75 72 6e 20 7a 42 75 66 3b 0a 7d 0a 0a 2f  eturn zBuf;.}../
95d0: 2a 0a 2a 2a 20 4f 75 74 70 75 74 20 74 68 65 20  *.** Output the 
95e0: 67 69 76 65 6e 20 73 74 72 69 6e 67 20 61 73 20  given string as 
95f0: 61 20 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20  a quoted string 
9600: 75 73 69 6e 67 20 53 51 4c 20 71 75 6f 74 69 6e  using SQL quotin
9610: 67 20 63 6f 6e 76 65 6e 74 69 6f 6e 73 2e 0a 2a  g conventions..*
9620: 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20 6f  *.** See also: o
9630: 75 74 70 75 74 5f 71 75 6f 74 65 64 5f 65 73 63  utput_quoted_esc
9640: 61 70 65 64 5f 73 74 72 69 6e 67 28 29 0a 2a 2f  aped_string().*/
9650: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6f 75 74  .static void out
9660: 70 75 74 5f 71 75 6f 74 65 64 5f 73 74 72 69 6e  put_quoted_strin
9670: 67 28 46 49 4c 45 20 2a 6f 75 74 2c 20 63 6f 6e  g(FILE *out, con
9680: 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69  st char *z){.  i
9690: 6e 74 20 69 3b 0a 20 20 63 68 61 72 20 63 3b 0a  nt i;.  char c;.
96a0: 20 20 73 65 74 42 69 6e 61 72 79 4d 6f 64 65 28    setBinaryMode(
96b0: 6f 75 74 2c 20 31 29 3b 0a 20 20 66 6f 72 28 69  out, 1);.  for(i
96c0: 3d 30 3b 20 28 63 20 3d 20 7a 5b 69 5d 29 21 3d  =0; (c = z[i])!=
96d0: 30 20 26 26 20 63 21 3d 27 5c 27 27 3b 20 69 2b  0 && c!='\''; i+
96e0: 2b 29 7b 7d 0a 20 20 69 66 28 20 63 3d 3d 30 20  +){}.  if( c==0 
96f0: 29 7b 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e  ){.    utf8_prin
9700: 74 66 28 6f 75 74 2c 22 27 25 73 27 22 2c 7a 29  tf(out,"'%s'",z)
9710: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
9720: 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22  aw_printf(out, "
9730: 27 22 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  '");.    while( 
9740: 2a 7a 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28  *z ){.      for(
9750: 69 3d 30 3b 20 28 63 20 3d 20 7a 5b 69 5d 29 21  i=0; (c = z[i])!
9760: 3d 30 20 26 26 20 63 21 3d 27 5c 27 27 3b 20 69  =0 && c!='\''; i
9770: 2b 2b 29 7b 7d 0a 20 20 20 20 20 20 69 66 28 20  ++){}.      if( 
9780: 63 3d 3d 27 5c 27 27 20 29 20 69 2b 2b 3b 0a 20  c=='\'' ) i++;. 
9790: 20 20 20 20 20 69 66 28 20 69 20 29 7b 0a 20 20       if( i ){.  
97a0: 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
97b0: 66 28 6f 75 74 2c 20 22 25 2e 2a 73 22 2c 20 69  f(out, "%.*s", i
97c0: 2c 20 7a 29 3b 0a 20 20 20 20 20 20 20 20 7a 20  , z);.        z 
97d0: 2b 3d 20 69 3b 0a 20 20 20 20 20 20 7d 0a 20 20  += i;.      }.  
97e0: 20 20 20 20 69 66 28 20 63 3d 3d 27 5c 27 27 20      if( c=='\'' 
97f0: 29 7b 0a 20 20 20 20 20 20 20 20 72 61 77 5f 70  ){.        raw_p
9800: 72 69 6e 74 66 28 6f 75 74 2c 20 22 27 22 29 3b  rintf(out, "'");
9810: 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  .        continu
9820: 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  e;.      }.     
9830: 20 69 66 28 20 63 3d 3d 30 20 29 7b 0a 20 20 20   if( c==0 ){.   
9840: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
9850: 20 20 7d 0a 20 20 20 20 20 20 7a 2b 2b 3b 0a 20    }.      z++;. 
9860: 20 20 20 7d 0a 20 20 20 20 72 61 77 5f 70 72 69     }.    raw_pri
9870: 6e 74 66 28 6f 75 74 2c 20 22 27 22 29 3b 0a 20  ntf(out, "'");. 
9880: 20 7d 0a 20 20 73 65 74 54 65 78 74 4d 6f 64 65   }.  setTextMode
9890: 28 6f 75 74 2c 20 31 29 3b 0a 7d 0a 0a 2f 2a 0a  (out, 1);.}../*.
98a0: 2a 2a 20 4f 75 74 70 75 74 20 74 68 65 20 67 69  ** Output the gi
98b0: 76 65 6e 20 73 74 72 69 6e 67 20 61 73 20 61 20  ven string as a 
98c0: 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20 75 73  quoted string us
98d0: 69 6e 67 20 53 51 4c 20 71 75 6f 74 69 6e 67 20  ing SQL quoting 
98e0: 63 6f 6e 76 65 6e 74 69 6f 6e 73 2e 0a 2a 2a 20  conventions..** 
98f0: 41 64 64 69 74 69 6f 6e 61 6c 6c 6c 79 20 2c 20  Additionallly , 
9900: 65 73 63 61 70 65 20 74 68 65 20 22 5c 6e 22 20  escape the "\n" 
9910: 61 6e 64 20 22 5c 72 22 20 63 68 61 72 61 63 74  and "\r" charact
9920: 65 72 73 20 73 6f 20 74 68 61 74 20 74 68 65 79  ers so that they
9930: 20 64 6f 20 6e 6f 74 0a 2a 2a 20 67 65 74 20 63   do not.** get c
9940: 6f 72 72 75 70 74 65 64 20 62 79 20 65 6e 64 2d  orrupted by end-
9950: 6f 66 2d 6c 69 6e 65 20 74 72 61 6e 73 6c 61 74  of-line translat
9960: 69 6f 6e 20 66 61 63 69 6c 69 74 69 65 73 20 69  ion facilities i
9970: 6e 20 73 6f 6d 65 20 6f 70 65 72 61 74 69 6e 67  n some operating
9980: 0a 2a 2a 20 73 79 73 74 65 6d 73 2e 0a 2a 2a 0a  .** systems..**.
9990: 2a 2a 20 54 68 69 73 20 69 73 20 6c 69 6b 65 20  ** This is like 
99a0: 6f 75 74 70 75 74 5f 71 75 6f 74 65 64 5f 73 74  output_quoted_st
99b0: 72 69 6e 67 28 29 20 62 75 74 20 77 69 74 68 20  ring() but with 
99c0: 74 68 65 20 61 64 64 69 74 69 6f 6e 20 6f 66 20  the addition of 
99d0: 74 68 65 20 5c 72 5c 6e 0a 2a 2a 20 65 73 63 61  the \r\n.** esca
99e0: 70 65 20 6d 65 63 68 61 6e 69 73 6d 2e 0a 2a 2f  pe mechanism..*/
99f0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6f 75 74  .static void out
9a00: 70 75 74 5f 71 75 6f 74 65 64 5f 65 73 63 61 70  put_quoted_escap
9a10: 65 64 5f 73 74 72 69 6e 67 28 46 49 4c 45 20 2a  ed_string(FILE *
9a20: 6f 75 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  out, const char 
9a30: 2a 7a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  *z){.  int i;.  
9a40: 63 68 61 72 20 63 3b 0a 20 20 73 65 74 42 69 6e  char c;.  setBin
9a50: 61 72 79 4d 6f 64 65 28 6f 75 74 2c 20 31 29 3b  aryMode(out, 1);
9a60: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 28 63 20 3d  .  for(i=0; (c =
9a70: 20 7a 5b 69 5d 29 21 3d 30 20 26 26 20 63 21 3d   z[i])!=0 && c!=
9a80: 27 5c 27 27 20 26 26 20 63 21 3d 27 5c 6e 27 20  '\'' && c!='\n' 
9a90: 26 26 20 63 21 3d 27 5c 72 27 3b 20 69 2b 2b 29  && c!='\r'; i++)
9aa0: 7b 7d 0a 20 20 69 66 28 20 63 3d 3d 30 20 29 7b  {}.  if( c==0 ){
9ab0: 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66  .    utf8_printf
9ac0: 28 6f 75 74 2c 22 27 25 73 27 22 2c 7a 29 3b 0a  (out,"'%s'",z);.
9ad0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 6f 6e    }else{.    con
9ae0: 73 74 20 63 68 61 72 20 2a 7a 4e 4c 20 3d 20 30  st char *zNL = 0
9af0: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
9b00: 20 2a 7a 43 52 20 3d 20 30 3b 0a 20 20 20 20 69   *zCR = 0;.    i
9b10: 6e 74 20 6e 4e 4c 20 3d 20 30 3b 0a 20 20 20 20  nt nNL = 0;.    
9b20: 69 6e 74 20 6e 43 52 20 3d 20 30 3b 0a 20 20 20  int nCR = 0;.   
9b30: 20 63 68 61 72 20 7a 42 75 66 31 5b 32 30 5d 2c   char zBuf1[20],
9b40: 20 7a 42 75 66 32 5b 32 30 5d 3b 0a 20 20 20 20   zBuf2[20];.    
9b50: 66 6f 72 28 69 3d 30 3b 20 7a 5b 69 5d 3b 20 69  for(i=0; z[i]; i
9b60: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 7a  ++){.      if( z
9b70: 5b 69 5d 3d 3d 27 5c 6e 27 20 29 20 6e 4e 4c 2b  [i]=='\n' ) nNL+
9b80: 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 5b 69  +;.      if( z[i
9b90: 5d 3d 3d 27 5c 72 27 20 29 20 6e 43 52 2b 2b 3b  ]=='\r' ) nCR++;
9ba0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e  .    }.    if( n
9bb0: 4e 4c 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f  NL ){.      raw_
9bc0: 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 72 65 70  printf(out, "rep
9bd0: 6c 61 63 65 28 22 29 3b 0a 20 20 20 20 20 20 7a  lace(");.      z
9be0: 4e 4c 20 3d 20 75 6e 75 73 65 64 5f 73 74 72 69  NL = unused_stri
9bf0: 6e 67 28 7a 2c 20 22 5c 5c 6e 22 2c 20 22 5c 5c  ng(z, "\\n", "\\
9c00: 30 31 32 22 2c 20 7a 42 75 66 31 29 3b 0a 20 20  012", zBuf1);.  
9c10: 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 43 52 20    }.    if( nCR 
9c20: 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69  ){.      raw_pri
9c30: 6e 74 66 28 6f 75 74 2c 20 22 72 65 70 6c 61 63  ntf(out, "replac
9c40: 65 28 22 29 3b 0a 20 20 20 20 20 20 7a 43 52 20  e(");.      zCR 
9c50: 3d 20 75 6e 75 73 65 64 5f 73 74 72 69 6e 67 28  = unused_string(
9c60: 7a 2c 20 22 5c 5c 72 22 2c 20 22 5c 5c 30 31 35  z, "\\r", "\\015
9c70: 22 2c 20 7a 42 75 66 32 29 3b 0a 20 20 20 20 7d  ", zBuf2);.    }
9c80: 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28  .    raw_printf(
9c90: 6f 75 74 2c 20 22 27 22 29 3b 0a 20 20 20 20 77  out, "'");.    w
9ca0: 68 69 6c 65 28 20 2a 7a 20 29 7b 0a 20 20 20 20  hile( *z ){.    
9cb0: 20 20 66 6f 72 28 69 3d 30 3b 20 28 63 20 3d 20    for(i=0; (c = 
9cc0: 7a 5b 69 5d 29 21 3d 30 20 26 26 20 63 21 3d 27  z[i])!=0 && c!='
9cd0: 5c 6e 27 20 26 26 20 63 21 3d 27 5c 72 27 20 26  \n' && c!='\r' &
9ce0: 26 20 63 21 3d 27 5c 27 27 3b 20 69 2b 2b 29 7b  & c!='\''; i++){
9cf0: 7d 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27  }.      if( c=='
9d00: 5c 27 27 20 29 20 69 2b 2b 3b 0a 20 20 20 20 20  \'' ) i++;.     
9d10: 20 69 66 28 20 69 20 29 7b 0a 20 20 20 20 20 20   if( i ){.      
9d20: 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 6f 75    utf8_printf(ou
9d30: 74 2c 20 22 25 2e 2a 73 22 2c 20 69 2c 20 7a 29  t, "%.*s", i, z)
9d40: 3b 0a 20 20 20 20 20 20 20 20 7a 20 2b 3d 20 69  ;.        z += i
9d50: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
9d60: 69 66 28 20 63 3d 3d 27 5c 27 27 20 29 7b 0a 20  if( c=='\'' ){. 
9d70: 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74         raw_print
9d80: 66 28 6f 75 74 2c 20 22 27 22 29 3b 0a 20 20 20  f(out, "'");.   
9d90: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
9da0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
9db0: 20 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20   c==0 ){.       
9dc0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
9dd0: 20 20 20 20 20 20 7a 2b 2b 3b 0a 20 20 20 20 20        z++;.     
9de0: 20 69 66 28 20 63 3d 3d 27 5c 6e 27 20 29 7b 0a   if( c=='\n' ){.
9df0: 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e          raw_prin
9e00: 74 66 28 6f 75 74 2c 20 22 25 73 22 2c 20 7a 4e  tf(out, "%s", zN
9e10: 4c 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74  L);.        cont
9e20: 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20  inue;.      }.  
9e30: 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f      raw_printf(o
9e40: 75 74 2c 20 22 25 73 22 2c 20 7a 43 52 29 3b 0a  ut, "%s", zCR);.
9e50: 20 20 20 20 7d 0a 20 20 20 20 72 61 77 5f 70 72      }.    raw_pr
9e60: 69 6e 74 66 28 6f 75 74 2c 20 22 27 22 29 3b 0a  intf(out, "'");.
9e70: 20 20 20 20 69 66 28 20 6e 43 52 20 29 7b 0a 20      if( nCR ){. 
9e80: 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
9e90: 6f 75 74 2c 20 22 2c 27 25 73 27 2c 63 68 61 72  out, ",'%s',char
9ea0: 28 31 33 29 29 22 2c 20 7a 43 52 29 3b 0a 20 20  (13))", zCR);.  
9eb0: 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 4e 4c 20    }.    if( nNL 
9ec0: 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69  ){.      raw_pri
9ed0: 6e 74 66 28 6f 75 74 2c 20 22 2c 27 25 73 27 2c  ntf(out, ",'%s',
9ee0: 63 68 61 72 28 31 30 29 29 22 2c 20 7a 4e 4c 29  char(10))", zNL)
9ef0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 65  ;.    }.  }.  se
9f00: 74 54 65 78 74 4d 6f 64 65 28 6f 75 74 2c 20 31  tTextMode(out, 1
9f10: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 75 74 70  );.}../*.** Outp
9f20: 75 74 20 74 68 65 20 67 69 76 65 6e 20 73 74 72  ut the given str
9f30: 69 6e 67 20 61 73 20 61 20 71 75 6f 74 65 64 20  ing as a quoted 
9f40: 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 43 20 6f  according to C o
9f50: 72 20 54 43 4c 20 71 75 6f 74 69 6e 67 20 72 75  r TCL quoting ru
9f60: 6c 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  les..*/.static v
9f70: 6f 69 64 20 6f 75 74 70 75 74 5f 63 5f 73 74 72  oid output_c_str
9f80: 69 6e 67 28 46 49 4c 45 20 2a 6f 75 74 2c 20 63  ing(FILE *out, c
9f90: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20  onst char *z){. 
9fa0: 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 63 3b   unsigned int c;
9fb0: 0a 20 20 66 70 75 74 63 28 27 22 27 2c 20 6f 75  .  fputc('"', ou
9fc0: 74 29 3b 0a 20 20 77 68 69 6c 65 28 20 28 63 20  t);.  while( (c 
9fd0: 3d 20 2a 28 7a 2b 2b 29 29 21 3d 30 20 29 7b 0a  = *(z++))!=0 ){.
9fe0: 20 20 20 20 69 66 28 20 63 3d 3d 27 5c 5c 27 20      if( c=='\\' 
9ff0: 29 7b 0a 20 20 20 20 20 20 66 70 75 74 63 28 63  ){.      fputc(c
a000: 2c 20 6f 75 74 29 3b 0a 20 20 20 20 20 20 66 70  , out);.      fp
a010: 75 74 63 28 63 2c 20 6f 75 74 29 3b 0a 20 20 20  utc(c, out);.   
a020: 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 22   }else if( c=='"
a030: 27 20 29 7b 0a 20 20 20 20 20 20 66 70 75 74 63  ' ){.      fputc
a040: 28 27 5c 5c 27 2c 20 6f 75 74 29 3b 0a 20 20 20  ('\\', out);.   
a050: 20 20 20 66 70 75 74 63 28 27 22 27 2c 20 6f 75     fputc('"', ou
a060: 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  t);.    }else if
a070: 28 20 63 3d 3d 27 5c 74 27 20 29 7b 0a 20 20 20  ( c=='\t' ){.   
a080: 20 20 20 66 70 75 74 63 28 27 5c 5c 27 2c 20 6f     fputc('\\', o
a090: 75 74 29 3b 0a 20 20 20 20 20 20 66 70 75 74 63  ut);.      fputc
a0a0: 28 27 74 27 2c 20 6f 75 74 29 3b 0a 20 20 20 20  ('t', out);.    
a0b0: 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 5c 6e  }else if( c=='\n
a0c0: 27 20 29 7b 0a 20 20 20 20 20 20 66 70 75 74 63  ' ){.      fputc
a0d0: 28 27 5c 5c 27 2c 20 6f 75 74 29 3b 0a 20 20 20  ('\\', out);.   
a0e0: 20 20 20 66 70 75 74 63 28 27 6e 27 2c 20 6f 75     fputc('n', ou
a0f0: 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  t);.    }else if
a100: 28 20 63 3d 3d 27 5c 72 27 20 29 7b 0a 20 20 20  ( c=='\r' ){.   
a110: 20 20 20 66 70 75 74 63 28 27 5c 5c 27 2c 20 6f     fputc('\\', o
a120: 75 74 29 3b 0a 20 20 20 20 20 20 66 70 75 74 63  ut);.      fputc
a130: 28 27 72 27 2c 20 6f 75 74 29 3b 0a 20 20 20 20  ('r', out);.    
a140: 7d 65 6c 73 65 20 69 66 28 20 21 69 73 70 72 69  }else if( !ispri
a150: 6e 74 28 63 26 30 78 66 66 29 20 29 7b 0a 20 20  nt(c&0xff) ){.  
a160: 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f      raw_printf(o
a170: 75 74 2c 20 22 5c 5c 25 30 33 6f 22 2c 20 63 26  ut, "\\%03o", c&
a180: 30 78 66 66 29 3b 0a 20 20 20 20 7d 65 6c 73 65  0xff);.    }else
a190: 7b 0a 20 20 20 20 20 20 66 70 75 74 63 28 63 2c  {.      fputc(c,
a1a0: 20 6f 75 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d   out);.    }.  }
a1b0: 0a 20 20 66 70 75 74 63 28 27 22 27 2c 20 6f 75  .  fputc('"', ou
a1c0: 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 75 74  t);.}../*.** Out
a1d0: 70 75 74 20 74 68 65 20 67 69 76 65 6e 20 73 74  put the given st
a1e0: 72 69 6e 67 20 77 69 74 68 20 63 68 61 72 61 63  ring with charac
a1f0: 74 65 72 73 20 74 68 61 74 20 61 72 65 20 73 70  ters that are sp
a200: 65 63 69 61 6c 20 74 6f 0a 2a 2a 20 48 54 4d 4c  ecial to.** HTML
a210: 20 65 73 63 61 70 65 64 2e 0a 2a 2f 0a 73 74 61   escaped..*/.sta
a220: 74 69 63 20 76 6f 69 64 20 6f 75 74 70 75 74 5f  tic void output_
a230: 68 74 6d 6c 5f 73 74 72 69 6e 67 28 46 49 4c 45  html_string(FILE
a240: 20 2a 6f 75 74 2c 20 63 6f 6e 73 74 20 63 68 61   *out, const cha
a250: 72 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  r *z){.  int i;.
a260: 20 20 69 66 28 20 7a 3d 3d 30 20 29 20 7a 20 3d    if( z==0 ) z =
a270: 20 22 22 3b 0a 20 20 77 68 69 6c 65 28 20 2a 7a   "";.  while( *z
a280: 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   ){.    for(i=0;
a290: 20 20 20 7a 5b 69 5d 0a 20 20 20 20 20 20 20 20     z[i].        
a2a0: 20 20 20 20 26 26 20 7a 5b 69 5d 21 3d 27 3c 27      && z[i]!='<'
a2b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20  .            && 
a2c0: 7a 5b 69 5d 21 3d 27 26 27 0a 20 20 20 20 20 20  z[i]!='&'.      
a2d0: 20 20 20 20 20 20 26 26 20 7a 5b 69 5d 21 3d 27        && z[i]!='
a2e0: 3e 27 0a 20 20 20 20 20 20 20 20 20 20 20 20 26  >'.            &
a2f0: 26 20 7a 5b 69 5d 21 3d 27 5c 22 27 0a 20 20 20  & z[i]!='\"'.   
a300: 20 20 20 20 20 20 20 20 20 26 26 20 7a 5b 69 5d           && z[i]
a310: 21 3d 27 5c 27 27 3b 0a 20 20 20 20 20 20 20 20  !='\'';.        
a320: 69 2b 2b 29 7b 7d 0a 20 20 20 20 69 66 28 20 69  i++){}.    if( i
a330: 3e 30 20 29 7b 0a 20 20 20 20 20 20 75 74 66 38  >0 ){.      utf8
a340: 5f 70 72 69 6e 74 66 28 6f 75 74 2c 22 25 2e 2a  _printf(out,"%.*
a350: 73 22 2c 69 2c 7a 29 3b 0a 20 20 20 20 7d 0a 20  s",i,z);.    }. 
a360: 20 20 20 69 66 28 20 7a 5b 69 5d 3d 3d 27 3c 27     if( z[i]=='<'
a370: 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72   ){.      raw_pr
a380: 69 6e 74 66 28 6f 75 74 2c 22 26 6c 74 3b 22 29  intf(out,"&lt;")
a390: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
a3a0: 7a 5b 69 5d 3d 3d 27 26 27 20 29 7b 0a 20 20 20  z[i]=='&' ){.   
a3b0: 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75     raw_printf(ou
a3c0: 74 2c 22 26 61 6d 70 3b 22 29 3b 0a 20 20 20 20  t,"&amp;");.    
a3d0: 7d 65 6c 73 65 20 69 66 28 20 7a 5b 69 5d 3d 3d  }else if( z[i]==
a3e0: 27 3e 27 20 29 7b 0a 20 20 20 20 20 20 72 61 77  '>' ){.      raw
a3f0: 5f 70 72 69 6e 74 66 28 6f 75 74 2c 22 26 67 74  _printf(out,"&gt
a400: 3b 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  ;");.    }else i
a410: 66 28 20 7a 5b 69 5d 3d 3d 27 5c 22 27 20 29 7b  f( z[i]=='\"' ){
a420: 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74  .      raw_print
a430: 66 28 6f 75 74 2c 22 26 71 75 6f 74 3b 22 29 3b  f(out,"&quot;");
a440: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 7a  .    }else if( z
a450: 5b 69 5d 3d 3d 27 5c 27 27 20 29 7b 0a 20 20 20  [i]=='\'' ){.   
a460: 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75     raw_printf(ou
a470: 74 2c 22 26 23 33 39 3b 22 29 3b 0a 20 20 20 20  t,"&#39;");.    
a480: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 62 72 65  }else{.      bre
a490: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 20  ak;.    }.    z 
a4a0: 2b 3d 20 69 20 2b 20 31 3b 0a 20 20 7d 0a 7d 0a  += i + 1;.  }.}.
a4b0: 0a 2f 2a 0a 2a 2a 20 49 66 20 61 20 66 69 65 6c  ./*.** If a fiel
a4c0: 64 20 63 6f 6e 74 61 69 6e 73 20 61 6e 79 20 63  d contains any c
a4d0: 68 61 72 61 63 74 65 72 20 69 64 65 6e 74 69 66  haracter identif
a4e0: 69 65 64 20 62 79 20 61 20 31 20 69 6e 20 74 68  ied by a 1 in th
a4f0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 61  e following.** a
a500: 72 72 61 79 2c 20 74 68 65 6e 20 74 68 65 20 73  rray, then the s
a510: 74 72 69 6e 67 20 6d 75 73 74 20 62 65 20 71 75  tring must be qu
a520: 6f 74 65 64 20 66 6f 72 20 43 53 56 2e 0a 2a 2f  oted for CSV..*/
a530: 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68  .static const ch
a540: 61 72 20 6e 65 65 64 43 73 76 51 75 6f 74 65 5b  ar needCsvQuote[
a550: 5d 20 3d 20 7b 0a 20 20 31 2c 20 31 2c 20 31 2c  ] = {.  1, 1, 1,
a560: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
a570: 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c    1, 1, 1, 1, 1,
a580: 20 31 2c 20 31 2c 20 31 2c 0a 20 20 31 2c 20 31   1, 1, 1,.  1, 1
a590: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c  , 1, 1, 1, 1, 1,
a5a0: 20 31 2c 20 20 20 31 2c 20 31 2c 20 31 2c 20 31   1,   1, 1, 1, 1
a5b0: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 0a 20 20  , 1, 1, 1, 1,.  
a5c0: 31 2c 20 30 2c 20 31 2c 20 30 2c 20 30 2c 20 30  1, 0, 1, 0, 0, 0
a5d0: 2c 20 30 2c 20 31 2c 20 20 20 30 2c 20 30 2c 20  , 0, 1,   0, 0, 
a5e0: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
a5f0: 2c 0a 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20  ,.  0, 0, 0, 0, 
a600: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 20 20 30 2c  0, 0, 0, 0,   0,
a610: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
a620: 30 2c 20 30 2c 0a 20 20 30 2c 20 30 2c 20 30 2c  0, 0,.  0, 0, 0,
a630: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
a640: 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c    0, 0, 0, 0, 0,
a650: 20 30 2c 20 30 2c 20 30 2c 0a 20 20 30 2c 20 30   0, 0, 0,.  0, 0
a660: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
a670: 20 30 2c 20 20 20 30 2c 20 30 2c 20 30 2c 20 30   0,   0, 0, 0, 0
a680: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 0a 20 20  , 0, 0, 0, 0,.  
a690: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
a6a0: 2c 20 30 2c 20 30 2c 20 20 20 30 2c 20 30 2c 20  , 0, 0,   0, 0, 
a6b0: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
a6c0: 2c 0a 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20  ,.  0, 0, 0, 0, 
a6d0: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 20 20 30 2c  0, 0, 0, 0,   0,
a6e0: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
a6f0: 30 2c 20 31 2c 0a 20 20 31 2c 20 31 2c 20 31 2c  0, 1,.  1, 1, 1,
a700: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
a710: 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c    1, 1, 1, 1, 1,
a720: 20 31 2c 20 31 2c 20 31 2c 0a 20 20 31 2c 20 31   1, 1, 1,.  1, 1
a730: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c  , 1, 1, 1, 1, 1,
a740: 20 31 2c 20 20 20 31 2c 20 31 2c 20 31 2c 20 31   1,   1, 1, 1, 1
a750: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 0a 20 20  , 1, 1, 1, 1,.  
a760: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
a770: 2c 20 31 2c 20 31 2c 20 20 20 31 2c 20 31 2c 20  , 1, 1,   1, 1, 
a780: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
a790: 2c 0a 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20  ,.  1, 1, 1, 1, 
a7a0: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 20 20 31 2c  1, 1, 1, 1,   1,
a7b0: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
a7c0: 31 2c 20 31 2c 0a 20 20 31 2c 20 31 2c 20 31 2c  1, 1,.  1, 1, 1,
a7d0: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
a7e0: 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c    1, 1, 1, 1, 1,
a7f0: 20 31 2c 20 31 2c 20 31 2c 0a 20 20 31 2c 20 31   1, 1, 1,.  1, 1
a800: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c  , 1, 1, 1, 1, 1,
a810: 20 31 2c 20 20 20 31 2c 20 31 2c 20 31 2c 20 31   1,   1, 1, 1, 1
a820: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 0a 20 20  , 1, 1, 1, 1,.  
a830: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
a840: 2c 20 31 2c 20 31 2c 20 20 20 31 2c 20 31 2c 20  , 1, 1,   1, 1, 
a850: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
a860: 2c 0a 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20  ,.  1, 1, 1, 1, 
a870: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 20 20 31 2c  1, 1, 1, 1,   1,
a880: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
a890: 31 2c 20 31 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  1, 1,.};../*.** 
a8a0: 4f 75 74 70 75 74 20 61 20 73 69 6e 67 6c 65 20  Output a single 
a8b0: 74 65 72 6d 20 6f 66 20 43 53 56 2e 20 20 41 63  term of CSV.  Ac
a8c0: 74 75 61 6c 6c 79 2c 20 70 2d 3e 63 6f 6c 53 65  tually, p->colSe
a8d0: 70 61 72 61 74 6f 72 20 69 73 20 75 73 65 64 20  parator is used 
a8e0: 66 6f 72 0a 2a 2a 20 74 68 65 20 73 65 70 61 72  for.** the separ
a8f0: 61 74 6f 72 2c 20 77 68 69 63 68 20 6d 61 79 20  ator, which may 
a900: 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 61 20  or may not be a 
a910: 63 6f 6d 6d 61 2e 20 20 70 2d 3e 6e 75 6c 6c 56  comma.  p->nullV
a920: 61 6c 75 65 20 69 73 0a 2a 2a 20 74 68 65 20 6e  alue is.** the n
a930: 75 6c 6c 20 76 61 6c 75 65 2e 20 20 53 74 72 69  ull value.  Stri
a940: 6e 67 73 20 61 72 65 20 71 75 6f 74 65 64 20 69  ngs are quoted i
a950: 66 20 6e 65 63 65 73 73 61 72 79 2e 20 20 54 68  f necessary.  Th
a960: 65 20 73 65 70 61 72 61 74 6f 72 0a 2a 2a 20 69  e separator.** i
a970: 73 20 6f 6e 6c 79 20 69 73 73 75 65 64 20 69 66  s only issued if
a980: 20 62 53 65 70 20 69 73 20 74 72 75 65 2e 0a 2a   bSep is true..*
a990: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6f 75  /.static void ou
a9a0: 74 70 75 74 5f 63 73 76 28 53 68 65 6c 6c 53 74  tput_csv(ShellSt
a9b0: 61 74 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68  ate *p, const ch
a9c0: 61 72 20 2a 7a 2c 20 69 6e 74 20 62 53 65 70 29  ar *z, int bSep)
a9d0: 7b 0a 20 20 46 49 4c 45 20 2a 6f 75 74 20 3d 20  {.  FILE *out = 
a9e0: 70 2d 3e 6f 75 74 3b 0a 20 20 69 66 28 20 7a 3d  p->out;.  if( z=
a9f0: 3d 30 20 29 7b 0a 20 20 20 20 75 74 66 38 5f 70  =0 ){.    utf8_p
aa00: 72 69 6e 74 66 28 6f 75 74 2c 22 25 73 22 2c 70  rintf(out,"%s",p
aa10: 2d 3e 6e 75 6c 6c 56 61 6c 75 65 29 3b 0a 20 20  ->nullValue);.  
aa20: 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 69  }else{.    int i
aa30: 3b 0a 20 20 20 20 69 6e 74 20 6e 53 65 70 20 3d  ;.    int nSep =
aa40: 20 73 74 72 6c 65 6e 33 30 28 70 2d 3e 63 6f 6c   strlen30(p->col
aa50: 53 65 70 61 72 61 74 6f 72 29 3b 0a 20 20 20 20  Separator);.    
aa60: 66 6f 72 28 69 3d 30 3b 20 7a 5b 69 5d 3b 20 69  for(i=0; z[i]; i
aa70: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e  ++){.      if( n
aa80: 65 65 64 43 73 76 51 75 6f 74 65 5b 28 28 75 6e  eedCsvQuote[((un
aa90: 73 69 67 6e 65 64 20 63 68 61 72 2a 29 7a 29 5b  signed char*)z)[
aaa0: 69 5d 5d 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  i]].         || 
aab0: 28 7a 5b 69 5d 3d 3d 70 2d 3e 63 6f 6c 53 65 70  (z[i]==p->colSep
aac0: 61 72 61 74 6f 72 5b 30 5d 20 26 26 0a 20 20 20  arator[0] &&.   
aad0: 20 20 20 20 20 20 20 20 20 20 28 6e 53 65 70 3d            (nSep=
aae0: 3d 31 20 7c 7c 20 6d 65 6d 63 6d 70 28 7a 2c 20  =1 || memcmp(z, 
aaf0: 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 2c  p->colSeparator,
ab00: 20 6e 53 65 70 29 3d 3d 30 29 29 20 29 7b 0a 20   nSep)==0)) ){. 
ab10: 20 20 20 20 20 20 20 69 20 3d 20 30 3b 0a 20 20         i = 0;.  
ab20: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
ab30: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
ab40: 66 28 20 69 3d 3d 30 20 29 7b 0a 20 20 20 20 20  f( i==0 ){.     
ab50: 20 63 68 61 72 20 2a 7a 51 75 6f 74 65 64 20 3d   char *zQuoted =
ab60: 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
ab70: 28 22 5c 22 25 77 5c 22 22 2c 20 7a 29 3b 0a 20  ("\"%w\"", z);. 
ab80: 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
ab90: 28 6f 75 74 2c 20 22 25 73 22 2c 20 7a 51 75 6f  (out, "%s", zQuo
aba0: 74 65 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ted);.      sqli
abb0: 74 65 33 5f 66 72 65 65 28 7a 51 75 6f 74 65 64  te3_free(zQuoted
abc0: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
abd0: 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
abe0: 6f 75 74 2c 20 22 25 73 22 2c 20 7a 29 3b 0a 20  out, "%s", z);. 
abf0: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 62     }.  }.  if( b
ac00: 53 65 70 20 29 7b 0a 20 20 20 20 75 74 66 38 5f  Sep ){.    utf8_
ac10: 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
ac20: 25 73 22 2c 20 70 2d 3e 63 6f 6c 53 65 70 61 72  %s", p->colSepar
ac30: 61 74 6f 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  ator);.  }.}../*
ac40: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
ac50: 20 72 75 6e 73 20 77 68 65 6e 20 74 68 65 20 75   runs when the u
ac60: 73 65 72 20 70 72 65 73 73 65 73 20 43 74 72 6c  ser presses Ctrl
ac70: 2d 43 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  -C.*/.static voi
ac80: 64 20 69 6e 74 65 72 72 75 70 74 5f 68 61 6e 64  d interrupt_hand
ac90: 6c 65 72 28 69 6e 74 20 4e 6f 74 55 73 65 64 29  ler(int NotUsed)
aca0: 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  {.  UNUSED_PARAM
acb0: 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20  ETER(NotUsed);. 
acc0: 20 73 65 65 6e 49 6e 74 65 72 72 75 70 74 2b 2b   seenInterrupt++
acd0: 3b 0a 20 20 69 66 28 20 73 65 65 6e 49 6e 74 65  ;.  if( seenInte
ace0: 72 72 75 70 74 3e 32 20 29 20 65 78 69 74 28 31  rrupt>2 ) exit(1
acf0: 29 3b 0a 20 20 69 66 28 20 67 6c 6f 62 61 6c 44  );.  if( globalD
ad00: 62 20 29 20 73 71 6c 69 74 65 33 5f 69 6e 74 65  b ) sqlite3_inte
ad10: 72 72 75 70 74 28 67 6c 6f 62 61 6c 44 62 29 3b  rrupt(globalDb);
ad20: 0a 7d 0a 0a 23 69 66 20 28 64 65 66 69 6e 65 64  .}..#if (defined
ad30: 28 5f 57 49 4e 33 32 29 20 7c 7c 20 64 65 66 69  (_WIN32) || defi
ad40: 6e 65 64 28 57 49 4e 33 32 29 29 20 26 26 20 21  ned(WIN32)) && !
ad50: 64 65 66 69 6e 65 64 28 5f 57 49 4e 33 32 5f 57  defined(_WIN32_W
ad60: 43 45 29 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  CE)./*.** This r
ad70: 6f 75 74 69 6e 65 20 72 75 6e 73 20 66 6f 72 20  outine runs for 
ad80: 63 6f 6e 73 6f 6c 65 20 65 76 65 6e 74 73 20 28  console events (
ad90: 65 2e 67 2e 20 43 74 72 6c 2d 43 29 20 6f 6e 20  e.g. Ctrl-C) on 
ada0: 57 69 6e 33 32 0a 2a 2f 0a 73 74 61 74 69 63 20  Win32.*/.static 
adb0: 42 4f 4f 4c 20 57 49 4e 41 50 49 20 43 6f 6e 73  BOOL WINAPI Cons
adc0: 6f 6c 65 43 74 72 6c 48 61 6e 64 6c 65 72 28 0a  oleCtrlHandler(.
add0: 20 20 44 57 4f 52 44 20 64 77 43 74 72 6c 54 79    DWORD dwCtrlTy
ade0: 70 65 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65  pe /* One of the
adf0: 20 43 54 52 4c 5f 2a 5f 45 56 45 4e 54 20 63 6f   CTRL_*_EVENT co
ae00: 6e 73 74 61 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20  nstants */.){.  
ae10: 69 66 28 20 64 77 43 74 72 6c 54 79 70 65 3d 3d  if( dwCtrlType==
ae20: 43 54 52 4c 5f 43 5f 45 56 45 4e 54 20 29 7b 0a  CTRL_C_EVENT ){.
ae30: 20 20 20 20 69 6e 74 65 72 72 75 70 74 5f 68 61      interrupt_ha
ae40: 6e 64 6c 65 72 28 30 29 3b 0a 20 20 20 20 72 65  ndler(0);.    re
ae50: 74 75 72 6e 20 54 52 55 45 3b 0a 20 20 7d 0a 20  turn TRUE;.  }. 
ae60: 20 72 65 74 75 72 6e 20 46 41 4c 53 45 3b 0a 7d   return FALSE;.}
ae70: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66  .#endif..#ifndef
ae80: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
ae90: 48 4f 52 49 5a 41 54 49 4f 4e 0a 2f 2a 0a 2a 2a  HORIZATION./*.**
aea0: 20 57 68 65 6e 20 74 68 65 20 22 2e 61 75 74 68   When the ".auth
aeb0: 20 4f 4e 22 20 69 73 20 73 65 74 2c 20 74 68 65   ON" is set, the
aec0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 75 74 68 6f   following autho
aed0: 72 69 7a 65 72 20 63 61 6c 6c 62 61 63 6b 20 69  rizer callback i
aee0: 73 0a 2a 2a 20 69 6e 76 6f 6b 65 64 2e 20 20 49  s.** invoked.  I
aef0: 74 20 61 6c 77 61 79 73 20 72 65 74 75 72 6e 73  t always returns
af00: 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73   SQLITE_OK..*/.s
af10: 74 61 74 69 63 20 69 6e 74 20 73 68 65 6c 6c 41  tatic int shellA
af20: 75 74 68 28 0a 20 20 76 6f 69 64 20 2a 70 43 6c  uth(.  void *pCl
af30: 69 65 6e 74 44 61 74 61 2c 0a 20 20 69 6e 74 20  ientData,.  int 
af40: 6f 70 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  op,.  const char
af50: 20 2a 7a 41 31 2c 0a 20 20 63 6f 6e 73 74 20 63   *zA1,.  const c
af60: 68 61 72 20 2a 7a 41 32 2c 0a 20 20 63 6f 6e 73  har *zA2,.  cons
af70: 74 20 63 68 61 72 20 2a 7a 41 33 2c 0a 20 20 63  t char *zA3,.  c
af80: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 34 0a 29  onst char *zA4.)
af90: 7b 0a 20 20 53 68 65 6c 6c 53 74 61 74 65 20 2a  {.  ShellState *
afa0: 70 20 3d 20 28 53 68 65 6c 6c 53 74 61 74 65 2a  p = (ShellState*
afb0: 29 70 43 6c 69 65 6e 74 44 61 74 61 3b 0a 20 20  )pClientData;.  
afc0: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
afd0: 72 20 2a 61 7a 41 63 74 69 6f 6e 5b 5d 20 3d 20  r *azAction[] = 
afe0: 7b 20 30 2c 0a 20 20 20 20 20 22 43 52 45 41 54  { 0,.     "CREAT
aff0: 45 5f 49 4e 44 45 58 22 2c 20 20 20 20 20 20 20  E_INDEX",       
b000: 20 20 22 43 52 45 41 54 45 5f 54 41 42 4c 45 22    "CREATE_TABLE"
b010: 2c 20 20 20 20 20 20 20 20 20 22 43 52 45 41 54  ,         "CREAT
b020: 45 5f 54 45 4d 50 5f 49 4e 44 45 58 22 2c 0a 20  E_TEMP_INDEX",. 
b030: 20 20 20 20 22 43 52 45 41 54 45 5f 54 45 4d 50      "CREATE_TEMP
b040: 5f 54 41 42 4c 45 22 2c 20 20 20 20 22 43 52 45  _TABLE",    "CRE
b050: 41 54 45 5f 54 45 4d 50 5f 54 52 49 47 47 45 52  ATE_TEMP_TRIGGER
b060: 22 2c 20 20 22 43 52 45 41 54 45 5f 54 45 4d 50  ",  "CREATE_TEMP
b070: 5f 56 49 45 57 22 2c 0a 20 20 20 20 20 22 43 52  _VIEW",.     "CR
b080: 45 41 54 45 5f 54 52 49 47 47 45 52 22 2c 20 20  EATE_TRIGGER",  
b090: 20 20 20 20 20 22 43 52 45 41 54 45 5f 56 49 45       "CREATE_VIE
b0a0: 57 22 2c 20 20 20 20 20 20 20 20 20 20 22 44 45  W",          "DE
b0b0: 4c 45 54 45 22 2c 0a 20 20 20 20 20 22 44 52 4f  LETE",.     "DRO
b0c0: 50 5f 49 4e 44 45 58 22 2c 20 20 20 20 20 20 20  P_INDEX",       
b0d0: 20 20 20 20 22 44 52 4f 50 5f 54 41 42 4c 45 22      "DROP_TABLE"
b0e0: 2c 20 20 20 20 20 20 20 20 20 20 20 22 44 52 4f  ,           "DRO
b0f0: 50 5f 54 45 4d 50 5f 49 4e 44 45 58 22 2c 0a 20  P_TEMP_INDEX",. 
b100: 20 20 20 20 22 44 52 4f 50 5f 54 45 4d 50 5f 54      "DROP_TEMP_T
b110: 41 42 4c 45 22 2c 20 20 20 20 20 20 22 44 52 4f  ABLE",      "DRO
b120: 50 5f 54 45 4d 50 5f 54 52 49 47 47 45 52 22 2c  P_TEMP_TRIGGER",
b130: 20 20 20 20 22 44 52 4f 50 5f 54 45 4d 50 5f 56      "DROP_TEMP_V
b140: 49 45 57 22 2c 0a 20 20 20 20 20 22 44 52 4f 50  IEW",.     "DROP
b150: 5f 54 52 49 47 47 45 52 22 2c 20 20 20 20 20 20  _TRIGGER",      
b160: 20 20 20 22 44 52 4f 50 5f 56 49 45 57 22 2c 20     "DROP_VIEW", 
b170: 20 20 20 20 20 20 20 20 20 20 20 22 49 4e 53 45             "INSE
b180: 52 54 22 2c 0a 20 20 20 20 20 22 50 52 41 47 4d  RT",.     "PRAGM
b190: 41 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  A",             
b1a0: 20 20 22 52 45 41 44 22 2c 20 20 20 20 20 20 20    "READ",       
b1b0: 20 20 20 20 20 20 20 20 20 20 22 53 45 4c 45 43            "SELEC
b1c0: 54 22 2c 0a 20 20 20 20 20 22 54 52 41 4e 53 41  T",.     "TRANSA
b1d0: 43 54 49 4f 4e 22 2c 20 20 20 20 20 20 20 20 20  CTION",         
b1e0: 20 22 55 50 44 41 54 45 22 2c 20 20 20 20 20 20   "UPDATE",      
b1f0: 20 20 20 20 20 20 20 20 20 22 41 54 54 41 43 48           "ATTACH
b200: 22 2c 0a 20 20 20 20 20 22 44 45 54 41 43 48 22  ",.     "DETACH"
b210: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
b220: 22 41 4c 54 45 52 5f 54 41 42 4c 45 22 2c 20 20  "ALTER_TABLE",  
b230: 20 20 20 20 20 20 20 20 22 52 45 49 4e 44 45 58          "REINDEX
b240: 22 2c 0a 20 20 20 20 20 22 41 4e 41 4c 59 5a 45  ",.     "ANALYZE
b250: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
b260: 22 43 52 45 41 54 45 5f 56 54 41 42 4c 45 22 2c  "CREATE_VTABLE",
b270: 20 20 20 20 20 20 20 20 22 44 52 4f 50 5f 56 54          "DROP_VT
b280: 41 42 4c 45 22 2c 0a 20 20 20 20 20 22 46 55 4e  ABLE",.     "FUN
b290: 43 54 49 4f 4e 22 2c 20 20 20 20 20 20 20 20 20  CTION",         
b2a0: 20 20 20 20 22 53 41 56 45 50 4f 49 4e 54 22 2c      "SAVEPOINT",
b2b0: 20 20 20 20 20 20 20 20 20 20 20 20 22 52 45 43              "REC
b2c0: 55 52 53 49 56 45 22 0a 20 20 7d 3b 0a 20 20 69  URSIVE".  };.  i
b2d0: 6e 74 20 69 3b 0a 20 20 63 6f 6e 73 74 20 63 68  nt i;.  const ch
b2e0: 61 72 20 2a 61 7a 5b 34 5d 3b 0a 20 20 61 7a 5b  ar *az[4];.  az[
b2f0: 30 5d 20 3d 20 7a 41 31 3b 0a 20 20 61 7a 5b 31  0] = zA1;.  az[1
b300: 5d 20 3d 20 7a 41 32 3b 0a 20 20 61 7a 5b 32 5d  ] = zA2;.  az[2]
b310: 20 3d 20 7a 41 33 3b 0a 20 20 61 7a 5b 33 5d 20   = zA3;.  az[3] 
b320: 3d 20 7a 41 34 3b 0a 20 20 75 74 66 38 5f 70 72  = zA4;.  utf8_pr
b330: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 61 75  intf(p->out, "au
b340: 74 68 6f 72 69 7a 65 72 3a 20 25 73 22 2c 20 61  thorizer: %s", a
b350: 7a 41 63 74 69 6f 6e 5b 6f 70 5d 29 3b 0a 20 20  zAction[op]);.  
b360: 66 6f 72 28 69 3d 30 3b 20 69 3c 34 3b 20 69 2b  for(i=0; i<4; i+
b370: 2b 29 7b 0a 20 20 20 20 72 61 77 5f 70 72 69 6e  +){.    raw_prin
b380: 74 66 28 70 2d 3e 6f 75 74 2c 20 22 20 22 29 3b  tf(p->out, " ");
b390: 0a 20 20 20 20 69 66 28 20 61 7a 5b 69 5d 20 29  .    if( az[i] )
b3a0: 7b 0a 20 20 20 20 20 20 6f 75 74 70 75 74 5f 63  {.      output_c
b3b0: 5f 73 74 72 69 6e 67 28 70 2d 3e 6f 75 74 2c 20  _string(p->out, 
b3c0: 61 7a 5b 69 5d 29 3b 0a 20 20 20 20 7d 65 6c 73  az[i]);.    }els
b3d0: 65 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69  e{.      raw_pri
b3e0: 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 4e 55 4c  ntf(p->out, "NUL
b3f0: 4c 22 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  L");.    }.  }. 
b400: 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f   raw_printf(p->o
b410: 75 74 2c 20 22 5c 6e 22 29 3b 0a 20 20 72 65 74  ut, "\n");.  ret
b420: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
b430: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 50  .#endif../*.** P
b440: 72 69 6e 74 20 61 20 73 63 68 65 6d 61 20 73 74  rint a schema st
b450: 61 74 65 6d 65 6e 74 2e 20 20 50 61 72 74 20 6f  atement.  Part o
b460: 66 20 4d 4f 44 45 5f 53 65 6d 69 20 61 6e 64 20  f MODE_Semi and 
b470: 4d 4f 44 45 5f 50 72 65 74 74 79 20 6f 75 74 70  MODE_Pretty outp
b480: 75 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ut..**.** This r
b490: 6f 75 74 69 6e 65 20 63 6f 6e 76 65 72 74 73 20  outine converts 
b4a0: 73 6f 6d 65 20 43 52 45 41 54 45 20 54 41 42 4c  some CREATE TABL
b4b0: 45 20 73 74 61 74 65 6d 65 6e 74 73 20 66 6f 72  E statements for
b4c0: 20 73 68 61 64 6f 77 20 74 61 62 6c 65 73 0a 2a   shadow tables.*
b4d0: 2a 20 69 6e 20 46 54 53 33 2f 34 2f 35 20 69 6e  * in FTS3/4/5 in
b4e0: 74 6f 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  to CREATE TABLE 
b4f0: 49 46 20 4e 4f 54 20 45 58 49 53 54 53 20 73 74  IF NOT EXISTS st
b500: 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 73 74 61  atements..*/.sta
b510: 74 69 63 20 76 6f 69 64 20 70 72 69 6e 74 53 63  tic void printSc
b520: 68 65 6d 61 4c 69 6e 65 28 46 49 4c 45 20 2a 6f  hemaLine(FILE *o
b530: 75 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ut, const char *
b540: 7a 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  z, const char *z
b550: 54 61 69 6c 29 7b 0a 20 20 69 66 28 20 73 71 6c  Tail){.  if( sql
b560: 69 74 65 33 5f 73 74 72 67 6c 6f 62 28 22 43 52  ite3_strglob("CR
b570: 45 41 54 45 20 54 41 42 4c 45 20 5b 27 5c 22 5d  EATE TABLE ['\"]
b580: 2a 22 2c 20 7a 29 3d 3d 30 20 29 7b 0a 20 20 20  *", z)==0 ){.   
b590: 20 75 74 66 38 5f 70 72 69 6e 74 66 28 6f 75 74   utf8_printf(out
b5a0: 2c 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20  , "CREATE TABLE 
b5b0: 49 46 20 4e 4f 54 20 45 58 49 53 54 53 20 25 73  IF NOT EXISTS %s
b5c0: 25 73 22 2c 20 7a 2b 31 33 2c 20 7a 54 61 69 6c  %s", z+13, zTail
b5d0: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
b5e0: 75 74 66 38 5f 70 72 69 6e 74 66 28 6f 75 74 2c  utf8_printf(out,
b5f0: 20 22 25 73 25 73 22 2c 20 7a 2c 20 7a 54 61 69   "%s%s", z, zTai
b600: 6c 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63  l);.  }.}.static
b610: 20 76 6f 69 64 20 70 72 69 6e 74 53 63 68 65 6d   void printSchem
b620: 61 4c 69 6e 65 4e 28 46 49 4c 45 20 2a 6f 75 74  aLineN(FILE *out
b630: 2c 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6e  , char *z, int n
b640: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54  , const char *zT
b650: 61 69 6c 29 7b 0a 20 20 63 68 61 72 20 63 20 3d  ail){.  char c =
b660: 20 7a 5b 6e 5d 3b 0a 20 20 7a 5b 6e 5d 20 3d 20   z[n];.  z[n] = 
b670: 30 3b 0a 20 20 70 72 69 6e 74 53 63 68 65 6d 61  0;.  printSchema
b680: 4c 69 6e 65 28 6f 75 74 2c 20 7a 2c 20 7a 54 61  Line(out, z, zTa
b690: 69 6c 29 3b 0a 20 20 7a 5b 6e 5d 20 3d 20 63 3b  il);.  z[n] = c;
b6a0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
b6b0: 20 74 72 75 65 20 69 66 20 73 74 72 69 6e 67 20   true if string 
b6c0: 7a 5b 5d 20 68 61 73 20 6e 6f 74 68 69 6e 67 20  z[] has nothing 
b6d0: 62 75 74 20 77 68 69 74 65 73 70 61 63 65 20 61  but whitespace a
b6e0: 6e 64 20 63 6f 6d 6d 65 6e 74 73 20 74 6f 20 74  nd comments to t
b6f0: 68 65 0a 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65  he.** end of the
b700: 20 66 69 72 73 74 20 6c 69 6e 65 2e 0a 2a 2f 0a   first line..*/.
b710: 73 74 61 74 69 63 20 69 6e 74 20 77 73 54 6f 45  static int wsToE
b720: 6f 6c 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  ol(const char *z
b730: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f  ){.  int i;.  fo
b740: 72 28 69 3d 30 3b 20 7a 5b 69 5d 3b 20 69 2b 2b  r(i=0; z[i]; i++
b750: 29 7b 0a 20 20 20 20 69 66 28 20 7a 5b 69 5d 3d  ){.    if( z[i]=
b760: 3d 27 5c 6e 27 20 29 20 72 65 74 75 72 6e 20 31  ='\n' ) return 1
b770: 3b 0a 20 20 20 20 69 66 28 20 49 73 53 70 61 63  ;.    if( IsSpac
b780: 65 28 7a 5b 69 5d 29 20 29 20 63 6f 6e 74 69 6e  e(z[i]) ) contin
b790: 75 65 3b 0a 20 20 20 20 69 66 28 20 7a 5b 69 5d  ue;.    if( z[i]
b7a0: 3d 3d 27 2d 27 20 26 26 20 7a 5b 69 2b 31 5d 3d  =='-' && z[i+1]=
b7b0: 3d 27 2d 27 20 29 20 72 65 74 75 72 6e 20 31 3b  ='-' ) return 1;
b7c0: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
b7d0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d   }.  return 1;.}
b7e0: 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65  ../*.** Add a ne
b7f0: 77 20 65 6e 74 72 79 20 74 6f 20 74 68 65 20 45  w entry to the E
b800: 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41  XPLAIN QUERY PLA
b810: 4e 20 64 61 74 61 0a 2a 2f 0a 73 74 61 74 69 63  N data.*/.static
b820: 20 76 6f 69 64 20 65 71 70 5f 61 70 70 65 6e 64   void eqp_append
b830: 28 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 2c 20  (ShellState *p, 
b840: 69 6e 74 20 69 45 71 70 49 64 2c 20 69 6e 74 20  int iEqpId, int 
b850: 70 32 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  p2, const char *
b860: 7a 54 65 78 74 29 7b 0a 20 20 45 51 50 47 72 61  zText){.  EQPGra
b870: 70 68 52 6f 77 20 2a 70 4e 65 77 3b 0a 20 20 69  phRow *pNew;.  i
b880: 6e 74 20 6e 54 65 78 74 20 3d 20 73 74 72 6c 65  nt nText = strle
b890: 6e 33 30 28 7a 54 65 78 74 29 3b 0a 20 20 69 66  n30(zText);.  if
b8a0: 28 20 70 2d 3e 61 75 74 6f 45 51 50 74 65 73 74  ( p->autoEQPtest
b8b0: 20 29 7b 0a 20 20 20 20 75 74 66 38 5f 70 72 69   ){.    utf8_pri
b8c0: 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 64 2c  ntf(p->out, "%d,
b8d0: 25 64 2c 25 73 5c 6e 22 2c 20 69 45 71 70 49 64  %d,%s\n", iEqpId
b8e0: 2c 20 70 32 2c 20 7a 54 65 78 74 29 3b 0a 20 20  , p2, zText);.  
b8f0: 7d 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74  }.  pNew = sqlit
b900: 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 20 73 69 7a  e3_malloc64( siz
b910: 65 6f 66 28 2a 70 4e 65 77 29 20 2b 20 6e 54 65  eof(*pNew) + nTe
b920: 78 74 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77  xt );.  if( pNew
b930: 3d 3d 30 20 29 20 73 68 65 6c 6c 5f 6f 75 74 5f  ==0 ) shell_out_
b940: 6f 66 5f 6d 65 6d 6f 72 79 28 29 3b 0a 20 20 70  of_memory();.  p
b950: 4e 65 77 2d 3e 69 45 71 70 49 64 20 3d 20 69 45  New->iEqpId = iE
b960: 71 70 49 64 3b 0a 20 20 70 4e 65 77 2d 3e 69 50  qpId;.  pNew->iP
b970: 61 72 65 6e 74 49 64 20 3d 20 70 32 3b 0a 20 20  arentId = p2;.  
b980: 6d 65 6d 63 70 79 28 70 4e 65 77 2d 3e 7a 54 65  memcpy(pNew->zTe
b990: 78 74 2c 20 7a 54 65 78 74 2c 20 6e 54 65 78 74  xt, zText, nText
b9a0: 2b 31 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 4e 65  +1);.  pNew->pNe
b9b0: 78 74 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 2d  xt = 0;.  if( p-
b9c0: 3e 73 47 72 61 70 68 2e 70 4c 61 73 74 20 29 7b  >sGraph.pLast ){
b9d0: 0a 20 20 20 20 70 2d 3e 73 47 72 61 70 68 2e 70  .    p->sGraph.p
b9e0: 4c 61 73 74 2d 3e 70 4e 65 78 74 20 3d 20 70 4e  Last->pNext = pN
b9f0: 65 77 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ew;.  }else{.   
ba00: 20 70 2d 3e 73 47 72 61 70 68 2e 70 52 6f 77 20   p->sGraph.pRow 
ba10: 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 20 20 70 2d  = pNew;.  }.  p-
ba20: 3e 73 47 72 61 70 68 2e 70 4c 61 73 74 20 3d 20  >sGraph.pLast = 
ba30: 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  pNew;.}../*.** F
ba40: 72 65 65 20 61 6e 64 20 72 65 73 65 74 20 74 68  ree and reset th
ba50: 65 20 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20  e EXPLAIN QUERY 
ba60: 50 4c 41 4e 20 64 61 74 61 20 74 68 61 74 20 68  PLAN data that h
ba70: 61 73 20 62 65 65 6e 20 63 6f 6c 6c 65 63 74 65  as been collecte
ba80: 64 0a 2a 2a 20 69 6e 20 70 2d 3e 73 47 72 61 70  d.** in p->sGrap
ba90: 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  h..*/.static voi
baa0: 64 20 65 71 70 5f 72 65 73 65 74 28 53 68 65 6c  d eqp_reset(Shel
bab0: 6c 53 74 61 74 65 20 2a 70 29 7b 0a 20 20 45 51  lState *p){.  EQ
bac0: 50 47 72 61 70 68 52 6f 77 20 2a 70 52 6f 77 2c  PGraphRow *pRow,
bad0: 20 2a 70 4e 65 78 74 3b 0a 20 20 66 6f 72 28 70   *pNext;.  for(p
bae0: 52 6f 77 20 3d 20 70 2d 3e 73 47 72 61 70 68 2e  Row = p->sGraph.
baf0: 70 52 6f 77 3b 20 70 52 6f 77 3b 20 70 52 6f 77  pRow; pRow; pRow
bb00: 20 3d 20 70 4e 65 78 74 29 7b 0a 20 20 20 20 70   = pNext){.    p
bb10: 4e 65 78 74 20 3d 20 70 52 6f 77 2d 3e 70 4e 65  Next = pRow->pNe
bb20: 78 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  xt;.    sqlite3_
bb30: 66 72 65 65 28 70 52 6f 77 29 3b 0a 20 20 7d 0a  free(pRow);.  }.
bb40: 20 20 6d 65 6d 73 65 74 28 26 70 2d 3e 73 47 72    memset(&p->sGr
bb50: 61 70 68 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70  aph, 0, sizeof(p
bb60: 2d 3e 73 47 72 61 70 68 29 29 3b 0a 7d 0a 0a 2f  ->sGraph));.}../
bb70: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 65 78  * Return the nex
bb80: 74 20 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20  t EXPLAIN QUERY 
bb90: 50 4c 41 4e 20 6c 69 6e 65 20 77 69 74 68 20 69  PLAN line with i
bba0: 45 71 70 49 64 20 74 68 61 74 20 6f 63 63 75 72  EqpId that occur
bbb0: 73 20 61 66 74 65 72 0a 2a 2a 20 70 4f 6c 64 2c  s after.** pOld,
bbc0: 20 6f 72 20 72 65 74 75 72 6e 20 74 68 65 20 66   or return the f
bbd0: 69 72 73 74 20 73 75 63 68 20 6c 69 6e 65 20 69  irst such line i
bbe0: 66 20 70 4f 6c 64 20 69 73 20 4e 55 4c 4c 0a 2a  f pOld is NULL.*
bbf0: 2f 0a 73 74 61 74 69 63 20 45 51 50 47 72 61 70  /.static EQPGrap
bc00: 68 52 6f 77 20 2a 65 71 70 5f 6e 65 78 74 5f 72  hRow *eqp_next_r
bc10: 6f 77 28 53 68 65 6c 6c 53 74 61 74 65 20 2a 70  ow(ShellState *p
bc20: 2c 20 69 6e 74 20 69 45 71 70 49 64 2c 20 45 51  , int iEqpId, EQ
bc30: 50 47 72 61 70 68 52 6f 77 20 2a 70 4f 6c 64 29  PGraphRow *pOld)
bc40: 7b 0a 20 20 45 51 50 47 72 61 70 68 52 6f 77 20  {.  EQPGraphRow 
bc50: 2a 70 52 6f 77 20 3d 20 70 4f 6c 64 20 3f 20 70  *pRow = pOld ? p
bc60: 4f 6c 64 2d 3e 70 4e 65 78 74 20 3a 20 70 2d 3e  Old->pNext : p->
bc70: 73 47 72 61 70 68 2e 70 52 6f 77 3b 0a 20 20 77  sGraph.pRow;.  w
bc80: 68 69 6c 65 28 20 70 52 6f 77 20 26 26 20 70 52  hile( pRow && pR
bc90: 6f 77 2d 3e 69 50 61 72 65 6e 74 49 64 21 3d 69  ow->iParentId!=i
bca0: 45 71 70 49 64 20 29 20 70 52 6f 77 20 3d 20 70  EqpId ) pRow = p
bcb0: 52 6f 77 2d 3e 70 4e 65 78 74 3b 0a 20 20 72 65  Row->pNext;.  re
bcc0: 74 75 72 6e 20 70 52 6f 77 3b 0a 7d 0a 0a 2f 2a  turn pRow;.}../*
bcd0: 20 52 65 6e 64 65 72 20 61 20 73 69 6e 67 6c 65   Render a single
bce0: 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 67 72   level of the gr
bcf0: 61 70 68 20 74 68 61 74 20 68 61 73 20 69 45 71  aph that has iEq
bd00: 70 49 64 20 61 73 20 69 74 73 20 70 61 72 65 6e  pId as its paren
bd10: 74 2e 20 20 43 61 6c 6c 65 64 0a 2a 2a 20 72 65  t.  Called.** re
bd20: 63 75 72 73 69 76 65 6c 79 20 74 6f 20 72 65 6e  cursively to ren
bd30: 64 65 72 20 73 75 62 6c 65 76 65 6c 73 2e 0a 2a  der sublevels..*
bd40: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 71  /.static void eq
bd50: 70 5f 72 65 6e 64 65 72 5f 6c 65 76 65 6c 28 53  p_render_level(S
bd60: 68 65 6c 6c 53 74 61 74 65 20 2a 70 2c 20 69 6e  hellState *p, in
bd70: 74 20 69 45 71 70 49 64 29 7b 0a 20 20 45 51 50  t iEqpId){.  EQP
bd80: 47 72 61 70 68 52 6f 77 20 2a 70 52 6f 77 2c 20  GraphRow *pRow, 
bd90: 2a 70 4e 65 78 74 3b 0a 20 20 69 6e 74 20 6e 20  *pNext;.  int n 
bda0: 3d 20 73 74 72 6c 65 6e 33 30 28 70 2d 3e 73 47  = strlen30(p->sG
bdb0: 72 61 70 68 2e 7a 50 72 65 66 69 78 29 3b 0a 20  raph.zPrefix);. 
bdc0: 20 63 68 61 72 20 2a 7a 3b 0a 20 20 66 6f 72 28   char *z;.  for(
bdd0: 70 52 6f 77 20 3d 20 65 71 70 5f 6e 65 78 74 5f  pRow = eqp_next_
bde0: 72 6f 77 28 70 2c 20 69 45 71 70 49 64 2c 20 30  row(p, iEqpId, 0
bdf0: 29 3b 20 70 52 6f 77 3b 20 70 52 6f 77 20 3d 20  ); pRow; pRow = 
be00: 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e 65 78  pNext){.    pNex
be10: 74 20 3d 20 65 71 70 5f 6e 65 78 74 5f 72 6f 77  t = eqp_next_row
be20: 28 70 2c 20 69 45 71 70 49 64 2c 20 70 52 6f 77  (p, iEqpId, pRow
be30: 29 3b 0a 20 20 20 20 7a 20 3d 20 70 52 6f 77 2d  );.    z = pRow-
be40: 3e 7a 54 65 78 74 3b 0a 20 20 20 20 75 74 66 38  >zText;.    utf8
be50: 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
be60: 22 25 73 25 73 25 73 5c 6e 22 2c 20 70 2d 3e 73  "%s%s%s\n", p->s
be70: 47 72 61 70 68 2e 7a 50 72 65 66 69 78 2c 20 70  Graph.zPrefix, p
be80: 4e 65 78 74 20 3f 20 22 7c 2d 2d 22 20 3a 20 22  Next ? "|--" : "
be90: 60 2d 2d 22 2c 20 7a 29 3b 0a 20 20 20 20 69 66  `--", z);.    if
bea0: 28 20 6e 3c 28 69 6e 74 29 73 69 7a 65 6f 66 28  ( n<(int)sizeof(
beb0: 70 2d 3e 73 47 72 61 70 68 2e 7a 50 72 65 66 69  p->sGraph.zPrefi
bec0: 78 29 2d 37 20 29 7b 0a 20 20 20 20 20 20 6d 65  x)-7 ){.      me
bed0: 6d 63 70 79 28 26 70 2d 3e 73 47 72 61 70 68 2e  mcpy(&p->sGraph.
bee0: 7a 50 72 65 66 69 78 5b 6e 5d 2c 20 70 4e 65 78  zPrefix[n], pNex
bef0: 74 20 3f 20 22 7c 20 20 22 20 3a 20 22 20 20 20  t ? "|  " : "   
bf00: 22 2c 20 34 29 3b 0a 20 20 20 20 20 20 65 71 70  ", 4);.      eqp
bf10: 5f 72 65 6e 64 65 72 5f 6c 65 76 65 6c 28 70 2c  _render_level(p,
bf20: 20 70 52 6f 77 2d 3e 69 45 71 70 49 64 29 3b 0a   pRow->iEqpId);.
bf30: 20 20 20 20 20 20 70 2d 3e 73 47 72 61 70 68 2e        p->sGraph.
bf40: 7a 50 72 65 66 69 78 5b 6e 5d 20 3d 20 30 3b 0a  zPrefix[n] = 0;.
bf50: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
bf60: 2a 2a 20 44 69 73 70 6c 61 79 20 61 6e 64 20 72  ** Display and r
bf70: 65 73 65 74 20 74 68 65 20 45 58 50 4c 41 49 4e  eset the EXPLAIN
bf80: 20 51 55 45 52 59 20 50 4c 41 4e 20 64 61 74 61   QUERY PLAN data
bf90: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
bfa0: 65 71 70 5f 72 65 6e 64 65 72 28 53 68 65 6c 6c  eqp_render(Shell
bfb0: 53 74 61 74 65 20 2a 70 29 7b 0a 20 20 45 51 50  State *p){.  EQP
bfc0: 47 72 61 70 68 52 6f 77 20 2a 70 52 6f 77 20 3d  GraphRow *pRow =
bfd0: 20 70 2d 3e 73 47 72 61 70 68 2e 70 52 6f 77 3b   p->sGraph.pRow;
bfe0: 0a 20 20 69 66 28 20 70 52 6f 77 20 29 7b 0a 20  .  if( pRow ){. 
bff0: 20 20 20 69 66 28 20 70 52 6f 77 2d 3e 7a 54 65     if( pRow->zTe
c000: 78 74 5b 30 5d 3d 3d 27 2d 27 20 29 7b 0a 20 20  xt[0]=='-' ){.  
c010: 20 20 20 20 69 66 28 20 70 52 6f 77 2d 3e 70 4e      if( pRow->pN
c020: 65 78 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ext==0 ){.      
c030: 20 20 65 71 70 5f 72 65 73 65 74 28 70 29 3b 0a    eqp_reset(p);.
c040: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a          return;.
c050: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 75 74        }.      ut
c060: 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  f8_printf(p->out
c070: 2c 20 22 25 73 5c 6e 22 2c 20 70 52 6f 77 2d 3e  , "%s\n", pRow->
c080: 7a 54 65 78 74 2b 33 29 3b 0a 20 20 20 20 20 20  zText+3);.      
c090: 70 2d 3e 73 47 72 61 70 68 2e 70 52 6f 77 20 3d  p->sGraph.pRow =
c0a0: 20 70 52 6f 77 2d 3e 70 4e 65 78 74 3b 0a 20 20   pRow->pNext;.  
c0b0: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
c0c0: 28 70 52 6f 77 29 3b 0a 20 20 20 20 7d 65 6c 73  (pRow);.    }els
c0d0: 65 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72  e{.      utf8_pr
c0e0: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 51 55  intf(p->out, "QU
c0f0: 45 52 59 20 50 4c 41 4e 5c 6e 22 29 3b 0a 20 20  ERY PLAN\n");.  
c100: 20 20 7d 0a 20 20 20 20 70 2d 3e 73 47 72 61 70    }.    p->sGrap
c110: 68 2e 7a 50 72 65 66 69 78 5b 30 5d 20 3d 20 30  h.zPrefix[0] = 0
c120: 3b 0a 20 20 20 20 65 71 70 5f 72 65 6e 64 65 72  ;.    eqp_render
c130: 5f 6c 65 76 65 6c 28 70 2c 20 30 29 3b 0a 20 20  _level(p, 0);.  
c140: 20 20 65 71 70 5f 72 65 73 65 74 28 70 29 3b 0a    eqp_reset(p);.
c150: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69    }.}../*.** Thi
c160: 73 20 69 73 20 74 68 65 20 63 61 6c 6c 62 61 63  s is the callbac
c170: 6b 20 72 6f 75 74 69 6e 65 20 74 68 61 74 20 74  k routine that t
c180: 68 65 20 73 68 65 6c 6c 0a 2a 2a 20 69 6e 76 6f  he shell.** invo
c190: 6b 65 73 20 66 6f 72 20 65 61 63 68 20 72 6f 77  kes for each row
c1a0: 20 6f 66 20 61 20 71 75 65 72 79 20 72 65 73 75   of a query resu
c1b0: 6c 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  lt..*/.static in
c1c0: 74 20 73 68 65 6c 6c 5f 63 61 6c 6c 62 61 63 6b  t shell_callback
c1d0: 28 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 2c 0a  (.  void *pArg,.
c1e0: 20 20 69 6e 74 20 6e 41 72 67 2c 20 20 20 20 20    int nArg,     
c1f0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
c200: 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 2a  result columns *
c210: 2f 0a 20 20 63 68 61 72 20 2a 2a 61 7a 41 72 67  /.  char **azArg
c220: 2c 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20  ,    /* Text of 
c230: 65 61 63 68 20 72 65 73 75 6c 74 20 63 6f 6c 75  each result colu
c240: 6d 6e 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61  mn */.  char **a
c250: 7a 43 6f 6c 2c 20 20 20 20 2f 2a 20 43 6f 6c 75  zCol,    /* Colu
c260: 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 69 6e  mn names */.  in
c270: 74 20 2a 61 69 54 79 70 65 20 20 20 20 20 20 2f  t *aiType      /
c280: 2a 20 43 6f 6c 75 6d 6e 20 74 79 70 65 73 20 2a  * Column types *
c290: 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  /.){.  int i;.  
c2a0: 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 20 3d 20  ShellState *p = 
c2b0: 28 53 68 65 6c 6c 53 74 61 74 65 2a 29 70 41 72  (ShellState*)pAr
c2c0: 67 3b 0a 0a 20 20 69 66 28 20 61 7a 41 72 67 3d  g;..  if( azArg=
c2d0: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
c2e0: 20 73 77 69 74 63 68 28 20 70 2d 3e 63 4d 6f 64   switch( p->cMod
c2f0: 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20 4d 4f  e ){.    case MO
c300: 44 45 5f 4c 69 6e 65 3a 20 7b 0a 20 20 20 20 20  DE_Line: {.     
c310: 20 69 6e 74 20 77 20 3d 20 35 3b 0a 20 20 20 20   int w = 5;.    
c320: 20 20 69 66 28 20 61 7a 41 72 67 3d 3d 30 20 29    if( azArg==0 )
c330: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 66 6f   break;.      fo
c340: 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69  r(i=0; i<nArg; i
c350: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  ++){.        int
c360: 20 6c 65 6e 20 3d 20 73 74 72 6c 65 6e 33 30 28   len = strlen30(
c370: 61 7a 43 6f 6c 5b 69 5d 20 3f 20 61 7a 43 6f 6c  azCol[i] ? azCol
c380: 5b 69 5d 20 3a 20 22 22 29 3b 0a 20 20 20 20 20  [i] : "");.     
c390: 20 20 20 69 66 28 20 6c 65 6e 3e 77 20 29 20 77     if( len>w ) w
c3a0: 20 3d 20 6c 65 6e 3b 0a 20 20 20 20 20 20 7d 0a   = len;.      }.
c3b0: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 63 6e 74        if( p->cnt
c3c0: 2b 2b 3e 30 20 29 20 75 74 66 38 5f 70 72 69 6e  ++>0 ) utf8_prin
c3d0: 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c  tf(p->out, "%s",
c3e0: 20 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72   p->rowSeparator
c3f0: 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  );.      for(i=0
c400: 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a  ; i<nArg; i++){.
c410: 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69          utf8_pri
c420: 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 25 2a 73 20  ntf(p->out,"%*s 
c430: 3d 20 25 73 25 73 22 2c 20 77 2c 20 61 7a 43 6f  = %s%s", w, azCo
c440: 6c 5b 69 5d 2c 0a 20 20 20 20 20 20 20 20 20 20  l[i],.          
c450: 20 20 20 20 20 20 61 7a 41 72 67 5b 69 5d 20 3f        azArg[i] ?
c460: 20 61 7a 41 72 67 5b 69 5d 20 3a 20 70 2d 3e 6e   azArg[i] : p->n
c470: 75 6c 6c 56 61 6c 75 65 2c 20 70 2d 3e 72 6f 77  ullValue, p->row
c480: 53 65 70 61 72 61 74 6f 72 29 3b 0a 20 20 20 20  Separator);.    
c490: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
c4a0: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
c4b0: 4d 4f 44 45 5f 45 78 70 6c 61 69 6e 3a 0a 20 20  MODE_Explain:.  
c4c0: 20 20 63 61 73 65 20 4d 4f 44 45 5f 43 6f 6c 75    case MODE_Colu
c4d0: 6d 6e 3a 20 7b 0a 20 20 20 20 20 20 73 74 61 74  mn: {.      stat
c4e0: 69 63 20 63 6f 6e 73 74 20 69 6e 74 20 61 45 78  ic const int aEx
c4f0: 70 6c 61 69 6e 57 69 64 74 68 73 5b 5d 20 3d 20  plainWidths[] = 
c500: 7b 34 2c 20 31 33 2c 20 34 2c 20 34 2c 20 34 2c  {4, 13, 4, 4, 4,
c510: 20 31 33 2c 20 32 2c 20 31 33 7d 3b 0a 20 20 20   13, 2, 13};.   
c520: 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 2a 63 6f     const int *co
c530: 6c 57 69 64 74 68 3b 0a 20 20 20 20 20 20 69 6e  lWidth;.      in
c540: 74 20 73 68 6f 77 48 64 72 3b 0a 20 20 20 20 20  t showHdr;.     
c550: 20 63 68 61 72 20 2a 72 6f 77 53 65 70 3b 0a 20   char *rowSep;. 
c560: 20 20 20 20 20 69 66 28 20 70 2d 3e 63 4d 6f 64       if( p->cMod
c570: 65 3d 3d 4d 4f 44 45 5f 43 6f 6c 75 6d 6e 20 29  e==MODE_Column )
c580: 7b 0a 20 20 20 20 20 20 20 20 63 6f 6c 57 69 64  {.        colWid
c590: 74 68 20 3d 20 70 2d 3e 63 6f 6c 57 69 64 74 68  th = p->colWidth
c5a0: 3b 0a 20 20 20 20 20 20 20 20 73 68 6f 77 48 64  ;.        showHd
c5b0: 72 20 3d 20 70 2d 3e 73 68 6f 77 48 65 61 64 65  r = p->showHeade
c5c0: 72 3b 0a 20 20 20 20 20 20 20 20 72 6f 77 53 65  r;.        rowSe
c5d0: 70 20 3d 20 70 2d 3e 72 6f 77 53 65 70 61 72 61  p = p->rowSepara
c5e0: 74 6f 72 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  tor;.      }else
c5f0: 7b 0a 20 20 20 20 20 20 20 20 63 6f 6c 57 69 64  {.        colWid
c600: 74 68 20 3d 20 61 45 78 70 6c 61 69 6e 57 69 64  th = aExplainWid
c610: 74 68 73 3b 0a 20 20 20 20 20 20 20 20 73 68 6f  ths;.        sho
c620: 77 48 64 72 20 3d 20 31 3b 0a 20 20 20 20 20 20  wHdr = 1;.      
c630: 20 20 72 6f 77 53 65 70 20 3d 20 53 45 50 5f 52    rowSep = SEP_R
c640: 6f 77 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ow;.      }.    
c650: 20 20 69 66 28 20 70 2d 3e 63 6e 74 2b 2b 3d 3d    if( p->cnt++==
c660: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6f 72  0 ){.        for
c670: 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b  (i=0; i<nArg; i+
c680: 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e  +){.          in
c690: 74 20 77 2c 20 6e 3b 0a 20 20 20 20 20 20 20 20  t w, n;.        
c6a0: 20 20 69 66 28 20 69 3c 41 72 72 61 79 53 69 7a    if( i<ArraySiz
c6b0: 65 28 70 2d 3e 63 6f 6c 57 69 64 74 68 29 20 29  e(p->colWidth) )
c6c0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 77 20  {.            w 
c6d0: 3d 20 63 6f 6c 57 69 64 74 68 5b 69 5d 3b 0a 20  = colWidth[i];. 
c6e0: 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
c6f0: 20 20 20 20 20 20 20 20 20 20 20 20 77 20 3d 20              w = 
c700: 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  0;.          }. 
c710: 20 20 20 20 20 20 20 20 20 69 66 28 20 77 3d 3d           if( w==
c720: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
c730: 20 77 20 3d 20 73 74 72 6c 65 6e 43 68 61 72 28   w = strlenChar(
c740: 61 7a 43 6f 6c 5b 69 5d 20 3f 20 61 7a 43 6f 6c  azCol[i] ? azCol
c750: 5b 69 5d 20 3a 20 22 22 29 3b 0a 20 20 20 20 20  [i] : "");.     
c760: 20 20 20 20 20 20 20 69 66 28 20 77 3c 31 30 20         if( w<10 
c770: 29 20 77 20 3d 20 31 30 3b 0a 20 20 20 20 20 20  ) w = 10;.      
c780: 20 20 20 20 20 20 6e 20 3d 20 73 74 72 6c 65 6e        n = strlen
c790: 43 68 61 72 28 61 7a 41 72 67 20 26 26 20 61 7a  Char(azArg && az
c7a0: 41 72 67 5b 69 5d 20 3f 20 61 7a 41 72 67 5b 69  Arg[i] ? azArg[i
c7b0: 5d 20 3a 20 70 2d 3e 6e 75 6c 6c 56 61 6c 75 65  ] : p->nullValue
c7c0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
c7d0: 66 28 20 77 3c 6e 20 29 20 77 20 3d 20 6e 3b 0a  f( w<n ) w = n;.
c7e0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
c7f0: 20 20 20 20 20 20 69 66 28 20 69 3c 41 72 72 61        if( i<Arra
c800: 79 53 69 7a 65 28 70 2d 3e 61 63 74 75 61 6c 57  ySize(p->actualW
c810: 69 64 74 68 29 20 29 7b 0a 20 20 20 20 20 20 20  idth) ){.       
c820: 20 20 20 20 20 70 2d 3e 61 63 74 75 61 6c 57 69       p->actualWi
c830: 64 74 68 5b 69 5d 20 3d 20 77 3b 0a 20 20 20 20  dth[i] = w;.    
c840: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
c850: 20 20 69 66 28 20 73 68 6f 77 48 64 72 20 29 7b    if( showHdr ){
c860: 0a 20 20 20 20 20 20 20 20 20 20 20 20 75 74 66  .            utf
c870: 38 5f 77 69 64 74 68 5f 70 72 69 6e 74 28 70 2d  8_width_print(p-
c880: 3e 6f 75 74 2c 20 77 2c 20 61 7a 43 6f 6c 5b 69  >out, w, azCol[i
c890: 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ]);.            
c8a0: 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f  utf8_printf(p->o
c8b0: 75 74 2c 20 22 25 73 22 2c 20 69 3d 3d 6e 41 72  ut, "%s", i==nAr
c8c0: 67 2d 31 20 3f 20 72 6f 77 53 65 70 20 3a 20 22  g-1 ? rowSep : "
c8d0: 20 20 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20    ");.          
c8e0: 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
c8f0: 20 20 20 20 69 66 28 20 73 68 6f 77 48 64 72 20      if( showHdr 
c900: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72  ){.          for
c910: 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b  (i=0; i<nArg; i+
c920: 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +){.            
c930: 69 6e 74 20 77 3b 0a 20 20 20 20 20 20 20 20 20  int w;.         
c940: 20 20 20 69 66 28 20 69 3c 41 72 72 61 79 53 69     if( i<ArraySi
c950: 7a 65 28 70 2d 3e 61 63 74 75 61 6c 57 69 64 74  ze(p->actualWidt
c960: 68 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  h) ){.          
c970: 20 20 20 20 20 77 20 3d 20 70 2d 3e 61 63 74 75       w = p->actu
c980: 61 6c 57 69 64 74 68 5b 69 5d 3b 0a 20 20 20 20  alWidth[i];.    
c990: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 77             if( w
c9a0: 3c 30 20 29 20 77 20 3d 20 2d 77 3b 0a 20 20 20  <0 ) w = -w;.   
c9b0: 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
c9c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77                 w
c9d0: 20 3d 20 31 30 3b 0a 20 20 20 20 20 20 20 20 20   = 10;.         
c9e0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
c9f0: 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e   utf8_printf(p->
ca00: 6f 75 74 2c 22 25 2d 2a 2e 2a 73 25 73 22 2c 77  out,"%-*.*s%s",w
ca10: 2c 77 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ,w,.            
ca20: 20 20 20 20 20 20 20 22 2d 2d 2d 2d 2d 2d 2d 2d         "--------
ca30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ca40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ca50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ca60: 2d 2d 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  --".            
ca70: 20 20 20 20 20 20 20 22 2d 2d 2d 2d 2d 2d 2d 2d         "--------
ca80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ca90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
caa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cab0: 2d 2d 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  --",.           
cac0: 20 20 20 20 20 20 20 20 20 69 3d 3d 6e 41 72 67           i==nArg
cad0: 2d 31 20 3f 20 72 6f 77 53 65 70 20 3a 20 22 20  -1 ? rowSep : " 
cae0: 20 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d   ");.          }
caf0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
cb00: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 61 7a 41   }.      if( azA
cb10: 72 67 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  rg==0 ) break;. 
cb20: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
cb30: 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nArg; i++){.    
cb40: 20 20 20 20 69 6e 74 20 77 3b 0a 20 20 20 20 20      int w;.     
cb50: 20 20 20 69 66 28 20 69 3c 41 72 72 61 79 53 69     if( i<ArraySi
cb60: 7a 65 28 70 2d 3e 61 63 74 75 61 6c 57 69 64 74  ze(p->actualWidt
cb70: 68 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  h) ){.          
cb80: 20 77 20 3d 20 70 2d 3e 61 63 74 75 61 6c 57 69   w = p->actualWi
cb90: 64 74 68 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20  dth[i];.        
cba0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
cbb0: 20 20 77 20 3d 20 31 30 3b 0a 20 20 20 20 20 20    w = 10;.      
cbc0: 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
cbd0: 70 2d 3e 63 4d 6f 64 65 3d 3d 4d 4f 44 45 5f 45  p->cMode==MODE_E
cbe0: 78 70 6c 61 69 6e 20 26 26 20 61 7a 41 72 67 5b  xplain && azArg[
cbf0: 69 5d 20 26 26 20 73 74 72 6c 65 6e 43 68 61 72  i] && strlenChar
cc00: 28 61 7a 41 72 67 5b 69 5d 29 3e 77 20 29 7b 0a  (azArg[i])>w ){.
cc10: 20 20 20 20 20 20 20 20 20 20 77 20 3d 20 73 74            w = st
cc20: 72 6c 65 6e 43 68 61 72 28 61 7a 41 72 67 5b 69  rlenChar(azArg[i
cc30: 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ]);.        }.  
cc40: 20 20 20 20 20 20 69 66 28 20 69 3d 3d 31 20 26        if( i==1 &
cc50: 26 20 70 2d 3e 61 69 49 6e 64 65 6e 74 20 26 26  & p->aiIndent &&
cc60: 20 70 2d 3e 70 53 74 6d 74 20 29 7b 0a 20 20 20   p->pStmt ){.   
cc70: 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 69 49         if( p->iI
cc80: 6e 64 65 6e 74 3c 70 2d 3e 6e 49 6e 64 65 6e 74  ndent<p->nIndent
cc90: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
cca0: 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f  utf8_printf(p->o
ccb0: 75 74 2c 20 22 25 2a 2e 73 22 2c 20 70 2d 3e 61  ut, "%*.s", p->a
ccc0: 69 49 6e 64 65 6e 74 5b 70 2d 3e 69 49 6e 64 65  iIndent[p->iInde
ccd0: 6e 74 5d 2c 20 22 22 29 3b 0a 20 20 20 20 20 20  nt], "");.      
cce0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
ccf0: 70 2d 3e 69 49 6e 64 65 6e 74 2b 2b 3b 0a 20 20  p->iIndent++;.  
cd00: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
cd10: 75 74 66 38 5f 77 69 64 74 68 5f 70 72 69 6e 74  utf8_width_print
cd20: 28 70 2d 3e 6f 75 74 2c 20 77 2c 20 61 7a 41 72  (p->out, w, azAr
cd30: 67 5b 69 5d 20 3f 20 61 7a 41 72 67 5b 69 5d 20  g[i] ? azArg[i] 
cd40: 3a 20 70 2d 3e 6e 75 6c 6c 56 61 6c 75 65 29 3b  : p->nullValue);
cd50: 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72  .        utf8_pr
cd60: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73  intf(p->out, "%s
cd70: 22 2c 20 69 3d 3d 6e 41 72 67 2d 31 20 3f 20 72  ", i==nArg-1 ? r
cd80: 6f 77 53 65 70 20 3a 20 22 20 20 22 29 3b 0a 20  owSep : "  ");. 
cd90: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
cda0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
cdb0: 73 65 20 4d 4f 44 45 5f 53 65 6d 69 3a 20 7b 20  se MODE_Semi: { 
cdc0: 20 20 2f 2a 20 2e 73 63 68 65 6d 61 20 61 6e 64    /* .schema and
cdd0: 20 2e 66 75 6c 6c 73 63 68 65 6d 61 20 6f 75 74   .fullschema out
cde0: 70 75 74 20 2a 2f 0a 20 20 20 20 20 20 70 72 69  put */.      pri
cdf0: 6e 74 53 63 68 65 6d 61 4c 69 6e 65 28 70 2d 3e  ntSchemaLine(p->
ce00: 6f 75 74 2c 20 61 7a 41 72 67 5b 30 5d 2c 20 22  out, azArg[0], "
ce10: 3b 5c 6e 22 29 3b 0a 20 20 20 20 20 20 62 72 65  ;\n");.      bre
ce20: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
ce30: 73 65 20 4d 4f 44 45 5f 50 72 65 74 74 79 3a 20  se MODE_Pretty: 
ce40: 7b 20 20 2f 2a 20 2e 73 63 68 65 6d 61 20 61 6e  {  /* .schema an
ce50: 64 20 2e 66 75 6c 6c 73 63 68 65 6d 61 20 77 69  d .fullschema wi
ce60: 74 68 20 2d 2d 69 6e 64 65 6e 74 20 2a 2f 0a 20  th --indent */. 
ce70: 20 20 20 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20       char *z;.  
ce80: 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20      int j;.     
ce90: 20 69 6e 74 20 6e 50 61 72 65 6e 20 3d 20 30 3b   int nParen = 0;
cea0: 0a 20 20 20 20 20 20 63 68 61 72 20 63 45 6e 64  .      char cEnd
ceb0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 63 68 61 72   = 0;.      char
cec0: 20 63 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4c   c;.      int nL
ced0: 69 6e 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 61  ine = 0;.      a
cee0: 73 73 65 72 74 28 20 6e 41 72 67 3d 3d 31 20 29  ssert( nArg==1 )
cef0: 3b 0a 20 20 20 20 20 20 69 66 28 20 61 7a 41 72  ;.      if( azAr
cf00: 67 5b 30 5d 3d 3d 30 20 29 20 62 72 65 61 6b 3b  g[0]==0 ) break;
cf10: 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
cf20: 65 33 5f 73 74 72 6c 69 6b 65 28 22 43 52 45 41  e3_strlike("CREA
cf30: 54 45 20 56 49 45 57 25 22 2c 20 61 7a 41 72 67  TE VIEW%", azArg
cf40: 5b 30 5d 2c 20 30 29 3d 3d 30 0a 20 20 20 20 20  [0], 0)==0.     
cf50: 20 20 7c 7c 20 73 71 6c 69 74 65 33 5f 73 74 72    || sqlite3_str
cf60: 6c 69 6b 65 28 22 43 52 45 41 54 45 20 54 52 49  like("CREATE TRI
cf70: 47 25 22 2c 20 61 7a 41 72 67 5b 30 5d 2c 20 30  G%", azArg[0], 0
cf80: 29 3d 3d 30 0a 20 20 20 20 20 20 29 7b 0a 20 20  )==0.      ){.  
cf90: 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
cfa0: 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 3b 5c 6e  f(p->out, "%s;\n
cfb0: 22 2c 20 61 7a 41 72 67 5b 30 5d 29 3b 0a 20 20  ", azArg[0]);.  
cfc0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
cfd0: 20 20 20 7d 0a 20 20 20 20 20 20 7a 20 3d 20 73     }.      z = s
cfe0: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
cff0: 25 73 22 2c 20 61 7a 41 72 67 5b 30 5d 29 3b 0a  %s", azArg[0]);.
d000: 20 20 20 20 20 20 6a 20 3d 20 30 3b 0a 20 20 20        j = 0;.   
d010: 20 20 20 66 6f 72 28 69 3d 30 3b 20 49 73 53 70     for(i=0; IsSp
d020: 61 63 65 28 7a 5b 69 5d 29 3b 20 69 2b 2b 29 7b  ace(z[i]); i++){
d030: 7d 0a 20 20 20 20 20 20 66 6f 72 28 3b 20 28 63  }.      for(; (c
d040: 20 3d 20 7a 5b 69 5d 29 21 3d 30 3b 20 69 2b 2b   = z[i])!=0; i++
d050: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 49  ){.        if( I
d060: 73 53 70 61 63 65 28 63 29 20 29 7b 0a 20 20 20  sSpace(c) ){.   
d070: 20 20 20 20 20 20 20 69 66 28 20 7a 5b 6a 2d 31         if( z[j-1
d080: 5d 3d 3d 27 5c 72 27 20 29 20 7a 5b 6a 2d 31 5d  ]=='\r' ) z[j-1]
d090: 20 3d 20 27 5c 6e 27 3b 0a 20 20 20 20 20 20 20   = '\n';.       
d0a0: 20 20 20 69 66 28 20 49 73 53 70 61 63 65 28 7a     if( IsSpace(z
d0b0: 5b 6a 2d 31 5d 29 20 7c 7c 20 7a 5b 6a 2d 31 5d  [j-1]) || z[j-1]
d0c0: 3d 3d 27 28 27 20 29 20 63 6f 6e 74 69 6e 75 65  =='(' ) continue
d0d0: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
d0e0: 69 66 28 20 28 63 3d 3d 27 28 27 20 7c 7c 20 63  if( (c=='(' || c
d0f0: 3d 3d 27 29 27 29 20 26 26 20 6a 3e 30 20 26 26  ==')') && j>0 &&
d100: 20 49 73 53 70 61 63 65 28 7a 5b 6a 2d 31 5d 29   IsSpace(z[j-1])
d110: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6a 2d   ){.          j-
d120: 2d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  -;.        }.   
d130: 20 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 63 3b       z[j++] = c;
d140: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 77  .      }.      w
d150: 68 69 6c 65 28 20 6a 3e 30 20 26 26 20 49 73 53  hile( j>0 && IsS
d160: 70 61 63 65 28 7a 5b 6a 2d 31 5d 29 20 29 7b 20  pace(z[j-1]) ){ 
d170: 6a 2d 2d 3b 20 7d 0a 20 20 20 20 20 20 7a 5b 6a  j--; }.      z[j
d180: 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28  ] = 0;.      if(
d190: 20 73 74 72 6c 65 6e 33 30 28 7a 29 3e 3d 37 39   strlen30(z)>=79
d1a0: 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28   ){.        for(
d1b0: 69 3d 6a 3d 30 3b 20 28 63 20 3d 20 7a 5b 69 5d  i=j=0; (c = z[i]
d1c0: 29 21 3d 30 3b 20 69 2b 2b 29 7b 20 20 2f 2a 20  )!=0; i++){  /* 
d1d0: 43 6f 70 79 20 63 68 61 6e 67 65 73 20 66 72 6f  Copy changes fro
d1e0: 6d 20 7a 5b 69 5d 20 62 61 63 6b 20 74 6f 20 7a  m z[i] back to z
d1f0: 5b 6a 5d 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  [j] */.         
d200: 20 69 66 28 20 63 3d 3d 63 45 6e 64 20 29 7b 0a   if( c==cEnd ){.
d210: 20 20 20 20 20 20 20 20 20 20 20 20 63 45 6e 64              cEnd
d220: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
d230: 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 22 27  }else if( c=='"'
d240: 20 7c 7c 20 63 3d 3d 27 5c 27 27 20 7c 7c 20 63   || c=='\'' || c
d250: 3d 3d 27 60 27 20 29 7b 0a 20 20 20 20 20 20 20  =='`' ){.       
d260: 20 20 20 20 20 63 45 6e 64 20 3d 20 63 3b 0a 20       cEnd = c;. 
d270: 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69           }else i
d280: 66 28 20 63 3d 3d 27 5b 27 20 29 7b 0a 20 20 20  f( c=='[' ){.   
d290: 20 20 20 20 20 20 20 20 20 63 45 6e 64 20 3d 20           cEnd = 
d2a0: 27 5d 27 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ']';.          }
d2b0: 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 2d 27 20  else if( c=='-' 
d2c0: 26 26 20 7a 5b 69 2b 31 5d 3d 3d 27 2d 27 20 29  && z[i+1]=='-' )
d2d0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 45  {.            cE
d2e0: 6e 64 20 3d 20 27 5c 6e 27 3b 0a 20 20 20 20 20  nd = '\n';.     
d2f0: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63       }else if( c
d300: 3d 3d 27 28 27 20 29 7b 0a 20 20 20 20 20 20 20  =='(' ){.       
d310: 20 20 20 20 20 6e 50 61 72 65 6e 2b 2b 3b 0a 20       nParen++;. 
d320: 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69           }else i
d330: 66 28 20 63 3d 3d 27 29 27 20 29 7b 0a 20 20 20  f( c==')' ){.   
d340: 20 20 20 20 20 20 20 20 20 6e 50 61 72 65 6e 2d           nParen-
d350: 2d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  -;.            i
d360: 66 28 20 6e 4c 69 6e 65 3e 30 20 26 26 20 6e 50  f( nLine>0 && nP
d370: 61 72 65 6e 3d 3d 30 20 26 26 20 6a 3e 30 20 29  aren==0 && j>0 )
d380: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
d390: 70 72 69 6e 74 53 63 68 65 6d 61 4c 69 6e 65 4e  printSchemaLineN
d3a0: 28 70 2d 3e 6f 75 74 2c 20 7a 2c 20 6a 2c 20 22  (p->out, z, j, "
d3b0: 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20  \n");.          
d3c0: 20 20 20 20 6a 20 3d 20 30 3b 0a 20 20 20 20 20      j = 0;.     
d3d0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
d3e0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7a     }.          z
d3f0: 5b 6a 2b 2b 5d 20 3d 20 63 3b 0a 20 20 20 20 20  [j++] = c;.     
d400: 20 20 20 20 20 69 66 28 20 6e 50 61 72 65 6e 3d       if( nParen=
d410: 3d 31 20 26 26 20 63 45 6e 64 3d 3d 30 0a 20 20  =1 && cEnd==0.  
d420: 20 20 20 20 20 20 20 20 20 26 26 20 28 63 3d 3d           && (c==
d430: 27 28 27 20 7c 7c 20 63 3d 3d 27 5c 6e 27 20 7c  '(' || c=='\n' |
d440: 7c 20 28 63 3d 3d 27 2c 27 20 26 26 20 21 77 73  | (c==',' && !ws
d450: 54 6f 45 6f 6c 28 7a 2b 69 2b 31 29 29 29 0a 20  ToEol(z+i+1))). 
d460: 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20           ){.    
d470: 20 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27          if( c=='
d480: 5c 6e 27 20 29 20 6a 2d 2d 3b 0a 20 20 20 20 20  \n' ) j--;.     
d490: 20 20 20 20 20 20 20 70 72 69 6e 74 53 63 68 65         printSche
d4a0: 6d 61 4c 69 6e 65 4e 28 70 2d 3e 6f 75 74 2c 20  maLineN(p->out, 
d4b0: 7a 2c 20 6a 2c 20 22 5c 6e 20 20 22 29 3b 0a 20  z, j, "\n  ");. 
d4c0: 20 20 20 20 20 20 20 20 20 20 20 6a 20 3d 20 30             j = 0
d4d0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e 4c  ;.            nL
d4e0: 69 6e 65 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  ine++;.         
d4f0: 20 20 20 77 68 69 6c 65 28 20 49 73 53 70 61 63     while( IsSpac
d500: 65 28 7a 5b 69 2b 31 5d 29 20 29 7b 20 69 2b 2b  e(z[i+1]) ){ i++
d510: 3b 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ; }.          }.
d520: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
d530: 20 20 7a 5b 6a 5d 20 3d 20 30 3b 0a 20 20 20 20    z[j] = 0;.    
d540: 20 20 7d 0a 20 20 20 20 20 20 70 72 69 6e 74 53    }.      printS
d550: 63 68 65 6d 61 4c 69 6e 65 28 70 2d 3e 6f 75 74  chemaLine(p->out
d560: 2c 20 7a 2c 20 22 3b 5c 6e 22 29 3b 0a 20 20 20  , z, ";\n");.   
d570: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
d580: 7a 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  z);.      break;
d590: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
d5a0: 4d 4f 44 45 5f 4c 69 73 74 3a 20 7b 0a 20 20 20  MODE_List: {.   
d5b0: 20 20 20 69 66 28 20 70 2d 3e 63 6e 74 2b 2b 3d     if( p->cnt++=
d5c0: 3d 30 20 26 26 20 70 2d 3e 73 68 6f 77 48 65 61  =0 && p->showHea
d5d0: 64 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20 66  der ){.        f
d5e0: 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20  or(i=0; i<nArg; 
d5f0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
d600: 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f  utf8_printf(p->o
d610: 75 74 2c 22 25 73 25 73 22 2c 61 7a 43 6f 6c 5b  ut,"%s%s",azCol[
d620: 69 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  i],.            
d630: 20 20 20 20 20 20 69 3d 3d 6e 41 72 67 2d 31 20        i==nArg-1 
d640: 3f 20 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f  ? p->rowSeparato
d650: 72 20 3a 20 70 2d 3e 63 6f 6c 53 65 70 61 72 61  r : p->colSepara
d660: 74 6f 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  tor);.        }.
d670: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
d680: 28 20 61 7a 41 72 67 3d 3d 30 20 29 20 62 72 65  ( azArg==0 ) bre
d690: 61 6b 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  ak;.      for(i=
d6a0: 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b  0; i<nArg; i++){
d6b0: 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a  .        char *z
d6c0: 20 3d 20 61 7a 41 72 67 5b 69 5d 3b 0a 20 20 20   = azArg[i];.   
d6d0: 20 20 20 20 20 69 66 28 20 7a 3d 3d 30 20 29 20       if( z==0 ) 
d6e0: 7a 20 3d 20 70 2d 3e 6e 75 6c 6c 56 61 6c 75 65  z = p->nullValue
d6f0: 3b 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70  ;.        utf8_p
d700: 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25  rintf(p->out, "%
d710: 73 22 2c 20 7a 29 3b 0a 20 20 20 20 20 20 20 20  s", z);.        
d720: 69 66 28 20 69 3c 6e 41 72 67 2d 31 20 29 7b 0a  if( i<nArg-1 ){.
d730: 20 20 20 20 20 20 20 20 20 20 75 74 66 38 5f 70            utf8_p
d740: 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25  rintf(p->out, "%
d750: 73 22 2c 20 70 2d 3e 63 6f 6c 53 65 70 61 72 61  s", p->colSepara
d760: 74 6f 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  tor);.        }e
d770: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 75  lse{.          u
d780: 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  tf8_printf(p->ou
d790: 74 2c 20 22 25 73 22 2c 20 70 2d 3e 72 6f 77 53  t, "%s", p->rowS
d7a0: 65 70 61 72 61 74 6f 72 29 3b 0a 20 20 20 20 20  eparator);.     
d7b0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
d7c0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
d7d0: 20 20 20 20 63 61 73 65 20 4d 4f 44 45 5f 48 74      case MODE_Ht
d7e0: 6d 6c 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20  ml: {.      if( 
d7f0: 70 2d 3e 63 6e 74 2b 2b 3d 3d 30 20 26 26 20 70  p->cnt++==0 && p
d800: 2d 3e 73 68 6f 77 48 65 61 64 65 72 20 29 7b 0a  ->showHeader ){.
d810: 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e          raw_prin
d820: 74 66 28 70 2d 3e 6f 75 74 2c 22 3c 54 52 3e 22  tf(p->out,"<TR>"
d830: 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  );.        for(i
d840: 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29  =0; i<nArg; i++)
d850: 7b 0a 20 20 20 20 20 20 20 20 20 20 72 61 77 5f  {.          raw_
d860: 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 3c  printf(p->out,"<
d870: 54 48 3e 22 29 3b 0a 20 20 20 20 20 20 20 20 20  TH>");.         
d880: 20 6f 75 74 70 75 74 5f 68 74 6d 6c 5f 73 74 72   output_html_str
d890: 69 6e 67 28 70 2d 3e 6f 75 74 2c 20 61 7a 43 6f  ing(p->out, azCo
d8a0: 6c 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 20  l[i]);.         
d8b0: 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f   raw_printf(p->o
d8c0: 75 74 2c 22 3c 2f 54 48 3e 5c 6e 22 29 3b 0a 20  ut,"</TH>\n");. 
d8d0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
d8e0: 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f   raw_printf(p->o
d8f0: 75 74 2c 22 3c 2f 54 52 3e 5c 6e 22 29 3b 0a 20  ut,"</TR>\n");. 
d900: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
d910: 20 61 7a 41 72 67 3d 3d 30 20 29 20 62 72 65 61   azArg==0 ) brea
d920: 6b 3b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69  k;.      raw_pri
d930: 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 3c 54 52 3e  ntf(p->out,"<TR>
d940: 22 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  ");.      for(i=
d950: 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b  0; i<nArg; i++){
d960: 0a 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69  .        raw_pri
d970: 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 3c 54 44 3e  ntf(p->out,"<TD>
d980: 22 29 3b 0a 20 20 20 20 20 20 20 20 6f 75 74 70  ");.        outp
d990: 75 74 5f 68 74 6d 6c 5f 73 74 72 69 6e 67 28 70  ut_html_string(p
d9a0: 2d 3e 6f 75 74 2c 20 61 7a 41 72 67 5b 69 5d 20  ->out, azArg[i] 
d9b0: 3f 20 61 7a 41 72 67 5b 69 5d 20 3a 20 70 2d 3e  ? azArg[i] : p->
d9c0: 6e 75 6c 6c 56 61 6c 75 65 29 3b 0a 20 20 20 20  nullValue);.    
d9d0: 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70      raw_printf(p
d9e0: 2d 3e 6f 75 74 2c 22 3c 2f 54 44 3e 5c 6e 22 29  ->out,"</TD>\n")
d9f0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
da00: 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  raw_printf(p->ou
da10: 74 2c 22 3c 2f 54 52 3e 5c 6e 22 29 3b 0a 20 20  t,"</TR>\n");.  
da20: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
da30: 0a 20 20 20 20 63 61 73 65 20 4d 4f 44 45 5f 54  .    case MODE_T
da40: 63 6c 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20  cl: {.      if( 
da50: 70 2d 3e 63 6e 74 2b 2b 3d 3d 30 20 26 26 20 70  p->cnt++==0 && p
da60: 2d 3e 73 68 6f 77 48 65 61 64 65 72 20 29 7b 0a  ->showHeader ){.
da70: 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
da80: 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20   i<nArg; i++){. 
da90: 20 20 20 20 20 20 20 20 20 6f 75 74 70 75 74 5f           output_
daa0: 63 5f 73 74 72 69 6e 67 28 70 2d 3e 6f 75 74 2c  c_string(p->out,
dab0: 61 7a 43 6f 6c 5b 69 5d 20 3f 20 61 7a 43 6f 6c  azCol[i] ? azCol
dac0: 5b 69 5d 20 3a 20 22 22 29 3b 0a 20 20 20 20 20  [i] : "");.     
dad0: 20 20 20 20 20 69 66 28 69 3c 6e 41 72 67 2d 31       if(i<nArg-1
dae0: 29 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d  ) utf8_printf(p-
daf0: 3e 6f 75 74 2c 20 22 25 73 22 2c 20 70 2d 3e 63  >out, "%s", p->c
db00: 6f 6c 53 65 70 61 72 61 74 6f 72 29 3b 0a 20 20  olSeparator);.  
db10: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
db20: 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f  utf8_printf(p->o
db30: 75 74 2c 20 22 25 73 22 2c 20 70 2d 3e 72 6f 77  ut, "%s", p->row
db40: 53 65 70 61 72 61 74 6f 72 29 3b 0a 20 20 20 20  Separator);.    
db50: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 61 7a    }.      if( az
db60: 41 72 67 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  Arg==0 ) break;.
db70: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
db80: 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nArg; i++){.   
db90: 20 20 20 20 20 6f 75 74 70 75 74 5f 63 5f 73 74       output_c_st
dba0: 72 69 6e 67 28 70 2d 3e 6f 75 74 2c 20 61 7a 41  ring(p->out, azA
dbb0: 72 67 5b 69 5d 20 3f 20 61 7a 41 72 67 5b 69 5d  rg[i] ? azArg[i]
dbc0: 20 3a 20 70 2d 3e 6e 75 6c 6c 56 61 6c 75 65 29   : p->nullValue)
dbd0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 69 3c 6e  ;.        if(i<n
dbe0: 41 72 67 2d 31 29 20 75 74 66 38 5f 70 72 69 6e  Arg-1) utf8_prin
dbf0: 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c  tf(p->out, "%s",
dc00: 20 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72   p->colSeparator
dc10: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
dc20: 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e   utf8_printf(p->
dc30: 6f 75 74 2c 20 22 25 73 22 2c 20 70 2d 3e 72 6f  out, "%s", p->ro
dc40: 77 53 65 70 61 72 61 74 6f 72 29 3b 0a 20 20 20  wSeparator);.   
dc50: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
dc60: 20 20 20 20 63 61 73 65 20 4d 4f 44 45 5f 43 73      case MODE_Cs
dc70: 76 3a 20 7b 0a 20 20 20 20 20 20 73 65 74 42 69  v: {.      setBi
dc80: 6e 61 72 79 4d 6f 64 65 28 70 2d 3e 6f 75 74 2c  naryMode(p->out,
dc90: 20 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70   1);.      if( p
dca0: 2d 3e 63 6e 74 2b 2b 3d 3d 30 20 26 26 20 70 2d  ->cnt++==0 && p-
dcb0: 3e 73 68 6f 77 48 65 61 64 65 72 20 29 7b 0a 20  >showHeader ){. 
dcc0: 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20         for(i=0; 
dcd0: 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20  i<nArg; i++){.  
dce0: 20 20 20 20 20 20 20 20 6f 75 74 70 75 74 5f 63          output_c
dcf0: 73 76 28 70 2c 20 61 7a 43 6f 6c 5b 69 5d 20 3f  sv(p, azCol[i] ?
dd00: 20 61 7a 43 6f 6c 5b 69 5d 20 3a 20 22 22 2c 20   azCol[i] : "", 
dd10: 69 3c 6e 41 72 67 2d 31 29 3b 0a 20 20 20 20 20  i<nArg-1);.     
dd20: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 75 74 66     }.        utf
dd30: 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  8_printf(p->out,
dd40: 20 22 25 73 22 2c 20 70 2d 3e 72 6f 77 53 65 70   "%s", p->rowSep
dd50: 61 72 61 74 6f 72 29 3b 0a 20 20 20 20 20 20 7d  arator);.      }
dd60: 0a 20 20 20 20 20 20 69 66 28 20 6e 41 72 67 3e  .      if( nArg>
dd70: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6f 72  0 ){.        for
dd80: 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b  (i=0; i<nArg; i+
dd90: 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6f 75  +){.          ou
dda0: 74 70 75 74 5f 63 73 76 28 70 2c 20 61 7a 41 72  tput_csv(p, azAr
ddb0: 67 5b 69 5d 2c 20 69 3c 6e 41 72 67 2d 31 29 3b  g[i], i<nArg-1);
ddc0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
ddd0: 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70     utf8_printf(p
dde0: 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20 70 2d 3e  ->out, "%s", p->
ddf0: 72 6f 77 53 65 70 61 72 61 74 6f 72 29 3b 0a 20  rowSeparator);. 
de00: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 65 74       }.      set
de10: 54 65 78 74 4d 6f 64 65 28 70 2d 3e 6f 75 74 2c  TextMode(p->out,
de20: 20 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b   1);.      break
de30: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
de40: 20 4d 4f 44 45 5f 49 6e 73 65 72 74 3a 20 7b 0a   MODE_Insert: {.
de50: 20 20 20 20 20 20 69 66 28 20 61 7a 41 72 67 3d        if( azArg=
de60: 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
de70: 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d    utf8_printf(p-
de80: 3e 6f 75 74 2c 22 49 4e 53 45 52 54 20 49 4e 54  >out,"INSERT INT
de90: 4f 20 25 73 22 2c 70 2d 3e 7a 44 65 73 74 54 61  O %s",p->zDestTa
dea0: 62 6c 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ble);.      if( 
deb0: 70 2d 3e 73 68 6f 77 48 65 61 64 65 72 20 29 7b  p->showHeader ){
dec0: 0a 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69  .        raw_pri
ded0: 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 28 22 29 3b  ntf(p->out,"(");
dee0: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30  .        for(i=0
def0: 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a  ; i<nArg; i++){.
df00: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 3e            if( i>
df10: 30 20 29 20 72 61 77 5f 70 72 69 6e 74 66 28 70  0 ) raw_printf(p
df20: 2d 3e 6f 75 74 2c 20 22 2c 22 29 3b 0a 20 20 20  ->out, ",");.   
df30: 20 20 20 20 20 20 20 69 66 28 20 71 75 6f 74 65         if( quote
df40: 43 68 61 72 28 61 7a 43 6f 6c 5b 69 5d 29 20 29  Char(azCol[i]) )
df50: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 68  {.            ch
df60: 61 72 20 2a 7a 20 3d 20 73 71 6c 69 74 65 33 5f  ar *z = sqlite3_
df70: 6d 70 72 69 6e 74 66 28 22 5c 22 25 77 5c 22 22  mprintf("\"%w\""
df80: 2c 20 61 7a 43 6f 6c 5b 69 5d 29 3b 0a 20 20 20  , azCol[i]);.   
df90: 20 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72           utf8_pr
dfa0: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73  intf(p->out, "%s
dfb0: 22 2c 20 7a 29 3b 0a 20 20 20 20 20 20 20 20 20  ", z);.         
dfc0: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
dfd0: 7a 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  z);.          }e
dfe0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
dff0: 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f   raw_printf(p->o
e000: 75 74 2c 20 22 25 73 22 2c 20 61 7a 43 6f 6c 5b  ut, "%s", azCol[
e010: 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  i]);.          }
e020: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
e030: 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d     raw_printf(p-
e040: 3e 6f 75 74 2c 22 29 22 29 3b 0a 20 20 20 20 20  >out,")");.     
e050: 20 7d 0a 20 20 20 20 20 20 70 2d 3e 63 6e 74 2b   }.      p->cnt+
e060: 2b 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  +;.      for(i=0
e070: 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a  ; i<nArg; i++){.
e080: 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e          raw_prin
e090: 74 66 28 70 2d 3e 6f 75 74 2c 20 69 3e 30 20 3f  tf(p->out, i>0 ?
e0a0: 20 22 2c 22 20 3a 20 22 20 56 41 4c 55 45 53 28   "," : " VALUES(
e0b0: 22 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ");.        if( 
e0c0: 28 61 7a 41 72 67 5b 69 5d 3d 3d 30 29 20 7c 7c  (azArg[i]==0) ||
e0d0: 20 28 61 69 54 79 70 65 20 26 26 20 61 69 54 79   (aiType && aiTy
e0e0: 70 65 5b 69 5d 3d 3d 53 51 4c 49 54 45 5f 4e 55  pe[i]==SQLITE_NU
e0f0: 4c 4c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  LL) ){.         
e100: 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e   utf8_printf(p->
e110: 6f 75 74 2c 22 4e 55 4c 4c 22 29 3b 0a 20 20 20  out,"NULL");.   
e120: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 61       }else if( a
e130: 69 54 79 70 65 20 26 26 20 61 69 54 79 70 65 5b  iType && aiType[
e140: 69 5d 3d 3d 53 51 4c 49 54 45 5f 54 45 58 54 20  i]==SQLITE_TEXT 
e150: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
e160: 20 53 68 65 6c 6c 48 61 73 46 6c 61 67 28 70 2c   ShellHasFlag(p,
e170: 20 53 48 46 4c 47 5f 4e 65 77 6c 69 6e 65 73 29   SHFLG_Newlines)
e180: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
e190: 6f 75 74 70 75 74 5f 71 75 6f 74 65 64 5f 73 74  output_quoted_st
e1a0: 72 69 6e 67 28 70 2d 3e 6f 75 74 2c 20 61 7a 41  ring(p->out, azA
e1b0: 72 67 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20  rg[i]);.        
e1c0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
e1d0: 20 20 20 20 20 6f 75 74 70 75 74 5f 71 75 6f 74       output_quot
e1e0: 65 64 5f 65 73 63 61 70 65 64 5f 73 74 72 69 6e  ed_escaped_strin
e1f0: 67 28 70 2d 3e 6f 75 74 2c 20 61 7a 41 72 67 5b  g(p->out, azArg[
e200: 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  i]);.          }
e210: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
e220: 66 28 20 61 69 54 79 70 65 20 26 26 20 61 69 54  f( aiType && aiT
e230: 79 70 65 5b 69 5d 3d 3d 53 51 4c 49 54 45 5f 49  ype[i]==SQLITE_I
e240: 4e 54 45 47 45 52 20 29 7b 0a 20 20 20 20 20 20  NTEGER ){.      
e250: 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
e260: 70 2d 3e 6f 75 74 2c 22 25 73 22 2c 20 61 7a 41  p->out,"%s", azA
e270: 72 67 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20  rg[i]);.        
e280: 7d 65 6c 73 65 20 69 66 28 20 61 69 54 79 70 65  }else if( aiType
e290: 20 26 26 20 61 69 54 79 70 65 5b 69 5d 3d 3d 53   && aiType[i]==S
e2a0: 51 4c 49 54 45 5f 46 4c 4f 41 54 20 29 7b 0a 20  QLITE_FLOAT ){. 
e2b0: 20 20 20 20 20 20 20 20 20 63 68 61 72 20 7a 5b           char z[
e2c0: 35 30 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 64  50];.          d
e2d0: 6f 75 62 6c 65 20 72 20 3d 20 73 71 6c 69 74 65  ouble r = sqlite
e2e0: 33 5f 63 6f 6c 75 6d 6e 5f 64 6f 75 62 6c 65 28  3_column_double(
e2f0: 70 2d 3e 70 53 74 6d 74 2c 20 69 29 3b 0a 20 20  p->pStmt, i);.  
e300: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
e310: 73 6e 70 72 69 6e 74 66 28 35 30 2c 7a 2c 22 25  snprintf(50,z,"%
e320: 21 2e 32 30 67 22 2c 20 72 29 3b 0a 20 20 20 20  !.20g", r);.    
e330: 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
e340: 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20 7a  (p->out, "%s", z
e350: 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
e360: 20 69 66 28 20 61 69 54 79 70 65 20 26 26 20 61   if( aiType && a
e370: 69 54 79 70 65 5b 69 5d 3d 3d 53 51 4c 49 54 45  iType[i]==SQLITE
e380: 5f 42 4c 4f 42 20 26 26 20 70 2d 3e 70 53 74 6d  _BLOB && p->pStm
e390: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63  t ){.          c
e3a0: 6f 6e 73 74 20 76 6f 69 64 20 2a 70 42 6c 6f 62  onst void *pBlob
e3b0: 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
e3c0: 6e 5f 62 6c 6f 62 28 70 2d 3e 70 53 74 6d 74 2c  n_blob(p->pStmt,
e3d0: 20 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69   i);.          i
e3e0: 6e 74 20 6e 42 6c 6f 62 20 3d 20 73 71 6c 69 74  nt nBlob = sqlit
e3f0: 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 28  e3_column_bytes(
e400: 70 2d 3e 70 53 74 6d 74 2c 20 69 29 3b 0a 20 20  p->pStmt, i);.  
e410: 20 20 20 20 20 20 20 20 6f 75 74 70 75 74 5f 68          output_h
e420: 65 78 5f 62 6c 6f 62 28 70 2d 3e 6f 75 74 2c 20  ex_blob(p->out, 
e430: 70 42 6c 6f 62 2c 20 6e 42 6c 6f 62 29 3b 0a 20  pBlob, nBlob);. 
e440: 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
e450: 20 69 73 4e 75 6d 62 65 72 28 61 7a 41 72 67 5b   isNumber(azArg[
e460: 69 5d 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20  i], 0) ){.      
e470: 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
e480: 70 2d 3e 6f 75 74 2c 22 25 73 22 2c 20 61 7a 41  p->out,"%s", azA
e490: 72 67 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20  rg[i]);.        
e4a0: 7d 65 6c 73 65 20 69 66 28 20 53 68 65 6c 6c 48  }else if( ShellH
e4b0: 61 73 46 6c 61 67 28 70 2c 20 53 48 46 4c 47 5f  asFlag(p, SHFLG_
e4c0: 4e 65 77 6c 69 6e 65 73 29 20 29 7b 0a 20 20 20  Newlines) ){.   
e4d0: 20 20 20 20 20 20 20 6f 75 74 70 75 74 5f 71 75         output_qu
e4e0: 6f 74 65 64 5f 73 74 72 69 6e 67 28 70 2d 3e 6f  oted_string(p->o
e4f0: 75 74 2c 20 61 7a 41 72 67 5b 69 5d 29 3b 0a 20  ut, azArg[i]);. 
e500: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
e510: 20 20 20 20 20 20 20 20 6f 75 74 70 75 74 5f 71          output_q
e520: 75 6f 74 65 64 5f 65 73 63 61 70 65 64 5f 73 74  uoted_escaped_st
e530: 72 69 6e 67 28 70 2d 3e 6f 75 74 2c 20 61 7a 41  ring(p->out, azA
e540: 72 67 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20  rg[i]);.        
e550: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
e560: 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  raw_printf(p->ou
e570: 74 2c 22 29 3b 5c 6e 22 29 3b 0a 20 20 20 20 20  t,");\n");.     
e580: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
e590: 20 20 63 61 73 65 20 4d 4f 44 45 5f 51 75 6f 74    case MODE_Quot
e5a0: 65 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 61  e: {.      if( a
e5b0: 7a 41 72 67 3d 3d 30 20 29 20 62 72 65 61 6b 3b  zArg==0 ) break;
e5c0: 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 63 6e  .      if( p->cn
e5d0: 74 3d 3d 30 20 26 26 20 70 2d 3e 73 68 6f 77 48  t==0 && p->showH
e5e0: 65 61 64 65 72 20 29 7b 0a 20 20 20 20 20 20 20  eader ){.       
e5f0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67   for(i=0; i<nArg
e600: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
e610: 20 20 69 66 28 20 69 3e 30 20 29 20 72 61 77 5f    if( i>0 ) raw_
e620: 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
e630: 2c 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6f  ,");.          o
e640: 75 74 70 75 74 5f 71 75 6f 74 65 64 5f 73 74 72  utput_quoted_str
e650: 69 6e 67 28 70 2d 3e 6f 75 74 2c 20 61 7a 43 6f  ing(p->out, azCo
e660: 6c 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d  l[i]);.        }
e670: 0a 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69  .        raw_pri
e680: 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 5c 6e 22 29  ntf(p->out,"\n")
e690: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
e6a0: 70 2d 3e 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20  p->cnt++;.      
e6b0: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b  for(i=0; i<nArg;
e6c0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   i++){.        i
e6d0: 66 28 20 69 3e 30 20 29 20 72 61 77 5f 70 72 69  f( i>0 ) raw_pri
e6e0: 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 2c 22 29  ntf(p->out, ",")
e6f0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 61  ;.        if( (a
e700: 7a 41 72 67 5b 69 5d 3d 3d 30 29 20 7c 7c 20 28  zArg[i]==0) || (
e710: 61 69 54 79 70 65 20 26 26 20 61 69 54 79 70 65  aiType && aiType
e720: 5b 69 5d 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c  [i]==SQLITE_NULL
e730: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75  ) ){.          u
e740: 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  tf8_printf(p->ou
e750: 74 2c 22 4e 55 4c 4c 22 29 3b 0a 20 20 20 20 20  t,"NULL");.     
e760: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 61 69 54     }else if( aiT
e770: 79 70 65 20 26 26 20 61 69 54 79 70 65 5b 69 5d  ype && aiType[i]
e780: 3d 3d 53 51 4c 49 54 45 5f 54 45 58 54 20 29 7b  ==SQLITE_TEXT ){
e790: 0a 20 20 20 20 20 20 20 20 20 20 6f 75 74 70 75  .          outpu
e7a0: 74 5f 71 75 6f 74 65 64 5f 73 74 72 69 6e 67 28  t_quoted_string(
e7b0: 70 2d 3e 6f 75 74 2c 20 61 7a 41 72 67 5b 69 5d  p->out, azArg[i]
e7c0: 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
e7d0: 20 69 66 28 20 61 69 54 79 70 65 20 26 26 20 61   if( aiType && a
e7e0: 69 54 79 70 65 5b 69 5d 3d 3d 53 51 4c 49 54 45  iType[i]==SQLITE
e7f0: 5f 49 4e 54 45 47 45 52 20 29 7b 0a 20 20 20 20  _INTEGER ){.    
e800: 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
e810: 66 28 70 2d 3e 6f 75 74 2c 22 25 73 22 2c 20 61  f(p->out,"%s", a
e820: 7a 41 72 67 5b 69 5d 29 3b 0a 20 20 20 20 20 20  zArg[i]);.      
e830: 20 20 7d 65 6c 73 65 20 69 66 28 20 61 69 54 79    }else if( aiTy
e840: 70 65 20 26 26 20 61 69 54 79 70 65 5b 69 5d 3d  pe && aiType[i]=
e850: 3d 53 51 4c 49 54 45 5f 46 4c 4f 41 54 20 29 7b  =SQLITE_FLOAT ){
e860: 0a 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20  .          char 
e870: 7a 5b 35 30 5d 3b 0a 20 20 20 20 20 20 20 20 20  z[50];.         
e880: 20 64 6f 75 62 6c 65 20 72 20 3d 20 73 71 6c 69   double r = sqli
e890: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 6f 75 62 6c  te3_column_doubl
e8a0: 65 28 70 2d 3e 70 53 74 6d 74 2c 20 69 29 3b 0a  e(p->pStmt, i);.
e8b0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
e8c0: 33 5f 73 6e 70 72 69 6e 74 66 28 35 30 2c 7a 2c  3_snprintf(50,z,
e8d0: 22 25 21 2e 32 30 67 22 2c 20 72 29 3b 0a 20 20  "%!.20g", r);.  
e8e0: 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e          raw_prin
e8f0: 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c  tf(p->out, "%s",
e900: 20 7a 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c   z);.        }el
e910: 73 65 20 69 66 28 20 61 69 54 79 70 65 20 26 26  se if( aiType &&
e920: 20 61 69 54 79 70 65 5b 69 5d 3d 3d 53 51 4c 49   aiType[i]==SQLI
e930: 54 45 5f 42 4c 4f 42 20 26 26 20 70 2d 3e 70 53  TE_BLOB && p->pS
e940: 74 6d 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  tmt ){.         
e950: 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 42 6c   const void *pBl
e960: 6f 62 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  ob = sqlite3_col
e970: 75 6d 6e 5f 62 6c 6f 62 28 70 2d 3e 70 53 74 6d  umn_blob(p->pStm
e980: 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20 20  t, i);.         
e990: 20 69 6e 74 20 6e 42 6c 6f 62 20 3d 20 73 71 6c   int nBlob = sql
e9a0: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65  ite3_column_byte
e9b0: 73 28 70 2d 3e 70 53 74 6d 74 2c 20 69 29 3b 0a  s(p->pStmt, i);.
e9c0: 20 20 20 20 20 20 20 20 20 20 6f 75 74 70 75 74            output
e9d0: 5f 68 65 78 5f 62 6c 6f 62 28 70 2d 3e 6f 75 74  _hex_blob(p->out
e9e0: 2c 20 70 42 6c 6f 62 2c 20 6e 42 6c 6f 62 29 3b  , pBlob, nBlob);
e9f0: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
ea00: 66 28 20 69 73 4e 75 6d 62 65 72 28 61 7a 41 72  f( isNumber(azAr
ea10: 67 5b 69 5d 2c 20 30 29 20 29 7b 0a 20 20 20 20  g[i], 0) ){.    
ea20: 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
ea30: 66 28 70 2d 3e 6f 75 74 2c 22 25 73 22 2c 20 61  f(p->out,"%s", a
ea40: 7a 41 72 67 5b 69 5d 29 3b 0a 20 20 20 20 20 20  zArg[i]);.      
ea50: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
ea60: 20 20 20 6f 75 74 70 75 74 5f 71 75 6f 74 65 64     output_quoted
ea70: 5f 73 74 72 69 6e 67 28 70 2d 3e 6f 75 74 2c 20  _string(p->out, 
ea80: 61 7a 41 72 67 5b 69 5d 29 3b 0a 20 20 20 20 20  azArg[i]);.     
ea90: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
eaa0: 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d     raw_printf(p-
eab0: 3e 6f 75 74 2c 22 5c 6e 22 29 3b 0a 20 20 20 20  >out,"\n");.    
eac0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
ead0: 20 20 20 63 61 73 65 20 4d 4f 44 45 5f 41 73 63     case MODE_Asc
eae0: 69 69 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20  ii: {.      if( 
eaf0: 70 2d 3e 63 6e 74 2b 2b 3d 3d 30 20 26 26 20 70  p->cnt++==0 && p
eb00: 2d 3e 73 68 6f 77 48 65 61 64 65 72 20 29 7b 0a  ->showHeader ){.
eb10: 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
eb20: 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20   i<nArg; i++){. 
eb30: 20 20 20 20 20 20 20 20 20 69 66 28 20 69 3e 30           if( i>0
eb40: 20 29 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70   ) utf8_printf(p
eb50: 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20 70 2d 3e  ->out, "%s", p->
eb60: 63 6f 6c 53 65 70 61 72 61 74 6f 72 29 3b 0a 20  colSeparator);. 
eb70: 20 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72           utf8_pr
eb80: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 25 73 22  intf(p->out,"%s"
eb90: 2c 61 7a 43 6f 6c 5b 69 5d 20 3f 20 61 7a 43 6f  ,azCol[i] ? azCo
eba0: 6c 5b 69 5d 20 3a 20 22 22 29 3b 0a 20 20 20 20  l[i] : "");.    
ebb0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 75 74      }.        ut
ebc0: 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  f8_printf(p->out
ebd0: 2c 20 22 25 73 22 2c 20 70 2d 3e 72 6f 77 53 65  , "%s", p->rowSe
ebe0: 70 61 72 61 74 6f 72 29 3b 0a 20 20 20 20 20 20  parator);.      
ebf0: 7d 0a 20 20 20 20 20 20 69 66 28 20 61 7a 41 72  }.      if( azAr
ec00: 67 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  g==0 ) break;.  
ec10: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
ec20: 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Arg; i++){.     
ec30: 20 20 20 69 66 28 20 69 3e 30 20 29 20 75 74 66     if( i>0 ) utf
ec40: 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  8_printf(p->out,
ec50: 20 22 25 73 22 2c 20 70 2d 3e 63 6f 6c 53 65 70   "%s", p->colSep
ec60: 61 72 61 74 6f 72 29 3b 0a 20 20 20 20 20 20 20  arator);.       
ec70: 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e   utf8_printf(p->
ec80: 6f 75 74 2c 22 25 73 22 2c 61 7a 41 72 67 5b 69  out,"%s",azArg[i
ec90: 5d 20 3f 20 61 7a 41 72 67 5b 69 5d 20 3a 20 70  ] ? azArg[i] : p
eca0: 2d 3e 6e 75 6c 6c 56 61 6c 75 65 29 3b 0a 20 20  ->nullValue);.  
ecb0: 20 20 20 20 7d 0a 20 20 20 20 20 20 75 74 66 38      }.      utf8
ecc0: 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
ecd0: 22 25 73 22 2c 20 70 2d 3e 72 6f 77 53 65 70 61  "%s", p->rowSepa
ece0: 72 61 74 6f 72 29 3b 0a 20 20 20 20 20 20 62 72  rator);.      br
ecf0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
ed00: 61 73 65 20 4d 4f 44 45 5f 45 51 50 3a 20 7b 0a  ase MODE_EQP: {.
ed10: 20 20 20 20 20 20 65 71 70 5f 61 70 70 65 6e 64        eqp_append
ed20: 28 70 2c 20 61 74 6f 69 28 61 7a 41 72 67 5b 30  (p, atoi(azArg[0
ed30: 5d 29 2c 20 61 74 6f 69 28 61 7a 41 72 67 5b 31  ]), atoi(azArg[1
ed40: 5d 29 2c 20 61 7a 41 72 67 5b 33 5d 29 3b 0a 20  ]), azArg[3]);. 
ed50: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
ed60: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  }.  }.  return 0
ed70: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
ed80: 69 73 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20  is the callback 
ed90: 72 6f 75 74 69 6e 65 20 74 68 61 74 20 74 68 65  routine that the
eda0: 20 53 51 4c 69 74 65 20 6c 69 62 72 61 72 79 0a   SQLite library.
edb0: 2a 2a 20 69 6e 76 6f 6b 65 73 20 66 6f 72 20 65  ** invokes for e
edc0: 61 63 68 20 72 6f 77 20 6f 66 20 61 20 71 75 65  ach row of a que
edd0: 72 79 20 72 65 73 75 6c 74 2e 0a 2a 2f 0a 73 74  ry result..*/.st
ede0: 61 74 69 63 20 69 6e 74 20 63 61 6c 6c 62 61 63  atic int callbac
edf0: 6b 28 76 6f 69 64 20 2a 70 41 72 67 2c 20 69 6e  k(void *pArg, in
ee00: 74 20 6e 41 72 67 2c 20 63 68 61 72 20 2a 2a 61  t nArg, char **a
ee10: 7a 41 72 67 2c 20 63 68 61 72 20 2a 2a 61 7a 43  zArg, char **azC
ee20: 6f 6c 29 7b 0a 20 20 2f 2a 20 73 69 6e 63 65 20  ol){.  /* since 
ee30: 77 65 20 64 6f 6e 27 74 20 68 61 76 65 20 74 79  we don't have ty
ee40: 70 65 20 69 6e 66 6f 2c 20 63 61 6c 6c 20 74 68  pe info, call th
ee50: 65 20 73 68 65 6c 6c 5f 63 61 6c 6c 62 61 63 6b  e shell_callback
ee60: 20 77 69 74 68 20 61 20 4e 55 4c 4c 20 76 61 6c   with a NULL val
ee70: 75 65 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 73  ue */.  return s
ee80: 68 65 6c 6c 5f 63 61 6c 6c 62 61 63 6b 28 70 41  hell_callback(pA
ee90: 72 67 2c 20 6e 41 72 67 2c 20 61 7a 41 72 67 2c  rg, nArg, azArg,
eea0: 20 61 7a 43 6f 6c 2c 20 4e 55 4c 4c 29 3b 0a 7d   azCol, NULL);.}
eeb0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ../*.** This is 
eec0: 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 72 6f 75  the callback rou
eed0: 74 69 6e 65 20 66 72 6f 6d 20 73 71 6c 69 74 65  tine from sqlite
eee0: 33 5f 65 78 65 63 28 29 20 74 68 61 74 20 61 70  3_exec() that ap
eef0: 70 65 6e 64 73 20 61 6c 6c 0a 2a 2a 20 6f 75 74  pends all.** out
ef00: 70 75 74 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64  put onto the end
ef10: 20 6f 66 20 61 20 53 68 65 6c 6c 54 65 78 74 20   of a ShellText 
ef20: 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69  object..*/.stati
ef30: 63 20 69 6e 74 20 63 61 70 74 75 72 65 4f 75 74  c int captureOut
ef40: 70 75 74 43 61 6c 6c 62 61 63 6b 28 76 6f 69 64  putCallback(void
ef50: 20 2a 70 41 72 67 2c 20 69 6e 74 20 6e 41 72 67   *pArg, int nArg
ef60: 2c 20 63 68 61 72 20 2a 2a 61 7a 41 72 67 2c 20  , char **azArg, 
ef70: 63 68 61 72 20 2a 2a 61 7a 29 7b 0a 20 20 53 68  char **az){.  Sh
ef80: 65 6c 6c 54 65 78 74 20 2a 70 20 3d 20 28 53 68  ellText *p = (Sh
ef90: 65 6c 6c 54 65 78 74 2a 29 70 41 72 67 3b 0a 20  ellText*)pArg;. 
efa0: 20 69 6e 74 20 69 3b 0a 20 20 55 4e 55 53 45 44   int i;.  UNUSED
efb0: 5f 50 41 52 41 4d 45 54 45 52 28 61 7a 29 3b 0a  _PARAMETER(az);.
efc0: 20 20 69 66 28 20 61 7a 41 72 67 3d 3d 30 20 29    if( azArg==0 )
efd0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
efe0: 20 70 2d 3e 6e 20 29 20 61 70 70 65 6e 64 54 65   p->n ) appendTe
eff0: 78 74 28 70 2c 20 22 7c 22 2c 20 30 29 3b 0a 20  xt(p, "|", 0);. 
f000: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67   for(i=0; i<nArg
f010: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
f020: 69 20 29 20 61 70 70 65 6e 64 54 65 78 74 28 70  i ) appendText(p
f030: 2c 20 22 2c 22 2c 20 30 29 3b 0a 20 20 20 20 69  , ",", 0);.    i
f040: 66 28 20 61 7a 41 72 67 5b 69 5d 20 29 20 61 70  f( azArg[i] ) ap
f050: 70 65 6e 64 54 65 78 74 28 70 2c 20 61 7a 41 72  pendText(p, azAr
f060: 67 5b 69 5d 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  g[i], 0);.  }.  
f070: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
f080: 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 6e 20 61  ** Generate an a
f090: 70 70 72 6f 70 72 69 61 74 65 20 53 45 4c 46 54  ppropriate SELFT
f0a0: 45 53 54 20 74 61 62 6c 65 20 69 6e 20 74 68 65  EST table in the
f0b0: 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 2e 0a   main database..
f0c0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
f0d0: 72 65 61 74 65 53 65 6c 66 74 65 73 74 54 61 62  reateSelftestTab
f0e0: 6c 65 28 53 68 65 6c 6c 53 74 61 74 65 20 2a 70  le(ShellState *p
f0f0: 29 7b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 4d  ){.  char *zErrM
f100: 73 67 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  sg = 0;.  sqlite
f110: 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c 0a 20 20  3_exec(p->db,.  
f120: 20 20 22 53 41 56 45 50 4f 49 4e 54 20 73 65 6c    "SAVEPOINT sel
f130: 66 74 65 73 74 5f 69 6e 69 74 3b 5c 6e 22 0a 20  ftest_init;\n". 
f140: 20 20 20 22 43 52 45 41 54 45 20 54 41 42 4c 45     "CREATE TABLE
f150: 20 49 46 20 4e 4f 54 20 45 58 49 53 54 53 20 73   IF NOT EXISTS s
f160: 65 6c 66 74 65 73 74 28 5c 6e 22 0a 20 20 20 20  elftest(\n".    
f170: 22 20 20 74 6e 6f 20 49 4e 54 45 47 45 52 20 50  "  tno INTEGER P
f180: 52 49 4d 41 52 59 20 4b 45 59 2c 5c 6e 22 20 20  RIMARY KEY,\n"  
f190: 20 2f 2a 20 54 65 73 74 20 6e 75 6d 62 65 72 20   /* Test number 
f1a0: 2a 2f 0a 20 20 20 20 22 20 20 6f 70 20 54 45 58  */.    "  op TEX
f1b0: 54 2c 5c 6e 22 20 20 20 20 20 20 20 20 20 20 20  T,\n"           
f1c0: 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 72 61          /* Opera
f1d0: 74 6f 72 3a 20 20 6d 65 6d 6f 20 72 75 6e 20 2a  tor:  memo run *
f1e0: 2f 0a 20 20 20 20 22 20 20 63 6d 64 20 54 45 58  /.    "  cmd TEX
f1f0: 54 2c 5c 6e 22 20 20 20 20 20 20 20 20 20 20 20  T,\n"           
f200: 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 6d 61 6e         /* Comman
f210: 64 20 74 65 78 74 20 2a 2f 0a 20 20 20 20 22 20  d text */.    " 
f220: 20 61 6e 73 20 54 45 58 54 5c 6e 22 20 20 20 20   ans TEXT\n"    
f230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
f240: 2a 20 44 65 73 69 72 65 64 20 61 6e 73 77 65 72  * Desired answer
f250: 20 2a 2f 0a 20 20 20 20 22 29 3b 22 0a 20 20 20   */.    ");".   
f260: 20 22 43 52 45 41 54 45 20 54 45 4d 50 20 54 41   "CREATE TEMP TA
f270: 42 4c 45 20 5b 5f 73 68 65 6c 6c 24 73 65 6c 66  BLE [_shell$self
f280: 5d 28 6f 70 2c 63 6d 64 2c 61 6e 73 29 3b 5c 6e  ](op,cmd,ans);\n
f290: 22 0a 20 20 20 20 22 49 4e 53 45 52 54 20 49 4e  ".    "INSERT IN
f2a0: 54 4f 20 5b 5f 73 68 65 6c 6c 24 73 65 6c 66 5d  TO [_shell$self]
f2b0: 28 72 6f 77 69 64 2c 6f 70 2c 63 6d 64 29 5c 6e  (rowid,op,cmd)\n
f2c0: 22 0a 20 20 20 20 22 20 20 56 41 4c 55 45 53 28  ".    "  VALUES(
f2d0: 63 6f 61 6c 65 73 63 65 28 28 53 45 4c 45 43 54  coalesce((SELECT
f2e0: 20 28 6d 61 78 28 74 6e 6f 29 2b 31 30 30 29 2f   (max(tno)+100)/
f2f0: 31 30 20 46 52 4f 4d 20 73 65 6c 66 74 65 73 74  10 FROM selftest
f300: 29 2c 31 30 29 2c 5c 6e 22 0a 20 20 20 20 22 20  ),10),\n".    " 
f310: 20 20 20 20 20 20 20 20 27 6d 65 6d 6f 27 2c 27          'memo','
f320: 54 65 73 74 73 20 67 65 6e 65 72 61 74 65 64 20  Tests generated 
f330: 62 79 20 2d 2d 69 6e 69 74 27 29 3b 5c 6e 22 0a  by --init');\n".
f340: 20 20 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f      "INSERT INTO
f350: 20 5b 5f 73 68 65 6c 6c 24 73 65 6c 66 5d 5c 6e   [_shell$self]\n
f360: 22 0a 20 20 20 20 22 20 20 53 45 4c 45 43 54 20  ".    "  SELECT 
f370: 27 72 75 6e 27 2c 5c 6e 22 0a 20 20 20 20 22 20  'run',\n".    " 
f380: 20 20 20 27 53 45 4c 45 43 54 20 68 65 78 28 73     'SELECT hex(s
f390: 68 61 33 5f 71 75 65 72 79 28 27 27 53 45 4c 45  ha3_query(''SELE
f3a0: 43 54 20 74 79 70 65 2c 6e 61 6d 65 2c 74 62 6c  CT type,name,tbl
f3b0: 5f 6e 61 6d 65 2c 73 71 6c 20 22 0a 20 20 20 20  _name,sql ".    
f3c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f3d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 46 52               "FR
f3e0: 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  OM sqlite_master
f3f0: 20 4f 52 44 45 52 20 42 59 20 32 27 27 2c 32 32   ORDER BY 2'',22
f400: 34 29 29 27 2c 5c 6e 22 0a 20 20 20 20 22 20 20  4))',\n".    "  
f410: 20 20 68 65 78 28 73 68 61 33 5f 71 75 65 72 79    hex(sha3_query
f420: 28 27 53 45 4c 45 43 54 20 74 79 70 65 2c 6e 61  ('SELECT type,na
f430: 6d 65 2c 74 62 6c 5f 6e 61 6d 65 2c 73 71 6c 20  me,tbl_name,sql 
f440: 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ".              
f450: 20 20 20 20 20 20 20 20 20 20 20 20 22 46 52 4f              "FRO
f460: 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  M sqlite_master 
f470: 4f 52 44 45 52 20 42 59 20 32 27 2c 32 32 34 29  ORDER BY 2',224)
f480: 29 3b 5c 6e 22 0a 20 20 20 20 22 49 4e 53 45 52  );\n".    "INSER
f490: 54 20 49 4e 54 4f 20 5b 5f 73 68 65 6c 6c 24 73  T INTO [_shell$s
f4a0: 65 6c 66 5d 5c 6e 22 0a 20 20 20 20 22 20 20 53  elf]\n".    "  S
f4b0: 45 4c 45 43 54 20 27 72 75 6e 27 2c 22 0a 20 20  ELECT 'run',".  
f4c0: 20 20 22 20 20 20 20 27 53 45 4c 45 43 54 20 68    "    'SELECT h
f4d0: 65 78 28 73 68 61 33 5f 71 75 65 72 79 28 27 27  ex(sha3_query(''
f4e0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 5c 22  SELECT * FROM \"
f4f0: 27 20 7c 7c 22 0a 20 20 20 20 22 20 20 20 20 20  ' ||".    "     
f500: 20 20 20 70 72 69 6e 74 66 28 27 25 77 27 2c 6e     printf('%w',n
f510: 61 6d 65 29 20 7c 7c 20 27 5c 22 20 4e 4f 54 20  ame) || '\" NOT 
f520: 49 4e 44 45 58 45 44 27 27 2c 32 32 34 29 29 27  INDEXED'',224))'
f530: 2c 5c 6e 22 0a 20 20 20 20 22 20 20 20 20 68 65  ,\n".    "    he
f540: 78 28 73 68 61 33 5f 71 75 65 72 79 28 70 72 69  x(sha3_query(pri
f550: 6e 74 66 28 27 53 45 4c 45 43 54 20 2a 20 46 52  ntf('SELECT * FR
f560: 4f 4d 20 5c 22 25 77 5c 22 20 4e 4f 54 20 49 4e  OM \"%w\" NOT IN
f570: 44 45 58 45 44 27 2c 6e 61 6d 65 29 2c 32 32 34  DEXED',name),224
f580: 29 29 5c 6e 22 0a 20 20 20 20 22 20 20 46 52 4f  ))\n".    "  FRO
f590: 4d 20 28 5c 6e 22 0a 20 20 20 20 22 20 20 20 20  M (\n".    "    
f5a0: 53 45 4c 45 43 54 20 6e 61 6d 65 20 46 52 4f 4d  SELECT name FROM
f5b0: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 5c 6e   sqlite_master\n
f5c0: 22 0a 20 20 20 20 22 20 20 20 20 20 57 48 45 52  ".    "     WHER
f5d0: 45 20 74 79 70 65 3d 27 74 61 62 6c 65 27 5c 6e  E type='table'\n
f5e0: 22 0a 20 20 20 20 22 20 20 20 20 20 20 20 41 4e  ".    "       AN
f5f0: 44 20 6e 61 6d 65 3c 3e 27 73 65 6c 66 74 65 73  D name<>'selftes
f600: 74 27 5c 6e 22 0a 20 20 20 20 22 20 20 20 20 20  t'\n".    "     
f610: 20 20 41 4e 44 20 63 6f 61 6c 65 73 63 65 28 72    AND coalesce(r
f620: 6f 6f 74 70 61 67 65 2c 30 29 3e 30 5c 6e 22 0a  ootpage,0)>0\n".
f630: 20 20 20 20 22 20 20 29 5c 6e 22 0a 20 20 20 20      "  )\n".    
f640: 22 20 4f 52 44 45 52 20 42 59 20 6e 61 6d 65 3b  " ORDER BY name;
f650: 5c 6e 22 0a 20 20 20 20 22 49 4e 53 45 52 54 20  \n".    "INSERT 
f660: 49 4e 54 4f 20 5b 5f 73 68 65 6c 6c 24 73 65 6c  INTO [_shell$sel
f670: 66 5d 5c 6e 22 0a 20 20 20 20 22 20 20 56 41 4c  f]\n".    "  VAL
f680: 55 45 53 28 27 72 75 6e 27 2c 27 50 52 41 47 4d  UES('run','PRAGM
f690: 41 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63  A integrity_chec
f6a0: 6b 27 2c 27 6f 6b 27 29 3b 5c 6e 22 0a 20 20 20  k','ok');\n".   
f6b0: 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 73 65   "INSERT INTO se
f6c0: 6c 66 74 65 73 74 28 74 6e 6f 2c 6f 70 2c 63 6d  lftest(tno,op,cm
f6d0: 64 2c 61 6e 73 29 22 0a 20 20 20 20 22 20 20 53  d,ans)".    "  S
f6e0: 45 4c 45 43 54 20 72 6f 77 69 64 2a 31 30 2c 6f  ELECT rowid*10,o
f6f0: 70 2c 63 6d 64 2c 61 6e 73 20 46 52 4f 4d 20 5b  p,cmd,ans FROM [
f700: 5f 73 68 65 6c 6c 24 73 65 6c 66 5d 3b 5c 6e 22  _shell$self];\n"
f710: 0a 20 20 20 20 22 44 52 4f 50 20 54 41 42 4c 45  .    "DROP TABLE
f720: 20 5b 5f 73 68 65 6c 6c 24 73 65 6c 66 5d 3b 22   [_shell$self];"
f730: 0a 20 20 20 20 2c 30 2c 30 2c 26 7a 45 72 72 4d  .    ,0,0,&zErrM
f740: 73 67 29 3b 0a 20 20 69 66 28 20 7a 45 72 72 4d  sg);.  if( zErrM
f750: 73 67 20 29 7b 0a 20 20 20 20 75 74 66 38 5f 70  sg ){.    utf8_p
f760: 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 53  rintf(stderr, "S
f770: 45 4c 46 54 45 53 54 20 69 6e 69 74 69 61 6c 69  ELFTEST initiali
f780: 7a 61 74 69 6f 6e 20 66 61 69 6c 75 72 65 3a 20  zation failure: 
f790: 25 73 5c 6e 22 2c 20 7a 45 72 72 4d 73 67 29 3b  %s\n", zErrMsg);
f7a0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
f7b0: 65 28 7a 45 72 72 4d 73 67 29 3b 0a 20 20 7d 0a  e(zErrMsg);.  }.
f7c0: 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70    sqlite3_exec(p
f7d0: 2d 3e 64 62 2c 20 22 52 45 4c 45 41 53 45 20 73  ->db, "RELEASE s
f7e0: 65 6c 66 74 65 73 74 5f 69 6e 69 74 22 2c 30 2c  elftest_init",0,
f7f0: 30 2c 30 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  0,0);.}.../*.** 
f800: 53 65 74 20 74 68 65 20 64 65 73 74 69 6e 61 74  Set the destinat
f810: 69 6f 6e 20 74 61 62 6c 65 20 66 69 65 6c 64 20  ion table field 
f820: 6f 66 20 74 68 65 20 53 68 65 6c 6c 53 74 61 74  of the ShellStat
f830: 65 20 73 74 72 75 63 74 75 72 65 20 74 6f 0a 2a  e structure to.*
f840: 2a 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  * the name of th
f850: 65 20 74 61 62 6c 65 20 67 69 76 65 6e 2e 20 20  e table given.  
f860: 45 73 63 61 70 65 20 61 6e 79 20 71 75 6f 74 65  Escape any quote
f870: 20 63 68 61 72 61 63 74 65 72 73 20 69 6e 20 74   characters in t
f880: 68 65 0a 2a 2a 20 74 61 62 6c 65 20 6e 61 6d 65  he.** table name
f890: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
f8a0: 20 73 65 74 5f 74 61 62 6c 65 5f 6e 61 6d 65 28   set_table_name(
f8b0: 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 2c 20 63  ShellState *p, c
f8c0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
f8d0: 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6e 3b 0a 20  ){.  int i, n;. 
f8e0: 20 63 68 61 72 20 63 51 75 6f 74 65 3b 0a 20 20   char cQuote;.  
f8f0: 63 68 61 72 20 2a 7a 3b 0a 0a 20 20 69 66 28 20  char *z;..  if( 
f900: 70 2d 3e 7a 44 65 73 74 54 61 62 6c 65 20 29 7b  p->zDestTable ){
f910: 0a 20 20 20 20 66 72 65 65 28 70 2d 3e 7a 44 65  .    free(p->zDe
f920: 73 74 54 61 62 6c 65 29 3b 0a 20 20 20 20 70 2d  stTable);.    p-
f930: 3e 7a 44 65 73 74 54 61 62 6c 65 20 3d 20 30 3b  >zDestTable = 0;
f940: 0a 20 20 7d 0a 20 20 69 66 28 20 7a 4e 61 6d 65  .  }.  if( zName
f950: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
f960: 63 51 75 6f 74 65 20 3d 20 71 75 6f 74 65 43 68  cQuote = quoteCh
f970: 61 72 28 7a 4e 61 6d 65 29 3b 0a 20 20 6e 20 3d  ar(zName);.  n =
f980: 20 73 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29   strlen30(zName)
f990: 3b 0a 20 20 69 66 28 20 63 51 75 6f 74 65 20 29  ;.  if( cQuote )
f9a0: 20 6e 20 2b 3d 20 6e 2b 32 3b 0a 20 20 7a 20 3d   n += n+2;.  z =
f9b0: 20 70 2d 3e 7a 44 65 73 74 54 61 62 6c 65 20 3d   p->zDestTable =
f9c0: 20 6d 61 6c 6c 6f 63 28 20 6e 2b 31 20 29 3b 0a   malloc( n+1 );.
f9d0: 20 20 69 66 28 20 7a 3d 3d 30 20 29 20 73 68 65    if( z==0 ) she
f9e0: 6c 6c 5f 6f 75 74 5f 6f 66 5f 6d 65 6d 6f 72 79  ll_out_of_memory
f9f0: 28 29 3b 0a 20 20 6e 20 3d 20 30 3b 0a 20 20 69  ();.  n = 0;.  i
fa00: 66 28 20 63 51 75 6f 74 65 20 29 20 7a 5b 6e 2b  f( cQuote ) z[n+
fa10: 2b 5d 20 3d 20 63 51 75 6f 74 65 3b 0a 20 20 66  +] = cQuote;.  f
fa20: 6f 72 28 69 3d 30 3b 20 7a 4e 61 6d 65 5b 69 5d  or(i=0; zName[i]
fa30: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 7a 5b 6e 2b  ; i++){.    z[n+
fa40: 2b 5d 20 3d 20 7a 4e 61 6d 65 5b 69 5d 3b 0a 20  +] = zName[i];. 
fa50: 20 20 20 69 66 28 20 7a 4e 61 6d 65 5b 69 5d 3d     if( zName[i]=
fa60: 3d 63 51 75 6f 74 65 20 29 20 7a 5b 6e 2b 2b 5d  =cQuote ) z[n++]
fa70: 20 3d 20 63 51 75 6f 74 65 3b 0a 20 20 7d 0a 20   = cQuote;.  }. 
fa80: 20 69 66 28 20 63 51 75 6f 74 65 20 29 20 7a 5b   if( cQuote ) z[
fa90: 6e 2b 2b 5d 20 3d 20 63 51 75 6f 74 65 3b 0a 20  n++] = cQuote;. 
faa0: 20 7a 5b 6e 5d 20 3d 20 30 3b 0a 7d 0a 0a 0a 2f   z[n] = 0;.}.../
fab0: 2a 0a 2a 2a 20 45 78 65 63 75 74 65 20 61 20 71  *.** Execute a q
fac0: 75 65 72 79 20 73 74 61 74 65 6d 65 6e 74 20 74  uery statement t
fad0: 68 61 74 20 77 69 6c 6c 20 67 65 6e 65 72 61 74  hat will generat
fae0: 65 20 53 51 4c 20 6f 75 74 70 75 74 2e 20 20 50  e SQL output.  P
faf0: 72 69 6e 74 0a 2a 2a 20 74 68 65 20 72 65 73 75  rint.** the resu
fb00: 6c 74 20 63 6f 6c 75 6d 6e 73 2c 20 63 6f 6d 6d  lt columns, comm
fb10: 61 2d 73 65 70 61 72 61 74 65 64 2c 20 6f 6e 20  a-separated, on 
fb20: 61 20 6c 69 6e 65 20 61 6e 64 20 74 68 65 6e 20  a line and then 
fb30: 61 64 64 20 61 0a 2a 2a 20 73 65 6d 69 63 6f 6c  add a.** semicol
fb40: 6f 6e 20 74 65 72 6d 69 6e 61 74 6f 72 20 74 6f  on terminator to
fb50: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 61 74   the end of that
fb60: 20 6c 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   line..**.** If 
fb70: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f  the number of co
fb80: 6c 75 6d 6e 73 20 69 73 20 31 20 61 6e 64 20 74  lumns is 1 and t
fb90: 68 61 74 20 63 6f 6c 75 6d 6e 20 63 6f 6e 74 61  hat column conta
fba0: 69 6e 73 20 74 65 78 74 20 22 2d 2d 22 0a 2a 2a  ins text "--".**
fbb0: 20 74 68 65 6e 20 77 72 69 74 65 20 74 68 65 20   then write the 
fbc0: 73 65 6d 69 63 6f 6c 6f 6e 20 6f 6e 20 61 20 73  semicolon on a s
fbd0: 65 70 61 72 61 74 65 20 6c 69 6e 65 2e 20 20 54  eparate line.  T
fbe0: 68 61 74 20 77 61 79 2c 20 69 66 20 61 0a 2a 2a  hat way, if a.**
fbf0: 20 22 2d 2d 22 20 63 6f 6d 6d 65 6e 74 20 6f 63   "--" comment oc
fc00: 63 75 72 73 20 61 74 20 74 68 65 20 65 6e 64 20  curs at the end 
fc10: 6f 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  of the statement
fc20: 2c 20 74 68 65 20 63 6f 6d 6d 65 6e 74 0a 2a 2a  , the comment.**
fc30: 20 77 6f 6e 27 74 20 63 6f 6e 73 75 6d 65 20 74   won't consume t
fc40: 68 65 20 73 65 6d 69 63 6f 6c 6f 6e 20 74 65 72  he semicolon ter
fc50: 6d 69 6e 61 74 6f 72 2e 0a 2a 2f 0a 73 74 61 74  minator..*/.stat
fc60: 69 63 20 69 6e 74 20 72 75 6e 5f 74 61 62 6c 65  ic int run_table
fc70: 5f 64 75 6d 70 5f 71 75 65 72 79 28 0a 20 20 53  _dump_query(.  S
fc80: 68 65 6c 6c 53 74 61 74 65 20 2a 70 2c 20 20 20  hellState *p,   
fc90: 20 20 20 20 20 20 20 20 2f 2a 20 51 75 65 72 79          /* Query
fca0: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 63 6f   context */.  co
fcb0: 6e 73 74 20 63 68 61 72 20 2a 7a 53 65 6c 65 63  nst char *zSelec
fcc0: 74 2c 20 20 20 20 20 2f 2a 20 53 45 4c 45 43 54  t,     /* SELECT
fcd0: 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 65 78   statement to ex
fce0: 74 72 61 63 74 20 63 6f 6e 74 65 6e 74 20 2a 2f  tract content */
fcf0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
fd00: 46 69 72 73 74 52 6f 77 20 20 20 20 2f 2a 20 50  FirstRow    /* P
fd10: 72 69 6e 74 20 62 65 66 6f 72 65 20 66 69 72 73  rint before firs
fd20: 74 20 72 6f 77 2c 20 69 66 20 6e 6f 74 20 4e 55  t row, if not NU
fd30: 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  LL */.){.  sqlit
fd40: 65 33 5f 73 74 6d 74 20 2a 70 53 65 6c 65 63 74  e3_stmt *pSelect
fd50: 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e  ;.  int rc;.  in
fd60: 74 20 6e 52 65 73 75 6c 74 3b 0a 20 20 69 6e 74  t nResult;.  int
fd70: 20 69 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   i;.  const char
fd80: 20 2a 7a 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69   *z;.  rc = sqli
fd90: 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 70  te3_prepare_v2(p
fda0: 2d 3e 64 62 2c 20 7a 53 65 6c 65 63 74 2c 20 2d  ->db, zSelect, -
fdb0: 31 2c 20 26 70 53 65 6c 65 63 74 2c 20 30 29 3b  1, &pSelect, 0);
fdc0: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
fdd0: 45 5f 4f 4b 20 7c 7c 20 21 70 53 65 6c 65 63 74  E_OK || !pSelect
fde0: 20 29 7b 0a 20 20 20 20 75 74 66 38 5f 70 72 69   ){.    utf8_pri
fdf0: 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 2f 2a 2a  ntf(p->out, "/**
fe00: 2a 2a 20 45 52 52 4f 52 3a 20 28 25 64 29 20 25  ** ERROR: (%d) %
fe10: 73 20 2a 2a 2a 2a 2a 2f 5c 6e 22 2c 20 72 63 2c  s *****/\n", rc,
fe20: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
fe30: 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
fe40: 70 2d 3e 64 62 29 29 3b 0a 20 20 20 20 69 66 28  p->db));.    if(
fe50: 20 28 72 63 26 30 78 66 66 29 21 3d 53 51 4c 49   (rc&0xff)!=SQLI
fe60: 54 45 5f 43 4f 52 52 55 50 54 20 29 20 70 2d 3e  TE_CORRUPT ) p->
fe70: 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 72 65 74 75  nErr++;.    retu
fe80: 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 72 63 20  rn rc;.  }.  rc 
fe90: 3d 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70  = sqlite3_step(p
fea0: 53 65 6c 65 63 74 29 3b 0a 20 20 6e 52 65 73 75  Select);.  nResu
feb0: 6c 74 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  lt = sqlite3_col
fec0: 75 6d 6e 5f 63 6f 75 6e 74 28 70 53 65 6c 65 63  umn_count(pSelec
fed0: 74 29 3b 0a 20 20 77 68 69 6c 65 28 20 72 63 3d  t);.  while( rc=
fee0: 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20  =SQLITE_ROW ){. 
fef0: 20 20 20 69 66 28 20 7a 46 69 72 73 74 52 6f 77     if( zFirstRow
ff00: 20 29 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70   ){.      utf8_p
ff10: 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25  rintf(p->out, "%
ff20: 73 22 2c 20 7a 46 69 72 73 74 52 6f 77 29 3b 0a  s", zFirstRow);.
ff30: 20 20 20 20 20 20 7a 46 69 72 73 74 52 6f 77 20        zFirstRow 
ff40: 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a  = 0;.    }.    z
ff50: 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29   = (const char*)
ff60: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
ff70: 65 78 74 28 70 53 65 6c 65 63 74 2c 20 30 29 3b  ext(pSelect, 0);
ff80: 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66  .    utf8_printf
ff90: 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20 7a  (p->out, "%s", z
ffa0: 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20  );.    for(i=1; 
ffb0: 69 3c 6e 52 65 73 75 6c 74 3b 20 69 2b 2b 29 7b  i<nResult; i++){
ffc0: 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e  .      utf8_prin
ffd0: 74 66 28 70 2d 3e 6f 75 74 2c 20 22 2c 25 73 22  tf(p->out, ",%s"
ffe0: 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  , sqlite3_column
fff0: 5f 74 65 78 74 28 70 53 65 6c 65 63 74 2c 20 69  _text(pSelect, i
10000 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ));.    }.    if
10010 28 20 7a 3d 3d 30 20 29 20 7a 20 3d 20 22 22 3b  ( z==0 ) z = "";
10020 0a 20 20 20 20 77 68 69 6c 65 28 20 7a 5b 30 5d  .    while( z[0]
10030 20 26 26 20 28 7a 5b 30 5d 21 3d 27 2d 27 20 7c   && (z[0]!='-' |
10040 7c 20 7a 5b 31 5d 21 3d 27 2d 27 29 20 29 20 7a  | z[1]!='-') ) z
10050 2b 2b 3b 0a 20 20 20 20 69 66 28 20 7a 5b 30 5d  ++;.    if( z[0]
10060 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72   ){.      raw_pr
10070 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 5c 6e  intf(p->out, "\n
10080 3b 5c 6e 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65  ;\n");.    }else
10090 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e  {.      raw_prin
100a0 74 66 28 70 2d 3e 6f 75 74 2c 20 22 3b 5c 6e 22  tf(p->out, ";\n"
100b0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  );.    }.    rc 
100c0 3d 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70  = sqlite3_step(p
100d0 53 65 6c 65 63 74 29 3b 0a 20 20 7d 0a 20 20 72  Select);.  }.  r
100e0 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6e 61  c = sqlite3_fina
100f0 6c 69 7a 65 28 70 53 65 6c 65 63 74 29 3b 0a 20  lize(pSelect);. 
10100 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
10110 4f 4b 20 29 7b 0a 20 20 20 20 75 74 66 38 5f 70  OK ){.    utf8_p
10120 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 2f  rintf(p->out, "/
10130 2a 2a 2a 2a 20 45 52 52 4f 52 3a 20 28 25 64 29  **** ERROR: (%d)
10140 20 25 73 20 2a 2a 2a 2a 2a 2f 5c 6e 22 2c 20 72   %s *****/\n", r
10150 63 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  c,.             
10160 20 20 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73     sqlite3_errms
10170 67 28 70 2d 3e 64 62 29 29 3b 0a 20 20 20 20 69  g(p->db));.    i
10180 66 28 20 28 72 63 26 30 78 66 66 29 21 3d 53 51  f( (rc&0xff)!=SQ
10190 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 29 20 70  LITE_CORRUPT ) p
101a0 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 7d 0a 20 20  ->nErr++;.  }.  
101b0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
101c0 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61  .** Allocate spa
101d0 63 65 20 61 6e 64 20 73 61 76 65 20 6f 66 66 20  ce and save off 
101e0 63 75 72 72 65 6e 74 20 65 72 72 6f 72 20 73 74  current error st
101f0 72 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ring..*/.static 
10200 63 68 61 72 20 2a 73 61 76 65 5f 65 72 72 5f 6d  char *save_err_m
10210 73 67 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  sg(.  sqlite3 *d
10220 62 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  b            /* 
10230 44 61 74 61 62 61 73 65 20 74 6f 20 71 75 65 72  Database to quer
10240 79 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 45  y */.){.  int nE
10250 72 72 4d 73 67 20 3d 20 31 2b 73 74 72 6c 65 6e  rrMsg = 1+strlen
10260 33 30 28 73 71 6c 69 74 65 33 5f 65 72 72 6d 73  30(sqlite3_errms
10270 67 28 64 62 29 29 3b 0a 20 20 63 68 61 72 20 2a  g(db));.  char *
10280 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c 69 74 65  zErrMsg = sqlite
10290 33 5f 6d 61 6c 6c 6f 63 36 34 28 6e 45 72 72 4d  3_malloc64(nErrM
102a0 73 67 29 3b 0a 20 20 69 66 28 20 7a 45 72 72 4d  sg);.  if( zErrM
102b0 73 67 20 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79  sg ){.    memcpy
102c0 28 7a 45 72 72 4d 73 67 2c 20 73 71 6c 69 74 65  (zErrMsg, sqlite
102d0 33 5f 65 72 72 6d 73 67 28 64 62 29 2c 20 6e 45  3_errmsg(db), nE
102e0 72 72 4d 73 67 29 3b 0a 20 20 7d 0a 20 20 72 65  rrMsg);.  }.  re
102f0 74 75 72 6e 20 7a 45 72 72 4d 73 67 3b 0a 7d 0a  turn zErrMsg;.}.
10300 0a 23 69 66 64 65 66 20 5f 5f 6c 69 6e 75 78 5f  .#ifdef __linux_
10310 5f 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20  _./*.** Attempt 
10320 74 6f 20 64 69 73 70 6c 61 79 20 49 2f 4f 20 73  to display I/O s
10330 74 61 74 73 20 6f 6e 20 4c 69 6e 75 78 20 75 73  tats on Linux us
10340 69 6e 67 20 2f 70 72 6f 63 2f 50 49 44 2f 69 6f  ing /proc/PID/io
10350 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
10360 64 69 73 70 6c 61 79 4c 69 6e 75 78 49 6f 53 74  displayLinuxIoSt
10370 61 74 73 28 46 49 4c 45 20 2a 6f 75 74 29 7b 0a  ats(FILE *out){.
10380 20 20 46 49 4c 45 20 2a 69 6e 3b 0a 20 20 63 68    FILE *in;.  ch
10390 61 72 20 7a 5b 32 30 30 5d 3b 0a 20 20 73 71 6c  ar z[200];.  sql
103a0 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
103b0 7a 65 6f 66 28 7a 29 2c 20 7a 2c 20 22 2f 70 72  zeof(z), z, "/pr
103c0 6f 63 2f 25 64 2f 69 6f 22 2c 20 67 65 74 70 69  oc/%d/io", getpi
103d0 64 28 29 29 3b 0a 20 20 69 6e 20 3d 20 66 6f 70  d());.  in = fop
103e0 65 6e 28 7a 2c 20 22 72 62 22 29 3b 0a 20 20 69  en(z, "rb");.  i
103f0 66 28 20 69 6e 3d 3d 30 20 29 20 72 65 74 75 72  f( in==0 ) retur
10400 6e 3b 0a 20 20 77 68 69 6c 65 28 20 66 67 65 74  n;.  while( fget
10410 73 28 7a 2c 20 73 69 7a 65 6f 66 28 7a 29 2c 20  s(z, sizeof(z), 
10420 69 6e 29 21 3d 30 20 29 7b 0a 20 20 20 20 73 74  in)!=0 ){.    st
10430 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63  atic const struc
10440 74 20 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20  t {.      const 
10450 63 68 61 72 20 2a 7a 50 61 74 74 65 72 6e 3b 0a  char *zPattern;.
10460 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
10470 20 2a 7a 44 65 73 63 3b 0a 20 20 20 20 7d 20 61   *zDesc;.    } a
10480 54 72 61 6e 73 5b 5d 20 3d 20 7b 0a 20 20 20 20  Trans[] = {.    
10490 20 20 7b 20 22 72 63 68 61 72 3a 20 22 2c 20 20    { "rchar: ",  
104a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
104b0 22 42 79 74 65 73 20 72 65 63 65 69 76 65 64 20  "Bytes received 
104c0 62 79 20 72 65 61 64 28 29 3a 22 20 7d 2c 0a 20  by read():" },. 
104d0 20 20 20 20 20 7b 20 22 77 63 68 61 72 3a 20 22       { "wchar: "
104e0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
104f0 20 20 20 22 42 79 74 65 73 20 73 65 6e 74 20 74     "Bytes sent t
10500 6f 20 77 72 69 74 65 28 29 3a 22 20 20 20 20 7d  o write():"    }
10510 2c 0a 20 20 20 20 20 20 7b 20 22 73 79 73 63 72  ,.      { "syscr
10520 3a 20 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  : ",            
10530 20 20 20 20 20 20 22 52 65 61 64 28 29 20 73 79        "Read() sy
10540 73 74 65 6d 20 63 61 6c 6c 73 3a 22 20 20 20 20  stem calls:"    
10550 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 73 79    },.      { "sy
10560 73 63 77 3a 20 22 2c 20 20 20 20 20 20 20 20 20  scw: ",         
10570 20 20 20 20 20 20 20 20 20 22 57 72 69 74 65 28           "Write(
10580 29 20 73 79 73 74 65 6d 20 63 61 6c 6c 73 3a 22  ) system calls:"
10590 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20       },.      { 
105a0 22 72 65 61 64 5f 62 79 74 65 73 3a 20 22 2c 20  "read_bytes: ", 
105b0 20 20 20 20 20 20 20 20 20 20 20 20 22 42 79 74              "Byt
105c0 65 73 20 72 65 61 64 20 66 72 6f 6d 20 73 74 6f  es read from sto
105d0 72 61 67 65 3a 22 20 20 7d 2c 0a 20 20 20 20 20  rage:"  },.     
105e0 20 7b 20 22 77 72 69 74 65 5f 62 79 74 65 73 3a   { "write_bytes:
105f0 20 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 22   ",            "
10600 42 79 74 65 73 20 77 72 69 74 74 65 6e 20 74 6f  Bytes written to
10610 20 73 74 6f 72 61 67 65 3a 22 20 7d 2c 0a 20 20   storage:" },.  
10620 20 20 20 20 7b 20 22 63 61 6e 63 65 6c 6c 65 64      { "cancelled
10630 5f 77 72 69 74 65 5f 62 79 74 65 73 3a 20 22 2c  _write_bytes: ",
10640 20 20 22 43 61 6e 63 65 6c 6c 65 64 20 77 72 69    "Cancelled wri
10650 74 65 20 62 79 74 65 73 3a 22 20 20 20 20 7d 2c  te bytes:"    },
10660 0a 20 20 20 20 7d 3b 0a 20 20 20 20 69 6e 74 20  .    };.    int 
10670 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  i;.    for(i=0; 
10680 69 3c 41 72 72 61 79 53 69 7a 65 28 61 54 72 61  i<ArraySize(aTra
10690 6e 73 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  ns); i++){.     
106a0 20 69 6e 74 20 6e 20 3d 20 73 74 72 6c 65 6e 33   int n = strlen3
106b0 30 28 61 54 72 61 6e 73 5b 69 5d 2e 7a 50 61 74  0(aTrans[i].zPat
106c0 74 65 72 6e 29 3b 0a 20 20 20 20 20 20 69 66 28  tern);.      if(
106d0 20 73 74 72 6e 63 6d 70 28 61 54 72 61 6e 73 5b   strncmp(aTrans[
106e0 69 5d 2e 7a 50 61 74 74 65 72 6e 2c 20 7a 2c 20  i].zPattern, z, 
106f0 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  n)==0 ){.       
10700 20 75 74 66 38 5f 70 72 69 6e 74 66 28 6f 75 74   utf8_printf(out
10710 2c 20 22 25 2d 33 36 73 20 25 73 22 2c 20 61 54  , "%-36s %s", aT
10720 72 61 6e 73 5b 69 5d 2e 7a 44 65 73 63 2c 20 26  rans[i].zDesc, &
10730 7a 5b 6e 5d 29 3b 0a 20 20 20 20 20 20 20 20 62  z[n]);.        b
10740 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
10750 20 20 7d 0a 20 20 7d 0a 20 20 66 63 6c 6f 73 65    }.  }.  fclose
10760 28 69 6e 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  (in);.}.#endif..
10770 2f 2a 0a 2a 2a 20 44 69 73 70 6c 61 79 20 61 20  /*.** Display a 
10780 73 69 6e 67 6c 65 20 6c 69 6e 65 20 6f 66 20 73  single line of s
10790 74 61 74 75 73 20 75 73 69 6e 67 20 36 34 2d 62  tatus using 64-b
107a0 69 74 20 76 61 6c 75 65 73 2e 0a 2a 2f 0a 73 74  it values..*/.st
107b0 61 74 69 63 20 76 6f 69 64 20 64 69 73 70 6c 61  atic void displa
107c0 79 53 74 61 74 4c 69 6e 65 28 0a 20 20 53 68 65  yStatLine(.  She
107d0 6c 6c 53 74 61 74 65 20 2a 70 2c 20 20 20 20 20  llState *p,     
107e0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 68         /* The sh
107f0 65 6c 6c 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ell context */. 
10800 20 63 68 61 72 20 2a 7a 4c 61 62 65 6c 2c 20 20   char *zLabel,  
10810 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61             /* La
10820 62 65 6c 20 66 6f 72 20 74 68 69 73 20 6f 6e 65  bel for this one
10830 20 6c 69 6e 65 20 2a 2f 0a 20 20 63 68 61 72 20   line */.  char 
10840 2a 7a 46 6f 72 6d 61 74 2c 20 20 20 20 20 20 20  *zFormat,       
10850 20 20 20 20 20 2f 2a 20 46 6f 72 6d 61 74 20 66       /* Format f
10860 6f 72 20 74 68 65 20 72 65 73 75 6c 74 20 2a 2f  or the result */
10870 0a 20 20 69 6e 74 20 69 53 74 61 74 75 73 43 74  .  int iStatusCt
10880 72 6c 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  rl,          /* 
10890 57 68 69 63 68 20 73 74 61 74 75 73 20 74 6f 20  Which status to 
108a0 64 69 73 70 6c 61 79 20 2a 2f 0a 20 20 69 6e 74  display */.  int
108b0 20 62 52 65 73 65 74 20 20 20 20 20 20 20 20 20   bReset         
108c0 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74         /* True t
108d0 6f 20 72 65 73 65 74 20 74 68 65 20 73 74 61 74  o reset the stat
108e0 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  s */.){.  sqlite
108f0 33 5f 69 6e 74 36 34 20 69 43 75 72 20 3d 20 2d  3_int64 iCur = -
10900 31 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  1;.  sqlite3_int
10910 36 34 20 69 48 69 77 74 72 20 3d 20 2d 31 3b 0a  64 iHiwtr = -1;.
10920 20 20 69 6e 74 20 69 2c 20 6e 50 65 72 63 65 6e    int i, nPercen
10930 74 3b 0a 20 20 63 68 61 72 20 7a 4c 69 6e 65 5b  t;.  char zLine[
10940 32 30 30 5d 3b 0a 20 20 73 71 6c 69 74 65 33 5f  200];.  sqlite3_
10950 73 74 61 74 75 73 36 34 28 69 53 74 61 74 75 73  status64(iStatus
10960 43 74 72 6c 2c 20 26 69 43 75 72 2c 20 26 69 48  Ctrl, &iCur, &iH
10970 69 77 74 72 2c 20 62 52 65 73 65 74 29 3b 0a 20  iwtr, bReset);. 
10980 20 66 6f 72 28 69 3d 30 2c 20 6e 50 65 72 63 65   for(i=0, nPerce
10990 6e 74 3d 30 3b 20 7a 46 6f 72 6d 61 74 5b 69 5d  nt=0; zFormat[i]
109a0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
109b0 7a 46 6f 72 6d 61 74 5b 69 5d 3d 3d 27 25 27 20  zFormat[i]=='%' 
109c0 29 20 6e 50 65 72 63 65 6e 74 2b 2b 3b 0a 20 20  ) nPercent++;.  
109d0 7d 0a 20 20 69 66 28 20 6e 50 65 72 63 65 6e 74  }.  if( nPercent
109e0 3e 31 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  >1 ){.    sqlite
109f0 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
10a00 66 28 7a 4c 69 6e 65 29 2c 20 7a 4c 69 6e 65 2c  f(zLine), zLine,
10a10 20 7a 46 6f 72 6d 61 74 2c 20 69 43 75 72 2c 20   zFormat, iCur, 
10a20 69 48 69 77 74 72 29 3b 0a 20 20 7d 65 6c 73 65  iHiwtr);.  }else
10a30 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  {.    sqlite3_sn
10a40 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 4c  printf(sizeof(zL
10a50 69 6e 65 29 2c 20 7a 4c 69 6e 65 2c 20 7a 46 6f  ine), zLine, zFo
10a60 72 6d 61 74 2c 20 69 48 69 77 74 72 29 3b 0a 20  rmat, iHiwtr);. 
10a70 20 7d 0a 20 20 72 61 77 5f 70 72 69 6e 74 66 28   }.  raw_printf(
10a80 70 2d 3e 6f 75 74 2c 20 22 25 2d 33 36 73 20 25  p->out, "%-36s %
10a90 73 5c 6e 22 2c 20 7a 4c 61 62 65 6c 2c 20 7a 4c  s\n", zLabel, zL
10aa0 69 6e 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  ine);.}../*.** D
10ab0 69 73 70 6c 61 79 20 6d 65 6d 6f 72 79 20 73 74  isplay memory st
10ac0 61 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ats..*/.static i
10ad0 6e 74 20 64 69 73 70 6c 61 79 5f 73 74 61 74 73  nt display_stats
10ae0 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
10af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10b00 2f 2a 20 44 61 74 61 62 61 73 65 20 74 6f 20 71  /* Database to q
10b10 75 65 72 79 20 2a 2f 0a 20 20 53 68 65 6c 6c 53  uery */.  ShellS
10b20 74 61 74 65 20 2a 70 41 72 67 2c 20 20 20 20 20  tate *pArg,     
10b30 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
10b40 20 74 6f 20 53 68 65 6c 6c 53 74 61 74 65 20 2a   to ShellState *
10b50 2f 0a 20 20 69 6e 74 20 62 52 65 73 65 74 20 20  /.  int bReset  
10b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10b70 2f 2a 20 54 72 75 65 20 74 6f 20 72 65 73 65 74  /* True to reset
10b80 20 74 68 65 20 73 74 61 74 73 20 2a 2f 0a 29 7b   the stats */.){
10b90 0a 20 20 69 6e 74 20 69 43 75 72 3b 0a 20 20 69  .  int iCur;.  i
10ba0 6e 74 20 69 48 69 77 74 72 3b 0a 20 20 46 49 4c  nt iHiwtr;.  FIL
10bb0 45 20 2a 6f 75 74 3b 0a 20 20 69 66 28 20 70 41  E *out;.  if( pA
10bc0 72 67 3d 3d 30 20 7c 7c 20 70 41 72 67 2d 3e 6f  rg==0 || pArg->o
10bd0 75 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  ut==0 ) return 0
10be0 3b 0a 20 20 6f 75 74 20 3d 20 70 41 72 67 2d 3e  ;.  out = pArg->
10bf0 6f 75 74 3b 0a 0a 20 20 69 66 28 20 70 41 72 67  out;..  if( pArg
10c00 2d 3e 70 53 74 6d 74 20 26 26 20 28 70 41 72 67  ->pStmt && (pArg
10c10 2d 3e 73 74 61 74 73 4f 6e 20 26 20 32 29 20 29  ->statsOn & 2) )
10c20 7b 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6c 2c 20  {.    int nCol, 
10c30 69 2c 20 78 3b 0a 20 20 20 20 73 71 6c 69 74 65  i, x;.    sqlite
10c40 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20  3_stmt *pStmt = 
10c50 70 41 72 67 2d 3e 70 53 74 6d 74 3b 0a 20 20 20  pArg->pStmt;.   
10c60 20 63 68 61 72 20 7a 5b 31 30 30 5d 3b 0a 20 20   char z[100];.  
10c70 20 20 6e 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33    nCol = sqlite3
10c80 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 70 53  _column_count(pS
10c90 74 6d 74 29 3b 0a 20 20 20 20 72 61 77 5f 70 72  tmt);.    raw_pr
10ca0 69 6e 74 66 28 6f 75 74 2c 20 22 25 2d 33 36 73  intf(out, "%-36s
10cb0 20 25 64 5c 6e 22 2c 20 22 4e 75 6d 62 65 72 20   %d\n", "Number 
10cc0 6f 66 20 6f 75 74 70 75 74 20 63 6f 6c 75 6d 6e  of output column
10cd0 73 3a 22 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20  s:", nCol);.    
10ce0 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b  for(i=0; i<nCol;
10cf0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c   i++){.      sql
10d00 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
10d10 7a 65 6f 66 28 7a 29 2c 7a 2c 22 43 6f 6c 75 6d  zeof(z),z,"Colum
10d20 6e 20 25 64 20 25 6e 6e 61 6d 65 3a 22 2c 20 69  n %d %nname:", i
10d30 2c 20 26 78 29 3b 0a 20 20 20 20 20 20 75 74 66  , &x);.      utf
10d40 38 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25  8_printf(out, "%
10d50 2d 33 36 73 20 25 73 5c 6e 22 2c 20 7a 2c 20 73  -36s %s\n", z, s
10d60 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6e 61  qlite3_column_na
10d70 6d 65 28 70 53 74 6d 74 2c 69 29 29 3b 0a 23 69  me(pStmt,i));.#i
10d80 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
10d90 54 5f 44 45 43 4c 54 59 50 45 0a 20 20 20 20 20  T_DECLTYPE.     
10da0 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
10db0 66 28 33 30 2c 20 7a 2b 78 2c 20 22 64 65 63 6c  f(30, z+x, "decl
10dc0 61 72 65 64 20 74 79 70 65 3a 22 29 3b 0a 20 20  ared type:");.  
10dd0 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
10de0 6f 75 74 2c 20 22 25 2d 33 36 73 20 25 73 5c 6e  out, "%-36s %s\n
10df0 22 2c 20 7a 2c 20 73 71 6c 69 74 65 33 5f 63 6f  ", z, sqlite3_co
10e00 6c 75 6d 6e 5f 64 65 63 6c 74 79 70 65 28 70 53  lumn_decltype(pS
10e10 74 6d 74 2c 20 69 29 29 3b 0a 23 65 6e 64 69 66  tmt, i));.#endif
10e20 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
10e30 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54  NABLE_COLUMN_MET
10e40 41 44 41 54 41 0a 20 20 20 20 20 20 73 71 6c 69  ADATA.      sqli
10e50 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 33 30 2c  te3_snprintf(30,
10e60 20 7a 2b 78 2c 20 22 64 61 74 61 62 61 73 65 20   z+x, "database 
10e70 6e 61 6d 65 3a 22 29 3b 0a 20 20 20 20 20 20 75  name:");.      u
10e80 74 66 38 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20  tf8_printf(out, 
10e90 22 25 2d 33 36 73 20 25 73 5c 6e 22 2c 20 7a 2c  "%-36s %s\n", z,
10ea0 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
10eb0 64 61 74 61 62 61 73 65 5f 6e 61 6d 65 28 70 53  database_name(pS
10ec0 74 6d 74 2c 69 29 29 3b 0a 20 20 20 20 20 20 73  tmt,i));.      s
10ed0 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
10ee0 33 30 2c 20 7a 2b 78 2c 20 22 74 61 62 6c 65 20  30, z+x, "table 
10ef0 6e 61 6d 65 3a 22 29 3b 0a 20 20 20 20 20 20 75  name:");.      u
10f00 74 66 38 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20  tf8_printf(out, 
10f10 22 25 2d 33 36 73 20 25 73 5c 6e 22 2c 20 7a 2c  "%-36s %s\n", z,
10f20 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
10f30 74 61 62 6c 65 5f 6e 61 6d 65 28 70 53 74 6d 74  table_name(pStmt
10f40 2c 69 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ,i));.      sqli
10f50 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 33 30 2c  te3_snprintf(30,
10f60 20 7a 2b 78 2c 20 22 6f 72 69 67 69 6e 20 6e 61   z+x, "origin na
10f70 6d 65 3a 22 29 3b 0a 20 20 20 20 20 20 75 74 66  me:");.      utf
10f80 38 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25  8_printf(out, "%
10f90 2d 33 36 73 20 25 73 5c 6e 22 2c 20 7a 2c 20 73  -36s %s\n", z, s
10fa0 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6f 72  qlite3_column_or
10fb0 69 67 69 6e 5f 6e 61 6d 65 28 70 53 74 6d 74 2c  igin_name(pStmt,
10fc0 69 29 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  i));.#endif.    
10fd0 7d 0a 20 20 7d 0a 0a 20 20 64 69 73 70 6c 61 79  }.  }..  display
10fe0 53 74 61 74 4c 69 6e 65 28 70 41 72 67 2c 20 22  StatLine(pArg, "
10ff0 4d 65 6d 6f 72 79 20 55 73 65 64 3a 22 2c 0a 20  Memory Used:",. 
11000 20 20 20 20 22 25 6c 6c 64 20 28 6d 61 78 20 25      "%lld (max %
11010 6c 6c 64 29 20 62 79 74 65 73 22 2c 20 53 51 4c  lld) bytes", SQL
11020 49 54 45 5f 53 54 41 54 55 53 5f 4d 45 4d 4f 52  ITE_STATUS_MEMOR
11030 59 5f 55 53 45 44 2c 20 62 52 65 73 65 74 29 3b  Y_USED, bReset);
11040 0a 20 20 64 69 73 70 6c 61 79 53 74 61 74 4c 69  .  displayStatLi
11050 6e 65 28 70 41 72 67 2c 20 22 4e 75 6d 62 65 72  ne(pArg, "Number
11060 20 6f 66 20 4f 75 74 73 74 61 6e 64 69 6e 67 20   of Outstanding 
11070 41 6c 6c 6f 63 61 74 69 6f 6e 73 3a 22 2c 0a 20  Allocations:",. 
11080 20 20 20 20 22 25 6c 6c 64 20 28 6d 61 78 20 25      "%lld (max %
11090 6c 6c 64 29 22 2c 20 53 51 4c 49 54 45 5f 53 54  lld)", SQLITE_ST
110a0 41 54 55 53 5f 4d 41 4c 4c 4f 43 5f 43 4f 55 4e  ATUS_MALLOC_COUN
110b0 54 2c 20 62 52 65 73 65 74 29 3b 0a 20 20 69 66  T, bReset);.  if
110c0 28 20 70 41 72 67 2d 3e 73 68 65 6c 6c 46 6c 67  ( pArg->shellFlg
110d0 73 20 26 20 53 48 46 4c 47 5f 50 61 67 65 63 61  s & SHFLG_Pageca
110e0 63 68 65 20 29 7b 0a 20 20 20 20 64 69 73 70 6c  che ){.    displ
110f0 61 79 53 74 61 74 4c 69 6e 65 28 70 41 72 67 2c  ayStatLine(pArg,
11100 20 22 4e 75 6d 62 65 72 20 6f 66 20 50 63 61 63   "Number of Pcac
11110 68 65 20 50 61 67 65 73 20 55 73 65 64 3a 22 2c  he Pages Used:",
11120 0a 20 20 20 20 20 20 20 22 25 6c 6c 64 20 28 6d  .       "%lld (m
11130 61 78 20 25 6c 6c 64 29 20 70 61 67 65 73 22 2c  ax %lld) pages",
11140 20 53 51 4c 49 54 45 5f 53 54 41 54 55 53 5f 50   SQLITE_STATUS_P
11150 41 47 45 43 41 43 48 45 5f 55 53 45 44 2c 20 62  AGECACHE_USED, b
11160 52 65 73 65 74 29 3b 0a 20 20 7d 0a 20 20 64 69  Reset);.  }.  di
11170 73 70 6c 61 79 53 74 61 74 4c 69 6e 65 28 70 41  splayStatLine(pA
11180 72 67 2c 20 22 4e 75 6d 62 65 72 20 6f 66 20 50  rg, "Number of P
11190 63 61 63 68 65 20 4f 76 65 72 66 6c 6f 77 20 42  cache Overflow B
111a0 79 74 65 73 3a 22 2c 0a 20 20 20 20 20 22 25 6c  ytes:",.     "%l
111b0 6c 64 20 28 6d 61 78 20 25 6c 6c 64 29 20 62 79  ld (max %lld) by
111c0 74 65 73 22 2c 20 53 51 4c 49 54 45 5f 53 54 41  tes", SQLITE_STA
111d0 54 55 53 5f 50 41 47 45 43 41 43 48 45 5f 4f 56  TUS_PAGECACHE_OV
111e0 45 52 46 4c 4f 57 2c 20 62 52 65 73 65 74 29 3b  ERFLOW, bReset);
111f0 0a 20 20 64 69 73 70 6c 61 79 53 74 61 74 4c 69  .  displayStatLi
11200 6e 65 28 70 41 72 67 2c 20 22 4c 61 72 67 65 73  ne(pArg, "Larges
11210 74 20 41 6c 6c 6f 63 61 74 69 6f 6e 3a 22 2c 0a  t Allocation:",.
11220 20 20 20 20 20 22 25 6c 6c 64 20 62 79 74 65 73       "%lld bytes
11230 22 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 55 53  ", SQLITE_STATUS
11240 5f 4d 41 4c 4c 4f 43 5f 53 49 5a 45 2c 20 62 52  _MALLOC_SIZE, bR
11250 65 73 65 74 29 3b 0a 20 20 64 69 73 70 6c 61 79  eset);.  display
11260 53 74 61 74 4c 69 6e 65 28 70 41 72 67 2c 20 22  StatLine(pArg, "
11270 4c 61 72 67 65 73 74 20 50 63 61 63 68 65 20 41  Largest Pcache A
11280 6c 6c 6f 63 61 74 69 6f 6e 3a 22 2c 0a 20 20 20  llocation:",.   
11290 20 20 22 25 6c 6c 64 20 62 79 74 65 73 22 2c 20    "%lld bytes", 
112a0 53 51 4c 49 54 45 5f 53 54 41 54 55 53 5f 50 41  SQLITE_STATUS_PA
112b0 47 45 43 41 43 48 45 5f 53 49 5a 45 2c 20 62 52  GECACHE_SIZE, bR
112c0 65 73 65 74 29 3b 0a 23 69 66 64 65 66 20 59 59  eset);.#ifdef YY
112d0 54 52 41 43 4b 4d 41 58 53 54 41 43 4b 44 45 50  TRACKMAXSTACKDEP
112e0 54 48 0a 20 20 64 69 73 70 6c 61 79 53 74 61 74  TH.  displayStat
112f0 4c 69 6e 65 28 70 41 72 67 2c 20 22 44 65 65 70  Line(pArg, "Deep
11300 65 73 74 20 50 61 72 73 65 72 20 53 74 61 63 6b  est Parser Stack
11310 3a 22 2c 0a 20 20 20 20 20 22 25 6c 6c 64 20 28  :",.     "%lld (
11320 6d 61 78 20 25 6c 6c 64 29 22 2c 20 53 51 4c 49  max %lld)", SQLI
11330 54 45 5f 53 54 41 54 55 53 5f 50 41 52 53 45 52  TE_STATUS_PARSER
11340 5f 53 54 41 43 4b 2c 20 62 52 65 73 65 74 29 3b  _STACK, bReset);
11350 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 64  .#endif..  if( d
11360 62 20 29 7b 0a 20 20 20 20 69 66 28 20 70 41 72  b ){.    if( pAr
11370 67 2d 3e 73 68 65 6c 6c 46 6c 67 73 20 26 20 53  g->shellFlgs & S
11380 48 46 4c 47 5f 4c 6f 6f 6b 61 73 69 64 65 20 29  HFLG_Lookaside )
11390 7b 0a 20 20 20 20 20 20 69 48 69 77 74 72 20 3d  {.      iHiwtr =
113a0 20 69 43 75 72 20 3d 20 2d 31 3b 0a 20 20 20 20   iCur = -1;.    
113b0 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 73 74 61    sqlite3_db_sta
113c0 74 75 73 28 64 62 2c 20 53 51 4c 49 54 45 5f 44  tus(db, SQLITE_D
113d0 42 53 54 41 54 55 53 5f 4c 4f 4f 4b 41 53 49 44  BSTATUS_LOOKASID
113e0 45 5f 55 53 45 44 2c 0a 20 20 20 20 20 20 20 20  E_USED,.        
113f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11400 26 69 43 75 72 2c 20 26 69 48 69 77 74 72 2c 20  &iCur, &iHiwtr, 
11410 62 52 65 73 65 74 29 3b 0a 20 20 20 20 20 20 72  bReset);.      r
11420 61 77 5f 70 72 69 6e 74 66 28 70 41 72 67 2d 3e  aw_printf(pArg->
11430 6f 75 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  out,.           
11440 20 20 20 22 4c 6f 6f 6b 61 73 69 64 65 20 53 6c     "Lookaside Sl
11450 6f 74 73 20 55 73 65 64 3a 20 20 20 20 20 20 20  ots Used:       
11460 20 20 20 20 20 20 20 20 20 25 64 20 28 6d 61 78           %d (max
11470 20 25 64 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20   %d)\n",.       
11480 20 20 20 20 20 20 20 69 43 75 72 2c 20 69 48 69         iCur, iHi
11490 77 74 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  wtr);.      sqli
114a0 74 65 33 5f 64 62 5f 73 74 61 74 75 73 28 64 62  te3_db_status(db
114b0 2c 20 53 51 4c 49 54 45 5f 44 42 53 54 41 54 55  , SQLITE_DBSTATU
114c0 53 5f 4c 4f 4f 4b 41 53 49 44 45 5f 48 49 54 2c  S_LOOKASIDE_HIT,
114d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
114e0 20 20 20 20 20 20 20 20 20 26 69 43 75 72 2c 20           &iCur, 
114f0 26 69 48 69 77 74 72 2c 20 62 52 65 73 65 74 29  &iHiwtr, bReset)
11500 3b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e  ;.      raw_prin
11510 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22 53  tf(pArg->out, "S
11520 75 63 63 65 73 73 66 75 6c 20 6c 6f 6f 6b 61 73  uccessful lookas
11530 69 64 65 20 61 74 74 65 6d 70 74 73 3a 20 20 20  ide attempts:   
11540 20 20 20 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20      %d\n",.     
11550 20 20 20 20 20 20 20 20 20 69 48 69 77 74 72 29           iHiwtr)
11560 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
11570 64 62 5f 73 74 61 74 75 73 28 64 62 2c 20 53 51  db_status(db, SQ
11580 4c 49 54 45 5f 44 42 53 54 41 54 55 53 5f 4c 4f  LITE_DBSTATUS_LO
11590 4f 4b 41 53 49 44 45 5f 4d 49 53 53 5f 53 49 5a  OKASIDE_MISS_SIZ
115a0 45 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  E,.             
115b0 20 20 20 20 20 20 20 20 20 20 20 26 69 43 75 72             &iCur
115c0 2c 20 26 69 48 69 77 74 72 2c 20 62 52 65 73 65  , &iHiwtr, bRese
115d0 74 29 3b 0a 20 20 20 20 20 20 72 61 77 5f 70 72  t);.      raw_pr
115e0 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20  intf(pArg->out, 
115f0 22 4c 6f 6f 6b 61 73 69 64 65 20 66 61 69 6c 75  "Lookaside failu
11600 72 65 73 20 64 75 65 20 74 6f 20 73 69 7a 65 3a  res due to size:
11610 20 20 20 20 20 20 25 64 5c 6e 22 2c 0a 20 20 20        %d\n",.   
11620 20 20 20 20 20 20 20 20 20 20 20 69 48 69 77 74             iHiwt
11630 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  r);.      sqlite
11640 33 5f 64 62 5f 73 74 61 74 75 73 28 64 62 2c 20  3_db_status(db, 
11650 53 51 4c 49 54 45 5f 44 42 53 54 41 54 55 53 5f  SQLITE_DBSTATUS_
11660 4c 4f 4f 4b 41 53 49 44 45 5f 4d 49 53 53 5f 46  LOOKASIDE_MISS_F
11670 55 4c 4c 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ULL,.           
11680 20 20 20 20 20 20 20 20 20 20 20 20 20 26 69 43               &iC
11690 75 72 2c 20 26 69 48 69 77 74 72 2c 20 62 52 65  ur, &iHiwtr, bRe
116a0 73 65 74 29 3b 0a 20 20 20 20 20 20 72 61 77 5f  set);.      raw_
116b0 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74  printf(pArg->out
116c0 2c 20 22 4c 6f 6f 6b 61 73 69 64 65 20 66 61 69  , "Lookaside fai
116d0 6c 75 72 65 73 20 64 75 65 20 74 6f 20 4f 4f 4d  lures due to OOM
116e0 3a 20 20 20 20 20 20 20 25 64 5c 6e 22 2c 0a 20  :       %d\n",. 
116f0 20 20 20 20 20 20 20 20 20 20 20 20 20 69 48 69               iHi
11700 77 74 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  wtr);.    }.    
11710 69 48 69 77 74 72 20 3d 20 69 43 75 72 20 3d 20  iHiwtr = iCur = 
11720 2d 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  -1;.    sqlite3_
11730 64 62 5f 73 74 61 74 75 73 28 64 62 2c 20 53 51  db_status(db, SQ
11740 4c 49 54 45 5f 44 42 53 54 41 54 55 53 5f 43 41  LITE_DBSTATUS_CA
11750 43 48 45 5f 55 53 45 44 2c 20 26 69 43 75 72 2c  CHE_USED, &iCur,
11760 20 26 69 48 69 77 74 72 2c 20 62 52 65 73 65 74   &iHiwtr, bReset
11770 29 3b 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74  );.    raw_print
11780 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22 50 61  f(pArg->out, "Pa
11790 67 65 72 20 48 65 61 70 20 55 73 61 67 65 3a 20  ger Heap Usage: 
117a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
117b0 20 20 20 25 64 20 62 79 74 65 73 5c 6e 22 2c 0a     %d bytes\n",.
117c0 20 20 20 20 20 20 20 20 20 20 20 20 69 43 75 72              iCur
117d0 29 3b 0a 20 20 20 20 69 48 69 77 74 72 20 3d 20  );.    iHiwtr = 
117e0 69 43 75 72 20 3d 20 2d 31 3b 0a 20 20 20 20 73  iCur = -1;.    s
117f0 71 6c 69 74 65 33 5f 64 62 5f 73 74 61 74 75 73  qlite3_db_status
11800 28 64 62 2c 20 53 51 4c 49 54 45 5f 44 42 53 54  (db, SQLITE_DBST
11810 41 54 55 53 5f 43 41 43 48 45 5f 48 49 54 2c 20  ATUS_CACHE_HIT, 
11820 26 69 43 75 72 2c 20 26 69 48 69 77 74 72 2c 20  &iCur, &iHiwtr, 
11830 31 29 3b 0a 20 20 20 20 72 61 77 5f 70 72 69 6e  1);.    raw_prin
11840 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22 50  tf(pArg->out, "P
11850 61 67 65 20 63 61 63 68 65 20 68 69 74 73 3a 20  age cache hits: 
11860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11870 20 20 20 20 25 64 5c 6e 22 2c 20 69 43 75 72 29      %d\n", iCur)
11880 3b 0a 20 20 20 20 69 48 69 77 74 72 20 3d 20 69  ;.    iHiwtr = i
11890 43 75 72 20 3d 20 2d 31 3b 0a 20 20 20 20 73 71  Cur = -1;.    sq
118a0 6c 69 74 65 33 5f 64 62 5f 73 74 61 74 75 73 28  lite3_db_status(
118b0 64 62 2c 20 53 51 4c 49 54 45 5f 44 42 53 54 41  db, SQLITE_DBSTA
118c0 54 55 53 5f 43 41 43 48 45 5f 4d 49 53 53 2c 20  TUS_CACHE_MISS, 
118d0 26 69 43 75 72 2c 20 26 69 48 69 77 74 72 2c 20  &iCur, &iHiwtr, 
118e0 31 29 3b 0a 20 20 20 20 72 61 77 5f 70 72 69 6e  1);.    raw_prin
118f0 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22 50  tf(pArg->out, "P
11900 61 67 65 20 63 61 63 68 65 20 6d 69 73 73 65 73  age cache misses
11910 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  :               
11920 20 20 20 20 25 64 5c 6e 22 2c 20 69 43 75 72 29      %d\n", iCur)
11930 3b 0a 20 20 20 20 69 48 69 77 74 72 20 3d 20 69  ;.    iHiwtr = i
11940 43 75 72 20 3d 20 2d 31 3b 0a 20 20 20 20 73 71  Cur = -1;.    sq
11950 6c 69 74 65 33 5f 64 62 5f 73 74 61 74 75 73 28  lite3_db_status(
11960 64 62 2c 20 53 51 4c 49 54 45 5f 44 42 53 54 41  db, SQLITE_DBSTA
11970 54 55 53 5f 43 41 43 48 45 5f 57 52 49 54 45 2c  TUS_CACHE_WRITE,
11980 20 26 69 43 75 72 2c 20 26 69 48 69 77 74 72 2c   &iCur, &iHiwtr,
11990 20 31 29 3b 0a 20 20 20 20 72 61 77 5f 70 72 69   1);.    raw_pri
119a0 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22  ntf(pArg->out, "
119b0 50 61 67 65 20 63 61 63 68 65 20 77 72 69 74 65  Page cache write
119c0 73 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s:              
119d0 20 20 20 20 20 25 64 5c 6e 22 2c 20 69 43 75 72       %d\n", iCur
119e0 29 3b 0a 20 20 20 20 69 48 69 77 74 72 20 3d 20  );.    iHiwtr = 
119f0 69 43 75 72 20 3d 20 2d 31 3b 0a 20 20 20 20 73  iCur = -1;.    s
11a00 71 6c 69 74 65 33 5f 64 62 5f 73 74 61 74 75 73  qlite3_db_status
11a10 28 64 62 2c 20 53 51 4c 49 54 45 5f 44 42 53 54  (db, SQLITE_DBST
11a20 41 54 55 53 5f 43 41 43 48 45 5f 53 50 49 4c 4c  ATUS_CACHE_SPILL
11a30 2c 20 26 69 43 75 72 2c 20 26 69 48 69 77 74 72  , &iCur, &iHiwtr
11a40 2c 20 31 29 3b 0a 20 20 20 20 72 61 77 5f 70 72  , 1);.    raw_pr
11a50 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20  intf(pArg->out, 
11a60 22 50 61 67 65 20 63 61 63 68 65 20 73 70 69 6c  "Page cache spil
11a70 6c 73 3a 20 20 20 20 20 20 20 20 20 20 20 20 20  ls:             
11a80 20 20 20 20 20 20 25 64 5c 6e 22 2c 20 69 43 75        %d\n", iCu
11a90 72 29 3b 0a 20 20 20 20 69 48 69 77 74 72 20 3d  r);.    iHiwtr =
11aa0 20 69 43 75 72 20 3d 20 2d 31 3b 0a 20 20 20 20   iCur = -1;.    
11ab0 73 71 6c 69 74 65 33 5f 64 62 5f 73 74 61 74 75  sqlite3_db_statu
11ac0 73 28 64 62 2c 20 53 51 4c 49 54 45 5f 44 42 53  s(db, SQLITE_DBS
11ad0 54 41 54 55 53 5f 53 43 48 45 4d 41 5f 55 53 45  TATUS_SCHEMA_USE
11ae0 44 2c 20 26 69 43 75 72 2c 20 26 69 48 69 77 74  D, &iCur, &iHiwt
11af0 72 2c 20 62 52 65 73 65 74 29 3b 0a 20 20 20 20  r, bReset);.    
11b00 72 61 77 5f 70 72 69 6e 74 66 28 70 41 72 67 2d  raw_printf(pArg-
11b10 3e 6f 75 74 2c 20 22 53 63 68 65 6d 61 20 48 65  >out, "Schema He
11b20 61 70 20 55 73 61 67 65 3a 20 20 20 20 20 20 20  ap Usage:       
11b30 20 20 20 20 20 20 20 20 20 20 20 20 25 64 20 62              %d b
11b40 79 74 65 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20  ytes\n",.       
11b50 20 20 20 20 20 69 43 75 72 29 3b 0a 20 20 20 20       iCur);.    
11b60 69 48 69 77 74 72 20 3d 20 69 43 75 72 20 3d 20  iHiwtr = iCur = 
11b70 2d 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  -1;.    sqlite3_
11b80 64 62 5f 73 74 61 74 75 73 28 64 62 2c 20 53 51  db_status(db, SQ
11b90 4c 49 54 45 5f 44 42 53 54 41 54 55 53 5f 53 54  LITE_DBSTATUS_ST
11ba0 4d 54 5f 55 53 45 44 2c 20 26 69 43 75 72 2c 20  MT_USED, &iCur, 
11bb0 26 69 48 69 77 74 72 2c 20 62 52 65 73 65 74 29  &iHiwtr, bReset)
11bc0 3b 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66  ;.    raw_printf
11bd0 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22 53 74 61  (pArg->out, "Sta
11be0 74 65 6d 65 6e 74 20 48 65 61 70 2f 4c 6f 6f 6b  tement Heap/Look
11bf0 61 73 69 64 65 20 55 73 61 67 65 3a 20 20 20 20  aside Usage:    
11c00 20 20 25 64 20 62 79 74 65 73 5c 6e 22 2c 0a 20    %d bytes\n",. 
11c10 20 20 20 20 20 20 20 20 20 20 20 69 43 75 72 29             iCur)
11c20 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 41 72  ;.  }..  if( pAr
11c30 67 2d 3e 70 53 74 6d 74 20 29 7b 0a 20 20 20 20  g->pStmt ){.    
11c40 69 43 75 72 20 3d 20 73 71 6c 69 74 65 33 5f 73  iCur = sqlite3_s
11c50 74 6d 74 5f 73 74 61 74 75 73 28 70 41 72 67 2d  tmt_status(pArg-
11c60 3e 70 53 74 6d 74 2c 20 53 51 4c 49 54 45 5f 53  >pStmt, SQLITE_S
11c70 54 4d 54 53 54 41 54 55 53 5f 46 55 4c 4c 53 43  TMTSTATUS_FULLSC
11c80 41 4e 5f 53 54 45 50 2c 0a 20 20 20 20 20 20 20  AN_STEP,.       
11c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11ca0 20 20 20 20 20 20 20 20 62 52 65 73 65 74 29 3b          bReset);
11cb0 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28  .    raw_printf(
11cc0 70 41 72 67 2d 3e 6f 75 74 2c 20 22 46 75 6c 6c  pArg->out, "Full
11cd0 73 63 61 6e 20 53 74 65 70 73 3a 20 20 20 20 20  scan Steps:     
11ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11cf0 20 25 64 5c 6e 22 2c 20 69 43 75 72 29 3b 0a 20   %d\n", iCur);. 
11d00 20 20 20 69 43 75 72 20 3d 20 73 71 6c 69 74 65     iCur = sqlite
11d10 33 5f 73 74 6d 74 5f 73 74 61 74 75 73 28 70 41  3_stmt_status(pA
11d20 72 67 2d 3e 70 53 74 6d 74 2c 20 53 51 4c 49 54  rg->pStmt, SQLIT
11d30 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 53 4f 52  E_STMTSTATUS_SOR
11d40 54 2c 20 62 52 65 73 65 74 29 3b 0a 20 20 20 20  T, bReset);.    
11d50 72 61 77 5f 70 72 69 6e 74 66 28 70 41 72 67 2d  raw_printf(pArg-
11d60 3e 6f 75 74 2c 20 22 53 6f 72 74 20 4f 70 65 72  >out, "Sort Oper
11d70 61 74 69 6f 6e 73 3a 20 20 20 20 20 20 20 20 20  ations:         
11d80 20 20 20 20 20 20 20 20 20 20 20 20 25 64 5c 6e              %d\n
11d90 22 2c 20 69 43 75 72 29 3b 0a 20 20 20 20 69 43  ", iCur);.    iC
11da0 75 72 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 6d  ur = sqlite3_stm
11db0 74 5f 73 74 61 74 75 73 28 70 41 72 67 2d 3e 70  t_status(pArg->p
11dc0 53 74 6d 74 2c 20 53 51 4c 49 54 45 5f 53 54 4d  Stmt, SQLITE_STM
11dd0 54 53 54 41 54 55 53 5f 41 55 54 4f 49 4e 44 45  TSTATUS_AUTOINDE
11de0 58 2c 62 52 65 73 65 74 29 3b 0a 20 20 20 20 72  X,bReset);.    r
11df0 61 77 5f 70 72 69 6e 74 66 28 70 41 72 67 2d 3e  aw_printf(pArg->
11e00 6f 75 74 2c 20 22 41 75 74 6f 69 6e 64 65 78 20  out, "Autoindex 
11e10 49 6e 73 65 72 74 73 3a 20 20 20 20 20 20 20 20  Inserts:        
11e20 20 20 20 20 20 20 20 20 20 20 20 25 64 5c 6e 22             %d\n"
11e30 2c 20 69 43 75 72 29 3b 0a 20 20 20 20 69 43 75  , iCur);.    iCu
11e40 72 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  r = sqlite3_stmt
11e50 5f 73 74 61 74 75 73 28 70 41 72 67 2d 3e 70 53  _status(pArg->pS
11e60 74 6d 74 2c 20 53 51 4c 49 54 45 5f 53 54 4d 54  tmt, SQLITE_STMT
11e70 53 54 41 54 55 53 5f 56 4d 5f 53 54 45 50 2c 20  STATUS_VM_STEP, 
11e80 62 52 65 73 65 74 29 3b 0a 20 20 20 20 72 61 77  bReset);.    raw
11e90 5f 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75  _printf(pArg->ou
11ea0 74 2c 20 22 56 69 72 74 75 61 6c 20 4d 61 63 68  t, "Virtual Mach
11eb0 69 6e 65 20 53 74 65 70 73 3a 20 20 20 20 20 20  ine Steps:      
11ec0 20 20 20 20 20 20 20 20 20 25 64 5c 6e 22 2c 20           %d\n", 
11ed0 69 43 75 72 29 3b 0a 20 20 20 20 69 43 75 72 20  iCur);.    iCur 
11ee0 3d 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73  = sqlite3_stmt_s
11ef0 74 61 74 75 73 28 70 41 72 67 2d 3e 70 53 74 6d  tatus(pArg->pStm
11f00 74 2c 20 53 51 4c 49 54 45 5f 53 54 4d 54 53 54  t, SQLITE_STMTST
11f10 41 54 55 53 5f 52 45 50 52 45 50 41 52 45 2c 20  ATUS_REPREPARE, 
11f20 62 52 65 73 65 74 29 3b 0a 20 20 20 20 72 61 77  bReset);.    raw
11f30 5f 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75  _printf(pArg->ou
11f40 74 2c 20 22 52 65 70 72 65 70 61 72 65 20 6f 70  t, "Reprepare op
11f50 65 72 61 74 69 6f 6e 73 3a 20 20 20 20 20 20 20  erations:       
11f60 20 20 20 20 20 20 20 20 20 25 64 5c 6e 22 2c 20           %d\n", 
11f70 69 43 75 72 29 3b 0a 20 20 20 20 69 43 75 72 20  iCur);.    iCur 
11f80 3d 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73  = sqlite3_stmt_s
11f90 74 61 74 75 73 28 70 41 72 67 2d 3e 70 53 74 6d  tatus(pArg->pStm
11fa0 74 2c 20 53 51 4c 49 54 45 5f 53 54 4d 54 53 54  t, SQLITE_STMTST
11fb0 41 54 55 53 5f 52 55 4e 2c 20 62 52 65 73 65 74  ATUS_RUN, bReset
11fc0 29 3b 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74  );.    raw_print
11fd0 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22 4e 75  f(pArg->out, "Nu
11fe0 6d 62 65 72 20 6f 66 20 74 69 6d 65 73 20 72 75  mber of times ru
11ff0 6e 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n:              
12000 20 20 20 25 64 5c 6e 22 2c 20 69 43 75 72 29 3b     %d\n", iCur);
12010 0a 20 20 20 20 69 43 75 72 20 3d 20 73 71 6c 69  .    iCur = sqli
12020 74 65 33 5f 73 74 6d 74 5f 73 74 61 74 75 73 28  te3_stmt_status(
12030 70 41 72 67 2d 3e 70 53 74 6d 74 2c 20 53 51 4c  pArg->pStmt, SQL
12040 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 4d  ITE_STMTSTATUS_M
12050 45 4d 55 53 45 44 2c 20 62 52 65 73 65 74 29 3b  EMUSED, bReset);
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 4d 65 6d 6f  pArg->out, "Memo
12080 72 79 20 75 73 65 64 20 62 79 20 70 72 65 70 61  ry used by prepa
12090 72 65 64 20 73 74 6d 74 3a 20 20 20 20 20 20 20  red stmt:       
120a0 20 25 64 5c 6e 22 2c 20 69 43 75 72 29 3b 0a 20   %d\n", iCur);. 
120b0 20 7d 0a 0a 23 69 66 64 65 66 20 5f 5f 6c 69 6e   }..#ifdef __lin
120c0 75 78 5f 5f 0a 20 20 64 69 73 70 6c 61 79 4c 69  ux__.  displayLi
120d0 6e 75 78 49 6f 53 74 61 74 73 28 70 41 72 67 2d  nuxIoStats(pArg-
120e0 3e 6f 75 74 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  >out);.#endif.. 
120f0 20 2f 2a 20 44 6f 20 6e 6f 74 20 72 65 6d 6f 76   /* Do not remov
12100 65 20 74 68 69 73 20 6d 61 63 68 69 6e 65 20 72  e this machine r
12110 65 61 64 61 62 6c 65 20 63 6f 6d 6d 65 6e 74 3a  eadable comment:
12120 20 65 78 74 72 61 2d 73 74 61 74 73 2d 6f 75 74   extra-stats-out
12130 70 75 74 2d 68 65 72 65 20 2a 2f 0a 0a 20 20 72  put-here */..  r
12140 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
12150 2a 20 44 69 73 70 6c 61 79 20 73 63 61 6e 20 73  * Display scan s
12160 74 61 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tats..*/.static 
12170 76 6f 69 64 20 64 69 73 70 6c 61 79 5f 73 63 61  void display_sca
12180 6e 73 74 61 74 73 28 0a 20 20 73 71 6c 69 74 65  nstats(.  sqlite
12190 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20  3 *db,          
121a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
121b0 61 62 61 73 65 20 74 6f 20 71 75 65 72 79 20 2a  abase to query *
121c0 2f 0a 20 20 53 68 65 6c 6c 53 74 61 74 65 20 2a  /.  ShellState *
121d0 70 41 72 67 20 20 20 20 20 20 20 20 20 20 20 20  pArg            
121e0 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
121f0 6f 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 2f 0a  o ShellState */.
12200 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
12210 45 5f 45 4e 41 42 4c 45 5f 53 54 4d 54 5f 53 43  E_ENABLE_STMT_SC
12220 41 4e 53 54 41 54 55 53 0a 20 20 55 4e 55 53 45  ANSTATUS.  UNUSE
12230 44 5f 50 41 52 41 4d 45 54 45 52 28 64 62 29 3b  D_PARAMETER(db);
12240 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
12250 54 45 52 28 70 41 72 67 29 3b 0a 23 65 6c 73 65  TER(pArg);.#else
12260 0a 20 20 69 6e 74 20 69 2c 20 6b 2c 20 6e 2c 20  .  int i, k, n, 
12270 6d 78 3b 0a 20 20 72 61 77 5f 70 72 69 6e 74 66  mx;.  raw_printf
12280 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22 2d 2d 2d  (pArg->out, "---
12290 2d 2d 2d 2d 2d 20 73 63 61 6e 73 74 61 74 73 20  ----- scanstats 
122a0 2d 2d 2d 2d 2d 2d 2d 2d 5c 6e 22 29 3b 0a 20 20  --------\n");.  
122b0 6d 78 20 3d 20 30 3b 0a 20 20 66 6f 72 28 6b 3d  mx = 0;.  for(k=
122c0 30 3b 20 6b 3c 3d 6d 78 3b 20 6b 2b 2b 29 7b 0a  0; k<=mx; k++){.
122d0 20 20 20 20 64 6f 75 62 6c 65 20 72 45 73 74 4c      double rEstL
122e0 6f 6f 70 20 3d 20 31 2e 30 3b 0a 20 20 20 20 66  oop = 1.0;.    f
122f0 6f 72 28 69 3d 6e 3d 30 3b 20 31 3b 20 69 2b 2b  or(i=n=0; 1; i++
12300 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
12310 5f 73 74 6d 74 20 2a 70 20 3d 20 70 41 72 67 2d  _stmt *p = pArg-
12320 3e 70 53 74 6d 74 3b 0a 20 20 20 20 20 20 73 71  >pStmt;.      sq
12330 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e 4c 6f 6f  lite3_int64 nLoo
12340 70 2c 20 6e 56 69 73 69 74 3b 0a 20 20 20 20 20  p, nVisit;.     
12350 20 64 6f 75 62 6c 65 20 72 45 73 74 3b 0a 20 20   double rEst;.  
12360 20 20 20 20 69 6e 74 20 69 53 69 64 3b 0a 20 20      int iSid;.  
12370 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
12380 7a 45 78 70 6c 61 69 6e 3b 0a 20 20 20 20 20 20  zExplain;.      
12390 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  if( sqlite3_stmt
123a0 5f 73 63 61 6e 73 74 61 74 75 73 28 70 2c 20 69  _scanstatus(p, i
123b0 2c 20 53 51 4c 49 54 45 5f 53 43 41 4e 53 54 41  , SQLITE_SCANSTA
123c0 54 5f 4e 4c 4f 4f 50 2c 20 28 76 6f 69 64 2a 29  T_NLOOP, (void*)
123d0 26 6e 4c 6f 6f 70 29 20 29 7b 0a 20 20 20 20 20  &nLoop) ){.     
123e0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
123f0 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  }.      sqlite3_
12400 73 74 6d 74 5f 73 63 61 6e 73 74 61 74 75 73 28  stmt_scanstatus(
12410 70 2c 20 69 2c 20 53 51 4c 49 54 45 5f 53 43 41  p, i, SQLITE_SCA
12420 4e 53 54 41 54 5f 53 45 4c 45 43 54 49 44 2c 20  NSTAT_SELECTID, 
12430 28 76 6f 69 64 2a 29 26 69 53 69 64 29 3b 0a 20  (void*)&iSid);. 
12440 20 20 20 20 20 69 66 28 20 69 53 69 64 3e 6d 78       if( iSid>mx
12450 20 29 20 6d 78 20 3d 20 69 53 69 64 3b 0a 20 20   ) mx = iSid;.  
12460 20 20 20 20 69 66 28 20 69 53 69 64 21 3d 6b 20      if( iSid!=k 
12470 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
12480 20 20 69 66 28 20 6e 3d 3d 30 20 29 7b 0a 20 20    if( n==0 ){.  
12490 20 20 20 20 20 20 72 45 73 74 4c 6f 6f 70 20 3d        rEstLoop =
124a0 20 28 64 6f 75 62 6c 65 29 6e 4c 6f 6f 70 3b 0a   (double)nLoop;.
124b0 20 20 20 20 20 20 20 20 69 66 28 20 6b 3e 30 20          if( k>0 
124c0 29 20 72 61 77 5f 70 72 69 6e 74 66 28 70 41 72  ) raw_printf(pAr
124d0 67 2d 3e 6f 75 74 2c 20 22 2d 2d 2d 2d 2d 2d 2d  g->out, "-------
124e0 2d 20 73 75 62 71 75 65 72 79 20 25 64 20 2d 2d  - subquery %d --
124f0 2d 2d 2d 2d 2d 5c 6e 22 2c 20 6b 29 3b 0a 20 20  -----\n", k);.  
12500 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 2b 2b 3b      }.      n++;
12510 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
12520 74 6d 74 5f 73 63 61 6e 73 74 61 74 75 73 28 70  tmt_scanstatus(p
12530 2c 20 69 2c 20 53 51 4c 49 54 45 5f 53 43 41 4e  , i, SQLITE_SCAN
12540 53 54 41 54 5f 4e 56 49 53 49 54 2c 20 28 76 6f  STAT_NVISIT, (vo
12550 69 64 2a 29 26 6e 56 69 73 69 74 29 3b 0a 20 20  id*)&nVisit);.  
12560 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74      sqlite3_stmt
12570 5f 73 63 61 6e 73 74 61 74 75 73 28 70 2c 20 69  _scanstatus(p, i
12580 2c 20 53 51 4c 49 54 45 5f 53 43 41 4e 53 54 41  , SQLITE_SCANSTA
12590 54 5f 45 53 54 2c 20 28 76 6f 69 64 2a 29 26 72  T_EST, (void*)&r
125a0 45 73 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Est);.      sqli
125b0 74 65 33 5f 73 74 6d 74 5f 73 63 61 6e 73 74 61  te3_stmt_scansta
125c0 74 75 73 28 70 2c 20 69 2c 20 53 51 4c 49 54 45  tus(p, i, SQLITE
125d0 5f 53 43 41 4e 53 54 41 54 5f 45 58 50 4c 41 49  _SCANSTAT_EXPLAI
125e0 4e 2c 20 28 76 6f 69 64 2a 29 26 7a 45 78 70 6c  N, (void*)&zExpl
125f0 61 69 6e 29 3b 0a 20 20 20 20 20 20 75 74 66 38  ain);.      utf8
12600 5f 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75  _printf(pArg->ou
12610 74 2c 20 22 4c 6f 6f 70 20 25 32 64 3a 20 25 73  t, "Loop %2d: %s
12620 5c 6e 22 2c 20 6e 2c 20 7a 45 78 70 6c 61 69 6e  \n", n, zExplain
12630 29 3b 0a 20 20 20 20 20 20 72 45 73 74 4c 6f 6f  );.      rEstLoo
12640 70 20 2a 3d 20 72 45 73 74 3b 0a 20 20 20 20 20  p *= rEst;.     
12650 20 72 61 77 5f 70 72 69 6e 74 66 28 70 41 72 67   raw_printf(pArg
12660 2d 3e 6f 75 74 2c 0a 20 20 20 20 20 20 20 20 20  ->out,.         
12670 20 22 20 20 20 20 20 20 20 20 20 6e 4c 6f 6f 70   "         nLoop
12680 3d 25 2d 38 6c 6c 64 20 6e 52 6f 77 3d 25 2d 38  =%-8lld nRow=%-8
12690 6c 6c 64 20 65 73 74 52 6f 77 3d 25 2d 38 6c 6c  lld estRow=%-8ll
126a0 64 20 65 73 74 52 6f 77 2f 4c 6f 6f 70 3d 25 2d  d estRow/Loop=%-
126b0 38 67 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  8g\n",.         
126c0 20 6e 4c 6f 6f 70 2c 20 6e 56 69 73 69 74 2c 20   nLoop, nVisit, 
126d0 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 28  (sqlite3_int64)(
126e0 72 45 73 74 4c 6f 6f 70 2b 30 2e 35 29 2c 20 72  rEstLoop+0.5), r
126f0 45 73 74 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  Est.      );.   
12700 20 7d 0a 20 20 7d 0a 20 20 72 61 77 5f 70 72 69   }.  }.  raw_pri
12710 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22  ntf(pArg->out, "
12720 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12730 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 5c 6e 22 29 3b  -----------\n");
12740 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
12750 20 50 61 72 61 6d 65 74 65 72 20 61 7a 41 72 72   Parameter azArr
12760 61 79 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 7a  ay points to a z
12770 65 72 6f 2d 74 65 72 6d 69 6e 61 74 65 64 20 61  ero-terminated a
12780 72 72 61 79 20 6f 66 20 73 74 72 69 6e 67 73 2e  rray of strings.
12790 20 7a 53 74 72 0a 2a 2a 20 70 6f 69 6e 74 73 20   zStr.** points 
127a0 74 6f 20 61 20 73 69 6e 67 6c 65 20 6e 75 6c 2d  to a single nul-
127b0 74 65 72 6d 69 6e 61 74 65 64 20 73 74 72 69 6e  terminated strin
127c0 67 2e 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65  g. Return non-ze
127d0 72 6f 20 69 66 20 7a 53 74 72 0a 2a 2a 20 69 73  ro if zStr.** is
127e0 20 65 71 75 61 6c 2c 20 61 63 63 6f 72 64 69 6e   equal, accordin
127f0 67 20 74 6f 20 73 74 72 63 6d 70 28 29 2c 20 74  g to strcmp(), t
12800 6f 20 61 6e 79 20 6f 66 20 74 68 65 20 73 74 72  o any of the str
12810 69 6e 67 73 20 69 6e 20 74 68 65 20 61 72 72 61  ings in the arra
12820 79 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  y..** Otherwise,
12830 20 72 65 74 75 72 6e 20 7a 65 72 6f 2e 0a 2a 2f   return zero..*/
12840 0a 73 74 61 74 69 63 20 69 6e 74 20 73 74 72 5f  .static int str_
12850 69 6e 5f 61 72 72 61 79 28 63 6f 6e 73 74 20 63  in_array(const c
12860 68 61 72 20 2a 7a 53 74 72 2c 20 63 6f 6e 73 74  har *zStr, const
12870 20 63 68 61 72 20 2a 2a 61 7a 41 72 72 61 79 29   char **azArray)
12880 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  {.  int i;.  for
12890 28 69 3d 30 3b 20 61 7a 41 72 72 61 79 5b 69 5d  (i=0; azArray[i]
128a0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
128b0 30 3d 3d 73 74 72 63 6d 70 28 7a 53 74 72 2c 20  0==strcmp(zStr, 
128c0 61 7a 41 72 72 61 79 5b 69 5d 29 20 29 20 72 65  azArray[i]) ) re
128d0 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65  turn 1;.  }.  re
128e0 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
128f0 20 49 66 20 63 6f 6d 70 69 6c 65 64 20 73 74 61   If compiled sta
12900 74 65 6d 65 6e 74 20 70 53 71 6c 20 61 70 70 65  tement pSql appe
12910 61 72 73 20 74 6f 20 62 65 20 61 6e 20 45 58 50  ars to be an EXP
12920 4c 41 49 4e 20 73 74 61 74 65 6d 65 6e 74 2c 20  LAIN statement, 
12930 61 6c 6c 6f 63 61 74 65 0a 2a 2a 20 61 6e 64 20  allocate.** and 
12940 70 6f 70 75 6c 61 74 65 20 74 68 65 20 53 68 65  populate the She
12950 6c 6c 53 74 61 74 65 2e 61 69 49 6e 64 65 6e 74  llState.aiIndent
12960 5b 5d 20 61 72 72 61 79 20 77 69 74 68 20 74 68  [] array with th
12970 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 73  e number of.** s
12980 70 61 63 65 73 20 65 61 63 68 20 6f 70 63 6f 64  paces each opcod
12990 65 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 64 65  e should be inde
129a0 6e 74 65 64 20 62 65 66 6f 72 65 20 69 74 20 69  nted before it i
129b0 73 20 6f 75 74 70 75 74 2e 0a 2a 2a 0a 2a 2a 20  s output..**.** 
129c0 54 68 65 20 69 6e 64 65 6e 74 69 6e 67 20 72 75  The indenting ru
129d0 6c 65 73 20 61 72 65 3a 0a 2a 2a 0a 2a 2a 20 20  les are:.**.**  
129e0 20 20 20 2a 20 46 6f 72 20 65 61 63 68 20 22 4e     * For each "N
129f0 65 78 74 22 2c 20 22 50 72 65 76 22 2c 20 22 56  ext", "Prev", "V
12a00 4e 65 78 74 22 20 6f 72 20 22 56 50 72 65 76 22  Next" or "VPrev"
12a10 20 69 6e 73 74 72 75 63 74 69 6f 6e 2c 20 69 6e   instruction, in
12a20 64 65 6e 74 0a 2a 2a 20 20 20 20 20 20 20 61 6c  dent.**       al
12a30 6c 20 6f 70 63 6f 64 65 73 20 74 68 61 74 20 6f  l opcodes that o
12a40 63 63 75 72 20 62 65 74 77 65 65 6e 20 74 68 65  ccur between the
12a50 20 70 32 20 6a 75 6d 70 20 64 65 73 74 69 6e 61   p2 jump destina
12a60 74 69 6f 6e 20 61 6e 64 20 74 68 65 20 6f 70 63  tion and the opc
12a70 6f 64 65 0a 2a 2a 20 20 20 20 20 20 20 69 74 73  ode.**       its
12a80 65 6c 66 20 62 79 20 32 20 73 70 61 63 65 73 2e  elf by 2 spaces.
12a90 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20 46 6f 72  .**.**     * For
12aa0 20 65 61 63 68 20 22 47 6f 74 6f 22 2c 20 69 66   each "Goto", if
12ab0 20 74 68 65 20 6a 75 6d 70 20 64 65 73 74 69 6e   the jump destin
12ac0 61 74 69 6f 6e 20 69 73 20 65 61 72 6c 69 65 72  ation is earlier
12ad0 20 69 6e 20 74 68 65 20 70 72 6f 67 72 61 6d 0a   in the program.
12ae0 2a 2a 20 20 20 20 20 20 20 61 6e 64 20 65 6e 64  **       and end
12af0 73 20 6f 6e 20 6f 6e 65 20 6f 66 3a 0a 2a 2a 20  s on one of:.** 
12b00 20 20 20 20 20 20 20 20 20 59 69 65 6c 64 20 20           Yield  
12b10 53 65 65 6b 47 74 20 20 53 65 65 6b 4c 74 20 20  SeekGt  SeekLt  
12b20 52 6f 77 53 65 74 52 65 61 64 20 20 52 65 77 69  RowSetRead  Rewi
12b30 6e 64 0a 2a 2a 20 20 20 20 20 20 20 6f 72 20 69  nd.**       or i
12b40 66 20 74 68 65 20 50 31 20 70 61 72 61 6d 65 74  f the P1 paramet
12b50 65 72 20 69 73 20 6f 6e 65 20 69 6e 73 74 65 61  er is one instea
12b60 64 20 6f 66 20 7a 65 72 6f 2c 0a 2a 2a 20 20 20  d of zero,.**   
12b70 20 20 20 20 74 68 65 6e 20 69 6e 64 65 6e 74 20      then indent 
12b80 61 6c 6c 20 6f 70 63 6f 64 65 73 20 62 65 74 77  all opcodes betw
12b90 65 65 6e 20 74 68 65 20 65 61 72 6c 69 65 72 20  een the earlier 
12ba0 69 6e 73 74 72 75 63 74 69 6f 6e 0a 2a 2a 20 20  instruction.**  
12bb0 20 20 20 20 20 61 6e 64 20 22 47 6f 74 6f 22 20       and "Goto" 
12bc0 62 79 20 32 20 73 70 61 63 65 73 2e 0a 2a 2f 0a  by 2 spaces..*/.
12bd0 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70 6c  static void expl
12be0 61 69 6e 5f 64 61 74 61 5f 70 72 65 70 61 72 65  ain_data_prepare
12bf0 28 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 2c 20  (ShellState *p, 
12c00 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
12c10 71 6c 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  ql){.  const cha
12c20 72 20 2a 7a 53 71 6c 3b 20 20 20 20 20 20 20 20  r *zSql;        
12c30 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 65         /* The te
12c40 78 74 20 6f 66 20 74 68 65 20 53 51 4c 20 73 74  xt of the SQL st
12c50 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 63 6f 6e  atement */.  con
12c60 73 74 20 63 68 61 72 20 2a 7a 3b 20 20 20 20 20  st char *z;     
12c70 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12c80 55 73 65 64 20 74 6f 20 63 68 65 63 6b 20 69 66  Used to check if
12c90 20 74 68 69 73 20 69 73 20 61 6e 20 45 58 50 4c   this is an EXPL
12ca0 41 49 4e 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 62  AIN */.  int *ab
12cb0 59 69 65 6c 64 20 3d 20 30 3b 20 20 20 20 20 20  Yield = 0;      
12cc0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
12cd0 20 69 66 20 6f 70 20 69 73 20 61 6e 20 4f 50 5f   if op is an OP_
12ce0 59 69 65 6c 64 20 2a 2f 0a 20 20 69 6e 74 20 6e  Yield */.  int n
12cf0 41 6c 6c 6f 63 20 3d 20 30 3b 20 20 20 20 20 20  Alloc = 0;      
12d00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c             /* Al
12d10 6c 6f 63 61 74 65 64 20 73 69 7a 65 20 6f 66 20  located size of 
12d20 70 2d 3e 61 69 49 6e 64 65 6e 74 5b 5d 2c 20 61  p->aiIndent[], a
12d30 62 59 69 65 6c 64 20 2a 2f 0a 20 20 69 6e 74 20  bYield */.  int 
12d40 69 4f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20  iOp;            
12d50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
12d60 6e 64 65 78 20 6f 66 20 6f 70 65 72 61 74 69 6f  ndex of operatio
12d70 6e 20 69 6e 20 70 2d 3e 61 69 49 6e 64 65 6e 74  n in p->aiIndent
12d80 5b 5d 20 2a 2f 0a 0a 20 20 63 6f 6e 73 74 20 63  [] */..  const c
12d90 68 61 72 20 2a 61 7a 4e 65 78 74 5b 5d 20 3d 20  har *azNext[] = 
12da0 7b 20 22 4e 65 78 74 22 2c 20 22 50 72 65 76 22  { "Next", "Prev"
12db0 2c 20 22 56 50 72 65 76 22 2c 20 22 56 4e 65 78  , "VPrev", "VNex
12dc0 74 22 2c 20 22 53 6f 72 74 65 72 4e 65 78 74 22  t", "SorterNext"
12dd0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
12de0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 4e 65               "Ne
12df0 78 74 49 66 4f 70 65 6e 22 2c 20 22 50 72 65 76  xtIfOpen", "Prev
12e00 49 66 4f 70 65 6e 22 2c 20 30 20 7d 3b 0a 20 20  IfOpen", 0 };.  
12e10 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 59 69  const char *azYi
12e20 65 6c 64 5b 5d 20 3d 20 7b 20 22 59 69 65 6c 64  eld[] = { "Yield
12e30 22 2c 20 22 53 65 65 6b 4c 54 22 2c 20 22 53 65  ", "SeekLT", "Se
12e40 65 6b 47 54 22 2c 20 22 52 6f 77 53 65 74 52 65  ekGT", "RowSetRe
12e50 61 64 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ad",.           
12e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12e70 20 22 52 65 77 69 6e 64 22 2c 20 30 20 7d 3b 0a   "Rewind", 0 };.
12e80 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a    const char *az
12e90 47 6f 74 6f 5b 5d 20 3d 20 7b 20 22 47 6f 74 6f  Goto[] = { "Goto
12ea0 22 2c 20 30 20 7d 3b 0a 0a 20 20 2f 2a 20 54 72  ", 0 };..  /* Tr
12eb0 79 20 74 6f 20 66 69 67 75 72 65 20 6f 75 74 20  y to figure out 
12ec0 69 66 20 74 68 69 73 20 69 73 20 72 65 61 6c 6c  if this is reall
12ed0 79 20 61 6e 20 45 58 50 4c 41 49 4e 20 73 74 61  y an EXPLAIN sta
12ee0 74 65 6d 65 6e 74 2e 20 49 66 20 74 68 69 73 0a  tement. If this.
12ef0 20 20 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20 76    ** cannot be v
12f00 65 72 69 66 69 65 64 2c 20 72 65 74 75 72 6e 20  erified, return 
12f10 65 61 72 6c 79 2e 20 20 2a 2f 0a 20 20 69 66 28  early.  */.  if(
12f20 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
12f30 63 6f 75 6e 74 28 70 53 71 6c 29 21 3d 38 20 29  count(pSql)!=8 )
12f40 7b 0a 20 20 20 20 70 2d 3e 63 4d 6f 64 65 20 3d  {.    p->cMode =
12f50 20 70 2d 3e 6d 6f 64 65 3b 0a 20 20 20 20 72 65   p->mode;.    re
12f60 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 7a 53 71 6c  turn;.  }.  zSql
12f70 20 3d 20 73 71 6c 69 74 65 33 5f 73 71 6c 28 70   = sqlite3_sql(p
12f80 53 71 6c 29 3b 0a 20 20 69 66 28 20 7a 53 71 6c  Sql);.  if( zSql
12f90 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
12fa0 66 6f 72 28 7a 3d 7a 53 71 6c 3b 20 2a 7a 3d 3d  for(z=zSql; *z==
12fb0 27 20 27 20 7c 7c 20 2a 7a 3d 3d 27 5c 74 27 20  ' ' || *z=='\t' 
12fc0 7c 7c 20 2a 7a 3d 3d 27 5c 6e 27 20 7c 7c 20 2a  || *z=='\n' || *
12fd0 7a 3d 3d 27 5c 66 27 20 7c 7c 20 2a 7a 3d 3d 27  z=='\f' || *z=='
12fe0 5c 72 27 3b 20 7a 2b 2b 29 3b 0a 20 20 69 66 28  \r'; z++);.  if(
12ff0 20 73 71 6c 69 74 65 33 5f 73 74 72 6e 69 63 6d   sqlite3_strnicm
13000 70 28 7a 2c 20 22 65 78 70 6c 61 69 6e 22 2c 20  p(z, "explain", 
13010 37 29 20 29 7b 0a 20 20 20 20 70 2d 3e 63 4d 6f  7) ){.    p->cMo
13020 64 65 20 3d 20 70 2d 3e 6d 6f 64 65 3b 0a 20 20  de = p->mode;.  
13030 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20    return;.  }.. 
13040 20 66 6f 72 28 69 4f 70 3d 30 3b 20 53 51 4c 49   for(iOp=0; SQLI
13050 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f  TE_ROW==sqlite3_
13060 73 74 65 70 28 70 53 71 6c 29 3b 20 69 4f 70 2b  step(pSql); iOp+
13070 2b 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20  +){.    int i;. 
13080 20 20 20 69 6e 74 20 69 41 64 64 72 20 3d 20 73     int iAddr = s
13090 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e  qlite3_column_in
130a0 74 28 70 53 71 6c 2c 20 30 29 3b 0a 20 20 20 20  t(pSql, 0);.    
130b0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 70 20  const char *zOp 
130c0 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73  = (const char*)s
130d0 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
130e0 78 74 28 70 53 71 6c 2c 20 31 29 3b 0a 0a 20 20  xt(pSql, 1);..  
130f0 20 20 2f 2a 20 53 65 74 20 70 32 20 74 6f 20 74    /* Set p2 to t
13100 68 65 20 50 32 20 66 69 65 6c 64 20 6f 66 20 74  he P2 field of t
13110 68 65 20 63 75 72 72 65 6e 74 20 6f 70 63 6f 64  he current opcod
13120 65 2e 20 54 68 65 6e 2c 20 61 73 73 75 6d 69 6e  e. Then, assumin
13130 67 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 70 32  g that.    ** p2
13140 20 69 73 20 61 6e 20 69 6e 73 74 72 75 63 74 69   is an instructi
13150 6f 6e 20 61 64 64 72 65 73 73 2c 20 73 65 74 20  on address, set 
13160 76 61 72 69 61 62 6c 65 20 70 32 6f 70 20 74 6f  variable p2op to
13170 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68   the index of th
13180 61 74 0a 20 20 20 20 2a 2a 20 69 6e 73 74 72 75  at.    ** instru
13190 63 74 69 6f 6e 20 69 6e 20 74 68 65 20 61 69 49  ction in the aiI
131a0 6e 64 65 6e 74 5b 5d 20 61 72 72 61 79 2e 20 70  ndent[] array. p
131b0 32 20 61 6e 64 20 70 32 6f 70 20 6d 61 79 20 62  2 and p2op may b
131c0 65 20 64 69 66 66 65 72 65 6e 74 20 69 66 0a 20  e different if. 
131d0 20 20 20 2a 2a 20 74 68 65 20 63 75 72 72 65 6e     ** the curren
131e0 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 73  t instruction is
131f0 20 70 61 72 74 20 6f 66 20 61 20 73 75 62 2d 70   part of a sub-p
13200 72 6f 67 72 61 6d 20 67 65 6e 65 72 61 74 65 64  rogram generated
13210 20 62 79 20 61 6e 0a 20 20 20 20 2a 2a 20 53 51   by an.    ** SQ
13220 4c 20 74 72 69 67 67 65 72 20 6f 72 20 66 6f 72  L trigger or for
13230 65 69 67 6e 20 6b 65 79 2e 20 20 2a 2f 0a 20 20  eign key.  */.  
13240 20 20 69 6e 74 20 70 32 20 3d 20 73 71 6c 69 74    int p2 = sqlit
13250 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53  e3_column_int(pS
13260 71 6c 2c 20 33 29 3b 0a 20 20 20 20 69 6e 74 20  ql, 3);.    int 
13270 70 32 6f 70 20 3d 20 28 70 32 20 2b 20 28 69 4f  p2op = (p2 + (iO
13280 70 2d 69 41 64 64 72 29 29 3b 0a 0a 20 20 20 20  p-iAddr));..    
13290 2f 2a 20 47 72 6f 77 20 74 68 65 20 70 2d 3e 61  /* Grow the p->a
132a0 69 49 6e 64 65 6e 74 20 61 72 72 61 79 20 61 73  iIndent array as
132b0 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 20   required */.   
132c0 20 69 66 28 20 69 4f 70 3e 3d 6e 41 6c 6c 6f 63   if( iOp>=nAlloc
132d0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 4f   ){.      if( iO
132e0 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  p==0 ){.        
132f0 2f 2a 20 44 6f 20 66 75 72 74 68 65 72 20 76 65  /* Do further ve
13300 72 66 69 63 61 74 69 6f 6e 20 74 68 61 74 20 74  rfication that t
13310 68 69 73 20 69 73 20 65 78 70 6c 61 69 6e 20 6f  his is explain o
13320 75 74 70 75 74 2e 20 20 41 62 6f 72 74 20 69 66  utput.  Abort if
13330 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20 69  .        ** it i
13340 73 20 6e 6f 74 20 2a 2f 0a 20 20 20 20 20 20 20  s not */.       
13350 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68   static const ch
13360 61 72 20 2a 65 78 70 6c 61 69 6e 43 6f 6c 73 5b  ar *explainCols[
13370 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 20 20 20  ] = {.          
13380 20 22 61 64 64 72 22 2c 20 22 6f 70 63 6f 64 65   "addr", "opcode
13390 22 2c 20 22 70 31 22 2c 20 22 70 32 22 2c 20 22  ", "p1", "p2", "
133a0 70 33 22 2c 20 22 70 34 22 2c 20 22 70 35 22 2c  p3", "p4", "p5",
133b0 20 22 63 6f 6d 6d 65 6e 74 22 20 7d 3b 0a 20 20   "comment" };.  
133c0 20 20 20 20 20 20 69 6e 74 20 6a 6a 3b 0a 20 20        int jj;.  
133d0 20 20 20 20 20 20 66 6f 72 28 6a 6a 3d 30 3b 20        for(jj=0; 
133e0 6a 6a 3c 41 72 72 61 79 53 69 7a 65 28 65 78 70  jj<ArraySize(exp
133f0 6c 61 69 6e 43 6f 6c 73 29 3b 20 6a 6a 2b 2b 29  lainCols); jj++)
13400 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
13410 73 74 72 63 6d 70 28 73 71 6c 69 74 65 33 5f 63  strcmp(sqlite3_c
13420 6f 6c 75 6d 6e 5f 6e 61 6d 65 28 70 53 71 6c 2c  olumn_name(pSql,
13430 6a 6a 29 2c 65 78 70 6c 61 69 6e 43 6f 6c 73 5b  jj),explainCols[
13440 6a 6a 5d 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  jj])!=0 ){.     
13450 20 20 20 20 20 20 20 70 2d 3e 63 4d 6f 64 65 20         p->cMode 
13460 3d 20 70 2d 3e 6d 6f 64 65 3b 0a 20 20 20 20 20  = p->mode;.     
13470 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72         sqlite3_r
13480 65 73 65 74 28 70 53 71 6c 29 3b 0a 20 20 20 20  eset(pSql);.    
13490 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a          return;.
134a0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
134b0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
134c0 20 20 20 20 6e 41 6c 6c 6f 63 20 2b 3d 20 31 30      nAlloc += 10
134d0 30 3b 0a 20 20 20 20 20 20 70 2d 3e 61 69 49 6e  0;.      p->aiIn
134e0 64 65 6e 74 20 3d 20 28 69 6e 74 2a 29 73 71 6c  dent = (int*)sql
134f0 69 74 65 33 5f 72 65 61 6c 6c 6f 63 36 34 28 70  ite3_realloc64(p
13500 2d 3e 61 69 49 6e 64 65 6e 74 2c 20 6e 41 6c 6c  ->aiIndent, nAll
13510 6f 63 2a 73 69 7a 65 6f 66 28 69 6e 74 29 29 3b  oc*sizeof(int));
13520 0a 20 20 20 20 20 20 61 62 59 69 65 6c 64 20 3d  .      abYield =
13530 20 28 69 6e 74 2a 29 73 71 6c 69 74 65 33 5f 72   (int*)sqlite3_r
13540 65 61 6c 6c 6f 63 36 34 28 61 62 59 69 65 6c 64  ealloc64(abYield
13550 2c 20 6e 41 6c 6c 6f 63 2a 73 69 7a 65 6f 66 28  , nAlloc*sizeof(
13560 69 6e 74 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20  int));.    }.   
13570 20 61 62 59 69 65 6c 64 5b 69 4f 70 5d 20 3d 20   abYield[iOp] = 
13580 73 74 72 5f 69 6e 5f 61 72 72 61 79 28 7a 4f 70  str_in_array(zOp
13590 2c 20 61 7a 59 69 65 6c 64 29 3b 0a 20 20 20 20  , azYield);.    
135a0 70 2d 3e 61 69 49 6e 64 65 6e 74 5b 69 4f 70 5d  p->aiIndent[iOp]
135b0 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 6e 49 6e   = 0;.    p->nIn
135c0 64 65 6e 74 20 3d 20 69 4f 70 2b 31 3b 0a 0a 20  dent = iOp+1;.. 
135d0 20 20 20 69 66 28 20 73 74 72 5f 69 6e 5f 61 72     if( str_in_ar
135e0 72 61 79 28 7a 4f 70 2c 20 61 7a 4e 65 78 74 29  ray(zOp, azNext)
135f0 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d   ){.      for(i=
13600 70 32 6f 70 3b 20 69 3c 69 4f 70 3b 20 69 2b 2b  p2op; i<iOp; i++
13610 29 20 70 2d 3e 61 69 49 6e 64 65 6e 74 5b 69 5d  ) p->aiIndent[i]
13620 20 2b 3d 20 32 3b 0a 20 20 20 20 7d 0a 20 20 20   += 2;.    }.   
13630 20 69 66 28 20 73 74 72 5f 69 6e 5f 61 72 72 61   if( str_in_arra
13640 79 28 7a 4f 70 2c 20 61 7a 47 6f 74 6f 29 20 26  y(zOp, azGoto) &
13650 26 20 70 32 6f 70 3c 70 2d 3e 6e 49 6e 64 65 6e  & p2op<p->nInden
13660 74 0a 20 20 20 20 20 26 26 20 28 61 62 59 69 65  t.     && (abYie
13670 6c 64 5b 70 32 6f 70 5d 20 7c 7c 20 73 71 6c 69  ld[p2op] || sqli
13680 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70  te3_column_int(p
13690 53 71 6c 2c 20 32 29 29 0a 20 20 20 20 29 7b 0a  Sql, 2)).    ){.
136a0 20 20 20 20 20 20 66 6f 72 28 69 3d 70 32 6f 70        for(i=p2op
136b0 3b 20 69 3c 69 4f 70 3b 20 69 2b 2b 29 20 70 2d  ; i<iOp; i++) p-
136c0 3e 61 69 49 6e 64 65 6e 74 5b 69 5d 20 2b 3d 20  >aiIndent[i] += 
136d0 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  2;.    }.  }..  
136e0 70 2d 3e 69 49 6e 64 65 6e 74 20 3d 20 30 3b 0a  p->iIndent = 0;.
136f0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 61    sqlite3_free(a
13700 62 59 69 65 6c 64 29 3b 0a 20 20 73 71 6c 69 74  bYield);.  sqlit
13710 65 33 5f 72 65 73 65 74 28 70 53 71 6c 29 3b 0a  e3_reset(pSql);.
13720 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 74 68  }../*.** Free th
13730 65 20 61 72 72 61 79 20 61 6c 6c 6f 63 61 74 65  e array allocate
13740 64 20 62 79 20 65 78 70 6c 61 69 6e 5f 64 61 74  d by explain_dat
13750 61 5f 70 72 65 70 61 72 65 28 29 2e 0a 2a 2f 0a  a_prepare()..*/.
13760 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70 6c  static void expl
13770 61 69 6e 5f 64 61 74 61 5f 64 65 6c 65 74 65 28  ain_data_delete(
13780 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 29 7b 0a  ShellState *p){.
13790 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
137a0 2d 3e 61 69 49 6e 64 65 6e 74 29 3b 0a 20 20 70  ->aiIndent);.  p
137b0 2d 3e 61 69 49 6e 64 65 6e 74 20 3d 20 30 3b 0a  ->aiIndent = 0;.
137c0 20 20 70 2d 3e 6e 49 6e 64 65 6e 74 20 3d 20 30    p->nIndent = 0
137d0 3b 0a 20 20 70 2d 3e 69 49 6e 64 65 6e 74 20 3d  ;.  p->iIndent =
137e0 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69 73   0;.}../*.** Dis
137f0 61 62 6c 65 20 61 6e 64 20 72 65 73 74 6f 72 65  able and restore
13800 20 2e 77 68 65 72 65 74 72 61 63 65 20 61 6e 64   .wheretrace and
13810 20 2e 73 65 6c 65 63 74 74 72 61 63 65 20 73 65   .selecttrace se
13820 74 74 69 6e 67 73 2e 0a 2a 2f 0a 23 69 66 20 64  ttings..*/.#if d
13830 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45  efined(SQLITE_DE
13840 42 55 47 29 20 26 26 20 64 65 66 69 6e 65 64 28  BUG) && defined(
13850 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 45  SQLITE_ENABLE_SE
13860 4c 45 43 54 54 52 41 43 45 29 0a 65 78 74 65 72  LECTTRACE).exter
13870 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 53 65 6c  n int sqlite3Sel
13880 65 63 74 54 72 61 63 65 3b 0a 73 74 61 74 69 63  ectTrace;.static
13890 20 69 6e 74 20 73 61 76 65 64 53 65 6c 65 63 74   int savedSelect
138a0 54 72 61 63 65 3b 0a 23 65 6e 64 69 66 0a 23 69  Trace;.#endif.#i
138b0 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
138c0 5f 44 45 42 55 47 29 20 26 26 20 64 65 66 69 6e  _DEBUG) && defin
138d0 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
138e0 5f 57 48 45 52 45 54 52 41 43 45 29 0a 65 78 74  _WHERETRACE).ext
138f0 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 57  ern int sqlite3W
13900 68 65 72 65 54 72 61 63 65 3b 0a 73 74 61 74 69  hereTrace;.stati
13910 63 20 69 6e 74 20 73 61 76 65 64 57 68 65 72 65  c int savedWhere
13920 54 72 61 63 65 3b 0a 23 65 6e 64 69 66 0a 73 74  Trace;.#endif.st
13930 61 74 69 63 20 76 6f 69 64 20 64 69 73 61 62 6c  atic void disabl
13940 65 5f 64 65 62 75 67 5f 74 72 61 63 65 5f 6d 6f  e_debug_trace_mo
13950 64 65 73 28 76 6f 69 64 29 7b 0a 23 69 66 20 64  des(void){.#if d
13960 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45  efined(SQLITE_DE
13970 42 55 47 29 20 26 26 20 64 65 66 69 6e 65 64 28  BUG) && defined(
13980 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 45  SQLITE_ENABLE_SE
13990 4c 45 43 54 54 52 41 43 45 29 0a 20 20 73 61 76  LECTTRACE).  sav
139a0 65 64 53 65 6c 65 63 74 54 72 61 63 65 20 3d 20  edSelectTrace = 
139b0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61  sqlite3SelectTra
139c0 63 65 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c  ce;.  sqlite3Sel
139d0 65 63 74 54 72 61 63 65 20 3d 20 30 3b 0a 23 65  ectTrace = 0;.#e
139e0 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64  ndif.#if defined
139f0 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 20 26  (SQLITE_DEBUG) &
13a00 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  & defined(SQLITE
13a10 5f 45 4e 41 42 4c 45 5f 57 48 45 52 45 54 52 41  _ENABLE_WHERETRA
13a20 43 45 29 0a 20 20 73 61 76 65 64 57 68 65 72 65  CE).  savedWhere
13a30 54 72 61 63 65 20 3d 20 73 71 6c 69 74 65 33 57  Trace = sqlite3W
13a40 68 65 72 65 54 72 61 63 65 3b 0a 20 20 73 71 6c  hereTrace;.  sql
13a50 69 74 65 33 57 68 65 72 65 54 72 61 63 65 20 3d  ite3WhereTrace =
13a60 20 30 3b 0a 23 65 6e 64 69 66 0a 7d 0a 73 74 61   0;.#endif.}.sta
13a70 74 69 63 20 76 6f 69 64 20 72 65 73 74 6f 72 65  tic void restore
13a80 5f 64 65 62 75 67 5f 74 72 61 63 65 5f 6d 6f 64  _debug_trace_mod
13a90 65 73 28 76 6f 69 64 29 7b 0a 23 69 66 20 64 65  es(void){.#if de
13aa0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42  fined(SQLITE_DEB
13ab0 55 47 29 20 26 26 20 64 65 66 69 6e 65 64 28 53  UG) && defined(S
13ac0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 45 4c  QLITE_ENABLE_SEL
13ad0 45 43 54 54 52 41 43 45 29 0a 20 20 73 71 6c 69  ECTTRACE).  sqli
13ae0 74 65 33 53 65 6c 65 63 74 54 72 61 63 65 20 3d  te3SelectTrace =
13af0 20 73 61 76 65 64 53 65 6c 65 63 74 54 72 61 63   savedSelectTrac
13b00 65 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65  e;.#endif.#if de
13b10 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42  fined(SQLITE_DEB
13b20 55 47 29 20 26 26 20 64 65 66 69 6e 65 64 28 53  UG) && defined(S
13b30 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 57 48 45  QLITE_ENABLE_WHE
13b40 52 45 54 52 41 43 45 29 0a 20 20 73 71 6c 69 74  RETRACE).  sqlit
13b50 65 33 57 68 65 72 65 54 72 61 63 65 20 3d 20 73  e3WhereTrace = s
13b60 61 76 65 64 57 68 65 72 65 54 72 61 63 65 3b 0a  avedWhereTrace;.
13b70 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  #endif.}../*.** 
13b80 52 75 6e 20 61 20 70 72 65 70 61 72 65 64 20 73  Run a prepared s
13b90 74 61 74 65 6d 65 6e 74 0a 2a 2f 0a 73 74 61 74  tatement.*/.stat
13ba0 69 63 20 76 6f 69 64 20 65 78 65 63 5f 70 72 65  ic void exec_pre
13bb0 70 61 72 65 64 5f 73 74 6d 74 28 0a 20 20 53 68  pared_stmt(.  Sh
13bc0 65 6c 6c 53 74 61 74 65 20 2a 70 41 72 67 2c 20  ellState *pArg, 
13bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
13bf0 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 53 68 65  * Pointer to She
13c00 6c 6c 53 74 61 74 65 20 2a 2f 0a 20 20 73 71 6c  llState */.  sql
13c10 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
13c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
13c40 20 53 74 61 74 6d 65 6e 74 20 74 6f 20 72 75 6e   Statment to run
13c50 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
13c60 0a 0a 20 20 2f 2a 20 70 65 72 66 6f 72 6d 20 74  ..  /* perform t
13c70 68 65 20 66 69 72 73 74 20 73 74 65 70 2e 20 20  he first step.  
13c80 74 68 69 73 20 77 69 6c 6c 20 74 65 6c 6c 20 75  this will tell u
13c90 73 20 69 66 20 77 65 0a 20 20 2a 2a 20 68 61 76  s if we.  ** hav
13ca0 65 20 61 20 72 65 73 75 6c 74 20 73 65 74 20 6f  e a result set o
13cb0 72 20 6e 6f 74 20 61 6e 64 20 68 6f 77 20 77 69  r not and how wi
13cc0 64 65 20 69 74 20 69 73 2e 0a 20 20 2a 2f 0a 20  de it is..  */. 
13cd0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 73 74   rc = sqlite3_st
13ce0 65 70 28 70 53 74 6d 74 29 3b 0a 20 20 2f 2a 20  ep(pStmt);.  /* 
13cf0 69 66 20 77 65 20 68 61 76 65 20 61 20 72 65 73  if we have a res
13d00 75 6c 74 20 73 65 74 2e 2e 2e 20 2a 2f 0a 20 20  ult set... */.  
13d10 69 66 28 20 53 51 4c 49 54 45 5f 52 4f 57 20 3d  if( SQLITE_ROW =
13d20 3d 20 72 63 20 29 7b 0a 20 20 20 20 2f 2a 20 61  = rc ){.    /* a
13d30 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f  llocate space fo
13d40 72 20 63 6f 6c 20 6e 61 6d 65 20 70 74 72 2c 20  r col name ptr, 
13d50 76 61 6c 75 65 20 70 74 72 2c 20 61 6e 64 20 74  value ptr, and t
13d60 79 70 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  ype */.    int n
13d70 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  Col = sqlite3_co
13d80 6c 75 6d 6e 5f 63 6f 75 6e 74 28 70 53 74 6d 74  lumn_count(pStmt
13d90 29 3b 0a 20 20 20 20 76 6f 69 64 20 2a 70 44 61  );.    void *pDa
13da0 74 61 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  ta = sqlite3_mal
13db0 6c 6f 63 36 34 28 33 2a 6e 43 6f 6c 2a 73 69 7a  loc64(3*nCol*siz
13dc0 65 6f 66 28 63 6f 6e 73 74 20 63 68 61 72 2a 29  eof(const char*)
13dd0 20 2b 20 31 29 3b 0a 20 20 20 20 69 66 28 20 21   + 1);.    if( !
13de0 70 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20 72  pData ){.      r
13df0 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
13e00 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
13e10 20 20 20 63 68 61 72 20 2a 2a 61 7a 43 6f 6c 73     char **azCols
13e20 20 3d 20 28 63 68 61 72 20 2a 2a 29 70 44 61 74   = (char **)pDat
13e30 61 3b 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 73  a;      /* Names
13e40 20 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d   of result colum
13e50 6e 73 20 2a 2f 0a 20 20 20 20 20 20 63 68 61 72  ns */.      char
13e60 20 2a 2a 61 7a 56 61 6c 73 20 3d 20 26 61 7a 43   **azVals = &azC
13e70 6f 6c 73 5b 6e 43 6f 6c 5d 3b 20 20 20 20 20 20  ols[nCol];      
13e80 20 2f 2a 20 52 65 73 75 6c 74 73 20 2a 2f 0a 20   /* Results */. 
13e90 20 20 20 20 20 69 6e 74 20 2a 61 69 54 79 70 65       int *aiType
13ea0 73 20 3d 20 28 69 6e 74 20 2a 29 26 61 7a 56 61  s = (int *)&azVa
13eb0 6c 73 5b 6e 43 6f 6c 5d 3b 20 2f 2a 20 52 65 73  ls[nCol]; /* Res
13ec0 75 6c 74 20 74 79 70 65 73 20 2a 2f 0a 20 20 20  ult types */.   
13ed0 20 20 20 69 6e 74 20 69 2c 20 78 3b 0a 20 20 20     int i, x;.   
13ee0 20 20 20 61 73 73 65 72 74 28 73 69 7a 65 6f 66     assert(sizeof
13ef0 28 69 6e 74 29 20 3c 3d 20 73 69 7a 65 6f 66 28  (int) <= sizeof(
13f00 63 68 61 72 20 2a 29 29 3b 0a 20 20 20 20 20 20  char *));.      
13f10 2f 2a 20 73 61 76 65 20 6f 66 66 20 70 74 72 73  /* save off ptrs
13f20 20 74 6f 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73   to column names
13f30 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72 28 69 3d   */.      for(i=
13f40 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b  0; i<nCol; i++){
13f50 0a 20 20 20 20 20 20 20 20 61 7a 43 6f 6c 73 5b  .        azCols[
13f60 69 5d 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c  i] = (char *)sql
13f70 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65  ite3_column_name
13f80 28 70 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20 20  (pStmt, i);.    
13f90 20 20 7d 0a 20 20 20 20 20 20 64 6f 7b 0a 20 20    }.      do{.  
13fa0 20 20 20 20 20 20 2f 2a 20 65 78 74 72 61 63 74        /* extract
13fb0 20 74 68 65 20 64 61 74 61 20 61 6e 64 20 64 61   the data and da
13fc0 74 61 20 74 79 70 65 73 20 2a 2f 0a 20 20 20 20  ta types */.    
13fd0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
13fe0 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Col; i++){.     
13ff0 20 20 20 20 20 61 69 54 79 70 65 73 5b 69 5d 20       aiTypes[i] 
14000 3d 20 78 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  = x = sqlite3_co
14010 6c 75 6d 6e 5f 74 79 70 65 28 70 53 74 6d 74 2c  lumn_type(pStmt,
14020 20 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69   i);.          i
14030 66 28 20 78 3d 3d 53 51 4c 49 54 45 5f 42 4c 4f  f( x==SQLITE_BLO
14040 42 20 26 26 20 70 41 72 67 20 26 26 20 70 41 72  B && pArg && pAr
14050 67 2d 3e 63 4d 6f 64 65 3d 3d 4d 4f 44 45 5f 49  g->cMode==MODE_I
14060 6e 73 65 72 74 20 29 7b 0a 20 20 20 20 20 20 20  nsert ){.       
14070 20 20 20 20 20 61 7a 56 61 6c 73 5b 69 5d 20 3d       azVals[i] =
14080 20 22 22 3b 0a 20 20 20 20 20 20 20 20 20 20 7d   "";.          }
14090 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
140a0 20 20 61 7a 56 61 6c 73 5b 69 5d 20 3d 20 28 63    azVals[i] = (c
140b0 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c  har*)sqlite3_col
140c0 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 20  umn_text(pStmt, 
140d0 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  i);.          }.
140e0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21 61            if( !a
140f0 7a 56 61 6c 73 5b 69 5d 20 26 26 20 28 61 69 54  zVals[i] && (aiT
14100 79 70 65 73 5b 69 5d 21 3d 53 51 4c 49 54 45 5f  ypes[i]!=SQLITE_
14110 4e 55 4c 4c 29 20 29 7b 0a 20 20 20 20 20 20 20  NULL) ){.       
14120 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
14130 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20  _NOMEM;.        
14140 20 20 20 20 62 72 65 61 6b 3b 20 2f 2a 20 66 72      break; /* fr
14150 6f 6d 20 66 6f 72 20 2a 2f 0a 20 20 20 20 20 20  om for */.      
14160 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 20      }.        } 
14170 2f 2a 20 65 6e 64 20 66 6f 72 20 2a 2f 0a 0a 20  /* end for */.. 
14180 20 20 20 20 20 20 20 2f 2a 20 69 66 20 64 61 74         /* if dat
14190 61 20 61 6e 64 20 74 79 70 65 73 20 65 78 74 72  a and types extr
141a0 61 63 74 65 64 20 73 75 63 63 65 73 73 66 75 6c  acted successful
141b0 6c 79 2e 2e 2e 20 2a 2f 0a 20 20 20 20 20 20 20  ly... */.       
141c0 20 69 66 28 20 53 51 4c 49 54 45 5f 52 4f 57 20   if( SQLITE_ROW 
141d0 3d 3d 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  == rc ){.       
141e0 20 20 20 2f 2a 20 63 61 6c 6c 20 74 68 65 20 73     /* call the s
141f0 75 70 70 6c 69 65 64 20 63 61 6c 6c 62 61 63 6b  upplied callback
14200 20 77 69 74 68 20 74 68 65 20 72 65 73 75 6c 74   with the result
14210 20 72 6f 77 20 64 61 74 61 20 2a 2f 0a 20 20 20   row data */.   
14220 20 20 20 20 20 20 20 69 66 28 20 73 68 65 6c 6c         if( shell
14230 5f 63 61 6c 6c 62 61 63 6b 28 70 41 72 67 2c 20  _callback(pArg, 
14240 6e 43 6f 6c 2c 20 61 7a 56 61 6c 73 2c 20 61 7a  nCol, azVals, az
14250 43 6f 6c 73 2c 20 61 69 54 79 70 65 73 29 20 29  Cols, aiTypes) )
14260 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  {.            rc
14270 20 3d 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 3b   = SQLITE_ABORT;
14280 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
14290 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  {.            rc
142a0 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28   = sqlite3_step(
142b0 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 20 20  pStmt);.        
142c0 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
142d0 20 20 20 20 7d 20 77 68 69 6c 65 28 20 53 51 4c      } while( SQL
142e0 49 54 45 5f 52 4f 57 20 3d 3d 20 72 63 20 29 3b  ITE_ROW == rc );
142f0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
14300 72 65 65 28 70 44 61 74 61 29 3b 0a 20 20 20 20  ree(pData);.    
14310 7d 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66  }.  }.}..#ifndef
14320 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
14330 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 0a 2a 2a 20  TUALTABLE./*.** 
14340 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
14350 20 63 61 6c 6c 65 64 20 74 6f 20 70 72 6f 63 65   called to proce
14360 73 73 20 53 51 4c 20 69 66 20 74 68 65 20 70 72  ss SQL if the pr
14370 65 76 69 6f 75 73 20 73 68 65 6c 6c 20 63 6f 6d  evious shell com
14380 6d 61 6e 64 0a 2a 2a 20 77 61 73 20 22 2e 65 78  mand.** was ".ex
14390 70 65 72 74 22 2e 20 49 74 20 70 61 73 73 65 73  pert". It passes
143a0 20 74 68 65 20 53 51 4c 20 69 6e 20 74 68 65 20   the SQL in the 
143b0 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
143c0 64 69 72 65 63 74 6c 79 20 74 6f 0a 2a 2a 20 74  directly to.** t
143d0 68 65 20 73 71 6c 69 74 65 33 65 78 70 65 72 74  he sqlite3expert
143e0 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 49   object..**.** I
143f0 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 53 51  f successful, SQ
14400 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
14410 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ned. Otherwise, 
14420 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 0a  an SQLite error.
14430 2a 2a 20 63 6f 64 65 2e 20 49 6e 20 74 68 69 73  ** code. In this
14440 20 63 61 73 65 2c 20 28 2a 70 7a 45 72 72 29 20   case, (*pzErr) 
14450 6d 61 79 20 62 65 20 73 65 74 20 74 6f 20 70 6f  may be set to po
14460 69 6e 74 20 74 6f 20 61 20 62 75 66 66 65 72 20  int to a buffer 
14470 63 6f 6e 74 61 69 6e 69 6e 67 0a 2a 2a 20 61 6e  containing.** an
14480 20 45 6e 67 6c 69 73 68 20 6c 61 6e 67 75 61 67   English languag
14490 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 2e  e error message.
144a0 20 49 74 20 69 73 20 74 68 65 20 72 65 73 70 6f   It is the respo
144b0 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65  nsibility of the
144c0 0a 2a 2a 20 63 61 6c 6c 65 72 20 74 6f 20 65 76  .** caller to ev
144d0 65 6e 74 75 61 6c 6c 79 20 66 72 65 65 20 74 68  entually free th
144e0 69 73 20 62 75 66 66 65 72 20 75 73 69 6e 67 20  is buffer using 
144f0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 29 2e 0a  sqlite3_free()..
14500 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78  */.static int ex
14510 70 65 72 74 48 61 6e 64 6c 65 53 51 4c 28 0a 20  pertHandleSQL(. 
14520 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 53 74   ShellState *pSt
14530 61 74 65 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68  ate, .  const ch
14540 61 72 20 2a 7a 53 71 6c 2c 20 0a 20 20 63 68 61  ar *zSql, .  cha
14550 72 20 2a 2a 70 7a 45 72 72 0a 29 7b 0a 20 20 61  r **pzErr.){.  a
14560 73 73 65 72 74 28 20 70 53 74 61 74 65 2d 3e 65  ssert( pState->e
14570 78 70 65 72 74 2e 70 45 78 70 65 72 74 20 29 3b  xpert.pExpert );
14580 0a 20 20 61 73 73 65 72 74 28 20 70 7a 45 72 72  .  assert( pzErr
14590 3d 3d 30 20 7c 7c 20 2a 70 7a 45 72 72 3d 3d 30  ==0 || *pzErr==0
145a0 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c   );.  return sql
145b0 69 74 65 33 5f 65 78 70 65 72 74 5f 73 71 6c 28  ite3_expert_sql(
145c0 70 53 74 61 74 65 2d 3e 65 78 70 65 72 74 2e 70  pState->expert.p
145d0 45 78 70 65 72 74 2c 20 7a 53 71 6c 2c 20 70 7a  Expert, zSql, pz
145e0 45 72 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  Err);.}../*.** T
145f0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
14600 63 61 6c 6c 65 64 20 65 69 74 68 65 72 20 74 6f  called either to
14610 20 73 69 6c 65 6e 74 6c 79 20 63 6c 65 61 6e 20   silently clean 
14620 75 70 20 74 68 65 20 6f 62 6a 65 63 74 0a 2a 2a  up the object.**
14630 20 63 72 65 61 74 65 64 20 62 79 20 74 68 65 20   created by the 
14640 22 2e 65 78 70 65 72 74 22 20 63 6f 6d 6d 61 6e  ".expert" comman
14650 64 20 28 69 66 20 62 43 61 6e 63 65 6c 3d 3d 31  d (if bCancel==1
14660 29 2c 20 6f 72 20 74 6f 20 67 65 6e 65 72 61 74  ), or to generat
14670 65 20 61 20 0a 2a 2a 20 72 65 70 6f 72 74 20 66  e a .** report f
14680 72 6f 6d 20 69 74 20 61 6e 64 20 74 68 65 6e 20  rom it and then 
14690 63 6c 65 61 6e 20 69 74 20 75 70 20 28 69 66 20  clean it up (if 
146a0 62 43 61 6e 63 65 6c 3d 3d 30 29 2e 0a 2a 2a 0a  bCancel==0)..**.
146b0 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c  ** If successful
146c0 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  , SQLITE_OK is r
146d0 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69  eturned. Otherwi
146e0 73 65 2c 20 61 6e 20 53 51 4c 69 74 65 20 65 72  se, an SQLite er
146f0 72 6f 72 0a 2a 2a 20 63 6f 64 65 2e 20 49 6e 20  ror.** code. In 
14700 74 68 69 73 20 63 61 73 65 2c 20 28 2a 70 7a 45  this case, (*pzE
14710 72 72 29 20 6d 61 79 20 62 65 20 73 65 74 20 74  rr) may be set t
14720 6f 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75 66  o point to a buf
14730 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 0a 2a  fer containing.*
14740 2a 20 61 6e 20 45 6e 67 6c 69 73 68 20 6c 61 6e  * an English lan
14750 67 75 61 67 65 20 65 72 72 6f 72 20 6d 65 73 73  guage error mess
14760 61 67 65 2e 20 49 74 20 69 73 20 74 68 65 20 72  age. It is the r
14770 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66  esponsibility of
14780 20 74 68 65 0a 2a 2a 20 63 61 6c 6c 65 72 20 74   the.** caller t
14790 6f 20 65 76 65 6e 74 75 61 6c 6c 79 20 66 72 65  o eventually fre
147a0 65 20 74 68 69 73 20 62 75 66 66 65 72 20 75 73  e this buffer us
147b0 69 6e 67 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ing sqlite3_free
147c0 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ()..*/.static in
147d0 74 20 65 78 70 65 72 74 46 69 6e 69 73 68 28 0a  t expertFinish(.
147e0 20 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 53    ShellState *pS
147f0 74 61 74 65 2c 0a 20 20 69 6e 74 20 62 43 61 6e  tate,.  int bCan
14800 63 65 6c 2c 0a 20 20 63 68 61 72 20 2a 2a 70 7a  cel,.  char **pz
14810 45 72 72 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20  Err.){.  int rc 
14820 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 73  = SQLITE_OK;.  s
14830 71 6c 69 74 65 33 65 78 70 65 72 74 20 2a 70 20  qlite3expert *p 
14840 3d 20 70 53 74 61 74 65 2d 3e 65 78 70 65 72 74  = pState->expert
14850 2e 70 45 78 70 65 72 74 3b 0a 20 20 61 73 73 65  .pExpert;.  asse
14860 72 74 28 20 70 20 29 3b 0a 20 20 61 73 73 65 72  rt( p );.  asser
14870 74 28 20 62 43 61 6e 63 65 6c 20 7c 7c 20 70 7a  t( bCancel || pz
14880 45 72 72 3d 3d 30 20 7c 7c 20 2a 70 7a 45 72 72  Err==0 || *pzErr
14890 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 62 43 61  ==0 );.  if( bCa
148a0 6e 63 65 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 46  ncel==0 ){.    F
148b0 49 4c 45 20 2a 6f 75 74 20 3d 20 70 53 74 61 74  ILE *out = pStat
148c0 65 2d 3e 6f 75 74 3b 0a 20 20 20 20 69 6e 74 20  e->out;.    int 
148d0 62 56 65 72 62 6f 73 65 20 3d 20 70 53 74 61 74  bVerbose = pStat
148e0 65 2d 3e 65 78 70 65 72 74 2e 62 56 65 72 62 6f  e->expert.bVerbo
148f0 73 65 3b 0a 0a 20 20 20 20 72 63 20 3d 20 73 71  se;..    rc = sq
14900 6c 69 74 65 33 5f 65 78 70 65 72 74 5f 61 6e 61  lite3_expert_ana
14910 6c 79 7a 65 28 70 2c 20 70 7a 45 72 72 29 3b 0a  lyze(p, pzErr);.
14920 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
14930 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69  TE_OK ){.      i
14940 6e 74 20 6e 51 75 65 72 79 20 3d 20 73 71 6c 69  nt nQuery = sqli
14950 74 65 33 5f 65 78 70 65 72 74 5f 63 6f 75 6e 74  te3_expert_count
14960 28 70 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 69  (p);.      int i
14970 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 62 56 65  ;..      if( bVe
14980 72 62 6f 73 65 20 29 7b 0a 20 20 20 20 20 20 20  rbose ){.       
14990 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 61   const char *zCa
149a0 6e 64 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 70  nd = sqlite3_exp
149b0 65 72 74 5f 72 65 70 6f 72 74 28 70 2c 30 2c 45  ert_report(p,0,E
149c0 58 50 45 52 54 5f 52 45 50 4f 52 54 5f 43 41 4e  XPERT_REPORT_CAN
149d0 44 49 44 41 54 45 53 29 3b 0a 20 20 20 20 20 20  DIDATES);.      
149e0 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74    raw_printf(out
149f0 2c 20 22 2d 2d 20 43 61 6e 64 69 64 61 74 65 73  , "-- Candidates
14a00 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   ---------------
14a10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 5c 6e  --------------\n
14a20 22 29 3b 0a 20 20 20 20 20 20 20 20 72 61 77 5f  ");.        raw_
14a30 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 73 5c  printf(out, "%s\
14a40 6e 22 2c 20 7a 43 61 6e 64 29 3b 0a 20 20 20 20  n", zCand);.    
14a50 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 69 3d    }.      for(i=
14a60 30 3b 20 69 3c 6e 51 75 65 72 79 3b 20 69 2b 2b  0; i<nQuery; i++
14a70 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74  ){.        const
14a80 20 63 68 61 72 20 2a 7a 53 71 6c 20 3d 20 73 71   char *zSql = sq
14a90 6c 69 74 65 33 5f 65 78 70 65 72 74 5f 72 65 70  lite3_expert_rep
14aa0 6f 72 74 28 70 2c 20 69 2c 20 45 58 50 45 52 54  ort(p, i, EXPERT
14ab0 5f 52 45 50 4f 52 54 5f 53 51 4c 29 3b 0a 20 20  _REPORT_SQL);.  
14ac0 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
14ad0 20 2a 7a 49 64 78 20 3d 20 73 71 6c 69 74 65 33   *zIdx = sqlite3
14ae0 5f 65 78 70 65 72 74 5f 72 65 70 6f 72 74 28 70  _expert_report(p
14af0 2c 20 69 2c 20 45 58 50 45 52 54 5f 52 45 50 4f  , i, EXPERT_REPO
14b00 52 54 5f 49 4e 44 45 58 45 53 29 3b 0a 20 20 20  RT_INDEXES);.   
14b10 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
14b20 2a 7a 45 51 50 20 3d 20 73 71 6c 69 74 65 33 5f  *zEQP = sqlite3_
14b30 65 78 70 65 72 74 5f 72 65 70 6f 72 74 28 70 2c  expert_report(p,
14b40 20 69 2c 20 45 58 50 45 52 54 5f 52 45 50 4f 52   i, EXPERT_REPOR
14b50 54 5f 50 4c 41 4e 29 3b 0a 20 20 20 20 20 20 20  T_PLAN);.       
14b60 20 69 66 28 20 7a 49 64 78 3d 3d 30 20 29 20 7a   if( zIdx==0 ) z
14b70 49 64 78 20 3d 20 22 28 6e 6f 20 6e 65 77 20 69  Idx = "(no new i
14b80 6e 64 65 78 65 73 29 5c 6e 22 3b 0a 20 20 20 20  ndexes)\n";.    
14b90 20 20 20 20 69 66 28 20 62 56 65 72 62 6f 73 65      if( bVerbose
14ba0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 61   ){.          ra
14bb0 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 2d  w_printf(out, "-
14bc0 2d 20 51 75 65 72 79 20 25 64 20 2d 2d 2d 2d 2d  - Query %d -----
14bd0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14be0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 5c 6e 22 2c 69  -----------\n",i
14bf0 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  +1);.          r
14c00 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22  aw_printf(out, "
14c10 25 73 5c 6e 5c 6e 22 2c 20 7a 53 71 6c 29 3b 0a  %s\n\n", zSql);.
14c20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
14c30 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74    raw_printf(out
14c40 2c 20 22 25 73 5c 6e 22 2c 20 7a 49 64 78 29 3b  , "%s\n", zIdx);
14c50 0a 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69  .        raw_pri
14c60 6e 74 66 28 6f 75 74 2c 20 22 25 73 5c 6e 22 2c  ntf(out, "%s\n",
14c70 20 7a 45 51 50 29 3b 0a 20 20 20 20 20 20 7d 0a   zEQP);.      }.
14c80 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
14c90 74 65 33 5f 65 78 70 65 72 74 5f 64 65 73 74 72  te3_expert_destr
14ca0 6f 79 28 70 29 3b 0a 20 20 70 53 74 61 74 65 2d  oy(p);.  pState-
14cb0 3e 65 78 70 65 72 74 2e 70 45 78 70 65 72 74 20  >expert.pExpert 
14cc0 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  = 0;.  return rc
14cd0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65  ;.}../*.** Imple
14ce0 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 22 2e 65  mentation of ".e
14cf0 78 70 65 72 74 22 20 64 6f 74 20 63 6f 6d 6d 61  xpert" dot comma
14d00 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  nd..*/.static in
14d10 74 20 65 78 70 65 72 74 44 6f 74 43 6f 6d 6d 61  t expertDotComma
14d20 6e 64 28 0a 20 20 53 68 65 6c 6c 53 74 61 74 65  nd(.  ShellState
14d30 20 2a 70 53 74 61 74 65 2c 20 20 20 20 20 20 20   *pState,       
14d40 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74        /* Current
14d50 20 73 68 65 6c 6c 20 74 6f 6f 6c 20 73 74 61 74   shell tool stat
14d60 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 7a  e */.  char **az
14d70 41 72 67 2c 20 20 20 20 20 20 20 20 20 20 20 20  Arg,            
14d80 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20         /* Array 
14d90 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 70 61 73  of arguments pas
14da0 73 65 64 20 74 6f 20 64 6f 74 20 63 6f 6d 6d 61  sed to dot comma
14db0 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 72 67  nd */.  int nArg
14dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14dd0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
14de0 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20  r of entries in 
14df0 61 7a 41 72 67 5b 5d 20 2a 2f 0a 29 7b 0a 20 20  azArg[] */.){.  
14e00 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
14e10 4f 4b 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72  OK;.  char *zErr
14e20 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20   = 0;.  int i;. 
14e30 20 69 6e 74 20 69 53 61 6d 70 6c 65 20 3d 20 30   int iSample = 0
14e40 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 53 74  ;..  assert( pSt
14e50 61 74 65 2d 3e 65 78 70 65 72 74 2e 70 45 78 70  ate->expert.pExp
14e60 65 72 74 3d 3d 30 20 29 3b 0a 20 20 6d 65 6d 73  ert==0 );.  mems
14e70 65 74 28 26 70 53 74 61 74 65 2d 3e 65 78 70 65  et(&pState->expe
14e80 72 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28 45 78  rt, 0, sizeof(Ex
14e90 70 65 72 74 49 6e 66 6f 29 29 3b 0a 0a 20 20 66  pertInfo));..  f
14ea0 6f 72 28 69 3d 31 3b 20 72 63 3d 3d 53 51 4c 49  or(i=1; rc==SQLI
14eb0 54 45 5f 4f 4b 20 26 26 20 69 3c 6e 41 72 67 3b  TE_OK && i<nArg;
14ec0 20 69 2b 2b 29 7b 0a 20 20 20 20 63 68 61 72 20   i++){.    char 
14ed0 2a 7a 20 3d 20 61 7a 41 72 67 5b 69 5d 3b 0a 20  *z = azArg[i];. 
14ee0 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 69 66     int n;.    if
14ef0 28 20 7a 5b 30 5d 3d 3d 27 2d 27 20 26 26 20 7a  ( z[0]=='-' && z
14f00 5b 31 5d 3d 3d 27 2d 27 20 29 20 7a 2b 2b 3b 0a  [1]=='-' ) z++;.
14f10 20 20 20 20 6e 20 3d 20 73 74 72 6c 65 6e 33 30      n = strlen30
14f20 28 7a 29 3b 0a 20 20 20 20 69 66 28 20 6e 3e 3d  (z);.    if( n>=
14f30 32 20 26 26 20 30 3d 3d 73 74 72 6e 63 6d 70 28  2 && 0==strncmp(
14f40 7a 2c 20 22 2d 76 65 72 62 6f 73 65 22 2c 20 6e  z, "-verbose", n
14f50 29 20 29 7b 0a 20 20 20 20 20 20 70 53 74 61 74  ) ){.      pStat
14f60 65 2d 3e 65 78 70 65 72 74 2e 62 56 65 72 62 6f  e->expert.bVerbo
14f70 73 65 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  se = 1;.    }.  
14f80 20 20 65 6c 73 65 20 69 66 28 20 6e 3e 3d 32 20    else if( n>=2 
14f90 26 26 20 30 3d 3d 73 74 72 6e 63 6d 70 28 7a 2c  && 0==strncmp(z,
14fa0 20 22 2d 73 61 6d 70 6c 65 22 2c 20 6e 29 20 29   "-sample", n) )
14fb0 7b 0a 20 20 20 20 20 20 69 66 28 20 69 3d 3d 28  {.      if( i==(
14fc0 6e 41 72 67 2d 31 29 20 29 7b 0a 20 20 20 20 20  nArg-1) ){.     
14fd0 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74     raw_printf(st
14fe0 64 65 72 72 2c 20 22 6f 70 74 69 6f 6e 20 72 65  derr, "option re
14ff0 71 75 69 72 65 73 20 61 6e 20 61 72 67 75 6d 65  quires an argume
15000 6e 74 3a 20 25 73 5c 6e 22 2c 20 7a 29 3b 0a 20  nt: %s\n", z);. 
15010 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
15020 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  TE_ERROR;.      
15030 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69  }else{.        i
15040 53 61 6d 70 6c 65 20 3d 20 28 69 6e 74 29 69 6e  Sample = (int)in
15050 74 65 67 65 72 56 61 6c 75 65 28 61 7a 41 72 67  tegerValue(azArg
15060 5b 2b 2b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20  [++i]);.        
15070 69 66 28 20 69 53 61 6d 70 6c 65 3c 30 20 7c 7c  if( iSample<0 ||
15080 20 69 53 61 6d 70 6c 65 3e 31 30 30 20 29 7b 0a   iSample>100 ){.
15090 20 20 20 20 20 20 20 20 20 20 72 61 77 5f 70 72            raw_pr
150a0 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 76 61  intf(stderr, "va
150b0 6c 75 65 20 6f 75 74 20 6f 66 20 72 61 6e 67 65  lue out of range
150c0 3a 20 25 73 5c 6e 22 2c 20 61 7a 41 72 67 5b 69  : %s\n", azArg[i
150d0 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63  ]);.          rc
150e0 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
150f0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
15100 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 65 6c 73   }.    }.    els
15110 65 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69  e{.      raw_pri
15120 6e 74 66 28 73 74 64 65 72 72 2c 20 22 75 6e 6b  ntf(stderr, "unk
15130 6e 6f 77 6e 20 6f 70 74 69 6f 6e 3a 20 25 73 5c  nown option: %s\
15140 6e 22 2c 20 7a 29 3b 0a 20 20 20 20 20 20 72 63  n", z);.      rc
15150 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
15160 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66  .    }.  }..  if
15170 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
15180 29 7b 0a 20 20 20 20 70 53 74 61 74 65 2d 3e 65  ){.    pState->e
15190 78 70 65 72 74 2e 70 45 78 70 65 72 74 20 3d 20  xpert.pExpert = 
151a0 73 71 6c 69 74 65 33 5f 65 78 70 65 72 74 5f 6e  sqlite3_expert_n
151b0 65 77 28 70 53 74 61 74 65 2d 3e 64 62 2c 20 26  ew(pState->db, &
151c0 7a 45 72 72 29 3b 0a 20 20 20 20 69 66 28 20 70  zErr);.    if( p
151d0 53 74 61 74 65 2d 3e 65 78 70 65 72 74 2e 70 45  State->expert.pE
151e0 78 70 65 72 74 3d 3d 30 20 29 7b 0a 20 20 20 20  xpert==0 ){.    
151f0 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64    raw_printf(std
15200 65 72 72 2c 20 22 73 71 6c 69 74 65 33 5f 65 78  err, "sqlite3_ex
15210 70 65 72 74 5f 6e 65 77 3a 20 25 73 5c 6e 22 2c  pert_new: %s\n",
15220 20 7a 45 72 72 29 3b 0a 20 20 20 20 20 20 72 63   zErr);.      rc
15230 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
15240 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
15250 20 20 73 71 6c 69 74 65 33 5f 65 78 70 65 72 74    sqlite3_expert
15260 5f 63 6f 6e 66 69 67 28 0a 20 20 20 20 20 20 20  _config(.       
15270 20 20 20 70 53 74 61 74 65 2d 3e 65 78 70 65 72     pState->exper
15280 74 2e 70 45 78 70 65 72 74 2c 20 45 58 50 45 52  t.pExpert, EXPER
15290 54 5f 43 4f 4e 46 49 47 5f 53 41 4d 50 4c 45 2c  T_CONFIG_SAMPLE,
152a0 20 69 53 61 6d 70 6c 65 0a 20 20 20 20 20 20 29   iSample.      )
152b0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  ;.    }.  }..  r
152c0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64  eturn rc;.}.#end
152d0 69 66 20 2f 2a 20 69 66 6e 64 65 66 20 53 51 4c  if /* ifndef SQL
152e0 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
152f0 54 41 42 4c 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  TABLE */../*.** 
15300 45 78 65 63 75 74 65 20 61 20 73 74 61 74 65 6d  Execute a statem
15310 65 6e 74 20 6f 72 20 73 65 74 20 6f 66 20 73 74  ent or set of st
15320 61 74 65 6d 65 6e 74 73 2e 20 20 50 72 69 6e 74  atements.  Print
15330 0a 2a 2a 20 61 6e 79 20 72 65 73 75 6c 74 20 72  .** any result r
15340 6f 77 73 2f 63 6f 6c 75 6d 6e 73 20 64 65 70 65  ows/columns depe
15350 6e 64 69 6e 67 20 6f 6e 20 74 68 65 20 63 75 72  nding on the cur
15360 72 65 6e 74 20 6d 6f 64 65 0a 2a 2a 20 73 65 74  rent mode.** set
15370 20 76 69 61 20 74 68 65 20 73 75 70 70 6c 69 65   via the supplie
15380 64 20 63 61 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a  d callback..**.*
15390 2a 20 54 68 69 73 20 69 73 20 76 65 72 79 20 73  * This is very s
153a0 69 6d 69 6c 61 72 20 74 6f 20 53 51 4c 69 74 65  imilar to SQLite
153b0 27 73 20 62 75 69 6c 74 2d 69 6e 20 73 71 6c 69  's built-in sqli
153c0 74 65 33 5f 65 78 65 63 28 29 0a 2a 2a 20 66 75  te3_exec().** fu
153d0 6e 63 74 69 6f 6e 20 65 78 63 65 70 74 20 69 74  nction except it
153e0 20 74 61 6b 65 73 20 61 20 73 6c 69 67 68 74 6c   takes a slightl
153f0 79 20 64 69 66 66 65 72 65 6e 74 20 63 61 6c 6c  y different call
15400 62 61 63 6b 0a 2a 2a 20 61 6e 64 20 63 61 6c 6c  back.** and call
15410 62 61 63 6b 20 64 61 74 61 20 61 72 67 75 6d 65  back data argume
15420 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  nt..*/.static in
15430 74 20 73 68 65 6c 6c 5f 65 78 65 63 28 0a 20 20  t shell_exec(.  
15440 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 41 72 67  ShellState *pArg
15450 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
15460 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
15470 6e 74 65 72 20 74 6f 20 53 68 65 6c 6c 53 74 61  nter to ShellSta
15480 74 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  te */.  const ch
15490 61 72 20 2a 7a 53 71 6c 2c 20 20 20 20 20 20 20  ar *zSql,       
154a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
154b0 20 20 2f 2a 20 53 51 4c 20 74 6f 20 62 65 20 65    /* SQL to be e
154c0 76 61 6c 75 61 74 65 64 20 2a 2f 0a 20 20 63 68  valuated */.  ch
154d0 61 72 20 2a 2a 70 7a 45 72 72 4d 73 67 20 20 20  ar **pzErrMsg   
154e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
154f0 20 20 20 20 20 20 20 20 2f 2a 20 45 72 72 6f 72          /* Error
15500 20 6d 73 67 20 77 72 69 74 74 65 6e 20 68 65 72   msg written her
15510 65 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  e */.){.  sqlite
15520 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20  3_stmt *pStmt = 
15530 4e 55 4c 4c 3b 20 20 20 20 20 2f 2a 20 53 74 61  NULL;     /* Sta
15540 74 65 6d 65 6e 74 20 74 6f 20 65 78 65 63 75 74  tement to execut
15550 65 2e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  e. */.  int rc =
15560 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
15570 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
15580 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  n Code */.  int 
15590 72 63 32 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  rc2;.  const cha
155a0 72 20 2a 7a 4c 65 66 74 6f 76 65 72 3b 20 20 20  r *zLeftover;   
155b0 20 20 20 20 20 20 20 2f 2a 20 54 61 69 6c 20 6f         /* Tail o
155c0 66 20 75 6e 70 72 6f 63 65 73 73 65 64 20 53 51  f unprocessed SQ
155d0 4c 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  L */.  sqlite3 *
155e0 64 62 20 3d 20 70 41 72 67 2d 3e 64 62 3b 0a 0a  db = pArg->db;..
155f0 20 20 69 66 28 20 70 7a 45 72 72 4d 73 67 20 29    if( pzErrMsg )
15600 7b 0a 20 20 20 20 2a 70 7a 45 72 72 4d 73 67 20  {.    *pzErrMsg 
15610 3d 20 4e 55 4c 4c 3b 0a 20 20 7d 0a 0a 23 69 66  = NULL;.  }..#if
15620 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
15630 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20  _VIRTUALTABLE.  
15640 69 66 28 20 70 41 72 67 2d 3e 65 78 70 65 72 74  if( pArg->expert
15650 2e 70 45 78 70 65 72 74 20 29 7b 0a 20 20 20 20  .pExpert ){.    
15660 72 63 20 3d 20 65 78 70 65 72 74 48 61 6e 64 6c  rc = expertHandl
15670 65 53 51 4c 28 70 41 72 67 2c 20 7a 53 71 6c 2c  eSQL(pArg, zSql,
15680 20 70 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20   pzErrMsg);.    
15690 72 65 74 75 72 6e 20 65 78 70 65 72 74 46 69 6e  return expertFin
156a0 69 73 68 28 70 41 72 67 2c 20 28 72 63 21 3d 53  ish(pArg, (rc!=S
156b0 51 4c 49 54 45 5f 4f 4b 29 2c 20 70 7a 45 72 72  QLITE_OK), pzErr
156c0 4d 73 67 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  Msg);.  }.#endif
156d0 0a 0a 20 20 77 68 69 6c 65 28 20 7a 53 71 6c 5b  ..  while( zSql[
156e0 30 5d 20 26 26 20 28 53 51 4c 49 54 45 5f 4f 4b  0] && (SQLITE_OK
156f0 20 3d 3d 20 72 63 29 20 29 7b 0a 20 20 20 20 73   == rc) ){.    s
15700 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
15710 20 2a 7a 53 74 6d 74 53 71 6c 3b 0a 20 20 20 20   *zStmtSql;.    
15720 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65  rc = sqlite3_pre
15730 70 61 72 65 5f 76 32 28 64 62 2c 20 7a 53 71 6c  pare_v2(db, zSql
15740 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 26 7a  , -1, &pStmt, &z
15750 4c 65 66 74 6f 76 65 72 29 3b 0a 20 20 20 20 69  Leftover);.    i
15760 66 28 20 53 51 4c 49 54 45 5f 4f 4b 20 21 3d 20  f( SQLITE_OK != 
15770 72 63 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  rc ){.      if( 
15780 70 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20  pzErrMsg ){.    
15790 20 20 20 20 2a 70 7a 45 72 72 4d 73 67 20 3d 20      *pzErrMsg = 
157a0 73 61 76 65 5f 65 72 72 5f 6d 73 67 28 64 62 29  save_err_msg(db)
157b0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
157c0 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20 21  lse{.      if( !
157d0 70 53 74 6d 74 20 29 7b 0a 20 20 20 20 20 20 20  pStmt ){.       
157e0 20 2f 2a 20 74 68 69 73 20 68 61 70 70 65 6e 73   /* this happens
157f0 20 66 6f 72 20 61 20 63 6f 6d 6d 65 6e 74 20 6f   for a comment o
15800 72 20 77 68 69 74 65 2d 73 70 61 63 65 20 2a 2f  r white-space */
15810 0a 20 20 20 20 20 20 20 20 7a 53 71 6c 20 3d 20  .        zSql = 
15820 7a 4c 65 66 74 6f 76 65 72 3b 0a 20 20 20 20 20  zLeftover;.     
15830 20 20 20 77 68 69 6c 65 28 20 49 73 53 70 61 63     while( IsSpac
15840 65 28 7a 53 71 6c 5b 30 5d 29 20 29 20 7a 53 71  e(zSql[0]) ) zSq
15850 6c 2b 2b 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e  l++;.        con
15860 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20  tinue;.      }. 
15870 20 20 20 20 20 7a 53 74 6d 74 53 71 6c 20 3d 20       zStmtSql = 
15880 73 71 6c 69 74 65 33 5f 73 71 6c 28 70 53 74 6d  sqlite3_sql(pStm
15890 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 53  t);.      if( zS
158a0 74 6d 74 53 71 6c 3d 3d 30 20 29 20 7a 53 74 6d  tmtSql==0 ) zStm
158b0 74 53 71 6c 20 3d 20 22 22 3b 0a 20 20 20 20 20  tSql = "";.     
158c0 20 77 68 69 6c 65 28 20 49 73 53 70 61 63 65 28   while( IsSpace(
158d0 7a 53 74 6d 74 53 71 6c 5b 30 5d 29 20 29 20 7a  zStmtSql[0]) ) z
158e0 53 74 6d 74 53 71 6c 2b 2b 3b 0a 0a 20 20 20 20  StmtSql++;..    
158f0 20 20 2f 2a 20 73 61 76 65 20 6f 66 66 20 74 68    /* save off th
15900 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74 6d  e prepared statm
15910 65 6e 74 20 68 61 6e 64 6c 65 20 61 6e 64 20 72  ent handle and r
15920 65 73 65 74 20 72 6f 77 20 63 6f 75 6e 74 20 2a  eset row count *
15930 2f 0a 20 20 20 20 20 20 69 66 28 20 70 41 72 67  /.      if( pArg
15940 20 29 7b 0a 20 20 20 20 20 20 20 20 70 41 72 67   ){.        pArg
15950 2d 3e 70 53 74 6d 74 20 3d 20 70 53 74 6d 74 3b  ->pStmt = pStmt;
15960 0a 20 20 20 20 20 20 20 20 70 41 72 67 2d 3e 63  .        pArg->c
15970 6e 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  nt = 0;.      }.
15980 0a 20 20 20 20 20 20 2f 2a 20 65 63 68 6f 20 74  .      /* echo t
15990 68 65 20 73 71 6c 20 73 74 61 74 65 6d 65 6e 74  he sql statement
159a0 20 69 66 20 65 63 68 6f 20 6f 6e 20 2a 2f 0a 20   if echo on */. 
159b0 20 20 20 20 20 69 66 28 20 70 41 72 67 20 26 26       if( pArg &&
159c0 20 53 68 65 6c 6c 48 61 73 46 6c 61 67 28 70 41   ShellHasFlag(pA
159d0 72 67 2c 20 53 48 46 4c 47 5f 45 63 68 6f 29 20  rg, SHFLG_Echo) 
159e0 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f  ){.        utf8_
159f0 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74  printf(pArg->out
15a00 2c 20 22 25 73 5c 6e 22 2c 20 7a 53 74 6d 74 53  , "%s\n", zStmtS
15a10 71 6c 20 3f 20 7a 53 74 6d 74 53 71 6c 20 3a 20  ql ? zStmtSql : 
15a20 7a 53 71 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 0a  zSql);.      }..
15a30 20 20 20 20 20 20 2f 2a 20 53 68 6f 77 20 74 68        /* Show th
15a40 65 20 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20  e EXPLAIN QUERY 
15a50 50 4c 41 4e 20 69 66 20 2e 65 71 70 20 69 73 20  PLAN if .eqp is 
15a60 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  on */.      if( 
15a70 70 41 72 67 20 26 26 20 70 41 72 67 2d 3e 61 75  pArg && pArg->au
15a80 74 6f 45 51 50 20 26 26 20 73 71 6c 69 74 65 33  toEQP && sqlite3
15a90 5f 73 74 72 6c 69 6b 65 28 22 45 58 50 4c 41 49  _strlike("EXPLAI
15aa0 4e 25 22 2c 7a 53 74 6d 74 53 71 6c 2c 30 29 21  N%",zStmtSql,0)!
15ab0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =0 ){.        sq
15ac0 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 45 78 70  lite3_stmt *pExp
15ad0 6c 61 69 6e 3b 0a 20 20 20 20 20 20 20 20 63 68  lain;.        ch
15ae0 61 72 20 2a 7a 45 51 50 3b 0a 20 20 20 20 20 20  ar *zEQP;.      
15af0 20 20 69 6e 74 20 74 72 69 67 67 65 72 45 51 50    int triggerEQP
15b00 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 64 69   = 0;.        di
15b10 73 61 62 6c 65 5f 64 65 62 75 67 5f 74 72 61 63  sable_debug_trac
15b20 65 5f 6d 6f 64 65 73 28 29 3b 0a 20 20 20 20 20  e_modes();.     
15b30 20 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 63 6f     sqlite3_db_co
15b40 6e 66 69 67 28 64 62 2c 20 53 51 4c 49 54 45 5f  nfig(db, SQLITE_
15b50 44 42 43 4f 4e 46 49 47 5f 54 52 49 47 47 45 52  DBCONFIG_TRIGGER
15b60 5f 45 51 50 2c 20 2d 31 2c 20 26 74 72 69 67 67  _EQP, -1, &trigg
15b70 65 72 45 51 50 29 3b 0a 20 20 20 20 20 20 20 20  erEQP);.        
15b80 69 66 28 20 70 41 72 67 2d 3e 61 75 74 6f 45 51  if( pArg->autoEQ
15b90 50 3e 3d 41 55 54 4f 45 51 50 5f 74 72 69 67 67  P>=AUTOEQP_trigg
15ba0 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  er ){.          
15bb0 73 71 6c 69 74 65 33 5f 64 62 5f 63 6f 6e 66 69  sqlite3_db_confi
15bc0 67 28 64 62 2c 20 53 51 4c 49 54 45 5f 44 42 43  g(db, SQLITE_DBC
15bd0 4f 4e 46 49 47 5f 54 52 49 47 47 45 52 5f 45 51  ONFIG_TRIGGER_EQ
15be0 50 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20  P, 1, 0);.      
15bf0 20 20 7d 0a 20 20 20 20 20 20 20 20 7a 45 51 50    }.        zEQP
15c00 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
15c10 74 66 28 22 45 58 50 4c 41 49 4e 20 51 55 45 52  tf("EXPLAIN QUER
15c20 59 20 50 4c 41 4e 20 25 73 22 2c 20 7a 53 74 6d  Y PLAN %s", zStm
15c30 74 53 71 6c 29 3b 0a 20 20 20 20 20 20 20 20 72  tSql);.        r
15c40 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70  c = sqlite3_prep
15c50 61 72 65 5f 76 32 28 64 62 2c 20 7a 45 51 50 2c  are_v2(db, zEQP,
15c60 20 2d 31 2c 20 26 70 45 78 70 6c 61 69 6e 2c 20   -1, &pExplain, 
15c70 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  0);.        if( 
15c80 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
15c90 0a 20 20 20 20 20 20 20 20 20 20 77 68 69 6c 65  .          while
15ca0 28 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70  ( sqlite3_step(p
15cb0 45 78 70 6c 61 69 6e 29 3d 3d 53 51 4c 49 54 45  Explain)==SQLITE
15cc0 5f 52 4f 57 20 29 7b 0a 20 20 20 20 20 20 20 20  _ROW ){.        
15cd0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
15ce0 7a 45 51 50 4c 69 6e 65 20 3d 20 28 63 6f 6e 73  zEQPLine = (cons
15cf0 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f  t char*)sqlite3_
15d00 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 45 78 70  column_text(pExp
15d10 6c 61 69 6e 2c 33 29 3b 0a 20 20 20 20 20 20 20  lain,3);.       
15d20 20 20 20 20 20 69 6e 74 20 69 45 71 70 49 64 20       int iEqpId 
15d30 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
15d40 5f 69 6e 74 28 70 45 78 70 6c 61 69 6e 2c 20 30  _int(pExplain, 0
15d50 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
15d60 6e 74 20 69 50 61 72 65 6e 74 49 64 20 3d 20 73  nt iParentId = s
15d70 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e  qlite3_column_in
15d80 74 28 70 45 78 70 6c 61 69 6e 2c 20 31 29 3b 0a  t(pExplain, 1);.
15d90 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
15da0 7a 45 51 50 4c 69 6e 65 5b 30 5d 3d 3d 27 2d 27  zEQPLine[0]=='-'
15db0 20 29 20 65 71 70 5f 72 65 6e 64 65 72 28 70 41   ) eqp_render(pA
15dc0 72 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  rg);.           
15dd0 20 65 71 70 5f 61 70 70 65 6e 64 28 70 41 72 67   eqp_append(pArg
15de0 2c 20 69 45 71 70 49 64 2c 20 69 50 61 72 65 6e  , iEqpId, iParen
15df0 74 49 64 2c 20 7a 45 51 50 4c 69 6e 65 29 3b 0a  tId, zEQPLine);.
15e00 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
15e10 20 20 20 20 20 20 65 71 70 5f 72 65 6e 64 65 72        eqp_render
15e20 28 70 41 72 67 29 3b 0a 20 20 20 20 20 20 20 20  (pArg);.        
15e30 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  }.        sqlite
15e40 33 5f 66 69 6e 61 6c 69 7a 65 28 70 45 78 70 6c  3_finalize(pExpl
15e50 61 69 6e 29 3b 0a 20 20 20 20 20 20 20 20 73 71  ain);.        sq
15e60 6c 69 74 65 33 5f 66 72 65 65 28 7a 45 51 50 29  lite3_free(zEQP)
15e70 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 41  ;.        if( pA
15e80 72 67 2d 3e 61 75 74 6f 45 51 50 3e 3d 41 55 54  rg->autoEQP>=AUT
15e90 4f 45 51 50 5f 66 75 6c 6c 20 29 7b 0a 20 20 20  OEQP_full ){.   
15ea0 20 20 20 20 20 20 20 2f 2a 20 41 6c 73 6f 20 64         /* Also d
15eb0 6f 20 61 6e 20 45 58 50 4c 41 49 4e 20 66 6f 72  o an EXPLAIN for
15ec0 20 22 2e 65 71 70 20 66 75 6c 6c 22 20 6d 6f 64   ".eqp full" mod
15ed0 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 7a  e */.          z
15ee0 45 51 50 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  EQP = sqlite3_mp
15ef0 72 69 6e 74 66 28 22 45 58 50 4c 41 49 4e 20 25  rintf("EXPLAIN %
15f00 73 22 2c 20 7a 53 74 6d 74 53 71 6c 29 3b 0a 20  s", zStmtSql);. 
15f10 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
15f20 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32  lite3_prepare_v2
15f30 28 64 62 2c 20 7a 45 51 50 2c 20 2d 31 2c 20 26  (db, zEQP, -1, &
15f40 70 45 78 70 6c 61 69 6e 2c 20 30 29 3b 0a 20 20  pExplain, 0);.  
15f50 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
15f60 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
15f70 20 20 20 20 20 20 20 20 20 70 41 72 67 2d 3e 63           pArg->c
15f80 4d 6f 64 65 20 3d 20 4d 4f 44 45 5f 45 78 70 6c  Mode = MODE_Expl
15f90 61 69 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ain;.           
15fa0 20 65 78 70 6c 61 69 6e 5f 64 61 74 61 5f 70 72   explain_data_pr
15fb0 65 70 61 72 65 28 70 41 72 67 2c 20 70 45 78 70  epare(pArg, pExp
15fc0 6c 61 69 6e 29 3b 0a 20 20 20 20 20 20 20 20 20  lain);.         
15fd0 20 20 20 65 78 65 63 5f 70 72 65 70 61 72 65 64     exec_prepared
15fe0 5f 73 74 6d 74 28 70 41 72 67 2c 20 70 45 78 70  _stmt(pArg, pExp
15ff0 6c 61 69 6e 29 3b 0a 20 20 20 20 20 20 20 20 20  lain);.         
16000 20 20 20 65 78 70 6c 61 69 6e 5f 64 61 74 61 5f     explain_data_
16010 64 65 6c 65 74 65 28 70 41 72 67 29 3b 0a 20 20  delete(pArg);.  
16020 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
16030 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61      sqlite3_fina
16040 6c 69 7a 65 28 70 45 78 70 6c 61 69 6e 29 3b 0a  lize(pExplain);.
16050 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
16060 33 5f 66 72 65 65 28 7a 45 51 50 29 3b 0a 20 20  3_free(zEQP);.  
16070 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
16080 69 66 28 20 70 41 72 67 2d 3e 61 75 74 6f 45 51  if( pArg->autoEQ
16090 50 3e 3d 41 55 54 4f 45 51 50 5f 74 72 69 67 67  P>=AUTOEQP_trigg
160a0 65 72 20 26 26 20 74 72 69 67 67 65 72 45 51 50  er && triggerEQP
160b0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
160c0 20 73 71 6c 69 74 65 33 5f 64 62 5f 63 6f 6e 66   sqlite3_db_conf
160d0 69 67 28 64 62 2c 20 53 51 4c 49 54 45 5f 44 42  ig(db, SQLITE_DB
160e0 43 4f 4e 46 49 47 5f 54 52 49 47 47 45 52 5f 45  CONFIG_TRIGGER_E
160f0 51 50 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  QP, 0, 0);.     
16100 20 20 20 20 20 2f 2a 20 52 65 70 72 65 70 61 72       /* Reprepar
16110 65 20 70 53 74 6d 74 20 62 65 66 6f 72 65 20 72  e pStmt before r
16120 65 61 63 74 69 76 69 6e 67 20 74 72 61 63 65 20  eactiving trace 
16130 6d 6f 64 65 73 20 2a 2f 0a 20 20 20 20 20 20 20  modes */.       
16140 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c     sqlite3_final
16150 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20  ize(pStmt);.    
16160 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 70 72        sqlite3_pr
16170 65 70 61 72 65 5f 76 32 28 64 62 2c 20 7a 53 71  epare_v2(db, zSq
16180 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30  l, -1, &pStmt, 0
16190 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
161a0 20 20 20 20 20 72 65 73 74 6f 72 65 5f 64 65 62       restore_deb
161b0 75 67 5f 74 72 61 63 65 5f 6d 6f 64 65 73 28 29  ug_trace_modes()
161c0 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
161d0 20 69 66 28 20 70 41 72 67 20 29 7b 0a 20 20 20   if( pArg ){.   
161e0 20 20 20 20 20 70 41 72 67 2d 3e 63 4d 6f 64 65       pArg->cMode
161f0 20 3d 20 70 41 72 67 2d 3e 6d 6f 64 65 3b 0a 20   = pArg->mode;. 
16200 20 20 20 20 20 20 20 69 66 28 20 70 41 72 67 2d         if( pArg-
16210 3e 61 75 74 6f 45 78 70 6c 61 69 6e 20 29 7b 0a  >autoExplain ){.
16220 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71            if( sq
16230 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75  lite3_column_cou
16240 6e 74 28 70 53 74 6d 74 29 3d 3d 38 0a 20 20 20  nt(pStmt)==8.   
16250 20 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74          && sqlit
16260 65 33 5f 73 74 72 6c 69 6b 65 28 22 45 58 50 4c  e3_strlike("EXPL
16270 41 49 4e 25 22 2c 20 7a 53 74 6d 74 53 71 6c 2c  AIN%", zStmtSql,
16280 30 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20  0)==0.          
16290 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
162a0 41 72 67 2d 3e 63 4d 6f 64 65 20 3d 20 4d 4f 44  Arg->cMode = MOD
162b0 45 5f 45 78 70 6c 61 69 6e 3b 0a 20 20 20 20 20  E_Explain;.     
162c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
162d0 20 69 66 28 20 73 71 6c 69 74 65 33 5f 63 6f 6c   if( sqlite3_col
162e0 75 6d 6e 5f 63 6f 75 6e 74 28 70 53 74 6d 74 29  umn_count(pStmt)
162f0 3d 3d 34 0a 20 20 20 20 20 20 20 20 20 20 20 26  ==4.           &
16300 26 20 73 71 6c 69 74 65 33 5f 73 74 72 6c 69 6b  & sqlite3_strlik
16310 65 28 22 45 58 50 4c 41 49 4e 20 51 55 45 52 59  e("EXPLAIN QUERY
16320 20 50 4c 41 4e 25 22 2c 20 7a 53 74 6d 74 53 71   PLAN%", zStmtSq
16330 6c 2c 30 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  l,0)==0 ){.     
16340 20 20 20 20 20 20 20 70 41 72 67 2d 3e 63 4d 6f         pArg->cMo
16350 64 65 20 3d 20 4d 4f 44 45 5f 45 51 50 3b 0a 20  de = MODE_EQP;. 
16360 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
16370 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a     }..        /*
16380 20 49 66 20 74 68 65 20 73 68 65 6c 6c 20 69 73   If the shell is
16390 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 22 2e   currently in ".
163a0 65 78 70 6c 61 69 6e 22 20 6d 6f 64 65 2c 20 67  explain" mode, g
163b0 61 74 68 65 72 20 74 68 65 20 65 78 74 72 61 0a  ather the extra.
163c0 20 20 20 20 20 20 20 20 2a 2a 20 64 61 74 61 20          ** data 
163d0 72 65 71 75 69 72 65 64 20 74 6f 20 61 64 64 20  required to add 
163e0 69 6e 64 65 6e 74 73 20 74 6f 20 74 68 65 20 6f  indents to the o
163f0 75 74 70 75 74 2e 2a 2f 0a 20 20 20 20 20 20 20  utput.*/.       
16400 20 69 66 28 20 70 41 72 67 2d 3e 63 4d 6f 64 65   if( pArg->cMode
16410 3d 3d 4d 4f 44 45 5f 45 78 70 6c 61 69 6e 20 29  ==MODE_Explain )
16420 7b 0a 20 20 20 20 20 20 20 20 20 20 65 78 70 6c  {.          expl
16430 61 69 6e 5f 64 61 74 61 5f 70 72 65 70 61 72 65  ain_data_prepare
16440 28 70 41 72 67 2c 20 70 53 74 6d 74 29 3b 0a 20  (pArg, pStmt);. 
16450 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
16460 0a 0a 20 20 20 20 20 20 65 78 65 63 5f 70 72 65  ..      exec_pre
16470 70 61 72 65 64 5f 73 74 6d 74 28 70 41 72 67 2c  pared_stmt(pArg,
16480 20 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 65   pStmt);.      e
16490 78 70 6c 61 69 6e 5f 64 61 74 61 5f 64 65 6c 65  xplain_data_dele
164a0 74 65 28 70 41 72 67 29 3b 0a 20 20 20 20 20 20  te(pArg);.      
164b0 65 71 70 5f 72 65 6e 64 65 72 28 70 41 72 67 29  eqp_render(pArg)
164c0 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 70 72 69 6e  ;..      /* prin
164d0 74 20 75 73 61 67 65 20 73 74 61 74 73 20 69 66  t usage stats if
164e0 20 73 74 61 74 73 20 6f 6e 20 2a 2f 0a 20 20 20   stats on */.   
164f0 20 20 20 69 66 28 20 70 41 72 67 20 26 26 20 70     if( pArg && p
16500 41 72 67 2d 3e 73 74 61 74 73 4f 6e 20 29 7b 0a  Arg->statsOn ){.
16510 20 20 20 20 20 20 20 20 64 69 73 70 6c 61 79 5f          display_
16520 73 74 61 74 73 28 64 62 2c 20 70 41 72 67 2c 20  stats(db, pArg, 
16530 30 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  0);.      }..   
16540 20 20 20 2f 2a 20 70 72 69 6e 74 20 6c 6f 6f 70     /* print loop
16550 2d 63 6f 75 6e 74 65 72 73 20 69 66 20 72 65 71  -counters if req
16560 75 69 72 65 64 20 2a 2f 0a 20 20 20 20 20 20 69  uired */.      i
16570 66 28 20 70 41 72 67 20 26 26 20 70 41 72 67 2d  f( pArg && pArg-
16580 3e 73 63 61 6e 73 74 61 74 73 4f 6e 20 29 7b 0a  >scanstatsOn ){.
16590 20 20 20 20 20 20 20 20 64 69 73 70 6c 61 79 5f          display_
165a0 73 63 61 6e 73 74 61 74 73 28 64 62 2c 20 70 41  scanstats(db, pA
165b0 72 67 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  rg);.      }..  
165c0 20 20 20 20 2f 2a 20 46 69 6e 61 6c 69 7a 65 20      /* Finalize 
165d0 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 75  the statement ju
165e0 73 74 20 65 78 65 63 75 74 65 64 2e 20 49 66 20  st executed. If 
165f0 74 68 69 73 20 66 61 69 6c 73 2c 20 73 61 76 65  this fails, save
16600 20 61 0a 20 20 20 20 20 20 2a 2a 20 63 6f 70 79   a.      ** copy
16610 20 6f 66 20 74 68 65 20 65 72 72 6f 72 20 6d 65   of the error me
16620 73 73 61 67 65 2e 20 4f 74 68 65 72 77 69 73 65  ssage. Otherwise
16630 2c 20 73 65 74 20 7a 53 71 6c 20 74 6f 20 70 6f  , set zSql to po
16640 69 6e 74 20 74 6f 20 74 68 65 0a 20 20 20 20 20  int to the.     
16650 20 2a 2a 20 6e 65 78 74 20 73 74 61 74 65 6d 65   ** next stateme
16660 6e 74 20 74 6f 20 65 78 65 63 75 74 65 2e 20 2a  nt to execute. *
16670 2f 0a 20 20 20 20 20 20 72 63 32 20 3d 20 73 71  /.      rc2 = sq
16680 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
16690 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 69 66 28  Stmt);.      if(
166a0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45   rc!=SQLITE_NOME
166b0 4d 20 29 20 72 63 20 3d 20 72 63 32 3b 0a 20 20  M ) rc = rc2;.  
166c0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
166d0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
166e0 20 7a 53 71 6c 20 3d 20 7a 4c 65 66 74 6f 76 65   zSql = zLeftove
166f0 72 3b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65  r;.        while
16700 28 20 49 73 53 70 61 63 65 28 7a 53 71 6c 5b 30  ( IsSpace(zSql[0
16710 5d 29 20 29 20 7a 53 71 6c 2b 2b 3b 0a 20 20 20  ]) ) zSql++;.   
16720 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 7a 45     }else if( pzE
16730 72 72 4d 73 67 20 29 7b 0a 20 20 20 20 20 20 20  rrMsg ){.       
16740 20 2a 70 7a 45 72 72 4d 73 67 20 3d 20 73 61 76   *pzErrMsg = sav
16750 65 5f 65 72 72 5f 6d 73 67 28 64 62 29 3b 0a 20  e_err_msg(db);. 
16760 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
16770 20 63 6c 65 61 72 20 73 61 76 65 64 20 73 74 6d   clear saved stm
16780 74 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 20 20  t handle */.    
16790 20 20 69 66 28 20 70 41 72 67 20 29 7b 0a 20 20    if( pArg ){.  
167a0 20 20 20 20 20 20 70 41 72 67 2d 3e 70 53 74 6d        pArg->pStm
167b0 74 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 20 20  t = NULL;.      
167c0 7d 0a 20 20 20 20 7d 0a 20 20 7d 20 2f 2a 20 65  }.    }.  } /* e
167d0 6e 64 20 77 68 69 6c 65 20 2a 2f 0a 0a 20 20 72  nd while */..  r
167e0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
167f0 2a 2a 20 52 65 6c 65 61 73 65 20 6d 65 6d 6f 72  ** Release memor
16800 79 20 70 72 65 76 69 6f 75 73 6c 79 20 61 6c 6c  y previously all
16810 6f 63 61 74 65 64 20 62 79 20 74 61 62 6c 65 43  ocated by tableC
16820 6f 6c 75 6d 6e 4c 69 73 74 28 29 2e 0a 2a 2f 0a  olumnList()..*/.
16830 73 74 61 74 69 63 20 76 6f 69 64 20 66 72 65 65  static void free
16840 43 6f 6c 75 6d 6e 4c 69 73 74 28 63 68 61 72 20  ColumnList(char 
16850 2a 2a 61 7a 43 6f 6c 29 7b 0a 20 20 69 6e 74 20  **azCol){.  int 
16860 69 3b 0a 20 20 66 6f 72 28 69 3d 31 3b 20 61 7a  i;.  for(i=1; az
16870 43 6f 6c 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20  Col[i]; i++){.  
16880 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 61    sqlite3_free(a
16890 7a 43 6f 6c 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20  zCol[i]);.  }.  
168a0 2f 2a 20 61 7a 43 6f 6c 5b 30 5d 20 69 73 20 61  /* azCol[0] is a
168b0 20 73 74 61 74 69 63 20 73 74 72 69 6e 67 20 2a   static string *
168c0 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  /.  sqlite3_free
168d0 28 61 7a 43 6f 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  (azCol);.}../*.*
168e0 2a 20 52 65 74 75 72 6e 20 61 20 6c 69 73 74 20  * Return a list 
168f0 6f 66 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 73  of pointers to s
16900 74 72 69 6e 67 73 20 77 68 69 63 68 20 61 72 65  trings which are
16910 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 61 6c   the names of al
16920 6c 0a 2a 2a 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  l.** columns in 
16930 74 61 62 6c 65 20 7a 54 61 62 2e 20 20 20 54 68  table zTab.   Th
16940 65 20 6d 65 6d 6f 72 79 20 74 6f 20 68 6f 6c 64  e memory to hold
16950 20 74 68 65 20 6e 61 6d 65 73 20 69 73 20 64 79   the names is dy
16960 6e 61 6d 69 63 61 6c 6c 79 0a 2a 2a 20 61 6c 6c  namically.** all
16970 6f 63 61 74 65 64 20 61 6e 64 20 6d 75 73 74 20  ocated and must 
16980 62 65 20 72 65 6c 65 61 73 65 64 20 62 79 20 74  be released by t
16990 68 65 20 63 61 6c 6c 65 72 20 75 73 69 6e 67 20  he caller using 
169a0 61 20 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c  a subsequent cal
169b0 6c 0a 2a 2a 20 74 6f 20 66 72 65 65 43 6f 6c 75  l.** to freeColu
169c0 6d 6e 4c 69 73 74 28 29 2e 0a 2a 2a 0a 2a 2a 20  mnList()..**.** 
169d0 54 68 65 20 61 7a 43 6f 6c 5b 30 5d 20 65 6e 74  The azCol[0] ent
169e0 72 79 20 69 73 20 75 73 75 61 6c 6c 79 20 4e 55  ry is usually NU
169f0 4c 4c 2e 20 20 48 6f 77 65 76 65 72 2c 20 69 66  LL.  However, if
16a00 20 7a 54 61 62 20 63 6f 6e 74 61 69 6e 73 20 61   zTab contains a
16a10 20 72 6f 77 69 64 0a 2a 2a 20 76 61 6c 75 65 20   rowid.** value 
16a20 74 68 61 74 20 6e 65 65 64 73 20 74 6f 20 62 65  that needs to be
16a30 20 70 72 65 73 65 72 76 65 64 2c 20 74 68 65 6e   preserved, then
16a40 20 61 7a 43 6f 6c 5b 30 5d 20 69 73 20 66 69 6c   azCol[0] is fil
16a50 6c 65 64 20 69 6e 20 77 69 74 68 20 74 68 65 0a  led in with the.
16a60 2a 2a 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 72  ** name of the r
16a70 6f 77 69 64 20 63 6f 6c 75 6d 6e 2e 0a 2a 2a 0a  owid column..**.
16a80 2a 2a 20 54 68 65 20 66 69 72 73 74 20 72 65 67  ** The first reg
16a90 75 6c 61 72 20 63 6f 6c 75 6d 6e 20 69 6e 20 74  ular column in t
16aa0 68 65 20 74 61 62 6c 65 20 69 73 20 61 7a 43 6f  he table is azCo
16ab0 6c 5b 31 5d 2e 20 20 54 68 65 20 6c 69 73 74 20  l[1].  The list 
16ac0 69 73 20 74 65 72 6d 69 6e 61 74 65 64 0a 2a 2a  is terminated.**
16ad0 20 62 79 20 61 6e 20 65 6e 74 72 79 20 77 69 74   by an entry wit
16ae0 68 20 61 7a 43 6f 6c 5b 69 5d 3d 3d 30 2e 0a 2a  h azCol[i]==0..*
16af0 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 2a  /.static char **
16b00 74 61 62 6c 65 43 6f 6c 75 6d 6e 4c 69 73 74 28  tableColumnList(
16b10 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 2c 20 63  ShellState *p, c
16b20 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62 29  onst char *zTab)
16b30 7b 0a 20 20 63 68 61 72 20 2a 2a 61 7a 43 6f 6c  {.  char **azCol
16b40 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f   = 0;.  sqlite3_
16b50 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 63  stmt *pStmt;.  c
16b60 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 69 6e 74  har *zSql;.  int
16b70 20 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 69 6e 74   nCol = 0;.  int
16b80 20 6e 41 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 69   nAlloc = 0;.  i
16b90 6e 74 20 6e 50 4b 20 3d 20 30 3b 20 20 20 20 20  nt nPK = 0;     
16ba0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 50    /* Number of P
16bb0 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6c 75 6d  RIMARY KEY colum
16bc0 6e 73 20 73 65 65 6e 20 2a 2f 0a 20 20 69 6e 74  ns seen */.  int
16bd0 20 69 73 49 50 4b 20 3d 20 30 3b 20 20 20 20 20   isIPK = 0;     
16be0 2f 2a 20 54 72 75 65 20 69 66 20 6f 6e 65 20 50  /* True if one P
16bf0 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6c 75 6d  RIMARY KEY colum
16c00 6e 20 6f 66 20 74 79 70 65 20 49 4e 54 45 47 45  n of type INTEGE
16c10 52 20 2a 2f 0a 20 20 69 6e 74 20 70 72 65 73 65  R */.  int prese
16c20 72 76 65 52 6f 77 69 64 20 3d 20 53 68 65 6c 6c  rveRowid = Shell
16c30 48 61 73 46 6c 61 67 28 70 2c 20 53 48 46 4c 47  HasFlag(p, SHFLG
16c40 5f 50 72 65 73 65 72 76 65 52 6f 77 69 64 29 3b  _PreserveRowid);
16c50 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 7a 53  .  int rc;..  zS
16c60 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  ql = sqlite3_mpr
16c70 69 6e 74 66 28 22 50 52 41 47 4d 41 20 74 61 62  intf("PRAGMA tab
16c80 6c 65 5f 69 6e 66 6f 3d 25 51 22 2c 20 7a 54 61  le_info=%Q", zTa
16c90 62 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  b);.  rc = sqlit
16ca0 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 70 2d  e3_prepare_v2(p-
16cb0 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26  >db, zSql, -1, &
16cc0 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 73 71 6c  pStmt, 0);.  sql
16cd0 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b  ite3_free(zSql);
16ce0 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75  .  if( rc ) retu
16cf0 72 6e 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 73  rn 0;.  while( s
16d00 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d  qlite3_step(pStm
16d10 74 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29  t)==SQLITE_ROW )
16d20 7b 0a 20 20 20 20 69 66 28 20 6e 43 6f 6c 3e 3d  {.    if( nCol>=
16d30 6e 41 6c 6c 6f 63 2d 32 20 29 7b 0a 20 20 20 20  nAlloc-2 ){.    
16d40 20 20 6e 41 6c 6c 6f 63 20 3d 20 6e 41 6c 6c 6f    nAlloc = nAllo
16d50 63 2a 32 20 2b 20 6e 43 6f 6c 20 2b 20 31 30 3b  c*2 + nCol + 10;
16d60 0a 20 20 20 20 20 20 61 7a 43 6f 6c 20 3d 20 73  .      azCol = s
16d70 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 61  qlite3_realloc(a
16d80 7a 43 6f 6c 2c 20 6e 41 6c 6c 6f 63 2a 73 69 7a  zCol, nAlloc*siz
16d90 65 6f 66 28 61 7a 43 6f 6c 5b 30 5d 29 29 3b 0a  eof(azCol[0]));.
16da0 20 20 20 20 20 20 69 66 28 20 61 7a 43 6f 6c 3d        if( azCol=
16db0 3d 30 20 29 20 73 68 65 6c 6c 5f 6f 75 74 5f 6f  =0 ) shell_out_o
16dc0 66 5f 6d 65 6d 6f 72 79 28 29 3b 0a 20 20 20 20  f_memory();.    
16dd0 7d 0a 20 20 20 20 61 7a 43 6f 6c 5b 2b 2b 6e 43  }.    azCol[++nC
16de0 6f 6c 5d 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  ol] = sqlite3_mp
16df0 72 69 6e 74 66 28 22 25 73 22 2c 20 73 71 6c 69  rintf("%s", sqli
16e00 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28  te3_column_text(
16e10 70 53 74 6d 74 2c 20 31 29 29 3b 0a 20 20 20 20  pStmt, 1));.    
16e20 69 66 28 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  if( sqlite3_colu
16e30 6d 6e 5f 69 6e 74 28 70 53 74 6d 74 2c 20 35 29  mn_int(pStmt, 5)
16e40 20 29 7b 0a 20 20 20 20 20 20 6e 50 4b 2b 2b 3b   ){.      nPK++;
16e50 0a 20 20 20 20 20 20 69 66 28 20 6e 50 4b 3d 3d  .      if( nPK==
16e60 31 0a 20 20 20 20 20 20 20 26 26 20 73 71 6c 69  1.       && sqli
16e70 74 65 33 5f 73 74 72 69 63 6d 70 28 28 63 6f 6e  te3_stricmp((con
16e80 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33  st char*)sqlite3
16e90 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74  _column_text(pSt
16ea0 6d 74 2c 32 29 2c 0a 20 20 20 20 20 20 20 20 20  mt,2),.         
16eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16ec0 20 22 49 4e 54 45 47 45 52 22 29 3d 3d 30 0a 20   "INTEGER")==0. 
16ed0 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
16ee0 69 73 49 50 4b 20 3d 20 31 3b 0a 20 20 20 20 20  isIPK = 1;.     
16ef0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
16f00 69 73 49 50 4b 20 3d 20 30 3b 0a 20 20 20 20 20  isIPK = 0;.     
16f10 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73   }.    }.  }.  s
16f20 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
16f30 70 53 74 6d 74 29 3b 0a 20 20 69 66 28 20 61 7a  pStmt);.  if( az
16f40 43 6f 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  Col==0 ) return 
16f50 30 3b 0a 20 20 61 7a 43 6f 6c 5b 30 5d 20 3d 20  0;.  azCol[0] = 
16f60 30 3b 0a 20 20 61 7a 43 6f 6c 5b 6e 43 6f 6c 2b  0;.  azCol[nCol+
16f70 31 5d 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 54 68  1] = 0;..  /* Th
16f80 65 20 64 65 63 69 73 69 6f 6e 20 6f 66 20 77 68  e decision of wh
16f90 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 20 72  ether or not a r
16fa0 6f 77 69 64 20 72 65 61 6c 6c 79 20 6e 65 65 64  owid really need
16fb0 73 20 74 6f 20 62 65 20 70 72 65 73 65 72 76 65  s to be preserve
16fc0 64 0a 20 20 2a 2a 20 69 73 20 74 72 69 63 6b 79  d.  ** is tricky
16fd0 2e 20 20 57 65 20 6e 65 76 65 72 20 6e 65 65 64  .  We never need
16fe0 20 74 6f 20 70 72 65 73 65 72 76 65 20 61 20 72   to preserve a r
16ff0 6f 77 69 64 20 66 6f 72 20 61 20 57 49 54 48 4f  owid for a WITHO
17000 55 54 20 52 4f 57 49 44 20 74 61 62 6c 65 0a 20  UT ROWID table. 
17010 20 2a 2a 20 6f 72 20 61 20 74 61 62 6c 65 20 77   ** or a table w
17020 69 74 68 20 61 6e 20 49 4e 54 45 47 45 52 20 50  ith an INTEGER P
17030 52 49 4d 41 52 59 20 4b 45 59 2e 20 20 57 65 20  RIMARY KEY.  We 
17040 61 72 65 20 75 6e 61 62 6c 65 20 74 6f 20 70 72  are unable to pr
17050 65 73 65 72 76 65 0a 20 20 2a 2a 20 72 6f 77 69  eserve.  ** rowi
17060 64 73 20 6f 6e 20 74 61 62 6c 65 73 20 77 68 65  ds on tables whe
17070 72 65 20 74 68 65 20 72 6f 77 69 64 20 69 73 20  re the rowid is 
17080 69 6e 61 63 63 65 73 73 69 62 6c 65 20 62 65 63  inaccessible bec
17090 61 75 73 65 20 74 68 65 72 65 20 61 72 65 20 6f  ause there are o
170a0 74 68 65 72 0a 20 20 2a 2a 20 63 6f 6c 75 6d 6e  ther.  ** column
170b0 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 6e  s in the table n
170c0 61 6d 65 64 20 22 72 6f 77 69 64 22 2c 20 22 5f  amed "rowid", "_
170d0 72 6f 77 69 64 5f 22 2c 20 61 6e 64 20 22 6f 69  rowid_", and "oi
170e0 64 22 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  d"..  */.  if( p
170f0 72 65 73 65 72 76 65 52 6f 77 69 64 20 26 26 20  reserveRowid && 
17100 69 73 49 50 4b 20 29 7b 0a 20 20 20 20 2f 2a 20  isIPK ){.    /* 
17110 49 66 20 61 20 73 69 6e 67 6c 65 20 50 52 49 4d  If a single PRIM
17120 41 52 59 20 4b 45 59 20 63 6f 6c 75 6d 6e 20 77  ARY KEY column w
17130 69 74 68 20 74 79 70 65 20 49 4e 54 45 47 45 52  ith type INTEGER
17140 20 77 61 73 20 73 65 65 6e 2c 20 74 68 65 6e 20   was seen, then 
17150 69 74 0a 20 20 20 20 2a 2a 20 6d 69 67 68 74 20  it.    ** might 
17160 62 65 20 61 6e 20 61 6c 69 73 65 20 66 6f 72 20  be an alise for 
17170 74 68 65 20 52 4f 57 49 44 2e 20 20 42 75 74 20  the ROWID.  But 
17180 69 74 20 6d 69 67 68 74 20 61 6c 73 6f 20 62 65  it might also be
17190 20 61 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44   a WITHOUT ROWID
171a0 0a 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 6f 72  .    ** table or
171b0 20 61 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41   a INTEGER PRIMA
171c0 52 59 20 4b 45 59 20 44 45 53 43 20 63 6f 6c 75  RY KEY DESC colu
171d0 6d 6e 2c 20 6e 65 69 74 68 65 72 20 6f 66 20 77  mn, neither of w
171e0 68 69 63 68 20 61 72 65 0a 20 20 20 20 2a 2a 20  hich are.    ** 
171f0 52 4f 57 49 44 20 61 6c 69 61 73 65 73 2e 20 20  ROWID aliases.  
17200 54 6f 20 64 69 73 74 69 6e 67 75 69 73 68 20 74  To distinguish t
17210 68 65 73 65 20 63 61 73 65 73 2c 20 63 68 65 63  hese cases, chec
17220 6b 20 74 6f 20 73 65 65 20 69 66 0a 20 20 20 20  k to see if.    
17230 2a 2a 20 74 68 65 72 65 20 69 73 20 61 20 22 70  ** there is a "p
17240 6b 22 20 65 6e 74 72 79 20 69 6e 20 22 50 52 41  k" entry in "PRA
17250 47 4d 41 20 69 6e 64 65 78 5f 6c 69 73 74 22 2e  GMA index_list".
17260 20 20 54 68 65 72 65 20 77 69 6c 6c 20 62 65 0a    There will be.
17270 20 20 20 20 2a 2a 20 6e 6f 20 22 70 6b 22 20 69      ** no "pk" i
17280 6e 64 65 78 20 69 66 20 74 68 65 20 50 52 49 4d  ndex if the PRIM
17290 41 52 59 20 4b 45 59 20 72 65 61 6c 6c 79 20 69  ARY KEY really i
172a0 73 20 61 6e 20 61 6c 69 61 73 20 66 6f 72 20 74  s an alias for t
172b0 68 65 20 52 4f 57 49 44 2e 0a 20 20 20 20 2a 2f  he ROWID..    */
172c0 0a 20 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69  .    zSql = sqli
172d0 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 53 45 4c  te3_mprintf("SEL
172e0 45 43 54 20 31 20 46 52 4f 4d 20 70 72 61 67 6d  ECT 1 FROM pragm
172f0 61 5f 69 6e 64 65 78 5f 6c 69 73 74 28 25 51 29  a_index_list(%Q)
17300 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ".              
17310 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20 57               " W
17320 48 45 52 45 20 6f 72 69 67 69 6e 3d 27 70 6b 27  HERE origin='pk'
17330 22 2c 20 7a 54 61 62 29 3b 0a 20 20 20 20 72 63  ", zTab);.    rc
17340 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61   = sqlite3_prepa
17350 72 65 5f 76 32 28 70 2d 3e 64 62 2c 20 7a 53 71  re_v2(p->db, zSq
17360 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30  l, -1, &pStmt, 0
17370 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
17380 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20 69  ree(zSql);.    i
17390 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 66  f( rc ){.      f
173a0 72 65 65 43 6f 6c 75 6d 6e 4c 69 73 74 28 61 7a  reeColumnList(az
173b0 43 6f 6c 29 3b 0a 20 20 20 20 20 20 72 65 74 75  Col);.      retu
173c0 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 0;.    }.    
173d0 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 65  rc = sqlite3_ste
173e0 70 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 73 71  p(pStmt);.    sq
173f0 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
17400 53 74 6d 74 29 3b 0a 20 20 20 20 70 72 65 73 65  Stmt);.    prese
17410 72 76 65 52 6f 77 69 64 20 3d 20 72 63 3d 3d 53  rveRowid = rc==S
17420 51 4c 49 54 45 5f 52 4f 57 3b 0a 20 20 7d 0a 20  QLITE_ROW;.  }. 
17430 20 69 66 28 20 70 72 65 73 65 72 76 65 52 6f 77   if( preserveRow
17440 69 64 20 29 7b 0a 20 20 20 20 2f 2a 20 4f 6e 6c  id ){.    /* Onl
17450 79 20 70 72 65 73 65 72 76 65 20 74 68 65 20 72  y preserve the r
17460 6f 77 69 64 20 69 66 20 77 65 20 63 61 6e 20 66  owid if we can f
17470 69 6e 64 20 61 20 6e 61 6d 65 20 74 6f 20 75 73  ind a name to us
17480 65 20 66 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a  e for the.    **
17490 20 72 6f 77 69 64 20 2a 2f 0a 20 20 20 20 73 74   rowid */.    st
174a0 61 74 69 63 20 63 68 61 72 20 2a 61 7a 52 6f 77  atic char *azRow
174b0 69 64 5b 5d 20 3d 20 7b 20 22 72 6f 77 69 64 22  id[] = { "rowid"
174c0 2c 20 22 5f 72 6f 77 69 64 5f 22 2c 20 22 6f 69  , "_rowid_", "oi
174d0 64 22 20 7d 3b 0a 20 20 20 20 69 6e 74 20 69 2c  d" };.    int i,
174e0 20 6a 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b   j;.    for(j=0;
174f0 20 6a 3c 33 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20   j<3; j++){.    
17500 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 3d 6e 43    for(i=1; i<=nC
17510 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; i++){.      
17520 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74    if( sqlite3_st
17530 72 69 63 6d 70 28 61 7a 52 6f 77 69 64 5b 6a 5d  ricmp(azRowid[j]
17540 2c 61 7a 43 6f 6c 5b 69 5d 29 3d 3d 30 20 29 20  ,azCol[i])==0 ) 
17550 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
17560 20 20 20 20 20 69 66 28 20 69 3e 6e 43 6f 6c 20       if( i>nCol 
17570 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 74  ){.        /* At
17580 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 77 65 20   this point, we 
17590 6b 6e 6f 77 20 74 68 61 74 20 61 7a 52 6f 77 69  know that azRowi
175a0 64 5b 6a 5d 20 69 73 20 6e 6f 74 20 74 68 65 20  d[j] is not the 
175b0 6e 61 6d 65 20 6f 66 20 61 6e 79 0a 20 20 20 20  name of any.    
175c0 20 20 20 20 2a 2a 20 6f 72 64 69 6e 61 72 79 20      ** ordinary 
175d0 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 74 61  column in the ta
175e0 62 6c 65 2e 20 20 56 65 72 69 66 79 20 74 68 61  ble.  Verify tha
175f0 74 20 61 7a 52 6f 77 69 64 5b 6a 5d 20 69 73 20  t azRowid[j] is 
17600 61 20 76 61 6c 69 64 0a 20 20 20 20 20 20 20 20  a valid.        
17610 2a 2a 20 6e 61 6d 65 20 66 6f 72 20 74 68 65 20  ** name for the 
17620 72 6f 77 69 64 20 62 65 66 6f 72 65 20 61 64 64  rowid before add
17630 69 6e 67 20 69 74 20 74 6f 20 61 7a 43 6f 6c 5b  ing it to azCol[
17640 30 5d 2e 20 20 57 49 54 48 4f 55 54 20 52 4f 57  0].  WITHOUT ROW
17650 49 44 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 61  ID.        ** ta
17660 62 6c 65 73 20 77 69 6c 6c 20 66 61 69 6c 20 74  bles will fail t
17670 68 69 73 20 6c 61 73 74 20 63 68 65 63 6b 20 2a  his last check *
17680 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  /.        rc = s
17690 71 6c 69 74 65 33 5f 74 61 62 6c 65 5f 63 6f 6c  qlite3_table_col
176a0 75 6d 6e 5f 6d 65 74 61 64 61 74 61 28 70 2d 3e  umn_metadata(p->
176b0 64 62 2c 30 2c 7a 54 61 62 2c 61 7a 52 6f 77 69  db,0,zTab,azRowi
176c0 64 5b 6a 5d 2c 30 2c 30 2c 30 2c 30 2c 30 29 3b  d[j],0,0,0,0,0);
176d0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
176e0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 61 7a 43  =SQLITE_OK ) azC
176f0 6f 6c 5b 30 5d 20 3d 20 61 7a 52 6f 77 69 64 5b  ol[0] = azRowid[
17700 6a 5d 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  j];.        brea
17710 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
17720 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 61 7a  .  }.  return az
17730 43 6f 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 6f  Col;.}../*.** To
17740 67 67 6c 65 20 74 68 65 20 72 65 76 65 72 73 65  ggle the reverse
17750 5f 75 6e 6f 72 64 65 72 65 64 5f 73 65 6c 65 63  _unordered_selec
17760 74 73 20 73 65 74 74 69 6e 67 2e 0a 2a 2f 0a 73  ts setting..*/.s
17770 74 61 74 69 63 20 76 6f 69 64 20 74 6f 67 67 6c  tatic void toggl
17780 65 53 65 6c 65 63 74 4f 72 64 65 72 28 73 71 6c  eSelectOrder(sql
17790 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 73 71 6c  ite3 *db){.  sql
177a0 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
177b0 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 53 65 74   = 0;.  int iSet
177c0 74 69 6e 67 20 3d 20 30 3b 0a 20 20 63 68 61 72  ting = 0;.  char
177d0 20 7a 53 74 6d 74 5b 31 30 30 5d 3b 0a 20 20 73   zStmt[100];.  s
177e0 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76  qlite3_prepare_v
177f0 32 28 64 62 2c 20 22 50 52 41 47 4d 41 20 72 65  2(db, "PRAGMA re
17800 76 65 72 73 65 5f 75 6e 6f 72 64 65 72 65 64 5f  verse_unordered_
17810 73 65 6c 65 63 74 73 22 2c 20 2d 31 2c 20 26 70  selects", -1, &p
17820 53 74 6d 74 2c 20 30 29 3b 0a 20 20 69 66 28 20  Stmt, 0);.  if( 
17830 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74  sqlite3_step(pSt
17840 6d 74 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20  mt)==SQLITE_ROW 
17850 29 7b 0a 20 20 20 20 69 53 65 74 74 69 6e 67 20  ){.    iSetting 
17860 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
17870 5f 69 6e 74 28 70 53 74 6d 74 2c 20 30 29 3b 0a  _int(pStmt, 0);.
17880 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 69    }.  sqlite3_fi
17890 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20  nalize(pStmt);. 
178a0 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
178b0 66 28 73 69 7a 65 6f 66 28 7a 53 74 6d 74 29 2c  f(sizeof(zStmt),
178c0 20 7a 53 74 6d 74 2c 0a 20 20 20 20 20 20 20 22   zStmt,.       "
178d0 50 52 41 47 4d 41 20 72 65 76 65 72 73 65 5f 75  PRAGMA reverse_u
178e0 6e 6f 72 64 65 72 65 64 5f 73 65 6c 65 63 74 73  nordered_selects
178f0 28 25 64 29 22 2c 20 21 69 53 65 74 74 69 6e 67  (%d)", !iSetting
17900 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 65 78 65  );.  sqlite3_exe
17910 63 28 64 62 2c 20 7a 53 74 6d 74 2c 20 30 2c 20  c(db, zStmt, 0, 
17920 30 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  0, 0);.}../*.** 
17930 54 68 69 73 20 69 73 20 61 20 64 69 66 66 65 72  This is a differ
17940 65 6e 74 20 63 61 6c 6c 62 61 63 6b 20 72 6f 75  ent callback rou
17950 74 69 6e 65 20 75 73 65 64 20 66 6f 72 20 64 75  tine used for du
17960 6d 70 69 6e 67 20 74 68 65 20 64 61 74 61 62 61  mping the databa
17970 73 65 2e 0a 2a 2a 20 45 61 63 68 20 72 6f 77 20  se..** Each row 
17980 72 65 63 65 69 76 65 64 20 62 79 20 74 68 69 73  received by this
17990 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6e 73 69 73   callback consis
179a0 74 73 20 6f 66 20 61 20 74 61 62 6c 65 20 6e 61  ts of a table na
179b0 6d 65 2c 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65  me,.** the table
179c0 20 74 79 70 65 20 28 22 69 6e 64 65 78 22 20 6f   type ("index" o
179d0 72 20 22 74 61 62 6c 65 22 29 20 61 6e 64 20 53  r "table") and S
179e0 51 4c 20 74 6f 20 63 72 65 61 74 65 20 74 68 65  QL to create the
179f0 20 74 61 62 6c 65 2e 0a 2a 2a 20 54 68 69 73 20   table..** This 
17a00 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 70  routine should p
17a10 72 69 6e 74 20 74 65 78 74 20 73 75 66 66 69 63  rint text suffic
17a20 69 65 6e 74 20 74 6f 20 72 65 63 72 65 61 74 65  ient to recreate
17a30 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73   the table..*/.s
17a40 74 61 74 69 63 20 69 6e 74 20 64 75 6d 70 5f 63  tatic int dump_c
17a50 61 6c 6c 62 61 63 6b 28 76 6f 69 64 20 2a 70 41  allback(void *pA
17a60 72 67 2c 20 69 6e 74 20 6e 41 72 67 2c 20 63 68  rg, int nArg, ch
17a70 61 72 20 2a 2a 61 7a 41 72 67 2c 20 63 68 61 72  ar **azArg, char
17a80 20 2a 2a 61 7a 4e 6f 74 55 73 65 64 29 7b 0a 20   **azNotUsed){. 
17a90 20 69 6e 74 20 72 63 3b 0a 20 20 63 6f 6e 73 74   int rc;.  const
17aa0 20 63 68 61 72 20 2a 7a 54 61 62 6c 65 3b 0a 20   char *zTable;. 
17ab0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79   const char *zTy
17ac0 70 65 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  pe;.  const char
17ad0 20 2a 7a 53 71 6c 3b 0a 20 20 53 68 65 6c 6c 53   *zSql;.  ShellS
17ae0 74 61 74 65 20 2a 70 20 3d 20 28 53 68 65 6c 6c  tate *p = (Shell
17af0 53 74 61 74 65 20 2a 29 70 41 72 67 3b 0a 0a 20  State *)pArg;.. 
17b00 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
17b10 52 28 61 7a 4e 6f 74 55 73 65 64 29 3b 0a 20 20  R(azNotUsed);.  
17b20 69 66 28 20 6e 41 72 67 21 3d 33 20 7c 7c 20 61  if( nArg!=3 || a
17b30 7a 41 72 67 3d 3d 30 20 29 20 72 65 74 75 72 6e  zArg==0 ) return
17b40 20 30 3b 0a 20 20 7a 54 61 62 6c 65 20 3d 20 61   0;.  zTable = a
17b50 7a 41 72 67 5b 30 5d 3b 0a 20 20 7a 54 79 70 65  zArg[0];.  zType
17b60 20 3d 20 61 7a 41 72 67 5b 31 5d 3b 0a 20 20 7a   = azArg[1];.  z
17b70 53 71 6c 20 3d 20 61 7a 41 72 67 5b 32 5d 3b 0a  Sql = azArg[2];.
17b80 0a 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 54  .  if( strcmp(zT
17b90 61 62 6c 65 2c 20 22 73 71 6c 69 74 65 5f 73 65  able, "sqlite_se
17ba0 71 75 65 6e 63 65 22 29 3d 3d 30 20 29 7b 0a 20  quence")==0 ){. 
17bb0 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d     raw_printf(p-
17bc0 3e 6f 75 74 2c 20 22 44 45 4c 45 54 45 20 46 52  >out, "DELETE FR
17bd0 4f 4d 20 73 71 6c 69 74 65 5f 73 65 71 75 65 6e  OM sqlite_sequen
17be0 63 65 3b 5c 6e 22 29 3b 0a 20 20 7d 65 6c 73 65  ce;\n");.  }else
17bf0 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72   if( sqlite3_str
17c00 67 6c 6f 62 28 22 73 71 6c 69 74 65 5f 73 74 61  glob("sqlite_sta
17c10 74 3f 22 2c 20 7a 54 61 62 6c 65 29 3d 3d 30 20  t?", zTable)==0 
17c20 29 7b 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74  ){.    raw_print
17c30 66 28 70 2d 3e 6f 75 74 2c 20 22 41 4e 41 4c 59  f(p->out, "ANALY
17c40 5a 45 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  ZE sqlite_master
17c50 3b 5c 6e 22 29 3b 0a 20 20 7d 65 6c 73 65 20 69  ;\n");.  }else i
17c60 66 28 20 73 74 72 6e 63 6d 70 28 7a 54 61 62 6c  f( strncmp(zTabl
17c70 65 2c 20 22 73 71 6c 69 74 65 5f 22 2c 20 37 29  e, "sqlite_", 7)
17c80 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
17c90 6e 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  n 0;.  }else if(
17ca0 20 73 74 72 6e 63 6d 70 28 7a 53 71 6c 2c 20 22   strncmp(zSql, "
17cb0 43 52 45 41 54 45 20 56 49 52 54 55 41 4c 20 54  CREATE VIRTUAL T
17cc0 41 42 4c 45 22 2c 20 32 30 29 3d 3d 30 20 29 7b  ABLE", 20)==0 ){
17cd0 0a 20 20 20 20 63 68 61 72 20 2a 7a 49 6e 73 3b  .    char *zIns;
17ce0 0a 20 20 20 20 69 66 28 20 21 70 2d 3e 77 72 69  .    if( !p->wri
17cf0 74 61 62 6c 65 53 63 68 65 6d 61 20 29 7b 0a 20  tableSchema ){. 
17d00 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
17d10 70 2d 3e 6f 75 74 2c 20 22 50 52 41 47 4d 41 20  p->out, "PRAGMA 
17d20 77 72 69 74 61 62 6c 65 5f 73 63 68 65 6d 61 3d  writable_schema=
17d30 4f 4e 3b 5c 6e 22 29 3b 0a 20 20 20 20 20 20 70  ON;\n");.      p
17d40 2d 3e 77 72 69 74 61 62 6c 65 53 63 68 65 6d 61  ->writableSchema
17d50 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 1;.    }.    
17d60 7a 49 6e 73 20 3d 20 73 71 6c 69 74 65 33 5f 6d  zIns = sqlite3_m
17d70 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 22  printf(.       "
17d80 49 4e 53 45 52 54 20 49 4e 54 4f 20 73 71 6c 69  INSERT INTO sqli
17d90 74 65 5f 6d 61 73 74 65 72 28 74 79 70 65 2c 6e  te_master(type,n
17da0 61 6d 65 2c 74 62 6c 5f 6e 61 6d 65 2c 72 6f 6f  ame,tbl_name,roo
17db0 74 70 61 67 65 2c 73 71 6c 29 22 0a 20 20 20 20  tpage,sql)".    
17dc0 20 20 20 22 56 41 4c 55 45 53 28 27 74 61 62 6c     "VALUES('tabl
17dd0 65 27 2c 27 25 71 27 2c 27 25 71 27 2c 30 2c 27  e','%q','%q',0,'
17de0 25 71 27 29 3b 22 2c 0a 20 20 20 20 20 20 20 7a  %q');",.       z
17df0 54 61 62 6c 65 2c 20 7a 54 61 62 6c 65 2c 20 7a  Table, zTable, z
17e00 53 71 6c 29 3b 0a 20 20 20 20 75 74 66 38 5f 70  Sql);.    utf8_p
17e10 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25  rintf(p->out, "%
17e20 73 5c 6e 22 2c 20 7a 49 6e 73 29 3b 0a 20 20 20  s\n", zIns);.   
17e30 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 49   sqlite3_free(zI
17e40 6e 73 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ns);.    return 
17e50 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
17e60 70 72 69 6e 74 53 63 68 65 6d 61 4c 69 6e 65 28  printSchemaLine(
17e70 70 2d 3e 6f 75 74 2c 20 7a 53 71 6c 2c 20 22 3b  p->out, zSql, ";
17e80 5c 6e 22 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  \n");.  }..  if(
17e90 20 73 74 72 63 6d 70 28 7a 54 79 70 65 2c 20 22   strcmp(zType, "
17ea0 74 61 62 6c 65 22 29 3d 3d 30 20 29 7b 0a 20 20  table")==0 ){.  
17eb0 20 20 53 68 65 6c 6c 54 65 78 74 20 73 53 65 6c    ShellText sSel
17ec0 65 63 74 3b 0a 20 20 20 20 53 68 65 6c 6c 54 65  ect;.    ShellTe
17ed0 78 74 20 73 54 61 62 6c 65 3b 0a 20 20 20 20 63  xt sTable;.    c
17ee0 68 61 72 20 2a 2a 61 7a 43 6f 6c 3b 0a 20 20 20  har **azCol;.   
17ef0 20 69 6e 74 20 69 3b 0a 20 20 20 20 63 68 61 72   int i;.    char
17f00 20 2a 73 61 76 65 64 44 65 73 74 54 61 62 6c 65   *savedDestTable
17f10 3b 0a 20 20 20 20 69 6e 74 20 73 61 76 65 64 4d  ;.    int savedM
17f20 6f 64 65 3b 0a 0a 20 20 20 20 61 7a 43 6f 6c 20  ode;..    azCol 
17f30 3d 20 74 61 62 6c 65 43 6f 6c 75 6d 6e 4c 69 73  = tableColumnLis
17f40 74 28 70 2c 20 7a 54 61 62 6c 65 29 3b 0a 20 20  t(p, zTable);.  
17f50 20 20 69 66 28 20 61 7a 43 6f 6c 3d 3d 30 20 29    if( azCol==0 )
17f60 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 45 72 72 2b  {.      p->nErr+
17f70 2b 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  +;.      return 
17f80 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  0;.    }..    /*
17f90 20 41 6c 77 61 79 73 20 71 75 6f 74 65 20 74 68   Always quote th
17fa0 65 20 74 61 62 6c 65 20 6e 61 6d 65 2c 20 65 76  e table name, ev
17fb0 65 6e 20 69 66 20 69 74 20 61 70 70 65 61 72 73  en if it appears
17fc0 20 74 6f 20 62 65 20 70 75 72 65 20 61 73 63 69   to be pure asci
17fd0 69 2c 0a 20 20 20 20 2a 2a 20 69 6e 20 63 61 73  i,.    ** in cas
17fe0 65 20 69 74 20 69 73 20 61 20 6b 65 79 77 6f 72  e it is a keywor
17ff0 64 2e 20 45 78 3a 20 20 49 4e 53 45 52 54 20 49  d. Ex:  INSERT I
18000 4e 54 4f 20 22 74 61 62 6c 65 22 20 2e 2e 2e 20  NTO "table" ... 
18010 2a 2f 0a 20 20 20 20 69 6e 69 74 54 65 78 74 28  */.    initText(
18020 26 73 54 61 62 6c 65 29 3b 0a 20 20 20 20 61 70  &sTable);.    ap
18030 70 65 6e 64 54 65 78 74 28 26 73 54 61 62 6c 65  pendText(&sTable
18040 2c 20 7a 54 61 62 6c 65 2c 20 71 75 6f 74 65 43  , zTable, quoteC
18050 68 61 72 28 7a 54 61 62 6c 65 29 29 3b 0a 20 20  har(zTable));.  
18060 20 20 2f 2a 20 49 66 20 70 72 65 73 65 72 76 69    /* If preservi
18070 6e 67 20 74 68 65 20 72 6f 77 69 64 2c 20 61 64  ng the rowid, ad
18080 64 20 61 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20  d a column list 
18090 61 66 74 65 72 20 74 68 65 20 74 61 62 6c 65 20  after the table 
180a0 6e 61 6d 65 2e 0a 20 20 20 20 2a 2a 20 49 6e 20  name..    ** In 
180b0 6f 74 68 65 72 20 77 6f 72 64 73 3a 20 20 22 49  other words:  "I
180c0 4e 53 45 52 54 20 49 4e 54 4f 20 74 61 62 28 72  NSERT INTO tab(r
180d0 6f 77 69 64 2c 61 2c 62 2c 63 2c 2e 2e 2e 29 20  owid,a,b,c,...) 
180e0 56 41 4c 55 45 53 28 2e 2e 2e 29 22 0a 20 20 20  VALUES(...)".   
180f0 20 2a 2a 20 69 6e 73 74 65 61 64 20 6f 66 20 74   ** instead of t
18100 68 65 20 75 73 75 61 6c 20 22 49 4e 53 45 52 54  he usual "INSERT
18110 20 49 4e 54 4f 20 74 61 62 20 56 41 4c 55 45 53   INTO tab VALUES
18120 28 2e 2e 2e 29 22 2e 0a 20 20 20 20 2a 2f 0a 20  (...)"..    */. 
18130 20 20 20 69 66 28 20 61 7a 43 6f 6c 5b 30 5d 20     if( azCol[0] 
18140 29 7b 0a 20 20 20 20 20 20 61 70 70 65 6e 64 54  ){.      appendT
18150 65 78 74 28 26 73 54 61 62 6c 65 2c 20 22 28 22  ext(&sTable, "("
18160 2c 20 30 29 3b 0a 20 20 20 20 20 20 61 70 70 65  , 0);.      appe
18170 6e 64 54 65 78 74 28 26 73 54 61 62 6c 65 2c 20  ndText(&sTable, 
18180 61 7a 43 6f 6c 5b 30 5d 2c 20 30 29 3b 0a 20 20  azCol[0], 0);.  
18190 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 61 7a 43      for(i=1; azC
181a0 6f 6c 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20  ol[i]; i++){.   
181b0 20 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28       appendText(
181c0 26 73 54 61 62 6c 65 2c 20 22 2c 22 2c 20 30 29  &sTable, ",", 0)
181d0 3b 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e 64  ;.        append
181e0 54 65 78 74 28 26 73 54 61 62 6c 65 2c 20 61 7a  Text(&sTable, az
181f0 43 6f 6c 5b 69 5d 2c 20 71 75 6f 74 65 43 68 61  Col[i], quoteCha
18200 72 28 61 7a 43 6f 6c 5b 69 5d 29 29 3b 0a 20 20  r(azCol[i]));.  
18210 20 20 20 20 7d 0a 20 20 20 20 20 20 61 70 70 65      }.      appe
18220 6e 64 54 65 78 74 28 26 73 54 61 62 6c 65 2c 20  ndText(&sTable, 
18230 22 29 22 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 0a  ")", 0);.    }..
18240 20 20 20 20 2f 2a 20 42 75 69 6c 64 20 61 6e 20      /* Build an 
18250 61 70 70 72 6f 70 72 69 61 74 65 20 53 45 4c 45  appropriate SELE
18260 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  CT statement */.
18270 20 20 20 20 69 6e 69 74 54 65 78 74 28 26 73 53      initText(&sS
18280 65 6c 65 63 74 29 3b 0a 20 20 20 20 61 70 70 65  elect);.    appe
18290 6e 64 54 65 78 74 28 26 73 53 65 6c 65 63 74 2c  ndText(&sSelect,
182a0 20 22 53 45 4c 45 43 54 20 22 2c 20 30 29 3b 0a   "SELECT ", 0);.
182b0 20 20 20 20 69 66 28 20 61 7a 43 6f 6c 5b 30 5d      if( azCol[0]
182c0 20 29 7b 0a 20 20 20 20 20 20 61 70 70 65 6e 64   ){.      append
182d0 54 65 78 74 28 26 73 53 65 6c 65 63 74 2c 20 61  Text(&sSelect, a
182e0 7a 43 6f 6c 5b 30 5d 2c 20 30 29 3b 0a 20 20 20  zCol[0], 0);.   
182f0 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73     appendText(&s
18300 53 65 6c 65 63 74 2c 20 22 2c 22 2c 20 30 29 3b  Select, ",", 0);
18310 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69  .    }.    for(i
18320 3d 31 3b 20 61 7a 43 6f 6c 5b 69 5d 3b 20 69 2b  =1; azCol[i]; i+
18330 2b 29 7b 0a 20 20 20 20 20 20 61 70 70 65 6e 64  +){.      append
18340 54 65 78 74 28 26 73 53 65 6c 65 63 74 2c 20 61  Text(&sSelect, a
18350 7a 43 6f 6c 5b 69 5d 2c 20 71 75 6f 74 65 43 68  zCol[i], quoteCh
18360 61 72 28 61 7a 43 6f 6c 5b 69 5d 29 29 3b 0a 20  ar(azCol[i]));. 
18370 20 20 20 20 20 69 66 28 20 61 7a 43 6f 6c 5b 69       if( azCol[i
18380 2b 31 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 61  +1] ){.        a
18390 70 70 65 6e 64 54 65 78 74 28 26 73 53 65 6c 65  ppendText(&sSele
183a0 63 74 2c 20 22 2c 22 2c 20 30 29 3b 0a 20 20 20  ct, ",", 0);.   
183b0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66     }.    }.    f
183c0 72 65 65 43 6f 6c 75 6d 6e 4c 69 73 74 28 61 7a  reeColumnList(az
183d0 43 6f 6c 29 3b 0a 20 20 20 20 61 70 70 65 6e 64  Col);.    append
183e0 54 65 78 74 28 26 73 53 65 6c 65 63 74 2c 20 22  Text(&sSelect, "
183f0 20 46 52 4f 4d 20 22 2c 20 30 29 3b 0a 20 20 20   FROM ", 0);.   
18400 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 53 65   appendText(&sSe
18410 6c 65 63 74 2c 20 7a 54 61 62 6c 65 2c 20 71 75  lect, zTable, qu
18420 6f 74 65 43 68 61 72 28 7a 54 61 62 6c 65 29 29  oteChar(zTable))
18430 3b 0a 0a 20 20 20 20 73 61 76 65 64 44 65 73 74  ;..    savedDest
18440 54 61 62 6c 65 20 3d 20 70 2d 3e 7a 44 65 73 74  Table = p->zDest
18450 54 61 62 6c 65 3b 0a 20 20 20 20 73 61 76 65 64  Table;.    saved
18460 4d 6f 64 65 20 3d 20 70 2d 3e 6d 6f 64 65 3b 0a  Mode = p->mode;.
18470 20 20 20 20 70 2d 3e 7a 44 65 73 74 54 61 62 6c      p->zDestTabl
18480 65 20 3d 20 73 54 61 62 6c 65 2e 7a 3b 0a 20 20  e = sTable.z;.  
18490 20 20 70 2d 3e 6d 6f 64 65 20 3d 20 70 2d 3e 63    p->mode = p->c
184a0 4d 6f 64 65 20 3d 20 4d 4f 44 45 5f 49 6e 73 65  Mode = MODE_Inse
184b0 72 74 3b 0a 20 20 20 20 72 63 20 3d 20 73 68 65  rt;.    rc = she
184c0 6c 6c 5f 65 78 65 63 28 70 2c 20 73 53 65 6c 65  ll_exec(p, sSele
184d0 63 74 2e 7a 2c 20 30 29 3b 0a 20 20 20 20 69 66  ct.z, 0);.    if
184e0 28 20 28 72 63 26 30 78 66 66 29 3d 3d 53 51 4c  ( (rc&0xff)==SQL
184f0 49 54 45 5f 43 4f 52 52 55 50 54 20 29 7b 0a 20  ITE_CORRUPT ){. 
18500 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
18510 70 2d 3e 6f 75 74 2c 20 22 2f 2a 2a 2a 2a 2a 2a  p->out, "/******
18520 20 43 4f 52 52 55 50 54 49 4f 4e 20 45 52 52 4f   CORRUPTION ERRO
18530 52 20 2a 2a 2a 2a 2a 2a 2a 2f 5c 6e 22 29 3b 0a  R *******/\n");.
18540 20 20 20 20 20 20 74 6f 67 67 6c 65 53 65 6c 65        toggleSele
18550 63 74 4f 72 64 65 72 28 70 2d 3e 64 62 29 3b 0a  ctOrder(p->db);.
18560 20 20 20 20 20 20 73 68 65 6c 6c 5f 65 78 65 63        shell_exec
18570 28 70 2c 20 73 53 65 6c 65 63 74 2e 7a 2c 20 30  (p, sSelect.z, 0
18580 29 3b 0a 20 20 20 20 20 20 74 6f 67 67 6c 65 53  );.      toggleS
18590 65 6c 65 63 74 4f 72 64 65 72 28 70 2d 3e 64 62  electOrder(p->db
185a0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e  );.    }.    p->
185b0 7a 44 65 73 74 54 61 62 6c 65 20 3d 20 73 61 76  zDestTable = sav
185c0 65 64 44 65 73 74 54 61 62 6c 65 3b 0a 20 20 20  edDestTable;.   
185d0 20 70 2d 3e 6d 6f 64 65 20 3d 20 73 61 76 65 64   p->mode = saved
185e0 4d 6f 64 65 3b 0a 20 20 20 20 66 72 65 65 54 65  Mode;.    freeTe
185f0 78 74 28 26 73 54 61 62 6c 65 29 3b 0a 20 20 20  xt(&sTable);.   
18600 20 66 72 65 65 54 65 78 74 28 26 73 53 65 6c 65   freeText(&sSele
18610 63 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  ct);.    if( rc 
18620 29 20 70 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 7d  ) p->nErr++;.  }
18630 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
18640 2f 2a 0a 2a 2a 20 52 75 6e 20 7a 51 75 65 72 79  /*.** Run zQuery
18650 2e 20 20 55 73 65 20 64 75 6d 70 5f 63 61 6c 6c  .  Use dump_call
18660 62 61 63 6b 28 29 20 61 73 20 74 68 65 20 63 61  back() as the ca
18670 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65 20 73  llback routine s
18680 6f 20 74 68 61 74 0a 2a 2a 20 74 68 65 20 63 6f  o that.** the co
18690 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 71 75  ntents of the qu
186a0 65 72 79 20 61 72 65 20 6f 75 74 70 75 74 20 61  ery are output a
186b0 73 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73  s SQL statements
186c0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 77 65 20 67 65  ..**.** If we ge
186d0 74 20 61 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  t a SQLITE_CORRU
186e0 50 54 20 65 72 72 6f 72 2c 20 72 65 72 75 6e 20  PT error, rerun 
186f0 74 68 65 20 71 75 65 72 79 20 61 66 74 65 72 20  the query after 
18700 61 70 70 65 6e 64 69 6e 67 0a 2a 2a 20 22 4f 52  appending.** "OR
18710 44 45 52 20 42 59 20 72 6f 77 69 64 20 44 45 53  DER BY rowid DES
18720 43 22 20 74 6f 20 74 68 65 20 65 6e 64 2e 0a 2a  C" to the end..*
18730 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 75 6e  /.static int run
18740 5f 73 63 68 65 6d 61 5f 64 75 6d 70 5f 71 75 65  _schema_dump_que
18750 72 79 28 0a 20 20 53 68 65 6c 6c 53 74 61 74 65  ry(.  ShellState
18760 20 2a 70 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61   *p,.  const cha
18770 72 20 2a 7a 51 75 65 72 79 0a 29 7b 0a 20 20 69  r *zQuery.){.  i
18780 6e 74 20 72 63 3b 0a 20 20 63 68 61 72 20 2a 7a  nt rc;.  char *z
18790 45 72 72 20 3d 20 30 3b 0a 20 20 72 63 20 3d 20  Err = 0;.  rc = 
187a0 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e  sqlite3_exec(p->
187b0 64 62 2c 20 7a 51 75 65 72 79 2c 20 64 75 6d 70  db, zQuery, dump
187c0 5f 63 61 6c 6c 62 61 63 6b 2c 20 70 2c 20 26 7a  _callback, p, &z
187d0 45 72 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  Err);.  if( rc==
187e0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 29  SQLITE_CORRUPT )
187f0 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 51 32 3b  {.    char *zQ2;
18800 0a 20 20 20 20 69 6e 74 20 6c 65 6e 20 3d 20 73  .    int len = s
18810 74 72 6c 65 6e 33 30 28 7a 51 75 65 72 79 29 3b  trlen30(zQuery);
18820 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28  .    raw_printf(
18830 70 2d 3e 6f 75 74 2c 20 22 2f 2a 2a 2a 2a 2a 2a  p->out, "/******
18840 20 43 4f 52 52 55 50 54 49 4f 4e 20 45 52 52 4f   CORRUPTION ERRO
18850 52 20 2a 2a 2a 2a 2a 2a 2a 2f 5c 6e 22 29 3b 0a  R *******/\n");.
18860 20 20 20 20 69 66 28 20 7a 45 72 72 20 29 7b 0a      if( zErr ){.
18870 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
18880 66 28 70 2d 3e 6f 75 74 2c 20 22 2f 2a 2a 2a 2a  f(p->out, "/****
18890 2a 2a 20 25 73 20 2a 2a 2a 2a 2a 2a 2f 5c 6e 22  ** %s ******/\n"
188a0 2c 20 7a 45 72 72 29 3b 0a 20 20 20 20 20 20 73  , zErr);.      s
188b0 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 45 72 72  qlite3_free(zErr
188c0 29 3b 0a 20 20 20 20 20 20 7a 45 72 72 20 3d 20  );.      zErr = 
188d0 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 51 32  0;.    }.    zQ2
188e0 20 3d 20 6d 61 6c 6c 6f 63 28 20 6c 65 6e 2b 31   = malloc( len+1
188f0 30 30 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 51  00 );.    if( zQ
18900 32 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 72 63  2==0 ) return rc
18910 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  ;.    sqlite3_sn
18920 70 72 69 6e 74 66 28 6c 65 6e 2b 31 30 30 2c 20  printf(len+100, 
18930 7a 51 32 2c 20 22 25 73 20 4f 52 44 45 52 20 42  zQ2, "%s ORDER B
18940 59 20 72 6f 77 69 64 20 44 45 53 43 22 2c 20 7a  Y rowid DESC", z
18950 51 75 65 72 79 29 3b 0a 20 20 20 20 72 63 20 3d  Query);.    rc =
18960 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d   sqlite3_exec(p-
18970 3e 64 62 2c 20 7a 51 32 2c 20 64 75 6d 70 5f 63  >db, zQ2, dump_c
18980 61 6c 6c 62 61 63 6b 2c 20 70 2c 20 26 7a 45 72  allback, p, &zEr
18990 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  r);.    if( rc )
189a0 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69  {.      utf8_pri
189b0 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 2f 2a 2a  ntf(p->out, "/**
189c0 2a 2a 2a 2a 20 45 52 52 4f 52 3a 20 25 73 20 2a  **** ERROR: %s *
189d0 2a 2a 2a 2a 2a 2f 5c 6e 22 2c 20 7a 45 72 72 29  *****/\n", zErr)
189e0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
189f0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
18a00 4f 52 52 55 50 54 3b 0a 20 20 20 20 7d 0a 20 20  ORRUPT;.    }.  
18a10 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
18a20 45 72 72 29 3b 0a 20 20 20 20 66 72 65 65 28 7a  Err);.    free(z
18a30 51 32 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  Q2);.  }.  retur
18a40 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
18a50 65 78 74 20 6f 66 20 61 20 68 65 6c 70 20 6d 65  ext of a help me
18a60 73 73 61 67 65 0a 2a 2f 0a 73 74 61 74 69 63 20  ssage.*/.static 
18a70 63 68 61 72 20 7a 48 65 6c 70 5b 5d 20 3d 0a 23  char zHelp[] =.#
18a80 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
18a90 45 5f 48 41 56 45 5f 5a 4c 49 42 29 20 26 26 20  E_HAVE_ZLIB) && 
18aa0 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
18ab0 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
18ac0 45 29 0a 20 20 22 2e 61 72 63 68 69 76 65 20 2e  E).  ".archive .
18ad0 2e 2e 20 20 20 20 20 20 20 20 20 20 20 4d 61 6e  ..           Man
18ae0 61 67 65 20 53 51 4c 20 61 72 63 68 69 76 65 73  age SQL archives
18af0 3a 20 5c 22 2e 61 72 63 68 69 76 65 20 2d 2d 68  : \".archive --h
18b00 65 6c 70 5c 22 20 66 6f 72 20 64 65 74 61 69 6c  elp\" for detail
18b10 73 5c 6e 22 0a 23 65 6e 64 69 66 0a 23 69 66 6e  s\n".#endif.#ifn
18b20 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
18b30 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20  AUTHORIZATION.  
18b40 22 2e 61 75 74 68 20 4f 4e 7c 4f 46 46 20 20 20  ".auth ON|OFF   
18b50 20 20 20 20 20 20 20 20 53 68 6f 77 20 61 75 74          Show aut
18b60 68 6f 72 69 7a 65 72 20 63 61 6c 6c 62 61 63 6b  horizer callback
18b70 73 5c 6e 22 0a 23 65 6e 64 69 66 0a 20 20 22 2e  s\n".#endif.  ".
18b80 62 61 63 6b 75 70 20 3f 44 42 3f 20 46 49 4c 45  backup ?DB? FILE
18b90 20 20 20 20 20 20 42 61 63 6b 75 70 20 44 42 20        Backup DB 
18ba0 28 64 65 66 61 75 6c 74 20 5c 22 6d 61 69 6e 5c  (default \"main\
18bb0 22 29 20 74 6f 20 46 49 4c 45 5c 6e 22 0a 20 20  ") to FILE\n".  
18bc0 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
18bd0 20 20 20 20 20 20 20 20 20 20 41 64 64 20 5c 22            Add \"
18be0 2d 2d 61 70 70 65 6e 64 5c 22 20 74 6f 20 6f 70  --append\" to op
18bf0 65 6e 20 75 73 69 6e 67 20 61 70 70 65 6e 64 76  en using appendv
18c00 66 73 2e 5c 6e 22 0a 20 20 22 2e 62 61 69 6c 20  fs.\n".  ".bail 
18c10 6f 6e 7c 6f 66 66 20 20 20 20 20 20 20 20 20 20  on|off          
18c20 20 53 74 6f 70 20 61 66 74 65 72 20 68 69 74 74   Stop after hitt
18c30 69 6e 67 20 61 6e 20 65 72 72 6f 72 2e 20 20 44  ing an error.  D
18c40 65 66 61 75 6c 74 20 4f 46 46 5c 6e 22 0a 20 20  efault OFF\n".  
18c50 22 2e 62 69 6e 61 72 79 20 6f 6e 7c 6f 66 66 20  ".binary on|off 
18c60 20 20 20 20 20 20 20 20 54 75 72 6e 20 62 69 6e          Turn bin
18c70 61 72 79 20 6f 75 74 70 75 74 20 6f 6e 20 6f 72  ary output on or
18c80 20 6f 66 66 2e 20 20 44 65 66 61 75 6c 74 20 4f   off.  Default O
18c90 46 46 5c 6e 22 0a 20 20 22 2e 63 64 20 44 49 52  FF\n".  ".cd DIR
18ca0 45 43 54 4f 52 59 20 20 20 20 20 20 20 20 20 20  ECTORY          
18cb0 43 68 61 6e 67 65 20 74 68 65 20 77 6f 72 6b 69  Change the worki
18cc0 6e 67 20 64 69 72 65 63 74 6f 72 79 20 74 6f 20  ng directory to 
18cd0 44 49 52 45 43 54 4f 52 59 5c 6e 22 0a 20 20 22  DIRECTORY\n".  "
18ce0 2e 63 68 61 6e 67 65 73 20 6f 6e 7c 6f 66 66 20  .changes on|off 
18cf0 20 20 20 20 20 20 20 53 68 6f 77 20 6e 75 6d 62         Show numb
18d00 65 72 20 6f 66 20 72 6f 77 73 20 63 68 61 6e 67  er of rows chang
18d10 65 64 20 62 79 20 53 51 4c 5c 6e 22 0a 20 20 22  ed by SQL\n".  "
18d20 2e 63 68 65 63 6b 20 47 4c 4f 42 20 20 20 20 20  .check GLOB     
18d30 20 20 20 20 20 20 20 46 61 69 6c 20 69 66 20 6f         Fail if o
18d40 75 74 70 75 74 20 73 69 6e 63 65 20 2e 74 65 73  utput since .tes
18d50 74 63 61 73 65 20 64 6f 65 73 20 6e 6f 74 20 6d  tcase does not m
18d60 61 74 63 68 5c 6e 22 0a 20 20 22 2e 63 6c 6f 6e  atch\n".  ".clon
18d70 65 20 4e 45 57 44 42 20 20 20 20 20 20 20 20 20  e NEWDB         
18d80 20 20 43 6c 6f 6e 65 20 64 61 74 61 20 69 6e 74    Clone data int
18d90 6f 20 4e 45 57 44 42 20 66 72 6f 6d 20 74 68 65  o NEWDB from the
18da0 20 65 78 69 73 74 69 6e 67 20 64 61 74 61 62 61   existing databa
18db0 73 65 5c 6e 22 0a 20 20 22 2e 64 61 74 61 62 61  se\n".  ".databa
18dc0 73 65 73 20 20 20 20 20 20 20 20 20 20 20 20 20  ses             
18dd0 4c 69 73 74 20 6e 61 6d 65 73 20 61 6e 64 20 66  List names and f
18de0 69 6c 65 73 20 6f 66 20 61 74 74 61 63 68 65 64  iles of attached
18df0 20 64 61 74 61 62 61 73 65 73 5c 6e 22 0a 20 20   databases\n".  
18e00 22 2e 64 62 63 6f 6e 66 69 67 20 3f 6f 70 3f 20  ".dbconfig ?op? 
18e10 3f 76 61 6c 3f 20 20 20 4c 69 73 74 20 6f 72 20  ?val?   List or 
18e20 63 68 61 6e 67 65 20 73 71 6c 69 74 65 33 5f 64  change sqlite3_d
18e30 62 5f 63 6f 6e 66 69 67 28 29 20 6f 70 74 69 6f  b_config() optio
18e40 6e 73 5c 6e 22 0a 20 20 22 2e 64 62 69 6e 66 6f  ns\n".  ".dbinfo
18e50 20 3f 44 42 3f 20 20 20 20 20 20 20 20 20 20 20   ?DB?           
18e60 53 68 6f 77 20 73 74 61 74 75 73 20 69 6e 66 6f  Show status info
18e70 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68  rmation about th
18e80 65 20 64 61 74 61 62 61 73 65 5c 6e 22 0a 20 20  e database\n".  
18e90 22 2e 64 75 6d 70 20 3f 54 41 42 4c 45 3f 20 2e  ".dump ?TABLE? .
18ea0 2e 2e 20 20 20 20 20 20 44 75 6d 70 20 74 68 65  ..      Dump the
18eb0 20 64 61 74 61 62 61 73 65 20 69 6e 20 61 6e 20   database in an 
18ec0 53 51 4c 20 74 65 78 74 20 66 6f 72 6d 61 74 5c  SQL text format\
18ed0 6e 22 0a 20 20 22 20 20 20 20 20 20 20 20 20 20  n".  "          
18ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 49                 I
18ef0 66 20 54 41 42 4c 45 20 73 70 65 63 69 66 69 65  f TABLE specifie
18f00 64 2c 20 6f 6e 6c 79 20 64 75 6d 70 20 74 61 62  d, only dump tab
18f10 6c 65 73 20 6d 61 74 63 68 69 6e 67 5c 6e 22 0a  les matching\n".
18f20 20 20 22 20 20 20 20 20 20 20 20 20 20 20 20 20    "             
18f30 20 20 20 20 20 20 20 20 20 20 20 20 4c 49 4b 45              LIKE
18f40 20 70 61 74 74 65 72 6e 20 54 41 42 4c 45 2e 5c   pattern TABLE.\
18f50 6e 22 0a 20 20 22 2e 65 63 68 6f 20 6f 6e 7c 6f  n".  ".echo on|o
18f60 66 66 20 20 20 20 20 20 20 20 20 20 20 54 75 72  ff           Tur
18f70 6e 20 63 6f 6d 6d 61 6e 64 20 65 63 68 6f 20 6f  n command echo o
18f80 6e 20 6f 72 20 6f 66 66 5c 6e 22 0a 20 20 22 2e  n or off\n".  ".
18f90 65 71 70 20 6f 6e 7c 6f 66 66 7c 66 75 6c 6c 20  eqp on|off|full 
18fa0 20 20 20 20 20 20 45 6e 61 62 6c 65 20 6f 72 20        Enable or 
18fb0 64 69 73 61 62 6c 65 20 61 75 74 6f 6d 61 74 69  disable automati
18fc0 63 20 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20  c EXPLAIN QUERY 
18fd0 50 4c 41 4e 5c 6e 22 0a 20 20 22 2e 65 78 63 65  PLAN\n".  ".exce
18fe0 6c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l               
18ff0 20 20 44 69 73 70 6c 61 79 20 74 68 65 20 6f 75    Display the ou
19000 74 70 75 74 20 6f 66 20 6e 65 78 74 20 63 6f 6d  tput of next com
19010 6d 61 6e 64 20 69 6e 20 61 20 73 70 72 65 61 64  mand in a spread
19020 73 68 65 65 74 5c 6e 22 0a 20 20 22 2e 65 78 69  sheet\n".  ".exi
19030 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
19040 20 20 20 45 78 69 74 20 74 68 69 73 20 70 72 6f     Exit this pro
19050 67 72 61 6d 5c 6e 22 0a 20 20 22 2e 65 78 70 65  gram\n".  ".expe
19060 72 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  rt              
19070 20 20 45 58 50 45 52 49 4d 45 4e 54 41 4c 2e 20    EXPERIMENTAL. 
19080 53 75 67 67 65 73 74 20 69 6e 64 65 78 65 73 20  Suggest indexes 
19090 66 6f 72 20 73 70 65 63 69 66 69 65 64 20 71 75  for specified qu
190a0 65 72 69 65 73 5c 6e 22 0a 2f 2a 20 42 65 63 61  eries\n"./* Beca
190b0 75 73 65 20 65 78 70 6c 61 69 6e 20 6d 6f 64 65  use explain mode
190c0 20 63 6f 6d 65 73 20 6f 6e 20 61 75 74 6f 6d 61   comes on automa
190d0 74 69 63 61 6c 6c 79 20 6e 6f 77 2c 20 74 68 65  tically now, the
190e0 20 22 2e 65 78 70 6c 61 69 6e 22 20 6d 6f 64 65   ".explain" mode
190f0 0a 2a 2a 20 69 73 20 72 65 6d 6f 76 65 64 20 66  .** is removed f
19100 72 6f 6d 20 74 68 65 20 68 65 6c 70 20 73 63 72  rom the help scr
19110 65 65 6e 2e 20 20 49 74 20 69 73 20 73 74 69 6c  een.  It is stil
19120 6c 20 73 75 70 70 6f 72 74 65 64 20 66 6f 72 20  l supported for 
19130 6c 65 67 61 63 79 2c 20 68 6f 77 65 76 65 72 20  legacy, however 
19140 2a 2f 0a 2f 2a 22 2e 65 78 70 6c 61 69 6e 20 3f  */./*".explain ?
19150 6f 6e 7c 6f 66 66 7c 61 75 74 6f 3f 20 54 75 72  on|off|auto? Tur
19160 6e 20 45 58 50 4c 41 49 4e 20 6f 75 74 70 75 74  n EXPLAIN output
19170 20 6d 6f 64 65 20 6f 6e 20 6f 72 20 6f 66 66 20   mode on or off 
19180 6f 72 20 74 6f 20 61 75 74 6f 6d 61 74 69 63 5c  or to automatic\
19190 6e 22 2a 2f 0a 20 20 22 2e 66 75 6c 6c 73 63 68  n"*/.  ".fullsch
191a0 65 6d 61 20 3f 2d 2d 69 6e 64 65 6e 74 3f 20 53  ema ?--indent? S
191b0 68 6f 77 20 73 63 68 65 6d 61 20 61 6e 64 20 74  how schema and t
191c0 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 73 71  he content of sq
191d0 6c 69 74 65 5f 73 74 61 74 20 74 61 62 6c 65 73  lite_stat tables
191e0 5c 6e 22 0a 20 20 22 2e 68 65 61 64 65 72 73 20  \n".  ".headers 
191f0 6f 6e 7c 6f 66 66 20 20 20 20 20 20 20 20 54 75  on|off        Tu
19200 72 6e 20 64 69 73 70 6c 61 79 20 6f 66 20 68 65  rn display of he
19210 61 64 65 72 73 20 6f 6e 20 6f 72 20 6f 66 66 5c  aders on or off\
19220 6e 22 0a 20 20 22 2e 68 65 6c 70 20 20 20 20 20  n".  ".help     
19230 20 20 20 20 20 20 20 20 20 20 20 20 20 53 68 6f               Sho
19240 77 20 74 68 69 73 20 6d 65 73 73 61 67 65 5c 6e  w this message\n
19250 22 0a 20 20 22 2e 69 6d 70 6f 72 74 20 46 49 4c  ".  ".import FIL
19260 45 20 54 41 42 4c 45 20 20 20 20 20 49 6d 70 6f  E TABLE     Impo
19270 72 74 20 64 61 74 61 20 66 72 6f 6d 20 46 49 4c  rt data from FIL
19280 45 20 69 6e 74 6f 20 54 41 42 4c 45 5c 6e 22 0a  E into TABLE\n".
19290 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
192a0 4d 49 54 5f 54 45 53 54 5f 43 4f 4e 54 52 4f 4c  MIT_TEST_CONTROL
192b0 0a 20 20 22 2e 69 6d 70 6f 73 74 65 72 20 49 4e  .  ".imposter IN
192c0 44 45 58 20 54 41 42 4c 45 20 20 43 72 65 61 74  DEX TABLE  Creat
192d0 65 20 69 6d 70 6f 73 74 65 72 20 74 61 62 6c 65  e imposter table
192e0 20 54 41 42 4c 45 20 6f 6e 20 69 6e 64 65 78 20   TABLE on index 
192f0 49 4e 44 45 58 5c 6e 22 0a 23 65 6e 64 69 66 0a  INDEX\n".#endif.
19300 20 20 22 2e 69 6e 64 65 78 65 73 20 3f 54 41 42    ".indexes ?TAB
19310 4c 45 3f 20 20 20 20 20 20 20 53 68 6f 77 20 6e  LE?       Show n
19320 61 6d 65 73 20 6f 66 20 61 6c 6c 20 69 6e 64 65  ames of all inde
19330 78 65 73 5c 6e 22 0a 20 20 22 20 20 20 20 20 20  xes\n".  "      
19340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19350 20 20 20 49 66 20 54 41 42 4c 45 20 73 70 65 63     If TABLE spec
19360 69 66 69 65 64 2c 20 6f 6e 6c 79 20 73 68 6f 77  ified, only show
19370 20 69 6e 64 65 78 65 73 20 66 6f 72 20 74 61 62   indexes for tab
19380 6c 65 73 5c 6e 22 0a 20 20 22 20 20 20 20 20 20  les\n".  "      
19390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
193a0 20 20 20 6d 61 74 63 68 69 6e 67 20 4c 49 4b 45     matching LIKE
193b0 20 70 61 74 74 65 72 6e 20 54 41 42 4c 45 2e 5c   pattern TABLE.\
193c0 6e 22 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  n".#ifdef SQLITE
193d0 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41 43 45 0a  _ENABLE_IOTRACE.
193e0 20 20 22 2e 69 6f 74 72 61 63 65 20 46 49 4c 45    ".iotrace FILE
193f0 20 20 20 20 20 20 20 20 20 20 45 6e 61 62 6c 65            Enable
19400 20 49 2f 4f 20 64 69 61 67 6e 6f 73 74 69 63 20   I/O diagnostic 
19410 6c 6f 67 67 69 6e 67 20 74 6f 20 46 49 4c 45 5c  logging to FILE\
19420 6e 22 0a 23 65 6e 64 69 66 0a 20 20 22 2e 6c 69  n".#endif.  ".li
19430 6d 69 74 20 3f 4c 49 4d 49 54 3f 20 3f 56 41 4c  mit ?LIMIT? ?VAL
19440 3f 20 20 20 44 69 73 70 6c 61 79 20 6f 72 20 63  ?   Display or c
19450 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65 20  hange the value 
19460 6f 66 20 61 6e 20 53 51 4c 49 54 45 5f 4c 49 4d  of an SQLITE_LIM
19470 49 54 5c 6e 22 0a 20 20 22 2e 6c 69 6e 74 20 4f  IT\n".  ".lint O
19480 50 54 49 4f 4e 53 20 20 20 20 20 20 20 20 20 20  PTIONS          
19490 52 65 70 6f 72 74 20 70 6f 74 65 6e 74 69 61 6c  Report potential
194a0 20 73 63 68 65 6d 61 20 69 73 73 75 65 73 2e 20   schema issues. 
194b0 4f 70 74 69 6f 6e 73 3a 5c 6e 22 0a 20 20 22 20  Options:\n".  " 
194c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
194d0 20 20 20 20 20 20 20 20 66 6b 65 79 2d 69 6e 64          fkey-ind
194e0 65 78 65 73 20 20 20 20 20 46 69 6e 64 20 6d 69  exes     Find mi
194f0 73 73 69 6e 67 20 66 6f 72 65 69 67 6e 20 6b 65  ssing foreign ke
19500 79 20 69 6e 64 65 78 65 73 5c 6e 22 0a 23 69 66  y indexes\n".#if
19510 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
19520 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 0a  _LOAD_EXTENSION.
19530 20 20 22 2e 6c 6f 61 64 20 46 49 4c 45 20 3f 45    ".load FILE ?E
19540 4e 54 52 59 3f 20 20 20 20 20 4c 6f 61 64 20 61  NTRY?     Load a
19550 6e 20 65 78 74 65 6e 73 69 6f 6e 20 6c 69 62 72  n extension libr
19560 61 72 79 5c 6e 22 0a 23 65 6e 64 69 66 0a 20 20  ary\n".#endif.  
19570 22 2e 6c 6f 67 20 46 49 4c 45 7c 6f 66 66 20 20  ".log FILE|off  
19580 20 20 20 20 20 20 20 20 54 75 72 6e 20 6c 6f 67          Turn log
19590 67 69 6e 67 20 6f 6e 20 6f 72 20 6f 66 66 2e 20  ging on or off. 
195a0 20 46 49 4c 45 20 63 61 6e 20 62 65 20 73 74 64   FILE can be std
195b0 65 72 72 2f 73 74 64 6f 75 74 5c 6e 22 0a 20 20  err/stdout\n".  
195c0 22 2e 6d 6f 64 65 20 4d 4f 44 45 20 3f 54 41 42  ".mode MODE ?TAB
195d0 4c 45 3f 20 20 20 20 20 53 65 74 20 6f 75 74 70  LE?     Set outp
195e0 75 74 20 6d 6f 64 65 20 77 68 65 72 65 20 4d 4f  ut mode where MO
195f0 44 45 20 69 73 20 6f 6e 65 20 6f 66 3a 5c 6e 22  DE is one of:\n"
19600 0a 20 20 22 20 20 20 20 20 20 20 20 20 20 20 20  .  "            
19610 20 20 20 20 20 20 20 20 20 20 20 20 20 61 73 63               asc
19620 69 69 20 20 20 20 43 6f 6c 75 6d 6e 73 2f 72 6f  ii    Columns/ro
19630 77 73 20 64 65 6c 69 6d 69 74 65 64 20 62 79 20  ws delimited by 
19640 30 78 31 46 20 61 6e 64 20 30 78 31 45 5c 6e 22  0x1F and 0x1E\n"
19650 0a 20 20 22 20 20 20 20 20 20 20 20 20 20 20 20  .  "            
19660 20 20 20 20 20 20 20 20 20 20 20 20 20 63 73 76               csv
19670 20 20 20 20 20 20 43 6f 6d 6d 61 2d 73 65 70 61        Comma-sepa
19680 72 61 74 65 64 20 76 61 6c 75 65 73 5c 6e 22 0a  rated values\n".
19690 20 20 22 20 20 20 20 20 20 20 20 20 20 20 20 20    "             
196a0 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6c 75              colu
196b0 6d 6e 20 20 20 4c 65 66 74 2d 61 6c 69 67 6e 65  mn   Left-aligne
196c0 64 20 63 6f 6c 75 6d 6e 73 2e 20 20 28 53 65 65  d columns.  (See
196d0 20 2e 77 69 64 74 68 29 5c 6e 22 0a 20 20 22 20   .width)\n".  " 
196e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
196f0 20 20 20 20 20 20 20 20 68 74 6d 6c 20 20 20 20          html    
19700 20 48 54 4d 4c 20 3c 74 61 62 6c 65 3e 20 63 6f   HTML <table> co
19710 64 65 5c 6e 22 0a 20 20 22 20 20 20 20 20 20 20  de\n".  "       
19720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19730 20 20 69 6e 73 65 72 74 20 20 20 53 51 4c 20 69    insert   SQL i
19740 6e 73 65 72 74 20 73 74 61 74 65 6d 65 6e 74 73  nsert statements
19750 20 66 6f 72 20 54 41 42 4c 45 5c 6e 22 0a 20 20   for TABLE\n".  
19760 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
19770 20 20 20 20 20 20 20 20 20 20 6c 69 6e 65 20 20            line  
19780 20 20 20 4f 6e 65 20 76 61 6c 75 65 20 70 65 72     One value per
19790 20 6c 69 6e 65 5c 6e 22 0a 20 20 22 20 20 20 20   line\n".  "    
197a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
197b0 20 20 20 20 20 6c 69 73 74 20 20 20 20 20 56 61       list     Va
197c0 6c 75 65 73 20 64 65 6c 69 6d 69 74 65 64 20 62  lues delimited b
197d0 79 20 5c 22 7c 5c 22 5c 6e 22 0a 20 20 22 20 20  y \"|\"\n".  "  
197e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
197f0 20 20 20 20 20 20 20 71 75 6f 74 65 20 20 20 20         quote    
19800 45 73 63 61 70 65 20 61 6e 73 77 65 72 73 20 61  Escape answers a
19810 73 20 66 6f 72 20 53 51 4c 5c 6e 22 0a 20 20 22  s for SQL\n".  "
19820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19830 20 20 20 20 20 20 20 20 20 74 61 62 73 20 20 20           tabs   
19840 20 20 54 61 62 2d 73 65 70 61 72 61 74 65 64 20    Tab-separated 
19850 76 61 6c 75 65 73 5c 6e 22 0a 20 20 22 20 20 20  values\n".  "   
19860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19870 20 20 20 20 20 20 74 63 6c 20 20 20 20 20 20 54        tcl      T
19880 43 4c 20 6c 69 73 74 20 65 6c 65 6d 65 6e 74 73  CL list elements
19890 5c 6e 22 0a 20 20 22 2e 6e 75 6c 6c 76 61 6c 75  \n".  ".nullvalu
198a0 65 20 53 54 52 49 4e 47 20 20 20 20 20 20 55 73  e STRING      Us
198b0 65 20 53 54 52 49 4e 47 20 69 6e 20 70 6c 61 63  e STRING in plac
198c0 65 20 6f 66 20 4e 55 4c 4c 20 76 61 6c 75 65 73  e of NULL values
198d0 5c 6e 22 0a 20 20 22 2e 6f 6e 63 65 20 28 2d 65  \n".  ".once (-e
198e0 7c 2d 78 7c 46 49 4c 45 29 20 20 20 20 20 4f 75  |-x|FILE)     Ou
198f0 74 70 75 74 20 66 6f 72 20 74 68 65 20 6e 65 78  tput for the nex
19900 74 20 53 51 4c 20 63 6f 6d 6d 61 6e 64 20 6f 6e  t SQL command on
19910 6c 79 20 74 6f 20 46 49 4c 45 5c 6e 22 0a 20 20  ly to FILE\n".  
19920 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
19930 20 20 20 20 20 20 20 20 20 20 6f 72 20 69 6e 76            or inv
19940 6f 6b 65 20 73 79 73 74 65 6d 20 74 65 78 74 20  oke system text 
19950 65 64 69 74 6f 72 20 28 2d 65 29 20 6f 72 20 73  editor (-e) or s
19960 70 72 65 61 64 73 68 65 65 74 20 28 2d 78 29 5c  preadsheet (-x)\
19970 6e 22 0a 20 20 22 20 20 20 20 20 20 20 20 20 20  n".  "          
19980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f                 o
19990 6e 20 74 68 65 20 6f 75 74 70 75 74 2e 5c 6e 22  n the output.\n"
199a0 0a 20 20 22 2e 6f 70 65 6e 20 3f 4f 50 54 49 4f  .  ".open ?OPTIO
199b0 4e 53 3f 20 3f 46 49 4c 45 3f 20 43 6c 6f 73 65  NS? ?FILE? Close
199c0 20 65 78 69 73 74 69 6e 67 20 64 61 74 61 62 61   existing databa
199d0 73 65 20 61 6e 64 20 72 65 6f 70 65 6e 20 46 49  se and reopen FI
199e0 4c 45 5c 6e 22 0a 20 20 22 20 20 20 20 20 20 20  LE\n".  "       
199f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19a00 20 20 54 68 65 20 2d 2d 6e 65 77 20 6f 70 74 69    The --new opti
19a10 6f 6e 20 73 74 61 72 74 73 20 77 69 74 68 20 61  on starts with a
19a20 6e 20 65 6d 70 74 79 20 66 69 6c 65 5c 6e 22 0a  n empty file\n".
19a30 20 20 22 20 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 4f 74 68 65              Othe
19a50 72 20 6f 70 74 69 6f 6e 73 3a 20 2d 2d 72 65 61  r options: --rea
19a60 64 6f 6e 6c 79 20 2d 2d 61 70 70 65 6e 64 20 2d  donly --append -
19a70 2d 7a 69 70 5c 6e 22 0a 20 20 22 2e 6f 75 74 70  -zip\n".  ".outp
19a80 75 74 20 3f 46 49 4c 45 3f 20 20 20 20 20 20 20  ut ?FILE?       
19a90 20 20 53 65 6e 64 20 6f 75 74 70 75 74 20 74 6f    Send output to
19aa0 20 46 49 4c 45 20 6f 72 20 73 74 64 6f 75 74 5c   FILE or stdout\
19ab0 6e 22 0a 20 20 22 2e 70 72 69 6e 74 20 53 54 52  n".  ".print STR
19ac0 49 4e 47 2e 2e 2e 20 20 20 20 20 20 20 50 72 69  ING...       Pri
19ad0 6e 74 20 6c 69 74 65 72 61 6c 20 53 54 52 49 4e  nt literal STRIN
19ae0 47 5c 6e 22 0a 20 20 22 2e 70 72 6f 6d 70 74 20  G\n".  ".prompt 
19af0 4d 41 49 4e 20 43 4f 4e 54 49 4e 55 45 20 20 52  MAIN CONTINUE  R
19b00 65 70 6c 61 63 65 20 74 68 65 20 73 74 61 6e 64  eplace the stand
19b10 61 72 64 20 70 72 6f 6d 70 74 73 5c 6e 22 0a 20  ard prompts\n". 
19b20 20 22 2e 71 75 69 74 20 20 20 20 20 20 20 20 20   ".quit         
19b30 20 20 20 20 20 20 20 20 20 45 78 69 74 20 74 68           Exit th
19b40 69 73 20 70 72 6f 67 72 61 6d 5c 6e 22 0a 20 20  is program\n".  
19b50 22 2e 72 65 61 64 20 46 49 4c 45 4e 41 4d 45 20  ".read FILENAME 
19b60 20 20 20 20 20 20 20 20 45 78 65 63 75 74 65 20          Execute 
19b70 53 51 4c 20 69 6e 20 46 49 4c 45 4e 41 4d 45 5c  SQL in FILENAME\
19b80 6e 22 0a 20 20 22 2e 72 65 73 74 6f 72 65 20 3f  n".  ".restore ?
19b90 44 42 3f 20 46 49 4c 45 20 20 20 20 20 52 65 73  DB? FILE     Res
19ba0 74 6f 72 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20  tore content of 
19bb0 44 42 20 28 64 65 66 61 75 6c 74 20 5c 22 6d 61  DB (default \"ma
19bc0 69 6e 5c 22 29 20 66 72 6f 6d 20 46 49 4c 45 5c  in\") from FILE\
19bd0 6e 22 0a 20 20 22 2e 73 61 76 65 20 46 49 4c 45  n".  ".save FILE
19be0 20 20 20 20 20 20 20 20 20 20 20 20 20 57 72 69               Wri
19bf0 74 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  te in-memory dat
19c00 61 62 61 73 65 20 69 6e 74 6f 20 46 49 4c 45 5c  abase into FILE\
19c10 6e 22 0a 20 20 22 2e 73 63 61 6e 73 74 61 74 73  n".  ".scanstats
19c20 20 6f 6e 7c 6f 66 66 20 20 20 20 20 20 54 75 72   on|off      Tur
19c30 6e 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73  n sqlite3_stmt_s
19c40 63 61 6e 73 74 61 74 75 73 28 29 20 6d 65 74 72  canstatus() metr
19c50 69 63 73 20 6f 6e 20 6f 72 20 6f 66 66 5c 6e 22  ics on or off\n"
19c60 0a 20 20 22 2e 73 63 68 65 6d 61 20 3f 50 41 54  .  ".schema ?PAT
19c70 54 45 52 4e 3f 20 20 20 20 20 20 53 68 6f 77 20  TERN?      Show 
19c80 74 68 65 20 43 52 45 41 54 45 20 73 74 61 74 65  the CREATE state
19c90 6d 65 6e 74 73 20 6d 61 74 63 68 69 6e 67 20 50  ments matching P
19ca0 41 54 54 45 52 4e 5c 6e 22 0a 20 20 22 20 20 20  ATTERN\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 41 64 64 20 2d 2d 69 6e 64         Add --ind
19cd0 65 6e 74 20 66 6f 72 20 70 72 65 74 74 79 2d 70  ent for pretty-p
19ce0 72 69 6e 74 69 6e 67 5c 6e 22 0a 20 20 22 2e 73  rinting\n".  ".s
19cf0 65 6c 66 74 65 73 74 20 3f 2d 2d 69 6e 69 74 3f  elftest ?--init?
19d00 20 20 20 20 20 52 75 6e 20 74 65 73 74 73 20 64       Run tests d
19d10 65 66 69 6e 65 64 20 69 6e 20 74 68 65 20 53 45  efined in the SE
19d20 4c 46 54 45 53 54 20 74 61 62 6c 65 5c 6e 22 0a  LFTEST table\n".
19d30 20 20 22 2e 73 65 70 61 72 61 74 6f 72 20 43 4f    ".separator CO
19d40 4c 20 3f 52 4f 57 3f 20 20 20 43 68 61 6e 67 65  L ?ROW?   Change
19d50 20 74 68 65 20 63 6f 6c 75 6d 6e 20 73 65 70 61   the column sepa
19d60 72 61 74 6f 72 20 61 6e 64 20 6f 70 74 69 6f 6e  rator and option
19d70 61 6c 6c 79 20 74 68 65 20 72 6f 77 5c 6e 22 0a  ally the row\n".
19d80 20 20 22 20 20 20 20 20 20 20 20 20 20 20 20 20    "             
19d90 20 20 20 20 20 20 20 20 20 20 20 20 73 65 70 61              sepa
19da0 72 61 74 6f 72 20 66 6f 72 20 62 6f 74 68 20 74  rator for both t
19db0 68 65 20 6f 75 74 70 75 74 20 6d 6f 64 65 20 61  he output mode a
19dc0 6e 64 20 2e 69 6d 70 6f 72 74 5c 6e 22 0a 23 69  nd .import\n".#i
19dd0 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
19de0 5f 45 4e 41 42 4c 45 5f 53 45 53 53 49 4f 4e 29  _ENABLE_SESSION)
19df0 0a 20 20 22 2e 73 65 73 73 69 6f 6e 20 43 4d 44  .  ".session CMD
19e00 20 2e 2e 2e 20 20 20 20 20 20 20 43 72 65 61 74   ...       Creat
19e10 65 20 6f 72 20 63 6f 6e 74 72 6f 6c 20 73 65 73  e or control ses
19e20 73 69 6f 6e 73 5c 6e 22 0a 23 65 6e 64 69 66 0a  sions\n".#endif.
19e30 20 20 22 2e 73 68 61 33 73 75 6d 20 3f 4f 50 54    ".sha3sum ?OPT
19e40 49 4f 4e 53 2e 2e 2e 3f 20 20 43 6f 6d 70 75 74  IONS...?  Comput
19e50 65 20 61 20 53 48 41 33 20 68 61 73 68 20 6f 66  e a SHA3 hash of
19e60 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74 65 6e   database conten
19e70 74 5c 6e 22 0a 23 69 66 6e 64 65 66 20 53 51 4c  t\n".#ifndef SQL
19e80 49 54 45 5f 4e 4f 48 41 56 45 5f 53 59 53 54 45  ITE_NOHAVE_SYSTE
19e90 4d 0a 20 20 22 2e 73 68 65 6c 6c 20 43 4d 44 20  M.  ".shell CMD 
19ea0 41 52 47 53 2e 2e 2e 20 20 20 20 20 52 75 6e 20  ARGS...     Run 
19eb0 43 4d 44 20 41 52 47 53 2e 2e 2e 20 69 6e 20 61  CMD ARGS... in a
19ec0 20 73 79 73 74 65 6d 20 73 68 65 6c 6c 5c 6e 22   system shell\n"
19ed0 0a 23 65 6e 64 69 66 0a 20 20 22 2e 73 68 6f 77  .#endif.  ".show
19ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19ef0 20 20 53 68 6f 77 20 74 68 65 20 63 75 72 72 65    Show the curre
19f00 6e 74 20 76 61 6c 75 65 73 20 66 6f 72 20 76 61  nt values for va
19f10 72 69 6f 75 73 20 73 65 74 74 69 6e 67 73 5c 6e  rious settings\n
19f20 22 0a 20 20 22 2e 73 74 61 74 73 20 3f 6f 6e 7c  ".  ".stats ?on|
19f30 6f 66 66 3f 20 20 20 20 20 20 20 20 53 68 6f 77  off?        Show
19f40 20 73 74 61 74 73 20 6f 72 20 74 75 72 6e 20 73   stats or turn s
19f50 74 61 74 73 20 6f 6e 20 6f 72 20 6f 66 66 5c 6e  tats on or off\n
19f60 22 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ".#ifndef SQLITE
19f70 5f 4e 4f 48 41 56 45 5f 53 59 53 54 45 4d 0a 20  _NOHAVE_SYSTEM. 
19f80 20 22 2e 73 79 73 74 65 6d 20 43 4d 44 20 41 52   ".system CMD AR
19f90 47 53 2e 2e 2e 20 20 20 20 52 75 6e 20 43 4d 44  GS...    Run CMD
19fa0 20 41 52 47 53 2e 2e 2e 20 69 6e 20 61 20 73 79   ARGS... in a sy
19fb0 73 74 65 6d 20 73 68 65 6c 6c 5c 6e 22 0a 23 65  stem shell\n".#e
19fc0 6e 64 69 66 0a 20 20 22 2e 74 61 62 6c 65 73 20  ndif.  ".tables 
19fd0 3f 54 41 42 4c 45 3f 20 20 20 20 20 20 20 20 4c  ?TABLE?        L
19fe0 69 73 74 20 6e 61 6d 65 73 20 6f 66 20 74 61 62  ist names of tab
19ff0 6c 65 73 5c 6e 22 0a 20 20 22 20 20 20 20 20 20  les\n".  "      
1a000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a010 20 20 20 49 66 20 54 41 42 4c 45 20 73 70 65 63     If TABLE spec
1a020 69 66 69 65 64 2c 20 6f 6e 6c 79 20 6c 69 73 74  ified, only list
1a030 20 74 61 62 6c 65 73 20 6d 61 74 63 68 69 6e 67   tables matching
1a040 5c 6e 22 0a 20 20 22 20 20 20 20 20 20 20 20 20  \n".  "         
1a050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a060 4c 49 4b 45 20 70 61 74 74 65 72 6e 20 54 41 42  LIKE pattern TAB
1a070 4c 45 2e 5c 6e 22 0a 20 20 22 2e 74 65 73 74 63  LE.\n".  ".testc
1a080 61 73 65 20 4e 41 4d 45 20 20 20 20 20 20 20 20  ase NAME        
1a090 20 42 65 67 69 6e 20 72 65 64 69 72 65 63 74 69   Begin redirecti
1a0a0 6e 67 20 6f 75 74 70 75 74 20 74 6f 20 27 74 65  ng output to 'te
1a0b0 73 74 63 61 73 65 2d 6f 75 74 2e 74 78 74 27 5c  stcase-out.txt'\
1a0c0 6e 22 0a 20 20 22 2e 74 69 6d 65 6f 75 74 20 4d  n".  ".timeout M
1a0d0 53 20 20 20 20 20 20 20 20 20 20 20 20 54 72 79  S            Try
1a0e0 20 6f 70 65 6e 69 6e 67 20 6c 6f 63 6b 65 64 20   opening locked 
1a0f0 74 61 62 6c 65 73 20 66 6f 72 20 4d 53 20 6d 69  tables for MS mi
1a100 6c 6c 69 73 65 63 6f 6e 64 73 5c 6e 22 0a 20 20  lliseconds\n".  
1a110 22 2e 74 69 6d 65 72 20 6f 6e 7c 6f 66 66 20 20  ".timer on|off  
1a120 20 20 20 20 20 20 20 20 54 75 72 6e 20 53 51 4c          Turn SQL
1a130 20 74 69 6d 65 72 20 6f 6e 20 6f 72 20 6f 66 66   timer on or off
1a140 5c 6e 22 0a 20 20 22 2e 74 72 61 63 65 20 46 49  \n".  ".trace FI
1a150 4c 45 7c 6f 66 66 20 20 20 20 20 20 20 20 4f 75  LE|off        Ou
1a160 74 70 75 74 20 65 61 63 68 20 53 51 4c 20 73 74  tput each SQL st
1a170 61 74 65 6d 65 6e 74 20 61 73 20 69 74 20 69 73  atement as it is
1a180 20 72 75 6e 5c 6e 22 0a 20 20 22 2e 76 66 73 69   run\n".  ".vfsi
1a190 6e 66 6f 20 3f 41 55 58 3f 20 20 20 20 20 20 20  nfo ?AUX?       
1a1a0 20 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62    Information ab
1a1b0 6f 75 74 20 74 68 65 20 74 6f 70 2d 6c 65 76 65  out the top-leve
1a1c0 6c 20 56 46 53 5c 6e 22 0a 20 20 22 2e 76 66 73  l VFS\n".  ".vfs
1a1d0 6c 69 73 74 20 20 20 20 20 20 20 20 20 20 20 20  list            
1a1e0 20 20 20 4c 69 73 74 20 61 6c 6c 20 61 76 61 69     List all avai
1a1f0 6c 61 62 6c 65 20 56 46 53 65 73 5c 6e 22 0a 20  lable VFSes\n". 
1a200 20 22 2e 76 66 73 6e 61 6d 65 20 3f 41 55 58 3f   ".vfsname ?AUX?
1a210 20 20 20 20 20 20 20 20 20 50 72 69 6e 74 20 74           Print t
1a220 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 56  he name of the V
1a230 46 53 20 73 74 61 63 6b 5c 6e 22 0a 20 20 22 2e  FS stack\n".  ".
1a240 77 69 64 74 68 20 4e 55 4d 31 20 4e 55 4d 32 20  width NUM1 NUM2 
1a250 2e 2e 2e 20 20 20 53 65 74 20 63 6f 6c 75 6d 6e  ...   Set column
1a260 20 77 69 64 74 68 73 20 66 6f 72 20 5c 22 63 6f   widths for \"co
1a270 6c 75 6d 6e 5c 22 20 6d 6f 64 65 5c 6e 22 0a 20  lumn\" mode\n". 
1a280 20 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20   "              
1a290 20 20 20 20 20 20 20 20 20 20 20 4e 65 67 61 74             Negat
1a2a0 69 76 65 20 76 61 6c 75 65 73 20 72 69 67 68 74  ive values right
1a2b0 2d 6a 75 73 74 69 66 79 5c 6e 22 0a 3b 0a 0a 23  -justify\n".;..#
1a2c0 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
1a2d0 45 5f 45 4e 41 42 4c 45 5f 53 45 53 53 49 4f 4e  E_ENABLE_SESSION
1a2e0 29 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 68 65  )./*.** Print he
1a2f0 6c 70 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66  lp information f
1a300 6f 72 20 74 68 65 20 22 2e 73 65 73 73 69 6f 6e  or the ".session
1a310 73 22 20 63 6f 6d 6d 61 6e 64 0a 2a 2f 0a 76 6f  s" command.*/.vo
1a320 69 64 20 73 65 73 73 69 6f 6e 5f 68 65 6c 70 28  id session_help(
1a330 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 29 7b 0a  ShellState *p){.
1a340 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e    raw_printf(p->
1a350 6f 75 74 2c 0a 20 20 20 20 22 2e 73 65 73 73 69  out,.    ".sessi
1a360 6f 6e 20 3f 4e 41 4d 45 3f 20 53 55 42 43 4f 4d  on ?NAME? SUBCOM
1a370 4d 41 4e 44 20 3f 41 52 47 53 2e 2e 2e 3f 5c 6e  MAND ?ARGS...?\n
1a380 22 0a 20 20 20 20 22 49 66 20 3f 4e 41 4d 45 3f  ".    "If ?NAME?
1a390 20 69 73 20 6f 6d 69 74 74 65 64 2c 20 74 68 65   is omitted, the
1a3a0 20 66 69 72 73 74 20 64 65 66 69 6e 65 64 20 73   first defined s
1a3b0 65 73 73 69 6f 6e 20 69 73 20 75 73 65 64 2e 5c  ession is used.\
1a3c0 6e 22 0a 20 20 20 20 22 53 75 62 63 6f 6d 6d 61  n".    "Subcomma
1a3d0 6e 64 73 3a 5c 6e 22 0a 20 20 20 20 22 20 20 20  nds:\n".    "   
1a3e0 61 74 74 61 63 68 20 54 41 42 4c 45 20 20 20 20  attach TABLE    
1a3f0 20 20 20 20 20 20 20 20 20 41 74 74 61 63 68 20           Attach 
1a400 54 41 42 4c 45 5c 6e 22 0a 20 20 20 20 22 20 20  TABLE\n".    "  
1a410 20 63 68 61 6e 67 65 73 65 74 20 46 49 4c 45 20   changeset FILE 
1a420 20 20 20 20 20 20 20 20 20 20 57 72 69 74 65 20            Write 
1a430 61 20 63 68 61 6e 67 65 73 65 74 20 69 6e 74 6f  a changeset into
1a440 20 46 49 4c 45 5c 6e 22 0a 20 20 20 20 22 20 20   FILE\n".    "  
1a450 20 63 6c 6f 73 65 20 20 20 20 20 20 20 20 20 20   close          
1a460 20 20 20 20 20 20 20 20 20 20 43 6c 6f 73 65 20            Close 
1a470 6f 6e 65 20 73 65 73 73 69 6f 6e 5c 6e 22 0a 20  one session\n". 
1a480 20 20 20 22 20 20 20 65 6e 61 62 6c 65 20 3f 42     "   enable ?B
1a490 4f 4f 4c 45 41 4e 3f 20 20 20 20 20 20 20 20 20  OOLEAN?         
1a4a0 53 65 74 20 6f 72 20 71 75 65 72 79 20 74 68 65  Set or query the
1a4b0 20 65 6e 61 62 6c 65 20 62 69 74 5c 6e 22 0a 20   enable bit\n". 
1a4c0 20 20 20 22 20 20 20 66 69 6c 74 65 72 20 47 4c     "   filter GL
1a4d0 4f 42 2e 2e 2e 20 20 20 20 20 20 20 20 20 20 20  OB...           
1a4e0 52 65 6a 65 63 74 20 74 61 62 6c 65 73 20 6d 61  Reject tables ma
1a4f0 74 63 68 69 6e 67 20 47 4c 4f 42 73 5c 6e 22 0a  tching GLOBs\n".
1a500 20 20 20 20 22 20 20 20 69 6e 64 69 72 65 63 74      "   indirect
1a510 20 3f 42 4f 4f 4c 45 41 4e 3f 20 20 20 20 20 20   ?BOOLEAN?      
1a520 20 4d 61 72 6b 20 6f 72 20 71 75 65 72 79 20 74   Mark or query t
1a530 68 65 20 69 6e 64 69 72 65 63 74 20 73 74 61 74  he indirect stat
1a540 75 73 5c 6e 22 0a 20 20 20 20 22 20 20 20 69 73  us\n".    "   is
1a550 65 6d 70 74 79 20 20 20 20 20 20 20 20 20 20 20  empty           
1a560 20 20 20 20 20 20 20 51 75 65 72 79 20 77 68 65         Query whe
1a570 74 68 65 72 20 74 68 65 20 73 65 73 73 69 6f 6e  ther the session
1a580 20 69 73 20 65 6d 70 74 79 5c 6e 22 0a 20 20 20   is empty\n".   
1a590 20 22 20 20 20 6c 69 73 74 20 20 20 20 20 20 20   "   list       
1a5a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4c 69                Li
1a5b0 73 74 20 63 75 72 72 65 6e 74 6c 79 20 6f 70 65  st currently ope
1a5c0 6e 20 73 65 73 73 69 6f 6e 20 6e 61 6d 65 73 5c  n session names\
1a5d0 6e 22 0a 20 20 20 20 22 20 20 20 6f 70 65 6e 20  n".    "   open 
1a5e0 44 42 20 4e 41 4d 45 20 20 20 20 20 20 20 20 20  DB NAME         
1a5f0 20 20 20 20 4f 70 65 6e 20 61 20 6e 65 77 20 73      Open a new s
1a600 65 73 73 69 6f 6e 20 6f 6e 20 44 42 5c 6e 22 0a  ession on DB\n".
1a610 20 20 20 20 22 20 20 20 70 61 74 63 68 73 65 74      "   patchset
1a620 20 46 49 4c 45 20 20 20 20 20 20 20 20 20 20 20   FILE           
1a630 20 57 72 69 74 65 20 61 20 70 61 74 63 68 73 65   Write a patchse
1a640 74 20 69 6e 74 6f 20 46 49 4c 45 5c 6e 22 0a 20  t into FILE\n". 
1a650 20 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f   );.}.#endif.../
1a660 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65  * Forward refere
1a670 6e 63 65 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  nce */.static in
1a680 74 20 70 72 6f 63 65 73 73 5f 69 6e 70 75 74 28  t process_input(
1a690 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 2c 20 46  ShellState *p, F
1a6a0 49 4c 45 20 2a 69 6e 29 3b 0a 0a 2f 2a 0a 2a 2a  ILE *in);../*.**
1a6b0 20 52 65 61 64 20 74 68 65 20 63 6f 6e 74 65 6e   Read the conten
1a6c0 74 20 6f 66 20 66 69 6c 65 20 7a 4e 61 6d 65 20  t of file zName 
1a6d0 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 6f 62 74 61  into memory obta
1a6e0 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65  ined from sqlite
1a6f0 33 5f 6d 61 6c 6c 6f 63 36 34 28 29 0a 2a 2a 20  3_malloc64().** 
1a700 61 6e 64 20 72 65 74 75 72 6e 20 61 20 70 6f 69  and return a poi
1a710 6e 74 65 72 20 74 6f 20 74 68 65 20 62 75 66 66  nter to the buff
1a720 65 72 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 69  er. The caller i
1a730 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f  s responsible fo
1a740 72 20 66 72 65 65 69 6e 67 0a 2a 2a 20 74 68 65  r freeing.** the
1a750 20 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 49   memory..**.** I
1a760 66 20 70 61 72 61 6d 65 74 65 72 20 70 6e 42 79  f parameter pnBy
1a770 74 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20  te is not NULL, 
1a780 28 2a 70 6e 42 79 74 65 29 20 69 73 20 73 65 74  (*pnByte) is set
1a790 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   to the number o
1a7a0 66 20 62 79 74 65 73 0a 2a 2a 20 72 65 61 64 2e  f bytes.** read.
1a7b0 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 63 6f 6e 76 65  .**.** For conve
1a7c0 6e 69 65 6e 63 65 2c 20 61 20 6e 75 6c 2d 74 65  nience, a nul-te
1a7d0 72 6d 69 6e 61 74 6f 72 20 62 79 74 65 20 69 73  rminator byte is
1a7e0 20 61 6c 77 61 79 73 20 61 70 70 65 6e 64 65 64   always appended
1a7f0 20 74 6f 20 74 68 65 20 64 61 74 61 20 72 65 61   to the data rea
1a800 64 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 66 69  d.** from the fi
1a810 6c 65 20 62 65 66 6f 72 65 20 74 68 65 20 62 75  le before the bu
1a820 66 66 65 72 20 69 73 20 72 65 74 75 72 6e 65 64  ffer is returned
1a830 2e 20 54 68 69 73 20 62 79 74 65 20 69 73 20 6e  . This byte is n
1a840 6f 74 20 69 6e 63 6c 75 64 65 64 20 69 6e 0a 2a  ot included in.*
1a850 2a 20 74 68 65 20 66 69 6e 61 6c 20 76 61 6c 75  * the final valu
1a860 65 20 6f 66 20 28 2a 70 6e 42 79 74 65 29 2c 20  e of (*pnByte), 
1a870 69 66 20 61 70 70 6c 69 63 61 62 6c 65 2e 0a 2a  if applicable..*
1a880 2a 0a 2a 2a 20 4e 55 4c 4c 20 69 73 20 72 65 74  *.** NULL is ret
1a890 75 72 6e 65 64 20 69 66 20 61 6e 79 20 65 72 72  urned if any err
1a8a0 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65  or is encountere
1a8b0 64 2e 20 54 68 65 20 66 69 6e 61 6c 20 76 61 6c  d. The final val
1a8c0 75 65 20 6f 66 20 2a 70 6e 42 79 74 65 0a 2a 2a  ue of *pnByte.**
1a8d0 20 69 73 20 75 6e 64 65 66 69 6e 65 64 20 69 6e   is undefined in
1a8e0 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2f 0a 73   this case..*/.s
1a8f0 74 61 74 69 63 20 63 68 61 72 20 2a 72 65 61 64  tatic char *read
1a900 46 69 6c 65 28 63 6f 6e 73 74 20 63 68 61 72 20  File(const char 
1a910 2a 7a 4e 61 6d 65 2c 20 69 6e 74 20 2a 70 6e 42  *zName, int *pnB
1a920 79 74 65 29 7b 0a 20 20 46 49 4c 45 20 2a 69 6e  yte){.  FILE *in
1a930 20 3d 20 66 6f 70 65 6e 28 7a 4e 61 6d 65 2c 20   = fopen(zName, 
1a940 22 72 62 22 29 3b 0a 20 20 6c 6f 6e 67 20 6e 49  "rb");.  long nI
1a950 6e 3b 0a 20 20 73 69 7a 65 5f 74 20 6e 52 65 61  n;.  size_t nRea
1a960 64 3b 0a 20 20 63 68 61 72 20 2a 70 42 75 66 3b  d;.  char *pBuf;
1a970 0a 20 20 69 66 28 20 69 6e 3d 3d 30 20 29 20 72  .  if( in==0 ) r
1a980 65 74 75 72 6e 20 30 3b 0a 20 20 66 73 65 65 6b  eturn 0;.  fseek
1a990 28 69 6e 2c 20 30 2c 20 53 45 45 4b 5f 45 4e 44  (in, 0, SEEK_END
1a9a0 29 3b 0a 20 20 6e 49 6e 20 3d 20 66 74 65 6c 6c  );.  nIn = ftell
1a9b0 28 69 6e 29 3b 0a 20 20 72 65 77 69 6e 64 28 69  (in);.  rewind(i
1a9c0 6e 29 3b 0a 20 20 70 42 75 66 20 3d 20 73 71 6c  n);.  pBuf = sql
1a9d0 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 20 6e  ite3_malloc64( n
1a9e0 49 6e 2b 31 20 29 3b 0a 20 20 69 66 28 20 70 42  In+1 );.  if( pB
1a9f0 75 66 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  uf==0 ) return 0
1aa00 3b 0a 20 20 6e 52 65 61 64 20 3d 20 66 72 65 61  ;.  nRead = frea
1aa10 64 28 70 42 75 66 2c 20 6e 49 6e 2c 20 31 2c 20  d(pBuf, nIn, 1, 
1aa20 69 6e 29 3b 0a 20 20 66 63 6c 6f 73 65 28 69 6e  in);.  fclose(in
1aa30 29 3b 0a 20 20 69 66 28 20 6e 52 65 61 64 21 3d  );.  if( nRead!=
1aa40 31 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  1 ){.    sqlite3
1aa50 5f 66 72 65 65 28 70 42 75 66 29 3b 0a 20 20 20  _free(pBuf);.   
1aa60 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
1aa70 20 70 42 75 66 5b 6e 49 6e 5d 20 3d 20 30 3b 0a   pBuf[nIn] = 0;.
1aa80 20 20 69 66 28 20 70 6e 42 79 74 65 20 29 20 2a    if( pnByte ) *
1aa90 70 6e 42 79 74 65 20 3d 20 6e 49 6e 3b 0a 20 20  pnByte = nIn;.  
1aaa0 72 65 74 75 72 6e 20 70 42 75 66 3b 0a 7d 0a 0a  return pBuf;.}..
1aab0 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
1aac0 54 45 5f 45 4e 41 42 4c 45 5f 53 45 53 53 49 4f  TE_ENABLE_SESSIO
1aad0 4e 29 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61  N)./*.** Close a
1aae0 20 73 69 6e 67 6c 65 20 4f 70 65 6e 53 65 73 73   single OpenSess
1aaf0 69 6f 6e 20 6f 62 6a 65 63 74 20 61 6e 64 20 72  ion object and r
1ab00 65 6c 65 61 73 65 20 61 6c 6c 20 6f 66 20 69 74  elease all of it
1ab10 73 20 61 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20  s associated.** 
1ab20 72 65 73 6f 75 72 63 65 73 2e 0a 2a 2f 0a 73 74  resources..*/.st
1ab30 61 74 69 63 20 76 6f 69 64 20 73 65 73 73 69 6f  atic void sessio
1ab40 6e 5f 63 6c 6f 73 65 28 4f 70 65 6e 53 65 73 73  n_close(OpenSess
1ab50 69 6f 6e 20 2a 70 53 65 73 73 69 6f 6e 29 7b 0a  ion *pSession){.
1ab60 20 20 69 6e 74 20 69 3b 0a 20 20 73 71 6c 69 74    int i;.  sqlit
1ab70 65 33 73 65 73 73 69 6f 6e 5f 64 65 6c 65 74 65  e3session_delete
1ab80 28 70 53 65 73 73 69 6f 6e 2d 3e 70 29 3b 0a 20  (pSession->p);. 
1ab90 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 53   sqlite3_free(pS
1aba0 65 73 73 69 6f 6e 2d 3e 7a 4e 61 6d 65 29 3b 0a  ession->zName);.
1abb0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53 65    for(i=0; i<pSe
1abc0 73 73 69 6f 6e 2d 3e 6e 46 69 6c 74 65 72 3b 20  ssion->nFilter; 
1abd0 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  i++){.    sqlite
1abe0 33 5f 66 72 65 65 28 70 53 65 73 73 69 6f 6e 2d  3_free(pSession-
1abf0 3e 61 7a 46 69 6c 74 65 72 5b 69 5d 29 3b 0a 20  >azFilter[i]);. 
1ac00 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65   }.  sqlite3_fre
1ac10 65 28 70 53 65 73 73 69 6f 6e 2d 3e 61 7a 46 69  e(pSession->azFi
1ac20 6c 74 65 72 29 3b 0a 20 20 6d 65 6d 73 65 74 28  lter);.  memset(
1ac30 70 53 65 73 73 69 6f 6e 2c 20 30 2c 20 73 69 7a  pSession, 0, siz
1ac40 65 6f 66 28 4f 70 65 6e 53 65 73 73 69 6f 6e 29  eof(OpenSession)
1ac50 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  );.}.#endif../*.
1ac60 2a 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 4f 70 65  ** Close all Ope
1ac70 6e 53 65 73 73 69 6f 6e 20 6f 62 6a 65 63 74 73  nSession objects
1ac80 20 61 6e 64 20 72 65 6c 65 61 73 65 20 61 6c 6c   and release all
1ac90 20 61 73 73 6f 63 69 61 74 65 64 20 72 65 73 6f   associated reso
1aca0 75 72 63 65 73 2e 0a 2a 2f 0a 23 69 66 20 64 65  urces..*/.#if de
1acb0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
1acc0 42 4c 45 5f 53 45 53 53 49 4f 4e 29 0a 73 74 61  BLE_SESSION).sta
1acd0 74 69 63 20 76 6f 69 64 20 73 65 73 73 69 6f 6e  tic void session
1ace0 5f 63 6c 6f 73 65 5f 61 6c 6c 28 53 68 65 6c 6c  _close_all(Shell
1acf0 53 74 61 74 65 20 2a 70 29 7b 0a 20 20 69 6e 74  State *p){.  int
1ad00 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   i;.  for(i=0; i
1ad10 3c 70 2d 3e 6e 53 65 73 73 69 6f 6e 3b 20 69 2b  <p->nSession; i+
1ad20 2b 29 7b 0a 20 20 20 20 73 65 73 73 69 6f 6e 5f  +){.    session_
1ad30 63 6c 6f 73 65 28 26 70 2d 3e 61 53 65 73 73 69  close(&p->aSessi
1ad40 6f 6e 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 70 2d  on[i]);.  }.  p-
1ad50 3e 6e 53 65 73 73 69 6f 6e 20 3d 20 30 3b 0a 7d  >nSession = 0;.}
1ad60 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
1ad70 73 65 73 73 69 6f 6e 5f 63 6c 6f 73 65 5f 61 6c  session_close_al
1ad80 6c 28 58 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  l(X).#endif../*.
1ad90 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ** Implementatio
1ada0 6e 20 6f 66 20 74 68 65 20 78 46 69 6c 74 65 72  n of the xFilter
1adb0 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 61 6e   function for an
1adc0 20 6f 70 65 6e 20 73 65 73 73 69 6f 6e 2e 20 20   open session.  
1add0 4f 6d 69 74 0a 2a 2a 20 61 6e 79 20 74 61 62 6c  Omit.** any tabl
1ade0 65 73 20 6e 61 6d 65 64 20 62 79 20 22 2e 73 65  es named by ".se
1adf0 73 73 69 6f 6e 20 66 69 6c 74 65 72 22 20 62 75  ssion filter" bu
1ae00 74 20 6c 65 74 20 61 6c 6c 20 6f 74 68 65 72 20  t let all other 
1ae10 74 61 62 6c 65 20 74 68 72 6f 75 67 68 2e 0a 2a  table through..*
1ae20 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  /.#if defined(SQ
1ae30 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 45 53 53  LITE_ENABLE_SESS
1ae40 49 4f 4e 29 0a 73 74 61 74 69 63 20 69 6e 74 20  ION).static int 
1ae50 73 65 73 73 69 6f 6e 5f 66 69 6c 74 65 72 28 76  session_filter(v
1ae60 6f 69 64 20 2a 70 43 74 78 2c 20 63 6f 6e 73 74  oid *pCtx, const
1ae70 20 63 68 61 72 20 2a 7a 54 61 62 29 7b 0a 20 20   char *zTab){.  
1ae80 4f 70 65 6e 53 65 73 73 69 6f 6e 20 2a 70 53 65  OpenSession *pSe
1ae90 73 73 69 6f 6e 20 3d 20 28 4f 70 65 6e 53 65 73  ssion = (OpenSes
1aea0 73 69 6f 6e 2a 29 70 43 74 78 3b 0a 20 20 69 6e  sion*)pCtx;.  in
1aeb0 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  t i;.  for(i=0; 
1aec0 69 3c 70 53 65 73 73 69 6f 6e 2d 3e 6e 46 69 6c  i<pSession->nFil
1aed0 74 65 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  ter; i++){.    i
1aee0 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72 67 6c  f( sqlite3_strgl
1aef0 6f 62 28 70 53 65 73 73 69 6f 6e 2d 3e 61 7a 46  ob(pSession->azF
1af00 69 6c 74 65 72 5b 69 5d 2c 20 7a 54 61 62 29 3d  ilter[i], zTab)=
1af10 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
1af20 20 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d   }.  return 1;.}
1af30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
1af40 72 79 20 74 6f 20 64 65 64 75 63 65 20 74 68 65  ry to deduce the
1af50 20 74 79 70 65 20 6f 66 20 66 69 6c 65 20 66 6f   type of file fo
1af60 72 20 7a 4e 61 6d 65 20 62 61 73 65 64 20 6f 6e  r zName based on
1af70 20 69 74 73 20 63 6f 6e 74 65 6e 74 2e 20 20 52   its content.  R
1af80 65 74 75 72 6e 0a 2a 2a 20 6f 6e 65 20 6f 66 20  eturn.** one of 
1af90 74 68 65 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f 2a  the SHELL_OPEN_*
1afa0 20 63 6f 6e 73 74 61 6e 74 73 2e 0a 2a 2a 0a 2a   constants..**.*
1afb0 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 64 6f  * If the file do
1afc0 65 73 20 6e 6f 74 20 65 78 69 73 74 20 6f 72 20  es not exist or 
1afd0 69 73 20 65 6d 70 74 79 20 62 75 74 20 69 74 73  is empty but its
1afe0 20 6e 61 6d 65 20 6c 6f 6f 6b 73 20 6c 69 6b 65   name looks like
1aff0 20 61 20 5a 49 50 0a 2a 2a 20 61 72 63 68 69 76   a ZIP.** archiv
1b000 65 20 61 6e 64 20 74 68 65 20 64 66 6c 74 5a 69  e and the dfltZi
1b010 70 20 66 6c 61 67 20 69 73 20 74 72 75 65 2c 20  p flag is true, 
1b020 74 68 65 6e 20 61 73 73 75 6d 65 20 69 74 20 69  then assume it i
1b030 73 20 61 20 5a 49 50 20 61 72 63 68 69 76 65 2e  s a ZIP archive.
1b040 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 61  .** Otherwise, a
1b050 73 73 75 6d 65 20 61 6e 20 6f 72 64 69 6e 61 72  ssume an ordinar
1b060 79 20 64 61 74 61 62 61 73 65 20 72 65 67 61 72  y database regar
1b070 64 6c 65 73 73 20 6f 66 20 74 68 65 20 66 69 6c  dless of the fil
1b080 65 6e 61 6d 65 20 69 66 0a 2a 2a 20 74 68 65 20  ename if.** the 
1b090 74 79 70 65 20 63 61 6e 6e 6f 74 20 62 65 20 64  type cannot be d
1b0a0 65 74 65 72 6d 69 6e 65 64 20 66 72 6f 6d 20 63  etermined from c
1b0b0 6f 6e 74 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 64  ontent..*/.int d
1b0c0 65 64 75 63 65 44 61 74 61 62 61 73 65 54 79 70  educeDatabaseTyp
1b0d0 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e  e(const char *zN
1b0e0 61 6d 65 2c 20 69 6e 74 20 64 66 6c 74 5a 69 70  ame, int dfltZip
1b0f0 29 7b 0a 20 20 46 49 4c 45 20 2a 66 20 3d 20 66  ){.  FILE *f = f
1b100 6f 70 65 6e 28 7a 4e 61 6d 65 2c 20 22 72 62 22  open(zName, "rb"
1b110 29 3b 0a 20 20 73 69 7a 65 5f 74 20 6e 3b 0a 20  );.  size_t n;. 
1b120 20 69 6e 74 20 72 63 20 3d 20 53 48 45 4c 4c 5f   int rc = SHELL_
1b130 4f 50 45 4e 5f 55 4e 53 50 45 43 3b 0a 20 20 63  OPEN_UNSPEC;.  c
1b140 68 61 72 20 7a 42 75 66 5b 31 30 30 5d 3b 0a 20  har zBuf[100];. 
1b150 20 69 66 28 20 66 3d 3d 30 20 29 7b 0a 20 20 20   if( f==0 ){.   
1b160 20 69 66 28 20 64 66 6c 74 5a 69 70 20 26 26 20   if( dfltZip && 
1b170 73 71 6c 69 74 65 33 5f 73 74 72 6c 69 6b 65 28  sqlite3_strlike(
1b180 22 25 2e 7a 69 70 22 2c 7a 4e 61 6d 65 2c 30 29  "%.zip",zName,0)
1b190 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 48 45  ==0 ) return SHE
1b1a0 4c 4c 5f 4f 50 45 4e 5f 5a 49 50 46 49 4c 45 3b  LL_OPEN_ZIPFILE;
1b1b0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 48 45 4c  .    return SHEL
1b1c0 4c 5f 4f 50 45 4e 5f 4e 4f 52 4d 41 4c 3b 0a 20  L_OPEN_NORMAL;. 
1b1d0 20 7d 0a 20 20 66 73 65 65 6b 28 66 2c 20 2d 32   }.  fseek(f, -2
1b1e0 35 2c 20 53 45 45 4b 5f 45 4e 44 29 3b 0a 20 20  5, SEEK_END);.  
1b1f0 6e 20 3d 20 66 72 65 61 64 28 7a 42 75 66 2c 20  n = fread(zBuf, 
1b200 32 35 2c 20 31 2c 20 66 29 3b 0a 20 20 69 66 28  25, 1, f);.  if(
1b210 20 6e 3d 3d 31 20 26 26 20 6d 65 6d 63 6d 70 28   n==1 && memcmp(
1b220 7a 42 75 66 2c 20 22 53 74 61 72 74 2d 4f 66 2d  zBuf, "Start-Of-
1b230 53 51 4c 69 74 65 33 2d 22 2c 20 31 37 29 3d 3d  SQLite3-", 17)==
1b240 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 48  0 ){.    rc = SH
1b250 45 4c 4c 5f 4f 50 45 4e 5f 41 50 50 45 4e 44 56  ELL_OPEN_APPENDV
1b260 46 53 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  FS;.  }else{.   
1b270 20 66 73 65 65 6b 28 66 2c 20 2d 32 32 2c 20 53   fseek(f, -22, S
1b280 45 45 4b 5f 45 4e 44 29 3b 0a 20 20 20 20 6e 20  EEK_END);.    n 
1b290 3d 20 66 72 65 61 64 28 7a 42 75 66 2c 20 32 32  = fread(zBuf, 22
1b2a0 2c 20 31 2c 20 66 29 3b 0a 20 20 20 20 69 66 28  , 1, f);.    if(
1b2b0 20 6e 3d 3d 31 20 26 26 20 7a 42 75 66 5b 30 5d   n==1 && zBuf[0]
1b2c0 3d 3d 30 78 35 30 20 26 26 20 7a 42 75 66 5b 31  ==0x50 && zBuf[1
1b2d0 5d 3d 3d 30 78 34 62 20 26 26 20 7a 42 75 66 5b  ]==0x4b && zBuf[
1b2e0 32 5d 3d 3d 30 78 30 35 0a 20 20 20 20 20 20 20  2]==0x05.       
1b2f0 26 26 20 7a 42 75 66 5b 33 5d 3d 3d 30 78 30 36  && zBuf[3]==0x06
1b300 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
1b310 48 45 4c 4c 5f 4f 50 45 4e 5f 5a 49 50 46 49 4c  HELL_OPEN_ZIPFIL
1b320 45 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  E;.    }else if(
1b330 20 6e 3d 3d 30 20 26 26 20 64 66 6c 74 5a 69 70   n==0 && dfltZip
1b340 20 26 26 20 73 71 6c 69 74 65 33 5f 73 74 72 6c   && sqlite3_strl
1b350 69 6b 65 28 22 25 2e 7a 69 70 22 2c 7a 4e 61 6d  ike("%.zip",zNam
1b360 65 2c 30 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  e,0)==0 ){.     
1b370 20 72 65 74 75 72 6e 20 53 48 45 4c 4c 5f 4f 50   return SHELL_OP
1b380 45 4e 5f 5a 49 50 46 49 4c 45 3b 0a 20 20 20 20  EN_ZIPFILE;.    
1b390 7d 0a 20 20 7d 0a 20 20 66 63 6c 6f 73 65 28 66  }.  }.  fclose(f
1b3a0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 20  );.  return rc; 
1b3b0 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20   .}../*.** Make 
1b3c0 73 75 72 65 20 74 68 65 20 64 61 74 61 62 61 73  sure the databas
1b3d0 65 20 69 73 20 6f 70 65 6e 2e 20 20 49 66 20 69  e is open.  If i
1b3e0 74 20 69 73 20 6e 6f 74 2c 20 74 68 65 6e 20 6f  t is not, then o
1b3f0 70 65 6e 20 69 74 2e 20 20 49 66 0a 2a 2a 20 74  pen it.  If.** t
1b400 68 65 20 64 61 74 61 62 61 73 65 20 66 61 69 6c  he database fail
1b410 73 20 74 6f 20 6f 70 65 6e 2c 20 70 72 69 6e 74  s to open, print
1b420 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
1b430 65 20 61 6e 64 20 65 78 69 74 2e 0a 2a 2f 0a 73  e and exit..*/.s
1b440 74 61 74 69 63 20 76 6f 69 64 20 6f 70 65 6e 5f  tatic void open_
1b450 64 62 28 53 68 65 6c 6c 53 74 61 74 65 20 2a 70  db(ShellState *p
1b460 2c 20 69 6e 74 20 6b 65 65 70 41 6c 69 76 65 29  , int keepAlive)
1b470 7b 0a 20 20 69 66 28 20 70 2d 3e 64 62 3d 3d 30  {.  if( p->db==0
1b480 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6f   ){.    if( p->o
1b490 70 65 6e 4d 6f 64 65 3d 3d 53 48 45 4c 4c 5f 4f  penMode==SHELL_O
1b4a0 50 45 4e 5f 55 4e 53 50 45 43 20 29 7b 0a 20 20  PEN_UNSPEC ){.  
1b4b0 20 20 20 20 69 66 28 20 70 2d 3e 7a 44 62 46 69      if( p->zDbFi
1b4c0 6c 65 6e 61 6d 65 3d 3d 30 20 7c 7c 20 70 2d 3e  lename==0 || p->
1b4d0 7a 44 62 46 69 6c 65 6e 61 6d 65 5b 30 5d 3d 3d  zDbFilename[0]==
1b4e0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e  0 ){.        p->
1b4f0 6f 70 65 6e 4d 6f 64 65 20 3d 20 53 48 45 4c 4c  openMode = SHELL
1b500 5f 4f 50 45 4e 5f 4e 4f 52 4d 41 4c 3b 0a 20 20  _OPEN_NORMAL;.  
1b510 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 61 63      }else if( ac
1b520 63 65 73 73 28 70 2d 3e 7a 44 62 46 69 6c 65 6e  cess(p->zDbFilen
1b530 61 6d 65 2c 30 29 3d 3d 30 20 29 7b 0a 20 20 20  ame,0)==0 ){.   
1b540 20 20 20 20 20 70 2d 3e 6f 70 65 6e 4d 6f 64 65       p->openMode
1b550 20 3d 20 28 75 38 29 64 65 64 75 63 65 44 61 74   = (u8)deduceDat
1b560 61 62 61 73 65 54 79 70 65 28 70 2d 3e 7a 44 62  abaseType(p->zDb
1b570 46 69 6c 65 6e 61 6d 65 2c 20 30 29 3b 0a 20 20  Filename, 0);.  
1b580 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
1b590 73 77 69 74 63 68 28 20 70 2d 3e 6f 70 65 6e 4d  switch( p->openM
1b5a0 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 63 61 73  ode ){.      cas
1b5b0 65 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f 41 50 50  e SHELL_OPEN_APP
1b5c0 45 4e 44 56 46 53 3a 20 7b 0a 20 20 20 20 20 20  ENDVFS: {.      
1b5d0 20 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76    sqlite3_open_v
1b5e0 32 28 70 2d 3e 7a 44 62 46 69 6c 65 6e 61 6d 65  2(p->zDbFilename
1b5f0 2c 20 26 70 2d 3e 64 62 2c 20 0a 20 20 20 20 20  , &p->db, .     
1b600 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
1b610 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49  N_READWRITE|SQLI
1b620 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 2c 20  TE_OPEN_CREATE, 
1b630 22 61 70 6e 64 76 66 73 22 29 3b 0a 20 20 20 20  "apndvfs");.    
1b640 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
1b650 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 53 48   }.      case SH
1b660 45 4c 4c 5f 4f 50 45 4e 5f 5a 49 50 46 49 4c 45  ELL_OPEN_ZIPFILE
1b670 3a 20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  : {.        sqli
1b680 74 65 33 5f 6f 70 65 6e 28 22 3a 6d 65 6d 6f 72  te3_open(":memor
1b690 79 3a 22 2c 20 26 70 2d 3e 64 62 29 3b 0a 20 20  y:", &p->db);.  
1b6a0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1b6b0 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20     }.      case 
1b6c0 53 48 45 4c 4c 5f 4f 50 45 4e 5f 52 45 41 44 4f  SHELL_OPEN_READO
1b6d0 4e 4c 59 3a 20 7b 0a 20 20 20 20 20 20 20 20 73  NLY: {.        s
1b6e0 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28 70  qlite3_open_v2(p
1b6f0 2d 3e 7a 44 62 46 69 6c 65 6e 61 6d 65 2c 20 26  ->zDbFilename, &
1b700 70 2d 3e 64 62 2c 20 53 51 4c 49 54 45 5f 4f 50  p->db, SQLITE_OP
1b710 45 4e 5f 52 45 41 44 4f 4e 4c 59 2c 20 30 29 3b  EN_READONLY, 0);
1b720 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
1b730 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61        }.      ca
1b740 73 65 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f 55 4e  se SHELL_OPEN_UN
1b750 53 50 45 43 3a 0a 20 20 20 20 20 20 63 61 73 65  SPEC:.      case
1b760 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f 4e 4f 52 4d   SHELL_OPEN_NORM
1b770 41 4c 3a 20 7b 0a 20 20 20 20 20 20 20 20 73 71  AL: {.        sq
1b780 6c 69 74 65 33 5f 6f 70 65 6e 28 70 2d 3e 7a 44  lite3_open(p->zD
1b790 62 46 69 6c 65 6e 61 6d 65 2c 20 26 70 2d 3e 64  bFilename, &p->d
1b7a0 62 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  b);.        brea
1b7b0 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
1b7c0 0a 20 20 20 20 67 6c 6f 62 61 6c 44 62 20 3d 20  .    globalDb = 
1b7d0 70 2d 3e 64 62 3b 0a 20 20 20 20 69 66 28 20 70  p->db;.    if( p
1b7e0 2d 3e 64 62 3d 3d 30 20 7c 7c 20 53 51 4c 49 54  ->db==0 || SQLIT
1b7f0 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 5f 65 72  E_OK!=sqlite3_er
1b800 72 63 6f 64 65 28 70 2d 3e 64 62 29 20 29 7b 0a  rcode(p->db) ){.
1b810 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
1b820 66 28 73 74 64 65 72 72 2c 22 45 72 72 6f 72 3a  f(stderr,"Error:
1b830 20 75 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20   unable to open 
1b840 64 61 74 61 62 61 73 65 20 5c 22 25 73 5c 22 3a  database \"%s\":
1b850 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20   %s\n",.        
1b860 20 20 70 2d 3e 7a 44 62 46 69 6c 65 6e 61 6d 65    p->zDbFilename
1b870 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  , sqlite3_errmsg
1b880 28 70 2d 3e 64 62 29 29 3b 0a 20 20 20 20 20 20  (p->db));.      
1b890 69 66 28 20 6b 65 65 70 41 6c 69 76 65 20 29 20  if( keepAlive ) 
1b8a0 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 65 78  return;.      ex
1b8b0 69 74 28 31 29 3b 0a 20 20 20 20 7d 0a 23 69 66  it(1);.    }.#if
1b8c0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1b8d0 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 0a  _LOAD_EXTENSION.
1b8e0 20 20 20 20 73 71 6c 69 74 65 33 5f 65 6e 61 62      sqlite3_enab
1b8f0 6c 65 5f 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f  le_load_extensio
1b900 6e 28 70 2d 3e 64 62 2c 20 31 29 3b 0a 23 65 6e  n(p->db, 1);.#en
1b910 64 69 66 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  dif.    sqlite3_
1b920 66 69 6c 65 69 6f 5f 69 6e 69 74 28 70 2d 3e 64  fileio_init(p->d
1b930 62 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71  b, 0, 0);.    sq
1b940 6c 69 74 65 33 5f 73 68 61 74 68 72 65 65 5f 69  lite3_shathree_i
1b950 6e 69 74 28 70 2d 3e 64 62 2c 20 30 2c 20 30 29  nit(p->db, 0, 0)
1b960 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6f  ;.    sqlite3_co
1b970 6d 70 6c 65 74 69 6f 6e 5f 69 6e 69 74 28 70 2d  mpletion_init(p-
1b980 3e 64 62 2c 20 30 2c 20 30 29 3b 0a 23 69 66 64  >db, 0, 0);.#ifd
1b990 65 66 20 53 51 4c 49 54 45 5f 48 41 56 45 5f 5a  ef SQLITE_HAVE_Z
1b9a0 4c 49 42 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  LIB.    sqlite3_
1b9b0 7a 69 70 66 69 6c 65 5f 69 6e 69 74 28 70 2d 3e  zipfile_init(p->
1b9c0 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73  db, 0, 0);.    s
1b9d0 71 6c 69 74 65 33 5f 73 71 6c 61 72 5f 69 6e 69  qlite3_sqlar_ini
1b9e0 74 28 70 2d 3e 64 62 2c 20 30 2c 20 30 29 3b 0a  t(p->db, 0, 0);.
1b9f0 23 65 6e 64 69 66 0a 20 20 20 20 73 71 6c 69 74  #endif.    sqlit
1ba00 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
1ba10 6f 6e 28 70 2d 3e 64 62 2c 20 22 73 68 65 6c 6c  on(p->db, "shell
1ba20 5f 61 64 64 5f 73 63 68 65 6d 61 22 2c 20 33 2c  _add_schema", 3,
1ba30 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c   SQLITE_UTF8, 0,
1ba40 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1ba50 20 20 20 20 20 20 20 20 20 20 20 20 20 73 68 65               she
1ba60 6c 6c 41 64 64 53 63 68 65 6d 61 4e 61 6d 65 2c  llAddSchemaName,
1ba70 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   0, 0);.    sqli
1ba80 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
1ba90 69 6f 6e 28 70 2d 3e 64 62 2c 20 22 73 68 65 6c  ion(p->db, "shel
1baa0 6c 5f 6d 6f 64 75 6c 65 5f 73 63 68 65 6d 61 22  l_module_schema"
1bab0 2c 20 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  , 1, SQLITE_UTF8
1bac0 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20  , 0,.           
1bad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bae0 20 73 68 65 6c 6c 4d 6f 64 75 6c 65 53 63 68 65   shellModuleSche
1baf0 6d 61 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73  ma, 0, 0);.    s
1bb00 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
1bb10 6e 63 74 69 6f 6e 28 70 2d 3e 64 62 2c 20 22 73  nction(p->db, "s
1bb20 68 65 6c 6c 5f 70 75 74 73 6e 6c 22 2c 20 31 2c  hell_putsnl", 1,
1bb30 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 70 2c   SQLITE_UTF8, p,
1bb40 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1bb50 20 20 20 20 20 20 20 20 20 20 20 20 20 73 68 65               she
1bb60 6c 6c 50 75 74 73 46 75 6e 63 2c 20 30 2c 20 30  llPutsFunc, 0, 0
1bb70 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
1bb80 45 5f 4e 4f 48 41 56 45 5f 53 59 53 54 45 4d 0a  E_NOHAVE_SYSTEM.
1bb90 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61      sqlite3_crea
1bba0 74 65 5f 66 75 6e 63 74 69 6f 6e 28 70 2d 3e 64  te_function(p->d
1bbb0 62 2c 20 22 65 64 69 74 22 2c 20 31 2c 20 53 51  b, "edit", 1, SQ
1bbc0 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 0a 20 20  LITE_UTF8, 0,.  
1bbd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bbe0 20 20 20 20 20 20 20 20 20 20 65 64 69 74 46 75            editFu
1bbf0 6e 63 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73  nc, 0, 0);.    s
1bc00 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
1bc10 6e 63 74 69 6f 6e 28 70 2d 3e 64 62 2c 20 22 65  nction(p->db, "e
1bc20 64 69 74 22 2c 20 32 2c 20 53 51 4c 49 54 45 5f  dit", 2, SQLITE_
1bc30 55 54 46 38 2c 20 30 2c 0a 20 20 20 20 20 20 20  UTF8, 0,.       
1bc40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bc50 20 20 20 20 20 65 64 69 74 46 75 6e 63 2c 20 30       editFunc, 0
1bc60 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  , 0);.#endif.   
1bc70 20 69 66 28 20 70 2d 3e 6f 70 65 6e 4d 6f 64 65   if( p->openMode
1bc80 3d 3d 53 48 45 4c 4c 5f 4f 50 45 4e 5f 5a 49 50  ==SHELL_OPEN_ZIP
1bc90 46 49 4c 45 20 29 7b 0a 20 20 20 20 20 20 63 68  FILE ){.      ch
1bca0 61 72 20 2a 7a 53 71 6c 20 3d 20 73 71 6c 69 74  ar *zSql = sqlit
1bcb0 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20 20  e3_mprintf(.    
1bcc0 20 20 20 20 20 22 43 52 45 41 54 45 20 56 49 52       "CREATE VIR
1bcd0 54 55 41 4c 20 54 41 42 4c 45 20 7a 69 70 20 55  TUAL TABLE zip U
1bce0 53 49 4e 47 20 7a 69 70 66 69 6c 65 28 25 51 29  SING zipfile(%Q)
1bcf0 3b 22 2c 20 70 2d 3e 7a 44 62 46 69 6c 65 6e 61  ;", p->zDbFilena
1bd00 6d 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  me);.      sqlit
1bd10 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20 7a  e3_exec(p->db, z
1bd20 53 71 6c 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  Sql, 0, 0, 0);. 
1bd30 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
1bd40 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20 7d 0a 20  e(zSql);.    }. 
1bd50 20 7d 0a 7d 0a 0a 23 69 66 20 48 41 56 45 5f 52   }.}..#if HAVE_R
1bd60 45 41 44 4c 49 4e 45 20 7c 7c 20 48 41 56 45 5f  EADLINE || HAVE_
1bd70 45 44 49 54 4c 49 4e 45 0a 2f 2a 0a 2a 2a 20 52  EDITLINE./*.** R
1bd80 65 61 64 6c 69 6e 65 20 63 6f 6d 70 6c 65 74 69  eadline completi
1bd90 6f 6e 20 63 61 6c 6c 62 61 63 6b 73 0a 2a 2f 0a  on callbacks.*/.
1bda0 73 74 61 74 69 63 20 63 68 61 72 20 2a 72 65 61  static char *rea
1bdb0 64 6c 69 6e 65 5f 63 6f 6d 70 6c 65 74 69 6f 6e  dline_completion
1bdc0 5f 67 65 6e 65 72 61 74 6f 72 28 63 6f 6e 73 74  _generator(const
1bdd0 20 63 68 61 72 20 2a 74 65 78 74 2c 20 69 6e 74   char *text, int
1bde0 20 73 74 61 74 65 29 7b 0a 20 20 73 74 61 74 69   state){.  stati
1bdf0 63 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a  c sqlite3_stmt *
1be00 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 63 68 61  pStmt = 0;.  cha
1be10 72 20 2a 7a 52 65 74 3b 0a 20 20 69 66 28 20 73  r *zRet;.  if( s
1be20 74 61 74 65 3d 3d 30 20 29 7b 0a 20 20 20 20 63  tate==0 ){.    c
1be30 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 20 20 73  har *zSql;.    s
1be40 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
1be50 70 53 74 6d 74 29 3b 0a 20 20 20 20 7a 53 71 6c  pStmt);.    zSql
1be60 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
1be70 74 66 28 22 53 45 4c 45 43 54 20 44 49 53 54 49  tf("SELECT DISTI
1be80 4e 43 54 20 63 61 6e 64 69 64 61 74 65 20 43 4f  NCT candidate CO
1be90 4c 4c 41 54 45 20 6e 6f 63 61 73 65 22 0a 20 20  LLATE nocase".  
1bea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1beb0 20 20 20 20 20 20 20 20 20 22 20 20 46 52 4f 4d           "  FROM
1bec0 20 63 6f 6d 70 6c 65 74 69 6f 6e 28 25 51 29 20   completion(%Q) 
1bed0 4f 52 44 45 52 20 42 59 20 31 22 2c 20 74 65 78  ORDER BY 1", tex
1bee0 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  t);.    sqlite3_
1bef0 70 72 65 70 61 72 65 5f 76 32 28 67 6c 6f 62 61  prepare_v2(globa
1bf00 6c 44 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26  lDb, zSql, -1, &
1bf10 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 73  pStmt, 0);.    s
1bf20 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c  qlite3_free(zSql
1bf30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c  );.  }.  if( sql
1bf40 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29  ite3_step(pStmt)
1bf50 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a  ==SQLITE_ROW ){.
1bf60 20 20 20 20 7a 52 65 74 20 3d 20 73 74 72 64 75      zRet = strdu
1bf70 70 28 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73  p((const char*)s
1bf80 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
1bf90 78 74 28 70 53 74 6d 74 2c 20 30 29 29 3b 0a 20  xt(pStmt, 0));. 
1bfa0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    sqli
1bfb0 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74  te3_finalize(pSt
1bfc0 6d 74 29 3b 0a 20 20 20 20 70 53 74 6d 74 20 3d  mt);.    pStmt =
1bfd0 20 30 3b 0a 20 20 20 20 7a 52 65 74 20 3d 20 30   0;.    zRet = 0
1bfe0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a  ;.  }.  return z
1bff0 52 65 74 3b 0a 7d 0a 73 74 61 74 69 63 20 63 68  Ret;.}.static ch
1c000 61 72 20 2a 2a 72 65 61 64 6c 69 6e 65 5f 63 6f  ar **readline_co
1c010 6d 70 6c 65 74 69 6f 6e 28 63 6f 6e 73 74 20 63  mpletion(const c
1c020 68 61 72 20 2a 7a 54 65 78 74 2c 20 69 6e 74 20  har *zText, int 
1c030 69 53 74 61 72 74 2c 20 69 6e 74 20 69 45 6e 64  iStart, int iEnd
1c040 29 7b 0a 20 20 72 6c 5f 61 74 74 65 6d 70 74 65  ){.  rl_attempte
1c050 64 5f 63 6f 6d 70 6c 65 74 69 6f 6e 5f 6f 76 65  d_completion_ove
1c060 72 20 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e 20  r = 1;.  return 
1c070 72 6c 5f 63 6f 6d 70 6c 65 74 69 6f 6e 5f 6d 61  rl_completion_ma
1c080 74 63 68 65 73 28 7a 54 65 78 74 2c 20 72 65 61  tches(zText, rea
1c090 64 6c 69 6e 65 5f 63 6f 6d 70 6c 65 74 69 6f 6e  dline_completion
1c0a0 5f 67 65 6e 65 72 61 74 6f 72 29 3b 0a 7d 0a 0a  _generator);.}..
1c0b0 23 65 6c 69 66 20 48 41 56 45 5f 4c 49 4e 45 4e  #elif HAVE_LINEN
1c0c0 4f 49 53 45 0a 2f 2a 0a 2a 2a 20 4c 69 6e 65 6e  OISE./*.** Linen
1c0d0 6f 69 73 65 20 63 6f 6d 70 6c 65 74 69 6f 6e 20  oise completion 
1c0e0 63 61 6c 6c 62 61 63 6b 0a 2a 2f 0a 73 74 61 74  callback.*/.stat
1c0f0 69 63 20 76 6f 69 64 20 6c 69 6e 65 6e 6f 69 73  ic void linenois
1c100 65 5f 63 6f 6d 70 6c 65 74 69 6f 6e 28 63 6f 6e  e_completion(con
1c110 73 74 20 63 68 61 72 20 2a 7a 4c 69 6e 65 2c 20  st char *zLine, 
1c120 6c 69 6e 65 6e 6f 69 73 65 43 6f 6d 70 6c 65 74  linenoiseComplet
1c130 69 6f 6e 73 20 2a 6c 63 29 7b 0a 20 20 69 6e 74  ions *lc){.  int
1c140 20 6e 4c 69 6e 65 20 3d 20 73 74 72 6c 65 6e 33   nLine = strlen3
1c150 30 28 7a 4c 69 6e 65 29 3b 0a 20 20 69 6e 74 20  0(zLine);.  int 
1c160 69 2c 20 69 53 74 61 72 74 3b 0a 20 20 73 71 6c  i, iStart;.  sql
1c170 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
1c180 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a 53   = 0;.  char *zS
1c190 71 6c 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b  ql;.  char zBuf[
1c1a0 31 30 30 30 5d 3b 0a 0a 20 20 69 66 28 20 6e 4c  1000];..  if( nL
1c1b0 69 6e 65 3e 73 69 7a 65 6f 66 28 7a 42 75 66 29  ine>sizeof(zBuf)
1c1c0 2d 33 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  -30 ) return;.  
1c1d0 69 66 28 20 7a 4c 69 6e 65 5b 30 5d 3d 3d 27 2e  if( zLine[0]=='.
1c1e0 27 20 7c 7c 20 7a 4c 69 6e 65 5b 30 5d 3d 3d 27  ' || zLine[0]=='
1c1f0 23 27 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f  #') return;.  fo
1c200 72 28 69 3d 6e 4c 69 6e 65 2d 31 3b 20 69 3e 3d  r(i=nLine-1; i>=
1c210 30 20 26 26 20 28 69 73 61 6c 6e 75 6d 28 7a 4c  0 && (isalnum(zL
1c220 69 6e 65 5b 69 5d 29 20 7c 7c 20 7a 4c 69 6e 65  ine[i]) || zLine
1c230 5b 69 5d 3d 3d 27 5f 27 29 3b 20 69 2d 2d 29 7b  [i]=='_'); i--){
1c240 7d 0a 20 20 69 66 28 20 69 3d 3d 6e 4c 69 6e 65  }.  if( i==nLine
1c250 2d 31 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  -1 ) return;.  i
1c260 53 74 61 72 74 20 3d 20 69 2b 31 3b 0a 20 20 6d  Start = i+1;.  m
1c270 65 6d 63 70 79 28 7a 42 75 66 2c 20 7a 4c 69 6e  emcpy(zBuf, zLin
1c280 65 2c 20 69 53 74 61 72 74 29 3b 0a 20 20 7a 53  e, iStart);.  zS
1c290 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  ql = sqlite3_mpr
1c2a0 69 6e 74 66 28 22 53 45 4c 45 43 54 20 44 49 53  intf("SELECT DIS
1c2b0 54 49 4e 43 54 20 63 61 6e 64 69 64 61 74 65 20  TINCT candidate 
1c2c0 43 4f 4c 4c 41 54 45 20 6e 6f 63 61 73 65 22 0a  COLLATE nocase".
1c2d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c2e0 20 20 20 20 20 20 20 20 20 22 20 20 46 52 4f 4d           "  FROM
1c2f0 20 63 6f 6d 70 6c 65 74 69 6f 6e 28 25 51 2c 25   completion(%Q,%
1c300 51 29 20 4f 52 44 45 52 20 42 59 20 31 22 2c 0a  Q) ORDER BY 1",.
1c310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c320 20 20 20 20 20 20 20 20 20 26 7a 4c 69 6e 65 5b           &zLine[
1c330 69 53 74 61 72 74 5d 2c 20 7a 4c 69 6e 65 29 3b  iStart], zLine);
1c340 0a 20 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61  .  sqlite3_prepa
1c350 72 65 5f 76 32 28 67 6c 6f 62 61 6c 44 62 2c 20  re_v2(globalDb, 
1c360 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74  zSql, -1, &pStmt
1c370 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  , 0);.  sqlite3_
1c380 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 73 71  free(zSql);.  sq
1c390 6c 69 74 65 33 5f 65 78 65 63 28 67 6c 6f 62 61  lite3_exec(globa
1c3a0 6c 44 62 2c 20 22 50 52 41 47 4d 41 20 70 61 67  lDb, "PRAGMA pag
1c3b0 65 5f 63 6f 75 6e 74 22 2c 20 30 2c 20 30 2c 20  e_count", 0, 0, 
1c3c0 30 29 3b 20 2f 2a 20 4c 6f 61 64 20 74 68 65 20  0); /* Load the 
1c3d0 73 63 68 65 6d 61 20 2a 2f 0a 20 20 77 68 69 6c  schema */.  whil
1c3e0 65 28 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28  e( sqlite3_step(
1c3f0 70 53 74 6d 74 29 3d 3d 53 51 4c 49 54 45 5f 52  pStmt)==SQLITE_R
1c400 4f 57 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  OW ){.    const 
1c410 63 68 61 72 20 2a 7a 43 6f 6d 70 6c 65 74 69 6f  char *zCompletio
1c420 6e 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a  n = (const char*
1c430 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  )sqlite3_column_
1c440 74 65 78 74 28 70 53 74 6d 74 2c 20 30 29 3b 0a  text(pStmt, 0);.
1c450 20 20 20 20 69 6e 74 20 6e 43 6f 6d 70 6c 65 74      int nComplet
1c460 69 6f 6e 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  ion = sqlite3_co
1c470 6c 75 6d 6e 5f 62 79 74 65 73 28 70 53 74 6d 74  lumn_bytes(pStmt
1c480 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 69 53  , 0);.    if( iS
1c490 74 61 72 74 2b 6e 43 6f 6d 70 6c 65 74 69 6f 6e  tart+nCompletion
1c4a0 20 3c 20 73 69 7a 65 6f 66 28 7a 42 75 66 29 2d   < sizeof(zBuf)-
1c4b0 31 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70  1 ){.      memcp
1c4c0 79 28 7a 42 75 66 2b 69 53 74 61 72 74 2c 20 7a  y(zBuf+iStart, z
1c4d0 43 6f 6d 70 6c 65 74 69 6f 6e 2c 20 6e 43 6f 6d  Completion, nCom
1c4e0 70 6c 65 74 69 6f 6e 2b 31 29 3b 0a 20 20 20 20  pletion+1);.    
1c4f0 20 20 6c 69 6e 65 6e 6f 69 73 65 41 64 64 43 6f    linenoiseAddCo
1c500 6d 70 6c 65 74 69 6f 6e 28 6c 63 2c 20 7a 42 75  mpletion(lc, zBu
1c510 66 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  f);.    }.  }.  
1c520 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
1c530 28 70 53 74 6d 74 29 3b 0a 7d 0a 23 65 6e 64 69  (pStmt);.}.#endi
1c540 66 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 43 2d 6c 61  f../*.** Do C-la
1c550 6e 67 75 61 67 65 20 73 74 79 6c 65 20 64 65 71  nguage style deq
1c560 75 6f 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20  uoting..**.**   
1c570 20 5c 61 20 20 20 20 2d 3e 20 61 6c 61 72 6d 0a   \a    -> alarm.
1c580 2a 2a 20 20 20 20 5c 62 20 20 20 20 2d 3e 20 62  **    \b    -> b
1c590 61 63 6b 73 70 61 63 65 0a 2a 2a 20 20 20 20 5c  ackspace.**    \
1c5a0 74 20 20 20 20 2d 3e 20 74 61 62 0a 2a 2a 20 20  t    -> tab.**  
1c5b0 20 20 5c 6e 20 20 20 20 2d 3e 20 6e 65 77 6c 69    \n    -> newli
1c5c0 6e 65 0a 2a 2a 20 20 20 20 5c 76 20 20 20 20 2d  ne.**    \v    -
1c5d0 3e 20 76 65 72 74 69 63 61 6c 20 74 61 62 0a 2a  > vertical tab.*
1c5e0 2a 20 20 20 20 5c 66 20 20 20 20 2d 3e 20 66 6f  *    \f    -> fo
1c5f0 72 6d 20 66 65 65 64 0a 2a 2a 20 20 20 20 5c 72  rm feed.**    \r
1c600 20 20 20 20 2d 3e 20 63 61 72 72 69 61 67 65 20      -> carriage 
1c610 72 65 74 75 72 6e 0a 2a 2a 20 20 20 20 5c 73 20  return.**    \s 
1c620 20 20 20 2d 3e 20 73 70 61 63 65 0a 2a 2a 20 20     -> space.**  
1c630 20 20 5c 22 20 20 20 20 2d 3e 20 22 0a 2a 2a 20    \"    -> ".** 
1c640 20 20 20 5c 27 20 20 20 20 2d 3e 20 27 0a 2a 2a     \'    -> '.**
1c650 20 20 20 20 5c 5c 20 20 20 20 2d 3e 20 62 61 63      \\    -> bac
1c660 6b 73 6c 61 73 68 0a 2a 2a 20 20 20 20 5c 4e 4e  kslash.**    \NN
1c670 4e 20 20 2d 3e 20 61 73 63 69 69 20 63 68 61 72  N  -> ascii char
1c680 61 63 74 65 72 20 4e 4e 4e 20 69 6e 20 6f 63 74  acter NNN in oct
1c690 61 6c 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  al.*/.static voi
1c6a0 64 20 72 65 73 6f 6c 76 65 5f 62 61 63 6b 73 6c  d resolve_backsl
1c6b0 61 73 68 65 73 28 63 68 61 72 20 2a 7a 29 7b 0a  ashes(char *z){.
1c6c0 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 63 68    int i, j;.  ch
1c6d0 61 72 20 63 3b 0a 20 20 77 68 69 6c 65 28 20 2a  ar c;.  while( *
1c6e0 7a 20 26 26 20 2a 7a 21 3d 27 5c 5c 27 20 29 20  z && *z!='\\' ) 
1c6f0 7a 2b 2b 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d 30  z++;.  for(i=j=0
1c700 3b 20 28 63 20 3d 20 7a 5b 69 5d 29 21 3d 30 3b  ; (c = z[i])!=0;
1c710 20 69 2b 2b 2c 20 6a 2b 2b 29 7b 0a 20 20 20 20   i++, j++){.    
1c720 69 66 28 20 63 3d 3d 27 5c 5c 27 20 26 26 20 7a  if( c=='\\' && z
1c730 5b 69 2b 31 5d 21 3d 30 20 29 7b 0a 20 20 20 20  [i+1]!=0 ){.    
1c740 20 20 63 20 3d 20 7a 5b 2b 2b 69 5d 3b 0a 20 20    c = z[++i];.  
1c750 20 20 20 20 69 66 28 20 63 3d 3d 27 61 27 20 29      if( c=='a' )
1c760 7b 0a 20 20 20 20 20 20 20 20 63 20 3d 20 27 5c  {.        c = '\
1c770 61 27 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  a';.      }else 
1c780 69 66 28 20 63 3d 3d 27 62 27 20 29 7b 0a 20 20  if( c=='b' ){.  
1c790 20 20 20 20 20 20 63 20 3d 20 27 5c 62 27 3b 0a        c = '\b';.
1c7a0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
1c7b0 63 3d 3d 27 74 27 20 29 7b 0a 20 20 20 20 20 20  c=='t' ){.      
1c7c0 20 20 63 20 3d 20 27 5c 74 27 3b 0a 20 20 20 20    c = '\t';.    
1c7d0 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27    }else if( c=='
1c7e0 6e 27 20 29 7b 0a 20 20 20 20 20 20 20 20 63 20  n' ){.        c 
1c7f0 3d 20 27 5c 6e 27 3b 0a 20 20 20 20 20 20 7d 65  = '\n';.      }e
1c800 6c 73 65 20 69 66 28 20 63 3d 3d 27 76 27 20 29  lse if( c=='v' )
1c810 7b 0a 20 20 20 20 20 20 20 20 63 20 3d 20 27 5c  {.        c = '\
1c820 76 27 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  v';.      }else 
1c830 69 66 28 20 63 3d 3d 27 66 27 20 29 7b 0a 20 20  if( c=='f' ){.  
1c840 20 20 20 20 20 20 63 20 3d 20 27 5c 66 27 3b 0a        c = '\f';.
1c850 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
1c860 63 3d 3d 27 72 27 20 29 7b 0a 20 20 20 20 20 20  c=='r' ){.      
1c870 20 20 63 20 3d 20 27 5c 72 27 3b 0a 20 20 20 20    c = '\r';.    
1c880 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27    }else if( c=='
1c890 22 27 20 29 7b 0a 20 20 20 20 20 20 20 20 63 20  "' ){.        c 
1c8a0 3d 20 27 22 27 3b 0a 20 20 20 20 20 20 7d 65 6c  = '"';.      }el
1c8b0 73 65 20 69 66 28 20 63 3d 3d 27 5c 27 27 20 29  se if( c=='\'' )
1c8c0 7b 0a 20 20 20 20 20 20 20 20 63 20 3d 20 27 5c  {.        c = '\
1c8d0 27 27 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  '';.      }else 
1c8e0 69 66 28 20 63 3d 3d 27 5c 5c 27 20 29 7b 0a 20  if( c=='\\' ){. 
1c8f0 20 20 20 20 20 20 20 63 20 3d 20 27 5c 5c 27 3b         c = '\\';
1c900 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
1c910 20 63 3e 3d 27 30 27 20 26 26 20 63 3c 3d 27 37   c>='0' && c<='7
1c920 27 20 29 7b 0a 20 20 20 20 20 20 20 20 63 20 2d  ' ){.        c -
1c930 3d 20 27 30 27 3b 0a 20 20 20 20 20 20 20 20 69  = '0';.        i
1c940 66 28 20 7a 5b 69 2b 31 5d 3e 3d 27 30 27 20 26  f( z[i+1]>='0' &
1c950 26 20 7a 5b 69 2b 31 5d 3c 3d 27 37 27 20 29 7b  & z[i+1]<='7' ){
1c960 0a 20 20 20 20 20 20 20 20 20 20 69 2b 2b 3b 0a  .          i++;.
1c970 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 28 63            c = (c
1c980 3c 3c 33 29 20 2b 20 7a 5b 69 5d 20 2d 20 27 30  <<3) + z[i] - '0
1c990 27 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ';.          if(
1c9a0 20 7a 5b 69 2b 31 5d 3e 3d 27 30 27 20 26 26 20   z[i+1]>='0' && 
1c9b0 7a 5b 69 2b 31 5d 3c 3d 27 37 27 20 29 7b 0a 20  z[i+1]<='7' ){. 
1c9c0 20 20 20 20 20 20 20 20 20 20 20 69 2b 2b 3b 0a             i++;.
1c9d0 20 20 20 20 20 20 20 20 20 20 20 20 63 20 3d 20              c = 
1c9e0 28 63 3c 3c 33 29 20 2b 20 7a 5b 69 5d 20 2d 20  (c<<3) + z[i] - 
1c9f0 27 30 27 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  '0';.          }
1ca00 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1ca10 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 7a 5b 6a   }.    }.    z[j
1ca20 5d 20 3d 20 63 3b 0a 20 20 7d 0a 20 20 69 66 28  ] = c;.  }.  if(
1ca30 20 6a 3c 69 20 29 20 7a 5b 6a 5d 20 3d 20 30 3b   j<i ) z[j] = 0;
1ca40 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72 70  .}../*.** Interp
1ca50 72 65 74 20 7a 41 72 67 20 61 73 20 65 69 74 68  ret zArg as eith
1ca60 65 72 20 61 6e 20 69 6e 74 65 67 65 72 20 6f 72  er an integer or
1ca70 20 61 20 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65   a boolean value
1ca80 2e 20 20 52 65 74 75 72 6e 20 31 20 6f 72 20 30  .  Return 1 or 0
1ca90 0a 2a 2a 20 66 6f 72 20 54 52 55 45 20 61 6e 64  .** for TRUE and
1caa0 20 46 41 4c 53 45 2e 20 20 52 65 74 75 72 6e 20   FALSE.  Return 
1cab0 74 68 65 20 69 6e 74 65 67 65 72 20 76 61 6c 75  the integer valu
1cac0 65 20 69 66 20 61 70 70 72 6f 70 72 69 61 74 65  e if appropriate
1cad0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1cae0 62 6f 6f 6c 65 61 6e 56 61 6c 75 65 28 63 6f 6e  booleanValue(con
1caf0 73 74 20 63 68 61 72 20 2a 7a 41 72 67 29 7b 0a  st char *zArg){.
1cb00 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 7a    int i;.  if( z
1cb10 41 72 67 5b 30 5d 3d 3d 27 30 27 20 26 26 20 7a  Arg[0]=='0' && z
1cb20 41 72 67 5b 31 5d 3d 3d 27 78 27 20 29 7b 0a 20  Arg[1]=='x' ){. 
1cb30 20 20 20 66 6f 72 28 69 3d 32 3b 20 68 65 78 44     for(i=2; hexD
1cb40 69 67 69 74 56 61 6c 75 65 28 7a 41 72 67 5b 69  igitValue(zArg[i
1cb50 5d 29 3e 3d 30 3b 20 69 2b 2b 29 7b 7d 0a 20 20  ])>=0; i++){}.  
1cb60 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28 69  }else{.    for(i
1cb70 3d 30 3b 20 7a 41 72 67 5b 69 5d 3e 3d 27 30 27  =0; zArg[i]>='0'
1cb80 20 26 26 20 7a 41 72 67 5b 69 5d 3c 3d 27 39 27   && zArg[i]<='9'
1cb90 3b 20 69 2b 2b 29 7b 7d 0a 20 20 7d 0a 20 20 69  ; i++){}.  }.  i
1cba0 66 28 20 69 3e 30 20 26 26 20 7a 41 72 67 5b 69  f( i>0 && zArg[i
1cbb0 5d 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 28 69  ]==0 ) return (i
1cbc0 6e 74 29 28 69 6e 74 65 67 65 72 56 61 6c 75 65  nt)(integerValue
1cbd0 28 7a 41 72 67 29 20 26 20 30 78 66 66 66 66 66  (zArg) & 0xfffff
1cbe0 66 66 66 29 3b 0a 20 20 69 66 28 20 73 71 6c 69  fff);.  if( sqli
1cbf0 74 65 33 5f 73 74 72 69 63 6d 70 28 7a 41 72 67  te3_stricmp(zArg
1cc00 2c 20 22 6f 6e 22 29 3d 3d 30 20 7c 7c 20 73 71  , "on")==0 || sq
1cc10 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28 7a 41  lite3_stricmp(zA
1cc20 72 67 2c 22 79 65 73 22 29 3d 3d 30 20 29 7b 0a  rg,"yes")==0 ){.
1cc30 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
1cc40 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f  }.  if( sqlite3_
1cc50 73 74 72 69 63 6d 70 28 7a 41 72 67 2c 20 22 6f  stricmp(zArg, "o
1cc60 66 66 22 29 3d 3d 30 20 7c 7c 20 73 71 6c 69 74  ff")==0 || sqlit
1cc70 65 33 5f 73 74 72 69 63 6d 70 28 7a 41 72 67 2c  e3_stricmp(zArg,
1cc80 22 6e 6f 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  "no")==0 ){.    
1cc90 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
1cca0 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65  utf8_printf(stde
1ccb0 72 72 2c 20 22 45 52 52 4f 52 3a 20 4e 6f 74 20  rr, "ERROR: Not 
1ccc0 61 20 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65 3a  a boolean value:
1ccd0 20 5c 22 25 73 5c 22 2e 20 41 73 73 75 6d 69 6e   \"%s\". Assumin
1cce0 67 20 5c 22 6e 6f 5c 22 2e 5c 6e 22 2c 0a 20 20  g \"no\".\n",.  
1ccf0 20 20 20 20 20 20 20 20 7a 41 72 67 29 3b 0a 20          zArg);. 
1cd00 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
1cd10 0a 2a 2a 20 53 65 74 20 6f 72 20 63 6c 65 61 72  .** Set or clear
1cd20 20 61 20 73 68 65 6c 6c 20 66 6c 61 67 20 61 63   a shell flag ac
1cd30 63 6f 72 64 69 6e 67 20 74 6f 20 61 20 62 6f 6f  cording to a boo
1cd40 6c 65 61 6e 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73  lean value..*/.s
1cd50 74 61 74 69 63 20 76 6f 69 64 20 73 65 74 4f 72  tatic void setOr
1cd60 43 6c 65 61 72 46 6c 61 67 28 53 68 65 6c 6c 53  ClearFlag(ShellS
1cd70 74 61 74 65 20 2a 70 2c 20 75 6e 73 69 67 6e 65  tate *p, unsigne
1cd80 64 20 6d 46 6c 61 67 2c 20 63 6f 6e 73 74 20 63  d mFlag, const c
1cd90 68 61 72 20 2a 7a 41 72 67 29 7b 0a 20 20 69 66  har *zArg){.  if
1cda0 28 20 62 6f 6f 6c 65 61 6e 56 61 6c 75 65 28 7a  ( booleanValue(z
1cdb0 41 72 67 29 20 29 7b 0a 20 20 20 20 53 68 65 6c  Arg) ){.    Shel
1cdc0 6c 53 65 74 46 6c 61 67 28 70 2c 20 6d 46 6c 61  lSetFlag(p, mFla
1cdd0 67 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  g);.  }else{.   
1cde0 20 53 68 65 6c 6c 43 6c 65 61 72 46 6c 61 67 28   ShellClearFlag(
1cdf0 70 2c 20 6d 46 6c 61 67 29 3b 0a 20 20 7d 0a 7d  p, mFlag);.  }.}
1ce00 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e  ../*.** Close an
1ce10 20 6f 75 74 70 75 74 20 66 69 6c 65 2c 20 61 73   output file, as
1ce20 73 75 6d 69 6e 67 20 69 74 20 69 73 20 6e 6f 74  suming it is not
1ce30 20 73 74 64 65 72 72 20 6f 72 20 73 74 64 6f 75   stderr or stdou
1ce40 74 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  t.*/.static void
1ce50 20 6f 75 74 70 75 74 5f 66 69 6c 65 5f 63 6c 6f   output_file_clo
1ce60 73 65 28 46 49 4c 45 20 2a 66 29 7b 0a 20 20 69  se(FILE *f){.  i
1ce70 66 28 20 66 20 26 26 20 66 21 3d 73 74 64 6f 75  f( f && f!=stdou
1ce80 74 20 26 26 20 66 21 3d 73 74 64 65 72 72 20 29  t && f!=stderr )
1ce90 20 66 63 6c 6f 73 65 28 66 29 3b 0a 7d 0a 0a 2f   fclose(f);.}../
1cea0 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 6f 70 65 6e  *.** Try to open
1ceb0 20 61 6e 20 6f 75 74 70 75 74 20 66 69 6c 65 2e   an output file.
1cec0 20 20 20 54 68 65 20 6e 61 6d 65 73 20 22 73 74     The names "st
1ced0 64 6f 75 74 22 20 61 6e 64 20 22 73 74 64 65 72  dout" and "stder
1cee0 72 22 20 61 72 65 0a 2a 2a 20 72 65 63 6f 67 6e  r" are.** recogn
1cef0 69 7a 65 64 20 61 6e 64 20 64 6f 20 74 68 65 20  ized and do the 
1cf00 72 69 67 68 74 20 74 68 69 6e 67 2e 20 20 4e 55  right thing.  NU
1cf10 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  LL is returned i
1cf20 66 20 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a 20  f the output.** 
1cf30 66 69 6c 65 6e 61 6d 65 20 69 73 20 22 6f 66 66  filename is "off
1cf40 22 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 46 49 4c  "..*/.static FIL
1cf50 45 20 2a 6f 75 74 70 75 74 5f 66 69 6c 65 5f 6f  E *output_file_o
1cf60 70 65 6e 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  pen(const char *
1cf70 7a 46 69 6c 65 2c 20 69 6e 74 20 62 54 65 78 74  zFile, int bText
1cf80 4d 6f 64 65 29 7b 0a 20 20 46 49 4c 45 20 2a 66  Mode){.  FILE *f
1cf90 3b 0a 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a  ;.  if( strcmp(z
1cfa0 46 69 6c 65 2c 22 73 74 64 6f 75 74 22 29 3d 3d  File,"stdout")==
1cfb0 30 20 29 7b 0a 20 20 20 20 66 20 3d 20 73 74 64  0 ){.    f = std
1cfc0 6f 75 74 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  out;.  }else if(
1cfd0 20 73 74 72 63 6d 70 28 7a 46 69 6c 65 2c 20 22   strcmp(zFile, "
1cfe0 73 74 64 65 72 72 22 29 3d 3d 30 20 29 7b 0a 20  stderr")==0 ){. 
1cff0 20 20 20 66 20 3d 20 73 74 64 65 72 72 3b 0a 20     f = stderr;. 
1d000 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d   }else if( strcm
1d010 70 28 7a 46 69 6c 65 2c 20 22 6f 66 66 22 29 3d  p(zFile, "off")=
1d020 3d 30 20 29 7b 0a 20 20 20 20 66 20 3d 20 30 3b  =0 ){.    f = 0;
1d030 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 20  .  }else{.    f 
1d040 3d 20 66 6f 70 65 6e 28 7a 46 69 6c 65 2c 20 62  = fopen(zFile, b
1d050 54 65 78 74 4d 6f 64 65 20 3f 20 22 77 22 20 3a  TextMode ? "w" :
1d060 20 22 77 62 22 29 3b 0a 20 20 20 20 69 66 28 20   "wb");.    if( 
1d070 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 75 74  f==0 ){.      ut
1d080 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  f8_printf(stderr
1d090 2c 20 22 45 72 72 6f 72 3a 20 63 61 6e 6e 6f 74  , "Error: cannot
1d0a0 20 6f 70 65 6e 20 5c 22 25 73 5c 22 5c 6e 22 2c   open \"%s\"\n",
1d0b0 20 7a 46 69 6c 65 29 3b 0a 20 20 20 20 7d 0a 20   zFile);.    }. 
1d0c0 20 7d 0a 20 20 72 65 74 75 72 6e 20 66 3b 0a 7d   }.  return f;.}
1d0d0 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ..#if !defined(S
1d0e0 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45  QLITE_OMIT_TRACE
1d0f0 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51  ) && !defined(SQ
1d100 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49  LITE_OMIT_FLOATI
1d110 4e 47 5f 50 4f 49 4e 54 29 0a 2f 2a 0a 2a 2a 20  NG_POINT)./*.** 
1d120 41 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 68 61  A routine for ha
1d130 6e 64 6c 69 6e 67 20 6f 75 74 70 75 74 20 66 72  ndling output fr
1d140 6f 6d 20 73 71 6c 69 74 65 33 5f 74 72 61 63 65  om sqlite3_trace
1d150 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ()..*/.static in
1d160 74 20 73 71 6c 5f 74 72 61 63 65 5f 63 61 6c 6c  t sql_trace_call
1d170 62 61 63 6b 28 0a 20 20 75 6e 73 69 67 6e 65 64  back(.  unsigned
1d180 20 6d 54 79 70 65 2c 0a 20 20 76 6f 69 64 20 2a   mType,.  void *
1d190 70 41 72 67 2c 0a 20 20 76 6f 69 64 20 2a 70 50  pArg,.  void *pP
1d1a0 2c 0a 20 20 76 6f 69 64 20 2a 70 58 0a 29 7b 0a  ,.  void *pX.){.
1d1b0 20 20 46 49 4c 45 20 2a 66 20 3d 20 28 46 49 4c    FILE *f = (FIL
1d1c0 45 2a 29 70 41 72 67 3b 0a 20 20 55 4e 55 53 45  E*)pArg;.  UNUSE
1d1d0 44 5f 50 41 52 41 4d 45 54 45 52 28 6d 54 79 70  D_PARAMETER(mTyp
1d1e0 65 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  e);.  UNUSED_PAR
1d1f0 41 4d 45 54 45 52 28 70 50 29 3b 0a 20 20 69 66  AMETER(pP);.  if
1d200 28 20 66 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74  ( f ){.    const
1d210 20 63 68 61 72 20 2a 7a 20 3d 20 28 63 6f 6e 73   char *z = (cons
1d220 74 20 63 68 61 72 2a 29 70 58 3b 0a 20 20 20 20  t char*)pX;.    
1d230 69 6e 74 20 69 20 3d 20 73 74 72 6c 65 6e 33 30  int i = strlen30
1d240 28 7a 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  (z);.    while( 
1d250 69 3e 30 20 26 26 20 7a 5b 69 2d 31 5d 3d 3d 27  i>0 && z[i-1]=='
1d260 3b 27 20 29 7b 20 69 2d 2d 3b 20 7d 0a 20 20 20  ;' ){ i--; }.   
1d270 20 75 74 66 38 5f 70 72 69 6e 74 66 28 66 2c 20   utf8_printf(f, 
1d280 22 25 2e 2a 73 3b 5c 6e 22 2c 20 69 2c 20 7a 29  "%.*s;\n", i, z)
1d290 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
1d2a0 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
1d2b0 2a 20 41 20 6e 6f 2d 6f 70 20 72 6f 75 74 69 6e  * A no-op routin
1d2c0 65 20 74 68 61 74 20 72 75 6e 73 20 77 69 74 68  e that runs with
1d2d0 20 74 68 65 20 22 2e 62 72 65 61 6b 70 6f 69 6e   the ".breakpoin
1d2e0 74 22 20 64 6f 63 2d 63 6f 6d 6d 61 6e 64 2e 20  t" doc-command. 
1d2f0 20 54 68 69 73 20 69 73 0a 2a 2a 20 61 20 75 73   This is.** a us
1d300 65 66 75 6c 20 73 70 6f 74 20 74 6f 20 73 65 74  eful spot to set
1d310 20 61 20 64 65 62 75 67 67 65 72 20 62 72 65 61   a debugger brea
1d320 6b 70 6f 69 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69  kpoint..*/.stati
1d330 63 20 76 6f 69 64 20 74 65 73 74 5f 62 72 65 61  c void test_brea
1d340 6b 70 6f 69 6e 74 28 76 6f 69 64 29 7b 0a 20 20  kpoint(void){.  
1d350 73 74 61 74 69 63 20 69 6e 74 20 6e 43 61 6c 6c  static int nCall
1d360 20 3d 20 30 3b 0a 20 20 6e 43 61 6c 6c 2b 2b 3b   = 0;.  nCall++;
1d370 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 6f 62 6a  .}../*.** An obj
1d380 65 63 74 20 75 73 65 64 20 74 6f 20 72 65 61 64  ect used to read
1d390 20 61 20 43 53 56 20 61 6e 64 20 6f 74 68 65 72   a CSV and other
1d3a0 20 66 69 6c 65 73 20 66 6f 72 20 69 6d 70 6f 72   files for impor
1d3b0 74 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  t..*/.typedef st
1d3c0 72 75 63 74 20 49 6d 70 6f 72 74 43 74 78 20 49  ruct ImportCtx I
1d3d0 6d 70 6f 72 74 43 74 78 3b 0a 73 74 72 75 63 74  mportCtx;.struct
1d3e0 20 49 6d 70 6f 72 74 43 74 78 20 7b 0a 20 20 63   ImportCtx {.  c
1d3f0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
1d400 3b 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68  ;  /* Name of th
1d410 65 20 69 6e 70 75 74 20 66 69 6c 65 20 2a 2f 0a  e input file */.
1d420 20 20 46 49 4c 45 20 2a 69 6e 3b 20 20 20 20 20    FILE *in;     
1d430 20 20 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68        /* Read th
1d440 65 20 43 53 56 20 74 65 78 74 20 66 72 6f 6d 20  e CSV text from 
1d450 74 68 69 73 20 69 6e 70 75 74 20 73 74 72 65 61  this input strea
1d460 6d 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 3b 20  m */.  char *z; 
1d470 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 63             /* Ac
1d480 63 75 6d 75 6c 61 74 65 64 20 74 65 78 74 20 66  cumulated text f
1d490 6f 72 20 61 20 66 69 65 6c 64 20 2a 2f 0a 20 20  or a field */.  
1d4a0 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20  int n;          
1d4b0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1d4c0 20 62 79 74 65 73 20 69 6e 20 7a 20 2a 2f 0a 20   bytes in z */. 
1d4d0 20 69 6e 74 20 6e 41 6c 6c 6f 63 3b 20 20 20 20   int nAlloc;    
1d4e0 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20 61 6c       /* Space al
1d4f0 6c 6f 63 61 74 65 64 20 66 6f 72 20 7a 5b 5d 20  located for z[] 
1d500 2a 2f 0a 20 20 69 6e 74 20 6e 4c 69 6e 65 3b 20  */.  int nLine; 
1d510 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72           /* Curr
1d520 65 6e 74 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20  ent line number 
1d530 2a 2f 0a 20 20 69 6e 74 20 62 4e 6f 74 46 69 72  */.  int bNotFir
1d540 73 74 3b 20 20 20 20 20 20 2f 2a 20 54 72 75 65  st;      /* True
1d550 20 69 66 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20   if one or more 
1d560 62 79 74 65 73 20 61 6c 72 65 61 64 79 20 72 65  bytes already re
1d570 61 64 20 2a 2f 0a 20 20 69 6e 74 20 63 54 65 72  ad */.  int cTer
1d580 6d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43  m;          /* C
1d590 68 61 72 61 63 74 65 72 20 74 68 61 74 20 74 65  haracter that te
1d5a0 72 6d 69 6e 61 74 65 64 20 74 68 65 20 6d 6f 73  rminated the mos
1d5b0 74 20 72 65 63 65 6e 74 20 66 69 65 6c 64 20 2a  t recent field *
1d5c0 2f 0a 20 20 69 6e 74 20 63 43 6f 6c 53 65 70 3b  /.  int cColSep;
1d5d0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63          /* The c
1d5e0 6f 6c 75 6d 6e 20 73 65 70 61 72 61 74 6f 72 20  olumn separator 
1d5f0 63 68 61 72 61 63 74 65 72 2e 20 20 28 55 73 75  character.  (Usu
1d600 61 6c 6c 79 20 22 2c 22 29 20 2a 2f 0a 20 20 69  ally ",") */.  i
1d610 6e 74 20 63 52 6f 77 53 65 70 3b 20 20 20 20 20  nt cRowSep;     
1d620 20 20 20 2f 2a 20 54 68 65 20 72 6f 77 20 73 65     /* The row se
1d630 70 61 72 61 74 6f 72 20 63 68 61 72 61 63 74 65  parator characte
1d640 72 2e 20 20 28 55 73 75 61 6c 6c 79 20 22 5c 6e  r.  (Usually "\n
1d650 22 29 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 41 70 70  ") */.};../* App
1d660 65 6e 64 20 61 20 73 69 6e 67 6c 65 20 62 79 74  end a single byt
1d670 65 20 74 6f 20 7a 5b 5d 20 2a 2f 0a 73 74 61 74  e to z[] */.stat
1d680 69 63 20 76 6f 69 64 20 69 6d 70 6f 72 74 5f 61  ic void import_a
1d690 70 70 65 6e 64 5f 63 68 61 72 28 49 6d 70 6f 72  ppend_char(Impor
1d6a0 74 43 74 78 20 2a 70 2c 20 69 6e 74 20 63 29 7b  tCtx *p, int c){
1d6b0 0a 20 20 69 66 28 20 70 2d 3e 6e 2b 31 3e 3d 70  .  if( p->n+1>=p
1d6c0 2d 3e 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20  ->nAlloc ){.    
1d6d0 70 2d 3e 6e 41 6c 6c 6f 63 20 2b 3d 20 70 2d 3e  p->nAlloc += p->
1d6e0 6e 41 6c 6c 6f 63 20 2b 20 31 30 30 3b 0a 20 20  nAlloc + 100;.  
1d6f0 20 20 70 2d 3e 7a 20 3d 20 73 71 6c 69 74 65 33    p->z = sqlite3
1d700 5f 72 65 61 6c 6c 6f 63 36 34 28 70 2d 3e 7a 2c  _realloc64(p->z,
1d710 20 70 2d 3e 6e 41 6c 6c 6f 63 29 3b 0a 20 20 20   p->nAlloc);.   
1d720 20 69 66 28 20 70 2d 3e 7a 3d 3d 30 20 29 20 73   if( p->z==0 ) s
1d730 68 65 6c 6c 5f 6f 75 74 5f 6f 66 5f 6d 65 6d 6f  hell_out_of_memo
1d740 72 79 28 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 7a  ry();.  }.  p->z
1d750 5b 70 2d 3e 6e 2b 2b 5d 20 3d 20 28 63 68 61 72  [p->n++] = (char
1d760 29 63 3b 0a 7d 0a 0a 2f 2a 20 52 65 61 64 20 61  )c;.}../* Read a
1d770 20 73 69 6e 67 6c 65 20 66 69 65 6c 64 20 6f 66   single field of
1d780 20 43 53 56 20 74 65 78 74 2e 20 20 43 6f 6d 70   CSV text.  Comp
1d790 61 74 69 62 6c 65 20 77 69 74 68 20 72 66 63 34  atible with rfc4
1d7a0 31 38 30 20 61 6e 64 20 65 78 74 65 6e 64 65 64  180 and extended
1d7b0 0a 2a 2a 20 77 69 74 68 20 74 68 65 20 6f 70 74  .** with the opt
1d7c0 69 6f 6e 20 6f 66 20 68 61 76 69 6e 67 20 61 20  ion of having a 
1d7d0 73 65 70 61 72 61 74 6f 72 20 6f 74 68 65 72 20  separator other 
1d7e0 74 68 61 6e 20 22 2c 22 2e 0a 2a 2a 0a 2a 2a 20  than ","..**.** 
1d7f0 20 20 2b 20 20 49 6e 70 75 74 20 63 6f 6d 65 73    +  Input comes
1d800 20 66 72 6f 6d 20 70 2d 3e 69 6e 2e 0a 2a 2a 20   from p->in..** 
1d810 20 20 2b 20 20 53 74 6f 72 65 20 72 65 73 75 6c    +  Store resul
1d820 74 73 20 69 6e 20 70 2d 3e 7a 20 6f 66 20 6c 65  ts in p->z of le
1d830 6e 67 74 68 20 70 2d 3e 6e 2e 20 20 53 70 61 63  ngth p->n.  Spac
1d840 65 20 74 6f 20 68 6f 6c 64 20 70 2d 3e 7a 20 63  e to hold p->z c
1d850 6f 6d 65 73 0a 2a 2a 20 20 20 20 20 20 66 72 6f  omes.**      fro
1d860 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  m sqlite3_malloc
1d870 36 34 28 29 2e 0a 2a 2a 20 20 20 2b 20 20 55 73  64()..**   +  Us
1d880 65 20 70 2d 3e 63 53 65 70 20 61 73 20 74 68 65  e p->cSep as the
1d890 20 63 6f 6c 75 6d 6e 20 73 65 70 61 72 61 74 6f   column separato
1d8a0 72 2e 20 20 54 68 65 20 64 65 66 61 75 6c 74 20  r.  The default 
1d8b0 69 73 20 22 2c 22 2e 0a 2a 2a 20 20 20 2b 20 20  is ","..**   +  
1d8c0 55 73 65 20 70 2d 3e 72 53 65 70 20 61 73 20 74  Use p->rSep as t
1d8d0 68 65 20 72 6f 77 20 73 65 70 61 72 61 74 6f 72  he row separator
1d8e0 2e 20 20 54 68 65 20 64 65 66 61 75 6c 74 20 69  .  The default i
1d8f0 73 20 22 5c 6e 22 2e 0a 2a 2a 20 20 20 2b 20 20  s "\n"..**   +  
1d900 4b 65 65 70 20 74 72 61 63 6b 20 6f 66 20 74 68  Keep track of th
1d910 65 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20 69 6e  e line number in
1d920 20 70 2d 3e 6e 4c 69 6e 65 2e 0a 2a 2a 20 20 20   p->nLine..**   
1d930 2b 20 20 53 74 6f 72 65 20 74 68 65 20 63 68 61  +  Store the cha
1d940 72 61 63 74 65 72 20 74 68 61 74 20 74 65 72 6d  racter that term
1d950 69 6e 61 74 65 73 20 74 68 65 20 66 69 65 6c 64  inates the field
1d960 20 69 6e 20 70 2d 3e 63 54 65 72 6d 2e 20 20 53   in p->cTerm.  S
1d970 74 6f 72 65 0a 2a 2a 20 20 20 20 20 20 45 4f 46  tore.**      EOF
1d980 20 6f 6e 20 65 6e 64 2d 6f 66 2d 66 69 6c 65 2e   on end-of-file.
1d990 0a 2a 2a 20 20 20 2b 20 20 52 65 70 6f 72 74 20  .**   +  Report 
1d9a0 73 79 6e 74 61 78 20 65 72 72 6f 72 73 20 6f 6e  syntax errors on
1d9b0 20 73 74 64 65 72 72 0a 2a 2f 0a 73 74 61 74 69   stderr.*/.stati
1d9c0 63 20 63 68 61 72 20 2a 53 51 4c 49 54 45 5f 43  c char *SQLITE_C
1d9d0 44 45 43 4c 20 63 73 76 5f 72 65 61 64 5f 6f 6e  DECL csv_read_on
1d9e0 65 5f 66 69 65 6c 64 28 49 6d 70 6f 72 74 43 74  e_field(ImportCt
1d9f0 78 20 2a 70 29 7b 0a 20 20 69 6e 74 20 63 3b 0a  x *p){.  int c;.
1da00 20 20 69 6e 74 20 63 53 65 70 20 3d 20 70 2d 3e    int cSep = p->
1da10 63 43 6f 6c 53 65 70 3b 0a 20 20 69 6e 74 20 72  cColSep;.  int r
1da20 53 65 70 20 3d 20 70 2d 3e 63 52 6f 77 53 65 70  Sep = p->cRowSep
1da30 3b 0a 20 20 70 2d 3e 6e 20 3d 20 30 3b 0a 20 20  ;.  p->n = 0;.  
1da40 63 20 3d 20 66 67 65 74 63 28 70 2d 3e 69 6e 29  c = fgetc(p->in)
1da50 3b 0a 20 20 69 66 28 20 63 3d 3d 45 4f 46 20 7c  ;.  if( c==EOF |
1da60 7c 20 73 65 65 6e 49 6e 74 65 72 72 75 70 74 20  | seenInterrupt 
1da70 29 7b 0a 20 20 20 20 70 2d 3e 63 54 65 72 6d 20  ){.    p->cTerm 
1da80 3d 20 45 4f 46 3b 0a 20 20 20 20 72 65 74 75 72  = EOF;.    retur
1da90 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 63  n 0;.  }.  if( c
1daa0 3d 3d 27 22 27 20 29 7b 0a 20 20 20 20 69 6e 74  =='"' ){.    int
1dab0 20 70 63 2c 20 70 70 63 3b 0a 20 20 20 20 69 6e   pc, ppc;.    in
1dac0 74 20 73 74 61 72 74 4c 69 6e 65 20 3d 20 70 2d  t startLine = p-
1dad0 3e 6e 4c 69 6e 65 3b 0a 20 20 20 20 69 6e 74 20  >nLine;.    int 
1dae0 63 51 75 6f 74 65 20 3d 20 63 3b 0a 20 20 20 20  cQuote = c;.    
1daf0 70 63 20 3d 20 70 70 63 20 3d 20 30 3b 0a 20 20  pc = ppc = 0;.  
1db00 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20    while( 1 ){.  
1db10 20 20 20 20 63 20 3d 20 66 67 65 74 63 28 70 2d      c = fgetc(p-
1db20 3e 69 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20  >in);.      if( 
1db30 63 3d 3d 72 53 65 70 20 29 20 70 2d 3e 6e 4c 69  c==rSep ) p->nLi
1db40 6e 65 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20  ne++;.      if( 
1db50 63 3d 3d 63 51 75 6f 74 65 20 29 7b 0a 20 20 20  c==cQuote ){.   
1db60 20 20 20 20 20 69 66 28 20 70 63 3d 3d 63 51 75       if( pc==cQu
1db70 6f 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ote ){.         
1db80 20 70 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 20   pc = 0;.       
1db90 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
1dba0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
1dbb0 20 20 20 20 20 69 66 28 20 28 63 3d 3d 63 53 65       if( (c==cSe
1dbc0 70 20 26 26 20 70 63 3d 3d 63 51 75 6f 74 65 29  p && pc==cQuote)
1dbd0 0a 20 20 20 20 20 20 20 7c 7c 20 28 63 3d 3d 72  .       || (c==r
1dbe0 53 65 70 20 26 26 20 70 63 3d 3d 63 51 75 6f 74  Sep && pc==cQuot
1dbf0 65 29 0a 20 20 20 20 20 20 20 7c 7c 20 28 63 3d  e).       || (c=
1dc00 3d 72 53 65 70 20 26 26 20 70 63 3d 3d 27 5c 72  =rSep && pc=='\r
1dc10 27 20 26 26 20 70 70 63 3d 3d 63 51 75 6f 74 65  ' && ppc==cQuote
1dc20 29 0a 20 20 20 20 20 20 20 7c 7c 20 28 63 3d 3d  ).       || (c==
1dc30 45 4f 46 20 26 26 20 70 63 3d 3d 63 51 75 6f 74  EOF && pc==cQuot
1dc40 65 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20  e).      ){.    
1dc50 20 20 20 20 64 6f 7b 20 70 2d 3e 6e 2d 2d 3b 20      do{ p->n--; 
1dc60 7d 77 68 69 6c 65 28 20 70 2d 3e 7a 5b 70 2d 3e  }while( p->z[p->
1dc70 6e 5d 21 3d 63 51 75 6f 74 65 20 29 3b 0a 20 20  n]!=cQuote );.  
1dc80 20 20 20 20 20 20 70 2d 3e 63 54 65 72 6d 20 3d        p->cTerm =
1dc90 20 63 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61   c;.        brea
1dca0 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
1dcb0 20 69 66 28 20 70 63 3d 3d 63 51 75 6f 74 65 20   if( pc==cQuote 
1dcc0 26 26 20 63 21 3d 27 5c 72 27 20 29 7b 0a 20 20  && c!='\r' ){.  
1dcd0 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
1dce0 66 28 73 74 64 65 72 72 2c 20 22 25 73 3a 25 64  f(stderr, "%s:%d
1dcf0 3a 20 75 6e 65 73 63 61 70 65 64 20 25 63 20 63  : unescaped %c c
1dd00 68 61 72 61 63 74 65 72 5c 6e 22 2c 0a 20 20 20  haracter\n",.   
1dd10 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e               p->
1dd20 7a 46 69 6c 65 2c 20 70 2d 3e 6e 4c 69 6e 65 2c  zFile, p->nLine,
1dd30 20 63 51 75 6f 74 65 29 3b 0a 20 20 20 20 20 20   cQuote);.      
1dd40 7d 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d 45  }.      if( c==E
1dd50 4f 46 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74  OF ){.        ut
1dd60 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  f8_printf(stderr
1dd70 2c 20 22 25 73 3a 25 64 3a 20 75 6e 74 65 72 6d  , "%s:%d: unterm
1dd80 69 6e 61 74 65 64 20 25 63 2d 71 75 6f 74 65 64  inated %c-quoted
1dd90 20 66 69 65 6c 64 5c 6e 22 2c 0a 20 20 20 20 20   field\n",.     
1dda0 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 7a 46             p->zF
1ddb0 69 6c 65 2c 20 73 74 61 72 74 4c 69 6e 65 2c 20  ile, startLine, 
1ddc0 63 51 75 6f 74 65 29 3b 0a 20 20 20 20 20 20 20  cQuote);.       
1ddd0 20 70 2d 3e 63 54 65 72 6d 20 3d 20 63 3b 0a 20   p->cTerm = c;. 
1dde0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
1ddf0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 6d 70 6f      }.      impo
1de00 72 74 5f 61 70 70 65 6e 64 5f 63 68 61 72 28 70  rt_append_char(p
1de10 2c 20 63 29 3b 0a 20 20 20 20 20 20 70 70 63 20  , c);.      ppc 
1de20 3d 20 70 63 3b 0a 20 20 20 20 20 20 70 63 20 3d  = pc;.      pc =
1de30 20 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73   c;.    }.  }els
1de40 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69  e{.    /* If thi
1de50 73 20 69 73 20 74 68 65 20 66 69 72 73 74 20 66  s is the first f
1de60 69 65 6c 64 20 62 65 69 6e 67 20 70 61 72 73 65  ield being parse
1de70 64 20 61 6e 64 20 69 74 20 62 65 67 69 6e 73 20  d and it begins 
1de80 77 69 74 68 20 74 68 65 0a 20 20 20 20 2a 2a 20  with the.    ** 
1de90 55 54 46 2d 38 20 42 4f 4d 20 20 28 30 78 45 46  UTF-8 BOM  (0xEF
1dea0 20 42 42 20 42 46 29 20 74 68 65 6e 20 73 6b 69   BB BF) then ski
1deb0 70 20 74 68 65 20 42 4f 4d 20 2a 2f 0a 20 20 20  p the BOM */.   
1dec0 20 69 66 28 20 28 63 26 30 78 66 66 29 3d 3d 30   if( (c&0xff)==0
1ded0 78 65 66 20 26 26 20 70 2d 3e 62 4e 6f 74 46 69  xef && p->bNotFi
1dee0 72 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  rst==0 ){.      
1def0 69 6d 70 6f 72 74 5f 61 70 70 65 6e 64 5f 63 68  import_append_ch
1df00 61 72 28 70 2c 20 63 29 3b 0a 20 20 20 20 20 20  ar(p, c);.      
1df10 63 20 3d 20 66 67 65 74 63 28 70 2d 3e 69 6e 29  c = fgetc(p->in)
1df20 3b 0a 20 20 20 20 20 20 69 66 28 20 28 63 26 30  ;.      if( (c&0
1df30 78 66 66 29 3d 3d 30 78 62 62 20 29 7b 0a 20 20  xff)==0xbb ){.  
1df40 20 20 20 20 20 20 69 6d 70 6f 72 74 5f 61 70 70        import_app
1df50 65 6e 64 5f 63 68 61 72 28 70 2c 20 63 29 3b 0a  end_char(p, c);.
1df60 20 20 20 20 20 20 20 20 63 20 3d 20 66 67 65 74          c = fget
1df70 63 28 70 2d 3e 69 6e 29 3b 0a 20 20 20 20 20 20  c(p->in);.      
1df80 20 20 69 66 28 20 28 63 26 30 78 66 66 29 3d 3d    if( (c&0xff)==
1df90 30 78 62 66 20 29 7b 0a 20 20 20 20 20 20 20 20  0xbf ){.        
1dfa0 20 20 70 2d 3e 62 4e 6f 74 46 69 72 73 74 20 3d    p->bNotFirst =
1dfb0 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d   1;.          p-
1dfc0 3e 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  >n = 0;.        
1dfd0 20 20 72 65 74 75 72 6e 20 63 73 76 5f 72 65 61    return csv_rea
1dfe0 64 5f 6f 6e 65 5f 66 69 65 6c 64 28 70 29 3b 0a  d_one_field(p);.
1dff0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1e000 7d 0a 20 20 20 20 7d 0a 20 20 20 20 77 68 69 6c  }.    }.    whil
1e010 65 28 20 63 21 3d 45 4f 46 20 26 26 20 63 21 3d  e( c!=EOF && c!=
1e020 63 53 65 70 20 26 26 20 63 21 3d 72 53 65 70 20  cSep && c!=rSep 
1e030 29 7b 0a 20 20 20 20 20 20 69 6d 70 6f 72 74 5f  ){.      import_
1e040 61 70 70 65 6e 64 5f 63 68 61 72 28 70 2c 20 63  append_char(p, c
1e050 29 3b 0a 20 20 20 20 20 20 63 20 3d 20 66 67 65  );.      c = fge
1e060 74 63 28 70 2d 3e 69 6e 29 3b 0a 20 20 20 20 7d  tc(p->in);.    }
1e070 0a 20 20 20 20 69 66 28 20 63 3d 3d 72 53 65 70  .    if( c==rSep
1e080 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 4c 69   ){.      p->nLi
1e090 6e 65 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20  ne++;.      if( 
1e0a0 70 2d 3e 6e 3e 30 20 26 26 20 70 2d 3e 7a 5b 70  p->n>0 && p->z[p
1e0b0 2d 3e 6e 2d 31 5d 3d 3d 27 5c 72 27 20 29 20 70  ->n-1]=='\r' ) p
1e0c0 2d 3e 6e 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20  ->n--;.    }.   
1e0d0 20 70 2d 3e 63 54 65 72 6d 20 3d 20 63 3b 0a 20   p->cTerm = c;. 
1e0e0 20 7d 0a 20 20 69 66 28 20 70 2d 3e 7a 20 29 20   }.  if( p->z ) 
1e0f0 70 2d 3e 7a 5b 70 2d 3e 6e 5d 20 3d 20 30 3b 0a  p->z[p->n] = 0;.
1e100 20 20 70 2d 3e 62 4e 6f 74 46 69 72 73 74 20 3d    p->bNotFirst =
1e110 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e   1;.  return p->
1e120 7a 3b 0a 7d 0a 0a 2f 2a 20 52 65 61 64 20 61 20  z;.}../* Read a 
1e130 73 69 6e 67 6c 65 20 66 69 65 6c 64 20 6f 66 20  single field of 
1e140 41 53 43 49 49 20 64 65 6c 69 6d 69 74 65 64 20  ASCII delimited 
1e150 74 65 78 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 2b 20  text..**.**   + 
1e160 20 49 6e 70 75 74 20 63 6f 6d 65 73 20 66 72 6f   Input comes fro
1e170 6d 20 70 2d 3e 69 6e 2e 0a 2a 2a 20 20 20 2b 20  m p->in..**   + 
1e180 20 53 74 6f 72 65 20 72 65 73 75 6c 74 73 20 69   Store results i
1e190 6e 20 70 2d 3e 7a 20 6f 66 20 6c 65 6e 67 74 68  n p->z of length
1e1a0 20 70 2d 3e 6e 2e 20 20 53 70 61 63 65 20 74 6f   p->n.  Space to
1e1b0 20 68 6f 6c 64 20 70 2d 3e 7a 20 63 6f 6d 65 73   hold p->z comes
1e1c0 0a 2a 2a 20 20 20 20 20 20 66 72 6f 6d 20 73 71  .**      from sq
1e1d0 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 29  lite3_malloc64()
1e1e0 2e 0a 2a 2a 20 20 20 2b 20 20 55 73 65 20 70 2d  ..**   +  Use p-
1e1f0 3e 63 53 65 70 20 61 73 20 74 68 65 20 63 6f 6c  >cSep as the col
1e200 75 6d 6e 20 73 65 70 61 72 61 74 6f 72 2e 20 20  umn separator.  
1e210 54 68 65 20 64 65 66 61 75 6c 74 20 69 73 20 22  The default is "
1e220 5c 78 31 46 22 2e 0a 2a 2a 20 20 20 2b 20 20 55  \x1F"..**   +  U
1e230 73 65 20 70 2d 3e 72 53 65 70 20 61 73 20 74 68  se p->rSep as th
1e240 65 20 72 6f 77 20 73 65 70 61 72 61 74 6f 72 2e  e row separator.
1e250 20 20 54 68 65 20 64 65 66 61 75 6c 74 20 69 73    The default is
1e260 20 22 5c 78 31 45 22 2e 0a 2a 2a 20 20 20 2b 20   "\x1E"..**   + 
1e270 20 4b 65 65 70 20 74 72 61 63 6b 20 6f 66 20 74   Keep track of t
1e280 68 65 20 72 6f 77 20 6e 75 6d 62 65 72 20 69 6e  he row number in
1e290 20 70 2d 3e 6e 4c 69 6e 65 2e 0a 2a 2a 20 20 20   p->nLine..**   
1e2a0 2b 20 20 53 74 6f 72 65 20 74 68 65 20 63 68 61  +  Store the cha
1e2b0 72 61 63 74 65 72 20 74 68 61 74 20 74 65 72 6d  racter that term
1e2c0 69 6e 61 74 65 73 20 74 68 65 20 66 69 65 6c 64  inates the field
1e2d0 20 69 6e 20 70 2d 3e 63 54 65 72 6d 2e 20 20 53   in p->cTerm.  S
1e2e0 74 6f 72 65 0a 2a 2a 20 20 20 20 20 20 45 4f 46  tore.**      EOF
1e2f0 20 6f 6e 20 65 6e 64 2d 6f 66 2d 66 69 6c 65 2e   on end-of-file.
1e300 0a 2a 2a 20 20 20 2b 20 20 52 65 70 6f 72 74 20  .**   +  Report 
1e310 73 79 6e 74 61 78 20 65 72 72 6f 72 73 20 6f 6e  syntax errors on
1e320 20 73 74 64 65 72 72 0a 2a 2f 0a 73 74 61 74 69   stderr.*/.stati
1e330 63 20 63 68 61 72 20 2a 53 51 4c 49 54 45 5f 43  c char *SQLITE_C
1e340 44 45 43 4c 20 61 73 63 69 69 5f 72 65 61 64 5f  DECL ascii_read_
1e350 6f 6e 65 5f 66 69 65 6c 64 28 49 6d 70 6f 72 74  one_field(Import
1e360 43 74 78 20 2a 70 29 7b 0a 20 20 69 6e 74 20 63  Ctx *p){.  int c
1e370 3b 0a 20 20 69 6e 74 20 63 53 65 70 20 3d 20 70  ;.  int cSep = p
1e380 2d 3e 63 43 6f 6c 53 65 70 3b 0a 20 20 69 6e 74  ->cColSep;.  int
1e390 20 72 53 65 70 20 3d 20 70 2d 3e 63 52 6f 77 53   rSep = p->cRowS
1e3a0 65 70 3b 0a 20 20 70 2d 3e 6e 20 3d 20 30 3b 0a  ep;.  p->n = 0;.
1e3b0 20 20 63 20 3d 20 66 67 65 74 63 28 70 2d 3e 69    c = fgetc(p->i
1e3c0 6e 29 3b 0a 20 20 69 66 28 20 63 3d 3d 45 4f 46  n);.  if( c==EOF
1e3d0 20 7c 7c 20 73 65 65 6e 49 6e 74 65 72 72 75 70   || seenInterrup
1e3e0 74 20 29 7b 0a 20 20 20 20 70 2d 3e 63 54 65 72  t ){.    p->cTer
1e3f0 6d 20 3d 20 45 4f 46 3b 0a 20 20 20 20 72 65 74  m = EOF;.    ret
1e400 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 77 68 69  urn 0;.  }.  whi
1e410 6c 65 28 20 63 21 3d 45 4f 46 20 26 26 20 63 21  le( c!=EOF && c!
1e420 3d 63 53 65 70 20 26 26 20 63 21 3d 72 53 65 70  =cSep && c!=rSep
1e430 20 29 7b 0a 20 20 20 20 69 6d 70 6f 72 74 5f 61   ){.    import_a
1e440 70 70 65 6e 64 5f 63 68 61 72 28 70 2c 20 63 29  ppend_char(p, c)
1e450 3b 0a 20 20 20 20 63 20 3d 20 66 67 65 74 63 28  ;.    c = fgetc(
1e460 70 2d 3e 69 6e 29 3b 0a 20 20 7d 0a 20 20 69 66  p->in);.  }.  if
1e470 28 20 63 3d 3d 72 53 65 70 20 29 7b 0a 20 20 20  ( c==rSep ){.   
1e480 20 70 2d 3e 6e 4c 69 6e 65 2b 2b 3b 0a 20 20 7d   p->nLine++;.  }
1e490 0a 20 20 70 2d 3e 63 54 65 72 6d 20 3d 20 63 3b  .  p->cTerm = c;
1e4a0 0a 20 20 69 66 28 20 70 2d 3e 7a 20 29 20 70 2d  .  if( p->z ) p-
1e4b0 3e 7a 5b 70 2d 3e 6e 5d 20 3d 20 30 3b 0a 20 20  >z[p->n] = 0;.  
1e4c0 72 65 74 75 72 6e 20 70 2d 3e 7a 3b 0a 7d 0a 0a  return p->z;.}..
1e4d0 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 74 72 61  /*.** Try to tra
1e4e0 6e 73 66 65 72 20 64 61 74 61 20 66 6f 72 20 74  nsfer data for t
1e4f0 61 62 6c 65 20 7a 54 61 62 6c 65 2e 20 20 49 66  able zTable.  If
1e500 20 61 6e 20 65 72 72 6f 72 20 69 73 20 73 65 65   an error is see
1e510 6e 20 77 68 69 6c 65 0a 2a 2a 20 6d 6f 76 69 6e  n while.** movin
1e520 67 20 66 6f 72 77 61 72 64 2c 20 74 72 79 20 74  g forward, try t
1e530 6f 20 67 6f 20 62 61 63 6b 77 61 72 64 73 2e 20  o go backwards. 
1e540 20 54 68 65 20 62 61 63 6b 77 61 72 64 73 20 6d   The backwards m
1e550 6f 76 65 6d 65 6e 74 20 77 6f 6e 27 74 0a 2a 2a  ovement won't.**
1e560 20 77 6f 72 6b 20 66 6f 72 20 57 49 54 48 4f 55   work for WITHOU
1e570 54 20 52 4f 57 49 44 20 74 61 62 6c 65 73 2e 0a  T ROWID tables..
1e580 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74  */.static void t
1e590 72 79 54 6f 43 6c 6f 6e 65 44 61 74 61 28 0a 20  ryToCloneData(. 
1e5a0 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 2c 0a   ShellState *p,.
1e5b0 20 20 73 71 6c 69 74 65 33 20 2a 6e 65 77 44 62    sqlite3 *newDb
1e5c0 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
1e5d0 7a 54 61 62 6c 65 0a 29 7b 0a 20 20 73 71 6c 69  zTable.){.  sqli
1e5e0 74 65 33 5f 73 74 6d 74 20 2a 70 51 75 65 72 79  te3_stmt *pQuery
1e5f0 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f   = 0;.  sqlite3_
1e600 73 74 6d 74 20 2a 70 49 6e 73 65 72 74 20 3d 20  stmt *pInsert = 
1e610 30 3b 0a 20 20 63 68 61 72 20 2a 7a 51 75 65 72  0;.  char *zQuer
1e620 79 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a  y = 0;.  char *z
1e630 49 6e 73 65 72 74 20 3d 20 30 3b 0a 20 20 69 6e  Insert = 0;.  in
1e640 74 20 72 63 3b 0a 20 20 69 6e 74 20 69 2c 20 6a  t rc;.  int i, j
1e650 2c 20 6e 3b 0a 20 20 69 6e 74 20 6e 54 61 62 6c  , n;.  int nTabl
1e660 65 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a 54 61  e = strlen30(zTa
1e670 62 6c 65 29 3b 0a 20 20 69 6e 74 20 6b 20 3d 20  ble);.  int k = 
1e680 30 3b 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20 30  0;.  int cnt = 0
1e690 3b 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 73 70  ;.  const int sp
1e6a0 69 6e 52 61 74 65 20 3d 20 31 30 30 30 30 3b 0a  inRate = 10000;.
1e6b0 0a 20 20 7a 51 75 65 72 79 20 3d 20 73 71 6c 69  .  zQuery = sqli
1e6c0 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 53 45 4c  te3_mprintf("SEL
1e6d0 45 43 54 20 2a 20 46 52 4f 4d 20 5c 22 25 77 5c  ECT * FROM \"%w\
1e6e0 22 22 2c 20 7a 54 61 62 6c 65 29 3b 0a 20 20 72  "", zTable);.  r
1e6f0 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70  c = sqlite3_prep
1e700 61 72 65 5f 76 32 28 70 2d 3e 64 62 2c 20 7a 51  are_v2(p->db, zQ
1e710 75 65 72 79 2c 20 2d 31 2c 20 26 70 51 75 65 72  uery, -1, &pQuer
1e720 79 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 20  y, 0);.  if( rc 
1e730 29 7b 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e  ){.    utf8_prin
1e740 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f  tf(stderr, "Erro
1e750 72 20 25 64 3a 20 25 73 20 6f 6e 20 5b 25 73 5d  r %d: %s on [%s]
1e760 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
1e770 20 73 71 6c 69 74 65 33 5f 65 78 74 65 6e 64 65   sqlite3_extende
1e780 64 5f 65 72 72 63 6f 64 65 28 70 2d 3e 64 62 29  d_errcode(p->db)
1e790 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  , sqlite3_errmsg
1e7a0 28 70 2d 3e 64 62 29 2c 0a 20 20 20 20 20 20 20  (p->db),.       
1e7b0 20 20 20 20 20 7a 51 75 65 72 79 29 3b 0a 20 20       zQuery);.  
1e7c0 20 20 67 6f 74 6f 20 65 6e 64 5f 64 61 74 61 5f    goto end_data_
1e7d0 78 66 65 72 3b 0a 20 20 7d 0a 20 20 6e 20 3d 20  xfer;.  }.  n = 
1e7e0 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63  sqlite3_column_c
1e7f0 6f 75 6e 74 28 70 51 75 65 72 79 29 3b 0a 20 20  ount(pQuery);.  
1e800 7a 49 6e 73 65 72 74 20 3d 20 73 71 6c 69 74 65  zInsert = sqlite
1e810 33 5f 6d 61 6c 6c 6f 63 36 34 28 32 30 30 20 2b  3_malloc64(200 +
1e820 20 6e 54 61 62 6c 65 20 2b 20 6e 2a 33 29 3b 0a   nTable + n*3);.
1e830 20 20 69 66 28 20 7a 49 6e 73 65 72 74 3d 3d 30    if( zInsert==0
1e840 20 29 20 73 68 65 6c 6c 5f 6f 75 74 5f 6f 66 5f   ) shell_out_of_
1e850 6d 65 6d 6f 72 79 28 29 3b 0a 20 20 73 71 6c 69  memory();.  sqli
1e860 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 32 30 30  te3_snprintf(200
1e870 2b 6e 54 61 62 6c 65 2c 7a 49 6e 73 65 72 74 2c  +nTable,zInsert,
1e880 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1e890 20 20 20 20 22 49 4e 53 45 52 54 20 4f 52 20 49      "INSERT OR I
1e8a0 47 4e 4f 52 45 20 49 4e 54 4f 20 5c 22 25 73 5c  GNORE INTO \"%s\
1e8b0 22 20 56 41 4c 55 45 53 28 3f 22 2c 20 7a 54 61  " VALUES(?", zTa
1e8c0 62 6c 65 29 3b 0a 20 20 69 20 3d 20 73 74 72 6c  ble);.  i = strl
1e8d0 65 6e 33 30 28 7a 49 6e 73 65 72 74 29 3b 0a 20  en30(zInsert);. 
1e8e0 20 66 6f 72 28 6a 3d 31 3b 20 6a 3c 6e 3b 20 6a   for(j=1; j<n; j
1e8f0 2b 2b 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28  ++){.    memcpy(
1e900 7a 49 6e 73 65 72 74 2b 69 2c 20 22 2c 3f 22 2c  zInsert+i, ",?",
1e910 20 32 29 3b 0a 20 20 20 20 69 20 2b 3d 20 32 3b   2);.    i += 2;
1e920 0a 20 20 7d 0a 20 20 6d 65 6d 63 70 79 28 7a 49  .  }.  memcpy(zI
1e930 6e 73 65 72 74 2b 69 2c 20 22 29 3b 22 2c 20 33  nsert+i, ");", 3
1e940 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
1e950 33 5f 70 72 65 70 61 72 65 5f 76 32 28 6e 65 77  3_prepare_v2(new
1e960 44 62 2c 20 7a 49 6e 73 65 72 74 2c 20 2d 31 2c  Db, zInsert, -1,
1e970 20 26 70 49 6e 73 65 72 74 2c 20 30 29 3b 0a 20   &pInsert, 0);. 
1e980 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 75   if( rc ){.    u
1e990 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72  tf8_printf(stder
1e9a0 72 2c 20 22 45 72 72 6f 72 20 25 64 3a 20 25 73  r, "Error %d: %s
1e9b0 20 6f 6e 20 5b 25 73 5d 5c 6e 22 2c 0a 20 20 20   on [%s]\n",.   
1e9c0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
1e9d0 5f 65 78 74 65 6e 64 65 64 5f 65 72 72 63 6f 64  _extended_errcod
1e9e0 65 28 6e 65 77 44 62 29 2c 20 73 71 6c 69 74 65  e(newDb), sqlite
1e9f0 33 5f 65 72 72 6d 73 67 28 6e 65 77 44 62 29 2c  3_errmsg(newDb),
1ea00 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 51 75  .            zQu
1ea10 65 72 79 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65  ery);.    goto e
1ea20 6e 64 5f 64 61 74 61 5f 78 66 65 72 3b 0a 20 20  nd_data_xfer;.  
1ea30 7d 0a 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 32  }.  for(k=0; k<2
1ea40 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 77 68 69 6c  ; k++){.    whil
1ea50 65 28 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33  e( (rc = sqlite3
1ea60 5f 73 74 65 70 28 70 51 75 65 72 79 29 29 3d 3d  _step(pQuery))==
1ea70 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20  SQLITE_ROW ){.  
1ea80 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
1ea90 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
1eaa0 73 77 69 74 63 68 28 20 73 71 6c 69 74 65 33 5f  switch( sqlite3_
1eab0 63 6f 6c 75 6d 6e 5f 74 79 70 65 28 70 51 75 65  column_type(pQue
1eac0 72 79 2c 20 69 29 20 29 7b 0a 20 20 20 20 20 20  ry, i) ){.      
1ead0 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
1eae0 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 20 20  NULL: {.        
1eaf0 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64      sqlite3_bind
1eb00 5f 6e 75 6c 6c 28 70 49 6e 73 65 72 74 2c 20 69  _null(pInsert, i
1eb10 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  +1);.           
1eb20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
1eb30 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 63 61    }.          ca
1eb40 73 65 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45  se SQLITE_INTEGE
1eb50 52 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  R: {.           
1eb60 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e   sqlite3_bind_in
1eb70 74 36 34 28 70 49 6e 73 65 72 74 2c 20 69 2b 31  t64(pInsert, i+1
1eb80 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  , sqlite3_column
1eb90 5f 69 6e 74 36 34 28 70 51 75 65 72 79 2c 69 29  _int64(pQuery,i)
1eba0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62  );.            b
1ebb0 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
1ebc0 7d 0a 20 20 20 20 20 20 20 20 20 20 63 61 73 65  }.          case
1ebd0 20 53 51 4c 49 54 45 5f 46 4c 4f 41 54 3a 20 7b   SQLITE_FLOAT: {
1ebe0 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
1ebf0 69 74 65 33 5f 62 69 6e 64 5f 64 6f 75 62 6c 65  ite3_bind_double
1ec00 28 70 49 6e 73 65 72 74 2c 20 69 2b 31 2c 20 73  (pInsert, i+1, s
1ec10 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 6f  qlite3_column_do
1ec20 75 62 6c 65 28 70 51 75 65 72 79 2c 69 29 29 3b  uble(pQuery,i));
1ec30 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65  .            bre
1ec40 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ak;.          }.
1ec50 20 20 20 20 20 20 20 20 20 20 63 61 73 65 20 53            case S
1ec60 51 4c 49 54 45 5f 54 45 58 54 3a 20 7b 0a 20 20  QLITE_TEXT: {.  
1ec70 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
1ec80 33 5f 62 69 6e 64 5f 74 65 78 74 28 70 49 6e 73  3_bind_text(pIns
1ec90 65 72 74 2c 20 69 2b 31 2c 0a 20 20 20 20 20 20  ert, i+1,.      
1eca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ecb0 20 20 20 20 20 20 20 28 63 6f 6e 73 74 20 63 68         (const ch
1ecc0 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75  ar*)sqlite3_colu
1ecd0 6d 6e 5f 74 65 78 74 28 70 51 75 65 72 79 2c 69  mn_text(pQuery,i
1ece0 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
1ecf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ed00 2d 31 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49  -1, SQLITE_STATI
1ed10 43 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  C);.            
1ed20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
1ed30 20 7d 0a 20 20 20 20 20 20 20 20 20 20 63 61 73   }.          cas
1ed40 65 20 53 51 4c 49 54 45 5f 42 4c 4f 42 3a 20 7b  e SQLITE_BLOB: {
1ed50 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
1ed60 69 74 65 33 5f 62 69 6e 64 5f 62 6c 6f 62 28 70  ite3_bind_blob(p
1ed70 49 6e 73 65 72 74 2c 20 69 2b 31 2c 20 73 71 6c  Insert, i+1, sql
1ed80 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62  ite3_column_blob
1ed90 28 70 51 75 65 72 79 2c 69 29 2c 0a 20 20 20 20  (pQuery,i),.    
1eda0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1edb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1edc0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
1edd0 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 28 70 51 75  column_bytes(pQu
1ede0 65 72 79 2c 69 29 2c 0a 20 20 20 20 20 20 20 20  ery,i),.        
1edf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ee00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ee10 20 20 20 20 53 51 4c 49 54 45 5f 53 54 41 54 49      SQLITE_STATI
1ee20 43 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  C);.            
1ee30 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
1ee40 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
1ee50 20 20 20 7d 20 2f 2a 20 45 6e 64 20 66 6f 72 20     } /* End for 
1ee60 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  */.      rc = sq
1ee70 6c 69 74 65 33 5f 73 74 65 70 28 70 49 6e 73 65  lite3_step(pInse
1ee80 72 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  rt);.      if( r
1ee90 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c!=SQLITE_OK && 
1eea0 72 63 21 3d 53 51 4c 49 54 45 5f 52 4f 57 20 26  rc!=SQLITE_ROW &
1eeb0 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e  & rc!=SQLITE_DON
1eec0 45 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66  E ){.        utf
1eed0 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  8_printf(stderr,
1eee0 20 22 45 72 72 6f 72 20 25 64 3a 20 25 73 5c 6e   "Error %d: %s\n
1eef0 22 2c 20 73 71 6c 69 74 65 33 5f 65 78 74 65 6e  ", sqlite3_exten
1ef00 64 65 64 5f 65 72 72 63 6f 64 65 28 6e 65 77 44  ded_errcode(newD
1ef10 62 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  b),.            
1ef20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
1ef30 74 65 33 5f 65 72 72 6d 73 67 28 6e 65 77 44 62  te3_errmsg(newDb
1ef40 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ));.      }.    
1ef50 20 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28    sqlite3_reset(
1ef60 70 49 6e 73 65 72 74 29 3b 0a 20 20 20 20 20 20  pInsert);.      
1ef70 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28  cnt++;.      if(
1ef80 20 28 63 6e 74 25 73 70 69 6e 52 61 74 65 29 3d   (cnt%spinRate)=
1ef90 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 72  =0 ){.        pr
1efa0 69 6e 74 66 28 22 25 63 5c 62 22 2c 20 22 7c 2f  intf("%c\b", "|/
1efb0 2d 5c 5c 22 5b 28 63 6e 74 2f 73 70 69 6e 52 61  -\\"[(cnt/spinRa
1efc0 74 65 29 25 34 5d 29 3b 0a 20 20 20 20 20 20 20  te)%4]);.       
1efd0 20 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29 3b   fflush(stdout);
1efe0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 2f  .      }.    } /
1eff0 2a 20 45 6e 64 20 77 68 69 6c 65 20 2a 2f 0a 20  * End while */. 
1f000 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1f010 45 5f 44 4f 4e 45 20 29 20 62 72 65 61 6b 3b 0a  E_DONE ) break;.
1f020 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61      sqlite3_fina
1f030 6c 69 7a 65 28 70 51 75 65 72 79 29 3b 0a 20 20  lize(pQuery);.  
1f040 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
1f050 51 75 65 72 79 29 3b 0a 20 20 20 20 7a 51 75 65  Query);.    zQue
1f060 72 79 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  ry = sqlite3_mpr
1f070 69 6e 74 66 28 22 53 45 4c 45 43 54 20 2a 20 46  intf("SELECT * F
1f080 52 4f 4d 20 5c 22 25 77 5c 22 20 4f 52 44 45 52  ROM \"%w\" ORDER
1f090 20 42 59 20 72 6f 77 69 64 20 44 45 53 43 3b 22   BY rowid DESC;"
1f0a0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1f0b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a                 z
1f0c0 54 61 62 6c 65 29 3b 0a 20 20 20 20 72 63 20 3d  Table);.    rc =
1f0d0 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
1f0e0 5f 76 32 28 70 2d 3e 64 62 2c 20 7a 51 75 65 72  _v2(p->db, zQuer
1f0f0 79 2c 20 2d 31 2c 20 26 70 51 75 65 72 79 2c 20  y, -1, &pQuery, 
1f100 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  0);.    if( rc )
1f110 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69  {.      utf8_pri
1f120 6e 74 66 28 73 74 64 65 72 72 2c 20 22 57 61 72  ntf(stderr, "War
1f130 6e 69 6e 67 3a 20 63 61 6e 6e 6f 74 20 73 74 65  ning: cannot ste
1f140 70 20 5c 22 25 73 5c 22 20 62 61 63 6b 77 61 72  p \"%s\" backwar
1f150 64 73 22 2c 20 7a 54 61 62 6c 65 29 3b 0a 20 20  ds", zTable);.  
1f160 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1f170 0a 20 20 7d 20 2f 2a 20 45 6e 64 20 66 6f 72 28  .  } /* End for(
1f180 6b 3d 30 2e 2e 2e 29 20 2a 2f 0a 0a 65 6e 64 5f  k=0...) */..end_
1f190 64 61 74 61 5f 78 66 65 72 3a 0a 20 20 73 71 6c  data_xfer:.  sql
1f1a0 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 51  ite3_finalize(pQ
1f1b0 75 65 72 79 29 3b 0a 20 20 73 71 6c 69 74 65 33  uery);.  sqlite3
1f1c0 5f 66 69 6e 61 6c 69 7a 65 28 70 49 6e 73 65 72  _finalize(pInser
1f1d0 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  t);.  sqlite3_fr
1f1e0 65 65 28 7a 51 75 65 72 79 29 3b 0a 20 20 73 71  ee(zQuery);.  sq
1f1f0 6c 69 74 65 33 5f 66 72 65 65 28 7a 49 6e 73 65  lite3_free(zInse
1f200 72 74 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54  rt);.}.../*.** T
1f210 72 79 20 74 6f 20 74 72 61 6e 73 66 65 72 20 61  ry to transfer a
1f220 6c 6c 20 72 6f 77 73 20 6f 66 20 74 68 65 20 73  ll rows of the s
1f230 63 68 65 6d 61 20 74 68 61 74 20 6d 61 74 63 68  chema that match
1f240 20 7a 57 68 65 72 65 2e 20 20 46 6f 72 0a 2a 2a   zWhere.  For.**
1f250 20 65 61 63 68 20 72 6f 77 2c 20 69 6e 76 6f 6b   each row, invok
1f260 65 20 78 46 6f 72 45 61 63 68 28 29 20 6f 6e 20  e xForEach() on 
1f270 74 68 65 20 6f 62 6a 65 63 74 20 64 65 66 69 6e  the object defin
1f280 65 64 20 62 79 20 74 68 61 74 20 72 6f 77 2e 0a  ed by that row..
1f290 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 69  ** If an error i
1f2a0 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 77 68  s encountered wh
1f2b0 69 6c 65 20 6d 6f 76 69 6e 67 20 66 6f 72 77 61  ile moving forwa
1f2c0 72 64 20 74 68 72 6f 75 67 68 20 74 68 65 0a 2a  rd through the.*
1f2d0 2a 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  * sqlite_master 
1f2e0 74 61 62 6c 65 2c 20 74 72 79 20 61 67 61 69 6e  table, try again
1f2f0 20 6d 6f 76 69 6e 67 20 62 61 63 6b 77 61 72 64   moving backward
1f300 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
1f310 64 20 74 72 79 54 6f 43 6c 6f 6e 65 53 63 68 65  d tryToCloneSche
1f320 6d 61 28 0a 20 20 53 68 65 6c 6c 53 74 61 74 65  ma(.  ShellState
1f330 20 2a 70 2c 0a 20 20 73 71 6c 69 74 65 33 20 2a   *p,.  sqlite3 *
1f340 6e 65 77 44 62 2c 0a 20 20 63 6f 6e 73 74 20 63  newDb,.  const c
1f350 68 61 72 20 2a 7a 57 68 65 72 65 2c 0a 20 20 76  har *zWhere,.  v
1f360 6f 69 64 20 28 2a 78 46 6f 72 45 61 63 68 29 28  oid (*xForEach)(
1f370 53 68 65 6c 6c 53 74 61 74 65 2a 2c 73 71 6c 69  ShellState*,sqli
1f380 74 65 33 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a  te3*,const char*
1f390 29 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73  ).){.  sqlite3_s
1f3a0 74 6d 74 20 2a 70 51 75 65 72 79 20 3d 20 30 3b  tmt *pQuery = 0;
1f3b0 0a 20 20 63 68 61 72 20 2a 7a 51 75 65 72 79 20  .  char *zQuery 
1f3c0 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  = 0;.  int rc;. 
1f3d0 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
1f3e0 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 63  char *zName;.  c
1f3f0 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
1f400 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 63 68 61 72  ar *zSql;.  char
1f410 20 2a 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 0a   *zErrMsg = 0;..
1f420 20 20 7a 51 75 65 72 79 20 3d 20 73 71 6c 69 74    zQuery = sqlit
1f430 65 33 5f 6d 70 72 69 6e 74 66 28 22 53 45 4c 45  e3_mprintf("SELE
1f440 43 54 20 6e 61 6d 65 2c 20 73 71 6c 20 46 52 4f  CT name, sql FRO
1f450 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 22  M sqlite_master"
1f460 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1f470 20 20 20 20 20 20 20 20 20 20 20 20 22 20 57 48              " WH
1f480 45 52 45 20 25 73 22 2c 20 7a 57 68 65 72 65 29  ERE %s", zWhere)
1f490 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
1f4a0 5f 70 72 65 70 61 72 65 5f 76 32 28 70 2d 3e 64  _prepare_v2(p->d
1f4b0 62 2c 20 7a 51 75 65 72 79 2c 20 2d 31 2c 20 26  b, zQuery, -1, &
1f4c0 70 51 75 65 72 79 2c 20 30 29 3b 0a 20 20 69 66  pQuery, 0);.  if
1f4d0 28 20 72 63 20 29 7b 0a 20 20 20 20 75 74 66 38  ( rc ){.    utf8
1f4e0 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
1f4f0 22 45 72 72 6f 72 3a 20 28 25 64 29 20 25 73 20  "Error: (%d) %s 
1f500 6f 6e 20 5b 25 73 5d 5c 6e 22 2c 0a 20 20 20 20  on [%s]\n",.    
1f510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f520 73 71 6c 69 74 65 33 5f 65 78 74 65 6e 64 65 64  sqlite3_extended
1f530 5f 65 72 72 63 6f 64 65 28 70 2d 3e 64 62 29 2c  _errcode(p->db),
1f540 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
1f550 70 2d 3e 64 62 29 2c 0a 20 20 20 20 20 20 20 20  p->db),.        
1f560 20 20 20 20 20 20 20 20 20 20 20 20 7a 51 75 65              zQue
1f570 72 79 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e  ry);.    goto en
1f580 64 5f 73 63 68 65 6d 61 5f 78 66 65 72 3b 0a 20  d_schema_xfer;. 
1f590 20 7d 0a 20 20 77 68 69 6c 65 28 20 28 72 63 20   }.  while( (rc 
1f5a0 3d 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70  = sqlite3_step(p
1f5b0 51 75 65 72 79 29 29 3d 3d 53 51 4c 49 54 45 5f  Query))==SQLITE_
1f5c0 52 4f 57 20 29 7b 0a 20 20 20 20 7a 4e 61 6d 65  ROW ){.    zName
1f5d0 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
1f5e0 6e 5f 74 65 78 74 28 70 51 75 65 72 79 2c 20 30  n_text(pQuery, 0
1f5f0 29 3b 0a 20 20 20 20 7a 53 71 6c 20 3d 20 73 71  );.    zSql = sq
1f600 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
1f610 74 28 70 51 75 65 72 79 2c 20 31 29 3b 0a 20 20  t(pQuery, 1);.  
1f620 20 20 70 72 69 6e 74 66 28 22 25 73 2e 2e 2e 20    printf("%s... 
1f630 22 2c 20 7a 4e 61 6d 65 29 3b 20 66 66 6c 75 73  ", zName); fflus
1f640 68 28 73 74 64 6f 75 74 29 3b 0a 20 20 20 20 73  h(stdout);.    s
1f650 71 6c 69 74 65 33 5f 65 78 65 63 28 6e 65 77 44  qlite3_exec(newD
1f660 62 2c 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29  b, (const char*)
1f670 7a 53 71 6c 2c 20 30 2c 20 30 2c 20 26 7a 45 72  zSql, 0, 0, &zEr
1f680 72 4d 73 67 29 3b 0a 20 20 20 20 69 66 28 20 7a  rMsg);.    if( z
1f690 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20 20 20  ErrMsg ){.      
1f6a0 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65  utf8_printf(stde
1f6b0 72 72 2c 20 22 45 72 72 6f 72 3a 20 25 73 5c 6e  rr, "Error: %s\n
1f6c0 53 51 4c 3a 20 5b 25 73 5d 5c 6e 22 2c 20 7a 45  SQL: [%s]\n", zE
1f6d0 72 72 4d 73 67 2c 20 7a 53 71 6c 29 3b 0a 20 20  rrMsg, zSql);.  
1f6e0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
1f6f0 28 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20  (zErrMsg);.     
1f700 20 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20   zErrMsg = 0;.  
1f710 20 20 7d 0a 20 20 20 20 69 66 28 20 78 46 6f 72    }.    if( xFor
1f720 45 61 63 68 20 29 7b 0a 20 20 20 20 20 20 78 46  Each ){.      xF
1f730 6f 72 45 61 63 68 28 70 2c 20 6e 65 77 44 62 2c  orEach(p, newDb,
1f740 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 7a 4e   (const char*)zN
1f750 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ame);.    }.    
1f760 70 72 69 6e 74 66 28 22 64 6f 6e 65 5c 6e 22 29  printf("done\n")
1f770 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d  ;.  }.  if( rc!=
1f780 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20  SQLITE_DONE ){. 
1f790 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c     sqlite3_final
1f7a0 69 7a 65 28 70 51 75 65 72 79 29 3b 0a 20 20 20  ize(pQuery);.   
1f7b0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 51   sqlite3_free(zQ
1f7c0 75 65 72 79 29 3b 0a 20 20 20 20 7a 51 75 65 72  uery);.    zQuer
1f7d0 79 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  y = sqlite3_mpri
1f7e0 6e 74 66 28 22 53 45 4c 45 43 54 20 6e 61 6d 65  ntf("SELECT name
1f7f0 2c 20 73 71 6c 20 46 52 4f 4d 20 73 71 6c 69 74  , sql FROM sqlit
1f800 65 5f 6d 61 73 74 65 72 22 0a 20 20 20 20 20 20  e_master".      
1f810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f820 20 20 20 20 20 20 20 22 20 57 48 45 52 45 20 25         " WHERE %
1f830 73 20 4f 52 44 45 52 20 42 59 20 72 6f 77 69 64  s ORDER BY rowid
1f840 20 44 45 53 43 22 2c 20 7a 57 68 65 72 65 29 3b   DESC", zWhere);
1f850 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
1f860 33 5f 70 72 65 70 61 72 65 5f 76 32 28 70 2d 3e  3_prepare_v2(p->
1f870 64 62 2c 20 7a 51 75 65 72 79 2c 20 2d 31 2c 20  db, zQuery, -1, 
1f880 26 70 51 75 65 72 79 2c 20 30 29 3b 0a 20 20 20  &pQuery, 0);.   
1f890 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
1f8a0 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64   utf8_printf(std
1f8b0 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 28 25 64  err, "Error: (%d
1f8c0 29 20 25 73 20 6f 6e 20 5b 25 73 5d 5c 6e 22 2c  ) %s on [%s]\n",
1f8d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1f8e0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65         sqlite3_e
1f8f0 78 74 65 6e 64 65 64 5f 65 72 72 63 6f 64 65 28  xtended_errcode(
1f900 70 2d 3e 64 62 29 2c 20 73 71 6c 69 74 65 33 5f  p->db), sqlite3_
1f910 65 72 72 6d 73 67 28 70 2d 3e 64 62 29 2c 0a 20  errmsg(p->db),. 
1f920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f930 20 20 20 20 20 7a 51 75 65 72 79 29 3b 0a 20 20       zQuery);.  
1f940 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 73 63 68      goto end_sch
1f950 65 6d 61 5f 78 66 65 72 3b 0a 20 20 20 20 7d 0a  ema_xfer;.    }.
1f960 20 20 20 20 77 68 69 6c 65 28 20 28 72 63 20 3d      while( (rc =
1f970 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 51   sqlite3_step(pQ
1f980 75 65 72 79 29 29 3d 3d 53 51 4c 49 54 45 5f 52  uery))==SQLITE_R
1f990 4f 57 20 29 7b 0a 20 20 20 20 20 20 7a 4e 61 6d  OW ){.      zNam
1f9a0 65 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  e = sqlite3_colu
1f9b0 6d 6e 5f 74 65 78 74 28 70 51 75 65 72 79 2c 20  mn_text(pQuery, 
1f9c0 30 29 3b 0a 20 20 20 20 20 20 7a 53 71 6c 20 3d  0);.      zSql =
1f9d0 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
1f9e0 74 65 78 74 28 70 51 75 65 72 79 2c 20 31 29 3b  text(pQuery, 1);
1f9f0 0a 20 20 20 20 20 20 70 72 69 6e 74 66 28 22 25  .      printf("%
1fa00 73 2e 2e 2e 20 22 2c 20 7a 4e 61 6d 65 29 3b 20  s... ", zName); 
1fa10 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29 3b 0a  fflush(stdout);.
1fa20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65 78        sqlite3_ex
1fa30 65 63 28 6e 65 77 44 62 2c 20 28 63 6f 6e 73 74  ec(newDb, (const
1fa40 20 63 68 61 72 2a 29 7a 53 71 6c 2c 20 30 2c 20   char*)zSql, 0, 
1fa50 30 2c 20 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20  0, &zErrMsg);.  
1fa60 20 20 20 20 69 66 28 20 7a 45 72 72 4d 73 67 20      if( zErrMsg 
1fa70 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f  ){.        utf8_
1fa80 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
1fa90 45 72 72 6f 72 3a 20 25 73 5c 6e 53 51 4c 3a 20  Error: %s\nSQL: 
1faa0 5b 25 73 5d 5c 6e 22 2c 20 7a 45 72 72 4d 73 67  [%s]\n", zErrMsg
1fab0 2c 20 7a 53 71 6c 29 3b 0a 20 20 20 20 20 20 20  , zSql);.       
1fac0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 45   sqlite3_free(zE
1fad0 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 20 20  rrMsg);.        
1fae0 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 20  zErrMsg = 0;.   
1faf0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 78     }.      if( x
1fb00 46 6f 72 45 61 63 68 20 29 7b 0a 20 20 20 20 20  ForEach ){.     
1fb10 20 20 20 78 46 6f 72 45 61 63 68 28 70 2c 20 6e     xForEach(p, n
1fb20 65 77 44 62 2c 20 28 63 6f 6e 73 74 20 63 68 61  ewDb, (const cha
1fb30 72 2a 29 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  r*)zName);.     
1fb40 20 7d 0a 20 20 20 20 20 20 70 72 69 6e 74 66 28   }.      printf(
1fb50 22 64 6f 6e 65 5c 6e 22 29 3b 0a 20 20 20 20 7d  "done\n");.    }
1fb60 0a 20 20 7d 0a 65 6e 64 5f 73 63 68 65 6d 61 5f  .  }.end_schema_
1fb70 78 66 65 72 3a 0a 20 20 73 71 6c 69 74 65 33 5f  xfer:.  sqlite3_
1fb80 66 69 6e 61 6c 69 7a 65 28 70 51 75 65 72 79 29  finalize(pQuery)
1fb90 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
1fba0 28 7a 51 75 65 72 79 29 3b 0a 7d 0a 0a 2f 2a 0a  (zQuery);.}../*.
1fbb0 2a 2a 20 4f 70 65 6e 20 61 20 6e 65 77 20 64 61  ** Open a new da
1fbc0 74 61 62 61 73 65 20 66 69 6c 65 20 6e 61 6d 65  tabase file name
1fbd0 64 20 22 7a 4e 65 77 44 62 22 2e 20 20 54 72 79  d "zNewDb".  Try
1fbe0 20 74 6f 20 72 65 63 6f 76 65 72 20 61 73 20 6d   to recover as m
1fbf0 75 63 68 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a  uch information.
1fc00 2a 2a 20 61 73 20 70 6f 73 73 69 62 6c 65 20 6f  ** as possible o
1fc10 75 74 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 64  ut of the main d
1fc20 61 74 61 62 61 73 65 20 28 77 68 69 63 68 20 6d  atabase (which m
1fc30 69 67 68 74 20 62 65 20 63 6f 72 72 75 70 74 29  ight be corrupt)
1fc40 20 61 6e 64 20 77 72 69 74 65 20 69 74 0a 2a 2a   and write it.**
1fc50 20 69 6e 74 6f 20 7a 4e 65 77 44 62 2e 0a 2a 2f   into zNewDb..*/
1fc60 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74 72 79  .static void try
1fc70 54 6f 43 6c 6f 6e 65 28 53 68 65 6c 6c 53 74 61  ToClone(ShellSta
1fc80 74 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61  te *p, const cha
1fc90 72 20 2a 7a 4e 65 77 44 62 29 7b 0a 20 20 69 6e  r *zNewDb){.  in
1fca0 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 20  t rc;.  sqlite3 
1fcb0 2a 6e 65 77 44 62 20 3d 20 30 3b 0a 20 20 69 66  *newDb = 0;.  if
1fcc0 28 20 61 63 63 65 73 73 28 7a 4e 65 77 44 62 2c  ( access(zNewDb,
1fcd0 30 29 3d 3d 30 20 29 7b 0a 20 20 20 20 75 74 66  0)==0 ){.    utf
1fce0 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  8_printf(stderr,
1fcf0 20 22 46 69 6c 65 20 5c 22 25 73 5c 22 20 61 6c   "File \"%s\" al
1fd00 72 65 61 64 79 20 65 78 69 73 74 73 2e 5c 6e 22  ready exists.\n"
1fd10 2c 20 7a 4e 65 77 44 62 29 3b 0a 20 20 20 20 72  , zNewDb);.    r
1fd20 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 72 63 20  eturn;.  }.  rc 
1fd30 3d 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 7a  = sqlite3_open(z
1fd40 4e 65 77 44 62 2c 20 26 6e 65 77 44 62 29 3b 0a  NewDb, &newDb);.
1fd50 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
1fd60 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65  utf8_printf(stde
1fd70 72 72 2c 20 22 43 61 6e 6e 6f 74 20 63 72 65 61  rr, "Cannot crea
1fd80 74 65 20 6f 75 74 70 75 74 20 64 61 74 61 62 61  te output databa
1fd90 73 65 3a 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20  se: %s\n",.     
1fda0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65         sqlite3_e
1fdb0 72 72 6d 73 67 28 6e 65 77 44 62 29 29 3b 0a 20  rrmsg(newDb));. 
1fdc0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    sqli
1fdd0 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20  te3_exec(p->db, 
1fde0 22 50 52 41 47 4d 41 20 77 72 69 74 61 62 6c 65  "PRAGMA writable
1fdf0 5f 73 63 68 65 6d 61 3d 4f 4e 3b 22 2c 20 30 2c  _schema=ON;", 0,
1fe00 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   0, 0);.    sqli
1fe10 74 65 33 5f 65 78 65 63 28 6e 65 77 44 62 2c 20  te3_exec(newDb, 
1fe20 22 42 45 47 49 4e 20 45 58 43 4c 55 53 49 56 45  "BEGIN EXCLUSIVE
1fe30 3b 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  ;", 0, 0, 0);.  
1fe40 20 20 74 72 79 54 6f 43 6c 6f 6e 65 53 63 68 65    tryToCloneSche
1fe50 6d 61 28 70 2c 20 6e 65 77 44 62 2c 20 22 74 79  ma(p, newDb, "ty
1fe60 70 65 3d 27 74 61 62 6c 65 27 22 2c 20 74 72 79  pe='table'", try
1fe70 54 6f 43 6c 6f 6e 65 44 61 74 61 29 3b 0a 20 20  ToCloneData);.  
1fe80 20 20 74 72 79 54 6f 43 6c 6f 6e 65 53 63 68 65    tryToCloneSche
1fe90 6d 61 28 70 2c 20 6e 65 77 44 62 2c 20 22 74 79  ma(p, newDb, "ty
1fea0 70 65 21 3d 27 74 61 62 6c 65 27 22 2c 20 30 29  pe!='table'", 0)
1feb0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 65 78  ;.    sqlite3_ex
1fec0 65 63 28 6e 65 77 44 62 2c 20 22 43 4f 4d 4d 49  ec(newDb, "COMMI
1fed0 54 3b 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  T;", 0, 0, 0);. 
1fee0 20 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28     sqlite3_exec(
1fef0 70 2d 3e 64 62 2c 20 22 50 52 41 47 4d 41 20 77  p->db, "PRAGMA w
1ff00 72 69 74 61 62 6c 65 5f 73 63 68 65 6d 61 3d 4f  ritable_schema=O
1ff10 46 46 3b 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  FF;", 0, 0, 0);.
1ff20 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 63 6c    }.  sqlite3_cl
1ff30 6f 73 65 28 6e 65 77 44 62 29 3b 0a 7d 0a 0a 2f  ose(newDb);.}../
1ff40 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
1ff50 6f 75 74 70 75 74 20 66 69 6c 65 20 62 61 63 6b  output file back
1ff60 20 74 6f 20 73 74 64 6f 75 74 2e 0a 2a 2a 0a 2a   to stdout..**.*
1ff70 2a 20 49 66 20 74 68 65 20 70 2d 3e 64 6f 58 64  * If the p->doXd
1ff80 67 4f 70 65 6e 20 66 6c 61 67 20 69 73 20 73 65  gOpen flag is se
1ff90 74 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68  t, that means th
1ffa0 65 20 6f 75 74 70 75 74 20 77 61 73 20 62 65 69  e output was bei
1ffb0 6e 67 0a 2a 2a 20 72 65 64 69 72 65 63 74 65 64  ng.** redirected
1ffc0 20 74 6f 20 61 20 74 65 6d 70 6f 72 61 72 79 20   to a temporary 
1ffd0 66 69 6c 65 20 6e 61 6d 65 64 20 62 79 20 70 2d  file named by p-
1ffe0 3e 7a 54 65 6d 70 46 69 6c 65 2e 20 20 49 6e 20  >zTempFile.  In 
1fff0 74 68 61 74 20 63 61 73 65 2c 0a 2a 2a 20 6c 61  that case,.** la
20000 75 6e 63 68 20 73 74 61 72 74 2f 6f 70 65 6e 2f  unch start/open/
20010 78 64 67 2d 6f 70 65 6e 20 6f 6e 20 74 68 61 74  xdg-open on that
20020 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e   temporary file.
20030 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
20040 6f 75 74 70 75 74 5f 72 65 73 65 74 28 53 68 65  output_reset(She
20050 6c 6c 53 74 61 74 65 20 2a 70 29 7b 0a 20 20 69  llState *p){.  i
20060 66 28 20 70 2d 3e 6f 75 74 66 69 6c 65 5b 30 5d  f( p->outfile[0]
20070 3d 3d 27 7c 27 20 29 7b 0a 23 69 66 6e 64 65 66  =='|' ){.#ifndef
20080 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 4f 50   SQLITE_OMIT_POP
20090 45 4e 0a 20 20 20 20 70 63 6c 6f 73 65 28 70 2d  EN.    pclose(p-
200a0 3e 6f 75 74 29 3b 0a 23 65 6e 64 69 66 0a 20 20  >out);.#endif.  
200b0 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 75 74 70 75  }else{.    outpu
200c0 74 5f 66 69 6c 65 5f 63 6c 6f 73 65 28 70 2d 3e  t_file_close(p->
200d0 6f 75 74 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  out);.#ifndef SQ
200e0 4c 49 54 45 5f 4e 4f 48 41 56 45 5f 53 59 53 54  LITE_NOHAVE_SYST
200f0 45 4d 0a 20 20 20 20 69 66 28 20 70 2d 3e 64 6f  EM.    if( p->do
20100 58 64 67 4f 70 65 6e 20 29 7b 0a 20 20 20 20 20  XdgOpen ){.     
20110 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 58 64   const char *zXd
20120 67 4f 70 65 6e 43 6d 64 20 3d 0a 23 69 66 20 64  gOpenCmd =.#if d
20130 65 66 69 6e 65 64 28 5f 57 49 4e 33 32 29 0a 20  efined(_WIN32). 
20140 20 20 20 20 20 22 73 74 61 72 74 22 3b 0a 23 65       "start";.#e
20150 6c 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50  lif defined(__AP
20160 50 4c 45 5f 5f 29 0a 20 20 20 20 20 20 22 6f 70  PLE__).      "op
20170 65 6e 22 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20  en";.#else.     
20180 20 22 78 64 67 2d 6f 70 65 6e 22 3b 0a 23 65 6e   "xdg-open";.#en
20190 64 69 66 0a 20 20 20 20 20 20 63 68 61 72 20 2a  dif.      char *
201a0 7a 43 6d 64 3b 0a 20 20 20 20 20 20 7a 43 6d 64  zCmd;.      zCmd
201b0 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
201c0 74 66 28 22 25 73 20 25 73 22 2c 20 7a 58 64 67  tf("%s %s", zXdg
201d0 4f 70 65 6e 43 6d 64 2c 20 70 2d 3e 7a 54 65 6d  OpenCmd, p->zTem
201e0 70 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 69 66  pFile);.      if
201f0 28 20 73 79 73 74 65 6d 28 7a 43 6d 64 29 20 29  ( system(zCmd) )
20200 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70  {.        utf8_p
20210 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 46  rintf(stderr, "F
20220 61 69 6c 65 64 3a 20 5b 25 73 5d 5c 6e 22 2c 20  ailed: [%s]\n", 
20230 7a 43 6d 64 29 3b 0a 20 20 20 20 20 20 7d 0a 20  zCmd);.      }. 
20240 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
20250 65 28 7a 43 6d 64 29 3b 0a 20 20 20 20 20 20 6f  e(zCmd);.      o
20260 75 74 70 75 74 4d 6f 64 65 50 6f 70 28 70 29 3b  utputModePop(p);
20270 0a 20 20 20 20 20 20 70 2d 3e 64 6f 58 64 67 4f  .      p->doXdgO
20280 70 65 6e 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 23  pen = 0;.    }.#
20290 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65  endif /* !define
202a0 64 28 53 51 4c 49 54 45 5f 4e 4f 48 41 56 45 5f  d(SQLITE_NOHAVE_
202b0 53 59 53 54 45 4d 29 20 2a 2f 0a 20 20 7d 0a 20  SYSTEM) */.  }. 
202c0 20 70 2d 3e 6f 75 74 66 69 6c 65 5b 30 5d 20 3d   p->outfile[0] =
202d0 20 30 3b 0a 20 20 70 2d 3e 6f 75 74 20 3d 20 73   0;.  p->out = s
202e0 74 64 6f 75 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  tdout;.}../*.** 
202f0 52 75 6e 20 61 6e 20 53 51 4c 20 63 6f 6d 6d 61  Run an SQL comma
20300 6e 64 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68  nd and return th
20310 65 20 73 69 6e 67 6c 65 20 69 6e 74 65 67 65 72  e single integer
20320 20 72 65 73 75 6c 74 2e 0a 2a 2f 0a 73 74 61 74   result..*/.stat
20330 69 63 20 69 6e 74 20 64 62 5f 69 6e 74 28 53 68  ic int db_int(Sh
20340 65 6c 6c 53 74 61 74 65 20 2a 70 2c 20 63 6f 6e  ellState *p, con
20350 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 29 7b 0a  st char *zSql){.
20360 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
20370 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 72 65 73  pStmt;.  int res
20380 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f   = 0;.  sqlite3_
20390 70 72 65 70 61 72 65 5f 76 32 28 70 2d 3e 64 62  prepare_v2(p->db
203a0 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74  , zSql, -1, &pSt
203b0 6d 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 53  mt, 0);.  if( pS
203c0 74 6d 74 20 26 26 20 73 71 6c 69 74 65 33 5f 73  tmt && sqlite3_s
203d0 74 65 70 28 70 53 74 6d 74 29 3d 3d 53 51 4c 49  tep(pStmt)==SQLI
203e0 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 72 65  TE_ROW ){.    re
203f0 73 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  s = sqlite3_colu
20400 6d 6e 5f 69 6e 74 28 70 53 74 6d 74 2c 30 29 3b  mn_int(pStmt,0);
20410 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66  .  }.  sqlite3_f
20420 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a  inalize(pStmt);.
20430 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a    return res;.}.
20440 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61  ./*.** Convert a
20450 20 32 2d 62 79 74 65 20 6f 72 20 34 2d 62 79 74   2-byte or 4-byt
20460 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74  e big-endian int
20470 65 67 65 72 20 69 6e 74 6f 20 61 20 6e 61 74 69  eger into a nati
20480 76 65 20 69 6e 74 65 67 65 72 0a 2a 2f 0a 73 74  ve integer.*/.st
20490 61 74 69 63 20 75 6e 73 69 67 6e 65 64 20 69 6e  atic unsigned in
204a0 74 20 67 65 74 32 62 79 74 65 49 6e 74 28 75 6e  t get2byteInt(un
204b0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 29 7b  signed char *a){
204c0 0a 20 20 72 65 74 75 72 6e 20 28 61 5b 30 5d 3c  .  return (a[0]<
204d0 3c 38 29 20 2b 20 61 5b 31 5d 3b 0a 7d 0a 73 74  <8) + a[1];.}.st
204e0 61 74 69 63 20 75 6e 73 69 67 6e 65 64 20 69 6e  atic unsigned in
204f0 74 20 67 65 74 34 62 79 74 65 49 6e 74 28 75 6e  t get4byteInt(un
20500 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 29 7b  signed char *a){
20510 0a 20 20 72 65 74 75 72 6e 20 28 61 5b 30 5d 3c  .  return (a[0]<
20520 3c 32 34 29 20 2b 20 28 61 5b 31 5d 3c 3c 31 36  <24) + (a[1]<<16
20530 29 20 2b 20 28 61 5b 32 5d 3c 3c 38 29 20 2b 20  ) + (a[2]<<8) + 
20540 61 5b 33 5d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  a[3];.}../*.** I
20550 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
20560 20 74 68 65 20 22 2e 69 6e 66 6f 22 20 63 6f 6d   the ".info" com
20570 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  mand..**.** Retu
20580 72 6e 20 31 20 6f 6e 20 65 72 72 6f 72 2c 20 32  rn 1 on error, 2
20590 20 74 6f 20 65 78 69 74 2c 20 61 6e 64 20 30 20   to exit, and 0 
205a0 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74  otherwise..*/.st
205b0 61 74 69 63 20 69 6e 74 20 73 68 65 6c 6c 5f 64  atic int shell_d
205c0 62 69 6e 66 6f 5f 63 6f 6d 6d 61 6e 64 28 53 68  binfo_command(Sh
205d0 65 6c 6c 53 74 61 74 65 20 2a 70 2c 20 69 6e 74  ellState *p, int
205e0 20 6e 41 72 67 2c 20 63 68 61 72 20 2a 2a 61 7a   nArg, char **az
205f0 41 72 67 29 7b 0a 20 20 73 74 61 74 69 63 20 63  Arg){.  static c
20600 6f 6e 73 74 20 73 74 72 75 63 74 20 7b 20 63 6f  onst struct { co
20610 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b  nst char *zName;
20620 20 69 6e 74 20 6f 66 73 74 3b 20 7d 20 61 46 69   int ofst; } aFi
20630 65 6c 64 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 7b  eld[] = {.     {
20640 20 22 66 69 6c 65 20 63 68 61 6e 67 65 20 63 6f   "file change co
20650 75 6e 74 65 72 3a 22 2c 20 20 32 34 20 20 7d 2c  unter:",  24  },
20660 0a 20 20 20 20 20 7b 20 22 64 61 74 61 62 61 73  .     { "databas
20670 65 20 70 61 67 65 20 63 6f 75 6e 74 3a 22 2c 20  e page count:", 
20680 20 32 38 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22   28  },.     { "
20690 66 72 65 65 6c 69 73 74 20 70 61 67 65 20 63 6f  freelist page co
206a0 75 6e 74 3a 22 2c 20 20 33 36 20 20 7d 2c 0a 20  unt:",  36  },. 
206b0 20 20 20 20 7b 20 22 73 63 68 65 6d 61 20 63 6f      { "schema co
206c0 6f 6b 69 65 3a 22 2c 20 20 20 20 20 20 20 20 34  okie:",        4
206d0 30 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 63  0  },.     { "sc
206e0 68 65 6d 61 20 66 6f 72 6d 61 74 3a 22 2c 20 20  hema format:",  
206f0 20 20 20 20 20 20 34 34 20 20 7d 2c 0a 20 20 20        44  },.   
20700 20 20 7b 20 22 64 65 66 61 75 6c 74 20 63 61 63    { "default cac
20710 68 65 20 73 69 7a 65 3a 22 2c 20 20 20 34 38 20  he size:",   48 
20720 20 7d 2c 0a 20 20 20 20 20 7b 20 22 61 75 74 6f   },.     { "auto
20730 76 61 63 75 75 6d 20 74 6f 70 20 72 6f 6f 74 3a  vacuum top root:
20740 22 2c 20 20 35 32 20 20 7d 2c 0a 20 20 20 20 20  ",  52  },.     
20750 7b 20 22 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76  { "incremental v
20760 61 63 75 75 6d 3a 22 2c 20 20 20 36 34 20 20 7d  acuum:",   64  }
20770 2c 0a 20 20 20 20 20 7b 20 22 74 65 78 74 20 65  ,.     { "text e
20780 6e 63 6f 64 69 6e 67 3a 22 2c 20 20 20 20 20 20  ncoding:",      
20790 20 20 35 36 20 20 7d 2c 0a 20 20 20 20 20 7b 20    56  },.     { 
207a0 22 75 73 65 72 20 76 65 72 73 69 6f 6e 3a 22 2c  "user version:",
207b0 20 20 20 20 20 20 20 20 20 36 30 20 20 7d 2c 0a           60  },.
207c0 20 20 20 20 20 7b 20 22 61 70 70 6c 69 63 61 74       { "applicat
207d0 69 6f 6e 20 69 64 3a 22 2c 20 20 20 20 20 20 20  ion id:",       
207e0 36 38 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73  68  },.     { "s
207f0 6f 66 74 77 61 72 65 20 76 65 72 73 69 6f 6e 3a  oftware version:
20800 22 2c 20 20 20 20 20 39 36 20 20 7d 2c 0a 20 20  ",     96  },.  
20810 7d 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73  };.  static cons
20820 74 20 73 74 72 75 63 74 20 7b 20 63 6f 6e 73 74  t struct { const
20830 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 63 6f   char *zName; co
20840 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 3b 20  nst char *zSql; 
20850 7d 20 61 51 75 65 72 79 5b 5d 20 3d 20 7b 0a 20  } aQuery[] = {. 
20860 20 20 20 20 7b 20 22 6e 75 6d 62 65 72 20 6f 66      { "number of
20870 20 74 61 62 6c 65 73 3a 22 2c 0a 20 20 20 20 20   tables:",.     
20880 20 20 22 53 45 4c 45 43 54 20 63 6f 75 6e 74 28    "SELECT count(
20890 2a 29 20 46 52 4f 4d 20 25 73 20 57 48 45 52 45  *) FROM %s WHERE
208a0 20 74 79 70 65 3d 27 74 61 62 6c 65 27 22 20 7d   type='table'" }
208b0 2c 0a 20 20 20 20 20 7b 20 22 6e 75 6d 62 65 72  ,.     { "number
208c0 20 6f 66 20 69 6e 64 65 78 65 73 3a 22 2c 0a 20   of indexes:",. 
208d0 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 63 6f        "SELECT co
208e0 75 6e 74 28 2a 29 20 46 52 4f 4d 20 25 73 20 57  unt(*) FROM %s W
208f0 48 45 52 45 20 74 79 70 65 3d 27 69 6e 64 65 78  HERE type='index
20900 27 22 20 7d 2c 0a 20 20 20 20 20 7b 20 22 6e 75  '" },.     { "nu
20910 6d 62 65 72 20 6f 66 20 74 72 69 67 67 65 72 73  mber of triggers
20920 3a 22 2c 0a 20 20 20 20 20 20 20 22 53 45 4c 45  :",.       "SELE
20930 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d  CT count(*) FROM
20940 20 25 73 20 57 48 45 52 45 20 74 79 70 65 3d 27   %s WHERE type='
20950 74 72 69 67 67 65 72 27 22 20 7d 2c 0a 20 20 20  trigger'" },.   
20960 20 20 7b 20 22 6e 75 6d 62 65 72 20 6f 66 20 76    { "number of v
20970 69 65 77 73 3a 22 2c 0a 20 20 20 20 20 20 20 22  iews:",.       "
20980 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20  SELECT count(*) 
20990 46 52 4f 4d 20 25 73 20 57 48 45 52 45 20 74 79  FROM %s WHERE ty
209a0 70 65 3d 27 76 69 65 77 27 22 20 7d 2c 0a 20 20  pe='view'" },.  
209b0 20 20 20 7b 20 22 73 63 68 65 6d 61 20 73 69 7a     { "schema siz
209c0 65 3a 22 2c 0a 20 20 20 20 20 20 20 22 53 45 4c  e:",.       "SEL
209d0 45 43 54 20 74 6f 74 61 6c 28 6c 65 6e 67 74 68  ECT total(length
209e0 28 73 71 6c 29 29 20 46 52 4f 4d 20 25 73 22 20  (sql)) FROM %s" 
209f0 7d 2c 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69 3b  },.  };.  int i;
20a00 0a 20 20 63 68 61 72 20 2a 7a 53 63 68 65 6d 61  .  char *zSchema
20a10 54 61 62 3b 0a 20 20 63 68 61 72 20 2a 7a 44 62  Tab;.  char *zDb
20a20 20 3d 20 6e 41 72 67 3e 3d 32 20 3f 20 61 7a 41   = nArg>=2 ? azA
20a30 72 67 5b 31 5d 20 3a 20 22 6d 61 69 6e 22 3b 0a  rg[1] : "main";.
20a40 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
20a50 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 75 6e 73  pStmt = 0;.  uns
20a60 69 67 6e 65 64 20 63 68 61 72 20 61 48 64 72 5b  igned char aHdr[
20a70 31 30 30 5d 3b 0a 20 20 6f 70 65 6e 5f 64 62 28  100];.  open_db(
20a80 70 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 2d 3e  p, 0);.  if( p->
20a90 64 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31  db==0 ) return 1
20aa0 3b 0a 20 20 73 71 6c 69 74 65 33 5f 70 72 65 70  ;.  sqlite3_prep
20ab0 61 72 65 5f 76 32 28 70 2d 3e 64 62 2c 22 53 45  are_v2(p->db,"SE
20ac0 4c 45 43 54 20 64 61 74 61 20 46 52 4f 4d 20 73  LECT data FROM s
20ad0 71 6c 69 74 65 5f 64 62 70 61 67 65 28 3f 31 29  qlite_dbpage(?1)
20ae0 20 57 48 45 52 45 20 70 67 6e 6f 3d 31 22 2c 0a   WHERE pgno=1",.
20af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20b00 20 20 20 20 20 2d 31 2c 20 26 70 53 74 6d 74 2c       -1, &pStmt,
20b10 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 62   0);.  sqlite3_b
20b20 69 6e 64 5f 74 65 78 74 28 70 53 74 6d 74 2c 20  ind_text(pStmt, 
20b30 31 2c 20 7a 44 62 2c 20 2d 31 2c 20 53 51 4c 49  1, zDb, -1, SQLI
20b40 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 69 66  TE_STATIC);.  if
20b50 28 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70  ( sqlite3_step(p
20b60 53 74 6d 74 29 3d 3d 53 51 4c 49 54 45 5f 52 4f  Stmt)==SQLITE_RO
20b70 57 0a 20 20 20 26 26 20 73 71 6c 69 74 65 33 5f  W.   && sqlite3_
20b80 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 28 70 53 74  column_bytes(pSt
20b90 6d 74 2c 30 29 3e 31 30 30 0a 20 20 29 7b 0a 20  mt,0)>100.  ){. 
20ba0 20 20 20 6d 65 6d 63 70 79 28 61 48 64 72 2c 20     memcpy(aHdr, 
20bb0 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62  sqlite3_column_b
20bc0 6c 6f 62 28 70 53 74 6d 74 2c 30 29 2c 20 31 30  lob(pStmt,0), 10
20bd0 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  0);.    sqlite3_
20be0 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b  finalize(pStmt);
20bf0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 61  .  }else{.    ra
20c00 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  w_printf(stderr,
20c10 20 22 75 6e 61 62 6c 65 20 74 6f 20 72 65 61 64   "unable to read
20c20 20 64 61 74 61 62 61 73 65 20 68 65 61 64 65 72   database header
20c30 5c 6e 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  \n");.    sqlite
20c40 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74  3_finalize(pStmt
20c50 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  );.    return 1;
20c60 0a 20 20 7d 0a 20 20 69 20 3d 20 67 65 74 32 62  .  }.  i = get2b
20c70 79 74 65 49 6e 74 28 61 48 64 72 2b 31 36 29 3b  yteInt(aHdr+16);
20c80 0a 20 20 69 66 28 20 69 3d 3d 31 20 29 20 69 20  .  if( i==1 ) i 
20c90 3d 20 36 35 35 33 36 3b 0a 20 20 75 74 66 38 5f  = 65536;.  utf8_
20ca0 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
20cb0 25 2d 32 30 73 20 25 64 5c 6e 22 2c 20 22 64 61  %-20s %d\n", "da
20cc0 74 61 62 61 73 65 20 70 61 67 65 20 73 69 7a 65  tabase page size
20cd0 3a 22 2c 20 69 29 3b 0a 20 20 75 74 66 38 5f 70  :", i);.  utf8_p
20ce0 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25  rintf(p->out, "%
20cf0 2d 32 30 73 20 25 64 5c 6e 22 2c 20 22 77 72 69  -20s %d\n", "wri
20d00 74 65 20 66 6f 72 6d 61 74 3a 22 2c 20 61 48 64  te format:", aHd
20d10 72 5b 31 38 5d 29 3b 0a 20 20 75 74 66 38 5f 70  r[18]);.  utf8_p
20d20 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25  rintf(p->out, "%
20d30 2d 32 30 73 20 25 64 5c 6e 22 2c 20 22 72 65 61  -20s %d\n", "rea
20d40 64 20 66 6f 72 6d 61 74 3a 22 2c 20 61 48 64 72  d format:", aHdr
20d50 5b 31 39 5d 29 3b 0a 20 20 75 74 66 38 5f 70 72  [19]);.  utf8_pr
20d60 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 2d  intf(p->out, "%-
20d70 32 30 73 20 25 64 5c 6e 22 2c 20 22 72 65 73 65  20s %d\n", "rese
20d80 72 76 65 64 20 62 79 74 65 73 3a 22 2c 20 61 48  rved bytes:", aH
20d90 64 72 5b 32 30 5d 29 3b 0a 20 20 66 6f 72 28 69  dr[20]);.  for(i
20da0 3d 30 3b 20 69 3c 41 72 72 61 79 53 69 7a 65 28  =0; i<ArraySize(
20db0 61 46 69 65 6c 64 29 3b 20 69 2b 2b 29 7b 0a 20  aField); i++){. 
20dc0 20 20 20 69 6e 74 20 6f 66 73 74 20 3d 20 61 46     int ofst = aF
20dd0 69 65 6c 64 5b 69 5d 2e 6f 66 73 74 3b 0a 20 20  ield[i].ofst;.  
20de0 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 76    unsigned int v
20df0 61 6c 20 3d 20 67 65 74 34 62 79 74 65 49 6e 74  al = get4byteInt
20e00 28 61 48 64 72 20 2b 20 6f 66 73 74 29 3b 0a 20  (aHdr + ofst);. 
20e10 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70     utf8_printf(p
20e20 2d 3e 6f 75 74 2c 20 22 25 2d 32 30 73 20 25 75  ->out, "%-20s %u
20e30 22 2c 20 61 46 69 65 6c 64 5b 69 5d 2e 7a 4e 61  ", aField[i].zNa
20e40 6d 65 2c 20 76 61 6c 29 3b 0a 20 20 20 20 73 77  me, val);.    sw
20e50 69 74 63 68 28 20 6f 66 73 74 20 29 7b 0a 20 20  itch( ofst ){.  
20e60 20 20 20 20 63 61 73 65 20 35 36 3a 20 7b 0a 20      case 56: {. 
20e70 20 20 20 20 20 20 20 69 66 28 20 76 61 6c 3d 3d         if( val==
20e80 31 20 29 20 72 61 77 5f 70 72 69 6e 74 66 28 70  1 ) raw_printf(p
20e90 2d 3e 6f 75 74 2c 20 22 20 28 75 74 66 38 29 22  ->out, " (utf8)"
20ea0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 76  );.        if( v
20eb0 61 6c 3d 3d 32 20 29 20 72 61 77 5f 70 72 69 6e  al==2 ) raw_prin
20ec0 74 66 28 70 2d 3e 6f 75 74 2c 20 22 20 28 75 74  tf(p->out, " (ut
20ed0 66 31 36 6c 65 29 22 29 3b 0a 20 20 20 20 20 20  f16le)");.      
20ee0 20 20 69 66 28 20 76 61 6c 3d 3d 33 20 29 20 72    if( val==3 ) r
20ef0 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  aw_printf(p->out
20f00 2c 20 22 20 28 75 74 66 31 36 62 65 29 22 29 3b  , " (utf16be)");
20f10 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
20f20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d     raw_printf(p-
20f30 3e 6f 75 74 2c 20 22 5c 6e 22 29 3b 0a 20 20 7d  >out, "\n");.  }
20f40 0a 20 20 69 66 28 20 7a 44 62 3d 3d 30 20 29 7b  .  if( zDb==0 ){
20f50 0a 20 20 20 20 7a 53 63 68 65 6d 61 54 61 62 20  .    zSchemaTab 
20f60 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
20f70 66 28 22 6d 61 69 6e 2e 73 71 6c 69 74 65 5f 6d  f("main.sqlite_m
20f80 61 73 74 65 72 22 29 3b 0a 20 20 7d 65 6c 73 65  aster");.  }else
20f90 20 69 66 28 20 73 74 72 63 6d 70 28 7a 44 62 2c   if( strcmp(zDb,
20fa0 22 74 65 6d 70 22 29 3d 3d 30 20 29 7b 0a 20 20  "temp")==0 ){.  
20fb0 20 20 7a 53 63 68 65 6d 61 54 61 62 20 3d 20 73    zSchemaTab = s
20fc0 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
20fd0 25 73 22 2c 20 22 73 71 6c 69 74 65 5f 74 65 6d  %s", "sqlite_tem
20fe0 70 5f 6d 61 73 74 65 72 22 29 3b 0a 20 20 7d 65  p_master");.  }e
20ff0 6c 73 65 7b 0a 20 20 20 20 7a 53 63 68 65 6d 61  lse{.    zSchema
21000 54 61 62 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  Tab = sqlite3_mp
21010 72 69 6e 74 66 28 22 5c 22 25 77 5c 22 2e 73 71  rintf("\"%w\".sq
21020 6c 69 74 65 5f 6d 61 73 74 65 72 22 2c 20 7a 44  lite_master", zD
21030 62 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d  b);.  }.  for(i=
21040 30 3b 20 69 3c 41 72 72 61 79 53 69 7a 65 28 61  0; i<ArraySize(a
21050 51 75 65 72 79 29 3b 20 69 2b 2b 29 7b 0a 20 20  Query); i++){.  
21060 20 20 63 68 61 72 20 2a 7a 53 71 6c 20 3d 20 73    char *zSql = s
21070 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 61  qlite3_mprintf(a
21080 51 75 65 72 79 5b 69 5d 2e 7a 53 71 6c 2c 20 7a  Query[i].zSql, z
21090 53 63 68 65 6d 61 54 61 62 29 3b 0a 20 20 20 20  SchemaTab);.    
210a0 69 6e 74 20 76 61 6c 20 3d 20 64 62 5f 69 6e 74  int val = db_int
210b0 28 70 2c 20 7a 53 71 6c 29 3b 0a 20 20 20 20 73  (p, zSql);.    s
210c0 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c  qlite3_free(zSql
210d0 29 3b 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e  );.    utf8_prin
210e0 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 2d 32 30  tf(p->out, "%-20
210f0 73 20 25 64 5c 6e 22 2c 20 61 51 75 65 72 79 5b  s %d\n", aQuery[
21100 69 5d 2e 7a 4e 61 6d 65 2c 20 76 61 6c 29 3b 0a  i].zName, val);.
21110 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72    }.  sqlite3_fr
21120 65 65 28 7a 53 63 68 65 6d 61 54 61 62 29 3b 0a  ee(zSchemaTab);.
21130 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
21140 2a 0a 2a 2a 20 50 72 69 6e 74 20 74 68 65 20 63  *.** Print the c
21150 75 72 72 65 6e 74 20 73 71 6c 69 74 65 33 5f 65  urrent sqlite3_e
21160 72 72 6d 73 67 28 29 20 76 61 6c 75 65 20 74 6f  rrmsg() value to
21170 20 73 74 64 65 72 72 20 61 6e 64 20 72 65 74 75   stderr and retu
21180 72 6e 20 31 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rn 1..*/.static 
21190 69 6e 74 20 73 68 65 6c 6c 44 61 74 61 62 61 73  int shellDatabas
211a0 65 45 72 72 6f 72 28 73 71 6c 69 74 65 33 20 2a  eError(sqlite3 *
211b0 64 62 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  db){.  const cha
211c0 72 20 2a 7a 45 72 72 20 3d 20 73 71 6c 69 74 65  r *zErr = sqlite
211d0 33 5f 65 72 72 6d 73 67 28 64 62 29 3b 0a 20 20  3_errmsg(db);.  
211e0 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65  utf8_printf(stde
211f0 72 72 2c 20 22 45 72 72 6f 72 3a 20 25 73 5c 6e  rr, "Error: %s\n
21200 22 2c 20 7a 45 72 72 29 3b 0a 20 20 72 65 74 75  ", zErr);.  retu
21210 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  rn 1;.}../*.** C
21220 6f 6d 70 61 72 65 20 74 68 65 20 70 61 74 74 65  ompare the patte
21230 72 6e 20 69 6e 20 7a 47 6c 6f 62 5b 5d 20 61 67  rn in zGlob[] ag
21240 61 69 6e 73 74 20 74 68 65 20 74 65 78 74 20 69  ainst the text i
21250 6e 20 7a 5b 5d 2e 20 20 52 65 74 75 72 6e 20 54  n z[].  Return T
21260 52 55 45 0a 2a 2a 20 69 66 20 74 68 65 79 20 6d  RUE.** if they m
21270 61 74 63 68 20 61 6e 64 20 46 41 4c 53 45 20 28  atch and FALSE (
21280 30 29 20 69 66 20 74 68 65 79 20 64 6f 20 6e 6f  0) if they do no
21290 74 20 6d 61 74 63 68 2e 0a 2a 2a 0a 2a 2a 20 47  t match..**.** G
212a0 6c 6f 62 62 69 6e 67 20 72 75 6c 65 73 3a 0a 2a  lobbing rules:.*
212b0 2a 0a 2a 2a 20 20 20 20 20 20 27 2a 27 20 20 20  *.**      '*'   
212c0 20 20 20 20 4d 61 74 63 68 65 73 20 61 6e 79 20      Matches any 
212d0 73 65 71 75 65 6e 63 65 20 6f 66 20 7a 65 72 6f  sequence of zero
212e0 20 6f 72 20 6d 6f 72 65 20 63 68 61 72 61 63 74   or more charact
212f0 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  ers..**.**      
21300 27 3f 27 20 20 20 20 20 20 20 4d 61 74 63 68 65  '?'       Matche
21310 73 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 63 68  s exactly one ch
21320 61 72 61 63 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 20  aracter..**.**  
21330 20 20 20 5b 2e 2e 2e 5d 20 20 20 20 20 20 4d 61     [...]      Ma
21340 74 63 68 65 73 20 6f 6e 65 20 63 68 61 72 61 63  tches one charac
21350 74 65 72 20 66 72 6f 6d 20 74 68 65 20 65 6e 63  ter from the enc
21360 6c 6f 73 65 64 20 6c 69 73 74 20 6f 66 0a 2a 2a  losed list of.**
21370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21380 63 68 61 72 61 63 74 65 72 73 2e 0a 2a 2a 0a 2a  characters..**.*
21390 2a 20 20 20 20 20 5b 5e 2e 2e 2e 5d 20 20 20 20  *     [^...]    
213a0 20 4d 61 74 63 68 65 73 20 6f 6e 65 20 63 68 61   Matches one cha
213b0 72 61 63 74 65 72 20 6e 6f 74 20 69 6e 20 74 68  racter not in th
213c0 65 20 65 6e 63 6c 6f 73 65 64 20 6c 69 73 74 2e  e enclosed list.
213d0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 27 23 27 20  .**.**      '#' 
213e0 20 20 20 20 20 20 4d 61 74 63 68 65 73 20 61 6e        Matches an
213f0 79 20 73 65 71 75 65 6e 63 65 20 6f 66 20 6f 6e  y sequence of on
21400 65 20 6f 72 20 6d 6f 72 65 20 64 69 67 69 74 73  e or more digits
21410 20 77 69 74 68 20 61 6e 0a 2a 2a 20 20 20 20 20   with an.**     
21420 20 20 20 20 20 20 20 20 20 20 20 6f 70 74 69 6f             optio
21430 6e 61 6c 20 2b 20 6f 72 20 2d 20 73 69 67 6e 20  nal + or - sign 
21440 69 6e 20 66 72 6f 6e 74 0a 2a 2a 0a 2a 2a 20 20  in front.**.**  
21450 20 20 20 20 27 20 27 20 20 20 20 20 20 20 41 6e      ' '       An
21460 79 20 73 70 61 6e 20 6f 66 20 77 68 69 74 65 73  y span of whites
21470 70 61 63 65 20 6d 61 74 63 68 65 73 20 61 6e 79  pace matches any
21480 20 6f 74 68 65 72 20 73 70 61 6e 20 6f 66 0a 2a   other span of.*
21490 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
214a0 20 77 68 69 74 65 73 70 61 63 65 2e 0a 2a 2a 0a   whitespace..**.
214b0 2a 2a 20 45 78 74 72 61 20 77 68 69 74 65 73 70  ** Extra whitesp
214c0 61 63 65 20 61 74 20 74 68 65 20 65 6e 64 20 6f  ace at the end o
214d0 66 20 7a 5b 5d 20 69 73 20 69 67 6e 6f 72 65 64  f z[] is ignored
214e0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
214f0 74 65 73 74 63 61 73 65 5f 67 6c 6f 62 28 63 6f  testcase_glob(co
21500 6e 73 74 20 63 68 61 72 20 2a 7a 47 6c 6f 62 2c  nst char *zGlob,
21510 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b   const char *z){
21520 0a 20 20 69 6e 74 20 63 2c 20 63 32 3b 0a 20 20  .  int c, c2;.  
21530 69 6e 74 20 69 6e 76 65 72 74 3b 0a 20 20 69 6e  int invert;.  in
21540 74 20 73 65 65 6e 3b 0a 0a 20 20 77 68 69 6c 65  t seen;..  while
21550 28 20 28 63 20 3d 20 28 2a 28 7a 47 6c 6f 62 2b  ( (c = (*(zGlob+
21560 2b 29 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 69  +)))!=0 ){.    i
21570 66 28 20 49 73 53 70 61 63 65 28 63 29 20 29 7b  f( IsSpace(c) ){
21580 0a 20 20 20 20 20 20 69 66 28 20 21 49 73 53 70  .      if( !IsSp
21590 61 63 65 28 2a 7a 29 20 29 20 72 65 74 75 72 6e  ace(*z) ) return
215a0 20 30 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28   0;.      while(
215b0 20 49 73 53 70 61 63 65 28 2a 7a 47 6c 6f 62 29   IsSpace(*zGlob)
215c0 20 29 20 7a 47 6c 6f 62 2b 2b 3b 0a 20 20 20 20   ) zGlob++;.    
215d0 20 20 77 68 69 6c 65 28 20 49 73 53 70 61 63 65    while( IsSpace
215e0 28 2a 7a 29 20 29 20 7a 2b 2b 3b 0a 20 20 20 20  (*z) ) z++;.    
215f0 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 2a 27  }else if( c=='*'
21600 20 29 7b 0a 20 20 20 20 20 20 77 68 69 6c 65 28   ){.      while(
21610 20 28 63 3d 28 2a 28 7a 47 6c 6f 62 2b 2b 29 29   (c=(*(zGlob++))
21620 29 20 3d 3d 20 27 2a 27 20 7c 7c 20 63 3d 3d 27  ) == '*' || c=='
21630 3f 27 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  ?' ){.        if
21640 28 20 63 3d 3d 27 3f 27 20 26 26 20 28 2a 28 7a  ( c=='?' && (*(z
21650 2b 2b 29 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  ++))==0 ) return
21660 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
21670 20 20 69 66 28 20 63 3d 3d 30 20 29 7b 0a 20 20    if( c==0 ){.  
21680 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
21690 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
216a0 63 3d 3d 27 5b 27 20 29 7b 0a 20 20 20 20 20 20  c=='[' ){.      
216b0 20 20 77 68 69 6c 65 28 20 2a 7a 20 26 26 20 74    while( *z && t
216c0 65 73 74 63 61 73 65 5f 67 6c 6f 62 28 7a 47 6c  estcase_glob(zGl
216d0 6f 62 2d 31 2c 7a 29 3d 3d 30 20 29 7b 0a 20 20  ob-1,z)==0 ){.  
216e0 20 20 20 20 20 20 20 20 7a 2b 2b 3b 0a 20 20 20          z++;.   
216f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72       }.        r
21700 65 74 75 72 6e 20 28 2a 7a 29 21 3d 30 3b 0a 20  eturn (*z)!=0;. 
21710 20 20 20 20 20 7d 0a 20 20 20 20 20 20 77 68 69       }.      whi
21720 6c 65 28 20 28 63 32 20 3d 20 28 2a 28 7a 2b 2b  le( (c2 = (*(z++
21730 29 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  )))!=0 ){.      
21740 20 20 77 68 69 6c 65 28 20 63 32 21 3d 63 20 29    while( c2!=c )
21750 7b 0a 20 20 20 20 20 20 20 20 20 20 63 32 20 3d  {.          c2 =
21760 20 2a 28 7a 2b 2b 29 3b 0a 20 20 20 20 20 20 20   *(z++);.       
21770 20 20 20 69 66 28 20 63 32 3d 3d 30 20 29 20 72     if( c2==0 ) r
21780 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 20  eturn 0;.       
21790 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 74   }.        if( t
217a0 65 73 74 63 61 73 65 5f 67 6c 6f 62 28 7a 47 6c  estcase_glob(zGl
217b0 6f 62 2c 7a 29 20 29 20 72 65 74 75 72 6e 20 31  ob,z) ) return 1
217c0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
217d0 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 65  return 0;.    }e
217e0 6c 73 65 20 69 66 28 20 63 3d 3d 27 3f 27 20 29  lse if( c=='?' )
217f0 7b 0a 20 20 20 20 20 20 69 66 28 20 28 2a 28 7a  {.      if( (*(z
21800 2b 2b 29 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  ++))==0 ) return
21810 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66   0;.    }else if
21820 28 20 63 3d 3d 27 5b 27 20 29 7b 0a 20 20 20 20  ( c=='[' ){.    
21830 20 20 69 6e 74 20 70 72 69 6f 72 5f 63 20 3d 20    int prior_c = 
21840 30 3b 0a 20 20 20 20 20 20 73 65 65 6e 20 3d 20  0;.      seen = 
21850 30 3b 0a 20 20 20 20 20 20 69 6e 76 65 72 74 20  0;.      invert 
21860 3d 20 30 3b 0a 20 20 20 20 20 20 63 20 3d 20 2a  = 0;.      c = *
21870 28 7a 2b 2b 29 3b 0a 20 20 20 20 20 20 69 66 28  (z++);.      if(
21880 20 63 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30   c==0 ) return 0
21890 3b 0a 20 20 20 20 20 20 63 32 20 3d 20 2a 28 7a  ;.      c2 = *(z
218a0 47 6c 6f 62 2b 2b 29 3b 0a 20 20 20 20 20 20 69  Glob++);.      i
218b0 66 28 20 63 32 3d 3d 27 5e 27 20 29 7b 0a 20 20  f( c2=='^' ){.  
218c0 20 20 20 20 20 20 69 6e 76 65 72 74 20 3d 20 31        invert = 1
218d0 3b 0a 20 20 20 20 20 20 20 20 63 32 20 3d 20 2a  ;.        c2 = *
218e0 28 7a 47 6c 6f 62 2b 2b 29 3b 0a 20 20 20 20 20  (zGlob++);.     
218f0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63 32 3d   }.      if( c2=
21900 3d 27 5d 27 20 29 7b 0a 20 20 20 20 20 20 20 20  =']' ){.        
21910 69 66 28 20 63 3d 3d 27 5d 27 20 29 20 73 65 65  if( c==']' ) see
21920 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 63  n = 1;.        c
21930 32 20 3d 20 2a 28 7a 47 6c 6f 62 2b 2b 29 3b 0a  2 = *(zGlob++);.
21940 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 77 68        }.      wh
21950 69 6c 65 28 20 63 32 20 26 26 20 63 32 21 3d 27  ile( c2 && c2!='
21960 5d 27 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  ]' ){.        if
21970 28 20 63 32 3d 3d 27 2d 27 20 26 26 20 7a 47 6c  ( c2=='-' && zGl
21980 6f 62 5b 30 5d 21 3d 27 5d 27 20 26 26 20 7a 47  ob[0]!=']' && zG
21990 6c 6f 62 5b 30 5d 21 3d 30 20 26 26 20 70 72 69  lob[0]!=0 && pri
219a0 6f 72 5f 63 3e 30 20 29 7b 0a 20 20 20 20 20 20  or_c>0 ){.      
219b0 20 20 20 20 63 32 20 3d 20 2a 28 7a 47 6c 6f 62      c2 = *(zGlob
219c0 2b 2b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ++);.          i
219d0 66 28 20 63 3e 3d 70 72 69 6f 72 5f 63 20 26 26  f( c>=prior_c &&
219e0 20 63 3c 3d 63 32 20 29 20 73 65 65 6e 20 3d 20   c<=c2 ) seen = 
219f0 31 3b 0a 20 20 20 20 20 20 20 20 20 20 70 72 69  1;.          pri
21a00 6f 72 5f 63 20 3d 20 30 3b 0a 20 20 20 20 20 20  or_c = 0;.      
21a10 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
21a20 20 20 20 69 66 28 20 63 3d 3d 63 32 20 29 7b 0a     if( c==c2 ){.
21a30 20 20 20 20 20 20 20 20 20 20 20 20 73 65 65 6e              seen
21a40 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
21a50 7d 0a 20 20 20 20 20 20 20 20 20 20 70 72 69 6f  }.          prio
21a60 72 5f 63 20 3d 20 63 32 3b 0a 20 20 20 20 20 20  r_c = c2;.      
21a70 20 20 7d 0a 20 20 20 20 20 20 20 20 63 32 20 3d    }.        c2 =
21a80 20 2a 28 7a 47 6c 6f 62 2b 2b 29 3b 0a 20 20 20   *(zGlob++);.   
21a90 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63     }.      if( c
21aa0 32 3d 3d 30 20 7c 7c 20 28 73 65 65 6e 20 5e 20  2==0 || (seen ^ 
21ab0 69 6e 76 65 72 74 29 3d 3d 30 20 29 20 72 65 74  invert)==0 ) ret
21ac0 75 72 6e 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  urn 0;.    }else
21ad0 20 69 66 28 20 63 3d 3d 27 23 27 20 29 7b 0a 20   if( c=='#' ){. 
21ae0 20 20 20 20 20 69 66 28 20 28 7a 5b 30 5d 3d 3d       if( (z[0]==
21af0 27 2d 27 20 7c 7c 20 7a 5b 30 5d 3d 3d 27 2b 27  '-' || z[0]=='+'
21b00 29 20 26 26 20 49 73 44 69 67 69 74 28 7a 5b 31  ) && IsDigit(z[1
21b10 5d 29 20 29 20 7a 2b 2b 3b 0a 20 20 20 20 20 20  ]) ) z++;.      
21b20 69 66 28 20 21 49 73 44 69 67 69 74 28 7a 5b 30  if( !IsDigit(z[0
21b30 5d 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  ]) ) return 0;. 
21b40 20 20 20 20 20 7a 2b 2b 3b 0a 20 20 20 20 20 20       z++;.      
21b50 77 68 69 6c 65 28 20 49 73 44 69 67 69 74 28 7a  while( IsDigit(z
21b60 5b 30 5d 29 20 29 7b 20 7a 2b 2b 3b 20 7d 0a 20  [0]) ){ z++; }. 
21b70 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
21b80 69 66 28 20 63 21 3d 28 2a 28 7a 2b 2b 29 29 20  if( c!=(*(z++)) 
21b90 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20  ) return 0;.    
21ba0 7d 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 49  }.  }.  while( I
21bb0 73 53 70 61 63 65 28 2a 7a 29 20 29 7b 20 7a 2b  sSpace(*z) ){ z+
21bc0 2b 3b 20 7d 0a 20 20 72 65 74 75 72 6e 20 2a 7a  +; }.  return *z
21bd0 3d 3d 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43  ==0;.}.../*.** C
21be0 6f 6d 70 61 72 65 20 74 68 65 20 73 74 72 69 6e  ompare the strin
21bf0 67 20 61 73 20 61 20 63 6f 6d 6d 61 6e 64 2d 6c  g as a command-l
21c00 69 6e 65 20 6f 70 74 69 6f 6e 20 77 69 74 68 20  ine option with 
21c10 65 69 74 68 65 72 20 6f 6e 65 20 6f 72 20 74 77  either one or tw
21c20 6f 0a 2a 2a 20 69 6e 69 74 69 61 6c 20 22 2d 22  o.** initial "-"
21c30 20 63 68 61 72 61 63 74 65 72 73 2e 0a 2a 2f 0a   characters..*/.
21c40 73 74 61 74 69 63 20 69 6e 74 20 6f 70 74 69 6f  static int optio
21c50 6e 4d 61 74 63 68 28 63 6f 6e 73 74 20 63 68 61  nMatch(const cha
21c60 72 20 2a 7a 53 74 72 2c 20 63 6f 6e 73 74 20 63  r *zStr, const c
21c70 68 61 72 20 2a 7a 4f 70 74 29 7b 0a 20 20 69 66  har *zOpt){.  if
21c80 28 20 7a 53 74 72 5b 30 5d 21 3d 27 2d 27 20 29  ( zStr[0]!='-' )
21c90 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7a 53 74   return 0;.  zSt
21ca0 72 2b 2b 3b 0a 20 20 69 66 28 20 7a 53 74 72 5b  r++;.  if( zStr[
21cb0 30 5d 3d 3d 27 2d 27 20 29 20 7a 53 74 72 2b 2b  0]=='-' ) zStr++
21cc0 3b 0a 20 20 72 65 74 75 72 6e 20 73 74 72 63 6d  ;.  return strcm
21cd0 70 28 7a 53 74 72 2c 20 7a 4f 70 74 29 3d 3d 30  p(zStr, zOpt)==0
21ce0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74  ;.}../*.** Delet
21cf0 65 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a 69 6e 74  e a file..*/.int
21d00 20 73 68 65 6c 6c 44 65 6c 65 74 65 46 69 6c 65   shellDeleteFile
21d10 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69  (const char *zFi
21d20 6c 65 6e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 72  lename){.  int r
21d30 63 3b 0a 23 69 66 64 65 66 20 5f 57 49 4e 33 32  c;.#ifdef _WIN32
21d40 0a 20 20 77 63 68 61 72 5f 74 20 2a 7a 20 3d 20  .  wchar_t *z = 
21d50 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 75 74  sqlite3_win32_ut
21d60 66 38 5f 74 6f 5f 75 6e 69 63 6f 64 65 28 7a 46  f8_to_unicode(zF
21d70 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 72 63 20 3d  ilename);.  rc =
21d80 20 5f 77 75 6e 6c 69 6e 6b 28 7a 29 3b 0a 20 20   _wunlink(z);.  
21d90 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 29 3b  sqlite3_free(z);
21da0 0a 23 65 6c 73 65 0a 20 20 72 63 20 3d 20 75 6e  .#else.  rc = un
21db0 6c 69 6e 6b 28 7a 46 69 6c 65 6e 61 6d 65 29 3b  link(zFilename);
21dc0 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e  .#endif.  return
21dd0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72   rc;.}../*.** Tr
21de0 79 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20  y to delete the 
21df0 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 28  temporary file (
21e00 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e 65 29  if there is one)
21e10 20 61 6e 64 20 66 72 65 65 20 74 68 65 0a 2a 2a   and free the.**
21e20 20 6d 65 6d 6f 72 79 20 75 73 65 64 20 74 6f 20   memory used to 
21e30 68 6f 6c 64 20 74 68 65 20 6e 61 6d 65 20 6f 66  hold the name of
21e40 20 74 68 65 20 74 65 6d 70 20 66 69 6c 65 2e 0a   the temp file..
21e50 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
21e60 6c 65 61 72 54 65 6d 70 46 69 6c 65 28 53 68 65  learTempFile(She
21e70 6c 6c 53 74 61 74 65 20 2a 70 29 7b 0a 20 20 69  llState *p){.  i
21e80 66 28 20 70 2d 3e 7a 54 65 6d 70 46 69 6c 65 3d  f( p->zTempFile=
21e90 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  =0 ) return;.  i
21ea0 66 28 20 70 2d 3e 64 6f 58 64 67 4f 70 65 6e 20  f( p->doXdgOpen 
21eb0 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
21ec0 73 68 65 6c 6c 44 65 6c 65 74 65 46 69 6c 65 28  shellDeleteFile(
21ed0 70 2d 3e 7a 54 65 6d 70 46 69 6c 65 29 20 29 20  p->zTempFile) ) 
21ee0 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65  return;.  sqlite
21ef0 33 5f 66 72 65 65 28 70 2d 3e 7a 54 65 6d 70 46  3_free(p->zTempF
21f00 69 6c 65 29 3b 0a 20 20 70 2d 3e 7a 54 65 6d 70  ile);.  p->zTemp
21f10 46 69 6c 65 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  File = 0;.}../*.
21f20 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20  ** Create a new 
21f30 74 65 6d 70 20 66 69 6c 65 20 6e 61 6d 65 20 77  temp file name w
21f40 69 74 68 20 74 68 65 20 67 69 76 65 6e 20 73 75  ith the given su
21f50 66 66 69 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ffix..*/.static 
21f60 76 6f 69 64 20 6e 65 77 54 65 6d 70 46 69 6c 65  void newTempFile
21f70 28 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 2c 20  (ShellState *p, 
21f80 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 75 66  const char *zSuf
21f90 66 69 78 29 7b 0a 20 20 63 6c 65 61 72 54 65 6d  fix){.  clearTem
21fa0 70 46 69 6c 65 28 70 29 3b 0a 20 20 73 71 6c 69  pFile(p);.  sqli
21fb0 74 65 33 5f 66 72 65 65 28 70 2d 3e 7a 54 65 6d  te3_free(p->zTem
21fc0 70 46 69 6c 65 29 3b 0a 20 20 70 2d 3e 7a 54 65  pFile);.  p->zTe
21fd0 6d 70 46 69 6c 65 20 3d 20 30 3b 0a 20 20 69 66  mpFile = 0;.  if
21fe0 28 20 70 2d 3e 64 62 20 29 7b 0a 20 20 20 20 73  ( p->db ){.    s
21ff0 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74  qlite3_file_cont
22000 72 6f 6c 28 70 2d 3e 64 62 2c 20 30 2c 20 53 51  rol(p->db, 0, SQ
22010 4c 49 54 45 5f 46 43 4e 54 4c 5f 54 45 4d 50 46  LITE_FCNTL_TEMPF
22020 49 4c 45 4e 41 4d 45 2c 20 26 70 2d 3e 7a 54 65  ILENAME, &p->zTe
22030 6d 70 46 69 6c 65 29 3b 0a 20 20 7d 0a 20 20 69  mpFile);.  }.  i
22040 66 28 20 70 2d 3e 7a 54 65 6d 70 46 69 6c 65 3d  f( p->zTempFile=
22050 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
22060 33 5f 75 69 6e 74 36 34 20 72 3b 0a 20 20 20 20  3_uint64 r;.    
22070 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65  sqlite3_randomne
22080 73 73 28 73 69 7a 65 6f 66 28 72 29 2c 20 26 72  ss(sizeof(r), &r
22090 29 3b 0a 20 20 20 20 70 2d 3e 7a 54 65 6d 70 46  );.    p->zTempF
220a0 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  ile = sqlite3_mp
220b0 72 69 6e 74 66 28 22 74 65 6d 70 25 6c 6c 78 2e  rintf("temp%llx.
220c0 25 73 22 2c 20 72 2c 20 7a 53 75 66 66 69 78 29  %s", r, zSuffix)
220d0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
220e0 2d 3e 7a 54 65 6d 70 46 69 6c 65 20 3d 20 73 71  ->zTempFile = sq
220f0 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25  lite3_mprintf("%
22100 7a 2e 25 73 22 2c 20 70 2d 3e 7a 54 65 6d 70 46  z.%s", p->zTempF
22110 69 6c 65 2c 20 7a 53 75 66 66 69 78 29 3b 0a 20  ile, zSuffix);. 
22120 20 7d 0a 20 20 69 66 28 20 70 2d 3e 7a 54 65 6d   }.  if( p->zTem
22130 70 46 69 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20  pFile==0 ){.    
22140 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72  raw_printf(stder
22150 72 2c 20 22 6f 75 74 20 6f 66 20 6d 65 6d 6f 72  r, "out of memor
22160 79 5c 6e 22 29 3b 0a 20 20 20 20 65 78 69 74 28  y\n");.    exit(
22170 31 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a  1);.  }.}.../*.*
22180 2a 20 54 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  * The implementa
22190 74 69 6f 6e 20 6f 66 20 53 51 4c 20 73 63 61 6c  tion of SQL scal
221a0 61 72 20 66 75 6e 63 74 69 6f 6e 20 66 6b 65 79  ar function fkey
221b0 5f 63 6f 6c 6c 61 74 65 5f 63 6c 61 75 73 65 28  _collate_clause(
221c0 29 2c 20 75 73 65 64 0a 2a 2a 20 62 79 20 74 68  ), used.** by th
221d0 65 20 22 2e 6c 69 6e 74 20 66 6b 65 79 2d 69 6e  e ".lint fkey-in
221e0 64 65 78 65 73 22 20 63 6f 6d 6d 61 6e 64 2e 20  dexes" command. 
221f0 54 68 69 73 20 73 63 61 6c 61 72 20 66 75 6e 63  This scalar func
22200 74 69 6f 6e 20 69 73 20 61 6c 77 61 79 73 0a 2a  tion is always.*
22210 2a 20 63 61 6c 6c 65 64 20 77 69 74 68 20 66 6f  * called with fo
22220 75 72 20 61 72 67 75 6d 65 6e 74 73 20 2d 20 74  ur arguments - t
22230 68 65 20 70 61 72 65 6e 74 20 74 61 62 6c 65 20  he parent table 
22240 6e 61 6d 65 2c 20 74 68 65 20 70 61 72 65 6e 74  name, the parent
22250 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 2c 0a 2a 2a   column name,.**
22260 20 74 68 65 20 63 68 69 6c 64 20 74 61 62 6c 65   the child table
22270 20 6e 61 6d 65 20 61 6e 64 20 74 68 65 20 63 68   name and the ch
22280 69 6c 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 2e  ild column name.
22290 0a 2a 2a 0a 2a 2a 20 20 20 66 6b 65 79 5f 63 6f  .**.**   fkey_co
222a0 6c 6c 61 74 65 5f 63 6c 61 75 73 65 28 27 70 61  llate_clause('pa
222b0 72 65 6e 74 2d 74 61 62 27 2c 20 27 70 61 72 65  rent-tab', 'pare
222c0 6e 74 2d 63 6f 6c 27 2c 20 27 63 68 69 6c 64 2d  nt-col', 'child-
222d0 74 61 62 27 2c 20 27 63 68 69 6c 64 2d 63 6f 6c  tab', 'child-col
222e0 27 29 0a 2a 2a 0a 2a 2a 20 49 66 20 65 69 74 68  ').**.** If eith
222f0 65 72 20 6f 66 20 74 68 65 20 6e 61 6d 65 64 20  er of the named 
22300 74 61 62 6c 65 73 20 6f 72 20 63 6f 6c 75 6d 6e  tables or column
22310 73 20 64 6f 20 6e 6f 74 20 65 78 69 73 74 2c 20  s do not exist, 
22320 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  this function.**
22330 20 72 65 74 75 72 6e 73 20 61 6e 20 65 6d 70 74   returns an empt
22340 79 20 73 74 72 69 6e 67 2e 20 41 6e 20 65 6d 70  y string. An emp
22350 74 79 20 73 74 72 69 6e 67 20 69 73 20 61 6c 73  ty string is als
22360 6f 20 72 65 74 75 72 6e 65 64 20 69 66 20 62 6f  o returned if bo
22370 74 68 20 74 61 62 6c 65 73 0a 2a 2a 20 61 6e 64  th tables.** and
22380 20 63 6f 6c 75 6d 6e 73 20 65 78 69 73 74 20 62   columns exist b
22390 75 74 20 68 61 76 65 20 74 68 65 20 73 61 6d 65  ut have the same
223a0 20 64 65 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69   default collati
223b0 6f 6e 20 73 65 71 75 65 6e 63 65 2e 20 4f 72 2c  on sequence. Or,
223c0 0a 2a 2a 20 69 66 20 62 6f 74 68 20 65 78 69 73  .** if both exis
223d0 74 20 62 75 74 20 74 68 65 20 64 65 66 61 75 6c  t but the defaul
223e0 74 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  t collation sequ
223f0 65 6e 63 65 73 20 61 72 65 20 64 69 66 66 65 72  ences are differ
22400 65 6e 74 2c 20 74 68 69 73 0a 2a 2a 20 66 75 6e  ent, this.** fun
22410 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 68  ction returns th
22420 65 20 73 74 72 69 6e 67 20 22 20 43 4f 4c 4c 41  e string " COLLA
22430 54 45 20 3c 70 61 72 65 6e 74 2d 63 6f 6c 6c 61  TE <parent-colla
22440 74 69 6f 6e 3e 22 2c 20 77 68 65 72 65 0a 2a 2a  tion>", where.**
22450 20 3c 70 61 72 65 6e 74 2d 63 6f 6c 6c 61 74 69   <parent-collati
22460 6f 6e 3e 20 69 73 20 74 68 65 20 64 65 66 61 75  on> is the defau
22470 6c 74 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  lt collation seq
22480 75 65 6e 63 65 20 6f 66 20 74 68 65 20 70 61 72  uence of the par
22490 65 6e 74 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a 73  ent column..*/.s
224a0 74 61 74 69 63 20 76 6f 69 64 20 73 68 65 6c 6c  tatic void shell
224b0 46 6b 65 79 43 6f 6c 6c 61 74 65 43 6c 61 75 73  FkeyCollateClaus
224c0 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e  e(.  sqlite3_con
224d0 74 65 78 74 20 2a 70 43 74 78 2c 0a 20 20 69 6e  text *pCtx,.  in
224e0 74 20 6e 56 61 6c 2c 0a 20 20 73 71 6c 69 74 65  t nVal,.  sqlite
224f0 33 5f 76 61 6c 75 65 20 2a 2a 61 70 56 61 6c 0a  3_value **apVal.
22500 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
22510 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65   = sqlite3_conte
22520 78 74 5f 64 62 5f 68 61 6e 64 6c 65 28 70 43 74  xt_db_handle(pCt
22530 78 29 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  x);.  const char
22540 20 2a 7a 50 61 72 65 6e 74 3b 0a 20 20 63 6f 6e   *zParent;.  con
22550 73 74 20 63 68 61 72 20 2a 7a 50 61 72 65 6e 74  st char *zParent
22560 43 6f 6c 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  Col;.  const cha
22570 72 20 2a 7a 50 61 72 65 6e 74 53 65 71 3b 0a 20  r *zParentSeq;. 
22580 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 68   const char *zCh
22590 69 6c 64 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  ild;.  const cha
225a0 72 20 2a 7a 43 68 69 6c 64 43 6f 6c 3b 0a 20 20  r *zChildCol;.  
225b0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 68 69  const char *zChi
225c0 6c 64 53 65 71 20 3d 20 30 3b 20 20 2f 2a 20 49  ldSeq = 0;  /* I
225d0 6e 69 74 69 61 6c 69 7a 65 20 74 6f 20 61 76 6f  nitialize to avo
225e0 69 64 20 66 61 6c 73 65 2d 70 6f 73 69 74 69 76  id false-positiv
225f0 65 20 77 61 72 6e 69 6e 67 20 2a 2f 0a 20 20 69  e warning */.  i
22600 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74  nt rc;..  assert
22610 28 20 6e 56 61 6c 3d 3d 34 20 29 3b 0a 20 20 7a  ( nVal==4 );.  z
22620 50 61 72 65 6e 74 20 3d 20 28 63 6f 6e 73 74 20  Parent = (const 
22630 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61  char*)sqlite3_va
22640 6c 75 65 5f 74 65 78 74 28 61 70 56 61 6c 5b 30  lue_text(apVal[0
22650 5d 29 3b 0a 20 20 7a 50 61 72 65 6e 74 43 6f 6c  ]);.  zParentCol
22660 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29   = (const char*)
22670 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
22680 78 74 28 61 70 56 61 6c 5b 31 5d 29 3b 0a 20 20  xt(apVal[1]);.  
22690 7a 43 68 69 6c 64 20 3d 20 28 63 6f 6e 73 74 20  zChild = (const 
226a0 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61  char*)sqlite3_va
226b0 6c 75 65 5f 74 65 78 74 28 61 70 56 61 6c 5b 32  lue_text(apVal[2
226c0 5d 29 3b 0a 20 20 7a 43 68 69 6c 64 43 6f 6c 20  ]);.  zChildCol 
226d0 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73  = (const char*)s
226e0 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
226f0 74 28 61 70 56 61 6c 5b 33 5d 29 3b 0a 0a 20 20  t(apVal[3]);..  
22700 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74  sqlite3_result_t
22710 65 78 74 28 70 43 74 78 2c 20 22 22 2c 20 2d 31  ext(pCtx, "", -1
22720 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29  , SQLITE_STATIC)
22730 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
22740 5f 74 61 62 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d 65  _table_column_me
22750 74 61 64 61 74 61 28 0a 20 20 20 20 20 20 64 62  tadata(.      db
22760 2c 20 22 6d 61 69 6e 22 2c 20 7a 50 61 72 65 6e  , "main", zParen
22770 74 2c 20 7a 50 61 72 65 6e 74 43 6f 6c 2c 20 30  t, zParentCol, 0
22780 2c 20 26 7a 50 61 72 65 6e 74 53 65 71 2c 20 30  , &zParentSeq, 0
22790 2c 20 30 2c 20 30 0a 20 20 29 3b 0a 20 20 69 66  , 0, 0.  );.  if
227a0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
227b0 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
227c0 74 65 33 5f 74 61 62 6c 65 5f 63 6f 6c 75 6d 6e  te3_table_column
227d0 5f 6d 65 74 61 64 61 74 61 28 0a 20 20 20 20 20  _metadata(.     
227e0 20 20 20 64 62 2c 20 22 6d 61 69 6e 22 2c 20 7a     db, "main", z
227f0 43 68 69 6c 64 2c 20 7a 43 68 69 6c 64 43 6f 6c  Child, zChildCol
22800 2c 20 30 2c 20 26 7a 43 68 69 6c 64 53 65 71 2c  , 0, &zChildSeq,
22810 20 30 2c 20 30 2c 20 30 0a 20 20 20 20 29 3b 0a   0, 0, 0.    );.
22820 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53    }..  if( rc==S
22830 51 4c 49 54 45 5f 4f 4b 20 26 26 20 73 71 6c 69  QLITE_OK && sqli
22840 74 65 33 5f 73 74 72 69 63 6d 70 28 7a 50 61 72  te3_stricmp(zPar
22850 65 6e 74 53 65 71 2c 20 7a 43 68 69 6c 64 53 65  entSeq, zChildSe
22860 71 29 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a  q) ){.    char *
22870 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  z = sqlite3_mpri
22880 6e 74 66 28 22 20 43 4f 4c 4c 41 54 45 20 25 73  ntf(" COLLATE %s
22890 22 2c 20 7a 50 61 72 65 6e 74 53 65 71 29 3b 0a  ", zParentSeq);.
228a0 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
228b0 6c 74 5f 74 65 78 74 28 70 43 74 78 2c 20 7a 2c  lt_text(pCtx, z,
228c0 20 2d 31 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e   -1, SQLITE_TRAN
228d0 53 49 45 4e 54 29 3b 0a 20 20 20 20 73 71 6c 69  SIENT);.    sqli
228e0 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20 7d  te3_free(z);.  }
228f0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69  .}.../*.** The i
22900 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
22910 20 64 6f 74 2d 63 6f 6d 6d 61 6e 64 20 22 2e 6c   dot-command ".l
22920 69 6e 74 20 66 6b 65 79 2d 69 6e 64 65 78 65 73  int fkey-indexes
22930 22 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  "..*/.static int
22940 20 6c 69 6e 74 46 6b 65 79 49 6e 64 65 78 65 73   lintFkeyIndexes
22950 28 0a 20 20 53 68 65 6c 6c 53 74 61 74 65 20 2a  (.  ShellState *
22960 70 53 74 61 74 65 2c 20 20 20 20 20 20 20 20 20  pState,         
22970 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 73      /* Current s
22980 68 65 6c 6c 20 74 6f 6f 6c 20 73 74 61 74 65 20  hell tool state 
22990 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 7a 41 72  */.  char **azAr
229a0 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g,              
229b0 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66       /* Array of
229c0 20 61 72 67 75 6d 65 6e 74 73 20 70 61 73 73 65   arguments passe
229d0 64 20 74 6f 20 64 6f 74 20 63 6f 6d 6d 61 6e 64  d to dot command
229e0 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 72 67 20 20   */.  int nArg  
229f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22a00 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
22a10 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 61 7a  of entries in az
22a20 41 72 67 5b 5d 20 2a 2f 0a 29 7b 0a 20 20 73 71  Arg[] */.){.  sq
22a30 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 53 74 61  lite3 *db = pSta
22a40 74 65 2d 3e 64 62 3b 20 20 20 20 20 20 20 2f 2a  te->db;       /*
22a50 20 44 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   Database handle
22a60 20 74 6f 20 71 75 65 72 79 20 22 6d 61 69 6e 22   to query "main"
22a70 20 64 62 20 6f 66 20 2a 2f 0a 20 20 46 49 4c 45   db of */.  FILE
22a80 20 2a 6f 75 74 20 3d 20 70 53 74 61 74 65 2d 3e   *out = pState->
22a90 6f 75 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 53  out;        /* S
22aa0 74 72 65 61 6d 20 74 6f 20 77 72 69 74 65 20 6e  tream to write n
22ab0 6f 6e 2d 65 72 72 6f 72 20 6f 75 74 70 75 74 20  on-error output 
22ac0 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 62 56 65 72  to */.  int bVer
22ad0 62 6f 73 65 20 3d 20 30 3b 20 20 20 20 20 20 20  bose = 0;       
22ae0 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 2d 76          /* If -v
22af0 65 72 62 6f 73 65 20 69 73 20 70 72 65 73 65 6e  erbose is presen
22b00 74 20 2a 2f 0a 20 20 69 6e 74 20 62 47 72 6f 75  t */.  int bGrou
22b10 70 42 79 50 61 72 65 6e 74 20 3d 20 30 3b 20 20  pByParent = 0;  
22b20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 2d 67 72         /* If -gr
22b30 6f 75 70 62 79 70 61 72 65 6e 74 20 69 73 20 70  oupbyparent is p
22b40 72 65 73 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  resent */.  int 
22b50 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
22b60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
22b70 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67  o iterate throug
22b80 68 20 61 7a 41 72 67 5b 5d 20 2a 2f 0a 20 20 63  h azArg[] */.  c
22b90 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 6e 64 65  onst char *zInde
22ba0 6e 74 20 3d 20 22 22 3b 20 20 20 20 20 20 20 2f  nt = "";       /
22bb0 2a 20 48 6f 77 20 6d 75 63 68 20 74 6f 20 69 6e  * How much to in
22bc0 64 65 6e 74 20 43 52 45 41 54 45 20 49 4e 44 45  dent CREATE INDE
22bd0 58 20 62 79 20 2a 2f 0a 20 20 69 6e 74 20 72 63  X by */.  int rc
22be0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
22bf0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
22c00 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 73 71  urn code */.  sq
22c10 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 71 6c  lite3_stmt *pSql
22c20 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a   = 0;         /*
22c30 20 43 6f 6d 70 69 6c 65 64 20 76 65 72 73 69 6f   Compiled versio
22c40 6e 20 6f 66 20 53 51 4c 20 73 74 61 74 65 6d 65  n of SQL stateme
22c50 6e 74 20 62 65 6c 6f 77 20 2a 2f 0a 0a 20 20 2f  nt below */..  /
22c60 2a 0a 20 20 2a 2a 20 54 68 69 73 20 53 45 4c 45  *.  ** This SELE
22c70 43 54 20 73 74 61 74 65 6d 65 6e 74 20 72 65 74  CT statement ret
22c80 75 72 6e 73 20 6f 6e 65 20 72 6f 77 20 66 6f 72  urns one row for
22c90 20 65 61 63 68 20 66 6f 72 65 69 67 6e 20 6b 65   each foreign ke
22ca0 79 20 63 6f 6e 73 74 72 61 69 6e 74 0a 20 20 2a  y constraint.  *
22cb0 2a 20 69 6e 20 74 68 65 20 73 63 68 65 6d 61 20  * in the schema 
22cc0 6f 66 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  of the main data
22cd0 62 61 73 65 2e 20 54 68 65 20 63 6f 6c 75 6d 6e  base. The column
22ce0 20 76 61 6c 75 65 73 20 61 72 65 3a 0a 20 20 2a   values are:.  *
22cf0 2a 0a 20 20 2a 2a 20 30 2e 20 54 68 65 20 74 65  *.  ** 0. The te
22d00 78 74 20 6f 66 20 61 6e 20 53 51 4c 20 73 74 61  xt of an SQL sta
22d10 74 65 6d 65 6e 74 20 73 69 6d 69 6c 61 72 20 74  tement similar t
22d20 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  o:.  **.  **    
22d30 20 20 22 45 58 50 4c 41 49 4e 20 51 55 45 52 59    "EXPLAIN QUERY
22d40 20 50 4c 41 4e 20 53 45 4c 45 43 54 20 31 20 46   PLAN SELECT 1 F
22d50 52 4f 4d 20 63 68 69 6c 64 5f 74 61 62 6c 65 20  ROM child_table 
22d60 57 48 45 52 45 20 63 68 69 6c 64 5f 6b 65 79 3d  WHERE child_key=
22d70 3f 22 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  ?".  **.  **    
22d80 54 68 69 73 20 53 45 4c 45 43 54 20 69 73 20 73  This SELECT is s
22d90 69 6d 69 6c 61 72 20 74 6f 20 74 68 65 20 6f 6e  imilar to the on
22da0 65 20 74 68 61 74 20 74 68 65 20 66 6f 72 65 69  e that the forei
22db0 67 6e 20 6b 65 79 73 20 69 6d 70 6c 65 6d 65 6e  gn keys implemen
22dc0 74 61 74 69 6f 6e 0a 20 20 2a 2a 20 20 20 20 6e  tation.  **    n
22dd0 65 65 64 73 20 74 6f 20 72 75 6e 20 69 6e 74 65  eeds to run inte
22de0 72 6e 61 6c 6c 79 20 6f 6e 20 63 68 69 6c 64 20  rnally on child 
22df0 74 61 62 6c 65 73 2e 20 49 66 20 74 68 65 72 65  tables. If there
22e00 20 69 73 20 61 6e 20 69 6e 64 65 78 20 74 68 61   is an index tha
22e10 74 20 63 61 6e 0a 20 20 2a 2a 20 20 20 20 62 65  t can.  **    be
22e20 20 75 73 65 64 20 74 6f 20 6f 70 74 69 6d 69 7a   used to optimiz
22e30 65 20 74 68 69 73 20 71 75 65 72 79 2c 20 74 68  e this query, th
22e40 65 6e 20 69 74 20 63 61 6e 20 61 6c 73 6f 20 62  en it can also b
22e50 65 20 75 73 65 64 20 62 79 20 74 68 65 20 46 4b  e used by the FK
22e60 0a 20 20 2a 2a 20 20 20 20 69 6d 70 6c 65 6d 65  .  **    impleme
22e70 6e 74 61 74 69 6f 6e 20 74 6f 20 6f 70 74 69 6d  ntation to optim
22e80 69 7a 65 20 44 45 4c 45 54 45 20 6f 72 20 55 50  ize DELETE or UP
22e90 44 41 54 45 20 73 74 61 74 65 6d 65 6e 74 73 20  DATE statements 
22ea0 6f 6e 20 74 68 65 20 70 61 72 65 6e 74 0a 20 20  on the parent.  
22eb0 2a 2a 20 20 20 20 74 61 62 6c 65 2e 0a 20 20 2a  **    table..  *
22ec0 2a 0a 20 20 2a 2a 20 31 2e 20 41 20 47 4c 4f 42  *.  ** 1. A GLOB
22ed0 20 70 61 74 74 65 72 6e 20 73 75 69 74 61 62 6c   pattern suitabl
22ee0 65 20 66 6f 72 20 73 71 6c 69 74 65 33 5f 73 74  e for sqlite3_st
22ef0 72 67 6c 6f 62 28 29 2e 20 49 66 20 74 68 65 20  rglob(). If the 
22f00 70 6c 61 6e 20 6f 75 74 70 75 74 20 62 79 0a 20  plan output by. 
22f10 20 2a 2a 20 20 20 20 74 68 65 20 45 58 50 4c 41   **    the EXPLA
22f20 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 20 63 6f  IN QUERY PLAN co
22f30 6d 6d 61 6e 64 20 6d 61 74 63 68 65 73 20 74 68  mmand matches th
22f40 69 73 20 70 61 74 74 65 72 6e 2c 20 74 68 65 6e  is pattern, then
22f50 20 74 68 65 20 73 63 68 65 6d 61 0a 20 20 2a 2a   the schema.  **
22f60 20 20 20 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20      contains an 
22f70 69 6e 64 65 78 20 74 68 61 74 20 63 61 6e 20 62  index that can b
22f80 65 20 75 73 65 64 20 74 6f 20 6f 70 74 69 6d 69  e used to optimi
22f90 7a 65 20 74 68 65 20 71 75 65 72 79 2e 0a 20 20  ze the query..  
22fa0 2a 2a 0a 20 20 2a 2a 20 32 2e 20 48 75 6d 61 6e  **.  ** 2. Human
22fb0 20 72 65 61 64 61 62 6c 65 20 74 65 78 74 20 74   readable text t
22fc0 68 61 74 20 64 65 73 63 72 69 62 65 73 20 74 68  hat describes th
22fd0 65 20 63 68 69 6c 64 20 74 61 62 6c 65 20 61 6e  e child table an
22fe0 64 20 63 6f 6c 75 6d 6e 73 2e 20 65 2e 67 2e 0a  d columns. e.g..
22ff0 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20    **.  **       
23000 22 63 68 69 6c 64 5f 74 61 62 6c 65 28 63 68 69  "child_table(chi
23010 6c 64 5f 6b 65 79 31 2c 20 63 68 69 6c 64 5f 6b  ld_key1, child_k
23020 65 79 32 29 22 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ey2)".  **.  ** 
23030 33 2e 20 48 75 6d 61 6e 20 72 65 61 64 61 62 6c  3. Human readabl
23040 65 20 74 65 78 74 20 74 68 61 74 20 64 65 73 63  e text that desc
23050 72 69 62 65 73 20 74 68 65 20 70 61 72 65 6e 74  ribes the parent
23060 20 74 61 62 6c 65 20 61 6e 64 20 63 6f 6c 75 6d   table and colum
23070 6e 73 2e 20 65 2e 67 2e 0a 20 20 2a 2a 0a 20 20  ns. e.g..  **.  
23080 2a 2a 20 20 20 20 20 20 20 22 70 61 72 65 6e 74  **       "parent
23090 5f 74 61 62 6c 65 28 70 61 72 65 6e 74 5f 6b 65  _table(parent_ke
230a0 79 31 2c 20 70 61 72 65 6e 74 5f 6b 65 79 32 29  y1, parent_key2)
230b0 22 0a 20 20 2a 2a 0a 20 20 2a 2a 20 34 2e 20 41  ".  **.  ** 4. A
230c0 20 66 75 6c 6c 20 43 52 45 41 54 45 20 49 4e 44   full CREATE IND
230d0 45 58 20 73 74 61 74 65 6d 65 6e 74 20 66 6f 72  EX statement for
230e0 20 61 6e 20 69 6e 64 65 78 20 74 68 61 74 20 63   an index that c
230f0 6f 75 6c 64 20 62 65 20 75 73 65 64 20 74 6f 0a  ould be used to.
23100 20 20 2a 2a 20 20 20 20 6f 70 74 69 6d 69 7a 65    **    optimize
23110 20 44 45 4c 45 54 45 20 6f 72 20 55 50 44 41 54   DELETE or UPDAT
23120 45 20 73 74 61 74 65 6d 65 6e 74 73 20 6f 6e 20  E statements on 
23130 74 68 65 20 70 61 72 65 6e 74 20 74 61 62 6c 65  the parent table
23140 2e 20 65 2e 67 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  . e.g..  **.  **
23150 20 20 20 20 20 20 20 22 43 52 45 41 54 45 20 49         "CREATE I
23160 4e 44 45 58 20 63 68 69 6c 64 5f 74 61 62 6c 65  NDEX child_table
23170 5f 63 68 69 6c 64 5f 6b 65 79 20 4f 4e 20 63 68  _child_key ON ch
23180 69 6c 64 5f 74 61 62 6c 65 28 63 68 69 6c 64 5f  ild_table(child_
23190 6b 65 79 29 22 0a 20 20 2a 2a 0a 20 20 2a 2a 20  key)".  **.  ** 
231a0 35 2e 20 54 68 65 20 6e 61 6d 65 20 6f 66 20 74  5. The name of t
231b0 68 65 20 70 61 72 65 6e 74 20 74 61 62 6c 65 2e  he parent table.
231c0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 73 65  .  **.  ** These
231d0 20 73 69 78 20 76 61 6c 75 65 73 20 61 72 65 20   six values are 
231e0 75 73 65 64 20 62 79 20 74 68 65 20 43 20 6c 6f  used by the C lo
231f0 67 69 63 20 62 65 6c 6f 77 20 74 6f 20 67 65 6e  gic below to gen
23200 65 72 61 74 65 20 74 68 65 20 72 65 70 6f 72 74  erate the report
23210 2e 0a 20 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ..  */.  const c
23220 68 61 72 20 2a 7a 53 71 6c 20 3d 0a 20 20 22 53  har *zSql =.  "S
23230 45 4c 45 43 54 20 22 0a 20 20 20 20 22 20 20 20  ELECT ".    "   
23240 20 20 27 45 58 50 4c 41 49 4e 20 51 55 45 52 59    'EXPLAIN QUERY
23250 20 50 4c 41 4e 20 53 45 4c 45 43 54 20 31 20 46   PLAN SELECT 1 F
23260 52 4f 4d 20 27 20 7c 7c 20 71 75 6f 74 65 28 73  ROM ' || quote(s
23270 2e 6e 61 6d 65 29 20 7c 7c 20 27 20 57 48 45 52  .name) || ' WHER
23280 45 20 27 22 0a 20 20 20 20 22 20 20 7c 7c 20 67  E '".    "  || g
23290 72 6f 75 70 5f 63 6f 6e 63 61 74 28 71 75 6f 74  roup_concat(quot
232a0 65 28 73 2e 6e 61 6d 65 29 20 7c 7c 20 27 2e 27  e(s.name) || '.'
232b0 20 7c 7c 20 71 75 6f 74 65 28 66 2e 5b 66 72 6f   || quote(f.[fro
232c0 6d 5d 29 20 7c 7c 20 27 3d 3f 27 20 22 0a 20 20  m]) || '=?' ".  
232d0 20 20 22 20 20 7c 7c 20 66 6b 65 79 5f 63 6f 6c    "  || fkey_col
232e0 6c 61 74 65 5f 63 6c 61 75 73 65 28 22 0a 20 20  late_clause(".  
232f0 20 20 22 20 20 20 20 20 20 20 66 2e 5b 74 61 62    "       f.[tab
23300 6c 65 5d 2c 20 43 4f 41 4c 45 53 43 45 28 66 2e  le], COALESCE(f.
23310 5b 74 6f 5d 2c 20 70 2e 5b 6e 61 6d 65 5d 29 2c  [to], p.[name]),
23320 20 73 2e 6e 61 6d 65 2c 20 66 2e 5b 66 72 6f 6d   s.name, f.[from
23330 5d 29 2c 27 20 41 4e 44 20 27 29 22 0a 20 20 20  ]),' AND ')".   
23340 20 22 2c 20 22 0a 20 20 20 20 22 20 20 20 20 20   ", ".    "     
23350 27 53 45 41 52 43 48 20 54 41 42 4c 45 20 27 20  'SEARCH TABLE ' 
23360 7c 7c 20 73 2e 6e 61 6d 65 20 7c 7c 20 27 20 55  || s.name || ' U
23370 53 49 4e 47 20 43 4f 56 45 52 49 4e 47 20 49 4e  SING COVERING IN
23380 44 45 58 2a 28 27 22 0a 20 20 20 20 22 20 20 7c  DEX*('".    "  |
23390 7c 20 67 72 6f 75 70 5f 63 6f 6e 63 61 74 28 27  | group_concat('
233a0 2a 3d 3f 27 2c 20 27 20 41 4e 44 20 27 29 20 7c  *=?', ' AND ') |
233b0 7c 20 27 29 27 22 0a 20 20 20 20 22 2c 20 22 0a  | ')'".    ", ".
233c0 20 20 20 20 22 20 20 20 20 20 73 2e 6e 61 6d 65      "     s.name
233d0 20 20 7c 7c 20 27 28 27 20 7c 7c 20 67 72 6f 75    || '(' || grou
233e0 70 5f 63 6f 6e 63 61 74 28 66 2e 5b 66 72 6f 6d  p_concat(f.[from
233f0 5d 2c 20 20 27 2c 20 27 29 20 7c 7c 20 27 29 27  ],  ', ') || ')'
23400 22 0a 20 20 20 20 22 2c 20 22 0a 20 20 20 20 22  ".    ", ".    "
23410 20 20 20 20 20 66 2e 5b 74 61 62 6c 65 5d 20 7c       f.[table] |
23420 7c 20 27 28 27 20 7c 7c 20 67 72 6f 75 70 5f 63  | '(' || group_c
23430 6f 6e 63 61 74 28 43 4f 41 4c 45 53 43 45 28 66  oncat(COALESCE(f
23440 2e 5b 74 6f 5d 2c 20 70 2e 5b 6e 61 6d 65 5d 29  .[to], p.[name])
23450 29 20 7c 7c 20 27 29 27 22 0a 20 20 20 20 22 2c  ) || ')'".    ",
23460 20 22 0a 20 20 20 20 22 20 20 20 20 20 27 43 52   ".    "     'CR
23470 45 41 54 45 20 49 4e 44 45 58 20 27 20 7c 7c 20  EATE INDEX ' || 
23480 71 75 6f 74 65 28 73 2e 6e 61 6d 65 20 7c 7c 27  quote(s.name ||'
23490 5f 27 7c 7c 20 67 72 6f 75 70 5f 63 6f 6e 63 61  _'|| group_conca
234a0 74 28 66 2e 5b 66 72 6f 6d 5d 2c 20 27 5f 27 29  t(f.[from], '_')
234b0 29 22 0a 20 20 20 20 22 20 20 7c 7c 20 27 20 4f  )".    "  || ' O
234c0 4e 20 27 20 7c 7c 20 71 75 6f 74 65 28 73 2e 6e  N ' || quote(s.n
234d0 61 6d 65 29 20 7c 7c 20 27 28 27 22 0a 20 20 20  ame) || '('".   
234e0 20 22 20 20 7c 7c 20 67 72 6f 75 70 5f 63 6f 6e   "  || group_con
234f0 63 61 74 28 71 75 6f 74 65 28 66 2e 5b 66 72 6f  cat(quote(f.[fro
23500 6d 5d 29 20 7c 7c 22 0a 20 20 20 20 22 20 20 20  m]) ||".    "   
23510 20 20 20 20 20 66 6b 65 79 5f 63 6f 6c 6c 61 74       fkey_collat
23520 65 5f 63 6c 61 75 73 65 28 22 0a 20 20 20 20 22  e_clause(".    "
23530 20 20 20 20 20 20 20 20 20 20 66 2e 5b 74 61 62            f.[tab
23540 6c 65 5d 2c 20 43 4f 41 4c 45 53 43 45 28 66 2e  le], COALESCE(f.
23550 5b 74 6f 5d 2c 20 70 2e 5b 6e 61 6d 65 5d 29 2c  [to], p.[name]),
23560 20 73 2e 6e 61 6d 65 2c 20 66 2e 5b 66 72 6f 6d   s.name, f.[from
23570 5d 29 2c 20 27 2c 20 27 29 22 0a 20 20 20 20 22  ]), ', ')".    "
23580 20 20 7c 7c 20 27 29 3b 27 22 0a 20 20 20 20 22    || ');'".    "
23590 2c 20 22 0a 20 20 20 20 22 20 20 20 20 20 66 2e  , ".    "     f.
235a0 5b 74 61 62 6c 65 5d 20 22 0a 20 20 20 20 22 46  [table] ".    "F
235b0 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  ROM sqlite_maste
235c0 72 20 41 53 20 73 2c 20 70 72 61 67 6d 61 5f 66  r AS s, pragma_f
235d0 6f 72 65 69 67 6e 5f 6b 65 79 5f 6c 69 73 74 28  oreign_key_list(
235e0 73 2e 6e 61 6d 65 29 20 41 53 20 66 20 22 0a 20  s.name) AS f ". 
235f0 20 20 20 22 4c 45 46 54 20 4a 4f 49 4e 20 70 72     "LEFT JOIN pr
23600 61 67 6d 61 5f 74 61 62 6c 65 5f 69 6e 66 6f 20  agma_table_info 
23610 41 53 20 70 20 4f 4e 20 28 70 6b 2d 31 3d 73 65  AS p ON (pk-1=se
23620 71 20 41 4e 44 20 70 2e 61 72 67 3d 66 2e 5b 74  q AND p.arg=f.[t
23630 61 62 6c 65 5d 29 20 22 0a 20 20 20 20 22 47 52  able]) ".    "GR
23640 4f 55 50 20 42 59 20 73 2e 6e 61 6d 65 2c 20 66  OUP BY s.name, f
23650 2e 69 64 20 22 0a 20 20 20 20 22 4f 52 44 45 52  .id ".    "ORDER
23660 20 42 59 20 28 43 41 53 45 20 57 48 45 4e 20 3f   BY (CASE WHEN ?
23670 20 54 48 45 4e 20 66 2e 5b 74 61 62 6c 65 5d 20   THEN f.[table] 
23680 45 4c 53 45 20 73 2e 6e 61 6d 65 20 45 4e 44 29  ELSE s.name END)
23690 22 0a 20 20 3b 0a 20 20 63 6f 6e 73 74 20 63 68  ".  ;.  const ch
236a0 61 72 20 2a 7a 47 6c 6f 62 49 50 4b 20 3d 20 22  ar *zGlobIPK = "
236b0 53 45 41 52 43 48 20 54 41 42 4c 45 20 2a 20 55  SEARCH TABLE * U
236c0 53 49 4e 47 20 49 4e 54 45 47 45 52 20 50 52 49  SING INTEGER PRI
236d0 4d 41 52 59 20 4b 45 59 20 28 72 6f 77 69 64 3d  MARY KEY (rowid=
236e0 3f 29 22 3b 0a 0a 20 20 66 6f 72 28 69 3d 32 3b  ?)";..  for(i=2;
236f0 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20   i<nArg; i++){. 
23700 20 20 20 69 6e 74 20 6e 20 3d 20 73 74 72 6c 65     int n = strle
23710 6e 33 30 28 61 7a 41 72 67 5b 69 5d 29 3b 0a 20  n30(azArg[i]);. 
23720 20 20 20 69 66 28 20 6e 3e 31 20 26 26 20 73 71     if( n>1 && sq
23730 6c 69 74 65 33 5f 73 74 72 6e 69 63 6d 70 28 22  lite3_strnicmp("
23740 2d 76 65 72 62 6f 73 65 22 2c 20 61 7a 41 72 67  -verbose", azArg
23750 5b 69 5d 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20  [i], n)==0 ){.  
23760 20 20 20 20 62 56 65 72 62 6f 73 65 20 3d 20 31      bVerbose = 1
23770 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65 6c 73 65  ;.    }.    else
23780 20 69 66 28 20 6e 3e 31 20 26 26 20 73 71 6c 69   if( n>1 && sqli
23790 74 65 33 5f 73 74 72 6e 69 63 6d 70 28 22 2d 67  te3_strnicmp("-g
237a0 72 6f 75 70 62 79 70 61 72 65 6e 74 22 2c 20 61  roupbyparent", a
237b0 7a 41 72 67 5b 69 5d 2c 20 6e 29 3d 3d 30 20 29  zArg[i], n)==0 )
237c0 7b 0a 20 20 20 20 20 20 62 47 72 6f 75 70 42 79  {.      bGroupBy
237d0 50 61 72 65 6e 74 20 3d 20 31 3b 0a 20 20 20 20  Parent = 1;.    
237e0 20 20 7a 49 6e 64 65 6e 74 20 3d 20 22 20 20 20    zIndent = "   
237f0 20 22 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65 6c   ";.    }.    el
23800 73 65 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72  se{.      raw_pr
23810 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55 73  intf(stderr, "Us
23820 61 67 65 3a 20 25 73 20 25 73 20 3f 2d 76 65 72  age: %s %s ?-ver
23830 62 6f 73 65 3f 20 3f 2d 67 72 6f 75 70 62 79 70  bose? ?-groupbyp
23840 61 72 65 6e 74 3f 5c 6e 22 2c 0a 20 20 20 20 20  arent?\n",.     
23850 20 20 20 20 20 61 7a 41 72 67 5b 30 5d 2c 20 61       azArg[0], a
23860 7a 41 72 67 5b 31 5d 0a 20 20 20 20 20 20 29 3b  zArg[1].      );
23870 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
23880 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
23890 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 67 69  }.  }..  /* Regi
238a0 73 74 65 72 20 74 68 65 20 66 6b 65 79 5f 63 6f  ster the fkey_co
238b0 6c 6c 61 74 65 5f 63 6c 61 75 73 65 28 29 20 53  llate_clause() S
238c0 51 4c 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  QL function */. 
238d0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72   rc = sqlite3_cr
238e0 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62  eate_function(db
238f0 2c 20 22 66 6b 65 79 5f 63 6f 6c 6c 61 74 65 5f  , "fkey_collate_
23900 63 6c 61 75 73 65 22 2c 20 34 2c 20 53 51 4c 49  clause", 4, SQLI
23910 54 45 5f 55 54 46 38 2c 0a 20 20 20 20 20 20 30  TE_UTF8,.      0
23920 2c 20 73 68 65 6c 6c 46 6b 65 79 43 6f 6c 6c 61  , shellFkeyColla
23930 74 65 43 6c 61 75 73 65 2c 20 30 2c 20 30 0a 20  teClause, 0, 0. 
23940 20 29 3b 0a 0a 0a 20 20 69 66 28 20 72 63 3d 3d   );...  if( rc==
23950 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
23960 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72   rc = sqlite3_pr
23970 65 70 61 72 65 5f 76 32 28 64 62 2c 20 7a 53 71  epare_v2(db, zSq
23980 6c 2c 20 2d 31 2c 20 26 70 53 71 6c 2c 20 30 29  l, -1, &pSql, 0)
23990 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  ;.  }.  if( rc==
239a0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
239b0 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e   sqlite3_bind_in
239c0 74 28 70 53 71 6c 2c 20 31 2c 20 62 47 72 6f 75  t(pSql, 1, bGrou
239d0 70 42 79 50 61 72 65 6e 74 29 3b 0a 20 20 7d 0a  pByParent);.  }.
239e0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
239f0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20  E_OK ){.    int 
23a00 72 63 32 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a  rc2;.    char *z
23a10 50 72 65 76 20 3d 20 30 3b 0a 20 20 20 20 77 68  Prev = 0;.    wh
23a20 69 6c 65 28 20 53 51 4c 49 54 45 5f 52 4f 57 3d  ile( SQLITE_ROW=
23a30 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53  =sqlite3_step(pS
23a40 71 6c 29 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ql) ){.      int
23a50 20 72 65 73 20 3d 20 2d 31 3b 0a 20 20 20 20 20   res = -1;.     
23a60 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
23a70 45 78 70 6c 61 69 6e 20 3d 20 30 3b 0a 20 20 20  Explain = 0;.   
23a80 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
23a90 45 51 50 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  EQP = (const cha
23aa0 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  r*)sqlite3_colum
23ab0 6e 5f 74 65 78 74 28 70 53 71 6c 2c 20 30 29 3b  n_text(pSql, 0);
23ac0 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
23ad0 72 20 2a 7a 47 6c 6f 62 20 3d 20 28 63 6f 6e 73  r *zGlob = (cons
23ae0 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f  t char*)sqlite3_
23af0 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 71 6c  column_text(pSql
23b00 2c 20 31 29 3b 0a 20 20 20 20 20 20 63 6f 6e 73  , 1);.      cons
23b10 74 20 63 68 61 72 20 2a 7a 46 72 6f 6d 20 3d 20  t char *zFrom = 
23b20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c  (const char*)sql
23b30 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  ite3_column_text
23b40 28 70 53 71 6c 2c 20 32 29 3b 0a 20 20 20 20 20  (pSql, 2);.     
23b50 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61   const char *zTa
23b60 72 67 65 74 20 3d 20 28 63 6f 6e 73 74 20 63 68  rget = (const ch
23b70 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75  ar*)sqlite3_colu
23b80 6d 6e 5f 74 65 78 74 28 70 53 71 6c 2c 20 33 29  mn_text(pSql, 3)
23b90 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  ;.      const ch
23ba0 61 72 20 2a 7a 43 49 20 3d 20 28 63 6f 6e 73 74  ar *zCI = (const
23bb0 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63   char*)sqlite3_c
23bc0 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 71 6c 2c  olumn_text(pSql,
23bd0 20 34 29 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74   4);.      const
23be0 20 63 68 61 72 20 2a 7a 50 61 72 65 6e 74 20 3d   char *zParent =
23bf0 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71   (const char*)sq
23c00 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
23c10 74 28 70 53 71 6c 2c 20 35 29 3b 0a 0a 20 20 20  t(pSql, 5);..   
23c20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
23c30 70 72 65 70 61 72 65 5f 76 32 28 64 62 2c 20 7a  prepare_v2(db, z
23c40 45 51 50 2c 20 2d 31 2c 20 26 70 45 78 70 6c 61  EQP, -1, &pExpla
23c50 69 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66  in, 0);.      if
23c60 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
23c70 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 69  ) break;.      i
23c80 66 28 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73  f( SQLITE_ROW==s
23c90 71 6c 69 74 65 33 5f 73 74 65 70 28 70 45 78 70  qlite3_step(pExp
23ca0 6c 61 69 6e 29 20 29 7b 0a 20 20 20 20 20 20 20  lain) ){.       
23cb0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 6c   const char *zPl
23cc0 61 6e 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  an = (const char
23cd0 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  *)sqlite3_column
23ce0 5f 74 65 78 74 28 70 45 78 70 6c 61 69 6e 2c 20  _text(pExplain, 
23cf0 33 29 3b 0a 20 20 20 20 20 20 20 20 72 65 73 20  3);.        res 
23d00 3d 20 28 0a 20 20 20 20 20 20 20 20 20 20 20 20  = (.            
23d10 20 20 30 3d 3d 73 71 6c 69 74 65 33 5f 73 74 72    0==sqlite3_str
23d20 67 6c 6f 62 28 7a 47 6c 6f 62 2c 20 7a 50 6c 61  glob(zGlob, zPla
23d30 6e 29 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c  n).           ||
23d40 20 30 3d 3d 73 71 6c 69 74 65 33 5f 73 74 72 67   0==sqlite3_strg
23d50 6c 6f 62 28 7a 47 6c 6f 62 49 50 4b 2c 20 7a 50  lob(zGlobIPK, zP
23d60 6c 61 6e 29 0a 20 20 20 20 20 20 20 20 29 3b 0a  lan).        );.
23d70 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63        }.      rc
23d80 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c   = sqlite3_final
23d90 69 7a 65 28 70 45 78 70 6c 61 69 6e 29 3b 0a 20  ize(pExplain);. 
23da0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
23db0 49 54 45 5f 4f 4b 20 29 20 62 72 65 61 6b 3b 0a  ITE_OK ) break;.
23dc0 0a 20 20 20 20 20 20 69 66 28 20 72 65 73 3c 30  .      if( res<0
23dd0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 61 77 5f   ){.        raw_
23de0 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
23df0 45 72 72 6f 72 3a 20 69 6e 74 65 72 6e 61 6c 20  Error: internal 
23e00 65 72 72 6f 72 22 29 3b 0a 20 20 20 20 20 20 20  error");.       
23e10 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 65   break;.      }e
23e20 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 66 28  lse{.        if(
23e30 20 62 47 72 6f 75 70 42 79 50 61 72 65 6e 74 0a   bGroupByParent.
23e40 20 20 20 20 20 20 20 20 26 26 20 28 62 56 65 72          && (bVer
23e50 62 6f 73 65 20 7c 7c 20 72 65 73 3d 3d 30 29 0a  bose || res==0).
23e60 20 20 20 20 20 20 20 20 26 26 20 28 7a 50 72 65          && (zPre
23e70 76 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 5f  v==0 || sqlite3_
23e80 73 74 72 69 63 6d 70 28 7a 50 61 72 65 6e 74 2c  stricmp(zParent,
23e90 20 7a 50 72 65 76 29 29 0a 20 20 20 20 20 20 20   zPrev)).       
23ea0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 61   ){.          ra
23eb0 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 2d  w_printf(out, "-
23ec0 2d 20 50 61 72 65 6e 74 20 74 61 62 6c 65 20 25  - Parent table %
23ed0 73 5c 6e 22 2c 20 7a 50 61 72 65 6e 74 29 3b 0a  s\n", zParent);.
23ee0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
23ef0 33 5f 66 72 65 65 28 7a 50 72 65 76 29 3b 0a 20  3_free(zPrev);. 
23f00 20 20 20 20 20 20 20 20 20 7a 50 72 65 76 20 3d           zPrev =
23f10 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
23f20 28 22 25 73 22 2c 20 7a 50 61 72 65 6e 74 29 3b  ("%s", zParent);
23f30 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
23f40 20 20 20 20 69 66 28 20 72 65 73 3d 3d 30 20 29      if( res==0 )
23f50 7b 0a 20 20 20 20 20 20 20 20 20 20 72 61 77 5f  {.          raw_
23f60 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 73 25  printf(out, "%s%
23f70 73 20 2d 2d 3e 20 25 73 5c 6e 22 2c 20 7a 49 6e  s --> %s\n", zIn
23f80 64 65 6e 74 2c 20 7a 43 49 2c 20 7a 54 61 72 67  dent, zCI, zTarg
23f90 65 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  et);.        }el
23fa0 73 65 20 69 66 28 20 62 56 65 72 62 6f 73 65 20  se if( bVerbose 
23fb0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 61 77  ){.          raw
23fc0 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 73  _printf(out, "%s
23fd0 2f 2a 20 6e 6f 20 65 78 74 72 61 20 69 6e 64 65  /* no extra inde
23fe0 78 65 73 20 72 65 71 75 69 72 65 64 20 66 6f 72  xes required for
23ff0 20 25 73 20 2d 3e 20 25 73 20 2a 2f 5c 6e 22 2c   %s -> %s */\n",
24000 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a  .              z
24010 49 6e 64 65 6e 74 2c 20 7a 46 72 6f 6d 2c 20 7a  Indent, zFrom, z
24020 54 61 72 67 65 74 0a 20 20 20 20 20 20 20 20 20  Target.         
24030 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   );.        }.  
24040 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
24050 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 50 72  sqlite3_free(zPr
24060 65 76 29 3b 0a 0a 20 20 20 20 69 66 28 20 72 63  ev);..    if( rc
24070 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
24080 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
24090 73 74 64 65 72 72 2c 20 22 25 73 5c 6e 22 2c 20  stderr, "%s\n", 
240a0 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 64  sqlite3_errmsg(d
240b0 62 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  b));.    }..    
240c0 72 63 32 20 3d 20 73 71 6c 69 74 65 33 5f 66 69  rc2 = sqlite3_fi
240d0 6e 61 6c 69 7a 65 28 70 53 71 6c 29 3b 0a 20 20  nalize(pSql);.  
240e0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
240f0 5f 4f 4b 20 26 26 20 72 63 32 21 3d 53 51 4c 49  _OK && rc2!=SQLI
24100 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
24110 63 20 3d 20 72 63 32 3b 0a 20 20 20 20 20 20 72  c = rc2;.      r
24120 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  aw_printf(stderr
24130 2c 20 22 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65  , "%s\n", sqlite
24140 33 5f 65 72 72 6d 73 67 28 64 62 29 29 3b 0a 20  3_errmsg(db));. 
24150 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
24160 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64    raw_printf(std
24170 65 72 72 2c 20 22 25 73 5c 6e 22 2c 20 73 71 6c  err, "%s\n", sql
24180 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29 29  ite3_errmsg(db))
24190 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
241a0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70  rc;.}../*.** Imp
241b0 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 22  lementation of "
241c0 2e 6c 69 6e 74 22 20 64 6f 74 20 63 6f 6d 6d 61  .lint" dot comma
241d0 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  nd..*/.static in
241e0 74 20 6c 69 6e 74 44 6f 74 43 6f 6d 6d 61 6e 64  t lintDotCommand
241f0 28 0a 20 20 53 68 65 6c 6c 53 74 61 74 65 20 2a  (.  ShellState *
24200 70 53 74 61 74 65 2c 20 20 20 20 20 20 20 20 20  pState,         
24210 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 73      /* Current s
24220 68 65 6c 6c 20 74 6f 6f 6c 20 73 74 61 74 65 20  hell tool state 
24230 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 7a 41 72  */.  char **azAr
24240 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g,              
24250 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66       /* Array of
24260 20 61 72 67 75 6d 65 6e 74 73 20 70 61 73 73 65   arguments passe
24270 64 20 74 6f 20 64 6f 74 20 63 6f 6d 6d 61 6e 64  d to dot command
24280 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 72 67 20 20   */.  int nArg  
24290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
242a0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
242b0 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 61 7a  of entries in az
242c0 41 72 67 5b 5d 20 2a 2f 0a 29 7b 0a 20 20 69 6e  Arg[] */.){.  in
242d0 74 20 6e 3b 0a 20 20 6e 20 3d 20 28 6e 41 72 67  t n;.  n = (nArg
242e0 3e 3d 32 20 3f 20 73 74 72 6c 65 6e 33 30 28 61  >=2 ? strlen30(a
242f0 7a 41 72 67 5b 31 5d 29 20 3a 20 30 29 3b 0a 20  zArg[1]) : 0);. 
24300 20 69 66 28 20 6e 3c 31 20 7c 7c 20 73 71 6c 69   if( n<1 || sqli
24310 74 65 33 5f 73 74 72 6e 69 63 6d 70 28 61 7a 41  te3_strnicmp(azA
24320 72 67 5b 31 5d 2c 20 22 66 6b 65 79 2d 69 6e 64  rg[1], "fkey-ind
24330 65 78 65 73 22 2c 20 6e 29 20 29 20 67 6f 74 6f  exes", n) ) goto
24340 20 75 73 61 67 65 3b 0a 20 20 72 65 74 75 72 6e   usage;.  return
24350 20 6c 69 6e 74 46 6b 65 79 49 6e 64 65 78 65 73   lintFkeyIndexes
24360 28 70 53 74 61 74 65 2c 20 61 7a 41 72 67 2c 20  (pState, azArg, 
24370 6e 41 72 67 29 3b 0a 0a 20 75 73 61 67 65 3a 0a  nArg);.. usage:.
24380 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64    raw_printf(std
24390 65 72 72 2c 20 22 55 73 61 67 65 20 25 73 20 73  err, "Usage %s s
243a0 75 62 2d 63 6f 6d 6d 61 6e 64 20 3f 73 77 69 74  ub-command ?swit
243b0 63 68 65 73 2e 2e 2e 3f 5c 6e 22 2c 20 61 7a 41  ches...?\n", azA
243c0 72 67 5b 30 5d 29 3b 0a 20 20 72 61 77 5f 70 72  rg[0]);.  raw_pr
243d0 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 57 68  intf(stderr, "Wh
243e0 65 72 65 20 73 75 62 2d 63 6f 6d 6d 61 6e 64 73  ere sub-commands
243f0 20 61 72 65 3a 5c 6e 22 29 3b 0a 20 20 72 61 77   are:\n");.  raw
24400 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
24410 22 20 20 20 20 66 6b 65 79 2d 69 6e 64 65 78 65  "    fkey-indexe
24420 73 5c 6e 22 29 3b 0a 20 20 72 65 74 75 72 6e 20  s\n");.  return 
24430 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 7d 0a  SQLITE_ERROR;.}.
24440 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
24450 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
24460 4c 54 41 42 4c 45 29 20 26 26 20 64 65 66 69 6e  LTABLE) && defin
24470 65 64 28 53 51 4c 49 54 45 5f 48 41 56 45 5f 5a  ed(SQLITE_HAVE_Z
24480 4c 49 42 29 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  LIB)./**********
24490 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
244a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
244b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
244c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
244d0 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 65 20 22  *******.** The "
244e0 2e 61 72 63 68 69 76 65 22 20 6f 72 20 22 2e 61  .archive" or ".a
244f0 72 22 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a 73  r" command..*/.s
24500 74 61 74 69 63 20 76 6f 69 64 20 73 68 65 6c 6c  tatic void shell
24510 50 72 65 70 61 72 65 28 0a 20 20 73 71 6c 69 74  Prepare(.  sqlit
24520 65 33 20 2a 64 62 2c 20 0a 20 20 69 6e 74 20 2a  e3 *db, .  int *
24530 70 52 63 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68  pRc, .  const ch
24540 61 72 20 2a 7a 53 71 6c 2c 20 0a 20 20 73 71 6c  ar *zSql, .  sql
24550 69 74 65 33 5f 73 74 6d 74 20 2a 2a 70 70 53 74  ite3_stmt **ppSt
24560 6d 74 0a 29 7b 0a 20 20 2a 70 70 53 74 6d 74 20  mt.){.  *ppStmt 
24570 3d 20 30 3b 0a 20 20 69 66 28 20 2a 70 52 63 3d  = 0;.  if( *pRc=
24580 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
24590 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74    int rc = sqlit
245a0 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 64 62  e3_prepare_v2(db
245b0 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 70 70 53 74  , zSql, -1, ppSt
245c0 6d 74 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  mt, 0);.    if( 
245d0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
245e0 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74  .      raw_print
245f0 66 28 73 74 64 65 72 72 2c 20 22 73 71 6c 20 65  f(stderr, "sql e
24600 72 72 6f 72 3a 20 25 73 20 28 25 64 29 5c 6e 22  rror: %s (%d)\n"
24610 2c 20 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  , .          sql
24620 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29 2c  ite3_errmsg(db),
24630 20 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65   sqlite3_errcode
24640 28 64 62 29 0a 20 20 20 20 20 20 29 3b 0a 20 20  (db).      );.  
24650 20 20 20 20 2a 70 52 63 20 3d 20 72 63 3b 0a 20      *pRc = rc;. 
24660 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74     }.  }.}..stat
24670 69 63 20 76 6f 69 64 20 73 68 65 6c 6c 50 72 65  ic void shellPre
24680 70 61 72 65 50 72 69 6e 74 66 28 0a 20 20 73 71  parePrintf(.  sq
24690 6c 69 74 65 33 20 2a 64 62 2c 20 0a 20 20 69 6e  lite3 *db, .  in
246a0 74 20 2a 70 52 63 2c 20 0a 20 20 73 71 6c 69 74  t *pRc, .  sqlit
246b0 65 33 5f 73 74 6d 74 20 2a 2a 70 70 53 74 6d 74  e3_stmt **ppStmt
246c0 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
246d0 7a 46 6d 74 2c 20 0a 20 20 2e 2e 2e 0a 29 7b 0a  zFmt, .  ....){.
246e0 20 20 2a 70 70 53 74 6d 74 20 3d 20 30 3b 0a 20    *ppStmt = 0;. 
246f0 20 69 66 28 20 2a 70 52 63 3d 3d 53 51 4c 49 54   if( *pRc==SQLIT
24700 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 76 61 5f 6c  E_OK ){.    va_l
24710 69 73 74 20 61 70 3b 0a 20 20 20 20 63 68 61 72  ist ap;.    char
24720 20 2a 7a 3b 0a 20 20 20 20 76 61 5f 73 74 61 72   *z;.    va_star
24730 74 28 61 70 2c 20 7a 46 6d 74 29 3b 0a 20 20 20  t(ap, zFmt);.   
24740 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 76 6d 70   z = sqlite3_vmp
24750 72 69 6e 74 66 28 7a 46 6d 74 2c 20 61 70 29 3b  rintf(zFmt, ap);
24760 0a 20 20 20 20 69 66 28 20 7a 3d 3d 30 20 29 7b  .    if( z==0 ){
24770 0a 20 20 20 20 20 20 2a 70 52 63 20 3d 20 53 51  .      *pRc = SQ
24780 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
24790 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 68 65  }else{.      she
247a0 6c 6c 50 72 65 70 61 72 65 28 64 62 2c 20 70 52  llPrepare(db, pR
247b0 63 2c 20 7a 2c 20 70 70 53 74 6d 74 29 3b 0a 20  c, z, ppStmt);. 
247c0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
247d0 65 28 7a 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  e(z);.    }.  }.
247e0 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  }..static void s
247f0 68 65 6c 6c 46 69 6e 61 6c 69 7a 65 28 0a 20 20  hellFinalize(.  
24800 69 6e 74 20 2a 70 52 63 2c 20 0a 20 20 73 71 6c  int *pRc, .  sql
24810 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
24820 0a 29 7b 0a 20 20 69 66 28 20 70 53 74 6d 74 20  .){.  if( pStmt 
24830 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a  ){.    sqlite3 *
24840 64 62 20 3d 20 73 71 6c 69 74 65 33 5f 64 62 5f  db = sqlite3_db_
24850 68 61 6e 64 6c 65 28 70 53 74 6d 74 29 3b 0a 20  handle(pStmt);. 
24860 20 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69     int rc = sqli
24870 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74  te3_finalize(pSt
24880 6d 74 29 3b 0a 20 20 20 20 69 66 28 20 2a 70 52  mt);.    if( *pR
24890 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
248a0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
248b0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
248c0 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74     raw_printf(st
248d0 64 65 72 72 2c 20 22 53 51 4c 20 65 72 72 6f 72  derr, "SQL error
248e0 3a 20 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65 33  : %s\n", sqlite3
248f0 5f 65 72 72 6d 73 67 28 64 62 29 29 3b 0a 20 20  _errmsg(db));.  
24900 20 20 20 20 7d 0a 20 20 20 20 20 20 2a 70 52 63      }.      *pRc
24910 20 3d 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d   = rc;.    }.  }
24920 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .}..static void 
24930 73 68 65 6c 6c 52 65 73 65 74 28 0a 20 20 69 6e  shellReset(.  in
24940 74 20 2a 70 52 63 2c 20 0a 20 20 73 71 6c 69 74  t *pRc, .  sqlit
24950 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 0a 29  e3_stmt *pStmt.)
24960 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c  {.  int rc = sql
24970 69 74 65 33 5f 72 65 73 65 74 28 70 53 74 6d 74  ite3_reset(pStmt
24980 29 3b 0a 20 20 69 66 28 20 2a 70 52 63 3d 3d 53  );.  if( *pRc==S
24990 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
249a0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
249b0 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  K ){.      sqlit
249c0 65 33 20 2a 64 62 20 3d 20 73 71 6c 69 74 65 33  e3 *db = sqlite3
249d0 5f 64 62 5f 68 61 6e 64 6c 65 28 70 53 74 6d 74  _db_handle(pStmt
249e0 29 3b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69  );.      raw_pri
249f0 6e 74 66 28 73 74 64 65 72 72 2c 20 22 53 51 4c  ntf(stderr, "SQL
24a00 20 65 72 72 6f 72 3a 20 25 73 5c 6e 22 2c 20 73   error: %s\n", s
24a10 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62  qlite3_errmsg(db
24a20 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a 70  ));.    }.    *p
24a30 52 63 20 3d 20 72 63 3b 0a 20 20 7d 0a 7d 0a 2f  Rc = rc;.  }.}./
24a40 2a 0a 2a 2a 20 53 74 72 75 63 74 75 72 65 20 72  *.** Structure r
24a50 65 70 72 65 73 65 6e 74 69 6e 67 20 61 20 73 69  epresenting a si
24a60 6e 67 6c 65 20 22 2e 61 72 22 20 63 6f 6d 6d 61  ngle ".ar" comma
24a70 6e 64 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73  nd..*/.typedef s
24a80 74 72 75 63 74 20 41 72 43 6f 6d 6d 61 6e 64 20  truct ArCommand 
24a90 41 72 43 6f 6d 6d 61 6e 64 3b 0a 73 74 72 75 63  ArCommand;.struc
24aa0 74 20 41 72 43 6f 6d 6d 61 6e 64 20 7b 0a 20 20  t ArCommand {.  
24ab0 75 38 20 65 43 6d 64 3b 20 20 20 20 20 20 20 20  u8 eCmd;        
24ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24ad0 2f 2a 20 41 6e 20 41 52 5f 43 4d 44 5f 2a 20 76  /* An AR_CMD_* v
24ae0 61 6c 75 65 20 2a 2f 0a 20 20 75 38 20 62 56 65  alue */.  u8 bVe
24af0 72 62 6f 73 65 3b 20 20 20 20 20 20 20 20 20 20  rbose;          
24b00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
24b10 65 20 69 66 20 2d 2d 76 65 72 62 6f 73 65 20 2a  e if --verbose *
24b20 2f 0a 20 20 75 38 20 62 5a 69 70 3b 20 20 20 20  /.  u8 bZip;    
24b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24b40 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
24b50 68 65 20 61 72 63 68 69 76 65 20 69 73 20 61 20  he archive is a 
24b60 5a 49 50 20 2a 2f 0a 20 20 75 38 20 62 44 72 79  ZIP */.  u8 bDry
24b70 52 75 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  Run;            
24b80 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
24b90 20 69 66 20 2d 2d 64 72 79 2d 72 75 6e 20 2a 2f   if --dry-run */
24ba0 0a 20 20 75 38 20 62 41 70 70 65 6e 64 3b 20 20  .  u8 bAppend;  
24bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24bc0 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 2d 2d     /* True if --
24bd0 61 70 70 65 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  append */.  int 
24be0 6e 41 72 67 3b 20 20 20 20 20 20 20 20 20 20 20  nArg;           
24bf0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
24c00 75 6d 62 65 72 20 6f 66 20 63 6f 6d 6d 61 6e 64  umber of command
24c10 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
24c20 63 68 61 72 20 2a 7a 53 72 63 54 61 62 6c 65 3b  char *zSrcTable;
24c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24c40 2f 2a 20 22 73 71 6c 61 72 22 2c 20 22 7a 69 70  /* "sqlar", "zip
24c50 66 69 6c 65 28 24 66 69 6c 65 29 22 20 6f 72 20  file($file)" or 
24c60 22 7a 69 70 22 20 2a 2f 0a 20 20 63 6f 6e 73 74  "zip" */.  const
24c70 20 63 68 61 72 20 2a 7a 46 69 6c 65 3b 20 20 20   char *zFile;   
24c80 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 2d 2d             /* --
24c90 66 69 6c 65 20 61 72 67 75 6d 65 6e 74 2c 20 6f  file argument, o
24ca0 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 63 6f 6e 73  r NULL */.  cons
24cb0 74 20 63 68 61 72 20 2a 7a 44 69 72 3b 20 20 20  t char *zDir;   
24cc0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 2d              /* -
24cd0 2d 64 69 72 65 63 74 6f 72 79 20 61 72 67 75 6d  -directory argum
24ce0 65 6e 74 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a  ent, or NULL */.
24cf0 20 20 63 68 61 72 20 2a 2a 61 7a 41 72 67 3b 20    char **azArg; 
24d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24d10 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 63 6f    /* Array of co
24d20 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20  mmand arguments 
24d30 2a 2f 0a 20 20 53 68 65 6c 6c 53 74 61 74 65 20  */.  ShellState 
24d40 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *p;             
24d50 20 20 20 20 20 2f 2a 20 53 68 65 6c 6c 20 73 74       /* Shell st
24d60 61 74 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ate */.  sqlite3
24d70 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20 20   *db;           
24d80 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
24d90 62 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  base containing 
24da0 74 68 65 20 61 72 63 68 69 76 65 20 2a 2f 0a 7d  the archive */.}
24db0 3b 0a 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61  ;../*.** Print a
24dc0 20 75 73 61 67 65 20 6d 65 73 73 61 67 65 20 66   usage message f
24dd0 6f 72 20 74 68 65 20 2e 61 72 20 63 6f 6d 6d 61  or the .ar comma
24de0 6e 64 20 74 6f 20 73 74 64 65 72 72 20 61 6e 64  nd to stderr and
24df0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
24e00 52 52 4f 52 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  RROR..*/.static 
24e10 69 6e 74 20 61 72 55 73 61 67 65 28 46 49 4c 45  int arUsage(FILE
24e20 20 2a 66 29 7b 0a 20 20 72 61 77 5f 70 72 69 6e   *f){.  raw_prin
24e30 74 66 28 66 2c 0a 22 5c 6e 22 0a 22 55 73 61 67  tf(f,."\n"."Usag
24e40 65 3a 20 2e 61 72 20 5b 4f 50 54 49 4f 4e 2e 2e  e: .ar [OPTION..
24e50 2e 5d 20 5b 46 49 4c 45 2e 2e 2e 5d 5c 6e 22 0a  .] [FILE...]\n".
24e60 22 54 68 65 20 2e 61 72 20 63 6f 6d 6d 61 6e 64  "The .ar command
24e70 20 6d 61 6e 61 67 65 73 20 73 71 6c 61 72 20 61   manages sqlar a
24e80 72 63 68 69 76 65 73 2e 5c 6e 22 0a 22 5c 6e 22  rchives.\n"."\n"
24e90 0a 22 45 78 61 6d 70 6c 65 73 3a 5c 6e 22 0a 22  ."Examples:\n"."
24ea0 20 20 2e 61 72 20 2d 63 66 20 61 72 63 68 69 76    .ar -cf archiv
24eb0 65 2e 73 61 72 20 66 6f 6f 20 62 61 72 20 20 20  e.sar foo bar   
24ec0 20 23 20 43 72 65 61 74 65 20 61 72 63 68 69 76   # Create archiv
24ed0 65 2e 73 61 72 20 66 72 6f 6d 20 66 69 6c 65 73  e.sar from files
24ee0 20 66 6f 6f 20 61 6e 64 20 62 61 72 5c 6e 22 0a   foo and bar\n".
24ef0 22 20 20 2e 61 72 20 2d 74 66 20 61 72 63 68 69  "  .ar -tf archi
24f00 76 65 2e 73 61 72 20 20 20 20 20 20 20 20 20 20  ve.sar          
24f10 20 20 23 20 4c 69 73 74 20 6d 65 6d 62 65 72 73    # List members
24f20 20 6f 66 20 61 72 63 68 69 76 65 2e 73 61 72 5c   of archive.sar\
24f30 6e 22 0a 22 20 20 2e 61 72 20 2d 78 76 66 20 61  n"."  .ar -xvf a
24f40 72 63 68 69 76 65 2e 73 61 72 20 20 20 20 20 20  rchive.sar      
24f50 20 20 20 20 20 23 20 56 65 72 62 6f 73 65 6c 79       # Verbosely
24f60 20 65 78 74 72 61 63 74 20 66 69 6c 65 73 20 66   extract files f
24f70 72 6f 6d 20 61 72 63 68 69 76 65 2e 73 61 72 5c  rom archive.sar\
24f80 6e 22 0a 22 5c 6e 22 0a 22 45 61 63 68 20 63 6f  n"."\n"."Each co
24f90 6d 6d 61 6e 64 20 6c 69 6e 65 20 6d 75 73 74 20  mmand line must 
24fa0 66 65 61 74 75 72 65 20 65 78 61 63 74 6c 79 20  feature exactly 
24fb0 6f 6e 65 20 63 6f 6d 6d 61 6e 64 20 6f 70 74 69  one command opti
24fc0 6f 6e 3a 5c 6e 22 0a 22 20 20 2d 63 2c 20 2d 2d  on:\n"."  -c, --
24fd0 63 72 65 61 74 65 20 20 20 20 20 20 20 20 20 20  create          
24fe0 20 20 20 20 20 43 72 65 61 74 65 20 61 20 6e 65       Create a ne
24ff0 77 20 61 72 63 68 69 76 65 5c 6e 22 0a 22 20 20  w archive\n"."  
25000 2d 75 2c 20 2d 2d 75 70 64 61 74 65 20 20 20 20  -u, --update    
25010 20 20 20 20 20 20 20 20 20 20 20 55 70 64 61 74             Updat
25020 65 20 6f 72 20 61 64 64 20 66 69 6c 65 73 20 74  e or add files t
25030 6f 20 61 6e 20 65 78 69 73 74 69 6e 67 20 61 72  o an existing ar
25040 63 68 69 76 65 5c 6e 22 0a 22 20 20 2d 74 2c 20  chive\n"."  -t, 
25050 2d 2d 6c 69 73 74 20 20 20 20 20 20 20 20 20 20  --list          
25060 20 20 20 20 20 20 20 4c 69 73 74 20 63 6f 6e 74         List cont
25070 65 6e 74 73 20 6f 66 20 61 72 63 68 69 76 65 5c  ents of archive\
25080 6e 22 0a 22 20 20 2d 78 2c 20 2d 2d 65 78 74 72  n"."  -x, --extr
25090 61 63 74 20 20 20 20 20 20 20 20 20 20 20 20 20  act             
250a0 20 45 78 74 72 61 63 74 20 66 69 6c 65 73 20 66   Extract files f
250b0 72 6f 6d 20 61 72 63 68 69 76 65 5c 6e 22 0a 22  rom archive\n"."
250c0 5c 6e 22 0a 22 41 6e 64 20 7a 65 72 6f 20 6f 72  \n"."And zero or
250d0 20 6d 6f 72 65 20 6f 70 74 69 6f 6e 61 6c 20 6f   more optional o
250e0 70 74 69 6f 6e 73 3a 5c 6e 22 0a 22 20 20 2d 76  ptions:\n"."  -v
250f0 2c 20 2d 2d 76 65 72 62 6f 73 65 20 20 20 20 20  , --verbose     
25100 20 20 20 20 20 20 20 20 20 50 72 69 6e 74 20 65           Print e
25110 61 63 68 20 66 69 6c 65 6e 61 6d 65 20 61 73 20  ach filename as 
25120 69 74 20 69 73 20 70 72 6f 63 65 73 73 65 64 5c  it is processed\
25130 6e 22 0a 22 20 20 2d 66 20 46 49 4c 45 2c 20 2d  n"."  -f FILE, -
25140 2d 66 69 6c 65 20 46 49 4c 45 20 20 20 20 20 20  -file FILE      
25150 20 4f 70 65 72 61 74 65 20 6f 6e 20 61 72 63 68   Operate on arch
25160 69 76 65 20 46 49 4c 45 20 28 64 65 66 61 75 6c  ive FILE (defaul
25170 74 20 69 73 20 63 75 72 72 65 6e 74 20 64 62 29  t is current db)
25180 5c 6e 22 0a 22 20 20 2d 61 20 46 49 4c 45 2c 20  \n"."  -a FILE, 
25190 2d 2d 61 70 70 65 6e 64 20 46 49 4c 45 20 20 20  --append FILE   
251a0 20 20 4f 70 65 72 61 74 65 20 6f 6e 20 46 49 4c    Operate on FIL
251b0 45 20 6f 70 65 6e 65 64 20 75 73 69 6e 67 20 74  E opened using t
251c0 68 65 20 61 70 6e 64 76 66 73 20 56 46 53 5c 6e  he apndvfs VFS\n
251d0 22 0a 22 20 20 2d 43 20 44 49 52 2c 20 2d 2d 64  "."  -C DIR, --d
251e0 69 72 65 63 74 6f 72 79 20 44 49 52 20 20 20 20  irectory DIR    
251f0 43 68 61 6e 67 65 20 74 6f 20 64 69 72 65 63 74  Change to direct
25200 6f 72 79 20 44 49 52 20 74 6f 20 72 65 61 64 2f  ory DIR to read/
25210 65 78 74 72 61 63 74 20 66 69 6c 65 73 5c 6e 22  extract files\n"
25220 0a 22 20 20 2d 6e 2c 20 2d 2d 64 72 79 72 75 6e  ."  -n, --dryrun
25230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
25240 68 6f 77 20 74 68 65 20 53 51 4c 20 74 68 61 74  how the SQL that
25250 20 77 6f 75 6c 64 20 68 61 76 65 20 6f 63 63 75   would have occu
25260 72 72 65 64 5c 6e 22 0a 22 5c 6e 22 0a 22 53 65  rred\n"."\n"."Se
25270 65 20 61 6c 73 6f 3a 20 68 74 74 70 3a 2f 2f 73  e also: http://s
25280 71 6c 69 74 65 2e 6f 72 67 2f 63 6c 69 2e 68 74  qlite.org/cli.ht
25290 6d 6c 23 73 71 6c 61 72 5f 61 72 63 68 69 76 65  ml#sqlar_archive
252a0 5f 73 75 70 70 6f 72 74 5c 6e 22 0a 22 5c 6e 22  _support\n"."\n"
252b0 0a 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  .);.  return SQL
252c0 49 54 45 5f 45 52 52 4f 52 3b 0a 7d 0a 0a 2f 2a  ITE_ERROR;.}../*
252d0 0a 2a 2a 20 50 72 69 6e 74 20 61 6e 20 65 72 72  .** Print an err
252e0 6f 72 20 6d 65 73 73 61 67 65 20 66 6f 72 20 74  or message for t
252f0 68 65 20 2e 61 72 20 63 6f 6d 6d 61 6e 64 20 74  he .ar command t
25300 6f 20 73 74 64 65 72 72 20 61 6e 64 20 72 65 74  o stderr and ret
25310 75 72 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 45  urn .** SQLITE_E
25320 52 52 4f 52 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  RROR..*/.static 
25330 69 6e 74 20 61 72 45 72 72 6f 72 4d 73 67 28 63  int arErrorMsg(c
25340 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6d 74 2c  onst char *zFmt,
25350 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74   ...){.  va_list
25360 20 61 70 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a   ap;.  char *z;.
25370 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a    va_start(ap, z
25380 46 6d 74 29 3b 0a 20 20 7a 20 3d 20 73 71 6c 69  Fmt);.  z = sqli
25390 74 65 33 5f 76 6d 70 72 69 6e 74 66 28 7a 46 6d  te3_vmprintf(zFm
253a0 74 2c 20 61 70 29 3b 0a 20 20 76 61 5f 65 6e 64  t, ap);.  va_end
253b0 28 61 70 29 3b 0a 20 20 72 61 77 5f 70 72 69 6e  (ap);.  raw_prin
253c0 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f  tf(stderr, "Erro
253d0 72 3a 20 25 73 20 28 74 72 79 20 5c 22 2e 61 72  r: %s (try \".ar
253e0 20 2d 2d 68 65 6c 70 5c 22 29 5c 6e 22 2c 20 7a   --help\")\n", z
253f0 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
25400 65 28 7a 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  e(z);.  return S
25410 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 7d 0a 0a  QLITE_ERROR;.}..
25420 2f 2a 0a 2a 2a 20 56 61 6c 75 65 73 20 66 6f 72  /*.** Values for
25430 20 41 72 43 6f 6d 6d 61 6e 64 2e 65 43 6d 64 2e   ArCommand.eCmd.
25440 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 41 52 5f 43  .*/.#define AR_C
25450 4d 44 5f 43 52 45 41 54 45 20 20 20 20 20 20 20  MD_CREATE       
25460 31 0a 23 64 65 66 69 6e 65 20 41 52 5f 43 4d 44  1.#define AR_CMD
25470 5f 45 58 54 52 41 43 54 20 20 20 20 20 20 32 0a  _EXTRACT      2.
25480 23 64 65 66 69 6e 65 20 41 52 5f 43 4d 44 5f 4c  #define AR_CMD_L
25490 49 53 54 20 20 20 20 20 20 20 20 20 33 0a 23 64  IST         3.#d
254a0 65 66 69 6e 65 20 41 52 5f 43 4d 44 5f 55 50 44  efine AR_CMD_UPD
254b0 41 54 45 20 20 20 20 20 20 20 34 0a 23 64 65 66  ATE       4.#def
254c0 69 6e 65 20 41 52 5f 43 4d 44 5f 48 45 4c 50 20  ine AR_CMD_HELP 
254d0 20 20 20 20 20 20 20 20 35 0a 0a 2f 2a 0a 2a 2a          5../*.**
254e0 20 4f 74 68 65 72 20 28 6e 6f 6e 2d 63 6f 6d 6d   Other (non-comm
254f0 61 6e 64 29 20 73 77 69 74 63 68 65 73 2e 0a 2a  and) switches..*
25500 2f 0a 23 64 65 66 69 6e 65 20 41 52 5f 53 57 49  /.#define AR_SWI
25510 54 43 48 5f 56 45 52 42 4f 53 45 20 20 20 20 20  TCH_VERBOSE     
25520 36 0a 23 64 65 66 69 6e 65 20 41 52 5f 53 57 49  6.#define AR_SWI
25530 54 43 48 5f 46 49 4c 45 20 20 20 20 20 20 20 20  TCH_FILE        
25540 37 0a 23 64 65 66 69 6e 65 20 41 52 5f 53 57 49  7.#define AR_SWI
25550 54 43 48 5f 44 49 52 45 43 54 4f 52 59 20 20 20  TCH_DIRECTORY   
25560 38 0a 23 64 65 66 69 6e 65 20 41 52 5f 53 57 49  8.#define AR_SWI
25570 54 43 48 5f 41 50 50 45 4e 44 20 20 20 20 20 20  TCH_APPEND      
25580 39 0a 23 64 65 66 69 6e 65 20 41 52 5f 53 57 49  9.#define AR_SWI
25590 54 43 48 5f 44 52 59 52 55 4e 20 20 20 20 20 31  TCH_DRYRUN     1
255a0 30 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 61 72  0..static int ar
255b0 50 72 6f 63 65 73 73 53 77 69 74 63 68 28 41 72  ProcessSwitch(Ar
255c0 43 6f 6d 6d 61 6e 64 20 2a 70 41 72 2c 20 69 6e  Command *pAr, in
255d0 74 20 65 53 77 69 74 63 68 2c 20 63 6f 6e 73 74  t eSwitch, const
255e0 20 63 68 61 72 20 2a 7a 41 72 67 29 7b 0a 20 20   char *zArg){.  
255f0 73 77 69 74 63 68 28 20 65 53 77 69 74 63 68 20  switch( eSwitch 
25600 29 7b 0a 20 20 20 20 63 61 73 65 20 41 52 5f 43  ){.    case AR_C
25610 4d 44 5f 43 52 45 41 54 45 3a 0a 20 20 20 20 63  MD_CREATE:.    c
25620 61 73 65 20 41 52 5f 43 4d 44 5f 45 58 54 52 41  ase AR_CMD_EXTRA
25630 43 54 3a 0a 20 20 20 20 63 61 73 65 20 41 52 5f  CT:.    case AR_
25640 43 4d 44 5f 4c 49 53 54 3a 0a 20 20 20 20 63 61  CMD_LIST:.    ca
25650 73 65 20 41 52 5f 43 4d 44 5f 55 50 44 41 54 45  se AR_CMD_UPDATE
25660 3a 0a 20 20 20 20 63 61 73 65 20 41 52 5f 43 4d  :.    case AR_CM
25670 44 5f 48 45 4c 50 3a 0a 20 20 20 20 20 20 69 66  D_HELP:.      if
25680 28 20 70 41 72 2d 3e 65 43 6d 64 20 29 7b 0a 20  ( pAr->eCmd ){. 
25690 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 61 72         return ar
256a0 45 72 72 6f 72 4d 73 67 28 22 6d 75 6c 74 69 70  ErrorMsg("multip
256b0 6c 65 20 63 6f 6d 6d 61 6e 64 20 6f 70 74 69 6f  le command optio
256c0 6e 73 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ns");.      }.  
256d0 20 20 20 20 70 41 72 2d 3e 65 43 6d 64 20 3d 20      pAr->eCmd = 
256e0 65 53 77 69 74 63 68 3b 0a 20 20 20 20 20 20 62  eSwitch;.      b
256f0 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20  reak;..    case 
25700 41 52 5f 53 57 49 54 43 48 5f 44 52 59 52 55 4e  AR_SWITCH_DRYRUN
25710 3a 0a 20 20 20 20 20 20 70 41 72 2d 3e 62 44 72  :.      pAr->bDr
25720 79 52 75 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20  yRun = 1;.      
25730 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
25740 41 52 5f 53 57 49 54 43 48 5f 56 45 52 42 4f 53  AR_SWITCH_VERBOS
25750 45 3a 0a 20 20 20 20 20 20 70 41 72 2d 3e 62 56  E:.      pAr->bV
25760 65 72 62 6f 73 65 20 3d 20 31 3b 0a 20 20 20 20  erbose = 1;.    
25770 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
25780 65 20 41 52 5f 53 57 49 54 43 48 5f 41 50 50 45  e AR_SWITCH_APPE
25790 4e 44 3a 0a 20 20 20 20 20 20 70 41 72 2d 3e 62  ND:.      pAr->b
257a0 41 70 70 65 6e 64 20 3d 20 31 3b 0a 20 20 20 20  Append = 1;.    
257b0 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72 75 20 69    /* Fall thru i
257c0 6e 74 6f 20 2d 2d 66 69 6c 65 20 2a 2f 0a 20 20  nto --file */.  
257d0 20 20 63 61 73 65 20 41 52 5f 53 57 49 54 43 48    case AR_SWITCH
257e0 5f 46 49 4c 45 3a 0a 20 20 20 20 20 20 70 41 72  _FILE:.      pAr
257f0 2d 3e 7a 46 69 6c 65 20 3d 20 7a 41 72 67 3b 0a  ->zFile = zArg;.
25800 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
25810 20 63 61 73 65 20 41 52 5f 53 57 49 54 43 48 5f   case AR_SWITCH_
25820 44 49 52 45 43 54 4f 52 59 3a 0a 20 20 20 20 20  DIRECTORY:.     
25830 20 70 41 72 2d 3e 7a 44 69 72 20 3d 20 7a 41 72   pAr->zDir = zAr
25840 67 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  g;.      break;.
25850 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51    }..  return SQ
25860 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
25870 2a 20 50 61 72 73 65 20 74 68 65 20 63 6f 6d 6d  * Parse the comm
25880 61 6e 64 20 6c 69 6e 65 20 66 6f 72 20 61 6e 20  and line for an 
25890 22 2e 61 72 22 20 63 6f 6d 6d 61 6e 64 2e 20 54  ".ar" command. T
258a0 68 65 20 72 65 73 75 6c 74 73 20 61 72 65 20 77  he results are w
258b0 72 69 74 74 65 6e 20 69 6e 74 6f 0a 2a 2a 20 73  ritten into.** s
258c0 74 72 75 63 74 75 72 65 20 28 2a 70 41 72 29 2e  tructure (*pAr).
258d0 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
258e0 74 75 72 6e 65 64 20 69 66 20 74 68 65 20 63 6f  turned if the co
258f0 6d 6d 61 6e 64 20 6c 69 6e 65 20 69 73 20 70 61  mmand line is pa
25900 72 73 65 64 0a 2a 2a 20 73 75 63 63 65 73 73 66  rsed.** successf
25910 75 6c 6c 79 2c 20 6f 74 68 65 72 77 69 73 65 20  ully, otherwise 
25920 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
25930 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 73   is written to s
25940 74 64 65 72 72 20 61 6e 64 20 0a 2a 2a 20 53 51  tderr and .** SQ
25950 4c 49 54 45 5f 45 52 52 4f 52 20 72 65 74 75 72  LITE_ERROR retur
25960 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
25970 6e 74 20 61 72 50 61 72 73 65 43 6f 6d 6d 61 6e  nt arParseComman
25980 64 28 0a 20 20 63 68 61 72 20 2a 2a 61 7a 41 72  d(.  char **azAr
25990 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g,              
259a0 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66       /* Array of
259b0 20 61 72 67 75 6d 65 6e 74 73 20 70 61 73 73 65   arguments passe
259c0 64 20 74 6f 20 64 6f 74 20 63 6f 6d 6d 61 6e 64  d to dot command
259d0 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 72 67 2c 20   */.  int nArg, 
259e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
259f0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
25a00 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 61 7a  of entries in az
25a10 41 72 67 5b 5d 20 2a 2f 0a 20 20 41 72 43 6f 6d  Arg[] */.  ArCom
25a20 6d 61 6e 64 20 2a 70 41 72 20 20 20 20 20 20 20  mand *pAr       
25a30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
25a40 70 75 6c 61 74 65 20 74 68 69 73 20 6f 62 6a 65  pulate this obje
25a50 63 74 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63  ct */.){.  struc
25a60 74 20 41 72 53 77 69 74 63 68 20 7b 0a 20 20 20  t ArSwitch {.   
25a70 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4c 6f   const char *zLo
25a80 6e 67 3b 0a 20 20 20 20 63 68 61 72 20 63 53 68  ng;.    char cSh
25a90 6f 72 74 3b 0a 20 20 20 20 75 38 20 65 53 77 69  ort;.    u8 eSwi
25aa0 74 63 68 3b 0a 20 20 20 20 75 38 20 62 41 72 67  tch;.    u8 bArg
25ab0 3b 0a 20 20 7d 20 61 53 77 69 74 63 68 5b 5d 20  ;.  } aSwitch[] 
25ac0 3d 20 7b 0a 20 20 20 20 7b 20 22 63 72 65 61 74  = {.    { "creat
25ad0 65 22 2c 20 20 20 20 27 63 27 2c 20 41 52 5f 43  e",    'c', AR_C
25ae0 4d 44 5f 43 52 45 41 54 45 2c 20 20 20 20 20 20  MD_CREATE,      
25af0 20 30 20 7d 2c 0a 20 20 20 20 7b 20 22 65 78 74   0 },.    { "ext
25b00 72 61 63 74 22 2c 20 20 20 27 78 27 2c 20 41 52  ract",   'x', AR
25b10 5f 43 4d 44 5f 45 58 54 52 41 43 54 2c 20 20 20  _CMD_EXTRACT,   
25b20 20 20 20 30 20 7d 2c 0a 20 20 20 20 7b 20 22 6c     0 },.    { "l
25b30 69 73 74 22 2c 20 20 20 20 20 20 27 74 27 2c 20  ist",      't', 
25b40 41 52 5f 43 4d 44 5f 4c 49 53 54 2c 20 20 20 20  AR_CMD_LIST,    
25b50 20 20 20 20 20 30 20 7d 2c 0a 20 20 20 20 7b 20       0 },.    { 
25b60 22 75 70 64 61 74 65 22 2c 20 20 20 20 27 75 27  "update",    'u'
25b70 2c 20 41 52 5f 43 4d 44 5f 55 50 44 41 54 45 2c  , AR_CMD_UPDATE,
25b80 20 20 20 20 20 20 20 30 20 7d 2c 0a 20 20 20 20         0 },.    
25b90 7b 20 22 68 65 6c 70 22 2c 20 20 20 20 20 20 27  { "help",      '
25ba0 68 27 2c 20 41 52 5f 43 4d 44 5f 48 45 4c 50 2c  h', AR_CMD_HELP,
25bb0 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 20 20           0 },.  
25bc0 20 20 7b 20 22 76 65 72 62 6f 73 65 22 2c 20 20    { "verbose",  
25bd0 20 27 76 27 2c 20 41 52 5f 53 57 49 54 43 48 5f   'v', AR_SWITCH_
25be0 56 45 52 42 4f 53 45 2c 20 20 20 30 20 7d 2c 0a  VERBOSE,   0 },.
25bf0 20 20 20 20 7b 20 22 66 69 6c 65 22 2c 20 20 20      { "file",   
25c00 20 20 20 27 66 27 2c 20 41 52 5f 53 57 49 54 43     'f', AR_SWITC
25c10 48 5f 46 49 4c 45 2c 20 20 20 20 20 20 31 20 7d  H_FILE,      1 }
25c20 2c 0a 20 20 20 20 7b 20 22 61 70 70 65 6e 64 22  ,.    { "append"
25c30 2c 20 20 20 20 27 61 27 2c 20 41 52 5f 53 57 49  ,    'a', AR_SWI
25c40 54 43 48 5f 41 50 50 45 4e 44 2c 20 20 20 20 31  TCH_APPEND,    1
25c50 20 7d 2c 0a 20 20 20 20 7b 20 22 64 69 72 65 63   },.    { "direc
25c60 74 6f 72 79 22 2c 20 27 43 27 2c 20 41 52 5f 53  tory", 'C', AR_S
25c70 57 49 54 43 48 5f 44 49 52 45 43 54 4f 52 59 2c  WITCH_DIRECTORY,
25c80 20 31 20 7d 2c 0a 20 20 20 20 7b 20 22 64 72 79   1 },.    { "dry
25c90 72 75 6e 22 2c 20 20 20 20 27 6e 27 2c 20 41 52  run",    'n', AR
25ca0 5f 53 57 49 54 43 48 5f 44 52 59 52 55 4e 2c 20  _SWITCH_DRYRUN, 
25cb0 20 20 20 30 20 7d 2c 0a 20 20 7d 3b 0a 20 20 69     0 },.  };.  i
25cc0 6e 74 20 6e 53 77 69 74 63 68 20 3d 20 73 69 7a  nt nSwitch = siz
25cd0 65 6f 66 28 61 53 77 69 74 63 68 29 20 2f 20 73  eof(aSwitch) / s
25ce0 69 7a 65 6f 66 28 73 74 72 75 63 74 20 41 72 53  izeof(struct ArS
25cf0 77 69 74 63 68 29 3b 0a 20 20 73 74 72 75 63 74  witch);.  struct
25d00 20 41 72 53 77 69 74 63 68 20 2a 70 45 6e 64 20   ArSwitch *pEnd 
25d10 3d 20 26 61 53 77 69 74 63 68 5b 6e 53 77 69 74  = &aSwitch[nSwit
25d20 63 68 5d 3b 0a 0a 20 20 69 66 28 20 6e 41 72 67  ch];..  if( nArg
25d30 3c 3d 31 20 29 7b 0a 20 20 20 20 72 65 74 75 72  <=1 ){.    retur
25d40 6e 20 61 72 55 73 61 67 65 28 73 74 64 65 72 72  n arUsage(stderr
25d50 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
25d60 63 68 61 72 20 2a 7a 20 3d 20 61 7a 41 72 67 5b  char *z = azArg[
25d70 31 5d 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70  1];.    memset(p
25d80 41 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 41 72  Ar, 0, sizeof(Ar
25d90 43 6f 6d 6d 61 6e 64 29 29 3b 0a 0a 20 20 20 20  Command));..    
25da0 69 66 28 20 7a 5b 30 5d 21 3d 27 2d 27 20 29 7b  if( z[0]!='-' ){
25db0 0a 20 20 20 20 20 20 2f 2a 20 54 72 61 64 69 74  .      /* Tradit
25dc0 69 6f 6e 61 6c 20 73 74 79 6c 65 20 5b 74 61 72  ional style [tar
25dd0 5d 20 69 6e 76 6f 63 61 74 69 6f 6e 20 2a 2f 0a  ] invocation */.
25de0 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
25df0 20 20 20 69 6e 74 20 69 41 72 67 20 3d 20 32 3b     int iArg = 2;
25e00 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
25e10 7a 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  z[i]; i++){.    
25e20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
25e30 7a 41 72 67 20 3d 20 30 3b 0a 20 20 20 20 20 20  zArg = 0;.      
25e40 20 20 73 74 72 75 63 74 20 41 72 53 77 69 74 63    struct ArSwitc
25e50 68 20 2a 70 4f 70 74 3b 0a 20 20 20 20 20 20 20  h *pOpt;.       
25e60 20 66 6f 72 28 70 4f 70 74 3d 26 61 53 77 69 74   for(pOpt=&aSwit
25e70 63 68 5b 30 5d 3b 20 70 4f 70 74 3c 70 45 6e 64  ch[0]; pOpt<pEnd
25e80 3b 20 70 4f 70 74 2b 2b 29 7b 0a 20 20 20 20 20  ; pOpt++){.     
25e90 20 20 20 20 20 69 66 28 20 7a 5b 69 5d 3d 3d 70       if( z[i]==p
25ea0 4f 70 74 2d 3e 63 53 68 6f 72 74 20 29 20 62 72  Opt->cShort ) br
25eb0 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
25ec0 20 20 20 20 20 20 20 69 66 28 20 70 4f 70 74 3d         if( pOpt=
25ed0 3d 70 45 6e 64 20 29 7b 0a 20 20 20 20 20 20 20  =pEnd ){.       
25ee0 20 20 20 72 65 74 75 72 6e 20 61 72 45 72 72 6f     return arErro
25ef0 72 4d 73 67 28 22 75 6e 72 65 63 6f 67 6e 69 7a  rMsg("unrecogniz
25f00 65 64 20 6f 70 74 69 6f 6e 3a 20 25 63 22 2c 20  ed option: %c", 
25f10 7a 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d  z[i]);.        }
25f20 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 70  .        if( pOp
25f30 74 2d 3e 62 41 72 67 20 29 7b 0a 20 20 20 20 20  t->bArg ){.     
25f40 20 20 20 20 20 69 66 28 20 69 41 72 67 3e 3d 6e       if( iArg>=n
25f50 41 72 67 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Arg ){.         
25f60 20 20 20 72 65 74 75 72 6e 20 61 72 45 72 72 6f     return arErro
25f70 72 4d 73 67 28 22 6f 70 74 69 6f 6e 20 72 65 71  rMsg("option req
25f80 75 69 72 65 73 20 61 6e 20 61 72 67 75 6d 65 6e  uires an argumen
25f90 74 3a 20 25 63 22 2c 7a 5b 69 5d 29 3b 0a 20 20  t: %c",z[i]);.  
25fa0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
25fb0 20 20 20 20 7a 41 72 67 20 3d 20 61 7a 41 72 67      zArg = azArg
25fc0 5b 69 41 72 67 2b 2b 5d 3b 0a 20 20 20 20 20 20  [iArg++];.      
25fd0 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
25fe0 61 72 50 72 6f 63 65 73 73 53 77 69 74 63 68 28  arProcessSwitch(
25ff0 70 41 72 2c 20 70 4f 70 74 2d 3e 65 53 77 69 74  pAr, pOpt->eSwit
26000 63 68 2c 20 7a 41 72 67 29 20 29 20 72 65 74 75  ch, zArg) ) retu
26010 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
26020 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
26030 41 72 2d 3e 6e 41 72 67 20 3d 20 6e 41 72 67 2d  Ar->nArg = nArg-
26040 69 41 72 67 3b 0a 20 20 20 20 20 20 69 66 28 20  iArg;.      if( 
26050 70 41 72 2d 3e 6e 41 72 67 3e 30 20 29 7b 0a 20  pAr->nArg>0 ){. 
26060 20 20 20 20 20 20 20 70 41 72 2d 3e 61 7a 41 72         pAr->azAr
26070 67 20 3d 20 26 61 7a 41 72 67 5b 69 41 72 67 5d  g = &azArg[iArg]
26080 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
26090 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 4e 6f  lse{.      /* No
260a0 6e 2d 74 72 61 64 69 74 69 6f 6e 61 6c 20 69 6e  n-traditional in
260b0 76 6f 63 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  vocation */.    
260c0 20 20 69 6e 74 20 69 41 72 67 3b 0a 20 20 20 20    int iArg;.    
260d0 20 20 66 6f 72 28 69 41 72 67 3d 31 3b 20 69 41    for(iArg=1; iA
260e0 72 67 3c 6e 41 72 67 3b 20 69 41 72 67 2b 2b 29  rg<nArg; iArg++)
260f0 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 3b  {.        int n;
26100 0a 20 20 20 20 20 20 20 20 7a 20 3d 20 61 7a 41  .        z = azA
26110 72 67 5b 69 41 72 67 5d 3b 0a 20 20 20 20 20 20  rg[iArg];.      
26120 20 20 69 66 28 20 7a 5b 30 5d 21 3d 27 2d 27 20    if( z[0]!='-' 
26130 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
26140 41 6c 6c 20 72 65 6d 61 69 6e 69 6e 67 20 63 6f  All remaining co
26150 6d 6d 61 6e 64 20 6c 69 6e 65 20 77 6f 72 64 73  mmand line words
26160 20 61 72 65 20 63 6f 6d 6d 61 6e 64 20 61 72 67   are command arg
26170 75 6d 65 6e 74 73 2e 20 2a 2f 0a 20 20 20 20 20  uments. */.     
26180 20 20 20 20 20 70 41 72 2d 3e 61 7a 41 72 67 20       pAr->azArg 
26190 3d 20 26 61 7a 41 72 67 5b 69 41 72 67 5d 3b 0a  = &azArg[iArg];.
261a0 20 20 20 20 20 20 20 20 20 20 70 41 72 2d 3e 6e            pAr->n
261b0 41 72 67 20 3d 20 6e 41 72 67 2d 69 41 72 67 3b  Arg = nArg-iArg;
261c0 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
261d0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
261e0 20 20 20 20 6e 20 3d 20 73 74 72 6c 65 6e 33 30      n = strlen30
261f0 28 7a 29 3b 0a 0a 20 20 20 20 20 20 20 20 69 66  (z);..        if
26200 28 20 7a 5b 31 5d 21 3d 27 2d 27 20 29 7b 0a 20  ( z[1]!='-' ){. 
26210 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a           int i;.
26220 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65            /* One
26230 20 6f 72 20 6d 6f 72 65 20 73 68 6f 72 74 20 6f   or more short o
26240 70 74 69 6f 6e 73 20 2a 2f 0a 20 20 20 20 20 20  ptions */.      
26250 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e      for(i=1; i<n
26260 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
26270 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
26280 7a 41 72 67 20 3d 20 30 3b 0a 20 20 20 20 20 20  zArg = 0;.      
26290 20 20 20 20 20 20 73 74 72 75 63 74 20 41 72 53        struct ArS
262a0 77 69 74 63 68 20 2a 70 4f 70 74 3b 0a 20 20 20  witch *pOpt;.   
262b0 20 20 20 20 20 20 20 20 20 66 6f 72 28 70 4f 70           for(pOp
262c0 74 3d 26 61 53 77 69 74 63 68 5b 30 5d 3b 20 70  t=&aSwitch[0]; p
262d0 4f 70 74 3c 70 45 6e 64 3b 20 70 4f 70 74 2b 2b  Opt<pEnd; pOpt++
262e0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
262f0 20 69 66 28 20 7a 5b 69 5d 3d 3d 70 4f 70 74 2d   if( z[i]==pOpt-
26300 3e 63 53 68 6f 72 74 20 29 20 62 72 65 61 6b 3b  >cShort ) break;
26310 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
26320 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
26330 4f 70 74 3d 3d 70 45 6e 64 20 29 7b 0a 20 20 20  Opt==pEnd ){.   
26340 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
26350 6e 20 61 72 45 72 72 6f 72 4d 73 67 28 22 75 6e  n arErrorMsg("un
26360 72 65 63 6f 67 6e 69 7a 65 64 20 6f 70 74 69 6f  recognized optio
26370 6e 3a 20 25 63 5c 6e 22 2c 20 7a 5b 69 5d 29 3b  n: %c\n", z[i]);
26380 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
26390 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
263a0 4f 70 74 2d 3e 62 41 72 67 20 29 7b 0a 20 20 20  Opt->bArg ){.   
263b0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69             if( i
263c0 3c 28 6e 2d 31 29 20 29 7b 0a 20 20 20 20 20 20  <(n-1) ){.      
263d0 20 20 20 20 20 20 20 20 20 20 7a 41 72 67 20 3d            zArg =
263e0 20 26 7a 5b 69 2b 31 5d 3b 0a 20 20 20 20 20 20   &z[i+1];.      
263f0 20 20 20 20 20 20 20 20 20 20 69 20 3d 20 6e 3b            i = n;
26400 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
26410 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
26420 20 20 20 20 20 20 69 66 28 20 69 41 72 67 3e 3d        if( iArg>=
26430 28 6e 41 72 67 2d 31 29 20 29 7b 0a 20 20 20 20  (nArg-1) ){.    
26440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
26450 74 75 72 6e 20 61 72 45 72 72 6f 72 4d 73 67 28  turn arErrorMsg(
26460 22 6f 70 74 69 6f 6e 20 72 65 71 75 69 72 65 73  "option requires
26470 20 61 6e 20 61 72 67 75 6d 65 6e 74 3a 20 25 63   an argument: %c
26480 5c 6e 22 2c 7a 5b 69 5d 29 3b 0a 20 20 20 20 20  \n",z[i]);.     
26490 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
264a0 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 41 72               zAr
264b0 67 20 3d 20 61 7a 41 72 67 5b 2b 2b 69 41 72 67  g = azArg[++iArg
264c0 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ];.             
264d0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d   }.            }
264e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
264f0 20 61 72 50 72 6f 63 65 73 73 53 77 69 74 63 68   arProcessSwitch
26500 28 70 41 72 2c 20 70 4f 70 74 2d 3e 65 53 77 69  (pAr, pOpt->eSwi
26510 74 63 68 2c 20 7a 41 72 67 29 20 29 20 72 65 74  tch, zArg) ) ret
26520 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
26530 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
26540 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
26550 7a 5b 32 5d 3d 3d 27 5c 30 27 20 29 7b 0a 20 20  z[2]=='\0' ){.  
26560 20 20 20 20 20 20 20 20 2f 2a 20 41 20 2d 2d 20          /* A -- 
26570 6f 70 74 69 6f 6e 2c 20 69 6e 64 69 63 61 74 69  option, indicati
26580 6e 67 20 74 68 61 74 20 61 6c 6c 20 72 65 6d 61  ng that all rema
26590 69 6e 69 6e 67 20 63 6f 6d 6d 61 6e 64 20 6c 69  ining command li
265a0 6e 65 20 77 6f 72 64 73 0a 20 20 20 20 20 20 20  ne words.       
265b0 20 20 20 2a 2a 20 61 72 65 20 63 6f 6d 6d 61 6e     ** are comman
265c0 64 20 61 72 67 75 6d 65 6e 74 73 2e 20 20 2a 2f  d arguments.  */
265d0 0a 20 20 20 20 20 20 20 20 20 20 70 41 72 2d 3e  .          pAr->
265e0 61 7a 41 72 67 20 3d 20 26 61 7a 41 72 67 5b 69  azArg = &azArg[i
265f0 41 72 67 2b 31 5d 3b 0a 20 20 20 20 20 20 20 20  Arg+1];.        
26600 20 20 70 41 72 2d 3e 6e 41 72 67 20 3d 20 6e 41    pAr->nArg = nA
26610 72 67 2d 69 41 72 67 2d 31 3b 0a 20 20 20 20 20  rg-iArg-1;.     
26620 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
26630 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
26640 20 20 20 20 20 2f 2a 20 41 20 6c 6f 6e 67 20 6f       /* A long o
26650 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20  ption */.       
26660 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
26670 41 72 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Arg = 0;        
26680 20 20 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74       /* Argument
26690 20 66 6f 72 20 6f 70 74 69 6f 6e 2c 20 69 66 20   for option, if 
266a0 61 6e 79 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  any */.         
266b0 20 73 74 72 75 63 74 20 41 72 53 77 69 74 63 68   struct ArSwitch
266c0 20 2a 70 4d 61 74 63 68 20 3d 20 30 3b 20 20 20   *pMatch = 0;   
266d0 20 20 20 2f 2a 20 4d 61 74 63 68 69 6e 67 20 6f     /* Matching o
266e0 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20  ption */.       
266f0 20 20 20 73 74 72 75 63 74 20 41 72 53 77 69 74     struct ArSwit
26700 63 68 20 2a 70 4f 70 74 3b 20 20 20 20 20 20 20  ch *pOpt;       
26710 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72       /* Iterator
26720 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 66 6f   */.          fo
26730 72 28 70 4f 70 74 3d 26 61 53 77 69 74 63 68 5b  r(pOpt=&aSwitch[
26740 30 5d 3b 20 70 4f 70 74 3c 70 45 6e 64 3b 20 70  0]; pOpt<pEnd; p
26750 4f 70 74 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  Opt++){.        
26760 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
26770 7a 4c 6f 6e 67 20 3d 20 70 4f 70 74 2d 3e 7a 4c  zLong = pOpt->zL
26780 6f 6e 67 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ong;.           
26790 20 69 66 28 20 28 6e 2d 32 29 3c 3d 73 74 72 6c   if( (n-2)<=strl
267a0 65 6e 33 30 28 7a 4c 6f 6e 67 29 20 26 26 20 30  en30(zLong) && 0
267b0 3d 3d 6d 65 6d 63 6d 70 28 26 7a 5b 32 5d 2c 20  ==memcmp(&z[2], 
267c0 7a 4c 6f 6e 67 2c 20 6e 2d 32 29 20 29 7b 0a 20  zLong, n-2) ){. 
267d0 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
267e0 20 70 4d 61 74 63 68 20 29 7b 0a 20 20 20 20 20   pMatch ){.     
267f0 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
26800 6e 20 61 72 45 72 72 6f 72 4d 73 67 28 22 61 6d  n arErrorMsg("am
26810 62 69 67 75 6f 75 73 20 6f 70 74 69 6f 6e 3a 20  biguous option: 
26820 25 73 22 2c 7a 29 3b 0a 20 20 20 20 20 20 20 20  %s",z);.        
26830 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
26840 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4d 61               pMa
26850 74 63 68 20 3d 20 70 4f 70 74 3b 0a 20 20 20 20  tch = pOpt;.    
26860 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
26870 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
26880 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 20      }..         
26890 20 69 66 28 20 70 4d 61 74 63 68 3d 3d 30 20 29   if( pMatch==0 )
268a0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  {.            re
268b0 74 75 72 6e 20 61 72 45 72 72 6f 72 4d 73 67 28  turn arErrorMsg(
268c0 22 75 6e 72 65 63 6f 67 6e 69 7a 65 64 20 6f 70  "unrecognized op
268d0 74 69 6f 6e 3a 20 25 73 22 2c 20 7a 29 3b 0a 20  tion: %s", z);. 
268e0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
268f0 20 20 20 20 20 69 66 28 20 70 4d 61 74 63 68 2d       if( pMatch-
26900 3e 62 41 72 67 20 29 7b 0a 20 20 20 20 20 20 20  >bArg ){.       
26910 20 20 20 20 20 69 66 28 20 69 41 72 67 3e 3d 28       if( iArg>=(
26920 6e 41 72 67 2d 31 29 20 29 7b 0a 20 20 20 20 20  nArg-1) ){.     
26930 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
26940 61 72 45 72 72 6f 72 4d 73 67 28 22 6f 70 74 69  arErrorMsg("opti
26950 6f 6e 20 72 65 71 75 69 72 65 73 20 61 6e 20 61  on requires an a
26960 72 67 75 6d 65 6e 74 3a 20 25 73 22 2c 20 7a 29  rgument: %s", z)
26970 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
26980 20 20 20 20 20 20 20 20 20 20 20 20 7a 41 72 67              zArg
26990 20 3d 20 61 7a 41 72 67 5b 2b 2b 69 41 72 67 5d   = azArg[++iArg]
269a0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
269b0 20 20 20 20 20 20 20 20 69 66 28 20 61 72 50 72          if( arPr
269c0 6f 63 65 73 73 53 77 69 74 63 68 28 70 41 72 2c  ocessSwitch(pAr,
269d0 20 70 4d 61 74 63 68 2d 3e 65 53 77 69 74 63 68   pMatch->eSwitch
269e0 2c 20 7a 41 72 67 29 20 29 20 72 65 74 75 72 6e  , zArg) ) return
269f0 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
26a00 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
26a10 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65  .    }.  }..  re
26a20 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
26a30 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
26a40 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65 73 20 74  nction assumes t
26a50 68 61 74 20 61 6c 6c 20 61 72 67 75 6d 65 6e 74  hat all argument
26a60 73 20 77 69 74 68 69 6e 20 74 68 65 20 41 72 43  s within the ArC
26a70 6f 6d 6d 61 6e 64 2e 61 7a 41 72 67 5b 5d 0a 2a  ommand.azArg[].*
26a80 2a 20 61 72 72 61 79 20 72 65 66 65 72 20 74 6f  * array refer to
26a90 20 61 72 63 68 69 76 65 20 6d 65 6d 62 65 72 73   archive members
26aa0 2c 20 61 73 20 66 6f 72 20 74 68 65 20 2d 2d 65  , as for the --e
26ab0 78 74 72 61 63 74 20 6f 72 20 2d 2d 6c 69 73 74  xtract or --list
26ac0 20 63 6f 6d 6d 61 6e 64 73 2e 20 0a 2a 2a 20 49   commands. .** I
26ad0 74 20 63 68 65 63 6b 73 20 74 68 61 74 20 65 61  t checks that ea
26ae0 63 68 20 6f 66 20 74 68 65 6d 20 61 72 65 20 70  ch of them are p
26af0 72 65 73 65 6e 74 2e 20 49 66 20 61 6e 79 20 73  resent. If any s
26b00 70 65 63 69 66 69 65 64 20 66 69 6c 65 20 69 73  pecified file is
26b10 20 6e 6f 74 0a 2a 2a 20 70 72 65 73 65 6e 74 20   not.** present 
26b20 69 6e 20 74 68 65 20 61 72 63 68 69 76 65 2c 20  in the archive, 
26b30 61 6e 20 65 72 72 6f 72 20 69 73 20 70 72 69 6e  an error is prin
26b40 74 65 64 20 74 6f 20 73 74 64 65 72 72 20 61 6e  ted to stderr an
26b50 64 20 61 6e 20 65 72 72 6f 72 0a 2a 2a 20 63 6f  d an error.** co
26b60 64 65 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68  de returned. Oth
26b70 65 72 77 69 73 65 2c 20 69 66 20 61 6c 6c 20 73  erwise, if all s
26b80 70 65 63 69 66 69 65 64 20 61 72 67 75 6d 65 6e  pecified argumen
26b90 74 73 20 61 72 65 20 70 72 65 73 65 6e 74 20 69  ts are present i
26ba0 6e 0a 2a 2a 20 74 68 65 20 61 72 63 68 69 76 65  n.** the archive
26bb0 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  , SQLITE_OK is r
26bc0 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  eturned..**.** T
26bd0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 74 72  his function str
26be0 69 70 73 20 61 6e 79 20 74 72 61 69 6c 69 6e 67  ips any trailing
26bf0 20 27 2f 27 20 63 68 61 72 61 63 74 65 72 73 20   '/' characters 
26c00 66 72 6f 6d 20 65 61 63 68 20 61 72 67 75 6d 65  from each argume
26c10 6e 74 2e 0a 2a 2a 20 54 68 69 73 20 69 73 20 63  nt..** This is c
26c20 6f 6e 73 69 73 74 65 6e 74 20 77 69 74 68 20 74  onsistent with t
26c30 68 65 20 77 61 79 20 74 68 65 20 5b 74 61 72 5d  he way the [tar]
26c40 20 63 6f 6d 6d 61 6e 64 20 73 65 65 6d 73 20 74   command seems t
26c50 6f 20 77 6f 72 6b 20 6f 6e 0a 2a 2a 20 4c 69 6e  o work on.** Lin
26c60 75 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ux..*/.static in
26c70 74 20 61 72 43 68 65 63 6b 45 6e 74 72 69 65 73  t arCheckEntries
26c80 28 41 72 43 6f 6d 6d 61 6e 64 20 2a 70 41 72 29  (ArCommand *pAr)
26c90 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
26ca0 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 41  ITE_OK;.  if( pA
26cb0 72 2d 3e 6e 41 72 67 20 29 7b 0a 20 20 20 20 69  r->nArg ){.    i
26cc0 6e 74 20 69 2c 20 6a 3b 0a 20 20 20 20 73 71 6c  nt i, j;.    sql
26cd0 69 74 65 33 5f 73 74 6d 74 20 2a 70 54 65 73 74  ite3_stmt *pTest
26ce0 20 3d 20 30 3b 0a 0a 20 20 20 20 73 68 65 6c 6c   = 0;..    shell
26cf0 50 72 65 70 61 72 65 50 72 69 6e 74 66 28 70 41  PreparePrintf(pA
26d00 72 2d 3e 64 62 2c 20 26 72 63 2c 20 26 70 54 65  r->db, &rc, &pTe
26d10 73 74 2c 0a 20 20 20 20 20 20 20 20 22 53 45 4c  st,.        "SEL
26d20 45 43 54 20 6e 61 6d 65 20 46 52 4f 4d 20 25 73  ECT name FROM %s
26d30 20 57 48 45 52 45 20 6e 61 6d 65 3d 24 6e 61 6d   WHERE name=$nam
26d40 65 22 2c 20 0a 20 20 20 20 20 20 20 20 70 41 72  e", .        pAr
26d50 2d 3e 7a 53 72 63 54 61 62 6c 65 0a 20 20 20 20  ->zSrcTable.    
26d60 29 3b 0a 20 20 20 20 6a 20 3d 20 73 71 6c 69 74  );.    j = sqlit
26d70 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65  e3_bind_paramete
26d80 72 5f 69 6e 64 65 78 28 70 54 65 73 74 2c 20 22  r_index(pTest, "
26d90 24 6e 61 6d 65 22 29 3b 0a 20 20 20 20 66 6f 72  $name");.    for
26da0 28 69 3d 30 3b 20 69 3c 70 41 72 2d 3e 6e 41 72  (i=0; i<pAr->nAr
26db0 67 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  g && rc==SQLITE_
26dc0 4f 4b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  OK; i++){.      
26dd0 63 68 61 72 20 2a 7a 20 3d 20 70 41 72 2d 3e 61  char *z = pAr->a
26de0 7a 41 72 67 5b 69 5d 3b 0a 20 20 20 20 20 20 69  zArg[i];.      i
26df0 6e 74 20 6e 20 3d 20 73 74 72 6c 65 6e 33 30 28  nt n = strlen30(
26e00 7a 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 62 4f  z);.      int bO
26e10 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 77 68 69  k = 0;.      whi
26e20 6c 65 28 20 6e 3e 30 20 26 26 20 7a 5b 6e 2d 31  le( n>0 && z[n-1
26e30 5d 3d 3d 27 2f 27 20 29 20 6e 2d 2d 3b 0a 20 20  ]=='/' ) n--;.  
26e40 20 20 20 20 7a 5b 6e 5d 20 3d 20 27 5c 30 27 3b      z[n] = '\0';
26e50 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62  .      sqlite3_b
26e60 69 6e 64 5f 74 65 78 74 28 70 54 65 73 74 2c 20  ind_text(pTest, 
26e70 6a 2c 20 7a 2c 20 2d 31 2c 20 53 51 4c 49 54 45  j, z, -1, SQLITE
26e80 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20  _STATIC);.      
26e90 69 66 28 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d  if( SQLITE_ROW==
26ea0 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 54 65  sqlite3_step(pTe
26eb0 73 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 62  st) ){.        b
26ec0 4f 6b 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  Ok = 1;.      }.
26ed0 20 20 20 20 20 20 73 68 65 6c 6c 52 65 73 65 74        shellReset
26ee0 28 26 72 63 2c 20 70 54 65 73 74 29 3b 0a 20 20  (&rc, pTest);.  
26ef0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
26f00 54 45 5f 4f 4b 20 26 26 20 62 4f 6b 3d 3d 30 20  TE_OK && bOk==0 
26f10 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f  ){.        utf8_
26f20 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
26f30 6e 6f 74 20 66 6f 75 6e 64 20 69 6e 20 61 72 63  not found in arc
26f40 68 69 76 65 3a 20 25 73 5c 6e 22 2c 20 7a 29 3b  hive: %s\n", z);
26f50 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
26f60 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
26f70 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 68    }.    }.    sh
26f80 65 6c 6c 46 69 6e 61 6c 69 7a 65 28 26 72 63 2c  ellFinalize(&rc,
26f90 20 70 54 65 73 74 29 3b 0a 20 20 7d 0a 20 20 72   pTest);.  }.  r
26fa0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
26fb0 2a 2a 20 46 6f 72 6d 61 74 20 61 20 57 48 45 52  ** Format a WHER
26fc0 45 20 63 6c 61 75 73 65 20 74 68 61 74 20 63 61  E clause that ca
26fd0 6e 20 62 65 20 75 73 65 64 20 61 67 61 69 6e 73  n be used agains
26fe0 74 20 74 68 65 20 22 73 71 6c 61 72 22 20 74 61  t the "sqlar" ta
26ff0 62 6c 65 20 74 6f 0a 2a 2a 20 69 64 65 6e 74 69  ble to.** identi
27000 66 79 20 61 6c 6c 20 61 72 63 68 69 76 65 20 6d  fy all archive m
27010 65 6d 62 65 72 73 20 74 68 61 74 20 6d 61 74 63  embers that matc
27020 68 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 61 72  h the command ar
27030 67 75 6d 65 6e 74 73 20 68 65 6c 64 0a 2a 2a 20  guments held.** 
27040 69 6e 20 28 2a 70 41 72 29 2e 20 4c 65 61 76 65  in (*pAr). Leave
27050 20 74 68 69 73 20 57 48 45 52 45 20 63 6c 61 75   this WHERE clau
27060 73 65 20 69 6e 20 28 2a 70 7a 57 68 65 72 65 29  se in (*pzWhere)
27070 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
27080 67 2e 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72  g..** The caller
27090 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20   is responsible 
270a0 66 6f 72 20 65 76 65 6e 74 75 61 6c 6c 79 20 63  for eventually c
270b0 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33 5f 66  alling sqlite3_f
270c0 72 65 65 28 29 20 6f 6e 0a 2a 2a 20 61 6e 79 20  ree() on.** any 
270d0 6e 6f 6e 2d 4e 55 4c 4c 20 28 2a 70 7a 57 68 65  non-NULL (*pzWhe
270e0 72 65 29 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74  re) value..*/.st
270f0 61 74 69 63 20 76 6f 69 64 20 61 72 57 68 65 72  atic void arWher
27100 65 43 6c 61 75 73 65 28 0a 20 20 69 6e 74 20 2a  eClause(.  int *
27110 70 52 63 2c 20 0a 20 20 41 72 43 6f 6d 6d 61 6e  pRc, .  ArComman
27120 64 20 2a 70 41 72 2c 20 0a 20 20 63 68 61 72 20  d *pAr, .  char 
27130 2a 2a 70 7a 57 68 65 72 65 20 20 20 20 20 20 20  **pzWhere       
27140 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
27150 54 3a 20 4e 65 77 20 57 48 45 52 45 20 63 6c 61  T: New WHERE cla
27160 75 73 65 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72  use */.){.  char
27170 20 2a 7a 57 68 65 72 65 20 3d 20 30 3b 0a 20 20   *zWhere = 0;.  
27180 69 66 28 20 2a 70 52 63 3d 3d 53 51 4c 49 54 45  if( *pRc==SQLITE
27190 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70  _OK ){.    if( p
271a0 41 72 2d 3e 6e 41 72 67 3d 3d 30 20 29 7b 0a 20  Ar->nArg==0 ){. 
271b0 20 20 20 20 20 7a 57 68 65 72 65 20 3d 20 73 71       zWhere = sq
271c0 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 31  lite3_mprintf("1
271d0 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ");.    }else{. 
271e0 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
271f0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53    const char *zS
27200 65 70 20 3d 20 22 22 3b 0a 20 20 20 20 20 20 66  ep = "";.      f
27210 6f 72 28 69 3d 30 3b 20 69 3c 70 41 72 2d 3e 6e  or(i=0; i<pAr->n
27220 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Arg; i++){.     
27230 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
27240 20 3d 20 70 41 72 2d 3e 61 7a 41 72 67 5b 69 5d   = pAr->azArg[i]
27250 3b 0a 20 20 20 20 20 20 20 20 7a 57 68 65 72 65  ;.        zWhere
27260 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
27270 74 66 28 0a 20 20 20 20 20 20 20 20 20 20 22 25  tf(.          "%
27280 7a 25 73 20 6e 61 6d 65 20 3d 20 27 25 71 27 20  z%s name = '%q' 
27290 4f 52 20 73 75 62 73 74 72 28 6e 61 6d 65 2c 31  OR substr(name,1
272a0 2c 25 64 29 20 3d 20 27 25 71 2f 27 22 2c 20 0a  ,%d) = '%q/'", .
272b0 20 20 20 20 20 20 20 20 20 20 7a 57 68 65 72 65            zWhere
272c0 2c 20 7a 53 65 70 2c 20 7a 2c 20 73 74 72 6c 65  , zSep, z, strle
272d0 6e 33 30 28 7a 29 2b 31 2c 20 7a 0a 20 20 20 20  n30(z)+1, z.    
272e0 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69      );.        i
272f0 66 28 20 7a 57 68 65 72 65 3d 3d 30 20 29 7b 0a  f( zWhere==0 ){.
27300 20 20 20 20 20 20 20 20 20 20 2a 70 52 63 20 3d            *pRc =
27310 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
27320 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
27330 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
27340 20 20 7a 53 65 70 20 3d 20 22 20 4f 52 20 22 3b    zSep = " OR ";
27350 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
27360 20 7d 0a 20 20 2a 70 7a 57 68 65 72 65 20 3d 20   }.  *pzWhere = 
27370 7a 57 68 65 72 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  zWhere;.}../*.**
27380 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   Implementation 
27390 6f 66 20 2e 61 72 20 22 6c 69 73 54 22 20 63 6f  of .ar "lisT" co
273a0 6d 6d 61 6e 64 2e 20 0a 2a 2f 0a 73 74 61 74 69  mmand. .*/.stati
273b0 63 20 69 6e 74 20 61 72 4c 69 73 74 43 6f 6d 6d  c int arListComm
273c0 61 6e 64 28 41 72 43 6f 6d 6d 61 6e 64 20 2a 70  and(ArCommand *p
273d0 41 72 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  Ar){.  const cha
273e0 72 20 2a 7a 53 71 6c 20 3d 20 22 53 45 4c 45 43  r *zSql = "SELEC
273f0 54 20 25 73 20 46 52 4f 4d 20 25 73 20 57 48 45  T %s FROM %s WHE
27400 52 45 20 25 73 22 3b 20 0a 20 20 63 6f 6e 73 74  RE %s"; .  const
27410 20 63 68 61 72 20 2a 61 7a 43 6f 6c 73 5b 5d 20   char *azCols[] 
27420 3d 20 7b 0a 20 20 20 20 22 6e 61 6d 65 22 2c 0a  = {.    "name",.
27430 20 20 20 20 22 6c 73 6d 6f 64 65 28 6d 6f 64 65      "lsmode(mode
27440 29 2c 20 73 7a 2c 20 64 61 74 65 74 69 6d 65 28  ), sz, datetime(
27450 6d 74 69 6d 65 2c 20 27 75 6e 69 78 65 70 6f 63  mtime, 'unixepoc
27460 68 27 29 2c 20 6e 61 6d 65 22 0a 20 20 7d 3b 0a  h'), name".  };.
27470 0a 20 20 63 68 61 72 20 2a 7a 57 68 65 72 65 20  .  char *zWhere 
27480 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73  = 0;.  sqlite3_s
27490 74 6d 74 20 2a 70 53 71 6c 20 3d 20 30 3b 0a 20  tmt *pSql = 0;. 
274a0 20 69 6e 74 20 72 63 3b 0a 0a 20 20 72 63 20 3d   int rc;..  rc =
274b0 20 61 72 43 68 65 63 6b 45 6e 74 72 69 65 73 28   arCheckEntries(
274c0 70 41 72 29 3b 0a 20 20 61 72 57 68 65 72 65 43  pAr);.  arWhereC
274d0 6c 61 75 73 65 28 26 72 63 2c 20 70 41 72 2c 20  lause(&rc, pAr, 
274e0 26 7a 57 68 65 72 65 29 3b 0a 0a 20 20 73 68 65  &zWhere);..  she
274f0 6c 6c 50 72 65 70 61 72 65 50 72 69 6e 74 66 28  llPreparePrintf(
27500 70 41 72 2d 3e 64 62 2c 20 26 72 63 2c 20 26 70  pAr->db, &rc, &p
27510 53 71 6c 2c 20 7a 53 71 6c 2c 20 61 7a 43 6f 6c  Sql, zSql, azCol
27520 73 5b 70 41 72 2d 3e 62 56 65 72 62 6f 73 65 5d  s[pAr->bVerbose]
27530 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
27540 20 20 20 20 20 20 20 70 41 72 2d 3e 7a 53 72 63         pAr->zSrc
27550 54 61 62 6c 65 2c 20 7a 57 68 65 72 65 29 3b 0a  Table, zWhere);.
27560 20 20 69 66 28 20 70 41 72 2d 3e 62 44 72 79 52    if( pAr->bDryR
27570 75 6e 20 29 7b 0a 20 20 20 20 75 74 66 38 5f 70  un ){.    utf8_p
27580 72 69 6e 74 66 28 70 41 72 2d 3e 70 2d 3e 6f 75  rintf(pAr->p->ou
27590 74 2c 20 22 25 73 5c 6e 22 2c 20 73 71 6c 69 74  t, "%s\n", sqlit
275a0 65 33 5f 73 71 6c 28 70 53 71 6c 29 29 3b 0a 20  e3_sql(pSql));. 
275b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77 68 69 6c   }else{.    whil
275c0 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc==SQLITE_OK
275d0 20 26 26 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d   && SQLITE_ROW==
275e0 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 71  sqlite3_step(pSq
275f0 6c 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  l) ){.      if( 
27600 70 41 72 2d 3e 62 56 65 72 62 6f 73 65 20 29 7b  pAr->bVerbose ){
27610 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72  .        utf8_pr
27620 69 6e 74 66 28 70 41 72 2d 3e 70 2d 3e 6f 75 74  intf(pAr->p->out
27630 2c 20 22 25 73 20 25 20 31 30 64 20 20 25 73 20  , "%s % 10d  %s 
27640 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20   %s\n",.        
27650 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75      sqlite3_colu
27660 6d 6e 5f 74 65 78 74 28 70 53 71 6c 2c 20 30 29  mn_text(pSql, 0)
27670 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  ,.            sq
27680 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74  lite3_column_int
27690 28 70 53 71 6c 2c 20 31 29 2c 20 0a 20 20 20 20  (pSql, 1), .    
276a0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
276b0 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 71 6c  column_text(pSql
276c0 2c 20 32 29 2c 0a 20 20 20 20 20 20 20 20 20 20  , 2),.          
276d0 20 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e    sqlite3_column
276e0 5f 74 65 78 74 28 70 53 71 6c 2c 20 33 29 0a 20  _text(pSql, 3). 
276f0 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
27700 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 75  }else{.        u
27710 74 66 38 5f 70 72 69 6e 74 66 28 70 41 72 2d 3e  tf8_printf(pAr->
27720 70 2d 3e 6f 75 74 2c 20 22 25 73 5c 6e 22 2c 20  p->out, "%s\n", 
27730 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
27740 65 78 74 28 70 53 71 6c 2c 20 30 29 29 3b 0a 20  ext(pSql, 0));. 
27750 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
27760 0a 20 20 73 68 65 6c 6c 46 69 6e 61 6c 69 7a 65  .  shellFinalize
27770 28 26 72 63 2c 20 70 53 71 6c 29 3b 0a 20 20 72  (&rc, pSql);.  r
27780 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a  eturn rc;.}.../*
27790 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69  .** Implementati
277a0 6f 6e 20 6f 66 20 2e 61 72 20 22 65 58 74 72 61  on of .ar "eXtra
277b0 63 74 22 20 63 6f 6d 6d 61 6e 64 2e 20 0a 2a 2f  ct" command. .*/
277c0 0a 73 74 61 74 69 63 20 69 6e 74 20 61 72 45 78  .static int arEx
277d0 74 72 61 63 74 43 6f 6d 6d 61 6e 64 28 41 72 43  tractCommand(ArC
277e0 6f 6d 6d 61 6e 64 20 2a 70 41 72 29 7b 0a 20 20  ommand *pAr){.  
277f0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c  const char *zSql
27800 31 20 3d 20 0a 20 20 20 20 22 53 45 4c 45 43 54  1 = .    "SELECT
27810 20 22 0a 20 20 20 20 22 20 28 24 64 69 72 20 7c   ".    " ($dir |
27820 7c 20 6e 61 6d 65 29 2c 22 0a 20 20 20 20 22 20  | name),".    " 
27830 77 72 69 74 65 66 69 6c 65 28 28 24 64 69 72 20  writefile(($dir 
27840 7c 7c 20 6e 61 6d 65 29 2c 20 25 73 2c 20 6d 6f  || name), %s, mo
27850 64 65 2c 20 6d 74 69 6d 65 29 20 22 0a 20 20 20  de, mtime) ".   
27860 20 22 46 52 4f 4d 20 25 73 20 57 48 45 52 45 20   "FROM %s WHERE 
27870 28 25 73 29 20 41 4e 44 20 28 64 61 74 61 20 49  (%s) AND (data I
27880 53 20 4e 55 4c 4c 20 4f 52 20 24 64 69 72 4f 6e  S NULL OR $dirOn
27890 6c 79 20 3d 20 30 29 22 3b 0a 0a 20 20 63 6f 6e  ly = 0)";..  con
278a0 73 74 20 63 68 61 72 20 2a 61 7a 45 78 74 72 61  st char *azExtra
278b0 41 72 67 5b 5d 20 3d 20 7b 20 0a 20 20 20 20 22  Arg[] = { .    "
278c0 73 71 6c 61 72 5f 75 6e 63 6f 6d 70 72 65 73 73  sqlar_uncompress
278d0 28 64 61 74 61 2c 20 73 7a 29 22 2c 0a 20 20 20  (data, sz)",.   
278e0 20 22 64 61 74 61 22 0a 20 20 7d 3b 0a 0a 20 20   "data".  };..  
278f0 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
27900 71 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63  ql = 0;.  int rc
27910 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
27920 63 68 61 72 20 2a 7a 44 69 72 20 3d 20 30 3b 0a  char *zDir = 0;.
27930 20 20 63 68 61 72 20 2a 7a 57 68 65 72 65 20 3d    char *zWhere =
27940 20 30 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a   0;.  int i, j;.
27950 0a 20 20 2f 2a 20 49 66 20 61 72 67 75 6d 65 6e  .  /* If argumen
27960 74 73 20 61 72 65 20 73 70 65 63 69 66 69 65 64  ts are specified
27970 2c 20 63 68 65 63 6b 20 74 68 61 74 20 74 68 65  , check that the
27980 79 20 61 63 74 75 61 6c 6c 79 20 65 78 69 73 74  y actually exist
27990 20 77 69 74 68 69 6e 0a 20 20 2a 2a 20 74 68 65   within.  ** the
279a0 20 61 72 63 68 69 76 65 20 62 65 66 6f 72 65 20   archive before 
279b0 70 72 6f 63 65 65 64 69 6e 67 2e 20 41 6e 64 20  proceeding. And 
279c0 66 6f 72 6d 75 6c 61 74 65 20 61 20 57 48 45 52  formulate a WHER
279d0 45 20 63 6c 61 75 73 65 20 74 6f 0a 20 20 2a 2a  E clause to.  **
279e0 20 6d 61 74 63 68 20 74 68 65 6d 2e 20 20 2a 2f   match them.  */
279f0 0a 20 20 72 63 20 3d 20 61 72 43 68 65 63 6b 45  .  rc = arCheckE
27a00 6e 74 72 69 65 73 28 70 41 72 29 3b 0a 20 20 61  ntries(pAr);.  a
27a10 72 57 68 65 72 65 43 6c 61 75 73 65 28 26 72 63  rWhereClause(&rc
27a20 2c 20 70 41 72 2c 20 26 7a 57 68 65 72 65 29 3b  , pAr, &zWhere);
27a30 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ..  if( rc==SQLI
27a40 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
27a50 20 70 41 72 2d 3e 7a 44 69 72 20 29 7b 0a 20 20   pAr->zDir ){.  
27a60 20 20 20 20 7a 44 69 72 20 3d 20 73 71 6c 69 74      zDir = sqlit
27a70 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 2f 22  e3_mprintf("%s/"
27a80 2c 20 70 41 72 2d 3e 7a 44 69 72 29 3b 0a 20 20  , pAr->zDir);.  
27a90 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a    }else{.      z
27aa0 44 69 72 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  Dir = sqlite3_mp
27ab0 72 69 6e 74 66 28 22 22 29 3b 0a 20 20 20 20 7d  rintf("");.    }
27ac0 0a 20 20 20 20 69 66 28 20 7a 44 69 72 3d 3d 30  .    if( zDir==0
27ad0 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e   ) rc = SQLITE_N
27ae0 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 73 68 65  OMEM;.  }..  she
27af0 6c 6c 50 72 65 70 61 72 65 50 72 69 6e 74 66 28  llPreparePrintf(
27b00 70 41 72 2d 3e 64 62 2c 20 26 72 63 2c 20 26 70  pAr->db, &rc, &p
27b10 53 71 6c 2c 20 7a 53 71 6c 31 2c 20 0a 20 20 20  Sql, zSql1, .   
27b20 20 20 20 61 7a 45 78 74 72 61 41 72 67 5b 70 41     azExtraArg[pA
27b30 72 2d 3e 62 5a 69 70 5d 2c 20 70 41 72 2d 3e 7a  r->bZip], pAr->z
27b40 53 72 63 54 61 62 6c 65 2c 20 7a 57 68 65 72 65  SrcTable, zWhere
27b50 0a 20 20 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d  .  );..  if( rc=
27b60 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
27b70 20 20 6a 20 3d 20 73 71 6c 69 74 65 33 5f 62 69    j = sqlite3_bi
27b80 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 69 6e 64  nd_parameter_ind
27b90 65 78 28 70 53 71 6c 2c 20 22 24 64 69 72 22 29  ex(pSql, "$dir")
27ba0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69  ;.    sqlite3_bi
27bb0 6e 64 5f 74 65 78 74 28 70 53 71 6c 2c 20 6a 2c  nd_text(pSql, j,
27bc0 20 7a 44 69 72 2c 20 2d 31 2c 20 53 51 4c 49 54   zDir, -1, SQLIT
27bd0 45 5f 53 54 41 54 49 43 29 3b 0a 0a 20 20 20 20  E_STATIC);..    
27be0 2f 2a 20 52 75 6e 20 74 68 65 20 53 45 4c 45 43  /* Run the SELEC
27bf0 54 20 73 74 61 74 65 6d 65 6e 74 20 74 77 69 63  T statement twic
27c00 65 2e 20 54 68 65 20 66 69 72 73 74 20 74 69 6d  e. The first tim
27c10 65 2c 20 77 72 69 74 65 66 69 6c 65 28 29 20 69  e, writefile() i
27c20 73 20 63 61 6c 6c 65 64 0a 20 20 20 20 2a 2a 20  s called.    ** 
27c30 66 6f 72 20 61 6c 6c 20 61 72 63 68 69 76 65 20  for all archive 
27c40 6d 65 6d 62 65 72 73 20 74 68 61 74 20 73 68 6f  members that sho
27c50 75 6c 64 20 62 65 20 65 78 74 72 61 63 74 65 64  uld be extracted
27c60 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 74 69 6d  . The second tim
27c70 65 2c 0a 20 20 20 20 2a 2a 20 6f 6e 6c 79 20 66  e,.    ** only f
27c80 6f 72 20 74 68 65 20 64 69 72 65 63 74 6f 72 69  or the directori
27c90 65 73 2e 20 54 68 69 73 20 69 73 20 62 65 63 61  es. This is beca
27ca0 75 73 65 20 74 68 65 20 74 69 6d 65 73 74 61 6d  use the timestam
27cb0 70 73 20 66 6f 72 0a 20 20 20 20 2a 2a 20 65 78  ps for.    ** ex
27cc0 74 72 61 63 74 65 64 20 64 69 72 65 63 74 6f 72  tracted director
27cd0 69 65 73 20 6d 75 73 74 20 62 65 20 72 65 73 65  ies must be rese
27ce0 74 20 61 66 74 65 72 20 74 68 65 79 20 61 72 65  t after they are
27cf0 20 70 6f 70 75 6c 61 74 65 64 20 28 61 73 0a 20   populated (as. 
27d00 20 20 20 2a 2a 20 70 6f 70 75 6c 61 74 69 6e 67     ** populating
27d10 20 74 68 65 6d 20 63 68 61 6e 67 65 73 20 74 68   them changes th
27d20 65 20 74 69 6d 65 73 74 61 6d 70 29 2e 20 20 2a  e timestamp).  *
27d30 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  /.    for(i=0; i
27d40 3c 32 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  <2; i++){.      
27d50 6a 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  j = sqlite3_bind
27d60 5f 70 61 72 61 6d 65 74 65 72 5f 69 6e 64 65 78  _parameter_index
27d70 28 70 53 71 6c 2c 20 22 24 64 69 72 4f 6e 6c 79  (pSql, "$dirOnly
27d80 22 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ");.      sqlite
27d90 33 5f 62 69 6e 64 5f 69 6e 74 28 70 53 71 6c 2c  3_bind_int(pSql,
27da0 20 6a 2c 20 69 29 3b 0a 20 20 20 20 20 20 69 66   j, i);.      if
27db0 28 20 70 41 72 2d 3e 62 44 72 79 52 75 6e 20 29  ( pAr->bDryRun )
27dc0 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70  {.        utf8_p
27dd0 72 69 6e 74 66 28 70 41 72 2d 3e 70 2d 3e 6f 75  rintf(pAr->p->ou
27de0 74 2c 20 22 25 73 5c 6e 22 2c 20 73 71 6c 69 74  t, "%s\n", sqlit
27df0 65 33 5f 73 71 6c 28 70 53 71 6c 29 29 3b 0a 20  e3_sql(pSql));. 
27e00 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
27e10 20 20 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53      while( rc==S
27e20 51 4c 49 54 45 5f 4f 4b 20 26 26 20 53 51 4c 49  QLITE_OK && SQLI
27e30 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f  TE_ROW==sqlite3_
27e40 73 74 65 70 28 70 53 71 6c 29 20 29 7b 0a 20 20  step(pSql) ){.  
27e50 20 20 20 20 20 20 20 20 69 66 28 20 69 3d 3d 30          if( i==0
27e60 20 26 26 20 70 41 72 2d 3e 62 56 65 72 62 6f 73   && pAr->bVerbos
27e70 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  e ){.           
27e80 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 41 72   utf8_printf(pAr
27e90 2d 3e 70 2d 3e 6f 75 74 2c 20 22 25 73 5c 6e 22  ->p->out, "%s\n"
27ea0 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  , sqlite3_column
27eb0 5f 74 65 78 74 28 70 53 71 6c 2c 20 30 29 29 3b  _text(pSql, 0));
27ec0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
27ed0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
27ee0 20 20 20 20 20 73 68 65 6c 6c 52 65 73 65 74 28       shellReset(
27ef0 26 72 63 2c 20 70 53 71 6c 29 3b 0a 20 20 20 20  &rc, pSql);.    
27f00 7d 0a 20 20 20 20 73 68 65 6c 6c 46 69 6e 61 6c  }.    shellFinal
27f10 69 7a 65 28 26 72 63 2c 20 70 53 71 6c 29 3b 0a  ize(&rc, pSql);.
27f20 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66    }..  sqlite3_f
27f30 72 65 65 28 7a 44 69 72 29 3b 0a 20 20 73 71 6c  ree(zDir);.  sql
27f40 69 74 65 33 5f 66 72 65 65 28 7a 57 68 65 72 65  ite3_free(zWhere
27f50 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
27f60 7d 0a 0a 2f 2a 0a 2a 2a 20 52 75 6e 20 74 68 65  }../*.** Run the
27f70 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 69   SQL statement i
27f80 6e 20 7a 53 71 6c 2e 20 20 4f 72 20 69 66 20 64  n zSql.  Or if d
27f90 6f 69 6e 67 20 61 20 2d 2d 64 72 79 72 75 6e 2c  oing a --dryrun,
27fa0 20 6d 65 72 65 6c 79 20 70 72 69 6e 74 20 69 74   merely print it
27fb0 20 6f 75 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   out..*/.static 
27fc0 69 6e 74 20 61 72 45 78 65 63 53 71 6c 28 41 72  int arExecSql(Ar
27fd0 43 6f 6d 6d 61 6e 64 20 2a 70 41 72 2c 20 63 6f  Command *pAr, co
27fe0 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 29 7b  nst char *zSql){
27ff0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28  .  int rc;.  if(
28000 20 70 41 72 2d 3e 62 44 72 79 52 75 6e 20 29 7b   pAr->bDryRun ){
28010 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66  .    utf8_printf
28020 28 70 41 72 2d 3e 70 2d 3e 6f 75 74 2c 20 22 25  (pAr->p->out, "%
28030 73 5c 6e 22 2c 20 7a 53 71 6c 29 3b 0a 20 20 20  s\n", zSql);.   
28040 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
28050 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68  .  }else{.    ch
28060 61 72 20 2a 7a 45 72 72 20 3d 20 30 3b 0a 20 20  ar *zErr = 0;.  
28070 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65    rc = sqlite3_e
28080 78 65 63 28 70 41 72 2d 3e 64 62 2c 20 7a 53 71  xec(pAr->db, zSq
28090 6c 2c 20 30 2c 20 30 2c 20 26 7a 45 72 72 29 3b  l, 0, 0, &zErr);
280a0 0a 20 20 20 20 69 66 28 20 7a 45 72 72 20 29 7b  .    if( zErr ){
280b0 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e  .      utf8_prin
280c0 74 66 28 73 74 64 6f 75 74 2c 20 22 45 52 52 4f  tf(stdout, "ERRO
280d0 52 3a 20 25 73 5c 6e 22 2c 20 7a 45 72 72 29 3b  R: %s\n", zErr);
280e0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
280f0 72 65 65 28 7a 45 72 72 29 3b 0a 20 20 20 20 7d  ree(zErr);.    }
28100 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
28110 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c  ;.}.../*.** Impl
28120 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 2e 61  ementation of .a
28130 72 20 22 63 72 65 61 74 65 22 20 61 6e 64 20 22  r "create" and "
28140 75 70 64 61 74 65 22 20 63 6f 6d 6d 61 6e 64 73  update" commands
28150 2e 0a 2a 2a 0a 2a 2a 20 43 72 65 61 74 65 20 74  ..**.** Create t
28160 68 65 20 22 73 71 6c 61 72 22 20 74 61 62 6c 65  he "sqlar" table
28170 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
28180 20 69 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 20   if it does not 
28190 61 6c 72 65 61 64 79 20 65 78 69 73 74 2e 0a 2a  already exist..*
281a0 2a 20 54 68 65 6e 20 61 64 64 20 65 61 63 68 20  * Then add each 
281b0 66 69 6c 65 20 69 6e 20 74 68 65 20 61 7a 46 69  file in the azFi
281c0 6c 65 5b 5d 20 61 72 72 61 79 20 74 6f 20 74 68  le[] array to th
281d0 65 20 61 72 63 68 69 76 65 2e 20 44 69 72 65 63  e archive. Direc
281e0 74 6f 72 69 65 73 0a 2a 2a 20 61 72 65 20 61 64  tories.** are ad
281f0 64 65 64 20 72 65 63 75 72 73 69 76 65 6c 79 2e  ded recursively.
28200 20 49 66 20 61 72 67 75 6d 65 6e 74 20 62 56 65   If argument bVe
28210 72 62 6f 73 65 20 69 73 20 6e 6f 6e 2d 7a 65 72  rbose is non-zer
28220 6f 2c 20 61 20 6d 65 73 73 61 67 65 20 69 73 0a  o, a message is.
28230 2a 2a 20 70 72 69 6e 74 65 64 20 6f 6e 20 73 74  ** printed on st
28240 64 6f 75 74 20 66 6f 72 20 65 61 63 68 20 66 69  dout for each fi
28250 6c 65 20 61 72 63 68 69 76 65 64 2e 0a 2a 2a 0a  le archived..**.
28260 2a 2a 20 54 68 65 20 63 72 65 61 74 65 20 63 6f  ** The create co
28270 6d 6d 61 6e 64 20 69 73 20 74 68 65 20 73 61 6d  mmand is the sam
28280 65 20 61 73 20 75 70 64 61 74 65 2c 20 65 78 63  e as update, exc
28290 65 70 74 20 74 68 61 74 20 69 74 20 64 72 6f 70  ept that it drop
282a0 73 0a 2a 2a 20 61 6e 79 20 65 78 69 73 74 69 6e  s.** any existin
282b0 67 20 22 73 71 6c 61 72 22 20 74 61 62 6c 65 20  g "sqlar" table 
282c0 62 65 66 6f 72 65 20 62 65 67 69 6e 6e 69 6e 67  before beginning
282d0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
282e0 61 72 43 72 65 61 74 65 4f 72 55 70 64 61 74 65  arCreateOrUpdate
282f0 43 6f 6d 6d 61 6e 64 28 0a 20 20 41 72 43 6f 6d  Command(.  ArCom
28300 6d 61 6e 64 20 2a 70 41 72 2c 20 20 20 20 20 20  mand *pAr,      
28310 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
28320 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20  mmand arguments 
28330 61 6e 64 20 6f 70 74 69 6f 6e 73 20 2a 2f 0a 20  and options */. 
28340 20 69 6e 74 20 62 55 70 64 61 74 65 20 20 20 20   int bUpdate    
28350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28360 20 2f 2a 20 74 72 75 65 20 66 6f 72 20 61 20 2d   /* true for a -
28370 2d 63 72 65 61 74 65 2e 20 20 66 61 6c 73 65 20  -create.  false 
28380 66 6f 72 20 2d 2d 75 70 64 61 74 65 20 2a 2f 0a  for --update */.
28390 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ){.  const char 
283a0 2a 7a 43 72 65 61 74 65 20 3d 20 0a 20 20 20 20  *zCreate = .    
283b0 20 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20    "CREATE TABLE 
283c0 49 46 20 4e 4f 54 20 45 58 49 53 54 53 20 73 71  IF NOT EXISTS sq
283d0 6c 61 72 28 5c 6e 22 0a 20 20 20 20 20 20 22 20  lar(\n".      " 
283e0 20 6e 61 6d 65 20 54 45 58 54 20 50 52 49 4d 41   name TEXT PRIMA
283f0 52 59 20 4b 45 59 2c 20 20 2d 2d 20 6e 61 6d 65  RY KEY,  -- name
28400 20 6f 66 20 74 68 65 20 66 69 6c 65 5c 6e 22 0a   of the file\n".
28410 20 20 20 20 20 20 22 20 20 6d 6f 64 65 20 49 4e        "  mode IN
28420 54 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  T,              
28430 20 2d 2d 20 61 63 63 65 73 73 20 70 65 72 6d 69   -- access permi
28440 73 73 69 6f 6e 73 5c 6e 22 0a 20 20 20 20 20 20  ssions\n".      
28450 22 20 20 6d 74 69 6d 65 20 49 4e 54 2c 20 20 20  "  mtime INT,   
28460 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20 6c 61             -- la
28470 73 74 20 6d 6f 64 69 66 69 63 61 74 69 6f 6e 20  st modification 
28480 74 69 6d 65 5c 6e 22 0a 20 20 20 20 20 20 22 20  time\n".      " 
28490 20 73 7a 20 49 4e 54 2c 20 20 20 20 20 20 20 20   sz INT,        
284a0 20 20 20 20 20 20 20 20 20 2d 2d 20 6f 72 69 67           -- orig
284b0 69 6e 61 6c 20 66 69 6c 65 20 73 69 7a 65 5c 6e  inal file size\n
284c0 22 0a 20 20 20 20 20 20 22 20 20 64 61 74 61 20  ".      "  data 
284d0 42 4c 4f 42 20 20 20 20 20 20 20 20 20 20 20 20  BLOB            
284e0 20 20 20 2d 2d 20 63 6f 6d 70 72 65 73 73 65 64     -- compressed
284f0 20 63 6f 6e 74 65 6e 74 5c 6e 22 0a 20 20 20 20   content\n".    
28500 20 20 22 29 22 3b 0a 20 20 63 6f 6e 73 74 20 63    ")";.  const c
28510 68 61 72 20 2a 7a 44 72 6f 70 20 3d 20 22 44 52  har *zDrop = "DR
28520 4f 50 20 54 41 42 4c 45 20 49 46 20 45 58 49 53  OP TABLE IF EXIS
28530 54 53 20 73 71 6c 61 72 22 3b 0a 20 20 63 6f 6e  TS sqlar";.  con
28540 73 74 20 63 68 61 72 20 2a 7a 49 6e 73 65 72 74  st char *zInsert
28550 46 6d 74 5b 32 5d 20 3d 20 7b 0a 20 20 20 20 20  Fmt[2] = {.     
28560 22 52 45 50 4c 41 43 45 20 49 4e 54 4f 20 25 73  "REPLACE INTO %s
28570 28 6e 61 6d 65 2c 6d 6f 64 65 2c 6d 74 69 6d 65  (name,mode,mtime
28580 2c 73 7a 2c 64 61 74 61 29 5c 6e 22 0a 20 20 20  ,sz,data)\n".   
28590 20 20 22 20 20 53 45 4c 45 43 54 5c 6e 22 0a 20    "  SELECT\n". 
285a0 20 20 20 20 22 20 20 20 20 25 73 2c 5c 6e 22 0a      "    %s,\n".
285b0 20 20 20 20 20 22 20 20 20 20 6d 6f 64 65 2c 5c       "    mode,\
285c0 6e 22 0a 20 20 20 20 20 22 20 20 20 20 6d 74 69  n".     "    mti
285d0 6d 65 2c 5c 6e 22 0a 20 20 20 20 20 22 20 20 20  me,\n".     "   
285e0 20 43 41 53 45 20 73 75 62 73 74 72 28 6c 73 6d   CASE substr(lsm
285f0 6f 64 65 28 6d 6f 64 65 29 2c 31 2c 31 29 5c 6e  ode(mode),1,1)\n
28600 22 0a 20 20 20 20 20 22 20 20 20 20 20 20 57 48  ".     "      WH
28610 45 4e 20 27 2d 27 20 54 48 45 4e 20 6c 65 6e 67  EN '-' THEN leng
28620 74 68 28 64 61 74 61 29 5c 6e 22 0a 20 20 20 20  th(data)\n".    
28630 20 22 20 20 20 20 20 20 57 48 45 4e 20 27 64 27   "      WHEN 'd'
28640 20 54 48 45 4e 20 30 5c 6e 22 0a 20 20 20 20 20   THEN 0\n".     
28650 22 20 20 20 20 20 20 45 4c 53 45 20 2d 31 20 45  "      ELSE -1 E
28660 4e 44 2c 5c 6e 22 0a 20 20 20 20 20 22 20 20 20  ND,\n".     "   
28670 20 73 71 6c 61 72 5f 63 6f 6d 70 72 65 73 73 28   sqlar_compress(
28680 64 61 74 61 29 5c 6e 22 0a 20 20 20 20 20 22 20  data)\n".     " 
28690 20 46 52 4f 4d 20 66 73 64 69 72 28 25 51 2c 25   FROM fsdir(%Q,%
286a0 51 29 5c 6e 22 0a 20 20 20 20 20 22 20 20 57 48  Q)\n".     "  WH
286b0 45 52 45 20 6c 73 6d 6f 64 65 28 6d 6f 64 65 29  ERE lsmode(mode)
286c0 20 4e 4f 54 20 4c 49 4b 45 20 27 3f 25 25 27 3b   NOT LIKE '?%%';
286d0 22 2c 0a 20 20 20 20 20 22 52 45 50 4c 41 43 45  ",.     "REPLACE
286e0 20 49 4e 54 4f 20 25 73 28 6e 61 6d 65 2c 6d 6f   INTO %s(name,mo
286f0 64 65 2c 6d 74 69 6d 65 2c 64 61 74 61 29 5c 6e  de,mtime,data)\n
28700 22 0a 20 20 20 20 20 22 20 20 53 45 4c 45 43 54  ".     "  SELECT
28710 5c 6e 22 0a 20 20 20 20 20 22 20 20 20 20 25 73  \n".     "    %s
28720 2c 5c 6e 22 0a 20 20 20 20 20 22 20 20 20 20 6d  ,\n".     "    m
28730 6f 64 65 2c 5c 6e 22 0a 20 20 20 20 20 22 20 20  ode,\n".     "  
28740 20 20 6d 74 69 6d 65 2c 5c 6e 22 0a 20 20 20 20    mtime,\n".    
28750 20 22 20 20 20 20 64 61 74 61 5c 6e 22 0a 20 20   "    data\n".  
28760 20 20 20 22 20 20 46 52 4f 4d 20 66 73 64 69 72     "  FROM fsdir
28770 28 25 51 2c 25 51 29 5c 6e 22 0a 20 20 20 20 20  (%Q,%Q)\n".     
28780 22 20 20 57 48 45 52 45 20 6c 73 6d 6f 64 65 28  "  WHERE lsmode(
28790 6d 6f 64 65 29 20 4e 4f 54 20 4c 49 4b 45 20 27  mode) NOT LIKE '
287a0 3f 25 25 27 3b 22 0a 20 20 7d 3b 0a 20 20 69 6e  ?%%';".  };.  in
287b0 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
287c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
287d0 20 46 6f 72 20 69 74 65 72 61 74 69 6e 67 20 74   For iterating t
287e0 68 72 6f 75 67 68 20 61 7a 46 69 6c 65 5b 5d 20  hrough azFile[] 
287f0 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  */.  int rc;    
28800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28810 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
28820 6f 64 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ode */.  const c
28830 68 61 72 20 2a 7a 54 61 62 20 3d 20 30 3b 20 20  har *zTab = 0;  
28840 20 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 20           /* SQL 
28850 74 61 62 6c 65 20 69 6e 74 6f 20 77 68 69 63 68  table into which
28860 20 74 6f 20 69 6e 73 65 72 74 20 2a 2f 0a 20 20   to insert */.  
28870 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 63 68  char *zSql;.  ch
28880 61 72 20 7a 54 65 6d 70 5b 35 30 5d 3b 0a 0a 20  ar zTemp[50];.. 
28890 20 61 72 45 78 65 63 53 71 6c 28 70 41 72 2c 20   arExecSql(pAr, 
288a0 22 50 52 41 47 4d 41 20 70 61 67 65 5f 73 69 7a  "PRAGMA page_siz
288b0 65 3d 35 31 32 22 29 3b 0a 20 20 72 63 20 3d 20  e=512");.  rc = 
288c0 61 72 45 78 65 63 53 71 6c 28 70 41 72 2c 20 22  arExecSql(pAr, "
288d0 53 41 56 45 50 4f 49 4e 54 20 61 72 3b 22 29 3b  SAVEPOINT ar;");
288e0 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
288f0 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
28900 3b 0a 20 20 7a 54 65 6d 70 5b 30 5d 20 3d 20 30  ;.  zTemp[0] = 0
28910 3b 20 0a 20 20 69 66 28 20 70 41 72 2d 3e 62 5a  ; .  if( pAr->bZ
28920 69 70 20 29 7b 0a 20 20 20 20 2f 2a 20 49 6e 69  ip ){.    /* Ini
28930 74 69 61 6c 69 7a 65 20 74 68 65 20 7a 69 70 66  tialize the zipf
28940 69 6c 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c  ile virtual tabl
28950 65 2c 20 69 66 20 6e 65 63 65 73 73 61 72 79 20  e, if necessary 
28960 2a 2f 0a 20 20 20 20 69 66 28 20 70 41 72 2d 3e  */.    if( pAr->
28970 7a 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 73  zFile ){.      s
28980 71 6c 69 74 65 33 5f 75 69 6e 74 36 34 20 72 3b  qlite3_uint64 r;
28990 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72  .      sqlite3_r
289a0 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66  andomness(sizeof
289b0 28 72 29 2c 26 72 29 3b 0a 20 20 20 20 20 20 73  (r),&r);.      s
289c0 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
289d0 73 69 7a 65 6f 66 28 7a 54 65 6d 70 29 2c 7a 54  sizeof(zTemp),zT
289e0 65 6d 70 2c 22 7a 69 70 25 30 31 36 6c 6c 78 22  emp,"zip%016llx"
289f0 2c 72 29 3b 0a 20 20 20 20 20 20 7a 54 61 62 20  ,r);.      zTab 
28a00 3d 20 7a 54 65 6d 70 3b 0a 20 20 20 20 20 20 7a  = zTemp;.      z
28a10 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  Sql = sqlite3_mp
28a20 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20 20  rintf(.         
28a30 22 43 52 45 41 54 45 20 56 49 52 54 55 41 4c 20  "CREATE VIRTUAL 
28a40 54 41 42 4c 45 20 74 65 6d 70 2e 25 73 20 55 53  TABLE temp.%s US
28a50 49 4e 47 20 7a 69 70 66 69 6c 65 28 25 51 29 22  ING zipfile(%Q)"
28a60 2c 0a 20 20 20 20 20 20 20 20 20 7a 54 61 62 2c  ,.         zTab,
28a70 20 70 41 72 2d 3e 7a 46 69 6c 65 0a 20 20 20 20   pAr->zFile.    
28a80 20 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20    );.      rc = 
28a90 61 72 45 78 65 63 53 71 6c 28 70 41 72 2c 20 7a  arExecSql(pAr, z
28aa0 53 71 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Sql);.      sqli
28ab0 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a  te3_free(zSql);.
28ac0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
28ad0 20 7a 54 61 62 20 3d 20 22 7a 69 70 22 3b 0a 20   zTab = "zip";. 
28ae0 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
28af0 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20    /* Initialize 
28b00 74 68 65 20 74 61 62 6c 65 20 66 6f 72 20 61 6e  the table for an
28b10 20 53 51 4c 41 52 20 2a 2f 0a 20 20 20 20 7a 54   SQLAR */.    zT
28b20 61 62 20 3d 20 22 73 71 6c 61 72 22 3b 0a 20 20  ab = "sqlar";.  
28b30 20 20 69 66 28 20 62 55 70 64 61 74 65 3d 3d 30    if( bUpdate==0
28b40 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 61   ){.      rc = a
28b50 72 45 78 65 63 53 71 6c 28 70 41 72 2c 20 7a 44  rExecSql(pAr, zD
28b60 72 6f 70 29 3b 0a 20 20 20 20 20 20 69 66 28 20  rop);.      if( 
28b70 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
28b80 67 6f 74 6f 20 65 6e 64 5f 61 72 5f 74 72 61 6e  goto end_ar_tran
28b90 73 61 63 74 69 6f 6e 3b 0a 20 20 20 20 7d 0a 20  saction;.    }. 
28ba0 20 20 20 72 63 20 3d 20 61 72 45 78 65 63 53 71     rc = arExecSq
28bb0 6c 28 70 41 72 2c 20 7a 43 72 65 61 74 65 29 3b  l(pAr, zCreate);
28bc0 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20  .  }.  for(i=0; 
28bd0 69 3c 70 41 72 2d 3e 6e 41 72 67 20 26 26 20 72  i<pAr->nArg && r
28be0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 2b  c==SQLITE_OK; i+
28bf0 2b 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 53  +){.    char *zS
28c00 71 6c 32 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  ql2 = sqlite3_mp
28c10 72 69 6e 74 66 28 7a 49 6e 73 65 72 74 46 6d 74  rintf(zInsertFmt
28c20 5b 70 41 72 2d 3e 62 5a 69 70 5d 2c 20 7a 54 61  [pAr->bZip], zTa
28c30 62 2c 0a 20 20 20 20 20 20 20 20 70 41 72 2d 3e  b,.        pAr->
28c40 62 56 65 72 62 6f 73 65 20 3f 20 22 73 68 65 6c  bVerbose ? "shel
28c50 6c 5f 70 75 74 73 6e 6c 28 6e 61 6d 65 29 22 20  l_putsnl(name)" 
28c60 3a 20 22 6e 61 6d 65 22 2c 0a 20 20 20 20 20 20  : "name",.      
28c70 20 20 70 41 72 2d 3e 61 7a 41 72 67 5b 69 5d 2c    pAr->azArg[i],
28c80 20 70 41 72 2d 3e 7a 44 69 72 29 3b 0a 20 20 20   pAr->zDir);.   
28c90 20 72 63 20 3d 20 61 72 45 78 65 63 53 71 6c 28   rc = arExecSql(
28ca0 70 41 72 2c 20 7a 53 71 6c 32 29 3b 0a 20 20 20  pAr, zSql2);.   
28cb0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53   sqlite3_free(zS
28cc0 71 6c 32 29 3b 0a 20 20 7d 0a 65 6e 64 5f 61 72  ql2);.  }.end_ar
28cd0 5f 74 72 61 6e 73 61 63 74 69 6f 6e 3a 0a 20 20  _transaction:.  
28ce0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
28cf0 4b 20 29 7b 0a 20 20 20 20 61 72 45 78 65 63 53  K ){.    arExecS
28d00 71 6c 28 70 41 72 2c 20 22 52 4f 4c 4c 42 41 43  ql(pAr, "ROLLBAC
28d10 4b 20 54 4f 20 61 72 3b 20 52 45 4c 45 41 53 45  K TO ar; RELEASE
28d20 20 61 72 3b 22 29 3b 0a 20 20 7d 65 6c 73 65 7b   ar;");.  }else{
28d30 0a 20 20 20 20 72 63 20 3d 20 61 72 45 78 65 63  .    rc = arExec
28d40 53 71 6c 28 70 41 72 2c 20 22 52 45 4c 45 41 53  Sql(pAr, "RELEAS
28d50 45 20 61 72 3b 22 29 3b 0a 20 20 20 20 69 66 28  E ar;");.    if(
28d60 20 70 41 72 2d 3e 62 5a 69 70 20 26 26 20 70 41   pAr->bZip && pA
28d70 72 2d 3e 7a 46 69 6c 65 20 29 7b 0a 20 20 20 20  r->zFile ){.    
28d80 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33    zSql = sqlite3
28d90 5f 6d 70 72 69 6e 74 66 28 22 44 52 4f 50 20 54  _mprintf("DROP T
28da0 41 42 4c 45 20 25 73 22 2c 20 7a 54 65 6d 70 29  ABLE %s", zTemp)
28db0 3b 0a 20 20 20 20 20 20 61 72 45 78 65 63 53 71  ;.      arExecSq
28dc0 6c 28 70 41 72 2c 20 7a 53 71 6c 29 3b 0a 20 20  l(pAr, zSql);.  
28dd0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
28de0 28 7a 53 71 6c 29 3b 0a 20 20 20 20 7d 0a 20 20  (zSql);.    }.  
28df0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
28e00 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e  ../*.** Implemen
28e10 74 61 74 69 6f 6e 20 6f 66 20 22 2e 61 72 22 20  tation of ".ar" 
28e20 64 6f 74 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a  dot command..*/.
28e30 73 74 61 74 69 63 20 69 6e 74 20 61 72 44 6f 74  static int arDot
28e40 43 6f 6d 6d 61 6e 64 28 0a 20 20 53 68 65 6c 6c  Command(.  Shell
28e50 53 74 61 74 65 20 2a 70 53 74 61 74 65 2c 20 20  State *pState,  
28e60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
28e70 72 72 65 6e 74 20 73 68 65 6c 6c 20 74 6f 6f 6c  rrent shell tool
28e80 20 73 74 61 74 65 20 2a 2f 0a 20 20 63 68 61 72   state */.  char
28e90 20 2a 2a 61 7a 41 72 67 2c 20 20 20 20 20 20 20   **azArg,       
28ea0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
28eb0 72 72 61 79 20 6f 66 20 61 72 67 75 6d 65 6e 74  rray of argument
28ec0 73 20 70 61 73 73 65 64 20 74 6f 20 64 6f 74 20  s passed to dot 
28ed0 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  command */.  int
28ee0 20 6e 41 72 67 20 20 20 20 20 20 20 20 20 20 20   nArg           
28ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
28f00 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65  Number of entrie
28f10 73 20 69 6e 20 61 7a 41 72 67 5b 5d 20 2a 2f 0a  s in azArg[] */.
28f20 29 7b 0a 20 20 41 72 43 6f 6d 6d 61 6e 64 20 63  ){.  ArCommand c
28f30 6d 64 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  md;.  int rc;.  
28f40 6d 65 6d 73 65 74 28 26 63 6d 64 2c 20 30 2c 20  memset(&cmd, 0, 
28f50 73 69 7a 65 6f 66 28 63 6d 64 29 29 3b 0a 20 20  sizeof(cmd));.  
28f60 72 63 20 3d 20 61 72 50 61 72 73 65 43 6f 6d 6d  rc = arParseComm
28f70 61 6e 64 28 61 7a 41 72 67 2c 20 6e 41 72 67 2c  and(azArg, nArg,
28f80 20 26 63 6d 64 29 3b 0a 20 20 69 66 28 20 72 63   &cmd);.  if( rc
28f90 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
28fa0 20 20 20 69 6e 74 20 65 44 62 54 79 70 65 20 3d     int eDbType =
28fb0 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f 55 4e 53 50   SHELL_OPEN_UNSP
28fc0 45 43 3b 0a 20 20 20 20 63 6d 64 2e 70 20 3d 20  EC;.    cmd.p = 
28fd0 70 53 74 61 74 65 3b 0a 20 20 20 20 63 6d 64 2e  pState;.    cmd.
28fe0 64 62 20 3d 20 70 53 74 61 74 65 2d 3e 64 62 3b  db = pState->db;
28ff0 0a 20 20 20 20 69 66 28 20 63 6d 64 2e 7a 46 69  .    if( cmd.zFi
29000 6c 65 20 29 7b 0a 20 20 20 20 20 20 65 44 62 54  le ){.      eDbT
29010 79 70 65 20 3d 20 64 65 64 75 63 65 44 61 74 61  ype = deduceData
29020 62 61 73 65 54 79 70 65 28 63 6d 64 2e 7a 46 69  baseType(cmd.zFi
29030 6c 65 2c 20 31 29 3b 0a 20 20 20 20 7d 65 6c 73  le, 1);.    }els
29040 65 7b 0a 20 20 20 20 20 20 65 44 62 54 79 70 65  e{.      eDbType
29050 20 3d 20 70 53 74 61 74 65 2d 3e 6f 70 65 6e 4d   = pState->openM
29060 6f 64 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ode;.    }.    i
29070 66 28 20 65 44 62 54 79 70 65 3d 3d 53 48 45 4c  f( eDbType==SHEL
29080 4c 5f 4f 50 45 4e 5f 5a 49 50 46 49 4c 45 20 29  L_OPEN_ZIPFILE )
29090 7b 0a 20 20 20 20 20 20 69 66 28 20 63 6d 64 2e  {.      if( cmd.
290a0 65 43 6d 64 3d 3d 41 52 5f 43 4d 44 5f 45 58 54  eCmd==AR_CMD_EXT
290b0 52 41 43 54 20 7c 7c 20 63 6d 64 2e 65 43 6d 64  RACT || cmd.eCmd
290c0 3d 3d 41 52 5f 43 4d 44 5f 4c 49 53 54 20 29 7b  ==AR_CMD_LIST ){
290d0 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 6d 64  .        if( cmd
290e0 2e 7a 46 69 6c 65 3d 3d 30 20 29 7b 0a 20 20 20  .zFile==0 ){.   
290f0 20 20 20 20 20 20 20 63 6d 64 2e 7a 53 72 63 54         cmd.zSrcT
29100 61 62 6c 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d  able = sqlite3_m
29110 70 72 69 6e 74 66 28 22 7a 69 70 22 29 3b 0a 20  printf("zip");. 
29120 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
29130 20 20 20 20 20 20 20 20 63 6d 64 2e 7a 53 72 63          cmd.zSrc
29140 54 61 62 6c 65 20 3d 20 73 71 6c 69 74 65 33 5f  Table = sqlite3_
29150 6d 70 72 69 6e 74 66 28 22 7a 69 70 66 69 6c 65  mprintf("zipfile
29160 28 25 51 29 22 2c 20 63 6d 64 2e 7a 46 69 6c 65  (%Q)", cmd.zFile
29170 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
29180 20 20 20 7d 0a 20 20 20 20 20 20 63 6d 64 2e 62     }.      cmd.b
29190 5a 69 70 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c  Zip = 1;.    }el
291a0 73 65 20 69 66 28 20 63 6d 64 2e 7a 46 69 6c 65  se if( cmd.zFile
291b0 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 66 6c   ){.      int fl
291c0 61 67 73 3b 0a 20 20 20 20 20 20 69 66 28 20 63  ags;.      if( c
291d0 6d 64 2e 62 41 70 70 65 6e 64 20 29 20 65 44 62  md.bAppend ) eDb
291e0 54 79 70 65 20 3d 20 53 48 45 4c 4c 5f 4f 50 45  Type = SHELL_OPE
291f0 4e 5f 41 50 50 45 4e 44 56 46 53 3b 0a 20 20 20  N_APPENDVFS;.   
29200 20 20 20 69 66 28 20 63 6d 64 2e 65 43 6d 64 3d     if( cmd.eCmd=
29210 3d 41 52 5f 43 4d 44 5f 43 52 45 41 54 45 20 7c  =AR_CMD_CREATE |
29220 7c 20 63 6d 64 2e 65 43 6d 64 3d 3d 41 52 5f 43  | cmd.eCmd==AR_C
29230 4d 44 5f 55 50 44 41 54 45 20 29 7b 0a 20 20 20  MD_UPDATE ){.   
29240 20 20 20 20 20 66 6c 61 67 73 20 3d 20 53 51 4c       flags = SQL
29250 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
29260 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43  TE|SQLITE_OPEN_C
29270 52 45 41 54 45 3b 0a 20 20 20 20 20 20 7d 65 6c  REATE;.      }el
29280 73 65 7b 0a 20 20 20 20 20 20 20 20 66 6c 61 67  se{.        flag
29290 73 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s = SQLITE_OPEN_
292a0 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20  READONLY;.      
292b0 7d 0a 20 20 20 20 20 20 63 6d 64 2e 64 62 20 3d  }.      cmd.db =
292c0 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 63 6d   0;.      if( cm
292d0 64 2e 62 44 72 79 52 75 6e 20 29 7b 0a 20 20 20  d.bDryRun ){.   
292e0 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
292f0 28 70 53 74 61 74 65 2d 3e 6f 75 74 2c 20 22 2d  (pState->out, "-
29300 2d 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20  - open database 
29310 27 25 73 27 25 73 5c 6e 22 2c 20 63 6d 64 2e 7a  '%s'%s\n", cmd.z
29320 46 69 6c 65 2c 0a 20 20 20 20 20 20 20 20 20 20  File,.          
29330 20 20 20 65 44 62 54 79 70 65 3d 3d 53 48 45 4c     eDbType==SHEL
29340 4c 5f 4f 50 45 4e 5f 41 50 50 45 4e 44 56 46 53  L_OPEN_APPENDVFS
29350 20 3f 20 22 20 75 73 69 6e 67 20 27 61 70 6e 64   ? " using 'apnd
29360 76 66 73 27 22 20 3a 20 22 22 29 3b 0a 20 20 20  vfs'" : "");.   
29370 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20     }.      rc = 
29380 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28  sqlite3_open_v2(
29390 63 6d 64 2e 7a 46 69 6c 65 2c 20 26 63 6d 64 2e  cmd.zFile, &cmd.
293a0 64 62 2c 20 66 6c 61 67 73 2c 20 0a 20 20 20 20  db, flags, .    
293b0 20 20 20 20 20 20 20 20 20 65 44 62 54 79 70 65           eDbType
293c0 3d 3d 53 48 45 4c 4c 5f 4f 50 45 4e 5f 41 50 50  ==SHELL_OPEN_APP
293d0 45 4e 44 56 46 53 20 3f 20 22 61 70 6e 64 76 66  ENDVFS ? "apndvf
293e0 73 22 20 3a 20 30 29 3b 0a 20 20 20 20 20 20 69  s" : 0);.      i
293f0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
29400 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38   ){.        utf8
29410 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
29420 22 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 66 69 6c  "cannot open fil
29430 65 3a 20 25 73 20 28 25 73 29 5c 6e 22 2c 20 0a  e: %s (%s)\n", .
29440 20 20 20 20 20 20 20 20 20 20 20 20 63 6d 64 2e              cmd.
29450 7a 46 69 6c 65 2c 20 73 71 6c 69 74 65 33 5f 65  zFile, sqlite3_e
29460 72 72 6d 73 67 28 63 6d 64 2e 64 62 29 0a 20 20  rrmsg(cmd.db).  
29470 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20        );.       
29480 20 67 6f 74 6f 20 65 6e 64 5f 61 72 5f 63 6f 6d   goto end_ar_com
29490 6d 61 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20  mand;.      }.  
294a0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65      sqlite3_file
294b0 69 6f 5f 69 6e 69 74 28 63 6d 64 2e 64 62 2c 20  io_init(cmd.db, 
294c0 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  0, 0);.      sql
294d0 69 74 65 33 5f 73 71 6c 61 72 5f 69 6e 69 74 28  ite3_sqlar_init(
294e0 63 6d 64 2e 64 62 2c 20 30 2c 20 30 29 3b 0a 20  cmd.db, 0, 0);. 
294f0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65       sqlite3_cre
29500 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 63 6d 64  ate_function(cmd
29510 2e 64 62 2c 20 22 73 68 65 6c 6c 5f 70 75 74 73  .db, "shell_puts
29520 6e 6c 22 2c 20 31 2c 20 53 51 4c 49 54 45 5f 55  nl", 1, SQLITE_U
29530 54 46 38 2c 20 63 6d 64 2e 70 2c 0a 20 20 20 20  TF8, cmd.p,.    
29540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29550 20 20 20 20 20 20 20 20 20 20 73 68 65 6c 6c 50            shellP
29560 75 74 73 46 75 6e 63 2c 20 30 2c 20 30 29 3b 0a  utsFunc, 0, 0);.
29570 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 63  .    }.    if( c
29580 6d 64 2e 7a 53 72 63 54 61 62 6c 65 3d 3d 30 20  md.zSrcTable==0 
29590 26 26 20 63 6d 64 2e 62 5a 69 70 3d 3d 30 20 29  && cmd.bZip==0 )
295a0 7b 0a 20 20 20 20 20 20 69 66 28 20 63 6d 64 2e  {.      if( cmd.
295b0 65 43 6d 64 21 3d 41 52 5f 43 4d 44 5f 43 52 45  eCmd!=AR_CMD_CRE
295c0 41 54 45 0a 20 20 20 20 20 20 20 26 26 20 73 71  ATE.       && sq
295d0 6c 69 74 65 33 5f 74 61 62 6c 65 5f 63 6f 6c 75  lite3_table_colu
295e0 6d 6e 5f 6d 65 74 61 64 61 74 61 28 63 6d 64 2e  mn_metadata(cmd.
295f0 64 62 2c 30 2c 22 73 71 6c 61 72 22 2c 22 6e 61  db,0,"sqlar","na
29600 6d 65 22 2c 30 2c 30 2c 30 2c 30 2c 30 29 0a 20  me",0,0,0,0,0). 
29610 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
29620 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65  utf8_printf(stde
29630 72 72 2c 20 22 64 61 74 61 62 61 73 65 20 64 6f  rr, "database do
29640 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61  es not contain a
29650 6e 20 27 73 71 6c 61 72 27 20 74 61 62 6c 65 5c  n 'sqlar' table\
29660 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  n");.        rc 
29670 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
29680 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
29690 5f 61 72 5f 63 6f 6d 6d 61 6e 64 3b 0a 20 20 20  _ar_command;.   
296a0 20 20 20 7d 0a 20 20 20 20 20 20 63 6d 64 2e 7a     }.      cmd.z
296b0 53 72 63 54 61 62 6c 65 20 3d 20 73 71 6c 69 74  SrcTable = sqlit
296c0 65 33 5f 6d 70 72 69 6e 74 66 28 22 73 71 6c 61  e3_mprintf("sqla
296d0 72 22 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  r");.    }..    
296e0 73 77 69 74 63 68 28 20 63 6d 64 2e 65 43 6d 64  switch( cmd.eCmd
296f0 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20 41   ){.      case A
29700 52 5f 43 4d 44 5f 43 52 45 41 54 45 3a 0a 20 20  R_CMD_CREATE:.  
29710 20 20 20 20 20 20 72 63 20 3d 20 61 72 43 72 65        rc = arCre
29720 61 74 65 4f 72 55 70 64 61 74 65 43 6f 6d 6d 61  ateOrUpdateComma
29730 6e 64 28 26 63 6d 64 2c 20 30 29 3b 0a 20 20 20  nd(&cmd, 0);.   
29740 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20       break;..   
29750 20 20 20 63 61 73 65 20 41 52 5f 43 4d 44 5f 45     case AR_CMD_E
29760 58 54 52 41 43 54 3a 0a 20 20 20 20 20 20 20 20  XTRACT:.        
29770 72 63 20 3d 20 61 72 45 78 74 72 61 63 74 43 6f  rc = arExtractCo
29780 6d 6d 61 6e 64 28 26 63 6d 64 29 3b 0a 20 20 20  mmand(&cmd);.   
29790 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20       break;..   
297a0 20 20 20 63 61 73 65 20 41 52 5f 43 4d 44 5f 4c     case AR_CMD_L
297b0 49 53 54 3a 0a 20 20 20 20 20 20 20 20 72 63 20  IST:.        rc 
297c0 3d 20 61 72 4c 69 73 74 43 6f 6d 6d 61 6e 64 28  = arListCommand(
297d0 26 63 6d 64 29 3b 0a 20 20 20 20 20 20 20 20 62  &cmd);.        b
297e0 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20 63 61 73  reak;..      cas
297f0 65 20 41 52 5f 43 4d 44 5f 48 45 4c 50 3a 0a 20  e AR_CMD_HELP:. 
29800 20 20 20 20 20 20 20 61 72 55 73 61 67 65 28 70         arUsage(p
29810 53 74 61 74 65 2d 3e 6f 75 74 29 3b 0a 20 20 20  State->out);.   
29820 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20       break;..   
29830 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20     default:.    
29840 20 20 20 20 61 73 73 65 72 74 28 20 63 6d 64 2e      assert( cmd.
29850 65 43 6d 64 3d 3d 41 52 5f 43 4d 44 5f 55 50 44  eCmd==AR_CMD_UPD
29860 41 54 45 20 29 3b 0a 20 20 20 20 20 20 20 20 72  ATE );.        r
29870 63 20 3d 20 61 72 43 72 65 61 74 65 4f 72 55 70  c = arCreateOrUp
29880 64 61 74 65 43 6f 6d 6d 61 6e 64 28 26 63 6d 64  dateCommand(&cmd
29890 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 62 72  , 1);.        br
298a0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 65  eak;.    }.  }.e
298b0 6e 64 5f 61 72 5f 63 6f 6d 6d 61 6e 64 3a 0a 20  nd_ar_command:. 
298c0 20 69 66 28 20 63 6d 64 2e 64 62 21 3d 70 53 74   if( cmd.db!=pSt
298d0 61 74 65 2d 3e 64 62 20 29 7b 0a 20 20 20 20 73  ate->db ){.    s
298e0 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 63 6d 64  qlite3_close(cmd
298f0 2e 64 62 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  .db);.  }.  sqli
29900 74 65 33 5f 66 72 65 65 28 63 6d 64 2e 7a 53 72  te3_free(cmd.zSr
29910 63 54 61 62 6c 65 29 3b 0a 0a 20 20 72 65 74 75  cTable);..  retu
29920 72 6e 20 72 63 3b 0a 7d 0a 2f 2a 20 45 6e 64 20  rn rc;.}./* End 
29930 6f 66 20 74 68 65 20 22 2e 61 72 63 68 69 76 65  of the ".archive
29940 22 20 6f 72 20 22 2e 61 72 22 20 63 6f 6d 6d 61  " or ".ar" comma
29950 6e 64 20 6c 6f 67 69 63 0a 2a 2a 2a 2a 2a 2a 2a  nd logic.*******
29960 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29970 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29980 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29990 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
299a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 23 65 6e  ***********/.#en
299b0 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28  dif /* !defined(
299c0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
299d0 55 41 4c 54 41 42 4c 45 29 20 26 26 20 64 65 66  UALTABLE) && def
299e0 69 6e 65 64 28 53 51 4c 49 54 45 5f 48 41 56 45  ined(SQLITE_HAVE
299f0 5f 5a 4c 49 42 29 20 2a 2f 0a 0a 0a 2f 2a 0a 2a  _ZLIB) */.../*.*
29a00 2a 20 49 66 20 61 6e 20 69 6e 70 75 74 20 6c 69  * If an input li
29a10 6e 65 20 62 65 67 69 6e 73 20 77 69 74 68 20 22  ne begins with "
29a20 2e 22 20 74 68 65 6e 20 69 6e 76 6f 6b 65 20 74  ." then invoke t
29a30 68 69 73 20 72 6f 75 74 69 6e 65 20 74 6f 0a 2a  his routine to.*
29a40 2a 20 70 72 6f 63 65 73 73 20 74 68 61 74 20 6c  * process that l
29a50 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  ine..**.** Retur
29a60 6e 20 31 20 6f 6e 20 65 72 72 6f 72 2c 20 32 20  n 1 on error, 2 
29a70 74 6f 20 65 78 69 74 2c 20 61 6e 64 20 30 20 6f  to exit, and 0 o
29a80 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61  therwise..*/.sta
29a90 74 69 63 20 69 6e 74 20 64 6f 5f 6d 65 74 61 5f  tic int do_meta_
29aa0 63 6f 6d 6d 61 6e 64 28 63 68 61 72 20 2a 7a 4c  command(char *zL
29ab0 69 6e 65 2c 20 53 68 65 6c 6c 53 74 61 74 65 20  ine, ShellState 
29ac0 2a 70 29 7b 0a 20 20 69 6e 74 20 68 20 3d 20 31  *p){.  int h = 1
29ad0 3b 0a 20 20 69 6e 74 20 6e 41 72 67 20 3d 20 30  ;.  int nArg = 0
29ae0 3b 0a 20 20 69 6e 74 20 6e 2c 20 63 3b 0a 20 20  ;.  int n, c;.  
29af0 69 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20 63 68  int rc = 0;.  ch
29b00 61 72 20 2a 61 7a 41 72 67 5b 35 30 5d 3b 0a 0a  ar *azArg[50];..
29b10 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
29b20 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
29b30 0a 20 20 69 66 28 20 70 2d 3e 65 78 70 65 72 74  .  if( p->expert
29b40 2e 70 45 78 70 65 72 74 20 29 7b 0a 20 20 20 20  .pExpert ){.    
29b50 65 78 70 65 72 74 46 69 6e 69 73 68 28 70 2c 20  expertFinish(p, 
29b60 31 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  1, 0);.  }.#endi
29b70 66 0a 0a 20 20 2f 2a 20 50 61 72 73 65 20 74 68  f..  /* Parse th
29b80 65 20 69 6e 70 75 74 20 6c 69 6e 65 20 69 6e 74  e input line int
29b90 6f 20 74 6f 6b 65 6e 73 2e 0a 20 20 2a 2f 0a 20  o tokens..  */. 
29ba0 20 77 68 69 6c 65 28 20 7a 4c 69 6e 65 5b 68 5d   while( zLine[h]
29bb0 20 26 26 20 6e 41 72 67 3c 41 72 72 61 79 53 69   && nArg<ArraySi
29bc0 7a 65 28 61 7a 41 72 67 29 20 29 7b 0a 20 20 20  ze(azArg) ){.   
29bd0 20 77 68 69 6c 65 28 20 49 73 53 70 61 63 65 28   while( IsSpace(
29be0 7a 4c 69 6e 65 5b 68 5d 29 20 29 7b 20 68 2b 2b  zLine[h]) ){ h++
29bf0 3b 20 7d 0a 20 20 20 20 69 66 28 20 7a 4c 69 6e  ; }.    if( zLin
29c00 65 5b 68 5d 3d 3d 30 20 29 20 62 72 65 61 6b 3b  e[h]==0 ) break;
29c10 0a 20 20 20 20 69 66 28 20 7a 4c 69 6e 65 5b 68  .    if( zLine[h
29c20 5d 3d 3d 27 5c 27 27 20 7c 7c 20 7a 4c 69 6e 65  ]=='\'' || zLine
29c30 5b 68 5d 3d 3d 27 22 27 20 29 7b 0a 20 20 20 20  [h]=='"' ){.    
29c40 20 20 69 6e 74 20 64 65 6c 69 6d 20 3d 20 7a 4c    int delim = zL
29c50 69 6e 65 5b 68 2b 2b 5d 3b 0a 20 20 20 20 20 20  ine[h++];.      
29c60 61 7a 41 72 67 5b 6e 41 72 67 2b 2b 5d 20 3d 20  azArg[nArg++] = 
29c70 26 7a 4c 69 6e 65 5b 68 5d 3b 0a 20 20 20 20 20  &zLine[h];.     
29c80 20 77 68 69 6c 65 28 20 7a 4c 69 6e 65 5b 68 5d   while( zLine[h]
29c90 20 26 26 20 7a 4c 69 6e 65 5b 68 5d 21 3d 64 65   && zLine[h]!=de
29ca0 6c 69 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 69  lim ){.        i
29cb0 66 28 20 7a 4c 69 6e 65 5b 68 5d 3d 3d 27 5c 5c  f( zLine[h]=='\\
29cc0 27 20 26 26 20 64 65 6c 69 6d 3d 3d 27 22 27 20  ' && delim=='"' 
29cd0 26 26 20 7a 4c 69 6e 65 5b 68 2b 31 5d 21 3d 30  && zLine[h+1]!=0
29ce0 20 29 20 68 2b 2b 3b 0a 20 20 20 20 20 20 20 20   ) h++;.        
29cf0 68 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  h++;.      }.   
29d00 20 20 20 69 66 28 20 7a 4c 69 6e 65 5b 68 5d 3d     if( zLine[h]=
29d10 3d 64 65 6c 69 6d 20 29 7b 0a 20 20 20 20 20 20  =delim ){.      
29d20 20 20 7a 4c 69 6e 65 5b 68 2b 2b 5d 20 3d 20 30    zLine[h++] = 0
29d30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
29d40 69 66 28 20 64 65 6c 69 6d 3d 3d 27 22 27 20 29  if( delim=='"' )
29d50 20 72 65 73 6f 6c 76 65 5f 62 61 63 6b 73 6c 61   resolve_backsla
29d60 73 68 65 73 28 61 7a 41 72 67 5b 6e 41 72 67 2d  shes(azArg[nArg-
29d70 31 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  1]);.    }else{.
29d80 20 20 20 20 20 20 61 7a 41 72 67 5b 6e 41 72 67        azArg[nArg
29d90 2b 2b 5d 20 3d 20 26 7a 4c 69 6e 65 5b 68 5d 3b  ++] = &zLine[h];
29da0 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 7a 4c  .      while( zL
29db0 69 6e 65 5b 68 5d 20 26 26 20 21 49 73 53 70 61  ine[h] && !IsSpa
29dc0 63 65 28 7a 4c 69 6e 65 5b 68 5d 29 20 29 7b 20  ce(zLine[h]) ){ 
29dd0 68 2b 2b 3b 20 7d 0a 20 20 20 20 20 20 69 66 28  h++; }.      if(
29de0 20 7a 4c 69 6e 65 5b 68 5d 20 29 20 7a 4c 69 6e   zLine[h] ) zLin
29df0 65 5b 68 2b 2b 5d 20 3d 20 30 3b 0a 20 20 20 20  e[h++] = 0;.    
29e00 20 20 72 65 73 6f 6c 76 65 5f 62 61 63 6b 73 6c    resolve_backsl
29e10 61 73 68 65 73 28 61 7a 41 72 67 5b 6e 41 72 67  ashes(azArg[nArg
29e20 2d 31 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  -1]);.    }.  }.
29e30 0a 20 20 2f 2a 20 50 72 6f 63 65 73 73 20 74 68  .  /* Process th
29e40 65 20 69 6e 70 75 74 20 6c 69 6e 65 2e 0a 20 20  e input line..  
29e50 2a 2f 0a 20 20 69 66 28 20 6e 41 72 67 3d 3d 30  */.  if( nArg==0
29e60 20 29 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20   ) return 0; /* 
29e70 6e 6f 20 74 6f 6b 65 6e 73 2c 20 6e 6f 20 65 72  no tokens, no er
29e80 72 6f 72 20 2a 2f 0a 20 20 6e 20 3d 20 73 74 72  ror */.  n = str
29e90 6c 65 6e 33 30 28 61 7a 41 72 67 5b 30 5d 29 3b  len30(azArg[0]);
29ea0 0a 20 20 63 20 3d 20 61 7a 41 72 67 5b 30 5d 5b  .  c = azArg[0][
29eb0 30 5d 3b 0a 20 20 63 6c 65 61 72 54 65 6d 70 46  0];.  clearTempF
29ec0 69 6c 65 28 70 29 3b 0a 0a 23 69 66 6e 64 65 66  ile(p);..#ifndef
29ed0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
29ee0 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 69 66 28  HORIZATION.  if(
29ef0 20 63 3d 3d 27 61 27 20 26 26 20 73 74 72 6e 63   c=='a' && strnc
29f00 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 61 75  mp(azArg[0], "au
29f10 74 68 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20  th", n)==0 ){.  
29f20 20 20 69 66 28 20 6e 41 72 67 21 3d 32 20 29 7b    if( nArg!=2 ){
29f30 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74  .      raw_print
29f40 66 28 73 74 64 65 72 72 2c 20 22 55 73 61 67 65  f(stderr, "Usage
29f50 3a 20 2e 61 75 74 68 20 4f 4e 7c 4f 46 46 5c 6e  : .auth ON|OFF\n
29f60 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31  ");.      rc = 1
29f70 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 65 74  ;.      goto met
29f80 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a  a_command_exit;.
29f90 20 20 20 20 7d 0a 20 20 20 20 6f 70 65 6e 5f 64      }.    open_d
29fa0 62 28 70 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  b(p, 0);.    if(
29fb0 20 62 6f 6f 6c 65 61 6e 56 61 6c 75 65 28 61 7a   booleanValue(az
29fc0 41 72 67 5b 31 5d 29 20 29 7b 0a 20 20 20 20 20  Arg[1]) ){.     
29fd0 20 73 71 6c 69 74 65 33 5f 73 65 74 5f 61 75 74   sqlite3_set_aut
29fe0 68 6f 72 69 7a 65 72 28 70 2d 3e 64 62 2c 20 73  horizer(p->db, s
29ff0 68 65 6c 6c 41 75 74 68 2c 20 70 29 3b 0a 20 20  hellAuth, p);.  
2a000 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
2a010 71 6c 69 74 65 33 5f 73 65 74 5f 61 75 74 68 6f  qlite3_set_autho
2a020 72 69 7a 65 72 28 70 2d 3e 64 62 2c 20 30 2c 20  rizer(p->db, 0, 
2a030 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  0);.    }.  }els
2a040 65 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 64  e.#endif..#if !d
2a050 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
2a060 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29  IT_VIRTUALTABLE)
2a070 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49   && defined(SQLI
2a080 54 45 5f 48 41 56 45 5f 5a 4c 49 42 29 0a 20 20  TE_HAVE_ZLIB).  
2a090 69 66 28 20 63 3d 3d 27 61 27 20 26 26 20 73 74  if( c=='a' && st
2a0a0 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20  rncmp(azArg[0], 
2a0b0 22 61 72 63 68 69 76 65 22 2c 20 6e 29 3d 3d 30  "archive", n)==0
2a0c0 20 29 7b 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28   ){.    open_db(
2a0d0 70 2c 20 30 29 3b 0a 20 20 20 20 72 63 20 3d 20  p, 0);.    rc = 
2a0e0 61 72 44 6f 74 43 6f 6d 6d 61 6e 64 28 70 2c 20  arDotCommand(p, 
2a0f0 61 7a 41 72 67 2c 20 6e 41 72 67 29 3b 0a 20 20  azArg, nArg);.  
2a100 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 0a 20 20  }else.#endif..  
2a110 69 66 28 20 28 63 3d 3d 27 62 27 20 26 26 20 6e  if( (c=='b' && n
2a120 3e 3d 33 20 26 26 20 73 74 72 6e 63 6d 70 28 61  >=3 && strncmp(a
2a130 7a 41 72 67 5b 30 5d 2c 20 22 62 61 63 6b 75 70  zArg[0], "backup
2a140 22 2c 20 6e 29 3d 3d 30 29 0a 20 20 20 7c 7c 20  ", n)==0).   || 
2a150 28 63 3d 3d 27 73 27 20 26 26 20 6e 3e 3d 33 20  (c=='s' && n>=3 
2a160 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67  && strncmp(azArg
2a170 5b 30 5d 2c 20 22 73 61 76 65 22 2c 20 6e 29 3d  [0], "save", n)=
2a180 3d 30 29 0a 20 20 29 7b 0a 20 20 20 20 63 6f 6e  =0).  ){.    con
2a190 73 74 20 63 68 61 72 20 2a 7a 44 65 73 74 46 69  st char *zDestFi
2a1a0 6c 65 20 3d 20 30 3b 0a 20 20 20 20 63 6f 6e 73  le = 0;.    cons
2a1b0 74 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 30 3b  t char *zDb = 0;
2a1c0 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a 70 44  .    sqlite3 *pD
2a1d0 65 73 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  est;.    sqlite3
2a1e0 5f 62 61 63 6b 75 70 20 2a 70 42 61 63 6b 75 70  _backup *pBackup
2a1f0 3b 0a 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20  ;.    int j;.   
2a200 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56 66   const char *zVf
2a210 73 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 6a  s = 0;.    for(j
2a220 3d 31 3b 20 6a 3c 6e 41 72 67 3b 20 6a 2b 2b 29  =1; j<nArg; j++)
2a230 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  {.      const ch
2a240 61 72 20 2a 7a 20 3d 20 61 7a 41 72 67 5b 6a 5d  ar *z = azArg[j]
2a250 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 5b 30 5d  ;.      if( z[0]
2a260 3d 3d 27 2d 27 20 29 7b 0a 20 20 20 20 20 20 20  =='-' ){.       
2a270 20 69 66 28 20 7a 5b 31 5d 3d 3d 27 2d 27 20 29   if( z[1]=='-' )
2a280 20 7a 2b 2b 3b 0a 20 20 20 20 20 20 20 20 69 66   z++;.        if
2a290 28 20 73 74 72 63 6d 70 28 7a 2c 20 22 2d 61 70  ( strcmp(z, "-ap
2a2a0 70 65 6e 64 22 29 3d 3d 30 20 29 7b 0a 20 20 20  pend")==0 ){.   
2a2b0 20 20 20 20 20 20 20 7a 56 66 73 20 3d 20 22 61         zVfs = "a
2a2c0 70 6e 64 76 66 73 22 3b 0a 20 20 20 20 20 20 20  pndvfs";.       
2a2d0 20 7d 65 6c 73 65 0a 20 20 20 20 20 20 20 20 7b   }else.        {
2a2e0 0a 20 20 20 20 20 20 20 20 20 20 75 74 66 38 5f  .          utf8_
2a2f0 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
2a300 75 6e 6b 6e 6f 77 6e 20 6f 70 74 69 6f 6e 3a 20  unknown option: 
2a310 25 73 5c 6e 22 2c 20 61 7a 41 72 67 5b 6a 5d 29  %s\n", azArg[j])
2a320 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ;.          retu
2a330 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a  rn 1;.        }.
2a340 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
2a350 7a 44 65 73 74 46 69 6c 65 3d 3d 30 20 29 7b 0a  zDestFile==0 ){.
2a360 20 20 20 20 20 20 20 20 7a 44 65 73 74 46 69 6c          zDestFil
2a370 65 20 3d 20 61 7a 41 72 67 5b 6a 5d 3b 0a 20 20  e = azArg[j];.  
2a380 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 44      }else if( zD
2a390 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  b==0 ){.        
2a3a0 7a 44 62 20 3d 20 7a 44 65 73 74 46 69 6c 65 3b  zDb = zDestFile;
2a3b0 0a 20 20 20 20 20 20 20 20 7a 44 65 73 74 46 69  .        zDestFi
2a3c0 6c 65 20 3d 20 61 7a 41 72 67 5b 6a 5d 3b 0a 20  le = azArg[j];. 
2a3d0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2a3e0 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73      raw_printf(s
2a3f0 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e  tderr, "Usage: .
2a400 62 61 63 6b 75 70 20 3f 44 42 3f 20 3f 2d 2d 61  backup ?DB? ?--a
2a410 70 70 65 6e 64 3f 20 46 49 4c 45 4e 41 4d 45 5c  ppend? FILENAME\
2a420 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  n");.        ret
2a430 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  urn 1;.      }. 
2a440 20 20 20 7d 0a 20 20 20 20 69 66 28 20 7a 44 65     }.    if( zDe
2a450 73 74 46 69 6c 65 3d 3d 30 20 29 7b 0a 20 20 20  stFile==0 ){.   
2a460 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74     raw_printf(st
2a470 64 65 72 72 2c 20 22 6d 69 73 73 69 6e 67 20 46  derr, "missing F
2a480 49 4c 45 4e 41 4d 45 20 61 72 67 75 6d 65 6e 74  ILENAME argument
2a490 20 6f 6e 20 2e 62 61 63 6b 75 70 5c 6e 22 29 3b   on .backup\n");
2a4a0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
2a4b0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 7a  .    }.    if( z
2a4c0 44 62 3d 3d 30 20 29 20 7a 44 62 20 3d 20 22 6d  Db==0 ) zDb = "m
2a4d0 61 69 6e 22 3b 0a 20 20 20 20 72 63 20 3d 20 73  ain";.    rc = s
2a4e0 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28 7a  qlite3_open_v2(z
2a4f0 44 65 73 74 46 69 6c 65 2c 20 26 70 44 65 73 74  DestFile, &pDest
2a500 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
2a510 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
2a520 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54  _READWRITE|SQLIT
2a530 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 2c 20 7a  E_OPEN_CREATE, z
2a540 56 66 73 29 3b 0a 20 20 20 20 69 66 28 20 72 63  Vfs);.    if( rc
2a550 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
2a560 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
2a570 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a  (stderr, "Error:
2a580 20 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 5c 22 25   cannot open \"%
2a590 73 5c 22 5c 6e 22 2c 20 7a 44 65 73 74 46 69 6c  s\"\n", zDestFil
2a5a0 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  e);.      sqlite
2a5b0 33 5f 63 6c 6f 73 65 28 70 44 65 73 74 29 3b 0a  3_close(pDest);.
2a5c0 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
2a5d0 20 20 20 20 7d 0a 20 20 20 20 6f 70 65 6e 5f 64      }.    open_d
2a5e0 62 28 70 2c 20 30 29 3b 0a 20 20 20 20 70 42 61  b(p, 0);.    pBa
2a5f0 63 6b 75 70 20 3d 20 73 71 6c 69 74 65 33 5f 62  ckup = sqlite3_b
2a600 61 63 6b 75 70 5f 69 6e 69 74 28 70 44 65 73 74  ackup_init(pDest
2a610 2c 20 22 6d 61 69 6e 22 2c 20 70 2d 3e 64 62 2c  , "main", p->db,
2a620 20 7a 44 62 29 3b 0a 20 20 20 20 69 66 28 20 70   zDb);.    if( p
2a630 42 61 63 6b 75 70 3d 3d 30 20 29 7b 0a 20 20 20  Backup==0 ){.   
2a640 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73     utf8_printf(s
2a650 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 25  tderr, "Error: %
2a660 73 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f 65 72  s\n", sqlite3_er
2a670 72 6d 73 67 28 70 44 65 73 74 29 29 3b 0a 20 20  rmsg(pDest));.  
2a680 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73      sqlite3_clos
2a690 65 28 70 44 65 73 74 29 3b 0a 20 20 20 20 20 20  e(pDest);.      
2a6a0 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
2a6b0 20 20 20 20 77 68 69 6c 65 28 20 20 28 72 63 20      while(  (rc 
2a6c0 3d 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70  = sqlite3_backup
2a6d0 5f 73 74 65 70 28 70 42 61 63 6b 75 70 2c 31 30  _step(pBackup,10
2a6e0 30 29 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  0))==SQLITE_OK )
2a6f0 7b 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62  {}.    sqlite3_b
2a700 61 63 6b 75 70 5f 66 69 6e 69 73 68 28 70 42 61  ackup_finish(pBa
2a710 63 6b 75 70 29 3b 0a 20 20 20 20 69 66 28 20 72  ckup);.    if( r
2a720 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c==SQLITE_DONE )
2a730 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 30 3b 0a  {.      rc = 0;.
2a740 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2a750 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64   utf8_printf(std
2a760 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 25 73 5c  err, "Error: %s\
2a770 6e 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d  n", sqlite3_errm
2a780 73 67 28 70 44 65 73 74 29 29 3b 0a 20 20 20 20  sg(pDest));.    
2a790 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a    rc = 1;.    }.
2a7a0 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73      sqlite3_clos
2a7b0 65 28 70 44 65 73 74 29 3b 0a 20 20 7d 65 6c 73  e(pDest);.  }els
2a7c0 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 62 27 20  e..  if( c=='b' 
2a7d0 26 26 20 6e 3e 3d 33 20 26 26 20 73 74 72 6e 63  && n>=3 && strnc
2a7e0 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 62 61  mp(azArg[0], "ba
2a7f0 69 6c 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20  il", n)==0 ){.  
2a800 20 20 69 66 28 20 6e 41 72 67 3d 3d 32 20 29 7b    if( nArg==2 ){
2a810 0a 20 20 20 20 20 20 62 61 69 6c 5f 6f 6e 5f 65  .      bail_on_e
2a820 72 72 6f 72 20 3d 20 62 6f 6f 6c 65 61 6e 56 61  rror = booleanVa
2a830 6c 75 65 28 61 7a 41 72 67 5b 31 5d 29 3b 0a 20  lue(azArg[1]);. 
2a840 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2a850 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72  raw_printf(stder
2a860 72 2c 20 22 55 73 61 67 65 3a 20 2e 62 61 69 6c  r, "Usage: .bail
2a870 20 6f 6e 7c 6f 66 66 5c 6e 22 29 3b 0a 20 20 20   on|off\n");.   
2a880 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d     rc = 1;.    }
2a890 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20  .  }else..  if( 
2a8a0 63 3d 3d 27 62 27 20 26 26 20 6e 3e 3d 33 20 26  c=='b' && n>=3 &
2a8b0 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b  & strncmp(azArg[
2a8c0 30 5d 2c 20 22 62 69 6e 61 72 79 22 2c 20 6e 29  0], "binary", n)
2a8d0 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6e  ==0 ){.    if( n
2a8e0 41 72 67 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20  Arg==2 ){.      
2a8f0 69 66 28 20 62 6f 6f 6c 65 61 6e 56 61 6c 75 65  if( booleanValue
2a900 28 61 7a 41 72 67 5b 31 5d 29 20 29 7b 0a 20 20  (azArg[1]) ){.  
2a910 20 20 20 20 20 20 73 65 74 42 69 6e 61 72 79 4d        setBinaryM
2a920 6f 64 65 28 70 2d 3e 6f 75 74 2c 20 31 29 3b 0a  ode(p->out, 1);.
2a930 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2a940 20 20 20 20 20 73 65 74 54 65 78 74 4d 6f 64 65       setTextMode
2a950 28 70 2d 3e 6f 75 74 2c 20 31 29 3b 0a 20 20 20  (p->out, 1);.   
2a960 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
2a970 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
2a980 28 73 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a  (stderr, "Usage:
2a990 20 2e 62 69 6e 61 72 79 20 6f 6e 7c 6f 66 66 5c   .binary on|off\
2a9a0 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  n");.      rc = 
2a9b0 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  1;.    }.  }else
2a9c0 0a 0a 20 20 69 66 28 20 63 3d 3d 27 63 27 20 26  ..  if( c=='c' &
2a9d0 26 20 73 74 72 63 6d 70 28 61 7a 41 72 67 5b 30  & strcmp(azArg[0
2a9e0 5d 2c 22 63 64 22 29 3d 3d 30 20 29 7b 0a 20 20  ],"cd")==0 ){.  
2a9f0 20 20 69 66 28 20 6e 41 72 67 3d 3d 32 20 29 7b    if( nArg==2 ){
2aa00 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 57 49  .#if defined(_WI
2aa10 4e 33 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  N32) || defined(
2aa20 57 49 4e 33 32 29 0a 20 20 20 20 20 20 77 63 68  WIN32).      wch
2aa30 61 72 5f 74 20 2a 7a 20 3d 20 73 71 6c 69 74 65  ar_t *z = sqlite
2aa40 33 5f 77 69 6e 33 32 5f 75 74 66 38 5f 74 6f 5f  3_win32_utf8_to_
2aa50 75 6e 69 63 6f 64 65 28 61 7a 41 72 67 5b 31 5d  unicode(azArg[1]
2aa60 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 21 53  );.      rc = !S
2aa70 65 74 43 75 72 72 65 6e 74 44 69 72 65 63 74 6f  etCurrentDirecto
2aa80 72 79 57 28 7a 29 3b 0a 20 20 20 20 20 20 73 71  ryW(z);.      sq
2aa90 6c 69 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a 23  lite3_free(z);.#
2aaa0 65 6c 73 65 0a 20 20 20 20 20 20 72 63 20 3d 20  else.      rc = 
2aab0 63 68 64 69 72 28 61 7a 41 72 67 5b 31 5d 29 3b  chdir(azArg[1]);
2aac0 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 69 66  .#endif.      if
2aad0 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
2aae0 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65  utf8_printf(stde
2aaf0 72 72 2c 20 22 43 61 6e 6e 6f 74 20 63 68 61 6e  rr, "Cannot chan
2ab00 67 65 20 74 6f 20 64 69 72 65 63 74 6f 72 79 20  ge to directory 
2ab10 5c 22 25 73 5c 22 5c 6e 22 2c 20 61 7a 41 72 67  \"%s\"\n", azArg
2ab20 5b 31 5d 29 3b 0a 20 20 20 20 20 20 20 20 72 63  [1]);.        rc
2ab30 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
2ab40 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
2ab50 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  aw_printf(stderr
2ab60 2c 20 22 55 73 61 67 65 3a 20 2e 63 64 20 44 49  , "Usage: .cd DI
2ab70 52 45 43 54 4f 52 59 5c 6e 22 29 3b 0a 20 20 20  RECTORY\n");.   
2ab80 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d     rc = 1;.    }
2ab90 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 2f 2a 20 54  .  }else..  /* T
2aba0 68 65 20 75 6e 64 6f 63 75 6d 65 6e 74 65 64 20  he undocumented 
2abb0 22 2e 62 72 65 61 6b 70 6f 69 6e 74 22 20 63 6f  ".breakpoint" co
2abc0 6d 6d 61 6e 64 20 63 61 75 73 65 73 20 61 20 63  mmand causes a c
2abd0 61 6c 6c 20 74 6f 20 74 68 65 20 6e 6f 2d 6f 70  all to the no-op
2abe0 0a 20 20 2a 2a 20 72 6f 75 74 69 6e 65 20 6e 61  .  ** routine na
2abf0 6d 65 64 20 74 65 73 74 5f 62 72 65 61 6b 70 6f  med test_breakpo
2ac00 69 6e 74 28 29 2e 0a 20 20 2a 2f 0a 20 20 69 66  int()..  */.  if
2ac10 28 20 63 3d 3d 27 62 27 20 26 26 20 6e 3e 3d 33  ( c=='b' && n>=3
2ac20 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72   && strncmp(azAr
2ac30 67 5b 30 5d 2c 20 22 62 72 65 61 6b 70 6f 69 6e  g[0], "breakpoin
2ac40 74 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20  t", n)==0 ){.   
2ac50 20 74 65 73 74 5f 62 72 65 61 6b 70 6f 69 6e 74   test_breakpoint
2ac60 28 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69  ();.  }else..  i
2ac70 66 28 20 63 3d 3d 27 63 27 20 26 26 20 6e 3e 3d  f( c=='c' && n>=
2ac80 33 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41  3 && strncmp(azA
2ac90 72 67 5b 30 5d 2c 20 22 63 68 61 6e 67 65 73 22  rg[0], "changes"
2aca0 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69  , n)==0 ){.    i
2acb0 66 28 20 6e 41 72 67 3d 3d 32 20 29 7b 0a 20 20  f( nArg==2 ){.  
2acc0 20 20 20 20 73 65 74 4f 72 43 6c 65 61 72 46 6c      setOrClearFl
2acd0 61 67 28 70 2c 20 53 48 46 4c 47 5f 43 6f 75 6e  ag(p, SHFLG_Coun
2ace0 74 43 68 61 6e 67 65 73 2c 20 61 7a 41 72 67 5b  tChanges, azArg[
2acf0 31 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  1]);.    }else{.
2ad00 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
2ad10 28 73 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a  (stderr, "Usage:
2ad20 20 2e 63 68 61 6e 67 65 73 20 6f 6e 7c 6f 66 66   .changes on|off
2ad30 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  \n");.      rc =
2ad40 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73   1;.    }.  }els
2ad50 65 0a 0a 20 20 2f 2a 20 43 61 6e 63 65 6c 20 6f  e..  /* Cancel o
2ad60 75 74 70 75 74 20 72 65 64 69 72 65 63 74 69 6f  utput redirectio
2ad70 6e 2c 20 69 66 20 69 74 20 69 73 20 63 75 72 72  n, if it is curr
2ad80 65 6e 74 6c 79 20 73 65 74 20 28 62 79 20 2e 74  ently set (by .t
2ad90 65 73 74 63 61 73 65 29 0a 20 20 2a 2a 20 54 68  estcase).  ** Th
2ada0 65 6e 20 72 65 61 64 20 74 68 65 20 63 6f 6e 74  en read the cont
2adb0 65 6e 74 20 6f 66 20 74 68 65 20 74 65 73 74 63  ent of the testc
2adc0 61 73 65 2d 6f 75 74 2e 74 78 74 20 66 69 6c 65  ase-out.txt file
2add0 20 61 6e 64 20 63 6f 6d 70 61 72 65 20 61 67 61   and compare aga
2ade0 69 6e 73 74 0a 20 20 2a 2a 20 61 7a 41 72 67 5b  inst.  ** azArg[
2adf0 31 5d 2e 20 20 49 66 20 74 68 65 72 65 20 61 72  1].  If there ar
2ae00 65 20 64 69 66 66 65 72 65 6e 63 65 73 2c 20 72  e differences, r
2ae10 65 70 6f 72 74 20 61 6e 20 65 72 72 6f 72 20 61  eport an error a
2ae20 6e 64 20 65 78 69 74 2e 0a 20 20 2a 2f 0a 20 20  nd exit..  */.  
2ae30 69 66 28 20 63 3d 3d 27 63 27 20 26 26 20 6e 3e  if( c=='c' && n>
2ae40 3d 33 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a  =3 && strncmp(az
2ae50 41 72 67 5b 30 5d 2c 20 22 63 68 65 63 6b 22 2c  Arg[0], "check",
2ae60 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 63 68   n)==0 ){.    ch
2ae70 61 72 20 2a 7a 52 65 73 20 3d 20 30 3b 0a 20 20  ar *zRes = 0;.  
2ae80 20 20 6f 75 74 70 75 74 5f 72 65 73 65 74 28 70    output_reset(p
2ae90 29 3b 0a 20 20 20 20 69 66 28 20 6e 41 72 67 21  );.    if( nArg!
2aea0 3d 32 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f  =2 ){.      raw_
2aeb0 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
2aec0 55 73 61 67 65 3a 20 2e 63 68 65 63 6b 20 47 4c  Usage: .check GL
2aed0 4f 42 2d 50 41 54 54 45 52 4e 5c 6e 22 29 3b 0a  OB-PATTERN\n");.
2aee0 20 20 20 20 20 20 72 63 20 3d 20 32 3b 0a 20 20        rc = 2;.  
2aef0 20 20 7d 65 6c 73 65 20 69 66 28 20 28 7a 52 65    }else if( (zRe
2af00 73 20 3d 20 72 65 61 64 46 69 6c 65 28 22 74 65  s = readFile("te
2af10 73 74 63 61 73 65 2d 6f 75 74 2e 74 78 74 22 2c  stcase-out.txt",
2af20 20 30 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20   0))==0 ){.     
2af30 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65   raw_printf(stde
2af40 72 72 2c 20 22 45 72 72 6f 72 3a 20 63 61 6e 6e  rr, "Error: cann
2af50 6f 74 20 72 65 61 64 20 27 74 65 73 74 63 61 73  ot read 'testcas
2af60 65 2d 6f 75 74 2e 74 78 74 27 5c 6e 22 29 3b 0a  e-out.txt'\n");.
2af70 20 20 20 20 20 20 72 63 20 3d 20 32 3b 0a 20 20        rc = 2;.  
2af80 20 20 7d 65 6c 73 65 20 69 66 28 20 74 65 73 74    }else if( test
2af90 63 61 73 65 5f 67 6c 6f 62 28 61 7a 41 72 67 5b  case_glob(azArg[
2afa0 31 5d 2c 7a 52 65 73 29 3d 3d 30 20 29 7b 0a 20  1],zRes)==0 ){. 
2afb0 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
2afc0 28 73 74 64 65 72 72 2c 0a 20 20 20 20 20 20 20  (stderr,.       
2afd0 20 20 20 20 20 20 20 20 20 20 22 74 65 73 74 63            "testc
2afe0 61 73 65 2d 25 73 20 46 41 49 4c 45 44 5c 6e 20  ase-%s FAILED\n 
2aff0 45 78 70 65 63 74 65 64 3a 20 5b 25 73 5d 5c 6e  Expected: [%s]\n
2b000 20 20 20 20 20 20 47 6f 74 3a 20 5b 25 73 5d 5c        Got: [%s]\
2b010 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
2b020 20 20 20 20 20 70 2d 3e 7a 54 65 73 74 63 61 73       p->zTestcas
2b030 65 2c 20 61 7a 41 72 67 5b 31 5d 2c 20 7a 52 65  e, azArg[1], zRe
2b040 73 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31  s);.      rc = 1
2b050 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
2b060 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73     utf8_printf(s
2b070 74 64 6f 75 74 2c 20 22 74 65 73 74 63 61 73 65  tdout, "testcase
2b080 2d 25 73 20 6f 6b 5c 6e 22 2c 20 70 2d 3e 7a 54  -%s ok\n", p->zT
2b090 65 73 74 63 61 73 65 29 3b 0a 20 20 20 20 20 20  estcase);.      
2b0a0 70 2d 3e 6e 43 68 65 63 6b 2b 2b 3b 0a 20 20 20  p->nCheck++;.   
2b0b0 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66   }.    sqlite3_f
2b0c0 72 65 65 28 7a 52 65 73 29 3b 0a 20 20 7d 65 6c  ree(zRes);.  }el
2b0d0 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 63 27  se..  if( c=='c'
2b0e0 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72   && strncmp(azAr
2b0f0 67 5b 30 5d 2c 20 22 63 6c 6f 6e 65 22 2c 20 6e  g[0], "clone", n
2b100 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  )==0 ){.    if( 
2b110 6e 41 72 67 3d 3d 32 20 29 7b 0a 20 20 20 20 20  nArg==2 ){.     
2b120 20 74 72 79 54 6f 43 6c 6f 6e 65 28 70 2c 20 61   tryToClone(p, a
2b130 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20 7d 65  zArg[1]);.    }e
2b140 6c 73 65 7b 0a 20 20 20 20 20 20 72 61 77 5f 70  lse{.      raw_p
2b150 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55  rintf(stderr, "U
2b160 73 61 67 65 3a 20 2e 63 6c 6f 6e 65 20 46 49 4c  sage: .clone FIL
2b170 45 4e 41 4d 45 5c 6e 22 29 3b 0a 20 20 20 20 20  ENAME\n");.     
2b180 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20   rc = 1;.    }. 
2b190 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d   }else..  if( c=
2b1a0 3d 27 64 27 20 26 26 20 6e 3e 31 20 26 26 20 73  ='d' && n>1 && s
2b1b0 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c  trncmp(azArg[0],
2b1c0 20 22 64 61 74 61 62 61 73 65 73 22 2c 20 6e 29   "databases", n)
2b1d0 3d 3d 30 20 29 7b 0a 20 20 20 20 53 68 65 6c 6c  ==0 ){.    Shell
2b1e0 53 74 61 74 65 20 64 61 74 61 3b 0a 20 20 20 20  State data;.    
2b1f0 63 68 61 72 20 2a 7a 45 72 72 4d 73 67 20 3d 20  char *zErrMsg = 
2b200 30 3b 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28 70  0;.    open_db(p
2b210 2c 20 30 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79  , 0);.    memcpy
2b220 28 26 64 61 74 61 2c 20 70 2c 20 73 69 7a 65 6f  (&data, p, sizeo
2b230 66 28 64 61 74 61 29 29 3b 0a 20 20 20 20 64 61  f(data));.    da
2b240 74 61 2e 73 68 6f 77 48 65 61 64 65 72 20 3d 20  ta.showHeader = 
2b250 30 3b 0a 20 20 20 20 64 61 74 61 2e 63 4d 6f 64  0;.    data.cMod
2b260 65 20 3d 20 64 61 74 61 2e 6d 6f 64 65 20 3d 20  e = data.mode = 
2b270 4d 4f 44 45 5f 4c 69 73 74 3b 0a 20 20 20 20 73  MODE_List;.    s
2b280 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
2b290 73 69 7a 65 6f 66 28 64 61 74 61 2e 63 6f 6c 53  sizeof(data.colS
2b2a0 65 70 61 72 61 74 6f 72 29 2c 64 61 74 61 2e 63  eparator),data.c
2b2b0 6f 6c 53 65 70 61 72 61 74 6f 72 2c 22 3a 20 22  olSeparator,": "
2b2c0 29 3b 0a 20 20 20 20 64 61 74 61 2e 63 6e 74 20  );.    data.cnt 
2b2d0 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  = 0;.    sqlite3
2b2e0 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20 22 53 45  _exec(p->db, "SE
2b2f0 4c 45 43 54 20 6e 61 6d 65 2c 20 66 69 6c 65 20  LECT name, file 
2b300 46 52 4f 4d 20 70 72 61 67 6d 61 5f 64 61 74 61  FROM pragma_data
2b310 62 61 73 65 5f 6c 69 73 74 22 2c 0a 20 20 20 20  base_list",.    
2b320 20 20 20 20 20 20 20 20 20 20 20 20 20 63 61 6c               cal
2b330 6c 62 61 63 6b 2c 20 26 64 61 74 61 2c 20 26 7a  lback, &data, &z
2b340 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 69 66 28  ErrMsg);.    if(
2b350 20 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20   zErrMsg ){.    
2b360 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74    utf8_printf(st
2b370 64 65 72 72 2c 22 45 72 72 6f 72 3a 20 25 73 5c  derr,"Error: %s\
2b380 6e 22 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20 20  n", zErrMsg);.  
2b390 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
2b3a0 28 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20  (zErrMsg);.     
2b3b0 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20   rc = 1;.    }. 
2b3c0 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d   }else..  if( c=
2b3d0 3d 27 64 27 20 26 26 20 6e 3e 3d 33 20 26 26 20  ='d' && n>=3 && 
2b3e0 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d  strncmp(azArg[0]
2b3f0 2c 20 22 64 62 63 6f 6e 66 69 67 22 2c 20 6e 29  , "dbconfig", n)
2b400 3d 3d 30 20 29 7b 0a 20 20 20 20 73 74 61 74 69  ==0 ){.    stati
2b410 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20 44  c const struct D
2b420 62 43 6f 6e 66 69 67 43 68 6f 69 63 65 73 20 7b  bConfigChoices {
2b430 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
2b440 65 3b 20 69 6e 74 20 6f 70 3b 7d 20 61 44 62 43  e; int op;} aDbC
2b450 6f 6e 66 69 67 5b 5d 20 3d 20 7b 0a 20 20 20 20  onfig[] = {.    
2b460 20 20 20 20 7b 20 22 65 6e 61 62 6c 65 5f 66 6b      { "enable_fk
2b470 65 79 22 2c 20 20 20 20 20 20 53 51 4c 49 54 45  ey",      SQLITE
2b480 5f 44 42 43 4f 4e 46 49 47 5f 45 4e 41 42 4c 45  _DBCONFIG_ENABLE
2b490 5f 46 4b 45 59 20 20 20 20 20 20 20 20 20 20 20  _FKEY           
2b4a0 20 7d 2c 0a 20 20 20 20 20 20 20 20 7b 20 22 65   },.        { "e
2b4b0 6e 61 62 6c 65 5f 74 72 69 67 67 65 72 22 2c 20  nable_trigger", 
2b4c0 20 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49    SQLITE_DBCONFI
2b4d0 47 5f 45 4e 41 42 4c 45 5f 54 52 49 47 47 45 52  G_ENABLE_TRIGGER
2b4e0 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
2b4f0 20 20 20 20 7b 20 22 66 74 73 33 5f 74 6f 6b 65      { "fts3_toke
2b500 6e 69 7a 65 72 22 2c 20 20 20 53 51 4c 49 54 45  nizer",   SQLITE
2b510 5f 44 42 43 4f 4e 46 49 47 5f 45 4e 41 42 4c 45  _DBCONFIG_ENABLE
2b520 5f 46 54 53 33 5f 54 4f 4b 45 4e 49 5a 45 52 20  _FTS3_TOKENIZER 
2b530 20 7d 2c 0a 20 20 20 20 20 20 20 20 7b 20 22 6c   },.        { "l
2b540 6f 61 64 5f 65 78 74 65 6e 73 69 6f 6e 22 2c 20  oad_extension", 
2b550 20 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49    SQLITE_DBCONFI
2b560 47 5f 45 4e 41 42 4c 45 5f 4c 4f 41 44 5f 45 58  G_ENABLE_LOAD_EX
2b570 54 45 4e 53 49 4f 4e 20 20 7d 2c 0a 20 20 20 20  TENSION  },.    
2b580 20 20 20 20 7b 20 22 6e 6f 5f 63 6b 70 74 5f 6f      { "no_ckpt_o
2b590 6e 5f 63 6c 6f 73 65 22 2c 20 53 51 4c 49 54 45  n_close", SQLITE
2b5a0 5f 44 42 43 4f 4e 46 49 47 5f 4e 4f 5f 43 4b 50  _DBCONFIG_NO_CKP
2b5b0 54 5f 4f 4e 5f 43 4c 4f 53 45 20 20 20 20 20 20  T_ON_CLOSE      
2b5c0 20 7d 2c 0a 20 20 20 20 20 20 20 20 7b 20 22 65   },.        { "e
2b5d0 6e 61 62 6c 65 5f 71 70 73 67 22 2c 20 20 20 20  nable_qpsg",    
2b5e0 20 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49    SQLITE_DBCONFI
2b5f0 47 5f 45 4e 41 42 4c 45 5f 51 50 53 47 20 20 20  G_ENABLE_QPSG   
2b600 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
2b610 20 20 20 20 7b 20 22 74 72 69 67 67 65 72 5f 65      { "trigger_e
2b620 71 70 22 2c 20 20 20 20 20 20 53 51 4c 49 54 45  qp",      SQLITE
2b630 5f 44 42 43 4f 4e 46 49 47 5f 54 52 49 47 47 45  _DBCONFIG_TRIGGE
2b640 52 5f 45 51 50 20 20 20 20 20 20 20 20 20 20 20  R_EQP           
2b650 20 7d 2c 0a 20 20 20 20 20 20 20 20 7b 20 22 72   },.        { "r
2b660 65 73 65 74 5f 64 61 74 61 62 61 73 65 22 2c 20  eset_database", 
2b670 20 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49    SQLITE_DBCONFI
2b680 47 5f 52 45 53 45 54 5f 44 41 54 41 42 41 53 45  G_RESET_DATABASE
2b690 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
2b6a0 7d 3b 0a 20 20 20 20 69 6e 74 20 69 69 2c 20 76  };.    int ii, v
2b6b0 3b 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28 70 2c  ;.    open_db(p,
2b6c0 20 30 29 3b 0a 20 20 20 20 66 6f 72 28 69 69 3d   0);.    for(ii=
2b6d0 30 3b 20 69 69 3c 41 72 72 61 79 53 69 7a 65 28  0; ii<ArraySize(
2b6e0 61 44 62 43 6f 6e 66 69 67 29 3b 20 69 69 2b 2b  aDbConfig); ii++
2b6f0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 41 72  ){.      if( nAr
2b700 67 3e 31 20 26 26 20 73 74 72 63 6d 70 28 61 7a  g>1 && strcmp(az
2b710 41 72 67 5b 31 5d 2c 20 61 44 62 43 6f 6e 66 69  Arg[1], aDbConfi
2b720 67 5b 69 69 5d 2e 7a 4e 61 6d 65 29 21 3d 30 20  g[ii].zName)!=0 
2b730 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
2b740 20 20 69 66 28 20 6e 41 72 67 3e 3d 33 20 29 7b    if( nArg>=3 ){
2b750 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2b760 5f 64 62 5f 63 6f 6e 66 69 67 28 70 2d 3e 64 62  _db_config(p->db
2b770 2c 20 61 44 62 43 6f 6e 66 69 67 5b 69 69 5d 2e  , aDbConfig[ii].
2b780 6f 70 2c 20 62 6f 6f 6c 65 61 6e 56 61 6c 75 65  op, booleanValue
2b790 28 61 7a 41 72 67 5b 32 5d 29 2c 20 30 29 3b 0a  (azArg[2]), 0);.
2b7a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
2b7b0 6c 69 74 65 33 5f 64 62 5f 63 6f 6e 66 69 67 28  lite3_db_config(
2b7c0 70 2d 3e 64 62 2c 20 61 44 62 43 6f 6e 66 69 67  p->db, aDbConfig
2b7d0 5b 69 69 5d 2e 6f 70 2c 20 2d 31 2c 20 26 76 29  [ii].op, -1, &v)
2b7e0 3b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69  ;.      utf8_pri
2b7f0 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 31 38  ntf(p->out, "%18
2b800 73 20 25 73 5c 6e 22 2c 20 61 44 62 43 6f 6e 66  s %s\n", aDbConf
2b810 69 67 5b 69 69 5d 2e 7a 4e 61 6d 65 2c 20 76 20  ig[ii].zName, v 
2b820 3f 20 22 6f 6e 22 20 3a 20 22 6f 66 66 22 29 3b  ? "on" : "off");
2b830 0a 20 20 20 20 20 20 69 66 28 20 6e 41 72 67 3e  .      if( nArg>
2b840 31 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d  1 ) break;.    }
2b850 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3e 31 20  .    if( nArg>1 
2b860 26 26 20 69 69 3d 3d 41 72 72 61 79 53 69 7a 65  && ii==ArraySize
2b870 28 61 44 62 43 6f 6e 66 69 67 29 20 29 7b 0a 20  (aDbConfig) ){. 
2b880 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
2b890 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a  (stderr, "Error:
2b8a0 20 75 6e 6b 6e 6f 77 6e 20 64 62 63 6f 6e 66 69   unknown dbconfi
2b8b0 67 20 5c 22 25 73 5c 22 5c 6e 22 2c 20 61 7a 41  g \"%s\"\n", azA
2b8c0 72 67 5b 31 5d 29 3b 0a 20 20 20 20 20 20 75 74  rg[1]);.      ut
2b8d0 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  f8_printf(stderr
2b8e0 2c 20 22 45 6e 74 65 72 20 5c 22 2e 64 62 63 6f  , "Enter \".dbco
2b8f0 6e 66 69 67 5c 22 20 77 69 74 68 20 6e 6f 20 61  nfig\" with no a
2b900 72 67 75 6d 65 6e 74 73 20 66 6f 72 20 61 20 6c  rguments for a l
2b910 69 73 74 5c 6e 22 29 3b 0a 20 20 20 20 7d 20 20  ist\n");.    }  
2b920 20 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28   .  }else..  if(
2b930 20 63 3d 3d 27 64 27 20 26 26 20 6e 3e 3d 33 20   c=='d' && n>=3 
2b940 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67  && strncmp(azArg
2b950 5b 30 5d 2c 20 22 64 62 69 6e 66 6f 22 2c 20 6e  [0], "dbinfo", n
2b960 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d  )==0 ){.    rc =
2b970 20 73 68 65 6c 6c 5f 64 62 69 6e 66 6f 5f 63 6f   shell_dbinfo_co
2b980 6d 6d 61 6e 64 28 70 2c 20 6e 41 72 67 2c 20 61  mmand(p, nArg, a
2b990 7a 41 72 67 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a  zArg);.  }else..
2b9a0 20 20 69 66 28 20 63 3d 3d 27 64 27 20 26 26 20    if( c=='d' && 
2b9b0 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d  strncmp(azArg[0]
2b9c0 2c 20 22 64 75 6d 70 22 2c 20 6e 29 3d 3d 30 20  , "dump", n)==0 
2b9d0 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  ){.    const cha
2b9e0 72 20 2a 7a 4c 69 6b 65 20 3d 20 30 3b 0a 20 20  r *zLike = 0;.  
2b9f0 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74    int i;.    int
2ba00 20 73 61 76 65 64 53 68 6f 77 48 65 61 64 65 72   savedShowHeader
2ba10 20 3d 20 70 2d 3e 73 68 6f 77 48 65 61 64 65 72   = p->showHeader
2ba20 3b 0a 20 20 20 20 53 68 65 6c 6c 43 6c 65 61 72  ;.    ShellClear
2ba30 46 6c 61 67 28 70 2c 20 53 48 46 4c 47 5f 50 72  Flag(p, SHFLG_Pr
2ba40 65 73 65 72 76 65 52 6f 77 69 64 7c 53 48 46 4c  eserveRowid|SHFL
2ba50 47 5f 4e 65 77 6c 69 6e 65 73 29 3b 0a 20 20 20  G_Newlines);.   
2ba60 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 41 72 67   for(i=1; i<nArg
2ba70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
2ba80 28 20 61 7a 41 72 67 5b 69 5d 5b 30 5d 3d 3d 27  ( azArg[i][0]=='
2ba90 2d 27 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f  -' ){.        co
2baa0 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 61 7a  nst char *z = az
2bab0 41 72 67 5b 69 5d 2b 31 3b 0a 20 20 20 20 20 20  Arg[i]+1;.      
2bac0 20 20 69 66 28 20 7a 5b 30 5d 3d 3d 27 2d 27 20    if( z[0]=='-' 
2bad0 29 20 7a 2b 2b 3b 0a 20 20 20 20 20 20 20 20 69  ) z++;.        i
2bae0 66 28 20 73 74 72 63 6d 70 28 7a 2c 22 70 72 65  f( strcmp(z,"pre
2baf0 73 65 72 76 65 2d 72 6f 77 69 64 73 22 29 3d 3d  serve-rowids")==
2bb00 30 20 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  0 ){.#ifdef SQLI
2bb10 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
2bb20 41 42 4c 45 0a 20 20 20 20 20 20 20 20 20 20 72  ABLE.          r
2bb30 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  aw_printf(stderr
2bb40 2c 20 22 54 68 65 20 2d 2d 70 72 65 73 65 72 76  , "The --preserv
2bb50 65 2d 72 6f 77 69 64 73 20 6f 70 74 69 6f 6e 20  e-rowids option 
2bb60 69 73 20 6e 6f 74 20 63 6f 6d 70 61 74 69 62 6c  is not compatibl
2bb70 65 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e".             
2bb80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bb90 22 20 77 69 74 68 20 53 51 4c 49 54 45 5f 4f 4d  " with SQLITE_OM
2bba0 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 5c  IT_VIRTUALTABLE\
2bbb0 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  n");.          r
2bbc0 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  c = 1;.         
2bbd0 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61   goto meta_comma
2bbe0 6e 64 5f 65 78 69 74 3b 0a 23 65 6c 73 65 0a 20  nd_exit;.#else. 
2bbf0 20 20 20 20 20 20 20 20 20 53 68 65 6c 6c 53 65           ShellSe
2bc00 74 46 6c 61 67 28 70 2c 20 53 48 46 4c 47 5f 50  tFlag(p, SHFLG_P
2bc10 72 65 73 65 72 76 65 52 6f 77 69 64 29 3b 0a 23  reserveRowid);.#
2bc20 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 7d 65  endif.        }e
2bc30 6c 73 65 0a 20 20 20 20 20 20 20 20 69 66 28 20  lse.        if( 
2bc40 73 74 72 63 6d 70 28 7a 2c 22 6e 65 77 6c 69 6e  strcmp(z,"newlin
2bc50 65 73 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  es")==0 ){.     
2bc60 20 20 20 20 20 53 68 65 6c 6c 53 65 74 46 6c 61       ShellSetFla
2bc70 67 28 70 2c 20 53 48 46 4c 47 5f 4e 65 77 6c 69  g(p, SHFLG_Newli
2bc80 6e 65 73 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  nes);.        }e
2bc90 6c 73 65 0a 20 20 20 20 20 20 20 20 7b 0a 20 20  lse.        {.  
2bca0 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e          raw_prin
2bcb0 74 66 28 73 74 64 65 72 72 2c 20 22 55 6e 6b 6e  tf(stderr, "Unkn
2bcc0 6f 77 6e 20 6f 70 74 69 6f 6e 20 5c 22 25 73 5c  own option \"%s\
2bcd0 22 20 6f 6e 20 5c 22 2e 64 75 6d 70 5c 22 5c 6e  " on \".dump\"\n
2bce0 22 2c 20 61 7a 41 72 67 5b 69 5d 29 3b 0a 20 20  ", azArg[i]);.  
2bcf0 20 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a          rc = 1;.
2bd00 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d            goto m
2bd10 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74  eta_command_exit
2bd20 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2bd30 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 4c 69 6b    }else if( zLik
2bd40 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72 61 77  e ){.        raw
2bd50 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
2bd60 22 55 73 61 67 65 3a 20 2e 64 75 6d 70 20 3f 2d  "Usage: .dump ?-
2bd70 2d 70 72 65 73 65 72 76 65 2d 72 6f 77 69 64 73  -preserve-rowids
2bd80 3f 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  ? ".            
2bd90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
2bda0 3f 2d 2d 6e 65 77 6c 69 6e 65 73 3f 20 3f 4c 49  ?--newlines? ?LI
2bdb0 4b 45 2d 50 41 54 54 45 52 4e 3f 5c 6e 22 29 3b  KE-PATTERN?\n");
2bdc0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b  .        rc = 1;
2bdd0 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 65  .        goto me
2bde0 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b  ta_command_exit;
2bdf0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
2be00 20 20 20 20 20 20 7a 4c 69 6b 65 20 3d 20 61 7a        zLike = az
2be10 41 72 67 5b 69 5d 3b 0a 20 20 20 20 20 20 7d 0a  Arg[i];.      }.
2be20 20 20 20 20 7d 0a 20 20 20 20 6f 70 65 6e 5f 64      }.    open_d
2be30 62 28 70 2c 20 30 29 3b 0a 20 20 20 20 2f 2a 20  b(p, 0);.    /* 
2be40 57 68 65 6e 20 70 6c 61 79 69 6e 67 20 62 61 63  When playing bac
2be50 6b 20 61 20 22 64 75 6d 70 22 2c 20 74 68 65 20  k a "dump", the 
2be60 63 6f 6e 74 65 6e 74 20 6d 69 67 68 74 20 61 70  content might ap
2be70 70 65 61 72 20 69 6e 20 61 6e 20 6f 72 64 65 72  pear in an order
2be80 0a 20 20 20 20 2a 2a 20 77 68 69 63 68 20 63 61  .    ** which ca
2be90 75 73 65 73 20 69 6d 6d 65 64 69 61 74 65 20 66  uses immediate f
2bea0 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74  oreign key const
2beb0 72 61 69 6e 74 73 20 74 6f 20 62 65 20 76 69 6f  raints to be vio
2bec0 6c 61 74 65 64 2e 0a 20 20 20 20 2a 2a 20 53 6f  lated..    ** So
2bed0 20 64 69 73 61 62 6c 65 20 66 6f 72 65 69 67 6e   disable foreign
2bee0 2d 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 20  -key constraint 
2bef0 65 6e 66 6f 72 63 65 6d 65 6e 74 20 74 6f 20 70  enforcement to p
2bf00 72 65 76 65 6e 74 20 70 72 6f 62 6c 65 6d 73 2e  revent problems.
2bf10 20 2a 2f 0a 20 20 20 20 72 61 77 5f 70 72 69 6e   */.    raw_prin
2bf20 74 66 28 70 2d 3e 6f 75 74 2c 20 22 50 52 41 47  tf(p->out, "PRAG
2bf30 4d 41 20 66 6f 72 65 69 67 6e 5f 6b 65 79 73 3d  MA foreign_keys=
2bf40 4f 46 46 3b 5c 6e 22 29 3b 0a 20 20 20 20 72 61  OFF;\n");.    ra
2bf50 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  w_printf(p->out,
2bf60 20 22 42 45 47 49 4e 20 54 52 41 4e 53 41 43 54   "BEGIN TRANSACT
2bf70 49 4f 4e 3b 5c 6e 22 29 3b 0a 20 20 20 20 70 2d  ION;\n");.    p-
2bf80 3e 77 72 69 74 61 62 6c 65 53 63 68 65 6d 61 20  >writableSchema 
2bf90 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 73 68 6f 77  = 0;.    p->show
2bfa0 48 65 61 64 65 72 20 3d 20 30 3b 0a 20 20 20 20  Header = 0;.    
2bfb0 2f 2a 20 53 65 74 20 77 72 69 74 61 62 6c 65 5f  /* Set writable_
2bfc0 73 63 68 65 6d 61 3d 4f 4e 20 73 69 6e 63 65 20  schema=ON since 
2bfd0 64 6f 69 6e 67 20 73 6f 20 66 6f 72 63 65 73 20  doing so forces 
2bfe0 53 51 4c 69 74 65 20 74 6f 20 69 6e 69 74 69 61  SQLite to initia
2bff0 6c 69 7a 65 0a 20 20 20 20 2a 2a 20 61 73 20 6d  lize.    ** as m
2c000 75 63 68 20 6f 66 20 74 68 65 20 73 63 68 65 6d  uch of the schem
2c010 61 20 61 73 20 69 74 20 63 61 6e 20 65 76 65 6e  a as it can even
2c020 20 69 66 20 74 68 65 20 73 71 6c 69 74 65 5f 6d   if the sqlite_m
2c030 61 73 74 65 72 20 74 61 62 6c 65 20 69 73 0a 20  aster table is. 
2c040 20 20 20 2a 2a 20 63 6f 72 72 75 70 74 2e 20 2a     ** corrupt. *
2c050 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 65 78  /.    sqlite3_ex
2c060 65 63 28 70 2d 3e 64 62 2c 20 22 53 41 56 45 50  ec(p->db, "SAVEP
2c070 4f 49 4e 54 20 64 75 6d 70 3b 20 50 52 41 47 4d  OINT dump; PRAGM
2c080 41 20 77 72 69 74 61 62 6c 65 5f 73 63 68 65 6d  A writable_schem
2c090 61 3d 4f 4e 22 2c 20 30 2c 20 30 2c 20 30 29 3b  a=ON", 0, 0, 0);
2c0a0 0a 20 20 20 20 70 2d 3e 6e 45 72 72 20 3d 20 30  .    p->nErr = 0
2c0b0 3b 0a 20 20 20 20 69 66 28 20 7a 4c 69 6b 65 3d  ;.    if( zLike=
2c0c0 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 75 6e 5f  =0 ){.      run_
2c0d0 73 63 68 65 6d 61 5f 64 75 6d 70 5f 71 75 65 72  schema_dump_quer
2c0e0 79 28 70 2c 0a 20 20 20 20 20 20 20 20 22 53 45  y(p,.        "SE
2c0f0 4c 45 43 54 20 6e 61 6d 65 2c 20 74 79 70 65 2c  LECT name, type,
2c100 20 73 71 6c 20 46 52 4f 4d 20 73 71 6c 69 74 65   sql FROM sqlite
2c110 5f 6d 61 73 74 65 72 20 22 0a 20 20 20 20 20 20  _master ".      
2c120 20 20 22 57 48 45 52 45 20 73 71 6c 20 4e 4f 54    "WHERE sql NOT
2c130 20 4e 55 4c 4c 20 41 4e 44 20 74 79 70 65 3d 3d   NULL AND type==
2c140 27 74 61 62 6c 65 27 20 41 4e 44 20 6e 61 6d 65  'table' AND name
2c150 21 3d 27 73 71 6c 69 74 65 5f 73 65 71 75 65 6e  !='sqlite_sequen
2c160 63 65 27 22 0a 20 20 20 20 20 20 29 3b 0a 20 20  ce'".      );.  
2c170 20 20 20 20 72 75 6e 5f 73 63 68 65 6d 61 5f 64      run_schema_d
2c180 75 6d 70 5f 71 75 65 72 79 28 70 2c 0a 20 20 20  ump_query(p,.   
2c190 20 20 20 20 20 22 53 45 4c 45 43 54 20 6e 61 6d       "SELECT nam
2c1a0 65 2c 20 74 79 70 65 2c 20 73 71 6c 20 46 52 4f  e, type, sql FRO
2c1b0 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  M sqlite_master 
2c1c0 22 0a 20 20 20 20 20 20 20 20 22 57 48 45 52 45  ".        "WHERE
2c1d0 20 6e 61 6d 65 3d 3d 27 73 71 6c 69 74 65 5f 73   name=='sqlite_s
2c1e0 65 71 75 65 6e 63 65 27 22 0a 20 20 20 20 20 20  equence'".      
2c1f0 29 3b 0a 20 20 20 20 20 20 72 75 6e 5f 74 61 62  );.      run_tab
2c200 6c 65 5f 64 75 6d 70 5f 71 75 65 72 79 28 70 2c  le_dump_query(p,
2c210 0a 20 20 20 20 20 20 20 20 22 53 45 4c 45 43 54  .        "SELECT
2c220 20 73 71 6c 20 46 52 4f 4d 20 73 71 6c 69 74 65   sql FROM sqlite
2c230 5f 6d 61 73 74 65 72 20 22 0a 20 20 20 20 20 20  _master ".      
2c240 20 20 22 57 48 45 52 45 20 73 71 6c 20 4e 4f 54    "WHERE sql NOT
2c250 20 4e 55 4c 4c 20 41 4e 44 20 74 79 70 65 20 49   NULL AND type I
2c260 4e 20 28 27 69 6e 64 65 78 27 2c 27 74 72 69 67  N ('index','trig
2c270 67 65 72 27 2c 27 76 69 65 77 27 29 22 2c 20 30  ger','view')", 0
2c280 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 65  .      );.    }e
2c290 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 61 72 20  lse{.      char 
2c2a0 2a 7a 53 71 6c 3b 0a 20 20 20 20 20 20 7a 53 71  *zSql;.      zSq
2c2b0 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  l = sqlite3_mpri
2c2c0 6e 74 66 28 0a 20 20 20 20 20 20 20 20 22 53 45  ntf(.        "SE
2c2d0 4c 45 43 54 20 6e 61 6d 65 2c 20 74 79 70 65 2c  LECT name, type,
2c2e0 20 73 71 6c 20 46 52 4f 4d 20 73 71 6c 69 74 65   sql FROM sqlite
2c2f0 5f 6d 61 73 74 65 72 20 22 0a 20 20 20 20 20 20  _master ".      
2c300 20 20 22 57 48 45 52 45 20 74 62 6c 5f 6e 61 6d    "WHERE tbl_nam
2c310 65 20 4c 49 4b 45 20 25 51 20 41 4e 44 20 74 79  e LIKE %Q AND ty
2c320 70 65 3d 3d 27 74 61 62 6c 65 27 22 0a 20 20 20  pe=='table'".   
2c330 20 20 20 20 20 22 20 20 41 4e 44 20 73 71 6c 20       "  AND sql 
2c340 4e 4f 54 20 4e 55 4c 4c 22 2c 20 7a 4c 69 6b 65  NOT NULL", zLike
2c350 29 3b 0a 20 20 20 20 20 20 72 75 6e 5f 73 63 68  );.      run_sch
2c360 65 6d 61 5f 64 75 6d 70 5f 71 75 65 72 79 28 70  ema_dump_query(p
2c370 2c 7a 53 71 6c 29 3b 0a 20 20 20 20 20 20 73 71  ,zSql);.      sq
2c380 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29  lite3_free(zSql)
2c390 3b 0a 20 20 20 20 20 20 7a 53 71 6c 20 3d 20 73  ;.      zSql = s
2c3a0 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a  qlite3_mprintf(.
2c3b0 20 20 20 20 20 20 20 20 22 53 45 4c 45 43 54 20          "SELECT 
2c3c0 73 71 6c 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f  sql FROM sqlite_
2c3d0 6d 61 73 74 65 72 20 22 0a 20 20 20 20 20 20 20  master ".       
2c3e0 20 22 57 48 45 52 45 20 73 71 6c 20 4e 4f 54 20   "WHERE sql NOT 
2c3f0 4e 55 4c 4c 22 0a 20 20 20 20 20 20 20 20 22 20  NULL".        " 
2c400 20 41 4e 44 20 74 79 70 65 20 49 4e 20 28 27 69   AND type IN ('i
2c410 6e 64 65 78 27 2c 27 74 72 69 67 67 65 72 27 2c  ndex','trigger',
2c420 27 76 69 65 77 27 29 22 0a 20 20 20 20 20 20 20  'view')".       
2c430 20 22 20 20 41 4e 44 20 74 62 6c 5f 6e 61 6d 65   "  AND tbl_name
2c440 20 4c 49 4b 45 20 25 51 22 2c 20 7a 4c 69 6b 65   LIKE %Q", zLike
2c450 29 3b 0a 20 20 20 20 20 20 72 75 6e 5f 74 61 62  );.      run_tab
2c460 6c 65 5f 64 75 6d 70 5f 71 75 65 72 79 28 70 2c  le_dump_query(p,
2c470 20 7a 53 71 6c 2c 20 30 29 3b 0a 20 20 20 20 20   zSql, 0);.     
2c480 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53   sqlite3_free(zS
2c490 71 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ql);.    }.    i
2c4a0 66 28 20 70 2d 3e 77 72 69 74 61 62 6c 65 53 63  f( p->writableSc
2c4b0 68 65 6d 61 20 29 7b 0a 20 20 20 20 20 20 72 61  hema ){.      ra
2c4c0 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  w_printf(p->out,
2c4d0 20 22 50 52 41 47 4d 41 20 77 72 69 74 61 62 6c   "PRAGMA writabl
2c4e0 65 5f 73 63 68 65 6d 61 3d 4f 46 46 3b 5c 6e 22  e_schema=OFF;\n"
2c4f0 29 3b 0a 20 20 20 20 20 20 70 2d 3e 77 72 69 74  );.      p->writ
2c500 61 62 6c 65 53 63 68 65 6d 61 20 3d 20 30 3b 0a  ableSchema = 0;.
2c510 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
2c520 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20 22 50  3_exec(p->db, "P
2c530 52 41 47 4d 41 20 77 72 69 74 61 62 6c 65 5f 73  RAGMA writable_s
2c540 63 68 65 6d 61 3d 4f 46 46 3b 22 2c 20 30 2c 20  chema=OFF;", 0, 
2c550 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  0, 0);.    sqlit
2c560 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20 22  e3_exec(p->db, "
2c570 52 45 4c 45 41 53 45 20 64 75 6d 70 3b 22 2c 20  RELEASE dump;", 
2c580 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 72 61  0, 0, 0);.    ra
2c590 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  w_printf(p->out,
2c5a0 20 70 2d 3e 6e 45 72 72 20 3f 20 22 52 4f 4c 4c   p->nErr ? "ROLL
2c5b0 42 41 43 4b 3b 20 2d 2d 20 64 75 65 20 74 6f 20  BACK; -- due to 
2c5c0 65 72 72 6f 72 73 5c 6e 22 20 3a 20 22 43 4f 4d  errors\n" : "COM
2c5d0 4d 49 54 3b 5c 6e 22 29 3b 0a 20 20 20 20 70 2d  MIT;\n");.    p-
2c5e0 3e 73 68 6f 77 48 65 61 64 65 72 20 3d 20 73 61  >showHeader = sa
2c5f0 76 65 64 53 68 6f 77 48 65 61 64 65 72 3b 0a 20  vedShowHeader;. 
2c600 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d   }else..  if( c=
2c610 3d 27 65 27 20 26 26 20 73 74 72 6e 63 6d 70 28  ='e' && strncmp(
2c620 61 7a 41 72 67 5b 30 5d 2c 20 22 65 63 68 6f 22  azArg[0], "echo"
2c630 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69  , n)==0 ){.    i
2c640 66 28 20 6e 41 72 67 3d 3d 32 20 29 7b 0a 20 20  f( nArg==2 ){.  
2c650 20 20 20 20 73 65 74 4f 72 43 6c 65 61 72 46 6c      setOrClearFl
2c660 61 67 28 70 2c 20 53 48 46 4c 47 5f 45 63 68 6f  ag(p, SHFLG_Echo
2c670 2c 20 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20  , azArg[1]);.   
2c680 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 61   }else{.      ra
2c690 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  w_printf(stderr,
2c6a0 20 22 55 73 61 67 65 3a 20 2e 65 63 68 6f 20 6f   "Usage: .echo o
2c6b0 6e 7c 6f 66 66 5c 6e 22 29 3b 0a 20 20 20 20 20  n|off\n");.     
2c6c0 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20   rc = 1;.    }. 
2c6d0 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d   }else..  if( c=
2c6e0 3d 27 65 27 20 26 26 20 73 74 72 6e 63 6d 70 28  ='e' && strncmp(
2c6f0 61 7a 41 72 67 5b 30 5d 2c 20 22 65 71 70 22 2c  azArg[0], "eqp",
2c700 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66   n)==0 ){.    if
2c710 28 20 6e 41 72 67 3d 3d 32 20 29 7b 0a 20 20 20  ( nArg==2 ){.   
2c720 20 20 20 70 2d 3e 61 75 74 6f 45 51 50 74 65 73     p->autoEQPtes
2c730 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28  t = 0;.      if(
2c740 20 73 74 72 63 6d 70 28 61 7a 41 72 67 5b 31 5d   strcmp(azArg[1]
2c750 2c 22 66 75 6c 6c 22 29 3d 3d 30 20 29 7b 0a 20  ,"full")==0 ){. 
2c760 20 20 20 20 20 20 20 70 2d 3e 61 75 74 6f 45 51         p->autoEQ
2c770 50 20 3d 20 41 55 54 4f 45 51 50 5f 66 75 6c 6c  P = AUTOEQP_full
2c780 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
2c790 28 20 73 74 72 63 6d 70 28 61 7a 41 72 67 5b 31  ( strcmp(azArg[1
2c7a0 5d 2c 22 74 72 69 67 67 65 72 22 29 3d 3d 30 20  ],"trigger")==0 
2c7b0 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 75  ){.        p->au
2c7c0 74 6f 45 51 50 20 3d 20 41 55 54 4f 45 51 50 5f  toEQP = AUTOEQP_
2c7d0 74 72 69 67 67 65 72 3b 0a 20 20 20 20 20 20 7d  trigger;.      }
2c7e0 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
2c7f0 61 7a 41 72 67 5b 31 5d 2c 22 74 65 73 74 22 29  azArg[1],"test")
2c800 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ==0 ){.        p
2c810 2d 3e 61 75 74 6f 45 51 50 20 3d 20 41 55 54 4f  ->autoEQP = AUTO
2c820 45 51 50 5f 6f 6e 3b 0a 20 20 20 20 20 20 20 20  EQP_on;.        
2c830 70 2d 3e 61 75 74 6f 45 51 50 74 65 73 74 20 3d  p->autoEQPtest =
2c840 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   1;.      }else{
2c850 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 75 74 6f  .        p->auto
2c860 45 51 50 20 3d 20 28 75 38 29 62 6f 6f 6c 65 61  EQP = (u8)boolea
2c870 6e 56 61 6c 75 65 28 61 7a 41 72 67 5b 31 5d 29  nValue(azArg[1])
2c880 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
2c890 6c 73 65 7b 0a 20 20 20 20 20 20 72 61 77 5f 70  lse{.      raw_p
2c8a0 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55  rintf(stderr, "U
2c8b0 73 61 67 65 3a 20 2e 65 71 70 20 6f 66 66 7c 6f  sage: .eqp off|o
2c8c0 6e 7c 74 72 69 67 67 65 72 7c 66 75 6c 6c 5c 6e  n|trigger|full\n
2c8d0 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31  ");.      rc = 1
2c8e0 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a  ;.    }.  }else.
2c8f0 0a 20 20 69 66 28 20 63 3d 3d 27 65 27 20 26 26  .  if( c=='e' &&
2c900 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30   strncmp(azArg[0
2c910 5d 2c 20 22 65 78 69 74 22 2c 20 6e 29 3d 3d 30  ], "exit", n)==0
2c920 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 41 72 67   ){.    if( nArg
2c930 3e 31 20 26 26 20 28 72 63 20 3d 20 28 69 6e 74  >1 && (rc = (int
2c940 29 69 6e 74 65 67 65 72 56 61 6c 75 65 28 61 7a  )integerValue(az
2c950 41 72 67 5b 31 5d 29 29 21 3d 30 20 29 20 65 78  Arg[1]))!=0 ) ex
2c960 69 74 28 72 63 29 3b 0a 20 20 20 20 72 63 20 3d  it(rc);.    rc =
2c970 20 32 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 2f   2;.  }else..  /
2c980 2a 20 54 68 65 20 22 2e 65 78 70 6c 61 69 6e 22  * The ".explain"
2c990 20 63 6f 6d 6d 61 6e 64 20 69 73 20 61 75 74 6f   command is auto
2c9a0 6d 61 74 69 63 20 6e 6f 77 2e 20 20 49 74 20 69  matic now.  It i
2c9b0 73 20 6c 61 72 67 65 6c 79 20 70 6f 69 6e 74 6c  s largely pointl
2c9c0 65 73 73 2e 20 20 49 74 0a 20 20 2a 2a 20 72 65  ess.  It.  ** re
2c9d0 74 61 69 6e 65 64 20 70 75 72 65 6c 79 20 66 6f  tained purely fo
2c9e0 72 20 62 61 63 6b 77 61 72 64 73 20 63 6f 6d 70  r backwards comp
2c9f0 61 74 69 62 69 6c 69 74 79 20 2a 2f 0a 20 20 69  atibility */.  i
2ca00 66 28 20 63 3d 3d 27 65 27 20 26 26 20 73 74 72  f( c=='e' && str
2ca10 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22  ncmp(azArg[0], "
2ca20 65 78 70 6c 61 69 6e 22 2c 20 6e 29 3d 3d 30 20  explain", n)==0 
2ca30 29 7b 0a 20 20 20 20 69 6e 74 20 76 61 6c 20 3d  ){.    int val =
2ca40 20 31 3b 0a 20 20 20 20 69 66 28 20 6e 41 72 67   1;.    if( nArg
2ca50 3e 3d 32 20 29 7b 0a 20 20 20 20 20 20 69 66 28  >=2 ){.      if(
2ca60 20 73 74 72 63 6d 70 28 61 7a 41 72 67 5b 31 5d   strcmp(azArg[1]
2ca70 2c 22 61 75 74 6f 22 29 3d 3d 30 20 29 7b 0a 20  ,"auto")==0 ){. 
2ca80 20 20 20 20 20 20 20 76 61 6c 20 3d 20 39 39 3b         val = 99;
2ca90 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
2caa0 20 20 20 20 20 20 76 61 6c 20 3d 20 20 62 6f 6f        val =  boo
2cab0 6c 65 61 6e 56 61 6c 75 65 28 61 7a 41 72 67 5b  leanValue(azArg[
2cac0 31 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  1]);.      }.   
2cad0 20 7d 0a 20 20 20 20 69 66 28 20 76 61 6c 3d 3d   }.    if( val==
2cae0 31 20 26 26 20 70 2d 3e 6d 6f 64 65 21 3d 4d 4f  1 && p->mode!=MO
2caf0 44 45 5f 45 78 70 6c 61 69 6e 20 29 7b 0a 20 20  DE_Explain ){.  
2cb00 20 20 20 20 70 2d 3e 6e 6f 72 6d 61 6c 4d 6f 64      p->normalMod
2cb10 65 20 3d 20 70 2d 3e 6d 6f 64 65 3b 0a 20 20 20  e = p->mode;.   
2cb20 20 20 20 70 2d 3e 6d 6f 64 65 20 3d 20 4d 4f 44     p->mode = MOD
2cb30 45 5f 45 78 70 6c 61 69 6e 3b 0a 20 20 20 20 20  E_Explain;.     
2cb40 20 70 2d 3e 61 75 74 6f 45 78 70 6c 61 69 6e 20   p->autoExplain 
2cb50 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  = 0;.    }else i
2cb60 66 28 20 76 61 6c 3d 3d 30 20 29 7b 0a 20 20 20  f( val==0 ){.   
2cb70 20 20 20 69 66 28 20 70 2d 3e 6d 6f 64 65 3d 3d     if( p->mode==
2cb80 4d 4f 44 45 5f 45 78 70 6c 61 69 6e 20 29 20 70  MODE_Explain ) p
2cb90 2d 3e 6d 6f 64 65 20 3d 20 70 2d 3e 6e 6f 72 6d  ->mode = p->norm
2cba0 61 6c 4d 6f 64 65 3b 0a 20 20 20 20 20 20 70 2d  alMode;.      p-
2cbb0 3e 61 75 74 6f 45 78 70 6c 61 69 6e 20 3d 20 30  >autoExplain = 0
2cbc0 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
2cbd0 76 61 6c 3d 3d 39 39 20 29 7b 0a 20 20 20 20 20  val==99 ){.     
2cbe0 20 69 66 28 20 70 2d 3e 6d 6f 64 65 3d 3d 4d 4f   if( p->mode==MO
2cbf0 44 45 5f 45 78 70 6c 61 69 6e 20 29 20 70 2d 3e  DE_Explain ) p->
2cc00 6d 6f 64 65 20 3d 20 70 2d 3e 6e 6f 72 6d 61 6c  mode = p->normal
2cc10 4d 6f 64 65 3b 0a 20 20 20 20 20 20 70 2d 3e 61  Mode;.      p->a
2cc20 75 74 6f 45 78 70 6c 61 69 6e 20 3d 20 31 3b 0a  utoExplain = 1;.
2cc30 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 23      }.  }else..#
2cc40 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
2cc50 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
2cc60 20 20 69 66 28 20 63 3d 3d 27 65 27 20 26 26 20    if( c=='e' && 
2cc70 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d  strncmp(azArg[0]
2cc80 2c 20 22 65 78 70 65 72 74 22 2c 20 6e 29 3d 3d  , "expert", n)==
2cc90 30 20 29 7b 0a 20 20 20 20 6f 70 65 6e 5f 64 62  0 ){.    open_db
2cca0 28 70 2c 20 30 29 3b 0a 20 20 20 20 65 78 70 65  (p, 0);.    expe
2ccb0 72 74 44 6f 74 43 6f 6d 6d 61 6e 64 28 70 2c 20  rtDotCommand(p, 
2ccc0 61 7a 41 72 67 2c 20 6e 41 72 67 29 3b 0a 20 20  azArg, nArg);.  
2ccd0 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 0a 20 20  }else.#endif..  
2cce0 69 66 28 20 63 3d 3d 27 66 27 20 26 26 20 73 74  if( c=='f' && st
2ccf0 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20  rncmp(azArg[0], 
2cd00 22 66 75 6c 6c 73 63 68 65 6d 61 22 2c 20 6e 29  "fullschema", n)
2cd10 3d 3d 30 20 29 7b 0a 20 20 20 20 53 68 65 6c 6c  ==0 ){.    Shell
2cd20 53 74 61 74 65 20 64 61 74 61 3b 0a 20 20 20 20  State data;.    
2cd30 63 68 61 72 20 2a 7a 45 72 72 4d 73 67 20 3d 20  char *zErrMsg = 
2cd40 30 3b 0a 20 20 20 20 69 6e 74 20 64 6f 53 74 61  0;.    int doSta
2cd50 74 73 20 3d 20 30 3b 0a 20 20 20 20 6d 65 6d 63  ts = 0;.    memc
2cd60 70 79 28 26 64 61 74 61 2c 20 70 2c 20 73 69 7a  py(&data, p, siz
2cd70 65 6f 66 28 64 61 74 61 29 29 3b 0a 20 20 20 20  eof(data));.    
2cd80 64 61 74 61 2e 73 68 6f 77 48 65 61 64 65 72 20  data.showHeader 
2cd90 3d 20 30 3b 0a 20 20 20 20 64 61 74 61 2e 63 4d  = 0;.    data.cM
2cda0 6f 64 65 20 3d 20 64 61 74 61 2e 6d 6f 64 65 20  ode = data.mode 
2cdb0 3d 20 4d 4f 44 45 5f 53 65 6d 69 3b 0a 20 20 20  = MODE_Semi;.   
2cdc0 20 69 66 28 20 6e 41 72 67 3d 3d 32 20 26 26 20   if( nArg==2 && 
2cdd0 6f 70 74 69 6f 6e 4d 61 74 63 68 28 61 7a 41 72  optionMatch(azAr
2cde0 67 5b 31 5d 2c 20 22 69 6e 64 65 6e 74 22 29 20  g[1], "indent") 
2cdf0 29 7b 0a 20 20 20 20 20 20 64 61 74 61 2e 63 4d  ){.      data.cM
2ce00 6f 64 65 20 3d 20 64 61 74 61 2e 6d 6f 64 65 20  ode = data.mode 
2ce10 3d 20 4d 4f 44 45 5f 50 72 65 74 74 79 3b 0a 20  = MODE_Pretty;. 
2ce20 20 20 20 20 20 6e 41 72 67 20 3d 20 31 3b 0a 20       nArg = 1;. 
2ce30 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 41 72     }.    if( nAr
2ce40 67 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 72 61  g!=1 ){.      ra
2ce50 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  w_printf(stderr,
2ce60 20 22 55 73 61 67 65 3a 20 2e 66 75 6c 6c 73 63   "Usage: .fullsc
2ce70 68 65 6d 61 20 3f 2d 2d 69 6e 64 65 6e 74 3f 5c  hema ?--indent?\
2ce80 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  n");.      rc = 
2ce90 31 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 65  1;.      goto me
2cea0 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b  ta_command_exit;
2ceb0 0a 20 20 20 20 7d 0a 20 20 20 20 6f 70 65 6e 5f  .    }.    open_
2cec0 64 62 28 70 2c 20 30 29 3b 0a 20 20 20 20 72 63  db(p, 0);.    rc
2ced0 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28   = sqlite3_exec(
2cee0 70 2d 3e 64 62 2c 0a 20 20 20 20 20 20 20 22 53  p->db,.       "S
2cef0 45 4c 45 43 54 20 73 71 6c 20 46 52 4f 4d 22 0a  ELECT sql FROM".
2cf00 20 20 20 20 20 20 20 22 20 20 28 53 45 4c 45 43         "  (SELEC
2cf10 54 20 73 71 6c 20 73 71 6c 2c 20 74 79 70 65 20  T sql sql, type 
2cf20 74 79 70 65 2c 20 74 62 6c 5f 6e 61 6d 65 20 74  type, tbl_name t
2cf30 62 6c 5f 6e 61 6d 65 2c 20 6e 61 6d 65 20 6e 61  bl_name, name na
2cf40 6d 65 2c 20 72 6f 77 69 64 20 78 22 0a 20 20 20  me, rowid x".   
2cf50 20 20 20 20 22 20 20 20 20 20 46 52 4f 4d 20 73      "     FROM s
2cf60 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 55 4e 49  qlite_master UNI
2cf70 4f 4e 20 41 4c 4c 22 0a 20 20 20 20 20 20 20 22  ON ALL".       "
2cf80 20 20 20 53 45 4c 45 43 54 20 73 71 6c 2c 20 74     SELECT sql, t
2cf90 79 70 65 2c 20 74 62 6c 5f 6e 61 6d 65 2c 20 6e  ype, tbl_name, n
2cfa0 61 6d 65 2c 20 72 6f 77 69 64 20 46 52 4f 4d 20  ame, rowid FROM 
2cfb0 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74  sqlite_temp_mast
2cfc0 65 72 29 20 22 0a 20 20 20 20 20 20 20 22 57 48  er) ".       "WH
2cfd0 45 52 45 20 74 79 70 65 21 3d 27 6d 65 74 61 27  ERE type!='meta'
2cfe0 20 41 4e 44 20 73 71 6c 20 4e 4f 54 4e 55 4c 4c   AND sql NOTNULL
2cff0 20 41 4e 44 20 6e 61 6d 65 20 4e 4f 54 20 4c 49   AND name NOT LI
2d000 4b 45 20 27 73 71 6c 69 74 65 5f 25 27 20 22 0a  KE 'sqlite_%' ".
2d010 20 20 20 20 20 20 20 22 4f 52 44 45 52 20 42 59         "ORDER BY
2d020 20 72 6f 77 69 64 22 2c 0a 20 20 20 20 20 20 20   rowid",.       
2d030 63 61 6c 6c 62 61 63 6b 2c 20 26 64 61 74 61 2c  callback, &data,
2d040 20 26 7a 45 72 72 4d 73 67 0a 20 20 20 20 29 3b   &zErrMsg.    );
2d050 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
2d060 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2d070 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
2d080 74 6d 74 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  tmt;.      rc = 
2d090 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f  sqlite3_prepare_
2d0a0 76 32 28 70 2d 3e 64 62 2c 0a 20 20 20 20 20 20  v2(p->db,.      
2d0b0 20 20 20 20 20 20 20 20 20 22 53 45 4c 45 43 54           "SELECT
2d0c0 20 72 6f 77 69 64 20 46 52 4f 4d 20 73 71 6c 69   rowid FROM sqli
2d0d0 74 65 5f 6d 61 73 74 65 72 22 0a 20 20 20 20 20  te_master".     
2d0e0 20 20 20 20 20 20 20 20 20 20 22 20 57 48 45 52            " WHER
2d0f0 45 20 6e 61 6d 65 20 47 4c 4f 42 20 27 73 71 6c  E name GLOB 'sql
2d100 69 74 65 5f 73 74 61 74 5b 31 33 34 5d 27 22 2c  ite_stat[134]'",
2d110 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2d120 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a  -1, &pStmt, 0);.
2d130 20 20 20 20 20 20 64 6f 53 74 61 74 73 20 3d 20        doStats = 
2d140 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74  sqlite3_step(pSt
2d150 6d 74 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 3b  mt)==SQLITE_ROW;
2d160 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
2d170 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a  inalize(pStmt);.
2d180 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 64 6f      }.    if( do
2d190 53 74 61 74 73 3d 3d 30 20 29 7b 0a 20 20 20 20  Stats==0 ){.    
2d1a0 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e    raw_printf(p->
2d1b0 6f 75 74 2c 20 22 2f 2a 20 4e 6f 20 53 54 41 54  out, "/* No STAT
2d1c0 20 74 61 62 6c 65 73 20 61 76 61 69 6c 61 62 6c   tables availabl
2d1d0 65 20 2a 2f 5c 6e 22 29 3b 0a 20 20 20 20 7d 65  e */\n");.    }e
2d1e0 6c 73 65 7b 0a 20 20 20 20 20 20 72 61 77 5f 70  lse{.      raw_p
2d1f0 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 41  rintf(p->out, "A
2d200 4e 41 4c 59 5a 45 20 73 71 6c 69 74 65 5f 6d 61  NALYZE sqlite_ma
2d210 73 74 65 72 3b 5c 6e 22 29 3b 0a 20 20 20 20 20  ster;\n");.     
2d220 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d   sqlite3_exec(p-
2d230 3e 64 62 2c 20 22 53 45 4c 45 43 54 20 27 41 4e  >db, "SELECT 'AN
2d240 41 4c 59 5a 45 20 73 71 6c 69 74 65 5f 6d 61 73  ALYZE sqlite_mas
2d250 74 65 72 27 22 2c 0a 20 20 20 20 20 20 20 20 20  ter'",.         
2d260 20 20 20 20 20 20 20 20 20 20 63 61 6c 6c 62 61            callba
2d270 63 6b 2c 20 26 64 61 74 61 2c 20 26 7a 45 72 72  ck, &data, &zErr
2d280 4d 73 67 29 3b 0a 20 20 20 20 20 20 64 61 74 61  Msg);.      data
2d290 2e 63 4d 6f 64 65 20 3d 20 64 61 74 61 2e 6d 6f  .cMode = data.mo
2d2a0 64 65 20 3d 20 4d 4f 44 45 5f 49 6e 73 65 72 74  de = MODE_Insert
2d2b0 3b 0a 20 20 20 20 20 20 64 61 74 61 2e 7a 44 65  ;.      data.zDe
2d2c0 73 74 54 61 62 6c 65 20 3d 20 22 73 71 6c 69 74  stTable = "sqlit
2d2d0 65 5f 73 74 61 74 31 22 3b 0a 20 20 20 20 20 20  e_stat1";.      
2d2e0 73 68 65 6c 6c 5f 65 78 65 63 28 26 64 61 74 61  shell_exec(&data
2d2f0 2c 20 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  , "SELECT * FROM
2d300 20 73 71 6c 69 74 65 5f 73 74 61 74 31 22 2c 20   sqlite_stat1", 
2d310 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20  &zErrMsg);.     
2d320 20 64 61 74 61 2e 7a 44 65 73 74 54 61 62 6c 65   data.zDestTable
2d330 20 3d 20 22 73 71 6c 69 74 65 5f 73 74 61 74 33   = "sqlite_stat3
2d340 22 3b 0a 20 20 20 20 20 20 73 68 65 6c 6c 5f 65  ";.      shell_e
2d350 78 65 63 28 26 64 61 74 61 2c 20 22 53 45 4c 45  xec(&data, "SELE
2d360 43 54 20 2a 20 46 52 4f 4d 20 73 71 6c 69 74 65  CT * FROM sqlite
2d370 5f 73 74 61 74 33 22 2c 20 26 7a 45 72 72 4d 73  _stat3", &zErrMs
2d380 67 29 3b 0a 20 20 20 20 20 20 64 61 74 61 2e 7a  g);.      data.z
2d390 44 65 73 74 54 61 62 6c 65 20 3d 20 22 73 71 6c  DestTable = "sql
2d3a0 69 74 65 5f 73 74 61 74 34 22 3b 0a 20 20 20 20  ite_stat4";.    
2d3b0 20 20 73 68 65 6c 6c 5f 65 78 65 63 28 26 64 61    shell_exec(&da
2d3c0 74 61 2c 20 22 53 45 4c 45 43 54 20 2a 20 46 52  ta, "SELECT * FR
2d3d0 4f 4d 20 73 71 6c 69 74 65 5f 73 74 61 74 34 22  OM sqlite_stat4"
2d3e0 2c 20 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20  , &zErrMsg);.   
2d3f0 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d     raw_printf(p-
2d400 3e 6f 75 74 2c 20 22 41 4e 41 4c 59 5a 45 20 73  >out, "ANALYZE s
2d410 71 6c 69 74 65 5f 6d 61 73 74 65 72 3b 5c 6e 22  qlite_master;\n"
2d420 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  );.    }.  }else
2d430 0a 0a 20 20 69 66 28 20 63 3d 3d 27 68 27 20 26  ..  if( c=='h' &
2d440 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b  & strncmp(azArg[
2d450 30 5d 2c 20 22 68 65 61 64 65 72 73 22 2c 20 6e  0], "headers", n
2d460 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  )==0 ){.    if( 
2d470 6e 41 72 67 3d 3d 32 20 29 7b 0a 20 20 20 20 20  nArg==2 ){.     
2d480 20 70 2d 3e 73 68 6f 77 48 65 61 64 65 72 20 3d   p->showHeader =
2d490 20 62 6f 6f 6c 65 61 6e 56 61 6c 75 65 28 61 7a   booleanValue(az
2d4a0 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20 7d 65 6c  Arg[1]);.    }el
2d4b0 73 65 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72  se{.      raw_pr
2d4c0 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55 73  intf(stderr, "Us
2d4d0 61 67 65 3a 20 2e 68 65 61 64 65 72 73 20 6f 6e  age: .headers on
2d4e0 7c 6f 66 66 5c 6e 22 29 3b 0a 20 20 20 20 20 20  |off\n");.      
2d4f0 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  rc = 1;.    }.  
2d500 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d  }else..  if( c==
2d510 27 68 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61  'h' && strncmp(a
2d520 7a 41 72 67 5b 30 5d 2c 20 22 68 65 6c 70 22 2c  zArg[0], "help",
2d530 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 75 74   n)==0 ){.    ut
2d540 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  f8_printf(p->out
2d550 2c 20 22 25 73 22 2c 20 7a 48 65 6c 70 29 3b 0a  , "%s", zHelp);.
2d560 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63    }else..  if( c
2d570 3d 3d 27 69 27 20 26 26 20 73 74 72 6e 63 6d 70  =='i' && strncmp
2d580 28 61 7a 41 72 67 5b 30 5d 2c 20 22 69 6d 70 6f  (azArg[0], "impo
2d590 72 74 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20  rt", n)==0 ){.  
2d5a0 20 20 63 68 61 72 20 2a 7a 54 61 62 6c 65 3b 20    char *zTable; 
2d5b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2d5c0 20 49 6e 73 65 72 74 20 64 61 74 61 20 69 6e 74   Insert data int
2d5d0 6f 20 74 68 69 73 20 74 61 62 6c 65 20 2a 2f 0a  o this table */.
2d5e0 20 20 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 3b      char *zFile;
2d5f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d600 2f 2a 20 4e 61 6d 65 20 6f 66 20 66 69 6c 65 20  /* Name of file 
2d610 74 6f 20 65 78 74 72 61 20 63 6f 6e 74 65 6e 74  to extra content
2d620 20 66 72 6f 6d 20 2a 2f 0a 20 20 20 20 73 71 6c   from */.    sql
2d630 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
2d640 20 3d 20 4e 55 4c 4c 3b 20 2f 2a 20 41 20 73 74   = NULL; /* A st
2d650 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 69  atement */.    i
2d660 6e 74 20 6e 43 6f 6c 3b 20 20 20 20 20 20 20 20  nt nCol;        
2d670 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
2d680 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
2d690 69 6e 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a  in the table */.
2d6a0 20 20 20 20 69 6e 74 20 6e 42 79 74 65 3b 20 20      int nByte;  
2d6b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d6c0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
2d6d0 65 73 20 69 6e 20 61 6e 20 53 51 4c 20 73 74 72  es in an SQL str
2d6e0 69 6e 67 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  ing */.    int i
2d6f0 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20  , j;            
2d700 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
2d710 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 20 20 69  ounters */.    i
2d720 6e 74 20 6e 65 65 64 43 6f 6d 6d 69 74 3b 20 20  nt needCommit;  
2d730 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
2d740 75 65 20 74 6f 20 43 4f 4d 4d 49 54 20 6f 72 20  ue to COMMIT or 
2d750 52 4f 4c 4c 42 41 43 4b 20 61 74 20 65 6e 64 20  ROLLBACK at end 
2d760 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 53 65 70 3b  */.    int nSep;
2d770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d780 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
2d790 62 79 74 65 73 20 69 6e 20 70 2d 3e 63 6f 6c 53  bytes in p->colS
2d7a0 65 70 61 72 61 74 6f 72 5b 5d 20 2a 2f 0a 20 20  eparator[] */.  
2d7b0 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b 20 20 20    char *zSql;   
2d7c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2d7d0 20 41 6e 20 53 51 4c 20 73 74 61 74 65 6d 65 6e   An SQL statemen
2d7e0 74 20 2a 2f 0a 20 20 20 20 49 6d 70 6f 72 74 43  t */.    ImportC
2d7f0 74 78 20 73 43 74 78 3b 20 20 20 20 20 20 20 20  tx sCtx;        
2d800 20 20 20 20 20 2f 2a 20 52 65 61 64 65 72 20 63       /* Reader c
2d810 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 20 20 63 68  ontext */.    ch
2d820 61 72 20 2a 28 53 51 4c 49 54 45 5f 43 44 45 43  ar *(SQLITE_CDEC
2d830 4c 20 2a 78 52 65 61 64 29 28 49 6d 70 6f 72 74  L *xRead)(Import
2d840 43 74 78 2a 29 3b 20 2f 2a 20 46 75 6e 63 20 74  Ctx*); /* Func t
2d850 6f 20 72 65 61 64 20 6f 6e 65 20 76 61 6c 75 65  o read one value
2d860 20 2a 2f 0a 20 20 20 20 69 6e 74 20 28 53 51 4c   */.    int (SQL
2d870 49 54 45 5f 43 44 45 43 4c 20 2a 78 43 6c 6f 73  ITE_CDECL *xClos
2d880 65 72 29 28 46 49 4c 45 2a 29 3b 20 20 20 20 20  er)(FILE*);     
2d890 20 2f 2a 20 46 75 6e 63 20 74 6f 20 63 6c 6f 73   /* Func to clos
2d8a0 65 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 20 20 69  e file */..    i
2d8b0 66 28 20 6e 41 72 67 21 3d 33 20 29 7b 0a 20 20  f( nArg!=3 ){.  
2d8c0 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73      raw_printf(s
2d8d0 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e  tderr, "Usage: .
2d8e0 69 6d 70 6f 72 74 20 46 49 4c 45 20 54 41 42 4c  import FILE TABL
2d8f0 45 5c 6e 22 29 3b 0a 20 20 20 20 20 20 67 6f 74  E\n");.      got
2d900 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65  o meta_command_e
2d910 78 69 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a  xit;.    }.    z
2d920 46 69 6c 65 20 3d 20 61 7a 41 72 67 5b 31 5d 3b  File = azArg[1];
2d930 0a 20 20 20 20 7a 54 61 62 6c 65 20 3d 20 61 7a  .    zTable = az
2d940 41 72 67 5b 32 5d 3b 0a 20 20 20 20 73 65 65 6e  Arg[2];.    seen
2d950 49 6e 74 65 72 72 75 70 74 20 3d 20 30 3b 0a 20  Interrupt = 0;. 
2d960 20 20 20 6d 65 6d 73 65 74 28 26 73 43 74 78 2c     memset(&sCtx,
2d970 20 30 2c 20 73 69 7a 65 6f 66 28 73 43 74 78 29   0, sizeof(sCtx)
2d980 29 3b 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28 70  );.    open_db(p
2d990 2c 20 30 29 3b 0a 20 20 20 20 6e 53 65 70 20 3d  , 0);.    nSep =
2d9a0 20 73 74 72 6c 65 6e 33 30 28 70 2d 3e 63 6f 6c   strlen30(p->col
2d9b0 53 65 70 61 72 61 74 6f 72 29 3b 0a 20 20 20 20  Separator);.    
2d9c0 69 66 28 20 6e 53 65 70 3d 3d 30 20 29 7b 0a 20  if( nSep==0 ){. 
2d9d0 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
2d9e0 73 74 64 65 72 72 2c 0a 20 20 20 20 20 20 20 20  stderr,.        
2d9f0 20 20 20 20 20 20 20 20 20 22 45 72 72 6f 72 3a           "Error:
2da00 20 6e 6f 6e 2d 6e 75 6c 6c 20 63 6f 6c 75 6d 6e   non-null column
2da10 20 73 65 70 61 72 61 74 6f 72 20 72 65 71 75 69   separator requi
2da20 72 65 64 20 66 6f 72 20 69 6d 70 6f 72 74 5c 6e  red for import\n
2da30 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ");.      return
2da40 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   1;.    }.    if
2da50 28 20 6e 53 65 70 3e 31 20 29 7b 0a 20 20 20 20  ( nSep>1 ){.    
2da60 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64    raw_printf(std
2da70 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 6d 75 6c  err, "Error: mul
2da80 74 69 2d 63 68 61 72 61 63 74 65 72 20 63 6f 6c  ti-character col
2da90 75 6d 6e 20 73 65 70 61 72 61 74 6f 72 73 20 6e  umn separators n
2daa0 6f 74 20 61 6c 6c 6f 77 65 64 22 0a 20 20 20 20  ot allowed".    
2dab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2dac0 20 20 22 20 66 6f 72 20 69 6d 70 6f 72 74 5c 6e    " for import\n
2dad0 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ");.      return
2dae0 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 53   1;.    }.    nS
2daf0 65 70 20 3d 20 73 74 72 6c 65 6e 33 30 28 70 2d  ep = strlen30(p-
2db00 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 29 3b 0a  >rowSeparator);.
2db10 20 20 20 20 69 66 28 20 6e 53 65 70 3d 3d 30 20      if( nSep==0 
2db20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69  ){.      raw_pri
2db30 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72  ntf(stderr, "Err
2db40 6f 72 3a 20 6e 6f 6e 2d 6e 75 6c 6c 20 72 6f 77  or: non-null row
2db50 20 73 65 70 61 72 61 74 6f 72 20 72 65 71 75 69   separator requi
2db60 72 65 64 20 66 6f 72 20 69 6d 70 6f 72 74 5c 6e  red for import\n
2db70 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ");.      return
2db80 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   1;.    }.    if
2db90 28 20 6e 53 65 70 3d 3d 32 20 26 26 20 70 2d 3e  ( nSep==2 && p->
2dba0 6d 6f 64 65 3d 3d 4d 4f 44 45 5f 43 73 76 20 26  mode==MODE_Csv &
2dbb0 26 20 73 74 72 63 6d 70 28 70 2d 3e 72 6f 77 53  & strcmp(p->rowS
2dbc0 65 70 61 72 61 74 6f 72 2c 20 53 45 50 5f 43 72  eparator, SEP_Cr
2dbd0 4c 66 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Lf)==0 ){.      
2dbe0 2f 2a 20 57 68 65 6e 20 69 6d 70 6f 72 74 69 6e  /* When importin
2dbf0 67 20 43 53 56 20 28 6f 6e 6c 79 29 2c 20 69 66  g CSV (only), if
2dc00 20 74 68 65 20 72 6f 77 20 73 65 70 61 72 61 74   the row separat
2dc10 6f 72 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  or is set to the
2dc20 0a 20 20 20 20 20 20 2a 2a 20 64 65 66 61 75 6c  .      ** defaul
2dc30 74 20 6f 75 74 70 75 74 20 72 6f 77 20 73 65 70  t output row sep
2dc40 61 72 61 74 6f 72 2c 20 63 68 61 6e 67 65 20 69  arator, change i
2dc50 74 20 74 6f 20 74 68 65 20 64 65 66 61 75 6c 74  t to the default
2dc60 20 69 6e 70 75 74 0a 20 20 20 20 20 20 2a 2a 20   input.      ** 
2dc70 72 6f 77 20 73 65 70 61 72 61 74 6f 72 2e 20 20  row separator.  
2dc80 54 68 69 73 20 61 76 6f 69 64 73 20 68 61 76 69  This avoids havi
2dc90 6e 67 20 74 6f 20 6d 61 69 6e 74 61 69 6e 20 64  ng to maintain d
2dca0 69 66 66 65 72 65 6e 74 20 69 6e 70 75 74 0a 20  ifferent input. 
2dcb0 20 20 20 20 20 2a 2a 20 61 6e 64 20 6f 75 74 70       ** and outp
2dcc0 75 74 20 72 6f 77 20 73 65 70 61 72 61 74 6f 72  ut row separator
2dcd0 73 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  s. */.      sqli
2dce0 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
2dcf0 65 6f 66 28 70 2d 3e 72 6f 77 53 65 70 61 72 61  eof(p->rowSepara
2dd00 74 6f 72 29 2c 20 70 2d 3e 72 6f 77 53 65 70 61  tor), p->rowSepa
2dd10 72 61 74 6f 72 2c 20 53 45 50 5f 52 6f 77 29 3b  rator, SEP_Row);
2dd20 0a 20 20 20 20 20 20 6e 53 65 70 20 3d 20 73 74  .      nSep = st
2dd30 72 6c 65 6e 33 30 28 70 2d 3e 72 6f 77 53 65 70  rlen30(p->rowSep
2dd40 61 72 61 74 6f 72 29 3b 0a 20 20 20 20 7d 0a 20  arator);.    }. 
2dd50 20 20 20 69 66 28 20 6e 53 65 70 3e 31 20 29 7b     if( nSep>1 ){
2dd60 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74  .      raw_print
2dd70 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72  f(stderr, "Error
2dd80 3a 20 6d 75 6c 74 69 2d 63 68 61 72 61 63 74 65  : multi-characte
2dd90 72 20 72 6f 77 20 73 65 70 61 72 61 74 6f 72 73  r row separators
2dda0 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 22 0a 20 20   not allowed".  
2ddb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ddc0 20 20 20 20 22 20 66 6f 72 20 69 6d 70 6f 72 74      " for import
2ddd0 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75  \n");.      retu
2dde0 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 1;.    }.    
2ddf0 73 43 74 78 2e 7a 46 69 6c 65 20 3d 20 7a 46 69  sCtx.zFile = zFi
2de00 6c 65 3b 0a 20 20 20 20 73 43 74 78 2e 6e 4c 69  le;.    sCtx.nLi
2de10 6e 65 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20  ne = 1;.    if( 
2de20 73 43 74 78 2e 7a 46 69 6c 65 5b 30 5d 3d 3d 27  sCtx.zFile[0]=='
2de30 7c 27 20 29 7b 0a 23 69 66 64 65 66 20 53 51 4c  |' ){.#ifdef SQL
2de40 49 54 45 5f 4f 4d 49 54 5f 50 4f 50 45 4e 0a 20  ITE_OMIT_POPEN. 
2de50 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
2de60 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20  stderr, "Error: 
2de70 70 69 70 65 73 20 61 72 65 20 6e 6f 74 20 73 75  pipes are not su
2de80 70 70 6f 72 74 65 64 20 69 6e 20 74 68 69 73 20  pported in this 
2de90 4f 53 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 65  OS\n");.      re
2dea0 74 75 72 6e 20 31 3b 0a 23 65 6c 73 65 0a 20 20  turn 1;.#else.  
2deb0 20 20 20 20 73 43 74 78 2e 69 6e 20 3d 20 70 6f      sCtx.in = po
2dec0 70 65 6e 28 73 43 74 78 2e 7a 46 69 6c 65 2b 31  pen(sCtx.zFile+1
2ded0 2c 20 22 72 22 29 3b 0a 20 20 20 20 20 20 73 43  , "r");.      sC
2dee0 74 78 2e 7a 46 69 6c 65 20 3d 20 22 3c 70 69 70  tx.zFile = "<pip
2def0 65 3e 22 3b 0a 20 20 20 20 20 20 78 43 6c 6f 73  e>";.      xClos
2df00 65 72 20 3d 20 70 63 6c 6f 73 65 3b 0a 23 65 6e  er = pclose;.#en
2df10 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  dif.    }else{. 
2df20 20 20 20 20 20 73 43 74 78 2e 69 6e 20 3d 20 66       sCtx.in = f
2df30 6f 70 65 6e 28 73 43 74 78 2e 7a 46 69 6c 65 2c  open(sCtx.zFile,
2df40 20 22 72 62 22 29 3b 0a 20 20 20 20 20 20 78 43   "rb");.      xC
2df50 6c 6f 73 65 72 20 3d 20 66 63 6c 6f 73 65 3b 0a  loser = fclose;.
2df60 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d      }.    if( p-
2df70 3e 6d 6f 64 65 3d 3d 4d 4f 44 45 5f 41 73 63 69  >mode==MODE_Asci
2df80 69 20 29 7b 0a 20 20 20 20 20 20 78 52 65 61 64  i ){.      xRead
2df90 20 3d 20 61 73 63 69 69 5f 72 65 61 64 5f 6f 6e   = ascii_read_on
2dfa0 65 5f 66 69 65 6c 64 3b 0a 20 20 20 20 7d 65 6c  e_field;.    }el
2dfb0 73 65 7b 0a 20 20 20 20 20 20 78 52 65 61 64 20  se{.      xRead 
2dfc0 3d 20 63 73 76 5f 72 65 61 64 5f 6f 6e 65 5f 66  = csv_read_one_f
2dfd0 69 65 6c 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ield;.    }.    
2dfe0 69 66 28 20 73 43 74 78 2e 69 6e 3d 3d 30 20 29  if( sCtx.in==0 )
2dff0 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69  {.      utf8_pri
2e000 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72  ntf(stderr, "Err
2e010 6f 72 3a 20 63 61 6e 6e 6f 74 20 6f 70 65 6e 20  or: cannot open 
2e020 5c 22 25 73 5c 22 5c 6e 22 2c 20 7a 46 69 6c 65  \"%s\"\n", zFile
2e030 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
2e040 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 43 74  1;.    }.    sCt
2e050 78 2e 63 43 6f 6c 53 65 70 20 3d 20 70 2d 3e 63  x.cColSep = p->c
2e060 6f 6c 53 65 70 61 72 61 74 6f 72 5b 30 5d 3b 0a  olSeparator[0];.
2e070 20 20 20 20 73 43 74 78 2e 63 52 6f 77 53 65 70      sCtx.cRowSep
2e080 20 3d 20 70 2d 3e 72 6f 77 53 65 70 61 72 61 74   = p->rowSeparat
2e090 6f 72 5b 30 5d 3b 0a 20 20 20 20 7a 53 71 6c 20  or[0];.    zSql 
2e0a0 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
2e0b0 66 28 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  f("SELECT * FROM
2e0c0 20 25 73 22 2c 20 7a 54 61 62 6c 65 29 3b 0a 20   %s", zTable);. 
2e0d0 20 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29     if( zSql==0 )
2e0e0 7b 0a 20 20 20 20 20 20 78 43 6c 6f 73 65 72 28  {.      xCloser(
2e0f0 73 43 74 78 2e 69 6e 29 3b 0a 20 20 20 20 20 20  sCtx.in);.      
2e100 73 68 65 6c 6c 5f 6f 75 74 5f 6f 66 5f 6d 65 6d  shell_out_of_mem
2e110 6f 72 79 28 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ory();.    }.   
2e120 20 6e 42 79 74 65 20 3d 20 73 74 72 6c 65 6e 33   nByte = strlen3
2e130 30 28 7a 53 71 6c 29 3b 0a 20 20 20 20 72 63 20  0(zSql);.    rc 
2e140 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72  = sqlite3_prepar
2e150 65 5f 76 32 28 70 2d 3e 64 62 2c 20 7a 53 71 6c  e_v2(p->db, zSql
2e160 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29  , -1, &pStmt, 0)
2e170 3b 0a 20 20 20 20 69 6d 70 6f 72 74 5f 61 70 70  ;.    import_app
2e180 65 6e 64 5f 63 68 61 72 28 26 73 43 74 78 2c 20  end_char(&sCtx, 
2e190 30 29 3b 20 20 20 20 2f 2a 20 54 6f 20 65 6e 73  0);    /* To ens
2e1a0 75 72 65 20 73 43 74 78 2e 7a 20 69 73 20 61 6c  ure sCtx.z is al
2e1b0 6c 6f 63 61 74 65 64 20 2a 2f 0a 20 20 20 20 69  located */.    i
2e1c0 66 28 20 72 63 20 26 26 20 73 71 6c 69 74 65 33  f( rc && sqlite3
2e1d0 5f 73 74 72 67 6c 6f 62 28 22 6e 6f 20 73 75 63  _strglob("no suc
2e1e0 68 20 74 61 62 6c 65 3a 20 2a 22 2c 20 73 71 6c  h table: *", sql
2e1f0 69 74 65 33 5f 65 72 72 6d 73 67 28 70 2d 3e 64  ite3_errmsg(p->d
2e200 62 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  b))==0 ){.      
2e210 63 68 61 72 20 2a 7a 43 72 65 61 74 65 20 3d 20  char *zCreate = 
2e220 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
2e230 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 25 73  "CREATE TABLE %s
2e240 22 2c 20 7a 54 61 62 6c 65 29 3b 0a 20 20 20 20  ", zTable);.    
2e250 20 20 63 68 61 72 20 63 53 65 70 20 3d 20 27 28    char cSep = '(
2e260 27 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  ';.      while( 
2e270 78 52 65 61 64 28 26 73 43 74 78 29 20 29 7b 0a  xRead(&sCtx) ){.
2e280 20 20 20 20 20 20 20 20 7a 43 72 65 61 74 65 20          zCreate 
2e290 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
2e2a0 66 28 22 25 7a 25 63 5c 6e 20 20 5c 22 25 77 5c  f("%z%c\n  \"%w\
2e2b0 22 20 54 45 58 54 22 2c 20 7a 43 72 65 61 74 65  " TEXT", zCreate
2e2c0 2c 20 63 53 65 70 2c 20 73 43 74 78 2e 7a 29 3b  , cSep, sCtx.z);
2e2d0 0a 20 20 20 20 20 20 20 20 63 53 65 70 20 3d 20  .        cSep = 
2e2e0 27 2c 27 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ',';.        if(
2e2f0 20 73 43 74 78 2e 63 54 65 72 6d 21 3d 73 43 74   sCtx.cTerm!=sCt
2e300 78 2e 63 43 6f 6c 53 65 70 20 29 20 62 72 65 61  x.cColSep ) brea
2e310 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
2e320 20 69 66 28 20 63 53 65 70 3d 3d 27 28 27 20 29   if( cSep=='(' )
2e330 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
2e340 33 5f 66 72 65 65 28 7a 43 72 65 61 74 65 29 3b  3_free(zCreate);
2e350 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2e360 5f 66 72 65 65 28 73 43 74 78 2e 7a 29 3b 0a 20  _free(sCtx.z);. 
2e370 20 20 20 20 20 20 20 78 43 6c 6f 73 65 72 28 73         xCloser(s
2e380 43 74 78 2e 69 6e 29 3b 0a 20 20 20 20 20 20 20  Ctx.in);.       
2e390 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64   utf8_printf(std
2e3a0 65 72 72 2c 22 25 73 3a 20 65 6d 70 74 79 20 66  err,"%s: empty f
2e3b0 69 6c 65 5c 6e 22 2c 20 73 43 74 78 2e 7a 46 69  ile\n", sCtx.zFi
2e3c0 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  le);.        ret
2e3d0 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  urn 1;.      }. 
2e3e0 20 20 20 20 20 7a 43 72 65 61 74 65 20 3d 20 73       zCreate = s
2e3f0 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
2e400 25 7a 5c 6e 29 22 2c 20 7a 43 72 65 61 74 65 29  %z\n)", zCreate)
2e410 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
2e420 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c  ite3_exec(p->db,
2e430 20 7a 43 72 65 61 74 65 2c 20 30 2c 20 30 2c 20   zCreate, 0, 0, 
2e440 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
2e450 33 5f 66 72 65 65 28 7a 43 72 65 61 74 65 29 3b  3_free(zCreate);
2e460 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b  .      if( rc ){
2e470 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72  .        utf8_pr
2e480 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 43 52  intf(stderr, "CR
2e490 45 41 54 45 20 54 41 42 4c 45 20 25 73 28 2e 2e  EATE TABLE %s(..
2e4a0 2e 29 20 66 61 69 6c 65 64 3a 20 25 73 5c 6e 22  .) failed: %s\n"
2e4b0 2c 20 7a 54 61 62 6c 65 2c 0a 20 20 20 20 20 20  , zTable,.      
2e4c0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
2e4d0 33 5f 65 72 72 6d 73 67 28 70 2d 3e 64 62 29 29  3_errmsg(p->db))
2e4e0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
2e4f0 33 5f 66 72 65 65 28 73 43 74 78 2e 7a 29 3b 0a  3_free(sCtx.z);.
2e500 20 20 20 20 20 20 20 20 78 43 6c 6f 73 65 72 28          xCloser(
2e510 73 43 74 78 2e 69 6e 29 3b 0a 20 20 20 20 20 20  sCtx.in);.      
2e520 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
2e530 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 73    }.      rc = s
2e540 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76  qlite3_prepare_v
2e550 32 28 70 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d  2(p->db, zSql, -
2e560 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20  1, &pStmt, 0);. 
2e570 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
2e580 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20  _free(zSql);.   
2e590 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
2e5a0 20 69 66 20 28 70 53 74 6d 74 29 20 73 71 6c 69   if (pStmt) sqli
2e5b0 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74  te3_finalize(pSt
2e5c0 6d 74 29 3b 0a 20 20 20 20 20 20 75 74 66 38 5f  mt);.      utf8_
2e5d0 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 45  printf(stderr,"E
2e5e0 72 72 6f 72 3a 20 25 73 5c 6e 22 2c 20 73 71 6c  rror: %s\n", sql
2e5f0 69 74 65 33 5f 65 72 72 6d 73 67 28 70 2d 3e 64  ite3_errmsg(p->d
2e600 62 29 29 3b 0a 20 20 20 20 20 20 78 43 6c 6f 73  b));.      xClos
2e610 65 72 28 73 43 74 78 2e 69 6e 29 3b 0a 20 20 20  er(sCtx.in);.   
2e620 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
2e630 20 7d 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 73 71   }.    nCol = sq
2e640 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75  lite3_column_cou
2e650 6e 74 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 73  nt(pStmt);.    s
2e660 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
2e670 70 53 74 6d 74 29 3b 0a 20 20 20 20 70 53 74 6d  pStmt);.    pStm
2e680 74 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 6e  t = 0;.    if( n
2e690 43 6f 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  Col==0 ) return 
2e6a0 30 3b 20 2f 2a 20 6e 6f 20 63 6f 6c 75 6d 6e 73  0; /* no columns
2e6b0 2c 20 6e 6f 20 65 72 72 6f 72 20 2a 2f 0a 20 20  , no error */.  
2e6c0 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33    zSql = sqlite3
2e6d0 5f 6d 61 6c 6c 6f 63 36 34 28 20 6e 42 79 74 65  _malloc64( nByte
2e6e0 2a 32 20 2b 20 32 30 20 2b 20 6e 43 6f 6c 2a 32  *2 + 20 + nCol*2
2e6f0 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 53 71 6c   );.    if( zSql
2e700 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 78 43 6c  ==0 ){.      xCl
2e710 6f 73 65 72 28 73 43 74 78 2e 69 6e 29 3b 0a 20  oser(sCtx.in);. 
2e720 20 20 20 20 20 73 68 65 6c 6c 5f 6f 75 74 5f 6f       shell_out_o
2e730 66 5f 6d 65 6d 6f 72 79 28 29 3b 0a 20 20 20 20  f_memory();.    
2e740 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  }.    sqlite3_sn
2e750 70 72 69 6e 74 66 28 6e 42 79 74 65 2b 32 30 2c  printf(nByte+20,
2e760 20 7a 53 71 6c 2c 20 22 49 4e 53 45 52 54 20 49   zSql, "INSERT I
2e770 4e 54 4f 20 5c 22 25 77 5c 22 20 56 41 4c 55 45  NTO \"%w\" VALUE
2e780 53 28 3f 22 2c 20 7a 54 61 62 6c 65 29 3b 0a 20  S(?", zTable);. 
2e790 20 20 20 6a 20 3d 20 73 74 72 6c 65 6e 33 30 28     j = strlen30(
2e7a0 7a 53 71 6c 29 3b 0a 20 20 20 20 66 6f 72 28 69  zSql);.    for(i
2e7b0 3d 31 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29  =1; i<nCol; i++)
2e7c0 7b 0a 20 20 20 20 20 20 7a 53 71 6c 5b 6a 2b 2b  {.      zSql[j++
2e7d0 5d 20 3d 20 27 2c 27 3b 0a 20 20 20 20 20 20 7a  ] = ',';.      z
2e7e0 53 71 6c 5b 6a 2b 2b 5d 20 3d 20 27 3f 27 3b 0a  Sql[j++] = '?';.
2e7f0 20 20 20 20 7d 0a 20 20 20 20 7a 53 71 6c 5b 6a      }.    zSql[j
2e800 2b 2b 5d 20 3d 20 27 29 27 3b 0a 20 20 20 20 7a  ++] = ')';.    z
2e810 53 71 6c 5b 6a 5d 20 3d 20 30 3b 0a 20 20 20 20  Sql[j] = 0;.    
2e820 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65  rc = sqlite3_pre
2e830 70 61 72 65 5f 76 32 28 70 2d 3e 64 62 2c 20 7a  pare_v2(p->db, z
2e840 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c  Sql, -1, &pStmt,
2e850 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
2e860 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20  _free(zSql);.   
2e870 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
2e880 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64   utf8_printf(std
2e890 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 25 73 5c  err, "Error: %s\
2e8a0 6e 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d  n", sqlite3_errm
2e8b0 73 67 28 70 2d 3e 64 62 29 29 3b 0a 20 20 20 20  sg(p->db));.    
2e8c0 20 20 69 66 20 28 70 53 74 6d 74 29 20 73 71 6c    if (pStmt) sql
2e8d0 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53  ite3_finalize(pS
2e8e0 74 6d 74 29 3b 0a 20 20 20 20 20 20 78 43 6c 6f  tmt);.      xClo
2e8f0 73 65 72 28 73 43 74 78 2e 69 6e 29 3b 0a 20 20  ser(sCtx.in);.  
2e900 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
2e910 20 20 7d 0a 20 20 20 20 6e 65 65 64 43 6f 6d 6d    }.    needComm
2e920 69 74 20 3d 20 73 71 6c 69 74 65 33 5f 67 65 74  it = sqlite3_get
2e930 5f 61 75 74 6f 63 6f 6d 6d 69 74 28 70 2d 3e 64  _autocommit(p->d
2e940 62 29 3b 0a 20 20 20 20 69 66 28 20 6e 65 65 64  b);.    if( need
2e950 43 6f 6d 6d 69 74 20 29 20 73 71 6c 69 74 65 33  Commit ) sqlite3
2e960 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20 22 42 45  _exec(p->db, "BE
2e970 47 49 4e 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  GIN", 0, 0, 0);.
2e980 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 69 6e      do{.      in
2e990 74 20 73 74 61 72 74 4c 69 6e 65 20 3d 20 73 43  t startLine = sC
2e9a0 74 78 2e 6e 4c 69 6e 65 3b 0a 20 20 20 20 20 20  tx.nLine;.      
2e9b0 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b  for(i=0; i<nCol;
2e9c0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63   i++){.        c
2e9d0 68 61 72 20 2a 7a 20 3d 20 78 52 65 61 64 28 26  har *z = xRead(&
2e9e0 73 43 74 78 29 3b 0a 20 20 20 20 20 20 20 20 2f  sCtx);.        /
2e9f0 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 44 69 64  *.        ** Did
2ea00 20 77 65 20 72 65 61 63 68 20 65 6e 64 2d 6f 66   we reach end-of
2ea10 2d 66 69 6c 65 20 62 65 66 6f 72 65 20 66 69 6e  -file before fin
2ea20 64 69 6e 67 20 61 6e 79 20 63 6f 6c 75 6d 6e 73  ding any columns
2ea30 3f 0a 20 20 20 20 20 20 20 20 2a 2a 20 49 66 20  ?.        ** If 
2ea40 73 6f 2c 20 73 74 6f 70 20 69 6e 73 74 65 61 64  so, stop instead
2ea50 20 6f 66 20 4e 55 4c 4c 20 66 69 6c 6c 69 6e 67   of NULL filling
2ea60 20 74 68 65 20 72 65 6d 61 69 6e 69 6e 67 20 63   the remaining c
2ea70 6f 6c 75 6d 6e 73 2e 0a 20 20 20 20 20 20 20 20  olumns..        
2ea80 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a  */.        if( z
2ea90 3d 3d 30 20 26 26 20 69 3d 3d 30 20 29 20 62 72  ==0 && i==0 ) br
2eaa0 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 2f 2a 0a  eak;.        /*.
2eab0 20 20 20 20 20 20 20 20 2a 2a 20 44 69 64 20 77          ** Did w
2eac0 65 20 72 65 61 63 68 20 65 6e 64 2d 6f 66 2d 66  e reach end-of-f
2ead0 69 6c 65 20 4f 52 20 65 6e 64 2d 6f 66 2d 6c 69  ile OR end-of-li
2eae0 6e 65 20 62 65 66 6f 72 65 20 66 69 6e 64 69 6e  ne before findin
2eaf0 67 20 61 6e 79 0a 20 20 20 20 20 20 20 20 2a 2a  g any.        **
2eb00 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 41 53 43 49   columns in ASCI
2eb10 49 20 6d 6f 64 65 3f 20 20 49 66 20 73 6f 2c 20  I mode?  If so, 
2eb20 73 74 6f 70 20 69 6e 73 74 65 61 64 20 6f 66 20  stop instead of 
2eb30 4e 55 4c 4c 20 66 69 6c 6c 69 6e 67 0a 20 20 20  NULL filling.   
2eb40 20 20 20 20 20 2a 2a 20 74 68 65 20 72 65 6d 61       ** the rema
2eb50 69 6e 69 6e 67 20 63 6f 6c 75 6d 6e 73 2e 0a 20  ining columns.. 
2eb60 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
2eb70 20 20 69 66 28 20 70 2d 3e 6d 6f 64 65 3d 3d 4d    if( p->mode==M
2eb80 4f 44 45 5f 41 73 63 69 69 20 26 26 20 28 7a 3d  ODE_Ascii && (z=
2eb90 3d 30 20 7c 7c 20 7a 5b 30 5d 3d 3d 30 29 20 26  =0 || z[0]==0) &
2eba0 26 20 69 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  & i==0 ) break;.
2ebb0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
2ebc0 62 69 6e 64 5f 74 65 78 74 28 70 53 74 6d 74 2c  bind_text(pStmt,
2ebd0 20 69 2b 31 2c 20 7a 2c 20 2d 31 2c 20 53 51 4c   i+1, z, -1, SQL
2ebe0 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a  ITE_TRANSIENT);.
2ebf0 20 20 20 20 20 20 20 20 69 66 28 20 69 3c 6e 43          if( i<nC
2ec00 6f 6c 2d 31 20 26 26 20 73 43 74 78 2e 63 54 65  ol-1 && sCtx.cTe
2ec10 72 6d 21 3d 73 43 74 78 2e 63 43 6f 6c 53 65 70  rm!=sCtx.cColSep
2ec20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 74   ){.          ut
2ec30 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  f8_printf(stderr
2ec40 2c 20 22 25 73 3a 25 64 3a 20 65 78 70 65 63 74  , "%s:%d: expect
2ec50 65 64 20 25 64 20 63 6f 6c 75 6d 6e 73 20 62 75  ed %d columns bu
2ec60 74 20 66 6f 75 6e 64 20 25 64 20 2d 20 22 0a 20  t found %d - ". 
2ec70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ec80 20 20 20 20 20 20 20 20 20 22 66 69 6c 6c 69 6e           "fillin
2ec90 67 20 74 68 65 20 72 65 73 74 20 77 69 74 68 20  g the rest with 
2eca0 4e 55 4c 4c 5c 6e 22 2c 0a 20 20 20 20 20 20 20  NULL\n",.       
2ecb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ecc0 20 20 20 73 43 74 78 2e 7a 46 69 6c 65 2c 20 73     sCtx.zFile, s
2ecd0 74 61 72 74 4c 69 6e 65 2c 20 6e 43 6f 6c 2c 20  tartLine, nCol, 
2ece0 69 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20  i+1);.          
2ecf0 69 20 2b 3d 20 32 3b 0a 20 20 20 20 20 20 20 20  i += 2;.        
2ed00 20 20 77 68 69 6c 65 28 20 69 3c 3d 6e 43 6f 6c    while( i<=nCol
2ed10 20 29 7b 20 73 71 6c 69 74 65 33 5f 62 69 6e 64   ){ sqlite3_bind
2ed20 5f 6e 75 6c 6c 28 70 53 74 6d 74 2c 20 69 29 3b  _null(pStmt, i);
2ed30 20 69 2b 2b 3b 20 7d 0a 20 20 20 20 20 20 20 20   i++; }.        
2ed40 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
2ed50 69 66 28 20 73 43 74 78 2e 63 54 65 72 6d 3d 3d  if( sCtx.cTerm==
2ed60 73 43 74 78 2e 63 43 6f 6c 53 65 70 20 29 7b 0a  sCtx.cColSep ){.
2ed70 20 20 20 20 20 20 20 20 64 6f 7b 0a 20 20 20 20          do{.    
2ed80 20 20 20 20 20 20 78 52 65 61 64 28 26 73 43 74        xRead(&sCt
2ed90 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 2b  x);.          i+
2eda0 2b 3b 0a 20 20 20 20 20 20 20 20 7d 77 68 69 6c  +;.        }whil
2edb0 65 28 20 73 43 74 78 2e 63 54 65 72 6d 3d 3d 73  e( sCtx.cTerm==s
2edc0 43 74 78 2e 63 43 6f 6c 53 65 70 20 29 3b 0a 20  Ctx.cColSep );. 
2edd0 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e         utf8_prin
2ede0 74 66 28 73 74 64 65 72 72 2c 20 22 25 73 3a 25  tf(stderr, "%s:%
2edf0 64 3a 20 65 78 70 65 63 74 65 64 20 25 64 20 63  d: expected %d c
2ee00 6f 6c 75 6d 6e 73 20 62 75 74 20 66 6f 75 6e 64  olumns but found
2ee10 20 25 64 20 2d 20 22 0a 20 20 20 20 20 20 20 20   %d - ".        
2ee20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ee30 22 65 78 74 72 61 73 20 69 67 6e 6f 72 65 64 5c  "extras ignored\
2ee40 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
2ee50 20 20 20 20 20 20 20 20 20 20 20 20 73 43 74 78              sCtx
2ee60 2e 7a 46 69 6c 65 2c 20 73 74 61 72 74 4c 69 6e  .zFile, startLin
2ee70 65 2c 20 6e 43 6f 6c 2c 20 69 29 3b 0a 20 20 20  e, nCol, i);.   
2ee80 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69     }.      if( i
2ee90 3e 3d 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20  >=nCol ){.      
2eea0 20 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70    sqlite3_step(p
2eeb0 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 20 20 72  Stmt);.        r
2eec0 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65  c = sqlite3_rese
2eed0 74 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20  t(pStmt);.      
2eee0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2eef0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
2ef00 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64   utf8_printf(std
2ef10 65 72 72 2c 20 22 25 73 3a 25 64 3a 20 49 4e 53  err, "%s:%d: INS
2ef20 45 52 54 20 66 61 69 6c 65 64 3a 20 25 73 5c 6e  ERT failed: %s\n
2ef30 22 2c 20 73 43 74 78 2e 7a 46 69 6c 65 2c 0a 20  ", sCtx.zFile,. 
2ef40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ef50 20 20 20 20 20 73 74 61 72 74 4c 69 6e 65 2c 20       startLine, 
2ef60 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70  sqlite3_errmsg(p
2ef70 2d 3e 64 62 29 29 3b 0a 20 20 20 20 20 20 20 20  ->db));.        
2ef80 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 77  }.      }.    }w
2ef90 68 69 6c 65 28 20 73 43 74 78 2e 63 54 65 72 6d  hile( sCtx.cTerm
2efa0 21 3d 45 4f 46 20 29 3b 0a 0a 20 20 20 20 78 43  !=EOF );..    xC
2efb0 6c 6f 73 65 72 28 73 43 74 78 2e 69 6e 29 3b 0a  loser(sCtx.in);.
2efc0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
2efd0 28 73 43 74 78 2e 7a 29 3b 0a 20 20 20 20 73 71  (sCtx.z);.    sq
2efe0 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
2eff0 53 74 6d 74 29 3b 0a 20 20 20 20 69 66 28 20 6e  Stmt);.    if( n
2f000 65 65 64 43 6f 6d 6d 69 74 20 29 20 73 71 6c 69  eedCommit ) sqli
2f010 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20  te3_exec(p->db, 
2f020 22 43 4f 4d 4d 49 54 22 2c 20 30 2c 20 30 2c 20  "COMMIT", 0, 0, 
2f030 30 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a 23 69 66  0);.  }else..#if
2f040 6e 64 65 66 20 53 51 4c 49 54 45 5f 55 4e 54 45  ndef SQLITE_UNTE
2f050 53 54 41 42 4c 45 0a 20 20 69 66 28 20 63 3d 3d  STABLE.  if( c==
2f060 27 69 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61  'i' && strncmp(a
2f070 7a 41 72 67 5b 30 5d 2c 20 22 69 6d 70 6f 73 74  zArg[0], "impost
2f080 65 72 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20  er", n)==0 ){.  
2f090 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20    char *zSql;.  
2f0a0 20 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 69 73 74    char *zCollist
2f0b0 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65   = 0;.    sqlite
2f0c0 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20  3_stmt *pStmt;. 
2f0d0 20 20 20 69 6e 74 20 74 6e 75 6d 20 3d 20 30 3b     int tnum = 0;
2f0e0 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
2f0f0 69 66 28 20 21 28 6e 41 72 67 3d 3d 33 20 7c 7c  if( !(nArg==3 ||
2f100 20 28 6e 41 72 67 3d 3d 32 20 26 26 20 73 71 6c   (nArg==2 && sql
2f110 69 74 65 33 5f 73 74 72 69 63 6d 70 28 61 7a 41  ite3_stricmp(azA
2f120 72 67 5b 31 5d 2c 22 6f 66 66 22 29 3d 3d 30 29  rg[1],"off")==0)
2f130 29 20 29 7b 0a 20 20 20 20 20 20 75 74 66 38 5f  ) ){.      utf8_
2f140 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
2f150 55 73 61 67 65 3a 20 2e 69 6d 70 6f 73 74 65 72  Usage: .imposter
2f160 20 49 4e 44 45 58 20 49 4d 50 4f 53 54 45 52 5c   INDEX IMPOSTER\
2f170 6e 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n".             
2f180 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20 20               "  
2f190 20 20 20 20 20 2e 69 6d 70 6f 73 74 65 72 20 6f       .imposter o
2f1a0 66 66 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 63  ff\n");.      rc
2f1b0 20 3d 20 31 3b 0a 20 20 20 20 20 20 67 6f 74 6f   = 1;.      goto
2f1c0 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78   meta_command_ex
2f1d0 69 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6f 70  it;.    }.    op
2f1e0 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a 20 20 20  en_db(p, 0);.   
2f1f0 20 69 66 28 20 6e 41 72 67 3d 3d 32 20 29 7b 0a   if( nArg==2 ){.
2f200 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 74 65        sqlite3_te
2f210 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54  st_control(SQLIT
2f220 45 5f 54 45 53 54 43 54 52 4c 5f 49 4d 50 4f 53  E_TESTCTRL_IMPOS
2f230 54 45 52 2c 20 70 2d 3e 64 62 2c 20 22 6d 61 69  TER, p->db, "mai
2f240 6e 22 2c 20 30 2c 20 31 29 3b 0a 20 20 20 20 20  n", 0, 1);.     
2f250 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61   goto meta_comma
2f260 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a 20  nd_exit;.    }. 
2f270 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65     zSql = sqlite
2f280 33 5f 6d 70 72 69 6e 74 66 28 22 53 45 4c 45 43  3_mprintf("SELEC
2f290 54 20 72 6f 6f 74 70 61 67 65 20 46 52 4f 4d 20  T rootpage FROM 
2f2a0 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 22 0a 20  sqlite_master". 
2f2b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f2c0 20 20 20 20 20 20 20 20 20 20 22 20 57 48 45 52            " WHER
2f2d0 45 20 6e 61 6d 65 3d 27 25 71 27 20 41 4e 44 20  E name='%q' AND 
2f2e0 74 79 70 65 3d 27 69 6e 64 65 78 27 22 2c 20 61  type='index'", a
2f2f0 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20 73 71  zArg[1]);.    sq
2f300 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32  lite3_prepare_v2
2f310 28 70 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31  (p->db, zSql, -1
2f320 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20  , &pStmt, 0);.  
2f330 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
2f340 53 71 6c 29 3b 0a 20 20 20 20 69 66 28 20 73 71  Sql);.    if( sq
2f350 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74  lite3_step(pStmt
2f360 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b  )==SQLITE_ROW ){
2f370 0a 20 20 20 20 20 20 74 6e 75 6d 20 3d 20 73 71  .      tnum = sq
2f380 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74  lite3_column_int
2f390 28 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20  (pStmt, 0);.    
2f3a0 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69  }.    sqlite3_fi
2f3b0 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20  nalize(pStmt);. 
2f3c0 20 20 20 69 66 28 20 74 6e 75 6d 3d 3d 30 20 29     if( tnum==0 )
2f3d0 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69  {.      utf8_pri
2f3e0 6e 74 66 28 73 74 64 65 72 72 2c 20 22 6e 6f 20  ntf(stderr, "no 
2f3f0 73 75 63 68 20 69 6e 64 65 78 3a 20 5c 22 25 73  such index: \"%s
2f400 5c 22 5c 6e 22 2c 20 61 7a 41 72 67 5b 31 5d 29  \"\n", azArg[1])
2f410 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a  ;.      rc = 1;.
2f420 20 20 20 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f        goto meta_
2f430 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20  command_exit;.  
2f440 20 20 7d 0a 20 20 20 20 7a 53 71 6c 20 3d 20 73    }.    zSql = s
2f450 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
2f460 50 52 41 47 4d 41 20 69 6e 64 65 78 5f 78 69 6e  PRAGMA index_xin
2f470 66 6f 3d 27 25 71 27 22 2c 20 61 7a 41 72 67 5b  fo='%q'", azArg[
2f480 31 5d 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  1]);.    rc = sq
2f490 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32  lite3_prepare_v2
2f4a0 28 70 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31  (p->db, zSql, -1
2f4b0 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20  , &pStmt, 0);.  
2f4c0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
2f4d0 53 71 6c 29 3b 0a 20 20 20 20 69 20 3d 20 30 3b  Sql);.    i = 0;
2f4e0 0a 20 20 20 20 77 68 69 6c 65 28 20 73 71 6c 69  .    while( sqli
2f4f0 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3d  te3_step(pStmt)=
2f500 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20  =SQLITE_ROW ){. 
2f510 20 20 20 20 20 63 68 61 72 20 7a 4c 61 62 65 6c       char zLabel
2f520 5b 32 30 5d 3b 0a 20 20 20 20 20 20 63 6f 6e 73  [20];.      cons
2f530 74 20 63 68 61 72 20 2a 7a 43 6f 6c 20 3d 20 28  t char *zCol = (
2f540 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69  const char*)sqli
2f550 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28  te3_column_text(
2f560 70 53 74 6d 74 2c 32 29 3b 0a 20 20 20 20 20 20  pStmt,2);.      
2f570 69 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 7a  i++;.      if( z
2f580 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Col==0 ){.      
2f590 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 63 6f    if( sqlite3_co
2f5a0 6c 75 6d 6e 5f 69 6e 74 28 70 53 74 6d 74 2c 31  lumn_int(pStmt,1
2f5b0 29 3d 3d 2d 31 20 29 7b 0a 20 20 20 20 20 20 20  )==-1 ){.       
2f5c0 20 20 20 7a 43 6f 6c 20 3d 20 22 5f 52 4f 57 49     zCol = "_ROWI
2f5d0 44 5f 22 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  D_";.        }el
2f5e0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71  se{.          sq
2f5f0 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
2f600 69 7a 65 6f 66 28 7a 4c 61 62 65 6c 29 2c 7a 4c  izeof(zLabel),zL
2f610 61 62 65 6c 2c 22 65 78 70 72 25 64 22 2c 69 29  abel,"expr%d",i)
2f620 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 43 6f 6c  ;.          zCol
2f630 20 3d 20 7a 4c 61 62 65 6c 3b 0a 20 20 20 20 20   = zLabel;.     
2f640 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
2f650 20 20 20 69 66 28 20 7a 43 6f 6c 6c 69 73 74 3d     if( zCollist=
2f660 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 43  =0 ){.        zC
2f670 6f 6c 6c 69 73 74 20 3d 20 73 71 6c 69 74 65 33  ollist = sqlite3
2f680 5f 6d 70 72 69 6e 74 66 28 22 5c 22 25 77 5c 22  _mprintf("\"%w\"
2f690 22 2c 20 7a 43 6f 6c 29 3b 0a 20 20 20 20 20 20  ", zCol);.      
2f6a0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a  }else{.        z
2f6b0 43 6f 6c 6c 69 73 74 20 3d 20 73 71 6c 69 74 65  Collist = sqlite
2f6c0 33 5f 6d 70 72 69 6e 74 66 28 22 25 7a 2c 5c 22  3_mprintf("%z,\"
2f6d0 25 77 5c 22 22 2c 20 7a 43 6f 6c 6c 69 73 74 2c  %w\"", zCollist,
2f6e0 20 7a 43 6f 6c 29 3b 0a 20 20 20 20 20 20 7d 0a   zCol);.      }.
2f6f0 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
2f700 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74  3_finalize(pStmt
2f710 29 3b 0a 20 20 20 20 7a 53 71 6c 20 3d 20 73 71  );.    zSql = sq
2f720 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20  lite3_mprintf(. 
2f730 20 20 20 20 20 20 20 20 20 22 43 52 45 41 54 45           "CREATE
2f740 20 54 41 42 4c 45 20 5c 22 25 77 5c 22 28 25 73   TABLE \"%w\"(%s
2f750 2c 50 52 49 4d 41 52 59 20 4b 45 59 28 25 73 29  ,PRIMARY KEY(%s)
2f760 29 57 49 54 48 4f 55 54 20 52 4f 57 49 44 22 2c  )WITHOUT ROWID",
2f770 0a 20 20 20 20 20 20 20 20 20 20 61 7a 41 72 67  .          azArg
2f780 5b 32 5d 2c 20 7a 43 6f 6c 6c 69 73 74 2c 20 7a  [2], zCollist, z
2f790 43 6f 6c 6c 69 73 74 29 3b 0a 20 20 20 20 73 71  Collist);.    sq
2f7a0 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6c 6c  lite3_free(zColl
2f7b0 69 73 74 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  ist);.    rc = s
2f7c0 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74  qlite3_test_cont
2f7d0 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43  rol(SQLITE_TESTC
2f7e0 54 52 4c 5f 49 4d 50 4f 53 54 45 52 2c 20 70 2d  TRL_IMPOSTER, p-
2f7f0 3e 64 62 2c 20 22 6d 61 69 6e 22 2c 20 31 2c 20  >db, "main", 1, 
2f800 74 6e 75 6d 29 3b 0a 20 20 20 20 69 66 28 20 72  tnum);.    if( r
2f810 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2f820 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
2f830 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20 7a  e3_exec(p->db, z
2f840 53 71 6c 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  Sql, 0, 0, 0);. 
2f850 20 20 20 20 20 73 71 6c 69 74 65 33 5f 74 65 73       sqlite3_tes
2f860 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45  t_control(SQLITE
2f870 5f 54 45 53 54 43 54 52 4c 5f 49 4d 50 4f 53 54  _TESTCTRL_IMPOST
2f880 45 52 2c 20 70 2d 3e 64 62 2c 20 22 6d 61 69 6e  ER, p->db, "main
2f890 22 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  ", 0, 0);.      
2f8a0 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
2f8b0 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74    utf8_printf(st
2f8c0 64 65 72 72 2c 20 22 45 72 72 6f 72 20 69 6e 20  derr, "Error in 
2f8d0 5b 25 73 5d 3a 20 25 73 5c 6e 22 2c 20 7a 53 71  [%s]: %s\n", zSq
2f8e0 6c 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73  l, sqlite3_errms
2f8f0 67 28 70 2d 3e 64 62 29 29 3b 0a 20 20 20 20 20  g(p->db));.     
2f900 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2f910 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 6f  utf8_printf(stdo
2f920 75 74 2c 20 22 25 73 3b 5c 6e 22 2c 20 7a 53 71  ut, "%s;\n", zSq
2f930 6c 29 3b 0a 20 20 20 20 20 20 20 20 72 61 77 5f  l);.        raw_
2f940 70 72 69 6e 74 66 28 73 74 64 6f 75 74 2c 0a 20  printf(stdout,. 
2f950 20 20 20 20 20 20 20 20 20 20 22 57 41 52 4e 49            "WARNI
2f960 4e 47 3a 20 77 72 69 74 69 6e 67 20 74 6f 20 61  NG: writing to a
2f970 6e 20 69 6d 70 6f 73 74 65 72 20 74 61 62 6c 65  n imposter table
2f980 20 77 69 6c 6c 20 63 6f 72 72 75 70 74 20 74 68   will corrupt th
2f990 65 20 69 6e 64 65 78 21 5c 6e 22 0a 20 20 20 20  e index!\n".    
2f9a0 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20      );.      }. 
2f9b0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2f9c0 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72  raw_printf(stder
2f9d0 72 2c 20 22 53 51 4c 49 54 45 5f 54 45 53 54 43  r, "SQLITE_TESTC
2f9e0 54 52 4c 5f 49 4d 50 4f 53 54 45 52 20 72 65 74  TRL_IMPOSTER ret
2f9f0 75 72 6e 73 20 25 64 5c 6e 22 2c 20 72 63 29 3b  urns %d\n", rc);
2fa00 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20  .      rc = 1;. 
2fa10 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
2fa20 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 7d  _free(zSql);.  }
2fa30 65 6c 73 65 0a 23 65 6e 64 69 66 20 2f 2a 20 21  else.#endif /* !
2fa40 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
2fa50 4d 49 54 5f 54 45 53 54 5f 43 4f 4e 54 52 4f 4c  MIT_TEST_CONTROL
2fa60 29 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c  ) */..#ifdef SQL
2fa70 49 54 45 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41  ITE_ENABLE_IOTRA
2fa80 43 45 0a 20 20 69 66 28 20 63 3d 3d 27 69 27 20  CE.  if( c=='i' 
2fa90 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67  && strncmp(azArg
2faa0 5b 30 5d 2c 20 22 69 6f 74 72 61 63 65 22 2c 20  [0], "iotrace", 
2fab0 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 53 51 4c  n)==0 ){.    SQL
2fac0 49 54 45 5f 41 50 49 20 65 78 74 65 72 6e 20 76  ITE_API extern v
2fad0 6f 69 64 20 28 53 51 4c 49 54 45 5f 43 44 45 43  oid (SQLITE_CDEC
2fae0 4c 20 2a 73 71 6c 69 74 65 33 49 6f 54 72 61 63  L *sqlite3IoTrac
2faf0 65 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 20  e)(const char*, 
2fb00 2e 2e 2e 29 3b 0a 20 20 20 20 69 66 28 20 69 6f  ...);.    if( io
2fb10 74 72 61 63 65 20 26 26 20 69 6f 74 72 61 63 65  trace && iotrace
2fb20 21 3d 73 74 64 6f 75 74 20 29 20 66 63 6c 6f 73  !=stdout ) fclos
2fb30 65 28 69 6f 74 72 61 63 65 29 3b 0a 20 20 20 20  e(iotrace);.    
2fb40 69 6f 74 72 61 63 65 20 3d 20 30 3b 0a 20 20 20  iotrace = 0;.   
2fb50 20 69 66 28 20 6e 41 72 67 3c 32 20 29 7b 0a 20   if( nArg<2 ){. 
2fb60 20 20 20 20 20 73 71 6c 69 74 65 33 49 6f 54 72       sqlite3IoTr
2fb70 61 63 65 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  ace = 0;.    }el
2fb80 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 61 7a  se if( strcmp(az
2fb90 41 72 67 5b 31 5d 2c 20 22 2d 22 29 3d 3d 30 20  Arg[1], "-")==0 
2fba0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
2fbb0 49 6f 54 72 61 63 65 20 3d 20 69 6f 74 72 61 63  IoTrace = iotrac
2fbc0 65 50 72 69 6e 74 66 3b 0a 20 20 20 20 20 20 69  ePrintf;.      i
2fbd0 6f 74 72 61 63 65 20 3d 20 73 74 64 6f 75 74 3b  otrace = stdout;
2fbe0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
2fbf0 20 20 69 6f 74 72 61 63 65 20 3d 20 66 6f 70 65    iotrace = fope
2fc00 6e 28 61 7a 41 72 67 5b 31 5d 2c 20 22 77 22 29  n(azArg[1], "w")
2fc10 3b 0a 20 20 20 20 20 20 69 66 28 20 69 6f 74 72  ;.      if( iotr
2fc20 61 63 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ace==0 ){.      
2fc30 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74    utf8_printf(st
2fc40 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 63 61  derr, "Error: ca
2fc50 6e 6e 6f 74 20 6f 70 65 6e 20 5c 22 25 73 5c 22  nnot open \"%s\"
2fc60 5c 6e 22 2c 20 61 7a 41 72 67 5b 31 5d 29 3b 0a  \n", azArg[1]);.
2fc70 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 49          sqlite3I
2fc80 6f 54 72 61 63 65 20 3d 20 30 3b 0a 20 20 20 20  oTrace = 0;.    
2fc90 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
2fca0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2fcb0 20 73 71 6c 69 74 65 33 49 6f 54 72 61 63 65 20   sqlite3IoTrace 
2fcc0 3d 20 69 6f 74 72 61 63 65 50 72 69 6e 74 66 3b  = iotracePrintf;
2fcd0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
2fce0 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 0a 20   }else.#endif.. 
2fcf0 20 69 66 28 20 63 3d 3d 27 6c 27 20 26 26 20 6e   if( c=='l' && n
2fd00 3e 3d 35 20 26 26 20 73 74 72 6e 63 6d 70 28 61  >=5 && strncmp(a
2fd10 7a 41 72 67 5b 30 5d 2c 20 22 6c 69 6d 69 74 73  zArg[0], "limits
2fd20 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ", n)==0 ){.    
2fd30 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72  static const str
2fd40 75 63 74 20 7b 0a 20 20 20 20 20 20 20 63 6f 6e  uct {.       con
2fd50 73 74 20 63 68 61 72 20 2a 7a 4c 69 6d 69 74 4e  st char *zLimitN
2fd60 61 6d 65 3b 20 20 20 2f 2a 20 4e 61 6d 65 20 6f  ame;   /* Name o
2fd70 66 20 61 20 6c 69 6d 69 74 20 2a 2f 0a 20 20 20  f a limit */.   
2fd80 20 20 20 20 69 6e 74 20 6c 69 6d 69 74 43 6f 64      int limitCod
2fd90 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
2fda0 20 49 6e 74 65 67 65 72 20 63 6f 64 65 20 66 6f   Integer code fo
2fdb0 72 20 74 68 61 74 20 6c 69 6d 69 74 20 2a 2f 0a  r that limit */.
2fdc0 20 20 20 20 7d 20 61 4c 69 6d 69 74 5b 5d 20 3d      } aLimit[] =
2fdd0 20 7b 0a 20 20 20 20 20 20 7b 20 22 6c 65 6e 67   {.      { "leng
2fde0 74 68 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  th",            
2fdf0 20 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54      SQLITE_LIMIT
2fe00 5f 4c 45 4e 47 54 48 20 20 20 20 20 20 20 20 20  _LENGTH         
2fe10 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
2fe20 20 20 20 20 7b 20 22 73 71 6c 5f 6c 65 6e 67 74      { "sql_lengt
2fe30 68 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 53  h",            S
2fe40 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 53 51 4c 5f  QLITE_LIMIT_SQL_
2fe50 4c 45 4e 47 54 48 20 20 20 20 20 20 20 20 20 20  LENGTH          
2fe60 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b        },.      {
2fe70 20 22 63 6f 6c 75 6d 6e 22 2c 20 20 20 20 20 20   "column",      
2fe80 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
2fe90 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 20 20 20  _LIMIT_COLUMN   
2fea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2feb0 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 65 78 70   },.      { "exp
2fec0 72 5f 64 65 70 74 68 22 2c 20 20 20 20 20 20 20  r_depth",       
2fed0 20 20 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49       SQLITE_LIMI
2fee0 54 5f 45 58 50 52 5f 44 45 50 54 48 20 20 20 20  T_EXPR_DEPTH    
2fef0 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
2ff00 20 20 20 20 20 7b 20 22 63 6f 6d 70 6f 75 6e 64       { "compound
2ff10 5f 73 65 6c 65 63 74 22 2c 20 20 20 20 20 20 20  _select",       
2ff20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4d  SQLITE_LIMIT_COM
2ff30 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20 20 20 20  POUND_SELECT    
2ff40 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20         },.      
2ff50 7b 20 22 76 64 62 65 5f 6f 70 22 2c 20 20 20 20  { "vdbe_op",    
2ff60 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
2ff70 45 5f 4c 49 4d 49 54 5f 56 44 42 45 5f 4f 50 20  E_LIMIT_VDBE_OP 
2ff80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ff90 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 66 75    },.      { "fu
2ffa0 6e 63 74 69 6f 6e 5f 61 72 67 22 2c 20 20 20 20  nction_arg",    
2ffb0 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d        SQLITE_LIM
2ffc0 49 54 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47 20  IT_FUNCTION_ARG 
2ffd0 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
2ffe0 20 20 20 20 20 20 7b 20 22 61 74 74 61 63 68 65        { "attache
2fff0 64 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  d",             
30000 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 41 54   SQLITE_LIMIT_AT
30010 54 41 43 48 45 44 20 20 20 20 20 20 20 20 20 20  TACHED          
30020 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20          },.     
30030 20 7b 20 22 6c 69 6b 65 5f 70 61 74 74 65 72 6e   { "like_pattern
30040 5f 6c 65 6e 67 74 68 22 2c 20 20 20 53 51 4c 49  _length",   SQLI
30050 54 45 5f 4c 49 4d 49 54 5f 4c 49 4b 45 5f 50 41  TE_LIMIT_LIKE_PA
30060 54 54 45 52 4e 5f 4c 45 4e 47 54 48 20 20 20 20  TTERN_LENGTH    
30070 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 76     },.      { "v
30080 61 72 69 61 62 6c 65 5f 6e 75 6d 62 65 72 22 2c  ariable_number",
30090 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4c 49         SQLITE_LI
300a0 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d  MIT_VARIABLE_NUM
300b0 42 45 52 20 20 20 20 20 20 20 20 20 20 20 7d 2c  BER           },
300c0 0a 20 20 20 20 20 20 7b 20 22 74 72 69 67 67 65  .      { "trigge
300d0 72 5f 64 65 70 74 68 22 2c 20 20 20 20 20 20 20  r_depth",       
300e0 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 54    SQLITE_LIMIT_T
300f0 52 49 47 47 45 52 5f 44 45 50 54 48 20 20 20 20  RIGGER_DEPTH    
30100 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
30110 20 20 7b 20 22 77 6f 72 6b 65 72 5f 74 68 72 65    { "worker_thre
30120 61 64 73 22 2c 20 20 20 20 20 20 20 20 53 51 4c  ads",        SQL
30130 49 54 45 5f 4c 49 4d 49 54 5f 57 4f 52 4b 45 52  ITE_LIMIT_WORKER
30140 5f 54 48 52 45 41 44 53 20 20 20 20 20 20 20 20  _THREADS        
30150 20 20 20 20 7d 2c 0a 20 20 20 20 7d 3b 0a 20 20      },.    };.  
30160 20 20 69 6e 74 20 69 2c 20 6e 32 3b 0a 20 20 20    int i, n2;.   
30170 20 6f 70 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a   open_db(p, 0);.
30180 20 20 20 20 69 66 28 20 6e 41 72 67 3d 3d 31 20      if( nArg==1 
30190 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  ){.      for(i=0
301a0 3b 20 69 3c 41 72 72 61 79 53 69 7a 65 28 61 4c  ; i<ArraySize(aL
301b0 69 6d 69 74 29 3b 20 69 2b 2b 29 7b 0a 20 20 20  imit); i++){.   
301c0 20 20 20 20 20 70 72 69 6e 74 66 28 22 25 32 30       printf("%20
301d0 73 20 25 64 5c 6e 22 2c 20 61 4c 69 6d 69 74 5b  s %d\n", aLimit[
301e0 69 5d 2e 7a 4c 69 6d 69 74 4e 61 6d 65 2c 0a 20  i].zLimitName,. 
301f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
30200 6c 69 74 65 33 5f 6c 69 6d 69 74 28 70 2d 3e 64  lite3_limit(p->d
30210 62 2c 20 61 4c 69 6d 69 74 5b 69 5d 2e 6c 69 6d  b, aLimit[i].lim
30220 69 74 43 6f 64 65 2c 20 2d 31 29 29 3b 0a 20 20  itCode, -1));.  
30230 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20      }.    }else 
30240 69 66 28 20 6e 41 72 67 3e 33 20 29 7b 0a 20 20  if( nArg>3 ){.  
30250 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73      raw_printf(s
30260 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e  tderr, "Usage: .
30270 6c 69 6d 69 74 20 4e 41 4d 45 20 3f 4e 45 57 2d  limit NAME ?NEW-
30280 56 41 4c 55 45 3f 5c 6e 22 29 3b 0a 20 20 20 20  VALUE?\n");.    
30290 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20    rc = 1;.      
302a0 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e  goto meta_comman
302b0 64 5f 65 78 69 74 3b 0a 20 20 20 20 7d 65 6c 73  d_exit;.    }els
302c0 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 4c 69  e{.      int iLi
302d0 6d 69 74 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20  mit = -1;.      
302e0 6e 32 20 3d 20 73 74 72 6c 65 6e 33 30 28 61 7a  n2 = strlen30(az
302f0 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20 20 20 66  Arg[1]);.      f
30300 6f 72 28 69 3d 30 3b 20 69 3c 41 72 72 61 79 53  or(i=0; i<ArrayS
30310 69 7a 65 28 61 4c 69 6d 69 74 29 3b 20 69 2b 2b  ize(aLimit); i++
30320 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  ){.        if( s
30330 71 6c 69 74 65 33 5f 73 74 72 6e 69 63 6d 70 28  qlite3_strnicmp(
30340 61 4c 69 6d 69 74 5b 69 5d 2e 7a 4c 69 6d 69 74  aLimit[i].zLimit
30350 4e 61 6d 65 2c 20 61 7a 41 72 67 5b 31 5d 2c 20  Name, azArg[1], 
30360 6e 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  n2)==0 ){.      
30370 20 20 20 20 69 66 28 20 69 4c 69 6d 69 74 3c 30      if( iLimit<0
30380 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
30390 69 4c 69 6d 69 74 20 3d 20 69 3b 0a 20 20 20 20  iLimit = i;.    
303a0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
303b0 20 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72           utf8_pr
303c0 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 61 6d  intf(stderr, "am
303d0 62 69 67 75 6f 75 73 20 6c 69 6d 69 74 3a 20 5c  biguous limit: \
303e0 22 25 73 5c 22 5c 6e 22 2c 20 61 7a 41 72 67 5b  "%s\"\n", azArg[
303f0 31 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  1]);.           
30400 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20   rc = 1;.       
30410 20 20 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63       goto meta_c
30420 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20  ommand_exit;.   
30430 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
30440 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
30450 20 69 66 28 20 69 4c 69 6d 69 74 3c 30 20 29 7b   if( iLimit<0 ){
30460 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72  .        utf8_pr
30470 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 75 6e  intf(stderr, "un
30480 6b 6e 6f 77 6e 20 6c 69 6d 69 74 3a 20 5c 22 25  known limit: \"%
30490 73 5c 22 5c 6e 22 0a 20 20 20 20 20 20 20 20 20  s\"\n".         
304a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
304b0 65 6e 74 65 72 20 5c 22 2e 6c 69 6d 69 74 73 5c  enter \".limits\
304c0 22 20 77 69 74 68 20 6e 6f 20 61 72 67 75 6d 65  " with no argume
304d0 6e 74 73 20 66 6f 72 20 61 20 6c 69 73 74 2e 5c  nts for a list.\
304e0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
304f0 20 20 20 20 20 20 20 20 20 20 20 20 20 61 7a 41               azA
30500 72 67 5b 31 5d 29 3b 0a 20 20 20 20 20 20 20 20  rg[1]);.        
30510 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  rc = 1;.        
30520 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e  goto meta_comman
30530 64 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 7d 0a  d_exit;.      }.
30540 20 20 20 20 20 20 69 66 28 20 6e 41 72 67 3d 3d        if( nArg==
30550 33 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  3 ){.        sql
30560 69 74 65 33 5f 6c 69 6d 69 74 28 70 2d 3e 64 62  ite3_limit(p->db
30570 2c 20 61 4c 69 6d 69 74 5b 69 4c 69 6d 69 74 5d  , aLimit[iLimit]
30580 2e 6c 69 6d 69 74 43 6f 64 65 2c 0a 20 20 20 20  .limitCode,.    
30590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
305a0 20 20 28 69 6e 74 29 69 6e 74 65 67 65 72 56 61    (int)integerVa
305b0 6c 75 65 28 61 7a 41 72 67 5b 32 5d 29 29 3b 0a  lue(azArg[2]));.
305c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 72        }.      pr
305d0 69 6e 74 66 28 22 25 32 30 73 20 25 64 5c 6e 22  intf("%20s %d\n"
305e0 2c 20 61 4c 69 6d 69 74 5b 69 4c 69 6d 69 74 5d  , aLimit[iLimit]
305f0 2e 7a 4c 69 6d 69 74 4e 61 6d 65 2c 0a 20 20 20  .zLimitName,.   
30600 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
30610 33 5f 6c 69 6d 69 74 28 70 2d 3e 64 62 2c 20 61  3_limit(p->db, a
30620 4c 69 6d 69 74 5b 69 4c 69 6d 69 74 5d 2e 6c 69  Limit[iLimit].li
30630 6d 69 74 43 6f 64 65 2c 20 2d 31 29 29 3b 0a 20  mitCode, -1));. 
30640 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20     }.  }else..  
30650 69 66 28 20 63 3d 3d 27 6c 27 20 26 26 20 6e 3e  if( c=='l' && n>
30660 32 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41  2 && strncmp(azA
30670 72 67 5b 30 5d 2c 20 22 6c 69 6e 74 22 2c 20 6e  rg[0], "lint", n
30680 29 3d 3d 30 20 29 7b 0a 20 20 20 20 6f 70 65 6e  )==0 ){.    open
30690 5f 64 62 28 70 2c 20 30 29 3b 0a 20 20 20 20 6c  _db(p, 0);.    l
306a0 69 6e 74 44 6f 74 43 6f 6d 6d 61 6e 64 28 70 2c  intDotCommand(p,
306b0 20 61 7a 41 72 67 2c 20 6e 41 72 67 29 3b 0a 20   azArg, nArg);. 
306c0 20 7d 65 6c 73 65 0a 0a 23 69 66 6e 64 65 66 20   }else..#ifndef 
306d0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44  SQLITE_OMIT_LOAD
306e0 5f 45 58 54 45 4e 53 49 4f 4e 0a 20 20 69 66 28  _EXTENSION.  if(
306f0 20 63 3d 3d 27 6c 27 20 26 26 20 73 74 72 6e 63   c=='l' && strnc
30700 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 6c 6f  mp(azArg[0], "lo
30710 61 64 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20  ad", n)==0 ){.  
30720 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
30730 69 6c 65 2c 20 2a 7a 50 72 6f 63 3b 0a 20 20 20  ile, *zProc;.   
30740 20 63 68 61 72 20 2a 7a 45 72 72 4d 73 67 20 3d   char *zErrMsg =
30750 20 30 3b 0a 20 20 20 20 69 66 28 20 6e 41 72 67   0;.    if( nArg
30760 3c 32 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f  <2 ){.      raw_
30770 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
30780 55 73 61 67 65 3a 20 2e 6c 6f 61 64 20 46 49 4c  Usage: .load FIL
30790 45 20 3f 45 4e 54 52 59 50 4f 49 4e 54 3f 5c 6e  E ?ENTRYPOINT?\n
307a0 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31  ");.      rc = 1
307b0 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 65 74  ;.      goto met
307c0 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a  a_command_exit;.
307d0 20 20 20 20 7d 0a 20 20 20 20 7a 46 69 6c 65 20      }.    zFile 
307e0 3d 20 61 7a 41 72 67 5b 31 5d 3b 0a 20 20 20 20  = azArg[1];.    
307f0 7a 50 72 6f 63 20 3d 20 6e 41 72 67 3e 3d 33 20  zProc = nArg>=3 
30800 3f 20 61 7a 41 72 67 5b 32 5d 20 3a 20 30 3b 0a  ? azArg[2] : 0;.
30810 20 20 20 20 6f 70 65 6e 5f 64 62 28 70 2c 20 30      open_db(p, 0
30820 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
30830 74 65 33 5f 6c 6f 61 64 5f 65 78 74 65 6e 73 69  te3_load_extensi
30840 6f 6e 28 70 2d 3e 64 62 2c 20 7a 46 69 6c 65 2c  on(p->db, zFile,
30850 20 7a 50 72 6f 63 2c 20 26 7a 45 72 72 4d 73 67   zProc, &zErrMsg
30860 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
30870 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
30880 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74    utf8_printf(st
30890 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 25 73  derr, "Error: %s
308a0 5c 6e 22 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20  \n", zErrMsg);. 
308b0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
308c0 65 28 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20  e(zErrMsg);.    
308d0 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a    rc = 1;.    }.
308e0 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 0a    }else.#endif..
308f0 20 20 69 66 28 20 63 3d 3d 27 6c 27 20 26 26 20    if( c=='l' && 
30900 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d  strncmp(azArg[0]
30910 2c 20 22 6c 6f 67 22 2c 20 6e 29 3d 3d 30 20 29  , "log", n)==0 )
30920 7b 0a 20 20 20 20 69 66 28 20 6e 41 72 67 21 3d  {.    if( nArg!=
30930 32 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70  2 ){.      raw_p
30940 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55  rintf(stderr, "U
30950 73 61 67 65 3a 20 2e 6c 6f 67 20 46 49 4c 45 4e  sage: .log FILEN
30960 41 4d 45 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72  AME\n");.      r
30970 63 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65  c = 1;.    }else
30980 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  {.      const ch
30990 61 72 20 2a 7a 46 69 6c 65 20 3d 20 61 7a 41 72  ar *zFile = azAr
309a0 67 5b 31 5d 3b 0a 20 20 20 20 20 20 6f 75 74 70  g[1];.      outp
309b0 75 74 5f 66 69 6c 65 5f 63 6c 6f 73 65 28 70 2d  ut_file_close(p-
309c0 3e 70 4c 6f 67 29 3b 0a 20 20 20 20 20 20 70 2d  >pLog);.      p-
309d0 3e 70 4c 6f 67 20 3d 20 6f 75 74 70 75 74 5f 66  >pLog = output_f
309e0 69 6c 65 5f 6f 70 65 6e 28 7a 46 69 6c 65 2c 20  ile_open(zFile, 
309f0 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  0);.    }.  }els
30a00 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 6d 27 20  e..  if( c=='m' 
30a10 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67  && strncmp(azArg
30a20 5b 30 5d 2c 20 22 6d 6f 64 65 22 2c 20 6e 29 3d  [0], "mode", n)=
30a30 3d 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  =0 ){.    const 
30a40 63 68 61 72 20 2a 7a 4d 6f 64 65 20 3d 20 6e 41  char *zMode = nA
30a50 72 67 3e 3d 32 20 3f 20 61 7a 41 72 67 5b 31 5d  rg>=2 ? azArg[1]
30a60 20 3a 20 22 22 3b 0a 20 20 20 20 69 6e 74 20 6e   : "";.    int n
30a70 32 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a 4d 6f  2 = strlen30(zMo
30a80 64 65 29 3b 0a 20 20 20 20 69 6e 74 20 63 32 20  de);.    int c2 
30a90 3d 20 7a 4d 6f 64 65 5b 30 5d 3b 0a 20 20 20 20  = zMode[0];.    
30aa0 69 66 28 20 63 32 3d 3d 27 6c 27 20 26 26 20 6e  if( c2=='l' && n
30ab0 32 3e 32 20 26 26 20 73 74 72 6e 63 6d 70 28 61  2>2 && strncmp(a
30ac0 7a 41 72 67 5b 31 5d 2c 22 6c 69 6e 65 73 22 2c  zArg[1],"lines",
30ad0 6e 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  n2)==0 ){.      
30ae0 70 2d 3e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 4c  p->mode = MODE_L
30af0 69 6e 65 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ine;.      sqlit
30b00 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
30b10 6f 66 28 70 2d 3e 72 6f 77 53 65 70 61 72 61 74  of(p->rowSeparat
30b20 6f 72 29 2c 20 70 2d 3e 72 6f 77 53 65 70 61 72  or), p->rowSepar
30b30 61 74 6f 72 2c 20 53 45 50 5f 52 6f 77 29 3b 0a  ator, SEP_Row);.
30b40 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 32      }else if( c2
30b50 3d 3d 27 63 27 20 26 26 20 73 74 72 6e 63 6d 70  =='c' && strncmp
30b60 28 61 7a 41 72 67 5b 31 5d 2c 22 63 6f 6c 75 6d  (azArg[1],"colum
30b70 6e 73 22 2c 6e 32 29 3d 3d 30 20 29 7b 0a 20 20  ns",n2)==0 ){.  
30b80 20 20 20 20 70 2d 3e 6d 6f 64 65 20 3d 20 4d 4f      p->mode = MO
30b90 44 45 5f 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20  DE_Column;.     
30ba0 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
30bb0 66 28 73 69 7a 65 6f 66 28 70 2d 3e 72 6f 77 53  f(sizeof(p->rowS
30bc0 65 70 61 72 61 74 6f 72 29 2c 20 70 2d 3e 72 6f  eparator), p->ro
30bd0 77 53 65 70 61 72 61 74 6f 72 2c 20 53 45 50 5f  wSeparator, SEP_
30be0 52 6f 77 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  Row);.    }else 
30bf0 69 66 28 20 63 32 3d 3d 27 6c 27 20 26 26 20 6e  if( c2=='l' && n
30c00 32 3e 32 20 26 26 20 73 74 72 6e 63 6d 70 28 61  2>2 && strncmp(a
30c10 7a 41 72 67 5b 31 5d 2c 22 6c 69 73 74 22 2c 6e  zArg[1],"list",n
30c20 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  2)==0 ){.      p
30c30 2d 3e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 4c 69  ->mode = MODE_Li
30c40 73 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  st;.      sqlite
30c50 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
30c60 66 28 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f  f(p->colSeparato
30c70 72 29 2c 20 70 2d 3e 63 6f 6c 53 65 70 61 72 61  r), p->colSepara
30c80 74 6f 72 2c 20 53 45 50 5f 43 6f 6c 75 6d 6e 29  tor, SEP_Column)
30c90 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
30ca0 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
30cb0 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 29  p->rowSeparator)
30cc0 2c 20 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f  , p->rowSeparato
30cd0 72 2c 20 53 45 50 5f 52 6f 77 29 3b 0a 20 20 20  r, SEP_Row);.   
30ce0 20 7d 65 6c 73 65 20 69 66 28 20 63 32 3d 3d 27   }else if( c2=='
30cf0 68 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a  h' && strncmp(az
30d00 41 72 67 5b 31 5d 2c 22 68 74 6d 6c 22 2c 6e 32  Arg[1],"html",n2
30d10 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d  )==0 ){.      p-
30d20 3e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 48 74 6d  >mode = MODE_Htm
30d30 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  l;.    }else if(
30d40 20 63 32 3d 3d 27 74 27 20 26 26 20 73 74 72 6e   c2=='t' && strn
30d50 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 22 74 63  cmp(azArg[1],"tc
30d60 6c 22 2c 6e 32 29 3d 3d 30 20 29 7b 0a 20 20 20  l",n2)==0 ){.   
30d70 20 20 20 70 2d 3e 6d 6f 64 65 20 3d 20 4d 4f 44     p->mode = MOD
30d80 45 5f 54 63 6c 3b 0a 20 20 20 20 20 20 73 71 6c  E_Tcl;.      sql
30d90 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
30da0 7a 65 6f 66 28 70 2d 3e 63 6f 6c 53 65 70 61 72  zeof(p->colSepar
30db0 61 74 6f 72 29 2c 20 70 2d 3e 63 6f 6c 53 65 70  ator), p->colSep
30dc0 61 72 61 74 6f 72 2c 20 53 45 50 5f 53 70 61 63  arator, SEP_Spac
30dd0 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  e);.      sqlite
30de0 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
30df0 66 28 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f  f(p->rowSeparato
30e00 72 29 2c 20 70 2d 3e 72 6f 77 53 65 70 61 72 61  r), p->rowSepara
30e10 74 6f 72 2c 20 53 45 50 5f 52 6f 77 29 3b 0a 20  tor, SEP_Row);. 
30e20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 32 3d     }else if( c2=
30e30 3d 27 63 27 20 26 26 20 73 74 72 6e 63 6d 70 28  ='c' && strncmp(
30e40 61 7a 41 72 67 5b 31 5d 2c 22 63 73 76 22 2c 6e  azArg[1],"csv",n
30e50 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  2)==0 ){.      p
30e60 2d 3e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 43 73  ->mode = MODE_Cs
30e70 76 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  v;.      sqlite3
30e80 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66  _snprintf(sizeof
30e90 28 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72  (p->colSeparator
30ea0 29 2c 20 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74  ), p->colSeparat
30eb0 6f 72 2c 20 53 45 50 5f 43 6f 6d 6d 61 29 3b 0a  or, SEP_Comma);.
30ec0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
30ed0 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 70 2d  printf(sizeof(p-
30ee0 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 29 2c 20  >rowSeparator), 
30ef0 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 2c  p->rowSeparator,
30f00 20 53 45 50 5f 43 72 4c 66 29 3b 0a 20 20 20 20   SEP_CrLf);.    
30f10 7d 65 6c 73 65 20 69 66 28 20 63 32 3d 3d 27 74  }else if( c2=='t
30f20 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41  ' && strncmp(azA
30f30 72 67 5b 31 5d 2c 22 74 61 62 73 22 2c 6e 32 29  rg[1],"tabs",n2)
30f40 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  ==0 ){.      p->
30f50 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 4c 69 73 74  mode = MODE_List
30f60 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
30f70 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
30f80 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 29  p->colSeparator)
30f90 2c 20 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f  , p->colSeparato
30fa0 72 2c 20 53 45 50 5f 54 61 62 29 3b 0a 20 20 20  r, SEP_Tab);.   
30fb0 20 7d 65 6c 73 65 20 69 66 28 20 63 32 3d 3d 27   }else if( c2=='
30fc0 69 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a  i' && strncmp(az
30fd0 41 72 67 5b 31 5d 2c 22 69 6e 73 65 72 74 22 2c  Arg[1],"insert",
30fe0 6e 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  n2)==0 ){.      
30ff0 70 2d 3e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 49  p->mode = MODE_I
31000 6e 73 65 72 74 3b 0a 20 20 20 20 20 20 73 65 74  nsert;.      set
31010 5f 74 61 62 6c 65 5f 6e 61 6d 65 28 70 2c 20 6e  _table_name(p, n
31020 41 72 67 3e 3d 33 20 3f 20 61 7a 41 72 67 5b 32  Arg>=3 ? azArg[2
31030 5d 20 3a 20 22 74 61 62 6c 65 22 29 3b 0a 20 20  ] : "table");.  
31040 20 20 7d 65 6c 73 65 20 69 66 28 20 63 32 3d 3d    }else if( c2==
31050 27 71 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61  'q' && strncmp(a
31060 7a 41 72 67 5b 31 5d 2c 22 71 75 6f 74 65 22 2c  zArg[1],"quote",
31070 6e 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  n2)==0 ){.      
31080 70 2d 3e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 51  p->mode = MODE_Q
31090 75 6f 74 65 3b 0a 20 20 20 20 7d 65 6c 73 65 20  uote;.    }else 
310a0 69 66 28 20 63 32 3d 3d 27 61 27 20 26 26 20 73  if( c2=='a' && s
310b0 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c  trncmp(azArg[1],
310c0 22 61 73 63 69 69 22 2c 6e 32 29 3d 3d 30 20 29  "ascii",n2)==0 )
310d0 7b 0a 20 20 20 20 20 20 70 2d 3e 6d 6f 64 65 20  {.      p->mode 
310e0 3d 20 4d 4f 44 45 5f 41 73 63 69 69 3b 0a 20 20  = MODE_Ascii;.  
310f0 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
31100 69 6e 74 66 28 73 69 7a 65 6f 66 28 70 2d 3e 63  intf(sizeof(p->c
31110 6f 6c 53 65 70 61 72 61 74 6f 72 29 2c 20 70 2d  olSeparator), p-
31120 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 2c 20 53  >colSeparator, S
31130 45 50 5f 55 6e 69 74 29 3b 0a 20 20 20 20 20 20  EP_Unit);.      
31140 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
31150 28 73 69 7a 65 6f 66 28 70 2d 3e 72 6f 77 53 65  (sizeof(p->rowSe
31160 70 61 72 61 74 6f 72 29 2c 20 70 2d 3e 72 6f 77  parator), p->row
31170 53 65 70 61 72 61 74 6f 72 2c 20 53 45 50 5f 52  Separator, SEP_R
31180 65 63 6f 72 64 29 3b 0a 20 20 20 20 7d 65 6c 73  ecord);.    }els
31190 65 20 69 66 28 20 6e 41 72 67 3d 3d 31 20 29 7b  e if( nArg==1 ){
311a0 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74  .      raw_print
311b0 66 28 70 2d 3e 6f 75 74 2c 20 22 63 75 72 72 65  f(p->out, "curre
311c0 6e 74 20 6f 75 74 70 75 74 20 6d 6f 64 65 3a 20  nt output mode: 
311d0 25 73 5c 6e 22 2c 20 6d 6f 64 65 44 65 73 63 72  %s\n", modeDescr
311e0 5b 70 2d 3e 6d 6f 64 65 5d 29 3b 0a 20 20 20 20  [p->mode]);.    
311f0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 61 77  }else{.      raw
31200 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
31210 22 45 72 72 6f 72 3a 20 6d 6f 64 65 20 73 68 6f  "Error: mode sho
31220 75 6c 64 20 62 65 20 6f 6e 65 20 6f 66 3a 20 22  uld be one of: "
31230 0a 20 20 20 20 20 20 20 20 20 22 61 73 63 69 69  .         "ascii
31240 20 63 6f 6c 75 6d 6e 20 63 73 76 20 68 74 6d 6c   column csv html
31250 20 69 6e 73 65 72 74 20 6c 69 6e 65 20 6c 69 73   insert line lis
31260 74 20 71 75 6f 74 65 20 74 61 62 73 20 74 63 6c  t quote tabs tcl
31270 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  \n");.      rc =
31280 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d   1;.    }.    p-
31290 3e 63 4d 6f 64 65 20 3d 20 70 2d 3e 6d 6f 64 65  >cMode = p->mode
312a0 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28  ;.  }else..  if(
312b0 20 63 3d 3d 27 6e 27 20 26 26 20 73 74 72 6e 63   c=='n' && strnc
312c0 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 6e 75  mp(azArg[0], "nu
312d0 6c 6c 76 61 6c 75 65 22 2c 20 6e 29 3d 3d 30 20  llvalue", n)==0 
312e0 29 7b 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3d  ){.    if( nArg=
312f0 3d 32 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =2 ){.      sqli
31300 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
31310 65 6f 66 28 70 2d 3e 6e 75 6c 6c 56 61 6c 75 65  eof(p->nullValue
31320 29 2c 20 70 2d 3e 6e 75 6c 6c 56 61 6c 75 65 2c  ), p->nullValue,
31330 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
31340 20 20 20 20 20 20 20 20 22 25 2e 2a 73 22 2c 20          "%.*s", 
31350 28 69 6e 74 29 41 72 72 61 79 53 69 7a 65 28 70  (int)ArraySize(p
31360 2d 3e 6e 75 6c 6c 56 61 6c 75 65 29 2d 31 2c 20  ->nullValue)-1, 
31370 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20 7d  azArg[1]);.    }
31380 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 61 77 5f  else{.      raw_
31390 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
313a0 55 73 61 67 65 3a 20 2e 6e 75 6c 6c 76 61 6c 75  Usage: .nullvalu
313b0 65 20 53 54 52 49 4e 47 5c 6e 22 29 3b 0a 20 20  e STRING\n");.  
313c0 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
313d0 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28  }.  }else..  if(
313e0 20 63 3d 3d 27 6f 27 20 26 26 20 73 74 72 6e 63   c=='o' && strnc
313f0 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 6f 70  mp(azArg[0], "op
31400 65 6e 22 2c 20 6e 29 3d 3d 30 20 26 26 20 6e 3e  en", n)==0 && n>
31410 3d 32 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a  =2 ){.    char *
31420 7a 4e 65 77 46 69 6c 65 6e 61 6d 65 3b 20 20 2f  zNewFilename;  /
31430 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61  * Name of the da
31440 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 6f  tabase file to o
31450 70 65 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  pen */.    int i
31460 4e 61 6d 65 20 3d 20 31 3b 20 20 20 20 20 20 20  Name = 1;       
31470 2f 2a 20 49 6e 64 65 78 20 69 6e 20 61 7a 41 72  /* Index in azAr
31480 67 5b 5d 20 6f 66 20 74 68 65 20 66 69 6c 65 6e  g[] of the filen
31490 61 6d 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  ame */.    int n
314a0 65 77 46 6c 61 67 20 3d 20 30 3b 20 20 20 20 20  ewFlag = 0;     
314b0 2f 2a 20 54 72 75 65 20 74 6f 20 64 65 6c 65 74  /* True to delet
314c0 65 20 66 69 6c 65 20 62 65 66 6f 72 65 20 6f 70  e file before op
314d0 65 6e 69 6e 67 20 2a 2f 0a 20 20 20 20 2f 2a 20  ening */.    /* 
314e0 43 6c 6f 73 65 20 74 68 65 20 65 78 69 73 74 69  Close the existi
314f0 6e 67 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  ng database */. 
31500 20 20 20 73 65 73 73 69 6f 6e 5f 63 6c 6f 73 65     session_close
31510 5f 61 6c 6c 28 70 29 3b 0a 20 20 20 20 73 71 6c  _all(p);.    sql
31520 69 74 65 33 5f 63 6c 6f 73 65 28 70 2d 3e 64 62  ite3_close(p->db
31530 29 3b 0a 20 20 20 20 70 2d 3e 64 62 20 3d 20 30  );.    p->db = 0
31540 3b 0a 20 20 20 20 70 2d 3e 7a 44 62 46 69 6c 65  ;.    p->zDbFile
31550 6e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 73 71  name = 0;.    sq
31560 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 7a 46  lite3_free(p->zF
31570 72 65 65 4f 6e 43 6c 6f 73 65 29 3b 0a 20 20 20  reeOnClose);.   
31580 20 70 2d 3e 7a 46 72 65 65 4f 6e 43 6c 6f 73 65   p->zFreeOnClose
31590 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 6f 70 65   = 0;.    p->ope
315a0 6e 4d 6f 64 65 20 3d 20 53 48 45 4c 4c 5f 4f 50  nMode = SHELL_OP
315b0 45 4e 5f 55 4e 53 50 45 43 3b 0a 20 20 20 20 2f  EN_UNSPEC;.    /
315c0 2a 20 43 68 65 63 6b 20 66 6f 72 20 63 6f 6d 6d  * Check for comm
315d0 61 6e 64 2d 6c 69 6e 65 20 61 72 67 75 6d 65 6e  and-line argumen
315e0 74 73 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 4e  ts */.    for(iN
315f0 61 6d 65 3d 31 3b 20 69 4e 61 6d 65 3c 6e 41 72  ame=1; iName<nAr
31600 67 20 26 26 20 61 7a 41 72 67 5b 69 4e 61 6d 65  g && azArg[iName
31610 5d 5b 30 5d 3d 3d 27 2d 27 3b 20 69 4e 61 6d 65  ][0]=='-'; iName
31620 2b 2b 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74  ++){.      const
31630 20 63 68 61 72 20 2a 7a 20 3d 20 61 7a 41 72 67   char *z = azArg
31640 5b 69 4e 61 6d 65 5d 3b 0a 20 20 20 20 20 20 69  [iName];.      i
31650 66 28 20 6f 70 74 69 6f 6e 4d 61 74 63 68 28 7a  f( optionMatch(z
31660 2c 22 6e 65 77 22 29 20 29 7b 0a 20 20 20 20 20  ,"new") ){.     
31670 20 20 20 6e 65 77 46 6c 61 67 20 3d 20 31 3b 0a     newFlag = 1;.
31680 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41  #ifdef SQLITE_HA
31690 56 45 5f 5a 4c 49 42 0a 20 20 20 20 20 20 7d 65  VE_ZLIB.      }e
316a0 6c 73 65 20 69 66 28 20 6f 70 74 69 6f 6e 4d 61  lse if( optionMa
316b0 74 63 68 28 7a 2c 20 22 7a 69 70 22 29 20 29 7b  tch(z, "zip") ){
316c0 0a 20 20 20 20 20 20 20 20 70 2d 3e 6f 70 65 6e  .        p->open
316d0 4d 6f 64 65 20 3d 20 53 48 45 4c 4c 5f 4f 50 45  Mode = SHELL_OPE
316e0 4e 5f 5a 49 50 46 49 4c 45 3b 0a 23 65 6e 64 69  N_ZIPFILE;.#endi
316f0 66 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  f.      }else if
31700 28 20 6f 70 74 69 6f 6e 4d 61 74 63 68 28 7a 2c  ( optionMatch(z,
31710 20 22 61 70 70 65 6e 64 22 29 20 29 7b 0a 20 20   "append") ){.  
31720 20 20 20 20 20 20 70 2d 3e 6f 70 65 6e 4d 6f 64        p->openMod
31730 65 20 3d 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f 41  e = SHELL_OPEN_A
31740 50 50 45 4e 44 56 46 53 3b 0a 20 20 20 20 20 20  PPENDVFS;.      
31750 7d 65 6c 73 65 20 69 66 28 20 6f 70 74 69 6f 6e  }else if( option
31760 4d 61 74 63 68 28 7a 2c 20 22 72 65 61 64 6f 6e  Match(z, "readon
31770 6c 79 22 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ly") ){.        
31780 70 2d 3e 6f 70 65 6e 4d 6f 64 65 20 3d 20 53 48  p->openMode = SH
31790 45 4c 4c 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c  ELL_OPEN_READONL
317a0 59 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  Y;.      }else i
317b0 66 28 20 7a 5b 30 5d 3d 3d 27 2d 27 20 29 7b 0a  f( z[0]=='-' ){.
317c0 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69          utf8_pri
317d0 6e 74 66 28 73 74 64 65 72 72 2c 20 22 75 6e 6b  ntf(stderr, "unk
317e0 6e 6f 77 6e 20 6f 70 74 69 6f 6e 3a 20 25 73 5c  nown option: %s\
317f0 6e 22 2c 20 7a 29 3b 0a 20 20 20 20 20 20 20 20  n", z);.        
31800 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  rc = 1;.        
31810 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e  goto meta_comman
31820 64 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 7d 0a  d_exit;.      }.
31830 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 49 66 20      }.    /* If 
31840 61 20 66 69 6c 65 6e 61 6d 65 20 69 73 20 73 70  a filename is sp
31850 65 63 69 66 69 65 64 2c 20 74 72 79 20 74 6f 20  ecified, try to 
31860 6f 70 65 6e 20 69 74 20 66 69 72 73 74 20 2a 2f  open it first */
31870 0a 20 20 20 20 7a 4e 65 77 46 69 6c 65 6e 61 6d  .    zNewFilenam
31880 65 20 3d 20 6e 41 72 67 3e 69 4e 61 6d 65 20 3f  e = nArg>iName ?
31890 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
318a0 28 22 25 73 22 2c 20 61 7a 41 72 67 5b 69 4e 61  ("%s", azArg[iNa
318b0 6d 65 5d 29 20 3a 20 30 3b 0a 20 20 20 20 69 66  me]) : 0;.    if
318c0 28 20 7a 4e 65 77 46 69 6c 65 6e 61 6d 65 20 29  ( zNewFilename )
318d0 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 65 77 46  {.      if( newF
318e0 6c 61 67 20 29 20 73 68 65 6c 6c 44 65 6c 65 74  lag ) shellDelet
318f0 65 46 69 6c 65 28 7a 4e 65 77 46 69 6c 65 6e 61  eFile(zNewFilena
31900 6d 65 29 3b 0a 20 20 20 20 20 20 70 2d 3e 7a 44  me);.      p->zD
31910 62 46 69 6c 65 6e 61 6d 65 20 3d 20 7a 4e 65 77  bFilename = zNew
31920 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 20 20 20 20  Filename;.      
31930 6f 70 65 6e 5f 64 62 28 70 2c 20 31 29 3b 0a 20  open_db(p, 1);. 
31940 20 20 20 20 20 69 66 28 20 70 2d 3e 64 62 3d 3d       if( p->db==
31950 30 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66  0 ){.        utf
31960 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  8_printf(stderr,
31970 20 22 45 72 72 6f 72 3a 20 63 61 6e 6e 6f 74 20   "Error: cannot 
31980 6f 70 65 6e 20 27 25 73 27 5c 6e 22 2c 20 7a 4e  open '%s'\n", zN
31990 65 77 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20  ewFilename);.   
319a0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
319b0 65 28 7a 4e 65 77 46 69 6c 65 6e 61 6d 65 29 3b  e(zNewFilename);
319c0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
319d0 20 20 20 20 20 20 70 2d 3e 7a 46 72 65 65 4f 6e        p->zFreeOn
319e0 43 6c 6f 73 65 20 3d 20 7a 4e 65 77 46 69 6c 65  Close = zNewFile
319f0 6e 61 6d 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20  name;.      }.  
31a00 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e 64    }.    if( p->d
31a10 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a  b==0 ){.      /*
31a20 20 41 73 20 61 20 66 61 6c 6c 2d 62 61 63 6b 20   As a fall-back 
31a30 6f 70 65 6e 20 61 20 54 45 4d 50 20 64 61 74 61  open a TEMP data
31a40 62 61 73 65 20 2a 2f 0a 20 20 20 20 20 20 70 2d  base */.      p-
31a50 3e 7a 44 62 46 69 6c 65 6e 61 6d 65 20 3d 20 30  >zDbFilename = 0
31a60 3b 0a 20 20 20 20 20 20 6f 70 65 6e 5f 64 62 28  ;.      open_db(
31a70 70 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  p, 0);.    }.  }
31a80 65 6c 73 65 0a 0a 20 20 69 66 28 20 28 63 3d 3d  else..  if( (c==
31a90 27 6f 27 0a 20 20 20 20 20 20 20 20 26 26 20 28  'o'.        && (
31aa0 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d  strncmp(azArg[0]
31ab0 2c 20 22 6f 75 74 70 75 74 22 2c 20 6e 29 3d 3d  , "output", n)==
31ac0 30 7c 7c 73 74 72 6e 63 6d 70 28 61 7a 41 72 67  0||strncmp(azArg
31ad0 5b 30 5d 2c 20 22 6f 6e 63 65 22 2c 20 6e 29 3d  [0], "once", n)=
31ae0 3d 30 29 29 0a 20 20 20 7c 7c 20 28 63 3d 3d 27  =0)).   || (c=='
31af0 65 27 20 26 26 20 6e 3d 3d 35 20 26 26 20 73 74  e' && n==5 && st
31b00 72 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 22 65  rcmp(azArg[0],"e
31b10 78 63 65 6c 22 29 3d 3d 30 29 0a 20 20 29 7b 0a  xcel")==0).  ){.
31b20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
31b30 7a 46 69 6c 65 20 3d 20 6e 41 72 67 3e 3d 32 20  zFile = nArg>=2 
31b40 3f 20 61 7a 41 72 67 5b 31 5d 20 3a 20 22 73 74  ? azArg[1] : "st
31b50 64 6f 75 74 22 3b 0a 20 20 20 20 69 6e 74 20 62  dout";.    int b
31b60 54 78 74 4d 6f 64 65 20 3d 20 30 3b 0a 20 20 20  TxtMode = 0;.   
31b70 20 69 66 28 20 61 7a 41 72 67 5b 30 5d 5b 30 5d   if( azArg[0][0]
31b80 3d 3d 27 65 27 20 29 7b 0a 20 20 20 20 20 20 2f  =='e' ){.      /
31b90 2a 20 54 72 61 6e 73 66 6f 72 6d 20 74 68 65 20  * Transform the 
31ba0 22 2e 65 78 63 65 6c 22 20 63 6f 6d 6d 61 6e 64  ".excel" command
31bb0 20 69 6e 74 6f 20 22 2e 6f 6e 63 65 20 2d 78 22   into ".once -x"
31bc0 20 2a 2f 0a 20 20 20 20 20 20 6e 41 72 67 20 3d   */.      nArg =
31bd0 20 32 3b 0a 20 20 20 20 20 20 61 7a 41 72 67 5b   2;.      azArg[
31be0 30 5d 20 3d 20 22 6f 6e 63 65 22 3b 0a 20 20 20  0] = "once";.   
31bf0 20 20 20 7a 46 69 6c 65 20 3d 20 61 7a 41 72 67     zFile = azArg
31c00 5b 31 5d 20 3d 20 22 2d 78 22 3b 0a 20 20 20 20  [1] = "-x";.    
31c10 20 20 6e 20 3d 20 34 3b 0a 20 20 20 20 7d 0a 20    n = 4;.    }. 
31c20 20 20 20 69 66 28 20 6e 41 72 67 3e 32 20 29 7b     if( nArg>2 ){
31c30 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e  .      utf8_prin
31c40 74 66 28 73 74 64 65 72 72 2c 20 22 55 73 61 67  tf(stderr, "Usag
31c50 65 3a 20 2e 25 73 20 5b 2d 65 7c 2d 78 7c 46 49  e: .%s [-e|-x|FI
31c60 4c 45 5d 5c 6e 22 2c 20 61 7a 41 72 67 5b 30 5d  LE]\n", azArg[0]
31c70 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b  );.      rc = 1;
31c80 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 65 74 61  .      goto meta
31c90 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20  _command_exit;. 
31ca0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 3e 31     }.    if( n>1
31cb0 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72   && strncmp(azAr
31cc0 67 5b 30 5d 2c 20 22 6f 6e 63 65 22 2c 20 6e 29  g[0], "once", n)
31cd0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ==0 ){.      if(
31ce0 20 6e 41 72 67 3c 32 20 29 7b 0a 20 20 20 20 20   nArg<2 ){.     
31cf0 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74     raw_printf(st
31d00 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 6f  derr, "Usage: .o
31d10 6e 63 65 20 28 2d 65 7c 2d 78 7c 46 49 4c 45 29  nce (-e|-x|FILE)
31d20 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 72 63  \n");.        rc
31d30 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 67 6f   = 1;.        go
31d40 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f  to meta_command_
31d50 65 78 69 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  exit;.      }.  
31d60 20 20 20 20 70 2d 3e 6f 75 74 43 6f 75 6e 74 20      p->outCount 
31d70 3d 20 32 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 2;.    }else{.
31d80 20 20 20 20 20 20 70 2d 3e 6f 75 74 43 6f 75 6e        p->outCoun
31d90 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  t = 0;.    }.   
31da0 20 6f 75 74 70 75 74 5f 72 65 73 65 74 28 70 29   output_reset(p)
31db0 3b 0a 20 20 20 20 69 66 28 20 7a 46 69 6c 65 5b  ;.    if( zFile[
31dc0 30 5d 3d 3d 27 2d 27 20 26 26 20 7a 46 69 6c 65  0]=='-' && zFile
31dd0 5b 31 5d 3d 3d 27 2d 27 20 29 20 7a 46 69 6c 65  [1]=='-' ) zFile
31de0 2b 2b 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  ++;.#ifndef SQLI
31df0 54 45 5f 4e 4f 48 41 56 45 5f 53 59 53 54 45 4d  TE_NOHAVE_SYSTEM
31e00 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28  .    if( strcmp(
31e10 7a 46 69 6c 65 2c 20 22 2d 65 22 29 3d 3d 30 20  zFile, "-e")==0 
31e20 7c 7c 20 73 74 72 63 6d 70 28 7a 46 69 6c 65 2c  || strcmp(zFile,
31e30 20 22 2d 78 22 29 3d 3d 30 20 29 7b 0a 20 20 20   "-x")==0 ){.   
31e40 20 20 20 70 2d 3e 64 6f 58 64 67 4f 70 65 6e 20     p->doXdgOpen 
31e50 3d 20 31 3b 0a 20 20 20 20 20 20 6f 75 74 70 75  = 1;.      outpu
31e60 74 4d 6f 64 65 50 75 73 68 28 70 29 3b 0a 20 20  tModePush(p);.  
31e70 20 20 20 20 69 66 28 20 7a 46 69 6c 65 5b 31 5d      if( zFile[1]
31e80 3d 3d 27 78 27 20 29 7b 0a 20 20 20 20 20 20 20  =='x' ){.       
31e90 20 6e 65 77 54 65 6d 70 46 69 6c 65 28 70 2c 20   newTempFile(p, 
31ea0 22 63 73 76 22 29 3b 0a 20 20 20 20 20 20 20 20  "csv");.        
31eb0 70 2d 3e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 43  p->mode = MODE_C
31ec0 73 76 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  sv;.        sqli
31ed0 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
31ee0 65 6f 66 28 70 2d 3e 63 6f 6c 53 65 70 61 72 61  eof(p->colSepara
31ef0 74 6f 72 29 2c 20 70 2d 3e 63 6f 6c 53 65 70 61  tor), p->colSepa
31f00 72 61 74 6f 72 2c 20 53 45 50 5f 43 6f 6d 6d 61  rator, SEP_Comma
31f10 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
31f20 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
31f30 6f 66 28 70 2d 3e 72 6f 77 53 65 70 61 72 61 74  of(p->rowSeparat
31f40 6f 72 29 2c 20 70 2d 3e 72 6f 77 53 65 70 61 72  or), p->rowSepar
31f50 61 74 6f 72 2c 20 53 45 50 5f 43 72 4c 66 29 3b  ator, SEP_CrLf);
31f60 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
31f70 20 20 20 20 20 20 6e 65 77 54 65 6d 70 46 69 6c        newTempFil
31f80 65 28 70 2c 20 22 74 78 74 22 29 3b 0a 20 20 20  e(p, "txt");.   
31f90 20 20 20 20 20 62 54 78 74 4d 6f 64 65 20 3d 20       bTxtMode = 
31fa0 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  1;.      }.     
31fb0 20 7a 46 69 6c 65 20 3d 20 70 2d 3e 7a 54 65 6d   zFile = p->zTem
31fc0 70 46 69 6c 65 3b 0a 20 20 20 20 7d 0a 23 65 6e  pFile;.    }.#en
31fd0 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4e 4f  dif /* SQLITE_NO
31fe0 48 41 56 45 5f 53 59 53 54 45 4d 20 2a 2f 0a 20  HAVE_SYSTEM */. 
31ff0 20 20 20 69 66 28 20 7a 46 69 6c 65 5b 30 5d 3d     if( zFile[0]=
32000 3d 27 7c 27 20 29 7b 0a 23 69 66 64 65 66 20 53  ='|' ){.#ifdef S
32010 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 4f 50 45 4e  QLITE_OMIT_POPEN
32020 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74  .      raw_print
32030 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72  f(stderr, "Error
32040 3a 20 70 69 70 65 73 20 61 72 65 20 6e 6f 74 20  : pipes are not 
32050 73 75 70 70 6f 72 74 65 64 20 69 6e 20 74 68 69  supported in thi
32060 73 20 4f 53 5c 6e 22 29 3b 0a 20 20 20 20 20 20  s OS\n");.      
32070 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 2d  rc = 1;.      p-
32080 3e 6f 75 74 20 3d 20 73 74 64 6f 75 74 3b 0a 23  >out = stdout;.#
32090 65 6c 73 65 0a 20 20 20 20 20 20 70 2d 3e 6f 75  else.      p->ou
320a0 74 20 3d 20 70 6f 70 65 6e 28 7a 46 69 6c 65 20  t = popen(zFile 
320b0 2b 20 31 2c 20 22 77 22 29 3b 0a 20 20 20 20 20  + 1, "w");.     
320c0 20 69 66 28 20 70 2d 3e 6f 75 74 3d 3d 30 20 29   if( p->out==0 )
320d0 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70  {.        utf8_p
320e0 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 45 72  rintf(stderr,"Er
320f0 72 6f 72 3a 20 63 61 6e 6e 6f 74 20 6f 70 65 6e  ror: cannot open
32100 20 70 69 70 65 20 5c 22 25 73 5c 22 5c 6e 22 2c   pipe \"%s\"\n",
32110 20 7a 46 69 6c 65 20 2b 20 31 29 3b 0a 20 20 20   zFile + 1);.   
32120 20 20 20 20 20 70 2d 3e 6f 75 74 20 3d 20 73 74       p->out = st
32130 64 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 72 63  dout;.        rc
32140 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73   = 1;.      }els
32150 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
32160 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
32170 6f 66 28 70 2d 3e 6f 75 74 66 69 6c 65 29 2c 20  of(p->outfile), 
32180 70 2d 3e 6f 75 74 66 69 6c 65 2c 20 22 25 73 22  p->outfile, "%s"
32190 2c 20 7a 46 69 6c 65 29 3b 0a 20 20 20 20 20 20  , zFile);.      
321a0 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c  }.#endif.    }el
321b0 73 65 7b 0a 20 20 20 20 20 20 70 2d 3e 6f 75 74  se{.      p->out
321c0 20 3d 20 6f 75 74 70 75 74 5f 66 69 6c 65 5f 6f   = output_file_o
321d0 70 65 6e 28 7a 46 69 6c 65 2c 20 62 54 78 74 4d  pen(zFile, bTxtM
321e0 6f 64 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ode);.      if( 
321f0 70 2d 3e 6f 75 74 3d 3d 30 20 29 7b 0a 20 20 20  p->out==0 ){.   
32200 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28       if( strcmp(
32210 7a 46 69 6c 65 2c 22 6f 66 66 22 29 21 3d 30 20  zFile,"off")!=0 
32220 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 74 66  ){.          utf
32230 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  8_printf(stderr,
32240 22 45 72 72 6f 72 3a 20 63 61 6e 6e 6f 74 20 77  "Error: cannot w
32250 72 69 74 65 20 74 6f 20 5c 22 25 73 5c 22 5c 6e  rite to \"%s\"\n
32260 22 2c 20 7a 46 69 6c 65 29 3b 0a 20 20 20 20 20  ", zFile);.     
32270 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 2d 3e     }.        p->
32280 6f 75 74 20 3d 20 73 74 64 6f 75 74 3b 0a 20 20  out = stdout;.  
32290 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
322a0 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20      } else {.   
322b0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
322c0 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 70 2d 3e  rintf(sizeof(p->
322d0 6f 75 74 66 69 6c 65 29 2c 20 70 2d 3e 6f 75 74  outfile), p->out
322e0 66 69 6c 65 2c 20 22 25 73 22 2c 20 7a 46 69 6c  file, "%s", zFil
322f0 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
32300 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28  }.  }else..  if(
32310 20 63 3d 3d 27 70 27 20 26 26 20 6e 3e 3d 33 20   c=='p' && n>=3 
32320 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67  && strncmp(azArg
32330 5b 30 5d 2c 20 22 70 72 69 6e 74 22 2c 20 6e 29  [0], "print", n)
32340 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ==0 ){.    int i
32350 3b 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69  ;.    for(i=1; i
32360 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nArg; i++){.   
32370 20 20 20 69 66 28 20 69 3e 31 20 29 20 72 61 77     if( i>1 ) raw
32380 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
32390 22 20 22 29 3b 0a 20 20 20 20 20 20 75 74 66 38  " ");.      utf8
323a0 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
323b0 22 25 73 22 2c 20 61 7a 41 72 67 5b 69 5d 29 3b  "%s", azArg[i]);
323c0 0a 20 20 20 20 7d 0a 20 20 20 20 72 61 77 5f 70  .    }.    raw_p
323d0 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 5c  rintf(p->out, "\
323e0 6e 22 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20  n");.  }else..  
323f0 69 66 28 20 63 3d 3d 27 70 27 20 26 26 20 73 74  if( c=='p' && st
32400 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20  rncmp(azArg[0], 
32410 22 70 72 6f 6d 70 74 22 2c 20 6e 29 3d 3d 30 20  "prompt", n)==0 
32420 29 7b 0a 20 20 20 20 69 66 28 20 6e 41 72 67 20  ){.    if( nArg 
32430 3e 3d 20 32 29 20 7b 0a 20 20 20 20 20 20 73 74  >= 2) {.      st
32440 72 6e 63 70 79 28 6d 61 69 6e 50 72 6f 6d 70 74  rncpy(mainPrompt
32450 2c 61 7a 41 72 67 5b 31 5d 2c 28 69 6e 74 29 41  ,azArg[1],(int)A
32460 72 72 61 79 53 69 7a 65 28 6d 61 69 6e 50 72 6f  rraySize(mainPro
32470 6d 70 74 29 2d 31 29 3b 0a 20 20 20 20 7d 0a 20  mpt)-1);.    }. 
32480 20 20 20 69 66 28 20 6e 41 72 67 20 3e 3d 20 33     if( nArg >= 3
32490 29 20 7b 0a 20 20 20 20 20 20 73 74 72 6e 63 70  ) {.      strncp
324a0 79 28 63 6f 6e 74 69 6e 75 65 50 72 6f 6d 70 74  y(continuePrompt
324b0 2c 61 7a 41 72 67 5b 32 5d 2c 28 69 6e 74 29 41  ,azArg[2],(int)A
324c0 72 72 61 79 53 69 7a 65 28 63 6f 6e 74 69 6e 75  rraySize(continu
324d0 65 50 72 6f 6d 70 74 29 2d 31 29 3b 0a 20 20 20  ePrompt)-1);.   
324e0 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66   }.  }else..  if
324f0 28 20 63 3d 3d 27 71 27 20 26 26 20 73 74 72 6e  ( c=='q' && strn
32500 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 71  cmp(azArg[0], "q
32510 75 69 74 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20  uit", n)==0 ){. 
32520 20 20 20 72 63 20 3d 20 32 3b 0a 20 20 7d 65 6c     rc = 2;.  }el
32530 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 72 27  se..  if( c=='r'
32540 20 26 26 20 6e 3e 3d 33 20 26 26 20 73 74 72 6e   && n>=3 && strn
32550 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 72  cmp(azArg[0], "r
32560 65 61 64 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20  ead", n)==0 ){. 
32570 20 20 20 46 49 4c 45 20 2a 61 6c 74 3b 0a 20 20     FILE *alt;.  
32580 20 20 69 66 28 20 6e 41 72 67 21 3d 32 20 29 7b    if( nArg!=2 ){
32590 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74  .      raw_print
325a0 66 28 73 74 64 65 72 72 2c 20 22 55 73 61 67 65  f(stderr, "Usage
325b0 3a 20 2e 72 65 61 64 20 46 49 4c 45 5c 6e 22 29  : .read FILE\n")
325c0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a  ;.      rc = 1;.
325d0 20 20 20 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f        goto meta_
325e0 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20  command_exit;.  
325f0 20 20 7d 0a 20 20 20 20 61 6c 74 20 3d 20 66 6f    }.    alt = fo
32600 70 65 6e 28 61 7a 41 72 67 5b 31 5d 2c 20 22 72  pen(azArg[1], "r
32610 62 22 29 3b 0a 20 20 20 20 69 66 28 20 61 6c 74  b");.    if( alt
32620 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 75 74 66  ==0 ){.      utf
32630 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  8_printf(stderr,
32640 22 45 72 72 6f 72 3a 20 63 61 6e 6e 6f 74 20 6f  "Error: cannot o
32650 70 65 6e 20 5c 22 25 73 5c 22 5c 6e 22 2c 20 61  pen \"%s\"\n", a
32660 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20 20 20  zArg[1]);.      
32670 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73  rc = 1;.    }els
32680 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 72  e{.      rc = pr
32690 6f 63 65 73 73 5f 69 6e 70 75 74 28 70 2c 20 61  ocess_input(p, a
326a0 6c 74 29 3b 0a 20 20 20 20 20 20 66 63 6c 6f 73  lt);.      fclos
326b0 65 28 61 6c 74 29 3b 0a 20 20 20 20 7d 0a 20 20  e(alt);.    }.  
326c0 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d  }else..  if( c==
326d0 27 72 27 20 26 26 20 6e 3e 3d 33 20 26 26 20 73  'r' && n>=3 && s
326e0 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c  trncmp(azArg[0],
326f0 20 22 72 65 73 74 6f 72 65 22 2c 20 6e 29 3d 3d   "restore", n)==
32700 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  0 ){.    const c
32710 68 61 72 20 2a 7a 53 72 63 46 69 6c 65 3b 0a 20  har *zSrcFile;. 
32720 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
32730 44 62 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 20  Db;.    sqlite3 
32740 2a 70 53 72 63 3b 0a 20 20 20 20 73 71 6c 69 74  *pSrc;.    sqlit
32750 65 33 5f 62 61 63 6b 75 70 20 2a 70 42 61 63 6b  e3_backup *pBack
32760 75 70 3b 0a 20 20 20 20 69 6e 74 20 6e 54 69 6d  up;.    int nTim
32770 65 6f 75 74 20 3d 20 30 3b 0a 0a 20 20 20 20 69  eout = 0;..    i
32780 66 28 20 6e 41 72 67 3d 3d 32 20 29 7b 0a 20 20  f( nArg==2 ){.  
32790 20 20 20 20 7a 53 72 63 46 69 6c 65 20 3d 20 61      zSrcFile = a
327a0 7a 41 72 67 5b 31 5d 3b 0a 20 20 20 20 20 20 7a  zArg[1];.      z
327b0 44 62 20 3d 20 22 6d 61 69 6e 22 3b 0a 20 20 20  Db = "main";.   
327c0 20 7d 65 6c 73 65 20 69 66 28 20 6e 41 72 67 3d   }else if( nArg=
327d0 3d 33 20 29 7b 0a 20 20 20 20 20 20 7a 53 72 63  =3 ){.      zSrc
327e0 46 69 6c 65 20 3d 20 61 7a 41 72 67 5b 32 5d 3b  File = azArg[2];
327f0 0a 20 20 20 20 20 20 7a 44 62 20 3d 20 61 7a 41  .      zDb = azA
32800 72 67 5b 31 5d 3b 0a 20 20 20 20 7d 65 6c 73 65  rg[1];.    }else
32810 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e  {.      raw_prin
32820 74 66 28 73 74 64 65 72 72 2c 20 22 55 73 61 67  tf(stderr, "Usag
32830 65 3a 20 2e 72 65 73 74 6f 72 65 20 3f 44 42 3f  e: .restore ?DB?
32840 20 46 49 4c 45 5c 6e 22 29 3b 0a 20 20 20 20 20   FILE\n");.     
32850 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 67   rc = 1;.      g
32860 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64  oto meta_command
32870 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a 20 20 20  _exit;.    }.   
32880 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 6f 70   rc = sqlite3_op
32890 65 6e 28 7a 53 72 63 46 69 6c 65 2c 20 26 70 53  en(zSrcFile, &pS
328a0 72 63 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  rc);.    if( rc!
328b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
328c0 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
328d0 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20  stderr, "Error: 
328e0 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 5c 22 25 73  cannot open \"%s
328f0 5c 22 5c 6e 22 2c 20 7a 53 72 63 46 69 6c 65 29  \"\n", zSrcFile)
32900 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
32910 63 6c 6f 73 65 28 70 53 72 63 29 3b 0a 20 20 20  close(pSrc);.   
32920 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
32930 20 7d 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28 70   }.    open_db(p
32940 2c 20 30 29 3b 0a 20 20 20 20 70 42 61 63 6b 75  , 0);.    pBacku
32950 70 20 3d 20 73 71 6c 69 74 65 33 5f 62 61 63 6b  p = sqlite3_back
32960 75 70 5f 69 6e 69 74 28 70 2d 3e 64 62 2c 20 7a  up_init(p->db, z
32970 44 62 2c 20 70 53 72 63 2c 20 22 6d 61 69 6e 22  Db, pSrc, "main"
32980 29 3b 0a 20 20 20 20 69 66 28 20 70 42 61 63 6b  );.    if( pBack
32990 75 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 75  up==0 ){.      u
329a0 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72  tf8_printf(stder
329b0 72 2c 20 22 45 72 72 6f 72 3a 20 25 73 5c 6e 22  r, "Error: %s\n"
329c0 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  , sqlite3_errmsg
329d0 28 70 2d 3e 64 62 29 29 3b 0a 20 20 20 20 20 20  (p->db));.      
329e0 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 70 53  sqlite3_close(pS
329f0 72 63 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  rc);.      retur
32a00 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 77  n 1;.    }.    w
32a10 68 69 6c 65 28 20 28 72 63 20 3d 20 73 71 6c 69  hile( (rc = sqli
32a20 74 65 33 5f 62 61 63 6b 75 70 5f 73 74 65 70 28  te3_backup_step(
32a30 70 42 61 63 6b 75 70 2c 31 30 30 29 29 3d 3d 53  pBackup,100))==S
32a40 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 20 20 20 20  QLITE_OK.       
32a50 20 20 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45     || rc==SQLITE
32a60 5f 42 55 53 59 20 20 29 7b 0a 20 20 20 20 20 20  _BUSY  ){.      
32a70 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42  if( rc==SQLITE_B
32a80 55 53 59 20 29 7b 0a 20 20 20 20 20 20 20 20 69  USY ){.        i
32a90 66 28 20 6e 54 69 6d 65 6f 75 74 2b 2b 20 3e 3d  f( nTimeout++ >=
32aa0 20 33 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20   3 ) break;.    
32ab0 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6c 65 65      sqlite3_slee
32ac0 70 28 31 30 30 29 3b 0a 20 20 20 20 20 20 7d 0a  p(100);.      }.
32ad0 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
32ae0 33 5f 62 61 63 6b 75 70 5f 66 69 6e 69 73 68 28  3_backup_finish(
32af0 70 42 61 63 6b 75 70 29 3b 0a 20 20 20 20 69 66  pBackup);.    if
32b00 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e  ( rc==SQLITE_DON
32b10 45 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  E ){.      rc = 
32b20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  0;.    }else if(
32b30 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59   rc==SQLITE_BUSY
32b40 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4c   || rc==SQLITE_L
32b50 4f 43 4b 45 44 20 29 7b 0a 20 20 20 20 20 20 72  OCKED ){.      r
32b60 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  aw_printf(stderr
32b70 2c 20 22 45 72 72 6f 72 3a 20 73 6f 75 72 63 65  , "Error: source
32b80 20 64 61 74 61 62 61 73 65 20 69 73 20 62 75 73   database is bus
32b90 79 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20  y\n");.      rc 
32ba0 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 1;.    }else{.
32bb0 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
32bc0 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72  f(stderr, "Error
32bd0 3a 20 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65 33  : %s\n", sqlite3
32be0 5f 65 72 72 6d 73 67 28 70 2d 3e 64 62 29 29 3b  _errmsg(p->db));
32bf0 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20  .      rc = 1;. 
32c00 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
32c10 5f 63 6c 6f 73 65 28 70 53 72 63 29 3b 0a 20 20  _close(pSrc);.  
32c20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d  }else..  if( c==
32c30 27 73 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61  's' && strncmp(a
32c40 7a 41 72 67 5b 30 5d 2c 20 22 73 63 61 6e 73 74  zArg[0], "scanst
32c50 61 74 73 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20  ats", n)==0 ){. 
32c60 20 20 20 69 66 28 20 6e 41 72 67 3d 3d 32 20 29     if( nArg==2 )
32c70 7b 0a 20 20 20 20 20 20 70 2d 3e 73 63 61 6e 73  {.      p->scans
32c80 74 61 74 73 4f 6e 20 3d 20 28 75 38 29 62 6f 6f  tatsOn = (u8)boo
32c90 6c 65 61 6e 56 61 6c 75 65 28 61 7a 41 72 67 5b  leanValue(azArg[
32ca0 31 5d 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  1]);.#ifndef SQL
32cb0 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 4d 54 5f  ITE_ENABLE_STMT_
32cc0 53 43 41 4e 53 54 41 54 55 53 0a 20 20 20 20 20  SCANSTATUS.     
32cd0 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65   raw_printf(stde
32ce0 72 72 2c 20 22 57 61 72 6e 69 6e 67 3a 20 2e 73  rr, "Warning: .s
32cf0 63 61 6e 73 74 61 74 73 20 6e 6f 74 20 61 76 61  canstats not ava
32d00 69 6c 61 62 6c 65 20 69 6e 20 74 68 69 73 20 62  ilable in this b
32d10 75 69 6c 64 2e 5c 6e 22 29 3b 0a 23 65 6e 64 69  uild.\n");.#endi
32d20 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  f.    }else{.   
32d30 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74     raw_printf(st
32d40 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 73  derr, "Usage: .s
32d50 63 61 6e 73 74 61 74 73 20 6f 6e 7c 6f 66 66 5c  canstats on|off\
32d60 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  n");.      rc = 
32d70 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  1;.    }.  }else
32d80 0a 0a 20 20 69 66 28 20 63 3d 3d 27 73 27 20 26  ..  if( c=='s' &
32d90 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b  & strncmp(azArg[
32da0 30 5d 2c 20 22 73 63 68 65 6d 61 22 2c 20 6e 29  0], "schema", n)
32db0 3d 3d 30 20 29 7b 0a 20 20 20 20 53 68 65 6c 6c  ==0 ){.    Shell
32dc0 54 65 78 74 20 73 53 65 6c 65 63 74 3b 0a 20 20  Text sSelect;.  
32dd0 20 20 53 68 65 6c 6c 53 74 61 74 65 20 64 61 74    ShellState dat
32de0 61 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 45 72  a;.    char *zEr
32df0 72 4d 73 67 20 3d 20 30 3b 0a 20 20 20 20 63 6f  rMsg = 0;.    co
32e00 6e 73 74 20 63 68 61 72 20 2a 7a 44 69 76 20 3d  nst char *zDiv =
32e10 20 22 28 22 3b 0a 20 20 20 20 63 6f 6e 73 74 20   "(";.    const 
32e20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b  char *zName = 0;
32e30 0a 20 20 20 20 69 6e 74 20 69 53 63 68 65 6d 61  .    int iSchema
32e40 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 62 44   = 0;.    int bD
32e50 65 62 75 67 20 3d 20 30 3b 0a 20 20 20 20 69 6e  ebug = 0;.    in
32e60 74 20 69 69 3b 0a 0a 20 20 20 20 6f 70 65 6e 5f  t ii;..    open_
32e70 64 62 28 70 2c 20 30 29 3b 0a 20 20 20 20 6d 65  db(p, 0);.    me
32e80 6d 63 70 79 28 26 64 61 74 61 2c 20 70 2c 20 73  mcpy(&data, p, s
32e90 69 7a 65 6f 66 28 64 61 74 61 29 29 3b 0a 20 20  izeof(data));.  
32ea0 20 20 64 61 74 61 2e 73 68 6f 77 48 65 61 64 65    data.showHeade
32eb0 72 20 3d 20 30 3b 0a 20 20 20 20 64 61 74 61 2e  r = 0;.    data.
32ec0 63 4d 6f 64 65 20 3d 20 64 61 74 61 2e 6d 6f 64  cMode = data.mod
32ed0 65 20 3d 20 4d 4f 44 45 5f 53 65 6d 69 3b 0a 20  e = MODE_Semi;. 
32ee0 20 20 20 69 6e 69 74 54 65 78 74 28 26 73 53 65     initText(&sSe
32ef0 6c 65 63 74 29 3b 0a 20 20 20 20 66 6f 72 28 69  lect);.    for(i
32f00 69 3d 31 3b 20 69 69 3c 6e 41 72 67 3b 20 69 69  i=1; ii<nArg; ii
32f10 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6f  ++){.      if( o
32f20 70 74 69 6f 6e 4d 61 74 63 68 28 61 7a 41 72 67  ptionMatch(azArg
32f30 5b 69 69 5d 2c 22 69 6e 64 65 6e 74 22 29 20 29  [ii],"indent") )
32f40 7b 0a 20 20 20 20 20 20 20 20 64 61 74 61 2e 63  {.        data.c
32f50 4d 6f 64 65 20 3d 20 64 61 74 61 2e 6d 6f 64 65  Mode = data.mode
32f60 20 3d 20 4d 4f 44 45 5f 50 72 65 74 74 79 3b 0a   = MODE_Pretty;.
32f70 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
32f80 6f 70 74 69 6f 6e 4d 61 74 63 68 28 61 7a 41 72  optionMatch(azAr
32f90 67 5b 69 69 5d 2c 22 64 65 62 75 67 22 29 20 29  g[ii],"debug") )
32fa0 7b 0a 20 20 20 20 20 20 20 20 62 44 65 62 75 67  {.        bDebug
32fb0 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73   = 1;.      }els
32fc0 65 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29  e if( zName==0 )
32fd0 7b 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20  {.        zName 
32fe0 3d 20 61 7a 41 72 67 5b 69 69 5d 3b 0a 20 20 20  = azArg[ii];.   
32ff0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
33000 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64    raw_printf(std
33010 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 73 63  err, "Usage: .sc
33020 68 65 6d 61 20 3f 2d 2d 69 6e 64 65 6e 74 3f 20  hema ?--indent? 
33030 3f 4c 49 4b 45 2d 50 41 54 54 45 52 4e 3f 5c 6e  ?LIKE-PATTERN?\n
33040 22 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  ");.        rc =
33050 20 31 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   1;.        goto
33060 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78   meta_command_ex
33070 69 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  it;.      }.    
33080 7d 0a 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 21  }.    if( zName!
33090 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  =0 ){.      int 
330a0 69 73 4d 61 73 74 65 72 20 3d 20 73 71 6c 69 74  isMaster = sqlit
330b0 65 33 5f 73 74 72 6c 69 6b 65 28 7a 4e 61 6d 65  e3_strlike(zName
330c0 2c 20 22 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  , "sqlite_master
330d0 22 2c 20 27 5c 5c 27 29 3d 3d 30 3b 0a 20 20 20  ", '\\')==0;.   
330e0 20 20 20 69 66 28 20 69 73 4d 61 73 74 65 72 20     if( isMaster 
330f0 7c 7c 20 73 71 6c 69 74 65 33 5f 73 74 72 6c 69  || sqlite3_strli
33100 6b 65 28 7a 4e 61 6d 65 2c 22 73 71 6c 69 74 65  ke(zName,"sqlite
33110 5f 74 65 6d 70 5f 6d 61 73 74 65 72 22 2c 20 27  _temp_master", '
33120 5c 5c 27 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  \\')==0 ){.     
33130 20 20 20 63 68 61 72 20 2a 6e 65 77 5f 61 72 67     char *new_arg
33140 76 5b 32 5d 2c 20 2a 6e 65 77 5f 63 6f 6c 76 5b  v[2], *new_colv[
33150 32 5d 3b 0a 20 20 20 20 20 20 20 20 6e 65 77 5f  2];.        new_
33160 61 72 67 76 5b 30 5d 20 3d 20 73 71 6c 69 74 65  argv[0] = sqlite
33170 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20 20 20  3_mprintf(.     
33180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33190 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 25   "CREATE TABLE %
331a0 73 20 28 5c 6e 22 0a 20 20 20 20 20 20 20 20 20  s (\n".         
331b0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20 20               "  
331c0 74 79 70 65 20 74 65 78 74 2c 5c 6e 22 0a 20 20  type text,\n".  
331d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
331e0 20 20 20 20 22 20 20 6e 61 6d 65 20 74 65 78 74      "  name text
331f0 2c 5c 6e 22 0a 20 20 20 20 20 20 20 20 20 20 20  ,\n".           
33200 20 20 20 20 20 20 20 20 20 20 20 22 20 20 74 62             "  tb
33210 6c 5f 6e 61 6d 65 20 74 65 78 74 2c 5c 6e 22 0a  l_name text,\n".
33220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33230 20 20 20 20 20 20 22 20 20 72 6f 6f 74 70 61 67        "  rootpag
33240 65 20 69 6e 74 65 67 65 72 2c 5c 6e 22 0a 20 20  e integer,\n".  
33250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33260 20 20 20 20 22 20 20 73 71 6c 20 74 65 78 74 5c      "  sql text\
33270 6e 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n".             
33280 20 20 20 20 20 20 20 20 20 22 29 22 2c 20 69 73           ")", is
33290 4d 61 73 74 65 72 20 3f 20 22 73 71 6c 69 74 65  Master ? "sqlite
332a0 5f 6d 61 73 74 65 72 22 20 3a 20 22 73 71 6c 69  _master" : "sqli
332b0 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72 22 29  te_temp_master")
332c0 3b 0a 20 20 20 20 20 20 20 20 6e 65 77 5f 61 72  ;.        new_ar
332d0 67 76 5b 31 5d 20 3d 20 30 3b 0a 20 20 20 20 20  gv[1] = 0;.     
332e0 20 20 20 6e 65 77 5f 63 6f 6c 76 5b 30 5d 20 3d     new_colv[0] =
332f0 20 22 73 71 6c 22 3b 0a 20 20 20 20 20 20 20 20   "sql";.        
33300 6e 65 77 5f 63 6f 6c 76 5b 31 5d 20 3d 20 30 3b  new_colv[1] = 0;
33310 0a 20 20 20 20 20 20 20 20 63 61 6c 6c 62 61 63  .        callbac
33320 6b 28 26 64 61 74 61 2c 20 31 2c 20 6e 65 77 5f  k(&data, 1, new_
33330 61 72 67 76 2c 20 6e 65 77 5f 63 6f 6c 76 29 3b  argv, new_colv);
33340 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
33350 5f 66 72 65 65 28 6e 65 77 5f 61 72 67 76 5b 30  _free(new_argv[0
33360 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ]);.      }.    
33370 7d 0a 20 20 20 20 69 66 28 20 7a 44 69 76 20 29  }.    if( zDiv )
33380 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
33390 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b  stmt *pStmt = 0;
333a0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
333b0 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 70  te3_prepare_v2(p
333c0 2d 3e 64 62 2c 20 22 53 45 4c 45 43 54 20 6e 61  ->db, "SELECT na
333d0 6d 65 20 46 52 4f 4d 20 70 72 61 67 6d 61 5f 64  me FROM pragma_d
333e0 61 74 61 62 61 73 65 5f 6c 69 73 74 22 2c 0a 20  atabase_list",. 
333f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33400 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 31 2c               -1,
33410 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20   &pStmt, 0);.   
33420 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
33430 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
33440 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a  (stderr, "Error:
33450 20 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f   %s\n", sqlite3_
33460 65 72 72 6d 73 67 28 70 2d 3e 64 62 29 29 3b 0a  errmsg(p->db));.
33470 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
33480 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b  finalize(pStmt);
33490 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b  .        rc = 1;
334a0 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 65  .        goto me
334b0 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b  ta_command_exit;
334c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
334d0 70 70 65 6e 64 54 65 78 74 28 26 73 53 65 6c 65  ppendText(&sSele
334e0 63 74 2c 20 22 53 45 4c 45 43 54 20 73 71 6c 20  ct, "SELECT sql 
334f0 46 52 4f 4d 22 2c 20 30 29 3b 0a 20 20 20 20 20  FROM", 0);.     
33500 20 69 53 63 68 65 6d 61 20 3d 20 30 3b 0a 20 20   iSchema = 0;.  
33510 20 20 20 20 77 68 69 6c 65 28 20 73 71 6c 69 74      while( sqlit
33520 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3d 3d  e3_step(pStmt)==
33530 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20  SQLITE_ROW ){.  
33540 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
33550 20 2a 7a 44 62 20 3d 20 28 63 6f 6e 73 74 20 63   *zDb = (const c
33560 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c  har*)sqlite3_col
33570 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 20  umn_text(pStmt, 
33580 30 29 3b 0a 20 20 20 20 20 20 20 20 63 68 61 72  0);.        char
33590 20 7a 53 63 4e 75 6d 5b 33 30 5d 3b 0a 20 20 20   zScNum[30];.   
335a0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
335b0 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 53 63  rintf(sizeof(zSc
335c0 4e 75 6d 29 2c 20 7a 53 63 4e 75 6d 2c 20 22 25  Num), zScNum, "%
335d0 64 22 2c 20 2b 2b 69 53 63 68 65 6d 61 29 3b 0a  d", ++iSchema);.
335e0 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 54 65          appendTe
335f0 78 74 28 26 73 53 65 6c 65 63 74 2c 20 7a 44 69  xt(&sSelect, zDi
33600 76 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7a  v, 0);.        z
33610 44 69 76 20 3d 20 22 20 55 4e 49 4f 4e 20 41 4c  Div = " UNION AL
33620 4c 20 22 3b 0a 20 20 20 20 20 20 20 20 61 70 70  L ";.        app
33630 65 6e 64 54 65 78 74 28 26 73 53 65 6c 65 63 74  endText(&sSelect
33640 2c 20 22 53 45 4c 45 43 54 20 73 68 65 6c 6c 5f  , "SELECT shell_
33650 61 64 64 5f 73 63 68 65 6d 61 28 73 71 6c 2c 22  add_schema(sql,"
33660 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , 0);.        if
33670 28 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d  ( sqlite3_stricm
33680 70 28 7a 44 62 2c 20 22 6d 61 69 6e 22 29 21 3d  p(zDb, "main")!=
33690 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  0 ){.          a
336a0 70 70 65 6e 64 54 65 78 74 28 26 73 53 65 6c 65  ppendText(&sSele
336b0 63 74 2c 20 7a 44 62 2c 20 27 22 27 29 3b 0a 20  ct, zDb, '"');. 
336c0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
336d0 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 54 65          appendTe
336e0 78 74 28 26 73 53 65 6c 65 63 74 2c 20 22 4e 55  xt(&sSelect, "NU
336f0 4c 4c 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  LL", 0);.       
33700 20 7d 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e   }.        appen
33710 64 54 65 78 74 28 26 73 53 65 6c 65 63 74 2c 20  dText(&sSelect, 
33720 22 2c 6e 61 6d 65 29 20 41 53 20 73 71 6c 2c 20  ",name) AS sql, 
33730 74 79 70 65 2c 20 74 62 6c 5f 6e 61 6d 65 2c 20  type, tbl_name, 
33740 6e 61 6d 65 2c 20 72 6f 77 69 64 2c 22 2c 20 30  name, rowid,", 0
33750 29 3b 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e  );.        appen
33760 64 54 65 78 74 28 26 73 53 65 6c 65 63 74 2c 20  dText(&sSelect, 
33770 7a 53 63 4e 75 6d 2c 20 30 29 3b 0a 20 20 20 20  zScNum, 0);.    
33780 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26      appendText(&
33790 73 53 65 6c 65 63 74 2c 20 22 20 41 53 20 73 6e  sSelect, " AS sn
337a0 75 6d 2c 20 22 2c 20 30 29 3b 0a 20 20 20 20 20  um, ", 0);.     
337b0 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73     appendText(&s
337c0 53 65 6c 65 63 74 2c 20 7a 44 62 2c 20 27 5c 27  Select, 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 20 41 53 20 73 6e 61 6d 65 20 46 52 4f 4d   " AS sname FROM
33800 20 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20   ", 0);.        
33810 61 70 70 65 6e 64 54 65 78 74 28 26 73 53 65 6c  appendText(&sSel
33820 65 63 74 2c 20 7a 44 62 2c 20 27 22 27 29 3b 0a  ect, zDb, '"');.
33830 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 54 65          appendTe
33840 78 74 28 26 73 53 65 6c 65 63 74 2c 20 22 2e 73  xt(&sSelect, ".s
33850 71 6c 69 74 65 5f 6d 61 73 74 65 72 22 2c 20 30  qlite_master", 0
33860 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
33870 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
33880 65 28 70 53 74 6d 74 29 3b 0a 23 69 66 64 65 66  e(pStmt);.#ifdef
33890 20 53 51 4c 49 54 45 5f 49 4e 54 52 4f 53 50 45   SQLITE_INTROSPE
338a0 43 54 49 4f 4e 5f 50 52 41 47 4d 41 53 0a 20 20  CTION_PRAGMAS.  
338b0 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 20 29 7b      if( zName ){
338c0 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 54  .        appendT
338d0 65 78 74 28 26 73 53 65 6c 65 63 74 2c 0a 20 20  ext(&sSelect,.  
338e0 20 20 20 20 20 20 20 20 20 22 20 55 4e 49 4f 4e           " UNION
338f0 20 41 4c 4c 20 53 45 4c 45 43 54 20 73 68 65 6c   ALL SELECT shel
33900 6c 5f 6d 6f 64 75 6c 65 5f 73 63 68 65 6d 61 28  l_module_schema(
33910 6e 61 6d 65 29 2c 22 0a 20 20 20 20 20 20 20 20  name),".        
33920 20 20 20 22 20 27 74 61 62 6c 65 27 2c 20 6e 61     " 'table', na
33930 6d 65 2c 20 6e 61 6d 65 2c 20 6e 61 6d 65 2c 20  me, name, name, 
33940 39 65 2b 39 39 2c 20 27 6d 61 69 6e 27 20 46 52  9e+99, 'main' FR
33950 4f 4d 20 70 72 61 67 6d 61 5f 6d 6f 64 75 6c 65  OM pragma_module
33960 5f 6c 69 73 74 22 2c 20 30 29 3b 0a 20 20 20 20  _list", 0);.    
33970 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
33980 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 53 65   appendText(&sSe
33990 6c 65 63 74 2c 20 22 29 20 57 48 45 52 45 20 22  lect, ") WHERE "
339a0 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
339b0 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20  zName ){.       
339c0 20 63 68 61 72 20 2a 7a 51 61 72 67 20 3d 20 73   char *zQarg = s
339d0 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
339e0 25 51 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  %Q", zName);.   
339f0 20 20 20 20 20 69 6e 74 20 62 47 6c 6f 62 20 3d       int bGlob =
33a00 20 73 74 72 63 68 72 28 7a 4e 61 6d 65 2c 20 27   strchr(zName, '
33a10 2a 27 29 20 21 3d 20 30 20 7c 7c 20 73 74 72 63  *') != 0 || strc
33a20 68 72 28 7a 4e 61 6d 65 2c 20 27 3f 27 29 20 21  hr(zName, '?') !
33a30 3d 20 30 20 7c 7c 0a 20 20 20 20 20 20 20 20 20  = 0 ||.         
33a40 20 20 20 20 20 20 20 20 20 20 20 73 74 72 63 68             strch
33a50 72 28 7a 4e 61 6d 65 2c 20 27 5b 27 29 20 21 3d  r(zName, '[') !=
33a60 20 30 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   0;.        if( 
33a70 73 74 72 63 68 72 28 7a 4e 61 6d 65 2c 20 27 2e  strchr(zName, '.
33a80 27 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ') ){.          
33a90 61 70 70 65 6e 64 54 65 78 74 28 26 73 53 65 6c  appendText(&sSel
33aa0 65 63 74 2c 20 22 6c 6f 77 65 72 28 70 72 69 6e  ect, "lower(prin
33ab0 74 66 28 27 25 73 2e 25 73 27 2c 73 6e 61 6d 65  tf('%s.%s',sname
33ac0 2c 74 62 6c 5f 6e 61 6d 65 29 29 22 2c 20 30 29  ,tbl_name))", 0)
33ad0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
33ae0 0a 20 20 20 20 20 20 20 20 20 20 61 70 70 65 6e  .          appen
33af0 64 54 65 78 74 28 26 73 53 65 6c 65 63 74 2c 20  dText(&sSelect, 
33b00 22 6c 6f 77 65 72 28 74 62 6c 5f 6e 61 6d 65 29  "lower(tbl_name)
33b10 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d  ", 0);.        }
33b20 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 54  .        appendT
33b30 65 78 74 28 26 73 53 65 6c 65 63 74 2c 20 62 47  ext(&sSelect, bG
33b40 6c 6f 62 20 3f 20 22 20 47 4c 4f 42 20 22 20 3a  lob ? " GLOB " :
33b50 20 22 20 4c 49 4b 45 20 22 2c 20 30 29 3b 0a 20   " LIKE ", 0);. 
33b60 20 20 20 20 20 20 20 61 70 70 65 6e 64 54 65 78         appendTex
33b70 74 28 26 73 53 65 6c 65 63 74 2c 20 7a 51 61 72  t(&sSelect, zQar
33b80 67 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69  g, 0);.        i
33b90 66 28 20 21 62 47 6c 6f 62 20 29 7b 0a 20 20 20  f( !bGlob ){.   
33ba0 20 20 20 20 20 20 20 61 70 70 65 6e 64 54 65 78         appendTex
33bb0 74 28 26 73 53 65 6c 65 63 74 2c 20 22 20 45 53  t(&sSelect, " ES
33bc0 43 41 50 45 20 27 5c 5c 27 20 22 2c 20 30 29 3b  CAPE '\\' ", 0);
33bd0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
33be0 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73     appendText(&s
33bf0 53 65 6c 65 63 74 2c 20 22 20 41 4e 44 20 22 2c  Select, " AND ",
33c00 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c   0);.        sql
33c10 69 74 65 33 5f 66 72 65 65 28 7a 51 61 72 67 29  ite3_free(zQarg)
33c20 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
33c30 61 70 70 65 6e 64 54 65 78 74 28 26 73 53 65 6c  appendText(&sSel
33c40 65 63 74 2c 20 22 74 79 70 65 21 3d 27 6d 65 74  ect, "type!='met
33c50 61 27 20 41 4e 44 20 73 71 6c 20 49 53 20 4e 4f  a' AND sql IS NO
33c60 54 20 4e 55 4c 4c 22 0a 20 20 20 20 20 20 20 20  T NULL".        
33c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33c80 20 20 20 22 20 4f 52 44 45 52 20 42 59 20 73 6e     " ORDER BY sn
33c90 75 6d 2c 20 72 6f 77 69 64 22 2c 20 30 29 3b 0a  um, rowid", 0);.
33ca0 20 20 20 20 20 20 69 66 28 20 62 44 65 62 75 67        if( bDebug
33cb0 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38   ){.        utf8
33cc0 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
33cd0 22 53 51 4c 3a 20 25 73 3b 5c 6e 22 2c 20 73 53  "SQL: %s;\n", sS
33ce0 65 6c 65 63 74 2e 7a 29 3b 0a 20 20 20 20 20 20  elect.z);.      
33cf0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72  }else{.        r
33d00 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63  c = sqlite3_exec
33d10 28 70 2d 3e 64 62 2c 20 73 53 65 6c 65 63 74 2e  (p->db, sSelect.
33d20 7a 2c 20 63 61 6c 6c 62 61 63 6b 2c 20 26 64 61  z, callback, &da
33d30 74 61 2c 20 26 7a 45 72 72 4d 73 67 29 3b 0a 20  ta, &zErrMsg);. 
33d40 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 72 65       }.      fre
33d50 65 54 65 78 74 28 26 73 53 65 6c 65 63 74 29 3b  eText(&sSelect);
33d60 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 7a  .    }.    if( z
33d70 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20 20 20  ErrMsg ){.      
33d80 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65  utf8_printf(stde
33d90 72 72 2c 22 45 72 72 6f 72 3a 20 25 73 5c 6e 22  rr,"Error: %s\n"
33da0 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20  , zErrMsg);.    
33db0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
33dc0 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 72  ErrMsg);.      r
33dd0 63 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65  c = 1;.    }else
33de0 20 69 66 28 20 72 63 20 21 3d 20 53 51 4c 49 54   if( rc != SQLIT
33df0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 61  E_OK ){.      ra
33e00 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  w_printf(stderr,
33e10 22 45 72 72 6f 72 3a 20 71 75 65 72 79 69 6e 67  "Error: querying
33e20 20 73 63 68 65 6d 61 20 69 6e 66 6f 72 6d 61 74   schema informat
33e30 69 6f 6e 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72  ion\n");.      r
33e40 63 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65  c = 1;.    }else
33e50 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 30 3b 0a  {.      rc = 0;.
33e60 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 23      }.  }else..#
33e70 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
33e80 45 5f 44 45 42 55 47 29 20 26 26 20 64 65 66 69  E_DEBUG) && defi
33e90 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
33ea0 45 5f 53 45 4c 45 43 54 54 52 41 43 45 29 0a 20  E_SELECTTRACE). 
33eb0 20 69 66 28 20 63 3d 3d 27 73 27 20 26 26 20 6e   if( c=='s' && n
33ec0 3d 3d 31 31 20 26 26 20 73 74 72 6e 63 6d 70 28  ==11 && strncmp(
33ed0 61 7a 41 72 67 5b 30 5d 2c 20 22 73 65 6c 65 63  azArg[0], "selec
33ee0 74 74 72 61 63 65 22 2c 20 6e 29 3d 3d 30 20 29  ttrace", n)==0 )
33ef0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c  {.    sqlite3Sel
33f00 65 63 74 54 72 61 63 65 20 3d 20 28 69 6e 74 29  ectTrace = (int)
33f10 69 6e 74 65 67 65 72 56 61 6c 75 65 28 61 7a 41  integerValue(azA
33f20 72 67 5b 31 5d 29 3b 0a 20 20 7d 65 6c 73 65 0a  rg[1]);.  }else.
33f30 23 65 6e 64 69 66 0a 0a 23 69 66 20 64 65 66 69  #endif..#if defi
33f40 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
33f50 45 5f 53 45 53 53 49 4f 4e 29 0a 20 20 69 66 28  E_SESSION).  if(
33f60 20 63 3d 3d 27 73 27 20 26 26 20 73 74 72 6e 63   c=='s' && strnc
33f70 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 22 73 65 73  mp(azArg[0],"ses
33f80 73 69 6f 6e 22 2c 6e 29 3d 3d 30 20 26 26 20 6e  sion",n)==0 && n
33f90 3e 3d 33 20 29 7b 0a 20 20 20 20 4f 70 65 6e 53  >=3 ){.    OpenS
33fa0 65 73 73 69 6f 6e 20 2a 70 53 65 73 73 69 6f 6e  ession *pSession
33fb0 20 3d 20 26 70 2d 3e 61 53 65 73 73 69 6f 6e 5b   = &p->aSession[
33fc0 30 5d 3b 0a 20 20 20 20 63 68 61 72 20 2a 2a 61  0];.    char **a
33fd0 7a 43 6d 64 20 3d 20 26 61 7a 41 72 67 5b 31 5d  zCmd = &azArg[1]
33fe0 3b 0a 20 20 20 20 69 6e 74 20 69 53 65 73 20 3d  ;.    int iSes =
33ff0 20 30 3b 0a 20 20 20 20 69 6e 74 20 6e 43 6d 64   0;.    int nCmd
34000 20 3d 20 6e 41 72 67 20 2d 20 31 3b 0a 20 20 20   = nArg - 1;.   
34010 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 66 28 20   int i;.    if( 
34020 6e 41 72 67 3c 3d 31 20 29 20 67 6f 74 6f 20 73  nArg<=1 ) goto s
34030 65 73 73 69 6f 6e 5f 73 79 6e 74 61 78 5f 65 72  ession_syntax_er
34040 72 6f 72 3b 0a 20 20 20 20 6f 70 65 6e 5f 64 62  ror;.    open_db
34050 28 70 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  (p, 0);.    if( 
34060 6e 41 72 67 3e 3d 33 20 29 7b 0a 20 20 20 20 20  nArg>=3 ){.     
34070 20 66 6f 72 28 69 53 65 73 3d 30 3b 20 69 53 65   for(iSes=0; iSe
34080 73 3c 70 2d 3e 6e 53 65 73 73 69 6f 6e 3b 20 69  s<p->nSession; i
34090 53 65 73 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  Ses++){.        
340a0 69 66 28 20 73 74 72 63 6d 70 28 70 2d 3e 61 53  if( strcmp(p->aS
340b0 65 73 73 69 6f 6e 5b 69 53 65 73 5d 2e 7a 4e 61  ession[iSes].zNa
340c0 6d 65 2c 20 61 7a 41 72 67 5b 31 5d 29 3d 3d 30  me, azArg[1])==0
340d0 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
340e0 7d 0a 20 20 20 20 20 20 69 66 28 20 69 53 65 73  }.      if( iSes
340f0 3c 70 2d 3e 6e 53 65 73 73 69 6f 6e 20 29 7b 0a  <p->nSession ){.
34100 20 20 20 20 20 20 20 20 70 53 65 73 73 69 6f 6e          pSession
34110 20 3d 20 26 70 2d 3e 61 53 65 73 73 69 6f 6e 5b   = &p->aSession[
34120 69 53 65 73 5d 3b 0a 20 20 20 20 20 20 20 20 61  iSes];.        a
34130 7a 43 6d 64 2b 2b 3b 0a 20 20 20 20 20 20 20 20  zCmd++;.        
34140 6e 43 6d 64 2d 2d 3b 0a 20 20 20 20 20 20 7d 65  nCmd--;.      }e
34150 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 53 65  lse{.        pSe
34160 73 73 69 6f 6e 20 3d 20 26 70 2d 3e 61 53 65 73  ssion = &p->aSes
34170 73 69 6f 6e 5b 30 5d 3b 0a 20 20 20 20 20 20 20  sion[0];.       
34180 20 69 53 65 73 20 3d 20 30 3b 0a 20 20 20 20 20   iSes = 0;.     
34190 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
341a0 20 2e 73 65 73 73 69 6f 6e 20 61 74 74 61 63 68   .session attach
341b0 20 54 41 42 4c 45 0a 20 20 20 20 2a 2a 20 49 6e   TABLE.    ** In
341c0 76 6f 6b 65 20 74 68 65 20 73 71 6c 69 74 65 33  voke the sqlite3
341d0 73 65 73 73 69 6f 6e 5f 61 74 74 61 63 68 28 29  session_attach()
341e0 20 69 6e 74 65 72 66 61 63 65 20 74 6f 20 61 74   interface to at
341f0 74 61 63 68 20 61 20 70 61 72 74 69 63 75 6c 61  tach a particula
34200 72 0a 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 73  r.    ** table s
34210 6f 20 74 68 61 74 20 69 74 20 69 73 20 6e 65 76  o that it is nev
34220 65 72 20 66 69 6c 74 65 72 65 64 2e 0a 20 20 20  er filtered..   
34230 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 74 72 63   */.    if( strc
34240 6d 70 28 61 7a 43 6d 64 5b 30 5d 2c 22 61 74 74  mp(azCmd[0],"att
34250 61 63 68 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ach")==0 ){.    
34260 20 20 69 66 28 20 6e 43 6d 64 21 3d 32 20 29 20    if( nCmd!=2 ) 
34270 67 6f 74 6f 20 73 65 73 73 69 6f 6e 5f 73 79 6e  goto session_syn
34280 74 61 78 5f 65 72 72 6f 72 3b 0a 20 20 20 20 20  tax_error;.     
34290 20 69 66 28 20 70 53 65 73 73 69 6f 6e 2d 3e 70   if( pSession->p
342a0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ==0 ){.        s
342b0 65 73 73 69 6f 6e 5f 6e 6f 74 5f 6f 70 65 6e 3a  ession_not_open:
342c0 0a 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69  .        raw_pri
342d0 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 52 52  ntf(stderr, "ERR
342e0 4f 52 3a 20 4e 6f 20 73 65 73 73 69 6f 6e 73 20  OR: No sessions 
342f0 61 72 65 20 6f 70 65 6e 5c 6e 22 29 3b 0a 20 20  are open\n");.  
34300 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
34310 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 73     rc = sqlite3s
34320 65 73 73 69 6f 6e 5f 61 74 74 61 63 68 28 70 53  ession_attach(pS
34330 65 73 73 69 6f 6e 2d 3e 70 2c 20 61 7a 43 6d 64  ession->p, azCmd
34340 5b 31 5d 29 3b 0a 20 20 20 20 20 20 20 20 69 66  [1]);.        if
34350 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
34360 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64    raw_printf(std
34370 65 72 72 2c 20 22 45 52 52 4f 52 3a 20 73 71 6c  err, "ERROR: sql
34380 69 74 65 33 73 65 73 73 69 6f 6e 5f 61 74 74 61  ite3session_atta
34390 63 68 28 29 20 72 65 74 75 72 6e 73 20 25 64 5c  ch() returns %d\
343a0 6e 22 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 20  n", rc);.       
343b0 20 20 20 72 63 20 3d 20 30 3b 0a 20 20 20 20 20     rc = 0;.     
343c0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
343d0 20 7d 65 6c 73 65 0a 0a 20 20 20 20 2f 2a 20 2e   }else..    /* .
343e0 73 65 73 73 69 6f 6e 20 63 68 61 6e 67 65 73 65  session changese
343f0 74 20 46 49 4c 45 0a 20 20 20 20 2a 2a 20 2e 73  t FILE.    ** .s
34400 65 73 73 69 6f 6e 20 70 61 74 63 68 73 65 74 20  ession patchset 
34410 46 49 4c 45 0a 20 20 20 20 2a 2a 20 57 72 69 74  FILE.    ** Writ
34420 65 20 61 20 63 68 61 6e 67 65 73 65 74 20 6f 72  e a changeset or
34430 20 70 61 74 63 68 73 65 74 20 69 6e 74 6f 20 61   patchset into a
34440 20 66 69 6c 65 2e 20 20 54 68 65 20 66 69 6c 65   file.  The file
34450 20 69 73 20 6f 76 65 72 77 72 69 74 74 65 6e 2e   is overwritten.
34460 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
34470 73 74 72 63 6d 70 28 61 7a 43 6d 64 5b 30 5d 2c  strcmp(azCmd[0],
34480 22 63 68 61 6e 67 65 73 65 74 22 29 3d 3d 30 20  "changeset")==0 
34490 7c 7c 20 73 74 72 63 6d 70 28 61 7a 43 6d 64 5b  || strcmp(azCmd[
344a0 30 5d 2c 22 70 61 74 63 68 73 65 74 22 29 3d 3d  0],"patchset")==
344b0 30 20 29 7b 0a 20 20 20 20 20 20 46 49 4c 45 20  0 ){.      FILE 
344c0 2a 6f 75 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  *out = 0;.      
344d0 69 66 28 20 6e 43 6d 64 21 3d 32 20 29 20 67 6f  if( nCmd!=2 ) go
344e0 74 6f 20 73 65 73 73 69 6f 6e 5f 73 79 6e 74 61  to session_synta
344f0 78 5f 65 72 72 6f 72 3b 0a 20 20 20 20 20 20 69  x_error;.      i
34500 66 28 20 70 53 65 73 73 69 6f 6e 2d 3e 70 3d 3d  f( pSession->p==
34510 30 20 29 20 67 6f 74 6f 20 73 65 73 73 69 6f 6e  0 ) goto session
34520 5f 6e 6f 74 5f 6f 70 65 6e 3b 0a 20 20 20 20 20  _not_open;.     
34530 20 6f 75 74 20 3d 20 66 6f 70 65 6e 28 61 7a 43   out = fopen(azC
34540 6d 64 5b 31 5d 2c 20 22 77 62 22 29 3b 0a 20 20  md[1], "wb");.  
34550 20 20 20 20 69 66 28 20 6f 75 74 3d 3d 30 20 29      if( out==0 )
34560 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70  {.        utf8_p
34570 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45  rintf(stderr, "E
34580 52 52 4f 52 3a 20 63 61 6e 6e 6f 74 20 6f 70 65  RROR: cannot ope
34590 6e 20 5c 22 25 73 5c 22 20 66 6f 72 20 77 72 69  n \"%s\" for wri
345a0 74 69 6e 67 5c 6e 22 2c 20 61 7a 43 6d 64 5b 31  ting\n", azCmd[1
345b0 5d 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ]);.      }else{
345c0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 73 7a 43  .        int szC
345d0 68 6e 67 3b 0a 20 20 20 20 20 20 20 20 76 6f 69  hng;.        voi
345e0 64 20 2a 70 43 68 6e 67 3b 0a 20 20 20 20 20 20  d *pChng;.      
345f0 20 20 69 66 28 20 61 7a 43 6d 64 5b 30 5d 5b 30    if( azCmd[0][0
34600 5d 3d 3d 27 63 27 20 29 7b 0a 20 20 20 20 20 20  ]=='c' ){.      
34610 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
34620 73 65 73 73 69 6f 6e 5f 63 68 61 6e 67 65 73 65  session_changese
34630 74 28 70 53 65 73 73 69 6f 6e 2d 3e 70 2c 20 26  t(pSession->p, &
34640 73 7a 43 68 6e 67 2c 20 26 70 43 68 6e 67 29 3b  szChng, &pChng);
34650 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
34660 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
34670 71 6c 69 74 65 33 73 65 73 73 69 6f 6e 5f 70 61  qlite3session_pa
34680 74 63 68 73 65 74 28 70 53 65 73 73 69 6f 6e 2d  tchset(pSession-
34690 3e 70 2c 20 26 73 7a 43 68 6e 67 2c 20 26 70 43  >p, &szChng, &pC
346a0 68 6e 67 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  hng);.        }.
346b0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29          if( rc )
346c0 7b 0a 20 20 20 20 20 20 20 20 20 20 70 72 69 6e  {.          prin
346d0 74 66 28 22 45 72 72 6f 72 3a 20 65 72 72 6f 72  tf("Error: error
346e0 20 63 6f 64 65 20 25 64 5c 6e 22 2c 20 72 63 29   code %d\n", rc)
346f0 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
34700 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   0;.        }.  
34710 20 20 20 20 20 20 69 66 28 20 70 43 68 6e 67 0a        if( pChng.
34720 20 20 20 20 20 20 20 20 20 20 26 26 20 66 77 72            && fwr
34730 69 74 65 28 70 43 68 6e 67 2c 20 73 7a 43 68 6e  ite(pChng, szChn
34740 67 2c 20 31 2c 20 6f 75 74 29 21 3d 31 20 29 7b  g, 1, out)!=1 ){
34750 0a 20 20 20 20 20 20 20 20 20 20 72 61 77 5f 70  .          raw_p
34760 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45  rintf(stderr, "E
34770 52 52 4f 52 3a 20 46 61 69 6c 65 64 20 74 6f 20  RROR: Failed to 
34780 77 72 69 74 65 20 65 6e 74 69 72 65 20 25 64 2d  write entire %d-
34790 62 79 74 65 20 6f 75 74 70 75 74 5c 6e 22 2c 0a  byte output\n",.
347a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
347b0 20 20 73 7a 43 68 6e 67 29 3b 0a 20 20 20 20 20    szChng);.     
347c0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c     }.        sql
347d0 69 74 65 33 5f 66 72 65 65 28 70 43 68 6e 67 29  ite3_free(pChng)
347e0 3b 0a 20 20 20 20 20 20 20 20 66 63 6c 6f 73 65  ;.        fclose
347f0 28 6f 75 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20  (out);.      }. 
34800 20 20 20 7d 65 6c 73 65 0a 0a 20 20 20 20 2f 2a     }else..    /*
34810 20 2e 73 65 73 73 69 6f 6e 20 63 6c 6f 73 65 0a   .session close.
34820 20 20 20 20 2a 2a 20 43 6c 6f 73 65 20 74 68 65      ** Close the
34830 20 69 64 65 6e 74 69 66 69 65 64 20 73 65 73 73   identified sess
34840 69 6f 6e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ion.    */.    i
34850 66 28 20 73 74 72 63 6d 70 28 61 7a 43 6d 64 5b  f( strcmp(azCmd[
34860 30 5d 2c 20 22 63 6c 6f 73 65 22 29 3d 3d 30 20  0], "close")==0 
34870 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 43 6d  ){.      if( nCm
34880 64 21 3d 31 20 29 20 67 6f 74 6f 20 73 65 73 73  d!=1 ) goto sess
34890 69 6f 6e 5f 73 79 6e 74 61 78 5f 65 72 72 6f 72  ion_syntax_error
348a0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6e  ;.      if( p->n
348b0 53 65 73 73 69 6f 6e 20 29 7b 0a 20 20 20 20 20  Session ){.     
348c0 20 20 20 73 65 73 73 69 6f 6e 5f 63 6c 6f 73 65     session_close
348d0 28 70 53 65 73 73 69 6f 6e 29 3b 0a 20 20 20 20  (pSession);.    
348e0 20 20 20 20 70 2d 3e 61 53 65 73 73 69 6f 6e 5b      p->aSession[
348f0 69 53 65 73 5d 20 3d 20 70 2d 3e 61 53 65 73 73  iSes] = p->aSess
34900 69 6f 6e 5b 2d 2d 70 2d 3e 6e 53 65 73 73 69 6f  ion[--p->nSessio
34910 6e 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  n];.      }.    
34920 7d 65 6c 73 65 0a 0a 20 20 20 20 2f 2a 20 2e 73  }else..    /* .s
34930 65 73 73 69 6f 6e 20 65 6e 61 62 6c 65 20 3f 42  ession enable ?B
34940 4f 4f 4c 45 41 4e 3f 0a 20 20 20 20 2a 2a 20 51  OOLEAN?.    ** Q
34950 75 65 72 79 20 6f 72 20 73 65 74 20 74 68 65 20  uery or set the 
34960 65 6e 61 62 6c 65 20 66 6c 61 67 0a 20 20 20 20  enable flag.    
34970 2a 2f 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d  */.    if( strcm
34980 70 28 61 7a 43 6d 64 5b 30 5d 2c 20 22 65 6e 61  p(azCmd[0], "ena
34990 62 6c 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ble")==0 ){.    
349a0 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 20 20    int ii;.      
349b0 69 66 28 20 6e 43 6d 64 3e 32 20 29 20 67 6f 74  if( nCmd>2 ) got
349c0 6f 20 73 65 73 73 69 6f 6e 5f 73 79 6e 74 61 78  o session_syntax
349d0 5f 65 72 72 6f 72 3b 0a 20 20 20 20 20 20 69 69  _error;.      ii
349e0 20 3d 20 6e 43 6d 64 3d 3d 31 20 3f 20 2d 31 20   = nCmd==1 ? -1 
349f0 3a 20 62 6f 6f 6c 65 61 6e 56 61 6c 75 65 28 61  : booleanValue(a
34a00 7a 43 6d 64 5b 31 5d 29 3b 0a 20 20 20 20 20 20  zCmd[1]);.      
34a10 69 66 28 20 70 2d 3e 6e 53 65 73 73 69 6f 6e 20  if( p->nSession 
34a20 29 7b 0a 20 20 20 20 20 20 20 20 69 69 20 3d 20  ){.        ii = 
34a30 73 71 6c 69 74 65 33 73 65 73 73 69 6f 6e 5f 65  sqlite3session_e
34a40 6e 61 62 6c 65 28 70 53 65 73 73 69 6f 6e 2d 3e  nable(pSession->
34a50 70 2c 20 69 69 29 3b 0a 20 20 20 20 20 20 20 20  p, ii);.        
34a60 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f  utf8_printf(p->o
34a70 75 74 2c 20 22 73 65 73 73 69 6f 6e 20 25 73 20  ut, "session %s 
34a80 65 6e 61 62 6c 65 20 66 6c 61 67 20 3d 20 25 64  enable flag = %d
34a90 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
34aa0 20 20 20 20 20 20 20 20 20 70 53 65 73 73 69 6f           pSessio
34ab0 6e 2d 3e 7a 4e 61 6d 65 2c 20 69 69 29 3b 0a 20  n->zName, ii);. 
34ac0 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
34ad0 0a 0a 20 20 20 20 2f 2a 20 2e 73 65 73 73 69 6f  ..    /* .sessio
34ae0 6e 20 66 69 6c 74 65 72 20 47 4c 4f 42 20 2e 2e  n filter GLOB ..
34af0 2e 2e 0a 20 20 20 20 2a 2a 20 53 65 74 20 61 20  ...    ** Set a 
34b00 6c 69 73 74 20 6f 66 20 47 4c 4f 42 20 70 61 74  list of GLOB pat
34b10 74 65 72 6e 73 20 6f 66 20 74 61 62 6c 65 20 6e  terns of table n
34b20 61 6d 65 73 20 74 6f 20 62 65 20 65 78 63 6c 75  ames to be exclu
34b30 64 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ded..    */.    
34b40 69 66 28 20 73 74 72 63 6d 70 28 61 7a 43 6d 64  if( strcmp(azCmd
34b50 5b 30 5d 2c 20 22 66 69 6c 74 65 72 22 29 3d 3d  [0], "filter")==
34b60 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  0 ){.      int i
34b70 69 2c 20 6e 42 79 74 65 3b 0a 20 20 20 20 20 20  i, nByte;.      
34b80 69 66 28 20 6e 43 6d 64 3c 32 20 29 20 67 6f 74  if( nCmd<2 ) got
34b90 6f 20 73 65 73 73 69 6f 6e 5f 73 79 6e 74 61 78  o session_syntax
34ba0 5f 65 72 72 6f 72 3b 0a 20 20 20 20 20 20 69 66  _error;.      if
34bb0 28 20 70 2d 3e 6e 53 65 73 73 69 6f 6e 20 29 7b  ( p->nSession ){
34bc0 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 69 3d  .        for(ii=
34bd0 30 3b 20 69 69 3c 70 53 65 73 73 69 6f 6e 2d 3e  0; ii<pSession->
34be0 6e 46 69 6c 74 65 72 3b 20 69 69 2b 2b 29 7b 0a  nFilter; ii++){.
34bf0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
34c00 33 5f 66 72 65 65 28 70 53 65 73 73 69 6f 6e 2d  3_free(pSession-
34c10 3e 61 7a 46 69 6c 74 65 72 5b 69 69 5d 29 3b 0a  >azFilter[ii]);.
34c20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
34c30 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
34c40 53 65 73 73 69 6f 6e 2d 3e 61 7a 46 69 6c 74 65  Session->azFilte
34c50 72 29 3b 0a 20 20 20 20 20 20 20 20 6e 42 79 74  r);.        nByt
34c60 65 20 3d 20 73 69 7a 65 6f 66 28 70 53 65 73 73  e = sizeof(pSess
34c70 69 6f 6e 2d 3e 61 7a 46 69 6c 74 65 72 5b 30 5d  ion->azFilter[0]
34c80 29 2a 28 6e 43 6d 64 2d 31 29 3b 0a 20 20 20 20  )*(nCmd-1);.    
34c90 20 20 20 20 70 53 65 73 73 69 6f 6e 2d 3e 61 7a      pSession->az
34ca0 46 69 6c 74 65 72 20 3d 20 73 71 6c 69 74 65 33  Filter = sqlite3
34cb0 5f 6d 61 6c 6c 6f 63 28 20 6e 42 79 74 65 20 29  _malloc( nByte )
34cc0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 53  ;.        if( pS
34cd0 65 73 73 69 6f 6e 2d 3e 61 7a 46 69 6c 74 65 72  ession->azFilter
34ce0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
34cf0 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65   raw_printf(stde
34d00 72 72 2c 20 22 45 72 72 6f 72 3a 20 6f 75 74 20  rr, "Error: out 
34d10 6f 72 20 6d 65 6d 6f 72 79 5c 6e 22 29 3b 0a 20  or memory\n");. 
34d20 20 20 20 20 20 20 20 20 20 65 78 69 74 28 31 29           exit(1)
34d30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
34d40 20 20 20 20 66 6f 72 28 69 69 3d 31 3b 20 69 69      for(ii=1; ii
34d50 3c 6e 43 6d 64 3b 20 69 69 2b 2b 29 7b 0a 20 20  <nCmd; ii++){.  
34d60 20 20 20 20 20 20 20 20 70 53 65 73 73 69 6f 6e          pSession
34d70 2d 3e 61 7a 46 69 6c 74 65 72 5b 69 69 2d 31 5d  ->azFilter[ii-1]
34d80 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
34d90 74 66 28 22 25 73 22 2c 20 61 7a 43 6d 64 5b 69  tf("%s", azCmd[i
34da0 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  i]);.        }. 
34db0 20 20 20 20 20 20 20 70 53 65 73 73 69 6f 6e 2d         pSession-
34dc0 3e 6e 46 69 6c 74 65 72 20 3d 20 69 69 2d 31 3b  >nFilter = ii-1;
34dd0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
34de0 73 65 0a 0a 20 20 20 20 2f 2a 20 2e 73 65 73 73  se..    /* .sess
34df0 69 6f 6e 20 69 6e 64 69 72 65 63 74 20 3f 42 4f  ion indirect ?BO
34e00 4f 4c 45 41 4e 3f 0a 20 20 20 20 2a 2a 20 51 75  OLEAN?.    ** Qu
34e10 65 72 79 20 6f 72 20 73 65 74 20 74 68 65 20 69  ery or set the i
34e20 6e 64 69 72 65 63 74 20 66 6c 61 67 0a 20 20 20  ndirect flag.   
34e30 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 74 72 63   */.    if( strc
34e40 6d 70 28 61 7a 43 6d 64 5b 30 5d 2c 20 22 69 6e  mp(azCmd[0], "in
34e50 64 69 72 65 63 74 22 29 3d 3d 30 20 29 7b 0a 20  direct")==0 ){. 
34e60 20 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20       int ii;.   
34e70 20 20 20 69 66 28 20 6e 43 6d 64 3e 32 20 29 20     if( nCmd>2 ) 
34e80 67 6f 74 6f 20 73 65 73 73 69 6f 6e 5f 73 79 6e  goto session_syn
34e90 74 61 78 5f 65 72 72 6f 72 3b 0a 20 20 20 20 20  tax_error;.     
34ea0 20 69 69 20 3d 20 6e 43 6d 64 3d 3d 31 20 3f 20   ii = nCmd==1 ? 
34eb0 2d 31 20 3a 20 62 6f 6f 6c 65 61 6e 56 61 6c 75  -1 : booleanValu
34ec0 65 28 61 7a 43 6d 64 5b 31 5d 29 3b 0a 20 20 20  e(azCmd[1]);.   
34ed0 20 20 20 69 66 28 20 70 2d 3e 6e 53 65 73 73 69     if( p->nSessi
34ee0 6f 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 69 69  on ){.        ii
34ef0 20 3d 20 73 71 6c 69 74 65 33 73 65 73 73 69 6f   = sqlite3sessio
34f00 6e 5f 69 6e 64 69 72 65 63 74 28 70 53 65 73 73  n_indirect(pSess
34f10 69 6f 6e 2d 3e 70 2c 20 69 69 29 3b 0a 20 20 20  ion->p, ii);.   
34f20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
34f30 28 70 2d 3e 6f 75 74 2c 20 22 73 65 73 73 69 6f  (p->out, "sessio
34f40 6e 20 25 73 20 69 6e 64 69 72 65 63 74 20 66 6c  n %s indirect fl
34f50 61 67 20 3d 20 25 64 5c 6e 22 2c 0a 20 20 20 20  ag = %d\n",.    
34f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34f70 70 53 65 73 73 69 6f 6e 2d 3e 7a 4e 61 6d 65 2c  pSession->zName,
34f80 20 69 69 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20   ii);.      }.  
34f90 20 20 7d 65 6c 73 65 0a 0a 20 20 20 20 2f 2a 20    }else..    /* 
34fa0 2e 73 65 73 73 69 6f 6e 20 69 73 65 6d 70 74 79  .session isempty
34fb0 0a 20 20 20 20 2a 2a 20 44 65 74 65 72 6d 69 6e  .    ** Determin
34fc0 65 20 69 66 20 74 68 65 20 73 65 73 73 69 6f 6e  e if the session
34fd0 20 69 73 20 65 6d 70 74 79 0a 20 20 20 20 2a 2f   is empty.    */
34fe0 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28  .    if( strcmp(
34ff0 61 7a 43 6d 64 5b 30 5d 2c 20 22 69 73 65 6d 70  azCmd[0], "isemp
35000 74 79 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ty")==0 ){.     
35010 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 20 20 69   int ii;.      i
35020 66 28 20 6e 43 6d 64 21 3d 31 20 29 20 67 6f 74  f( nCmd!=1 ) got
35030 6f 20 73 65 73 73 69 6f 6e 5f 73 79 6e 74 61 78  o session_syntax
35040 5f 65 72 72 6f 72 3b 0a 20 20 20 20 20 20 69 66  _error;.      if
35050 28 20 70 2d 3e 6e 53 65 73 73 69 6f 6e 20 29 7b  ( p->nSession ){
35060 0a 20 20 20 20 20 20 20 20 69 69 20 3d 20 73 71  .        ii = sq
35070 6c 69 74 65 33 73 65 73 73 69 6f 6e 5f 69 73 65  lite3session_ise
35080 6d 70 74 79 28 70 53 65 73 73 69 6f 6e 2d 3e 70  mpty(pSession->p
35090 29 3b 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f  );.        utf8_
350a0 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
350b0 73 65 73 73 69 6f 6e 20 25 73 20 69 73 65 6d 70  session %s isemp
350c0 74 79 20 66 6c 61 67 20 3d 20 25 64 5c 6e 22 2c  ty flag = %d\n",
350d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
350e0 20 20 20 20 20 70 53 65 73 73 69 6f 6e 2d 3e 7a       pSession->z
350f0 4e 61 6d 65 2c 20 69 69 29 3b 0a 20 20 20 20 20  Name, ii);.     
35100 20 7d 0a 20 20 20 20 7d 65 6c 73 65 0a 0a 20 20   }.    }else..  
35110 20 20 2f 2a 20 2e 73 65 73 73 69 6f 6e 20 6c 69    /* .session li
35120 73 74 0a 20 20 20 20 2a 2a 20 4c 69 73 74 20 61  st.    ** List a
35130 6c 6c 20 63 75 72 72 65 6e 74 6c 79 20 6f 70 65  ll currently ope
35140 6e 20 73 65 73 73 69 6f 6e 73 0a 20 20 20 20 2a  n sessions.    *
35150 2f 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70  /.    if( strcmp
35160 28 61 7a 43 6d 64 5b 30 5d 2c 22 6c 69 73 74 22  (azCmd[0],"list"
35170 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 6f  )==0 ){.      fo
35180 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 53 65 73  r(i=0; i<p->nSes
35190 73 69 6f 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  sion; i++){.    
351a0 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
351b0 70 2d 3e 6f 75 74 2c 20 22 25 64 20 25 73 5c 6e  p->out, "%d %s\n
351c0 22 2c 20 69 2c 20 70 2d 3e 61 53 65 73 73 69 6f  ", i, p->aSessio
351d0 6e 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20  n[i].zName);.   
351e0 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 0a 0a     }.    }else..
351f0 20 20 20 20 2f 2a 20 2e 73 65 73 73 69 6f 6e 20      /* .session 
35200 6f 70 65 6e 20 44 42 20 4e 41 4d 45 0a 20 20 20  open DB NAME.   
35210 20 2a 2a 20 4f 70 65 6e 20 61 20 6e 65 77 20 73   ** Open a new s
35220 65 73 73 69 6f 6e 20 63 61 6c 6c 65 64 20 4e 41  ession called NA
35230 4d 45 20 6f 6e 20 74 68 65 20 61 74 74 61 63 68  ME on the attach
35240 65 64 20 64 61 74 61 62 61 73 65 20 44 42 2e 0a  ed database DB..
35250 20 20 20 20 2a 2a 20 44 42 20 69 73 20 6e 6f 72      ** DB is nor
35260 6d 61 6c 6c 79 20 22 6d 61 69 6e 22 2e 0a 20 20  mally "main"..  
35270 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 74 72    */.    if( str
35280 63 6d 70 28 61 7a 43 6d 64 5b 30 5d 2c 22 6f 70  cmp(azCmd[0],"op
35290 65 6e 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  en")==0 ){.     
352a0 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20   char *zName;.  
352b0 20 20 20 20 69 66 28 20 6e 43 6d 64 21 3d 33 20      if( nCmd!=3 
352c0 29 20 67 6f 74 6f 20 73 65 73 73 69 6f 6e 5f 73  ) goto session_s
352d0 79 6e 74 61 78 5f 65 72 72 6f 72 3b 0a 20 20 20  yntax_error;.   
352e0 20 20 20 7a 4e 61 6d 65 20 3d 20 61 7a 43 6d 64     zName = azCmd
352f0 5b 32 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 7a  [2];.      if( z
35300 4e 61 6d 65 5b 30 5d 3d 3d 30 20 29 20 67 6f 74  Name[0]==0 ) got
35310 6f 20 73 65 73 73 69 6f 6e 5f 73 79 6e 74 61 78  o session_syntax
35320 5f 65 72 72 6f 72 3b 0a 20 20 20 20 20 20 66 6f  _error;.      fo
35330 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 53 65 73  r(i=0; i<p->nSes
35340 73 69 6f 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  sion; i++){.    
35350 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 70      if( strcmp(p
35360 2d 3e 61 53 65 73 73 69 6f 6e 5b 69 5d 2e 7a 4e  ->aSession[i].zN
35370 61 6d 65 2c 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b  ame,zName)==0 ){
35380 0a 20 20 20 20 20 20 20 20 20 20 75 74 66 38 5f  .          utf8_
35390 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
353a0 53 65 73 73 69 6f 6e 20 5c 22 25 73 5c 22 20 61  Session \"%s\" a
353b0 6c 72 65 61 64 79 20 65 78 69 73 74 73 5c 6e 22  lready exists\n"
353c0 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  , zName);.      
353d0 20 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f      goto meta_co
353e0 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20  mmand_exit;.    
353f0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
35400 20 20 20 20 69 66 28 20 70 2d 3e 6e 53 65 73 73      if( p->nSess
35410 69 6f 6e 3e 3d 41 72 72 61 79 53 69 7a 65 28 70  ion>=ArraySize(p
35420 2d 3e 61 53 65 73 73 69 6f 6e 29 20 29 7b 0a 20  ->aSession) ){. 
35430 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74         raw_print
35440 66 28 73 74 64 65 72 72 2c 20 22 4d 61 78 69 6d  f(stderr, "Maxim
35450 75 6d 20 6f 66 20 25 64 20 73 65 73 73 69 6f 6e  um of %d session
35460 73 5c 6e 22 2c 20 41 72 72 61 79 53 69 7a 65 28  s\n", ArraySize(
35470 70 2d 3e 61 53 65 73 73 69 6f 6e 29 29 3b 0a 20  p->aSession));. 
35480 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 65 74 61         goto meta
35490 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20  _command_exit;. 
354a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 53 65       }.      pSe
354b0 73 73 69 6f 6e 20 3d 20 26 70 2d 3e 61 53 65 73  ssion = &p->aSes
354c0 73 69 6f 6e 5b 70 2d 3e 6e 53 65 73 73 69 6f 6e  sion[p->nSession
354d0 5d 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ];.      rc = sq
354e0 6c 69 74 65 33 73 65 73 73 69 6f 6e 5f 63 72 65  lite3session_cre
354f0 61 74 65 28 70 2d 3e 64 62 2c 20 61 7a 43 6d 64  ate(p->db, azCmd
35500 5b 31 5d 2c 20 26 70 53 65 73 73 69 6f 6e 2d 3e  [1], &pSession->
35510 70 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  p);.      if( rc
35520 20 29 7b 0a 20 20 20 20 20 20 20 20 72 61 77 5f   ){.        raw_
35530 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
35540 43 61 6e 6e 6f 74 20 6f 70 65 6e 20 73 65 73 73  Cannot open sess
35550 69 6f 6e 3a 20 65 72 72 6f 72 20 63 6f 64 65 3d  ion: error code=
35560 25 64 5c 6e 22 2c 20 72 63 29 3b 0a 20 20 20 20  %d\n", rc);.    
35570 20 20 20 20 72 63 20 3d 20 30 3b 0a 20 20 20 20      rc = 0;.    
35580 20 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f      goto meta_co
35590 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20  mmand_exit;.    
355a0 20 20 7d 0a 20 20 20 20 20 20 70 53 65 73 73 69    }.      pSessi
355b0 6f 6e 2d 3e 6e 46 69 6c 74 65 72 20 3d 20 30 3b  on->nFilter = 0;
355c0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 73 65  .      sqlite3se
355d0 73 73 69 6f 6e 5f 74 61 62 6c 65 5f 66 69 6c 74  ssion_table_filt
355e0 65 72 28 70 53 65 73 73 69 6f 6e 2d 3e 70 2c 20  er(pSession->p, 
355f0 73 65 73 73 69 6f 6e 5f 66 69 6c 74 65 72 2c 20  session_filter, 
35600 70 53 65 73 73 69 6f 6e 29 3b 0a 20 20 20 20 20  pSession);.     
35610 20 70 2d 3e 6e 53 65 73 73 69 6f 6e 2b 2b 3b 0a   p->nSession++;.
35620 20 20 20 20 20 20 70 53 65 73 73 69 6f 6e 2d 3e        pSession->
35630 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 5f  zName = sqlite3_
35640 6d 70 72 69 6e 74 66 28 22 25 73 22 2c 20 7a 4e  mprintf("%s", zN
35650 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 0a  ame);.    }else.
35660 20 20 20 20 2f 2a 20 49 66 20 6e 6f 20 63 6f 6d      /* If no com
35670 6d 61 6e 64 20 6e 61 6d 65 20 6d 61 74 63 68 65  mand name matche
35680 73 2c 20 73 68 6f 77 20 61 20 73 79 6e 74 61 78  s, show a syntax
35690 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 73 65   error */.    se
356a0 73 73 69 6f 6e 5f 73 79 6e 74 61 78 5f 65 72 72  ssion_syntax_err
356b0 6f 72 3a 0a 20 20 20 20 73 65 73 73 69 6f 6e 5f  or:.    session_
356c0 68 65 6c 70 28 70 29 3b 0a 20 20 7d 65 6c 73 65  help(p);.  }else
356d0 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20  .#endif..#ifdef 
356e0 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f  SQLITE_DEBUG.  /
356f0 2a 20 55 6e 64 6f 63 75 6d 65 6e 74 65 64 20 63  * Undocumented c
35700 6f 6d 6d 61 6e 64 73 20 66 6f 72 20 69 6e 74 65  ommands for inte
35710 72 6e 61 6c 20 74 65 73 74 69 6e 67 2e 20 20 53  rnal testing.  S
35720 75 62 6a 65 63 74 20 74 6f 20 63 68 61 6e 67 65  ubject to change
35730 0a 20 20 2a 2a 20 77 69 74 68 6f 75 74 20 6e 6f  .  ** without no
35740 74 69 63 65 2e 20 2a 2f 0a 20 20 69 66 28 20 63  tice. */.  if( c
35750 3d 3d 27 73 27 20 26 26 20 6e 3e 3d 31 30 20 26  =='s' && n>=10 &
35760 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b  & strncmp(azArg[
35770 30 5d 2c 20 22 73 65 6c 66 74 65 73 74 2d 22 2c  0], "selftest-",
35780 20 39 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66   9)==0 ){.    if
35790 28 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b  ( strncmp(azArg[
357a0 30 5d 2b 39 2c 20 22 62 6f 6f 6c 65 61 6e 22 2c  0]+9, "boolean",
357b0 20 6e 2d 39 29 3d 3d 30 20 29 7b 0a 20 20 20 20   n-9)==0 ){.    
357c0 20 20 69 6e 74 20 69 2c 20 76 3b 0a 20 20 20 20    int i, v;.    
357d0 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 41 72    for(i=1; i<nAr
357e0 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  g; i++){.       
357f0 20 76 20 3d 20 62 6f 6f 6c 65 61 6e 56 61 6c 75   v = booleanValu
35800 65 28 61 7a 41 72 67 5b 69 5d 29 3b 0a 20 20 20  e(azArg[i]);.   
35810 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
35820 28 70 2d 3e 6f 75 74 2c 20 22 25 73 3a 20 25 64  (p->out, "%s: %d
35830 20 30 78 25 78 5c 6e 22 2c 20 61 7a 41 72 67 5b   0x%x\n", azArg[
35840 69 5d 2c 20 76 2c 20 76 29 3b 0a 20 20 20 20 20  i], v, v);.     
35850 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
35860 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30   strncmp(azArg[0
35870 5d 2b 39 2c 20 22 69 6e 74 65 67 65 72 22 2c 20  ]+9, "integer", 
35880 6e 2d 39 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  n-9)==0 ){.     
35890 20 69 6e 74 20 69 3b 20 73 71 6c 69 74 65 33 5f   int i; sqlite3_
358a0 69 6e 74 36 34 20 76 3b 0a 20 20 20 20 20 20 66  int64 v;.      f
358b0 6f 72 28 69 3d 31 3b 20 69 3c 6e 41 72 67 3b 20  or(i=1; i<nArg; 
358c0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 68  i++){.        ch
358d0 61 72 20 7a 42 75 66 5b 32 30 30 5d 3b 0a 20 20  ar zBuf[200];.  
358e0 20 20 20 20 20 20 76 20 3d 20 69 6e 74 65 67 65        v = intege
358f0 72 56 61 6c 75 65 28 61 7a 41 72 67 5b 69 5d 29  rValue(azArg[i])
35900 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
35910 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
35920 66 28 7a 42 75 66 29 2c 7a 42 75 66 2c 22 25 73  f(zBuf),zBuf,"%s
35930 3a 20 25 6c 6c 64 20 30 78 25 6c 6c 78 5c 6e 22  : %lld 0x%llx\n"
35940 2c 20 61 7a 41 72 67 5b 69 5d 2c 76 2c 76 29 3b  , azArg[i],v,v);
35950 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72  .        utf8_pr
35960 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73  intf(p->out, "%s
35970 22 2c 20 7a 42 75 66 29 3b 0a 20 20 20 20 20 20  ", zBuf);.      
35980 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a  }.    }.  }else.
35990 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 63 3d  #endif..  if( c=
359a0 3d 27 73 27 20 26 26 20 6e 3e 3d 34 20 26 26 20  ='s' && n>=4 && 
359b0 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d  strncmp(azArg[0]
359c0 2c 22 73 65 6c 66 74 65 73 74 22 2c 6e 29 3d 3d  ,"selftest",n)==
359d0 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 62 49 73  0 ){.    int bIs
359e0 49 6e 69 74 20 3d 20 30 3b 20 20 20 20 20 20 20  Init = 0;       
359f0 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 69 6e 69    /* True to ini
35a00 74 69 61 6c 69 7a 65 20 74 68 65 20 53 45 4c 46  tialize the SELF
35a10 54 45 53 54 20 74 61 62 6c 65 20 2a 2f 0a 20 20  TEST table */.  
35a20 20 20 69 6e 74 20 62 56 65 72 62 6f 73 65 20 3d    int bVerbose =
35a30 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 56 65   0;        /* Ve
35a40 72 62 6f 73 65 20 6f 75 74 70 75 74 20 2a 2f 0a  rbose output */.
35a50 20 20 20 20 69 6e 74 20 62 53 65 6c 66 74 65 73      int bSelftes
35a60 74 45 78 69 73 74 73 3b 20 20 20 20 20 2f 2a 20  tExists;     /* 
35a70 54 72 75 65 20 69 66 20 53 45 4c 46 54 45 53 54  True if SELFTEST
35a80 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20   already exists 
35a90 2a 2f 0a 20 20 20 20 69 6e 74 20 69 2c 20 6b 3b  */.    int i, k;
35aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35ab0 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73  /* Loop counters
35ac0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 54 65 73   */.    int nTes
35ad0 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  t = 0;          
35ae0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 65   /* Number of te
35af0 73 74 73 20 72 75 6e 73 20 2a 2f 0a 20 20 20 20  sts runs */.    
35b00 69 6e 74 20 6e 45 72 72 20 3d 20 30 3b 20 20 20  int nErr = 0;   
35b10 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
35b20 65 72 20 6f 66 20 65 72 72 6f 72 73 20 73 65 65  er of errors see
35b30 6e 20 2a 2f 0a 20 20 20 20 53 68 65 6c 6c 54 65  n */.    ShellTe
35b40 78 74 20 73 74 72 3b 20 20 20 20 20 20 20 20 20  xt str;         
35b50 20 20 2f 2a 20 41 6e 73 77 65 72 20 66 6f 72 20    /* Answer for 
35b60 61 20 71 75 65 72 79 20 2a 2f 0a 20 20 20 20 73  a query */.    s
35b70 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
35b80 6d 74 20 3d 20 30 3b 20 2f 2a 20 51 75 65 72 79  mt = 0; /* Query
35b90 20 61 67 61 69 6e 73 74 20 74 68 65 20 53 45 4c   against the SEL
35ba0 46 54 45 53 54 20 74 61 62 6c 65 20 2a 2f 0a 0a  FTEST table */..
35bb0 20 20 20 20 6f 70 65 6e 5f 64 62 28 70 2c 30 29      open_db(p,0)
35bc0 3b 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69  ;.    for(i=1; i
35bd0 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nArg; i++){.   
35be0 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
35bf0 20 3d 20 61 7a 41 72 67 5b 69 5d 3b 0a 20 20 20   = azArg[i];.   
35c00 20 20 20 69 66 28 20 7a 5b 30 5d 3d 3d 27 2d 27     if( z[0]=='-'
35c10 20 26 26 20 7a 5b 31 5d 3d 3d 27 2d 27 20 29 20   && z[1]=='-' ) 
35c20 7a 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 73  z++;.      if( s
35c30 74 72 63 6d 70 28 7a 2c 22 2d 69 6e 69 74 22 29  trcmp(z,"-init")
35c40 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 62  ==0 ){.        b
35c50 49 73 49 6e 69 74 20 3d 20 31 3b 0a 20 20 20 20  IsInit = 1;.    
35c60 20 20 7d 65 6c 73 65 0a 20 20 20 20 20 20 69 66    }else.      if
35c70 28 20 73 74 72 63 6d 70 28 7a 2c 22 2d 76 22 29  ( strcmp(z,"-v")
35c80 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 62  ==0 ){.        b
35c90 56 65 72 62 6f 73 65 2b 2b 3b 0a 20 20 20 20 20  Verbose++;.     
35ca0 20 7d 65 6c 73 65 0a 20 20 20 20 20 20 7b 0a 20   }else.      {. 
35cb0 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e         utf8_prin
35cc0 74 66 28 73 74 64 65 72 72 2c 20 22 55 6e 6b 6e  tf(stderr, "Unkn
35cd0 6f 77 6e 20 6f 70 74 69 6f 6e 20 5c 22 25 73 5c  own option \"%s\
35ce0 22 20 6f 6e 20 5c 22 25 73 5c 22 5c 6e 22 2c 0a  " on \"%s\"\n",.
35cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35d00 20 20 20 20 61 7a 41 72 67 5b 69 5d 2c 20 61 7a      azArg[i], az
35d10 41 72 67 5b 30 5d 29 3b 0a 20 20 20 20 20 20 20  Arg[0]);.       
35d20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65   raw_printf(stde
35d30 72 72 2c 20 22 53 68 6f 75 6c 64 20 62 65 20 6f  rr, "Should be o
35d40 6e 65 20 6f 66 3a 20 2d 2d 69 6e 69 74 20 2d 76  ne of: --init -v
35d50 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 72 63  \n");.        rc
35d60 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 67 6f   = 1;.        go
35d70 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f  to meta_command_
35d80 65 78 69 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  exit;.      }.  
35d90 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69    }.    if( sqli
35da0 74 65 33 5f 74 61 62 6c 65 5f 63 6f 6c 75 6d 6e  te3_table_column
35db0 5f 6d 65 74 61 64 61 74 61 28 70 2d 3e 64 62 2c  _metadata(p->db,
35dc0 22 6d 61 69 6e 22 2c 22 73 65 6c 66 74 65 73 74  "main","selftest
35dd0 22 2c 30 2c 30 2c 30 2c 30 2c 30 2c 30 29 0a 20  ",0,0,0,0,0,0). 
35de0 20 20 20 20 20 20 20 20 20 20 21 3d 20 53 51 4c            != SQL
35df0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
35e00 62 53 65 6c 66 74 65 73 74 45 78 69 73 74 73 20  bSelftestExists 
35e10 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 0;.    }else{.
35e20 20 20 20 20 20 20 62 53 65 6c 66 74 65 73 74 45        bSelftestE
35e30 78 69 73 74 73 20 3d 20 31 3b 0a 20 20 20 20 7d  xists = 1;.    }
35e40 0a 20 20 20 20 69 66 28 20 62 49 73 49 6e 69 74  .    if( bIsInit
35e50 20 29 7b 0a 20 20 20 20 20 20 63 72 65 61 74 65   ){.      create
35e60 53 65 6c 66 74 65 73 74 54 61 62 6c 65 28 70 29  SelftestTable(p)
35e70 3b 0a 20 20 20 20 20 20 62 53 65 6c 66 74 65 73  ;.      bSelftes
35e80 74 45 78 69 73 74 73 20 3d 20 31 3b 0a 20 20 20  tExists = 1;.   
35e90 20 7d 0a 20 20 20 20 69 6e 69 74 54 65 78 74 28   }.    initText(
35ea0 26 73 74 72 29 3b 0a 20 20 20 20 61 70 70 65 6e  &str);.    appen
35eb0 64 54 65 78 74 28 26 73 74 72 2c 20 22 78 22 2c  dText(&str, "x",
35ec0 20 30 29 3b 0a 20 20 20 20 66 6f 72 28 6b 3d 62   0);.    for(k=b
35ed0 53 65 6c 66 74 65 73 74 45 78 69 73 74 73 3b 20  SelftestExists; 
35ee0 6b 3e 3d 30 3b 20 6b 2d 2d 29 7b 0a 20 20 20 20  k>=0; k--){.    
35ef0 20 20 69 66 28 20 6b 3d 3d 31 20 29 7b 0a 20 20    if( k==1 ){.  
35f00 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
35f10 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 70 2d  e3_prepare_v2(p-
35f20 3e 64 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20  >db,.           
35f30 20 22 53 45 4c 45 43 54 20 74 6e 6f 2c 6f 70 2c   "SELECT tno,op,
35f40 63 6d 64 2c 61 6e 73 20 46 52 4f 4d 20 73 65 6c  cmd,ans FROM sel
35f50 66 74 65 73 74 20 4f 52 44 45 52 20 42 59 20 74  ftest ORDER BY t
35f60 6e 6f 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  no",.           
35f70 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b   -1, &pStmt, 0);
35f80 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
35f90 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
35fa0 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 70 2d  e3_prepare_v2(p-
35fb0 3e 64 62 2c 0a 20 20 20 20 20 20 20 20 20 20 22  >db,.          "
35fc0 56 41 4c 55 45 53 28 30 2c 27 6d 65 6d 6f 27 2c  VALUES(0,'memo',
35fd0 27 4d 69 73 73 69 6e 67 20 53 45 4c 46 54 45 53  'Missing SELFTES
35fe0 54 20 74 61 62 6c 65 20 2d 20 64 65 66 61 75 6c  T table - defaul
35ff0 74 20 63 68 65 63 6b 73 20 6f 6e 6c 79 27 2c 27  t checks only','
36000 27 29 2c 22 0a 20 20 20 20 20 20 20 20 20 20 22  '),".          "
36010 20 20 20 20 20 20 28 31 2c 27 72 75 6e 27 2c 27        (1,'run','
36020 50 52 41 47 4d 41 20 69 6e 74 65 67 72 69 74 79  PRAGMA integrity
36030 5f 63 68 65 63 6b 27 2c 27 6f 6b 27 29 22 2c 0a  _check','ok')",.
36040 20 20 20 20 20 20 20 20 20 20 2d 31 2c 20 26 70            -1, &p
36050 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 20 20  Stmt, 0);.      
36060 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  }.      if( rc )
36070 7b 0a 20 20 20 20 20 20 20 20 72 61 77 5f 70 72  {.        raw_pr
36080 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72  intf(stderr, "Er
36090 72 6f 72 20 71 75 65 72 79 69 6e 67 20 74 68 65  ror querying the
360a0 20 73 65 6c 66 74 65 73 74 20 74 61 62 6c 65 5c   selftest table\
360b0 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  n");.        rc 
360c0 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  = 1;.        sql
360d0 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53  ite3_finalize(pS
360e0 74 6d 74 29 3b 0a 20 20 20 20 20 20 20 20 67 6f  tmt);.        go
360f0 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f  to meta_command_
36100 65 78 69 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  exit;.      }.  
36110 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 73 71 6c      for(i=1; sql
36120 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29  ite3_step(pStmt)
36130 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 3b 20 69 2b  ==SQLITE_ROW; i+
36140 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  +){.        int 
36150 74 6e 6f 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  tno = sqlite3_co
36160 6c 75 6d 6e 5f 69 6e 74 28 70 53 74 6d 74 2c 20  lumn_int(pStmt, 
36170 30 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73  0);.        cons
36180 74 20 63 68 61 72 20 2a 7a 4f 70 20 3d 20 28 63  t char *zOp = (c
36190 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74  onst char*)sqlit
361a0 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70  e3_column_text(p
361b0 53 74 6d 74 2c 20 31 29 3b 0a 20 20 20 20 20 20  Stmt, 1);.      
361c0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53    const char *zS
361d0 71 6c 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  ql = (const char
361e0 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  *)sqlite3_column
361f0 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 32 29 3b  _text(pStmt, 2);
36200 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63  .        const c
36210 68 61 72 20 2a 7a 41 6e 73 20 3d 20 28 63 6f 6e  har *zAns = (con
36220 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33  st char*)sqlite3
36230 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74  _column_text(pSt
36240 6d 74 2c 20 33 29 3b 0a 0a 20 20 20 20 20 20 20  mt, 3);..       
36250 20 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20   k = 0;.        
36260 69 66 28 20 62 56 65 72 62 6f 73 65 3e 30 20 29  if( bVerbose>0 )
36270 7b 0a 20 20 20 20 20 20 20 20 20 20 63 68 61 72  {.          char
36280 20 2a 7a 51 75 6f 74 65 20 3d 20 73 71 6c 69 74   *zQuote = sqlit
36290 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 71 22 2c  e3_mprintf("%q",
362a0 20 7a 53 71 6c 29 3b 0a 20 20 20 20 20 20 20 20   zSql);.        
362b0 20 20 70 72 69 6e 74 66 28 22 25 64 3a 20 25 73    printf("%d: %s
362c0 20 25 73 5c 6e 22 2c 20 74 6e 6f 2c 20 7a 4f 70   %s\n", tno, zOp
362d0 2c 20 7a 53 71 6c 29 3b 0a 20 20 20 20 20 20 20  , zSql);.       
362e0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
362f0 7a 51 75 6f 74 65 29 3b 0a 20 20 20 20 20 20 20  zQuote);.       
36300 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 73   }.        if( s
36310 74 72 63 6d 70 28 7a 4f 70 2c 22 6d 65 6d 6f 22  trcmp(zOp,"memo"
36320 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
36330 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d    utf8_printf(p-
36340 3e 6f 75 74 2c 20 22 25 73 5c 6e 22 2c 20 7a 53  >out, "%s\n", zS
36350 71 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  ql);.        }el
36360 73 65 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  se.        if( s
36370 74 72 63 6d 70 28 7a 4f 70 2c 22 72 75 6e 22 29  trcmp(zOp,"run")
36380 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
36390 20 63 68 61 72 20 2a 7a 45 72 72 4d 73 67 20 3d   char *zErrMsg =
363a0 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 73 74   0;.          st
363b0 72 2e 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  r.n = 0;.       
363c0 20 20 20 73 74 72 2e 7a 5b 30 5d 20 3d 20 30 3b     str.z[0] = 0;
363d0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
363e0 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e  sqlite3_exec(p->
363f0 64 62 2c 20 7a 53 71 6c 2c 20 63 61 70 74 75 72  db, zSql, captur
36400 65 4f 75 74 70 75 74 43 61 6c 6c 62 61 63 6b 2c  eOutputCallback,
36410 20 26 73 74 72 2c 20 26 7a 45 72 72 4d 73 67 29   &str, &zErrMsg)
36420 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 54 65 73  ;.          nTes
36430 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 69  t++;.          i
36440 66 28 20 62 56 65 72 62 6f 73 65 20 29 7b 0a 20  f( bVerbose ){. 
36450 20 20 20 20 20 20 20 20 20 20 20 75 74 66 38 5f             utf8_
36460 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
36470 52 65 73 75 6c 74 3a 20 25 73 5c 6e 22 2c 20 73  Result: %s\n", s
36480 74 72 2e 7a 29 3b 0a 20 20 20 20 20 20 20 20 20  tr.z);.         
36490 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28   }.          if(
364a0 20 72 63 20 7c 7c 20 7a 45 72 72 4d 73 67 20 29   rc || zErrMsg )
364b0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e 45  {.            nE
364c0 72 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  rr++;.          
364d0 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20    rc = 1;.      
364e0 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
364f0 66 28 70 2d 3e 6f 75 74 2c 20 22 25 64 3a 20 65  f(p->out, "%d: e
36500 72 72 6f 72 2d 63 6f 64 65 2d 25 64 3a 20 25 73  rror-code-%d: %s
36510 5c 6e 22 2c 20 74 6e 6f 2c 20 72 63 2c 20 7a 45  \n", tno, rc, zE
36520 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 20 20  rrMsg);.        
36530 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
36540 28 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20  (zErrMsg);.     
36550 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73       }else if( s
36560 74 72 63 6d 70 28 7a 41 6e 73 2c 73 74 72 2e 7a  trcmp(zAns,str.z
36570 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
36580 20 20 20 20 6e 45 72 72 2b 2b 3b 0a 20 20 20 20      nErr++;.    
36590 20 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a          rc = 1;.
365a0 20 20 20 20 20 20 20 20 20 20 20 20 75 74 66 38              utf8
365b0 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
365c0 22 25 64 3a 20 45 78 70 65 63 74 65 64 3a 20 5b  "%d: Expected: [
365d0 25 73 5d 5c 6e 22 2c 20 74 6e 6f 2c 20 7a 41 6e  %s]\n", tno, zAn
365e0 73 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  s);.            
365f0 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f  utf8_printf(p->o
36600 75 74 2c 20 22 25 64 3a 20 20 20 20 20 20 47 6f  ut, "%d:      Go
36610 74 3a 20 5b 25 73 5d 5c 6e 22 2c 20 74 6e 6f 2c  t: [%s]\n", tno,
36620 20 73 74 72 2e 7a 29 3b 0a 20 20 20 20 20 20 20   str.z);.       
36630 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c     }.        }el
36640 73 65 0a 20 20 20 20 20 20 20 20 7b 0a 20 20 20  se.        {.   
36650 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e         utf8_prin
36660 74 66 28 73 74 64 65 72 72 2c 0a 20 20 20 20 20  tf(stderr,.     
36670 20 20 20 20 20 20 20 22 55 6e 6b 6e 6f 77 6e 20         "Unknown 
36680 6f 70 65 72 61 74 69 6f 6e 20 5c 22 25 73 5c 22  operation \"%s\"
36690 20 6f 6e 20 73 65 6c 66 74 65 73 74 20 6c 69 6e   on selftest lin
366a0 65 20 25 64 5c 6e 22 2c 20 7a 4f 70 2c 20 74 6e  e %d\n", zOp, tn
366b0 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63  o);.          rc
366c0 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
366d0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
366e0 0a 20 20 20 20 20 20 7d 20 2f 2a 20 45 6e 64 20  .      } /* End 
366f0 6c 6f 6f 70 20 6f 76 65 72 20 72 6f 77 73 20 6f  loop over rows o
36700 66 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 53  f content from S
36710 45 4c 46 54 45 53 54 20 2a 2f 0a 20 20 20 20 20  ELFTEST */.     
36720 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
36730 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 7d 20  e(pStmt);.    } 
36740 2f 2a 20 45 6e 64 20 6c 6f 6f 70 20 6f 76 65 72  /* End loop over
36750 20 6b 20 2a 2f 0a 20 20 20 20 66 72 65 65 54 65   k */.    freeTe
36760 78 74 28 26 73 74 72 29 3b 0a 20 20 20 20 75 74  xt(&str);.    ut
36770 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  f8_printf(p->out
36780 2c 20 22 25 64 20 65 72 72 6f 72 73 20 6f 75 74  , "%d errors out
36790 20 6f 66 20 25 64 20 74 65 73 74 73 5c 6e 22 2c   of %d tests\n",
367a0 20 6e 45 72 72 2c 20 6e 54 65 73 74 29 3b 0a 20   nErr, nTest);. 
367b0 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d   }else..  if( c=
367c0 3d 27 73 27 20 26 26 20 73 74 72 6e 63 6d 70 28  ='s' && strncmp(
367d0 61 7a 41 72 67 5b 30 5d 2c 20 22 73 65 70 61 72  azArg[0], "separ
367e0 61 74 6f 72 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a  ator", n)==0 ){.
367f0 20 20 20 20 69 66 28 20 6e 41 72 67 3c 32 20 7c      if( nArg<2 |
36800 7c 20 6e 41 72 67 3e 33 20 29 7b 0a 20 20 20 20  | nArg>3 ){.    
36810 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64    raw_printf(std
36820 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 73 65  err, "Usage: .se
36830 70 61 72 61 74 6f 72 20 43 4f 4c 20 3f 52 4f 57  parator COL ?ROW
36840 3f 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20  ?\n");.      rc 
36850 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  = 1;.    }.    i
36860 66 28 20 6e 41 72 67 3e 3d 32 20 29 7b 0a 20 20  f( nArg>=2 ){.  
36870 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
36880 69 6e 74 66 28 73 69 7a 65 6f 66 28 70 2d 3e 63  intf(sizeof(p->c
36890 6f 6c 53 65 70 61 72 61 74 6f 72 29 2c 20 70 2d  olSeparator), p-
368a0 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 2c 0a 20  >colSeparator,. 
368b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
368c0 20 20 20 20 20 20 22 25 2e 2a 73 22 2c 20 28 69        "%.*s", (i
368d0 6e 74 29 41 72 72 61 79 53 69 7a 65 28 70 2d 3e  nt)ArraySize(p->
368e0 63 6f 6c 53 65 70 61 72 61 74 6f 72 29 2d 31 2c  colSeparator)-1,
368f0 20 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20   azArg[1]);.    
36900 7d 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3e 3d  }.    if( nArg>=
36910 33 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  3 ){.      sqlit
36920 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
36930 6f 66 28 70 2d 3e 72 6f 77 53 65 70 61 72 61 74  of(p->rowSeparat
36940 6f 72 29 2c 20 70 2d 3e 72 6f 77 53 65 70 61 72  or), p->rowSepar
36950 61 74 6f 72 2c 0a 20 20 20 20 20 20 20 20 20 20  ator,.          
36960 20 20 20 20 20 20 20 20 20 20 20 20 20 22 25 2e               "%.
36970 2a 73 22 2c 20 28 69 6e 74 29 41 72 72 61 79 53  *s", (int)ArrayS
36980 69 7a 65 28 70 2d 3e 72 6f 77 53 65 70 61 72 61  ize(p->rowSepara
36990 74 6f 72 29 2d 31 2c 20 61 7a 41 72 67 5b 32 5d  tor)-1, azArg[2]
369a0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  );.    }.  }else
369b0 0a 0a 20 20 69 66 28 20 63 3d 3d 27 73 27 20 26  ..  if( c=='s' &
369c0 26 20 6e 3e 3d 34 20 26 26 20 73 74 72 6e 63 6d  & n>=4 && strncm
369d0 70 28 61 7a 41 72 67 5b 30 5d 2c 22 73 68 61 33  p(azArg[0],"sha3
369e0 73 75 6d 22 2c 6e 29 3d 3d 30 20 29 7b 0a 20 20  sum",n)==0 ){.  
369f0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4c    const char *zL
36a00 69 6b 65 20 3d 20 30 3b 20 20 20 2f 2a 20 57 68  ike = 0;   /* Wh
36a10 69 63 68 20 74 61 62 6c 65 20 74 6f 20 63 68 65  ich table to che
36a20 63 6b 73 75 6d 2e 20 30 20 6d 65 61 6e 73 20 65  cksum. 0 means e
36a30 76 65 72 79 74 68 69 6e 67 20 2a 2f 0a 20 20 20  verything */.   
36a40 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
36a50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
36a60 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20  p counter */.   
36a70 20 69 6e 74 20 62 53 63 68 65 6d 61 20 3d 20 30   int bSchema = 0
36a80 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 73  ;         /* Als
36a90 6f 20 68 61 73 68 20 74 68 65 20 73 63 68 65 6d  o hash the schem
36aa0 61 20 2a 2f 0a 20 20 20 20 69 6e 74 20 62 53 65  a */.    int bSe
36ab0 70 61 72 61 74 65 20 3d 20 30 3b 20 20 20 20 20  parate = 0;     
36ac0 20 20 2f 2a 20 48 61 73 68 20 65 61 63 68 20 74    /* Hash each t
36ad0 61 62 6c 65 20 73 65 70 61 72 61 74 65 6c 79 20  able separately 
36ae0 2a 2f 0a 20 20 20 20 69 6e 74 20 69 53 69 7a 65  */.    int iSize
36af0 20 3d 20 32 32 34 3b 20 20 20 20 20 20 20 20 20   = 224;         
36b00 2f 2a 20 48 61 73 68 20 61 6c 67 6f 72 69 74 68  /* Hash algorith
36b10 6d 20 74 6f 20 75 73 65 20 2a 2f 0a 20 20 20 20  m to use */.    
36b20 69 6e 74 20 62 44 65 62 75 67 20 3d 20 30 3b 20  int bDebug = 0; 
36b30 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 6c 79           /* Only
36b40 20 73 68 6f 77 20 74 68 65 20 71 75 65 72 79 20   show the query 
36b50 74 68 61 74 20 77 6f 75 6c 64 20 68 61 76 65 20  that would have 
36b60 72 75 6e 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  run */.    sqlit
36b70 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 20  e3_stmt *pStmt; 
36b80 20 20 20 20 2f 2a 20 46 6f 72 20 71 75 65 72 79      /* For query
36b90 69 6e 67 20 74 61 62 6c 65 73 20 6e 61 6d 65 73  ing tables names
36ba0 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 53   */.    char *zS
36bb0 71 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ql;             
36bc0 20 2f 2a 20 53 51 4c 20 74 6f 20 62 65 20 72 75   /* SQL to be ru
36bd0 6e 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a  n */.    char *z
36be0 53 65 70 3b 20 20 20 20 20 20 20 20 20 20 20 20  Sep;            
36bf0 20 20 2f 2a 20 53 65 70 61 72 61 74 6f 72 20 2a    /* Separator *
36c00 2f 0a 20 20 20 20 53 68 65 6c 6c 54 65 78 74 20  /.    ShellText 
36c10 73 53 71 6c 3b 20 20 20 20 20 20 20 20 20 20 2f  sSql;          /
36c20 2a 20 43 6f 6d 70 6c 65 74 65 20 53 51 4c 20 66  * Complete SQL f
36c30 6f 72 20 74 68 65 20 71 75 65 72 79 20 74 6f 20  or the query to 
36c40 72 75 6e 20 74 68 65 20 68 61 73 68 20 2a 2f 0a  run the hash */.
36c50 20 20 20 20 53 68 65 6c 6c 54 65 78 74 20 73 51      ShellText sQ
36c60 75 65 72 79 3b 20 20 20 20 20 20 20 20 2f 2a 20  uery;        /* 
36c70 53 65 74 20 6f 66 20 71 75 65 72 69 65 73 20 75  Set of queries u
36c80 73 65 64 20 74 6f 20 72 65 61 64 20 61 6c 6c 20  sed to read all 
36c90 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 20 20 6f  content */.    o
36ca0 70 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a 20 20  pen_db(p, 0);.  
36cb0 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 41 72    for(i=1; i<nAr
36cc0 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 63  g; i++){.      c
36cd0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 61  onst char *z = a
36ce0 7a 41 72 67 5b 69 5d 3b 0a 20 20 20 20 20 20 69  zArg[i];.      i
36cf0 66 28 20 7a 5b 30 5d 3d 3d 27 2d 27 20 29 7b 0a  f( z[0]=='-' ){.
36d00 20 20 20 20 20 20 20 20 7a 2b 2b 3b 0a 20 20 20          z++;.   
36d10 20 20 20 20 20 69 66 28 20 7a 5b 30 5d 3d 3d 27       if( z[0]=='
36d20 2d 27 20 29 20 7a 2b 2b 3b 0a 20 20 20 20 20 20  -' ) z++;.      
36d30 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 22    if( strcmp(z,"
36d40 73 63 68 65 6d 61 22 29 3d 3d 30 20 29 7b 0a 20  schema")==0 ){. 
36d50 20 20 20 20 20 20 20 20 20 62 53 63 68 65 6d 61           bSchema
36d60 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 65   = 1;.        }e
36d70 6c 73 65 0a 20 20 20 20 20 20 20 20 69 66 28 20  lse.        if( 
36d80 73 74 72 63 6d 70 28 7a 2c 22 73 68 61 33 2d 32  strcmp(z,"sha3-2
36d90 32 34 22 29 3d 3d 30 20 7c 7c 20 73 74 72 63 6d  24")==0 || strcm
36da0 70 28 7a 2c 22 73 68 61 33 2d 32 35 36 22 29 3d  p(z,"sha3-256")=
36db0 3d 30 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 73  =0.         || s
36dc0 74 72 63 6d 70 28 7a 2c 22 73 68 61 33 2d 33 38  trcmp(z,"sha3-38
36dd0 34 22 29 3d 3d 30 20 7c 7c 20 73 74 72 63 6d 70  4")==0 || strcmp
36de0 28 7a 2c 22 73 68 61 33 2d 35 31 32 22 29 3d 3d  (z,"sha3-512")==
36df0 30 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20  0.        ){.   
36e00 20 20 20 20 20 20 20 69 53 69 7a 65 20 3d 20 61         iSize = a
36e10 74 6f 69 28 26 7a 5b 35 5d 29 3b 0a 20 20 20 20  toi(&z[5]);.    
36e20 20 20 20 20 7d 65 6c 73 65 0a 20 20 20 20 20 20      }else.      
36e30 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 22    if( strcmp(z,"
36e40 64 65 62 75 67 22 29 3d 3d 30 20 29 7b 0a 20 20  debug")==0 ){.  
36e50 20 20 20 20 20 20 20 20 62 44 65 62 75 67 20 3d          bDebug =
36e60 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73   1;.        }els
36e70 65 0a 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20  e.        {.    
36e80 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
36e90 66 28 73 74 64 65 72 72 2c 20 22 55 6e 6b 6e 6f  f(stderr, "Unkno
36ea0 77 6e 20 6f 70 74 69 6f 6e 20 5c 22 25 73 5c 22  wn option \"%s\"
36eb0 20 6f 6e 20 5c 22 25 73 5c 22 5c 6e 22 2c 0a 20   on \"%s\"\n",. 
36ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36ed0 20 20 20 20 20 61 7a 41 72 67 5b 69 5d 2c 20 61       azArg[i], a
36ee0 7a 41 72 67 5b 30 5d 29 3b 0a 20 20 20 20 20 20  zArg[0]);.      
36ef0 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73      raw_printf(s
36f00 74 64 65 72 72 2c 20 22 53 68 6f 75 6c 64 20 62  tderr, "Should b
36f10 65 20 6f 6e 65 20 6f 66 3a 20 2d 2d 73 63 68 65  e one of: --sche
36f20 6d 61 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  ma".            
36f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36f40 20 22 20 2d 2d 73 68 61 33 2d 32 32 34 20 2d 2d   " --sha3-224 --
36f50 73 68 61 33 2d 32 35 36 20 2d 2d 73 68 61 33 2d  sha3-256 --sha3-
36f60 33 38 34 20 2d 2d 73 68 61 33 2d 35 31 32 5c 6e  384 --sha3-512\n
36f70 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63  ");.          rc
36f80 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
36f90 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e  goto meta_comman
36fa0 64 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 20 20  d_exit;.        
36fb0 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  }.      }else if
36fc0 28 20 7a 4c 69 6b 65 20 29 7b 0a 20 20 20 20 20  ( zLike ){.     
36fd0 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74     raw_printf(st
36fe0 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 73  derr, "Usage: .s
36ff0 68 61 33 73 75 6d 20 3f 4f 50 54 49 4f 4e 53 3f  ha3sum ?OPTIONS?
37000 20 3f 4c 49 4b 45 2d 50 41 54 54 45 52 4e 3f 5c   ?LIKE-PATTERN?\
37010 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  n");.        rc 
37020 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  = 1;.        got
37030 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65  o meta_command_e
37040 78 69 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  xit;.      }else
37050 7b 0a 20 20 20 20 20 20 20 20 7a 4c 69 6b 65 20  {.        zLike 
37060 3d 20 7a 3b 0a 20 20 20 20 20 20 20 20 62 53 65  = z;.        bSe
37070 70 61 72 61 74 65 20 3d 20 31 3b 0a 20 20 20 20  parate = 1;.    
37080 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f      if( sqlite3_
37090 73 74 72 6c 69 6b 65 28 22 73 71 6c 69 74 65 5c  strlike("sqlite\
370a0 5c 5f 25 22 2c 20 7a 4c 69 6b 65 2c 20 27 5c 5c  \_%", zLike, '\\
370b0 27 29 3d 3d 30 20 29 20 62 53 63 68 65 6d 61 20  ')==0 ) bSchema 
370c0 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
370d0 20 7d 0a 20 20 20 20 69 66 28 20 62 53 63 68 65   }.    if( bSche
370e0 6d 61 20 29 7b 0a 20 20 20 20 20 20 7a 53 71 6c  ma ){.      zSql
370f0 20 3d 20 22 53 45 4c 45 43 54 20 6c 6f 77 65 72   = "SELECT lower
37100 28 6e 61 6d 65 29 20 46 52 4f 4d 20 73 71 6c 69  (name) FROM sqli
37110 74 65 5f 6d 61 73 74 65 72 22 0a 20 20 20 20 20  te_master".     
37120 20 20 20 20 20 20 20 20 22 20 57 48 45 52 45 20          " WHERE 
37130 74 79 70 65 3d 27 74 61 62 6c 65 27 20 41 4e 44  type='table' AND
37140 20 63 6f 61 6c 65 73 63 65 28 72 6f 6f 74 70 61   coalesce(rootpa
37150 67 65 2c 30 29 3e 31 22 0a 20 20 20 20 20 20 20  ge,0)>1".       
37160 20 20 20 20 20 20 22 20 55 4e 49 4f 4e 20 41 4c        " UNION AL
37170 4c 20 53 45 4c 45 43 54 20 27 73 71 6c 69 74 65  L SELECT 'sqlite
37180 5f 6d 61 73 74 65 72 27 22 0a 20 20 20 20 20 20  _master'".      
37190 20 20 20 20 20 20 20 22 20 4f 52 44 45 52 20 42         " ORDER B
371a0 59 20 31 20 63 6f 6c 6c 61 74 65 20 6e 6f 63 61  Y 1 collate noca
371b0 73 65 22 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  se";.    }else{.
371c0 20 20 20 20 20 20 7a 53 71 6c 20 3d 20 22 53 45        zSql = "SE
371d0 4c 45 43 54 20 6c 6f 77 65 72 28 6e 61 6d 65 29  LECT lower(name)
371e0 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73   FROM sqlite_mas
371f0 74 65 72 22 0a 20 20 20 20 20 20 20 20 20 20 20  ter".           
37200 20 20 22 20 57 48 45 52 45 20 74 79 70 65 3d 27    " WHERE type='
37210 74 61 62 6c 65 27 20 41 4e 44 20 63 6f 61 6c 65  table' AND coale
37220 73 63 65 28 72 6f 6f 74 70 61 67 65 2c 30 29 3e  sce(rootpage,0)>
37230 31 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  1".             
37240 22 20 41 4e 44 20 6e 61 6d 65 20 4e 4f 54 20 4c  " AND name NOT L
37250 49 4b 45 20 27 73 71 6c 69 74 65 5f 25 27 22 0a  IKE 'sqlite_%'".
37260 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20 4f               " O
37270 52 44 45 52 20 42 59 20 31 20 63 6f 6c 6c 61 74  RDER BY 1 collat
37280 65 20 6e 6f 63 61 73 65 22 3b 0a 20 20 20 20 7d  e nocase";.    }
37290 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 70 72 65  .    sqlite3_pre
372a0 70 61 72 65 5f 76 32 28 70 2d 3e 64 62 2c 20 7a  pare_v2(p->db, z
372b0 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c  Sql, -1, &pStmt,
372c0 20 30 29 3b 0a 20 20 20 20 69 6e 69 74 54 65 78   0);.    initTex
372d0 74 28 26 73 51 75 65 72 79 29 3b 0a 20 20 20 20  t(&sQuery);.    
372e0 69 6e 69 74 54 65 78 74 28 26 73 53 71 6c 29 3b  initText(&sSql);
372f0 0a 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28  .    appendText(
37300 26 73 53 71 6c 2c 20 22 57 49 54 48 20 5b 73 68  &sSql, "WITH [sh
37310 61 33 73 75 6d 24 71 75 65 72 79 5d 28 61 2c 62  a3sum$query](a,b
37320 29 20 41 53 28 22 2c 30 29 3b 0a 20 20 20 20 7a  ) AS(",0);.    z
37330 53 65 70 20 3d 20 22 56 41 4c 55 45 53 28 22 3b  Sep = "VALUES(";
37340 0a 20 20 20 20 77 68 69 6c 65 28 20 53 51 4c 49  .    while( SQLI
37350 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f  TE_ROW==sqlite3_
37360 73 74 65 70 28 70 53 74 6d 74 29 20 29 7b 0a 20  step(pStmt) ){. 
37370 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
37380 2a 7a 54 61 62 20 3d 20 28 63 6f 6e 73 74 20 63  *zTab = (const c
37390 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c  har*)sqlite3_col
373a0 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 30  umn_text(pStmt,0
373b0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 4c 69  );.      if( zLi
373c0 6b 65 20 26 26 20 73 71 6c 69 74 65 33 5f 73 74  ke && sqlite3_st
373d0 72 6c 69 6b 65 28 7a 4c 69 6b 65 2c 20 7a 54 61  rlike(zLike, zTa
373e0 62 2c 20 30 29 21 3d 30 20 29 20 63 6f 6e 74 69  b, 0)!=0 ) conti
373f0 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 73  nue;.      if( s
37400 74 72 6e 63 6d 70 28 7a 54 61 62 2c 20 22 73 71  trncmp(zTab, "sq
37410 6c 69 74 65 5f 22 2c 37 29 21 3d 30 20 29 7b 0a  lite_",7)!=0 ){.
37420 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 54 65          appendTe
37430 78 74 28 26 73 51 75 65 72 79 2c 22 53 45 4c 45  xt(&sQuery,"SELE
37440 43 54 20 2a 20 46 52 4f 4d 20 22 2c 20 30 29 3b  CT * FROM ", 0);
37450 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 54  .        appendT
37460 65 78 74 28 26 73 51 75 65 72 79 2c 7a 54 61 62  ext(&sQuery,zTab
37470 2c 27 22 27 29 3b 0a 20 20 20 20 20 20 20 20 61  ,'"');.        a
37480 70 70 65 6e 64 54 65 78 74 28 26 73 51 75 65 72  ppendText(&sQuer
37490 79 2c 22 20 4e 4f 54 20 49 4e 44 45 58 45 44 3b  y," NOT INDEXED;
374a0 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c  ", 0);.      }el
374b0 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 54  se if( strcmp(zT
374c0 61 62 2c 20 22 73 71 6c 69 74 65 5f 6d 61 73 74  ab, "sqlite_mast
374d0 65 72 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  er")==0 ){.     
374e0 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73     appendText(&s
374f0 51 75 65 72 79 2c 22 53 45 4c 45 43 54 20 74 79  Query,"SELECT ty
37500 70 65 2c 6e 61 6d 65 2c 74 62 6c 5f 6e 61 6d 65  pe,name,tbl_name
37510 2c 73 71 6c 20 46 52 4f 4d 20 73 71 6c 69 74 65  ,sql FROM sqlite
37520 5f 6d 61 73 74 65 72 22 0a 20 20 20 20 20 20 20  _master".       
37530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37540 20 20 20 20 22 20 4f 52 44 45 52 20 42 59 20 6e      " ORDER BY n
37550 61 6d 65 3b 22 2c 20 30 29 3b 0a 20 20 20 20 20  ame;", 0);.     
37560 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d   }else if( strcm
37570 70 28 7a 54 61 62 2c 20 22 73 71 6c 69 74 65 5f  p(zTab, "sqlite_
37580 73 65 71 75 65 6e 63 65 22 29 3d 3d 30 20 29 7b  sequence")==0 ){
37590 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 54  .        appendT
375a0 65 78 74 28 26 73 51 75 65 72 79 2c 22 53 45 4c  ext(&sQuery,"SEL
375b0 45 43 54 20 6e 61 6d 65 2c 73 65 71 20 46 52 4f  ECT name,seq FRO
375c0 4d 20 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63  M sqlite_sequenc
375d0 65 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e".             
375e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20                " 
375f0 4f 52 44 45 52 20 42 59 20 6e 61 6d 65 3b 22 2c  ORDER BY name;",
37600 20 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   0);.      }else
37610 20 69 66 28 20 73 74 72 63 6d 70 28 7a 54 61 62   if( strcmp(zTab
37620 2c 20 22 73 71 6c 69 74 65 5f 73 74 61 74 31 22  , "sqlite_stat1"
37630 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
37640 61 70 70 65 6e 64 54 65 78 74 28 26 73 51 75 65  appendText(&sQue
37650 72 79 2c 22 53 45 4c 45 43 54 20 74 62 6c 2c 69  ry,"SELECT tbl,i
37660 64 78 2c 73 74 61 74 20 46 52 4f 4d 20 73 71 6c  dx,stat FROM sql
37670 69 74 65 5f 73 74 61 74 31 22 0a 20 20 20 20 20  ite_stat1".     
37680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37690 20 20 20 20 20 20 22 20 4f 52 44 45 52 20 42 59        " ORDER BY
376a0 20 74 62 6c 2c 69 64 78 3b 22 2c 20 30 29 3b 0a   tbl,idx;", 0);.
376b0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
376c0 73 74 72 63 6d 70 28 7a 54 61 62 2c 20 22 73 71  strcmp(zTab, "sq
376d0 6c 69 74 65 5f 73 74 61 74 33 22 29 3d 3d 30 0a  lite_stat3")==0.
376e0 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
376f0 73 74 72 63 6d 70 28 7a 54 61 62 2c 20 22 73 71  strcmp(zTab, "sq
37700 6c 69 74 65 5f 73 74 61 74 34 22 29 3d 3d 30 20  lite_stat4")==0 
37710 29 7b 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e  ){.        appen
37720 64 54 65 78 74 28 26 73 51 75 65 72 79 2c 20 22  dText(&sQuery, "
37730 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 22 2c  SELECT * FROM ",
37740 20 30 29 3b 0a 20 20 20 20 20 20 20 20 61 70 70   0);.        app
37750 65 6e 64 54 65 78 74 28 26 73 51 75 65 72 79 2c  endText(&sQuery,
37760 20 7a 54 61 62 2c 20 30 29 3b 0a 20 20 20 20 20   zTab, 0);.     
37770 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73     appendText(&s
37780 51 75 65 72 79 2c 20 22 20 4f 52 44 45 52 20 4