/ Hex Artifact Content
Login
SQLite training in Houston TX on 2019-11-05 (details)
Part of the 2019 Tcl Conference

Artifact 3151c40b2f23857d6af032d535bcc8c432926c11ceb14803213cbb45552b957a:


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 20 20 69 66 28  );.          if(
161a0 20 70 41 72 67 20 29 20 70 41 72 67 2d 3e 70 53   pArg ) pArg->pS
161b0 74 6d 74 20 3d 20 70 53 74 6d 74 3b 0a 20 20 20  tmt = pStmt;.   
161c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72       }.        r
161d0 65 73 74 6f 72 65 5f 64 65 62 75 67 5f 74 72 61  estore_debug_tra
161e0 63 65 5f 6d 6f 64 65 73 28 29 3b 0a 20 20 20 20  ce_modes();.    
161f0 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 70    }..      if( p
16200 41 72 67 20 29 7b 0a 20 20 20 20 20 20 20 20 70  Arg ){.        p
16210 41 72 67 2d 3e 63 4d 6f 64 65 20 3d 20 70 41 72  Arg->cMode = pAr
16220 67 2d 3e 6d 6f 64 65 3b 0a 20 20 20 20 20 20 20  g->mode;.       
16230 20 69 66 28 20 70 41 72 67 2d 3e 61 75 74 6f 45   if( pArg->autoE
16240 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20 20 20  xplain ){.      
16250 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f      if( sqlite3_
16260 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 70 53 74  column_count(pSt
16270 6d 74 29 3d 3d 38 0a 20 20 20 20 20 20 20 20 20  mt)==8.         
16280 20 20 26 26 20 73 71 6c 69 74 65 33 5f 73 74 72    && sqlite3_str
16290 6c 69 6b 65 28 22 45 58 50 4c 41 49 4e 25 22 2c  like("EXPLAIN%",
162a0 20 7a 53 74 6d 74 53 71 6c 2c 30 29 3d 3d 30 0a   zStmtSql,0)==0.
162b0 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20            ){.   
162c0 20 20 20 20 20 20 20 20 20 70 41 72 67 2d 3e 63           pArg->c
162d0 4d 6f 64 65 20 3d 20 4d 4f 44 45 5f 45 78 70 6c  Mode = MODE_Expl
162e0 61 69 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ain;.          }
162f0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73  .          if( s
16300 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f  qlite3_column_co
16310 75 6e 74 28 70 53 74 6d 74 29 3d 3d 34 0a 20 20  unt(pStmt)==4.  
16320 20 20 20 20 20 20 20 20 20 26 26 20 73 71 6c 69           && sqli
16330 74 65 33 5f 73 74 72 6c 69 6b 65 28 22 45 58 50  te3_strlike("EXP
16340 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 25  LAIN QUERY PLAN%
16350 22 2c 20 7a 53 74 6d 74 53 71 6c 2c 30 29 3d 3d  ", zStmtSql,0)==
16360 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
16370 20 70 41 72 67 2d 3e 63 4d 6f 64 65 20 3d 20 4d   pArg->cMode = M
16380 4f 44 45 5f 45 51 50 3b 0a 20 20 20 20 20 20 20  ODE_EQP;.       
16390 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 0a     }.        }..
163a0 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68          /* If th
163b0 65 20 73 68 65 6c 6c 20 69 73 20 63 75 72 72 65  e shell is curre
163c0 6e 74 6c 79 20 69 6e 20 22 2e 65 78 70 6c 61 69  ntly in ".explai
163d0 6e 22 20 6d 6f 64 65 2c 20 67 61 74 68 65 72 20  n" mode, gather 
163e0 74 68 65 20 65 78 74 72 61 0a 20 20 20 20 20 20  the extra.      
163f0 20 20 2a 2a 20 64 61 74 61 20 72 65 71 75 69 72    ** data requir
16400 65 64 20 74 6f 20 61 64 64 20 69 6e 64 65 6e 74  ed to add indent
16410 73 20 74 6f 20 74 68 65 20 6f 75 74 70 75 74 2e  s to the output.
16420 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  */.        if( p
16430 41 72 67 2d 3e 63 4d 6f 64 65 3d 3d 4d 4f 44 45  Arg->cMode==MODE
16440 5f 45 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20  _Explain ){.    
16450 20 20 20 20 20 20 65 78 70 6c 61 69 6e 5f 64 61        explain_da
16460 74 61 5f 70 72 65 70 61 72 65 28 70 41 72 67 2c  ta_prepare(pArg,
16470 20 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 20   pStmt);.       
16480 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20   }.      }..    
16490 20 20 65 78 65 63 5f 70 72 65 70 61 72 65 64 5f    exec_prepared_
164a0 73 74 6d 74 28 70 41 72 67 2c 20 70 53 74 6d 74  stmt(pArg, pStmt
164b0 29 3b 0a 20 20 20 20 20 20 65 78 70 6c 61 69 6e  );.      explain
164c0 5f 64 61 74 61 5f 64 65 6c 65 74 65 28 70 41 72  _data_delete(pAr
164d0 67 29 3b 0a 20 20 20 20 20 20 65 71 70 5f 72 65  g);.      eqp_re
164e0 6e 64 65 72 28 70 41 72 67 29 3b 0a 0a 20 20 20  nder(pArg);..   
164f0 20 20 20 2f 2a 20 70 72 69 6e 74 20 75 73 61 67     /* print usag
16500 65 20 73 74 61 74 73 20 69 66 20 73 74 61 74 73  e stats if stats
16510 20 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28   on */.      if(
16520 20 70 41 72 67 20 26 26 20 70 41 72 67 2d 3e 73   pArg && pArg->s
16530 74 61 74 73 4f 6e 20 29 7b 0a 20 20 20 20 20 20  tatsOn ){.      
16540 20 20 64 69 73 70 6c 61 79 5f 73 74 61 74 73 28    display_stats(
16550 64 62 2c 20 70 41 72 67 2c 20 30 29 3b 0a 20 20  db, pArg, 0);.  
16560 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
16570 70 72 69 6e 74 20 6c 6f 6f 70 2d 63 6f 75 6e 74  print loop-count
16580 65 72 73 20 69 66 20 72 65 71 75 69 72 65 64 20  ers if required 
16590 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 41 72  */.      if( pAr
165a0 67 20 26 26 20 70 41 72 67 2d 3e 73 63 61 6e 73  g && pArg->scans
165b0 74 61 74 73 4f 6e 20 29 7b 0a 20 20 20 20 20 20  tatsOn ){.      
165c0 20 20 64 69 73 70 6c 61 79 5f 73 63 61 6e 73 74    display_scanst
165d0 61 74 73 28 64 62 2c 20 70 41 72 67 29 3b 0a 20  ats(db, pArg);. 
165e0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
165f0 20 46 69 6e 61 6c 69 7a 65 20 74 68 65 20 73 74   Finalize the st
16600 61 74 65 6d 65 6e 74 20 6a 75 73 74 20 65 78 65  atement just exe
16610 63 75 74 65 64 2e 20 49 66 20 74 68 69 73 20 66  cuted. If this f
16620 61 69 6c 73 2c 20 73 61 76 65 20 61 0a 20 20 20  ails, save a.   
16630 20 20 20 2a 2a 20 63 6f 70 79 20 6f 66 20 74 68     ** copy of th
16640 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 2e  e error message.
16650 20 4f 74 68 65 72 77 69 73 65 2c 20 73 65 74 20   Otherwise, set 
16660 7a 53 71 6c 20 74 6f 20 70 6f 69 6e 74 20 74 6f  zSql to point to
16670 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 6e 65   the.      ** ne
16680 78 74 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20  xt statement to 
16690 65 78 65 63 75 74 65 2e 20 2a 2f 0a 20 20 20 20  execute. */.    
166a0 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33 5f    rc2 = sqlite3_
166b0 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b  finalize(pStmt);
166c0 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
166d0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 20 72 63  QLITE_NOMEM ) rc
166e0 20 3d 20 72 63 32 3b 0a 20 20 20 20 20 20 69 66   = rc2;.      if
166f0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
16700 29 7b 0a 20 20 20 20 20 20 20 20 7a 53 71 6c 20  ){.        zSql 
16710 3d 20 7a 4c 65 66 74 6f 76 65 72 3b 0a 20 20 20  = zLeftover;.   
16720 20 20 20 20 20 77 68 69 6c 65 28 20 49 73 53 70       while( IsSp
16730 61 63 65 28 7a 53 71 6c 5b 30 5d 29 20 29 20 7a  ace(zSql[0]) ) z
16740 53 71 6c 2b 2b 3b 0a 20 20 20 20 20 20 7d 65 6c  Sql++;.      }el
16750 73 65 20 69 66 28 20 70 7a 45 72 72 4d 73 67 20  se if( pzErrMsg 
16760 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 7a 45 72  ){.        *pzEr
16770 72 4d 73 67 20 3d 20 73 61 76 65 5f 65 72 72 5f  rMsg = save_err_
16780 6d 73 67 28 64 62 29 3b 0a 20 20 20 20 20 20 7d  msg(db);.      }
16790 0a 0a 20 20 20 20 20 20 2f 2a 20 63 6c 65 61 72  ..      /* clear
167a0 20 73 61 76 65 64 20 73 74 6d 74 20 68 61 6e 64   saved stmt hand
167b0 6c 65 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  le */.      if( 
167c0 70 41 72 67 20 29 7b 0a 20 20 20 20 20 20 20 20  pArg ){.        
167d0 70 41 72 67 2d 3e 70 53 74 6d 74 20 3d 20 4e 55  pArg->pStmt = NU
167e0 4c 4c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  LL;.      }.    
167f0 7d 0a 20 20 7d 20 2f 2a 20 65 6e 64 20 77 68 69  }.  } /* end whi
16800 6c 65 20 2a 2f 0a 0a 20 20 72 65 74 75 72 6e 20  le */..  return 
16810 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c  rc;.}../*.** Rel
16820 65 61 73 65 20 6d 65 6d 6f 72 79 20 70 72 65 76  ease memory prev
16830 69 6f 75 73 6c 79 20 61 6c 6c 6f 63 61 74 65 64  iously allocated
16840 20 62 79 20 74 61 62 6c 65 43 6f 6c 75 6d 6e 4c   by tableColumnL
16850 69 73 74 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  ist()..*/.static
16860 20 76 6f 69 64 20 66 72 65 65 43 6f 6c 75 6d 6e   void freeColumn
16870 4c 69 73 74 28 63 68 61 72 20 2a 2a 61 7a 43 6f  List(char **azCo
16880 6c 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66  l){.  int i;.  f
16890 6f 72 28 69 3d 31 3b 20 61 7a 43 6f 6c 5b 69 5d  or(i=1; azCol[i]
168a0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69  ; i++){.    sqli
168b0 74 65 33 5f 66 72 65 65 28 61 7a 43 6f 6c 5b 69  te3_free(azCol[i
168c0 5d 29 3b 0a 20 20 7d 0a 20 20 2f 2a 20 61 7a 43  ]);.  }.  /* azC
168d0 6f 6c 5b 30 5d 20 69 73 20 61 20 73 74 61 74 69  ol[0] is a stati
168e0 63 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20 73 71  c string */.  sq
168f0 6c 69 74 65 33 5f 66 72 65 65 28 61 7a 43 6f 6c  lite3_free(azCol
16900 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  );.}../*.** Retu
16910 72 6e 20 61 20 6c 69 73 74 20 6f 66 20 70 6f 69  rn a list of poi
16920 6e 74 65 72 73 20 74 6f 20 73 74 72 69 6e 67 73  nters to strings
16930 20 77 68 69 63 68 20 61 72 65 20 74 68 65 20 6e   which are the n
16940 61 6d 65 73 20 6f 66 20 61 6c 6c 0a 2a 2a 20 63  ames of all.** c
16950 6f 6c 75 6d 6e 73 20 69 6e 20 74 61 62 6c 65 20  olumns in table 
16960 7a 54 61 62 2e 20 20 20 54 68 65 20 6d 65 6d 6f  zTab.   The memo
16970 72 79 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6e  ry to hold the n
16980 61 6d 65 73 20 69 73 20 64 79 6e 61 6d 69 63 61  ames is dynamica
16990 6c 6c 79 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64  lly.** allocated
169a0 20 61 6e 64 20 6d 75 73 74 20 62 65 20 72 65 6c   and must be rel
169b0 65 61 73 65 64 20 62 79 20 74 68 65 20 63 61 6c  eased by the cal
169c0 6c 65 72 20 75 73 69 6e 67 20 61 20 73 75 62 73  ler using a subs
169d0 65 71 75 65 6e 74 20 63 61 6c 6c 0a 2a 2a 20 74  equent call.** t
169e0 6f 20 66 72 65 65 43 6f 6c 75 6d 6e 4c 69 73 74  o freeColumnList
169f0 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 7a  ()..**.** The az
16a00 43 6f 6c 5b 30 5d 20 65 6e 74 72 79 20 69 73 20  Col[0] entry is 
16a10 75 73 75 61 6c 6c 79 20 4e 55 4c 4c 2e 20 20 48  usually NULL.  H
16a20 6f 77 65 76 65 72 2c 20 69 66 20 7a 54 61 62 20  owever, if zTab 
16a30 63 6f 6e 74 61 69 6e 73 20 61 20 72 6f 77 69 64  contains a rowid
16a40 0a 2a 2a 20 76 61 6c 75 65 20 74 68 61 74 20 6e  .** value that n
16a50 65 65 64 73 20 74 6f 20 62 65 20 70 72 65 73 65  eeds to be prese
16a60 72 76 65 64 2c 20 74 68 65 6e 20 61 7a 43 6f 6c  rved, then azCol
16a70 5b 30 5d 20 69 73 20 66 69 6c 6c 65 64 20 69 6e  [0] is filled in
16a80 20 77 69 74 68 20 74 68 65 0a 2a 2a 20 6e 61 6d   with the.** nam
16a90 65 20 6f 66 20 74 68 65 20 72 6f 77 69 64 20 63  e of the rowid c
16aa0 6f 6c 75 6d 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  olumn..**.** The
16ab0 20 66 69 72 73 74 20 72 65 67 75 6c 61 72 20 63   first regular c
16ac0 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 74 61 62  olumn in the tab
16ad0 6c 65 20 69 73 20 61 7a 43 6f 6c 5b 31 5d 2e 20  le is azCol[1]. 
16ae0 20 54 68 65 20 6c 69 73 74 20 69 73 20 74 65 72   The list is ter
16af0 6d 69 6e 61 74 65 64 0a 2a 2a 20 62 79 20 61 6e  minated.** by an
16b00 20 65 6e 74 72 79 20 77 69 74 68 20 61 7a 43 6f   entry with azCo
16b10 6c 5b 69 5d 3d 3d 30 2e 0a 2a 2f 0a 73 74 61 74  l[i]==0..*/.stat
16b20 69 63 20 63 68 61 72 20 2a 2a 74 61 62 6c 65 43  ic char **tableC
16b30 6f 6c 75 6d 6e 4c 69 73 74 28 53 68 65 6c 6c 53  olumnList(ShellS
16b40 74 61 74 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63  tate *p, const c
16b50 68 61 72 20 2a 7a 54 61 62 29 7b 0a 20 20 63 68  har *zTab){.  ch
16b60 61 72 20 2a 2a 61 7a 43 6f 6c 20 3d 20 30 3b 0a  ar **azCol = 0;.
16b70 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
16b80 70 53 74 6d 74 3b 0a 20 20 63 68 61 72 20 2a 7a  pStmt;.  char *z
16b90 53 71 6c 3b 0a 20 20 69 6e 74 20 6e 43 6f 6c 20  Sql;.  int nCol 
16ba0 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 41 6c 6c 6f  = 0;.  int nAllo
16bb0 63 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 50 4b  c = 0;.  int nPK
16bc0 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4e   = 0;       /* N
16bd0 75 6d 62 65 72 20 6f 66 20 50 52 49 4d 41 52 59  umber of PRIMARY
16be0 20 4b 45 59 20 63 6f 6c 75 6d 6e 73 20 73 65 65   KEY columns see
16bf0 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 73 49 50 4b  n */.  int isIPK
16c00 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 54 72 75   = 0;     /* Tru
16c10 65 20 69 66 20 6f 6e 65 20 50 52 49 4d 41 52 59  e if one PRIMARY
16c20 20 4b 45 59 20 63 6f 6c 75 6d 6e 20 6f 66 20 74   KEY column of t
16c30 79 70 65 20 49 4e 54 45 47 45 52 20 2a 2f 0a 20  ype INTEGER */. 
16c40 20 69 6e 74 20 70 72 65 73 65 72 76 65 52 6f 77   int preserveRow
16c50 69 64 20 3d 20 53 68 65 6c 6c 48 61 73 46 6c 61  id = ShellHasFla
16c60 67 28 70 2c 20 53 48 46 4c 47 5f 50 72 65 73 65  g(p, SHFLG_Prese
16c70 72 76 65 52 6f 77 69 64 29 3b 0a 20 20 69 6e 74  rveRowid);.  int
16c80 20 72 63 3b 0a 0a 20 20 7a 53 71 6c 20 3d 20 73   rc;..  zSql = s
16c90 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
16ca0 50 52 41 47 4d 41 20 74 61 62 6c 65 5f 69 6e 66  PRAGMA table_inf
16cb0 6f 3d 25 51 22 2c 20 7a 54 61 62 29 3b 0a 20 20  o=%Q", zTab);.  
16cc0 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65  rc = sqlite3_pre
16cd0 70 61 72 65 5f 76 32 28 70 2d 3e 64 62 2c 20 7a  pare_v2(p->db, z
16ce0 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c  Sql, -1, &pStmt,
16cf0 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66   0);.  sqlite3_f
16d00 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 69 66 28  ree(zSql);.  if(
16d10 20 72 63 20 29 20 72 65 74 75 72 6e 20 30 3b 0a   rc ) return 0;.
16d20 20 20 77 68 69 6c 65 28 20 73 71 6c 69 74 65 33    while( sqlite3
16d30 5f 73 74 65 70 28 70 53 74 6d 74 29 3d 3d 53 51  _step(pStmt)==SQ
16d40 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20  LITE_ROW ){.    
16d50 69 66 28 20 6e 43 6f 6c 3e 3d 6e 41 6c 6c 6f 63  if( nCol>=nAlloc
16d60 2d 32 20 29 7b 0a 20 20 20 20 20 20 6e 41 6c 6c  -2 ){.      nAll
16d70 6f 63 20 3d 20 6e 41 6c 6c 6f 63 2a 32 20 2b 20  oc = nAlloc*2 + 
16d80 6e 43 6f 6c 20 2b 20 31 30 3b 0a 20 20 20 20 20  nCol + 10;.     
16d90 20 61 7a 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33   azCol = sqlite3
16da0 5f 72 65 61 6c 6c 6f 63 28 61 7a 43 6f 6c 2c 20  _realloc(azCol, 
16db0 6e 41 6c 6c 6f 63 2a 73 69 7a 65 6f 66 28 61 7a  nAlloc*sizeof(az
16dc0 43 6f 6c 5b 30 5d 29 29 3b 0a 20 20 20 20 20 20  Col[0]));.      
16dd0 69 66 28 20 61 7a 43 6f 6c 3d 3d 30 20 29 20 73  if( azCol==0 ) s
16de0 68 65 6c 6c 5f 6f 75 74 5f 6f 66 5f 6d 65 6d 6f  hell_out_of_memo
16df0 72 79 28 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ry();.    }.    
16e00 61 7a 43 6f 6c 5b 2b 2b 6e 43 6f 6c 5d 20 3d 20  azCol[++nCol] = 
16e10 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
16e20 22 25 73 22 2c 20 73 71 6c 69 74 65 33 5f 63 6f  "%s", sqlite3_co
16e30 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c  lumn_text(pStmt,
16e40 20 31 29 29 3b 0a 20 20 20 20 69 66 28 20 73 71   1));.    if( sq
16e50 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74  lite3_column_int
16e60 28 70 53 74 6d 74 2c 20 35 29 20 29 7b 0a 20 20  (pStmt, 5) ){.  
16e70 20 20 20 20 6e 50 4b 2b 2b 3b 0a 20 20 20 20 20      nPK++;.     
16e80 20 69 66 28 20 6e 50 4b 3d 3d 31 0a 20 20 20 20   if( nPK==1.    
16e90 20 20 20 26 26 20 73 71 6c 69 74 65 33 5f 73 74     && sqlite3_st
16ea0 72 69 63 6d 70 28 28 63 6f 6e 73 74 20 63 68 61  ricmp((const cha
16eb0 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  r*)sqlite3_colum
16ec0 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 32 29 2c  n_text(pStmt,2),
16ed0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
16ee0 20 20 20 20 20 20 20 20 20 20 20 22 49 4e 54 45             "INTE
16ef0 47 45 52 22 29 3d 3d 30 0a 20 20 20 20 20 20 29  GER")==0.      )
16f00 7b 0a 20 20 20 20 20 20 20 20 69 73 49 50 4b 20  {.        isIPK 
16f10 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  = 1;.      }else
16f20 7b 0a 20 20 20 20 20 20 20 20 69 73 49 50 4b 20  {.        isIPK 
16f30 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
16f40 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
16f50 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29  _finalize(pStmt)
16f60 3b 0a 20 20 69 66 28 20 61 7a 43 6f 6c 3d 3d 30  ;.  if( azCol==0
16f70 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 61   ) return 0;.  a
16f80 7a 43 6f 6c 5b 30 5d 20 3d 20 30 3b 0a 20 20 61  zCol[0] = 0;.  a
16f90 7a 43 6f 6c 5b 6e 43 6f 6c 2b 31 5d 20 3d 20 30  zCol[nCol+1] = 0
16fa0 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 64 65 63 69  ;..  /* The deci
16fb0 73 69 6f 6e 20 6f 66 20 77 68 65 74 68 65 72 20  sion of whether 
16fc0 6f 72 20 6e 6f 74 20 61 20 72 6f 77 69 64 20 72  or not a rowid r
16fd0 65 61 6c 6c 79 20 6e 65 65 64 73 20 74 6f 20 62  eally needs to b
16fe0 65 20 70 72 65 73 65 72 76 65 64 0a 20 20 2a 2a  e preserved.  **
16ff0 20 69 73 20 74 72 69 63 6b 79 2e 20 20 57 65 20   is tricky.  We 
17000 6e 65 76 65 72 20 6e 65 65 64 20 74 6f 20 70 72  never need to pr
17010 65 73 65 72 76 65 20 61 20 72 6f 77 69 64 20 66  eserve a rowid f
17020 6f 72 20 61 20 57 49 54 48 4f 55 54 20 52 4f 57  or a WITHOUT ROW
17030 49 44 20 74 61 62 6c 65 0a 20 20 2a 2a 20 6f 72  ID table.  ** or
17040 20 61 20 74 61 62 6c 65 20 77 69 74 68 20 61 6e   a table with an
17050 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
17060 20 4b 45 59 2e 20 20 57 65 20 61 72 65 20 75 6e   KEY.  We are un
17070 61 62 6c 65 20 74 6f 20 70 72 65 73 65 72 76 65  able to preserve
17080 0a 20 20 2a 2a 20 72 6f 77 69 64 73 20 6f 6e 20  .  ** rowids on 
17090 74 61 62 6c 65 73 20 77 68 65 72 65 20 74 68 65  tables where the
170a0 20 72 6f 77 69 64 20 69 73 20 69 6e 61 63 63 65   rowid is inacce
170b0 73 73 69 62 6c 65 20 62 65 63 61 75 73 65 20 74  ssible because t
170c0 68 65 72 65 20 61 72 65 20 6f 74 68 65 72 0a 20  here are other. 
170d0 20 2a 2a 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74   ** columns in t
170e0 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 64 20 22  he table named "
170f0 72 6f 77 69 64 22 2c 20 22 5f 72 6f 77 69 64 5f  rowid", "_rowid_
17100 22 2c 20 61 6e 64 20 22 6f 69 64 22 2e 0a 20 20  ", and "oid"..  
17110 2a 2f 0a 20 20 69 66 28 20 70 72 65 73 65 72 76  */.  if( preserv
17120 65 52 6f 77 69 64 20 26 26 20 69 73 49 50 4b 20  eRowid && isIPK 
17130 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 61 20 73  ){.    /* If a s
17140 69 6e 67 6c 65 20 50 52 49 4d 41 52 59 20 4b 45  ingle PRIMARY KE
17150 59 20 63 6f 6c 75 6d 6e 20 77 69 74 68 20 74 79  Y column with ty
17160 70 65 20 49 4e 54 45 47 45 52 20 77 61 73 20 73  pe INTEGER was s
17170 65 65 6e 2c 20 74 68 65 6e 20 69 74 0a 20 20 20  een, then it.   
17180 20 2a 2a 20 6d 69 67 68 74 20 62 65 20 61 6e 20   ** might be an 
17190 61 6c 69 73 65 20 66 6f 72 20 74 68 65 20 52 4f  alise for the RO
171a0 57 49 44 2e 20 20 42 75 74 20 69 74 20 6d 69 67  WID.  But it mig
171b0 68 74 20 61 6c 73 6f 20 62 65 20 61 20 57 49 54  ht also be a WIT
171c0 48 4f 55 54 20 52 4f 57 49 44 0a 20 20 20 20 2a  HOUT ROWID.    *
171d0 2a 20 74 61 62 6c 65 20 6f 72 20 61 20 49 4e 54  * table or a INT
171e0 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
171f0 20 44 45 53 43 20 63 6f 6c 75 6d 6e 2c 20 6e 65   DESC column, ne
17200 69 74 68 65 72 20 6f 66 20 77 68 69 63 68 20 61  ither of which a
17210 72 65 0a 20 20 20 20 2a 2a 20 52 4f 57 49 44 20  re.    ** ROWID 
17220 61 6c 69 61 73 65 73 2e 20 20 54 6f 20 64 69 73  aliases.  To dis
17230 74 69 6e 67 75 69 73 68 20 74 68 65 73 65 20 63  tinguish these c
17240 61 73 65 73 2c 20 63 68 65 63 6b 20 74 6f 20 73  ases, check to s
17250 65 65 20 69 66 0a 20 20 20 20 2a 2a 20 74 68 65  ee if.    ** the
17260 72 65 20 69 73 20 61 20 22 70 6b 22 20 65 6e 74  re is a "pk" ent
17270 72 79 20 69 6e 20 22 50 52 41 47 4d 41 20 69 6e  ry in "PRAGMA in
17280 64 65 78 5f 6c 69 73 74 22 2e 20 20 54 68 65 72  dex_list".  Ther
17290 65 20 77 69 6c 6c 20 62 65 0a 20 20 20 20 2a 2a  e will be.    **
172a0 20 6e 6f 20 22 70 6b 22 20 69 6e 64 65 78 20 69   no "pk" index i
172b0 66 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45  f the PRIMARY KE
172c0 59 20 72 65 61 6c 6c 79 20 69 73 20 61 6e 20 61  Y really is an a
172d0 6c 69 61 73 20 66 6f 72 20 74 68 65 20 52 4f 57  lias for the ROW
172e0 49 44 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 7a  ID..    */.    z
172f0 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  Sql = sqlite3_mp
17300 72 69 6e 74 66 28 22 53 45 4c 45 43 54 20 31 20  rintf("SELECT 1 
17310 46 52 4f 4d 20 70 72 61 67 6d 61 5f 69 6e 64 65  FROM pragma_inde
17320 78 5f 6c 69 73 74 28 25 51 29 22 0a 20 20 20 20  x_list(%Q)".    
17330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17340 20 20 20 20 20 20 20 22 20 57 48 45 52 45 20 6f         " WHERE o
17350 72 69 67 69 6e 3d 27 70 6b 27 22 2c 20 7a 54 61  rigin='pk'", zTa
17360 62 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  b);.    rc = sql
17370 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28  ite3_prepare_v2(
17380 70 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c  p->db, zSql, -1,
17390 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20   &pStmt, 0);.   
173a0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53   sqlite3_free(zS
173b0 71 6c 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  ql);.    if( rc 
173c0 29 7b 0a 20 20 20 20 20 20 66 72 65 65 43 6f 6c  ){.      freeCol
173d0 75 6d 6e 4c 69 73 74 28 61 7a 43 6f 6c 29 3b 0a  umnList(azCol);.
173e0 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
173f0 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73      }.    rc = s
17400 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d  qlite3_step(pStm
17410 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  t);.    sqlite3_
17420 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b  finalize(pStmt);
17430 0a 20 20 20 20 70 72 65 73 65 72 76 65 52 6f 77  .    preserveRow
17440 69 64 20 3d 20 72 63 3d 3d 53 51 4c 49 54 45 5f  id = rc==SQLITE_
17450 52 4f 57 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ROW;.  }.  if( p
17460 72 65 73 65 72 76 65 52 6f 77 69 64 20 29 7b 0a  reserveRowid ){.
17470 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 70 72 65 73      /* Only pres
17480 65 72 76 65 20 74 68 65 20 72 6f 77 69 64 20 69  erve the rowid i
17490 66 20 77 65 20 63 61 6e 20 66 69 6e 64 20 61 20  f we can find a 
174a0 6e 61 6d 65 20 74 6f 20 75 73 65 20 66 6f 72 20  name to use for 
174b0 74 68 65 0a 20 20 20 20 2a 2a 20 72 6f 77 69 64  the.    ** rowid
174c0 20 2a 2f 0a 20 20 20 20 73 74 61 74 69 63 20 63   */.    static c
174d0 68 61 72 20 2a 61 7a 52 6f 77 69 64 5b 5d 20 3d  har *azRowid[] =
174e0 20 7b 20 22 72 6f 77 69 64 22 2c 20 22 5f 72 6f   { "rowid", "_ro
174f0 77 69 64 5f 22 2c 20 22 6f 69 64 22 20 7d 3b 0a  wid_", "oid" };.
17500 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20      int i, j;.  
17510 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 33 3b 20    for(j=0; j<3; 
17520 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 66 6f 72 28  j++){.      for(
17530 69 3d 31 3b 20 69 3c 3d 6e 43 6f 6c 3b 20 69 2b  i=1; i<=nCol; i+
17540 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
17550 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28  sqlite3_stricmp(
17560 61 7a 52 6f 77 69 64 5b 6a 5d 2c 61 7a 43 6f 6c  azRowid[j],azCol
17570 5b 69 5d 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b  [i])==0 ) break;
17580 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
17590 66 28 20 69 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20  f( i>nCol ){.   
175a0 20 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20       /* At this 
175b0 70 6f 69 6e 74 2c 20 77 65 20 6b 6e 6f 77 20 74  point, we know t
175c0 68 61 74 20 61 7a 52 6f 77 69 64 5b 6a 5d 20 69  hat azRowid[j] i
175d0 73 20 6e 6f 74 20 74 68 65 20 6e 61 6d 65 20 6f  s not the name o
175e0 66 20 61 6e 79 0a 20 20 20 20 20 20 20 20 2a 2a  f any.        **
175f0 20 6f 72 64 69 6e 61 72 79 20 63 6f 6c 75 6d 6e   ordinary column
17600 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 20   in the table.  
17610 56 65 72 69 66 79 20 74 68 61 74 20 61 7a 52 6f  Verify that azRo
17620 77 69 64 5b 6a 5d 20 69 73 20 61 20 76 61 6c 69  wid[j] is a vali
17630 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 61 6d  d.        ** nam
17640 65 20 66 6f 72 20 74 68 65 20 72 6f 77 69 64 20  e for the rowid 
17650 62 65 66 6f 72 65 20 61 64 64 69 6e 67 20 69 74  before adding it
17660 20 74 6f 20 61 7a 43 6f 6c 5b 30 5d 2e 20 20 57   to azCol[0].  W
17670 49 54 48 4f 55 54 20 52 4f 57 49 44 0a 20 20 20  ITHOUT ROWID.   
17680 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 73 20 77       ** tables w
17690 69 6c 6c 20 66 61 69 6c 20 74 68 69 73 20 6c 61  ill fail this la
176a0 73 74 20 63 68 65 63 6b 20 2a 2f 0a 20 20 20 20  st check */.    
176b0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
176c0 5f 74 61 62 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d 65  _table_column_me
176d0 74 61 64 61 74 61 28 70 2d 3e 64 62 2c 30 2c 7a  tadata(p->db,0,z
176e0 54 61 62 2c 61 7a 52 6f 77 69 64 5b 6a 5d 2c 30  Tab,azRowid[j],0
176f0 2c 30 2c 30 2c 30 2c 30 29 3b 0a 20 20 20 20 20  ,0,0,0,0);.     
17700 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
17710 45 5f 4f 4b 20 29 20 61 7a 43 6f 6c 5b 30 5d 20  E_OK ) azCol[0] 
17720 3d 20 61 7a 52 6f 77 69 64 5b 6a 5d 3b 0a 20 20  = azRowid[j];.  
17730 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
17740 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
17750 20 72 65 74 75 72 6e 20 61 7a 43 6f 6c 3b 0a 7d   return azCol;.}
17760 0a 0a 2f 2a 0a 2a 2a 20 54 6f 67 67 6c 65 20 74  ../*.** Toggle t
17770 68 65 20 72 65 76 65 72 73 65 5f 75 6e 6f 72 64  he reverse_unord
17780 65 72 65 64 5f 73 65 6c 65 63 74 73 20 73 65 74  ered_selects set
17790 74 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ting..*/.static 
177a0 76 6f 69 64 20 74 6f 67 67 6c 65 53 65 6c 65 63  void toggleSelec
177b0 74 4f 72 64 65 72 28 73 71 6c 69 74 65 33 20 2a  tOrder(sqlite3 *
177c0 64 62 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73  db){.  sqlite3_s
177d0 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a  tmt *pStmt = 0;.
177e0 20 20 69 6e 74 20 69 53 65 74 74 69 6e 67 20 3d    int iSetting =
177f0 20 30 3b 0a 20 20 63 68 61 72 20 7a 53 74 6d 74   0;.  char zStmt
17800 5b 31 30 30 5d 3b 0a 20 20 73 71 6c 69 74 65 33  [100];.  sqlite3
17810 5f 70 72 65 70 61 72 65 5f 76 32 28 64 62 2c 20  _prepare_v2(db, 
17820 22 50 52 41 47 4d 41 20 72 65 76 65 72 73 65 5f  "PRAGMA reverse_
17830 75 6e 6f 72 64 65 72 65 64 5f 73 65 6c 65 63 74  unordered_select
17840 73 22 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20  s", -1, &pStmt, 
17850 30 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  0);.  if( sqlite
17860 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3d 3d 53  3_step(pStmt)==S
17870 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20  QLITE_ROW ){.   
17880 20 69 53 65 74 74 69 6e 67 20 3d 20 73 71 6c 69   iSetting = sqli
17890 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70  te3_column_int(p
178a0 53 74 6d 74 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  Stmt, 0);.  }.  
178b0 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
178c0 28 70 53 74 6d 74 29 3b 0a 20 20 73 71 6c 69 74  (pStmt);.  sqlit
178d0 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
178e0 6f 66 28 7a 53 74 6d 74 29 2c 20 7a 53 74 6d 74  of(zStmt), zStmt
178f0 2c 0a 20 20 20 20 20 20 20 22 50 52 41 47 4d 41  ,.       "PRAGMA
17900 20 72 65 76 65 72 73 65 5f 75 6e 6f 72 64 65 72   reverse_unorder
17910 65 64 5f 73 65 6c 65 63 74 73 28 25 64 29 22 2c  ed_selects(%d)",
17920 20 21 69 53 65 74 74 69 6e 67 29 3b 0a 20 20 73   !iSetting);.  s
17930 71 6c 69 74 65 33 5f 65 78 65 63 28 64 62 2c 20  qlite3_exec(db, 
17940 7a 53 74 6d 74 2c 20 30 2c 20 30 2c 20 30 29 3b  zStmt, 0, 0, 0);
17950 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69  .}../*.** This i
17960 73 20 61 20 64 69 66 66 65 72 65 6e 74 20 63 61  s a different ca
17970 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65 20 75  llback routine u
17980 73 65 64 20 66 6f 72 20 64 75 6d 70 69 6e 67 20  sed for dumping 
17990 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a  the database..**
179a0 20 45 61 63 68 20 72 6f 77 20 72 65 63 65 69 76   Each row receiv
179b0 65 64 20 62 79 20 74 68 69 73 20 63 61 6c 6c 62  ed by this callb
179c0 61 63 6b 20 63 6f 6e 73 69 73 74 73 20 6f 66 20  ack consists of 
179d0 61 20 74 61 62 6c 65 20 6e 61 6d 65 2c 0a 2a 2a  a table name,.**
179e0 20 74 68 65 20 74 61 62 6c 65 20 74 79 70 65 20   the table type 
179f0 28 22 69 6e 64 65 78 22 20 6f 72 20 22 74 61 62  ("index" or "tab
17a00 6c 65 22 29 20 61 6e 64 20 53 51 4c 20 74 6f 20  le") and SQL to 
17a10 63 72 65 61 74 65 20 74 68 65 20 74 61 62 6c 65  create the table
17a20 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  ..** This routin
17a30 65 20 73 68 6f 75 6c 64 20 70 72 69 6e 74 20 74  e should print t
17a40 65 78 74 20 73 75 66 66 69 63 69 65 6e 74 20 74  ext sufficient t
17a50 6f 20 72 65 63 72 65 61 74 65 20 74 68 65 20 74  o recreate the t
17a60 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  able..*/.static 
17a70 69 6e 74 20 64 75 6d 70 5f 63 61 6c 6c 62 61 63  int dump_callbac
17a80 6b 28 76 6f 69 64 20 2a 70 41 72 67 2c 20 69 6e  k(void *pArg, in
17a90 74 20 6e 41 72 67 2c 20 63 68 61 72 20 2a 2a 61  t nArg, char **a
17aa0 7a 41 72 67 2c 20 63 68 61 72 20 2a 2a 61 7a 4e  zArg, char **azN
17ab0 6f 74 55 73 65 64 29 7b 0a 20 20 69 6e 74 20 72  otUsed){.  int r
17ac0 63 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  c;.  const char 
17ad0 2a 7a 54 61 62 6c 65 3b 0a 20 20 63 6f 6e 73 74  *zTable;.  const
17ae0 20 63 68 61 72 20 2a 7a 54 79 70 65 3b 0a 20 20   char *zType;.  
17af0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c  const char *zSql
17b00 3b 0a 20 20 53 68 65 6c 6c 53 74 61 74 65 20 2a  ;.  ShellState *
17b10 70 20 3d 20 28 53 68 65 6c 6c 53 74 61 74 65 20  p = (ShellState 
17b20 2a 29 70 41 72 67 3b 0a 0a 20 20 55 4e 55 53 45  *)pArg;..  UNUSE
17b30 44 5f 50 41 52 41 4d 45 54 45 52 28 61 7a 4e 6f  D_PARAMETER(azNo
17b40 74 55 73 65 64 29 3b 0a 20 20 69 66 28 20 6e 41  tUsed);.  if( nA
17b50 72 67 21 3d 33 20 7c 7c 20 61 7a 41 72 67 3d 3d  rg!=3 || azArg==
17b60 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
17b70 7a 54 61 62 6c 65 20 3d 20 61 7a 41 72 67 5b 30  zTable = azArg[0
17b80 5d 3b 0a 20 20 7a 54 79 70 65 20 3d 20 61 7a 41  ];.  zType = azA
17b90 72 67 5b 31 5d 3b 0a 20 20 7a 53 71 6c 20 3d 20  rg[1];.  zSql = 
17ba0 61 7a 41 72 67 5b 32 5d 3b 0a 0a 20 20 69 66 28  azArg[2];..  if(
17bb0 20 73 74 72 63 6d 70 28 7a 54 61 62 6c 65 2c 20   strcmp(zTable, 
17bc0 22 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65  "sqlite_sequence
17bd0 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 61 77  ")==0 ){.    raw
17be0 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
17bf0 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 73 71 6c  "DELETE FROM sql
17c00 69 74 65 5f 73 65 71 75 65 6e 63 65 3b 5c 6e 22  ite_sequence;\n"
17c10 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73  );.  }else if( s
17c20 71 6c 69 74 65 33 5f 73 74 72 67 6c 6f 62 28 22  qlite3_strglob("
17c30 73 71 6c 69 74 65 5f 73 74 61 74 3f 22 2c 20 7a  sqlite_stat?", z
17c40 54 61 62 6c 65 29 3d 3d 30 20 29 7b 0a 20 20 20  Table)==0 ){.   
17c50 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f   raw_printf(p->o
17c60 75 74 2c 20 22 41 4e 41 4c 59 5a 45 20 73 71 6c  ut, "ANALYZE sql
17c70 69 74 65 5f 6d 61 73 74 65 72 3b 5c 6e 22 29 3b  ite_master;\n");
17c80 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72  .  }else if( str
17c90 6e 63 6d 70 28 7a 54 61 62 6c 65 2c 20 22 73 71  ncmp(zTable, "sq
17ca0 6c 69 74 65 5f 22 2c 20 37 29 3d 3d 30 20 29 7b  lite_", 7)==0 ){
17cb0 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
17cc0 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 6e 63   }else if( strnc
17cd0 6d 70 28 7a 53 71 6c 2c 20 22 43 52 45 41 54 45  mp(zSql, "CREATE
17ce0 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 22 2c   VIRTUAL TABLE",
17cf0 20 32 30 29 3d 3d 30 20 29 7b 0a 20 20 20 20 63   20)==0 ){.    c
17d00 68 61 72 20 2a 7a 49 6e 73 3b 0a 20 20 20 20 69  har *zIns;.    i
17d10 66 28 20 21 70 2d 3e 77 72 69 74 61 62 6c 65 53  f( !p->writableS
17d20 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20 20 72  chema ){.      r
17d30 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  aw_printf(p->out
17d40 2c 20 22 50 52 41 47 4d 41 20 77 72 69 74 61 62  , "PRAGMA writab
17d50 6c 65 5f 73 63 68 65 6d 61 3d 4f 4e 3b 5c 6e 22  le_schema=ON;\n"
17d60 29 3b 0a 20 20 20 20 20 20 70 2d 3e 77 72 69 74  );.      p->writ
17d70 61 62 6c 65 53 63 68 65 6d 61 20 3d 20 31 3b 0a  ableSchema = 1;.
17d80 20 20 20 20 7d 0a 20 20 20 20 7a 49 6e 73 20 3d      }.    zIns =
17d90 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
17da0 28 0a 20 20 20 20 20 20 20 22 49 4e 53 45 52 54  (.       "INSERT
17db0 20 49 4e 54 4f 20 73 71 6c 69 74 65 5f 6d 61 73   INTO sqlite_mas
17dc0 74 65 72 28 74 79 70 65 2c 6e 61 6d 65 2c 74 62  ter(type,name,tb
17dd0 6c 5f 6e 61 6d 65 2c 72 6f 6f 74 70 61 67 65 2c  l_name,rootpage,
17de0 73 71 6c 29 22 0a 20 20 20 20 20 20 20 22 56 41  sql)".       "VA
17df0 4c 55 45 53 28 27 74 61 62 6c 65 27 2c 27 25 71  LUES('table','%q
17e00 27 2c 27 25 71 27 2c 30 2c 27 25 71 27 29 3b 22  ','%q',0,'%q');"
17e10 2c 0a 20 20 20 20 20 20 20 7a 54 61 62 6c 65 2c  ,.       zTable,
17e20 20 7a 54 61 62 6c 65 2c 20 7a 53 71 6c 29 3b 0a   zTable, zSql);.
17e30 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
17e40 70 2d 3e 6f 75 74 2c 20 22 25 73 5c 6e 22 2c 20  p->out, "%s\n", 
17e50 7a 49 6e 73 29 3b 0a 20 20 20 20 73 71 6c 69 74  zIns);.    sqlit
17e60 65 33 5f 66 72 65 65 28 7a 49 6e 73 29 3b 0a 20  e3_free(zIns);. 
17e70 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
17e80 65 6c 73 65 7b 0a 20 20 20 20 70 72 69 6e 74 53  else{.    printS
17e90 63 68 65 6d 61 4c 69 6e 65 28 70 2d 3e 6f 75 74  chemaLine(p->out
17ea0 2c 20 7a 53 71 6c 2c 20 22 3b 5c 6e 22 29 3b 0a  , zSql, ";\n");.
17eb0 20 20 7d 0a 0a 20 20 69 66 28 20 73 74 72 63 6d    }..  if( strcm
17ec0 70 28 7a 54 79 70 65 2c 20 22 74 61 62 6c 65 22  p(zType, "table"
17ed0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 53 68 65 6c  )==0 ){.    Shel
17ee0 6c 54 65 78 74 20 73 53 65 6c 65 63 74 3b 0a 20  lText sSelect;. 
17ef0 20 20 20 53 68 65 6c 6c 54 65 78 74 20 73 54 61     ShellText sTa
17f00 62 6c 65 3b 0a 20 20 20 20 63 68 61 72 20 2a 2a  ble;.    char **
17f10 61 7a 43 6f 6c 3b 0a 20 20 20 20 69 6e 74 20 69  azCol;.    int i
17f20 3b 0a 20 20 20 20 63 68 61 72 20 2a 73 61 76 65  ;.    char *save
17f30 64 44 65 73 74 54 61 62 6c 65 3b 0a 20 20 20 20  dDestTable;.    
17f40 69 6e 74 20 73 61 76 65 64 4d 6f 64 65 3b 0a 0a  int savedMode;..
17f50 20 20 20 20 61 7a 43 6f 6c 20 3d 20 74 61 62 6c      azCol = tabl
17f60 65 43 6f 6c 75 6d 6e 4c 69 73 74 28 70 2c 20 7a  eColumnList(p, z
17f70 54 61 62 6c 65 29 3b 0a 20 20 20 20 69 66 28 20  Table);.    if( 
17f80 61 7a 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20 20  azCol==0 ){.    
17f90 20 20 70 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20    p->nErr++;.   
17fa0 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
17fb0 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 6c 77 61 79   }..    /* Alway
17fc0 73 20 71 75 6f 74 65 20 74 68 65 20 74 61 62 6c  s quote the tabl
17fd0 65 20 6e 61 6d 65 2c 20 65 76 65 6e 20 69 66 20  e name, even if 
17fe0 69 74 20 61 70 70 65 61 72 73 20 74 6f 20 62 65  it appears to be
17ff0 20 70 75 72 65 20 61 73 63 69 69 2c 0a 20 20 20   pure ascii,.   
18000 20 2a 2a 20 69 6e 20 63 61 73 65 20 69 74 20 69   ** in case it i
18010 73 20 61 20 6b 65 79 77 6f 72 64 2e 20 45 78 3a  s a keyword. Ex:
18020 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 22 74    INSERT INTO "t
18030 61 62 6c 65 22 20 2e 2e 2e 20 2a 2f 0a 20 20 20  able" ... */.   
18040 20 69 6e 69 74 54 65 78 74 28 26 73 54 61 62 6c   initText(&sTabl
18050 65 29 3b 0a 20 20 20 20 61 70 70 65 6e 64 54 65  e);.    appendTe
18060 78 74 28 26 73 54 61 62 6c 65 2c 20 7a 54 61 62  xt(&sTable, zTab
18070 6c 65 2c 20 71 75 6f 74 65 43 68 61 72 28 7a 54  le, quoteChar(zT
18080 61 62 6c 65 29 29 3b 0a 20 20 20 20 2f 2a 20 49  able));.    /* I
18090 66 20 70 72 65 73 65 72 76 69 6e 67 20 74 68 65  f preserving the
180a0 20 72 6f 77 69 64 2c 20 61 64 64 20 61 20 63 6f   rowid, add a co
180b0 6c 75 6d 6e 20 6c 69 73 74 20 61 66 74 65 72 20  lumn list after 
180c0 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 2e 0a  the table name..
180d0 20 20 20 20 2a 2a 20 49 6e 20 6f 74 68 65 72 20      ** In other 
180e0 77 6f 72 64 73 3a 20 20 22 49 4e 53 45 52 54 20  words:  "INSERT 
180f0 49 4e 54 4f 20 74 61 62 28 72 6f 77 69 64 2c 61  INTO tab(rowid,a
18100 2c 62 2c 63 2c 2e 2e 2e 29 20 56 41 4c 55 45 53  ,b,c,...) VALUES
18110 28 2e 2e 2e 29 22 0a 20 20 20 20 2a 2a 20 69 6e  (...)".    ** in
18120 73 74 65 61 64 20 6f 66 20 74 68 65 20 75 73 75  stead of the usu
18130 61 6c 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20  al "INSERT INTO 
18140 74 61 62 20 56 41 4c 55 45 53 28 2e 2e 2e 29 22  tab VALUES(...)"
18150 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
18160 20 61 7a 43 6f 6c 5b 30 5d 20 29 7b 0a 20 20 20   azCol[0] ){.   
18170 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73     appendText(&s
18180 54 61 62 6c 65 2c 20 22 28 22 2c 20 30 29 3b 0a  Table, "(", 0);.
18190 20 20 20 20 20 20 61 70 70 65 6e 64 54 65 78 74        appendText
181a0 28 26 73 54 61 62 6c 65 2c 20 61 7a 43 6f 6c 5b  (&sTable, azCol[
181b0 30 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 66 6f  0], 0);.      fo
181c0 72 28 69 3d 31 3b 20 61 7a 43 6f 6c 5b 69 5d 3b  r(i=1; azCol[i];
181d0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 61   i++){.        a
181e0 70 70 65 6e 64 54 65 78 74 28 26 73 54 61 62 6c  ppendText(&sTabl
181f0 65 2c 20 22 2c 22 2c 20 30 29 3b 0a 20 20 20 20  e, ",", 0);.    
18200 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26      appendText(&
18210 73 54 61 62 6c 65 2c 20 61 7a 43 6f 6c 5b 69 5d  sTable, azCol[i]
18220 2c 20 71 75 6f 74 65 43 68 61 72 28 61 7a 43 6f  , quoteChar(azCo
18230 6c 5b 69 5d 29 29 3b 0a 20 20 20 20 20 20 7d 0a  l[i]));.      }.
18240 20 20 20 20 20 20 61 70 70 65 6e 64 54 65 78 74        appendText
18250 28 26 73 54 61 62 6c 65 2c 20 22 29 22 2c 20 30  (&sTable, ")", 0
18260 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
18270 20 42 75 69 6c 64 20 61 6e 20 61 70 70 72 6f 70   Build an approp
18280 72 69 61 74 65 20 53 45 4c 45 43 54 20 73 74 61  riate SELECT sta
18290 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 69 6e  tement */.    in
182a0 69 74 54 65 78 74 28 26 73 53 65 6c 65 63 74 29  itText(&sSelect)
182b0 3b 0a 20 20 20 20 61 70 70 65 6e 64 54 65 78 74  ;.    appendText
182c0 28 26 73 53 65 6c 65 63 74 2c 20 22 53 45 4c 45  (&sSelect, "SELE
182d0 43 54 20 22 2c 20 30 29 3b 0a 20 20 20 20 69 66  CT ", 0);.    if
182e0 28 20 61 7a 43 6f 6c 5b 30 5d 20 29 7b 0a 20 20  ( azCol[0] ){.  
182f0 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26      appendText(&
18300 73 53 65 6c 65 63 74 2c 20 61 7a 43 6f 6c 5b 30  sSelect, azCol[0
18310 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 61 70 70  ], 0);.      app
18320 65 6e 64 54 65 78 74 28 26 73 53 65 6c 65 63 74  endText(&sSelect
18330 2c 20 22 2c 22 2c 20 30 29 3b 0a 20 20 20 20 7d  , ",", 0);.    }
18340 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 61 7a  .    for(i=1; az
18350 43 6f 6c 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20  Col[i]; i++){.  
18360 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26      appendText(&
18370 73 53 65 6c 65 63 74 2c 20 61 7a 43 6f 6c 5b 69  sSelect, azCol[i
18380 5d 2c 20 71 75 6f 74 65 43 68 61 72 28 61 7a 43  ], quoteChar(azC
18390 6f 6c 5b 69 5d 29 29 3b 0a 20 20 20 20 20 20 69  ol[i]));.      i
183a0 66 28 20 61 7a 43 6f 6c 5b 69 2b 31 5d 20 29 7b  f( azCol[i+1] ){
183b0 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 54  .        appendT
183c0 65 78 74 28 26 73 53 65 6c 65 63 74 2c 20 22 2c  ext(&sSelect, ",
183d0 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ", 0);.      }. 
183e0 20 20 20 7d 0a 20 20 20 20 66 72 65 65 43 6f 6c     }.    freeCol
183f0 75 6d 6e 4c 69 73 74 28 61 7a 43 6f 6c 29 3b 0a  umnList(azCol);.
18400 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26      appendText(&
18410 73 53 65 6c 65 63 74 2c 20 22 20 46 52 4f 4d 20  sSelect, " FROM 
18420 22 2c 20 30 29 3b 0a 20 20 20 20 61 70 70 65 6e  ", 0);.    appen
18430 64 54 65 78 74 28 26 73 53 65 6c 65 63 74 2c 20  dText(&sSelect, 
18440 7a 54 61 62 6c 65 2c 20 71 75 6f 74 65 43 68 61  zTable, quoteCha
18450 72 28 7a 54 61 62 6c 65 29 29 3b 0a 0a 20 20 20  r(zTable));..   
18460 20 73 61 76 65 64 44 65 73 74 54 61 62 6c 65 20   savedDestTable 
18470 3d 20 70 2d 3e 7a 44 65 73 74 54 61 62 6c 65 3b  = p->zDestTable;
18480 0a 20 20 20 20 73 61 76 65 64 4d 6f 64 65 20 3d  .    savedMode =
18490 20 70 2d 3e 6d 6f 64 65 3b 0a 20 20 20 20 70 2d   p->mode;.    p-
184a0 3e 7a 44 65 73 74 54 61 62 6c 65 20 3d 20 73 54  >zDestTable = sT
184b0 61 62 6c 65 2e 7a 3b 0a 20 20 20 20 70 2d 3e 6d  able.z;.    p->m
184c0 6f 64 65 20 3d 20 70 2d 3e 63 4d 6f 64 65 20 3d  ode = p->cMode =
184d0 20 4d 4f 44 45 5f 49 6e 73 65 72 74 3b 0a 20 20   MODE_Insert;.  
184e0 20 20 72 63 20 3d 20 73 68 65 6c 6c 5f 65 78 65    rc = shell_exe
184f0 63 28 70 2c 20 73 53 65 6c 65 63 74 2e 7a 2c 20  c(p, sSelect.z, 
18500 30 29 3b 0a 20 20 20 20 69 66 28 20 28 72 63 26  0);.    if( (rc&
18510 30 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f 43 4f  0xff)==SQLITE_CO
18520 52 52 55 50 54 20 29 7b 0a 20 20 20 20 20 20 72  RRUPT ){.      r
18530 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  aw_printf(p->out
18540 2c 20 22 2f 2a 2a 2a 2a 2a 2a 20 43 4f 52 52 55  , "/****** CORRU
18550 50 54 49 4f 4e 20 45 52 52 4f 52 20 2a 2a 2a 2a  PTION ERROR ****
18560 2a 2a 2a 2f 5c 6e 22 29 3b 0a 20 20 20 20 20 20  ***/\n");.      
18570 74 6f 67 67 6c 65 53 65 6c 65 63 74 4f 72 64 65  toggleSelectOrde
18580 72 28 70 2d 3e 64 62 29 3b 0a 20 20 20 20 20 20  r(p->db);.      
18590 73 68 65 6c 6c 5f 65 78 65 63 28 70 2c 20 73 53  shell_exec(p, sS
185a0 65 6c 65 63 74 2e 7a 2c 20 30 29 3b 0a 20 20 20  elect.z, 0);.   
185b0 20 20 20 74 6f 67 67 6c 65 53 65 6c 65 63 74 4f     toggleSelectO
185c0 72 64 65 72 28 70 2d 3e 64 62 29 3b 0a 20 20 20  rder(p->db);.   
185d0 20 7d 0a 20 20 20 20 70 2d 3e 7a 44 65 73 74 54   }.    p->zDestT
185e0 61 62 6c 65 20 3d 20 73 61 76 65 64 44 65 73 74  able = savedDest
185f0 54 61 62 6c 65 3b 0a 20 20 20 20 70 2d 3e 6d 6f  Table;.    p->mo
18600 64 65 20 3d 20 73 61 76 65 64 4d 6f 64 65 3b 0a  de = savedMode;.
18610 20 20 20 20 66 72 65 65 54 65 78 74 28 26 73 54      freeText(&sT
18620 61 62 6c 65 29 3b 0a 20 20 20 20 66 72 65 65 54  able);.    freeT
18630 65 78 74 28 26 73 53 65 6c 65 63 74 29 3b 0a 20  ext(&sSelect);. 
18640 20 20 20 69 66 28 20 72 63 20 29 20 70 2d 3e 6e     if( rc ) p->n
18650 45 72 72 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74  Err++;.  }.  ret
18660 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
18670 52 75 6e 20 7a 51 75 65 72 79 2e 20 20 55 73 65  Run zQuery.  Use
18680 20 64 75 6d 70 5f 63 61 6c 6c 62 61 63 6b 28 29   dump_callback()
18690 20 61 73 20 74 68 65 20 63 61 6c 6c 62 61 63 6b   as the callback
186a0 20 72 6f 75 74 69 6e 65 20 73 6f 20 74 68 61 74   routine so that
186b0 0a 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  .** the contents
186c0 20 6f 66 20 74 68 65 20 71 75 65 72 79 20 61 72   of the query ar
186d0 65 20 6f 75 74 70 75 74 20 61 73 20 53 51 4c 20  e output as SQL 
186e0 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2a 0a 2a  statements..**.*
186f0 2a 20 49 66 20 77 65 20 67 65 74 20 61 20 53 51  * If we get a SQ
18700 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 65 72 72  LITE_CORRUPT err
18710 6f 72 2c 20 72 65 72 75 6e 20 74 68 65 20 71 75  or, rerun the qu
18720 65 72 79 20 61 66 74 65 72 20 61 70 70 65 6e 64  ery after append
18730 69 6e 67 0a 2a 2a 20 22 4f 52 44 45 52 20 42 59  ing.** "ORDER BY
18740 20 72 6f 77 69 64 20 44 45 53 43 22 20 74 6f 20   rowid DESC" to 
18750 74 68 65 20 65 6e 64 2e 0a 2a 2f 0a 73 74 61 74  the end..*/.stat
18760 69 63 20 69 6e 74 20 72 75 6e 5f 73 63 68 65 6d  ic int run_schem
18770 61 5f 64 75 6d 70 5f 71 75 65 72 79 28 0a 20 20  a_dump_query(.  
18780 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 2c 0a 20  ShellState *p,. 
18790 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 51 75   const char *zQu
187a0 65 72 79 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ery.){.  int rc;
187b0 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 20 3d 20  .  char *zErr = 
187c0 30 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  0;.  rc = sqlite
187d0 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20 7a 51  3_exec(p->db, zQ
187e0 75 65 72 79 2c 20 64 75 6d 70 5f 63 61 6c 6c 62  uery, dump_callb
187f0 61 63 6b 2c 20 70 2c 20 26 7a 45 72 72 29 3b 0a  ack, p, &zErr);.
18800 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
18810 5f 43 4f 52 52 55 50 54 20 29 7b 0a 20 20 20 20  _CORRUPT ){.    
18820 63 68 61 72 20 2a 7a 51 32 3b 0a 20 20 20 20 69  char *zQ2;.    i
18830 6e 74 20 6c 65 6e 20 3d 20 73 74 72 6c 65 6e 33  nt len = strlen3
18840 30 28 7a 51 75 65 72 79 29 3b 0a 20 20 20 20 72  0(zQuery);.    r
18850 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  aw_printf(p->out
18860 2c 20 22 2f 2a 2a 2a 2a 2a 2a 20 43 4f 52 52 55  , "/****** CORRU
18870 50 54 49 4f 4e 20 45 52 52 4f 52 20 2a 2a 2a 2a  PTION ERROR ****
18880 2a 2a 2a 2f 5c 6e 22 29 3b 0a 20 20 20 20 69 66  ***/\n");.    if
18890 28 20 7a 45 72 72 20 29 7b 0a 20 20 20 20 20 20  ( zErr ){.      
188a0 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f  utf8_printf(p->o
188b0 75 74 2c 20 22 2f 2a 2a 2a 2a 2a 2a 20 25 73 20  ut, "/****** %s 
188c0 2a 2a 2a 2a 2a 2a 2f 5c 6e 22 2c 20 7a 45 72 72  ******/\n", zErr
188d0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
188e0 5f 66 72 65 65 28 7a 45 72 72 29 3b 0a 20 20 20  _free(zErr);.   
188f0 20 20 20 7a 45 72 72 20 3d 20 30 3b 0a 20 20 20     zErr = 0;.   
18900 20 7d 0a 20 20 20 20 7a 51 32 20 3d 20 6d 61 6c   }.    zQ2 = mal
18910 6c 6f 63 28 20 6c 65 6e 2b 31 30 30 20 29 3b 0a  loc( len+100 );.
18920 20 20 20 20 69 66 28 20 7a 51 32 3d 3d 30 20 29      if( zQ2==0 )
18930 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
18940 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
18950 28 6c 65 6e 2b 31 30 30 2c 20 7a 51 32 2c 20 22  (len+100, zQ2, "
18960 25 73 20 4f 52 44 45 52 20 42 59 20 72 6f 77 69  %s ORDER BY rowi
18970 64 20 44 45 53 43 22 2c 20 7a 51 75 65 72 79 29  d DESC", zQuery)
18980 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
18990 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20 7a  e3_exec(p->db, z
189a0 51 32 2c 20 64 75 6d 70 5f 63 61 6c 6c 62 61 63  Q2, dump_callbac
189b0 6b 2c 20 70 2c 20 26 7a 45 72 72 29 3b 0a 20 20  k, p, &zErr);.  
189c0 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
189d0 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d    utf8_printf(p-
189e0 3e 6f 75 74 2c 20 22 2f 2a 2a 2a 2a 2a 2a 20 45  >out, "/****** E
189f0 52 52 4f 52 3a 20 25 73 20 2a 2a 2a 2a 2a 2a 2f  RROR: %s ******/
18a00 5c 6e 22 2c 20 7a 45 72 72 29 3b 0a 20 20 20 20  \n", zErr);.    
18a10 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
18a20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
18a30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
18a40 74 65 33 5f 66 72 65 65 28 7a 45 72 72 29 3b 0a  te3_free(zErr);.
18a50 20 20 20 20 66 72 65 65 28 7a 51 32 29 3b 0a 20      free(zQ2);. 
18a60 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
18a70 7d 0a 0a 2f 2a 0a 2a 2a 20 54 65 78 74 20 6f 66  }../*.** Text of
18a80 20 61 20 68 65 6c 70 20 6d 65 73 73 61 67 65 0a   a help message.
18a90 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 7a  */.static char z
18aa0 48 65 6c 70 5b 5d 20 3d 0a 23 69 66 20 64 65 66  Help[] =.#if def
18ab0 69 6e 65 64 28 53 51 4c 49 54 45 5f 48 41 56 45  ined(SQLITE_HAVE
18ac0 5f 5a 4c 49 42 29 20 26 26 20 21 64 65 66 69 6e  _ZLIB) && !defin
18ad0 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
18ae0 49 52 54 55 41 4c 54 41 42 4c 45 29 0a 20 20 22  IRTUALTABLE).  "
18af0 2e 61 72 63 68 69 76 65 20 2e 2e 2e 20 20 20 20  .archive ...    
18b00 20 20 20 20 20 20 20 4d 61 6e 61 67 65 20 53 51         Manage SQ
18b10 4c 20 61 72 63 68 69 76 65 73 3a 20 5c 22 2e 61  L archives: \".a
18b20 72 63 68 69 76 65 20 2d 2d 68 65 6c 70 5c 22 20  rchive --help\" 
18b30 66 6f 72 20 64 65 74 61 69 6c 73 5c 6e 22 0a 23  for details\n".#
18b40 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 53 51  endif.#ifndef SQ
18b50 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52  LITE_OMIT_AUTHOR
18b60 49 5a 41 54 49 4f 4e 0a 20 20 22 2e 61 75 74 68  IZATION.  ".auth
18b70 20 4f 4e 7c 4f 46 46 20 20 20 20 20 20 20 20 20   ON|OFF         
18b80 20 20 53 68 6f 77 20 61 75 74 68 6f 72 69 7a 65    Show authorize
18b90 72 20 63 61 6c 6c 62 61 63 6b 73 5c 6e 22 0a 23  r callbacks\n".#
18ba0 65 6e 64 69 66 0a 20 20 22 2e 62 61 63 6b 75 70  endif.  ".backup
18bb0 20 3f 44 42 3f 20 46 49 4c 45 20 20 20 20 20 20   ?DB? FILE      
18bc0 42 61 63 6b 75 70 20 44 42 20 28 64 65 66 61 75  Backup DB (defau
18bd0 6c 74 20 5c 22 6d 61 69 6e 5c 22 29 20 74 6f 20  lt \"main\") to 
18be0 46 49 4c 45 5c 6e 22 0a 20 20 22 20 20 20 20 20  FILE\n".  "     
18bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18c00 20 20 20 20 41 64 64 20 5c 22 2d 2d 61 70 70 65      Add \"--appe
18c10 6e 64 5c 22 20 74 6f 20 6f 70 65 6e 20 75 73 69  nd\" to open usi
18c20 6e 67 20 61 70 70 65 6e 64 76 66 73 2e 5c 6e 22  ng appendvfs.\n"
18c30 0a 20 20 22 2e 62 61 69 6c 20 6f 6e 7c 6f 66 66  .  ".bail on|off
18c40 20 20 20 20 20 20 20 20 20 20 20 53 74 6f 70 20             Stop 
18c50 61 66 74 65 72 20 68 69 74 74 69 6e 67 20 61 6e  after hitting an
18c60 20 65 72 72 6f 72 2e 20 20 44 65 66 61 75 6c 74   error.  Default
18c70 20 4f 46 46 5c 6e 22 0a 20 20 22 2e 62 69 6e 61   OFF\n".  ".bina
18c80 72 79 20 6f 6e 7c 6f 66 66 20 20 20 20 20 20 20  ry on|off       
18c90 20 20 54 75 72 6e 20 62 69 6e 61 72 79 20 6f 75    Turn binary ou
18ca0 74 70 75 74 20 6f 6e 20 6f 72 20 6f 66 66 2e 20  tput on or off. 
18cb0 20 44 65 66 61 75 6c 74 20 4f 46 46 5c 6e 22 0a   Default OFF\n".
18cc0 20 20 22 2e 63 64 20 44 49 52 45 43 54 4f 52 59    ".cd DIRECTORY
18cd0 20 20 20 20 20 20 20 20 20 20 43 68 61 6e 67 65            Change
18ce0 20 74 68 65 20 77 6f 72 6b 69 6e 67 20 64 69 72   the working dir
18cf0 65 63 74 6f 72 79 20 74 6f 20 44 49 52 45 43 54  ectory to DIRECT
18d00 4f 52 59 5c 6e 22 0a 20 20 22 2e 63 68 61 6e 67  ORY\n".  ".chang
18d10 65 73 20 6f 6e 7c 6f 66 66 20 20 20 20 20 20 20  es on|off       
18d20 20 53 68 6f 77 20 6e 75 6d 62 65 72 20 6f 66 20   Show number of 
18d30 72 6f 77 73 20 63 68 61 6e 67 65 64 20 62 79 20  rows changed by 
18d40 53 51 4c 5c 6e 22 0a 20 20 22 2e 63 68 65 63 6b  SQL\n".  ".check
18d50 20 47 4c 4f 42 20 20 20 20 20 20 20 20 20 20 20   GLOB           
18d60 20 46 61 69 6c 20 69 66 20 6f 75 74 70 75 74 20   Fail if output 
18d70 73 69 6e 63 65 20 2e 74 65 73 74 63 61 73 65 20  since .testcase 
18d80 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 5c 6e  does not match\n
18d90 22 0a 20 20 22 2e 63 6c 6f 6e 65 20 4e 45 57 44  ".  ".clone NEWD
18da0 42 20 20 20 20 20 20 20 20 20 20 20 43 6c 6f 6e  B           Clon
18db0 65 20 64 61 74 61 20 69 6e 74 6f 20 4e 45 57 44  e data into NEWD
18dc0 42 20 66 72 6f 6d 20 74 68 65 20 65 78 69 73 74  B from the exist
18dd0 69 6e 67 20 64 61 74 61 62 61 73 65 5c 6e 22 0a  ing database\n".
18de0 20 20 22 2e 64 61 74 61 62 61 73 65 73 20 20 20    ".databases   
18df0 20 20 20 20 20 20 20 20 20 20 4c 69 73 74 20 6e            List n
18e00 61 6d 65 73 20 61 6e 64 20 66 69 6c 65 73 20 6f  ames and files o
18e10 66 20 61 74 74 61 63 68 65 64 20 64 61 74 61 62  f attached datab
18e20 61 73 65 73 5c 6e 22 0a 20 20 22 2e 64 62 63 6f  ases\n".  ".dbco
18e30 6e 66 69 67 20 3f 6f 70 3f 20 3f 76 61 6c 3f 20  nfig ?op? ?val? 
18e40 20 20 4c 69 73 74 20 6f 72 20 63 68 61 6e 67 65    List or change
18e50 20 73 71 6c 69 74 65 33 5f 64 62 5f 63 6f 6e 66   sqlite3_db_conf
18e60 69 67 28 29 20 6f 70 74 69 6f 6e 73 5c 6e 22 0a  ig() options\n".
18e70 20 20 22 2e 64 62 69 6e 66 6f 20 3f 44 42 3f 20    ".dbinfo ?DB? 
18e80 20 20 20 20 20 20 20 20 20 20 53 68 6f 77 20 73            Show s
18e90 74 61 74 75 73 20 69 6e 66 6f 72 6d 61 74 69 6f  tatus informatio
18ea0 6e 20 61 62 6f 75 74 20 74 68 65 20 64 61 74 61  n about the data
18eb0 62 61 73 65 5c 6e 22 0a 20 20 22 2e 64 75 6d 70  base\n".  ".dump
18ec0 20 3f 54 41 42 4c 45 3f 20 2e 2e 2e 20 20 20 20   ?TABLE? ...    
18ed0 20 20 44 75 6d 70 20 74 68 65 20 64 61 74 61 62    Dump the datab
18ee0 61 73 65 20 69 6e 20 61 6e 20 53 51 4c 20 74 65  ase in an SQL te
18ef0 78 74 20 66 6f 72 6d 61 74 5c 6e 22 0a 20 20 22  xt format\n".  "
18f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18f10 20 20 20 20 20 20 20 20 20 49 66 20 54 41 42 4c           If TABL
18f20 45 20 73 70 65 63 69 66 69 65 64 2c 20 6f 6e 6c  E specified, onl
18f30 79 20 64 75 6d 70 20 74 61 62 6c 65 73 20 6d 61  y dump tables ma
18f40 74 63 68 69 6e 67 5c 6e 22 0a 20 20 22 20 20 20  tching\n".  "   
18f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18f60 20 20 20 20 20 20 4c 49 4b 45 20 70 61 74 74 65        LIKE patte
18f70 72 6e 20 54 41 42 4c 45 2e 5c 6e 22 0a 20 20 22  rn TABLE.\n".  "
18f80 2e 65 63 68 6f 20 6f 6e 7c 6f 66 66 20 20 20 20  .echo on|off    
18f90 20 20 20 20 20 20 20 54 75 72 6e 20 63 6f 6d 6d         Turn comm
18fa0 61 6e 64 20 65 63 68 6f 20 6f 6e 20 6f 72 20 6f  and echo on or o
18fb0 66 66 5c 6e 22 0a 20 20 22 2e 65 71 70 20 6f 6e  ff\n".  ".eqp on
18fc0 7c 6f 66 66 7c 66 75 6c 6c 20 20 20 20 20 20 20  |off|full       
18fd0 45 6e 61 62 6c 65 20 6f 72 20 64 69 73 61 62 6c  Enable or disabl
18fe0 65 20 61 75 74 6f 6d 61 74 69 63 20 45 58 50 4c  e automatic EXPL
18ff0 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 5c 6e  AIN QUERY PLAN\n
19000 22 0a 20 20 22 2e 65 78 63 65 6c 20 20 20 20 20  ".  ".excel     
19010 20 20 20 20 20 20 20 20 20 20 20 20 44 69 73 70              Disp
19020 6c 61 79 20 74 68 65 20 6f 75 74 70 75 74 20 6f  lay the output o
19030 66 20 6e 65 78 74 20 63 6f 6d 6d 61 6e 64 20 69  f next command i
19040 6e 20 61 20 73 70 72 65 61 64 73 68 65 65 74 5c  n a spreadsheet\
19050 6e 22 0a 20 20 22 2e 65 78 69 74 20 20 20 20 20  n".  ".exit     
19060 20 20 20 20 20 20 20 20 20 20 20 20 20 45 78 69               Exi
19070 74 20 74 68 69 73 20 70 72 6f 67 72 61 6d 5c 6e  t this program\n
19080 22 0a 20 20 22 2e 65 78 70 65 72 74 20 20 20 20  ".  ".expert    
19090 20 20 20 20 20 20 20 20 20 20 20 20 45 58 50 45              EXPE
190a0 52 49 4d 45 4e 54 41 4c 2e 20 53 75 67 67 65 73  RIMENTAL. Sugges
190b0 74 20 69 6e 64 65 78 65 73 20 66 6f 72 20 73 70  t indexes for sp
190c0 65 63 69 66 69 65 64 20 71 75 65 72 69 65 73 5c  ecified queries\
190d0 6e 22 0a 2f 2a 20 42 65 63 61 75 73 65 20 65 78  n"./* Because ex
190e0 70 6c 61 69 6e 20 6d 6f 64 65 20 63 6f 6d 65 73  plain mode comes
190f0 20 6f 6e 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c   on automaticall
19100 79 20 6e 6f 77 2c 20 74 68 65 20 22 2e 65 78 70  y now, the ".exp
19110 6c 61 69 6e 22 20 6d 6f 64 65 0a 2a 2a 20 69 73  lain" mode.** is
19120 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68   removed from th
19130 65 20 68 65 6c 70 20 73 63 72 65 65 6e 2e 20 20  e help screen.  
19140 49 74 20 69 73 20 73 74 69 6c 6c 20 73 75 70 70  It is still supp
19150 6f 72 74 65 64 20 66 6f 72 20 6c 65 67 61 63 79  orted for legacy
19160 2c 20 68 6f 77 65 76 65 72 20 2a 2f 0a 2f 2a 22  , however */./*"
19170 2e 65 78 70 6c 61 69 6e 20 3f 6f 6e 7c 6f 66 66  .explain ?on|off
19180 7c 61 75 74 6f 3f 20 54 75 72 6e 20 45 58 50 4c  |auto? Turn EXPL
19190 41 49 4e 20 6f 75 74 70 75 74 20 6d 6f 64 65 20  AIN output mode 
191a0 6f 6e 20 6f 72 20 6f 66 66 20 6f 72 20 74 6f 20  on or off or to 
191b0 61 75 74 6f 6d 61 74 69 63 5c 6e 22 2a 2f 0a 20  automatic\n"*/. 
191c0 20 22 2e 66 75 6c 6c 73 63 68 65 6d 61 20 3f 2d   ".fullschema ?-
191d0 2d 69 6e 64 65 6e 74 3f 20 53 68 6f 77 20 73 63  -indent? Show sc
191e0 68 65 6d 61 20 61 6e 64 20 74 68 65 20 63 6f 6e  hema and the con
191f0 74 65 6e 74 20 6f 66 20 73 71 6c 69 74 65 5f 73  tent of sqlite_s
19200 74 61 74 20 74 61 62 6c 65 73 5c 6e 22 0a 20 20  tat tables\n".  
19210 22 2e 68 65 61 64 65 72 73 20 6f 6e 7c 6f 66 66  ".headers on|off
19220 20 20 20 20 20 20 20 20 54 75 72 6e 20 64 69 73          Turn dis
19230 70 6c 61 79 20 6f 66 20 68 65 61 64 65 72 73 20  play of headers 
19240 6f 6e 20 6f 72 20 6f 66 66 5c 6e 22 0a 20 20 22  on or off\n".  "
19250 2e 68 65 6c 70 20 20 20 20 20 20 20 20 20 20 20  .help           
19260 20 20 20 20 20 20 20 53 68 6f 77 20 74 68 69 73         Show this
19270 20 6d 65 73 73 61 67 65 5c 6e 22 0a 20 20 22 2e   message\n".  ".
19280 69 6d 70 6f 72 74 20 46 49 4c 45 20 54 41 42 4c  import FILE TABL
19290 45 20 20 20 20 20 49 6d 70 6f 72 74 20 64 61 74  E     Import dat
192a0 61 20 66 72 6f 6d 20 46 49 4c 45 20 69 6e 74 6f  a from FILE into
192b0 20 54 41 42 4c 45 5c 6e 22 0a 23 69 66 6e 64 65   TABLE\n".#ifnde
192c0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 45  f SQLITE_OMIT_TE
192d0 53 54 5f 43 4f 4e 54 52 4f 4c 0a 20 20 22 2e 69  ST_CONTROL.  ".i
192e0 6d 70 6f 73 74 65 72 20 49 4e 44 45 58 20 54 41  mposter INDEX TA
192f0 42 4c 45 20 20 43 72 65 61 74 65 20 69 6d 70 6f  BLE  Create impo
19300 73 74 65 72 20 74 61 62 6c 65 20 54 41 42 4c 45  ster table TABLE
19310 20 6f 6e 20 69 6e 64 65 78 20 49 4e 44 45 58 5c   on index INDEX\
19320 6e 22 0a 23 65 6e 64 69 66 0a 20 20 22 2e 69 6e  n".#endif.  ".in
19330 64 65 78 65 73 20 3f 54 41 42 4c 45 3f 20 20 20  dexes ?TABLE?   
19340 20 20 20 20 53 68 6f 77 20 6e 61 6d 65 73 20 6f      Show names o
19350 66 20 61 6c 6c 20 69 6e 64 65 78 65 73 5c 6e 22  f all indexes\n"
19360 0a 20 20 22 20 20 20 20 20 20 20 20 20 20 20 20  .  "            
19370 20 20 20 20 20 20 20 20 20 20 20 20 20 49 66 20               If 
19380 54 41 42 4c 45 20 73 70 65 63 69 66 69 65 64 2c  TABLE specified,
19390 20 6f 6e 6c 79 20 73 68 6f 77 20 69 6e 64 65 78   only show index
193a0 65 73 20 66 6f 72 20 74 61 62 6c 65 73 5c 6e 22  es for tables\n"
193b0 0a 20 20 22 20 20 20 20 20 20 20 20 20 20 20 20  .  "            
193c0 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 61 74               mat
193d0 63 68 69 6e 67 20 4c 49 4b 45 20 70 61 74 74 65  ching LIKE patte
193e0 72 6e 20 54 41 42 4c 45 2e 5c 6e 22 0a 23 69 66  rn TABLE.\n".#if
193f0 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
19400 45 5f 49 4f 54 52 41 43 45 0a 20 20 22 2e 69 6f  E_IOTRACE.  ".io
19410 74 72 61 63 65 20 46 49 4c 45 20 20 20 20 20 20  trace FILE      
19420 20 20 20 20 45 6e 61 62 6c 65 20 49 2f 4f 20 64      Enable I/O d
19430 69 61 67 6e 6f 73 74 69 63 20 6c 6f 67 67 69 6e  iagnostic loggin
19440 67 20 74 6f 20 46 49 4c 45 5c 6e 22 0a 23 65 6e  g to FILE\n".#en
19450 64 69 66 0a 20 20 22 2e 6c 69 6d 69 74 20 3f 4c  dif.  ".limit ?L
19460 49 4d 49 54 3f 20 3f 56 41 4c 3f 20 20 20 44 69  IMIT? ?VAL?   Di
19470 73 70 6c 61 79 20 6f 72 20 63 68 61 6e 67 65 20  splay or change 
19480 74 68 65 20 76 61 6c 75 65 20 6f 66 20 61 6e 20  the value of an 
19490 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5c 6e 22 0a  SQLITE_LIMIT\n".
194a0 20 20 22 2e 6c 69 6e 74 20 4f 50 54 49 4f 4e 53    ".lint OPTIONS
194b0 20 20 20 20 20 20 20 20 20 20 52 65 70 6f 72 74            Report
194c0 20 70 6f 74 65 6e 74 69 61 6c 20 73 63 68 65 6d   potential schem
194d0 61 20 69 73 73 75 65 73 2e 20 4f 70 74 69 6f 6e  a issues. Option
194e0 73 3a 5c 6e 22 0a 20 20 22 20 20 20 20 20 20 20  s:\n".  "       
194f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19500 20 20 66 6b 65 79 2d 69 6e 64 65 78 65 73 20 20    fkey-indexes  
19510 20 20 20 46 69 6e 64 20 6d 69 73 73 69 6e 67 20     Find missing 
19520 66 6f 72 65 69 67 6e 20 6b 65 79 20 69 6e 64 65  foreign key inde
19530 78 65 73 5c 6e 22 0a 23 69 66 6e 64 65 66 20 53  xes\n".#ifndef S
19540 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f  QLITE_OMIT_LOAD_
19550 45 58 54 45 4e 53 49 4f 4e 0a 20 20 22 2e 6c 6f  EXTENSION.  ".lo
19560 61 64 20 46 49 4c 45 20 3f 45 4e 54 52 59 3f 20  ad FILE ?ENTRY? 
19570 20 20 20 20 4c 6f 61 64 20 61 6e 20 65 78 74 65      Load an exte
19580 6e 73 69 6f 6e 20 6c 69 62 72 61 72 79 5c 6e 22  nsion library\n"
19590 0a 23 65 6e 64 69 66 0a 20 20 22 2e 6c 6f 67 20  .#endif.  ".log 
195a0 46 49 4c 45 7c 6f 66 66 20 20 20 20 20 20 20 20  FILE|off        
195b0 20 20 54 75 72 6e 20 6c 6f 67 67 69 6e 67 20 6f    Turn logging o
195c0 6e 20 6f 72 20 6f 66 66 2e 20 20 46 49 4c 45 20  n or off.  FILE 
195d0 63 61 6e 20 62 65 20 73 74 64 65 72 72 2f 73 74  can be stderr/st
195e0 64 6f 75 74 5c 6e 22 0a 20 20 22 2e 6d 6f 64 65  dout\n".  ".mode
195f0 20 4d 4f 44 45 20 3f 54 41 42 4c 45 3f 20 20 20   MODE ?TABLE?   
19600 20 20 53 65 74 20 6f 75 74 70 75 74 20 6d 6f 64    Set output mod
19610 65 20 77 68 65 72 65 20 4d 4f 44 45 20 69 73 20  e where MODE is 
19620 6f 6e 65 20 6f 66 3a 5c 6e 22 0a 20 20 22 20 20  one of:\n".  "  
19630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19640 20 20 20 20 20 20 20 61 73 63 69 69 20 20 20 20         ascii    
19650 43 6f 6c 75 6d 6e 73 2f 72 6f 77 73 20 64 65 6c  Columns/rows del
19660 69 6d 69 74 65 64 20 62 79 20 30 78 31 46 20 61  imited by 0x1F a
19670 6e 64 20 30 78 31 45 5c 6e 22 0a 20 20 22 20 20  nd 0x1E\n".  "  
19680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19690 20 20 20 20 20 20 20 63 73 76 20 20 20 20 20 20         csv      
196a0 43 6f 6d 6d 61 2d 73 65 70 61 72 61 74 65 64 20  Comma-separated 
196b0 76 61 6c 75 65 73 5c 6e 22 0a 20 20 22 20 20 20  values\n".  "   
196c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
196d0 20 20 20 20 20 20 63 6f 6c 75 6d 6e 20 20 20 4c        column   L
196e0 65 66 74 2d 61 6c 69 67 6e 65 64 20 63 6f 6c 75  eft-aligned colu
196f0 6d 6e 73 2e 20 20 28 53 65 65 20 2e 77 69 64 74  mns.  (See .widt
19700 68 29 5c 6e 22 0a 20 20 22 20 20 20 20 20 20 20  h)\n".  "       
19710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19720 20 20 68 74 6d 6c 20 20 20 20 20 48 54 4d 4c 20    html     HTML 
19730 3c 74 61 62 6c 65 3e 20 63 6f 64 65 5c 6e 22 0a  <table> code\n".
19740 20 20 22 20 20 20 20 20 20 20 20 20 20 20 20 20    "             
19750 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 73 65              inse
19760 72 74 20 20 20 53 51 4c 20 69 6e 73 65 72 74 20  rt   SQL insert 
19770 73 74 61 74 65 6d 65 6e 74 73 20 66 6f 72 20 54  statements for T
19780 41 42 4c 45 5c 6e 22 0a 20 20 22 20 20 20 20 20  ABLE\n".  "     
19790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
197a0 20 20 20 20 6c 69 6e 65 20 20 20 20 20 4f 6e 65      line     One
197b0 20 76 61 6c 75 65 20 70 65 72 20 6c 69 6e 65 5c   value per line\
197c0 6e 22 0a 20 20 22 20 20 20 20 20 20 20 20 20 20  n".  "          
197d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6c                 l
197e0 69 73 74 20 20 20 20 20 56 61 6c 75 65 73 20 64  ist     Values d
197f0 65 6c 69 6d 69 74 65 64 20 62 79 20 5c 22 7c 5c  elimited by \"|\
19800 22 5c 6e 22 0a 20 20 22 20 20 20 20 20 20 20 20  "\n".  "        
19810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19820 20 71 75 6f 74 65 20 20 20 20 45 73 63 61 70 65   quote    Escape
19830 20 61 6e 73 77 65 72 73 20 61 73 20 66 6f 72 20   answers as for 
19840 53 51 4c 5c 6e 22 0a 20 20 22 20 20 20 20 20 20  SQL\n".  "      
19850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19860 20 20 20 74 61 62 73 20 20 20 20 20 54 61 62 2d     tabs     Tab-
19870 73 65 70 61 72 61 74 65 64 20 76 61 6c 75 65 73  separated values
19880 5c 6e 22 0a 20 20 22 20 20 20 20 20 20 20 20 20  \n".  "         
19890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
198a0 74 63 6c 20 20 20 20 20 20 54 43 4c 20 6c 69 73  tcl      TCL lis
198b0 74 20 65 6c 65 6d 65 6e 74 73 5c 6e 22 0a 20 20  t elements\n".  
198c0 22 2e 6e 75 6c 6c 76 61 6c 75 65 20 53 54 52 49  ".nullvalue STRI
198d0 4e 47 20 20 20 20 20 20 55 73 65 20 53 54 52 49  NG      Use STRI
198e0 4e 47 20 69 6e 20 70 6c 61 63 65 20 6f 66 20 4e  NG in place of N
198f0 55 4c 4c 20 76 61 6c 75 65 73 5c 6e 22 0a 20 20  ULL values\n".  
19900 22 2e 6f 6e 63 65 20 28 2d 65 7c 2d 78 7c 46 49  ".once (-e|-x|FI
19910 4c 45 29 20 20 20 20 20 4f 75 74 70 75 74 20 66  LE)     Output f
19920 6f 72 20 74 68 65 20 6e 65 78 74 20 53 51 4c 20  or the next SQL 
19930 63 6f 6d 6d 61 6e 64 20 6f 6e 6c 79 20 74 6f 20  command only to 
19940 46 49 4c 45 5c 6e 22 0a 20 20 22 20 20 20 20 20  FILE\n".  "     
19950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19960 20 20 20 20 6f 72 20 69 6e 76 6f 6b 65 20 73 79      or invoke sy
19970 73 74 65 6d 20 74 65 78 74 20 65 64 69 74 6f 72  stem text editor
19980 20 28 2d 65 29 20 6f 72 20 73 70 72 65 61 64 73   (-e) or spreads
19990 68 65 65 74 20 28 2d 78 29 5c 6e 22 0a 20 20 22  heet (-x)\n".  "
199a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
199b0 20 20 20 20 20 20 20 20 20 6f 6e 20 74 68 65 20           on the 
199c0 6f 75 74 70 75 74 2e 5c 6e 22 0a 20 20 22 2e 6f  output.\n".  ".o
199d0 70 65 6e 20 3f 4f 50 54 49 4f 4e 53 3f 20 3f 46  pen ?OPTIONS? ?F
199e0 49 4c 45 3f 20 43 6c 6f 73 65 20 65 78 69 73 74  ILE? Close exist
199f0 69 6e 67 20 64 61 74 61 62 61 73 65 20 61 6e 64  ing database and
19a00 20 72 65 6f 70 65 6e 20 46 49 4c 45 5c 6e 22 0a   reopen FILE\n".
19a10 20 20 22 20 20 20 20 20 20 20 20 20 20 20 20 20    "             
19a20 20 20 20 20 20 20 20 20 20 20 20 20 54 68 65 20              The 
19a30 2d 2d 6e 65 77 20 6f 70 74 69 6f 6e 20 73 74 61  --new option sta
19a40 72 74 73 20 77 69 74 68 20 61 6e 20 65 6d 70 74  rts with an empt
19a50 79 20 66 69 6c 65 5c 6e 22 0a 20 20 22 20 20 20  y file\n".  "   
19a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19a70 20 20 20 20 20 20 4f 74 68 65 72 20 6f 70 74 69        Other opti
19a80 6f 6e 73 3a 20 2d 2d 72 65 61 64 6f 6e 6c 79 20  ons: --readonly 
19a90 2d 2d 61 70 70 65 6e 64 20 2d 2d 7a 69 70 5c 6e  --append --zip\n
19aa0 22 0a 20 20 22 2e 6f 75 74 70 75 74 20 3f 46 49  ".  ".output ?FI
19ab0 4c 45 3f 20 20 20 20 20 20 20 20 20 53 65 6e 64  LE?         Send
19ac0 20 6f 75 74 70 75 74 20 74 6f 20 46 49 4c 45 20   output to FILE 
19ad0 6f 72 20 73 74 64 6f 75 74 5c 6e 22 0a 20 20 22  or stdout\n".  "
19ae0 2e 70 72 69 6e 74 20 53 54 52 49 4e 47 2e 2e 2e  .print STRING...
19af0 20 20 20 20 20 20 20 50 72 69 6e 74 20 6c 69 74         Print lit
19b00 65 72 61 6c 20 53 54 52 49 4e 47 5c 6e 22 0a 20  eral STRING\n". 
19b10 20 22 2e 70 72 6f 6d 70 74 20 4d 41 49 4e 20 43   ".prompt MAIN C
19b20 4f 4e 54 49 4e 55 45 20 20 52 65 70 6c 61 63 65  ONTINUE  Replace
19b30 20 74 68 65 20 73 74 61 6e 64 61 72 64 20 70 72   the standard pr
19b40 6f 6d 70 74 73 5c 6e 22 0a 20 20 22 2e 71 75 69  ompts\n".  ".qui
19b50 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
19b60 20 20 20 45 78 69 74 20 74 68 69 73 20 70 72 6f     Exit this pro
19b70 67 72 61 6d 5c 6e 22 0a 20 20 22 2e 72 65 61 64  gram\n".  ".read
19b80 20 46 49 4c 45 4e 41 4d 45 20 20 20 20 20 20 20   FILENAME       
19b90 20 20 45 78 65 63 75 74 65 20 53 51 4c 20 69 6e    Execute SQL in
19ba0 20 46 49 4c 45 4e 41 4d 45 5c 6e 22 0a 20 20 22   FILENAME\n".  "
19bb0 2e 72 65 73 74 6f 72 65 20 3f 44 42 3f 20 46 49  .restore ?DB? FI
19bc0 4c 45 20 20 20 20 20 52 65 73 74 6f 72 65 20 63  LE     Restore c
19bd0 6f 6e 74 65 6e 74 20 6f 66 20 44 42 20 28 64 65  ontent of DB (de
19be0 66 61 75 6c 74 20 5c 22 6d 61 69 6e 5c 22 29 20  fault \"main\") 
19bf0 66 72 6f 6d 20 46 49 4c 45 5c 6e 22 0a 20 20 22  from FILE\n".  "
19c00 2e 73 61 76 65 20 46 49 4c 45 20 20 20 20 20 20  .save FILE      
19c10 20 20 20 20 20 20 20 57 72 69 74 65 20 69 6e 2d         Write in-
19c20 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20  memory database 
19c30 69 6e 74 6f 20 46 49 4c 45 5c 6e 22 0a 20 20 22  into FILE\n".  "
19c40 2e 73 63 61 6e 73 74 61 74 73 20 6f 6e 7c 6f 66  .scanstats on|of
19c50 66 20 20 20 20 20 20 54 75 72 6e 20 73 71 6c 69  f      Turn sqli
19c60 74 65 33 5f 73 74 6d 74 5f 73 63 61 6e 73 74 61  te3_stmt_scansta
19c70 74 75 73 28 29 20 6d 65 74 72 69 63 73 20 6f 6e  tus() metrics on
19c80 20 6f 72 20 6f 66 66 5c 6e 22 0a 20 20 22 2e 73   or off\n".  ".s
19c90 63 68 65 6d 61 20 3f 50 41 54 54 45 52 4e 3f 20  chema ?PATTERN? 
19ca0 20 20 20 20 20 53 68 6f 77 20 74 68 65 20 43 52       Show the CR
19cb0 45 41 54 45 20 73 74 61 74 65 6d 65 6e 74 73 20  EATE statements 
19cc0 6d 61 74 63 68 69 6e 67 20 50 41 54 54 45 52 4e  matching PATTERN
19cd0 5c 6e 22 0a 20 20 22 20 20 20 20 20 20 20 20 20  \n".  "         
19ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19cf0 20 41 64 64 20 2d 2d 69 6e 64 65 6e 74 20 66 6f   Add --indent fo
19d00 72 20 70 72 65 74 74 79 2d 70 72 69 6e 74 69 6e  r pretty-printin
19d10 67 5c 6e 22 0a 20 20 22 2e 73 65 6c 66 74 65 73  g\n".  ".selftes
19d20 74 20 3f 2d 2d 69 6e 69 74 3f 20 20 20 20 20 52  t ?--init?     R
19d30 75 6e 20 74 65 73 74 73 20 64 65 66 69 6e 65 64  un tests defined
19d40 20 69 6e 20 74 68 65 20 53 45 4c 46 54 45 53 54   in the SELFTEST
19d50 20 74 61 62 6c 65 5c 6e 22 0a 20 20 22 2e 73 65   table\n".  ".se
19d60 70 61 72 61 74 6f 72 20 43 4f 4c 20 3f 52 4f 57  parator COL ?ROW
19d70 3f 20 20 20 43 68 61 6e 67 65 20 74 68 65 20 63  ?   Change the c
19d80 6f 6c 75 6d 6e 20 73 65 70 61 72 61 74 6f 72 20  olumn separator 
19d90 61 6e 64 20 6f 70 74 69 6f 6e 61 6c 6c 79 20 74  and optionally t
19da0 68 65 20 72 6f 77 5c 6e 22 0a 20 20 22 20 20 20  he row\n".  "   
19db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19dc0 20 20 20 20 20 20 73 65 70 61 72 61 74 6f 72 20        separator 
19dd0 66 6f 72 20 62 6f 74 68 20 74 68 65 20 6f 75 74  for both the out
19de0 70 75 74 20 6d 6f 64 65 20 61 6e 64 20 2e 69 6d  put mode and .im
19df0 70 6f 72 74 5c 6e 22 0a 23 69 66 20 64 65 66 69  port\n".#if defi
19e00 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
19e10 45 5f 53 45 53 53 49 4f 4e 29 0a 20 20 22 2e 73  E_SESSION).  ".s
19e20 65 73 73 69 6f 6e 20 43 4d 44 20 2e 2e 2e 20 20  ession CMD ...  
19e30 20 20 20 20 20 43 72 65 61 74 65 20 6f 72 20 63       Create or c
19e40 6f 6e 74 72 6f 6c 20 73 65 73 73 69 6f 6e 73 5c  ontrol sessions\
19e50 6e 22 0a 23 65 6e 64 69 66 0a 20 20 22 2e 73 68  n".#endif.  ".sh
19e60 61 33 73 75 6d 20 3f 4f 50 54 49 4f 4e 53 2e 2e  a3sum ?OPTIONS..
19e70 2e 3f 20 20 43 6f 6d 70 75 74 65 20 61 20 53 48  .?  Compute a SH
19e80 41 33 20 68 61 73 68 20 6f 66 20 64 61 74 61 62  A3 hash of datab
19e90 61 73 65 20 63 6f 6e 74 65 6e 74 5c 6e 22 0a 23  ase content\n".#
19ea0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f  ifndef SQLITE_NO
19eb0 48 41 56 45 5f 53 59 53 54 45 4d 0a 20 20 22 2e  HAVE_SYSTEM.  ".
19ec0 73 68 65 6c 6c 20 43 4d 44 20 41 52 47 53 2e 2e  shell CMD ARGS..
19ed0 2e 20 20 20 20 20 52 75 6e 20 43 4d 44 20 41 52  .     Run CMD AR
19ee0 47 53 2e 2e 2e 20 69 6e 20 61 20 73 79 73 74 65  GS... in a syste
19ef0 6d 20 73 68 65 6c 6c 5c 6e 22 0a 23 65 6e 64 69  m shell\n".#endi
19f00 66 0a 20 20 22 2e 73 68 6f 77 20 20 20 20 20 20  f.  ".show      
19f10 20 20 20 20 20 20 20 20 20 20 20 20 53 68 6f 77              Show
19f20 20 74 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c   the current val
19f30 75 65 73 20 66 6f 72 20 76 61 72 69 6f 75 73 20  ues for various 
19f40 73 65 74 74 69 6e 67 73 5c 6e 22 0a 20 20 22 2e  settings\n".  ".
19f50 73 74 61 74 73 20 3f 6f 6e 7c 6f 66 66 3f 20 20  stats ?on|off?  
19f60 20 20 20 20 20 20 53 68 6f 77 20 73 74 61 74 73        Show stats
19f70 20 6f 72 20 74 75 72 6e 20 73 74 61 74 73 20 6f   or turn stats o
19f80 6e 20 6f 72 20 6f 66 66 5c 6e 22 0a 23 69 66 6e  n or off\n".#ifn
19f90 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f 48 41 56  def SQLITE_NOHAV
19fa0 45 5f 53 59 53 54 45 4d 0a 20 20 22 2e 73 79 73  E_SYSTEM.  ".sys
19fb0 74 65 6d 20 43 4d 44 20 41 52 47 53 2e 2e 2e 20  tem CMD ARGS... 
19fc0 20 20 20 52 75 6e 20 43 4d 44 20 41 52 47 53 2e     Run CMD ARGS.
19fd0 2e 2e 20 69 6e 20 61 20 73 79 73 74 65 6d 20 73  .. in a system s
19fe0 68 65 6c 6c 5c 6e 22 0a 23 65 6e 64 69 66 0a 20  hell\n".#endif. 
19ff0 20 22 2e 74 61 62 6c 65 73 20 3f 54 41 42 4c 45   ".tables ?TABLE
1a000 3f 20 20 20 20 20 20 20 20 4c 69 73 74 20 6e 61  ?        List na
1a010 6d 65 73 20 6f 66 20 74 61 62 6c 65 73 5c 6e 22  mes of tables\n"
1a020 0a 20 20 22 20 20 20 20 20 20 20 20 20 20 20 20  .  "            
1a030 20 20 20 20 20 20 20 20 20 20 20 20 20 49 66 20               If 
1a040 54 41 42 4c 45 20 73 70 65 63 69 66 69 65 64 2c  TABLE specified,
1a050 20 6f 6e 6c 79 20 6c 69 73 74 20 74 61 62 6c 65   only list table
1a060 73 20 6d 61 74 63 68 69 6e 67 5c 6e 22 0a 20 20  s matching\n".  
1a070 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
1a080 20 20 20 20 20 20 20 20 20 20 4c 49 4b 45 20 70            LIKE p
1a090 61 74 74 65 72 6e 20 54 41 42 4c 45 2e 5c 6e 22  attern TABLE.\n"
1a0a0 0a 20 20 22 2e 74 65 73 74 63 61 73 65 20 4e 41  .  ".testcase NA
1a0b0 4d 45 20 20 20 20 20 20 20 20 20 42 65 67 69 6e  ME         Begin
1a0c0 20 72 65 64 69 72 65 63 74 69 6e 67 20 6f 75 74   redirecting out
1a0d0 70 75 74 20 74 6f 20 27 74 65 73 74 63 61 73 65  put to 'testcase
1a0e0 2d 6f 75 74 2e 74 78 74 27 5c 6e 22 0a 20 20 22  -out.txt'\n".  "
1a0f0 2e 74 69 6d 65 6f 75 74 20 4d 53 20 20 20 20 20  .timeout MS     
1a100 20 20 20 20 20 20 20 54 72 79 20 6f 70 65 6e 69         Try openi
1a110 6e 67 20 6c 6f 63 6b 65 64 20 74 61 62 6c 65 73  ng locked tables
1a120 20 66 6f 72 20 4d 53 20 6d 69 6c 6c 69 73 65 63   for MS millisec
1a130 6f 6e 64 73 5c 6e 22 0a 20 20 22 2e 74 69 6d 65  onds\n".  ".time
1a140 72 20 6f 6e 7c 6f 66 66 20 20 20 20 20 20 20 20  r on|off        
1a150 20 20 54 75 72 6e 20 53 51 4c 20 74 69 6d 65 72    Turn SQL timer
1a160 20 6f 6e 20 6f 72 20 6f 66 66 5c 6e 22 0a 20 20   on or off\n".  
1a170 22 2e 74 72 61 63 65 20 46 49 4c 45 7c 6f 66 66  ".trace FILE|off
1a180 20 20 20 20 20 20 20 20 4f 75 74 70 75 74 20 65          Output e
1a190 61 63 68 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  ach SQL statemen
1a1a0 74 20 61 73 20 69 74 20 69 73 20 72 75 6e 5c 6e  t as it is run\n
1a1b0 22 0a 20 20 22 2e 76 66 73 69 6e 66 6f 20 3f 41  ".  ".vfsinfo ?A
1a1c0 55 58 3f 20 20 20 20 20 20 20 20 20 49 6e 66 6f  UX?         Info
1a1d0 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68  rmation about th
1a1e0 65 20 74 6f 70 2d 6c 65 76 65 6c 20 56 46 53 5c  e top-level VFS\
1a1f0 6e 22 0a 20 20 22 2e 76 66 73 6c 69 73 74 20 20  n".  ".vfslist  
1a200 20 20 20 20 20 20 20 20 20 20 20 20 20 4c 69 73               Lis
1a210 74 20 61 6c 6c 20 61 76 61 69 6c 61 62 6c 65 20  t all available 
1a220 56 46 53 65 73 5c 6e 22 0a 20 20 22 2e 76 66 73  VFSes\n".  ".vfs
1a230 6e 61 6d 65 20 3f 41 55 58 3f 20 20 20 20 20 20  name ?AUX?      
1a240 20 20 20 50 72 69 6e 74 20 74 68 65 20 6e 61 6d     Print the nam
1a250 65 20 6f 66 20 74 68 65 20 56 46 53 20 73 74 61  e of the VFS sta
1a260 63 6b 5c 6e 22 0a 20 20 22 2e 77 69 64 74 68 20  ck\n".  ".width 
1a270 4e 55 4d 31 20 4e 55 4d 32 20 2e 2e 2e 20 20 20  NUM1 NUM2 ...   
1a280 53 65 74 20 63 6f 6c 75 6d 6e 20 77 69 64 74 68  Set column width
1a290 73 20 66 6f 72 20 5c 22 63 6f 6c 75 6d 6e 5c 22  s for \"column\"
1a2a0 20 6d 6f 64 65 5c 6e 22 0a 20 20 22 20 20 20 20   mode\n".  "    
1a2b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a2c0 20 20 20 20 20 4e 65 67 61 74 69 76 65 20 76 61       Negative va
1a2d0 6c 75 65 73 20 72 69 67 68 74 2d 6a 75 73 74 69  lues right-justi
1a2e0 66 79 5c 6e 22 0a 3b 0a 0a 23 69 66 20 64 65 66  fy\n".;..#if def
1a2f0 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
1a300 4c 45 5f 53 45 53 53 49 4f 4e 29 0a 2f 2a 0a 2a  LE_SESSION)./*.*
1a310 2a 20 50 72 69 6e 74 20 68 65 6c 70 20 69 6e 66  * Print help inf
1a320 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 74 68 65  ormation for the
1a330 20 22 2e 73 65 73 73 69 6f 6e 73 22 20 63 6f 6d   ".sessions" com
1a340 6d 61 6e 64 0a 2a 2f 0a 76 6f 69 64 20 73 65 73  mand.*/.void ses
1a350 73 69 6f 6e 5f 68 65 6c 70 28 53 68 65 6c 6c 53  sion_help(ShellS
1a360 74 61 74 65 20 2a 70 29 7b 0a 20 20 72 61 77 5f  tate *p){.  raw_
1a370 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 0a 20  printf(p->out,. 
1a380 20 20 20 22 2e 73 65 73 73 69 6f 6e 20 3f 4e 41     ".session ?NA
1a390 4d 45 3f 20 53 55 42 43 4f 4d 4d 41 4e 44 20 3f  ME? SUBCOMMAND ?
1a3a0 41 52 47 53 2e 2e 2e 3f 5c 6e 22 0a 20 20 20 20  ARGS...?\n".    
1a3b0 22 49 66 20 3f 4e 41 4d 45 3f 20 69 73 20 6f 6d  "If ?NAME? is om
1a3c0 69 74 74 65 64 2c 20 74 68 65 20 66 69 72 73 74  itted, the first
1a3d0 20 64 65 66 69 6e 65 64 20 73 65 73 73 69 6f 6e   defined session
1a3e0 20 69 73 20 75 73 65 64 2e 5c 6e 22 0a 20 20 20   is used.\n".   
1a3f0 20 22 53 75 62 63 6f 6d 6d 61 6e 64 73 3a 5c 6e   "Subcommands:\n
1a400 22 0a 20 20 20 20 22 20 20 20 61 74 74 61 63 68  ".    "   attach
1a410 20 54 41 42 4c 45 20 20 20 20 20 20 20 20 20 20   TABLE          
1a420 20 20 20 41 74 74 61 63 68 20 54 41 42 4c 45 5c     Attach TABLE\
1a430 6e 22 0a 20 20 20 20 22 20 20 20 63 68 61 6e 67  n".    "   chang
1a440 65 73 65 74 20 46 49 4c 45 20 20 20 20 20 20 20  eset FILE       
1a450 20 20 20 20 57 72 69 74 65 20 61 20 63 68 61 6e      Write a chan
1a460 67 65 73 65 74 20 69 6e 74 6f 20 46 49 4c 45 5c  geset into FILE\
1a470 6e 22 0a 20 20 20 20 22 20 20 20 63 6c 6f 73 65  n".    "   close
1a480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a490 20 20 20 20 43 6c 6f 73 65 20 6f 6e 65 20 73 65      Close one se
1a4a0 73 73 69 6f 6e 5c 6e 22 0a 20 20 20 20 22 20 20  ssion\n".    "  
1a4b0 20 65 6e 61 62 6c 65 20 3f 42 4f 4f 4c 45 41 4e   enable ?BOOLEAN
1a4c0 3f 20 20 20 20 20 20 20 20 20 53 65 74 20 6f 72  ?         Set or
1a4d0 20 71 75 65 72 79 20 74 68 65 20 65 6e 61 62 6c   query the enabl
1a4e0 65 20 62 69 74 5c 6e 22 0a 20 20 20 20 22 20 20  e bit\n".    "  
1a4f0 20 66 69 6c 74 65 72 20 47 4c 4f 42 2e 2e 2e 20   filter GLOB... 
1a500 20 20 20 20 20 20 20 20 20 20 52 65 6a 65 63 74            Reject
1a510 20 74 61 62 6c 65 73 20 6d 61 74 63 68 69 6e 67   tables matching
1a520 20 47 4c 4f 42 73 5c 6e 22 0a 20 20 20 20 22 20   GLOBs\n".    " 
1a530 20 20 69 6e 64 69 72 65 63 74 20 3f 42 4f 4f 4c    indirect ?BOOL
1a540 45 41 4e 3f 20 20 20 20 20 20 20 4d 61 72 6b 20  EAN?       Mark 
1a550 6f 72 20 71 75 65 72 79 20 74 68 65 20 69 6e 64  or query the ind
1a560 69 72 65 63 74 20 73 74 61 74 75 73 5c 6e 22 0a  irect status\n".
1a570 20 20 20 20 22 20 20 20 69 73 65 6d 70 74 79 20      "   isempty 
1a580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a590 20 51 75 65 72 79 20 77 68 65 74 68 65 72 20 74   Query whether t
1a5a0 68 65 20 73 65 73 73 69 6f 6e 20 69 73 20 65 6d  he session is em
1a5b0 70 74 79 5c 6e 22 0a 20 20 20 20 22 20 20 20 6c  pty\n".    "   l
1a5c0 69 73 74 20 20 20 20 20 20 20 20 20 20 20 20 20  ist             
1a5d0 20 20 20 20 20 20 20 20 4c 69 73 74 20 63 75 72          List cur
1a5e0 72 65 6e 74 6c 79 20 6f 70 65 6e 20 73 65 73 73  rently open sess
1a5f0 69 6f 6e 20 6e 61 6d 65 73 5c 6e 22 0a 20 20 20  ion names\n".   
1a600 20 22 20 20 20 6f 70 65 6e 20 44 42 20 4e 41 4d   "   open DB NAM
1a610 45 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 70  E             Op
1a620 65 6e 20 61 20 6e 65 77 20 73 65 73 73 69 6f 6e  en a new session
1a630 20 6f 6e 20 44 42 5c 6e 22 0a 20 20 20 20 22 20   on DB\n".    " 
1a640 20 20 70 61 74 63 68 73 65 74 20 46 49 4c 45 20    patchset FILE 
1a650 20 20 20 20 20 20 20 20 20 20 20 57 72 69 74 65             Write
1a660 20 61 20 70 61 74 63 68 73 65 74 20 69 6e 74 6f   a patchset into
1a670 20 46 49 4c 45 5c 6e 22 0a 20 20 29 3b 0a 7d 0a   FILE\n".  );.}.
1a680 23 65 6e 64 69 66 0a 0a 0a 2f 2a 20 46 6f 72 77  #endif.../* Forw
1a690 61 72 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f  ard reference */
1a6a0 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 63  .static int proc
1a6b0 65 73 73 5f 69 6e 70 75 74 28 53 68 65 6c 6c 53  ess_input(ShellS
1a6c0 74 61 74 65 20 2a 70 2c 20 46 49 4c 45 20 2a 69  tate *p, FILE *i
1a6d0 6e 29 3b 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20  n);../*.** Read 
1a6e0 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 66  the content of f
1a6f0 69 6c 65 20 7a 4e 61 6d 65 20 69 6e 74 6f 20 6d  ile zName into m
1a700 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66  emory obtained f
1a710 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  rom sqlite3_mall
1a720 6f 63 36 34 28 29 0a 2a 2a 20 61 6e 64 20 72 65  oc64().** and re
1a730 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
1a740 6f 20 74 68 65 20 62 75 66 66 65 72 2e 20 54 68  o the buffer. Th
1a750 65 20 63 61 6c 6c 65 72 20 69 73 20 72 65 73 70  e caller is resp
1a760 6f 6e 73 69 62 6c 65 20 66 6f 72 20 66 72 65 65  onsible for free
1a770 69 6e 67 0a 2a 2a 20 74 68 65 20 6d 65 6d 6f 72  ing.** the memor
1a780 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61  y..**.** If para
1a790 6d 65 74 65 72 20 70 6e 42 79 74 65 20 69 73 20  meter pnByte is 
1a7a0 6e 6f 74 20 4e 55 4c 4c 2c 20 28 2a 70 6e 42 79  not NULL, (*pnBy
1a7b0 74 65 29 20 69 73 20 73 65 74 20 74 6f 20 74 68  te) is set to th
1a7c0 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
1a7d0 73 0a 2a 2a 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a  s.** read..**.**
1a7e0 20 46 6f 72 20 63 6f 6e 76 65 6e 69 65 6e 63 65   For convenience
1a7f0 2c 20 61 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74  , a nul-terminat
1a800 6f 72 20 62 79 74 65 20 69 73 20 61 6c 77 61 79  or byte is alway
1a810 73 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68  s appended to th
1a820 65 20 64 61 74 61 20 72 65 61 64 0a 2a 2a 20 66  e data read.** f
1a830 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 62 65 66  rom the file bef
1a840 6f 72 65 20 74 68 65 20 62 75 66 66 65 72 20 69  ore the buffer i
1a850 73 20 72 65 74 75 72 6e 65 64 2e 20 54 68 69 73  s returned. This
1a860 20 62 79 74 65 20 69 73 20 6e 6f 74 20 69 6e 63   byte is not inc
1a870 6c 75 64 65 64 20 69 6e 0a 2a 2a 20 74 68 65 20  luded in.** the 
1a880 66 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 28  final value of (
1a890 2a 70 6e 42 79 74 65 29 2c 20 69 66 20 61 70 70  *pnByte), if app
1a8a0 6c 69 63 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 4e  licable..**.** N
1a8b0 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 20  ULL is returned 
1a8c0 69 66 20 61 6e 79 20 65 72 72 6f 72 20 69 73 20  if any error is 
1a8d0 65 6e 63 6f 75 6e 74 65 72 65 64 2e 20 54 68 65  encountered. The
1a8e0 20 66 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20   final value of 
1a8f0 2a 70 6e 42 79 74 65 0a 2a 2a 20 69 73 20 75 6e  *pnByte.** is un
1a900 64 65 66 69 6e 65 64 20 69 6e 20 74 68 69 73 20  defined in this 
1a910 63 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  case..*/.static 
1a920 63 68 61 72 20 2a 72 65 61 64 46 69 6c 65 28 63  char *readFile(c
1a930 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
1a940 2c 20 69 6e 74 20 2a 70 6e 42 79 74 65 29 7b 0a  , int *pnByte){.
1a950 20 20 46 49 4c 45 20 2a 69 6e 20 3d 20 66 6f 70    FILE *in = fop
1a960 65 6e 28 7a 4e 61 6d 65 2c 20 22 72 62 22 29 3b  en(zName, "rb");
1a970 0a 20 20 6c 6f 6e 67 20 6e 49 6e 3b 0a 20 20 73  .  long nIn;.  s
1a980 69 7a 65 5f 74 20 6e 52 65 61 64 3b 0a 20 20 63  ize_t nRead;.  c
1a990 68 61 72 20 2a 70 42 75 66 3b 0a 20 20 69 66 28  har *pBuf;.  if(
1a9a0 20 69 6e 3d 3d 30 20 29 20 72 65 74 75 72 6e 20   in==0 ) return 
1a9b0 30 3b 0a 20 20 66 73 65 65 6b 28 69 6e 2c 20 30  0;.  fseek(in, 0
1a9c0 2c 20 53 45 45 4b 5f 45 4e 44 29 3b 0a 20 20 6e  , SEEK_END);.  n
1a9d0 49 6e 20 3d 20 66 74 65 6c 6c 28 69 6e 29 3b 0a  In = ftell(in);.
1a9e0 20 20 72 65 77 69 6e 64 28 69 6e 29 3b 0a 20 20    rewind(in);.  
1a9f0 70 42 75 66 20 3d 20 73 71 6c 69 74 65 33 5f 6d  pBuf = sqlite3_m
1aa00 61 6c 6c 6f 63 36 34 28 20 6e 49 6e 2b 31 20 29  alloc64( nIn+1 )
1aa10 3b 0a 20 20 69 66 28 20 70 42 75 66 3d 3d 30 20  ;.  if( pBuf==0 
1aa20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 6e 52  ) return 0;.  nR
1aa30 65 61 64 20 3d 20 66 72 65 61 64 28 70 42 75 66  ead = fread(pBuf
1aa40 2c 20 6e 49 6e 2c 20 31 2c 20 69 6e 29 3b 0a 20  , nIn, 1, in);. 
1aa50 20 66 63 6c 6f 73 65 28 69 6e 29 3b 0a 20 20 69   fclose(in);.  i
1aa60 66 28 20 6e 52 65 61 64 21 3d 31 20 29 7b 0a 20  f( nRead!=1 ){. 
1aa70 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
1aa80 70 42 75 66 29 3b 0a 20 20 20 20 72 65 74 75 72  pBuf);.    retur
1aa90 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 42 75 66 5b  n 0;.  }.  pBuf[
1aaa0 6e 49 6e 5d 20 3d 20 30 3b 0a 20 20 69 66 28 20  nIn] = 0;.  if( 
1aab0 70 6e 42 79 74 65 20 29 20 2a 70 6e 42 79 74 65  pnByte ) *pnByte
1aac0 20 3d 20 6e 49 6e 3b 0a 20 20 72 65 74 75 72 6e   = nIn;.  return
1aad0 20 70 42 75 66 3b 0a 7d 0a 0a 23 69 66 20 64 65   pBuf;.}..#if de
1aae0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
1aaf0 42 4c 45 5f 53 45 53 53 49 4f 4e 29 0a 2f 2a 0a  BLE_SESSION)./*.
1ab00 2a 2a 20 43 6c 6f 73 65 20 61 20 73 69 6e 67 6c  ** Close a singl
1ab10 65 20 4f 70 65 6e 53 65 73 73 69 6f 6e 20 6f 62  e OpenSession ob
1ab20 6a 65 63 74 20 61 6e 64 20 72 65 6c 65 61 73 65  ject and release
1ab30 20 61 6c 6c 20 6f 66 20 69 74 73 20 61 73 73 6f   all of its asso
1ab40 63 69 61 74 65 64 0a 2a 2a 20 72 65 73 6f 75 72  ciated.** resour
1ab50 63 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ces..*/.static v
1ab60 6f 69 64 20 73 65 73 73 69 6f 6e 5f 63 6c 6f 73  oid session_clos
1ab70 65 28 4f 70 65 6e 53 65 73 73 69 6f 6e 20 2a 70  e(OpenSession *p
1ab80 53 65 73 73 69 6f 6e 29 7b 0a 20 20 69 6e 74 20  Session){.  int 
1ab90 69 3b 0a 20 20 73 71 6c 69 74 65 33 73 65 73 73  i;.  sqlite3sess
1aba0 69 6f 6e 5f 64 65 6c 65 74 65 28 70 53 65 73 73  ion_delete(pSess
1abb0 69 6f 6e 2d 3e 70 29 3b 0a 20 20 73 71 6c 69 74  ion->p);.  sqlit
1abc0 65 33 5f 66 72 65 65 28 70 53 65 73 73 69 6f 6e  e3_free(pSession
1abd0 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 66 6f 72 28  ->zName);.  for(
1abe0 69 3d 30 3b 20 69 3c 70 53 65 73 73 69 6f 6e 2d  i=0; i<pSession-
1abf0 3e 6e 46 69 6c 74 65 72 3b 20 69 2b 2b 29 7b 0a  >nFilter; i++){.
1ac00 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
1ac10 28 70 53 65 73 73 69 6f 6e 2d 3e 61 7a 46 69 6c  (pSession->azFil
1ac20 74 65 72 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 73  ter[i]);.  }.  s
1ac30 71 6c 69 74 65 33 5f 66 72 65 65 28 70 53 65 73  qlite3_free(pSes
1ac40 73 69 6f 6e 2d 3e 61 7a 46 69 6c 74 65 72 29 3b  sion->azFilter);
1ac50 0a 20 20 6d 65 6d 73 65 74 28 70 53 65 73 73 69  .  memset(pSessi
1ac60 6f 6e 2c 20 30 2c 20 73 69 7a 65 6f 66 28 4f 70  on, 0, sizeof(Op
1ac70 65 6e 53 65 73 73 69 6f 6e 29 29 3b 0a 7d 0a 23  enSession));.}.#
1ac80 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f  endif../*.** Clo
1ac90 73 65 20 61 6c 6c 20 4f 70 65 6e 53 65 73 73 69  se all OpenSessi
1aca0 6f 6e 20 6f 62 6a 65 63 74 73 20 61 6e 64 20 72  on objects and r
1acb0 65 6c 65 61 73 65 20 61 6c 6c 20 61 73 73 6f 63  elease all assoc
1acc0 69 61 74 65 64 20 72 65 73 6f 75 72 63 65 73 2e  iated resources.
1acd0 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28  .*/.#if defined(
1ace0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 45  SQLITE_ENABLE_SE
1acf0 53 53 49 4f 4e 29 0a 73 74 61 74 69 63 20 76 6f  SSION).static vo
1ad00 69 64 20 73 65 73 73 69 6f 6e 5f 63 6c 6f 73 65  id session_close
1ad10 5f 61 6c 6c 28 53 68 65 6c 6c 53 74 61 74 65 20  _all(ShellState 
1ad20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  *p){.  int i;.  
1ad30 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 53  for(i=0; i<p->nS
1ad40 65 73 73 69 6f 6e 3b 20 69 2b 2b 29 7b 0a 20 20  ession; i++){.  
1ad50 20 20 73 65 73 73 69 6f 6e 5f 63 6c 6f 73 65 28    session_close(
1ad60 26 70 2d 3e 61 53 65 73 73 69 6f 6e 5b 69 5d 29  &p->aSession[i])
1ad70 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6e 53 65 73 73  ;.  }.  p->nSess
1ad80 69 6f 6e 20 3d 20 30 3b 0a 7d 0a 23 65 6c 73 65  ion = 0;.}.#else
1ad90 0a 23 20 64 65 66 69 6e 65 20 73 65 73 73 69 6f  .# define sessio
1ada0 6e 5f 63 6c 6f 73 65 5f 61 6c 6c 28 58 29 0a 23  n_close_all(X).#
1adb0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70  endif../*.** Imp
1adc0 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  lementation of t
1add0 68 65 20 78 46 69 6c 74 65 72 20 66 75 6e 63 74  he xFilter funct
1ade0 69 6f 6e 20 66 6f 72 20 61 6e 20 6f 70 65 6e 20  ion for an open 
1adf0 73 65 73 73 69 6f 6e 2e 20 20 4f 6d 69 74 0a 2a  session.  Omit.*
1ae00 2a 20 61 6e 79 20 74 61 62 6c 65 73 20 6e 61 6d  * any tables nam
1ae10 65 64 20 62 79 20 22 2e 73 65 73 73 69 6f 6e 20  ed by ".session 
1ae20 66 69 6c 74 65 72 22 20 62 75 74 20 6c 65 74 20  filter" but let 
1ae30 61 6c 6c 20 6f 74 68 65 72 20 74 61 62 6c 65 20  all other table 
1ae40 74 68 72 6f 75 67 68 2e 0a 2a 2f 0a 23 69 66 20  through..*/.#if 
1ae50 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
1ae60 4e 41 42 4c 45 5f 53 45 53 53 49 4f 4e 29 0a 73  NABLE_SESSION).s
1ae70 74 61 74 69 63 20 69 6e 74 20 73 65 73 73 69 6f  tatic int sessio
1ae80 6e 5f 66 69 6c 74 65 72 28 76 6f 69 64 20 2a 70  n_filter(void *p
1ae90 43 74 78 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  Ctx, const char 
1aea0 2a 7a 54 61 62 29 7b 0a 20 20 4f 70 65 6e 53 65  *zTab){.  OpenSe
1aeb0 73 73 69 6f 6e 20 2a 70 53 65 73 73 69 6f 6e 20  ssion *pSession 
1aec0 3d 20 28 4f 70 65 6e 53 65 73 73 69 6f 6e 2a 29  = (OpenSession*)
1aed0 70 43 74 78 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  pCtx;.  int i;. 
1aee0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53 65 73   for(i=0; i<pSes
1aef0 73 69 6f 6e 2d 3e 6e 46 69 6c 74 65 72 3b 20 69  sion->nFilter; i
1af00 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c  ++){.    if( sql
1af10 69 74 65 33 5f 73 74 72 67 6c 6f 62 28 70 53 65  ite3_strglob(pSe
1af20 73 73 69 6f 6e 2d 3e 61 7a 46 69 6c 74 65 72 5b  ssion->azFilter[
1af30 69 5d 2c 20 7a 54 61 62 29 3d 3d 30 20 29 20 72  i], zTab)==0 ) r
1af40 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72  eturn 0;.  }.  r
1af50 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69  eturn 1;.}.#endi
1af60 66 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20  f../*.** Try to 
1af70 64 65 64 75 63 65 20 74 68 65 20 74 79 70 65 20  deduce the type 
1af80 6f 66 20 66 69 6c 65 20 66 6f 72 20 7a 4e 61 6d  of file for zNam
1af90 65 20 62 61 73 65 64 20 6f 6e 20 69 74 73 20 63  e based on its c
1afa0 6f 6e 74 65 6e 74 2e 20 20 52 65 74 75 72 6e 0a  ontent.  Return.
1afb0 2a 2a 20 6f 6e 65 20 6f 66 20 74 68 65 20 53 48  ** one of the SH
1afc0 45 4c 4c 5f 4f 50 45 4e 5f 2a 20 63 6f 6e 73 74  ELL_OPEN_* const
1afd0 61 6e 74 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ants..**.** If t
1afe0 68 65 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74  he file does not
1aff0 20 65 78 69 73 74 20 6f 72 20 69 73 20 65 6d 70   exist or is emp
1b000 74 79 20 62 75 74 20 69 74 73 20 6e 61 6d 65 20  ty but its name 
1b010 6c 6f 6f 6b 73 20 6c 69 6b 65 20 61 20 5a 49 50  looks like a ZIP
1b020 0a 2a 2a 20 61 72 63 68 69 76 65 20 61 6e 64 20  .** archive and 
1b030 74 68 65 20 64 66 6c 74 5a 69 70 20 66 6c 61 67  the dfltZip flag
1b040 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 61   is true, then a
1b050 73 73 75 6d 65 20 69 74 20 69 73 20 61 20 5a 49  ssume it is a ZI
1b060 50 20 61 72 63 68 69 76 65 2e 0a 2a 2a 20 4f 74  P archive..** Ot
1b070 68 65 72 77 69 73 65 2c 20 61 73 73 75 6d 65 20  herwise, assume 
1b080 61 6e 20 6f 72 64 69 6e 61 72 79 20 64 61 74 61  an ordinary data
1b090 62 61 73 65 20 72 65 67 61 72 64 6c 65 73 73 20  base regardless 
1b0a0 6f 66 20 74 68 65 20 66 69 6c 65 6e 61 6d 65 20  of the filename 
1b0b0 69 66 0a 2a 2a 20 74 68 65 20 74 79 70 65 20 63  if.** the type c
1b0c0 61 6e 6e 6f 74 20 62 65 20 64 65 74 65 72 6d 69  annot be determi
1b0d0 6e 65 64 20 66 72 6f 6d 20 63 6f 6e 74 65 6e 74  ned from content
1b0e0 2e 0a 2a 2f 0a 69 6e 74 20 64 65 64 75 63 65 44  ..*/.int deduceD
1b0f0 61 74 61 62 61 73 65 54 79 70 65 28 63 6f 6e 73  atabaseType(cons
1b100 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 69  t char *zName, i
1b110 6e 74 20 64 66 6c 74 5a 69 70 29 7b 0a 20 20 46  nt dfltZip){.  F
1b120 49 4c 45 20 2a 66 20 3d 20 66 6f 70 65 6e 28 7a  ILE *f = fopen(z
1b130 4e 61 6d 65 2c 20 22 72 62 22 29 3b 0a 20 20 73  Name, "rb");.  s
1b140 69 7a 65 5f 74 20 6e 3b 0a 20 20 69 6e 74 20 72  ize_t n;.  int r
1b150 63 20 3d 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f 55  c = SHELL_OPEN_U
1b160 4e 53 50 45 43 3b 0a 20 20 63 68 61 72 20 7a 42  NSPEC;.  char zB
1b170 75 66 5b 31 30 30 5d 3b 0a 20 20 69 66 28 20 66  uf[100];.  if( f
1b180 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 64  ==0 ){.    if( d
1b190 66 6c 74 5a 69 70 20 26 26 20 73 71 6c 69 74 65  fltZip && sqlite
1b1a0 33 5f 73 74 72 6c 69 6b 65 28 22 25 2e 7a 69 70  3_strlike("%.zip
1b1b0 22 2c 7a 4e 61 6d 65 2c 30 29 3d 3d 30 20 29 7b  ",zName,0)==0 ){
1b1c0 0a 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  .       return S
1b1d0 48 45 4c 4c 5f 4f 50 45 4e 5f 5a 49 50 46 49 4c  HELL_OPEN_ZIPFIL
1b1e0 45 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  E;.    }else{.  
1b1f0 20 20 20 20 20 72 65 74 75 72 6e 20 53 48 45 4c       return SHEL
1b200 4c 5f 4f 50 45 4e 5f 4e 4f 52 4d 41 4c 3b 0a 20  L_OPEN_NORMAL;. 
1b210 20 20 20 7d 0a 20 20 7d 0a 20 20 66 73 65 65 6b     }.  }.  fseek
1b220 28 66 2c 20 2d 32 35 2c 20 53 45 45 4b 5f 45 4e  (f, -25, SEEK_EN
1b230 44 29 3b 0a 20 20 6e 20 3d 20 66 72 65 61 64 28  D);.  n = fread(
1b240 7a 42 75 66 2c 20 32 35 2c 20 31 2c 20 66 29 3b  zBuf, 25, 1, f);
1b250 0a 20 20 69 66 28 20 6e 3d 3d 31 20 26 26 20 6d  .  if( n==1 && m
1b260 65 6d 63 6d 70 28 7a 42 75 66 2c 20 22 53 74 61  emcmp(zBuf, "Sta
1b270 72 74 2d 4f 66 2d 53 51 4c 69 74 65 33 2d 22 2c  rt-Of-SQLite3-",
1b280 20 31 37 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72   17)==0 ){.    r
1b290 63 20 3d 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f 41  c = SHELL_OPEN_A
1b2a0 50 50 45 4e 44 56 46 53 3b 0a 20 20 7d 65 6c 73  PPENDVFS;.  }els
1b2b0 65 7b 0a 20 20 20 20 66 73 65 65 6b 28 66 2c 20  e{.    fseek(f, 
1b2c0 2d 32 32 2c 20 53 45 45 4b 5f 45 4e 44 29 3b 0a  -22, SEEK_END);.
1b2d0 20 20 20 20 6e 20 3d 20 66 72 65 61 64 28 7a 42      n = fread(zB
1b2e0 75 66 2c 20 32 32 2c 20 31 2c 20 66 29 3b 0a 20  uf, 22, 1, f);. 
1b2f0 20 20 20 69 66 28 20 6e 3d 3d 31 20 26 26 20 7a     if( n==1 && z
1b300 42 75 66 5b 30 5d 3d 3d 30 78 35 30 20 26 26 20  Buf[0]==0x50 && 
1b310 7a 42 75 66 5b 31 5d 3d 3d 30 78 34 62 20 26 26  zBuf[1]==0x4b &&
1b320 20 7a 42 75 66 5b 32 5d 3d 3d 30 78 30 35 0a 20   zBuf[2]==0x05. 
1b330 20 20 20 20 20 20 26 26 20 7a 42 75 66 5b 33 5d        && zBuf[3]
1b340 3d 3d 30 78 30 36 20 29 7b 0a 20 20 20 20 20 20  ==0x06 ){.      
1b350 72 63 20 3d 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f  rc = SHELL_OPEN_
1b360 5a 49 50 46 49 4c 45 3b 0a 20 20 20 20 7d 65 6c  ZIPFILE;.    }el
1b370 73 65 20 69 66 28 20 6e 3d 3d 30 20 26 26 20 64  se if( n==0 && d
1b380 66 6c 74 5a 69 70 20 26 26 20 73 71 6c 69 74 65  fltZip && sqlite
1b390 33 5f 73 74 72 6c 69 6b 65 28 22 25 2e 7a 69 70  3_strlike("%.zip
1b3a0 22 2c 7a 4e 61 6d 65 2c 30 29 3d 3d 30 20 29 7b  ",zName,0)==0 ){
1b3b0 0a 20 20 20 20 20 20 72 63 20 3d 20 53 48 45 4c  .      rc = SHEL
1b3c0 4c 5f 4f 50 45 4e 5f 5a 49 50 46 49 4c 45 3b 0a  L_OPEN_ZIPFILE;.
1b3d0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 63 6c 6f      }.  }.  fclo
1b3e0 73 65 28 66 29 3b 0a 20 20 72 65 74 75 72 6e 20  se(f);.  return 
1b3f0 72 63 3b 20 20 0a 7d 0a 0a 2f 2a 20 46 6c 61 67  rc;  .}../* Flag
1b400 73 20 66 6f 72 20 6f 70 65 6e 5f 64 62 28 29 2e  s for open_db().
1b410 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 66 61 75  .**.** The defau
1b420 6c 74 20 62 65 68 61 76 69 6f 72 20 6f 66 20 6f  lt behavior of o
1b430 70 65 6e 5f 64 62 28 29 20 69 73 20 74 6f 20 65  pen_db() is to e
1b440 78 69 74 28 31 29 20 69 66 20 74 68 65 20 64 61  xit(1) if the da
1b450 74 61 62 61 73 65 20 66 61 69 6c 73 20 74 6f 0a  tabase fails to.
1b460 2a 2a 20 6f 70 65 6e 2e 20 20 54 68 65 20 4f 50  ** open.  The OP
1b470 45 4e 5f 44 42 5f 4b 45 45 50 41 4c 49 56 45 20  EN_DB_KEEPALIVE 
1b480 66 6c 61 67 20 63 68 61 6e 67 65 73 20 74 68 61  flag changes tha
1b490 74 20 73 6f 20 74 68 61 74 20 69 74 20 70 72 69  t so that it pri
1b4a0 6e 74 73 20 61 6e 20 65 72 72 6f 72 0a 2a 2a 20  nts an error.** 
1b4b0 62 75 74 20 73 74 69 6c 6c 20 72 65 74 75 72 6e  but still return
1b4c0 73 20 77 69 74 68 6f 75 74 20 63 61 6c 6c 69 6e  s without callin
1b4d0 67 20 65 78 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  g exit..**.** Th
1b4e0 65 20 4f 50 45 4e 5f 44 42 5f 5a 49 50 46 49 4c  e OPEN_DB_ZIPFIL
1b4f0 45 20 66 6c 61 67 20 63 61 75 73 65 73 20 6f 70  E flag causes op
1b500 65 6e 5f 64 62 28 29 20 74 6f 20 70 72 65 66 65  en_db() to prefe
1b510 72 20 74 6f 20 6f 70 65 6e 20 66 69 6c 65 73 20  r to open files 
1b520 61 73 20 61 0a 2a 2a 20 5a 49 50 20 61 72 63 68  as a.** ZIP arch
1b530 69 76 65 20 69 66 20 74 68 65 20 66 69 6c 65 20  ive if the file 
1b540 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 20 6f  does not exist o
1b550 72 20 69 73 20 65 6d 70 74 79 20 61 6e 64 20 69  r is empty and i
1b560 74 73 20 6e 61 6d 65 20 6d 61 74 63 68 65 73 0a  ts name matches.
1b570 2a 2a 20 74 68 65 20 2a 2e 7a 69 70 20 70 61 74  ** the *.zip pat
1b580 74 65 72 6e 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  tern..*/.#define
1b590 20 4f 50 45 4e 5f 44 42 5f 4b 45 45 50 41 4c 49   OPEN_DB_KEEPALI
1b5a0 56 45 20 20 20 30 78 30 30 31 20 20 20 2f 2a 20  VE   0x001   /* 
1b5b0 52 65 74 75 72 6e 20 61 66 74 65 72 20 65 72 72  Return after err
1b5c0 6f 72 20 69 66 20 74 72 75 65 20 2a 2f 0a 23 64  or if true */.#d
1b5d0 65 66 69 6e 65 20 4f 50 45 4e 5f 44 42 5f 5a 49  efine OPEN_DB_ZI
1b5e0 50 46 49 4c 45 20 20 20 20 20 30 78 30 30 32 20  PFILE     0x002 
1b5f0 20 20 2f 2a 20 4f 70 65 6e 20 61 73 20 5a 49 50    /* Open as ZIP
1b600 20 69 66 20 6e 61 6d 65 20 6d 61 74 63 68 65 73   if name matches
1b610 20 2a 2e 7a 69 70 20 2a 2f 0a 0a 2f 2a 0a 2a 2a   *.zip */../*.**
1b620 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 64   Make sure the d
1b630 61 74 61 62 61 73 65 20 69 73 20 6f 70 65 6e 2e  atabase is open.
1b640 20 20 49 66 20 69 74 20 69 73 20 6e 6f 74 2c 20    If it is not, 
1b650 74 68 65 6e 20 6f 70 65 6e 20 69 74 2e 20 20 49  then open it.  I
1b660 66 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  f.** the databas
1b670 65 20 66 61 69 6c 73 20 74 6f 20 6f 70 65 6e 2c  e fails to open,
1b680 20 70 72 69 6e 74 20 61 6e 20 65 72 72 6f 72 20   print an error 
1b690 6d 65 73 73 61 67 65 20 61 6e 64 20 65 78 69 74  message and exit
1b6a0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1b6b0 20 6f 70 65 6e 5f 64 62 28 53 68 65 6c 6c 53 74   open_db(ShellSt
1b6c0 61 74 65 20 2a 70 2c 20 69 6e 74 20 6f 70 65 6e  ate *p, int open
1b6d0 46 6c 61 67 73 29 7b 0a 20 20 69 66 28 20 70 2d  Flags){.  if( p-
1b6e0 3e 64 62 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66  >db==0 ){.    if
1b6f0 28 20 70 2d 3e 6f 70 65 6e 4d 6f 64 65 3d 3d 53  ( p->openMode==S
1b700 48 45 4c 4c 5f 4f 50 45 4e 5f 55 4e 53 50 45 43  HELL_OPEN_UNSPEC
1b710 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d   ){.      if( p-
1b720 3e 7a 44 62 46 69 6c 65 6e 61 6d 65 3d 3d 30 20  >zDbFilename==0 
1b730 7c 7c 20 70 2d 3e 7a 44 62 46 69 6c 65 6e 61 6d  || p->zDbFilenam
1b740 65 5b 30 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20  e[0]==0 ){.     
1b750 20 20 20 70 2d 3e 6f 70 65 6e 4d 6f 64 65 20 3d     p->openMode =
1b760 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f 4e 4f 52 4d   SHELL_OPEN_NORM
1b770 41 4c 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  AL;.      }else{
1b780 0a 20 20 20 20 20 20 20 20 70 2d 3e 6f 70 65 6e  .        p->open
1b790 4d 6f 64 65 20 3d 20 28 75 38 29 64 65 64 75 63  Mode = (u8)deduc
1b7a0 65 44 61 74 61 62 61 73 65 54 79 70 65 28 70 2d  eDatabaseType(p-
1b7b0 3e 7a 44 62 46 69 6c 65 6e 61 6d 65 2c 20 0a 20  >zDbFilename, . 
1b7c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b7d0 20 20 20 20 20 20 20 20 20 20 20 20 28 6f 70 65              (ope
1b7e0 6e 46 6c 61 67 73 20 26 20 4f 50 45 4e 5f 44 42  nFlags & OPEN_DB
1b7f0 5f 5a 49 50 46 49 4c 45 29 21 3d 30 29 3b 0a 20  _ZIPFILE)!=0);. 
1b800 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
1b810 20 73 77 69 74 63 68 28 20 70 2d 3e 6f 70 65 6e   switch( p->open
1b820 4d 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 63 61  Mode ){.      ca
1b830 73 65 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f 41 50  se SHELL_OPEN_AP
1b840 50 45 4e 44 56 46 53 3a 20 7b 0a 20 20 20 20 20  PENDVFS: {.     
1b850 20 20 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f     sqlite3_open_
1b860 76 32 28 70 2d 3e 7a 44 62 46 69 6c 65 6e 61 6d  v2(p->zDbFilenam
1b870 65 2c 20 26 70 2d 3e 64 62 2c 20 0a 20 20 20 20  e, &p->db, .    
1b880 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
1b890 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c  EN_READWRITE|SQL
1b8a0 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 2c  ITE_OPEN_CREATE,
1b8b0 20 22 61 70 6e 64 76 66 73 22 29 3b 0a 20 20 20   "apndvfs");.   
1b8c0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1b8d0 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 53    }.      case S
1b8e0 48 45 4c 4c 5f 4f 50 45 4e 5f 5a 49 50 46 49 4c  HELL_OPEN_ZIPFIL
1b8f0 45 3a 20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  E: {.        sql
1b900 69 74 65 33 5f 6f 70 65 6e 28 22 3a 6d 65 6d 6f  ite3_open(":memo
1b910 72 79 3a 22 2c 20 26 70 2d 3e 64 62 29 3b 0a 20  ry:", &p->db);. 
1b920 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
1b930 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65      }.      case
1b940 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f 52 45 41 44   SHELL_OPEN_READ
1b950 4f 4e 4c 59 3a 20 7b 0a 20 20 20 20 20 20 20 20  ONLY: {.        
1b960 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28  sqlite3_open_v2(
1b970 70 2d 3e 7a 44 62 46 69 6c 65 6e 61 6d 65 2c 20  p->zDbFilename, 
1b980 26 70 2d 3e 64 62 2c 20 53 51 4c 49 54 45 5f 4f  &p->db, SQLITE_O
1b990 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 2c 20 30 29  PEN_READONLY, 0)
1b9a0 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
1b9b0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63  .      }.      c
1b9c0 61 73 65 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f 55  ase SHELL_OPEN_U
1b9d0 4e 53 50 45 43 3a 0a 20 20 20 20 20 20 63 61 73  NSPEC:.      cas
1b9e0 65 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f 4e 4f 52  e SHELL_OPEN_NOR
1b9f0 4d 41 4c 3a 20 7b 0a 20 20 20 20 20 20 20 20 73  MAL: {.        s
1ba00 71 6c 69 74 65 33 5f 6f 70 65 6e 28 70 2d 3e 7a  qlite3_open(p->z
1ba10 44 62 46 69 6c 65 6e 61 6d 65 2c 20 26 70 2d 3e  DbFilename, &p->
1ba20 64 62 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  db);.        bre
1ba30 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
1ba40 7d 0a 20 20 20 20 67 6c 6f 62 61 6c 44 62 20 3d  }.    globalDb =
1ba50 20 70 2d 3e 64 62 3b 0a 20 20 20 20 69 66 28 20   p->db;.    if( 
1ba60 70 2d 3e 64 62 3d 3d 30 20 7c 7c 20 53 51 4c 49  p->db==0 || SQLI
1ba70 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 5f 65  TE_OK!=sqlite3_e
1ba80 72 72 63 6f 64 65 28 70 2d 3e 64 62 29 20 29 7b  rrcode(p->db) ){
1ba90 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e  .      utf8_prin
1baa0 74 66 28 73 74 64 65 72 72 2c 22 45 72 72 6f 72  tf(stderr,"Error
1bab0 3a 20 75 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e  : unable to open
1bac0 20 64 61 74 61 62 61 73 65 20 5c 22 25 73 5c 22   database \"%s\"
1bad0 3a 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20  : %s\n",.       
1bae0 20 20 20 70 2d 3e 7a 44 62 46 69 6c 65 6e 61 6d     p->zDbFilenam
1baf0 65 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73  e, sqlite3_errms
1bb00 67 28 70 2d 3e 64 62 29 29 3b 0a 20 20 20 20 20  g(p->db));.     
1bb10 20 69 66 28 20 6f 70 65 6e 46 6c 61 67 73 20 26   if( openFlags &
1bb20 20 4f 50 45 4e 5f 44 42 5f 4b 45 45 50 41 4c 49   OPEN_DB_KEEPALI
1bb30 56 45 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20  VE ) return;.   
1bb40 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20 20 20     exit(1);.    
1bb50 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
1bb60 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e  _OMIT_LOAD_EXTEN
1bb70 53 49 4f 4e 0a 20 20 20 20 73 71 6c 69 74 65 33  SION.    sqlite3
1bb80 5f 65 6e 61 62 6c 65 5f 6c 6f 61 64 5f 65 78 74  _enable_load_ext
1bb90 65 6e 73 69 6f 6e 28 70 2d 3e 64 62 2c 20 31 29  ension(p->db, 1)
1bba0 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 73 71 6c  ;.#endif.    sql
1bbb0 69 74 65 33 5f 66 69 6c 65 69 6f 5f 69 6e 69 74  ite3_fileio_init
1bbc0 28 70 2d 3e 64 62 2c 20 30 2c 20 30 29 3b 0a 20  (p->db, 0, 0);. 
1bbd0 20 20 20 73 71 6c 69 74 65 33 5f 73 68 61 74 68     sqlite3_shath
1bbe0 72 65 65 5f 69 6e 69 74 28 70 2d 3e 64 62 2c 20  ree_init(p->db, 
1bbf0 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  0, 0);.    sqlit
1bc00 65 33 5f 63 6f 6d 70 6c 65 74 69 6f 6e 5f 69 6e  e3_completion_in
1bc10 69 74 28 70 2d 3e 64 62 2c 20 30 2c 20 30 29 3b  it(p->db, 0, 0);
1bc20 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48  .#ifdef SQLITE_H
1bc30 41 56 45 5f 5a 4c 49 42 0a 20 20 20 20 73 71 6c  AVE_ZLIB.    sql
1bc40 69 74 65 33 5f 7a 69 70 66 69 6c 65 5f 69 6e 69  ite3_zipfile_ini
1bc50 74 28 70 2d 3e 64 62 2c 20 30 2c 20 30 29 3b 0a  t(p->db, 0, 0);.
1bc60 20 20 20 20 73 71 6c 69 74 65 33 5f 73 71 6c 61      sqlite3_sqla
1bc70 72 5f 69 6e 69 74 28 70 2d 3e 64 62 2c 20 30 2c  r_init(p->db, 0,
1bc80 20 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20   0);.#endif.    
1bc90 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
1bca0 75 6e 63 74 69 6f 6e 28 70 2d 3e 64 62 2c 20 22  unction(p->db, "
1bcb0 73 68 65 6c 6c 5f 61 64 64 5f 73 63 68 65 6d 61  shell_add_schema
1bcc0 22 2c 20 33 2c 20 53 51 4c 49 54 45 5f 55 54 46  ", 3, SQLITE_UTF
1bcd0 38 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20  8, 0,.          
1bce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bcf0 20 20 73 68 65 6c 6c 41 64 64 53 63 68 65 6d 61    shellAddSchema
1bd00 4e 61 6d 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20  Name, 0, 0);.   
1bd10 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
1bd20 66 75 6e 63 74 69 6f 6e 28 70 2d 3e 64 62 2c 20  function(p->db, 
1bd30 22 73 68 65 6c 6c 5f 6d 6f 64 75 6c 65 5f 73 63  "shell_module_sc
1bd40 68 65 6d 61 22 2c 20 31 2c 20 53 51 4c 49 54 45  hema", 1, SQLITE
1bd50 5f 55 54 46 38 2c 20 30 2c 0a 20 20 20 20 20 20  _UTF8, 0,.      
1bd60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bd70 20 20 20 20 20 20 73 68 65 6c 6c 4d 6f 64 75 6c        shellModul
1bd80 65 53 63 68 65 6d 61 2c 20 30 2c 20 30 29 3b 0a  eSchema, 0, 0);.
1bd90 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61      sqlite3_crea
1bda0 74 65 5f 66 75 6e 63 74 69 6f 6e 28 70 2d 3e 64  te_function(p->d
1bdb0 62 2c 20 22 73 68 65 6c 6c 5f 70 75 74 73 6e 6c  b, "shell_putsnl
1bdc0 22 2c 20 31 2c 20 53 51 4c 49 54 45 5f 55 54 46  ", 1, SQLITE_UTF
1bdd0 38 2c 20 70 2c 0a 20 20 20 20 20 20 20 20 20 20  8, p,.          
1bde0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bdf0 20 20 73 68 65 6c 6c 50 75 74 73 46 75 6e 63 2c    shellPutsFunc,
1be00 20 30 2c 20 30 29 3b 0a 23 69 66 6e 64 65 66 20   0, 0);.#ifndef 
1be10 53 51 4c 49 54 45 5f 4e 4f 48 41 56 45 5f 53 59  SQLITE_NOHAVE_SY
1be20 53 54 45 4d 0a 20 20 20 20 73 71 6c 69 74 65 33  STEM.    sqlite3
1be30 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
1be40 28 70 2d 3e 64 62 2c 20 22 65 64 69 74 22 2c 20  (p->db, "edit", 
1be50 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  1, SQLITE_UTF8, 
1be60 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
1be70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65                 e
1be80 64 69 74 46 75 6e 63 2c 20 30 2c 20 30 29 3b 0a  ditFunc, 0, 0);.
1be90 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61      sqlite3_crea
1bea0 74 65 5f 66 75 6e 63 74 69 6f 6e 28 70 2d 3e 64  te_function(p->d
1beb0 62 2c 20 22 65 64 69 74 22 2c 20 32 2c 20 53 51  b, "edit", 2, SQ
1bec0 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 0a 20 20  LITE_UTF8, 0,.  
1bed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bee0 20 20 20 20 20 20 20 20 20 20 65 64 69 74 46 75            editFu
1bef0 6e 63 2c 20 30 2c 20 30 29 3b 0a 23 65 6e 64 69  nc, 0, 0);.#endi
1bf00 66 0a 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 65  f.    if( p->ope
1bf10 6e 4d 6f 64 65 3d 3d 53 48 45 4c 4c 5f 4f 50 45  nMode==SHELL_OPE
1bf20 4e 5f 5a 49 50 46 49 4c 45 20 29 7b 0a 20 20 20  N_ZIPFILE ){.   
1bf30 20 20 20 63 68 61 72 20 2a 7a 53 71 6c 20 3d 20     char *zSql = 
1bf40 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
1bf50 0a 20 20 20 20 20 20 20 20 20 22 43 52 45 41 54  .         "CREAT
1bf60 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20  E VIRTUAL TABLE 
1bf70 7a 69 70 20 55 53 49 4e 47 20 7a 69 70 66 69 6c  zip USING zipfil
1bf80 65 28 25 51 29 3b 22 2c 20 70 2d 3e 7a 44 62 46  e(%Q);", p->zDbF
1bf90 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ilename);.      
1bfa0 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e  sqlite3_exec(p->
1bfb0 64 62 2c 20 7a 53 71 6c 2c 20 30 2c 20 30 2c 20  db, zSql, 0, 0, 
1bfc0 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
1bfd0 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20  3_free(zSql);.  
1bfe0 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
1bff0 20 41 74 74 65 6d 70 74 20 74 6f 20 63 6c 6f 73   Attempt to clos
1c000 65 20 74 68 65 20 64 61 74 61 62 61 65 73 20 63  e the databaes c
1c010 6f 6e 6e 65 63 74 69 6f 6e 2e 20 20 52 65 70 6f  onnection.  Repo
1c020 72 74 20 65 72 72 6f 72 73 2e 0a 2a 2f 0a 76 6f  rt errors..*/.vo
1c030 69 64 20 63 6c 6f 73 65 5f 64 62 28 73 71 6c 69  id close_db(sqli
1c040 74 65 33 20 2a 64 62 29 7b 0a 20 20 69 6e 74 20  te3 *db){.  int 
1c050 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 6c 6f  rc = sqlite3_clo
1c060 73 65 28 64 62 29 3b 0a 20 20 69 66 28 20 72 63  se(db);.  if( rc
1c070 20 29 7b 0a 20 20 20 20 75 74 66 38 5f 70 72 69   ){.    utf8_pri
1c080 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72  ntf(stderr, "Err
1c090 6f 72 3a 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73  or: sqlite3_clos
1c0a0 65 28 29 20 72 65 74 75 72 6e 73 20 25 64 3a 20  e() returns %d: 
1c0b0 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 72  %s\n",.        r
1c0c0 63 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73  c, sqlite3_errms
1c0d0 67 28 64 62 29 29 3b 0a 20 20 7d 20 0a 7d 0a 0a  g(db));.  } .}..
1c0e0 23 69 66 20 48 41 56 45 5f 52 45 41 44 4c 49 4e  #if HAVE_READLIN
1c0f0 45 20 7c 7c 20 48 41 56 45 5f 45 44 49 54 4c 49  E || HAVE_EDITLI
1c100 4e 45 0a 2f 2a 0a 2a 2a 20 52 65 61 64 6c 69 6e  NE./*.** Readlin
1c110 65 20 63 6f 6d 70 6c 65 74 69 6f 6e 20 63 61 6c  e completion cal
1c120 6c 62 61 63 6b 73 0a 2a 2f 0a 73 74 61 74 69 63  lbacks.*/.static
1c130 20 63 68 61 72 20 2a 72 65 61 64 6c 69 6e 65 5f   char *readline_
1c140 63 6f 6d 70 6c 65 74 69 6f 6e 5f 67 65 6e 65 72  completion_gener
1c150 61 74 6f 72 28 63 6f 6e 73 74 20 63 68 61 72 20  ator(const char 
1c160 2a 74 65 78 74 2c 20 69 6e 74 20 73 74 61 74 65  *text, int state
1c170 29 7b 0a 20 20 73 74 61 74 69 63 20 73 71 6c 69  ){.  static sqli
1c180 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20  te3_stmt *pStmt 
1c190 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a 52 65  = 0;.  char *zRe
1c1a0 74 3b 0a 20 20 69 66 28 20 73 74 61 74 65 3d 3d  t;.  if( state==
1c1b0 30 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  0 ){.    char *z
1c1c0 53 71 6c 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Sql;.    sqlite3
1c1d0 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29  _finalize(pStmt)
1c1e0 3b 0a 20 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c  ;.    zSql = sql
1c1f0 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 53 45  ite3_mprintf("SE
1c200 4c 45 43 54 20 44 49 53 54 49 4e 43 54 20 63 61  LECT DISTINCT ca
1c210 6e 64 69 64 61 74 65 20 43 4f 4c 4c 41 54 45 20  ndidate COLLATE 
1c220 6e 6f 63 61 73 65 22 0a 20 20 20 20 20 20 20 20  nocase".        
1c230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c240 20 20 20 22 20 20 46 52 4f 4d 20 63 6f 6d 70 6c     "  FROM compl
1c250 65 74 69 6f 6e 28 25 51 29 20 4f 52 44 45 52 20  etion(%Q) ORDER 
1c260 42 59 20 31 22 2c 20 74 65 78 74 29 3b 0a 20 20  BY 1", text);.  
1c270 20 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72    sqlite3_prepar
1c280 65 5f 76 32 28 67 6c 6f 62 61 6c 44 62 2c 20 7a  e_v2(globalDb, z
1c290 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c  Sql, -1, &pStmt,
1c2a0 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
1c2b0 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 7d  _free(zSql);.  }
1c2c0 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73  .  if( sqlite3_s
1c2d0 74 65 70 28 70 53 74 6d 74 29 3d 3d 53 51 4c 49  tep(pStmt)==SQLI
1c2e0 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 7a 52  TE_ROW ){.    zR
1c2f0 65 74 20 3d 20 73 74 72 64 75 70 28 28 63 6f 6e  et = strdup((con
1c300 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33  st char*)sqlite3
1c310 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74  _column_text(pSt
1c320 6d 74 2c 20 30 29 29 3b 0a 20 20 7d 65 6c 73 65  mt, 0));.  }else
1c330 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69  {.    sqlite3_fi
1c340 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20  nalize(pStmt);. 
1c350 20 20 20 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20     pStmt = 0;.  
1c360 20 20 7a 52 65 74 20 3d 20 30 3b 0a 20 20 7d 0a    zRet = 0;.  }.
1c370 20 20 72 65 74 75 72 6e 20 7a 52 65 74 3b 0a 7d    return zRet;.}
1c380 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 2a 72  .static char **r
1c390 65 61 64 6c 69 6e 65 5f 63 6f 6d 70 6c 65 74 69  eadline_completi
1c3a0 6f 6e 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  on(const char *z
1c3b0 54 65 78 74 2c 20 69 6e 74 20 69 53 74 61 72 74  Text, int iStart
1c3c0 2c 20 69 6e 74 20 69 45 6e 64 29 7b 0a 20 20 72  , int iEnd){.  r
1c3d0 6c 5f 61 74 74 65 6d 70 74 65 64 5f 63 6f 6d 70  l_attempted_comp
1c3e0 6c 65 74 69 6f 6e 5f 6f 76 65 72 20 3d 20 31 3b  letion_over = 1;
1c3f0 0a 20 20 72 65 74 75 72 6e 20 72 6c 5f 63 6f 6d  .  return rl_com
1c400 70 6c 65 74 69 6f 6e 5f 6d 61 74 63 68 65 73 28  pletion_matches(
1c410 7a 54 65 78 74 2c 20 72 65 61 64 6c 69 6e 65 5f  zText, readline_
1c420 63 6f 6d 70 6c 65 74 69 6f 6e 5f 67 65 6e 65 72  completion_gener
1c430 61 74 6f 72 29 3b 0a 7d 0a 0a 23 65 6c 69 66 20  ator);.}..#elif 
1c440 48 41 56 45 5f 4c 49 4e 45 4e 4f 49 53 45 0a 2f  HAVE_LINENOISE./
1c450 2a 0a 2a 2a 20 4c 69 6e 65 6e 6f 69 73 65 20 63  *.** Linenoise c
1c460 6f 6d 70 6c 65 74 69 6f 6e 20 63 61 6c 6c 62 61  ompletion callba
1c470 63 6b 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  ck.*/.static voi
1c480 64 20 6c 69 6e 65 6e 6f 69 73 65 5f 63 6f 6d 70  d linenoise_comp
1c490 6c 65 74 69 6f 6e 28 63 6f 6e 73 74 20 63 68 61  letion(const cha
1c4a0 72 20 2a 7a 4c 69 6e 65 2c 20 6c 69 6e 65 6e 6f  r *zLine, lineno
1c4b0 69 73 65 43 6f 6d 70 6c 65 74 69 6f 6e 73 20 2a  iseCompletions *
1c4c0 6c 63 29 7b 0a 20 20 69 6e 74 20 6e 4c 69 6e 65  lc){.  int nLine
1c4d0 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a 4c 69 6e   = strlen30(zLin
1c4e0 65 29 3b 0a 20 20 69 6e 74 20 69 2c 20 69 53 74  e);.  int i, iSt
1c4f0 61 72 74 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73  art;.  sqlite3_s
1c500 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a  tmt *pStmt = 0;.
1c510 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20    char *zSql;.  
1c520 63 68 61 72 20 7a 42 75 66 5b 31 30 30 30 5d 3b  char zBuf[1000];
1c530 0a 0a 20 20 69 66 28 20 6e 4c 69 6e 65 3e 73 69  ..  if( nLine>si
1c540 7a 65 6f 66 28 7a 42 75 66 29 2d 33 30 20 29 20  zeof(zBuf)-30 ) 
1c550 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 7a 4c  return;.  if( zL
1c560 69 6e 65 5b 30 5d 3d 3d 27 2e 27 20 7c 7c 20 7a  ine[0]=='.' || z
1c570 4c 69 6e 65 5b 30 5d 3d 3d 27 23 27 29 20 72 65  Line[0]=='#') re
1c580 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 6e 4c  turn;.  for(i=nL
1c590 69 6e 65 2d 31 3b 20 69 3e 3d 30 20 26 26 20 28  ine-1; i>=0 && (
1c5a0 69 73 61 6c 6e 75 6d 28 7a 4c 69 6e 65 5b 69 5d  isalnum(zLine[i]
1c5b0 29 20 7c 7c 20 7a 4c 69 6e 65 5b 69 5d 3d 3d 27  ) || zLine[i]=='
1c5c0 5f 27 29 3b 20 69 2d 2d 29 7b 7d 0a 20 20 69 66  _'); i--){}.  if
1c5d0 28 20 69 3d 3d 6e 4c 69 6e 65 2d 31 20 29 20 72  ( i==nLine-1 ) r
1c5e0 65 74 75 72 6e 3b 0a 20 20 69 53 74 61 72 74 20  eturn;.  iStart 
1c5f0 3d 20 69 2b 31 3b 0a 20 20 6d 65 6d 63 70 79 28  = i+1;.  memcpy(
1c600 7a 42 75 66 2c 20 7a 4c 69 6e 65 2c 20 69 53 74  zBuf, zLine, iSt
1c610 61 72 74 29 3b 0a 20 20 7a 53 71 6c 20 3d 20 73  art);.  zSql = s
1c620 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
1c630 53 45 4c 45 43 54 20 44 49 53 54 49 4e 43 54 20  SELECT DISTINCT 
1c640 63 61 6e 64 69 64 61 74 65 20 43 4f 4c 4c 41 54  candidate COLLAT
1c650 45 20 6e 6f 63 61 73 65 22 0a 20 20 20 20 20 20  E nocase".      
1c660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c670 20 20 20 22 20 20 46 52 4f 4d 20 63 6f 6d 70 6c     "  FROM compl
1c680 65 74 69 6f 6e 28 25 51 2c 25 51 29 20 4f 52 44  etion(%Q,%Q) ORD
1c690 45 52 20 42 59 20 31 22 2c 0a 20 20 20 20 20 20  ER BY 1",.      
1c6a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c6b0 20 20 20 26 7a 4c 69 6e 65 5b 69 53 74 61 72 74     &zLine[iStart
1c6c0 5d 2c 20 7a 4c 69 6e 65 29 3b 0a 20 20 73 71 6c  ], zLine);.  sql
1c6d0 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28  ite3_prepare_v2(
1c6e0 67 6c 6f 62 61 6c 44 62 2c 20 7a 53 71 6c 2c 20  globalDb, zSql, 
1c6f0 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a  -1, &pStmt, 0);.
1c700 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
1c710 53 71 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  Sql);.  sqlite3_
1c720 65 78 65 63 28 67 6c 6f 62 61 6c 44 62 2c 20 22  exec(globalDb, "
1c730 50 52 41 47 4d 41 20 70 61 67 65 5f 63 6f 75 6e  PRAGMA page_coun
1c740 74 22 2c 20 30 2c 20 30 2c 20 30 29 3b 20 2f 2a  t", 0, 0, 0); /*
1c750 20 4c 6f 61 64 20 74 68 65 20 73 63 68 65 6d 61   Load the schema
1c760 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 73 71 6c   */.  while( sql
1c770 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29  ite3_step(pStmt)
1c780 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a  ==SQLITE_ROW ){.
1c790 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
1c7a0 7a 43 6f 6d 70 6c 65 74 69 6f 6e 20 3d 20 28 63  zCompletion = (c
1c7b0 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74  onst char*)sqlit
1c7c0 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70  e3_column_text(p
1c7d0 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 69 6e  Stmt, 0);.    in
1c7e0 74 20 6e 43 6f 6d 70 6c 65 74 69 6f 6e 20 3d 20  t nCompletion = 
1c7f0 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62  sqlite3_column_b
1c800 79 74 65 73 28 70 53 74 6d 74 2c 20 30 29 3b 0a  ytes(pStmt, 0);.
1c810 20 20 20 20 69 66 28 20 69 53 74 61 72 74 2b 6e      if( iStart+n
1c820 43 6f 6d 70 6c 65 74 69 6f 6e 20 3c 20 73 69 7a  Completion < siz
1c830 65 6f 66 28 7a 42 75 66 29 2d 31 20 29 7b 0a 20  eof(zBuf)-1 ){. 
1c840 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 42 75 66       memcpy(zBuf
1c850 2b 69 53 74 61 72 74 2c 20 7a 43 6f 6d 70 6c 65  +iStart, zComple
1c860 74 69 6f 6e 2c 20 6e 43 6f 6d 70 6c 65 74 69 6f  tion, nCompletio
1c870 6e 2b 31 29 3b 0a 20 20 20 20 20 20 6c 69 6e 65  n+1);.      line
1c880 6e 6f 69 73 65 41 64 64 43 6f 6d 70 6c 65 74 69  noiseAddCompleti
1c890 6f 6e 28 6c 63 2c 20 7a 42 75 66 29 3b 0a 20 20  on(lc, zBuf);.  
1c8a0 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
1c8b0 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74  3_finalize(pStmt
1c8c0 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  );.}.#endif../*.
1c8d0 2a 2a 20 44 6f 20 43 2d 6c 61 6e 67 75 61 67 65  ** Do C-language
1c8e0 20 73 74 79 6c 65 20 64 65 71 75 6f 74 69 6e 67   style dequoting
1c8f0 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 5c 61 20 20 20  ..**.**    \a   
1c900 20 2d 3e 20 61 6c 61 72 6d 0a 2a 2a 20 20 20 20   -> alarm.**    
1c910 5c 62 20 20 20 20 2d 3e 20 62 61 63 6b 73 70 61  \b    -> backspa
1c920 63 65 0a 2a 2a 20 20 20 20 5c 74 20 20 20 20 2d  ce.**    \t    -
1c930 3e 20 74 61 62 0a 2a 2a 20 20 20 20 5c 6e 20 20  > tab.**    \n  
1c940 20 20 2d 3e 20 6e 65 77 6c 69 6e 65 0a 2a 2a 20    -> newline.** 
1c950 20 20 20 5c 76 20 20 20 20 2d 3e 20 76 65 72 74     \v    -> vert
1c960 69 63 61 6c 20 74 61 62 0a 2a 2a 20 20 20 20 5c  ical tab.**    \
1c970 66 20 20 20 20 2d 3e 20 66 6f 72 6d 20 66 65 65  f    -> form fee
1c980 64 0a 2a 2a 20 20 20 20 5c 72 20 20 20 20 2d 3e  d.**    \r    ->
1c990 20 63 61 72 72 69 61 67 65 20 72 65 74 75 72 6e   carriage return
1c9a0 0a 2a 2a 20 20 20 20 5c 73 20 20 20 20 2d 3e 20  .**    \s    -> 
1c9b0 73 70 61 63 65 0a 2a 2a 20 20 20 20 5c 22 20 20  space.**    \"  
1c9c0 20 20 2d 3e 20 22 0a 2a 2a 20 20 20 20 5c 27 20    -> ".**    \' 
1c9d0 20 20 20 2d 3e 20 27 0a 2a 2a 20 20 20 20 5c 5c     -> '.**    \\
1c9e0 20 20 20 20 2d 3e 20 62 61 63 6b 73 6c 61 73 68      -> backslash
1c9f0 0a 2a 2a 20 20 20 20 5c 4e 4e 4e 20 20 2d 3e 20  .**    \NNN  -> 
1ca00 61 73 63 69 69 20 63 68 61 72 61 63 74 65 72 20  ascii character 
1ca10 4e 4e 4e 20 69 6e 20 6f 63 74 61 6c 0a 2a 2f 0a  NNN in octal.*/.
1ca20 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 73 6f  static void reso
1ca30 6c 76 65 5f 62 61 63 6b 73 6c 61 73 68 65 73 28  lve_backslashes(
1ca40 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69 6e 74 20  char *z){.  int 
1ca50 69 2c 20 6a 3b 0a 20 20 63 68 61 72 20 63 3b 0a  i, j;.  char c;.
1ca60 20 20 77 68 69 6c 65 28 20 2a 7a 20 26 26 20 2a    while( *z && *
1ca70 7a 21 3d 27 5c 5c 27 20 29 20 7a 2b 2b 3b 0a 20  z!='\\' ) z++;. 
1ca80 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 28 63 20 3d   for(i=j=0; (c =
1ca90 20 7a 5b 69 5d 29 21 3d 30 3b 20 69 2b 2b 2c 20   z[i])!=0; i++, 
1caa0 6a 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 63 3d  j++){.    if( c=
1cab0 3d 27 5c 5c 27 20 26 26 20 7a 5b 69 2b 31 5d 21  ='\\' && z[i+1]!
1cac0 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 20 3d 20  =0 ){.      c = 
1cad0 7a 5b 2b 2b 69 5d 3b 0a 20 20 20 20 20 20 69 66  z[++i];.      if
1cae0 28 20 63 3d 3d 27 61 27 20 29 7b 0a 20 20 20 20  ( c=='a' ){.    
1caf0 20 20 20 20 63 20 3d 20 27 5c 61 27 3b 0a 20 20      c = '\a';.  
1cb00 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d      }else if( c=
1cb10 3d 27 62 27 20 29 7b 0a 20 20 20 20 20 20 20 20  ='b' ){.        
1cb20 63 20 3d 20 27 5c 62 27 3b 0a 20 20 20 20 20 20  c = '\b';.      
1cb30 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 74 27  }else if( c=='t'
1cb40 20 29 7b 0a 20 20 20 20 20 20 20 20 63 20 3d 20   ){.        c = 
1cb50 27 5c 74 27 3b 0a 20 20 20 20 20 20 7d 65 6c 73  '\t';.      }els
1cb60 65 20 69 66 28 20 63 3d 3d 27 6e 27 20 29 7b 0a  e if( c=='n' ){.
1cb70 20 20 20 20 20 20 20 20 63 20 3d 20 27 5c 6e 27          c = '\n'
1cb80 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
1cb90 28 20 63 3d 3d 27 76 27 20 29 7b 0a 20 20 20 20  ( c=='v' ){.    
1cba0 20 20 20 20 63 20 3d 20 27 5c 76 27 3b 0a 20 20      c = '\v';.  
1cbb0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d      }else if( c=
1cbc0 3d 27 66 27 20 29 7b 0a 20 20 20 20 20 20 20 20  ='f' ){.        
1cbd0 63 20 3d 20 27 5c 66 27 3b 0a 20 20 20 20 20 20  c = '\f';.      
1cbe0 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 72 27  }else if( c=='r'
1cbf0 20 29 7b 0a 20 20 20 20 20 20 20 20 63 20 3d 20   ){.        c = 
1cc00 27 5c 72 27 3b 0a 20 20 20 20 20 20 7d 65 6c 73  '\r';.      }els
1cc10 65 20 69 66 28 20 63 3d 3d 27 22 27 20 29 7b 0a  e if( c=='"' ){.
1cc20 20 20 20 20 20 20 20 20 63 20 3d 20 27 22 27 3b          c = '"';
1cc30 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
1cc40 20 63 3d 3d 27 5c 27 27 20 29 7b 0a 20 20 20 20   c=='\'' ){.    
1cc50 20 20 20 20 63 20 3d 20 27 5c 27 27 3b 0a 20 20      c = '\'';.  
1cc60 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d      }else if( c=
1cc70 3d 27 5c 5c 27 20 29 7b 0a 20 20 20 20 20 20 20  ='\\' ){.       
1cc80 20 63 20 3d 20 27 5c 5c 27 3b 0a 20 20 20 20 20   c = '\\';.     
1cc90 20 7d 65 6c 73 65 20 69 66 28 20 63 3e 3d 27 30   }else if( c>='0
1cca0 27 20 26 26 20 63 3c 3d 27 37 27 20 29 7b 0a 20  ' && c<='7' ){. 
1ccb0 20 20 20 20 20 20 20 63 20 2d 3d 20 27 30 27 3b         c -= '0';
1ccc0 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 5b 69  .        if( z[i
1ccd0 2b 31 5d 3e 3d 27 30 27 20 26 26 20 7a 5b 69 2b  +1]>='0' && z[i+
1cce0 31 5d 3c 3d 27 37 27 20 29 7b 0a 20 20 20 20 20  1]<='7' ){.     
1ccf0 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20       i++;.      
1cd00 20 20 20 20 63 20 3d 20 28 63 3c 3c 33 29 20 2b      c = (c<<3) +
1cd10 20 7a 5b 69 5d 20 2d 20 27 30 27 3b 0a 20 20 20   z[i] - '0';.   
1cd20 20 20 20 20 20 20 20 69 66 28 20 7a 5b 69 2b 31         if( z[i+1
1cd30 5d 3e 3d 27 30 27 20 26 26 20 7a 5b 69 2b 31 5d  ]>='0' && z[i+1]
1cd40 3c 3d 27 37 27 20 29 7b 0a 20 20 20 20 20 20 20  <='7' ){.       
1cd50 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20       i++;.      
1cd60 20 20 20 20 20 20 63 20 3d 20 28 63 3c 3c 33 29        c = (c<<3)
1cd70 20 2b 20 7a 5b 69 5d 20 2d 20 27 30 27 3b 0a 20   + z[i] - '0';. 
1cd80 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1cd90 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
1cda0 20 7d 0a 20 20 20 20 7a 5b 6a 5d 20 3d 20 63 3b   }.    z[j] = c;
1cdb0 0a 20 20 7d 0a 20 20 69 66 28 20 6a 3c 69 20 29  .  }.  if( j<i )
1cdc0 20 7a 5b 6a 5d 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a   z[j] = 0;.}../*
1cdd0 0a 2a 2a 20 49 6e 74 65 72 70 72 65 74 20 7a 41  .** Interpret zA
1cde0 72 67 20 61 73 20 65 69 74 68 65 72 20 61 6e 20  rg as either an 
1cdf0 69 6e 74 65 67 65 72 20 6f 72 20 61 20 62 6f 6f  integer or a boo
1ce00 6c 65 61 6e 20 76 61 6c 75 65 2e 20 20 52 65 74  lean value.  Ret
1ce10 75 72 6e 20 31 20 6f 72 20 30 0a 2a 2a 20 66 6f  urn 1 or 0.** fo
1ce20 72 20 54 52 55 45 20 61 6e 64 20 46 41 4c 53 45  r TRUE and FALSE
1ce30 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e  .  Return the in
1ce40 74 65 67 65 72 20 76 61 6c 75 65 20 69 66 20 61  teger value if a
1ce50 70 70 72 6f 70 72 69 61 74 65 2e 0a 2a 2f 0a 73  ppropriate..*/.s
1ce60 74 61 74 69 63 20 69 6e 74 20 62 6f 6f 6c 65 61  tatic int boolea
1ce70 6e 56 61 6c 75 65 28 63 6f 6e 73 74 20 63 68 61  nValue(const cha
1ce80 72 20 2a 7a 41 72 67 29 7b 0a 20 20 69 6e 74 20  r *zArg){.  int 
1ce90 69 3b 0a 20 20 69 66 28 20 7a 41 72 67 5b 30 5d  i;.  if( zArg[0]
1cea0 3d 3d 27 30 27 20 26 26 20 7a 41 72 67 5b 31 5d  =='0' && zArg[1]
1ceb0 3d 3d 27 78 27 20 29 7b 0a 20 20 20 20 66 6f 72  =='x' ){.    for
1cec0 28 69 3d 32 3b 20 68 65 78 44 69 67 69 74 56 61  (i=2; hexDigitVa
1ced0 6c 75 65 28 7a 41 72 67 5b 69 5d 29 3e 3d 30 3b  lue(zArg[i])>=0;
1cee0 20 69 2b 2b 29 7b 7d 0a 20 20 7d 65 6c 73 65 7b   i++){}.  }else{
1cef0 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 7a 41  .    for(i=0; zA
1cf00 72 67 5b 69 5d 3e 3d 27 30 27 20 26 26 20 7a 41  rg[i]>='0' && zA
1cf10 72 67 5b 69 5d 3c 3d 27 39 27 3b 20 69 2b 2b 29  rg[i]<='9'; i++)
1cf20 7b 7d 0a 20 20 7d 0a 20 20 69 66 28 20 69 3e 30  {}.  }.  if( i>0
1cf30 20 26 26 20 7a 41 72 67 5b 69 5d 3d 3d 30 20 29   && zArg[i]==0 )
1cf40 20 72 65 74 75 72 6e 20 28 69 6e 74 29 28 69 6e   return (int)(in
1cf50 74 65 67 65 72 56 61 6c 75 65 28 7a 41 72 67 29  tegerValue(zArg)
1cf60 20 26 20 30 78 66 66 66 66 66 66 66 66 29 3b 0a   & 0xffffffff);.
1cf70 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74    if( sqlite3_st
1cf80 72 69 63 6d 70 28 7a 41 72 67 2c 20 22 6f 6e 22  ricmp(zArg, "on"
1cf90 29 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 5f  )==0 || sqlite3_
1cfa0 73 74 72 69 63 6d 70 28 7a 41 72 67 2c 22 79 65  stricmp(zArg,"ye
1cfb0 73 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  s")==0 ){.    re
1cfc0 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66  turn 1;.  }.  if
1cfd0 28 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d  ( sqlite3_stricm
1cfe0 70 28 7a 41 72 67 2c 20 22 6f 66 66 22 29 3d 3d  p(zArg, "off")==
1cff0 30 20 7c 7c 20 73 71 6c 69 74 65 33 5f 73 74 72  0 || sqlite3_str
1d000 69 63 6d 70 28 7a 41 72 67 2c 22 6e 6f 22 29 3d  icmp(zArg,"no")=
1d010 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
1d020 20 30 3b 0a 20 20 7d 0a 20 20 75 74 66 38 5f 70   0;.  }.  utf8_p
1d030 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45  rintf(stderr, "E
1d040 52 52 4f 52 3a 20 4e 6f 74 20 61 20 62 6f 6f 6c  RROR: Not a bool
1d050 65 61 6e 20 76 61 6c 75 65 3a 20 5c 22 25 73 5c  ean value: \"%s\
1d060 22 2e 20 41 73 73 75 6d 69 6e 67 20 5c 22 6e 6f  ". Assuming \"no
1d070 5c 22 2e 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  \".\n",.        
1d080 20 20 7a 41 72 67 29 3b 0a 20 20 72 65 74 75 72    zArg);.  retur
1d090 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  n 0;.}../*.** Se
1d0a0 74 20 6f 72 20 63 6c 65 61 72 20 61 20 73 68 65  t or clear a she
1d0b0 6c 6c 20 66 6c 61 67 20 61 63 63 6f 72 64 69 6e  ll flag accordin
1d0c0 67 20 74 6f 20 61 20 62 6f 6f 6c 65 61 6e 20 76  g to a boolean v
1d0d0 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  alue..*/.static 
1d0e0 76 6f 69 64 20 73 65 74 4f 72 43 6c 65 61 72 46  void setOrClearF
1d0f0 6c 61 67 28 53 68 65 6c 6c 53 74 61 74 65 20 2a  lag(ShellState *
1d100 70 2c 20 75 6e 73 69 67 6e 65 64 20 6d 46 6c 61  p, unsigned mFla
1d110 67 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  g, const char *z
1d120 41 72 67 29 7b 0a 20 20 69 66 28 20 62 6f 6f 6c  Arg){.  if( bool
1d130 65 61 6e 56 61 6c 75 65 28 7a 41 72 67 29 20 29  eanValue(zArg) )
1d140 7b 0a 20 20 20 20 53 68 65 6c 6c 53 65 74 46 6c  {.    ShellSetFl
1d150 61 67 28 70 2c 20 6d 46 6c 61 67 29 3b 0a 20 20  ag(p, mFlag);.  
1d160 7d 65 6c 73 65 7b 0a 20 20 20 20 53 68 65 6c 6c  }else{.    Shell
1d170 43 6c 65 61 72 46 6c 61 67 28 70 2c 20 6d 46 6c  ClearFlag(p, mFl
1d180 61 67 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ag);.  }.}../*.*
1d190 2a 20 43 6c 6f 73 65 20 61 6e 20 6f 75 74 70 75  * Close an outpu
1d1a0 74 20 66 69 6c 65 2c 20 61 73 73 75 6d 69 6e 67  t file, assuming
1d1b0 20 69 74 20 69 73 20 6e 6f 74 20 73 74 64 65 72   it is not stder
1d1c0 72 20 6f 72 20 73 74 64 6f 75 74 0a 2a 2f 0a 73  r or stdout.*/.s
1d1d0 74 61 74 69 63 20 76 6f 69 64 20 6f 75 74 70 75  tatic void outpu
1d1e0 74 5f 66 69 6c 65 5f 63 6c 6f 73 65 28 46 49 4c  t_file_close(FIL
1d1f0 45 20 2a 66 29 7b 0a 20 20 69 66 28 20 66 20 26  E *f){.  if( f &
1d200 26 20 66 21 3d 73 74 64 6f 75 74 20 26 26 20 66  & f!=stdout && f
1d210 21 3d 73 74 64 65 72 72 20 29 20 66 63 6c 6f 73  !=stderr ) fclos
1d220 65 28 66 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  e(f);.}../*.** T
1d230 72 79 20 74 6f 20 6f 70 65 6e 20 61 6e 20 6f 75  ry to open an ou
1d240 74 70 75 74 20 66 69 6c 65 2e 20 20 20 54 68 65  tput file.   The
1d250 20 6e 61 6d 65 73 20 22 73 74 64 6f 75 74 22 20   names "stdout" 
1d260 61 6e 64 20 22 73 74 64 65 72 72 22 20 61 72 65  and "stderr" are
1d270 0a 2a 2a 20 72 65 63 6f 67 6e 69 7a 65 64 20 61  .** recognized a
1d280 6e 64 20 64 6f 20 74 68 65 20 72 69 67 68 74 20  nd do the right 
1d290 74 68 69 6e 67 2e 20 20 4e 55 4c 4c 20 69 73 20  thing.  NULL is 
1d2a0 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65 20  returned if the 
1d2b0 6f 75 74 70 75 74 0a 2a 2a 20 66 69 6c 65 6e 61  output.** filena
1d2c0 6d 65 20 69 73 20 22 6f 66 66 22 2e 0a 2a 2f 0a  me is "off"..*/.
1d2d0 73 74 61 74 69 63 20 46 49 4c 45 20 2a 6f 75 74  static FILE *out
1d2e0 70 75 74 5f 66 69 6c 65 5f 6f 70 65 6e 28 63 6f  put_file_open(co
1d2f0 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 2c  nst char *zFile,
1d300 20 69 6e 74 20 62 54 65 78 74 4d 6f 64 65 29 7b   int bTextMode){
1d310 0a 20 20 46 49 4c 45 20 2a 66 3b 0a 20 20 69 66  .  FILE *f;.  if
1d320 28 20 73 74 72 63 6d 70 28 7a 46 69 6c 65 2c 22  ( strcmp(zFile,"
1d330 73 74 64 6f 75 74 22 29 3d 3d 30 20 29 7b 0a 20  stdout")==0 ){. 
1d340 20 20 20 66 20 3d 20 73 74 64 6f 75 74 3b 0a 20     f = stdout;. 
1d350 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d   }else if( strcm
1d360 70 28 7a 46 69 6c 65 2c 20 22 73 74 64 65 72 72  p(zFile, "stderr
1d370 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 66 20 3d  ")==0 ){.    f =
1d380 20 73 74 64 65 72 72 3b 0a 20 20 7d 65 6c 73 65   stderr;.  }else
1d390 20 69 66 28 20 73 74 72 63 6d 70 28 7a 46 69 6c   if( strcmp(zFil
1d3a0 65 2c 20 22 6f 66 66 22 29 3d 3d 30 20 29 7b 0a  e, "off")==0 ){.
1d3b0 20 20 20 20 66 20 3d 20 30 3b 0a 20 20 7d 65 6c      f = 0;.  }el
1d3c0 73 65 7b 0a 20 20 20 20 66 20 3d 20 66 6f 70 65  se{.    f = fope
1d3d0 6e 28 7a 46 69 6c 65 2c 20 62 54 65 78 74 4d 6f  n(zFile, bTextMo
1d3e0 64 65 20 3f 20 22 77 22 20 3a 20 22 77 62 22 29  de ? "w" : "wb")
1d3f0 3b 0a 20 20 20 20 69 66 28 20 66 3d 3d 30 20 29  ;.    if( f==0 )
1d400 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69  {.      utf8_pri
1d410 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72  ntf(stderr, "Err
1d420 6f 72 3a 20 63 61 6e 6e 6f 74 20 6f 70 65 6e 20  or: cannot open 
1d430 5c 22 25 73 5c 22 5c 6e 22 2c 20 7a 46 69 6c 65  \"%s\"\n", zFile
1d440 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
1d450 65 74 75 72 6e 20 66 3b 0a 7d 0a 0a 23 69 66 20  eturn f;.}..#if 
1d460 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
1d470 4f 4d 49 54 5f 54 52 41 43 45 29 20 26 26 20 21  OMIT_TRACE) && !
1d480 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
1d490 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49  MIT_FLOATING_POI
1d4a0 4e 54 29 0a 2f 2a 0a 2a 2a 20 41 20 72 6f 75 74  NT)./*.** A rout
1d4b0 69 6e 65 20 66 6f 72 20 68 61 6e 64 6c 69 6e 67  ine for handling
1d4c0 20 6f 75 74 70 75 74 20 66 72 6f 6d 20 73 71 6c   output from sql
1d4d0 69 74 65 33 5f 74 72 61 63 65 28 29 2e 0a 2a 2f  ite3_trace()..*/
1d4e0 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 5f  .static int sql_
1d4f0 74 72 61 63 65 5f 63 61 6c 6c 62 61 63 6b 28 0a  trace_callback(.
1d500 20 20 75 6e 73 69 67 6e 65 64 20 6d 54 79 70 65    unsigned mType
1d510 2c 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 2c 0a  ,.  void *pArg,.
1d520 20 20 76 6f 69 64 20 2a 70 50 2c 0a 20 20 76 6f    void *pP,.  vo
1d530 69 64 20 2a 70 58 0a 29 7b 0a 20 20 46 49 4c 45  id *pX.){.  FILE
1d540 20 2a 66 20 3d 20 28 46 49 4c 45 2a 29 70 41 72   *f = (FILE*)pAr
1d550 67 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  g;.  UNUSED_PARA
1d560 4d 45 54 45 52 28 6d 54 79 70 65 29 3b 0a 20 20  METER(mType);.  
1d570 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
1d580 28 70 50 29 3b 0a 20 20 69 66 28 20 66 20 29 7b  (pP);.  if( f ){
1d590 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
1d5a0 2a 7a 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  *z = (const char
1d5b0 2a 29 70 58 3b 0a 20 20 20 20 69 6e 74 20 69 20  *)pX;.    int i 
1d5c0 3d 20 73 74 72 6c 65 6e 33 30 28 7a 29 3b 0a 20  = strlen30(z);. 
1d5d0 20 20 20 77 68 69 6c 65 28 20 69 3e 30 20 26 26     while( i>0 &&
1d5e0 20 7a 5b 69 2d 31 5d 3d 3d 27 3b 27 20 29 7b 20   z[i-1]==';' ){ 
1d5f0 69 2d 2d 3b 20 7d 0a 20 20 20 20 75 74 66 38 5f  i--; }.    utf8_
1d600 70 72 69 6e 74 66 28 66 2c 20 22 25 2e 2a 73 3b  printf(f, "%.*s;
1d610 5c 6e 22 2c 20 69 2c 20 7a 29 3b 0a 20 20 7d 0a  \n", i, z);.  }.
1d620 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65    return 0;.}.#e
1d630 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 20 6e 6f  ndif../*.** A no
1d640 2d 6f 70 20 72 6f 75 74 69 6e 65 20 74 68 61 74  -op routine that
1d650 20 72 75 6e 73 20 77 69 74 68 20 74 68 65 20 22   runs with the "
1d660 2e 62 72 65 61 6b 70 6f 69 6e 74 22 20 64 6f 63  .breakpoint" doc
1d670 2d 63 6f 6d 6d 61 6e 64 2e 20 20 54 68 69 73 20  -command.  This 
1d680 69 73 0a 2a 2a 20 61 20 75 73 65 66 75 6c 20 73  is.** a useful s
1d690 70 6f 74 20 74 6f 20 73 65 74 20 61 20 64 65 62  pot to set a deb
1d6a0 75 67 67 65 72 20 62 72 65 61 6b 70 6f 69 6e 74  ugger breakpoint
1d6b0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1d6c0 20 74 65 73 74 5f 62 72 65 61 6b 70 6f 69 6e 74   test_breakpoint
1d6d0 28 76 6f 69 64 29 7b 0a 20 20 73 74 61 74 69 63  (void){.  static
1d6e0 20 69 6e 74 20 6e 43 61 6c 6c 20 3d 20 30 3b 0a   int nCall = 0;.
1d6f0 20 20 6e 43 61 6c 6c 2b 2b 3b 0a 7d 0a 0a 2f 2a    nCall++;.}../*
1d700 0a 2a 2a 20 41 6e 20 6f 62 6a 65 63 74 20 75 73  .** An object us
1d710 65 64 20 74 6f 20 72 65 61 64 20 61 20 43 53 56  ed to read a CSV
1d720 20 61 6e 64 20 6f 74 68 65 72 20 66 69 6c 65 73   and other files
1d730 20 66 6f 72 20 69 6d 70 6f 72 74 2e 0a 2a 2f 0a   for import..*/.
1d740 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 49  typedef struct I
1d750 6d 70 6f 72 74 43 74 78 20 49 6d 70 6f 72 74 43  mportCtx ImportC
1d760 74 78 3b 0a 73 74 72 75 63 74 20 49 6d 70 6f 72  tx;.struct Impor
1d770 74 43 74 78 20 7b 0a 20 20 63 6f 6e 73 74 20 63  tCtx {.  const c
1d780 68 61 72 20 2a 7a 46 69 6c 65 3b 20 20 2f 2a 20  har *zFile;  /* 
1d790 4e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e 70 75  Name of the inpu
1d7a0 74 20 66 69 6c 65 20 2a 2f 0a 20 20 46 49 4c 45  t file */.  FILE
1d7b0 20 2a 69 6e 3b 20 20 20 20 20 20 20 20 20 20 20   *in;           
1d7c0 2f 2a 20 52 65 61 64 20 74 68 65 20 43 53 56 20  /* Read the CSV 
1d7d0 74 65 78 74 20 66 72 6f 6d 20 74 68 69 73 20 69  text from this i
1d7e0 6e 70 75 74 20 73 74 72 65 61 6d 20 2a 2f 0a 20  nput stream */. 
1d7f0 20 63 68 61 72 20 2a 7a 3b 20 20 20 20 20 20 20   char *z;       
1d800 20 20 20 20 20 2f 2a 20 41 63 63 75 6d 75 6c 61       /* Accumula
1d810 74 65 64 20 74 65 78 74 20 66 6f 72 20 61 20 66  ted text for a f
1d820 69 65 6c 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b  ield */.  int n;
1d830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1d840 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
1d850 20 69 6e 20 7a 20 2a 2f 0a 20 20 69 6e 74 20 6e   in z */.  int n
1d860 41 6c 6c 6f 63 3b 20 20 20 20 20 20 20 20 20 2f  Alloc;         /
1d870 2a 20 53 70 61 63 65 20 61 6c 6c 6f 63 61 74 65  * Space allocate
1d880 64 20 66 6f 72 20 7a 5b 5d 20 2a 2f 0a 20 20 69  d for z[] */.  i
1d890 6e 74 20 6e 4c 69 6e 65 3b 20 20 20 20 20 20 20  nt nLine;       
1d8a0 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 6c 69     /* Current li
1d8b0 6e 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69  ne number */.  i
1d8c0 6e 74 20 62 4e 6f 74 46 69 72 73 74 3b 20 20 20  nt bNotFirst;   
1d8d0 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6f 6e     /* True if on
1d8e0 65 20 6f 72 20 6d 6f 72 65 20 62 79 74 65 73 20  e or more bytes 
1d8f0 61 6c 72 65 61 64 79 20 72 65 61 64 20 2a 2f 0a  already read */.
1d900 20 20 69 6e 74 20 63 54 65 72 6d 3b 20 20 20 20    int cTerm;    
1d910 20 20 20 20 20 20 2f 2a 20 43 68 61 72 61 63 74        /* Charact
1d920 65 72 20 74 68 61 74 20 74 65 72 6d 69 6e 61 74  er that terminat
1d930 65 64 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  ed the most rece
1d940 6e 74 20 66 69 65 6c 64 20 2a 2f 0a 20 20 69 6e  nt field */.  in
1d950 74 20 63 43 6f 6c 53 65 70 3b 20 20 20 20 20 20  t cColSep;      
1d960 20 20 2f 2a 20 54 68 65 20 63 6f 6c 75 6d 6e 20    /* The column 
1d970 73 65 70 61 72 61 74 6f 72 20 63 68 61 72 61 63  separator charac
1d980 74 65 72 2e 20 20 28 55 73 75 61 6c 6c 79 20 22  ter.  (Usually "
1d990 2c 22 29 20 2a 2f 0a 20 20 69 6e 74 20 63 52 6f  ,") */.  int cRo
1d9a0 77 53 65 70 3b 20 20 20 20 20 20 20 20 2f 2a 20  wSep;        /* 
1d9b0 54 68 65 20 72 6f 77 20 73 65 70 61 72 61 74 6f  The row separato
1d9c0 72 20 63 68 61 72 61 63 74 65 72 2e 20 20 28 55  r character.  (U
1d9d0 73 75 61 6c 6c 79 20 22 5c 6e 22 29 20 2a 2f 0a  sually "\n") */.
1d9e0 7d 3b 0a 0a 2f 2a 20 41 70 70 65 6e 64 20 61 20  };../* Append a 
1d9f0 73 69 6e 67 6c 65 20 62 79 74 65 20 74 6f 20 7a  single byte to z
1da00 5b 5d 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  [] */.static voi
1da10 64 20 69 6d 70 6f 72 74 5f 61 70 70 65 6e 64 5f  d import_append_
1da20 63 68 61 72 28 49 6d 70 6f 72 74 43 74 78 20 2a  char(ImportCtx *
1da30 70 2c 20 69 6e 74 20 63 29 7b 0a 20 20 69 66 28  p, int c){.  if(
1da40 20 70 2d 3e 6e 2b 31 3e 3d 70 2d 3e 6e 41 6c 6c   p->n+1>=p->nAll
1da50 6f 63 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 41 6c  oc ){.    p->nAl
1da60 6c 6f 63 20 2b 3d 20 70 2d 3e 6e 41 6c 6c 6f 63  loc += p->nAlloc
1da70 20 2b 20 31 30 30 3b 0a 20 20 20 20 70 2d 3e 7a   + 100;.    p->z
1da80 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c   = sqlite3_reall
1da90 6f 63 36 34 28 70 2d 3e 7a 2c 20 70 2d 3e 6e 41  oc64(p->z, p->nA
1daa0 6c 6c 6f 63 29 3b 0a 20 20 20 20 69 66 28 20 70  lloc);.    if( p
1dab0 2d 3e 7a 3d 3d 30 20 29 20 73 68 65 6c 6c 5f 6f  ->z==0 ) shell_o
1dac0 75 74 5f 6f 66 5f 6d 65 6d 6f 72 79 28 29 3b 0a  ut_of_memory();.
1dad0 20 20 7d 0a 20 20 70 2d 3e 7a 5b 70 2d 3e 6e 2b    }.  p->z[p->n+
1dae0 2b 5d 20 3d 20 28 63 68 61 72 29 63 3b 0a 7d 0a  +] = (char)c;.}.
1daf0 0a 2f 2a 20 52 65 61 64 20 61 20 73 69 6e 67 6c  ./* Read a singl
1db00 65 20 66 69 65 6c 64 20 6f 66 20 43 53 56 20 74  e field of CSV t
1db10 65 78 74 2e 20 20 43 6f 6d 70 61 74 69 62 6c 65  ext.  Compatible
1db20 20 77 69 74 68 20 72 66 63 34 31 38 30 20 61 6e   with rfc4180 an
1db30 64 20 65 78 74 65 6e 64 65 64 0a 2a 2a 20 77 69  d extended.** wi
1db40 74 68 20 74 68 65 20 6f 70 74 69 6f 6e 20 6f 66  th the option of
1db50 20 68 61 76 69 6e 67 20 61 20 73 65 70 61 72 61   having a separa
1db60 74 6f 72 20 6f 74 68 65 72 20 74 68 61 6e 20 22  tor other than "
1db70 2c 22 2e 0a 2a 2a 0a 2a 2a 20 20 20 2b 20 20 49  ,"..**.**   +  I
1db80 6e 70 75 74 20 63 6f 6d 65 73 20 66 72 6f 6d 20  nput comes from 
1db90 70 2d 3e 69 6e 2e 0a 2a 2a 20 20 20 2b 20 20 53  p->in..**   +  S
1dba0 74 6f 72 65 20 72 65 73 75 6c 74 73 20 69 6e 20  tore results in 
1dbb0 70 2d 3e 7a 20 6f 66 20 6c 65 6e 67 74 68 20 70  p->z of length p
1dbc0 2d 3e 6e 2e 20 20 53 70 61 63 65 20 74 6f 20 68  ->n.  Space to h
1dbd0 6f 6c 64 20 70 2d 3e 7a 20 63 6f 6d 65 73 0a 2a  old p->z comes.*
1dbe0 2a 20 20 20 20 20 20 66 72 6f 6d 20 73 71 6c 69  *      from sqli
1dbf0 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 29 2e 0a  te3_malloc64()..
1dc00 2a 2a 20 20 20 2b 20 20 55 73 65 20 70 2d 3e 63  **   +  Use p->c
1dc10 53 65 70 20 61 73 20 74 68 65 20 63 6f 6c 75 6d  Sep as the colum
1dc20 6e 20 73 65 70 61 72 61 74 6f 72 2e 20 20 54 68  n separator.  Th
1dc30 65 20 64 65 66 61 75 6c 74 20 69 73 20 22 2c 22  e default is ","
1dc40 2e 0a 2a 2a 20 20 20 2b 20 20 55 73 65 20 70 2d  ..**   +  Use p-
1dc50 3e 72 53 65 70 20 61 73 20 74 68 65 20 72 6f 77  >rSep as the row
1dc60 20 73 65 70 61 72 61 74 6f 72 2e 20 20 54 68 65   separator.  The
1dc70 20 64 65 66 61 75 6c 74 20 69 73 20 22 5c 6e 22   default is "\n"
1dc80 2e 0a 2a 2a 20 20 20 2b 20 20 4b 65 65 70 20 74  ..**   +  Keep t
1dc90 72 61 63 6b 20 6f 66 20 74 68 65 20 6c 69 6e 65  rack of the line
1dca0 20 6e 75 6d 62 65 72 20 69 6e 20 70 2d 3e 6e 4c   number in p->nL
1dcb0 69 6e 65 2e 0a 2a 2a 20 20 20 2b 20 20 53 74 6f  ine..**   +  Sto
1dcc0 72 65 20 74 68 65 20 63 68 61 72 61 63 74 65 72  re the character
1dcd0 20 74 68 61 74 20 74 65 72 6d 69 6e 61 74 65 73   that terminates
1dce0 20 74 68 65 20 66 69 65 6c 64 20 69 6e 20 70 2d   the field in p-
1dcf0 3e 63 54 65 72 6d 2e 20 20 53 74 6f 72 65 0a 2a  >cTerm.  Store.*
1dd00 2a 20 20 20 20 20 20 45 4f 46 20 6f 6e 20 65 6e  *      EOF on en
1dd10 64 2d 6f 66 2d 66 69 6c 65 2e 0a 2a 2a 20 20 20  d-of-file..**   
1dd20 2b 20 20 52 65 70 6f 72 74 20 73 79 6e 74 61 78  +  Report syntax
1dd30 20 65 72 72 6f 72 73 20 6f 6e 20 73 74 64 65 72   errors on stder
1dd40 72 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  r.*/.static char
1dd50 20 2a 53 51 4c 49 54 45 5f 43 44 45 43 4c 20 63   *SQLITE_CDECL c
1dd60 73 76 5f 72 65 61 64 5f 6f 6e 65 5f 66 69 65 6c  sv_read_one_fiel
1dd70 64 28 49 6d 70 6f 72 74 43 74 78 20 2a 70 29 7b  d(ImportCtx *p){
1dd80 0a 20 20 69 6e 74 20 63 3b 0a 20 20 69 6e 74 20  .  int c;.  int 
1dd90 63 53 65 70 20 3d 20 70 2d 3e 63 43 6f 6c 53 65  cSep = p->cColSe
1dda0 70 3b 0a 20 20 69 6e 74 20 72 53 65 70 20 3d 20  p;.  int rSep = 
1ddb0 70 2d 3e 63 52 6f 77 53 65 70 3b 0a 20 20 70 2d  p->cRowSep;.  p-
1ddc0 3e 6e 20 3d 20 30 3b 0a 20 20 63 20 3d 20 66 67  >n = 0;.  c = fg
1ddd0 65 74 63 28 70 2d 3e 69 6e 29 3b 0a 20 20 69 66  etc(p->in);.  if
1dde0 28 20 63 3d 3d 45 4f 46 20 7c 7c 20 73 65 65 6e  ( c==EOF || seen
1ddf0 49 6e 74 65 72 72 75 70 74 20 29 7b 0a 20 20 20  Interrupt ){.   
1de00 20 70 2d 3e 63 54 65 72 6d 20 3d 20 45 4f 46 3b   p->cTerm = EOF;
1de10 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
1de20 20 7d 0a 20 20 69 66 28 20 63 3d 3d 27 22 27 20   }.  if( c=='"' 
1de30 29 7b 0a 20 20 20 20 69 6e 74 20 70 63 2c 20 70  ){.    int pc, p
1de40 70 63 3b 0a 20 20 20 20 69 6e 74 20 73 74 61 72  pc;.    int star
1de50 74 4c 69 6e 65 20 3d 20 70 2d 3e 6e 4c 69 6e 65  tLine = p->nLine
1de60 3b 0a 20 20 20 20 69 6e 74 20 63 51 75 6f 74 65  ;.    int cQuote
1de70 20 3d 20 63 3b 0a 20 20 20 20 70 63 20 3d 20 70   = c;.    pc = p
1de80 70 63 20 3d 20 30 3b 0a 20 20 20 20 77 68 69 6c  pc = 0;.    whil
1de90 65 28 20 31 20 29 7b 0a 20 20 20 20 20 20 63 20  e( 1 ){.      c 
1dea0 3d 20 66 67 65 74 63 28 70 2d 3e 69 6e 29 3b 0a  = fgetc(p->in);.
1deb0 20 20 20 20 20 20 69 66 28 20 63 3d 3d 72 53 65        if( c==rSe
1dec0 70 20 29 20 70 2d 3e 6e 4c 69 6e 65 2b 2b 3b 0a  p ) p->nLine++;.
1ded0 20 20 20 20 20 20 69 66 28 20 63 3d 3d 63 51 75        if( c==cQu
1dee0 6f 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ote ){.        i
1def0 66 28 20 70 63 3d 3d 63 51 75 6f 74 65 20 29 7b  f( pc==cQuote ){
1df00 0a 20 20 20 20 20 20 20 20 20 20 70 63 20 3d 20  .          pc = 
1df10 30 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e  0;.          con
1df20 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 7d  tinue;.        }
1df30 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
1df40 66 28 20 28 63 3d 3d 63 53 65 70 20 26 26 20 70  f( (c==cSep && p
1df50 63 3d 3d 63 51 75 6f 74 65 29 0a 20 20 20 20 20  c==cQuote).     
1df60 20 20 7c 7c 20 28 63 3d 3d 72 53 65 70 20 26 26    || (c==rSep &&
1df70 20 70 63 3d 3d 63 51 75 6f 74 65 29 0a 20 20 20   pc==cQuote).   
1df80 20 20 20 20 7c 7c 20 28 63 3d 3d 72 53 65 70 20      || (c==rSep 
1df90 26 26 20 70 63 3d 3d 27 5c 72 27 20 26 26 20 70  && pc=='\r' && p
1dfa0 70 63 3d 3d 63 51 75 6f 74 65 29 0a 20 20 20 20  pc==cQuote).    
1dfb0 20 20 20 7c 7c 20 28 63 3d 3d 45 4f 46 20 26 26     || (c==EOF &&
1dfc0 20 70 63 3d 3d 63 51 75 6f 74 65 29 0a 20 20 20   pc==cQuote).   
1dfd0 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 64 6f     ){.        do
1dfe0 7b 20 70 2d 3e 6e 2d 2d 3b 20 7d 77 68 69 6c 65  { p->n--; }while
1dff0 28 20 70 2d 3e 7a 5b 70 2d 3e 6e 5d 21 3d 63 51  ( p->z[p->n]!=cQ
1e000 75 6f 74 65 20 29 3b 0a 20 20 20 20 20 20 20 20  uote );.        
1e010 70 2d 3e 63 54 65 72 6d 20 3d 20 63 3b 0a 20 20  p->cTerm = c;.  
1e020 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1e030 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
1e040 63 3d 3d 63 51 75 6f 74 65 20 26 26 20 63 21 3d  c==cQuote && c!=
1e050 27 5c 72 27 20 29 7b 0a 20 20 20 20 20 20 20 20  '\r' ){.        
1e060 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65  utf8_printf(stde
1e070 72 72 2c 20 22 25 73 3a 25 64 3a 20 75 6e 65 73  rr, "%s:%d: unes
1e080 63 61 70 65 64 20 25 63 20 63 68 61 72 61 63 74  caped %c charact
1e090 65 72 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  er\n",.         
1e0a0 20 20 20 20 20 20 20 70 2d 3e 7a 46 69 6c 65 2c         p->zFile,
1e0b0 20 70 2d 3e 6e 4c 69 6e 65 2c 20 63 51 75 6f 74   p->nLine, cQuot
1e0c0 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
1e0d0 20 20 69 66 28 20 63 3d 3d 45 4f 46 20 29 7b 0a    if( c==EOF ){.
1e0e0 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69          utf8_pri
1e0f0 6e 74 66 28 73 74 64 65 72 72 2c 20 22 25 73 3a  ntf(stderr, "%s:
1e100 25 64 3a 20 75 6e 74 65 72 6d 69 6e 61 74 65 64  %d: unterminated
1e110 20 25 63 2d 71 75 6f 74 65 64 20 66 69 65 6c 64   %c-quoted field
1e120 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
1e130 20 20 20 20 20 70 2d 3e 7a 46 69 6c 65 2c 20 73       p->zFile, s
1e140 74 61 72 74 4c 69 6e 65 2c 20 63 51 75 6f 74 65  tartLine, cQuote
1e150 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 63 54  );.        p->cT
1e160 65 72 6d 20 3d 20 63 3b 0a 20 20 20 20 20 20 20  erm = c;.       
1e170 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
1e180 20 20 20 20 20 20 69 6d 70 6f 72 74 5f 61 70 70        import_app
1e190 65 6e 64 5f 63 68 61 72 28 70 2c 20 63 29 3b 0a  end_char(p, c);.
1e1a0 20 20 20 20 20 20 70 70 63 20 3d 20 70 63 3b 0a        ppc = pc;.
1e1b0 20 20 20 20 20 20 70 63 20 3d 20 63 3b 0a 20 20        pc = c;.  
1e1c0 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
1e1d0 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 74   /* If this is t
1e1e0 68 65 20 66 69 72 73 74 20 66 69 65 6c 64 20 62  he first field b
1e1f0 65 69 6e 67 20 70 61 72 73 65 64 20 61 6e 64 20  eing parsed and 
1e200 69 74 20 62 65 67 69 6e 73 20 77 69 74 68 20 74  it begins with t
1e210 68 65 0a 20 20 20 20 2a 2a 20 55 54 46 2d 38 20  he.    ** UTF-8 
1e220 42 4f 4d 20 20 28 30 78 45 46 20 42 42 20 42 46  BOM  (0xEF BB BF
1e230 29 20 74 68 65 6e 20 73 6b 69 70 20 74 68 65 20  ) then skip the 
1e240 42 4f 4d 20 2a 2f 0a 20 20 20 20 69 66 28 20 28  BOM */.    if( (
1e250 63 26 30 78 66 66 29 3d 3d 30 78 65 66 20 26 26  c&0xff)==0xef &&
1e260 20 70 2d 3e 62 4e 6f 74 46 69 72 73 74 3d 3d 30   p->bNotFirst==0
1e270 20 29 7b 0a 20 20 20 20 20 20 69 6d 70 6f 72 74   ){.      import
1e280 5f 61 70 70 65 6e 64 5f 63 68 61 72 28 70 2c 20  _append_char(p, 
1e290 63 29 3b 0a 20 20 20 20 20 20 63 20 3d 20 66 67  c);.      c = fg
1e2a0 65 74 63 28 70 2d 3e 69 6e 29 3b 0a 20 20 20 20  etc(p->in);.    
1e2b0 20 20 69 66 28 20 28 63 26 30 78 66 66 29 3d 3d    if( (c&0xff)==
1e2c0 30 78 62 62 20 29 7b 0a 20 20 20 20 20 20 20 20  0xbb ){.        
1e2d0 69 6d 70 6f 72 74 5f 61 70 70 65 6e 64 5f 63 68  import_append_ch
1e2e0 61 72 28 70 2c 20 63 29 3b 0a 20 20 20 20 20 20  ar(p, c);.      
1e2f0 20 20 63 20 3d 20 66 67 65 74 63 28 70 2d 3e 69    c = fgetc(p->i
1e300 6e 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  n);.        if( 
1e310 28 63 26 30 78 66 66 29 3d 3d 30 78 62 66 20 29  (c&0xff)==0xbf )
1e320 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 62  {.          p->b
1e330 4e 6f 74 46 69 72 73 74 20 3d 20 31 3b 0a 20 20  NotFirst = 1;.  
1e340 20 20 20 20 20 20 20 20 70 2d 3e 6e 20 3d 20 30          p->n = 0
1e350 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ;.          retu
1e360 72 6e 20 63 73 76 5f 72 65 61 64 5f 6f 6e 65 5f  rn csv_read_one_
1e370 66 69 65 6c 64 28 70 29 3b 0a 20 20 20 20 20 20  field(p);.      
1e380 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
1e390 7d 0a 20 20 20 20 77 68 69 6c 65 28 20 63 21 3d  }.    while( c!=
1e3a0 45 4f 46 20 26 26 20 63 21 3d 63 53 65 70 20 26  EOF && c!=cSep &
1e3b0 26 20 63 21 3d 72 53 65 70 20 29 7b 0a 20 20 20  & c!=rSep ){.   
1e3c0 20 20 20 69 6d 70 6f 72 74 5f 61 70 70 65 6e 64     import_append
1e3d0 5f 63 68 61 72 28 70 2c 20 63 29 3b 0a 20 20 20  _char(p, c);.   
1e3e0 20 20 20 63 20 3d 20 66 67 65 74 63 28 70 2d 3e     c = fgetc(p->
1e3f0 69 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  in);.    }.    i
1e400 66 28 20 63 3d 3d 72 53 65 70 20 29 7b 0a 20 20  f( c==rSep ){.  
1e410 20 20 20 20 70 2d 3e 6e 4c 69 6e 65 2b 2b 3b 0a      p->nLine++;.
1e420 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6e 3e 30        if( p->n>0
1e430 20 26 26 20 70 2d 3e 7a 5b 70 2d 3e 6e 2d 31 5d   && p->z[p->n-1]
1e440 3d 3d 27 5c 72 27 20 29 20 70 2d 3e 6e 2d 2d 3b  =='\r' ) p->n--;
1e450 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 63 54  .    }.    p->cT
1e460 65 72 6d 20 3d 20 63 3b 0a 20 20 7d 0a 20 20 69  erm = c;.  }.  i
1e470 66 28 20 70 2d 3e 7a 20 29 20 70 2d 3e 7a 5b 70  f( p->z ) p->z[p
1e480 2d 3e 6e 5d 20 3d 20 30 3b 0a 20 20 70 2d 3e 62  ->n] = 0;.  p->b
1e490 4e 6f 74 46 69 72 73 74 20 3d 20 31 3b 0a 20 20  NotFirst = 1;.  
1e4a0 72 65 74 75 72 6e 20 70 2d 3e 7a 3b 0a 7d 0a 0a  return p->z;.}..
1e4b0 2f 2a 20 52 65 61 64 20 61 20 73 69 6e 67 6c 65  /* Read a single
1e4c0 20 66 69 65 6c 64 20 6f 66 20 41 53 43 49 49 20   field of ASCII 
1e4d0 64 65 6c 69 6d 69 74 65 64 20 74 65 78 74 2e 0a  delimited text..
1e4e0 2a 2a 0a 2a 2a 20 20 20 2b 20 20 49 6e 70 75 74  **.**   +  Input
1e4f0 20 63 6f 6d 65 73 20 66 72 6f 6d 20 70 2d 3e 69   comes from p->i
1e500 6e 2e 0a 2a 2a 20 20 20 2b 20 20 53 74 6f 72 65  n..**   +  Store
1e510 20 72 65 73 75 6c 74 73 20 69 6e 20 70 2d 3e 7a   results in p->z
1e520 20 6f 66 20 6c 65 6e 67 74 68 20 70 2d 3e 6e 2e   of length p->n.
1e530 20 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20    Space to hold 
1e540 70 2d 3e 7a 20 63 6f 6d 65 73 0a 2a 2a 20 20 20  p->z comes.**   
1e550 20 20 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f     from sqlite3_
1e560 6d 61 6c 6c 6f 63 36 34 28 29 2e 0a 2a 2a 20 20  malloc64()..**  
1e570 20 2b 20 20 55 73 65 20 70 2d 3e 63 53 65 70 20   +  Use p->cSep 
1e580 61 73 20 74 68 65 20 63 6f 6c 75 6d 6e 20 73 65  as the column se
1e590 70 61 72 61 74 6f 72 2e 20 20 54 68 65 20 64 65  parator.  The de
1e5a0 66 61 75 6c 74 20 69 73 20 22 5c 78 31 46 22 2e  fault is "\x1F".
1e5b0 0a 2a 2a 20 20 20 2b 20 20 55 73 65 20 70 2d 3e  .**   +  Use p->
1e5c0 72 53 65 70 20 61 73 20 74 68 65 20 72 6f 77 20  rSep as the row 
1e5d0 73 65 70 61 72 61 74 6f 72 2e 20 20 54 68 65 20  separator.  The 
1e5e0 64 65 66 61 75 6c 74 20 69 73 20 22 5c 78 31 45  default is "\x1E
1e5f0 22 2e 0a 2a 2a 20 20 20 2b 20 20 4b 65 65 70 20  "..**   +  Keep 
1e600 74 72 61 63 6b 20 6f 66 20 74 68 65 20 72 6f 77  track of the row
1e610 20 6e 75 6d 62 65 72 20 69 6e 20 70 2d 3e 6e 4c   number in p->nL
1e620 69 6e 65 2e 0a 2a 2a 20 20 20 2b 20 20 53 74 6f  ine..**   +  Sto
1e630 72 65 20 74 68 65 20 63 68 61 72 61 63 74 65 72  re the character
1e640 20 74 68 61 74 20 74 65 72 6d 69 6e 61 74 65 73   that terminates
1e650 20 74 68 65 20 66 69 65 6c 64 20 69 6e 20 70 2d   the field in p-
1e660 3e 63 54 65 72 6d 2e 20 20 53 74 6f 72 65 0a 2a  >cTerm.  Store.*
1e670 2a 20 20 20 20 20 20 45 4f 46 20 6f 6e 20 65 6e  *      EOF on en
1e680 64 2d 6f 66 2d 66 69 6c 65 2e 0a 2a 2a 20 20 20  d-of-file..**   
1e690 2b 20 20 52 65 70 6f 72 74 20 73 79 6e 74 61 78  +  Report syntax
1e6a0 20 65 72 72 6f 72 73 20 6f 6e 20 73 74 64 65 72   errors on stder
1e6b0 72 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  r.*/.static char
1e6c0 20 2a 53 51 4c 49 54 45 5f 43 44 45 43 4c 20 61   *SQLITE_CDECL a
1e6d0 73 63 69 69 5f 72 65 61 64 5f 6f 6e 65 5f 66 69  scii_read_one_fi
1e6e0 65 6c 64 28 49 6d 70 6f 72 74 43 74 78 20 2a 70  eld(ImportCtx *p
1e6f0 29 7b 0a 20 20 69 6e 74 20 63 3b 0a 20 20 69 6e  ){.  int c;.  in
1e700 74 20 63 53 65 70 20 3d 20 70 2d 3e 63 43 6f 6c  t cSep = p->cCol
1e710 53 65 70 3b 0a 20 20 69 6e 74 20 72 53 65 70 20  Sep;.  int rSep 
1e720 3d 20 70 2d 3e 63 52 6f 77 53 65 70 3b 0a 20 20  = p->cRowSep;.  
1e730 70 2d 3e 6e 20 3d 20 30 3b 0a 20 20 63 20 3d 20  p->n = 0;.  c = 
1e740 66 67 65 74 63 28 70 2d 3e 69 6e 29 3b 0a 20 20  fgetc(p->in);.  
1e750 69 66 28 20 63 3d 3d 45 4f 46 20 7c 7c 20 73 65  if( c==EOF || se
1e760 65 6e 49 6e 74 65 72 72 75 70 74 20 29 7b 0a 20  enInterrupt ){. 
1e770 20 20 20 70 2d 3e 63 54 65 72 6d 20 3d 20 45 4f     p->cTerm = EO
1e780 46 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  F;.    return 0;
1e790 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 63 21  .  }.  while( c!
1e7a0 3d 45 4f 46 20 26 26 20 63 21 3d 63 53 65 70 20  =EOF && c!=cSep 
1e7b0 26 26 20 63 21 3d 72 53 65 70 20 29 7b 0a 20 20  && c!=rSep ){.  
1e7c0 20 20 69 6d 70 6f 72 74 5f 61 70 70 65 6e 64 5f    import_append_
1e7d0 63 68 61 72 28 70 2c 20 63 29 3b 0a 20 20 20 20  char(p, c);.    
1e7e0 63 20 3d 20 66 67 65 74 63 28 70 2d 3e 69 6e 29  c = fgetc(p->in)
1e7f0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 63 3d 3d 72  ;.  }.  if( c==r
1e800 53 65 70 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 4c  Sep ){.    p->nL
1e810 69 6e 65 2b 2b 3b 0a 20 20 7d 0a 20 20 70 2d 3e  ine++;.  }.  p->
1e820 63 54 65 72 6d 20 3d 20 63 3b 0a 20 20 69 66 28  cTerm = c;.  if(
1e830 20 70 2d 3e 7a 20 29 20 70 2d 3e 7a 5b 70 2d 3e   p->z ) p->z[p->
1e840 6e 5d 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e  n] = 0;.  return
1e850 20 70 2d 3e 7a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   p->z;.}../*.** 
1e860 54 72 79 20 74 6f 20 74 72 61 6e 73 66 65 72 20  Try to transfer 
1e870 64 61 74 61 20 66 6f 72 20 74 61 62 6c 65 20 7a  data for table z
1e880 54 61 62 6c 65 2e 20 20 49 66 20 61 6e 20 65 72  Table.  If an er
1e890 72 6f 72 20 69 73 20 73 65 65 6e 20 77 68 69 6c  ror is seen whil
1e8a0 65 0a 2a 2a 20 6d 6f 76 69 6e 67 20 66 6f 72 77  e.** moving forw
1e8b0 61 72 64 2c 20 74 72 79 20 74 6f 20 67 6f 20 62  ard, try to go b
1e8c0 61 63 6b 77 61 72 64 73 2e 20 20 54 68 65 20 62  ackwards.  The b
1e8d0 61 63 6b 77 61 72 64 73 20 6d 6f 76 65 6d 65 6e  ackwards movemen
1e8e0 74 20 77 6f 6e 27 74 0a 2a 2a 20 77 6f 72 6b 20  t won't.** work 
1e8f0 66 6f 72 20 57 49 54 48 4f 55 54 20 52 4f 57 49  for WITHOUT ROWI
1e900 44 20 74 61 62 6c 65 73 2e 0a 2a 2f 0a 73 74 61  D tables..*/.sta
1e910 74 69 63 20 76 6f 69 64 20 74 72 79 54 6f 43 6c  tic void tryToCl
1e920 6f 6e 65 44 61 74 61 28 0a 20 20 53 68 65 6c 6c  oneData(.  Shell
1e930 53 74 61 74 65 20 2a 70 2c 0a 20 20 73 71 6c 69  State *p,.  sqli
1e940 74 65 33 20 2a 6e 65 77 44 62 2c 0a 20 20 63 6f  te3 *newDb,.  co
1e950 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62 6c 65  nst char *zTable
1e960 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  .){.  sqlite3_st
1e970 6d 74 20 2a 70 51 75 65 72 79 20 3d 20 30 3b 0a  mt *pQuery = 0;.
1e980 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
1e990 70 49 6e 73 65 72 74 20 3d 20 30 3b 0a 20 20 63  pInsert = 0;.  c
1e9a0 68 61 72 20 2a 7a 51 75 65 72 79 20 3d 20 30 3b  har *zQuery = 0;
1e9b0 0a 20 20 63 68 61 72 20 2a 7a 49 6e 73 65 72 74  .  char *zInsert
1e9c0 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a   = 0;.  int rc;.
1e9d0 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6e 3b 0a 20    int i, j, n;. 
1e9e0 20 69 6e 74 20 6e 54 61 62 6c 65 20 3d 20 73 74   int nTable = st
1e9f0 72 6c 65 6e 33 30 28 7a 54 61 62 6c 65 29 3b 0a  rlen30(zTable);.
1ea00 20 20 69 6e 74 20 6b 20 3d 20 30 3b 0a 20 20 69    int k = 0;.  i
1ea10 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 63 6f  nt cnt = 0;.  co
1ea20 6e 73 74 20 69 6e 74 20 73 70 69 6e 52 61 74 65  nst int spinRate
1ea30 20 3d 20 31 30 30 30 30 3b 0a 0a 20 20 7a 51 75   = 10000;..  zQu
1ea40 65 72 79 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  ery = sqlite3_mp
1ea50 72 69 6e 74 66 28 22 53 45 4c 45 43 54 20 2a 20  rintf("SELECT * 
1ea60 46 52 4f 4d 20 5c 22 25 77 5c 22 22 2c 20 7a 54  FROM \"%w\"", zT
1ea70 61 62 6c 65 29 3b 0a 20 20 72 63 20 3d 20 73 71  able);.  rc = sq
1ea80 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32  lite3_prepare_v2
1ea90 28 70 2d 3e 64 62 2c 20 7a 51 75 65 72 79 2c 20  (p->db, zQuery, 
1eaa0 2d 31 2c 20 26 70 51 75 65 72 79 2c 20 30 29 3b  -1, &pQuery, 0);
1eab0 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20  .  if( rc ){.   
1eac0 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64   utf8_printf(std
1ead0 65 72 72 2c 20 22 45 72 72 6f 72 20 25 64 3a 20  err, "Error %d: 
1eae0 25 73 20 6f 6e 20 5b 25 73 5d 5c 6e 22 2c 0a 20  %s on [%s]\n",. 
1eaf0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
1eb00 65 33 5f 65 78 74 65 6e 64 65 64 5f 65 72 72 63  e3_extended_errc
1eb10 6f 64 65 28 70 2d 3e 64 62 29 2c 20 73 71 6c 69  ode(p->db), sqli
1eb20 74 65 33 5f 65 72 72 6d 73 67 28 70 2d 3e 64 62  te3_errmsg(p->db
1eb30 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a  ),.            z
1eb40 51 75 65 72 79 29 3b 0a 20 20 20 20 67 6f 74 6f  Query);.    goto
1eb50 20 65 6e 64 5f 64 61 74 61 5f 78 66 65 72 3b 0a   end_data_xfer;.
1eb60 20 20 7d 0a 20 20 6e 20 3d 20 73 71 6c 69 74 65    }.  n = sqlite
1eb70 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 70  3_column_count(p
1eb80 51 75 65 72 79 29 3b 0a 20 20 7a 49 6e 73 65 72  Query);.  zInser
1eb90 74 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  t = sqlite3_mall
1eba0 6f 63 36 34 28 32 30 30 20 2b 20 6e 54 61 62 6c  oc64(200 + nTabl
1ebb0 65 20 2b 20 6e 2a 33 29 3b 0a 20 20 69 66 28 20  e + n*3);.  if( 
1ebc0 7a 49 6e 73 65 72 74 3d 3d 30 20 29 20 73 68 65  zInsert==0 ) she
1ebd0 6c 6c 5f 6f 75 74 5f 6f 66 5f 6d 65 6d 6f 72 79  ll_out_of_memory
1ebe0 28 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e  ();.  sqlite3_sn
1ebf0 70 72 69 6e 74 66 28 32 30 30 2b 6e 54 61 62 6c  printf(200+nTabl
1ec00 65 2c 7a 49 6e 73 65 72 74 2c 0a 20 20 20 20 20  e,zInsert,.     
1ec10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 49                "I
1ec20 4e 53 45 52 54 20 4f 52 20 49 47 4e 4f 52 45 20  NSERT OR IGNORE 
1ec30 49 4e 54 4f 20 5c 22 25 73 5c 22 20 56 41 4c 55  INTO \"%s\" VALU
1ec40 45 53 28 3f 22 2c 20 7a 54 61 62 6c 65 29 3b 0a  ES(?", zTable);.
1ec50 20 20 69 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a    i = strlen30(z
1ec60 49 6e 73 65 72 74 29 3b 0a 20 20 66 6f 72 28 6a  Insert);.  for(j
1ec70 3d 31 3b 20 6a 3c 6e 3b 20 6a 2b 2b 29 7b 0a 20  =1; j<n; j++){. 
1ec80 20 20 20 6d 65 6d 63 70 79 28 7a 49 6e 73 65 72     memcpy(zInser
1ec90 74 2b 69 2c 20 22 2c 3f 22 2c 20 32 29 3b 0a 20  t+i, ",?", 2);. 
1eca0 20 20 20 69 20 2b 3d 20 32 3b 0a 20 20 7d 0a 20     i += 2;.  }. 
1ecb0 20 6d 65 6d 63 70 79 28 7a 49 6e 73 65 72 74 2b   memcpy(zInsert+
1ecc0 69 2c 20 22 29 3b 22 2c 20 33 29 3b 0a 20 20 72  i, ");", 3);.  r
1ecd0 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70  c = sqlite3_prep
1ece0 61 72 65 5f 76 32 28 6e 65 77 44 62 2c 20 7a 49  are_v2(newDb, zI
1ecf0 6e 73 65 72 74 2c 20 2d 31 2c 20 26 70 49 6e 73  nsert, -1, &pIns
1ed00 65 72 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  ert, 0);.  if( r
1ed10 63 20 29 7b 0a 20 20 20 20 75 74 66 38 5f 70 72  c ){.    utf8_pr
1ed20 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72  intf(stderr, "Er
1ed30 72 6f 72 20 25 64 3a 20 25 73 20 6f 6e 20 5b 25  ror %d: %s on [%
1ed40 73 5d 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  s]\n",.         
1ed50 20 20 20 73 71 6c 69 74 65 33 5f 65 78 74 65 6e     sqlite3_exten
1ed60 64 65 64 5f 65 72 72 63 6f 64 65 28 6e 65 77 44  ded_errcode(newD
1ed70 62 29 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d  b), sqlite3_errm
1ed80 73 67 28 6e 65 77 44 62 29 2c 0a 20 20 20 20 20  sg(newDb),.     
1ed90 20 20 20 20 20 20 20 7a 51 75 65 72 79 29 3b 0a         zQuery);.
1eda0 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 64 61 74      goto end_dat
1edb0 61 5f 78 66 65 72 3b 0a 20 20 7d 0a 20 20 66 6f  a_xfer;.  }.  fo
1edc0 72 28 6b 3d 30 3b 20 6b 3c 32 3b 20 6b 2b 2b 29  r(k=0; k<2; k++)
1edd0 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 28 72 63  {.    while( (rc
1ede0 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28   = sqlite3_step(
1edf0 70 51 75 65 72 79 29 29 3d 3d 53 51 4c 49 54 45  pQuery))==SQLITE
1ee00 5f 52 4f 57 20 29 7b 0a 20 20 20 20 20 20 66 6f  _ROW ){.      fo
1ee10 72 28 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29  r(i=0; i<n; i++)
1ee20 7b 0a 20 20 20 20 20 20 20 20 73 77 69 74 63 68  {.        switch
1ee30 28 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  ( sqlite3_column
1ee40 5f 74 79 70 65 28 70 51 75 65 72 79 2c 20 69 29  _type(pQuery, i)
1ee50 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 61   ){.          ca
1ee60 73 65 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 3a 20  se SQLITE_NULL: 
1ee70 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
1ee80 6c 69 74 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c 28  lite3_bind_null(
1ee90 70 49 6e 73 65 72 74 2c 20 69 2b 31 29 3b 0a 20  pInsert, i+1);. 
1eea0 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
1eeb0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
1eec0 20 20 20 20 20 20 20 20 63 61 73 65 20 53 51 4c          case SQL
1eed0 49 54 45 5f 49 4e 54 45 47 45 52 3a 20 7b 0a 20  ITE_INTEGER: {. 
1eee0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
1eef0 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 49  e3_bind_int64(pI
1ef00 6e 73 65 72 74 2c 20 69 2b 31 2c 20 73 71 6c 69  nsert, i+1, sqli
1ef10 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34  te3_column_int64
1ef20 28 70 51 75 65 72 79 2c 69 29 29 3b 0a 20 20 20  (pQuery,i));.   
1ef30 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
1ef40 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1ef50 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
1ef60 45 5f 46 4c 4f 41 54 3a 20 7b 0a 20 20 20 20 20  E_FLOAT: {.     
1ef70 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62         sqlite3_b
1ef80 69 6e 64 5f 64 6f 75 62 6c 65 28 70 49 6e 73 65  ind_double(pInse
1ef90 72 74 2c 20 69 2b 31 2c 20 73 71 6c 69 74 65 33  rt, i+1, sqlite3
1efa0 5f 63 6f 6c 75 6d 6e 5f 64 6f 75 62 6c 65 28 70  _column_double(p
1efb0 51 75 65 72 79 2c 69 29 29 3b 0a 20 20 20 20 20  Query,i));.     
1efc0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
1efd0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1efe0 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
1eff0 54 45 58 54 3a 20 7b 0a 20 20 20 20 20 20 20 20  TEXT: {.        
1f000 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64      sqlite3_bind
1f010 5f 74 65 78 74 28 70 49 6e 73 65 72 74 2c 20 69  _text(pInsert, i
1f020 2b 31 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  +1,.            
1f030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f040 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71   (const char*)sq
1f050 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
1f060 74 28 70 51 75 65 72 79 2c 69 29 2c 0a 20 20 20  t(pQuery,i),.   
1f070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f080 20 20 20 20 20 20 20 20 20 20 2d 31 2c 20 53 51            -1, SQ
1f090 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20  LITE_STATIC);.  
1f0a0 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
1f0b0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
1f0c0 20 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49         case SQLI
1f0d0 54 45 5f 42 4c 4f 42 3a 20 7b 0a 20 20 20 20 20  TE_BLOB: {.     
1f0e0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62         sqlite3_b
1f0f0 69 6e 64 5f 62 6c 6f 62 28 70 49 6e 73 65 72 74  ind_blob(pInsert
1f100 2c 20 69 2b 31 2c 20 73 71 6c 69 74 65 33 5f 63  , i+1, sqlite3_c
1f110 6f 6c 75 6d 6e 5f 62 6c 6f 62 28 70 51 75 65 72  olumn_blob(pQuer
1f120 79 2c 69 29 2c 0a 20 20 20 20 20 20 20 20 20 20  y,i),.          
1f130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f150 20 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e    sqlite3_column
1f160 5f 62 79 74 65 73 28 70 51 75 65 72 79 2c 69 29  _bytes(pQuery,i)
1f170 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1f180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
1f1a0 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20  LITE_STATIC);.  
1f1b0 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
1f1c0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
1f1d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 20 2f       }.      } /
1f1e0 2a 20 45 6e 64 20 66 6f 72 20 2a 2f 0a 20 20 20  * End for */.   
1f1f0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
1f200 73 74 65 70 28 70 49 6e 73 65 72 74 29 3b 0a 20  step(pInsert);. 
1f210 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
1f220 49 54 45 5f 4f 4b 20 26 26 20 72 63 21 3d 53 51  ITE_OK && rc!=SQ
1f230 4c 49 54 45 5f 52 4f 57 20 26 26 20 72 63 21 3d  LITE_ROW && rc!=
1f240 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20  SQLITE_DONE ){. 
1f250 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e         utf8_prin
1f260 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f  tf(stderr, "Erro
1f270 72 20 25 64 3a 20 25 73 5c 6e 22 2c 20 73 71 6c  r %d: %s\n", sql
1f280 69 74 65 33 5f 65 78 74 65 6e 64 65 64 5f 65 72  ite3_extended_er
1f290 72 63 6f 64 65 28 6e 65 77 44 62 29 2c 0a 20 20  rcode(newDb),.  
1f2a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f2b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65 72        sqlite3_er
1f2c0 72 6d 73 67 28 6e 65 77 44 62 29 29 3b 0a 20 20  rmsg(newDb));.  
1f2d0 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
1f2e0 74 65 33 5f 72 65 73 65 74 28 70 49 6e 73 65 72  te3_reset(pInser
1f2f0 74 29 3b 0a 20 20 20 20 20 20 63 6e 74 2b 2b 3b  t);.      cnt++;
1f300 0a 20 20 20 20 20 20 69 66 28 20 28 63 6e 74 25  .      if( (cnt%
1f310 73 70 69 6e 52 61 74 65 29 3d 3d 30 20 29 7b 0a  spinRate)==0 ){.
1f320 20 20 20 20 20 20 20 20 70 72 69 6e 74 66 28 22          printf("
1f330 25 63 5c 62 22 2c 20 22 7c 2f 2d 5c 5c 22 5b 28  %c\b", "|/-\\"[(
1f340 63 6e 74 2f 73 70 69 6e 52 61 74 65 29 25 34 5d  cnt/spinRate)%4]
1f350 29 3b 0a 20 20 20 20 20 20 20 20 66 66 6c 75 73  );.        fflus
1f360 68 28 73 74 64 6f 75 74 29 3b 0a 20 20 20 20 20  h(stdout);.     
1f370 20 7d 0a 20 20 20 20 7d 20 2f 2a 20 45 6e 64 20   }.    } /* End 
1f380 77 68 69 6c 65 20 2a 2f 0a 20 20 20 20 69 66 28  while */.    if(
1f390 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45   rc==SQLITE_DONE
1f3a0 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 73 71   ) break;.    sq
1f3b0 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
1f3c0 51 75 65 72 79 29 3b 0a 20 20 20 20 73 71 6c 69  Query);.    sqli
1f3d0 74 65 33 5f 66 72 65 65 28 7a 51 75 65 72 79 29  te3_free(zQuery)
1f3e0 3b 0a 20 20 20 20 7a 51 75 65 72 79 20 3d 20 73  ;.    zQuery = s
1f3f0 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
1f400 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 5c 22  SELECT * FROM \"
1f410 25 77 5c 22 20 4f 52 44 45 52 20 42 59 20 72 6f  %w\" ORDER BY ro
1f420 77 69 64 20 44 45 53 43 3b 22 2c 0a 20 20 20 20  wid DESC;",.    
1f430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f440 20 20 20 20 20 20 20 20 20 7a 54 61 62 6c 65 29           zTable)
1f450 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
1f460 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 70 2d  e3_prepare_v2(p-
1f470 3e 64 62 2c 20 7a 51 75 65 72 79 2c 20 2d 31 2c  >db, zQuery, -1,
1f480 20 26 70 51 75 65 72 79 2c 20 30 29 3b 0a 20 20   &pQuery, 0);.  
1f490 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
1f4a0 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74    utf8_printf(st
1f4b0 64 65 72 72 2c 20 22 57 61 72 6e 69 6e 67 3a 20  derr, "Warning: 
1f4c0 63 61 6e 6e 6f 74 20 73 74 65 70 20 5c 22 25 73  cannot step \"%s
1f4d0 5c 22 20 62 61 63 6b 77 61 72 64 73 22 2c 20 7a  \" backwards", z
1f4e0 54 61 62 6c 65 29 3b 0a 20 20 20 20 20 20 62 72  Table);.      br
1f4f0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 2f  eak;.    }.  } /
1f500 2a 20 45 6e 64 20 66 6f 72 28 6b 3d 30 2e 2e 2e  * End for(k=0...
1f510 29 20 2a 2f 0a 0a 65 6e 64 5f 64 61 74 61 5f 78  ) */..end_data_x
1f520 66 65 72 3a 0a 20 20 73 71 6c 69 74 65 33 5f 66  fer:.  sqlite3_f
1f530 69 6e 61 6c 69 7a 65 28 70 51 75 65 72 79 29 3b  inalize(pQuery);
1f540 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c  .  sqlite3_final
1f550 69 7a 65 28 70 49 6e 73 65 72 74 29 3b 0a 20 20  ize(pInsert);.  
1f560 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 51 75  sqlite3_free(zQu
1f570 65 72 79 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  ery);.  sqlite3_
1f580 66 72 65 65 28 7a 49 6e 73 65 72 74 29 3b 0a 7d  free(zInsert);.}
1f590 0a 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20  .../*.** Try to 
1f5a0 74 72 61 6e 73 66 65 72 20 61 6c 6c 20 72 6f 77  transfer all row
1f5b0 73 20 6f 66 20 74 68 65 20 73 63 68 65 6d 61 20  s of the schema 
1f5c0 74 68 61 74 20 6d 61 74 63 68 20 7a 57 68 65 72  that match zWher
1f5d0 65 2e 20 20 46 6f 72 0a 2a 2a 20 65 61 63 68 20  e.  For.** each 
1f5e0 72 6f 77 2c 20 69 6e 76 6f 6b 65 20 78 46 6f 72  row, invoke xFor
1f5f0 45 61 63 68 28 29 20 6f 6e 20 74 68 65 20 6f 62  Each() on the ob
1f600 6a 65 63 74 20 64 65 66 69 6e 65 64 20 62 79 20  ject defined by 
1f610 74 68 61 74 20 72 6f 77 2e 0a 2a 2a 20 49 66 20  that row..** If 
1f620 61 6e 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f  an error is enco
1f630 75 6e 74 65 72 65 64 20 77 68 69 6c 65 20 6d 6f  untered while mo
1f640 76 69 6e 67 20 66 6f 72 77 61 72 64 20 74 68 72  ving forward thr
1f650 6f 75 67 68 20 74 68 65 0a 2a 2a 20 73 71 6c 69  ough the.** sqli
1f660 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 2c  te_master table,
1f670 20 74 72 79 20 61 67 61 69 6e 20 6d 6f 76 69 6e   try again movin
1f680 67 20 62 61 63 6b 77 61 72 64 73 2e 0a 2a 2f 0a  g backwards..*/.
1f690 73 74 61 74 69 63 20 76 6f 69 64 20 74 72 79 54  static void tryT
1f6a0 6f 43 6c 6f 6e 65 53 63 68 65 6d 61 28 0a 20 20  oCloneSchema(.  
1f6b0 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 2c 0a 20  ShellState *p,. 
1f6c0 20 73 71 6c 69 74 65 33 20 2a 6e 65 77 44 62 2c   sqlite3 *newDb,
1f6d0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
1f6e0 57 68 65 72 65 2c 0a 20 20 76 6f 69 64 20 28 2a  Where,.  void (*
1f6f0 78 46 6f 72 45 61 63 68 29 28 53 68 65 6c 6c 53  xForEach)(ShellS
1f700 74 61 74 65 2a 2c 73 71 6c 69 74 65 33 2a 2c 63  tate*,sqlite3*,c
1f710 6f 6e 73 74 20 63 68 61 72 2a 29 0a 29 7b 0a 20  onst char*).){. 
1f720 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
1f730 51 75 65 72 79 20 3d 20 30 3b 0a 20 20 63 68 61  Query = 0;.  cha
1f740 72 20 2a 7a 51 75 65 72 79 20 3d 20 30 3b 0a 20  r *zQuery = 0;. 
1f750 20 69 6e 74 20 72 63 3b 0a 20 20 63 6f 6e 73 74   int rc;.  const
1f760 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
1f770 7a 4e 61 6d 65 3b 0a 20 20 63 6f 6e 73 74 20 75  zName;.  const u
1f780 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 53  nsigned char *zS
1f790 71 6c 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72  ql;.  char *zErr
1f7a0 4d 73 67 20 3d 20 30 3b 0a 0a 20 20 7a 51 75 65  Msg = 0;..  zQue
1f7b0 72 79 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  ry = sqlite3_mpr
1f7c0 69 6e 74 66 28 22 53 45 4c 45 43 54 20 6e 61 6d  intf("SELECT nam
1f7d0 65 2c 20 73 71 6c 20 46 52 4f 4d 20 73 71 6c 69  e, sql FROM sqli
1f7e0 74 65 5f 6d 61 73 74 65 72 22 0a 20 20 20 20 20  te_master".     
1f7f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f800 20 20 20 20 20 20 22 20 57 48 45 52 45 20 25 73        " WHERE %s
1f810 22 2c 20 7a 57 68 65 72 65 29 3b 0a 20 20 72 63  ", zWhere);.  rc
1f820 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61   = sqlite3_prepa
1f830 72 65 5f 76 32 28 70 2d 3e 64 62 2c 20 7a 51 75  re_v2(p->db, zQu
1f840 65 72 79 2c 20 2d 31 2c 20 26 70 51 75 65 72 79  ery, -1, &pQuery
1f850 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 20 29  , 0);.  if( rc )
1f860 7b 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74  {.    utf8_print
1f870 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72  f(stderr, "Error
1f880 3a 20 28 25 64 29 20 25 73 20 6f 6e 20 5b 25 73  : (%d) %s on [%s
1f890 5d 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  ]\n",.          
1f8a0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
1f8b0 33 5f 65 78 74 65 6e 64 65 64 5f 65 72 72 63 6f  3_extended_errco
1f8c0 64 65 28 70 2d 3e 64 62 29 2c 20 73 71 6c 69 74  de(p->db), sqlit
1f8d0 65 33 5f 65 72 72 6d 73 67 28 70 2d 3e 64 62 29  e3_errmsg(p->db)
1f8e0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1f8f0 20 20 20 20 20 20 7a 51 75 65 72 79 29 3b 0a 20        zQuery);. 
1f900 20 20 20 67 6f 74 6f 20 65 6e 64 5f 73 63 68 65     goto end_sche
1f910 6d 61 5f 78 66 65 72 3b 0a 20 20 7d 0a 20 20 77  ma_xfer;.  }.  w
1f920 68 69 6c 65 28 20 28 72 63 20 3d 20 73 71 6c 69  hile( (rc = sqli
1f930 74 65 33 5f 73 74 65 70 28 70 51 75 65 72 79 29  te3_step(pQuery)
1f940 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b  )==SQLITE_ROW ){
1f950 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c  .    zName = sql
1f960 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  ite3_column_text
1f970 28 70 51 75 65 72 79 2c 20 30 29 3b 0a 20 20 20  (pQuery, 0);.   
1f980 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f   zSql = sqlite3_
1f990 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 51 75 65  column_text(pQue
1f9a0 72 79 2c 20 31 29 3b 0a 20 20 20 20 70 72 69 6e  ry, 1);.    prin
1f9b0 74 66 28 22 25 73 2e 2e 2e 20 22 2c 20 7a 4e 61  tf("%s... ", zNa
1f9c0 6d 65 29 3b 20 66 66 6c 75 73 68 28 73 74 64 6f  me); fflush(stdo
1f9d0 75 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ut);.    sqlite3
1f9e0 5f 65 78 65 63 28 6e 65 77 44 62 2c 20 28 63 6f  _exec(newDb, (co
1f9f0 6e 73 74 20 63 68 61 72 2a 29 7a 53 71 6c 2c 20  nst char*)zSql, 
1fa00 30 2c 20 30 2c 20 26 7a 45 72 72 4d 73 67 29 3b  0, 0, &zErrMsg);
1fa10 0a 20 20 20 20 69 66 28 20 7a 45 72 72 4d 73 67  .    if( zErrMsg
1fa20 20 29 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70   ){.      utf8_p
1fa30 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45  rintf(stderr, "E
1fa40 72 72 6f 72 3a 20 25 73 5c 6e 53 51 4c 3a 20 5b  rror: %s\nSQL: [
1fa50 25 73 5d 5c 6e 22 2c 20 7a 45 72 72 4d 73 67 2c  %s]\n", zErrMsg,
1fa60 20 7a 53 71 6c 29 3b 0a 20 20 20 20 20 20 73 71   zSql);.      sq
1fa70 6c 69 74 65 33 5f 66 72 65 65 28 7a 45 72 72 4d  lite3_free(zErrM
1fa80 73 67 29 3b 0a 20 20 20 20 20 20 7a 45 72 72 4d  sg);.      zErrM
1fa90 73 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  sg = 0;.    }.  
1faa0 20 20 69 66 28 20 78 46 6f 72 45 61 63 68 20 29    if( xForEach )
1fab0 7b 0a 20 20 20 20 20 20 78 46 6f 72 45 61 63 68  {.      xForEach
1fac0 28 70 2c 20 6e 65 77 44 62 2c 20 28 63 6f 6e 73  (p, newDb, (cons
1fad0 74 20 63 68 61 72 2a 29 7a 4e 61 6d 65 29 3b 0a  t char*)zName);.
1fae0 20 20 20 20 7d 0a 20 20 20 20 70 72 69 6e 74 66      }.    printf
1faf0 28 22 64 6f 6e 65 5c 6e 22 29 3b 0a 20 20 7d 0a  ("done\n");.  }.
1fb00 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1fb10 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 73 71 6c  _DONE ){.    sql
1fb20 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 51  ite3_finalize(pQ
1fb30 75 65 72 79 29 3b 0a 20 20 20 20 73 71 6c 69 74  uery);.    sqlit
1fb40 65 33 5f 66 72 65 65 28 7a 51 75 65 72 79 29 3b  e3_free(zQuery);
1fb50 0a 20 20 20 20 7a 51 75 65 72 79 20 3d 20 73 71  .    zQuery = sq
1fb60 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 53  lite3_mprintf("S
1fb70 45 4c 45 43 54 20 6e 61 6d 65 2c 20 73 71 6c 20  ELECT name, sql 
1fb80 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74  FROM sqlite_mast
1fb90 65 72 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  er".            
1fba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fbb0 20 22 20 57 48 45 52 45 20 25 73 20 4f 52 44 45   " WHERE %s ORDE
1fbc0 52 20 42 59 20 72 6f 77 69 64 20 44 45 53 43 22  R BY rowid DESC"
1fbd0 2c 20 7a 57 68 65 72 65 29 3b 0a 20 20 20 20 72  , zWhere);.    r
1fbe0 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70  c = sqlite3_prep
1fbf0 61 72 65 5f 76 32 28 70 2d 3e 64 62 2c 20 7a 51  are_v2(p->db, zQ
1fc00 75 65 72 79 2c 20 2d 31 2c 20 26 70 51 75 65 72  uery, -1, &pQuer
1fc10 79 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72  y, 0);.    if( r
1fc20 63 20 29 7b 0a 20 20 20 20 20 20 75 74 66 38 5f  c ){.      utf8_
1fc30 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
1fc40 45 72 72 6f 72 3a 20 28 25 64 29 20 25 73 20 6f  Error: (%d) %s o
1fc50 6e 20 5b 25 73 5d 5c 6e 22 2c 0a 20 20 20 20 20  n [%s]\n",.     
1fc60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fc70 20 73 71 6c 69 74 65 33 5f 65 78 74 65 6e 64 65   sqlite3_extende
1fc80 64 5f 65 72 72 63 6f 64 65 28 70 2d 3e 64 62 29  d_errcode(p->db)
1fc90 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  , sqlite3_errmsg
1fca0 28 70 2d 3e 64 62 29 2c 0a 20 20 20 20 20 20 20  (p->db),.       
1fcb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a                 z
1fcc0 51 75 65 72 79 29 3b 0a 20 20 20 20 20 20 67 6f  Query);.      go
1fcd0 74 6f 20 65 6e 64 5f 73 63 68 65 6d 61 5f 78 66  to end_schema_xf
1fce0 65 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 77 68  er;.    }.    wh
1fcf0 69 6c 65 28 20 28 72 63 20 3d 20 73 71 6c 69 74  ile( (rc = sqlit
1fd00 65 33 5f 73 74 65 70 28 70 51 75 65 72 79 29 29  e3_step(pQuery))
1fd10 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a  ==SQLITE_ROW ){.
1fd20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71        zName = sq
1fd30 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
1fd40 74 28 70 51 75 65 72 79 2c 20 30 29 3b 0a 20 20  t(pQuery, 0);.  
1fd50 20 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74      zSql = sqlit
1fd60 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70  e3_column_text(p
1fd70 51 75 65 72 79 2c 20 31 29 3b 0a 20 20 20 20 20  Query, 1);.     
1fd80 20 70 72 69 6e 74 66 28 22 25 73 2e 2e 2e 20 22   printf("%s... "
1fd90 2c 20 7a 4e 61 6d 65 29 3b 20 66 66 6c 75 73 68  , zName); fflush
1fda0 28 73 74 64 6f 75 74 29 3b 0a 20 20 20 20 20 20  (stdout);.      
1fdb0 73 71 6c 69 74 65 33 5f 65 78 65 63 28 6e 65 77  sqlite3_exec(new
1fdc0 44 62 2c 20 28 63 6f 6e 73 74 20 63 68 61 72 2a  Db, (const char*
1fdd0 29 7a 53 71 6c 2c 20 30 2c 20 30 2c 20 26 7a 45  )zSql, 0, 0, &zE
1fde0 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 69 66  rrMsg);.      if
1fdf0 28 20 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20  ( zErrMsg ){.   
1fe00 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
1fe10 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a  (stderr, "Error:
1fe20 20 25 73 5c 6e 53 51 4c 3a 20 5b 25 73 5d 5c 6e   %s\nSQL: [%s]\n
1fe30 22 2c 20 7a 45 72 72 4d 73 67 2c 20 7a 53 71 6c  ", zErrMsg, zSql
1fe40 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
1fe50 65 33 5f 66 72 65 65 28 7a 45 72 72 4d 73 67 29  e3_free(zErrMsg)
1fe60 3b 0a 20 20 20 20 20 20 20 20 7a 45 72 72 4d 73  ;.        zErrMs
1fe70 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  g = 0;.      }. 
1fe80 20 20 20 20 20 69 66 28 20 78 46 6f 72 45 61 63       if( xForEac
1fe90 68 20 29 7b 0a 20 20 20 20 20 20 20 20 78 46 6f  h ){.        xFo
1fea0 72 45 61 63 68 28 70 2c 20 6e 65 77 44 62 2c 20  rEach(p, newDb, 
1feb0 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 7a 4e 61  (const char*)zNa
1fec0 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  me);.      }.   
1fed0 20 20 20 70 72 69 6e 74 66 28 22 64 6f 6e 65 5c     printf("done\
1fee0 6e 22 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 65  n");.    }.  }.e
1fef0 6e 64 5f 73 63 68 65 6d 61 5f 78 66 65 72 3a 0a  nd_schema_xfer:.
1ff00 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69    sqlite3_finali
1ff10 7a 65 28 70 51 75 65 72 79 29 3b 0a 20 20 73 71  ze(pQuery);.  sq
1ff20 6c 69 74 65 33 5f 66 72 65 65 28 7a 51 75 65 72  lite3_free(zQuer
1ff30 79 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65  y);.}../*.** Ope
1ff40 6e 20 61 20 6e 65 77 20 64 61 74 61 62 61 73 65  n a new database
1ff50 20 66 69 6c 65 20 6e 61 6d 65 64 20 22 7a 4e 65   file named "zNe
1ff60 77 44 62 22 2e 20 20 54 72 79 20 74 6f 20 72 65  wDb".  Try to re
1ff70 63 6f 76 65 72 20 61 73 20 6d 75 63 68 20 69 6e  cover as much in
1ff80 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 61 73 20  formation.** as 
1ff90 70 6f 73 73 69 62 6c 65 20 6f 75 74 20 6f 66 20  possible out of 
1ffa0 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73  the main databas
1ffb0 65 20 28 77 68 69 63 68 20 6d 69 67 68 74 20 62  e (which might b
1ffc0 65 20 63 6f 72 72 75 70 74 29 20 61 6e 64 20 77  e corrupt) and w
1ffd0 72 69 74 65 20 69 74 0a 2a 2a 20 69 6e 74 6f 20  rite it.** into 
1ffe0 7a 4e 65 77 44 62 2e 0a 2a 2f 0a 73 74 61 74 69  zNewDb..*/.stati
1fff0 63 20 76 6f 69 64 20 74 72 79 54 6f 43 6c 6f 6e  c void tryToClon
20000 65 28 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 2c  e(ShellState *p,
20010 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 65   const char *zNe
20020 77 44 62 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  wDb){.  int rc;.
20030 20 20 73 71 6c 69 74 65 33 20 2a 6e 65 77 44 62    sqlite3 *newDb
20040 20 3d 20 30 3b 0a 20 20 69 66 28 20 61 63 63 65   = 0;.  if( acce
20050 73 73 28 7a 4e 65 77 44 62 2c 30 29 3d 3d 30 20  ss(zNewDb,0)==0 
20060 29 7b 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e  ){.    utf8_prin
20070 74 66 28 73 74 64 65 72 72 2c 20 22 46 69 6c 65  tf(stderr, "File
20080 20 5c 22 25 73 5c 22 20 61 6c 72 65 61 64 79 20   \"%s\" already 
20090 65 78 69 73 74 73 2e 5c 6e 22 2c 20 7a 4e 65 77  exists.\n", zNew
200a0 44 62 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  Db);.    return;
200b0 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69  .  }.  rc = sqli
200c0 74 65 33 5f 6f 70 65 6e 28 7a 4e 65 77 44 62 2c  te3_open(zNewDb,
200d0 20 26 6e 65 77 44 62 29 3b 0a 20 20 69 66 28 20   &newDb);.  if( 
200e0 72 63 20 29 7b 0a 20 20 20 20 75 74 66 38 5f 70  rc ){.    utf8_p
200f0 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 43  rintf(stderr, "C
20100 61 6e 6e 6f 74 20 63 72 65 61 74 65 20 6f 75 74  annot create out
20110 70 75 74 20 64 61 74 61 62 61 73 65 3a 20 25 73  put database: %s
20120 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
20130 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
20140 6e 65 77 44 62 29 29 3b 0a 20 20 7d 65 6c 73 65  newDb));.  }else
20150 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 65 78  {.    sqlite3_ex
20160 65 63 28 70 2d 3e 64 62 2c 20 22 50 52 41 47 4d  ec(p->db, "PRAGM
20170 41 20 77 72 69 74 61 62 6c 65 5f 73 63 68 65 6d  A writable_schem
20180 61 3d 4f 4e 3b 22 2c 20 30 2c 20 30 2c 20 30 29  a=ON;", 0, 0, 0)
20190 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 65 78  ;.    sqlite3_ex
201a0 65 63 28 6e 65 77 44 62 2c 20 22 42 45 47 49 4e  ec(newDb, "BEGIN
201b0 20 45 58 43 4c 55 53 49 56 45 3b 22 2c 20 30 2c   EXCLUSIVE;", 0,
201c0 20 30 2c 20 30 29 3b 0a 20 20 20 20 74 72 79 54   0, 0);.    tryT
201d0 6f 43 6c 6f 6e 65 53 63 68 65 6d 61 28 70 2c 20  oCloneSchema(p, 
201e0 6e 65 77 44 62 2c 20 22 74 79 70 65 3d 27 74 61  newDb, "type='ta
201f0 62 6c 65 27 22 2c 20 74 72 79 54 6f 43 6c 6f 6e  ble'", tryToClon
20200 65 44 61 74 61 29 3b 0a 20 20 20 20 74 72 79 54  eData);.    tryT
20210 6f 43 6c 6f 6e 65 53 63 68 65 6d 61 28 70 2c 20  oCloneSchema(p, 
20220 6e 65 77 44 62 2c 20 22 74 79 70 65 21 3d 27 74  newDb, "type!='t
20230 61 62 6c 65 27 22 2c 20 30 29 3b 0a 20 20 20 20  able'", 0);.    
20240 73 71 6c 69 74 65 33 5f 65 78 65 63 28 6e 65 77  sqlite3_exec(new
20250 44 62 2c 20 22 43 4f 4d 4d 49 54 3b 22 2c 20 30  Db, "COMMIT;", 0
20260 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  , 0, 0);.    sql
20270 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c  ite3_exec(p->db,
20280 20 22 50 52 41 47 4d 41 20 77 72 69 74 61 62 6c   "PRAGMA writabl
20290 65 5f 73 63 68 65 6d 61 3d 4f 46 46 3b 22 2c 20  e_schema=OFF;", 
202a0 30 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  0, 0, 0);.  }.  
202b0 63 6c 6f 73 65 5f 64 62 28 6e 65 77 44 62 29 3b  close_db(newDb);
202c0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
202d0 20 74 68 65 20 6f 75 74 70 75 74 20 66 69 6c 65   the output file
202e0 20 62 61 63 6b 20 74 6f 20 73 74 64 6f 75 74 2e   back to stdout.
202f0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 2d  .**.** If the p-
20300 3e 64 6f 58 64 67 4f 70 65 6e 20 66 6c 61 67 20  >doXdgOpen flag 
20310 69 73 20 73 65 74 2c 20 74 68 61 74 20 6d 65 61  is set, that mea
20320 6e 73 20 74 68 65 20 6f 75 74 70 75 74 20 77 61  ns the output wa
20330 73 20 62 65 69 6e 67 0a 2a 2a 20 72 65 64 69 72  s being.** redir
20340 65 63 74 65 64 20 74 6f 20 61 20 74 65 6d 70 6f  ected to a tempo
20350 72 61 72 79 20 66 69 6c 65 20 6e 61 6d 65 64 20  rary file named 
20360 62 79 20 70 2d 3e 7a 54 65 6d 70 46 69 6c 65 2e  by p->zTempFile.
20370 20 20 49 6e 20 74 68 61 74 20 63 61 73 65 2c 0a    In that case,.
20380 2a 2a 20 6c 61 75 6e 63 68 20 73 74 61 72 74 2f  ** launch start/
20390 6f 70 65 6e 2f 78 64 67 2d 6f 70 65 6e 20 6f 6e  open/xdg-open on
203a0 20 74 68 61 74 20 74 65 6d 70 6f 72 61 72 79 20   that temporary 
203b0 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  file..*/.static 
203c0 76 6f 69 64 20 6f 75 74 70 75 74 5f 72 65 73 65  void output_rese
203d0 74 28 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 29  t(ShellState *p)
203e0 7b 0a 20 20 69 66 28 20 70 2d 3e 6f 75 74 66 69  {.  if( p->outfi
203f0 6c 65 5b 30 5d 3d 3d 27 7c 27 20 29 7b 0a 23 69  le[0]=='|' ){.#i
20400 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
20410 54 5f 50 4f 50 45 4e 0a 20 20 20 20 70 63 6c 6f  T_POPEN.    pclo
20420 73 65 28 70 2d 3e 6f 75 74 29 3b 0a 23 65 6e 64  se(p->out);.#end
20430 69 66 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  if.  }else{.    
20440 6f 75 74 70 75 74 5f 66 69 6c 65 5f 63 6c 6f 73  output_file_clos
20450 65 28 70 2d 3e 6f 75 74 29 3b 0a 23 69 66 6e 64  e(p->out);.#ifnd
20460 65 66 20 53 51 4c 49 54 45 5f 4e 4f 48 41 56 45  ef SQLITE_NOHAVE
20470 5f 53 59 53 54 45 4d 0a 20 20 20 20 69 66 28 20  _SYSTEM.    if( 
20480 70 2d 3e 64 6f 58 64 67 4f 70 65 6e 20 29 7b 0a  p->doXdgOpen ){.
20490 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
204a0 20 2a 7a 58 64 67 4f 70 65 6e 43 6d 64 20 3d 0a   *zXdgOpenCmd =.
204b0 23 69 66 20 64 65 66 69 6e 65 64 28 5f 57 49 4e  #if defined(_WIN
204c0 33 32 29 0a 20 20 20 20 20 20 22 73 74 61 72 74  32).      "start
204d0 22 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64  ";.#elif defined
204e0 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20 20 20 20  (__APPLE__).    
204f0 20 20 22 6f 70 65 6e 22 3b 0a 23 65 6c 73 65 0a    "open";.#else.
20500 20 20 20 20 20 20 22 78 64 67 2d 6f 70 65 6e 22        "xdg-open"
20510 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 63  ;.#endif.      c
20520 68 61 72 20 2a 7a 43 6d 64 3b 0a 20 20 20 20 20  har *zCmd;.     
20530 20 7a 43 6d 64 20 3d 20 73 71 6c 69 74 65 33 5f   zCmd = sqlite3_
20540 6d 70 72 69 6e 74 66 28 22 25 73 20 25 73 22 2c  mprintf("%s %s",
20550 20 7a 58 64 67 4f 70 65 6e 43 6d 64 2c 20 70 2d   zXdgOpenCmd, p-
20560 3e 7a 54 65 6d 70 46 69 6c 65 29 3b 0a 20 20 20  >zTempFile);.   
20570 20 20 20 69 66 28 20 73 79 73 74 65 6d 28 7a 43     if( system(zC
20580 6d 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20 75  md) ){.        u
20590 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72  tf8_printf(stder
205a0 72 2c 20 22 46 61 69 6c 65 64 3a 20 5b 25 73 5d  r, "Failed: [%s]
205b0 5c 6e 22 2c 20 7a 43 6d 64 29 3b 0a 20 20 20 20  \n", zCmd);.    
205c0 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
205d0 33 5f 66 72 65 65 28 7a 43 6d 64 29 3b 0a 20 20  3_free(zCmd);.  
205e0 20 20 20 20 6f 75 74 70 75 74 4d 6f 64 65 50 6f      outputModePo
205f0 70 28 70 29 3b 0a 20 20 20 20 20 20 70 2d 3e 64  p(p);.      p->d
20600 6f 58 64 67 4f 70 65 6e 20 3d 20 30 3b 0a 20 20  oXdgOpen = 0;.  
20610 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64    }.#endif /* !d
20620 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4e 4f  efined(SQLITE_NO
20630 48 41 56 45 5f 53 59 53 54 45 4d 29 20 2a 2f 0a  HAVE_SYSTEM) */.
20640 20 20 7d 0a 20 20 70 2d 3e 6f 75 74 66 69 6c 65    }.  p->outfile
20650 5b 30 5d 20 3d 20 30 3b 0a 20 20 70 2d 3e 6f 75  [0] = 0;.  p->ou
20660 74 20 3d 20 73 74 64 6f 75 74 3b 0a 7d 0a 0a 2f  t = stdout;.}../
20670 2a 0a 2a 2a 20 52 75 6e 20 61 6e 20 53 51 4c 20  *.** Run an SQL 
20680 63 6f 6d 6d 61 6e 64 20 61 6e 64 20 72 65 74 75  command and retu
20690 72 6e 20 74 68 65 20 73 69 6e 67 6c 65 20 69 6e  rn the single in
206a0 74 65 67 65 72 20 72 65 73 75 6c 74 2e 0a 2a 2f  teger result..*/
206b0 0a 73 74 61 74 69 63 20 69 6e 74 20 64 62 5f 69  .static int db_i
206c0 6e 74 28 53 68 65 6c 6c 53 74 61 74 65 20 2a 70  nt(ShellState *p
206d0 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53  , const char *zS
206e0 71 6c 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73  ql){.  sqlite3_s
206f0 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e  tmt *pStmt;.  in
20700 74 20 72 65 73 20 3d 20 30 3b 0a 20 20 73 71 6c  t res = 0;.  sql
20710 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28  ite3_prepare_v2(
20720 70 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c  p->db, zSql, -1,
20730 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 69   &pStmt, 0);.  i
20740 66 28 20 70 53 74 6d 74 20 26 26 20 73 71 6c 69  f( pStmt && sqli
20750 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3d  te3_step(pStmt)=
20760 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20  =SQLITE_ROW ){. 
20770 20 20 20 72 65 73 20 3d 20 73 71 6c 69 74 65 33     res = sqlite3
20780 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 74 6d  _column_int(pStm
20790 74 2c 30 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  t,0);.  }.  sqli
207a0 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74  te3_finalize(pSt
207b0 6d 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 65  mt);.  return re
207c0 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76  s;.}../*.** Conv
207d0 65 72 74 20 61 20 32 2d 62 79 74 65 20 6f 72 20  ert a 2-byte or 
207e0 34 2d 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61  4-byte big-endia
207f0 6e 20 69 6e 74 65 67 65 72 20 69 6e 74 6f 20 61  n integer into a
20800 20 6e 61 74 69 76 65 20 69 6e 74 65 67 65 72 0a   native integer.
20810 2a 2f 0a 73 74 61 74 69 63 20 75 6e 73 69 67 6e  */.static unsign
20820 65 64 20 69 6e 74 20 67 65 74 32 62 79 74 65 49  ed int get2byteI
20830 6e 74 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  nt(unsigned char
20840 20 2a 61 29 7b 0a 20 20 72 65 74 75 72 6e 20 28   *a){.  return (
20850 61 5b 30 5d 3c 3c 38 29 20 2b 20 61 5b 31 5d 3b  a[0]<<8) + a[1];
20860 0a 7d 0a 73 74 61 74 69 63 20 75 6e 73 69 67 6e  .}.static unsign
20870 65 64 20 69 6e 74 20 67 65 74 34 62 79 74 65 49  ed int get4byteI
20880 6e 74 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  nt(unsigned char
20890 20 2a 61 29 7b 0a 20 20 72 65 74 75 72 6e 20 28   *a){.  return (
208a0 61 5b 30 5d 3c 3c 32 34 29 20 2b 20 28 61 5b 31  a[0]<<24) + (a[1
208b0 5d 3c 3c 31 36 29 20 2b 20 28 61 5b 32 5d 3c 3c  ]<<16) + (a[2]<<
208c0 38 29 20 2b 20 61 5b 33 5d 3b 0a 7d 0a 0a 2f 2a  8) + a[3];.}../*
208d0 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69  .** Implementati
208e0 6f 6e 20 6f 66 20 74 68 65 20 22 2e 69 6e 66 6f  on of the ".info
208f0 22 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a  " command..**.**
20900 20 52 65 74 75 72 6e 20 31 20 6f 6e 20 65 72 72   Return 1 on err
20910 6f 72 2c 20 32 20 74 6f 20 65 78 69 74 2c 20 61  or, 2 to exit, a
20920 6e 64 20 30 20 6f 74 68 65 72 77 69 73 65 2e 0a  nd 0 otherwise..
20930 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 68  */.static int sh
20940 65 6c 6c 5f 64 62 69 6e 66 6f 5f 63 6f 6d 6d 61  ell_dbinfo_comma
20950 6e 64 28 53 68 65 6c 6c 53 74 61 74 65 20 2a 70  nd(ShellState *p
20960 2c 20 69 6e 74 20 6e 41 72 67 2c 20 63 68 61 72  , int nArg, char
20970 20 2a 2a 61 7a 41 72 67 29 7b 0a 20 20 73 74 61   **azArg){.  sta
20980 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74  tic const struct
20990 20 7b 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a   { const char *z
209a0 4e 61 6d 65 3b 20 69 6e 74 20 6f 66 73 74 3b 20  Name; int ofst; 
209b0 7d 20 61 46 69 65 6c 64 5b 5d 20 3d 20 7b 0a 20  } aField[] = {. 
209c0 20 20 20 20 7b 20 22 66 69 6c 65 20 63 68 61 6e      { "file chan
209d0 67 65 20 63 6f 75 6e 74 65 72 3a 22 2c 20 20 32  ge counter:",  2
209e0 34 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 64 61  4  },.     { "da
209f0 74 61 62 61 73 65 20 70 61 67 65 20 63 6f 75 6e  tabase page coun
20a00 74 3a 22 2c 20 20 32 38 20 20 7d 2c 0a 20 20 20  t:",  28  },.   
20a10 20 20 7b 20 22 66 72 65 65 6c 69 73 74 20 70 61    { "freelist pa
20a20 67 65 20 63 6f 75 6e 74 3a 22 2c 20 20 33 36 20  ge count:",  36 
20a30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 63 68 65   },.     { "sche
20a40 6d 61 20 63 6f 6f 6b 69 65 3a 22 2c 20 20 20 20  ma cookie:",    
20a50 20 20 20 20 34 30 20 20 7d 2c 0a 20 20 20 20 20      40  },.     
20a60 7b 20 22 73 63 68 65 6d 61 20 66 6f 72 6d 61 74  { "schema format
20a70 3a 22 2c 20 20 20 20 20 20 20 20 34 34 20 20 7d  :",        44  }
20a80 2c 0a 20 20 20 20 20 7b 20 22 64 65 66 61 75 6c  ,.     { "defaul
20a90 74 20 63 61 63 68 65 20 73 69 7a 65 3a 22 2c 20  t cache size:", 
20aa0 20 20 34 38 20 20 7d 2c 0a 20 20 20 20 20 7b 20    48  },.     { 
20ab0 22 61 75 74 6f 76 61 63 75 75 6d 20 74 6f 70 20  "autovacuum top 
20ac0 72 6f 6f 74 3a 22 2c 20 20 35 32 20 20 7d 2c 0a  root:",  52  },.
20ad0 20 20 20 20 20 7b 20 22 69 6e 63 72 65 6d 65 6e       { "incremen
20ae0 74 61 6c 20 76 61 63 75 75 6d 3a 22 2c 20 20 20  tal vacuum:",   
20af0 36 34 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 74  64  },.     { "t
20b00 65 78 74 20 65 6e 63 6f 64 69 6e 67 3a 22 2c 20  ext encoding:", 
20b10 20 20 20 20 20 20 20 35 36 20 20 7d 2c 0a 20 20         56  },.  
20b20 20 20 20 7b 20 22 75 73 65 72 20 76 65 72 73 69     { "user versi
20b30 6f 6e 3a 22 2c 20 20 20 20 20 20 20 20 20 36 30  on:",         60
20b40 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 61 70 70    },.     { "app
20b50 6c 69 63 61 74 69 6f 6e 20 69 64 3a 22 2c 20 20  lication id:",  
20b60 20 20 20 20 20 36 38 20 20 7d 2c 0a 20 20 20 20       68  },.    
20b70 20 7b 20 22 73 6f 66 74 77 61 72 65 20 76 65 72   { "software ver
20b80 73 69 6f 6e 3a 22 2c 20 20 20 20 20 39 36 20 20  sion:",     96  
20b90 7d 2c 0a 20 20 7d 3b 0a 20 20 73 74 61 74 69 63  },.  };.  static
20ba0 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20 7b 20   const struct { 
20bb0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
20bc0 65 3b 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  e; const char *z
20bd0 53 71 6c 3b 20 7d 20 61 51 75 65 72 79 5b 5d 20  Sql; } aQuery[] 
20be0 3d 20 7b 0a 20 20 20 20 20 7b 20 22 6e 75 6d 62  = {.     { "numb
20bf0 65 72 20 6f 66 20 74 61 62 6c 65 73 3a 22 2c 0a  er of tables:",.
20c00 20 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 63         "SELECT c
20c10 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 25 73 20  ount(*) FROM %s 
20c20 57 48 45 52 45 20 74 79 70 65 3d 27 74 61 62 6c  WHERE type='tabl
20c30 65 27 22 20 7d 2c 0a 20 20 20 20 20 7b 20 22 6e  e'" },.     { "n
20c40 75 6d 62 65 72 20 6f 66 20 69 6e 64 65 78 65 73  umber of indexes
20c50 3a 22 2c 0a 20 20 20 20 20 20 20 22 53 45 4c 45  :",.       "SELE
20c60 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d  CT count(*) FROM
20c70 20 25 73 20 57 48 45 52 45 20 74 79 70 65 3d 27   %s WHERE type='
20c80 69 6e 64 65 78 27 22 20 7d 2c 0a 20 20 20 20 20  index'" },.     
20c90 7b 20 22 6e 75 6d 62 65 72 20 6f 66 20 74 72 69  { "number of tri
20ca0 67 67 65 72 73 3a 22 2c 0a 20 20 20 20 20 20 20  ggers:",.       
20cb0 22 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29  "SELECT count(*)
20cc0 20 46 52 4f 4d 20 25 73 20 57 48 45 52 45 20 74   FROM %s WHERE t
20cd0 79 70 65 3d 27 74 72 69 67 67 65 72 27 22 20 7d  ype='trigger'" }
20ce0 2c 0a 20 20 20 20 20 7b 20 22 6e 75 6d 62 65 72  ,.     { "number
20cf0 20 6f 66 20 76 69 65 77 73 3a 22 2c 0a 20 20 20   of views:",.   
20d00 20 20 20 20 22 53 45 4c 45 43 54 20 63 6f 75 6e      "SELECT coun
20d10 74 28 2a 29 20 46 52 4f 4d 20 25 73 20 57 48 45  t(*) FROM %s WHE
20d20 52 45 20 74 79 70 65 3d 27 76 69 65 77 27 22 20  RE type='view'" 
20d30 7d 2c 0a 20 20 20 20 20 7b 20 22 73 63 68 65 6d  },.     { "schem
20d40 61 20 73 69 7a 65 3a 22 2c 0a 20 20 20 20 20 20  a size:",.      
20d50 20 22 53 45 4c 45 43 54 20 74 6f 74 61 6c 28 6c   "SELECT total(l
20d60 65 6e 67 74 68 28 73 71 6c 29 29 20 46 52 4f 4d  ength(sql)) FROM
20d70 20 25 73 22 20 7d 2c 0a 20 20 7d 3b 0a 20 20 69   %s" },.  };.  i
20d80 6e 74 20 69 3b 0a 20 20 63 68 61 72 20 2a 7a 53  nt i;.  char *zS
20d90 63 68 65 6d 61 54 61 62 3b 0a 20 20 63 68 61 72  chemaTab;.  char
20da0 20 2a 7a 44 62 20 3d 20 6e 41 72 67 3e 3d 32 20   *zDb = nArg>=2 
20db0 3f 20 61 7a 41 72 67 5b 31 5d 20 3a 20 22 6d 61  ? azArg[1] : "ma
20dc0 69 6e 22 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73  in";.  sqlite3_s
20dd0 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a  tmt *pStmt = 0;.
20de0 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
20df0 61 48 64 72 5b 31 30 30 5d 3b 0a 20 20 6f 70 65  aHdr[100];.  ope
20e00 6e 5f 64 62 28 70 2c 20 30 29 3b 0a 20 20 69 66  n_db(p, 0);.  if
20e10 28 20 70 2d 3e 64 62 3d 3d 30 20 29 20 72 65 74  ( p->db==0 ) ret
20e20 75 72 6e 20 31 3b 0a 20 20 73 71 6c 69 74 65 33  urn 1;.  sqlite3
20e30 5f 70 72 65 70 61 72 65 5f 76 32 28 70 2d 3e 64  _prepare_v2(p->d
20e40 62 2c 22 53 45 4c 45 43 54 20 64 61 74 61 20 46  b,"SELECT data F
20e50 52 4f 4d 20 73 71 6c 69 74 65 5f 64 62 70 61 67  ROM sqlite_dbpag
20e60 65 28 3f 31 29 20 57 48 45 52 45 20 70 67 6e 6f  e(?1) WHERE pgno
20e70 3d 31 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  =1",.           
20e80 20 20 20 20 20 20 20 20 20 20 2d 31 2c 20 26 70            -1, &p
20e90 53 74 6d 74 2c 20 30 29 3b 0a 20 20 73 71 6c 69  Stmt, 0);.  sqli
20ea0 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 28 70 53  te3_bind_text(pS
20eb0 74 6d 74 2c 20 31 2c 20 7a 44 62 2c 20 2d 31 2c  tmt, 1, zDb, -1,
20ec0 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b   SQLITE_STATIC);
20ed0 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73  .  if( sqlite3_s
20ee0 74 65 70 28 70 53 74 6d 74 29 3d 3d 53 51 4c 49  tep(pStmt)==SQLI
20ef0 54 45 5f 52 4f 57 0a 20 20 20 26 26 20 73 71 6c  TE_ROW.   && sql
20f00 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65  ite3_column_byte
20f10 73 28 70 53 74 6d 74 2c 30 29 3e 31 30 30 0a 20  s(pStmt,0)>100. 
20f20 20 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28 61   ){.    memcpy(a
20f30 48 64 72 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c  Hdr, sqlite3_col
20f40 75 6d 6e 5f 62 6c 6f 62 28 70 53 74 6d 74 2c 30  umn_blob(pStmt,0
20f50 29 2c 20 31 30 30 29 3b 0a 20 20 20 20 73 71 6c  ), 100);.    sql
20f60 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53  ite3_finalize(pS
20f70 74 6d 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  tmt);.  }else{. 
20f80 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74     raw_printf(st
20f90 64 65 72 72 2c 20 22 75 6e 61 62 6c 65 20 74 6f  derr, "unable to
20fa0 20 72 65 61 64 20 64 61 74 61 62 61 73 65 20 68   read database h
20fb0 65 61 64 65 72 5c 6e 22 29 3b 0a 20 20 20 20 73  eader\n");.    s
20fc0 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
20fd0 70 53 74 6d 74 29 3b 0a 20 20 20 20 72 65 74 75  pStmt);.    retu
20fe0 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 20 3d 20  rn 1;.  }.  i = 
20ff0 67 65 74 32 62 79 74 65 49 6e 74 28 61 48 64 72  get2byteInt(aHdr
21000 2b 31 36 29 3b 0a 20 20 69 66 28 20 69 3d 3d 31  +16);.  if( i==1
21010 20 29 20 69 20 3d 20 36 35 35 33 36 3b 0a 20 20   ) i = 65536;.  
21020 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f  utf8_printf(p->o
21030 75 74 2c 20 22 25 2d 32 30 73 20 25 64 5c 6e 22  ut, "%-20s %d\n"
21040 2c 20 22 64 61 74 61 62 61 73 65 20 70 61 67 65  , "database page
21050 20 73 69 7a 65 3a 22 2c 20 69 29 3b 0a 20 20 75   size:", i);.  u
21060 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  tf8_printf(p->ou
21070 74 2c 20 22 25 2d 32 30 73 20 25 64 5c 6e 22 2c  t, "%-20s %d\n",
21080 20 22 77 72 69 74 65 20 66 6f 72 6d 61 74 3a 22   "write format:"
21090 2c 20 61 48 64 72 5b 31 38 5d 29 3b 0a 20 20 75  , aHdr[18]);.  u
210a0 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  tf8_printf(p->ou
210b0 74 2c 20 22 25 2d 32 30 73 20 25 64 5c 6e 22 2c  t, "%-20s %d\n",
210c0 20 22 72 65 61 64 20 66 6f 72 6d 61 74 3a 22 2c   "read format:",
210d0 20 61 48 64 72 5b 31 39 5d 29 3b 0a 20 20 75 74   aHdr[19]);.  ut
210e0 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  f8_printf(p->out
210f0 2c 20 22 25 2d 32 30 73 20 25 64 5c 6e 22 2c 20  , "%-20s %d\n", 
21100 22 72 65 73 65 72 76 65 64 20 62 79 74 65 73 3a  "reserved bytes:
21110 22 2c 20 61 48 64 72 5b 32 30 5d 29 3b 0a 20 20  ", aHdr[20]);.  
21120 66 6f 72 28 69 3d 30 3b 20 69 3c 41 72 72 61 79  for(i=0; i<Array
21130 53 69 7a 65 28 61 46 69 65 6c 64 29 3b 20 69 2b  Size(aField); i+
21140 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6f 66 73 74  +){.    int ofst
21150 20 3d 20 61 46 69 65 6c 64 5b 69 5d 2e 6f 66 73   = aField[i].ofs
21160 74 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20  t;.    unsigned 
21170 69 6e 74 20 76 61 6c 20 3d 20 67 65 74 34 62 79  int val = get4by
21180 74 65 49 6e 74 28 61 48 64 72 20 2b 20 6f 66 73  teInt(aHdr + ofs
21190 74 29 3b 0a 20 20 20 20 75 74 66 38 5f 70 72 69  t);.    utf8_pri
211a0 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 2d 32  ntf(p->out, "%-2
211b0 30 73 20 25 75 22 2c 20 61 46 69 65 6c 64 5b 69  0s %u", aField[i
211c0 5d 2e 7a 4e 61 6d 65 2c 20 76 61 6c 29 3b 0a 20  ].zName, val);. 
211d0 20 20 20 73 77 69 74 63 68 28 20 6f 66 73 74 20     switch( ofst 
211e0 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20 35 36  ){.      case 56
211f0 3a 20 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  : {.        if( 
21200 76 61 6c 3d 3d 31 20 29 20 72 61 77 5f 70 72 69  val==1 ) raw_pri
21210 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 20 28 75  ntf(p->out, " (u
21220 74 66 38 29 22 29 3b 0a 20 20 20 20 20 20 20 20  tf8)");.        
21230 69 66 28 20 76 61 6c 3d 3d 32 20 29 20 72 61 77  if( val==2 ) raw
21240 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
21250 22 20 28 75 74 66 31 36 6c 65 29 22 29 3b 0a 20  " (utf16le)");. 
21260 20 20 20 20 20 20 20 69 66 28 20 76 61 6c 3d 3d         if( val==
21270 33 20 29 20 72 61 77 5f 70 72 69 6e 74 66 28 70  3 ) raw_printf(p
21280 2d 3e 6f 75 74 2c 20 22 20 28 75 74 66 31 36 62  ->out, " (utf16b
21290 65 29 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  e)");.      }.  
212a0 20 20 7d 0a 20 20 20 20 72 61 77 5f 70 72 69 6e    }.    raw_prin
212b0 74 66 28 70 2d 3e 6f 75 74 2c 20 22 5c 6e 22 29  tf(p->out, "\n")
212c0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a 44 62 3d  ;.  }.  if( zDb=
212d0 3d 30 20 29 7b 0a 20 20 20 20 7a 53 63 68 65 6d  =0 ){.    zSchem
212e0 61 54 61 62 20 3d 20 73 71 6c 69 74 65 33 5f 6d  aTab = sqlite3_m
212f0 70 72 69 6e 74 66 28 22 6d 61 69 6e 2e 73 71 6c  printf("main.sql
21300 69 74 65 5f 6d 61 73 74 65 72 22 29 3b 0a 20 20  ite_master");.  
21310 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
21320 28 7a 44 62 2c 22 74 65 6d 70 22 29 3d 3d 30 20  (zDb,"temp")==0 
21330 29 7b 0a 20 20 20 20 7a 53 63 68 65 6d 61 54 61  ){.    zSchemaTa
21340 62 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  b = sqlite3_mpri
21350 6e 74 66 28 22 25 73 22 2c 20 22 73 71 6c 69 74  ntf("%s", "sqlit
21360 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72 22 29 3b  e_temp_master");
21370 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 53  .  }else{.    zS
21380 63 68 65 6d 61 54 61 62 20 3d 20 73 71 6c 69 74  chemaTab = sqlit
21390 65 33 5f 6d 70 72 69 6e 74 66 28 22 5c 22 25 77  e3_mprintf("\"%w
213a0 5c 22 2e 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  \".sqlite_master
213b0 22 2c 20 7a 44 62 29 3b 0a 20 20 7d 0a 20 20 66  ", zDb);.  }.  f
213c0 6f 72 28 69 3d 30 3b 20 69 3c 41 72 72 61 79 53  or(i=0; i<ArrayS
213d0 69 7a 65 28 61 51 75 65 72 79 29 3b 20 69 2b 2b  ize(aQuery); i++
213e0 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 71  ){.    char *zSq
213f0 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  l = sqlite3_mpri
21400 6e 74 66 28 61 51 75 65 72 79 5b 69 5d 2e 7a 53  ntf(aQuery[i].zS
21410 71 6c 2c 20 7a 53 63 68 65 6d 61 54 61 62 29 3b  ql, zSchemaTab);
21420 0a 20 20 20 20 69 6e 74 20 76 61 6c 20 3d 20 64  .    int val = d
21430 62 5f 69 6e 74 28 70 2c 20 7a 53 71 6c 29 3b 0a  b_int(p, zSql);.
21440 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
21450 28 7a 53 71 6c 29 3b 0a 20 20 20 20 75 74 66 38  (zSql);.    utf8
21460 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
21470 22 25 2d 32 30 73 20 25 64 5c 6e 22 2c 20 61 51  "%-20s %d\n", aQ
21480 75 65 72 79 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 76  uery[i].zName, v
21490 61 6c 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  al);.  }.  sqlit
214a0 65 33 5f 66 72 65 65 28 7a 53 63 68 65 6d 61 54  e3_free(zSchemaT
214b0 61 62 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b  ab);.  return 0;
214c0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20  .}../*.** Print 
214d0 74 68 65 20 63 75 72 72 65 6e 74 20 73 71 6c 69  the current sqli
214e0 74 65 33 5f 65 72 72 6d 73 67 28 29 20 76 61 6c  te3_errmsg() val
214f0 75 65 20 74 6f 20 73 74 64 65 72 72 20 61 6e 64  ue to stderr and
21500 20 72 65 74 75 72 6e 20 31 2e 0a 2a 2f 0a 73 74   return 1..*/.st
21510 61 74 69 63 20 69 6e 74 20 73 68 65 6c 6c 44 61  atic int shellDa
21520 74 61 62 61 73 65 45 72 72 6f 72 28 73 71 6c 69  tabaseError(sqli
21530 74 65 33 20 2a 64 62 29 7b 0a 20 20 63 6f 6e 73  te3 *db){.  cons
21540 74 20 63 68 61 72 20 2a 7a 45 72 72 20 3d 20 73  t char *zErr = s
21550 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62  qlite3_errmsg(db
21560 29 3b 0a 20 20 75 74 66 38 5f 70 72 69 6e 74 66  );.  utf8_printf
21570 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a  (stderr, "Error:
21580 20 25 73 5c 6e 22 2c 20 7a 45 72 72 29 3b 0a 20   %s\n", zErr);. 
21590 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a   return 1;.}../*
215a0 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 68 65 20  .** Compare the 
215b0 70 61 74 74 65 72 6e 20 69 6e 20 7a 47 6c 6f 62  pattern in zGlob
215c0 5b 5d 20 61 67 61 69 6e 73 74 20 74 68 65 20 74  [] against the t
215d0 65 78 74 20 69 6e 20 7a 5b 5d 2e 20 20 52 65 74  ext in z[].  Ret
215e0 75 72 6e 20 54 52 55 45 0a 2a 2a 20 69 66 20 74  urn TRUE.** if t
215f0 68 65 79 20 6d 61 74 63 68 20 61 6e 64 20 46 41  hey match and FA
21600 4c 53 45 20 28 30 29 20 69 66 20 74 68 65 79 20  LSE (0) if they 
21610 64 6f 20 6e 6f 74 20 6d 61 74 63 68 2e 0a 2a 2a  do not match..**
21620 0a 2a 2a 20 47 6c 6f 62 62 69 6e 67 20 72 75 6c  .** Globbing rul
21630 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 27  es:.**.**      '
21640 2a 27 20 20 20 20 20 20 20 4d 61 74 63 68 65 73  *'       Matches
21650 20 61 6e 79 20 73 65 71 75 65 6e 63 65 20 6f 66   any sequence of
21660 20 7a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 63 68   zero or more ch
21670 61 72 61 63 74 65 72 73 2e 0a 2a 2a 0a 2a 2a 20  aracters..**.** 
21680 20 20 20 20 20 27 3f 27 20 20 20 20 20 20 20 4d       '?'       M
21690 61 74 63 68 65 73 20 65 78 61 63 74 6c 79 20 6f  atches exactly o
216a0 6e 65 20 63 68 61 72 61 63 74 65 72 2e 0a 2a 2a  ne character..**
216b0 0a 2a 2a 20 20 20 20 20 5b 2e 2e 2e 5d 20 20 20  .**     [...]   
216c0 20 20 20 4d 61 74 63 68 65 73 20 6f 6e 65 20 63     Matches one c
216d0 68 61 72 61 63 74 65 72 20 66 72 6f 6d 20 74 68  haracter from th
216e0 65 20 65 6e 63 6c 6f 73 65 64 20 6c 69 73 74 20  e enclosed list 
216f0 6f 66 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  of.**           
21700 20 20 20 20 20 63 68 61 72 61 63 74 65 72 73 2e       characters.
21710 0a 2a 2a 0a 2a 2a 20 20 20 20 20 5b 5e 2e 2e 2e  .**.**     [^...
21720 5d 20 20 20 20 20 4d 61 74 63 68 65 73 20 6f 6e  ]     Matches on
21730 65 20 63 68 61 72 61 63 74 65 72 20 6e 6f 74 20  e character not 
21740 69 6e 20 74 68 65 20 65 6e 63 6c 6f 73 65 64 20  in the enclosed 
21750 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  list..**.**     
21760 20 27 23 27 20 20 20 20 20 20 20 4d 61 74 63 68   '#'       Match
21770 65 73 20 61 6e 79 20 73 65 71 75 65 6e 63 65 20  es any sequence 
21780 6f 66 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 64  of one or more d
21790 69 67 69 74 73 20 77 69 74 68 20 61 6e 0a 2a 2a  igits with an.**
217a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
217b0 6f 70 74 69 6f 6e 61 6c 20 2b 20 6f 72 20 2d 20  optional + or - 
217c0 73 69 67 6e 20 69 6e 20 66 72 6f 6e 74 0a 2a 2a  sign in front.**
217d0 0a 2a 2a 20 20 20 20 20 20 27 20 27 20 20 20 20  .**      ' '    
217e0 20 20 20 41 6e 79 20 73 70 61 6e 20 6f 66 20 77     Any span of w
217f0 68 69 74 65 73 70 61 63 65 20 6d 61 74 63 68 65  hitespace matche
21800 73 20 61 6e 79 20 6f 74 68 65 72 20 73 70 61 6e  s any other span
21810 20 6f 66 0a 2a 2a 20 20 20 20 20 20 20 20 20 20   of.**          
21820 20 20 20 20 20 20 77 68 69 74 65 73 70 61 63 65        whitespace
21830 2e 0a 2a 2a 0a 2a 2a 20 45 78 74 72 61 20 77 68  ..**.** Extra wh
21840 69 74 65 73 70 61 63 65 20 61 74 20 74 68 65 20  itespace at the 
21850 65 6e 64 20 6f 66 20 7a 5b 5d 20 69 73 20 69 67  end of z[] is ig
21860 6e 6f 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  nored..*/.static
21870 20 69 6e 74 20 74 65 73 74 63 61 73 65 5f 67 6c   int testcase_gl
21880 6f 62 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  ob(const char *z
21890 47 6c 6f 62 2c 20 63 6f 6e 73 74 20 63 68 61 72  Glob, const char
218a0 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 63 2c 20 63   *z){.  int c, c
218b0 32 3b 0a 20 20 69 6e 74 20 69 6e 76 65 72 74 3b  2;.  int invert;
218c0 0a 20 20 69 6e 74 20 73 65 65 6e 3b 0a 0a 20 20  .  int seen;..  
218d0 77 68 69 6c 65 28 20 28 63 20 3d 20 28 2a 28 7a  while( (c = (*(z
218e0 47 6c 6f 62 2b 2b 29 29 29 21 3d 30 20 29 7b 0a  Glob++)))!=0 ){.
218f0 20 20 20 20 69 66 28 20 49 73 53 70 61 63 65 28      if( IsSpace(
21900 63 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  c) ){.      if( 
21910 21 49 73 53 70 61 63 65 28 2a 7a 29 20 29 20 72  !IsSpace(*z) ) r
21920 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 77  eturn 0;.      w
21930 68 69 6c 65 28 20 49 73 53 70 61 63 65 28 2a 7a  hile( IsSpace(*z
21940 47 6c 6f 62 29 20 29 20 7a 47 6c 6f 62 2b 2b 3b  Glob) ) zGlob++;
21950 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 49 73  .      while( Is
21960 53 70 61 63 65 28 2a 7a 29 20 29 20 7a 2b 2b 3b  Space(*z) ) z++;
21970 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63  .    }else if( c
21980 3d 3d 27 2a 27 20 29 7b 0a 20 20 20 20 20 20 77  =='*' ){.      w
21990 68 69 6c 65 28 20 28 63 3d 28 2a 28 7a 47 6c 6f  hile( (c=(*(zGlo
219a0 62 2b 2b 29 29 29 20 3d 3d 20 27 2a 27 20 7c 7c  b++))) == '*' ||
219b0 20 63 3d 3d 27 3f 27 20 29 7b 0a 20 20 20 20 20   c=='?' ){.     
219c0 20 20 20 69 66 28 20 63 3d 3d 27 3f 27 20 26 26     if( c=='?' &&
219d0 20 28 2a 28 7a 2b 2b 29 29 3d 3d 30 20 29 20 72   (*(z++))==0 ) r
219e0 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d  eturn 0;.      }
219f0 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d 30 20  .      if( c==0 
21a00 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
21a10 6e 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  n 1;.      }else
21a20 20 69 66 28 20 63 3d 3d 27 5b 27 20 29 7b 0a 20   if( c=='[' ){. 
21a30 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 2a 7a         while( *z
21a40 20 26 26 20 74 65 73 74 63 61 73 65 5f 67 6c 6f   && testcase_glo
21a50 62 28 7a 47 6c 6f 62 2d 31 2c 7a 29 3d 3d 30 20  b(zGlob-1,z)==0 
21a60 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 2b 2b  ){.          z++
21a70 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
21a80 20 20 20 20 72 65 74 75 72 6e 20 28 2a 7a 29 21      return (*z)!
21a90 3d 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  =0;.      }.    
21aa0 20 20 77 68 69 6c 65 28 20 28 63 32 20 3d 20 28    while( (c2 = (
21ab0 2a 28 7a 2b 2b 29 29 29 21 3d 30 20 29 7b 0a 20  *(z++)))!=0 ){. 
21ac0 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 63 32         while( c2
21ad0 21 3d 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20  !=c ){.         
21ae0 20 63 32 20 3d 20 2a 28 7a 2b 2b 29 3b 0a 20 20   c2 = *(z++);.  
21af0 20 20 20 20 20 20 20 20 69 66 28 20 63 32 3d 3d          if( c2==
21b00 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
21b10 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
21b20 69 66 28 20 74 65 73 74 63 61 73 65 5f 67 6c 6f  if( testcase_glo
21b30 62 28 7a 47 6c 6f 62 2c 7a 29 20 29 20 72 65 74  b(zGlob,z) ) ret
21b40 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  urn 1;.      }. 
21b50 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
21b60 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d     }else if( c==
21b70 27 3f 27 20 29 7b 0a 20 20 20 20 20 20 69 66 28  '?' ){.      if(
21b80 20 28 2a 28 7a 2b 2b 29 29 3d 3d 30 20 29 20 72   (*(z++))==0 ) r
21b90 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 65 6c  eturn 0;.    }el
21ba0 73 65 20 69 66 28 20 63 3d 3d 27 5b 27 20 29 7b  se if( c=='[' ){
21bb0 0a 20 20 20 20 20 20 69 6e 74 20 70 72 69 6f 72  .      int prior
21bc0 5f 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 65  _c = 0;.      se
21bd0 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e  en = 0;.      in
21be0 76 65 72 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  vert = 0;.      
21bf0 63 20 3d 20 2a 28 7a 2b 2b 29 3b 0a 20 20 20 20  c = *(z++);.    
21c00 20 20 69 66 28 20 63 3d 3d 30 20 29 20 72 65 74    if( c==0 ) ret
21c10 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 63 32 20  urn 0;.      c2 
21c20 3d 20 2a 28 7a 47 6c 6f 62 2b 2b 29 3b 0a 20 20  = *(zGlob++);.  
21c30 20 20 20 20 69 66 28 20 63 32 3d 3d 27 5e 27 20      if( c2=='^' 
21c40 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 76 65 72  ){.        inver
21c50 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 63  t = 1;.        c
21c60 32 20 3d 20 2a 28 7a 47 6c 6f 62 2b 2b 29 3b 0a  2 = *(zGlob++);.
21c70 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
21c80 28 20 63 32 3d 3d 27 5d 27 20 29 7b 0a 20 20 20  ( c2==']' ){.   
21c90 20 20 20 20 20 69 66 28 20 63 3d 3d 27 5d 27 20       if( c==']' 
21ca0 29 20 73 65 65 6e 20 3d 20 31 3b 0a 20 20 20 20  ) seen = 1;.    
21cb0 20 20 20 20 63 32 20 3d 20 2a 28 7a 47 6c 6f 62      c2 = *(zGlob
21cc0 2b 2b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ++);.      }.   
21cd0 20 20 20 77 68 69 6c 65 28 20 63 32 20 26 26 20     while( c2 && 
21ce0 63 32 21 3d 27 5d 27 20 29 7b 0a 20 20 20 20 20  c2!=']' ){.     
21cf0 20 20 20 69 66 28 20 63 32 3d 3d 27 2d 27 20 26     if( c2=='-' &
21d00 26 20 7a 47 6c 6f 62 5b 30 5d 21 3d 27 5d 27 20  & zGlob[0]!=']' 
21d10 26 26 20 7a 47 6c 6f 62 5b 30 5d 21 3d 30 20 26  && zGlob[0]!=0 &
21d20 26 20 70 72 69 6f 72 5f 63 3e 30 20 29 7b 0a 20  & prior_c>0 ){. 
21d30 20 20 20 20 20 20 20 20 20 63 32 20 3d 20 2a 28           c2 = *(
21d40 7a 47 6c 6f 62 2b 2b 29 3b 0a 20 20 20 20 20 20  zGlob++);.      
21d50 20 20 20 20 69 66 28 20 63 3e 3d 70 72 69 6f 72      if( c>=prior
21d60 5f 63 20 26 26 20 63 3c 3d 63 32 20 29 20 73 65  _c && c<=c2 ) se
21d70 65 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  en = 1;.        
21d80 20 20 70 72 69 6f 72 5f 63 20 3d 20 30 3b 0a 20    prior_c = 0;. 
21d90 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
21da0 20 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d 63          if( c==c
21db0 32 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  2 ){.           
21dc0 20 73 65 65 6e 20 3d 20 31 3b 0a 20 20 20 20 20   seen = 1;.     
21dd0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
21de0 20 70 72 69 6f 72 5f 63 20 3d 20 63 32 3b 0a 20   prior_c = c2;. 
21df0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
21e00 20 63 32 20 3d 20 2a 28 7a 47 6c 6f 62 2b 2b 29   c2 = *(zGlob++)
21e10 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
21e20 69 66 28 20 63 32 3d 3d 30 20 7c 7c 20 28 73 65  if( c2==0 || (se
21e30 65 6e 20 5e 20 69 6e 76 65 72 74 29 3d 3d 30 20  en ^ invert)==0 
21e40 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20  ) return 0;.    
21e50 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 23 27  }else if( c=='#'
21e60 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 7a   ){.      if( (z
21e70 5b 30 5d 3d 3d 27 2d 27 20 7c 7c 20 7a 5b 30 5d  [0]=='-' || z[0]
21e80 3d 3d 27 2b 27 29 20 26 26 20 49 73 44 69 67 69  =='+') && IsDigi
21e90 74 28 7a 5b 31 5d 29 20 29 20 7a 2b 2b 3b 0a 20  t(z[1]) ) z++;. 
21ea0 20 20 20 20 20 69 66 28 20 21 49 73 44 69 67 69       if( !IsDigi
21eb0 74 28 7a 5b 30 5d 29 20 29 20 72 65 74 75 72 6e  t(z[0]) ) return
21ec0 20 30 3b 0a 20 20 20 20 20 20 7a 2b 2b 3b 0a 20   0;.      z++;. 
21ed0 20 20 20 20 20 77 68 69 6c 65 28 20 49 73 44 69       while( IsDi
21ee0 67 69 74 28 7a 5b 30 5d 29 20 29 7b 20 7a 2b 2b  git(z[0]) ){ z++
21ef0 3b 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ; }.    }else{. 
21f00 20 20 20 20 20 69 66 28 20 63 21 3d 28 2a 28 7a       if( c!=(*(z
21f10 2b 2b 29 29 20 29 20 72 65 74 75 72 6e 20 30 3b  ++)) ) return 0;
21f20 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 77 68 69  .    }.  }.  whi
21f30 6c 65 28 20 49 73 53 70 61 63 65 28 2a 7a 29 20  le( IsSpace(*z) 
21f40 29 7b 20 7a 2b 2b 3b 20 7d 0a 20 20 72 65 74 75  ){ z++; }.  retu
21f50 72 6e 20 2a 7a 3d 3d 30 3b 0a 7d 0a 0a 0a 2f 2a  rn *z==0;.}.../*
21f60 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 68 65 20  .** Compare the 
21f70 73 74 72 69 6e 67 20 61 73 20 61 20 63 6f 6d 6d  string as a comm
21f80 61 6e 64 2d 6c 69 6e 65 20 6f 70 74 69 6f 6e 20  and-line option 
21f90 77 69 74 68 20 65 69 74 68 65 72 20 6f 6e 65 20  with either one 
21fa0 6f 72 20 74 77 6f 0a 2a 2a 20 69 6e 69 74 69 61  or two.** initia
21fb0 6c 20 22 2d 22 20 63 68 61 72 61 63 74 65 72 73  l "-" characters
21fc0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
21fd0 6f 70 74 69 6f 6e 4d 61 74 63 68 28 63 6f 6e 73  optionMatch(cons
21fe0 74 20 63 68 61 72 20 2a 7a 53 74 72 2c 20 63 6f  t char *zStr, co
21ff0 6e 73 74 20 63 68 61 72 20 2a 7a 4f 70 74 29 7b  nst char *zOpt){
22000 0a 20 20 69 66 28 20 7a 53 74 72 5b 30 5d 21 3d  .  if( zStr[0]!=
22010 27 2d 27 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  '-' ) return 0;.
22020 20 20 7a 53 74 72 2b 2b 3b 0a 20 20 69 66 28 20    zStr++;.  if( 
22030 7a 53 74 72 5b 30 5d 3d 3d 27 2d 27 20 29 20 7a  zStr[0]=='-' ) z
22040 53 74 72 2b 2b 3b 0a 20 20 72 65 74 75 72 6e 20  Str++;.  return 
22050 73 74 72 63 6d 70 28 7a 53 74 72 2c 20 7a 4f 70  strcmp(zStr, zOp
22060 74 29 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  t)==0;.}../*.** 
22070 44 65 6c 65 74 65 20 61 20 66 69 6c 65 2e 0a 2a  Delete a file..*
22080 2f 0a 69 6e 74 20 73 68 65 6c 6c 44 65 6c 65 74  /.int shellDelet
22090 65 46 69 6c 65 28 63 6f 6e 73 74 20 63 68 61 72  eFile(const char
220a0 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20   *zFilename){.  
220b0 69 6e 74 20 72 63 3b 0a 23 69 66 64 65 66 20 5f  int rc;.#ifdef _
220c0 57 49 4e 33 32 0a 20 20 77 63 68 61 72 5f 74 20  WIN32.  wchar_t 
220d0 2a 7a 20 3d 20 73 71 6c 69 74 65 33 5f 77 69 6e  *z = sqlite3_win
220e0 33 32 5f 75 74 66 38 5f 74 6f 5f 75 6e 69 63 6f  32_utf8_to_unico
220f0 64 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  de(zFilename);. 
22100 20 72 63 20 3d 20 5f 77 75 6e 6c 69 6e 6b 28 7a   rc = _wunlink(z
22110 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
22120 65 28 7a 29 3b 0a 23 65 6c 73 65 0a 20 20 72 63  e(z);.#else.  rc
22130 20 3d 20 75 6e 6c 69 6e 6b 28 7a 46 69 6c 65 6e   = unlink(zFilen
22140 61 6d 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72  ame);.#endif.  r
22150 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
22160 2a 2a 20 54 72 79 20 74 6f 20 64 65 6c 65 74 65  ** Try to delete
22170 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 66   the temporary f
22180 69 6c 65 20 28 69 66 20 74 68 65 72 65 20 69 73  ile (if there is
22190 20 6f 6e 65 29 20 61 6e 64 20 66 72 65 65 20 74   one) and free t
221a0 68 65 0a 2a 2a 20 6d 65 6d 6f 72 79 20 75 73 65  he.** memory use
221b0 64 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6e 61  d to hold the na
221c0 6d 65 20 6f 66 20 74 68 65 20 74 65 6d 70 20 66  me of the temp f
221d0 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ile..*/.static v
221e0 6f 69 64 20 63 6c 65 61 72 54 65 6d 70 46 69 6c  oid clearTempFil
221f0 65 28 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 29  e(ShellState *p)
22200 7b 0a 20 20 69 66 28 20 70 2d 3e 7a 54 65 6d 70  {.  if( p->zTemp
22210 46 69 6c 65 3d 3d 30 20 29 20 72 65 74 75 72 6e  File==0 ) return
22220 3b 0a 20 20 69 66 28 20 70 2d 3e 64 6f 58 64 67  ;.  if( p->doXdg
22230 4f 70 65 6e 20 29 20 72 65 74 75 72 6e 3b 0a 20  Open ) return;. 
22240 20 69 66 28 20 73 68 65 6c 6c 44 65 6c 65 74 65   if( shellDelete
22250 46 69 6c 65 28 70 2d 3e 7a 54 65 6d 70 46 69 6c  File(p->zTempFil
22260 65 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73  e) ) return;.  s
22270 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 7a  qlite3_free(p->z
22280 54 65 6d 70 46 69 6c 65 29 3b 0a 20 20 70 2d 3e  TempFile);.  p->
22290 7a 54 65 6d 70 46 69 6c 65 20 3d 20 30 3b 0a 7d  zTempFile = 0;.}
222a0 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61  ../*.** Create a
222b0 20 6e 65 77 20 74 65 6d 70 20 66 69 6c 65 20 6e   new temp file n
222c0 61 6d 65 20 77 69 74 68 20 74 68 65 20 67 69 76  ame with the giv
222d0 65 6e 20 73 75 66 66 69 78 2e 0a 2a 2f 0a 73 74  en suffix..*/.st
222e0 61 74 69 63 20 76 6f 69 64 20 6e 65 77 54 65 6d  atic void newTem
222f0 70 46 69 6c 65 28 53 68 65 6c 6c 53 74 61 74 65  pFile(ShellState
22300 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20   *p, const char 
22310 2a 7a 53 75 66 66 69 78 29 7b 0a 20 20 63 6c 65  *zSuffix){.  cle
22320 61 72 54 65 6d 70 46 69 6c 65 28 70 29 3b 0a 20  arTempFile(p);. 
22330 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d   sqlite3_free(p-
22340 3e 7a 54 65 6d 70 46 69 6c 65 29 3b 0a 20 20 70  >zTempFile);.  p
22350 2d 3e 7a 54 65 6d 70 46 69 6c 65 20 3d 20 30 3b  ->zTempFile = 0;
22360 0a 20 20 69 66 28 20 70 2d 3e 64 62 20 29 7b 0a  .  if( p->db ){.
22370 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65      sqlite3_file
22380 5f 63 6f 6e 74 72 6f 6c 28 70 2d 3e 64 62 2c 20  _control(p->db, 
22390 30 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  0, SQLITE_FCNTL_
223a0 54 45 4d 50 46 49 4c 45 4e 41 4d 45 2c 20 26 70  TEMPFILENAME, &p
223b0 2d 3e 7a 54 65 6d 70 46 69 6c 65 29 3b 0a 20 20  ->zTempFile);.  
223c0 7d 0a 20 20 69 66 28 20 70 2d 3e 7a 54 65 6d 70  }.  if( p->zTemp
223d0 46 69 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 73  File==0 ){.    s
223e0 71 6c 69 74 65 33 5f 75 69 6e 74 36 34 20 72 3b  qlite3_uint64 r;
223f0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 61 6e  .    sqlite3_ran
22400 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28 72  domness(sizeof(r
22410 29 2c 20 26 72 29 3b 0a 20 20 20 20 70 2d 3e 7a  ), &r);.    p->z
22420 54 65 6d 70 46 69 6c 65 20 3d 20 73 71 6c 69 74  TempFile = sqlit
22430 65 33 5f 6d 70 72 69 6e 74 66 28 22 74 65 6d 70  e3_mprintf("temp
22440 25 6c 6c 78 2e 25 73 22 2c 20 72 2c 20 7a 53 75  %llx.%s", r, zSu
22450 66 66 69 78 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ffix);.  }else{.
22460 20 20 20 20 70 2d 3e 7a 54 65 6d 70 46 69 6c 65      p->zTempFile
22470 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
22480 74 66 28 22 25 7a 2e 25 73 22 2c 20 70 2d 3e 7a  tf("%z.%s", p->z
22490 54 65 6d 70 46 69 6c 65 2c 20 7a 53 75 66 66 69  TempFile, zSuffi
224a0 78 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d  x);.  }.  if( p-
224b0 3e 7a 54 65 6d 70 46 69 6c 65 3d 3d 30 20 29 7b  >zTempFile==0 ){
224c0 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28  .    raw_printf(
224d0 73 74 64 65 72 72 2c 20 22 6f 75 74 20 6f 66 20  stderr, "out of 
224e0 6d 65 6d 6f 72 79 5c 6e 22 29 3b 0a 20 20 20 20  memory\n");.    
224f0 65 78 69 74 28 31 29 3b 0a 20 20 7d 0a 7d 0a 0a  exit(1);.  }.}..
22500 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69 6d 70 6c 65  ./*.** The imple
22510 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 53 51 4c  mentation of SQL
22520 20 73 63 61 6c 61 72 20 66 75 6e 63 74 69 6f 6e   scalar function
22530 20 66 6b 65 79 5f 63 6f 6c 6c 61 74 65 5f 63 6c   fkey_collate_cl
22540 61 75 73 65 28 29 2c 20 75 73 65 64 0a 2a 2a 20  ause(), used.** 
22550 62 79 20 74 68 65 20 22 2e 6c 69 6e 74 20 66 6b  by the ".lint fk
22560 65 79 2d 69 6e 64 65 78 65 73 22 20 63 6f 6d 6d  ey-indexes" comm
22570 61 6e 64 2e 20 54 68 69 73 20 73 63 61 6c 61 72  and. This scalar
22580 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 6c 77   function is alw
22590 61 79 73 0a 2a 2a 20 63 61 6c 6c 65 64 20 77 69  ays.** called wi
225a0 74 68 20 66 6f 75 72 20 61 72 67 75 6d 65 6e 74  th four argument
225b0 73 20 2d 20 74 68 65 20 70 61 72 65 6e 74 20 74  s - the parent t
225c0 61 62 6c 65 20 6e 61 6d 65 2c 20 74 68 65 20 70  able name, the p
225d0 61 72 65 6e 74 20 63 6f 6c 75 6d 6e 20 6e 61 6d  arent column nam
225e0 65 2c 0a 2a 2a 20 74 68 65 20 63 68 69 6c 64 20  e,.** the child 
225f0 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20 74  table name and t
22600 68 65 20 63 68 69 6c 64 20 63 6f 6c 75 6d 6e 20  he child column 
22610 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 66 6b  name..**.**   fk
22620 65 79 5f 63 6f 6c 6c 61 74 65 5f 63 6c 61 75 73  ey_collate_claus
22630 65 28 27 70 61 72 65 6e 74 2d 74 61 62 27 2c 20  e('parent-tab', 
22640 27 70 61 72 65 6e 74 2d 63 6f 6c 27 2c 20 27 63  'parent-col', 'c
22650 68 69 6c 64 2d 74 61 62 27 2c 20 27 63 68 69 6c  hild-tab', 'chil
22660 64 2d 63 6f 6c 27 29 0a 2a 2a 0a 2a 2a 20 49 66  d-col').**.** If
22670 20 65 69 74 68 65 72 20 6f 66 20 74 68 65 20 6e   either of the n
22680 61 6d 65 64 20 74 61 62 6c 65 73 20 6f 72 20 63  amed tables or c
22690 6f 6c 75 6d 6e 73 20 64 6f 20 6e 6f 74 20 65 78  olumns do not ex
226a0 69 73 74 2c 20 74 68 69 73 20 66 75 6e 63 74 69  ist, this functi
226b0 6f 6e 0a 2a 2a 20 72 65 74 75 72 6e 73 20 61 6e  on.** returns an
226c0 20 65 6d 70 74 79 20 73 74 72 69 6e 67 2e 20 41   empty string. A
226d0 6e 20 65 6d 70 74 79 20 73 74 72 69 6e 67 20 69  n empty string i
226e0 73 20 61 6c 73 6f 20 72 65 74 75 72 6e 65 64 20  s also returned 
226f0 69 66 20 62 6f 74 68 20 74 61 62 6c 65 73 0a 2a  if both tables.*
22700 2a 20 61 6e 64 20 63 6f 6c 75 6d 6e 73 20 65 78  * and columns ex
22710 69 73 74 20 62 75 74 20 68 61 76 65 20 74 68 65  ist but have the
22720 20 73 61 6d 65 20 64 65 66 61 75 6c 74 20 63 6f   same default co
22730 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
22740 2e 20 4f 72 2c 0a 2a 2a 20 69 66 20 62 6f 74 68  . Or,.** if both
22750 20 65 78 69 73 74 20 62 75 74 20 74 68 65 20 64   exist but the d
22760 65 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6f 6e  efault collation
22770 20 73 65 71 75 65 6e 63 65 73 20 61 72 65 20 64   sequences are d
22780 69 66 66 65 72 65 6e 74 2c 20 74 68 69 73 0a 2a  ifferent, this.*
22790 2a 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  * function retur
227a0 6e 73 20 74 68 65 20 73 74 72 69 6e 67 20 22 20  ns the string " 
227b0 43 4f 4c 4c 41 54 45 20 3c 70 61 72 65 6e 74 2d  COLLATE <parent-
227c0 63 6f 6c 6c 61 74 69 6f 6e 3e 22 2c 20 77 68 65  collation>", whe
227d0 72 65 0a 2a 2a 20 3c 70 61 72 65 6e 74 2d 63 6f  re.** <parent-co
227e0 6c 6c 61 74 69 6f 6e 3e 20 69 73 20 74 68 65 20  llation> is the 
227f0 64 65 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6f  default collatio
22800 6e 20 73 65 71 75 65 6e 63 65 20 6f 66 20 74 68  n sequence of th
22810 65 20 70 61 72 65 6e 74 20 63 6f 6c 75 6d 6e 2e  e parent column.
22820 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
22830 73 68 65 6c 6c 46 6b 65 79 43 6f 6c 6c 61 74 65  shellFkeyCollate
22840 43 6c 61 75 73 65 28 0a 20 20 73 71 6c 69 74 65  Clause(.  sqlite
22850 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c  3_context *pCtx,
22860 0a 20 20 69 6e 74 20 6e 56 61 6c 2c 0a 20 20 73  .  int nVal,.  s
22870 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
22880 70 56 61 6c 0a 29 7b 0a 20 20 73 71 6c 69 74 65  pVal.){.  sqlite
22890 33 20 2a 64 62 20 3d 20 73 71 6c 69 74 65 33 5f  3 *db = sqlite3_
228a0 63 6f 6e 74 65 78 74 5f 64 62 5f 68 61 6e 64 6c  context_db_handl
228b0 65 28 70 43 74 78 29 3b 0a 20 20 63 6f 6e 73 74  e(pCtx);.  const
228c0 20 63 68 61 72 20 2a 7a 50 61 72 65 6e 74 3b 0a   char *zParent;.
228d0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50    const char *zP
228e0 61 72 65 6e 74 43 6f 6c 3b 0a 20 20 63 6f 6e 73  arentCol;.  cons
228f0 74 20 63 68 61 72 20 2a 7a 50 61 72 65 6e 74 53  t char *zParentS
22900 65 71 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  eq;.  const char
22910 20 2a 7a 43 68 69 6c 64 3b 0a 20 20 63 6f 6e 73   *zChild;.  cons
22920 74 20 63 68 61 72 20 2a 7a 43 68 69 6c 64 43 6f  t char *zChildCo
22930 6c 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  l;.  const char 
22940 2a 7a 43 68 69 6c 64 53 65 71 20 3d 20 30 3b 20  *zChildSeq = 0; 
22950 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74   /* Initialize t
22960 6f 20 61 76 6f 69 64 20 66 61 6c 73 65 2d 70 6f  o avoid false-po
22970 73 69 74 69 76 65 20 77 61 72 6e 69 6e 67 20 2a  sitive warning *
22980 2f 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61  /.  int rc;..  a
22990 73 73 65 72 74 28 20 6e 56 61 6c 3d 3d 34 20 29  ssert( nVal==4 )
229a0 3b 0a 20 20 7a 50 61 72 65 6e 74 20 3d 20 28 63  ;.  zParent = (c
229b0 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74  onst char*)sqlit
229c0 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 70  e3_value_text(ap
229d0 56 61 6c 5b 30 5d 29 3b 0a 20 20 7a 50 61 72 65  Val[0]);.  zPare
229e0 6e 74 43 6f 6c 20 3d 20 28 63 6f 6e 73 74 20 63  ntCol = (const c
229f0 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c  har*)sqlite3_val
22a00 75 65 5f 74 65 78 74 28 61 70 56 61 6c 5b 31 5d  ue_text(apVal[1]
22a10 29 3b 0a 20 20 7a 43 68 69 6c 64 20 3d 20 28 63  );.  zChild = (c
22a20 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74  onst char*)sqlit
22a30 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 70  e3_value_text(ap
22a40 56 61 6c 5b 32 5d 29 3b 0a 20 20 7a 43 68 69 6c  Val[2]);.  zChil
22a50 64 43 6f 6c 20 3d 20 28 63 6f 6e 73 74 20 63 68  dCol = (const ch
22a60 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75  ar*)sqlite3_valu
22a70 65 5f 74 65 78 74 28 61 70 56 61 6c 5b 33 5d 29  e_text(apVal[3])
22a80 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73  ;..  sqlite3_res
22a90 75 6c 74 5f 74 65 78 74 28 70 43 74 78 2c 20 22  ult_text(pCtx, "
22aa0 22 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 53 54  ", -1, SQLITE_ST
22ab0 41 54 49 43 29 3b 0a 20 20 72 63 20 3d 20 73 71  ATIC);.  rc = sq
22ac0 6c 69 74 65 33 5f 74 61 62 6c 65 5f 63 6f 6c 75  lite3_table_colu
22ad0 6d 6e 5f 6d 65 74 61 64 61 74 61 28 0a 20 20 20  mn_metadata(.   
22ae0 20 20 20 64 62 2c 20 22 6d 61 69 6e 22 2c 20 7a     db, "main", z
22af0 50 61 72 65 6e 74 2c 20 7a 50 61 72 65 6e 74 43  Parent, zParentC
22b00 6f 6c 2c 20 30 2c 20 26 7a 50 61 72 65 6e 74 53  ol, 0, &zParentS
22b10 65 71 2c 20 30 2c 20 30 2c 20 30 0a 20 20 29 3b  eq, 0, 0, 0.  );
22b20 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
22b30 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
22b40 20 73 71 6c 69 74 65 33 5f 74 61 62 6c 65 5f 63   sqlite3_table_c
22b50 6f 6c 75 6d 6e 5f 6d 65 74 61 64 61 74 61 28 0a  olumn_metadata(.
22b60 20 20 20 20 20 20 20 20 64 62 2c 20 22 6d 61 69          db, "mai
22b70 6e 22 2c 20 7a 43 68 69 6c 64 2c 20 7a 43 68 69  n", zChild, zChi
22b80 6c 64 43 6f 6c 2c 20 30 2c 20 26 7a 43 68 69 6c  ldCol, 0, &zChil
22b90 64 53 65 71 2c 20 30 2c 20 30 2c 20 30 0a 20 20  dSeq, 0, 0, 0.  
22ba0 20 20 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20    );.  }..  if( 
22bb0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
22bc0 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70   sqlite3_stricmp
22bd0 28 7a 50 61 72 65 6e 74 53 65 71 2c 20 7a 43 68  (zParentSeq, zCh
22be0 69 6c 64 53 65 71 29 20 29 7b 0a 20 20 20 20 63  ildSeq) ){.    c
22bf0 68 61 72 20 2a 7a 20 3d 20 73 71 6c 69 74 65 33  har *z = sqlite3
22c00 5f 6d 70 72 69 6e 74 66 28 22 20 43 4f 4c 4c 41  _mprintf(" COLLA
22c10 54 45 20 25 73 22 2c 20 7a 50 61 72 65 6e 74 53  TE %s", zParentS
22c20 65 71 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  eq);.    sqlite3
22c30 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 70 43 74  _result_text(pCt
22c40 78 2c 20 7a 2c 20 2d 31 2c 20 53 51 4c 49 54 45  x, z, -1, SQLITE
22c50 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20  _TRANSIENT);.   
22c60 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 29   sqlite3_free(z)
22c70 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  ;.  }.}.../*.** 
22c80 54 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  The implementati
22c90 6f 6e 20 6f 66 20 64 6f 74 2d 63 6f 6d 6d 61 6e  on of dot-comman
22ca0 64 20 22 2e 6c 69 6e 74 20 66 6b 65 79 2d 69 6e  d ".lint fkey-in
22cb0 64 65 78 65 73 22 2e 0a 2a 2f 0a 73 74 61 74 69  dexes"..*/.stati
22cc0 63 20 69 6e 74 20 6c 69 6e 74 46 6b 65 79 49 6e  c int lintFkeyIn
22cd0 64 65 78 65 73 28 0a 20 20 53 68 65 6c 6c 53 74  dexes(.  ShellSt
22ce0 61 74 65 20 2a 70 53 74 61 74 65 2c 20 20 20 20  ate *pState,    
22cf0 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72           /* Curr
22d00 65 6e 74 20 73 68 65 6c 6c 20 74 6f 6f 6c 20 73  ent shell tool s
22d10 74 61 74 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  tate */.  char *
22d20 2a 61 7a 41 72 67 2c 20 20 20 20 20 20 20 20 20  *azArg,         
22d30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72            /* Arr
22d40 61 79 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  ay of arguments 
22d50 70 61 73 73 65 64 20 74 6f 20 64 6f 74 20 63 6f  passed to dot co
22d60 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6e  mmand */.  int n
22d70 41 72 67 20 20 20 20 20 20 20 20 20 20 20 20 20  Arg             
22d80 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
22d90 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20  mber of entries 
22da0 69 6e 20 61 7a 41 72 67 5b 5d 20 2a 2f 0a 29 7b  in azArg[] */.){
22db0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
22dc0 20 70 53 74 61 74 65 2d 3e 64 62 3b 20 20 20 20   pState->db;    
22dd0 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68     /* Database h
22de0 61 6e 64 6c 65 20 74 6f 20 71 75 65 72 79 20 22  andle to query "
22df0 6d 61 69 6e 22 20 64 62 20 6f 66 20 2a 2f 0a 20  main" db of */. 
22e00 20 46 49 4c 45 20 2a 6f 75 74 20 3d 20 70 53 74   FILE *out = pSt
22e10 61 74 65 2d 3e 6f 75 74 3b 20 20 20 20 20 20 20  ate->out;       
22e20 20 2f 2a 20 53 74 72 65 61 6d 20 74 6f 20 77 72   /* Stream to wr
22e30 69 74 65 20 6e 6f 6e 2d 65 72 72 6f 72 20 6f 75  ite non-error ou
22e40 74 70 75 74 20 74 6f 20 2a 2f 0a 20 20 69 6e 74  tput to */.  int
22e50 20 62 56 65 72 62 6f 73 65 20 3d 20 30 3b 20 20   bVerbose = 0;  
22e60 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
22e70 49 66 20 2d 76 65 72 62 6f 73 65 20 69 73 20 70  If -verbose is p
22e80 72 65 73 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  resent */.  int 
22e90 62 47 72 6f 75 70 42 79 50 61 72 65 6e 74 20 3d  bGroupByParent =
22ea0 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 49   0;         /* I
22eb0 66 20 2d 67 72 6f 75 70 62 79 70 61 72 65 6e 74  f -groupbyparent
22ec0 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20   is present */. 
22ed0 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
22ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22ef0 20 2f 2a 20 54 6f 20 69 74 65 72 61 74 65 20 74   /* To iterate t
22f00 68 72 6f 75 67 68 20 61 7a 41 72 67 5b 5d 20 2a  hrough azArg[] *
22f10 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
22f20 7a 49 6e 64 65 6e 74 20 3d 20 22 22 3b 20 20 20  zIndent = "";   
22f30 20 20 20 20 2f 2a 20 48 6f 77 20 6d 75 63 68 20      /* How much 
22f40 74 6f 20 69 6e 64 65 6e 74 20 43 52 45 41 54 45  to indent CREATE
22f50 20 49 4e 44 45 58 20 62 79 20 2a 2f 0a 20 20 69   INDEX by */.  i
22f60 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
22f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
22f80 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
22f90 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
22fa0 2a 70 53 71 6c 20 3d 20 30 3b 20 20 20 20 20 20  *pSql = 0;      
22fb0 20 20 20 2f 2a 20 43 6f 6d 70 69 6c 65 64 20 76     /* Compiled v
22fc0 65 72 73 69 6f 6e 20 6f 66 20 53 51 4c 20 73 74  ersion of SQL st
22fd0 61 74 65 6d 65 6e 74 20 62 65 6c 6f 77 20 2a 2f  atement below */
22fe0 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 54 68 69 73  ..  /*.  ** This
22ff0 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
23000 74 20 72 65 74 75 72 6e 73 20 6f 6e 65 20 72 6f  t returns one ro
23010 77 20 66 6f 72 20 65 61 63 68 20 66 6f 72 65 69  w for each forei
23020 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e  gn key constrain
23030 74 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 73 63  t.  ** in the sc
23040 68 65 6d 61 20 6f 66 20 74 68 65 20 6d 61 69 6e  hema of the main
23050 20 64 61 74 61 62 61 73 65 2e 20 54 68 65 20 63   database. The c
23060 6f 6c 75 6d 6e 20 76 61 6c 75 65 73 20 61 72 65  olumn values are
23070 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 30 2e 20 54  :.  **.  ** 0. T
23080 68 65 20 74 65 78 74 20 6f 66 20 61 6e 20 53 51  he text of an SQ
23090 4c 20 73 74 61 74 65 6d 65 6e 74 20 73 69 6d 69  L statement simi
230a0 6c 61 72 20 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a  lar to:.  **.  *
230b0 2a 20 20 20 20 20 20 22 45 58 50 4c 41 49 4e 20  *      "EXPLAIN 
230c0 51 55 45 52 59 20 50 4c 41 4e 20 53 45 4c 45 43  QUERY PLAN SELEC
230d0 54 20 31 20 46 52 4f 4d 20 63 68 69 6c 64 5f 74  T 1 FROM child_t
230e0 61 62 6c 65 20 57 48 45 52 45 20 63 68 69 6c 64  able WHERE child
230f0 5f 6b 65 79 3d 3f 22 0a 20 20 2a 2a 0a 20 20 2a  _key=?".  **.  *
23100 2a 20 20 20 20 54 68 69 73 20 53 45 4c 45 43 54  *    This SELECT
23110 20 69 73 20 73 69 6d 69 6c 61 72 20 74 6f 20 74   is similar to t
23120 68 65 20 6f 6e 65 20 74 68 61 74 20 74 68 65 20  he one that the 
23130 66 6f 72 65 69 67 6e 20 6b 65 79 73 20 69 6d 70  foreign keys imp
23140 6c 65 6d 65 6e 74 61 74 69 6f 6e 0a 20 20 2a 2a  lementation.  **
23150 20 20 20 20 6e 65 65 64 73 20 74 6f 20 72 75 6e      needs to run
23160 20 69 6e 74 65 72 6e 61 6c 6c 79 20 6f 6e 20 63   internally on c
23170 68 69 6c 64 20 74 61 62 6c 65 73 2e 20 49 66 20  hild tables. If 
23180 74 68 65 72 65 20 69 73 20 61 6e 20 69 6e 64 65  there is an inde
23190 78 20 74 68 61 74 20 63 61 6e 0a 20 20 2a 2a 20  x that can.  ** 
231a0 20 20 20 62 65 20 75 73 65 64 20 74 6f 20 6f 70     be used to op
231b0 74 69 6d 69 7a 65 20 74 68 69 73 20 71 75 65 72  timize this quer
231c0 79 2c 20 74 68 65 6e 20 69 74 20 63 61 6e 20 61  y, then it can a
231d0 6c 73 6f 20 62 65 20 75 73 65 64 20 62 79 20 74  lso be used by t
231e0 68 65 20 46 4b 0a 20 20 2a 2a 20 20 20 20 69 6d  he FK.  **    im
231f0 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 74 6f 20  plementation to 
23200 6f 70 74 69 6d 69 7a 65 20 44 45 4c 45 54 45 20  optimize DELETE 
23210 6f 72 20 55 50 44 41 54 45 20 73 74 61 74 65 6d  or UPDATE statem
23220 65 6e 74 73 20 6f 6e 20 74 68 65 20 70 61 72 65  ents on the pare
23230 6e 74 0a 20 20 2a 2a 20 20 20 20 74 61 62 6c 65  nt.  **    table
23240 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 31 2e 20 41  ..  **.  ** 1. A
23250 20 47 4c 4f 42 20 70 61 74 74 65 72 6e 20 73 75   GLOB pattern su
23260 69 74 61 62 6c 65 20 66 6f 72 20 73 71 6c 69 74  itable for sqlit
23270 65 33 5f 73 74 72 67 6c 6f 62 28 29 2e 20 49 66  e3_strglob(). If
23280 20 74 68 65 20 70 6c 61 6e 20 6f 75 74 70 75 74   the plan output
23290 20 62 79 0a 20 20 2a 2a 20 20 20 20 74 68 65 20   by.  **    the 
232a0 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c  EXPLAIN QUERY PL
232b0 41 4e 20 63 6f 6d 6d 61 6e 64 20 6d 61 74 63 68  AN command match
232c0 65 73 20 74 68 69 73 20 70 61 74 74 65 72 6e 2c  es this pattern,
232d0 20 74 68 65 6e 20 74 68 65 20 73 63 68 65 6d 61   then the schema
232e0 0a 20 20 2a 2a 20 20 20 20 63 6f 6e 74 61 69 6e  .  **    contain
232f0 73 20 61 6e 20 69 6e 64 65 78 20 74 68 61 74 20  s an index that 
23300 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20 6f  can be used to o
23310 70 74 69 6d 69 7a 65 20 74 68 65 20 71 75 65 72  ptimize the quer
23320 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 32 2e 20  y..  **.  ** 2. 
23330 48 75 6d 61 6e 20 72 65 61 64 61 62 6c 65 20 74  Human readable t
23340 65 78 74 20 74 68 61 74 20 64 65 73 63 72 69 62  ext that describ
23350 65 73 20 74 68 65 20 63 68 69 6c 64 20 74 61 62  es the child tab
23360 6c 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 73 2e 20  le and columns. 
23370 65 2e 67 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  e.g..  **.  **  
23380 20 20 20 20 20 22 63 68 69 6c 64 5f 74 61 62 6c       "child_tabl
23390 65 28 63 68 69 6c 64 5f 6b 65 79 31 2c 20 63 68  e(child_key1, ch
233a0 69 6c 64 5f 6b 65 79 32 29 22 0a 20 20 2a 2a 0a  ild_key2)".  **.
233b0 20 20 2a 2a 20 33 2e 20 48 75 6d 61 6e 20 72 65    ** 3. Human re
233c0 61 64 61 62 6c 65 20 74 65 78 74 20 74 68 61 74  adable text that
233d0 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20 70   describes the p
233e0 61 72 65 6e 74 20 74 61 62 6c 65 20 61 6e 64 20  arent table and 
233f0 63 6f 6c 75 6d 6e 73 2e 20 65 2e 67 2e 0a 20 20  columns. e.g..  
23400 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 22 70  **.  **       "p
23410 61 72 65 6e 74 5f 74 61 62 6c 65 28 70 61 72 65  arent_table(pare
23420 6e 74 5f 6b 65 79 31 2c 20 70 61 72 65 6e 74 5f  nt_key1, parent_
23430 6b 65 79 32 29 22 0a 20 20 2a 2a 0a 20 20 2a 2a  key2)".  **.  **
23440 20 34 2e 20 41 20 66 75 6c 6c 20 43 52 45 41 54   4. A full CREAT
23450 45 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65 6e  E INDEX statemen
23460 74 20 66 6f 72 20 61 6e 20 69 6e 64 65 78 20 74  t for an index t
23470 68 61 74 20 63 6f 75 6c 64 20 62 65 20 75 73 65  hat could be use
23480 64 20 74 6f 0a 20 20 2a 2a 20 20 20 20 6f 70 74  d to.  **    opt
23490 69 6d 69 7a 65 20 44 45 4c 45 54 45 20 6f 72 20  imize DELETE or 
234a0 55 50 44 41 54 45 20 73 74 61 74 65 6d 65 6e 74  UPDATE statement
234b0 73 20 6f 6e 20 74 68 65 20 70 61 72 65 6e 74 20  s on the parent 
234c0 74 61 62 6c 65 2e 20 65 2e 67 2e 0a 20 20 2a 2a  table. e.g..  **
234d0 0a 20 20 2a 2a 20 20 20 20 20 20 20 22 43 52 45  .  **       "CRE
234e0 41 54 45 20 49 4e 44 45 58 20 63 68 69 6c 64 5f  ATE INDEX child_
234f0 74 61 62 6c 65 5f 63 68 69 6c 64 5f 6b 65 79 20  table_child_key 
23500 4f 4e 20 63 68 69 6c 64 5f 74 61 62 6c 65 28 63  ON child_table(c
23510 68 69 6c 64 5f 6b 65 79 29 22 0a 20 20 2a 2a 0a  hild_key)".  **.
23520 20 20 2a 2a 20 35 2e 20 54 68 65 20 6e 61 6d 65    ** 5. The name
23530 20 6f 66 20 74 68 65 20 70 61 72 65 6e 74 20 74   of the parent t
23540 61 62 6c 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  able..  **.  ** 
23550 54 68 65 73 65 20 73 69 78 20 76 61 6c 75 65 73  These six values
23560 20 61 72 65 20 75 73 65 64 20 62 79 20 74 68 65   are used by the
23570 20 43 20 6c 6f 67 69 63 20 62 65 6c 6f 77 20 74   C logic below t
23580 6f 20 67 65 6e 65 72 61 74 65 20 74 68 65 20 72  o generate the r
23590 65 70 6f 72 74 2e 0a 20 20 2a 2f 0a 20 20 63 6f  eport..  */.  co
235a0 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 20 3d  nst char *zSql =
235b0 0a 20 20 22 53 45 4c 45 43 54 20 22 0a 20 20 20  .  "SELECT ".   
235c0 20 22 20 20 20 20 20 27 45 58 50 4c 41 49 4e 20   "     'EXPLAIN 
235d0 51 55 45 52 59 20 50 4c 41 4e 20 53 45 4c 45 43  QUERY PLAN SELEC
235e0 54 20 31 20 46 52 4f 4d 20 27 20 7c 7c 20 71 75  T 1 FROM ' || qu
235f0 6f 74 65 28 73 2e 6e 61 6d 65 29 20 7c 7c 20 27  ote(s.name) || '
23600 20 57 48 45 52 45 20 27 22 0a 20 20 20 20 22 20   WHERE '".    " 
23610 20 7c 7c 20 67 72 6f 75 70 5f 63 6f 6e 63 61 74   || group_concat
23620 28 71 75 6f 74 65 28 73 2e 6e 61 6d 65 29 20 7c  (quote(s.name) |
23630 7c 20 27 2e 27 20 7c 7c 20 71 75 6f 74 65 28 66  | '.' || quote(f
23640 2e 5b 66 72 6f 6d 5d 29 20 7c 7c 20 27 3d 3f 27  .[from]) || '=?'
23650 20 22 0a 20 20 20 20 22 20 20 7c 7c 20 66 6b 65   ".    "  || fke
23660 79 5f 63 6f 6c 6c 61 74 65 5f 63 6c 61 75 73 65  y_collate_clause
23670 28 22 0a 20 20 20 20 22 20 20 20 20 20 20 20 66  (".    "       f
23680 2e 5b 74 61 62 6c 65 5d 2c 20 43 4f 41 4c 45 53  .[table], COALES
23690 43 45 28 66 2e 5b 74 6f 5d 2c 20 70 2e 5b 6e 61  CE(f.[to], p.[na
236a0 6d 65 5d 29 2c 20 73 2e 6e 61 6d 65 2c 20 66 2e  me]), s.name, f.
236b0 5b 66 72 6f 6d 5d 29 2c 27 20 41 4e 44 20 27 29  [from]),' AND ')
236c0 22 0a 20 20 20 20 22 2c 20 22 0a 20 20 20 20 22  ".    ", ".    "
236d0 20 20 20 20 20 27 53 45 41 52 43 48 20 54 41 42       'SEARCH TAB
236e0 4c 45 20 27 20 7c 7c 20 73 2e 6e 61 6d 65 20 7c  LE ' || s.name |
236f0 7c 20 27 20 55 53 49 4e 47 20 43 4f 56 45 52 49  | ' USING COVERI
23700 4e 47 20 49 4e 44 45 58 2a 28 27 22 0a 20 20 20  NG INDEX*('".   
23710 20 22 20 20 7c 7c 20 67 72 6f 75 70 5f 63 6f 6e   "  || group_con
23720 63 61 74 28 27 2a 3d 3f 27 2c 20 27 20 41 4e 44  cat('*=?', ' AND
23730 20 27 29 20 7c 7c 20 27 29 27 22 0a 20 20 20 20   ') || ')'".    
23740 22 2c 20 22 0a 20 20 20 20 22 20 20 20 20 20 73  ", ".    "     s
23750 2e 6e 61 6d 65 20 20 7c 7c 20 27 28 27 20 7c 7c  .name  || '(' ||
23760 20 67 72 6f 75 70 5f 63 6f 6e 63 61 74 28 66 2e   group_concat(f.
23770 5b 66 72 6f 6d 5d 2c 20 20 27 2c 20 27 29 20 7c  [from],  ', ') |
23780 7c 20 27 29 27 22 0a 20 20 20 20 22 2c 20 22 0a  | ')'".    ", ".
23790 20 20 20 20 22 20 20 20 20 20 66 2e 5b 74 61 62      "     f.[tab
237a0 6c 65 5d 20 7c 7c 20 27 28 27 20 7c 7c 20 67 72  le] || '(' || gr
237b0 6f 75 70 5f 63 6f 6e 63 61 74 28 43 4f 41 4c 45  oup_concat(COALE
237c0 53 43 45 28 66 2e 5b 74 6f 5d 2c 20 70 2e 5b 6e  SCE(f.[to], p.[n
237d0 61 6d 65 5d 29 29 20 7c 7c 20 27 29 27 22 0a 20  ame])) || ')'". 
237e0 20 20 20 22 2c 20 22 0a 20 20 20 20 22 20 20 20     ", ".    "   
237f0 20 20 27 43 52 45 41 54 45 20 49 4e 44 45 58 20    'CREATE INDEX 
23800 27 20 7c 7c 20 71 75 6f 74 65 28 73 2e 6e 61 6d  ' || quote(s.nam
23810 65 20 7c 7c 27 5f 27 7c 7c 20 67 72 6f 75 70 5f  e ||'_'|| group_
23820 63 6f 6e 63 61 74 28 66 2e 5b 66 72 6f 6d 5d 2c  concat(f.[from],
23830 20 27 5f 27 29 29 22 0a 20 20 20 20 22 20 20 7c   '_'))".    "  |
23840 7c 20 27 20 4f 4e 20 27 20 7c 7c 20 71 75 6f 74  | ' ON ' || quot
23850 65 28 73 2e 6e 61 6d 65 29 20 7c 7c 20 27 28 27  e(s.name) || '('
23860 22 0a 20 20 20 20 22 20 20 7c 7c 20 67 72 6f 75  ".    "  || grou
23870 70 5f 63 6f 6e 63 61 74 28 71 75 6f 74 65 28 66  p_concat(quote(f
23880 2e 5b 66 72 6f 6d 5d 29 20 7c 7c 22 0a 20 20 20  .[from]) ||".   
23890 20 22 20 20 20 20 20 20 20 20 66 6b 65 79 5f 63   "        fkey_c
238a0 6f 6c 6c 61 74 65 5f 63 6c 61 75 73 65 28 22 0a  ollate_clause(".
238b0 20 20 20 20 22 20 20 20 20 20 20 20 20 20 20 66      "          f
238c0 2e 5b 74 61 62 6c 65 5d 2c 20 43 4f 41 4c 45 53  .[table], COALES
238d0 43 45 28 66 2e 5b 74 6f 5d 2c 20 70 2e 5b 6e 61  CE(f.[to], p.[na
238e0 6d 65 5d 29 2c 20 73 2e 6e 61 6d 65 2c 20 66 2e  me]), s.name, f.
238f0 5b 66 72 6f 6d 5d 29 2c 20 27 2c 20 27 29 22 0a  [from]), ', ')".
23900 20 20 20 20 22 20 20 7c 7c 20 27 29 3b 27 22 0a      "  || ');'".
23910 20 20 20 20 22 2c 20 22 0a 20 20 20 20 22 20 20      ", ".    "  
23920 20 20 20 66 2e 5b 74 61 62 6c 65 5d 20 22 0a 20     f.[table] ". 
23930 20 20 20 22 46 52 4f 4d 20 73 71 6c 69 74 65 5f     "FROM sqlite_
23940 6d 61 73 74 65 72 20 41 53 20 73 2c 20 70 72 61  master AS s, pra
23950 67 6d 61 5f 66 6f 72 65 69 67 6e 5f 6b 65 79 5f  gma_foreign_key_
23960 6c 69 73 74 28 73 2e 6e 61 6d 65 29 20 41 53 20  list(s.name) AS 
23970 66 20 22 0a 20 20 20 20 22 4c 45 46 54 20 4a 4f  f ".    "LEFT JO
23980 49 4e 20 70 72 61 67 6d 61 5f 74 61 62 6c 65 5f  IN pragma_table_
23990 69 6e 66 6f 20 41 53 20 70 20 4f 4e 20 28 70 6b  info AS p ON (pk
239a0 2d 31 3d 73 65 71 20 41 4e 44 20 70 2e 61 72 67  -1=seq AND p.arg
239b0 3d 66 2e 5b 74 61 62 6c 65 5d 29 20 22 0a 20 20  =f.[table]) ".  
239c0 20 20 22 47 52 4f 55 50 20 42 59 20 73 2e 6e 61    "GROUP BY s.na
239d0 6d 65 2c 20 66 2e 69 64 20 22 0a 20 20 20 20 22  me, f.id ".    "
239e0 4f 52 44 45 52 20 42 59 20 28 43 41 53 45 20 57  ORDER BY (CASE W
239f0 48 45 4e 20 3f 20 54 48 45 4e 20 66 2e 5b 74 61  HEN ? THEN f.[ta
23a00 62 6c 65 5d 20 45 4c 53 45 20 73 2e 6e 61 6d 65  ble] ELSE s.name
23a10 20 45 4e 44 29 22 0a 20 20 3b 0a 20 20 63 6f 6e   END)".  ;.  con
23a20 73 74 20 63 68 61 72 20 2a 7a 47 6c 6f 62 49 50  st char *zGlobIP
23a30 4b 20 3d 20 22 53 45 41 52 43 48 20 54 41 42 4c  K = "SEARCH TABL
23a40 45 20 2a 20 55 53 49 4e 47 20 49 4e 54 45 47 45  E * USING INTEGE
23a50 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20 28 72  R PRIMARY KEY (r
23a60 6f 77 69 64 3d 3f 29 22 3b 0a 0a 20 20 66 6f 72  owid=?)";..  for
23a70 28 69 3d 32 3b 20 69 3c 6e 41 72 67 3b 20 69 2b  (i=2; i<nArg; i+
23a80 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6e 20 3d 20  +){.    int n = 
23a90 73 74 72 6c 65 6e 33 30 28 61 7a 41 72 67 5b 69  strlen30(azArg[i
23aa0 5d 29 3b 0a 20 20 20 20 69 66 28 20 6e 3e 31 20  ]);.    if( n>1 
23ab0 26 26 20 73 71 6c 69 74 65 33 5f 73 74 72 6e 69  && sqlite3_strni
23ac0 63 6d 70 28 22 2d 76 65 72 62 6f 73 65 22 2c 20  cmp("-verbose", 
23ad0 61 7a 41 72 67 5b 69 5d 2c 20 6e 29 3d 3d 30 20  azArg[i], n)==0 
23ae0 29 7b 0a 20 20 20 20 20 20 62 56 65 72 62 6f 73  ){.      bVerbos
23af0 65 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  e = 1;.    }.   
23b00 20 65 6c 73 65 20 69 66 28 20 6e 3e 31 20 26 26   else if( n>1 &&
23b10 20 73 71 6c 69 74 65 33 5f 73 74 72 6e 69 63 6d   sqlite3_strnicm
23b20 70 28 22 2d 67 72 6f 75 70 62 79 70 61 72 65 6e  p("-groupbyparen
23b30 74 22 2c 20 61 7a 41 72 67 5b 69 5d 2c 20 6e 29  t", azArg[i], n)
23b40 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 62 47 72  ==0 ){.      bGr
23b50 6f 75 70 42 79 50 61 72 65 6e 74 20 3d 20 31 3b  oupByParent = 1;
23b60 0a 20 20 20 20 20 20 7a 49 6e 64 65 6e 74 20 3d  .      zIndent =
23b70 20 22 20 20 20 20 22 3b 0a 20 20 20 20 7d 0a 20   "    ";.    }. 
23b80 20 20 20 65 6c 73 65 7b 0a 20 20 20 20 20 20 72     else{.      r
23b90 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  aw_printf(stderr
23ba0 2c 20 22 55 73 61 67 65 3a 20 25 73 20 25 73 20  , "Usage: %s %s 
23bb0 3f 2d 76 65 72 62 6f 73 65 3f 20 3f 2d 67 72 6f  ?-verbose? ?-gro
23bc0 75 70 62 79 70 61 72 65 6e 74 3f 5c 6e 22 2c 0a  upbyparent?\n",.
23bd0 20 20 20 20 20 20 20 20 20 20 61 7a 41 72 67 5b            azArg[
23be0 30 5d 2c 20 61 7a 41 72 67 5b 31 5d 0a 20 20 20  0], azArg[1].   
23bf0 20 20 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75     );.      retu
23c00 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
23c10 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
23c20 20 52 65 67 69 73 74 65 72 20 74 68 65 20 66 6b   Register the fk
23c30 65 79 5f 63 6f 6c 6c 61 74 65 5f 63 6c 61 75 73  ey_collate_claus
23c40 65 28 29 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e  e() SQL function
23c50 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   */.  rc = sqlit
23c60 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
23c70 6f 6e 28 64 62 2c 20 22 66 6b 65 79 5f 63 6f 6c  on(db, "fkey_col
23c80 6c 61 74 65 5f 63 6c 61 75 73 65 22 2c 20 34 2c  late_clause", 4,
23c90 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 0a 20 20   SQLITE_UTF8,.  
23ca0 20 20 20 20 30 2c 20 73 68 65 6c 6c 46 6b 65 79      0, shellFkey
23cb0 43 6f 6c 6c 61 74 65 43 6c 61 75 73 65 2c 20 30  CollateClause, 0
23cc0 2c 20 30 0a 20 20 29 3b 0a 0a 0a 20 20 69 66 28  , 0.  );...  if(
23cd0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
23ce0 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
23cf0 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 64 62  e3_prepare_v2(db
23d00 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53 71  , zSql, -1, &pSq
23d10 6c 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28  l, 0);.  }.  if(
23d20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
23d30 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69  {.    sqlite3_bi
23d40 6e 64 5f 69 6e 74 28 70 53 71 6c 2c 20 31 2c 20  nd_int(pSql, 1, 
23d50 62 47 72 6f 75 70 42 79 50 61 72 65 6e 74 29 3b  bGroupByParent);
23d60 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d  .  }..  if( rc==
23d70 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
23d80 20 69 6e 74 20 72 63 32 3b 0a 20 20 20 20 63 68   int rc2;.    ch
23d90 61 72 20 2a 7a 50 72 65 76 20 3d 20 30 3b 0a 20  ar *zPrev = 0;. 
23da0 20 20 20 77 68 69 6c 65 28 20 53 51 4c 49 54 45     while( SQLITE
23db0 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74  _ROW==sqlite3_st
23dc0 65 70 28 70 53 71 6c 29 20 29 7b 0a 20 20 20 20  ep(pSql) ){.    
23dd0 20 20 69 6e 74 20 72 65 73 20 3d 20 2d 31 3b 0a    int res = -1;.
23de0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74        sqlite3_st
23df0 6d 74 20 2a 70 45 78 70 6c 61 69 6e 20 3d 20 30  mt *pExplain = 0
23e00 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  ;.      const ch
23e10 61 72 20 2a 7a 45 51 50 20 3d 20 28 63 6f 6e 73  ar *zEQP = (cons
23e20 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f  t char*)sqlite3_
23e30 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 71 6c  column_text(pSql
23e40 2c 20 30 29 3b 0a 20 20 20 20 20 20 63 6f 6e 73  , 0);.      cons
23e50 74 20 63 68 61 72 20 2a 7a 47 6c 6f 62 20 3d 20  t char *zGlob = 
23e60 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c  (const char*)sql
23e70 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  ite3_column_text
23e80 28 70 53 71 6c 2c 20 31 29 3b 0a 20 20 20 20 20  (pSql, 1);.     
23e90 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 72   const char *zFr
23ea0 6f 6d 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  om = (const char
23eb0 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  *)sqlite3_column
23ec0 5f 74 65 78 74 28 70 53 71 6c 2c 20 32 29 3b 0a  _text(pSql, 2);.
23ed0 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
23ee0 20 2a 7a 54 61 72 67 65 74 20 3d 20 28 63 6f 6e   *zTarget = (con
23ef0 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33  st char*)sqlite3
23f00 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 71  _column_text(pSq
23f10 6c 2c 20 33 29 3b 0a 20 20 20 20 20 20 63 6f 6e  l, 3);.      con
23f20 73 74 20 63 68 61 72 20 2a 7a 43 49 20 3d 20 28  st char *zCI = (
23f30 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69  const char*)sqli
23f40 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28  te3_column_text(
23f50 70 53 71 6c 2c 20 34 29 3b 0a 20 20 20 20 20 20  pSql, 4);.      
23f60 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 72  const char *zPar
23f70 65 6e 74 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  ent = (const cha
23f80 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  r*)sqlite3_colum
23f90 6e 5f 74 65 78 74 28 70 53 71 6c 2c 20 35 29 3b  n_text(pSql, 5);
23fa0 0a 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ..      rc = sql
23fb0 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28  ite3_prepare_v2(
23fc0 64 62 2c 20 7a 45 51 50 2c 20 2d 31 2c 20 26 70  db, zEQP, -1, &p
23fd0 45 78 70 6c 61 69 6e 2c 20 30 29 3b 0a 20 20 20  Explain, 0);.   
23fe0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
23ff0 45 5f 4f 4b 20 29 20 62 72 65 61 6b 3b 0a 20 20  E_OK ) break;.  
24000 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 52      if( SQLITE_R
24010 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70  OW==sqlite3_step
24020 28 70 45 78 70 6c 61 69 6e 29 20 29 7b 0a 20 20  (pExplain) ){.  
24030 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
24040 20 2a 7a 50 6c 61 6e 20 3d 20 28 63 6f 6e 73 74   *zPlan = (const
24050 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63   char*)sqlite3_c
24060 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 45 78 70 6c  olumn_text(pExpl
24070 61 69 6e 2c 20 33 29 3b 0a 20 20 20 20 20 20 20  ain, 3);.       
24080 20 72 65 73 20 3d 20 28 0a 20 20 20 20 20 20 20   res = (.       
24090 20 20 20 20 20 20 20 30 3d 3d 73 71 6c 69 74 65         0==sqlite
240a0 33 5f 73 74 72 67 6c 6f 62 28 7a 47 6c 6f 62 2c  3_strglob(zGlob,
240b0 20 7a 50 6c 61 6e 29 0a 20 20 20 20 20 20 20 20   zPlan).        
240c0 20 20 20 7c 7c 20 30 3d 3d 73 71 6c 69 74 65 33     || 0==sqlite3
240d0 5f 73 74 72 67 6c 6f 62 28 7a 47 6c 6f 62 49 50  _strglob(zGlobIP
240e0 4b 2c 20 7a 50 6c 61 6e 29 0a 20 20 20 20 20 20  K, zPlan).      
240f0 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20    );.      }.   
24100 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
24110 66 69 6e 61 6c 69 7a 65 28 70 45 78 70 6c 61 69  finalize(pExplai
24120 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  n);.      if( rc
24130 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 62 72  !=SQLITE_OK ) br
24140 65 61 6b 3b 0a 0a 20 20 20 20 20 20 69 66 28 20  eak;..      if( 
24150 72 65 73 3c 30 20 29 7b 0a 20 20 20 20 20 20 20  res<0 ){.       
24160 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65   raw_printf(stde
24170 72 72 2c 20 22 45 72 72 6f 72 3a 20 69 6e 74 65  rr, "Error: inte
24180 72 6e 61 6c 20 65 72 72 6f 72 22 29 3b 0a 20 20  rnal error");.  
24190 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
241a0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
241b0 20 20 69 66 28 20 62 47 72 6f 75 70 42 79 50 61    if( bGroupByPa
241c0 72 65 6e 74 0a 20 20 20 20 20 20 20 20 26 26 20  rent.        && 
241d0 28 62 56 65 72 62 6f 73 65 20 7c 7c 20 72 65 73  (bVerbose || res
241e0 3d 3d 30 29 0a 20 20 20 20 20 20 20 20 26 26 20  ==0).        && 
241f0 28 7a 50 72 65 76 3d 3d 30 20 7c 7c 20 73 71 6c  (zPrev==0 || sql
24200 69 74 65 33 5f 73 74 72 69 63 6d 70 28 7a 50 61  ite3_stricmp(zPa
24210 72 65 6e 74 2c 20 7a 50 72 65 76 29 29 0a 20 20  rent, zPrev)).  
24220 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
24230 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75     raw_printf(ou
24240 74 2c 20 22 2d 2d 20 50 61 72 65 6e 74 20 74 61  t, "-- Parent ta
24250 62 6c 65 20 25 73 5c 6e 22 2c 20 7a 50 61 72 65  ble %s\n", zPare
24260 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  nt);.          s
24270 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 50 72 65  qlite3_free(zPre
24280 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 50  v);.          zP
24290 72 65 76 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  rev = sqlite3_mp
242a0 72 69 6e 74 66 28 22 25 73 22 2c 20 7a 50 61 72  rintf("%s", zPar
242b0 65 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ent);.        }.
242c0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 65 73  .        if( res
242d0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
242e0 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c   raw_printf(out,
242f0 20 22 25 73 25 73 20 2d 2d 3e 20 25 73 5c 6e 22   "%s%s --> %s\n"
24300 2c 20 7a 49 6e 64 65 6e 74 2c 20 7a 43 49 2c 20  , zIndent, zCI, 
24310 7a 54 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20  zTarget);.      
24320 20 20 7d 65 6c 73 65 20 69 66 28 20 62 56 65 72    }else if( bVer
24330 62 6f 73 65 20 29 7b 0a 20 20 20 20 20 20 20 20  bose ){.        
24340 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74    raw_printf(out
24350 2c 20 22 25 73 2f 2a 20 6e 6f 20 65 78 74 72 61  , "%s/* no extra
24360 20 69 6e 64 65 78 65 73 20 72 65 71 75 69 72 65   indexes require
24370 64 20 66 6f 72 20 25 73 20 2d 3e 20 25 73 20 2a  d for %s -> %s *
24380 2f 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  /\n",.          
24390 20 20 20 20 7a 49 6e 64 65 6e 74 2c 20 7a 46 72      zIndent, zFr
243a0 6f 6d 2c 20 7a 54 61 72 67 65 74 0a 20 20 20 20  om, zTarget.    
243b0 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20        );.       
243c0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
243d0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
243e0 65 28 7a 50 72 65 76 29 3b 0a 0a 20 20 20 20 69  e(zPrev);..    i
243f0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
24400 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72   ){.      raw_pr
24410 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 25 73  intf(stderr, "%s
24420 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72  \n", sqlite3_err
24430 6d 73 67 28 64 62 29 29 3b 0a 20 20 20 20 7d 0a  msg(db));.    }.
24440 0a 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74  .    rc2 = sqlit
24450 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 71 6c  e3_finalize(pSql
24460 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
24470 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63 32 21  QLITE_OK && rc2!
24480 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
24490 20 20 20 20 72 63 20 3d 20 72 63 32 3b 0a 20 20      rc = rc2;.  
244a0 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73      raw_printf(s
244b0 74 64 65 72 72 2c 20 22 25 73 5c 6e 22 2c 20 73  tderr, "%s\n", s
244c0 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62  qlite3_errmsg(db
244d0 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  ));.    }.  }els
244e0 65 7b 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74  e{.    raw_print
244f0 66 28 73 74 64 65 72 72 2c 20 22 25 73 5c 6e 22  f(stderr, "%s\n"
24500 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  , sqlite3_errmsg
24510 28 64 62 29 29 3b 0a 20 20 7d 0a 0a 20 20 72 65  (db));.  }..  re
24520 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
24530 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  * Implementation
24540 20 6f 66 20 22 2e 6c 69 6e 74 22 20 64 6f 74 20   of ".lint" dot 
24550 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a 73 74 61 74  command..*/.stat
24560 69 63 20 69 6e 74 20 6c 69 6e 74 44 6f 74 43 6f  ic int lintDotCo
24570 6d 6d 61 6e 64 28 0a 20 20 53 68 65 6c 6c 53 74  mmand(.  ShellSt
24580 61 74 65 20 2a 70 53 74 61 74 65 2c 20 20 20 20  ate *pState,    
24590 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72           /* Curr
245a0 65 6e 74 20 73 68 65 6c 6c 20 74 6f 6f 6c 20 73  ent shell tool s
245b0 74 61 74 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  tate */.  char *
245c0 2a 61 7a 41 72 67 2c 20 20 20 20 20 20 20 20 20  *azArg,         
245d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72            /* Arr
245e0 61 79 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  ay of arguments 
245f0 70 61 73 73 65 64 20 74 6f 20 64 6f 74 20 63 6f  passed to dot co
24600 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6e  mmand */.  int n
24610 41 72 67 20 20 20 20 20 20 20 20 20 20 20 20 20  Arg             
24620 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
24630 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20  mber of entries 
24640 69 6e 20 61 7a 41 72 67 5b 5d 20 2a 2f 0a 29 7b  in azArg[] */.){
24650 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 6e 20 3d 20  .  int n;.  n = 
24660 28 6e 41 72 67 3e 3d 32 20 3f 20 73 74 72 6c 65  (nArg>=2 ? strle
24670 6e 33 30 28 61 7a 41 72 67 5b 31 5d 29 20 3a 20  n30(azArg[1]) : 
24680 30 29 3b 0a 20 20 69 66 28 20 6e 3c 31 20 7c 7c  0);.  if( n<1 ||
24690 20 73 71 6c 69 74 65 33 5f 73 74 72 6e 69 63 6d   sqlite3_strnicm
246a0 70 28 61 7a 41 72 67 5b 31 5d 2c 20 22 66 6b 65  p(azArg[1], "fke
246b0 79 2d 69 6e 64 65 78 65 73 22 2c 20 6e 29 20 29  y-indexes", n) )
246c0 20 67 6f 74 6f 20 75 73 61 67 65 3b 0a 20 20 72   goto usage;.  r
246d0 65 74 75 72 6e 20 6c 69 6e 74 46 6b 65 79 49 6e  eturn lintFkeyIn
246e0 64 65 78 65 73 28 70 53 74 61 74 65 2c 20 61 7a  dexes(pState, az
246f0 41 72 67 2c 20 6e 41 72 67 29 3b 0a 0a 20 75 73  Arg, nArg);.. us
24700 61 67 65 3a 0a 20 20 72 61 77 5f 70 72 69 6e 74  age:.  raw_print
24710 66 28 73 74 64 65 72 72 2c 20 22 55 73 61 67 65  f(stderr, "Usage
24720 20 25 73 20 73 75 62 2d 63 6f 6d 6d 61 6e 64 20   %s sub-command 
24730 3f 73 77 69 74 63 68 65 73 2e 2e 2e 3f 5c 6e 22  ?switches...?\n"
24740 2c 20 61 7a 41 72 67 5b 30 5d 29 3b 0a 20 20 72  , azArg[0]);.  r
24750 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  aw_printf(stderr
24760 2c 20 22 57 68 65 72 65 20 73 75 62 2d 63 6f 6d  , "Where sub-com
24770 6d 61 6e 64 73 20 61 72 65 3a 5c 6e 22 29 3b 0a  mands are:\n");.
24780 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64    raw_printf(std
24790 65 72 72 2c 20 22 20 20 20 20 66 6b 65 79 2d 69  err, "    fkey-i
247a0 6e 64 65 78 65 73 5c 6e 22 29 3b 0a 20 20 72 65  ndexes\n");.  re
247b0 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
247c0 52 3b 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e  R;.}..#if !defin
247d0 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
247e0 49 52 54 55 41 4c 54 41 42 4c 45 29 20 26 26 20  IRTUALTABLE) && 
247f0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 48  defined(SQLITE_H
24800 41 56 45 5f 5a 4c 49 42 29 0a 2f 2a 2a 2a 2a 2a  AVE_ZLIB)./*****
24810 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24820 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24830 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24840 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24850 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20  ************.** 
24860 54 68 65 20 22 2e 61 72 63 68 69 76 65 22 20 6f  The ".archive" o
24870 72 20 22 2e 61 72 22 20 63 6f 6d 6d 61 6e 64 2e  r ".ar" command.
24880 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
24890 73 68 65 6c 6c 50 72 65 70 61 72 65 28 0a 20 20  shellPrepare(.  
248a0 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 0a 20 20  sqlite3 *db, .  
248b0 69 6e 74 20 2a 70 52 63 2c 20 0a 20 20 63 6f 6e  int *pRc, .  con
248c0 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 2c 20 0a  st char *zSql, .
248d0 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
248e0 2a 70 70 53 74 6d 74 0a 29 7b 0a 20 20 2a 70 70  *ppStmt.){.  *pp
248f0 53 74 6d 74 20 3d 20 30 3b 0a 20 20 69 66 28 20  Stmt = 0;.  if( 
24900 2a 70 52 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  *pRc==SQLITE_OK 
24910 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20  ){.    int rc = 
24920 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f  sqlite3_prepare_
24930 76 32 28 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c  v2(db, zSql, -1,
24940 20 70 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20   ppStmt, 0);.   
24950 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
24960 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f  OK ){.      raw_
24970 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
24980 73 71 6c 20 65 72 72 6f 72 3a 20 25 73 20 28 25  sql error: %s (%
24990 64 29 5c 6e 22 2c 20 0a 20 20 20 20 20 20 20 20  d)\n", .        
249a0 20 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67    sqlite3_errmsg
249b0 28 64 62 29 2c 20 73 71 6c 69 74 65 33 5f 65 72  (db), sqlite3_er
249c0 72 63 6f 64 65 28 64 62 29 0a 20 20 20 20 20 20  rcode(db).      
249d0 29 3b 0a 20 20 20 20 20 20 2a 70 52 63 20 3d 20  );.      *pRc = 
249e0 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  rc;.    }.  }.}.
249f0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 68 65  .static void she
24a00 6c 6c 50 72 65 70 61 72 65 50 72 69 6e 74 66 28  llPreparePrintf(
24a10 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
24a20 0a 20 20 69 6e 74 20 2a 70 52 63 2c 20 0a 20 20  .  int *pRc, .  
24a30 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 2a 70  sqlite3_stmt **p
24a40 70 53 74 6d 74 2c 0a 20 20 63 6f 6e 73 74 20 63  pStmt,.  const c
24a50 68 61 72 20 2a 7a 46 6d 74 2c 20 0a 20 20 2e 2e  har *zFmt, .  ..
24a60 2e 0a 29 7b 0a 20 20 2a 70 70 53 74 6d 74 20 3d  ..){.  *ppStmt =
24a70 20 30 3b 0a 20 20 69 66 28 20 2a 70 52 63 3d 3d   0;.  if( *pRc==
24a80 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
24a90 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 20   va_list ap;.   
24aa0 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20 76 61   char *z;.    va
24ab0 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6d 74 29  _start(ap, zFmt)
24ac0 3b 0a 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65  ;.    z = sqlite
24ad0 33 5f 76 6d 70 72 69 6e 74 66 28 7a 46 6d 74 2c  3_vmprintf(zFmt,
24ae0 20 61 70 29 3b 0a 20 20 20 20 69 66 28 20 7a 3d   ap);.    if( z=
24af0 3d 30 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 63  =0 ){.      *pRc
24b00 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
24b10 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
24b20 20 20 73 68 65 6c 6c 50 72 65 70 61 72 65 28 64    shellPrepare(d
24b30 62 2c 20 70 52 63 2c 20 7a 2c 20 70 70 53 74 6d  b, pRc, z, ppStm
24b40 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
24b50 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20 20 20 7d  3_free(z);.    }
24b60 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76  .  }.}..static v
24b70 6f 69 64 20 73 68 65 6c 6c 46 69 6e 61 6c 69 7a  oid shellFinaliz
24b80 65 28 0a 20 20 69 6e 74 20 2a 70 52 63 2c 20 0a  e(.  int *pRc, .
24b90 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
24ba0 70 53 74 6d 74 0a 29 7b 0a 20 20 69 66 28 20 70  pStmt.){.  if( p
24bb0 53 74 6d 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  Stmt ){.    sqli
24bc0 74 65 33 20 2a 64 62 20 3d 20 73 71 6c 69 74 65  te3 *db = sqlite
24bd0 33 5f 64 62 5f 68 61 6e 64 6c 65 28 70 53 74 6d  3_db_handle(pStm
24be0 74 29 3b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d  t);.    int rc =
24bf0 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
24c00 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 69 66  e(pStmt);.    if
24c10 28 20 2a 70 52 63 3d 3d 53 51 4c 49 54 45 5f 4f  ( *pRc==SQLITE_O
24c20 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 72  K ){.      if( r
24c30 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
24c40 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e          raw_prin
24c50 74 66 28 73 74 64 65 72 72 2c 20 22 53 51 4c 20  tf(stderr, "SQL 
24c60 65 72 72 6f 72 3a 20 25 73 5c 6e 22 2c 20 73 71  error: %s\n", sq
24c70 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29  lite3_errmsg(db)
24c80 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
24c90 20 2a 70 52 63 20 3d 20 72 63 3b 0a 20 20 20 20   *pRc = rc;.    
24ca0 7d 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20  }.  }.}..static 
24cb0 76 6f 69 64 20 73 68 65 6c 6c 52 65 73 65 74 28  void shellReset(
24cc0 0a 20 20 69 6e 74 20 2a 70 52 63 2c 20 0a 20 20  .  int *pRc, .  
24cd0 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
24ce0 74 6d 74 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20  tmt.){.  int rc 
24cf0 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28  = sqlite3_reset(
24d00 70 53 74 6d 74 29 3b 0a 20 20 69 66 28 20 2a 70  pStmt);.  if( *p
24d10 52 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  Rc==SQLITE_OK ){
24d20 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
24d30 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
24d40 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 73 71  sqlite3 *db = sq
24d50 6c 69 74 65 33 5f 64 62 5f 68 61 6e 64 6c 65 28  lite3_db_handle(
24d60 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 72 61  pStmt);.      ra
24d70 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  w_printf(stderr,
24d80 20 22 53 51 4c 20 65 72 72 6f 72 3a 20 25 73 5c   "SQL error: %s\
24d90 6e 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d  n", sqlite3_errm
24da0 73 67 28 64 62 29 29 3b 0a 20 20 20 20 7d 0a 20  sg(db));.    }. 
24db0 20 20 20 2a 70 52 63 20 3d 20 72 63 3b 0a 20 20     *pRc = rc;.  
24dc0 7d 0a 7d 0a 2f 2a 0a 2a 2a 20 53 74 72 75 63 74  }.}./*.** Struct
24dd0 75 72 65 20 72 65 70 72 65 73 65 6e 74 69 6e 67  ure representing
24de0 20 61 20 73 69 6e 67 6c 65 20 22 2e 61 72 22 20   a single ".ar" 
24df0 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a 74 79 70 65  command..*/.type
24e00 64 65 66 20 73 74 72 75 63 74 20 41 72 43 6f 6d  def struct ArCom
24e10 6d 61 6e 64 20 41 72 43 6f 6d 6d 61 6e 64 3b 0a  mand ArCommand;.
24e20 73 74 72 75 63 74 20 41 72 43 6f 6d 6d 61 6e 64  struct ArCommand
24e30 20 7b 0a 20 20 75 38 20 65 43 6d 64 3b 20 20 20   {.  u8 eCmd;   
24e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24e50 20 20 20 20 20 2f 2a 20 41 6e 20 41 52 5f 43 4d       /* An AR_CM
24e60 44 5f 2a 20 76 61 6c 75 65 20 2a 2f 0a 20 20 75  D_* value */.  u
24e70 38 20 62 56 65 72 62 6f 73 65 3b 20 20 20 20 20  8 bVerbose;     
24e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
24e90 2a 20 54 72 75 65 20 69 66 20 2d 2d 76 65 72 62  * True if --verb
24ea0 6f 73 65 20 2a 2f 0a 20 20 75 38 20 62 5a 69 70  ose */.  u8 bZip
24eb0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
24ec0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
24ed0 20 69 66 20 74 68 65 20 61 72 63 68 69 76 65 20   if the archive 
24ee0 69 73 20 61 20 5a 49 50 20 2a 2f 0a 20 20 75 38  is a ZIP */.  u8
24ef0 20 62 44 72 79 52 75 6e 3b 20 20 20 20 20 20 20   bDryRun;       
24f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
24f10 20 54 72 75 65 20 69 66 20 2d 2d 64 72 79 2d 72   True if --dry-r
24f20 75 6e 20 2a 2f 0a 20 20 75 38 20 62 41 70 70 65  un */.  u8 bAppe
24f30 6e 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nd;             
24f40 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
24f50 69 66 20 2d 2d 61 70 70 65 6e 64 20 2a 2f 0a 20  if --append */. 
24f60 20 75 38 20 66 72 6f 6d 43 6d 64 4c 69 6e 65 3b   u8 fromCmdLine;
24f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24f80 20 2f 2a 20 52 75 6e 20 66 72 6f 6d 20 2d 41 20   /* Run from -A 
24f90 69 6e 73 74 65 61 64 20 6f 66 20 2e 61 72 63 68  instead of .arch
24fa0 69 76 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 72  ive */.  int nAr
24fb0 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g;              
24fc0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
24fd0 65 72 20 6f 66 20 63 6f 6d 6d 61 6e 64 20 61 72  er of command ar
24fe0 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61  guments */.  cha
24ff0 72 20 2a 7a 53 72 63 54 61 62 6c 65 3b 20 20 20  r *zSrcTable;   
25000 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
25010 22 73 71 6c 61 72 22 2c 20 22 7a 69 70 66 69 6c  "sqlar", "zipfil
25020 65 28 24 66 69 6c 65 29 22 20 6f 72 20 22 7a 69  e($file)" or "zi
25030 70 22 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  p" */.  const ch
25040 61 72 20 2a 7a 46 69 6c 65 3b 20 20 20 20 20 20  ar *zFile;      
25050 20 20 20 20 20 20 20 20 2f 2a 20 2d 2d 66 69 6c          /* --fil
25060 65 20 61 72 67 75 6d 65 6e 74 2c 20 6f 72 20 4e  e argument, or N
25070 55 4c 4c 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ULL */.  const c
25080 68 61 72 20 2a 7a 44 69 72 3b 20 20 20 20 20 20  har *zDir;      
25090 20 20 20 20 20 20 20 20 20 2f 2a 20 2d 2d 64 69           /* --di
250a0 72 65 63 74 6f 72 79 20 61 72 67 75 6d 65 6e 74  rectory argument
250b0 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 63  , or NULL */.  c
250c0 68 61 72 20 2a 2a 61 7a 41 72 67 3b 20 20 20 20  har **azArg;    
250d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
250e0 2a 20 41 72 72 61 79 20 6f 66 20 63 6f 6d 6d 61  * Array of comma
250f0 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  nd arguments */.
25100 20 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 3b    ShellState *p;
25110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25120 20 20 2f 2a 20 53 68 65 6c 6c 20 73 74 61 74 65    /* Shell state
25130 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
25140 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
25150 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
25160 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  e containing the
25170 20 61 72 63 68 69 76 65 20 2a 2f 0a 7d 3b 0a 0a   archive */.};..
25180 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 20 75 73  /*.** Print a us
25190 61 67 65 20 6d 65 73 73 61 67 65 20 66 6f 72 20  age message for 
251a0 74 68 65 20 2e 61 72 20 63 6f 6d 6d 61 6e 64 20  the .ar command 
251b0 74 6f 20 73 74 64 65 72 72 20 61 6e 64 20 72 65  to stderr and re
251c0 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
251d0 52 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  R..*/.static int
251e0 20 61 72 55 73 61 67 65 28 46 49 4c 45 20 2a 66   arUsage(FILE *f
251f0 29 7b 0a 20 20 72 61 77 5f 70 72 69 6e 74 66 28  ){.  raw_printf(
25200 66 2c 0a 22 5c 6e 22 0a 22 55 73 61 67 65 3a 20  f,."\n"."Usage: 
25210 2e 61 72 20 5b 4f 50 54 49 4f 4e 2e 2e 2e 5d 20  .ar [OPTION...] 
25220 5b 46 49 4c 45 2e 2e 2e 5d 5c 6e 22 0a 22 54 68  [FILE...]\n"."Th
25230 65 20 2e 61 72 20 63 6f 6d 6d 61 6e 64 20 6d 61  e .ar command ma
25240 6e 61 67 65 73 20 73 71 6c 61 72 20 61 72 63 68  nages sqlar arch
25250 69 76 65 73 2e 5c 6e 22 0a 22 5c 6e 22 0a 22 45  ives.\n"."\n"."E
25260 78 61 6d 70 6c 65 73 3a 5c 6e 22 0a 22 20 20 2e  xamples:\n"."  .
25270 61 72 20 2d 63 66 20 61 72 63 68 69 76 65 2e 73  ar -cf archive.s
25280 61 72 20 66 6f 6f 20 62 61 72 20 20 20 20 23 20  ar foo bar    # 
25290 43 72 65 61 74 65 20 61 72 63 68 69 76 65 2e 73  Create archive.s
252a0 61 72 20 66 72 6f 6d 20 66 69 6c 65 73 20 66 6f  ar from files fo
252b0 6f 20 61 6e 64 20 62 61 72 5c 6e 22 0a 22 20 20  o and bar\n"."  
252c0 2e 61 72 20 2d 74 66 20 61 72 63 68 69 76 65 2e  .ar -tf archive.
252d0 73 61 72 20 20 20 20 20 20 20 20 20 20 20 20 23  sar            #
252e0 20 4c 69 73 74 20 6d 65 6d 62 65 72 73 20 6f 66   List members of
252f0 20 61 72 63 68 69 76 65 2e 73 61 72 5c 6e 22 0a   archive.sar\n".
25300 22 20 20 2e 61 72 20 2d 78 76 66 20 61 72 63 68  "  .ar -xvf arch
25310 69 76 65 2e 73 61 72 20 20 20 20 20 20 20 20 20  ive.sar         
25320 20 20 23 20 56 65 72 62 6f 73 65 6c 79 20 65 78    # Verbosely ex
25330 74 72 61 63 74 20 66 69 6c 65 73 20 66 72 6f 6d  tract files from
25340 20 61 72 63 68 69 76 65 2e 73 61 72 5c 6e 22 0a   archive.sar\n".
25350 22 5c 6e 22 0a 22 45 61 63 68 20 63 6f 6d 6d 61  "\n"."Each comma
25360 6e 64 20 6c 69 6e 65 20 6d 75 73 74 20 66 65 61  nd line must fea
25370 74 75 72 65 20 65 78 61 63 74 6c 79 20 6f 6e 65  ture exactly one
25380 20 63 6f 6d 6d 61 6e 64 20 6f 70 74 69 6f 6e 3a   command option:
25390 5c 6e 22 0a 22 20 20 2d 63 2c 20 2d 2d 63 72 65  \n"."  -c, --cre
253a0 61 74 65 20 20 20 20 20 20 20 20 20 20 20 20 20  ate             
253b0 20 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 61    Create a new a
253c0 72 63 68 69 76 65 5c 6e 22 0a 22 20 20 2d 75 2c  rchive\n"."  -u,
253d0 20 2d 2d 75 70 64 61 74 65 20 20 20 20 20 20 20   --update       
253e0 20 20 20 20 20 20 20 20 55 70 64 61 74 65 20 6f          Update o
253f0 72 20 61 64 64 20 66 69 6c 65 73 20 74 6f 20 61  r add files to a
25400 6e 20 65 78 69 73 74 69 6e 67 20 61 72 63 68 69  n existing archi
25410 76 65 5c 6e 22 0a 22 20 20 2d 74 2c 20 2d 2d 6c  ve\n"."  -t, --l
25420 69 73 74 20 20 20 20 20 20 20 20 20 20 20 20 20  ist             
25430 20 20 20 20 4c 69 73 74 20 63 6f 6e 74 65 6e 74      List content
25440 73 20 6f 66 20 61 72 63 68 69 76 65 5c 6e 22 0a  s of archive\n".
25450 22 20 20 2d 78 2c 20 2d 2d 65 78 74 72 61 63 74  "  -x, --extract
25460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 45 78                Ex
25470 74 72 61 63 74 20 66 69 6c 65 73 20 66 72 6f 6d  tract files from
25480 20 61 72 63 68 69 76 65 5c 6e 22 0a 22 5c 6e 22   archive\n"."\n"
25490 0a 22 41 6e 64 20 7a 65 72 6f 20 6f 72 20 6d 6f  ."And zero or mo
254a0 72 65 20 6f 70 74 69 6f 6e 61 6c 20 6f 70 74 69  re optional opti
254b0 6f 6e 73 3a 5c 6e 22 0a 22 20 20 2d 76 2c 20 2d  ons:\n"."  -v, -
254c0 2d 76 65 72 62 6f 73 65 20 20 20 20 20 20 20 20  -verbose        
254d0 20 20 20 20 20 20 50 72 69 6e 74 20 65 61 63 68        Print each
254e0 20 66 69 6c 65 6e 61 6d 65 20 61 73 20 69 74 20   filename as it 
254f0 69 73 20 70 72 6f 63 65 73 73 65 64 5c 6e 22 0a  is processed\n".
25500 22 20 20 2d 66 20 46 49 4c 45 2c 20 2d 2d 66 69  "  -f FILE, --fi
25510 6c 65 20 46 49 4c 45 20 20 20 20 20 20 20 4f 70  le FILE       Op
25520 65 72 61 74 65 20 6f 6e 20 61 72 63 68 69 76 65  erate on archive
25530 20 46 49 4c 45 20 28 64 65 66 61 75 6c 74 20 69   FILE (default i
25540 73 20 63 75 72 72 65 6e 74 20 64 62 29 5c 6e 22  s current db)\n"
25550 0a 22 20 20 2d 61 20 46 49 4c 45 2c 20 2d 2d 61  ."  -a FILE, --a
25560 70 70 65 6e 64 20 46 49 4c 45 20 20 20 20 20 4f  ppend FILE     O
25570 70 65 72 61 74 65 20 6f 6e 20 46 49 4c 45 20 6f  perate on FILE o
25580 70 65 6e 65 64 20 75 73 69 6e 67 20 74 68 65 20  pened using the 
25590 61 70 6e 64 76 66 73 20 56 46 53 5c 6e 22 0a 22  apndvfs VFS\n"."
255a0 20 20 2d 43 20 44 49 52 2c 20 2d 2d 64 69 72 65    -C DIR, --dire
255b0 63 74 6f 72 79 20 44 49 52 20 20 20 20 43 68 61  ctory DIR    Cha
255c0 6e 67 65 20 74 6f 20 64 69 72 65 63 74 6f 72 79  nge to directory
255d0 20 44 49 52 20 74 6f 20 72 65 61 64 2f 65 78 74   DIR to read/ext
255e0 72 61 63 74 20 66 69 6c 65 73 5c 6e 22 0a 22 20  ract files\n"." 
255f0 20 2d 6e 2c 20 2d 2d 64 72 79 72 75 6e 20 20 20   -n, --dryrun   
25600 20 20 20 20 20 20 20 20 20 20 20 20 53 68 6f 77              Show
25610 20 74 68 65 20 53 51 4c 20 74 68 61 74 20 77 6f   the SQL that wo
25620 75 6c 64 20 68 61 76 65 20 6f 63 63 75 72 72 65  uld have occurre
25630 64 5c 6e 22 0a 22 5c 6e 22 0a 22 53 65 65 20 61  d\n"."\n"."See a
25640 6c 73 6f 3a 20 68 74 74 70 3a 2f 2f 73 71 6c 69  lso: http://sqli
25650 74 65 2e 6f 72 67 2f 63 6c 69 2e 68 74 6d 6c 23  te.org/cli.html#
25660 73 71 6c 61 72 5f 61 72 63 68 69 76 65 5f 73 75  sqlar_archive_su
25670 70 70 6f 72 74 5c 6e 22 0a 22 5c 6e 22 0a 29 3b  pport\n"."\n".);
25680 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
25690 5f 45 52 52 4f 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  _ERROR;.}../*.**
256a0 20 50 72 69 6e 74 20 61 6e 20 65 72 72 6f 72 20   Print an error 
256b0 6d 65 73 73 61 67 65 20 66 6f 72 20 74 68 65 20  message for the 
256c0 2e 61 72 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 73  .ar command to s
256d0 74 64 65 72 72 20 61 6e 64 20 72 65 74 75 72 6e  tderr and return
256e0 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 45 52 52 4f   .** SQLITE_ERRO
256f0 52 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  R..*/.static int
25700 20 61 72 45 72 72 6f 72 4d 73 67 28 41 72 43 6f   arErrorMsg(ArCo
25710 6d 6d 61 6e 64 20 2a 70 41 72 2c 20 63 6f 6e 73  mmand *pAr, cons
25720 74 20 63 68 61 72 20 2a 7a 46 6d 74 2c 20 2e 2e  t char *zFmt, ..
25730 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70  .){.  va_list ap
25740 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 76  ;.  char *z;.  v
25750 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6d 74  a_start(ap, zFmt
25760 29 3b 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65 33  );.  z = sqlite3
25770 5f 76 6d 70 72 69 6e 74 66 28 7a 46 6d 74 2c 20  _vmprintf(zFmt, 
25780 61 70 29 3b 0a 20 20 76 61 5f 65 6e 64 28 61 70  ap);.  va_end(ap
25790 29 3b 0a 20 20 75 74 66 38 5f 70 72 69 6e 74 66  );.  utf8_printf
257a0 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a  (stderr, "Error:
257b0 20 25 73 5c 6e 22 2c 20 7a 29 3b 0a 20 20 69 66   %s\n", z);.  if
257c0 28 20 70 41 72 2d 3e 66 72 6f 6d 43 6d 64 4c 69  ( pAr->fromCmdLi
257d0 6e 65 20 29 7b 0a 20 20 20 20 75 74 66 38 5f 70  ne ){.    utf8_p
257e0 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55  rintf(stderr, "U
257f0 73 65 20 5c 22 2d 41 5c 22 20 66 6f 72 20 6d 6f  se \"-A\" for mo
25800 72 65 20 68 65 6c 70 5c 6e 22 29 3b 0a 20 20 7d  re help\n");.  }
25810 65 6c 73 65 7b 0a 20 20 20 20 75 74 66 38 5f 70  else{.    utf8_p
25820 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55  rintf(stderr, "U
25830 73 65 20 5c 22 2e 61 72 63 68 69 76 65 20 2d 2d  se \".archive --
25840 68 65 6c 70 5c 22 20 66 6f 72 20 6d 6f 72 65 20  help\" for more 
25850 68 65 6c 70 5c 6e 22 29 3b 0a 20 20 7d 0a 20 20  help\n");.  }.  
25860 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 29 3b  sqlite3_free(z);
25870 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
25880 5f 45 52 52 4f 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  _ERROR;.}../*.**
25890 20 56 61 6c 75 65 73 20 66 6f 72 20 41 72 43 6f   Values for ArCo
258a0 6d 6d 61 6e 64 2e 65 43 6d 64 2e 0a 2a 2f 0a 23  mmand.eCmd..*/.#
258b0 64 65 66 69 6e 65 20 41 52 5f 43 4d 44 5f 43 52  define AR_CMD_CR
258c0 45 41 54 45 20 20 20 20 20 20 20 31 0a 23 64 65  EATE       1.#de
258d0 66 69 6e 65 20 41 52 5f 43 4d 44 5f 45 58 54 52  fine AR_CMD_EXTR
258e0 41 43 54 20 20 20 20 20 20 32 0a 23 64 65 66 69  ACT      2.#defi
258f0 6e 65 20 41 52 5f 43 4d 44 5f 4c 49 53 54 20 20  ne AR_CMD_LIST  
25900 20 20 20 20 20 20 20 33 0a 23 64 65 66 69 6e 65         3.#define
25910 20 41 52 5f 43 4d 44 5f 55 50 44 41 54 45 20 20   AR_CMD_UPDATE  
25920 20 20 20 20 20 34 0a 23 64 65 66 69 6e 65 20 41       4.#define A
25930 52 5f 43 4d 44 5f 48 45 4c 50 20 20 20 20 20 20  R_CMD_HELP      
25940 20 20 20 35 0a 0a 2f 2a 0a 2a 2a 20 4f 74 68 65     5../*.** Othe
25950 72 20 28 6e 6f 6e 2d 63 6f 6d 6d 61 6e 64 29 20  r (non-command) 
25960 73 77 69 74 63 68 65 73 2e 0a 2a 2f 0a 23 64 65  switches..*/.#de
25970 66 69 6e 65 20 41 52 5f 53 57 49 54 43 48 5f 56  fine AR_SWITCH_V
25980 45 52 42 4f 53 45 20 20 20 20 20 36 0a 23 64 65  ERBOSE     6.#de
25990 66 69 6e 65 20 41 52 5f 53 57 49 54 43 48 5f 46  fine AR_SWITCH_F
259a0 49 4c 45 20 20 20 20 20 20 20 20 37 0a 23 64 65  ILE        7.#de
259b0 66 69 6e 65 20 41 52 5f 53 57 49 54 43 48 5f 44  fine AR_SWITCH_D
259c0 49 52 45 43 54 4f 52 59 20 20 20 38 0a 23 64 65  IRECTORY   8.#de
259d0 66 69 6e 65 20 41 52 5f 53 57 49 54 43 48 5f 41  fine AR_SWITCH_A
259e0 50 50 45 4e 44 20 20 20 20 20 20 39 0a 23 64 65  PPEND      9.#de
259f0 66 69 6e 65 20 41 52 5f 53 57 49 54 43 48 5f 44  fine AR_SWITCH_D
25a00 52 59 52 55 4e 20 20 20 20 20 31 30 0a 0a 73 74  RYRUN     10..st
25a10 61 74 69 63 20 69 6e 74 20 61 72 50 72 6f 63 65  atic int arProce
25a20 73 73 53 77 69 74 63 68 28 41 72 43 6f 6d 6d 61  ssSwitch(ArComma
25a30 6e 64 20 2a 70 41 72 2c 20 69 6e 74 20 65 53 77  nd *pAr, int eSw
25a40 69 74 63 68 2c 20 63 6f 6e 73 74 20 63 68 61 72  itch, const char
25a50 20 2a 7a 41 72 67 29 7b 0a 20 20 73 77 69 74 63   *zArg){.  switc
25a60 68 28 20 65 53 77 69 74 63 68 20 29 7b 0a 20 20  h( eSwitch ){.  
25a70 20 20 63 61 73 65 20 41 52 5f 43 4d 44 5f 43 52    case AR_CMD_CR
25a80 45 41 54 45 3a 0a 20 20 20 20 63 61 73 65 20 41  EATE:.    case A
25a90 52 5f 43 4d 44 5f 45 58 54 52 41 43 54 3a 0a 20  R_CMD_EXTRACT:. 
25aa0 20 20 20 63 61 73 65 20 41 52 5f 43 4d 44 5f 4c     case AR_CMD_L
25ab0 49 53 54 3a 0a 20 20 20 20 63 61 73 65 20 41 52  IST:.    case AR
25ac0 5f 43 4d 44 5f 55 50 44 41 54 45 3a 0a 20 20 20  _CMD_UPDATE:.   
25ad0 20 63 61 73 65 20 41 52 5f 43 4d 44 5f 48 45 4c   case AR_CMD_HEL
25ae0 50 3a 0a 20 20 20 20 20 20 69 66 28 20 70 41 72  P:.      if( pAr
25af0 2d 3e 65 43 6d 64 20 29 7b 0a 20 20 20 20 20 20  ->eCmd ){.      
25b00 20 20 72 65 74 75 72 6e 20 61 72 45 72 72 6f 72    return arError
25b10 4d 73 67 28 70 41 72 2c 20 22 6d 75 6c 74 69 70  Msg(pAr, "multip
25b20 6c 65 20 63 6f 6d 6d 61 6e 64 20 6f 70 74 69 6f  le command optio
25b30 6e 73 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ns");.      }.  
25b40 20 20 20 20 70 41 72 2d 3e 65 43 6d 64 20 3d 20      pAr->eCmd = 
25b50 65 53 77 69 74 63 68 3b 0a 20 20 20 20 20 20 62  eSwitch;.      b
25b60 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20  reak;..    case 
25b70 41 52 5f 53 57 49 54 43 48 5f 44 52 59 52 55 4e  AR_SWITCH_DRYRUN
25b80 3a 0a 20 20 20 20 20 20 70 41 72 2d 3e 62 44 72  :.      pAr->bDr
25b90 79 52 75 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20  yRun = 1;.      
25ba0 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
25bb0 41 52 5f 53 57 49 54 43 48 5f 56 45 52 42 4f 53  AR_SWITCH_VERBOS
25bc0 45 3a 0a 20 20 20 20 20 20 70 41 72 2d 3e 62 56  E:.      pAr->bV
25bd0 65 72 62 6f 73 65 20 3d 20 31 3b 0a 20 20 20 20  erbose = 1;.    
25be0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
25bf0 65 20 41 52 5f 53 57 49 54 43 48 5f 41 50 50 45  e AR_SWITCH_APPE
25c00 4e 44 3a 0a 20 20 20 20 20 20 70 41 72 2d 3e 62  ND:.      pAr->b
25c10 41 70 70 65 6e 64 20 3d 20 31 3b 0a 20 20 20 20  Append = 1;.    
25c20 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72 75 20 69    /* Fall thru i
25c30 6e 74 6f 20 2d 2d 66 69 6c 65 20 2a 2f 0a 20 20  nto --file */.  
25c40 20 20 63 61 73 65 20 41 52 5f 53 57 49 54 43 48    case AR_SWITCH
25c50 5f 46 49 4c 45 3a 0a 20 20 20 20 20 20 70 41 72  _FILE:.      pAr
25c60 2d 3e 7a 46 69 6c 65 20 3d 20 7a 41 72 67 3b 0a  ->zFile = zArg;.
25c70 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
25c80 20 63 61 73 65 20 41 52 5f 53 57 49 54 43 48 5f   case AR_SWITCH_
25c90 44 49 52 45 43 54 4f 52 59 3a 0a 20 20 20 20 20  DIRECTORY:.     
25ca0 20 70 41 72 2d 3e 7a 44 69 72 20 3d 20 7a 41 72   pAr->zDir = zAr
25cb0 67 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  g;.      break;.
25cc0 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51    }..  return SQ
25cd0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
25ce0 2a 20 50 61 72 73 65 20 74 68 65 20 63 6f 6d 6d  * Parse the comm
25cf0 61 6e 64 20 6c 69 6e 65 20 66 6f 72 20 61 6e 20  and line for an 
25d00 22 2e 61 72 22 20 63 6f 6d 6d 61 6e 64 2e 20 54  ".ar" command. T
25d10 68 65 20 72 65 73 75 6c 74 73 20 61 72 65 20 77  he results are w
25d20 72 69 74 74 65 6e 20 69 6e 74 6f 0a 2a 2a 20 73  ritten into.** s
25d30 74 72 75 63 74 75 72 65 20 28 2a 70 41 72 29 2e  tructure (*pAr).
25d40 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
25d50 74 75 72 6e 65 64 20 69 66 20 74 68 65 20 63 6f  turned if the co
25d60 6d 6d 61 6e 64 20 6c 69 6e 65 20 69 73 20 70 61  mmand line is pa
25d70 72 73 65 64 0a 2a 2a 20 73 75 63 63 65 73 73 66  rsed.** successf
25d80 75 6c 6c 79 2c 20 6f 74 68 65 72 77 69 73 65 20  ully, otherwise 
25d90 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
25da0 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 73   is written to s
25db0 74 64 65 72 72 20 61 6e 64 20 0a 2a 2a 20 53 51  tderr and .** SQ
25dc0 4c 49 54 45 5f 45 52 52 4f 52 20 72 65 74 75 72  LITE_ERROR retur
25dd0 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
25de0 6e 74 20 61 72 50 61 72 73 65 43 6f 6d 6d 61 6e  nt arParseComman
25df0 64 28 0a 20 20 63 68 61 72 20 2a 2a 61 7a 41 72  d(.  char **azAr
25e00 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g,              
25e10 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66       /* Array of
25e20 20 61 72 67 75 6d 65 6e 74 73 20 70 61 73 73 65   arguments passe
25e30 64 20 74 6f 20 64 6f 74 20 63 6f 6d 6d 61 6e 64  d to dot command
25e40 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 72 67 2c 20   */.  int nArg, 
25e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25e60 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
25e70 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 61 7a  of entries in az
25e80 41 72 67 5b 5d 20 2a 2f 0a 20 20 41 72 43 6f 6d  Arg[] */.  ArCom
25e90 6d 61 6e 64 20 2a 70 41 72 20 20 20 20 20 20 20  mand *pAr       
25ea0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
25eb0 70 75 6c 61 74 65 20 74 68 69 73 20 6f 62 6a 65  pulate this obje
25ec0 63 74 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63  ct */.){.  struc
25ed0 74 20 41 72 53 77 69 74 63 68 20 7b 0a 20 20 20  t ArSwitch {.   
25ee0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4c 6f   const char *zLo
25ef0 6e 67 3b 0a 20 20 20 20 63 68 61 72 20 63 53 68  ng;.    char cSh
25f00 6f 72 74 3b 0a 20 20 20 20 75 38 20 65 53 77 69  ort;.    u8 eSwi
25f10 74 63 68 3b 0a 20 20 20 20 75 38 20 62 41 72 67  tch;.    u8 bArg
25f20 3b 0a 20 20 7d 20 61 53 77 69 74 63 68 5b 5d 20  ;.  } aSwitch[] 
25f30 3d 20 7b 0a 20 20 20 20 7b 20 22 63 72 65 61 74  = {.    { "creat
25f40 65 22 2c 20 20 20 20 27 63 27 2c 20 41 52 5f 43  e",    'c', AR_C
25f50 4d 44 5f 43 52 45 41 54 45 2c 20 20 20 20 20 20  MD_CREATE,      
25f60 20 30 20 7d 2c 0a 20 20 20 20 7b 20 22 65 78 74   0 },.    { "ext
25f70 72 61 63 74 22 2c 20 20 20 27 78 27 2c 20 41 52  ract",   'x', AR
25f80 5f 43 4d 44 5f 45 58 54 52 41 43 54 2c 20 20 20  _CMD_EXTRACT,   
25f90 20 20 20 30 20 7d 2c 0a 20 20 20 20 7b 20 22 6c     0 },.    { "l
25fa0 69 73 74 22 2c 20 20 20 20 20 20 27 74 27 2c 20  ist",      't', 
25fb0 41 52 5f 43 4d 44 5f 4c 49 53 54 2c 20 20 20 20  AR_CMD_LIST,    
25fc0 20 20 20 20 20 30 20 7d 2c 0a 20 20 20 20 7b 20       0 },.    { 
25fd0 22 75 70 64 61 74 65 22 2c 20 20 20 20 27 75 27  "update",    'u'
25fe0 2c 20 41 52 5f 43 4d 44 5f 55 50 44 41 54 45 2c  , AR_CMD_UPDATE,
25ff0 20 20 20 20 20 20 20 30 20 7d 2c 0a 20 20 20 20         0 },.    
26000 7b 20 22 68 65 6c 70 22 2c 20 20 20 20 20 20 27  { "help",      '
26010 68 27 2c 20 41 52 5f 43 4d 44 5f 48 45 4c 50 2c  h', AR_CMD_HELP,
26020 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 20 20           0 },.  
26030 20 20 7b 20 22 76 65 72 62 6f 73 65 22 2c 20 20    { "verbose",  
26040 20 27 76 27 2c 20 41 52 5f 53 57 49 54 43 48 5f   'v', AR_SWITCH_
26050 56 45 52 42 4f 53 45 2c 20 20 20 30 20 7d 2c 0a  VERBOSE,   0 },.
26060 20 20 20 20 7b 20 22 66 69 6c 65 22 2c 20 20 20      { "file",   
26070 20 20 20 27 66 27 2c 20 41 52 5f 53 57 49 54 43     'f', AR_SWITC
26080 48 5f 46 49 4c 45 2c 20 20 20 20 20 20 31 20 7d  H_FILE,      1 }
26090 2c 0a 20 20 20 20 7b 20 22 61 70 70 65 6e 64 22  ,.    { "append"
260a0 2c 20 20 20 20 27 61 27 2c 20 41 52 5f 53 57 49  ,    'a', AR_SWI
260b0 54 43 48 5f 41 50 50 45 4e 44 2c 20 20 20 20 31  TCH_APPEND,    1
260c0 20 7d 2c 0a 20 20 20 20 7b 20 22 64 69 72 65 63   },.    { "direc
260d0 74 6f 72 79 22 2c 20 27 43 27 2c 20 41 52 5f 53  tory", 'C', AR_S
260e0 57 49 54 43 48 5f 44 49 52 45 43 54 4f 52 59 2c  WITCH_DIRECTORY,
260f0 20 31 20 7d 2c 0a 20 20 20 20 7b 20 22 64 72 79   1 },.    { "dry
26100 72 75 6e 22 2c 20 20 20 20 27 6e 27 2c 20 41 52  run",    'n', AR
26110 5f 53 57 49 54 43 48 5f 44 52 59 52 55 4e 2c 20  _SWITCH_DRYRUN, 
26120 20 20 20 30 20 7d 2c 0a 20 20 7d 3b 0a 20 20 69     0 },.  };.  i
26130 6e 74 20 6e 53 77 69 74 63 68 20 3d 20 73 69 7a  nt nSwitch = siz
26140 65 6f 66 28 61 53 77 69 74 63 68 29 20 2f 20 73  eof(aSwitch) / s
26150 69 7a 65 6f 66 28 73 74 72 75 63 74 20 41 72 53  izeof(struct ArS
26160 77 69 74 63 68 29 3b 0a 20 20 73 74 72 75 63 74  witch);.  struct
26170 20 41 72 53 77 69 74 63 68 20 2a 70 45 6e 64 20   ArSwitch *pEnd 
26180 3d 20 26 61 53 77 69 74 63 68 5b 6e 53 77 69 74  = &aSwitch[nSwit
26190 63 68 5d 3b 0a 0a 20 20 69 66 28 20 6e 41 72 67  ch];..  if( nArg
261a0 3c 3d 31 20 29 7b 0a 20 20 20 20 72 65 74 75 72  <=1 ){.    retur
261b0 6e 20 61 72 55 73 61 67 65 28 73 74 64 65 72 72  n arUsage(stderr
261c0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
261d0 63 68 61 72 20 2a 7a 20 3d 20 61 7a 41 72 67 5b  char *z = azArg[
261e0 31 5d 3b 0a 20 20 20 20 69 66 28 20 7a 5b 30 5d  1];.    if( z[0]
261f0 21 3d 27 2d 27 20 29 7b 0a 20 20 20 20 20 20 2f  !='-' ){.      /
26200 2a 20 54 72 61 64 69 74 69 6f 6e 61 6c 20 73 74  * Traditional st
26210 79 6c 65 20 5b 74 61 72 5d 20 69 6e 76 6f 63 61  yle [tar] invoca
26220 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 69 6e  tion */.      in
26230 74 20 69 3b 0a 20 20 20 20 20 20 69 6e 74 20 69  t i;.      int i
26240 41 72 67 20 3d 20 32 3b 0a 20 20 20 20 20 20 66  Arg = 2;.      f
26250 6f 72 28 69 3d 30 3b 20 7a 5b 69 5d 3b 20 69 2b  or(i=0; z[i]; i+
26260 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73  +){.        cons
26270 74 20 63 68 61 72 20 2a 7a 41 72 67 20 3d 20 30  t char *zArg = 0
26280 3b 0a 20 20 20 20 20 20 20 20 73 74 72 75 63 74  ;.        struct
26290 20 41 72 53 77 69 74 63 68 20 2a 70 4f 70 74 3b   ArSwitch *pOpt;
262a0 0a 20 20 20 20 20 20 20 20 66 6f 72 28 70 4f 70  .        for(pOp
262b0 74 3d 26 61 53 77 69 74 63 68 5b 30 5d 3b 20 70  t=&aSwitch[0]; p
262c0 4f 70 74 3c 70 45 6e 64 3b 20 70 4f 70 74 2b 2b  Opt<pEnd; pOpt++
262d0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
262e0 20 7a 5b 69 5d 3d 3d 70 4f 70 74 2d 3e 63 53 68   z[i]==pOpt->cSh
262f0 6f 72 74 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ort ) break;.   
26300 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
26310 66 28 20 70 4f 70 74 3d 3d 70 45 6e 64 20 29 7b  f( pOpt==pEnd ){
26320 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
26330 6e 20 61 72 45 72 72 6f 72 4d 73 67 28 70 41 72  n arErrorMsg(pAr
26340 2c 20 22 75 6e 72 65 63 6f 67 6e 69 7a 65 64 20  , "unrecognized 
26350 6f 70 74 69 6f 6e 3a 20 25 63 22 2c 20 7a 5b 69  option: %c", z[i
26360 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ]);.        }.  
26370 20 20 20 20 20 20 69 66 28 20 70 4f 70 74 2d 3e        if( pOpt->
26380 62 41 72 67 20 29 7b 0a 20 20 20 20 20 20 20 20  bArg ){.        
26390 20 20 69 66 28 20 69 41 72 67 3e 3d 6e 41 72 67    if( iArg>=nArg
263a0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
263b0 72 65 74 75 72 6e 20 61 72 45 72 72 6f 72 4d 73  return arErrorMs
263c0 67 28 70 41 72 2c 20 22 6f 70 74 69 6f 6e 20 72  g(pAr, "option r
263d0 65 71 75 69 72 65 73 20 61 6e 20 61 72 67 75 6d  equires an argum
263e0 65 6e 74 3a 20 25 63 22 2c 7a 5b 69 5d 29 3b 0a  ent: %c",z[i]);.
263f0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
26400 20 20 20 20 20 20 7a 41 72 67 20 3d 20 61 7a 41        zArg = azA
26410 72 67 5b 69 41 72 67 2b 2b 5d 3b 0a 20 20 20 20  rg[iArg++];.    
26420 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
26430 28 20 61 72 50 72 6f 63 65 73 73 53 77 69 74 63  ( arProcessSwitc
26440 68 28 70 41 72 2c 20 70 4f 70 74 2d 3e 65 53 77  h(pAr, pOpt->eSw
26450 69 74 63 68 2c 20 7a 41 72 67 29 20 29 20 72 65  itch, zArg) ) re
26460 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
26470 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  R;.      }.     
26480 20 70 41 72 2d 3e 6e 41 72 67 20 3d 20 6e 41 72   pAr->nArg = nAr
26490 67 2d 69 41 72 67 3b 0a 20 20 20 20 20 20 69 66  g-iArg;.      if
264a0 28 20 70 41 72 2d 3e 6e 41 72 67 3e 30 20 29 7b  ( pAr->nArg>0 ){
264b0 0a 20 20 20 20 20 20 20 20 70 41 72 2d 3e 61 7a  .        pAr->az
264c0 41 72 67 20 3d 20 26 61 7a 41 72 67 5b 69 41 72  Arg = &azArg[iAr
264d0 67 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  g];.      }.    
264e0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20  }else{.      /* 
264f0 4e 6f 6e 2d 74 72 61 64 69 74 69 6f 6e 61 6c 20  Non-traditional 
26500 69 6e 76 6f 63 61 74 69 6f 6e 20 2a 2f 0a 20 20  invocation */.  
26510 20 20 20 20 69 6e 74 20 69 41 72 67 3b 0a 20 20      int iArg;.  
26520 20 20 20 20 66 6f 72 28 69 41 72 67 3d 31 3b 20      for(iArg=1; 
26530 69 41 72 67 3c 6e 41 72 67 3b 20 69 41 72 67 2b  iArg<nArg; iArg+
26540 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  +){.        int 
26550 6e 3b 0a 20 20 20 20 20 20 20 20 7a 20 3d 20 61  n;.        z = a
26560 7a 41 72 67 5b 69 41 72 67 5d 3b 0a 20 20 20 20  zArg[iArg];.    
26570 20 20 20 20 69 66 28 20 7a 5b 30 5d 21 3d 27 2d      if( z[0]!='-
26580 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  ' ){.          /
26590 2a 20 41 6c 6c 20 72 65 6d 61 69 6e 69 6e 67 20  * All remaining 
265a0 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20 77 6f 72  command line wor
265b0 64 73 20 61 72 65 20 63 6f 6d 6d 61 6e 64 20 61  ds are command a
265c0 72 67 75 6d 65 6e 74 73 2e 20 2a 2f 0a 20 20 20  rguments. */.   
265d0 20 20 20 20 20 20 20 70 41 72 2d 3e 61 7a 41 72         pAr->azAr
265e0 67 20 3d 20 26 61 7a 41 72 67 5b 69 41 72 67 5d  g = &azArg[iArg]
265f0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 41 72 2d  ;.          pAr-
26600 3e 6e 41 72 67 20 3d 20 6e 41 72 67 2d 69 41 72  >nArg = nArg-iAr
26610 67 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  g;.          bre
26620 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
26630 20 20 20 20 20 20 6e 20 3d 20 73 74 72 6c 65 6e        n = strlen
26640 33 30 28 7a 29 3b 0a 0a 20 20 20 20 20 20 20 20  30(z);..        
26650 69 66 28 20 7a 5b 31 5d 21 3d 27 2d 27 20 29 7b  if( z[1]!='-' ){
26660 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69  .          int i
26670 3b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f  ;.          /* O
26680 6e 65 20 6f 72 20 6d 6f 72 65 20 73 68 6f 72 74  ne or more short
26690 20 6f 70 74 69 6f 6e 73 20 2a 2f 0a 20 20 20 20   options */.    
266a0 20 20 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69        for(i=1; i
266b0 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  <n; i++){.      
266c0 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
266d0 20 2a 7a 41 72 67 20 3d 20 30 3b 0a 20 20 20 20   *zArg = 0;.    
266e0 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20 41          struct A
266f0 72 53 77 69 74 63 68 20 2a 70 4f 70 74 3b 0a 20  rSwitch *pOpt;. 
26700 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 70             for(p
26710 4f 70 74 3d 26 61 53 77 69 74 63 68 5b 30 5d 3b  Opt=&aSwitch[0];
26720 20 70 4f 70 74 3c 70 45 6e 64 3b 20 70 4f 70 74   pOpt<pEnd; pOpt
26730 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
26740 20 20 20 69 66 28 20 7a 5b 69 5d 3d 3d 70 4f 70     if( z[i]==pOp
26750 74 2d 3e 63 53 68 6f 72 74 20 29 20 62 72 65 61  t->cShort ) brea
26760 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  k;.            }
26770 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
26780 20 70 4f 70 74 3d 3d 70 45 6e 64 20 29 7b 0a 20   pOpt==pEnd ){. 
26790 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74               ret
267a0 75 72 6e 20 61 72 45 72 72 6f 72 4d 73 67 28 70  urn arErrorMsg(p
267b0 41 72 2c 20 22 75 6e 72 65 63 6f 67 6e 69 7a 65  Ar, "unrecognize
267c0 64 20 6f 70 74 69 6f 6e 3a 20 25 63 22 2c 20 7a  d option: %c", z
267d0 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20  [i]);.          
267e0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
267f0 69 66 28 20 70 4f 70 74 2d 3e 62 41 72 67 20 29  if( pOpt->bArg )
26800 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
26810 69 66 28 20 69 3c 28 6e 2d 31 29 20 29 7b 0a 20  if( i<(n-1) ){. 
26820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a                 z
26830 41 72 67 20 3d 20 26 7a 5b 69 2b 31 5d 3b 0a 20  Arg = &z[i+1];. 
26840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
26850 20 3d 20 6e 3b 0a 20 20 20 20 20 20 20 20 20 20   = n;.          
26860 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
26870 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69             if( i
26880 41 72 67 3e 3d 28 6e 41 72 67 2d 31 29 20 29 7b  Arg>=(nArg-1) ){
26890 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
268a0 20 20 20 72 65 74 75 72 6e 20 61 72 45 72 72 6f     return arErro
268b0 72 4d 73 67 28 70 41 72 2c 20 22 6f 70 74 69 6f  rMsg(pAr, "optio
268c0 6e 20 72 65 71 75 69 72 65 73 20 61 6e 20 61 72  n requires an ar
268d0 67 75 6d 65 6e 74 3a 20 25 63 22 2c 7a 5b 69 5d  gument: %c",z[i]
268e0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
268f0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
26900 20 20 20 20 20 7a 41 72 67 20 3d 20 61 7a 41 72       zArg = azAr
26910 67 5b 2b 2b 69 41 72 67 5d 3b 0a 20 20 20 20 20  g[++iArg];.     
26920 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
26930 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
26940 20 20 20 20 20 69 66 28 20 61 72 50 72 6f 63 65       if( arProce
26950 73 73 53 77 69 74 63 68 28 70 41 72 2c 20 70 4f  ssSwitch(pAr, pO
26960 70 74 2d 3e 65 53 77 69 74 63 68 2c 20 7a 41 72  pt->eSwitch, zAr
26970 67 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  g) ) return SQLI
26980 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  TE_ERROR;.      
26990 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65      }.        }e
269a0 6c 73 65 20 69 66 28 20 7a 5b 32 5d 3d 3d 27 5c  lse if( z[2]=='\
269b0 30 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  0' ){.          
269c0 2f 2a 20 41 20 2d 2d 20 6f 70 74 69 6f 6e 2c 20  /* A -- option, 
269d0 69 6e 64 69 63 61 74 69 6e 67 20 74 68 61 74 20  indicating that 
269e0 61 6c 6c 20 72 65 6d 61 69 6e 69 6e 67 20 63 6f  all remaining co
269f0 6d 6d 61 6e 64 20 6c 69 6e 65 20 77 6f 72 64 73  mmand line words
26a00 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 72  .          ** ar
26a10 65 20 63 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65  e command argume
26a20 6e 74 73 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20  nts.  */.       
26a30 20 20 20 70 41 72 2d 3e 61 7a 41 72 67 20 3d 20     pAr->azArg = 
26a40 26 61 7a 41 72 67 5b 69 41 72 67 2b 31 5d 3b 0a  &azArg[iArg+1];.
26a50 20 20 20 20 20 20 20 20 20 20 70 41 72 2d 3e 6e            pAr->n
26a60 41 72 67 20 3d 20 6e 41 72 67 2d 69 41 72 67 2d  Arg = nArg-iArg-
26a70 31 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  1;.          bre
26a80 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ak;.        }els
26a90 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e{.          /* 
26aa0 41 20 6c 6f 6e 67 20 6f 70 74 69 6f 6e 20 2a 2f  A long option */
26ab0 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74  .          const
26ac0 20 63 68 61 72 20 2a 7a 41 72 67 20 3d 20 30 3b   char *zArg = 0;
26ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
26ae0 41 72 67 75 6d 65 6e 74 20 66 6f 72 20 6f 70 74  Argument for opt
26af0 69 6f 6e 2c 20 69 66 20 61 6e 79 20 2a 2f 0a 20  ion, if any */. 
26b00 20 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20           struct 
26b10 41 72 53 77 69 74 63 68 20 2a 70 4d 61 74 63 68  ArSwitch *pMatch
26b20 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 4d 61   = 0;      /* Ma
26b30 74 63 68 69 6e 67 20 6f 70 74 69 6f 6e 20 2a 2f  tching option */
26b40 0a 20 20 20 20 20 20 20 20 20 20 73 74 72 75 63  .          struc
26b50 74 20 41 72 53 77 69 74 63 68 20 2a 70 4f 70 74  t ArSwitch *pOpt
26b60 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
26b70 49 74 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20  Iterator */.    
26b80 20 20 20 20 20 20 66 6f 72 28 70 4f 70 74 3d 26        for(pOpt=&
26b90 61 53 77 69 74 63 68 5b 30 5d 3b 20 70 4f 70 74  aSwitch[0]; pOpt
26ba0 3c 70 45 6e 64 3b 20 70 4f 70 74 2b 2b 29 7b 0a  <pEnd; pOpt++){.
26bb0 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73              cons
26bc0 74 20 63 68 61 72 20 2a 7a 4c 6f 6e 67 20 3d 20  t char *zLong = 
26bd0 70 4f 70 74 2d 3e 7a 4c 6f 6e 67 3b 0a 20 20 20  pOpt->zLong;.   
26be0 20 20 20 20 20 20 20 20 20 69 66 28 20 28 6e 2d           if( (n-
26bf0 32 29 3c 3d 73 74 72 6c 65 6e 33 30 28 7a 4c 6f  2)<=strlen30(zLo
26c00 6e 67 29 20 26 26 20 30 3d 3d 6d 65 6d 63 6d 70  ng) && 0==memcmp
26c10 28 26 7a 5b 32 5d 2c 20 7a 4c 6f 6e 67 2c 20 6e  (&z[2], zLong, n
26c20 2d 32 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  -2) ){.         
26c30 20 20 20 20 20 69 66 28 20 70 4d 61 74 63 68 20       if( pMatch 
26c40 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
26c50 20 20 20 72 65 74 75 72 6e 20 61 72 45 72 72 6f     return arErro
26c60 72 4d 73 67 28 70 41 72 2c 20 22 61 6d 62 69 67  rMsg(pAr, "ambig
26c70 75 6f 75 73 20 6f 70 74 69 6f 6e 3a 20 25 73 22  uous option: %s"
26c80 2c 7a 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ,z);.           
26c90 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
26ca0 20 20 20 20 20 20 20 20 20 20 70 4d 61 74 63 68            pMatch
26cb0 20 3d 20 70 4f 70 74 3b 0a 20 20 20 20 20 20 20   = pOpt;.       
26cc0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
26cd0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
26ce0 20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 69 66   }..          if
26cf0 28 20 70 4d 61 74 63 68 3d 3d 30 20 29 7b 0a 20  ( pMatch==0 ){. 
26d00 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
26d10 6e 20 61 72 45 72 72 6f 72 4d 73 67 28 70 41 72  n arErrorMsg(pAr
26d20 2c 20 22 75 6e 72 65 63 6f 67 6e 69 7a 65 64 20  , "unrecognized 
26d30 6f 70 74 69 6f 6e 3a 20 25 73 22 2c 20 7a 29 3b  option: %s", z);
26d40 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
26d50 20 20 20 20 20 20 20 69 66 28 20 70 4d 61 74 63         if( pMatc
26d60 68 2d 3e 62 41 72 67 20 29 7b 0a 20 20 20 20 20  h->bArg ){.     
26d70 20 20 20 20 20 20 20 69 66 28 20 69 41 72 67 3e         if( iArg>
26d80 3d 28 6e 41 72 67 2d 31 29 20 29 7b 0a 20 20 20  =(nArg-1) ){.   
26d90 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
26da0 6e 20 61 72 45 72 72 6f 72 4d 73 67 28 70 41 72  n arErrorMsg(pAr
26db0 2c 20 22 6f 70 74 69 6f 6e 20 72 65 71 75 69 72  , "option requir
26dc0 65 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 3a 20  es an argument: 
26dd0 25 73 22 2c 20 7a 29 3b 0a 20 20 20 20 20 20 20  %s", z);.       
26de0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
26df0 20 20 20 7a 41 72 67 20 3d 20 61 7a 41 72 67 5b     zArg = azArg[
26e00 2b 2b 69 41 72 67 5d 3b 0a 20 20 20 20 20 20 20  ++iArg];.       
26e10 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69     }.          i
26e20 66 28 20 61 72 50 72 6f 63 65 73 73 53 77 69 74  f( arProcessSwit
26e30 63 68 28 70 41 72 2c 20 70 4d 61 74 63 68 2d 3e  ch(pAr, pMatch->
26e40 65 53 77 69 74 63 68 2c 20 7a 41 72 67 29 20 29  eSwitch, zArg) )
26e50 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
26e60 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 7d 0a  RROR;.        }.
26e70 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
26e80 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  }..  return SQLI
26e90 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
26ea0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 73  This function as
26eb0 73 75 6d 65 73 20 74 68 61 74 20 61 6c 6c 20 61  sumes that all a
26ec0 72 67 75 6d 65 6e 74 73 20 77 69 74 68 69 6e 20  rguments within 
26ed0 74 68 65 20 41 72 43 6f 6d 6d 61 6e 64 2e 61 7a  the ArCommand.az
26ee0 41 72 67 5b 5d 0a 2a 2a 20 61 72 72 61 79 20 72  Arg[].** array r
26ef0 65 66 65 72 20 74 6f 20 61 72 63 68 69 76 65 20  efer to archive 
26f00 6d 65 6d 62 65 72 73 2c 20 61 73 20 66 6f 72 20  members, as for 
26f10 74 68 65 20 2d 2d 65 78 74 72 61 63 74 20 6f 72  the --extract or
26f20 20 2d 2d 6c 69 73 74 20 63 6f 6d 6d 61 6e 64 73   --list commands
26f30 2e 20 0a 2a 2a 20 49 74 20 63 68 65 63 6b 73 20  . .** It checks 
26f40 74 68 61 74 20 65 61 63 68 20 6f 66 20 74 68 65  that each of the
26f50 6d 20 61 72 65 20 70 72 65 73 65 6e 74 2e 20 49  m are present. I
26f60 66 20 61 6e 79 20 73 70 65 63 69 66 69 65 64 20  f any specified 
26f70 66 69 6c 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 70  file is not.** p
26f80 72 65 73 65 6e 74 20 69 6e 20 74 68 65 20 61 72  resent in the ar
26f90 63 68 69 76 65 2c 20 61 6e 20 65 72 72 6f 72 20  chive, an error 
26fa0 69 73 20 70 72 69 6e 74 65 64 20 74 6f 20 73 74  is printed to st
26fb0 64 65 72 72 20 61 6e 64 20 61 6e 20 65 72 72 6f  derr and an erro
26fc0 72 0a 2a 2a 20 63 6f 64 65 20 72 65 74 75 72 6e  r.** code return
26fd0 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69  ed. Otherwise, i
26fe0 66 20 61 6c 6c 20 73 70 65 63 69 66 69 65 64 20  f all specified 
26ff0 61 72 67 75 6d 65 6e 74 73 20 61 72 65 20 70 72  arguments are pr
27000 65 73 65 6e 74 20 69 6e 0a 2a 2a 20 74 68 65 20  esent in.** the 
27010 61 72 63 68 69 76 65 2c 20 53 51 4c 49 54 45 5f  archive, SQLITE_
27020 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  OK is returned..
27030 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
27040 69 6f 6e 20 73 74 72 69 70 73 20 61 6e 79 20 74  ion strips any t
27050 72 61 69 6c 69 6e 67 20 27 2f 27 20 63 68 61 72  railing '/' char
27060 61 63 74 65 72 73 20 66 72 6f 6d 20 65 61 63 68  acters from each
27070 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 20 54 68   argument..** Th
27080 69 73 20 69 73 20 63 6f 6e 73 69 73 74 65 6e 74  is is consistent
27090 20 77 69 74 68 20 74 68 65 20 77 61 79 20 74 68   with the way th
270a0 65 20 5b 74 61 72 5d 20 63 6f 6d 6d 61 6e 64 20  e [tar] command 
270b0 73 65 65 6d 73 20 74 6f 20 77 6f 72 6b 20 6f 6e  seems to work on
270c0 0a 2a 2a 20 4c 69 6e 75 78 2e 0a 2a 2f 0a 73 74  .** Linux..*/.st
270d0 61 74 69 63 20 69 6e 74 20 61 72 43 68 65 63 6b  atic int arCheck
270e0 45 6e 74 72 69 65 73 28 41 72 43 6f 6d 6d 61 6e  Entries(ArComman
270f0 64 20 2a 70 41 72 29 7b 0a 20 20 69 6e 74 20 72  d *pAr){.  int r
27100 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
27110 20 69 66 28 20 70 41 72 2d 3e 6e 41 72 67 20 29   if( pAr->nArg )
27120 7b 0a 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b 0a  {.    int i, j;.
27130 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74      sqlite3_stmt
27140 20 2a 70 54 65 73 74 20 3d 20 30 3b 0a 0a 20 20   *pTest = 0;..  
27150 20 20 73 68 65 6c 6c 50 72 65 70 61 72 65 50 72    shellPreparePr
27160 69 6e 74 66 28 70 41 72 2d 3e 64 62 2c 20 26 72  intf(pAr->db, &r
27170 63 2c 20 26 70 54 65 73 74 2c 0a 20 20 20 20 20  c, &pTest,.     
27180 20 20 20 22 53 45 4c 45 43 54 20 6e 61 6d 65 20     "SELECT name 
27190 46 52 4f 4d 20 25 73 20 57 48 45 52 45 20 6e 61  FROM %s WHERE na
271a0 6d 65 3d 24 6e 61 6d 65 22 2c 20 0a 20 20 20 20  me=$name", .    
271b0 20 20 20 20 70 41 72 2d 3e 7a 53 72 63 54 61 62      pAr->zSrcTab
271c0 6c 65 0a 20 20 20 20 29 3b 0a 20 20 20 20 6a 20  le.    );.    j 
271d0 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70  = sqlite3_bind_p
271e0 61 72 61 6d 65 74 65 72 5f 69 6e 64 65 78 28 70  arameter_index(p
271f0 54 65 73 74 2c 20 22 24 6e 61 6d 65 22 29 3b 0a  Test, "$name");.
27200 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
27210 41 72 2d 3e 6e 41 72 67 20 26 26 20 72 63 3d 3d  Ar->nArg && rc==
27220 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 2b 2b 29 7b  SQLITE_OK; i++){
27230 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 20 3d  .      char *z =
27240 20 70 41 72 2d 3e 61 7a 41 72 67 5b 69 5d 3b 0a   pAr->azArg[i];.
27250 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 73 74        int n = st
27260 72 6c 65 6e 33 30 28 7a 29 3b 0a 20 20 20 20 20  rlen30(z);.     
27270 20 69 6e 74 20 62 4f 6b 20 3d 20 30 3b 0a 20 20   int bOk = 0;.  
27280 20 20 20 20 77 68 69 6c 65 28 20 6e 3e 30 20 26      while( n>0 &
27290 26 20 7a 5b 6e 2d 31 5d 3d 3d 27 2f 27 20 29 20  & z[n-1]=='/' ) 
272a0 6e 2d 2d 3b 0a 20 20 20 20 20 20 7a 5b 6e 5d 20  n--;.      z[n] 
272b0 3d 20 27 5c 30 27 3b 0a 20 20 20 20 20 20 73 71  = '\0';.      sq
272c0 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 28  lite3_bind_text(
272d0 70 54 65 73 74 2c 20 6a 2c 20 7a 2c 20 2d 31 2c  pTest, j, z, -1,
272e0 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b   SQLITE_STATIC);
272f0 0a 20 20 20 20 20 20 69 66 28 20 53 51 4c 49 54  .      if( SQLIT
27300 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73  E_ROW==sqlite3_s
27310 74 65 70 28 70 54 65 73 74 29 20 29 7b 0a 20 20  tep(pTest) ){.  
27320 20 20 20 20 20 20 62 4f 6b 20 3d 20 31 3b 0a 20        bOk = 1;. 
27330 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 68 65       }.      she
27340 6c 6c 52 65 73 65 74 28 26 72 63 2c 20 70 54 65  llReset(&rc, pTe
27350 73 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  st);.      if( r
27360 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
27370 62 4f 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  bOk==0 ){.      
27380 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74    utf8_printf(st
27390 64 65 72 72 2c 20 22 6e 6f 74 20 66 6f 75 6e 64  derr, "not found
273a0 20 69 6e 20 61 72 63 68 69 76 65 3a 20 25 73 5c   in archive: %s\
273b0 6e 22 2c 20 7a 29 3b 0a 20 20 20 20 20 20 20 20  n", z);.        
273c0 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
273d0 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  R;.      }.    }
273e0 0a 20 20 20 20 73 68 65 6c 6c 46 69 6e 61 6c 69  .    shellFinali
273f0 7a 65 28 26 72 63 2c 20 70 54 65 73 74 29 3b 0a  ze(&rc, pTest);.
27400 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
27410 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 6d 61 74  .}../*.** Format
27420 20 61 20 57 48 45 52 45 20 63 6c 61 75 73 65 20   a WHERE clause 
27430 74 68 61 74 20 63 61 6e 20 62 65 20 75 73 65 64  that can be used
27440 20 61 67 61 69 6e 73 74 20 74 68 65 20 22 73 71   against the "sq
27450 6c 61 72 22 20 74 61 62 6c 65 20 74 6f 0a 2a 2a  lar" table to.**
27460 20 69 64 65 6e 74 69 66 79 20 61 6c 6c 20 61 72   identify all ar
27470 63 68 69 76 65 20 6d 65 6d 62 65 72 73 20 74 68  chive members th
27480 61 74 20 6d 61 74 63 68 20 74 68 65 20 63 6f 6d  at match the com
27490 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 68  mand arguments h
274a0 65 6c 64 0a 2a 2a 20 69 6e 20 28 2a 70 41 72 29  eld.** in (*pAr)
274b0 2e 20 4c 65 61 76 65 20 74 68 69 73 20 57 48 45  . Leave this WHE
274c0 52 45 20 63 6c 61 75 73 65 20 69 6e 20 28 2a 70  RE clause in (*p
274d0 7a 57 68 65 72 65 29 20 62 65 66 6f 72 65 20 72  zWhere) before r
274e0 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 20 54 68 65  eturning..** The
274f0 20 63 61 6c 6c 65 72 20 69 73 20 72 65 73 70 6f   caller is respo
27500 6e 73 69 62 6c 65 20 66 6f 72 20 65 76 65 6e 74  nsible for event
27510 75 61 6c 6c 79 20 63 61 6c 6c 69 6e 67 20 73 71  ually calling sq
27520 6c 69 74 65 33 5f 66 72 65 65 28 29 20 6f 6e 0a  lite3_free() on.
27530 2a 2a 20 61 6e 79 20 6e 6f 6e 2d 4e 55 4c 4c 20  ** any non-NULL 
27540 28 2a 70 7a 57 68 65 72 65 29 20 76 61 6c 75 65  (*pzWhere) value
27550 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
27560 20 61 72 57 68 65 72 65 43 6c 61 75 73 65 28 0a   arWhereClause(.
27570 20 20 69 6e 74 20 2a 70 52 63 2c 20 0a 20 20 41    int *pRc, .  A
27580 72 43 6f 6d 6d 61 6e 64 20 2a 70 41 72 2c 20 0a  rCommand *pAr, .
27590 20 20 63 68 61 72 20 2a 2a 70 7a 57 68 65 72 65    char **pzWhere
275a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
275b0 20 20 2f 2a 20 4f 55 54 3a 20 4e 65 77 20 57 48    /* OUT: New WH
275c0 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 29 7b  ERE clause */.){
275d0 0a 20 20 63 68 61 72 20 2a 7a 57 68 65 72 65 20  .  char *zWhere 
275e0 3d 20 30 3b 0a 20 20 69 66 28 20 2a 70 52 63 3d  = 0;.  if( *pRc=
275f0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
27600 20 20 69 66 28 20 70 41 72 2d 3e 6e 41 72 67 3d    if( pAr->nArg=
27610 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 57 68 65  =0 ){.      zWhe
27620 72 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  re = sqlite3_mpr
27630 69 6e 74 66 28 22 31 22 29 3b 0a 20 20 20 20 7d  intf("1");.    }
27640 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20  else{.      int 
27650 69 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  i;.      const c
27660 68 61 72 20 2a 7a 53 65 70 20 3d 20 22 22 3b 0a  har *zSep = "";.
27670 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
27680 3c 70 41 72 2d 3e 6e 41 72 67 3b 20 69 2b 2b 29  <pAr->nArg; i++)
27690 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20  {.        const 
276a0 63 68 61 72 20 2a 7a 20 3d 20 70 41 72 2d 3e 61  char *z = pAr->a
276b0 7a 41 72 67 5b 69 5d 3b 0a 20 20 20 20 20 20 20  zArg[i];.       
276c0 20 7a 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65   zWhere = sqlite
276d0 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20 20 20  3_mprintf(.     
276e0 20 20 20 20 20 22 25 7a 25 73 20 6e 61 6d 65 20       "%z%s name 
276f0 3d 20 27 25 71 27 20 4f 52 20 73 75 62 73 74 72  = '%q' OR substr
27700 28 6e 61 6d 65 2c 31 2c 25 64 29 20 3d 20 27 25  (name,1,%d) = '%
27710 71 2f 27 22 2c 20 0a 20 20 20 20 20 20 20 20 20  q/'", .         
27720 20 7a 57 68 65 72 65 2c 20 7a 53 65 70 2c 20 7a   zWhere, zSep, z
27730 2c 20 73 74 72 6c 65 6e 33 30 28 7a 29 2b 31 2c  , strlen30(z)+1,
27740 20 7a 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20   z.        );.  
27750 20 20 20 20 20 20 69 66 28 20 7a 57 68 65 72 65        if( zWhere
27760 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
27770 20 2a 70 52 63 20 3d 20 53 51 4c 49 54 45 5f 4e   *pRc = SQLITE_N
27780 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 20 20  OMEM;.          
27790 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
277a0 0a 20 20 20 20 20 20 20 20 7a 53 65 70 20 3d 20  .        zSep = 
277b0 22 20 4f 52 20 22 3b 0a 20 20 20 20 20 20 7d 0a  " OR ";.      }.
277c0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 7a 57      }.  }.  *pzW
277d0 68 65 72 65 20 3d 20 7a 57 68 65 72 65 3b 0a 7d  here = zWhere;.}
277e0 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e  ../*.** Implemen
277f0 74 61 74 69 6f 6e 20 6f 66 20 2e 61 72 20 22 6c  tation of .ar "l
27800 69 73 54 22 20 63 6f 6d 6d 61 6e 64 2e 20 0a 2a  isT" command. .*
27810 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 72 4c  /.static int arL
27820 69 73 74 43 6f 6d 6d 61 6e 64 28 41 72 43 6f 6d  istCommand(ArCom
27830 6d 61 6e 64 20 2a 70 41 72 29 7b 0a 20 20 63 6f  mand *pAr){.  co
27840 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 20 3d  nst char *zSql =
27850 20 22 53 45 4c 45 43 54 20 25 73 20 46 52 4f 4d   "SELECT %s FROM
27860 20 25 73 20 57 48 45 52 45 20 25 73 22 3b 20 0a   %s WHERE %s"; .
27870 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a    const char *az
27880 43 6f 6c 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 22  Cols[] = {.    "
27890 6e 61 6d 65 22 2c 0a 20 20 20 20 22 6c 73 6d 6f  name",.    "lsmo
278a0 64 65 28 6d 6f 64 65 29 2c 20 73 7a 2c 20 64 61  de(mode), sz, da
278b0 74 65 74 69 6d 65 28 6d 74 69 6d 65 2c 20 27 75  tetime(mtime, 'u
278c0 6e 69 78 65 70 6f 63 68 27 29 2c 20 6e 61 6d 65  nixepoch'), name
278d0 22 0a 20 20 7d 3b 0a 0a 20 20 63 68 61 72 20 2a  ".  };..  char *
278e0 7a 57 68 65 72 65 20 3d 20 30 3b 0a 20 20 73 71  zWhere = 0;.  sq
278f0 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 71 6c  lite3_stmt *pSql
27900 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a   = 0;.  int rc;.
27910 0a 20 20 72 63 20 3d 20 61 72 43 68 65 63 6b 45  .  rc = arCheckE
27920 6e 74 72 69 65 73 28 70 41 72 29 3b 0a 20 20 61  ntries(pAr);.  a
27930 72 57 68 65 72 65 43 6c 61 75 73 65 28 26 72 63  rWhereClause(&rc
27940 2c 20 70 41 72 2c 20 26 7a 57 68 65 72 65 29 3b  , pAr, &zWhere);
27950 0a 0a 20 20 73 68 65 6c 6c 50 72 65 70 61 72 65  ..  shellPrepare
27960 50 72 69 6e 74 66 28 70 41 72 2d 3e 64 62 2c 20  Printf(pAr->db, 
27970 26 72 63 2c 20 26 70 53 71 6c 2c 20 7a 53 71 6c  &rc, &pSql, zSql
27980 2c 20 61 7a 43 6f 6c 73 5b 70 41 72 2d 3e 62 56  , azCols[pAr->bV
27990 65 72 62 6f 73 65 5d 2c 0a 20 20 20 20 20 20 20  erbose],.       
279a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 41                pA
279b0 72 2d 3e 7a 53 72 63 54 61 62 6c 65 2c 20 7a 57  r->zSrcTable, zW
279c0 68 65 72 65 29 3b 0a 20 20 69 66 28 20 70 41 72  here);.  if( pAr
279d0 2d 3e 62 44 72 79 52 75 6e 20 29 7b 0a 20 20 20  ->bDryRun ){.   
279e0 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 41 72   utf8_printf(pAr
279f0 2d 3e 70 2d 3e 6f 75 74 2c 20 22 25 73 5c 6e 22  ->p->out, "%s\n"
27a00 2c 20 73 71 6c 69 74 65 33 5f 73 71 6c 28 70 53  , sqlite3_sql(pS
27a10 71 6c 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ql));.  }else{. 
27a20 20 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51     while( rc==SQ
27a30 4c 49 54 45 5f 4f 4b 20 26 26 20 53 51 4c 49 54  LITE_OK && SQLIT
27a40 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73  E_ROW==sqlite3_s
27a50 74 65 70 28 70 53 71 6c 29 20 29 7b 0a 20 20 20  tep(pSql) ){.   
27a60 20 20 20 69 66 28 20 70 41 72 2d 3e 62 56 65 72     if( pAr->bVer
27a70 62 6f 73 65 20 29 7b 0a 20 20 20 20 20 20 20 20  bose ){.        
27a80 75 74 66 38 5f 70 72 69 6e 74 66 28 70 41 72 2d  utf8_printf(pAr-
27a90 3e 70 2d 3e 6f 75 74 2c 20 22 25 73 20 25 20 31  >p->out, "%s % 1
27aa0 30 64 20 20 25 73 20 20 25 73 5c 6e 22 2c 0a 20  0d  %s  %s\n",. 
27ab0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
27ac0 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70  e3_column_text(p
27ad0 53 71 6c 2c 20 30 29 2c 0a 20 20 20 20 20 20 20  Sql, 0),.       
27ae0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6f 6c       sqlite3_col
27af0 75 6d 6e 5f 69 6e 74 28 70 53 71 6c 2c 20 31 29  umn_int(pSql, 1)
27b00 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  , .            s
27b10 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
27b20 78 74 28 70 53 71 6c 2c 20 32 29 2c 0a 20 20 20  xt(pSql, 2),.   
27b30 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
27b40 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 71  _column_text(pSq
27b50 6c 2c 20 33 29 0a 20 20 20 20 20 20 20 20 29 3b  l, 3).        );
27b60 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
27b70 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
27b80 66 28 70 41 72 2d 3e 70 2d 3e 6f 75 74 2c 20 22  f(pAr->p->out, "
27b90 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f 63  %s\n", sqlite3_c
27ba0 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 71 6c 2c  olumn_text(pSql,
27bb0 20 30 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20   0));.      }.  
27bc0 20 20 7d 0a 20 20 7d 0a 20 20 73 68 65 6c 6c 46    }.  }.  shellF
27bd0 69 6e 61 6c 69 7a 65 28 26 72 63 2c 20 70 53 71  inalize(&rc, pSq
27be0 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  l);.  sqlite3_fr
27bf0 65 65 28 7a 57 68 65 72 65 29 3b 0a 20 20 72 65  ee(zWhere);.  re
27c00 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a  turn rc;.}.../*.
27c10 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ** Implementatio
27c20 6e 20 6f 66 20 2e 61 72 20 22 65 58 74 72 61 63  n of .ar "eXtrac
27c30 74 22 20 63 6f 6d 6d 61 6e 64 2e 20 0a 2a 2f 0a  t" command. .*/.
27c40 73 74 61 74 69 63 20 69 6e 74 20 61 72 45 78 74  static int arExt
27c50 72 61 63 74 43 6f 6d 6d 61 6e 64 28 41 72 43 6f  ractCommand(ArCo
27c60 6d 6d 61 6e 64 20 2a 70 41 72 29 7b 0a 20 20 63  mmand *pAr){.  c
27c70 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 31  onst char *zSql1
27c80 20 3d 20 0a 20 20 20 20 22 53 45 4c 45 43 54 20   = .    "SELECT 
27c90 22 0a 20 20 20 20 22 20 28 24 64 69 72 20 7c 7c  ".    " ($dir ||
27ca0 20 6e 61 6d 65 29 2c 22 0a 20 20 20 20 22 20 77   name),".    " w
27cb0 72 69 74 65 66 69 6c 65 28 28 24 64 69 72 20 7c  ritefile(($dir |
27cc0 7c 20 6e 61 6d 65 29 2c 20 25 73 2c 20 6d 6f 64  | name), %s, mod
27cd0 65 2c 20 6d 74 69 6d 65 29 20 22 0a 20 20 20 20  e, mtime) ".    
27ce0 22 46 52 4f 4d 20 25 73 20 57 48 45 52 45 20 28  "FROM %s WHERE (
27cf0 25 73 29 20 41 4e 44 20 28 64 61 74 61 20 49 53  %s) AND (data IS
27d00 20 4e 55 4c 4c 20 4f 52 20 24 64 69 72 4f 6e 6c   NULL OR $dirOnl
27d10 79 20 3d 20 30 29 22 0a 20 20 20 20 22 20 41 4e  y = 0)".    " AN
27d20 44 20 6e 61 6d 65 20 4e 4f 54 20 47 4c 4f 42 20  D name NOT GLOB 
27d30 27 2a 2e 2e 5b 2f 5c 5c 5d 2a 27 22 3b 0a 0a 20  '*..[/\\]*'";.. 
27d40 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 45   const char *azE
27d50 78 74 72 61 41 72 67 5b 5d 20 3d 20 7b 20 0a 20  xtraArg[] = { . 
27d60 20 20 20 22 73 71 6c 61 72 5f 75 6e 63 6f 6d 70     "sqlar_uncomp
27d70 72 65 73 73 28 64 61 74 61 2c 20 73 7a 29 22 2c  ress(data, sz)",
27d80 0a 20 20 20 20 22 64 61 74 61 22 0a 20 20 7d 3b  .    "data".  };
27d90 0a 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  ..  sqlite3_stmt
27da0 20 2a 70 53 71 6c 20 3d 20 30 3b 0a 20 20 69 6e   *pSql = 0;.  in
27db0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
27dc0 3b 0a 20 20 63 68 61 72 20 2a 7a 44 69 72 20 3d  ;.  char *zDir =
27dd0 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a 57 68 65   0;.  char *zWhe
27de0 72 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 2c  re = 0;.  int i,
27df0 20 6a 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 72 67   j;..  /* If arg
27e00 75 6d 65 6e 74 73 20 61 72 65 20 73 70 65 63 69  uments are speci
27e10 66 69 65 64 2c 20 63 68 65 63 6b 20 74 68 61 74  fied, check that
27e20 20 74 68 65 79 20 61 63 74 75 61 6c 6c 79 20 65   they actually e
27e30 78 69 73 74 20 77 69 74 68 69 6e 0a 20 20 2a 2a  xist within.  **
27e40 20 74 68 65 20 61 72 63 68 69 76 65 20 62 65 66   the archive bef
27e50 6f 72 65 20 70 72 6f 63 65 65 64 69 6e 67 2e 20  ore proceeding. 
27e60 41 6e 64 20 66 6f 72 6d 75 6c 61 74 65 20 61 20  And formulate a 
27e70 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 6f 0a  WHERE clause to.
27e80 20 20 2a 2a 20 6d 61 74 63 68 20 74 68 65 6d 2e    ** match them.
27e90 20 20 2a 2f 0a 20 20 72 63 20 3d 20 61 72 43 68    */.  rc = arCh
27ea0 65 63 6b 45 6e 74 72 69 65 73 28 70 41 72 29 3b  eckEntries(pAr);
27eb0 0a 20 20 61 72 57 68 65 72 65 43 6c 61 75 73 65  .  arWhereClause
27ec0 28 26 72 63 2c 20 70 41 72 2c 20 26 7a 57 68 65  (&rc, pAr, &zWhe
27ed0 72 65 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d  re);..  if( rc==
27ee0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
27ef0 20 69 66 28 20 70 41 72 2d 3e 7a 44 69 72 20 29   if( pAr->zDir )
27f00 7b 0a 20 20 20 20 20 20 7a 44 69 72 20 3d 20 73  {.      zDir = s
27f10 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
27f20 25 73 2f 22 2c 20 70 41 72 2d 3e 7a 44 69 72 29  %s/", pAr->zDir)
27f30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
27f40 20 20 20 7a 44 69 72 20 3d 20 73 71 6c 69 74 65     zDir = sqlite
27f50 33 5f 6d 70 72 69 6e 74 66 28 22 22 29 3b 0a 20  3_mprintf("");. 
27f60 20 20 20 7d 0a 20 20 20 20 69 66 28 20 7a 44 69     }.    if( zDi
27f70 72 3d 3d 30 20 29 20 72 63 20 3d 20 53 51 4c 49  r==0 ) rc = SQLI
27f80 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20  TE_NOMEM;.  }.. 
27f90 20 73 68 65 6c 6c 50 72 65 70 61 72 65 50 72 69   shellPreparePri
27fa0 6e 74 66 28 70 41 72 2d 3e 64 62 2c 20 26 72 63  ntf(pAr->db, &rc
27fb0 2c 20 26 70 53 71 6c 2c 20 7a 53 71 6c 31 2c 20  , &pSql, zSql1, 
27fc0 0a 20 20 20 20 20 20 61 7a 45 78 74 72 61 41 72  .      azExtraAr
27fd0 67 5b 70 41 72 2d 3e 62 5a 69 70 5d 2c 20 70 41  g[pAr->bZip], pA
27fe0 72 2d 3e 7a 53 72 63 54 61 62 6c 65 2c 20 7a 57  r->zSrcTable, zW
27ff0 68 65 72 65 0a 20 20 29 3b 0a 0a 20 20 69 66 28  here.  );..  if(
28000 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
28010 7b 0a 20 20 20 20 6a 20 3d 20 73 71 6c 69 74 65  {.    j = sqlite
28020 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72  3_bind_parameter
28030 5f 69 6e 64 65 78 28 70 53 71 6c 2c 20 22 24 64  _index(pSql, "$d
28040 69 72 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ir");.    sqlite
28050 33 5f 62 69 6e 64 5f 74 65 78 74 28 70 53 71 6c  3_bind_text(pSql
28060 2c 20 6a 2c 20 7a 44 69 72 2c 20 2d 31 2c 20 53  , j, zDir, -1, S
28070 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 0a  QLITE_STATIC);..
28080 20 20 20 20 2f 2a 20 52 75 6e 20 74 68 65 20 53      /* Run the S
28090 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
280a0 74 77 69 63 65 2e 20 54 68 65 20 66 69 72 73 74  twice. The first
280b0 20 74 69 6d 65 2c 20 77 72 69 74 65 66 69 6c 65   time, writefile
280c0 28 29 20 69 73 20 63 61 6c 6c 65 64 0a 20 20 20  () is called.   
280d0 20 2a 2a 20 66 6f 72 20 61 6c 6c 20 61 72 63 68   ** for all arch
280e0 69 76 65 20 6d 65 6d 62 65 72 73 20 74 68 61 74  ive members that
280f0 20 73 68 6f 75 6c 64 20 62 65 20 65 78 74 72 61   should be extra
28100 63 74 65 64 2e 20 54 68 65 20 73 65 63 6f 6e 64  cted. The second
28110 20 74 69 6d 65 2c 0a 20 20 20 20 2a 2a 20 6f 6e   time,.    ** on
28120 6c 79 20 66 6f 72 20 74 68 65 20 64 69 72 65 63  ly for the direc
28130 74 6f 72 69 65 73 2e 20 54 68 69 73 20 69 73 20  tories. This is 
28140 62 65 63 61 75 73 65 20 74 68 65 20 74 69 6d 65  because the time
28150 73 74 61 6d 70 73 20 66 6f 72 0a 20 20 20 20 2a  stamps for.    *
28160 2a 20 65 78 74 72 61 63 74 65 64 20 64 69 72 65  * extracted dire
28170 63 74 6f 72 69 65 73 20 6d 75 73 74 20 62 65 20  ctories must be 
28180 72 65 73 65 74 20 61 66 74 65 72 20 74 68 65 79  reset after they
28190 20 61 72 65 20 70 6f 70 75 6c 61 74 65 64 20 28   are populated (
281a0 61 73 0a 20 20 20 20 2a 2a 20 70 6f 70 75 6c 61  as.    ** popula
281b0 74 69 6e 67 20 74 68 65 6d 20 63 68 61 6e 67 65  ting them change
281c0 73 20 74 68 65 20 74 69 6d 65 73 74 61 6d 70 29  s the timestamp)
281d0 2e 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d  .  */.    for(i=
281e0 30 3b 20 69 3c 32 3b 20 69 2b 2b 29 7b 0a 20 20  0; i<2; i++){.  
281f0 20 20 20 20 6a 20 3d 20 73 71 6c 69 74 65 33 5f      j = sqlite3_
28200 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 69  bind_parameter_i
28210 6e 64 65 78 28 70 53 71 6c 2c 20 22 24 64 69 72  ndex(pSql, "$dir
28220 4f 6e 6c 79 22 29 3b 0a 20 20 20 20 20 20 73 71  Only");.      sq
28230 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70  lite3_bind_int(p
28240 53 71 6c 2c 20 6a 2c 20 69 29 3b 0a 20 20 20 20  Sql, j, i);.    
28250 20 20 69 66 28 20 70 41 72 2d 3e 62 44 72 79 52    if( pAr->bDryR
28260 75 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74  un ){.        ut
28270 66 38 5f 70 72 69 6e 74 66 28 70 41 72 2d 3e 70  f8_printf(pAr->p
28280 2d 3e 6f 75 74 2c 20 22 25 73 5c 6e 22 2c 20 73  ->out, "%s\n", s
28290 71 6c 69 74 65 33 5f 73 71 6c 28 70 53 71 6c 29  qlite3_sql(pSql)
282a0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
282b0 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 72          while( r
282c0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
282d0 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69  SQLITE_ROW==sqli
282e0 74 65 33 5f 73 74 65 70 28 70 53 71 6c 29 20 29  te3_step(pSql) )
282f0 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
28300 69 3d 3d 30 20 26 26 20 70 41 72 2d 3e 62 56 65  i==0 && pAr->bVe
28310 72 62 6f 73 65 20 29 7b 0a 20 20 20 20 20 20 20  rbose ){.       
28320 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
28330 28 70 41 72 2d 3e 70 2d 3e 6f 75 74 2c 20 22 25  (pAr->p->out, "%
28340 73 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f 63 6f  s\n", sqlite3_co
28350 6c 75 6d 6e 5f 74 65 78 74 28 70 53 71 6c 2c 20  lumn_text(pSql, 
28360 30 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  0));.          }
28370 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
28380 20 7d 0a 20 20 20 20 20 20 73 68 65 6c 6c 52 65   }.      shellRe
28390 73 65 74 28 26 72 63 2c 20 70 53 71 6c 29 3b 0a  set(&rc, pSql);.
283a0 20 20 20 20 7d 0a 20 20 20 20 73 68 65 6c 6c 46      }.    shellF
283b0 69 6e 61 6c 69 7a 65 28 26 72 63 2c 20 70 53 71  inalize(&rc, pSq
283c0 6c 29 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74  l);.  }..  sqlit
283d0 65 33 5f 66 72 65 65 28 7a 44 69 72 29 3b 0a 20  e3_free(zDir);. 
283e0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 57   sqlite3_free(zW
283f0 68 65 72 65 29 3b 0a 20 20 72 65 74 75 72 6e 20  here);.  return 
28400 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 75 6e  rc;.}../*.** Run
28410 20 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65   the SQL stateme
28420 6e 74 20 69 6e 20 7a 53 71 6c 2e 20 20 4f 72 20  nt in zSql.  Or 
28430 69 66 20 64 6f 69 6e 67 20 61 20 2d 2d 64 72 79  if doing a --dry
28440 72 75 6e 2c 20 6d 65 72 65 6c 79 20 70 72 69 6e  run, merely prin
28450 74 20 69 74 20 6f 75 74 2e 0a 2a 2f 0a 73 74 61  t it out..*/.sta
28460 74 69 63 20 69 6e 74 20 61 72 45 78 65 63 53 71  tic int arExecSq
28470 6c 28 41 72 43 6f 6d 6d 61 6e 64 20 2a 70 41 72  l(ArCommand *pAr
28480 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53  , const char *zS
28490 71 6c 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  ql){.  int rc;. 
284a0 20 69 66 28 20 70 41 72 2d 3e 62 44 72 79 52 75   if( pAr->bDryRu
284b0 6e 20 29 7b 0a 20 20 20 20 75 74 66 38 5f 70 72  n ){.    utf8_pr
284c0 69 6e 74 66 28 70 41 72 2d 3e 70 2d 3e 6f 75 74  intf(pAr->p->out
284d0 2c 20 22 25 73 5c 6e 22 2c 20 7a 53 71 6c 29 3b  , "%s\n", zSql);
284e0 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
284f0 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  _OK;.  }else{.  
28500 20 20 63 68 61 72 20 2a 7a 45 72 72 20 3d 20 30    char *zErr = 0
28510 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
28520 65 33 5f 65 78 65 63 28 70 41 72 2d 3e 64 62 2c  e3_exec(pAr->db,
28530 20 7a 53 71 6c 2c 20 30 2c 20 30 2c 20 26 7a 45   zSql, 0, 0, &zE
28540 72 72 29 3b 0a 20 20 20 20 69 66 28 20 7a 45 72  rr);.    if( zEr
28550 72 20 29 7b 0a 20 20 20 20 20 20 75 74 66 38 5f  r ){.      utf8_
28560 70 72 69 6e 74 66 28 73 74 64 6f 75 74 2c 20 22  printf(stdout, "
28570 45 52 52 4f 52 3a 20 25 73 5c 6e 22 2c 20 7a 45  ERROR: %s\n", zE
28580 72 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  rr);.      sqlit
28590 65 33 5f 66 72 65 65 28 7a 45 72 72 29 3b 0a 20  e3_free(zErr);. 
285a0 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
285b0 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  n rc;.}.../*.** 
285c0 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  Implementation o
285d0 66 20 2e 61 72 20 22 63 72 65 61 74 65 22 20 61  f .ar "create" a
285e0 6e 64 20 22 75 70 64 61 74 65 22 20 63 6f 6d 6d  nd "update" comm
285f0 61 6e 64 73 2e 0a 2a 2a 0a 2a 2a 20 43 72 65 61  ands..**.** Crea
28600 74 65 20 74 68 65 20 22 73 71 6c 61 72 22 20 74  te the "sqlar" t
28610 61 62 6c 65 20 69 6e 20 74 68 65 20 64 61 74 61  able in the data
28620 62 61 73 65 20 69 66 20 69 74 20 64 6f 65 73 20  base if it does 
28630 6e 6f 74 20 61 6c 72 65 61 64 79 20 65 78 69 73  not already exis
28640 74 2e 0a 2a 2a 20 54 68 65 6e 20 61 64 64 20 65  t..** Then add e
28650 61 63 68 20 66 69 6c 65 20 69 6e 20 74 68 65 20  ach file in the 
28660 61 7a 46 69 6c 65 5b 5d 20 61 72 72 61 79 20 74  azFile[] array t
28670 6f 20 74 68 65 20 61 72 63 68 69 76 65 2e 20 44  o the archive. D
28680 69 72 65 63 74 6f 72 69 65 73 0a 2a 2a 20 61 72  irectories.** ar
28690 65 20 61 64 64 65 64 20 72 65 63 75 72 73 69 76  e added recursiv
286a0 65 6c 79 2e 20 49 66 20 61 72 67 75 6d 65 6e 74  ely. If argument
286b0 20 62 56 65 72 62 6f 73 65 20 69 73 20 6e 6f 6e   bVerbose is non
286c0 2d 7a 65 72 6f 2c 20 61 20 6d 65 73 73 61 67 65  -zero, a message
286d0 20 69 73 0a 2a 2a 20 70 72 69 6e 74 65 64 20 6f   is.** printed o
286e0 6e 20 73 74 64 6f 75 74 20 66 6f 72 20 65 61 63  n stdout for eac
286f0 68 20 66 69 6c 65 20 61 72 63 68 69 76 65 64 2e  h file archived.
28700 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 72 65 61 74  .**.** The creat
28710 65 20 63 6f 6d 6d 61 6e 64 20 69 73 20 74 68 65  e command is the
28720 20 73 61 6d 65 20 61 73 20 75 70 64 61 74 65 2c   same as update,
28730 20 65 78 63 65 70 74 20 74 68 61 74 20 69 74 20   except that it 
28740 64 72 6f 70 73 0a 2a 2a 20 61 6e 79 20 65 78 69  drops.** any exi
28750 73 74 69 6e 67 20 22 73 71 6c 61 72 22 20 74 61  sting "sqlar" ta
28760 62 6c 65 20 62 65 66 6f 72 65 20 62 65 67 69 6e  ble before begin
28770 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ning..*/.static 
28780 69 6e 74 20 61 72 43 72 65 61 74 65 4f 72 55 70  int arCreateOrUp
28790 64 61 74 65 43 6f 6d 6d 61 6e 64 28 0a 20 20 41  dateCommand(.  A
287a0 72 43 6f 6d 6d 61 6e 64 20 2a 70 41 72 2c 20 20  rCommand *pAr,  
287b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
287c0 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65  * Command argume
287d0 6e 74 73 20 61 6e 64 20 6f 70 74 69 6f 6e 73 20  nts and options 
287e0 2a 2f 0a 20 20 69 6e 74 20 62 55 70 64 61 74 65  */.  int bUpdate
287f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28800 20 20 20 20 20 2f 2a 20 74 72 75 65 20 66 6f 72       /* true for
28810 20 61 20 2d 2d 63 72 65 61 74 65 2e 20 20 66 61   a --create.  fa
28820 6c 73 65 20 66 6f 72 20 2d 2d 75 70 64 61 74 65  lse for --update
28830 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63   */.){.  const c
28840 68 61 72 20 2a 7a 43 72 65 61 74 65 20 3d 20 0a  har *zCreate = .
28850 20 20 20 20 20 20 22 43 52 45 41 54 45 20 54 41        "CREATE TA
28860 42 4c 45 20 49 46 20 4e 4f 54 20 45 58 49 53 54  BLE IF NOT EXIST
28870 53 20 73 71 6c 61 72 28 5c 6e 22 0a 20 20 20 20  S sqlar(\n".    
28880 20 20 22 20 20 6e 61 6d 65 20 54 45 58 54 20 50    "  name TEXT P
28890 52 49 4d 41 52 59 20 4b 45 59 2c 20 20 2d 2d 20  RIMARY KEY,  -- 
288a0 6e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65  name of the file
288b0 5c 6e 22 0a 20 20 20 20 20 20 22 20 20 6d 6f 64  \n".      "  mod
288c0 65 20 49 4e 54 2c 20 20 20 20 20 20 20 20 20 20  e INT,          
288d0 20 20 20 20 20 2d 2d 20 61 63 63 65 73 73 20 70       -- access p
288e0 65 72 6d 69 73 73 69 6f 6e 73 5c 6e 22 0a 20 20  ermissions\n".  
288f0 20 20 20 20 22 20 20 6d 74 69 6d 65 20 49 4e 54      "  mtime INT
28900 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2d  ,              -
28910 2d 20 6c 61 73 74 20 6d 6f 64 69 66 69 63 61 74  - last modificat
28920 69 6f 6e 20 74 69 6d 65 5c 6e 22 0a 20 20 20 20  ion time\n".    
28930 20 20 22 20 20 73 7a 20 49 4e 54 2c 20 20 20 20    "  sz INT,    
28940 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20               -- 
28950 6f 72 69 67 69 6e 61 6c 20 66 69 6c 65 20 73 69  original file si
28960 7a 65 5c 6e 22 0a 20 20 20 20 20 20 22 20 20 64  ze\n".      "  d
28970 61 74 61 20 42 4c 4f 42 20 20 20 20 20 20 20 20  ata BLOB        
28980 20 20 20 20 20 20 20 2d 2d 20 63 6f 6d 70 72 65         -- compre
28990 73 73 65 64 20 63 6f 6e 74 65 6e 74 5c 6e 22 0a  ssed content\n".
289a0 20 20 20 20 20 20 22 29 22 3b 0a 20 20 63 6f 6e        ")";.  con
289b0 73 74 20 63 68 61 72 20 2a 7a 44 72 6f 70 20 3d  st char *zDrop =
289c0 20 22 44 52 4f 50 20 54 41 42 4c 45 20 49 46 20   "DROP TABLE IF 
289d0 45 58 49 53 54 53 20 73 71 6c 61 72 22 3b 0a 20  EXISTS sqlar";. 
289e0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 6e   const char *zIn
289f0 73 65 72 74 46 6d 74 5b 32 5d 20 3d 20 7b 0a 20  sertFmt[2] = {. 
28a00 20 20 20 20 22 52 45 50 4c 41 43 45 20 49 4e 54      "REPLACE INT
28a10 4f 20 25 73 28 6e 61 6d 65 2c 6d 6f 64 65 2c 6d  O %s(name,mode,m
28a20 74 69 6d 65 2c 73 7a 2c 64 61 74 61 29 5c 6e 22  time,sz,data)\n"
28a30 0a 20 20 20 20 20 22 20 20 53 45 4c 45 43 54 5c  .     "  SELECT\
28a40 6e 22 0a 20 20 20 20 20 22 20 20 20 20 25 73 2c  n".     "    %s,
28a50 5c 6e 22 0a 20 20 20 20 20 22 20 20 20 20 6d 6f  \n".     "    mo
28a60 64 65 2c 5c 6e 22 0a 20 20 20 20 20 22 20 20 20  de,\n".     "   
28a70 20 6d 74 69 6d 65 2c 5c 6e 22 0a 20 20 20 20 20   mtime,\n".     
28a80 22 20 20 20 20 43 41 53 45 20 73 75 62 73 74 72  "    CASE substr
28a90 28 6c 73 6d 6f 64 65 28 6d 6f 64 65 29 2c 31 2c  (lsmode(mode),1,
28aa0 31 29 5c 6e 22 0a 20 20 20 20 20 22 20 20 20 20  1)\n".     "    
28ab0 20 20 57 48 45 4e 20 27 2d 27 20 54 48 45 4e 20    WHEN '-' THEN 
28ac0 6c 65 6e 67 74 68 28 64 61 74 61 29 5c 6e 22 0a  length(data)\n".
28ad0 20 20 20 20 20 22 20 20 20 20 20 20 57 48 45 4e       "      WHEN
28ae0 20 27 64 27 20 54 48 45 4e 20 30 5c 6e 22 0a 20   'd' THEN 0\n". 
28af0 20 20 20 20 22 20 20 20 20 20 20 45 4c 53 45 20      "      ELSE 
28b00 2d 31 20 45 4e 44 2c 5c 6e 22 0a 20 20 20 20 20  -1 END,\n".     
28b10 22 20 20 20 20 73 71 6c 61 72 5f 63 6f 6d 70 72  "    sqlar_compr
28b20 65 73 73 28 64 61 74 61 29 5c 6e 22 0a 20 20 20  ess(data)\n".   
28b30 20 20 22 20 20 46 52 4f 4d 20 66 73 64 69 72 28    "  FROM fsdir(
28b40 25 51 2c 25 51 29 5c 6e 22 0a 20 20 20 20 20 22  %Q,%Q)\n".     "
28b50 20 20 57 48 45 52 45 20 6c 73 6d 6f 64 65 28 6d    WHERE lsmode(m
28b60 6f 64 65 29 20 4e 4f 54 20 4c 49 4b 45 20 27 3f  ode) NOT LIKE '?
28b70 25 25 27 3b 22 2c 0a 20 20 20 20 20 22 52 45 50  %%';",.     "REP
28b80 4c 41 43 45 20 49 4e 54 4f 20 25 73 28 6e 61 6d  LACE INTO %s(nam
28b90 65 2c 6d 6f 64 65 2c 6d 74 69 6d 65 2c 64 61 74  e,mode,mtime,dat
28ba0 61 29 5c 6e 22 0a 20 20 20 20 20 22 20 20 53 45  a)\n".     "  SE
28bb0 4c 45 43 54 5c 6e 22 0a 20 20 20 20 20 22 20 20  LECT\n".     "  
28bc0 20 20 25 73 2c 5c 6e 22 0a 20 20 20 20 20 22 20    %s,\n".     " 
28bd0 20 20 20 6d 6f 64 65 2c 5c 6e 22 0a 20 20 20 20     mode,\n".    
28be0 20 22 20 20 20 20 6d 74 69 6d 65 2c 5c 6e 22 0a   "    mtime,\n".
28bf0 20 20 20 20 20 22 20 20 20 20 64 61 74 61 5c 6e       "    data\n
28c00 22 0a 20 20 20 20 20 22 20 20 46 52 4f 4d 20 66  ".     "  FROM f
28c10 73 64 69 72 28 25 51 2c 25 51 29 5c 6e 22 0a 20  sdir(%Q,%Q)\n". 
28c20 20 20 20 20 22 20 20 57 48 45 52 45 20 6c 73 6d      "  WHERE lsm
28c30 6f 64 65 28 6d 6f 64 65 29 20 4e 4f 54 20 4c 49  ode(mode) NOT LI
28c40 4b 45 20 27 3f 25 25 27 3b 22 0a 20 20 7d 3b 0a  KE '?%%';".  };.
28c50 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
28c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28c70 20 20 2f 2a 20 46 6f 72 20 69 74 65 72 61 74 69    /* For iterati
28c80 6e 67 20 74 68 72 6f 75 67 68 20 61 7a 46 69 6c  ng through azFil
28c90 65 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  e[] */.  int rc;
28ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28cb0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
28cc0 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 63 6f 6e  rn code */.  con
28cd0 73 74 20 63 68 61 72 20 2a 7a 54 61 62 20 3d 20  st char *zTab = 
28ce0 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  0;           /* 
28cf0 53 51 4c 20 74 61 62 6c 65 20 69 6e 74 6f 20 77  SQL table into w
28d00 68 69 63 68 20 74 6f 20 69 6e 73 65 72 74 20 2a  hich to insert *
28d10 2f 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a  /.  char *zSql;.
28d20 20 20 63 68 61 72 20 7a 54 65 6d 70 5b 35 30 5d    char zTemp[50]
28d30 3b 0a 0a 20 20 61 72 45 78 65 63 53 71 6c 28 70  ;..  arExecSql(p
28d40 41 72 2c 20 22 50 52 41 47 4d 41 20 70 61 67 65  Ar, "PRAGMA page
28d50 5f 73 69 7a 65 3d 35 31 32 22 29 3b 0a 20 20 72  _size=512");.  r
28d60 63 20 3d 20 61 72 45 78 65 63 53 71 6c 28 70 41  c = arExecSql(pA
28d70 72 2c 20 22 53 41 56 45 50 4f 49 4e 54 20 61 72  r, "SAVEPOINT ar
28d80 3b 22 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  ;");.  if( rc!=S
28d90 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
28da0 6e 20 72 63 3b 0a 20 20 7a 54 65 6d 70 5b 30 5d  n rc;.  zTemp[0]
28db0 20 3d 20 30 3b 20 0a 20 20 69 66 28 20 70 41 72   = 0; .  if( pAr
28dc0 2d 3e 62 5a 69 70 20 29 7b 0a 20 20 20 20 2f 2a  ->bZip ){.    /*
28dd0 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
28de0 7a 69 70 66 69 6c 65 20 76 69 72 74 75 61 6c 20  zipfile virtual 
28df0 74 61 62 6c 65 2c 20 69 66 20 6e 65 63 65 73 73  table, if necess
28e00 61 72 79 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  ary */.    if( p
28e10 41 72 2d 3e 7a 46 69 6c 65 20 29 7b 0a 20 20 20  Ar->zFile ){.   
28e20 20 20 20 73 71 6c 69 74 65 33 5f 75 69 6e 74 36     sqlite3_uint6
28e30 34 20 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  4 r;.      sqlit
28e40 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69  e3_randomness(si
28e50 7a 65 6f 66 28 72 29 2c 26 72 29 3b 0a 20 20 20  zeof(r),&r);.   
28e60 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
28e70 6e 74 66 28 73 69 7a 65 6f 66 28 7a 54 65 6d 70  ntf(sizeof(zTemp
28e80 29 2c 7a 54 65 6d 70 2c 22 7a 69 70 25 30 31 36  ),zTemp,"zip%016
28e90 6c 6c 78 22 2c 72 29 3b 0a 20 20 20 20 20 20 7a  llx",r);.      z
28ea0 54 61 62 20 3d 20 7a 54 65 6d 70 3b 0a 20 20 20  Tab = zTemp;.   
28eb0 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65     zSql = sqlite
28ec0 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20 20 20  3_mprintf(.     
28ed0 20 20 20 20 22 43 52 45 41 54 45 20 56 49 52 54      "CREATE VIRT
28ee0 55 41 4c 20 54 41 42 4c 45 20 74 65 6d 70 2e 25  UAL TABLE temp.%
28ef0 73 20 55 53 49 4e 47 20 7a 69 70 66 69 6c 65 28  s USING zipfile(
28f00 25 51 29 22 2c 0a 20 20 20 20 20 20 20 20 20 7a  %Q)",.         z
28f10 54 61 62 2c 20 70 41 72 2d 3e 7a 46 69 6c 65 0a  Tab, pAr->zFile.
28f20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 72        );.      r
28f30 63 20 3d 20 61 72 45 78 65 63 53 71 6c 28 70 41  c = arExecSql(pA
28f40 72 2c 20 7a 53 71 6c 29 3b 0a 20 20 20 20 20 20  r, zSql);.      
28f50 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71  sqlite3_free(zSq
28f60 6c 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  l);.    }else{. 
28f70 20 20 20 20 20 7a 54 61 62 20 3d 20 22 7a 69 70       zTab = "zip
28f80 22 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  ";.    }.  }else
28f90 7b 0a 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c  {.    /* Initial
28fa0 69 7a 65 20 74 68 65 20 74 61 62 6c 65 20 66 6f  ize the table fo
28fb0 72 20 61 6e 20 53 51 4c 41 52 20 2a 2f 0a 20 20  r an SQLAR */.  
28fc0 20 20 7a 54 61 62 20 3d 20 22 73 71 6c 61 72 22    zTab = "sqlar"
28fd0 3b 0a 20 20 20 20 69 66 28 20 62 55 70 64 61 74  ;.    if( bUpdat
28fe0 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63  e==0 ){.      rc
28ff0 20 3d 20 61 72 45 78 65 63 53 71 6c 28 70 41 72   = arExecSql(pAr
29000 2c 20 7a 44 72 6f 70 29 3b 0a 20 20 20 20 20 20  , zDrop);.      
29010 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
29020 4b 20 29 20 67 6f 74 6f 20 65 6e 64 5f 61 72 5f  K ) goto end_ar_
29030 74 72 61 6e 73 61 63 74 69 6f 6e 3b 0a 20 20 20  transaction;.   
29040 20 7d 0a 20 20 20 20 72 63 20 3d 20 61 72 45 78   }.    rc = arEx
29050 65 63 53 71 6c 28 70 41 72 2c 20 7a 43 72 65 61  ecSql(pAr, zCrea
29060 74 65 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69  te);.  }.  for(i
29070 3d 30 3b 20 69 3c 70 41 72 2d 3e 6e 41 72 67 20  =0; i<pAr->nArg 
29080 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
29090 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 68 61 72  ; i++){.    char
290a0 20 2a 7a 53 71 6c 32 20 3d 20 73 71 6c 69 74 65   *zSql2 = sqlite
290b0 33 5f 6d 70 72 69 6e 74 66 28 7a 49 6e 73 65 72  3_mprintf(zInser
290c0 74 46 6d 74 5b 70 41 72 2d 3e 62 5a 69 70 5d 2c  tFmt[pAr->bZip],
290d0 20 7a 54 61 62 2c 0a 20 20 20 20 20 20 20 20 70   zTab,.        p
290e0 41 72 2d 3e 62 56 65 72 62 6f 73 65 20 3f 20 22  Ar->bVerbose ? "
290f0 73 68 65 6c 6c 5f 70 75 74 73 6e 6c 28 6e 61 6d  shell_putsnl(nam
29100 65 29 22 20 3a 20 22 6e 61 6d 65 22 2c 0a 20 20  e)" : "name",.  
29110 20 20 20 20 20 20 70 41 72 2d 3e 61 7a 41 72 67        pAr->azArg
29120 5b 69 5d 2c 20 70 41 72 2d 3e 7a 44 69 72 29 3b  [i], pAr->zDir);
29130 0a 20 20 20 20 72 63 20 3d 20 61 72 45 78 65 63  .    rc = arExec
29140 53 71 6c 28 70 41 72 2c 20 7a 53 71 6c 32 29 3b  Sql(pAr, zSql2);
29150 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
29160 65 28 7a 53 71 6c 32 29 3b 0a 20 20 7d 0a 65 6e  e(zSql2);.  }.en
29170 64 5f 61 72 5f 74 72 61 6e 73 61 63 74 69 6f 6e  d_ar_transaction
29180 3a 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  :.  if( rc!=SQLI
29190 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 72 45  TE_OK ){.    arE
291a0 78 65 63 53 71 6c 28 70 41 72 2c 20 22 52 4f 4c  xecSql(pAr, "ROL
291b0 4c 42 41 43 4b 20 54 4f 20 61 72 3b 20 52 45 4c  LBACK TO ar; REL
291c0 45 41 53 45 20 61 72 3b 22 29 3b 0a 20 20 7d 65  EASE ar;");.  }e
291d0 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 61 72  lse{.    rc = ar
291e0 45 78 65 63 53 71 6c 28 70 41 72 2c 20 22 52 45  ExecSql(pAr, "RE
291f0 4c 45 41 53 45 20 61 72 3b 22 29 3b 0a 20 20 20  LEASE ar;");.   
29200 20 69 66 28 20 70 41 72 2d 3e 62 5a 69 70 20 26   if( pAr->bZip &
29210 26 20 70 41 72 2d 3e 7a 46 69 6c 65 20 29 7b 0a  & pAr->zFile ){.
29220 20 20 20 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c        zSql = sql
29230 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 44 52  ite3_mprintf("DR
29240 4f 50 20 54 41 42 4c 45 20 25 73 22 2c 20 7a 54  OP TABLE %s", zT
29250 65 6d 70 29 3b 0a 20 20 20 20 20 20 61 72 45 78  emp);.      arEx
29260 65 63 53 71 6c 28 70 41 72 2c 20 7a 53 71 6c 29  ecSql(pAr, zSql)
29270 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
29280 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20  free(zSql);.    
29290 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
292a0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c  c;.}../*.** Impl
292b0 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 22 2e  ementation of ".
292c0 61 72 22 20 64 6f 74 20 63 6f 6d 6d 61 6e 64 2e  ar" dot command.
292d0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
292e0 72 44 6f 74 43 6f 6d 6d 61 6e 64 28 0a 20 20 53  rDotCommand(.  S
292f0 68 65 6c 6c 53 74 61 74 65 20 2a 70 53 74 61 74  hellState *pStat
29300 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  e,             /
29310 2a 20 43 75 72 72 65 6e 74 20 73 68 65 6c 6c 20  * Current shell 
29320 74 6f 6f 6c 20 73 74 61 74 65 20 2a 2f 0a 20 20  tool state */.  
29330 69 6e 74 20 66 72 6f 6d 43 6d 64 4c 69 6e 65 2c  int fromCmdLine,
29340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29350 2f 2a 20 54 72 75 65 20 69 66 20 2d 41 20 63 6f  /* True if -A co
29360 6d 6d 61 6e 64 2d 6c 69 6e 65 20 6f 70 74 69 6f  mmand-line optio
29370 6e 2c 20 6e 6f 74 20 2e 61 72 20 63 6d 64 20 2a  n, not .ar cmd *
29380 2f 0a 20 20 63 68 61 72 20 2a 2a 61 7a 41 72 67  /.  char **azArg
29390 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
293a0 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20      /* Array of 
293b0 61 72 67 75 6d 65 6e 74 73 20 70 61 73 73 65 64  arguments passed
293c0 20 74 6f 20 64 6f 74 20 63 6f 6d 6d 61 6e 64 20   to dot command 
293d0 2a 2f 0a 20 20 69 6e 74 20 6e 41 72 67 20 20 20  */.  int nArg   
293e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
293f0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
29400 66 20 65 6e 74 72 69 65 73 20 69 6e 20 61 7a 41  f entries in azA
29410 72 67 5b 5d 20 2a 2f 0a 29 7b 0a 20 20 41 72 43  rg[] */.){.  ArC
29420 6f 6d 6d 61 6e 64 20 63 6d 64 3b 0a 20 20 69 6e  ommand cmd;.  in
29430 74 20 72 63 3b 0a 20 20 6d 65 6d 73 65 74 28 26  t rc;.  memset(&
29440 63 6d 64 2c 20 30 2c 20 73 69 7a 65 6f 66 28 63  cmd, 0, sizeof(c
29450 6d 64 29 29 3b 0a 20 20 63 6d 64 2e 66 72 6f 6d  md));.  cmd.from
29460 43 6d 64 4c 69 6e 65 20 3d 20 66 72 6f 6d 43 6d  CmdLine = fromCm
29470 64 4c 69 6e 65 3b 0a 20 20 72 63 20 3d 20 61 72  dLine;.  rc = ar
29480 50 61 72 73 65 43 6f 6d 6d 61 6e 64 28 61 7a 41  ParseCommand(azA
29490 72 67 2c 20 6e 41 72 67 2c 20 26 63 6d 64 29 3b  rg, nArg, &cmd);
294a0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
294b0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20  E_OK ){.    int 
294c0 65 44 62 54 79 70 65 20 3d 20 53 48 45 4c 4c 5f  eDbType = SHELL_
294d0 4f 50 45 4e 5f 55 4e 53 50 45 43 3b 0a 20 20 20  OPEN_UNSPEC;.   
294e0 20 63 6d 64 2e 70 20 3d 20 70 53 74 61 74 65 3b   cmd.p = pState;
294f0 0a 20 20 20 20 63 6d 64 2e 64 62 20 3d 20 70 53  .    cmd.db = pS
29500 74 61 74 65 2d 3e 64 62 3b 0a 20 20 20 20 69 66  tate->db;.    if
29510 28 20 63 6d 64 2e 7a 46 69 6c 65 20 29 7b 0a 20  ( cmd.zFile ){. 
29520 20 20 20 20 20 65 44 62 54 79 70 65 20 3d 20 64       eDbType = d
29530 65 64 75 63 65 44 61 74 61 62 61 73 65 54 79 70  educeDatabaseTyp
29540 65 28 63 6d 64 2e 7a 46 69 6c 65 2c 20 31 29 3b  e(cmd.zFile, 1);
29550 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
29560 20 20 65 44 62 54 79 70 65 20 3d 20 70 53 74 61    eDbType = pSta
29570 74 65 2d 3e 6f 70 65 6e 4d 6f 64 65 3b 0a 20 20  te->openMode;.  
29580 20 20 7d 0a 20 20 20 20 69 66 28 20 65 44 62 54    }.    if( eDbT
29590 79 70 65 3d 3d 53 48 45 4c 4c 5f 4f 50 45 4e 5f  ype==SHELL_OPEN_
295a0 5a 49 50 46 49 4c 45 20 29 7b 0a 20 20 20 20 20  ZIPFILE ){.     
295b0 20 69 66 28 20 63 6d 64 2e 65 43 6d 64 3d 3d 41   if( cmd.eCmd==A
295c0 52 5f 43 4d 44 5f 45 58 54 52 41 43 54 20 7c 7c  R_CMD_EXTRACT ||
295d0 20 63 6d 64 2e 65 43 6d 64 3d 3d 41 52 5f 43 4d   cmd.eCmd==AR_CM
295e0 44 5f 4c 49 53 54 20 29 7b 0a 20 20 20 20 20 20  D_LIST ){.      
295f0 20 20 69 66 28 20 63 6d 64 2e 7a 46 69 6c 65 3d    if( cmd.zFile=
29600 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
29610 63 6d 64 2e 7a 53 72 63 54 61 62 6c 65 20 3d 20  cmd.zSrcTable = 
29620 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
29630 22 7a 69 70 22 29 3b 0a 20 20 20 20 20 20 20 20  "zip");.        
29640 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
29650 20 63 6d 64 2e 7a 53 72 63 54 61 62 6c 65 20 3d   cmd.zSrcTable =
29660 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
29670 28 22 7a 69 70 66 69 6c 65 28 25 51 29 22 2c 20  ("zipfile(%Q)", 
29680 63 6d 64 2e 7a 46 69 6c 65 29 3b 0a 20 20 20 20  cmd.zFile);.    
29690 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
296a0 20 20 20 20 63 6d 64 2e 62 5a 69 70 20 3d 20 31      cmd.bZip = 1
296b0 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
296c0 63 6d 64 2e 7a 46 69 6c 65 20 29 7b 0a 20 20 20  cmd.zFile ){.   
296d0 20 20 20 69 6e 74 20 66 6c 61 67 73 3b 0a 20 20     int flags;.  
296e0 20 20 20 20 69 66 28 20 63 6d 64 2e 62 41 70 70      if( cmd.bApp
296f0 65 6e 64 20 29 20 65 44 62 54 79 70 65 20 3d 20  end ) eDbType = 
29700 53 48 45 4c 4c 5f 4f 50 45 4e 5f 41 50 50 45 4e  SHELL_OPEN_APPEN
29710 44 56 46 53 3b 0a 20 20 20 20 20 20 69 66 28 20  DVFS;.      if( 
29720 63 6d 64 2e 65 43 6d 64 3d 3d 41 52 5f 43 4d 44  cmd.eCmd==AR_CMD
29730 5f 43 52 45 41 54 45 20 7c 7c 20 63 6d 64 2e 65  _CREATE || cmd.e
29740 43 6d 64 3d 3d 41 52 5f 43 4d 44 5f 55 50 44 41  Cmd==AR_CMD_UPDA
29750 54 45 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6c  TE ){.        fl
29760 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45  ags = SQLITE_OPE
29770 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49  N_READWRITE|SQLI
29780 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 3b 0a  TE_OPEN_CREATE;.
29790 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
297a0 20 20 20 20 20 66 6c 61 67 73 20 3d 20 53 51 4c       flags = SQL
297b0 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c  ITE_OPEN_READONL
297c0 59 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  Y;.      }.     
297d0 20 63 6d 64 2e 64 62 20 3d 20 30 3b 0a 20 20 20   cmd.db = 0;.   
297e0 20 20 20 69 66 28 20 63 6d 64 2e 62 44 72 79 52     if( cmd.bDryR
297f0 75 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74  un ){.        ut
29800 66 38 5f 70 72 69 6e 74 66 28 70 53 74 61 74 65  f8_printf(pState
29810 2d 3e 6f 75 74 2c 20 22 2d 2d 20 6f 70 65 6e 20  ->out, "-- open 
29820 64 61 74 61 62 61 73 65 20 27 25 73 27 25 73 5c  database '%s'%s\
29830 6e 22 2c 20 63 6d 64 2e 7a 46 69 6c 65 2c 0a 20  n", cmd.zFile,. 
29840 20 20 20 20 20 20 20 20 20 20 20 20 65 44 62 54              eDbT
29850 79 70 65 3d 3d 53 48 45 4c 4c 5f 4f 50 45 4e 5f  ype==SHELL_OPEN_
29860 41 50 50 45 4e 44 56 46 53 20 3f 20 22 20 75 73  APPENDVFS ? " us
29870 69 6e 67 20 27 61 70 6e 64 76 66 73 27 22 20 3a  ing 'apndvfs'" :
29880 20 22 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20   "");.      }.  
29890 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
298a0 5f 6f 70 65 6e 5f 76 32 28 63 6d 64 2e 7a 46 69  _open_v2(cmd.zFi
298b0 6c 65 2c 20 26 63 6d 64 2e 64 62 2c 20 66 6c 61  le, &cmd.db, fla
298c0 67 73 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  gs, .           
298d0 20 20 65 44 62 54 79 70 65 3d 3d 53 48 45 4c 4c    eDbType==SHELL
298e0 5f 4f 50 45 4e 5f 41 50 50 45 4e 44 56 46 53 20  _OPEN_APPENDVFS 
298f0 3f 20 22 61 70 6e 64 76 66 73 22 20 3a 20 30 29  ? "apndvfs" : 0)
29900 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
29910 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
29920 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
29930 28 73 74 64 65 72 72 2c 20 22 63 61 6e 6e 6f 74  (stderr, "cannot
29940 20 6f 70 65 6e 20 66 69 6c 65 3a 20 25 73 20 28   open file: %s (
29950 25 73 29 5c 6e 22 2c 20 0a 20 20 20 20 20 20 20  %s)\n", .       
29960 20 20 20 20 20 63 6d 64 2e 7a 46 69 6c 65 2c 20       cmd.zFile, 
29970 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 63  sqlite3_errmsg(c
29980 6d 64 2e 64 62 29 0a 20 20 20 20 20 20 20 20 29  md.db).        )
29990 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65  ;.        goto e
299a0 6e 64 5f 61 72 5f 63 6f 6d 6d 61 6e 64 3b 0a 20  nd_ar_command;. 
299b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
299c0 69 74 65 33 5f 66 69 6c 65 69 6f 5f 69 6e 69 74  ite3_fileio_init
299d0 28 63 6d 64 2e 64 62 2c 20 30 2c 20 30 29 3b 0a  (cmd.db, 0, 0);.
299e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 71        sqlite3_sq
299f0 6c 61 72 5f 69 6e 69 74 28 63 6d 64 2e 64 62 2c  lar_init(cmd.db,
29a00 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71   0, 0);.      sq
29a10 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
29a20 63 74 69 6f 6e 28 63 6d 64 2e 64 62 2c 20 22 73  ction(cmd.db, "s
29a30 68 65 6c 6c 5f 70 75 74 73 6e 6c 22 2c 20 31 2c  hell_putsnl", 1,
29a40 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 63 6d   SQLITE_UTF8, cm
29a50 64 2e 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20  d.p,.           
29a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29a70 20 20 20 73 68 65 6c 6c 50 75 74 73 46 75 6e 63     shellPutsFunc
29a80 2c 20 30 2c 20 30 29 3b 0a 0a 20 20 20 20 7d 0a  , 0, 0);..    }.
29a90 20 20 20 20 69 66 28 20 63 6d 64 2e 7a 53 72 63      if( cmd.zSrc
29aa0 54 61 62 6c 65 3d 3d 30 20 26 26 20 63 6d 64 2e  Table==0 && cmd.
29ab0 62 5a 69 70 3d 3d 30 20 26 26 20 63 6d 64 2e 65  bZip==0 && cmd.e
29ac0 43 6d 64 21 3d 41 52 5f 43 4d 44 5f 48 45 4c 50  Cmd!=AR_CMD_HELP
29ad0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 63 6d   ){.      if( cm
29ae0 64 2e 65 43 6d 64 21 3d 41 52 5f 43 4d 44 5f 43  d.eCmd!=AR_CMD_C
29af0 52 45 41 54 45 0a 20 20 20 20 20 20 20 26 26 20  REATE.       && 
29b00 73 71 6c 69 74 65 33 5f 74 61 62 6c 65 5f 63 6f  sqlite3_table_co
29b10 6c 75 6d 6e 5f 6d 65 74 61 64 61 74 61 28 63 6d  lumn_metadata(cm
29b20 64 2e 64 62 2c 30 2c 22 73 71 6c 61 72 22 2c 22  d.db,0,"sqlar","
29b30 6e 61 6d 65 22 2c 30 2c 30 2c 30 2c 30 2c 30 29  name",0,0,0,0,0)
29b40 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20  .      ){.      
29b50 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74    utf8_printf(st
29b60 64 65 72 72 2c 20 22 64 61 74 61 62 61 73 65 20  derr, "database 
29b70 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e  does not contain
29b80 20 61 6e 20 27 73 71 6c 61 72 27 20 74 61 62 6c   an 'sqlar' tabl
29b90 65 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 72  e\n");.        r
29ba0 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
29bb0 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65  ;.        goto e
29bc0 6e 64 5f 61 72 5f 63 6f 6d 6d 61 6e 64 3b 0a 20  nd_ar_command;. 
29bd0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 6d 64       }.      cmd
29be0 2e 7a 53 72 63 54 61 62 6c 65 20 3d 20 73 71 6c  .zSrcTable = sql
29bf0 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 73 71  ite3_mprintf("sq
29c00 6c 61 72 22 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  lar");.    }..  
29c10 20 20 73 77 69 74 63 68 28 20 63 6d 64 2e 65 43    switch( cmd.eC
29c20 6d 64 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65  md ){.      case
29c30 20 41 52 5f 43 4d 44 5f 43 52 45 41 54 45 3a 0a   AR_CMD_CREATE:.
29c40 20 20 20 20 20 20 20 20 72 63 20 3d 20 61 72 43          rc = arC
29c50 72 65 61 74 65 4f 72 55 70 64 61 74 65 43 6f 6d  reateOrUpdateCom
29c60 6d 61 6e 64 28 26 63 6d 64 2c 20 30 29 3b 0a 20  mand(&cmd, 0);. 
29c70 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20         break;.. 
29c80 20 20 20 20 20 63 61 73 65 20 41 52 5f 43 4d 44       case AR_CMD
29c90 5f 45 58 54 52 41 43 54 3a 0a 20 20 20 20 20 20  _EXTRACT:.      
29ca0 20 20 72 63 20 3d 20 61 72 45 78 74 72 61 63 74    rc = arExtract
29cb0 43 6f 6d 6d 61 6e 64 28 26 63 6d 64 29 3b 0a 20  Command(&cmd);. 
29cc0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20         break;.. 
29cd0 20 20 20 20 20 63 61 73 65 20 41 52 5f 43 4d 44       case AR_CMD
29ce0 5f 4c 49 53 54 3a 0a 20 20 20 20 20 20 20 20 72  _LIST:.        r
29cf0 63 20 3d 20 61 72 4c 69 73 74 43 6f 6d 6d 61 6e  c = arListComman
29d00 64 28 26 63 6d 64 29 3b 0a 20 20 20 20 20 20 20  d(&cmd);.       
29d10 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20 63   break;..      c
29d20 61 73 65 20 41 52 5f 43 4d 44 5f 48 45 4c 50 3a  ase AR_CMD_HELP:
29d30 0a 20 20 20 20 20 20 20 20 61 72 55 73 61 67 65  .        arUsage
29d40 28 70 53 74 61 74 65 2d 3e 6f 75 74 29 3b 0a 20  (pState->out);. 
29d50 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20         break;.. 
29d60 20 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20       default:.  
29d70 20 20 20 20 20 20 61 73 73 65 72 74 28 20 63 6d        assert( cm
29d80 64 2e 65 43 6d 64 3d 3d 41 52 5f 43 4d 44 5f 55  d.eCmd==AR_CMD_U
29d90 50 44 41 54 45 20 29 3b 0a 20 20 20 20 20 20 20  PDATE );.       
29da0 20 72 63 20 3d 20 61 72 43 72 65 61 74 65 4f 72   rc = arCreateOr
29db0 55 70 64 61 74 65 43 6f 6d 6d 61 6e 64 28 26 63  UpdateCommand(&c
29dc0 6d 64 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  md, 1);.        
29dd0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
29de0 0a 65 6e 64 5f 61 72 5f 63 6f 6d 6d 61 6e 64 3a  .end_ar_command:
29df0 0a 20 20 69 66 28 20 63 6d 64 2e 64 62 21 3d 70  .  if( cmd.db!=p
29e00 53 74 61 74 65 2d 3e 64 62 20 29 7b 0a 20 20 20  State->db ){.   
29e10 20 63 6c 6f 73 65 5f 64 62 28 63 6d 64 2e 64 62   close_db(cmd.db
29e20 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
29e30 5f 66 72 65 65 28 63 6d 64 2e 7a 53 72 63 54 61  _free(cmd.zSrcTa
29e40 62 6c 65 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20  ble);..  return 
29e50 72 63 3b 0a 7d 0a 2f 2a 20 45 6e 64 20 6f 66 20  rc;.}./* End of 
29e60 74 68 65 20 22 2e 61 72 63 68 69 76 65 22 20 6f  the ".archive" o
29e70 72 20 22 2e 61 72 22 20 63 6f 6d 6d 61 6e 64 20  r ".ar" command 
29e80 6c 6f 67 69 63 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  logic.**********
29e90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29ea0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29eb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29ec0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29ed0 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 23 65 6e 64 69 66  ********/.#endif
29ee0 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c   /* !defined(SQL
29ef0 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
29f00 54 41 42 4c 45 29 20 26 26 20 64 65 66 69 6e 65  TABLE) && define
29f10 64 28 53 51 4c 49 54 45 5f 48 41 56 45 5f 5a 4c  d(SQLITE_HAVE_ZL
29f20 49 42 29 20 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 49  IB) */.../*.** I
29f30 66 20 61 6e 20 69 6e 70 75 74 20 6c 69 6e 65 20  f an input line 
29f40 62 65 67 69 6e 73 20 77 69 74 68 20 22 2e 22 20  begins with "." 
29f50 74 68 65 6e 20 69 6e 76 6f 6b 65 20 74 68 69 73  then invoke this
29f60 20 72 6f 75 74 69 6e 65 20 74 6f 0a 2a 2a 20 70   routine to.** p
29f70 72 6f 63 65 73 73 20 74 68 61 74 20 6c 69 6e 65  rocess that line
29f80 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 31  ..**.** Return 1
29f90 20 6f 6e 20 65 72 72 6f 72 2c 20 32 20 74 6f 20   on error, 2 to 
29fa0 65 78 69 74 2c 20 61 6e 64 20 30 20 6f 74 68 65  exit, and 0 othe
29fb0 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  rwise..*/.static
29fc0 20 69 6e 74 20 64 6f 5f 6d 65 74 61 5f 63 6f 6d   int do_meta_com
29fd0 6d 61 6e 64 28 63 68 61 72 20 2a 7a 4c 69 6e 65  mand(char *zLine
29fe0 2c 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 29  , ShellState *p)
29ff0 7b 0a 20 20 69 6e 74 20 68 20 3d 20 31 3b 0a 20  {.  int h = 1;. 
2a000 20 69 6e 74 20 6e 41 72 67 20 3d 20 30 3b 0a 20   int nArg = 0;. 
2a010 20 69 6e 74 20 6e 2c 20 63 3b 0a 20 20 69 6e 74   int n, c;.  int
2a020 20 72 63 20 3d 20 30 3b 0a 20 20 63 68 61 72 20   rc = 0;.  char 
2a030 2a 61 7a 41 72 67 5b 35 30 5d 3b 0a 0a 23 69 66  *azArg[50];..#if
2a040 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
2a050 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20  _VIRTUALTABLE.  
2a060 69 66 28 20 70 2d 3e 65 78 70 65 72 74 2e 70 45  if( p->expert.pE
2a070 78 70 65 72 74 20 29 7b 0a 20 20 20 20 65 78 70  xpert ){.    exp
2a080 65 72 74 46 69 6e 69 73 68 28 70 2c 20 31 2c 20  ertFinish(p, 1, 
2a090 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  0);.  }.#endif..
2a0a0 20 20 2f 2a 20 50 61 72 73 65 20 74 68 65 20 69    /* Parse the i
2a0b0 6e 70 75 74 20 6c 69 6e 65 20 69 6e 74 6f 20 74  nput line into t
2a0c0 6f 6b 65 6e 73 2e 0a 20 20 2a 2f 0a 20 20 77 68  okens..  */.  wh
2a0d0 69 6c 65 28 20 7a 4c 69 6e 65 5b 68 5d 20 26 26  ile( zLine[h] &&
2a0e0 20 6e 41 72 67 3c 41 72 72 61 79 53 69 7a 65 28   nArg<ArraySize(
2a0f0 61 7a 41 72 67 29 20 29 7b 0a 20 20 20 20 77 68  azArg) ){.    wh
2a100 69 6c 65 28 20 49 73 53 70 61 63 65 28 7a 4c 69  ile( IsSpace(zLi
2a110 6e 65 5b 68 5d 29 20 29 7b 20 68 2b 2b 3b 20 7d  ne[h]) ){ h++; }
2a120 0a 20 20 20 20 69 66 28 20 7a 4c 69 6e 65 5b 68  .    if( zLine[h
2a130 5d 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  ]==0 ) break;.  
2a140 20 20 69 66 28 20 7a 4c 69 6e 65 5b 68 5d 3d 3d    if( zLine[h]==
2a150 27 5c 27 27 20 7c 7c 20 7a 4c 69 6e 65 5b 68 5d  '\'' || zLine[h]
2a160 3d 3d 27 22 27 20 29 7b 0a 20 20 20 20 20 20 69  =='"' ){.      i
2a170 6e 74 20 64 65 6c 69 6d 20 3d 20 7a 4c 69 6e 65  nt delim = zLine
2a180 5b 68 2b 2b 5d 3b 0a 20 20 20 20 20 20 61 7a 41  [h++];.      azA
2a190 72 67 5b 6e 41 72 67 2b 2b 5d 20 3d 20 26 7a 4c  rg[nArg++] = &zL
2a1a0 69 6e 65 5b 68 5d 3b 0a 20 20 20 20 20 20 77 68  ine[h];.      wh
2a1b0 69 6c 65 28 20 7a 4c 69 6e 65 5b 68 5d 20 26 26  ile( zLine[h] &&
2a1c0 20 7a 4c 69 6e 65 5b 68 5d 21 3d 64 65 6c 69 6d   zLine[h]!=delim
2a1d0 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
2a1e0 7a 4c 69 6e 65 5b 68 5d 3d 3d 27 5c 5c 27 20 26  zLine[h]=='\\' &
2a1f0 26 20 64 65 6c 69 6d 3d 3d 27 22 27 20 26 26 20  & delim=='"' && 
2a200 7a 4c 69 6e 65 5b 68 2b 31 5d 21 3d 30 20 29 20  zLine[h+1]!=0 ) 
2a210 68 2b 2b 3b 0a 20 20 20 20 20 20 20 20 68 2b 2b  h++;.        h++
2a220 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2a230 69 66 28 20 7a 4c 69 6e 65 5b 68 5d 3d 3d 64 65  if( zLine[h]==de
2a240 6c 69 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  lim ){.        z
2a250 4c 69 6e 65 5b 68 2b 2b 5d 20 3d 20 30 3b 0a 20  Line[h++] = 0;. 
2a260 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
2a270 20 64 65 6c 69 6d 3d 3d 27 22 27 20 29 20 72 65   delim=='"' ) re
2a280 73 6f 6c 76 65 5f 62 61 63 6b 73 6c 61 73 68 65  solve_backslashe
2a290 73 28 61 7a 41 72 67 5b 6e 41 72 67 2d 31 5d 29  s(azArg[nArg-1])
2a2a0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
2a2b0 20 20 20 61 7a 41 72 67 5b 6e 41 72 67 2b 2b 5d     azArg[nArg++]
2a2c0 20 3d 20 26 7a 4c 69 6e 65 5b 68 5d 3b 0a 20 20   = &zLine[h];.  
2a2d0 20 20 20 20 77 68 69 6c 65 28 20 7a 4c 69 6e 65      while( zLine
2a2e0 5b 68 5d 20 26 26 20 21 49 73 53 70 61 63 65 28  [h] && !IsSpace(
2a2f0 7a 4c 69 6e 65 5b 68 5d 29 20 29 7b 20 68 2b 2b  zLine[h]) ){ h++
2a300 3b 20 7d 0a 20 20 20 20 20 20 69 66 28 20 7a 4c  ; }.      if( zL
2a310 69 6e 65 5b 68 5d 20 29 20 7a 4c 69 6e 65 5b 68  ine[h] ) zLine[h
2a320 2b 2b 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  ++] = 0;.      r
2a330 65 73 6f 6c 76 65 5f 62 61 63 6b 73 6c 61 73 68  esolve_backslash
2a340 65 73 28 61 7a 41 72 67 5b 6e 41 72 67 2d 31 5d  es(azArg[nArg-1]
2a350 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
2a360 2f 2a 20 50 72 6f 63 65 73 73 20 74 68 65 20 69  /* Process the i
2a370 6e 70 75 74 20 6c 69 6e 65 2e 0a 20 20 2a 2f 0a  nput line..  */.
2a380 20 20 69 66 28 20 6e 41 72 67 3d 3d 30 20 29 20    if( nArg==0 ) 
2a390 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20 6e 6f 20  return 0; /* no 
2a3a0 74 6f 6b 65 6e 73 2c 20 6e 6f 20 65 72 72 6f 72  tokens, no error
2a3b0 20 2a 2f 0a 20 20 6e 20 3d 20 73 74 72 6c 65 6e   */.  n = strlen
2a3c0 33 30 28 61 7a 41 72 67 5b 30 5d 29 3b 0a 20 20  30(azArg[0]);.  
2a3d0 63 20 3d 20 61 7a 41 72 67 5b 30 5d 5b 30 5d 3b  c = azArg[0][0];
2a3e0 0a 20 20 63 6c 65 61 72 54 65 6d 70 46 69 6c 65  .  clearTempFile
2a3f0 28 70 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  (p);..#ifndef SQ
2a400 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52  LITE_OMIT_AUTHOR
2a410 49 5a 41 54 49 4f 4e 0a 20 20 69 66 28 20 63 3d  IZATION.  if( c=
2a420 3d 27 61 27 20 26 26 20 73 74 72 6e 63 6d 70 28  ='a' && strncmp(
2a430 61 7a 41 72 67 5b 30 5d 2c 20 22 61 75 74 68 22  azArg[0], "auth"
2a440 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69  , n)==0 ){.    i
2a450 66 28 20 6e 41 72 67 21 3d 32 20 29 7b 0a 20 20  f( nArg!=2 ){.  
2a460 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73      raw_printf(s
2a470 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e  tderr, "Usage: .
2a480 61 75 74 68 20 4f 4e 7c 4f 46 46 5c 6e 22 29 3b  auth ON|OFF\n");
2a490 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20  .      rc = 1;. 
2a4a0 20 20 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63       goto meta_c
2a4b0 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20  ommand_exit;.   
2a4c0 20 7d 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28 70   }.    open_db(p
2a4d0 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 62 6f  , 0);.    if( bo
2a4e0 6f 6c 65 61 6e 56 61 6c 75 65 28 61 7a 41 72 67  oleanValue(azArg
2a4f0 5b 31 5d 29 20 29 7b 0a 20 20 20 20 20 20 73 71  [1]) ){.      sq
2a500 6c 69 74 65 33 5f 73 65 74 5f 61 75 74 68 6f 72  lite3_set_author
2a510 69 7a 65 72 28 70 2d 3e 64 62 2c 20 73 68 65 6c  izer(p->db, shel
2a520 6c 41 75 74 68 2c 20 70 29 3b 0a 20 20 20 20 7d  lAuth, p);.    }
2a530 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
2a540 74 65 33 5f 73 65 74 5f 61 75 74 68 6f 72 69 7a  te3_set_authoriz
2a550 65 72 28 70 2d 3e 64 62 2c 20 30 2c 20 30 29 3b  er(p->db, 0, 0);
2a560 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 23  .    }.  }else.#
2a570 65 6e 64 69 66 0a 0a 23 69 66 20 21 64 65 66 69  endif..#if !defi
2a580 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
2a590 56 49 52 54 55 41 4c 54 41 42 4c 45 29 20 26 26  VIRTUALTABLE) &&
2a5a0 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
2a5b0 48 41 56 45 5f 5a 4c 49 42 29 0a 20 20 69 66 28  HAVE_ZLIB).  if(
2a5c0 20 63 3d 3d 27 61 27 20 26 26 20 73 74 72 6e 63   c=='a' && strnc
2a5d0 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 61 72  mp(azArg[0], "ar
2a5e0 63 68 69 76 65 22 2c 20 6e 29 3d 3d 30 20 29 7b  chive", n)==0 ){
2a5f0 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28 70 2c 20  .    open_db(p, 
2a600 30 29 3b 0a 20 20 20 20 72 63 20 3d 20 61 72 44  0);.    rc = arD
2a610 6f 74 43 6f 6d 6d 61 6e 64 28 70 2c 20 30 2c 20  otCommand(p, 0, 
2a620 61 7a 41 72 67 2c 20 6e 41 72 67 29 3b 0a 20 20  azArg, nArg);.  
2a630 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 0a 20 20  }else.#endif..  
2a640 69 66 28 20 28 63 3d 3d 27 62 27 20 26 26 20 6e  if( (c=='b' && n
2a650 3e 3d 33 20 26 26 20 73 74 72 6e 63 6d 70 28 61  >=3 && strncmp(a
2a660 7a 41 72 67 5b 30 5d 2c 20 22 62 61 63 6b 75 70  zArg[0], "backup
2a670 22 2c 20 6e 29 3d 3d 30 29 0a 20 20 20 7c 7c 20  ", n)==0).   || 
2a680 28 63 3d 3d 27 73 27 20 26 26 20 6e 3e 3d 33 20  (c=='s' && n>=3 
2a690 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67  && strncmp(azArg
2a6a0 5b 30 5d 2c 20 22 73 61 76 65 22 2c 20 6e 29 3d  [0], "save", n)=
2a6b0 3d 30 29 0a 20 20 29 7b 0a 20 20 20 20 63 6f 6e  =0).  ){.    con
2a6c0 73 74 20 63 68 61 72 20 2a 7a 44 65 73 74 46 69  st char *zDestFi
2a6d0 6c 65 20 3d 20 30 3b 0a 20 20 20 20 63 6f 6e 73  le = 0;.    cons
2a6e0 74 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 30 3b  t char *zDb = 0;
2a6f0 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a 70 44  .    sqlite3 *pD
2a700 65 73 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  est;.    sqlite3
2a710 5f 62 61 63 6b 75 70 20 2a 70 42 61 63 6b 75 70  _backup *pBackup
2a720 3b 0a 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20  ;.    int j;.   
2a730 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56 66   const char *zVf
2a740 73 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 6a  s = 0;.    for(j
2a750 3d 31 3b 20 6a 3c 6e 41 72 67 3b 20 6a 2b 2b 29  =1; j<nArg; j++)
2a760 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  {.      const ch
2a770 61 72 20 2a 7a 20 3d 20 61 7a 41 72 67 5b 6a 5d  ar *z = azArg[j]
2a780 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 5b 30 5d  ;.      if( z[0]
2a790 3d 3d 27 2d 27 20 29 7b 0a 20 20 20 20 20 20 20  =='-' ){.       
2a7a0 20 69 66 28 20 7a 5b 31 5d 3d 3d 27 2d 27 20 29   if( z[1]=='-' )
2a7b0 20 7a 2b 2b 3b 0a 20 20 20 20 20 20 20 20 69 66   z++;.        if
2a7c0 28 20 73 74 72 63 6d 70 28 7a 2c 20 22 2d 61 70  ( strcmp(z, "-ap
2a7d0 70 65 6e 64 22 29 3d 3d 30 20 29 7b 0a 20 20 20  pend")==0 ){.   
2a7e0 20 20 20 20 20 20 20 7a 56 66 73 20 3d 20 22 61         zVfs = "a
2a7f0 70 6e 64 76 66 73 22 3b 0a 20 20 20 20 20 20 20  pndvfs";.       
2a800 20 7d 65 6c 73 65 0a 20 20 20 20 20 20 20 20 7b   }else.        {
2a810 0a 20 20 20 20 20 20 20 20 20 20 75 74 66 38 5f  .          utf8_
2a820 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
2a830 75 6e 6b 6e 6f 77 6e 20 6f 70 74 69 6f 6e 3a 20  unknown option: 
2a840 25 73 5c 6e 22 2c 20 61 7a 41 72 67 5b 6a 5d 29  %s\n", azArg[j])
2a850 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ;.          retu
2a860 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a  rn 1;.        }.
2a870 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
2a880 7a 44 65 73 74 46 69 6c 65 3d 3d 30 20 29 7b 0a  zDestFile==0 ){.
2a890 20 20 20 20 20 20 20 20 7a 44 65 73 74 46 69 6c          zDestFil
2a8a0 65 20 3d 20 61 7a 41 72 67 5b 6a 5d 3b 0a 20 20  e = azArg[j];.  
2a8b0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 44      }else if( zD
2a8c0 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  b==0 ){.        
2a8d0 7a 44 62 20 3d 20 7a 44 65 73 74 46 69 6c 65 3b  zDb = zDestFile;
2a8e0 0a 20 20 20 20 20 20 20 20 7a 44 65 73 74 46 69  .        zDestFi
2a8f0 6c 65 20 3d 20 61 7a 41 72 67 5b 6a 5d 3b 0a 20  le = azArg[j];. 
2a900 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2a910 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73      raw_printf(s
2a920 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e  tderr, "Usage: .
2a930 62 61 63 6b 75 70 20 3f 44 42 3f 20 3f 2d 2d 61  backup ?DB? ?--a
2a940 70 70 65 6e 64 3f 20 46 49 4c 45 4e 41 4d 45 5c  ppend? FILENAME\
2a950 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  n");.        ret
2a960 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  urn 1;.      }. 
2a970 20 20 20 7d 0a 20 20 20 20 69 66 28 20 7a 44 65     }.    if( zDe
2a980 73 74 46 69 6c 65 3d 3d 30 20 29 7b 0a 20 20 20  stFile==0 ){.   
2a990 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74     raw_printf(st
2a9a0 64 65 72 72 2c 20 22 6d 69 73 73 69 6e 67 20 46  derr, "missing F
2a9b0 49 4c 45 4e 41 4d 45 20 61 72 67 75 6d 65 6e 74  ILENAME argument
2a9c0 20 6f 6e 20 2e 62 61 63 6b 75 70 5c 6e 22 29 3b   on .backup\n");
2a9d0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
2a9e0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 7a  .    }.    if( z
2a9f0 44 62 3d 3d 30 20 29 20 7a 44 62 20 3d 20 22 6d  Db==0 ) zDb = "m
2aa00 61 69 6e 22 3b 0a 20 20 20 20 72 63 20 3d 20 73  ain";.    rc = s
2aa10 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28 7a  qlite3_open_v2(z
2aa20 44 65 73 74 46 69 6c 65 2c 20 26 70 44 65 73 74  DestFile, &pDest
2aa30 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
2aa40 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
2aa50 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54  _READWRITE|SQLIT
2aa60 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 2c 20 7a  E_OPEN_CREATE, z
2aa70 56 66 73 29 3b 0a 20 20 20 20 69 66 28 20 72 63  Vfs);.    if( rc
2aa80 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
2aa90 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
2aaa0 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a  (stderr, "Error:
2aab0 20 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 5c 22 25   cannot open \"%
2aac0 73 5c 22 5c 6e 22 2c 20 7a 44 65 73 74 46 69 6c  s\"\n", zDestFil
2aad0 65 29 3b 0a 20 20 20 20 20 20 63 6c 6f 73 65 5f  e);.      close_
2aae0 64 62 28 70 44 65 73 74 29 3b 0a 20 20 20 20 20  db(pDest);.     
2aaf0 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
2ab00 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28 70 2c 20  .    open_db(p, 
2ab10 30 29 3b 0a 20 20 20 20 70 42 61 63 6b 75 70 20  0);.    pBackup 
2ab20 3d 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70  = sqlite3_backup
2ab30 5f 69 6e 69 74 28 70 44 65 73 74 2c 20 22 6d 61  _init(pDest, "ma
2ab40 69 6e 22 2c 20 70 2d 3e 64 62 2c 20 7a 44 62 29  in", p->db, zDb)
2ab50 3b 0a 20 20 20 20 69 66 28 20 70 42 61 63 6b 75  ;.    if( pBacku
2ab60 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 75 74  p==0 ){.      ut
2ab70 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  f8_printf(stderr
2ab80 2c 20 22 45 72 72 6f 72 3a 20 25 73 5c 6e 22 2c  , "Error: %s\n",
2ab90 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
2aba0 70 44 65 73 74 29 29 3b 0a 20 20 20 20 20 20 63  pDest));.      c
2abb0 6c 6f 73 65 5f 64 62 28 70 44 65 73 74 29 3b 0a  lose_db(pDest);.
2abc0 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
2abd0 20 20 20 20 7d 0a 20 20 20 20 77 68 69 6c 65 28      }.    while(
2abe0 20 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 5f    (rc = sqlite3_
2abf0 62 61 63 6b 75 70 5f 73 74 65 70 28 70 42 61 63  backup_step(pBac
2ac00 6b 75 70 2c 31 30 30 29 29 3d 3d 53 51 4c 49 54  kup,100))==SQLIT
2ac10 45 5f 4f 4b 20 29 7b 7d 0a 20 20 20 20 73 71 6c  E_OK ){}.    sql
2ac20 69 74 65 33 5f 62 61 63 6b 75 70 5f 66 69 6e 69  ite3_backup_fini
2ac30 73 68 28 70 42 61 63 6b 75 70 29 3b 0a 20 20 20  sh(pBackup);.   
2ac40 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2ac50 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 72 63  DONE ){.      rc
2ac60 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 0;.    }else{
2ac70 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e  .      utf8_prin
2ac80 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f  tf(stderr, "Erro
2ac90 72 3a 20 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65  r: %s\n", sqlite
2aca0 33 5f 65 72 72 6d 73 67 28 70 44 65 73 74 29 29  3_errmsg(pDest))
2acb0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a  ;.      rc = 1;.
2acc0 20 20 20 20 7d 0a 20 20 20 20 63 6c 6f 73 65 5f      }.    close_
2acd0 64 62 28 70 44 65 73 74 29 3b 0a 20 20 7d 65 6c  db(pDest);.  }el
2ace0 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 62 27  se..  if( c=='b'
2acf0 20 26 26 20 6e 3e 3d 33 20 26 26 20 73 74 72 6e   && n>=3 && strn
2ad00 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 62  cmp(azArg[0], "b
2ad10 61 69 6c 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20  ail", n)==0 ){. 
2ad20 20 20 20 69 66 28 20 6e 41 72 67 3d 3d 32 20 29     if( nArg==2 )
2ad30 7b 0a 20 20 20 20 20 20 62 61 69 6c 5f 6f 6e 5f  {.      bail_on_
2ad40 65 72 72 6f 72 20 3d 20 62 6f 6f 6c 65 61 6e 56  error = booleanV
2ad50 61 6c 75 65 28 61 7a 41 72 67 5b 31 5d 29 3b 0a  alue(azArg[1]);.
2ad60 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2ad70 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65   raw_printf(stde
2ad80 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 62 61 69  rr, "Usage: .bai
2ad90 6c 20 6f 6e 7c 6f 66 66 5c 6e 22 29 3b 0a 20 20  l on|off\n");.  
2ada0 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
2adb0 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28  }.  }else..  if(
2adc0 20 63 3d 3d 27 62 27 20 26 26 20 6e 3e 3d 33 20   c=='b' && n>=3 
2add0 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67  && strncmp(azArg
2ade0 5b 30 5d 2c 20 22 62 69 6e 61 72 79 22 2c 20 6e  [0], "binary", n
2adf0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  )==0 ){.    if( 
2ae00 6e 41 72 67 3d 3d 32 20 29 7b 0a 20 20 20 20 20  nArg==2 ){.     
2ae10 20 69 66 28 20 62 6f 6f 6c 65 61 6e 56 61 6c 75   if( booleanValu
2ae20 65 28 61 7a 41 72 67 5b 31 5d 29 20 29 7b 0a 20  e(azArg[1]) ){. 
2ae30 20 20 20 20 20 20 20 73 65 74 42 69 6e 61 72 79         setBinary
2ae40 4d 6f 64 65 28 70 2d 3e 6f 75 74 2c 20 31 29 3b  Mode(p->out, 1);
2ae50 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
2ae60 20 20 20 20 20 20 73 65 74 54 65 78 74 4d 6f 64        setTextMod
2ae70 65 28 70 2d 3e 6f 75 74 2c 20 31 29 3b 0a 20 20  e(p->out, 1);.  
2ae80 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
2ae90 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74  .      raw_print
2aea0 66 28 73 74 64 65 72 72 2c 20 22 55 73 61 67 65  f(stderr, "Usage
2aeb0 3a 20 2e 62 69 6e 61 72 79 20 6f 6e 7c 6f 66 66  : .binary on|off
2aec0 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  \n");.      rc =
2aed0 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73   1;.    }.  }els
2aee0 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 63 27 20  e..  if( c=='c' 
2aef0 26 26 20 73 74 72 63 6d 70 28 61 7a 41 72 67 5b  && strcmp(azArg[
2af00 30 5d 2c 22 63 64 22 29 3d 3d 30 20 29 7b 0a 20  0],"cd")==0 ){. 
2af10 20 20 20 69 66 28 20 6e 41 72 67 3d 3d 32 20 29     if( nArg==2 )
2af20 7b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 57  {.#if defined(_W
2af30 49 4e 33 32 29 20 7c 7c 20 64 65 66 69 6e 65 64  IN32) || defined
2af40 28 57 49 4e 33 32 29 0a 20 20 20 20 20 20 77 63  (WIN32).      wc
2af50 68 61 72 5f 74 20 2a 7a 20 3d 20 73 71 6c 69 74  har_t *z = sqlit
2af60 65 33 5f 77 69 6e 33 32 5f 75 74 66 38 5f 74 6f  e3_win32_utf8_to
2af70 5f 75 6e 69 63 6f 64 65 28 61 7a 41 72 67 5b 31  _unicode(azArg[1
2af80 5d 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 21  ]);.      rc = !
2af90 53 65 74 43 75 72 72 65 6e 74 44 69 72 65 63 74  SetCurrentDirect
2afa0 6f 72 79 57 28 7a 29 3b 0a 20 20 20 20 20 20 73  oryW(z);.      s
2afb0 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a  qlite3_free(z);.
2afc0 23 65 6c 73 65 0a 20 20 20 20 20 20 72 63 20 3d  #else.      rc =
2afd0 20 63 68 64 69 72 28 61 7a 41 72 67 5b 31 5d 29   chdir(azArg[1])
2afe0 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 69  ;.#endif.      i
2aff0 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
2b000 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64   utf8_printf(std
2b010 65 72 72 2c 20 22 43 61 6e 6e 6f 74 20 63 68 61  err, "Cannot cha
2b020 6e 67 65 20 74 6f 20 64 69 72 65 63 74 6f 72 79  nge to directory
2b030 20 5c 22 25 73 5c 22 5c 6e 22 2c 20 61 7a 41 72   \"%s\"\n", azAr
2b040 67 5b 31 5d 29 3b 0a 20 20 20 20 20 20 20 20 72  g[1]);.        r
2b050 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  c = 1;.      }. 
2b060 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2b070 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72  raw_printf(stder
2b080 72 2c 20 22 55 73 61 67 65 3a 20 2e 63 64 20 44  r, "Usage: .cd D
2b090 49 52 45 43 54 4f 52 59 5c 6e 22 29 3b 0a 20 20  IRECTORY\n");.  
2b0a0 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
2b0b0 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 2f 2a 20  }.  }else..  /* 
2b0c0 54 68 65 20 75 6e 64 6f 63 75 6d 65 6e 74 65 64  The undocumented
2b0d0 20 22 2e 62 72 65 61 6b 70 6f 69 6e 74 22 20 63   ".breakpoint" c
2b0e0 6f 6d 6d 61 6e 64 20 63 61 75 73 65 73 20 61 20  ommand causes a 
2b0f0 63 61 6c 6c 20 74 6f 20 74 68 65 20 6e 6f 2d 6f  call to the no-o
2b100 70 0a 20 20 2a 2a 20 72 6f 75 74 69 6e 65 20 6e  p.  ** routine n
2b110 61 6d 65 64 20 74 65 73 74 5f 62 72 65 61 6b 70  amed test_breakp
2b120 6f 69 6e 74 28 29 2e 0a 20 20 2a 2f 0a 20 20 69  oint()..  */.  i
2b130 66 28 20 63 3d 3d 27 62 27 20 26 26 20 6e 3e 3d  f( c=='b' && n>=
2b140 33 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41  3 && strncmp(azA
2b150 72 67 5b 30 5d 2c 20 22 62 72 65 61 6b 70 6f 69  rg[0], "breakpoi
2b160 6e 74 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20  nt", n)==0 ){.  
2b170 20 20 74 65 73 74 5f 62 72 65 61 6b 70 6f 69 6e    test_breakpoin
2b180 74 28 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20  t();.  }else..  
2b190 69 66 28 20 63 3d 3d 27 63 27 20 26 26 20 6e 3e  if( c=='c' && n>
2b1a0 3d 33 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a  =3 && strncmp(az
2b1b0 41 72 67 5b 30 5d 2c 20 22 63 68 61 6e 67 65 73  Arg[0], "changes
2b1c0 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ", n)==0 ){.    
2b1d0 69 66 28 20 6e 41 72 67 3d 3d 32 20 29 7b 0a 20  if( nArg==2 ){. 
2b1e0 20 20 20 20 20 73 65 74 4f 72 43 6c 65 61 72 46       setOrClearF
2b1f0 6c 61 67 28 70 2c 20 53 48 46 4c 47 5f 43 6f 75  lag(p, SHFLG_Cou
2b200 6e 74 43 68 61 6e 67 65 73 2c 20 61 7a 41 72 67  ntChanges, azArg
2b210 5b 31 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  [1]);.    }else{
2b220 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74  .      raw_print
2b230 66 28 73 74 64 65 72 72 2c 20 22 55 73 61 67 65  f(stderr, "Usage
2b240 3a 20 2e 63 68 61 6e 67 65 73 20 6f 6e 7c 6f 66  : .changes on|of
2b250 66 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20  f\n");.      rc 
2b260 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  = 1;.    }.  }el
2b270 73 65 0a 0a 20 20 2f 2a 20 43 61 6e 63 65 6c 20  se..  /* Cancel 
2b280 6f 75 74 70 75 74 20 72 65 64 69 72 65 63 74 69  output redirecti
2b290 6f 6e 2c 20 69 66 20 69 74 20 69 73 20 63 75 72  on, if it is cur
2b2a0 72 65 6e 74 6c 79 20 73 65 74 20 28 62 79 20 2e  rently set (by .
2b2b0 74 65 73 74 63 61 73 65 29 0a 20 20 2a 2a 20 54  testcase).  ** T
2b2c0 68 65 6e 20 72 65 61 64 20 74 68 65 20 63 6f 6e  hen read the con
2b2d0 74 65 6e 74 20 6f 66 20 74 68 65 20 74 65 73 74  tent of the test
2b2e0 63 61 73 65 2d 6f 75 74 2e 74 78 74 20 66 69 6c  case-out.txt fil
2b2f0 65 20 61 6e 64 20 63 6f 6d 70 61 72 65 20 61 67  e and compare ag
2b300 61 69 6e 73 74 0a 20 20 2a 2a 20 61 7a 41 72 67  ainst.  ** azArg
2b310 5b 31 5d 2e 20 20 49 66 20 74 68 65 72 65 20 61  [1].  If there a
2b320 72 65 20 64 69 66 66 65 72 65 6e 63 65 73 2c 20  re differences, 
2b330 72 65 70 6f 72 74 20 61 6e 20 65 72 72 6f 72 20  report an error 
2b340 61 6e 64 20 65 78 69 74 2e 0a 20 20 2a 2f 0a 20  and exit..  */. 
2b350 20 69 66 28 20 63 3d 3d 27 63 27 20 26 26 20 6e   if( c=='c' && n
2b360 3e 3d 33 20 26 26 20 73 74 72 6e 63 6d 70 28 61  >=3 && strncmp(a
2b370 7a 41 72 67 5b 30 5d 2c 20 22 63 68 65 63 6b 22  zArg[0], "check"
2b380 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 63  , n)==0 ){.    c
2b390 68 61 72 20 2a 7a 52 65 73 20 3d 20 30 3b 0a 20  har *zRes = 0;. 
2b3a0 20 20 20 6f 75 74 70 75 74 5f 72 65 73 65 74 28     output_reset(
2b3b0 70 29 3b 0a 20 20 20 20 69 66 28 20 6e 41 72 67  p);.    if( nArg
2b3c0 21 3d 32 20 29 7b 0a 20 20 20 20 20 20 72 61 77  !=2 ){.      raw
2b3d0 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
2b3e0 22 55 73 61 67 65 3a 20 2e 63 68 65 63 6b 20 47  "Usage: .check G
2b3f0 4c 4f 42 2d 50 41 54 54 45 52 4e 5c 6e 22 29 3b  LOB-PATTERN\n");
2b400 0a 20 20 20 20 20 20 72 63 20 3d 20 32 3b 0a 20  .      rc = 2;. 
2b410 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 7a 52     }else if( (zR
2b420 65 73 20 3d 20 72 65 61 64 46 69 6c 65 28 22 74  es = readFile("t
2b430 65 73 74 63 61 73 65 2d 6f 75 74 2e 74 78 74 22  estcase-out.txt"
2b440 2c 20 30 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20  , 0))==0 ){.    
2b450 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64    raw_printf(std
2b460 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 63 61 6e  err, "Error: can
2b470 6e 6f 74 20 72 65 61 64 20 27 74 65 73 74 63 61  not read 'testca
2b480 73 65 2d 6f 75 74 2e 74 78 74 27 5c 6e 22 29 3b  se-out.txt'\n");
2b490 0a 20 20 20 20 20 20 72 63 20 3d 20 32 3b 0a 20  .      rc = 2;. 
2b4a0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 74 65 73     }else if( tes
2b4b0 74 63 61 73 65 5f 67 6c 6f 62 28 61 7a 41 72 67  tcase_glob(azArg
2b4c0 5b 31 5d 2c 7a 52 65 73 29 3d 3d 30 20 29 7b 0a  [1],zRes)==0 ){.
2b4d0 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
2b4e0 66 28 73 74 64 65 72 72 2c 0a 20 20 20 20 20 20  f(stderr,.      
2b4f0 20 20 20 20 20 20 20 20 20 20 20 22 74 65 73 74             "test
2b500 63 61 73 65 2d 25 73 20 46 41 49 4c 45 44 5c 6e  case-%s FAILED\n
2b510 20 45 78 70 65 63 74 65 64 3a 20 5b 25 73 5d 5c   Expected: [%s]\
2b520 6e 20 20 20 20 20 20 47 6f 74 3a 20 5b 25 73 5d  n      Got: [%s]
2b530 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
2b540 20 20 20 20 20 20 70 2d 3e 7a 54 65 73 74 63 61        p->zTestca
2b550 73 65 2c 20 61 7a 41 72 67 5b 31 5d 2c 20 7a 52  se, azArg[1], zR
2b560 65 73 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  es);.      rc = 
2b570 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  1;.    }else{.  
2b580 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
2b590 73 74 64 6f 75 74 2c 20 22 74 65 73 74 63 61 73  stdout, "testcas
2b5a0 65 2d 25 73 20 6f 6b 5c 6e 22 2c 20 70 2d 3e 7a  e-%s ok\n", p->z
2b5b0 54 65 73 74 63 61 73 65 29 3b 0a 20 20 20 20 20  Testcase);.     
2b5c0 20 70 2d 3e 6e 43 68 65 63 6b 2b 2b 3b 0a 20 20   p->nCheck++;.  
2b5d0 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f    }.    sqlite3_
2b5e0 66 72 65 65 28 7a 52 65 73 29 3b 0a 20 20 7d 65  free(zRes);.  }e
2b5f0 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 63  lse..  if( c=='c
2b600 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41  ' && strncmp(azA
2b610 72 67 5b 30 5d 2c 20 22 63 6c 6f 6e 65 22 2c 20  rg[0], "clone", 
2b620 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  n)==0 ){.    if(
2b630 20 6e 41 72 67 3d 3d 32 20 29 7b 0a 20 20 20 20   nArg==2 ){.    
2b640 20 20 74 72 79 54 6f 43 6c 6f 6e 65 28 70 2c 20    tryToClone(p, 
2b650 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20 7d  azArg[1]);.    }
2b660 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 61 77 5f  else{.      raw_
2b670 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
2b680 55 73 61 67 65 3a 20 2e 63 6c 6f 6e 65 20 46 49  Usage: .clone FI
2b690 4c 45 4e 41 4d 45 5c 6e 22 29 3b 0a 20 20 20 20  LENAME\n");.    
2b6a0 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a    rc = 1;.    }.
2b6b0 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63    }else..  if( c
2b6c0 3d 3d 27 64 27 20 26 26 20 6e 3e 31 20 26 26 20  =='d' && n>1 && 
2b6d0 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d  strncmp(azArg[0]
2b6e0 2c 20 22 64 61 74 61 62 61 73 65 73 22 2c 20 6e  , "databases", n
2b6f0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 53 68 65 6c  )==0 ){.    Shel
2b700 6c 53 74 61 74 65 20 64 61 74 61 3b 0a 20 20 20  lState data;.   
2b710 20 63 68 61 72 20 2a 7a 45 72 72 4d 73 67 20 3d   char *zErrMsg =
2b720 20 30 3b 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28   0;.    open_db(
2b730 70 2c 20 30 29 3b 0a 20 20 20 20 6d 65 6d 63 70  p, 0);.    memcp
2b740 79 28 26 64 61 74 61 2c 20 70 2c 20 73 69 7a 65  y(&data, p, size
2b750 6f 66 28 64 61 74 61 29 29 3b 0a 20 20 20 20 64  of(data));.    d
2b760 61 74 61 2e 73 68 6f 77 48 65 61 64 65 72 20 3d  ata.showHeader =
2b770 20 30 3b 0a 20 20 20 20 64 61 74 61 2e 63 4d 6f   0;.    data.cMo
2b780 64 65 20 3d 20 64 61 74 61 2e 6d 6f 64 65 20 3d  de = data.mode =
2b790 20 4d 4f 44 45 5f 4c 69 73 74 3b 0a 20 20 20 20   MODE_List;.    
2b7a0 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
2b7b0 28 73 69 7a 65 6f 66 28 64 61 74 61 2e 63 6f 6c  (sizeof(data.col
2b7c0 53 65 70 61 72 61 74 6f 72 29 2c 64 61 74 61 2e  Separator),data.
2b7d0 63 6f 6c 53 65 70 61 72 61 74 6f 72 2c 22 3a 20  colSeparator,": 
2b7e0 22 29 3b 0a 20 20 20 20 64 61 74 61 2e 63 6e 74  ");.    data.cnt
2b7f0 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65   = 0;.    sqlite
2b800 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20 22 53  3_exec(p->db, "S
2b810 45 4c 45 43 54 20 6e 61 6d 65 2c 20 66 69 6c 65  ELECT name, file
2b820 20 46 52 4f 4d 20 70 72 61 67 6d 61 5f 64 61 74   FROM pragma_dat
2b830 61 62 61 73 65 5f 6c 69 73 74 22 2c 0a 20 20 20  abase_list",.   
2b840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 61                ca
2b850 6c 6c 62 61 63 6b 2c 20 26 64 61 74 61 2c 20 26  llback, &data, &
2b860 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 69 66  zErrMsg);.    if
2b870 28 20 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20  ( zErrMsg ){.   
2b880 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73     utf8_printf(s
2b890 74 64 65 72 72 2c 22 45 72 72 6f 72 3a 20 25 73  tderr,"Error: %s
2b8a0 5c 6e 22 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20  \n", zErrMsg);. 
2b8b0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
2b8c0 65 28 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20  e(zErrMsg);.    
2b8d0 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a    rc = 1;.    }.
2b8e0 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63    }else..  if( c
2b8f0 3d 3d 27 64 27 20 26 26 20 6e 3e 3d 33 20 26 26  =='d' && n>=3 &&
2b900 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30   strncmp(azArg[0
2b910 5d 2c 20 22 64 62 63 6f 6e 66 69 67 22 2c 20 6e  ], "dbconfig", n
2b920 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 74 61 74  )==0 ){.    stat
2b930 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20  ic const struct 
2b940 44 62 43 6f 6e 66 69 67 43 68 6f 69 63 65 73 20  DbConfigChoices 
2b950 7b 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61  {const char *zNa
2b960 6d 65 3b 20 69 6e 74 20 6f 70 3b 7d 20 61 44 62  me; int op;} aDb
2b970 43 6f 6e 66 69 67 5b 5d 20 3d 20 7b 0a 20 20 20  Config[] = {.   
2b980 20 20 20 20 20 7b 20 22 65 6e 61 62 6c 65 5f 66       { "enable_f
2b990 6b 65 79 22 2c 20 20 20 20 20 20 53 51 4c 49 54  key",      SQLIT
2b9a0 45 5f 44 42 43 4f 4e 46 49 47 5f 45 4e 41 42 4c  E_DBCONFIG_ENABL
2b9b0 45 5f 46 4b 45 59 20 20 20 20 20 20 20 20 20 20  E_FKEY          
2b9c0 20 20 7d 2c 0a 20 20 20 20 20 20 20 20 7b 20 22    },.        { "
2b9d0 65 6e 61 62 6c 65 5f 74 72 69 67 67 65 72 22 2c  enable_trigger",
2b9e0 20 20 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46     SQLITE_DBCONF
2b9f0 49 47 5f 45 4e 41 42 4c 45 5f 54 52 49 47 47 45  IG_ENABLE_TRIGGE
2ba00 52 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20  R         },.   
2ba10 20 20 20 20 20 7b 20 22 66 74 73 33 5f 74 6f 6b       { "fts3_tok
2ba20 65 6e 69 7a 65 72 22 2c 20 20 20 53 51 4c 49 54  enizer",   SQLIT
2ba30 45 5f 44 42 43 4f 4e 46 49 47 5f 45 4e 41 42 4c  E_DBCONFIG_ENABL
2ba40 45 5f 46 54 53 33 5f 54 4f 4b 45 4e 49 5a 45 52  E_FTS3_TOKENIZER
2ba50 20 20 7d 2c 0a 20 20 20 20 20 20 20 20 7b 20 22    },.        { "
2ba60 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f 6e 22 2c  load_extension",
2ba70 20 20 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46     SQLITE_DBCONF
2ba80 49 47 5f 45 4e 41 42 4c 45 5f 4c 4f 41 44 5f 45  IG_ENABLE_LOAD_E
2ba90 58 54 45 4e 53 49 4f 4e 20 20 7d 2c 0a 20 20 20  XTENSION  },.   
2baa0 20 20 20 20 20 7b 20 22 6e 6f 5f 63 6b 70 74 5f       { "no_ckpt_
2bab0 6f 6e 5f 63 6c 6f 73 65 22 2c 20 53 51 4c 49 54  on_close", SQLIT
2bac0 45 5f 44 42 43 4f 4e 46 49 47 5f 4e 4f 5f 43 4b  E_DBCONFIG_NO_CK
2bad0 50 54 5f 4f 4e 5f 43 4c 4f 53 45 20 20 20 20 20  PT_ON_CLOSE     
2bae0 20 20 7d 2c 0a 20 20 20 20 20 20 20 20 7b 20 22    },.        { "
2baf0 65 6e 61 62 6c 65 5f 71 70 73 67 22 2c 20 20 20  enable_qpsg",   
2bb00 20 20 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46     SQLITE_DBCONF
2bb10 49 47 5f 45 4e 41 42 4c 45 5f 51 50 53 47 20 20  IG_ENABLE_QPSG  
2bb20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
2bb30 20 20 20 20 20 7b 20 22 74 72 69 67 67 65 72 5f       { "trigger_
2bb40 65 71 70 22 2c 20 20 20 20 20 20 53 51 4c 49 54  eqp",      SQLIT
2bb50 45 5f 44 42 43 4f 4e 46 49 47 5f 54 52 49 47 47  E_DBCONFIG_TRIGG
2bb60 45 52 5f 45 51 50 20 20 20 20 20 20 20 20 20 20  ER_EQP          
2bb70 20 20 7d 2c 0a 20 20 20 20 20 20 20 20 7b 20 22    },.        { "
2bb80 72 65 73 65 74 5f 64 61 74 61 62 61 73 65 22 2c  reset_database",
2bb90 20 20 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46     SQLITE_DBCONF
2bba0 49 47 5f 52 45 53 45 54 5f 44 41 54 41 42 41 53  IG_RESET_DATABAS
2bbb0 45 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20  E         },.   
2bbc0 20 7d 3b 0a 20 20 20 20 69 6e 74 20 69 69 2c 20   };.    int ii, 
2bbd0 76 3b 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28 70  v;.    open_db(p
2bbe0 2c 20 30 29 3b 0a 20 20 20 20 66 6f 72 28 69 69  , 0);.    for(ii
2bbf0 3d 30 3b 20 69 69 3c 41 72 72 61 79 53 69 7a 65  =0; ii<ArraySize
2bc00 28 61 44 62 43 6f 6e 66 69 67 29 3b 20 69 69 2b  (aDbConfig); ii+
2bc10 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 41  +){.      if( nA
2bc20 72 67 3e 31 20 26 26 20 73 74 72 63 6d 70 28 61  rg>1 && strcmp(a
2bc30 7a 41 72 67 5b 31 5d 2c 20 61 44 62 43 6f 6e 66  zArg[1], aDbConf
2bc40 69 67 5b 69 69 5d 2e 7a 4e 61 6d 65 29 21 3d 30  ig[ii].zName)!=0
2bc50 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
2bc60 20 20 20 69 66 28 20 6e 41 72 67 3e 3d 33 20 29     if( nArg>=3 )
2bc70 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
2bc80 33 5f 64 62 5f 63 6f 6e 66 69 67 28 70 2d 3e 64  3_db_config(p->d
2bc90 62 2c 20 61 44 62 43 6f 6e 66 69 67 5b 69 69 5d  b, aDbConfig[ii]
2bca0 2e 6f 70 2c 20 62 6f 6f 6c 65 61 6e 56 61 6c 75  .op, booleanValu
2bcb0 65 28 61 7a 41 72 67 5b 32 5d 29 2c 20 30 29 3b  e(azArg[2]), 0);
2bcc0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
2bcd0 71 6c 69 74 65 33 5f 64 62 5f 63 6f 6e 66 69 67  qlite3_db_config
2bce0 28 70 2d 3e 64 62 2c 20 61 44 62 43 6f 6e 66 69  (p->db, aDbConfi
2bcf0 67 5b 69 69 5d 2e 6f 70 2c 20 2d 31 2c 20 26 76  g[ii].op, -1, &v
2bd00 29 3b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72  );.      utf8_pr
2bd10 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 31  intf(p->out, "%1
2bd20 38 73 20 25 73 5c 6e 22 2c 20 61 44 62 43 6f 6e  8s %s\n", aDbCon
2bd30 66 69 67 5b 69 69 5d 2e 7a 4e 61 6d 65 2c 20 76  fig[ii].zName, v
2bd40 20 3f 20 22 6f 6e 22 20 3a 20 22 6f 66 66 22 29   ? "on" : "off")
2bd50 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 41 72 67  ;.      if( nArg
2bd60 3e 31 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  >1 ) break;.    
2bd70 7d 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3e 31  }.    if( nArg>1
2bd80 20 26 26 20 69 69 3d 3d 41 72 72 61 79 53 69 7a   && ii==ArraySiz
2bd90 65 28 61 44 62 43 6f 6e 66 69 67 29 20 29 7b 0a  e(aDbConfig) ){.
2bda0 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
2bdb0 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72  f(stderr, "Error
2bdc0 3a 20 75 6e 6b 6e 6f 77 6e 20 64 62 63 6f 6e 66  : unknown dbconf
2bdd0 69 67 20 5c 22 25 73 5c 22 5c 6e 22 2c 20 61 7a  ig \"%s\"\n", az
2bde0 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20 20 20 75  Arg[1]);.      u
2bdf0 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72  tf8_printf(stder
2be00 72 2c 20 22 45 6e 74 65 72 20 5c 22 2e 64 62 63  r, "Enter \".dbc
2be10 6f 6e 66 69 67 5c 22 20 77 69 74 68 20 6e 6f 20  onfig\" with no 
2be20 61 72 67 75 6d 65 6e 74 73 20 66 6f 72 20 61 20  arguments for a 
2be30 6c 69 73 74 5c 6e 22 29 3b 0a 20 20 20 20 7d 20  list\n");.    } 
2be40 20 20 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66    .  }else..  if
2be50 28 20 63 3d 3d 27 64 27 20 26 26 20 6e 3e 3d 33  ( c=='d' && n>=3
2be60 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72   && strncmp(azAr
2be70 67 5b 30 5d 2c 20 22 64 62 69 6e 66 6f 22 2c 20  g[0], "dbinfo", 
2be80 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20  n)==0 ){.    rc 
2be90 3d 20 73 68 65 6c 6c 5f 64 62 69 6e 66 6f 5f 63  = shell_dbinfo_c
2bea0 6f 6d 6d 61 6e 64 28 70 2c 20 6e 41 72 67 2c 20  ommand(p, nArg, 
2beb0 61 7a 41 72 67 29 3b 0a 20 20 7d 65 6c 73 65 0a  azArg);.  }else.
2bec0 0a 20 20 69 66 28 20 63 3d 3d 27 64 27 20 26 26  .  if( c=='d' &&
2bed0 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30   strncmp(azArg[0
2bee0 5d 2c 20 22 64 75 6d 70 22 2c 20 6e 29 3d 3d 30  ], "dump", n)==0
2bef0 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   ){.    const ch
2bf00 61 72 20 2a 7a 4c 69 6b 65 20 3d 20 30 3b 0a 20  ar *zLike = 0;. 
2bf10 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e     int i;.    in
2bf20 74 20 73 61 76 65 64 53 68 6f 77 48 65 61 64 65  t savedShowHeade
2bf30 72 20 3d 20 70 2d 3e 73 68 6f 77 48 65 61 64 65  r = p->showHeade
2bf40 72 3b 0a 20 20 20 20 53 68 65 6c 6c 43 6c 65 61  r;.    ShellClea
2bf50 72 46 6c 61 67 28 70 2c 20 53 48 46 4c 47 5f 50  rFlag(p, SHFLG_P
2bf60 72 65 73 65 72 76 65 52 6f 77 69 64 7c 53 48 46  reserveRowid|SHF
2bf70 4c 47 5f 4e 65 77 6c 69 6e 65 73 29 3b 0a 20 20  LG_Newlines);.  
2bf80 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 41 72    for(i=1; i<nAr
2bf90 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  g; i++){.      i
2bfa0 66 28 20 61 7a 41 72 67 5b 69 5d 5b 30 5d 3d 3d  f( azArg[i][0]==
2bfb0 27 2d 27 20 29 7b 0a 20 20 20 20 20 20 20 20 63  '-' ){.        c
2bfc0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 61  onst char *z = a
2bfd0 7a 41 72 67 5b 69 5d 2b 31 3b 0a 20 20 20 20 20  zArg[i]+1;.     
2bfe0 20 20 20 69 66 28 20 7a 5b 30 5d 3d 3d 27 2d 27     if( z[0]=='-'
2bff0 20 29 20 7a 2b 2b 3b 0a 20 20 20 20 20 20 20 20   ) z++;.        
2c000 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 22 70 72  if( strcmp(z,"pr
2c010 65 73 65 72 76 65 2d 72 6f 77 69 64 73 22 29 3d  eserve-rowids")=
2c020 3d 30 20 29 7b 0a 23 69 66 64 65 66 20 53 51 4c  =0 ){.#ifdef SQL
2c030 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
2c040 54 41 42 4c 45 0a 20 20 20 20 20 20 20 20 20 20  TABLE.          
2c050 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72  raw_printf(stder
2c060 72 2c 20 22 54 68 65 20 2d 2d 70 72 65 73 65 72  r, "The --preser
2c070 76 65 2d 72 6f 77 69 64 73 20 6f 70 74 69 6f 6e  ve-rowids option
2c080 20 69 73 20 6e 6f 74 20 63 6f 6d 70 61 74 69 62   is not compatib
2c090 6c 65 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  le".            
2c0a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c0b0 20 22 20 77 69 74 68 20 53 51 4c 49 54 45 5f 4f   " with SQLITE_O
2c0c0 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
2c0d0 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20  \n");.          
2c0e0 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  rc = 1;.        
2c0f0 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d    goto meta_comm
2c100 61 6e 64 5f 65 78 69 74 3b 0a 23 65 6c 73 65 0a  and_exit;.#else.
2c110 20 20 20 20 20 20 20 20 20 20 53 68 65 6c 6c 53            ShellS
2c120 65 74 46 6c 61 67 28 70 2c 20 53 48 46 4c 47 5f  etFlag(p, SHFLG_
2c130 50 72 65 73 65 72 76 65 52 6f 77 69 64 29 3b 0a  PreserveRowid);.
2c140 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 7d  #endif.        }
2c150 65 6c 73 65 0a 20 20 20 20 20 20 20 20 69 66 28  else.        if(
2c160 20 73 74 72 63 6d 70 28 7a 2c 22 6e 65 77 6c 69   strcmp(z,"newli
2c170 6e 65 73 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  nes")==0 ){.    
2c180 20 20 20 20 20 20 53 68 65 6c 6c 53 65 74 46 6c        ShellSetFl
2c190 61 67 28 70 2c 20 53 48 46 4c 47 5f 4e 65 77 6c  ag(p, SHFLG_Newl
2c1a0 69 6e 65 73 29 3b 0a 20 20 20 20 20 20 20 20 7d  ines);.        }
2c1b0 65 6c 73 65 0a 20 20 20 20 20 20 20 20 7b 0a 20  else.        {. 
2c1c0 20 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69           raw_pri
2c1d0 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55 6e 6b  ntf(stderr, "Unk
2c1e0 6e 6f 77 6e 20 6f 70 74 69 6f 6e 20 5c 22 25 73  nown option \"%s
2c1f0 5c 22 20 6f 6e 20 5c 22 2e 64 75 6d 70 5c 22 5c  \" on \".dump\"\
2c200 6e 22 2c 20 61 7a 41 72 67 5b 69 5d 29 3b 0a 20  n", azArg[i]);. 
2c210 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b           rc = 1;
2c220 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
2c230 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69  meta_command_exi
2c240 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  t;.        }.   
2c250 20 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 4c 69     }else if( zLi
2c260 6b 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72 61  ke ){.        ra
2c270 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  w_printf(stderr,
2c280 20 22 55 73 61 67 65 3a 20 2e 64 75 6d 70 20 3f   "Usage: .dump ?
2c290 2d 2d 70 72 65 73 65 72 76 65 2d 72 6f 77 69 64  --preserve-rowid
2c2a0 73 3f 20 22 0a 20 20 20 20 20 20 20 20 20 20 20  s? ".           
2c2b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c2c0 22 3f 2d 2d 6e 65 77 6c 69 6e 65 73 3f 20 3f 4c  "?--newlines? ?L
2c2d0 49 4b 45 2d 50 41 54 54 45 52 4e 3f 5c 6e 22 29  IKE-PATTERN?\n")
2c2e0 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 31  ;.        rc = 1
2c2f0 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d  ;.        goto m
2c300 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74  eta_command_exit
2c310 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
2c320 20 20 20 20 20 20 20 7a 4c 69 6b 65 20 3d 20 61         zLike = a
2c330 7a 41 72 67 5b 69 5d 3b 0a 20 20 20 20 20 20 7d  zArg[i];.      }
2c340 0a 20 20 20 20 7d 0a 20 20 20 20 6f 70 65 6e 5f  .    }.    open_
2c350 64 62 28 70 2c 20 30 29 3b 0a 20 20 20 20 2f 2a  db(p, 0);.    /*
2c360 20 57 68 65 6e 20 70 6c 61 79 69 6e 67 20 62 61   When playing ba
2c370 63 6b 20 61 20 22 64 75 6d 70 22 2c 20 74 68 65  ck a "dump", the
2c380 20 63 6f 6e 74 65 6e 74 20 6d 69 67 68 74 20 61   content might a
2c390 70 70 65 61 72 20 69 6e 20 61 6e 20 6f 72 64 65  ppear in an orde
2c3a0 72 0a 20 20 20 20 2a 2a 20 77 68 69 63 68 20 63  r.    ** which c
2c3b0 61 75 73 65 73 20 69 6d 6d 65 64 69 61 74 65 20  auses immediate 
2c3c0 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73  foreign key cons
2c3d0 74 72 61 69 6e 74 73 20 74 6f 20 62 65 20 76 69  traints to be vi
2c3e0 6f 6c 61 74 65 64 2e 0a 20 20 20 20 2a 2a 20 53  olated..    ** S
2c3f0 6f 20 64 69 73 61 62 6c 65 20 66 6f 72 65 69 67  o disable foreig
2c400 6e 2d 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74  n-key constraint
2c410 20 65 6e 66 6f 72 63 65 6d 65 6e 74 20 74 6f 20   enforcement to 
2c420 70 72 65 76 65 6e 74 20 70 72 6f 62 6c 65 6d 73  prevent problems
2c430 2e 20 2a 2f 0a 20 20 20 20 72 61 77 5f 70 72 69  . */.    raw_pri
2c440 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 50 52 41  ntf(p->out, "PRA
2c450 47 4d 41 20 66 6f 72 65 69 67 6e 5f 6b 65 79 73  GMA foreign_keys
2c460 3d 4f 46 46 3b 5c 6e 22 29 3b 0a 20 20 20 20 72  =OFF;\n");.    r
2c470 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  aw_printf(p->out
2c480 2c 20 22 42 45 47 49 4e 20 54 52 41 4e 53 41 43  , "BEGIN TRANSAC
2c490 54 49 4f 4e 3b 5c 6e 22 29 3b 0a 20 20 20 20 70  TION;\n");.    p
2c4a0 2d 3e 77 72 69 74 61 62 6c 65 53 63 68 65 6d 61  ->writableSchema
2c4b0 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 73 68 6f   = 0;.    p->sho
2c4c0 77 48 65 61 64 65 72 20 3d 20 30 3b 0a 20 20 20  wHeader = 0;.   
2c4d0 20 2f 2a 20 53 65 74 20 77 72 69 74 61 62 6c 65   /* Set writable
2c4e0 5f 73 63 68 65 6d 61 3d 4f 4e 20 73 69 6e 63 65  _schema=ON since
2c4f0 20 64 6f 69 6e 67 20 73 6f 20 66 6f 72 63 65 73   doing so forces
2c500 20 53 51 4c 69 74 65 20 74 6f 20 69 6e 69 74 69   SQLite to initi
2c510 61 6c 69 7a 65 0a 20 20 20 20 2a 2a 20 61 73 20  alize.    ** as 
2c520 6d 75 63 68 20 6f 66 20 74 68 65 20 73 63 68 65  much of the sche
2c530 6d 61 20 61 73 20 69 74 20 63 61 6e 20 65 76 65  ma as it can eve
2c540 6e 20 69 66 20 74 68 65 20 73 71 6c 69 74 65 5f  n if the sqlite_
2c550 6d 61 73 74 65 72 20 74 61 62 6c 65 20 69 73 0a  master table is.
2c560 20 20 20 20 2a 2a 20 63 6f 72 72 75 70 74 2e 20      ** corrupt. 
2c570 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 65  */.    sqlite3_e
2c580 78 65 63 28 70 2d 3e 64 62 2c 20 22 53 41 56 45  xec(p->db, "SAVE
2c590 50 4f 49 4e 54 20 64 75 6d 70 3b 20 50 52 41 47  POINT dump; PRAG
2c5a0 4d 41 20 77 72 69 74 61 62 6c 65 5f 73 63 68 65  MA writable_sche
2c5b0 6d 61 3d 4f 4e 22 2c 20 30 2c 20 30 2c 20 30 29  ma=ON", 0, 0, 0)
2c5c0 3b 0a 20 20 20 20 70 2d 3e 6e 45 72 72 20 3d 20  ;.    p->nErr = 
2c5d0 30 3b 0a 20 20 20 20 69 66 28 20 7a 4c 69 6b 65  0;.    if( zLike
2c5e0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 75 6e  ==0 ){.      run
2c5f0 5f 73 63 68 65 6d 61 5f 64 75 6d 70 5f 71 75 65  _schema_dump_que
2c600 72 79 28 70 2c 0a 20 20 20 20 20 20 20 20 22 53  ry(p,.        "S
2c610 45 4c 45 43 54 20 6e 61 6d 65 2c 20 74 79 70 65  ELECT name, type
2c620 2c 20 73 71 6c 20 46 52 4f 4d 20 73 71 6c 69 74  , sql FROM sqlit
2c630 65 5f 6d 61 73 74 65 72 20 22 0a 20 20 20 20 20  e_master ".     
2c640 20 20 20 22 57 48 45 52 45 20 73 71 6c 20 4e 4f     "WHERE sql NO
2c650 54 20 4e 55 4c 4c 20 41 4e 44 20 74 79 70 65 3d  T NULL AND type=
2c660 3d 27 74 61 62 6c 65 27 20 41 4e 44 20 6e 61 6d  ='table' AND nam
2c670 65 21 3d 27 73 71 6c 69 74 65 5f 73 65 71 75 65  e!='sqlite_seque
2c680 6e 63 65 27 22 0a 20 20 20 20 20 20 29 3b 0a 20  nce'".      );. 
2c690 20 20 20 20 20 72 75 6e 5f 73 63 68 65 6d 61 5f       run_schema_
2c6a0 64 75 6d 70 5f 71 75 65 72 79 28 70 2c 0a 20 20  dump_query(p,.  
2c6b0 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 6e 61        "SELECT na
2c6c0 6d 65 2c 20 74 79 70 65 2c 20 73 71 6c 20 46 52  me, type, sql FR
2c6d0 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  OM sqlite_master
2c6e0 20 22 0a 20 20 20 20 20 20 20 20 22 57 48 45 52   ".        "WHER
2c6f0 45 20 6e 61 6d 65 3d 3d 27 73 71 6c 69 74 65 5f  E name=='sqlite_
2c700 73 65 71 75 65 6e 63 65 27 22 0a 20 20 20 20 20  sequence'".     
2c710 20 29 3b 0a 20 20 20 20 20 20 72 75 6e 5f 74 61   );.      run_ta
2c720 62 6c 65 5f 64 75 6d 70 5f 71 75 65 72 79 28 70  ble_dump_query(p
2c730 2c 0a 20 20 20 20 20 20 20 20 22 53 45 4c 45 43  ,.        "SELEC
2c740 54 20 73 71 6c 20 46 52 4f 4d 20 73 71 6c 69 74  T sql FROM sqlit
2c750 65 5f 6d 61 73 74 65 72 20 22 0a 20 20 20 20 20  e_master ".     
2c760 20 20 20 22 57 48 45 52 45 20 73 71 6c 20 4e 4f     "WHERE sql NO
2c770 54 20 4e 55 4c 4c 20 41 4e 44 20 74 79 70 65 20  T NULL AND type 
2c780 49 4e 20 28 27 69 6e 64 65 78 27 2c 27 74 72 69  IN ('index','tri
2c790 67 67 65 72 27 2c 27 76 69 65 77 27 29 22 2c 20  gger','view')", 
2c7a0 30 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d  0.      );.    }
2c7b0 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 61 72  else{.      char
2c7c0 20 2a 7a 53 71 6c 3b 0a 20 20 20 20 20 20 7a 53   *zSql;.      zS
2c7d0 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  ql = sqlite3_mpr
2c7e0 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20 22 53  intf(.        "S
2c7f0 45 4c 45 43 54 20 6e 61 6d 65 2c 20 74 79 70 65  ELECT name, type
2c800 2c 20 73 71 6c 20 46 52 4f 4d 20 73 71 6c 69 74  , sql FROM sqlit
2c810 65 5f 6d 61 73 74 65 72 20 22 0a 20 20 20 20 20  e_master ".     
2c820 20 20 20 22 57 48 45 52 45 20 74 62 6c 5f 6e 61     "WHERE tbl_na
2c830 6d 65 20 4c 49 4b 45 20 25 51 20 41 4e 44 20 74  me LIKE %Q AND t
2c840 79 70 65 3d 3d 27 74 61 62 6c 65 27 22 0a 20 20  ype=='table'".  
2c850 20 20 20 20 20 20 22 20 20 41 4e 44 20 73 71 6c        "  AND sql
2c860 20 4e 4f 54 20 4e 55 4c 4c 22 2c 20 7a 4c 69 6b   NOT NULL", zLik
2c870 65 29 3b 0a 20 20 20 20 20 20 72 75 6e 5f 73 63  e);.      run_sc
2c880 68 65 6d 61 5f 64 75 6d 70 5f 71 75 65 72 79 28  hema_dump_query(
2c890 70 2c 7a 53 71 6c 29 3b 0a 20 20 20 20 20 20 73  p,zSql);.      s
2c8a0 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c  qlite3_free(zSql
2c8b0 29 3b 0a 20 20 20 20 20 20 7a 53 71 6c 20 3d 20  );.      zSql = 
2c8c0 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
2c8d0 0a 20 20 20 20 20 20 20 20 22 53 45 4c 45 43 54  .        "SELECT
2c8e0 20 73 71 6c 20 46 52 4f 4d 20 73 71 6c 69 74 65   sql FROM sqlite
2c8f0 5f 6d 61 73 74 65 72 20 22 0a 20 20 20 20 20 20  _master ".      
2c900 20 20 22 57 48 45 52 45 20 73 71 6c 20 4e 4f 54    "WHERE sql NOT
2c910 20 4e 55 4c 4c 22 0a 20 20 20 20 20 20 20 20 22   NULL".        "
2c920 20 20 41 4e 44 20 74 79 70 65 20 49 4e 20 28 27    AND type IN ('
2c930 69 6e 64 65 78 27 2c 27 74 72 69 67 67 65 72 27  index','trigger'
2c940 2c 27 76 69 65 77 27 29 22 0a 20 20 20 20 20 20  ,'view')".      
2c950 20 20 22 20 20 41 4e 44 20 74 62 6c 5f 6e 61 6d    "  AND tbl_nam
2c960 65 20 4c 49 4b 45 20 25 51 22 2c 20 7a 4c 69 6b  e LIKE %Q", zLik
2c970 65 29 3b 0a 20 20 20 20 20 20 72 75 6e 5f 74 61  e);.      run_ta
2c980 62 6c 65 5f 64 75 6d 70 5f 71 75 65 72 79 28 70  ble_dump_query(p
2c990 2c 20 7a 53 71 6c 2c 20 30 29 3b 0a 20 20 20 20  , zSql, 0);.    
2c9a0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
2c9b0 53 71 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Sql);.    }.    
2c9c0 69 66 28 20 70 2d 3e 77 72 69 74 61 62 6c 65 53  if( p->writableS
2c9d0 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20 20 72  chema ){.      r
2c9e0 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  aw_printf(p->out
2c9f0 2c 20 22 50 52 41 47 4d 41 20 77 72 69 74 61 62  , "PRAGMA writab
2ca00 6c 65 5f 73 63 68 65 6d 61 3d 4f 46 46 3b 5c 6e  le_schema=OFF;\n
2ca10 22 29 3b 0a 20 20 20 20 20 20 70 2d 3e 77 72 69  ");.      p->wri
2ca20 74 61 62 6c 65 53 63 68 65 6d 61 20 3d 20 30 3b  tableSchema = 0;
2ca30 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
2ca40 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20 22  e3_exec(p->db, "
2ca50 50 52 41 47 4d 41 20 77 72 69 74 61 62 6c 65 5f  PRAGMA writable_
2ca60 73 63 68 65 6d 61 3d 4f 46 46 3b 22 2c 20 30 2c  schema=OFF;", 0,
2ca70 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   0, 0);.    sqli
2ca80 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20  te3_exec(p->db, 
2ca90 22 52 45 4c 45 41 53 45 20 64 75 6d 70 3b 22 2c  "RELEASE dump;",
2caa0 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 72   0, 0, 0);.    r
2cab0 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  aw_printf(p->out
2cac0 2c 20 70 2d 3e 6e 45 72 72 20 3f 20 22 52 4f 4c  , p->nErr ? "ROL
2cad0 4c 42 41 43 4b 3b 20 2d 2d 20 64 75 65 20 74 6f  LBACK; -- due to
2cae0 20 65 72 72 6f 72 73 5c 6e 22 20 3a 20 22 43 4f   errors\n" : "CO
2caf0 4d 4d 49 54 3b 5c 6e 22 29 3b 0a 20 20 20 20 70  MMIT;\n");.    p
2cb00 2d 3e 73 68 6f 77 48 65 61 64 65 72 20 3d 20 73  ->showHeader = s
2cb10 61 76 65 64 53 68 6f 77 48 65 61 64 65 72 3b 0a  avedShowHeader;.
2cb20 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63    }else..  if( c
2cb30 3d 3d 27 65 27 20 26 26 20 73 74 72 6e 63 6d 70  =='e' && strncmp
2cb40 28 61 7a 41 72 67 5b 30 5d 2c 20 22 65 63 68 6f  (azArg[0], "echo
2cb50 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ", n)==0 ){.    
2cb60 69 66 28 20 6e 41 72 67 3d 3d 32 20 29 7b 0a 20  if( nArg==2 ){. 
2cb70 20 20 20 20 20 73 65 74 4f 72 43 6c 65 61 72 46       setOrClearF
2cb80 6c 61 67 28 70 2c 20 53 48 46 4c 47 5f 45 63 68  lag(p, SHFLG_Ech
2cb90 6f 2c 20 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20  o, azArg[1]);.  
2cba0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
2cbb0 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  aw_printf(stderr
2cbc0 2c 20 22 55 73 61 67 65 3a 20 2e 65 63 68 6f 20  , "Usage: .echo 
2cbd0 6f 6e 7c 6f 66 66 5c 6e 22 29 3b 0a 20 20 20 20  on|off\n");.    
2cbe0 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a    rc = 1;.    }.
2cbf0 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63    }else..  if( c
2cc00 3d 3d 27 65 27 20 26 26 20 73 74 72 6e 63 6d 70  =='e' && strncmp
2cc10 28 61 7a 41 72 67 5b 30 5d 2c 20 22 65 71 70 22  (azArg[0], "eqp"
2cc20 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69  , n)==0 ){.    i
2cc30 66 28 20 6e 41 72 67 3d 3d 32 20 29 7b 0a 20 20  f( nArg==2 ){.  
2cc40 20 20 20 20 70 2d 3e 61 75 74 6f 45 51 50 74 65      p->autoEQPte
2cc50 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66  st = 0;.      if
2cc60 28 20 73 74 72 63 6d 70 28 61 7a 41 72 67 5b 31  ( strcmp(azArg[1
2cc70 5d 2c 22 66 75 6c 6c 22 29 3d 3d 30 20 29 7b 0a  ],"full")==0 ){.
2cc80 20 20 20 20 20 20 20 20 70 2d 3e 61 75 74 6f 45          p->autoE
2cc90 51 50 20 3d 20 41 55 54 4f 45 51 50 5f 66 75 6c  QP = AUTOEQP_ful
2cca0 6c 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  l;.      }else i
2ccb0 66 28 20 73 74 72 63 6d 70 28 61 7a 41 72 67 5b  f( strcmp(azArg[
2ccc0 31 5d 2c 22 74 72 69 67 67 65 72 22 29 3d 3d 30  1],"trigger")==0
2ccd0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61   ){.        p->a
2cce0 75 74 6f 45 51 50 20 3d 20 41 55 54 4f 45 51 50  utoEQP = AUTOEQP
2ccf0 5f 74 72 69 67 67 65 72 3b 0a 20 20 20 20 20 20  _trigger;.      
2cd00 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
2cd10 28 61 7a 41 72 67 5b 31 5d 2c 22 74 65 73 74 22  (azArg[1],"test"
2cd20 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
2cd30 70 2d 3e 61 75 74 6f 45 51 50 20 3d 20 41 55 54  p->autoEQP = AUT
2cd40 4f 45 51 50 5f 6f 6e 3b 0a 20 20 20 20 20 20 20  OEQP_on;.       
2cd50 20 70 2d 3e 61 75 74 6f 45 51 50 74 65 73 74 20   p->autoEQPtest 
2cd60 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  = 1;.      }else
2cd70 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 75 74  {.        p->aut
2cd80 6f 45 51 50 20 3d 20 28 75 38 29 62 6f 6f 6c 65  oEQP = (u8)boole
2cd90 61 6e 56 61 6c 75 65 28 61 7a 41 72 67 5b 31 5d  anValue(azArg[1]
2cda0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
2cdb0 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 61 77 5f  else{.      raw_
2cdc0 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
2cdd0 55 73 61 67 65 3a 20 2e 65 71 70 20 6f 66 66 7c  Usage: .eqp off|
2cde0 6f 6e 7c 74 72 69 67 67 65 72 7c 66 75 6c 6c 5c  on|trigger|full\
2cdf0 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  n");.      rc = 
2ce00 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  1;.    }.  }else
2ce10 0a 0a 20 20 69 66 28 20 63 3d 3d 27 65 27 20 26  ..  if( c=='e' &
2ce20 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b  & strncmp(azArg[
2ce30 30 5d 2c 20 22 65 78 69 74 22 2c 20 6e 29 3d 3d  0], "exit", n)==
2ce40 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 41 72  0 ){.    if( nAr
2ce50 67 3e 31 20 26 26 20 28 72 63 20 3d 20 28 69 6e  g>1 && (rc = (in
2ce60 74 29 69 6e 74 65 67 65 72 56 61 6c 75 65 28 61  t)integerValue(a
2ce70 7a 41 72 67 5b 31 5d 29 29 21 3d 30 20 29 20 65  zArg[1]))!=0 ) e
2ce80 78 69 74 28 72 63 29 3b 0a 20 20 20 20 72 63 20  xit(rc);.    rc 
2ce90 3d 20 32 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20  = 2;.  }else..  
2cea0 2f 2a 20 54 68 65 20 22 2e 65 78 70 6c 61 69 6e  /* The ".explain
2ceb0 22 20 63 6f 6d 6d 61 6e 64 20 69 73 20 61 75 74  " command is aut
2cec0 6f 6d 61 74 69 63 20 6e 6f 77 2e 20 20 49 74 20  omatic now.  It 
2ced0 69 73 20 6c 61 72 67 65 6c 79 20 70 6f 69 6e 74  is largely point
2cee0 6c 65 73 73 2e 20 20 49 74 0a 20 20 2a 2a 20 72  less.  It.  ** r
2cef0 65 74 61 69 6e 65 64 20 70 75 72 65 6c 79 20 66  etained purely f
2cf00 6f 72 20 62 61 63 6b 77 61 72 64 73 20 63 6f 6d  or backwards com
2cf10 70 61 74 69 62 69 6c 69 74 79 20 2a 2f 0a 20 20  patibility */.  
2cf20 69 66 28 20 63 3d 3d 27 65 27 20 26 26 20 73 74  if( c=='e' && st
2cf30 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20  rncmp(azArg[0], 
2cf40 22 65 78 70 6c 61 69 6e 22 2c 20 6e 29 3d 3d 30  "explain", n)==0
2cf50 20 29 7b 0a 20 20 20 20 69 6e 74 20 76 61 6c 20   ){.    int val 
2cf60 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 6e 41 72  = 1;.    if( nAr
2cf70 67 3e 3d 32 20 29 7b 0a 20 20 20 20 20 20 69 66  g>=2 ){.      if
2cf80 28 20 73 74 72 63 6d 70 28 61 7a 41 72 67 5b 31  ( strcmp(azArg[1
2cf90 5d 2c 22 61 75 74 6f 22 29 3d 3d 30 20 29 7b 0a  ],"auto")==0 ){.
2cfa0 20 20 20 20 20 20 20 20 76 61 6c 20 3d 20 39 39          val = 99
2cfb0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
2cfc0 20 20 20 20 20 20 20 76 61 6c 20 3d 20 20 62 6f         val =  bo
2cfd0 6f 6c 65 61 6e 56 61 6c 75 65 28 61 7a 41 72 67  oleanValue(azArg
2cfe0 5b 31 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  [1]);.      }.  
2cff0 20 20 7d 0a 20 20 20 20 69 66 28 20 76 61 6c 3d    }.    if( val=
2d000 3d 31 20 26 26 20 70 2d 3e 6d 6f 64 65 21 3d 4d  =1 && p->mode!=M
2d010 4f 44 45 5f 45 78 70 6c 61 69 6e 20 29 7b 0a 20  ODE_Explain ){. 
2d020 20 20 20 20 20 70 2d 3e 6e 6f 72 6d 61 6c 4d 6f       p->normalMo
2d030 64 65 20 3d 20 70 2d 3e 6d 6f 64 65 3b 0a 20 20  de = p->mode;.  
2d040 20 20 20 20 70 2d 3e 6d 6f 64 65 20 3d 20 4d 4f      p->mode = MO
2d050 44 45 5f 45 78 70 6c 61 69 6e 3b 0a 20 20 20 20  DE_Explain;.    
2d060 20 20 70 2d 3e 61 75 74 6f 45 78 70 6c 61 69 6e    p->autoExplain
2d070 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20   = 0;.    }else 
2d080 69 66 28 20 76 61 6c 3d 3d 30 20 29 7b 0a 20 20  if( val==0 ){.  
2d090 20 20 20 20 69 66 28 20 70 2d 3e 6d 6f 64 65 3d      if( p->mode=
2d0a0 3d 4d 4f 44 45 5f 45 78 70 6c 61 69 6e 20 29 20  =MODE_Explain ) 
2d0b0 70 2d 3e 6d 6f 64 65 20 3d 20 70 2d 3e 6e 6f 72  p->mode = p->nor
2d0c0 6d 61 6c 4d 6f 64 65 3b 0a 20 20 20 20 20 20 70  malMode;.      p
2d0d0 2d 3e 61 75 74 6f 45 78 70 6c 61 69 6e 20 3d 20  ->autoExplain = 
2d0e0 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  0;.    }else if(
2d0f0 20 76 61 6c 3d 3d 39 39 20 29 7b 0a 20 20 20 20   val==99 ){.    
2d100 20 20 69 66 28 20 70 2d 3e 6d 6f 64 65 3d 3d 4d    if( p->mode==M
2d110 4f 44 45 5f 45 78 70 6c 61 69 6e 20 29 20 70 2d  ODE_Explain ) p-
2d120 3e 6d 6f 64 65 20 3d 20 70 2d 3e 6e 6f 72 6d 61  >mode = p->norma
2d130 6c 4d 6f 64 65 3b 0a 20 20 20 20 20 20 70 2d 3e  lMode;.      p->
2d140 61 75 74 6f 45 78 70 6c 61 69 6e 20 3d 20 31 3b  autoExplain = 1;
2d150 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a  .    }.  }else..
2d160 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
2d170 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
2d180 0a 20 20 69 66 28 20 63 3d 3d 27 65 27 20 26 26  .  if( c=='e' &&
2d190 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30   strncmp(azArg[0
2d1a0 5d 2c 20 22 65 78 70 65 72 74 22 2c 20 6e 29 3d  ], "expert", n)=
2d1b0 3d 30 20 29 7b 0a 20 20 20 20 6f 70 65 6e 5f 64  =0 ){.    open_d
2d1c0 62 28 70 2c 20 30 29 3b 0a 20 20 20 20 65 78 70  b(p, 0);.    exp
2d1d0 65 72 74 44 6f 74 43 6f 6d 6d 61 6e 64 28 70 2c  ertDotCommand(p,
2d1e0 20 61 7a 41 72 67 2c 20 6e 41 72 67 29 3b 0a 20   azArg, nArg);. 
2d1f0 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 0a 20   }else.#endif.. 
2d200 20 69 66 28 20 63 3d 3d 27 66 27 20 26 26 20 73   if( c=='f' && s
2d210 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c  trncmp(azArg[0],
2d220 20 22 66 75 6c 6c 73 63 68 65 6d 61 22 2c 20 6e   "fullschema", n
2d230 29 3d 3d 30 20 29 7b 0a 20 20 20 20 53 68 65 6c  )==0 ){.    Shel
2d240 6c 53 74 61 74 65 20 64 61 74 61 3b 0a 20 20 20  lState data;.   
2d250 20 63 68 61 72 20 2a 7a 45 72 72 4d 73 67 20 3d   char *zErrMsg =
2d260 20 30 3b 0a 20 20 20 20 69 6e 74 20 64 6f 53 74   0;.    int doSt
2d270 61 74 73 20 3d 20 30 3b 0a 20 20 20 20 6d 65 6d  ats = 0;.    mem
2d280 63 70 79 28 26 64 61 74 61 2c 20 70 2c 20 73 69  cpy(&data, p, si
2d290 7a 65 6f 66 28 64 61 74 61 29 29 3b 0a 20 20 20  zeof(data));.   
2d2a0 20 64 61 74 61 2e 73 68 6f 77 48 65 61 64 65 72   data.showHeader
2d2b0 20 3d 20 30 3b 0a 20 20 20 20 64 61 74 61 2e 63   = 0;.    data.c
2d2c0 4d 6f 64 65 20 3d 20 64 61 74 61 2e 6d 6f 64 65  Mode = data.mode
2d2d0 20 3d 20 4d 4f 44 45 5f 53 65 6d 69 3b 0a 20 20   = MODE_Semi;.  
2d2e0 20 20 69 66 28 20 6e 41 72 67 3d 3d 32 20 26 26    if( nArg==2 &&
2d2f0 20 6f 70 74 69 6f 6e 4d 61 74 63 68 28 61 7a 41   optionMatch(azA
2d300 72 67 5b 31 5d 2c 20 22 69 6e 64 65 6e 74 22 29  rg[1], "indent")
2d310 20 29 7b 0a 20 20 20 20 20 20 64 61 74 61 2e 63   ){.      data.c
2d320 4d 6f 64 65 20 3d 20 64 61 74 61 2e 6d 6f 64 65  Mode = data.mode
2d330 20 3d 20 4d 4f 44 45 5f 50 72 65 74 74 79 3b 0a   = MODE_Pretty;.
2d340 20 20 20 20 20 20 6e 41 72 67 20 3d 20 31 3b 0a        nArg = 1;.
2d350 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 41      }.    if( nA
2d360 72 67 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 72  rg!=1 ){.      r
2d370 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  aw_printf(stderr
2d380 2c 20 22 55 73 61 67 65 3a 20 2e 66 75 6c 6c 73  , "Usage: .fulls
2d390 63 68 65 6d 61 20 3f 2d 2d 69 6e 64 65 6e 74 3f  chema ?--indent?
2d3a0 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  \n");.      rc =
2d3b0 20 31 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d   1;.      goto m
2d3c0 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74  eta_command_exit
2d3d0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6f 70 65 6e  ;.    }.    open
2d3e0 5f 64 62 28 70 2c 20 30 29 3b 0a 20 20 20 20 72  _db(p, 0);.    r
2d3f0 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63  c = sqlite3_exec
2d400 28 70 2d 3e 64 62 2c 0a 20 20 20 20 20 20 20 22  (p->db,.       "
2d410 53 45 4c 45 43 54 20 73 71 6c 20 46 52 4f 4d 22  SELECT sql FROM"
2d420 0a 20 20 20 20 20 20 20 22 20 20 28 53 45 4c 45  .       "  (SELE
2d430 43 54 20 73 71 6c 20 73 71 6c 2c 20 74 79 70 65  CT sql sql, type
2d440 20 74 79 70 65 2c 20 74 62 6c 5f 6e 61 6d 65 20   type, tbl_name 
2d450 74 62 6c 5f 6e 61 6d 65 2c 20 6e 61 6d 65 20 6e  tbl_name, name n
2d460 61 6d 65 2c 20 72 6f 77 69 64 20 78 22 0a 20 20  ame, rowid x".  
2d470 20 20 20 20 20 22 20 20 20 20 20 46 52 4f 4d 20       "     FROM 
2d480 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 55 4e  sqlite_master UN
2d490 49 4f 4e 20 41 4c 4c 22 0a 20 20 20 20 20 20 20  ION ALL".       
2d4a0 22 20 20 20 53 45 4c 45 43 54 20 73 71 6c 2c 20  "   SELECT sql, 
2d4b0 74 79 70 65 2c 20 74 62 6c 5f 6e 61 6d 65 2c 20  type, tbl_name, 
2d4c0 6e 61 6d 65 2c 20 72 6f 77 69 64 20 46 52 4f 4d  name, rowid FROM
2d4d0 20 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73   sqlite_temp_mas
2d4e0 74 65 72 29 20 22 0a 20 20 20 20 20 20 20 22 57  ter) ".       "W
2d4f0 48 45 52 45 20 74 79 70 65 21 3d 27 6d 65 74 61  HERE type!='meta
2d500 27 20 41 4e 44 20 73 71 6c 20 4e 4f 54 4e 55 4c  ' AND sql NOTNUL
2d510 4c 20 41 4e 44 20 6e 61 6d 65 20 4e 4f 54 20 4c  L AND name NOT L
2d520 49 4b 45 20 27 73 71 6c 69 74 65 5f 25 27 20 22  IKE 'sqlite_%' "
2d530 0a 20 20 20 20 20 20 20 22 4f 52 44 45 52 20 42  .       "ORDER B
2d540 59 20 72 6f 77 69 64 22 2c 0a 20 20 20 20 20 20  Y rowid",.      
2d550 20 63 61 6c 6c 62 61 63 6b 2c 20 26 64 61 74 61   callback, &data
2d560 2c 20 26 7a 45 72 72 4d 73 67 0a 20 20 20 20 29  , &zErrMsg.    )
2d570 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
2d580 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2d590 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
2d5a0 53 74 6d 74 3b 0a 20 20 20 20 20 20 72 63 20 3d  Stmt;.      rc =
2d5b0 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
2d5c0 5f 76 32 28 70 2d 3e 64 62 2c 0a 20 20 20 20 20  _v2(p->db,.     
2d5d0 20 20 20 20 20 20 20 20 20 20 22 53 45 4c 45 43            "SELEC
2d5e0 54 20 72 6f 77 69 64 20 46 52 4f 4d 20 73 71 6c  T rowid FROM sql
2d5f0 69 74 65 5f 6d 61 73 74 65 72 22 0a 20 20 20 20  ite_master".    
2d600 20 20 20 20 20 20 20 20 20 20 20 22 20 57 48 45             " WHE
2d610 52 45 20 6e 61 6d 65 20 47 4c 4f 42 20 27 73 71  RE name GLOB 'sq
2d620 6c 69 74 65 5f 73 74 61 74 5b 31 33 34 5d 27 22  lite_stat[134]'"
2d630 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2d640 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b   -1, &pStmt, 0);
2d650 0a 20 20 20 20 20 20 64 6f 53 74 61 74 73 20 3d  .      doStats =
2d660 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53   sqlite3_step(pS
2d670 74 6d 74 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57  tmt)==SQLITE_ROW
2d680 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
2d690 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b  finalize(pStmt);
2d6a0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 64  .    }.    if( d
2d6b0 6f 53 74 61 74 73 3d 3d 30 20 29 7b 0a 20 20 20  oStats==0 ){.   
2d6c0 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d     raw_printf(p-
2d6d0 3e 6f 75 74 2c 20 22 2f 2a 20 4e 6f 20 53 54 41  >out, "/* No STA
2d6e0 54 20 74 61 62 6c 65 73 20 61 76 61 69 6c 61 62  T tables availab
2d6f0 6c 65 20 2a 2f 5c 6e 22 29 3b 0a 20 20 20 20 7d  le */\n");.    }
2d700 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 61 77 5f  else{.      raw_
2d710 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
2d720 41 4e 41 4c 59 5a 45 20 73 71 6c 69 74 65 5f 6d  ANALYZE sqlite_m
2d730 61 73 74 65 72 3b 5c 6e 22 29 3b 0a 20 20 20 20  aster;\n");.    
2d740 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70    sqlite3_exec(p
2d750 2d 3e 64 62 2c 20 22 53 45 4c 45 43 54 20 27 41  ->db, "SELECT 'A
2d760 4e 41 4c 59 5a 45 20 73 71 6c 69 74 65 5f 6d 61  NALYZE sqlite_ma
2d770 73 74 65 72 27 22 2c 0a 20 20 20 20 20 20 20 20  ster'",.        
2d780 20 20 20 20 20 20 20 20 20 20 20 63 61 6c 6c 62             callb
2d790 61 63 6b 2c 20 26 64 61 74 61 2c 20 26 7a 45 72  ack, &data, &zEr
2d7a0 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 64 61 74  rMsg);.      dat
2d7b0 61 2e 63 4d 6f 64 65 20 3d 20 64 61 74 61 2e 6d  a.cMode = data.m
2d7c0 6f 64 65 20 3d 20 4d 4f 44 45 5f 49 6e 73 65 72  ode = MODE_Inser
2d7d0 74 3b 0a 20 20 20 20 20 20 64 61 74 61 2e 7a 44  t;.      data.zD
2d7e0 65 73 74 54 61 62 6c 65 20 3d 20 22 73 71 6c 69  estTable = "sqli
2d7f0 74 65 5f 73 74 61 74 31 22 3b 0a 20 20 20 20 20  te_stat1";.     
2d800 20 73 68 65 6c 6c 5f 65 78 65 63 28 26 64 61 74   shell_exec(&dat
2d810 61 2c 20 22 53 45 4c 45 43 54 20 2a 20 46 52 4f  a, "SELECT * FRO
2d820 4d 20 73 71 6c 69 74 65 5f 73 74 61 74 31 22 2c  M sqlite_stat1",
2d830 20 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20   &zErrMsg);.    
2d840 20 20 64 61 74 61 2e 7a 44 65 73 74 54 61 62 6c    data.zDestTabl
2d850 65 20 3d 20 22 73 71 6c 69 74 65 5f 73 74 61 74  e = "sqlite_stat
2d860 33 22 3b 0a 20 20 20 20 20 20 73 68 65 6c 6c 5f  3";.      shell_
2d870 65 78 65 63 28 26 64 61 74 61 2c 20 22 53 45 4c  exec(&data, "SEL
2d880 45 43 54 20 2a 20 46 52 4f 4d 20 73 71 6c 69 74  ECT * FROM sqlit
2d890 65 5f 73 74 61 74 33 22 2c 20 26 7a 45 72 72 4d  e_stat3", &zErrM
2d8a0 73 67 29 3b 0a 20 20 20 20 20 20 64 61 74 61 2e  sg);.      data.
2d8b0 7a 44 65 73 74 54 61 62 6c 65 20 3d 20 22 73 71  zDestTable = "sq
2d8c0 6c 69 74 65 5f 73 74 61 74 34 22 3b 0a 20 20 20  lite_stat4";.   
2d8d0 20 20 20 73 68 65 6c 6c 5f 65 78 65 63 28 26 64     shell_exec(&d
2d8e0 61 74 61 2c 20 22 53 45 4c 45 43 54 20 2a 20 46  ata, "SELECT * F
2d8f0 52 4f 4d 20 73 71 6c 69 74 65 5f 73 74 61 74 34  ROM sqlite_stat4
2d900 22 2c 20 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20  ", &zErrMsg);.  
2d910 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70      raw_printf(p
2d920 2d 3e 6f 75 74 2c 20 22 41 4e 41 4c 59 5a 45 20  ->out, "ANALYZE 
2d930 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 3b 5c 6e  sqlite_master;\n
2d940 22 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  ");.    }.  }els
2d950 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 68 27 20  e..  if( c=='h' 
2d960 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67  && strncmp(azArg
2d970 5b 30 5d 2c 20 22 68 65 61 64 65 72 73 22 2c 20  [0], "headers", 
2d980 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  n)==0 ){.    if(
2d990 20 6e 41 72 67 3d 3d 32 20 29 7b 0a 20 20 20 20   nArg==2 ){.    
2d9a0 20 20 70 2d 3e 73 68 6f 77 48 65 61 64 65 72 20    p->showHeader 
2d9b0 3d 20 62 6f 6f 6c 65 61 6e 56 61 6c 75 65 28 61  = booleanValue(a
2d9c0 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20 7d 65  zArg[1]);.    }e
2d9d0 6c 73 65 7b 0a 20 20 20 20 20 20 72 61 77 5f 70  lse{.      raw_p
2d9e0 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55  rintf(stderr, "U
2d9f0 73 61 67 65 3a 20 2e 68 65 61 64 65 72 73 20 6f  sage: .headers o
2da00 6e 7c 6f 66 66 5c 6e 22 29 3b 0a 20 20 20 20 20  n|off\n");.     
2da10 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20   rc = 1;.    }. 
2da20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d   }else..  if( c=
2da30 3d 27 68 27 20 26 26 20 73 74 72 6e 63 6d 70 28  ='h' && strncmp(
2da40 61 7a 41 72 67 5b 30 5d 2c 20 22 68 65 6c 70 22  azArg[0], "help"
2da50 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 75  , n)==0 ){.    u
2da60 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  tf8_printf(p->ou
2da70 74 2c 20 22 25 73 22 2c 20 7a 48 65 6c 70 29 3b  t, "%s", zHelp);
2da80 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20  .  }else..  if( 
2da90 63 3d 3d 27 69 27 20 26 26 20 73 74 72 6e 63 6d  c=='i' && strncm
2daa0 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 69 6d 70  p(azArg[0], "imp
2dab0 6f 72 74 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20  ort", n)==0 ){. 
2dac0 20 20 20 63 68 61 72 20 2a 7a 54 61 62 6c 65 3b     char *zTable;
2dad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2dae0 2a 20 49 6e 73 65 72 74 20 64 61 74 61 20 69 6e  * Insert data in
2daf0 74 6f 20 74 68 69 73 20 74 61 62 6c 65 20 2a 2f  to this table */
2db00 0a 20 20 20 20 63 68 61 72 20 2a 7a 46 69 6c 65  .    char *zFile
2db10 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2db20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 66 69 6c 65   /* Name of file
2db30 20 74 6f 20 65 78 74 72 61 20 63 6f 6e 74 65 6e   to extra conten
2db40 74 20 66 72 6f 6d 20 2a 2f 0a 20 20 20 20 73 71  t from */.    sq
2db50 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
2db60 74 20 3d 20 4e 55 4c 4c 3b 20 2f 2a 20 41 20 73  t = NULL; /* A s
2db70 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20  tatement */.    
2db80 69 6e 74 20 6e 43 6f 6c 3b 20 20 20 20 20 20 20  int nCol;       
2db90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
2dba0 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
2dbb0 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 2a 2f   in the table */
2dbc0 0a 20 20 20 20 69 6e 74 20 6e 42 79 74 65 3b 20  .    int nByte; 
2dbd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2dbe0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
2dbf0 74 65 73 20 69 6e 20 61 6e 20 53 51 4c 20 73 74  tes in an SQL st
2dc00 72 69 6e 67 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ring */.    int 
2dc10 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20  i, j;           
2dc20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
2dc30 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 20 20  counters */.    
2dc40 69 6e 74 20 6e 65 65 64 43 6f 6d 6d 69 74 3b 20  int needCommit; 
2dc50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2dc60 72 75 65 20 74 6f 20 43 4f 4d 4d 49 54 20 6f 72  rue to COMMIT or
2dc70 20 52 4f 4c 4c 42 41 43 4b 20 61 74 20 65 6e 64   ROLLBACK at end
2dc80 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 53 65 70   */.    int nSep
2dc90 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2dca0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
2dcb0 20 62 79 74 65 73 20 69 6e 20 70 2d 3e 63 6f 6c   bytes in p->col
2dcc0 53 65 70 61 72 61 74 6f 72 5b 5d 20 2a 2f 0a 20  Separator[] */. 
2dcd0 20 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b 20 20     char *zSql;  
2dce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2dcf0 2a 20 41 6e 20 53 51 4c 20 73 74 61 74 65 6d 65  * An SQL stateme
2dd00 6e 74 20 2a 2f 0a 20 20 20 20 49 6d 70 6f 72 74  nt */.    Import
2dd10 43 74 78 20 73 43 74 78 3b 20 20 20 20 20 20 20  Ctx sCtx;       
2dd20 20 20 20 20 20 20 2f 2a 20 52 65 61 64 65 72 20        /* Reader 
2dd30 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 20 20 63  context */.    c
2dd40 68 61 72 20 2a 28 53 51 4c 49 54 45 5f 43 44 45  har *(SQLITE_CDE
2dd50 43 4c 20 2a 78 52 65 61 64 29 28 49 6d 70 6f 72  CL *xRead)(Impor
2dd60 74 43 74 78 2a 29 3b 20 2f 2a 20 46 75 6e 63 20  tCtx*); /* Func 
2dd70 74 6f 20 72 65 61 64 20 6f 6e 65 20 76 61 6c 75  to read one valu
2dd80 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 28 53 51  e */.    int (SQ
2dd90 4c 49 54 45 5f 43 44 45 43 4c 20 2a 78 43 6c 6f  LITE_CDECL *xClo
2dda0 73 65 72 29 28 46 49 4c 45 2a 29 3b 20 20 20 20  ser)(FILE*);    
2ddb0 20 20 2f 2a 20 46 75 6e 63 20 74 6f 20 63 6c 6f    /* Func to clo
2ddc0 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 20 20  se file */..    
2ddd0 69 66 28 20 6e 41 72 67 21 3d 33 20 29 7b 0a 20  if( nArg!=3 ){. 
2dde0 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
2ddf0 73 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20  stderr, "Usage: 
2de00 2e 69 6d 70 6f 72 74 20 46 49 4c 45 20 54 41 42  .import FILE TAB
2de10 4c 45 5c 6e 22 29 3b 0a 20 20 20 20 20 20 67 6f  LE\n");.      go
2de20 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f  to meta_command_
2de30 65 78 69 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  exit;.    }.    
2de40 7a 46 69 6c 65 20 3d 20 61 7a 41 72 67 5b 31 5d  zFile = azArg[1]
2de50 3b 0a 20 20 20 20 7a 54 61 62 6c 65 20 3d 20 61  ;.    zTable = a
2de60 7a 41 72 67 5b 32 5d 3b 0a 20 20 20 20 73 65 65  zArg[2];.    see
2de70 6e 49 6e 74 65 72 72 75 70 74 20 3d 20 30 3b 0a  nInterrupt = 0;.
2de80 20 20 20 20 6d 65 6d 73 65 74 28 26 73 43 74 78      memset(&sCtx
2de90 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 43 74 78  , 0, sizeof(sCtx
2dea0 29 29 3b 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28  ));.    open_db(
2deb0 70 2c 20 30 29 3b 0a 20 20 20 20 6e 53 65 70 20  p, 0);.    nSep 
2dec0 3d 20 73 74 72 6c 65 6e 33 30 28 70 2d 3e 63 6f  = strlen30(p->co
2ded0 6c 53 65 70 61 72 61 74 6f 72 29 3b 0a 20 20 20  lSeparator);.   
2dee0 20 69 66 28 20 6e 53 65 70 3d 3d 30 20 29 7b 0a   if( nSep==0 ){.
2def0 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
2df00 28 73 74 64 65 72 72 2c 0a 20 20 20 20 20 20 20  (stderr,.       
2df10 20 20 20 20 20 20 20 20 20 20 22 45 72 72 6f 72            "Error
2df20 3a 20 6e 6f 6e 2d 6e 75 6c 6c 20 63 6f 6c 75 6d  : non-null colum
2df30 6e 20 73 65 70 61 72 61 74 6f 72 20 72 65 71 75  n separator requ
2df40 69 72 65 64 20 66 6f 72 20 69 6d 70 6f 72 74 5c  ired for import\
2df50 6e 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  n");.      retur
2df60 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  n 1;.    }.    i
2df70 66 28 20 6e 53 65 70 3e 31 20 29 7b 0a 20 20 20  f( nSep>1 ){.   
2df80 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74     raw_printf(st
2df90 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 6d 75  derr, "Error: mu
2dfa0 6c 74 69 2d 63 68 61 72 61 63 74 65 72 20 63 6f  lti-character co
2dfb0 6c 75 6d 6e 20 73 65 70 61 72 61 74 6f 72 73 20  lumn separators 
2dfc0 6e 6f 74 20 61 6c 6c 6f 77 65 64 22 0a 20 20 20  not allowed".   
2dfd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2dfe0 20 20 20 22 20 66 6f 72 20 69 6d 70 6f 72 74 5c     " for import\
2dff0 6e 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  n");.      retur
2e000 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e  n 1;.    }.    n
2e010 53 65 70 20 3d 20 73 74 72 6c 65 6e 33 30 28 70  Sep = strlen30(p
2e020 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 29 3b  ->rowSeparator);
2e030 0a 20 20 20 20 69 66 28 20 6e 53 65 70 3d 3d 30  .    if( nSep==0
2e040 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72   ){.      raw_pr
2e050 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72  intf(stderr, "Er
2e060 72 6f 72 3a 20 6e 6f 6e 2d 6e 75 6c 6c 20 72 6f  ror: non-null ro
2e070 77 20 73 65 70 61 72 61 74 6f 72 20 72 65 71 75  w separator requ
2e080 69 72 65 64 20 66 6f 72 20 69 6d 70 6f 72 74 5c  ired for import\
2e090 6e 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  n");.      retur
2e0a0 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  n 1;.    }.    i
2e0b0 66 28 20 6e 53 65 70 3d 3d 32 20 26 26 20 70 2d  f( nSep==2 && p-
2e0c0 3e 6d 6f 64 65 3d 3d 4d 4f 44 45 5f 43 73 76 20  >mode==MODE_Csv 
2e0d0 26 26 20 73 74 72 63 6d 70 28 70 2d 3e 72 6f 77  && strcmp(p->row
2e0e0 53 65 70 61 72 61 74 6f 72 2c 20 53 45 50 5f 43  Separator, SEP_C
2e0f0 72 4c 66 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  rLf)==0 ){.     
2e100 20 2f 2a 20 57 68 65 6e 20 69 6d 70 6f 72 74 69   /* When importi
2e110 6e 67 20 43 53 56 20 28 6f 6e 6c 79 29 2c 20 69  ng CSV (only), i
2e120 66 20 74 68 65 20 72 6f 77 20 73 65 70 61 72 61  f the row separa
2e130 74 6f 72 20 69 73 20 73 65 74 20 74 6f 20 74 68  tor is set to th
2e140 65 0a 20 20 20 20 20 20 2a 2a 20 64 65 66 61 75  e.      ** defau
2e150 6c 74 20 6f 75 74 70 75 74 20 72 6f 77 20 73 65  lt output row se
2e160 70 61 72 61 74 6f 72 2c 20 63 68 61 6e 67 65 20  parator, change 
2e170 69 74 20 74 6f 20 74 68 65 20 64 65 66 61 75 6c  it to the defaul
2e180 74 20 69 6e 70 75 74 0a 20 20 20 20 20 20 2a 2a  t input.      **
2e190 20 72 6f 77 20 73 65 70 61 72 61 74 6f 72 2e 20   row separator. 
2e1a0 20 54 68 69 73 20 61 76 6f 69 64 73 20 68 61 76   This avoids hav
2e1b0 69 6e 67 20 74 6f 20 6d 61 69 6e 74 61 69 6e 20  ing to maintain 
2e1c0 64 69 66 66 65 72 65 6e 74 20 69 6e 70 75 74 0a  different input.
2e1d0 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 6f 75 74        ** and out
2e1e0 70 75 74 20 72 6f 77 20 73 65 70 61 72 61 74 6f  put row separato
2e1f0 72 73 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c  rs. */.      sql
2e200 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
2e210 7a 65 6f 66 28 70 2d 3e 72 6f 77 53 65 70 61 72  zeof(p->rowSepar
2e220 61 74 6f 72 29 2c 20 70 2d 3e 72 6f 77 53 65 70  ator), p->rowSep
2e230 61 72 61 74 6f 72 2c 20 53 45 50 5f 52 6f 77 29  arator, SEP_Row)
2e240 3b 0a 20 20 20 20 20 20 6e 53 65 70 20 3d 20 73  ;.      nSep = s
2e250 74 72 6c 65 6e 33 30 28 70 2d 3e 72 6f 77 53 65  trlen30(p->rowSe
2e260 70 61 72 61 74 6f 72 29 3b 0a 20 20 20 20 7d 0a  parator);.    }.
2e270 20 20 20 20 69 66 28 20 6e 53 65 70 3e 31 20 29      if( nSep>1 )
2e280 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e  {.      raw_prin
2e290 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f  tf(stderr, "Erro
2e2a0 72 3a 20 6d 75 6c 74 69 2d 63 68 61 72 61 63 74  r: multi-charact
2e2b0 65 72 20 72 6f 77 20 73 65 70 61 72 61 74 6f 72  er row separator
2e2c0 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 22 0a 20  s not allowed". 
2e2d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e2e0 20 20 20 20 20 22 20 66 6f 72 20 69 6d 70 6f 72       " for impor
2e2f0 74 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 65 74  t\n");.      ret
2e300 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 1;.    }.   
2e310 20 73 43 74 78 2e 7a 46 69 6c 65 20 3d 20 7a 46   sCtx.zFile = zF
2e320 69 6c 65 3b 0a 20 20 20 20 73 43 74 78 2e 6e 4c  ile;.    sCtx.nL
2e330 69 6e 65 20 3d 20 31 3b 0a 20 20 20 20 69 66 28  ine = 1;.    if(
2e340 20 73 43 74 78 2e 7a 46 69 6c 65 5b 30 5d 3d 3d   sCtx.zFile[0]==
2e350 27 7c 27 20 29 7b 0a 23 69 66 64 65 66 20 53 51  '|' ){.#ifdef SQ
2e360 4c 49 54 45 5f 4f 4d 49 54 5f 50 4f 50 45 4e 0a  LITE_OMIT_POPEN.
2e370 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
2e380 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a  (stderr, "Error:
2e390 20 70 69 70 65 73 20 61 72 65 20 6e 6f 74 20 73   pipes are not s
2e3a0 75 70 70 6f 72 74 65 64 20 69 6e 20 74 68 69 73  upported in this
2e3b0 20 4f 53 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72   OS\n");.      r
2e3c0 65 74 75 72 6e 20 31 3b 0a 23 65 6c 73 65 0a 20  eturn 1;.#else. 
2e3d0 20 20 20 20 20 73 43 74 78 2e 69 6e 20 3d 20 70       sCtx.in = p
2e3e0 6f 70 65 6e 28 73 43 74 78 2e 7a 46 69 6c 65 2b  open(sCtx.zFile+
2e3f0 31 2c 20 22 72 22 29 3b 0a 20 20 20 20 20 20 73  1, "r");.      s
2e400 43 74 78 2e 7a 46 69 6c 65 20 3d 20 22 3c 70 69  Ctx.zFile = "<pi
2e410 70 65 3e 22 3b 0a 20 20 20 20 20 20 78 43 6c 6f  pe>";.      xClo
2e420 73 65 72 20 3d 20 70 63 6c 6f 73 65 3b 0a 23 65  ser = pclose;.#e
2e430 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ndif.    }else{.
2e440 20 20 20 20 20 20 73 43 74 78 2e 69 6e 20 3d 20        sCtx.in = 
2e450 66 6f 70 65 6e 28 73 43 74 78 2e 7a 46 69 6c 65  fopen(sCtx.zFile
2e460 2c 20 22 72 62 22 29 3b 0a 20 20 20 20 20 20 78  , "rb");.      x
2e470 43 6c 6f 73 65 72 20 3d 20 66 63 6c 6f 73 65 3b  Closer = fclose;
2e480 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
2e490 2d 3e 6d 6f 64 65 3d 3d 4d 4f 44 45 5f 41 73 63  ->mode==MODE_Asc
2e4a0 69 69 20 29 7b 0a 20 20 20 20 20 20 78 52 65 61  ii ){.      xRea
2e4b0 64 20 3d 20 61 73 63 69 69 5f 72 65 61 64 5f 6f  d = ascii_read_o
2e4c0 6e 65 5f 66 69 65 6c 64 3b 0a 20 20 20 20 7d 65  ne_field;.    }e
2e4d0 6c 73 65 7b 0a 20 20 20 20 20 20 78 52 65 61 64  lse{.      xRead
2e4e0 20 3d 20 63 73 76 5f 72 65 61 64 5f 6f 6e 65 5f   = csv_read_one_
2e4f0 66 69 65 6c 64 3b 0a 20 20 20 20 7d 0a 20 20 20  field;.    }.   
2e500 20 69 66 28 20 73 43 74 78 2e 69 6e 3d 3d 30 20   if( sCtx.in==0 
2e510 29 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72  ){.      utf8_pr
2e520 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72  intf(stderr, "Er
2e530 72 6f 72 3a 20 63 61 6e 6e 6f 74 20 6f 70 65 6e  ror: cannot open
2e540 20 5c 22 25 73 5c 22 5c 6e 22 2c 20 7a 46 69 6c   \"%s\"\n", zFil
2e550 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  e);.      return
2e560 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 43   1;.    }.    sC
2e570 74 78 2e 63 43 6f 6c 53 65 70 20 3d 20 70 2d 3e  tx.cColSep = p->
2e580 63 6f 6c 53 65 70 61 72 61 74 6f 72 5b 30 5d 3b  colSeparator[0];
2e590 0a 20 20 20 20 73 43 74 78 2e 63 52 6f 77 53 65  .    sCtx.cRowSe
2e5a0 70 20 3d 20 70 2d 3e 72 6f 77 53 65 70 61 72 61  p = p->rowSepara
2e5b0 74 6f 72 5b 30 5d 3b 0a 20 20 20 20 7a 53 71 6c  tor[0];.    zSql
2e5c0 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
2e5d0 74 66 28 22 53 45 4c 45 43 54 20 2a 20 46 52 4f  tf("SELECT * FRO
2e5e0 4d 20 25 73 22 2c 20 7a 54 61 62 6c 65 29 3b 0a  M %s", zTable);.
2e5f0 20 20 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20      if( zSql==0 
2e600 29 7b 0a 20 20 20 20 20 20 78 43 6c 6f 73 65 72  ){.      xCloser
2e610 28 73 43 74 78 2e 69 6e 29 3b 0a 20 20 20 20 20  (sCtx.in);.     
2e620 20 73 68 65 6c 6c 5f 6f 75 74 5f 6f 66 5f 6d 65   shell_out_of_me
2e630 6d 6f 72 79 28 29 3b 0a 20 20 20 20 7d 0a 20 20  mory();.    }.  
2e640 20 20 6e 42 79 74 65 20 3d 20 73 74 72 6c 65 6e    nByte = strlen
2e650 33 30 28 7a 53 71 6c 29 3b 0a 20 20 20 20 72 63  30(zSql);.    rc
2e660 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61   = sqlite3_prepa
2e670 72 65 5f 76 32 28 70 2d 3e 64 62 2c 20 7a 53 71  re_v2(p->db, zSq
2e680 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30  l, -1, &pStmt, 0
2e690 29 3b 0a 20 20 20 20 69 6d 70 6f 72 74 5f 61 70  );.    import_ap
2e6a0 70 65 6e 64 5f 63 68 61 72 28 26 73 43 74 78 2c  pend_char(&sCtx,
2e6b0 20 30 29 3b 20 20 20 20 2f 2a 20 54 6f 20 65 6e   0);    /* To en
2e6c0 73 75 72 65 20 73 43 74 78 2e 7a 20 69 73 20 61  sure sCtx.z is a
2e6d0 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a 20 20 20 20  llocated */.    
2e6e0 69 66 28 20 72 63 20 26 26 20 73 71 6c 69 74 65  if( rc && sqlite
2e6f0 33 5f 73 74 72 67 6c 6f 62 28 22 6e 6f 20 73 75  3_strglob("no su
2e700 63 68 20 74 61 62 6c 65 3a 20 2a 22 2c 20 73 71  ch table: *", sq
2e710 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 2d 3e  lite3_errmsg(p->
2e720 64 62 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  db))==0 ){.     
2e730 20 63 68 61 72 20 2a 7a 43 72 65 61 74 65 20 3d   char *zCreate =
2e740 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
2e750 28 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 25  ("CREATE TABLE %
2e760 73 22 2c 20 7a 54 61 62 6c 65 29 3b 0a 20 20 20  s", zTable);.   
2e770 20 20 20 63 68 61 72 20 63 53 65 70 20 3d 20 27     char cSep = '
2e780 28 27 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28  (';.      while(
2e790 20 78 52 65 61 64 28 26 73 43 74 78 29 20 29 7b   xRead(&sCtx) ){
2e7a0 0a 20 20 20 20 20 20 20 20 7a 43 72 65 61 74 65  .        zCreate
2e7b0 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
2e7c0 74 66 28 22 25 7a 25 63 5c 6e 20 20 5c 22 25 77  tf("%z%c\n  \"%w
2e7d0 5c 22 20 54 45 58 54 22 2c 20 7a 43 72 65 61 74  \" TEXT", zCreat
2e7e0 65 2c 20 63 53 65 70 2c 20 73 43 74 78 2e 7a 29  e, cSep, sCtx.z)
2e7f0 3b 0a 20 20 20 20 20 20 20 20 63 53 65 70 20 3d  ;.        cSep =
2e800 20 27 2c 27 3b 0a 20 20 20 20 20 20 20 20 69 66   ',';.        if
2e810 28 20 73 43 74 78 2e 63 54 65 72 6d 21 3d 73 43  ( sCtx.cTerm!=sC
2e820 74 78 2e 63 43 6f 6c 53 65 70 20 29 20 62 72 65  tx.cColSep ) bre
2e830 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
2e840 20 20 69 66 28 20 63 53 65 70 3d 3d 27 28 27 20    if( cSep=='(' 
2e850 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
2e860 65 33 5f 66 72 65 65 28 7a 43 72 65 61 74 65 29  e3_free(zCreate)
2e870 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
2e880 33 5f 66 72 65 65 28 73 43 74 78 2e 7a 29 3b 0a  3_free(sCtx.z);.
2e890 20 20 20 20 20 20 20 20 78 43 6c 6f 73 65 72 28          xCloser(
2e8a0 73 43 74 78 2e 69 6e 29 3b 0a 20 20 20 20 20 20  sCtx.in);.      
2e8b0 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74    utf8_printf(st
2e8c0 64 65 72 72 2c 22 25 73 3a 20 65 6d 70 74 79 20  derr,"%s: empty 
2e8d0 66 69 6c 65 5c 6e 22 2c 20 73 43 74 78 2e 7a 46  file\n", sCtx.zF
2e8e0 69 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65  ile);.        re
2e8f0 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a  turn 1;.      }.
2e900 20 20 20 20 20 20 7a 43 72 65 61 74 65 20 3d 20        zCreate = 
2e910 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
2e920 22 25 7a 5c 6e 29 22 2c 20 7a 43 72 65 61 74 65  "%z\n)", zCreate
2e930 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
2e940 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62  lite3_exec(p->db
2e950 2c 20 7a 43 72 65 61 74 65 2c 20 30 2c 20 30 2c  , zCreate, 0, 0,
2e960 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
2e970 65 33 5f 66 72 65 65 28 7a 43 72 65 61 74 65 29  e3_free(zCreate)
2e980 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
2e990 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70  {.        utf8_p
2e9a0 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 43  rintf(stderr, "C
2e9b0 52 45 41 54 45 20 54 41 42 4c 45 20 25 73 28 2e  REATE TABLE %s(.
2e9c0 2e 2e 29 20 66 61 69 6c 65 64 3a 20 25 73 5c 6e  ..) failed: %s\n
2e9d0 22 2c 20 7a 54 61 62 6c 65 2c 0a 20 20 20 20 20  ", zTable,.     
2e9e0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
2e9f0 65 33 5f 65 72 72 6d 73 67 28 70 2d 3e 64 62 29  e3_errmsg(p->db)
2ea00 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
2ea10 65 33 5f 66 72 65 65 28 73 43 74 78 2e 7a 29 3b  e3_free(sCtx.z);
2ea20 0a 20 20 20 20 20 20 20 20 78 43 6c 6f 73 65 72  .        xCloser
2ea30 28 73 43 74 78 2e 69 6e 29 3b 0a 20 20 20 20 20  (sCtx.in);.     
2ea40 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
2ea50 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20     }.      rc = 
2ea60 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f  sqlite3_prepare_
2ea70 76 32 28 70 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20  v2(p->db, zSql, 
2ea80 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a  -1, &pStmt, 0);.
2ea90 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
2eaa0 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20  3_free(zSql);.  
2eab0 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
2eac0 20 20 69 66 20 28 70 53 74 6d 74 29 20 73 71 6c    if (pStmt) sql
2ead0 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53  ite3_finalize(pS
2eae0 74 6d 74 29 3b 0a 20 20 20 20 20 20 75 74 66 38  tmt);.      utf8
2eaf0 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22  _printf(stderr,"
2eb00 45 72 72 6f 72 3a 20 25 73 5c 6e 22 2c 20 73 71  Error: %s\n", sq
2eb10 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 2d 3e  lite3_errmsg(p->
2eb20 64 62 29 29 3b 0a 20 20 20 20 20 20 78 43 6c 6f  db));.      xClo
2eb30 73 65 72 28 73 43 74 78 2e 69 6e 29 3b 0a 20 20  ser(sCtx.in);.  
2eb40 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
2eb50 20 20 7d 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 73    }.    nCol = s
2eb60 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f  qlite3_column_co
2eb70 75 6e 74 28 70 53 74 6d 74 29 3b 0a 20 20 20 20  unt(pStmt);.    
2eb80 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
2eb90 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 70 53 74  (pStmt);.    pSt
2eba0 6d 74 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  mt = 0;.    if( 
2ebb0 6e 43 6f 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e  nCol==0 ) return
2ebc0 20 30 3b 20 2f 2a 20 6e 6f 20 63 6f 6c 75 6d 6e   0; /* no column
2ebd0 73 2c 20 6e 6f 20 65 72 72 6f 72 20 2a 2f 0a 20  s, no error */. 
2ebe0 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65     zSql = sqlite
2ebf0 33 5f 6d 61 6c 6c 6f 63 36 34 28 20 6e 42 79 74  3_malloc64( nByt
2ec00 65 2a 32 20 2b 20 32 30 20 2b 20 6e 43 6f 6c 2a  e*2 + 20 + nCol*
2ec10 32 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 53 71  2 );.    if( zSq
2ec20 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 78 43  l==0 ){.      xC
2ec30 6c 6f 73 65 72 28 73 43 74 78 2e 69 6e 29 3b 0a  loser(sCtx.in);.
2ec40 20 20 20 20 20 20 73 68 65 6c 6c 5f 6f 75 74 5f        shell_out_
2ec50 6f 66 5f 6d 65 6d 6f 72 79 28 29 3b 0a 20 20 20  of_memory();.   
2ec60 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73   }.    sqlite3_s
2ec70 6e 70 72 69 6e 74 66 28 6e 42 79 74 65 2b 32 30  nprintf(nByte+20
2ec80 2c 20 7a 53 71 6c 2c 20 22 49 4e 53 45 52 54 20  , zSql, "INSERT 
2ec90 49 4e 54 4f 20 5c 22 25 77 5c 22 20 56 41 4c 55  INTO \"%w\" VALU
2eca0 45 53 28 3f 22 2c 20 7a 54 61 62 6c 65 29 3b 0a  ES(?", zTable);.
2ecb0 20 20 20 20 6a 20 3d 20 73 74 72 6c 65 6e 33 30      j = strlen30
2ecc0 28 7a 53 71 6c 29 3b 0a 20 20 20 20 66 6f 72 28  (zSql);.    for(
2ecd0 69 3d 31 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b  i=1; i<nCol; i++
2ece0 29 7b 0a 20 20 20 20 20 20 7a 53 71 6c 5b 6a 2b  ){.      zSql[j+
2ecf0 2b 5d 20 3d 20 27 2c 27 3b 0a 20 20 20 20 20 20  +] = ',';.      
2ed00 7a 53 71 6c 5b 6a 2b 2b 5d 20 3d 20 27 3f 27 3b  zSql[j++] = '?';
2ed10 0a 20 20 20 20 7d 0a 20 20 20 20 7a 53 71 6c 5b  .    }.    zSql[
2ed20 6a 2b 2b 5d 20 3d 20 27 29 27 3b 0a 20 20 20 20  j++] = ')';.    
2ed30 7a 53 71 6c 5b 6a 5d 20 3d 20 30 3b 0a 20 20 20  zSql[j] = 0;.   
2ed40 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72   rc = sqlite3_pr
2ed50 65 70 61 72 65 5f 76 32 28 70 2d 3e 64 62 2c 20  epare_v2(p->db, 
2ed60 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74  zSql, -1, &pStmt
2ed70 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
2ed80 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20  3_free(zSql);.  
2ed90 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
2eda0 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74    utf8_printf(st
2edb0 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 25 73  derr, "Error: %s
2edc0 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72  \n", sqlite3_err
2edd0 6d 73 67 28 70 2d 3e 64 62 29 29 3b 0a 20 20 20  msg(p->db));.   
2ede0 20 20 20 69 66 20 28 70 53 74 6d 74 29 20 73 71     if (pStmt) sq
2edf0 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
2ee00 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 78 43 6c  Stmt);.      xCl
2ee10 6f 73 65 72 28 73 43 74 78 2e 69 6e 29 3b 0a 20  oser(sCtx.in);. 
2ee20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
2ee30 20 20 20 7d 0a 20 20 20 20 6e 65 65 64 43 6f 6d     }.    needCom
2ee40 6d 69 74 20 3d 20 73 71 6c 69 74 65 33 5f 67 65  mit = sqlite3_ge
2ee50 74 5f 61 75 74 6f 63 6f 6d 6d 69 74 28 70 2d 3e  t_autocommit(p->
2ee60 64 62 29 3b 0a 20 20 20 20 69 66 28 20 6e 65 65  db);.    if( nee
2ee70 64 43 6f 6d 6d 69 74 20 29 20 73 71 6c 69 74 65  dCommit ) sqlite
2ee80 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20 22 42  3_exec(p->db, "B
2ee90 45 47 49 4e 22 2c 20 30 2c 20 30 2c 20 30 29 3b  EGIN", 0, 0, 0);
2eea0 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 69  .    do{.      i
2eeb0 6e 74 20 73 74 61 72 74 4c 69 6e 65 20 3d 20 73  nt startLine = s
2eec0 43 74 78 2e 6e 4c 69 6e 65 3b 0a 20 20 20 20 20  Ctx.nLine;.     
2eed0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c   for(i=0; i<nCol
2eee0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
2eef0 63 68 61 72 20 2a 7a 20 3d 20 78 52 65 61 64 28  char *z = xRead(
2ef00 26 73 43 74 78 29 3b 0a 20 20 20 20 20 20 20 20  &sCtx);.        
2ef10 2f 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 44 69  /*.        ** Di
2ef20 64 20 77 65 20 72 65 61 63 68 20 65 6e 64 2d 6f  d we reach end-o
2ef30 66 2d 66 69 6c 65 20 62 65 66 6f 72 65 20 66 69  f-file before fi
2ef40 6e 64 69 6e 67 20 61 6e 79 20 63 6f 6c 75 6d 6e  nding any column
2ef50 73 3f 0a 20 20 20 20 20 20 20 20 2a 2a 20 49 66  s?.        ** If
2ef60 20 73 6f 2c 20 73 74 6f 70 20 69 6e 73 74 65 61   so, stop instea
2ef70 64 20 6f 66 20 4e 55 4c 4c 20 66 69 6c 6c 69 6e  d of NULL fillin
2ef80 67 20 74 68 65 20 72 65 6d 61 69 6e 69 6e 67 20  g the remaining 
2ef90 63 6f 6c 75 6d 6e 73 2e 0a 20 20 20 20 20 20 20  columns..       
2efa0 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
2efb0 7a 3d 3d 30 20 26 26 20 69 3d 3d 30 20 29 20 62  z==0 && i==0 ) b
2efc0 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 2f 2a  reak;.        /*
2efd0 0a 20 20 20 20 20 20 20 20 2a 2a 20 44 69 64 20  .        ** Did 
2efe0 77 65 20 72 65 61 63 68 20 65 6e 64 2d 6f 66 2d  we reach end-of-
2eff0 66 69 6c 65 20 4f 52 20 65 6e 64 2d 6f 66 2d 6c  file OR end-of-l
2f000 69 6e 65 20 62 65 66 6f 72 65 20 66 69 6e 64 69  ine before findi
2f010 6e 67 20 61 6e 79 0a 20 20 20 20 20 20 20 20 2a  ng any.        *
2f020 2a 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 41 53 43  * columns in ASC
2f030 49 49 20 6d 6f 64 65 3f 20 20 49 66 20 73 6f 2c  II mode?  If so,
2f040 20 73 74 6f 70 20 69 6e 73 74 65 61 64 20 6f 66   stop instead of
2f050 20 4e 55 4c 4c 20 66 69 6c 6c 69 6e 67 0a 20 20   NULL filling.  
2f060 20 20 20 20 20 20 2a 2a 20 74 68 65 20 72 65 6d        ** the rem
2f070 61 69 6e 69 6e 67 20 63 6f 6c 75 6d 6e 73 2e 0a  aining columns..
2f080 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
2f090 20 20 20 69 66 28 20 70 2d 3e 6d 6f 64 65 3d 3d     if( p->mode==
2f0a0 4d 4f 44 45 5f 41 73 63 69 69 20 26 26 20 28 7a  MODE_Ascii && (z
2f0b0 3d 3d 30 20 7c 7c 20 7a 5b 30 5d 3d 3d 30 29 20  ==0 || z[0]==0) 
2f0c0 26 26 20 69 3d 3d 30 20 29 20 62 72 65 61 6b 3b  && i==0 ) break;
2f0d0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2f0e0 5f 62 69 6e 64 5f 74 65 78 74 28 70 53 74 6d 74  _bind_text(pStmt
2f0f0 2c 20 69 2b 31 2c 20 7a 2c 20 2d 31 2c 20 53 51  , i+1, z, -1, SQ
2f100 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b  LITE_TRANSIENT);
2f110 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 3c 6e  .        if( i<n
2f120 43 6f 6c 2d 31 20 26 26 20 73 43 74 78 2e 63 54  Col-1 && sCtx.cT
2f130 65 72 6d 21 3d 73 43 74 78 2e 63 43 6f 6c 53 65  erm!=sCtx.cColSe
2f140 70 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75  p ){.          u
2f150 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72  tf8_printf(stder
2f160 72 2c 20 22 25 73 3a 25 64 3a 20 65 78 70 65 63  r, "%s:%d: expec
2f170 74 65 64 20 25 64 20 63 6f 6c 75 6d 6e 73 20 62  ted %d columns b
2f180 75 74 20 66 6f 75 6e 64 20 25 64 20 2d 20 22 0a  ut found %d - ".
2f190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f1a0 20 20 20 20 20 20 20 20 20 20 22 66 69 6c 6c 69            "filli
2f1b0 6e 67 20 74 68 65 20 72 65 73 74 20 77 69 74 68  ng the rest with
2f1c0 20 4e 55 4c 4c 5c 6e 22 2c 0a 20 20 20 20 20 20   NULL\n",.      
2f1d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f1e0 20 20 20 20 73 43 74 78 2e 7a 46 69 6c 65 2c 20      sCtx.zFile, 
2f1f0 73 74 61 72 74 4c 69 6e 65 2c 20 6e 43 6f 6c 2c  startLine, nCol,
2f200 20 69 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 20   i+1);.         
2f210 20 69 20 2b 3d 20 32 3b 0a 20 20 20 20 20 20 20   i += 2;.       
2f220 20 20 20 77 68 69 6c 65 28 20 69 3c 3d 6e 43 6f     while( i<=nCo
2f230 6c 20 29 7b 20 73 71 6c 69 74 65 33 5f 62 69 6e  l ){ sqlite3_bin
2f240 64 5f 6e 75 6c 6c 28 70 53 74 6d 74 2c 20 69 29  d_null(pStmt, i)
2f250 3b 20 69 2b 2b 3b 20 7d 0a 20 20 20 20 20 20 20  ; i++; }.       
2f260 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
2f270 20 69 66 28 20 73 43 74 78 2e 63 54 65 72 6d 3d   if( sCtx.cTerm=
2f280 3d 73 43 74 78 2e 63 43 6f 6c 53 65 70 20 29 7b  =sCtx.cColSep ){
2f290 0a 20 20 20 20 20 20 20 20 64 6f 7b 0a 20 20 20  .        do{.   
2f2a0 20 20 20 20 20 20 20 78 52 65 61 64 28 26 73 43         xRead(&sC
2f2b0 74 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  tx);.          i
2f2c0 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 77 68 69  ++;.        }whi
2f2d0 6c 65 28 20 73 43 74 78 2e 63 54 65 72 6d 3d 3d  le( sCtx.cTerm==
2f2e0 73 43 74 78 2e 63 43 6f 6c 53 65 70 20 29 3b 0a  sCtx.cColSep );.
2f2f0 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69          utf8_pri
2f300 6e 74 66 28 73 74 64 65 72 72 2c 20 22 25 73 3a  ntf(stderr, "%s:
2f310 25 64 3a 20 65 78 70 65 63 74 65 64 20 25 64 20  %d: expected %d 
2f320 63 6f 6c 75 6d 6e 73 20 62 75 74 20 66 6f 75 6e  columns but foun
2f330 64 20 25 64 20 2d 20 22 0a 20 20 20 20 20 20 20  d %d - ".       
2f340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f350 20 22 65 78 74 72 61 73 20 69 67 6e 6f 72 65 64   "extras ignored
2f360 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
2f370 20 20 20 20 20 20 20 20 20 20 20 20 20 73 43 74               sCt
2f380 78 2e 7a 46 69 6c 65 2c 20 73 74 61 72 74 4c 69  x.zFile, startLi
2f390 6e 65 2c 20 6e 43 6f 6c 2c 20 69 29 3b 0a 20 20  ne, nCol, i);.  
2f3a0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
2f3b0 69 3e 3d 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20  i>=nCol ){.     
2f3c0 20 20 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28     sqlite3_step(
2f3d0 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 20 20  pStmt);.        
2f3e0 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73  rc = sqlite3_res
2f3f0 65 74 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20  et(pStmt);.     
2f400 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
2f410 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
2f420 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74    utf8_printf(st
2f430 64 65 72 72 2c 20 22 25 73 3a 25 64 3a 20 49 4e  derr, "%s:%d: IN
2f440 53 45 52 54 20 66 61 69 6c 65 64 3a 20 25 73 5c  SERT failed: %s\
2f450 6e 22 2c 20 73 43 74 78 2e 7a 46 69 6c 65 2c 0a  n", sCtx.zFile,.
2f460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f470 20 20 20 20 20 20 73 74 61 72 74 4c 69 6e 65 2c        startLine,
2f480 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
2f490 70 2d 3e 64 62 29 29 3b 0a 20 20 20 20 20 20 20  p->db));.       
2f4a0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
2f4b0 77 68 69 6c 65 28 20 73 43 74 78 2e 63 54 65 72  while( sCtx.cTer
2f4c0 6d 21 3d 45 4f 46 20 29 3b 0a 0a 20 20 20 20 78  m!=EOF );..    x
2f4d0 43 6c 6f 73 65 72 28 73 43 74 78 2e 69 6e 29 3b  Closer(sCtx.in);
2f4e0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
2f4f0 65 28 73 43 74 78 2e 7a 29 3b 0a 20 20 20 20 73  e(sCtx.z);.    s
2f500 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
2f510 70 53 74 6d 74 29 3b 0a 20 20 20 20 69 66 28 20  pStmt);.    if( 
2f520 6e 65 65 64 43 6f 6d 6d 69 74 20 29 20 73 71 6c  needCommit ) sql
2f530 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c  ite3_exec(p->db,
2f540 20 22 43 4f 4d 4d 49 54 22 2c 20 30 2c 20 30 2c   "COMMIT", 0, 0,
2f550 20 30 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a 23 69   0);.  }else..#i
2f560 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 55 4e 54  fndef SQLITE_UNT
2f570 45 53 54 41 42 4c 45 0a 20 20 69 66 28 20 63 3d  ESTABLE.  if( c=
2f580 3d 27 69 27 20 26 26 20 73 74 72 6e 63 6d 70 28  ='i' && strncmp(
2f590 61 7a 41 72 67 5b 30 5d 2c 20 22 69 6d 70 6f 73  azArg[0], "impos
2f5a0 74 65 72 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20  ter", n)==0 ){. 
2f5b0 20 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20     char *zSql;. 
2f5c0 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 69 73     char *zCollis
2f5d0 74 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74  t = 0;.    sqlit
2f5e0 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a  e3_stmt *pStmt;.
2f5f0 20 20 20 20 69 6e 74 20 74 6e 75 6d 20 3d 20 30      int tnum = 0
2f600 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  ;.    int i;.   
2f610 20 69 66 28 20 21 28 6e 41 72 67 3d 3d 33 20 7c   if( !(nArg==3 |
2f620 7c 20 28 6e 41 72 67 3d 3d 32 20 26 26 20 73 71  | (nArg==2 && sq
2f630 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28 61 7a  lite3_stricmp(az
2f640 41 72 67 5b 31 5d 2c 22 6f 66 66 22 29 3d 3d 30  Arg[1],"off")==0
2f650 29 29 20 29 7b 0a 20 20 20 20 20 20 75 74 66 38  )) ){.      utf8
2f660 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
2f670 22 55 73 61 67 65 3a 20 2e 69 6d 70 6f 73 74 65  "Usage: .imposte
2f680 72 20 49 4e 44 45 58 20 49 4d 50 4f 53 54 45 52  r INDEX IMPOSTER
2f690 5c 6e 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  \n".            
2f6a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20                " 
2f6b0 20 20 20 20 20 20 2e 69 6d 70 6f 73 74 65 72 20        .imposter 
2f6c0 6f 66 66 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72  off\n");.      r
2f6d0 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 67 6f 74  c = 1;.      got
2f6e0 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65  o meta_command_e
2f6f0 78 69 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6f  xit;.    }.    o
2f700 70 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a 20 20  pen_db(p, 0);.  
2f710 20 20 69 66 28 20 6e 41 72 67 3d 3d 32 20 29 7b    if( nArg==2 ){
2f720 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 74  .      sqlite3_t
2f730 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49  est_control(SQLI
2f740 54 45 5f 54 45 53 54 43 54 52 4c 5f 49 4d 50 4f  TE_TESTCTRL_IMPO
2f750 53 54 45 52 2c 20 70 2d 3e 64 62 2c 20 22 6d 61  STER, p->db, "ma
2f760 69 6e 22 2c 20 30 2c 20 31 29 3b 0a 20 20 20 20  in", 0, 1);.    
2f770 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d    goto meta_comm
2f780 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a  and_exit;.    }.
2f790 20 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74      zSql = sqlit
2f7a0 65 33 5f 6d 70 72 69 6e 74 66 28 22 53 45 4c 45  e3_mprintf("SELE
2f7b0 43 54 20 72 6f 6f 74 70 61 67 65 20 46 52 4f 4d  CT rootpage FROM
2f7c0 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 22 0a   sqlite_master".
2f7d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f7e0 20 20 20 20 20 20 20 20 20 20 20 22 20 57 48 45             " WHE
2f7f0 52 45 20 6e 61 6d 65 3d 27 25 71 27 20 41 4e 44  RE name='%q' AND
2f800 20 74 79 70 65 3d 27 69 6e 64 65 78 27 22 2c 20   type='index'", 
2f810 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20 73  azArg[1]);.    s
2f820 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76  qlite3_prepare_v
2f830 32 28 70 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d  2(p->db, zSql, -
2f840 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20  1, &pStmt, 0);. 
2f850 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
2f860 7a 53 71 6c 29 3b 0a 20 20 20 20 69 66 28 20 73  zSql);.    if( s
2f870 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d  qlite3_step(pStm
2f880 74 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29  t)==SQLITE_ROW )
2f890 7b 0a 20 20 20 20 20 20 74 6e 75 6d 20 3d 20 73  {.      tnum = s
2f8a0 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e  qlite3_column_in
2f8b0 74 28 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20  t(pStmt, 0);.   
2f8c0 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66   }.    sqlite3_f
2f8d0 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a  inalize(pStmt);.
2f8e0 20 20 20 20 69 66 28 20 74 6e 75 6d 3d 3d 30 20      if( tnum==0 
2f8f0 29 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72  ){.      utf8_pr
2f900 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 6e 6f  intf(stderr, "no
2f910 20 73 75 63 68 20 69 6e 64 65 78 3a 20 5c 22 25   such index: \"%
2f920 73 5c 22 5c 6e 22 2c 20 61 7a 41 72 67 5b 31 5d  s\"\n", azArg[1]
2f930 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b  );.      rc = 1;
2f940 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 65 74 61  .      goto meta
2f950 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20  _command_exit;. 
2f960 20 20 20 7d 0a 20 20 20 20 7a 53 71 6c 20 3d 20     }.    zSql = 
2f970 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
2f980 22 50 52 41 47 4d 41 20 69 6e 64 65 78 5f 78 69  "PRAGMA index_xi
2f990 6e 66 6f 3d 27 25 71 27 22 2c 20 61 7a 41 72 67  nfo='%q'", azArg
2f9a0 5b 31 5d 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  [1]);.    rc = s
2f9b0 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76  qlite3_prepare_v
2f9c0 32 28 70 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d  2(p->db, zSql, -
2f9d0 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20  1, &pStmt, 0);. 
2f9e0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
2f9f0 7a 53 71 6c 29 3b 0a 20 20 20 20 69 20 3d 20 30  zSql);.    i = 0
2fa00 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 73 71 6c  ;.    while( sql
2fa10 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29  ite3_step(pStmt)
2fa20 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a  ==SQLITE_ROW ){.
2fa30 20 20 20 20 20 20 63 68 61 72 20 7a 4c 61 62 65        char zLabe
2fa40 6c 5b 32 30 5d 3b 0a 20 20 20 20 20 20 63 6f 6e  l[20];.      con
2fa50 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 20 3d 20  st char *zCol = 
2fa60 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c  (const char*)sql
2fa70 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  ite3_column_text
2fa80 28 70 53 74 6d 74 2c 32 29 3b 0a 20 20 20 20 20  (pStmt,2);.     
2fa90 20 69 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20   i++;.      if( 
2faa0 7a 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20  zCol==0 ){.     
2fab0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 63     if( sqlite3_c
2fac0 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 74 6d 74 2c  olumn_int(pStmt,
2fad0 31 29 3d 3d 2d 31 20 29 7b 0a 20 20 20 20 20 20  1)==-1 ){.      
2fae0 20 20 20 20 7a 43 6f 6c 20 3d 20 22 5f 52 4f 57      zCol = "_ROW
2faf0 49 44 5f 22 3b 0a 20 20 20 20 20 20 20 20 7d 65  ID_";.        }e
2fb00 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73  lse{.          s
2fb10 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
2fb20 73 69 7a 65 6f 66 28 7a 4c 61 62 65 6c 29 2c 7a  sizeof(zLabel),z
2fb30 4c 61 62 65 6c 2c 22 65 78 70 72 25 64 22 2c 69  Label,"expr%d",i
2fb40 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 43 6f  );.          zCo
2fb50 6c 20 3d 20 7a 4c 61 62 65 6c 3b 0a 20 20 20 20  l = zLabel;.    
2fb60 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
2fb70 20 20 20 20 69 66 28 20 7a 43 6f 6c 6c 69 73 74      if( zCollist
2fb80 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  ==0 ){.        z
2fb90 43 6f 6c 6c 69 73 74 20 3d 20 73 71 6c 69 74 65  Collist = sqlite
2fba0 33 5f 6d 70 72 69 6e 74 66 28 22 5c 22 25 77 5c  3_mprintf("\"%w\
2fbb0 22 22 2c 20 7a 43 6f 6c 29 3b 0a 20 20 20 20 20  "", zCol);.     
2fbc0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2fbd0 7a 43 6f 6c 6c 69 73 74 20 3d 20 73 71 6c 69 74  zCollist = sqlit
2fbe0 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 7a 2c 5c  e3_mprintf("%z,\
2fbf0 22 25 77 5c 22 22 2c 20 7a 43 6f 6c 6c 69 73 74  "%w\"", zCollist
2fc00 2c 20 7a 43 6f 6c 29 3b 0a 20 20 20 20 20 20 7d  , zCol);.      }
2fc10 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
2fc20 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d  e3_finalize(pStm
2fc30 74 29 3b 0a 20 20 20 20 7a 53 71 6c 20 3d 20 73  t);.    zSql = s
2fc40 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a  qlite3_mprintf(.
2fc50 20 20 20 20 20 20 20 20 20 20 22 43 52 45 41 54            "CREAT
2fc60 45 20 54 41 42 4c 45 20 5c 22 25 77 5c 22 28 25  E TABLE \"%w\"(%
2fc70 73 2c 50 52 49 4d 41 52 59 20 4b 45 59 28 25 73  s,PRIMARY KEY(%s
2fc80 29 29 57 49 54 48 4f 55 54 20 52 4f 57 49 44 22  ))WITHOUT ROWID"
2fc90 2c 0a 20 20 20 20 20 20 20 20 20 20 61 7a 41 72  ,.          azAr
2fca0 67 5b 32 5d 2c 20 7a 43 6f 6c 6c 69 73 74 2c 20  g[2], zCollist, 
2fcb0 7a 43 6f 6c 6c 69 73 74 29 3b 0a 20 20 20 20 73  zCollist);.    s
2fcc0 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6c  qlite3_free(zCol
2fcd0 6c 69 73 74 29 3b 0a 20 20 20 20 72 63 20 3d 20  list);.    rc = 
2fce0 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e  sqlite3_test_con
2fcf0 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54  trol(SQLITE_TEST
2fd00 43 54 52 4c 5f 49 4d 50 4f 53 54 45 52 2c 20 70  CTRL_IMPOSTER, p
2fd10 2d 3e 64 62 2c 20 22 6d 61 69 6e 22 2c 20 31 2c  ->db, "main", 1,
2fd20 20 74 6e 75 6d 29 3b 0a 20 20 20 20 69 66 28 20   tnum);.    if( 
2fd30 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2fd40 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
2fd50 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20  te3_exec(p->db, 
2fd60 7a 53 71 6c 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  zSql, 0, 0, 0);.
2fd70 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 74 65        sqlite3_te
2fd80 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54  st_control(SQLIT
2fd90 45 5f 54 45 53 54 43 54 52 4c 5f 49 4d 50 4f 53  E_TESTCTRL_IMPOS
2fda0 54 45 52 2c 20 70 2d 3e 64 62 2c 20 22 6d 61 69  TER, p->db, "mai
2fdb0 6e 22 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  n", 0, 0);.     
2fdc0 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
2fdd0 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73     utf8_printf(s
2fde0 74 64 65 72 72 2c 20 22 45 72 72 6f 72 20 69 6e  tderr, "Error in
2fdf0 20 5b 25 73 5d 3a 20 25 73 5c 6e 22 2c 20 7a 53   [%s]: %s\n", zS
2fe00 71 6c 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d  ql, sqlite3_errm
2fe10 73 67 28 70 2d 3e 64 62 29 29 3b 0a 20 20 20 20  sg(p->db));.    
2fe20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2fe30 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64   utf8_printf(std
2fe40 6f 75 74 2c 20 22 25 73 3b 5c 6e 22 2c 20 7a 53  out, "%s;\n", zS
2fe50 71 6c 29 3b 0a 20 20 20 20 20 20 20 20 72 61 77  ql);.        raw
2fe60 5f 70 72 69 6e 74 66 28 73 74 64 6f 75 74 2c 0a  _printf(stdout,.
2fe70 20 20 20 20 20 20 20 20 20 20 20 22 57 41 52 4e             "WARN
2fe80 49 4e 47 3a 20 77 72 69 74 69 6e 67 20 74 6f 20  ING: writing to 
2fe90 61 6e 20 69 6d 70 6f 73 74 65 72 20 74 61 62 6c  an imposter tabl
2fea0 65 20 77 69 6c 6c 20 63 6f 72 72 75 70 74 20 74  e will corrupt t
2feb0 68 65 20 69 6e 64 65 78 21 5c 6e 22 0a 20 20 20  he index!\n".   
2fec0 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a       );.      }.
2fed0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2fee0 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65   raw_printf(stde
2fef0 72 72 2c 20 22 53 51 4c 49 54 45 5f 54 45 53 54  rr, "SQLITE_TEST
2ff00 43 54 52 4c 5f 49 4d 50 4f 53 54 45 52 20 72 65  CTRL_IMPOSTER re
2ff10 74 75 72 6e 73 20 25 64 5c 6e 22 2c 20 72 63 29  turns %d\n", rc)
2ff20 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a  ;.      rc = 1;.
2ff30 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
2ff40 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20  3_free(zSql);.  
2ff50 7d 65 6c 73 65 0a 23 65 6e 64 69 66 20 2f 2a 20  }else.#endif /* 
2ff60 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
2ff70 4f 4d 49 54 5f 54 45 53 54 5f 43 4f 4e 54 52 4f  OMIT_TEST_CONTRO
2ff80 4c 29 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51  L) */..#ifdef SQ
2ff90 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49 4f 54 52  LITE_ENABLE_IOTR
2ffa0 41 43 45 0a 20 20 69 66 28 20 63 3d 3d 27 69 27  ACE.  if( c=='i'
2ffb0 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72   && strncmp(azAr
2ffc0 67 5b 30 5d 2c 20 22 69 6f 74 72 61 63 65 22 2c  g[0], "iotrace",
2ffd0 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 53 51   n)==0 ){.    SQ
2ffe0 4c 49 54 45 5f 41 50 49 20 65 78 74 65 72 6e 20  LITE_API extern 
2fff0 76 6f 69 64 20 28 53 51 4c 49 54 45 5f 43 44 45  void (SQLITE_CDE
30000 43 4c 20 2a 73 71 6c 69 74 65 33 49 6f 54 72 61  CL *sqlite3IoTra
30010 63 65 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c  ce)(const char*,
30020 20 2e 2e 2e 29 3b 0a 20 20 20 20 69 66 28 20 69   ...);.    if( i
30030 6f 74 72 61 63 65 20 26 26 20 69 6f 74 72 61 63  otrace && iotrac
30040 65 21 3d 73 74 64 6f 75 74 20 29 20 66 63 6c 6f  e!=stdout ) fclo
30050 73 65 28 69 6f 74 72 61 63 65 29 3b 0a 20 20 20  se(iotrace);.   
30060 20 69 6f 74 72 61 63 65 20 3d 20 30 3b 0a 20 20   iotrace = 0;.  
30070 20 20 69 66 28 20 6e 41 72 67 3c 32 20 29 7b 0a    if( nArg<2 ){.
30080 20 20 20 20 20 20 73 71 6c 69 74 65 33 49 6f 54        sqlite3IoT
30090 72 61 63 65 20 3d 20 30 3b 0a 20 20 20 20 7d 65  race = 0;.    }e
300a0 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 61  lse if( strcmp(a
300b0 7a 41 72 67 5b 31 5d 2c 20 22 2d 22 29 3d 3d 30  zArg[1], "-")==0
300c0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
300d0 33 49 6f 54 72 61 63 65 20 3d 20 69 6f 74 72 61  3IoTrace = iotra
300e0 63 65 50 72 69 6e 74 66 3b 0a 20 20 20 20 20 20  cePrintf;.      
300f0 69 6f 74 72 61 63 65 20 3d 20 73 74 64 6f 75 74  iotrace = stdout
30100 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
30110 20 20 20 69 6f 74 72 61 63 65 20 3d 20 66 6f 70     iotrace = fop
30120 65 6e 28 61 7a 41 72 67 5b 31 5d 2c 20 22 77 22  en(azArg[1], "w"
30130 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 6f 74  );.      if( iot
30140 72 61 63 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  race==0 ){.     
30150 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73     utf8_printf(s
30160 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 63  tderr, "Error: c
30170 61 6e 6e 6f 74 20 6f 70 65 6e 20 5c 22 25 73 5c  annot open \"%s\
30180 22 5c 6e 22 2c 20 61 7a 41 72 67 5b 31 5d 29 3b  "\n", azArg[1]);
30190 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
301a0 49 6f 54 72 61 63 65 20 3d 20 30 3b 0a 20 20 20  IoTrace = 0;.   
301b0 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20       rc = 1;.   
301c0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
301d0 20 20 73 71 6c 69 74 65 33 49 6f 54 72 61 63 65    sqlite3IoTrace
301e0 20 3d 20 69 6f 74 72 61 63 65 50 72 69 6e 74 66   = iotracePrintf
301f0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
30200 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 0a    }else.#endif..
30210 20 20 69 66 28 20 63 3d 3d 27 6c 27 20 26 26 20    if( c=='l' && 
30220 6e 3e 3d 35 20 26 26 20 73 74 72 6e 63 6d 70 28  n>=5 && strncmp(
30230 61 7a 41 72 67 5b 30 5d 2c 20 22 6c 69 6d 69 74  azArg[0], "limit
30240 73 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20  s", n)==0 ){.   
30250 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 74   static const st
30260 72 75 63 74 20 7b 0a 20 20 20 20 20 20 20 63 6f  ruct {.       co
30270 6e 73 74 20 63 68 61 72 20 2a 7a 4c 69 6d 69 74  nst char *zLimit
30280 4e 61 6d 65 3b 20 20 20 2f 2a 20 4e 61 6d 65 20  Name;   /* Name 
30290 6f 66 20 61 20 6c 69 6d 69 74 20 2a 2f 0a 20 20  of a limit */.  
302a0 20 20 20 20 20 69 6e 74 20 6c 69 6d 69 74 43 6f       int limitCo
302b0 64 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  de;            /
302c0 2a 20 49 6e 74 65 67 65 72 20 63 6f 64 65 20 66  * Integer code f
302d0 6f 72 20 74 68 61 74 20 6c 69 6d 69 74 20 2a 2f  or that limit */
302e0 0a 20 20 20 20 7d 20 61 4c 69 6d 69 74 5b 5d 20  .    } aLimit[] 
302f0 3d 20 7b 0a 20 20 20 20 20 20 7b 20 22 6c 65 6e  = {.      { "len
30300 67 74 68 22 2c 20 20 20 20 20 20 20 20 20 20 20  gth",           
30310 20 20 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49       SQLITE_LIMI
30320 54 5f 4c 45 4e 47 54 48 20 20 20 20 20 20 20 20  T_LENGTH        
30330 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
30340 20 20 20 20 20 7b 20 22 73 71 6c 5f 6c 65 6e 67       { "sql_leng
30350 74 68 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  th",            
30360 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 53 51 4c  SQLITE_LIMIT_SQL
30370 5f 4c 45 4e 47 54 48 20 20 20 20 20 20 20 20 20  _LENGTH         
30380 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20         },.      
30390 7b 20 22 63 6f 6c 75 6d 6e 22 2c 20 20 20 20 20  { "column",     
303a0 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
303b0 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 20 20  E_LIMIT_COLUMN  
303c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
303d0 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 65 78    },.      { "ex
303e0 70 72 5f 64 65 70 74 68 22 2c 20 20 20 20 20 20  pr_depth",      
303f0 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d        SQLITE_LIM
30400 49 54 5f 45 58 50 52 5f 44 45 50 54 48 20 20 20  IT_EXPR_DEPTH   
30410 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
30420 20 20 20 20 20 20 7b 20 22 63 6f 6d 70 6f 75 6e        { "compoun
30430 64 5f 73 65 6c 65 63 74 22 2c 20 20 20 20 20 20  d_select",      
30440 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f   SQLITE_LIMIT_CO
30450 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20 20 20  MPOUND_SELECT   
30460 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20          },.     
30470 20 7b 20 22 76 64 62 65 5f 6f 70 22 2c 20 20 20   { "vdbe_op",   
30480 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
30490 54 45 5f 4c 49 4d 49 54 5f 56 44 42 45 5f 4f 50  TE_LIMIT_VDBE_OP
304a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
304b0 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 66     },.      { "f
304c0 75 6e 63 74 69 6f 6e 5f 61 72 67 22 2c 20 20 20  unction_arg",   
304d0 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4c 49         SQLITE_LI
304e0 4d 49 54 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47  MIT_FUNCTION_ARG
304f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
30500 0a 20 20 20 20 20 20 7b 20 22 61 74 74 61 63 68  .      { "attach
30510 65 64 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  ed",            
30520 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 41    SQLITE_LIMIT_A
30530 54 54 41 43 48 45 44 20 20 20 20 20 20 20 20 20  TTACHED         
30540 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
30550 20 20 7b 20 22 6c 69 6b 65 5f 70 61 74 74 65 72    { "like_patter
30560 6e 5f 6c 65 6e 67 74 68 22 2c 20 20 20 53 51 4c  n_length",   SQL
30570 49 54 45 5f 4c 49 4d 49 54 5f 4c 49 4b 45 5f 50  ITE_LIMIT_LIKE_P
30580 41 54 54 45 52 4e 5f 4c 45 4e 47 54 48 20 20 20  ATTERN_LENGTH   
30590 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22      },.      { "
305a0 76 61 72 69 61 62 6c 65 5f 6e 75 6d 62 65 72 22  variable_number"
305b0 2c 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4c  ,       SQLITE_L
305c0 49 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55  IMIT_VARIABLE_NU
305d0 4d 42 45 52 20 20 20 20 20 20 20 20 20 20 20 7d  MBER           }
305e0 2c 0a 20 20 20 20 20 20 7b 20 22 74 72 69 67 67  ,.      { "trigg
305f0 65 72 5f 64 65 70 74 68 22 2c 20 20 20 20 20 20  er_depth",      
30600 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f     SQLITE_LIMIT_
30610 54 52 49 47 47 45 52 5f 44 45 50 54 48 20 20 20  TRIGGER_DEPTH   
30620 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
30630 20 20 20 7b 20 22 77 6f 72 6b 65 72 5f 74 68 72     { "worker_thr
30640 65 61 64 73 22 2c 20 20 20 20 20 20 20 20 53 51  eads",        SQ
30650 4c 49 54 45 5f 4c 49 4d 49 54 5f 57 4f 52 4b 45  LITE_LIMIT_WORKE
30660 52 5f 54 48 52 45 41 44 53 20 20 20 20 20 20 20  R_THREADS       
30670 20 20 20 20 20 7d 2c 0a 20 20 20 20 7d 3b 0a 20       },.    };. 
30680 20 20 20 69 6e 74 20 69 2c 20 6e 32 3b 0a 20 20     int i, n2;.  
30690 20 20 6f 70 65 6e 5f 64 62 28 70 2c 20 30 29 3b    open_db(p, 0);
306a0 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3d 3d 31  .    if( nArg==1
306b0 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d   ){.      for(i=
306c0 30 3b 20 69 3c 41 72 72 61 79 53 69 7a 65 28 61  0; i<ArraySize(a
306d0 4c 69 6d 69 74 29 3b 20 69 2b 2b 29 7b 0a 20 20  Limit); i++){.  
306e0 20 20 20 20 20 20 70 72 69 6e 74 66 28 22 25 32        printf("%2
306f0 30 73 20 25 64 5c 6e 22 2c 20 61 4c 69 6d 69 74  0s %d\n", aLimit
30700 5b 69 5d 2e 7a 4c 69 6d 69 74 4e 61 6d 65 2c 0a  [i].zLimitName,.
30710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
30720 71 6c 69 74 65 33 5f 6c 69 6d 69 74 28 70 2d 3e  qlite3_limit(p->
30730 64 62 2c 20 61 4c 69 6d 69 74 5b 69 5d 2e 6c 69  db, aLimit[i].li
30740 6d 69 74 43 6f 64 65 2c 20 2d 31 29 29 3b 0a 20  mitCode, -1));. 
30750 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
30760 20 69 66 28 20 6e 41 72 67 3e 33 20 29 7b 0a 20   if( nArg>3 ){. 
30770 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
30780 73 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20  stderr, "Usage: 
30790 2e 6c 69 6d 69 74 20 4e 41 4d 45 20 3f 4e 45 57  .limit NAME ?NEW
307a0 2d 56 41 4c 55 45 3f 5c 6e 22 29 3b 0a 20 20 20  -VALUE?\n");.   
307b0 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20     rc = 1;.     
307c0 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61   goto meta_comma
307d0 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20 7d 65 6c  nd_exit;.    }el
307e0 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 4c  se{.      int iL
307f0 69 6d 69 74 20 3d 20 2d 31 3b 0a 20 20 20 20 20  imit = -1;.     
30800 20 6e 32 20 3d 20 73 74 72 6c 65 6e 33 30 28 61   n2 = strlen30(a
30810 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20 20 20  zArg[1]);.      
30820 66 6f 72 28 69 3d 30 3b 20 69 3c 41 72 72 61 79  for(i=0; i<Array
30830 53 69 7a 65 28 61 4c 69 6d 69 74 29 3b 20 69 2b  Size(aLimit); i+
30840 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
30850 73 71 6c 69 74 65 33 5f 73 74 72 6e 69 63 6d 70  sqlite3_strnicmp
30860 28 61 4c 69 6d 69 74 5b 69 5d 2e 7a 4c 69 6d 69  (aLimit[i].zLimi
30870 74 4e 61 6d 65 2c 20 61 7a 41 72 67 5b 31 5d 2c  tName, azArg[1],
30880 20 6e 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20   n2)==0 ){.     
30890 20 20 20 20 20 69 66 28 20 69 4c 69 6d 69 74 3c       if( iLimit<
308a0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
308b0 20 69 4c 69 6d 69 74 20 3d 20 69 3b 0a 20 20 20   iLimit = i;.   
308c0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
308d0 20 20 20 20 20 20 20 20 20 20 75 74 66 38 5f 70            utf8_p
308e0 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 61  rintf(stderr, "a
308f0 6d 62 69 67 75 6f 75 73 20 6c 69 6d 69 74 3a 20  mbiguous limit: 
30900 5c 22 25 73 5c 22 5c 6e 22 2c 20 61 7a 41 72 67  \"%s\"\n", azArg
30910 5b 31 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20  [1]);.          
30920 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20    rc = 1;.      
30930 20 20 20 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f        goto meta_
30940 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20  command_exit;.  
30950 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
30960 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
30970 20 20 69 66 28 20 69 4c 69 6d 69 74 3c 30 20 29    if( iLimit<0 )
30980 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70  {.        utf8_p
30990 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 75  rintf(stderr, "u
309a0 6e 6b 6e 6f 77 6e 20 6c 69 6d 69 74 3a 20 5c 22  nknown limit: \"
309b0 25 73 5c 22 5c 6e 22 0a 20 20 20 20 20 20 20 20  %s\"\n".        
309c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
309d0 22 65 6e 74 65 72 20 5c 22 2e 6c 69 6d 69 74 73  "enter \".limits
309e0 5c 22 20 77 69 74 68 20 6e 6f 20 61 72 67 75 6d  \" with no argum
309f0 65 6e 74 73 20 66 6f 72 20 61 20 6c 69 73 74 2e  ents for a list.
30a00 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
30a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 7a                az
30a20 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20 20 20 20  Arg[1]);.       
30a30 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20   rc = 1;.       
30a40 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61   goto meta_comma
30a50 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 7d  nd_exit;.      }
30a60 0a 20 20 20 20 20 20 69 66 28 20 6e 41 72 67 3d  .      if( nArg=
30a70 3d 33 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =3 ){.        sq
30a80 6c 69 74 65 33 5f 6c 69 6d 69 74 28 70 2d 3e 64  lite3_limit(p->d
30a90 62 2c 20 61 4c 69 6d 69 74 5b 69 4c 69 6d 69 74  b, aLimit[iLimit
30aa0 5d 2e 6c 69 6d 69 74 43 6f 64 65 2c 0a 20 20 20  ].limitCode,.   
30ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30ac0 20 20 20 28 69 6e 74 29 69 6e 74 65 67 65 72 56     (int)integerV
30ad0 61 6c 75 65 28 61 7a 41 72 67 5b 32 5d 29 29 3b  alue(azArg[2]));
30ae0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
30af0 72 69 6e 74 66 28 22 25 32 30 73 20 25 64 5c 6e  rintf("%20s %d\n
30b00 22 2c 20 61 4c 69 6d 69 74 5b 69 4c 69 6d 69 74  ", aLimit[iLimit
30b10 5d 2e 7a 4c 69 6d 69 74 4e 61 6d 65 2c 0a 20 20  ].zLimitName,.  
30b20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
30b30 65 33 5f 6c 69 6d 69 74 28 70 2d 3e 64 62 2c 20  e3_limit(p->db, 
30b40 61 4c 69 6d 69 74 5b 69 4c 69 6d 69 74 5d 2e 6c  aLimit[iLimit].l
30b50 69 6d 69 74 43 6f 64 65 2c 20 2d 31 29 29 3b 0a  imitCode, -1));.
30b60 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20      }.  }else.. 
30b70 20 69 66 28 20 63 3d 3d 27 6c 27 20 26 26 20 6e   if( c=='l' && n
30b80 3e 32 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a  >2 && strncmp(az
30b90 41 72 67 5b 30 5d 2c 20 22 6c 69 6e 74 22 2c 20  Arg[0], "lint", 
30ba0 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 6f 70 65  n)==0 ){.    ope
30bb0 6e 5f 64 62 28 70 2c 20 30 29 3b 0a 20 20 20 20  n_db(p, 0);.    
30bc0 6c 69 6e 74 44 6f 74 43 6f 6d 6d 61 6e 64 28 70  lintDotCommand(p
30bd0 2c 20 61 7a 41 72 67 2c 20 6e 41 72 67 29 3b 0a  , azArg, nArg);.
30be0 20 20 7d 65 6c 73 65 0a 0a 23 69 66 6e 64 65 66    }else..#ifndef
30bf0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41   SQLITE_OMIT_LOA
30c00 44 5f 45 58 54 45 4e 53 49 4f 4e 0a 20 20 69 66  D_EXTENSION.  if
30c10 28 20 63 3d 3d 27 6c 27 20 26 26 20 73 74 72 6e  ( c=='l' && strn
30c20 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 6c  cmp(azArg[0], "l
30c30 6f 61 64 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20  oad", n)==0 ){. 
30c40 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
30c50 46 69 6c 65 2c 20 2a 7a 50 72 6f 63 3b 0a 20 20  File, *zProc;.  
30c60 20 20 63 68 61 72 20 2a 7a 45 72 72 4d 73 67 20    char *zErrMsg 
30c70 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 6e 41 72  = 0;.    if( nAr
30c80 67 3c 32 20 29 7b 0a 20 20 20 20 20 20 72 61 77  g<2 ){.      raw
30c90 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
30ca0 22 55 73 61 67 65 3a 20 2e 6c 6f 61 64 20 46 49  "Usage: .load FI
30cb0 4c 45 20 3f 45 4e 54 52 59 50 4f 49 4e 54 3f 5c  LE ?ENTRYPOINT?\
30cc0 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  n");.      rc = 
30cd0 31 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 65  1;.      goto me
30ce0 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b  ta_command_exit;
30cf0 0a 20 20 20 20 7d 0a 20 20 20 20 7a 46 69 6c 65  .    }.    zFile
30d00 20 3d 20 61 7a 41 72 67 5b 31 5d 3b 0a 20 20 20   = azArg[1];.   
30d10 20 7a 50 72 6f 63 20 3d 20 6e 41 72 67 3e 3d 33   zProc = nArg>=3
30d20 20 3f 20 61 7a 41 72 67 5b 32 5d 20 3a 20 30 3b   ? azArg[2] : 0;
30d30 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28 70 2c 20  .    open_db(p, 
30d40 30 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  0);.    rc = sql
30d50 69 74 65 33 5f 6c 6f 61 64 5f 65 78 74 65 6e 73  ite3_load_extens
30d60 69 6f 6e 28 70 2d 3e 64 62 2c 20 7a 46 69 6c 65  ion(p->db, zFile
30d70 2c 20 7a 50 72 6f 63 2c 20 26 7a 45 72 72 4d 73  , zProc, &zErrMs
30d80 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  g);.    if( rc!=
30d90 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
30da0 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73     utf8_printf(s
30db0 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 25  tderr, "Error: %
30dc0 73 5c 6e 22 2c 20 7a 45 72 72 4d 73 67 29 3b 0a  s\n", zErrMsg);.
30dd0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
30de0 65 65 28 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20  ee(zErrMsg);.   
30df0 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d     rc = 1;.    }
30e00 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a  .  }else.#endif.
30e10 0a 20 20 69 66 28 20 63 3d 3d 27 6c 27 20 26 26  .  if( c=='l' &&
30e20 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30   strncmp(azArg[0
30e30 5d 2c 20 22 6c 6f 67 22 2c 20 6e 29 3d 3d 30 20  ], "log", n)==0 
30e40 29 7b 0a 20 20 20 20 69 66 28 20 6e 41 72 67 21  ){.    if( nArg!
30e50 3d 32 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f  =2 ){.      raw_
30e60 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
30e70 55 73 61 67 65 3a 20 2e 6c 6f 67 20 46 49 4c 45  Usage: .log FILE
30e80 4e 41 4d 45 5c 6e 22 29 3b 0a 20 20 20 20 20 20  NAME\n");.      
30e90 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73  rc = 1;.    }els
30ea0 65 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  e{.      const c
30eb0 68 61 72 20 2a 7a 46 69 6c 65 20 3d 20 61 7a 41  har *zFile = azA
30ec0 72 67 5b 31 5d 3b 0a 20 20 20 20 20 20 6f 75 74  rg[1];.      out
30ed0 70 75 74 5f 66 69 6c 65 5f 63 6c 6f 73 65 28 70  put_file_close(p
30ee0 2d 3e 70 4c 6f 67 29 3b 0a 20 20 20 20 20 20 70  ->pLog);.      p
30ef0 2d 3e 70 4c 6f 67 20 3d 20 6f 75 74 70 75 74 5f  ->pLog = output_
30f00 66 69 6c 65 5f 6f 70 65 6e 28 7a 46 69 6c 65 2c  file_open(zFile,
30f10 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c   0);.    }.  }el
30f20 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 6d 27  se..  if( c=='m'
30f30 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72   && strncmp(azAr
30f40 67 5b 30 5d 2c 20 22 6d 6f 64 65 22 2c 20 6e 29  g[0], "mode", n)
30f50 3d 3d 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74  ==0 ){.    const
30f60 20 63 68 61 72 20 2a 7a 4d 6f 64 65 20 3d 20 6e   char *zMode = n
30f70 41 72 67 3e 3d 32 20 3f 20 61 7a 41 72 67 5b 31  Arg>=2 ? azArg[1
30f80 5d 20 3a 20 22 22 3b 0a 20 20 20 20 69 6e 74 20  ] : "";.    int 
30f90 6e 32 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a 4d  n2 = strlen30(zM
30fa0 6f 64 65 29 3b 0a 20 20 20 20 69 6e 74 20 63 32  ode);.    int c2
30fb0 20 3d 20 7a 4d 6f 64 65 5b 30 5d 3b 0a 20 20 20   = zMode[0];.   
30fc0 20 69 66 28 20 63 32 3d 3d 27 6c 27 20 26 26 20   if( c2=='l' && 
30fd0 6e 32 3e 32 20 26 26 20 73 74 72 6e 63 6d 70 28  n2>2 && strncmp(
30fe0 61 7a 41 72 67 5b 31 5d 2c 22 6c 69 6e 65 73 22  azArg[1],"lines"
30ff0 2c 6e 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ,n2)==0 ){.     
31000 20 70 2d 3e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f   p->mode = MODE_
31010 4c 69 6e 65 3b 0a 20 20 20 20 20 20 73 71 6c 69  Line;.      sqli
31020 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
31030 65 6f 66 28 70 2d 3e 72 6f 77 53 65 70 61 72 61  eof(p->rowSepara
31040 74 6f 72 29 2c 20 70 2d 3e 72 6f 77 53 65 70 61  tor), p->rowSepa
31050 72 61 74 6f 72 2c 20 53 45 50 5f 52 6f 77 29 3b  rator, SEP_Row);
31060 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63  .    }else if( c
31070 32 3d 3d 27 63 27 20 26 26 20 73 74 72 6e 63 6d  2=='c' && strncm
31080 70 28 61 7a 41 72 67 5b 31 5d 2c 22 63 6f 6c 75  p(azArg[1],"colu
31090 6d 6e 73 22 2c 6e 32 29 3d 3d 30 20 29 7b 0a 20  mns",n2)==0 ){. 
310a0 20 20 20 20 20 70 2d 3e 6d 6f 64 65 20 3d 20 4d       p->mode = M
310b0 4f 44 45 5f 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  ODE_Column;.    
310c0 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
310d0 74 66 28 73 69 7a 65 6f 66 28 70 2d 3e 72 6f 77  tf(sizeof(p->row
310e0 53 65 70 61 72 61 74 6f 72 29 2c 20 70 2d 3e 72  Separator), p->r
310f0 6f 77 53 65 70 61 72 61 74 6f 72 2c 20 53 45 50  owSeparator, SEP
31100 5f 52 6f 77 29 3b 0a 20 20 20 20 7d 65 6c 73 65  _Row);.    }else
31110 20 69 66 28 20 63 32 3d 3d 27 6c 27 20 26 26 20   if( c2=='l' && 
31120 6e 32 3e 32 20 26 26 20 73 74 72 6e 63 6d 70 28  n2>2 && strncmp(
31130 61 7a 41 72 67 5b 31 5d 2c 22 6c 69 73 74 22 2c  azArg[1],"list",
31140 6e 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  n2)==0 ){.      
31150 70 2d 3e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 4c  p->mode = MODE_L
31160 69 73 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ist;.      sqlit
31170 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
31180 6f 66 28 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74  of(p->colSeparat
31190 6f 72 29 2c 20 70 2d 3e 63 6f 6c 53 65 70 61 72  or), p->colSepar
311a0 61 74 6f 72 2c 20 53 45 50 5f 43 6f 6c 75 6d 6e  ator, SEP_Column
311b0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
311c0 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66  _snprintf(sizeof
311d0 28 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72  (p->rowSeparator
311e0 29 2c 20 70 2d 3e 72 6f 77 53 65 70 61 72 61 74  ), p->rowSeparat
311f0 6f 72 2c 20 53 45 50 5f 52 6f 77 29 3b 0a 20 20  or, SEP_Row);.  
31200 20 20 7d 65 6c 73 65 20 69 66 28 20 63 32 3d 3d    }else if( c2==
31210 27 68 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61  'h' && strncmp(a
31220 7a 41 72 67 5b 31 5d 2c 22 68 74 6d 6c 22 2c 6e  zArg[1],"html",n
31230 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  2)==0 ){.      p
31240 2d 3e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 48 74  ->mode = MODE_Ht
31250 6d 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  ml;.    }else if
31260 28 20 63 32 3d 3d 27 74 27 20 26 26 20 73 74 72  ( c2=='t' && str
31270 6e 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 22 74  ncmp(azArg[1],"t
31280 63 6c 22 2c 6e 32 29 3d 3d 30 20 29 7b 0a 20 20  cl",n2)==0 ){.  
31290 20 20 20 20 70 2d 3e 6d 6f 64 65 20 3d 20 4d 4f      p->mode = MO
312a0 44 45 5f 54 63 6c 3b 0a 20 20 20 20 20 20 73 71  DE_Tcl;.      sq
312b0 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
312c0 69 7a 65 6f 66 28 70 2d 3e 63 6f 6c 53 65 70 61  izeof(p->colSepa
312d0 72 61 74 6f 72 29 2c 20 70 2d 3e 63 6f 6c 53 65  rator), p->colSe
312e0 70 61 72 61 74 6f 72 2c 20 53 45 50 5f 53 70 61  parator, SEP_Spa
312f0 63 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ce);.      sqlit
31300 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
31310 6f 66 28 70 2d 3e 72 6f 77 53 65 70 61 72 61 74  of(p->rowSeparat
31320 6f 72 29 2c 20 70 2d 3e 72 6f 77 53 65 70 61 72  or), p->rowSepar
31330 61 74 6f 72 2c 20 53 45 50 5f 52 6f 77 29 3b 0a  ator, SEP_Row);.
31340 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 32      }else if( c2
31350 3d 3d 27 63 27 20 26 26 20 73 74 72 6e 63 6d 70  =='c' && strncmp
31360 28 61 7a 41 72 67 5b 31 5d 2c 22 63 73 76 22 2c  (azArg[1],"csv",
31370 6e 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  n2)==0 ){.      
31380 70 2d 3e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 43  p->mode = MODE_C
31390 73 76 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  sv;.      sqlite
313a0 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
313b0 66 28 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f  f(p->colSeparato
313c0 72 29 2c 20 70 2d 3e 63 6f 6c 53 65 70 61 72 61  r), p->colSepara
313d0 74 6f 72 2c 20 53 45 50 5f 43 6f 6d 6d 61 29 3b  tor, SEP_Comma);
313e0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
313f0 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 70  nprintf(sizeof(p
31400 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 29 2c  ->rowSeparator),
31410 20 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72   p->rowSeparator
31420 2c 20 53 45 50 5f 43 72 4c 66 29 3b 0a 20 20 20  , SEP_CrLf);.   
31430 20 7d 65 6c 73 65 20 69 66 28 20 63 32 3d 3d 27   }else if( c2=='
31440 74 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a  t' && strncmp(az
31450 41 72 67 5b 31 5d 2c 22 74 61 62 73 22 2c 6e 32  Arg[1],"tabs",n2
31460 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d  )==0 ){.      p-
31470 3e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 4c 69 73  >mode = MODE_Lis
31480 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  t;.      sqlite3
31490 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66  _snprintf(sizeof
314a0 28 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72  (p->colSeparator
314b0 29 2c 20 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74  ), p->colSeparat
314c0 6f 72 2c 20 53 45 50 5f 54 61 62 29 3b 0a 20 20  or, SEP_Tab);.  
314d0 20 20 7d 65 6c 73 65 20 69 66 28 20 63 32 3d 3d    }else if( c2==
314e0 27 69 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61  'i' && strncmp(a
314f0 7a 41 72 67 5b 31 5d 2c 22 69 6e 73 65 72 74 22  zArg[1],"insert"
31500 2c 6e 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ,n2)==0 ){.     
31510 20 70 2d 3e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f   p->mode = MODE_
31520 49 6e 73 65 72 74 3b 0a 20 20 20 20 20 20 73 65  Insert;.      se
31530 74 5f 74 61 62 6c 65 5f 6e 61 6d 65 28 70 2c 20  t_table_name(p, 
31540 6e 41 72 67 3e 3d 33 20 3f 20 61 7a 41 72 67 5b  nArg>=3 ? azArg[
31550 32 5d 20 3a 20 22 74 61 62 6c 65 22 29 3b 0a 20  2] : "table");. 
31560 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 32 3d     }else if( c2=
31570 3d 27 71 27 20 26 26 20 73 74 72 6e 63 6d 70 28  ='q' && strncmp(
31580 61 7a 41 72 67 5b 31 5d 2c 22 71 75 6f 74 65 22  azArg[1],"quote"
31590 2c 6e 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ,n2)==0 ){.     
315a0 20 70 2d 3e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f   p->mode = MODE_
315b0 51 75 6f 74 65 3b 0a 20 20 20 20 7d 65 6c 73 65  Quote;.    }else
315c0 20 69 66 28 20 63 32 3d 3d 27 61 27 20 26 26 20   if( c2=='a' && 
315d0 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 31 5d  strncmp(azArg[1]
315e0 2c 22 61 73 63 69 69 22 2c 6e 32 29 3d 3d 30 20  ,"ascii",n2)==0 
315f0 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6d 6f 64 65  ){.      p->mode
31600 20 3d 20 4d 4f 44 45 5f 41 73 63 69 69 3b 0a 20   = MODE_Ascii;. 
31610 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
31620 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 70 2d 3e  rintf(sizeof(p->
31630 63 6f 6c 53 65 70 61 72 61 74 6f 72 29 2c 20 70  colSeparator), p
31640 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 2c 20  ->colSeparator, 
31650 53 45 50 5f 55 6e 69 74 29 3b 0a 20 20 20 20 20  SEP_Unit);.     
31660 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
31670 66 28 73 69 7a 65 6f 66 28 70 2d 3e 72 6f 77 53  f(sizeof(p->rowS
31680 65 70 61 72 61 74 6f 72 29 2c 20 70 2d 3e 72 6f  eparator), p->ro
31690 77 53 65 70 61 72 61 74 6f 72 2c 20 53 45 50 5f  wSeparator, SEP_
316a0 52 65 63 6f 72 64 29 3b 0a 20 20 20 20 7d 65 6c  Record);.    }el
316b0 73 65 20 69 66 28 20 6e 41 72 67 3d 3d 31 20 29  se if( nArg==1 )
316c0 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e  {.      raw_prin
316d0 74 66 28 70 2d 3e 6f 75 74 2c 20 22 63 75 72 72  tf(p->out, "curr
316e0 65 6e 74 20 6f 75 74 70 75 74 20 6d 6f 64 65 3a  ent output mode:
316f0 20 25 73 5c 6e 22 2c 20 6d 6f 64 65 44 65 73 63   %s\n", modeDesc
31700 72 5b 70 2d 3e 6d 6f 64 65 5d 29 3b 0a 20 20 20  r[p->mode]);.   
31710 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 61   }else{.      ra
31720 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  w_printf(stderr,
31730 20 22 45 72 72 6f 72 3a 20 6d 6f 64 65 20 73 68   "Error: mode sh
31740 6f 75 6c 64 20 62 65 20 6f 6e 65 20 6f 66 3a 20  ould be one of: 
31750 22 0a 20 20 20 20 20 20 20 20 20 22 61 73 63 69  ".         "asci
31760 69 20 63 6f 6c 75 6d 6e 20 63 73 76 20 68 74 6d  i column csv htm
31770 6c 20 69 6e 73 65 72 74 20 6c 69 6e 65 20 6c 69  l insert line li
31780 73 74 20 71 75 6f 74 65 20 74 61 62 73 20 74 63  st quote tabs tc
31790 6c 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20  l\n");.      rc 
317a0 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  = 1;.    }.    p
317b0 2d 3e 63 4d 6f 64 65 20 3d 20 70 2d 3e 6d 6f 64  ->cMode = p->mod
317c0 65 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66  e;.  }else..  if
317d0 28 20 63 3d 3d 27 6e 27 20 26 26 20 73 74 72 6e  ( c=='n' && strn
317e0 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 6e  cmp(azArg[0], "n
317f0 75 6c 6c 76 61 6c 75 65 22 2c 20 6e 29 3d 3d 30  ullvalue", n)==0
31800 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 41 72 67   ){.    if( nArg
31810 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==2 ){.      sql
31820 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
31830 7a 65 6f 66 28 70 2d 3e 6e 75 6c 6c 56 61 6c 75  zeof(p->nullValu
31840 65 29 2c 20 70 2d 3e 6e 75 6c 6c 56 61 6c 75 65  e), p->nullValue
31850 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
31860 20 20 20 20 20 20 20 20 20 22 25 2e 2a 73 22 2c           "%.*s",
31870 20 28 69 6e 74 29 41 72 72 61 79 53 69 7a 65 28   (int)ArraySize(
31880 70 2d 3e 6e 75 6c 6c 56 61 6c 75 65 29 2d 31 2c  p->nullValue)-1,
31890 20 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20   azArg[1]);.    
318a0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 61 77  }else{.      raw
318b0 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
318c0 22 55 73 61 67 65 3a 20 2e 6e 75 6c 6c 76 61 6c  "Usage: .nullval
318d0 75 65 20 53 54 52 49 4e 47 5c 6e 22 29 3b 0a 20  ue STRING\n");. 
318e0 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20       rc = 1;.   
318f0 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66   }.  }else..  if
31900 28 20 63 3d 3d 27 6f 27 20 26 26 20 73 74 72 6e  ( c=='o' && strn
31910 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 6f  cmp(azArg[0], "o
31920 70 65 6e 22 2c 20 6e 29 3d 3d 30 20 26 26 20 6e  pen", n)==0 && n
31930 3e 3d 32 20 29 7b 0a 20 20 20 20 63 68 61 72 20  >=2 ){.    char 
31940 2a 7a 4e 65 77 46 69 6c 65 6e 61 6d 65 3b 20 20  *zNewFilename;  
31950 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64  /* Name of the d
31960 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20  atabase file to 
31970 6f 70 65 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 20  open */.    int 
31980 69 4e 61 6d 65 20 3d 20 31 3b 20 20 20 20 20 20  iName = 1;      
31990 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 61 7a 41   /* Index in azA
319a0 72 67 5b 5d 20 6f 66 20 74 68 65 20 66 69 6c 65  rg[] of the file
319b0 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20  name */.    int 
319c0 6e 65 77 46 6c 61 67 20 3d 20 30 3b 20 20 20 20  newFlag = 0;    
319d0 20 2f 2a 20 54 72 75 65 20 74 6f 20 64 65 6c 65   /* True to dele
319e0 74 65 20 66 69 6c 65 20 62 65 66 6f 72 65 20 6f  te file before o
319f0 70 65 6e 69 6e 67 20 2a 2f 0a 20 20 20 20 2f 2a  pening */.    /*
31a00 20 43 6c 6f 73 65 20 74 68 65 20 65 78 69 73 74   Close the exist
31a10 69 6e 67 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  ing database */.
31a20 20 20 20 20 73 65 73 73 69 6f 6e 5f 63 6c 6f 73      session_clos
31a30 65 5f 61 6c 6c 28 70 29 3b 0a 20 20 20 20 63 6c  e_all(p);.    cl
31a40 6f 73 65 5f 64 62 28 70 2d 3e 64 62 29 3b 0a 20  ose_db(p->db);. 
31a50 20 20 20 70 2d 3e 64 62 20 3d 20 30 3b 0a 20 20     p->db = 0;.  
31a60 20 20 70 2d 3e 7a 44 62 46 69 6c 65 6e 61 6d 65    p->zDbFilename
31a70 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65   = 0;.    sqlite
31a80 33 5f 66 72 65 65 28 70 2d 3e 7a 46 72 65 65 4f  3_free(p->zFreeO
31a90 6e 43 6c 6f 73 65 29 3b 0a 20 20 20 20 70 2d 3e  nClose);.    p->
31aa0 7a 46 72 65 65 4f 6e 43 6c 6f 73 65 20 3d 20 30  zFreeOnClose = 0
31ab0 3b 0a 20 20 20 20 70 2d 3e 6f 70 65 6e 4d 6f 64  ;.    p->openMod
31ac0 65 20 3d 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f 55  e = SHELL_OPEN_U
31ad0 4e 53 50 45 43 3b 0a 20 20 20 20 2f 2a 20 43 68  NSPEC;.    /* Ch
31ae0 65 63 6b 20 66 6f 72 20 63 6f 6d 6d 61 6e 64 2d  eck for command-
31af0 6c 69 6e 65 20 61 72 67 75 6d 65 6e 74 73 20 2a  line arguments *
31b00 2f 0a 20 20 20 20 66 6f 72 28 69 4e 61 6d 65 3d  /.    for(iName=
31b10 31 3b 20 69 4e 61 6d 65 3c 6e 41 72 67 20 26 26  1; iName<nArg &&
31b20 20 61 7a 41 72 67 5b 69 4e 61 6d 65 5d 5b 30 5d   azArg[iName][0]
31b30 3d 3d 27 2d 27 3b 20 69 4e 61 6d 65 2b 2b 29 7b  =='-'; iName++){
31b40 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
31b50 72 20 2a 7a 20 3d 20 61 7a 41 72 67 5b 69 4e 61  r *z = azArg[iNa
31b60 6d 65 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 6f  me];.      if( o
31b70 70 74 69 6f 6e 4d 61 74 63 68 28 7a 2c 22 6e 65  ptionMatch(z,"ne
31b80 77 22 29 20 29 7b 0a 20 20 20 20 20 20 20 20 6e  w") ){.        n
31b90 65 77 46 6c 61 67 20 3d 20 31 3b 0a 23 69 66 64  ewFlag = 1;.#ifd
31ba0 65 66 20 53 51 4c 49 54 45 5f 48 41 56 45 5f 5a  ef SQLITE_HAVE_Z
31bb0 4c 49 42 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  LIB.      }else 
31bc0 69 66 28 20 6f 70 74 69 6f 6e 4d 61 74 63 68 28  if( optionMatch(
31bd0 7a 2c 20 22 7a 69 70 22 29 20 29 7b 0a 20 20 20  z, "zip") ){.   
31be0 20 20 20 20 20 70 2d 3e 6f 70 65 6e 4d 6f 64 65       p->openMode
31bf0 20 3d 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f 5a 49   = SHELL_OPEN_ZI
31c00 50 46 49 4c 45 3b 0a 23 65 6e 64 69 66 0a 20 20  PFILE;.#endif.  
31c10 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70      }else if( op
31c20 74 69 6f 6e 4d 61 74 63 68 28 7a 2c 20 22 61 70  tionMatch(z, "ap
31c30 70 65 6e 64 22 29 20 29 7b 0a 20 20 20 20 20 20  pend") ){.      
31c40 20 20 70 2d 3e 6f 70 65 6e 4d 6f 64 65 20 3d 20    p->openMode = 
31c50 53 48 45 4c 4c 5f 4f 50 45 4e 5f 41 50 50 45 4e  SHELL_OPEN_APPEN
31c60 44 56 46 53 3b 0a 20 20 20 20 20 20 7d 65 6c 73  DVFS;.      }els
31c70 65 20 69 66 28 20 6f 70 74 69 6f 6e 4d 61 74 63  e if( optionMatc
31c80 68 28 7a 2c 20 22 72 65 61 64 6f 6e 6c 79 22 29  h(z, "readonly")
31c90 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6f   ){.        p->o
31ca0 70 65 6e 4d 6f 64 65 20 3d 20 53 48 45 4c 4c 5f  penMode = SHELL_
31cb0 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20  OPEN_READONLY;. 
31cc0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 7a       }else if( z
31cd0 5b 30 5d 3d 3d 27 2d 27 20 29 7b 0a 20 20 20 20  [0]=='-' ){.    
31ce0 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
31cf0 73 74 64 65 72 72 2c 20 22 75 6e 6b 6e 6f 77 6e  stderr, "unknown
31d00 20 6f 70 74 69 6f 6e 3a 20 25 73 5c 6e 22 2c 20   option: %s\n", 
31d10 7a 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  z);.        rc =
31d20 20 31 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   1;.        goto
31d30 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78   meta_command_ex
31d40 69 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  it;.      }.    
31d50 7d 0a 20 20 20 20 2f 2a 20 49 66 20 61 20 66 69  }.    /* If a fi
31d60 6c 65 6e 61 6d 65 20 69 73 20 73 70 65 63 69 66  lename is specif
31d70 69 65 64 2c 20 74 72 79 20 74 6f 20 6f 70 65 6e  ied, try to open
31d80 20 69 74 20 66 69 72 73 74 20 2a 2f 0a 20 20 20   it first */.   
31d90 20 7a 4e 65 77 46 69 6c 65 6e 61 6d 65 20 3d 20   zNewFilename = 
31da0 6e 41 72 67 3e 69 4e 61 6d 65 20 3f 20 73 71 6c  nArg>iName ? sql
31db0 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73  ite3_mprintf("%s
31dc0 22 2c 20 61 7a 41 72 67 5b 69 4e 61 6d 65 5d 29  ", azArg[iName])
31dd0 20 3a 20 30 3b 0a 20 20 20 20 69 66 28 20 7a 4e   : 0;.    if( zN
31de0 65 77 46 69 6c 65 6e 61 6d 65 20 29 7b 0a 20 20  ewFilename ){.  
31df0 20 20 20 20 69 66 28 20 6e 65 77 46 6c 61 67 20      if( newFlag 
31e00 29 20 73 68 65 6c 6c 44 65 6c 65 74 65 46 69 6c  ) shellDeleteFil
31e10 65 28 7a 4e 65 77 46 69 6c 65 6e 61 6d 65 29 3b  e(zNewFilename);
31e20 0a 20 20 20 20 20 20 70 2d 3e 7a 44 62 46 69 6c  .      p->zDbFil
31e30 65 6e 61 6d 65 20 3d 20 7a 4e 65 77 46 69 6c 65  ename = zNewFile
31e40 6e 61 6d 65 3b 0a 20 20 20 20 20 20 6f 70 65 6e  name;.      open
31e50 5f 64 62 28 70 2c 20 4f 50 45 4e 5f 44 42 5f 4b  _db(p, OPEN_DB_K
31e60 45 45 50 41 4c 49 56 45 29 3b 0a 20 20 20 20 20  EEPALIVE);.     
31e70 20 69 66 28 20 70 2d 3e 64 62 3d 3d 30 20 29 7b   if( p->db==0 ){
31e80 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72  .        utf8_pr
31e90 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72  intf(stderr, "Er
31ea0 72 6f 72 3a 20 63 61 6e 6e 6f 74 20 6f 70 65 6e  ror: cannot open
31eb0 20 27 25 73 27 5c 6e 22 2c 20 7a 4e 65 77 46 69   '%s'\n", zNewFi
31ec0 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  lename);.       
31ed0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4e   sqlite3_free(zN
31ee0 65 77 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20  ewFilename);.   
31ef0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
31f00 20 20 70 2d 3e 7a 46 72 65 65 4f 6e 43 6c 6f 73    p->zFreeOnClos
31f10 65 20 3d 20 7a 4e 65 77 46 69 6c 65 6e 61 6d 65  e = zNewFilename
31f20 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
31f30 20 20 20 20 69 66 28 20 70 2d 3e 64 62 3d 3d 30      if( p->db==0
31f40 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 73 20   ){.      /* As 
31f50 61 20 66 61 6c 6c 2d 62 61 63 6b 20 6f 70 65 6e  a fall-back open
31f60 20 61 20 54 45 4d 50 20 64 61 74 61 62 61 73 65   a TEMP database
31f70 20 2a 2f 0a 20 20 20 20 20 20 70 2d 3e 7a 44 62   */.      p->zDb
31f80 46 69 6c 65 6e 61 6d 65 20 3d 20 30 3b 0a 20 20  Filename = 0;.  
31f90 20 20 20 20 6f 70 65 6e 5f 64 62 28 70 2c 20 30      open_db(p, 0
31fa0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  );.    }.  }else
31fb0 0a 0a 20 20 69 66 28 20 28 63 3d 3d 27 6f 27 0a  ..  if( (c=='o'.
31fc0 20 20 20 20 20 20 20 20 26 26 20 28 73 74 72 6e          && (strn
31fd0 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 6f  cmp(azArg[0], "o
31fe0 75 74 70 75 74 22 2c 20 6e 29 3d 3d 30 7c 7c 73  utput", n)==0||s
31ff0 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c  trncmp(azArg[0],
32000 20 22 6f 6e 63 65 22 2c 20 6e 29 3d 3d 30 29 29   "once", n)==0))
32010 0a 20 20 20 7c 7c 20 28 63 3d 3d 27 65 27 20 26  .   || (c=='e' &
32020 26 20 6e 3d 3d 35 20 26 26 20 73 74 72 63 6d 70  & n==5 && strcmp
32030 28 61 7a 41 72 67 5b 30 5d 2c 22 65 78 63 65 6c  (azArg[0],"excel
32040 22 29 3d 3d 30 29 0a 20 20 29 7b 0a 20 20 20 20  ")==0).  ){.    
32050 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
32060 65 20 3d 20 6e 41 72 67 3e 3d 32 20 3f 20 61 7a  e = nArg>=2 ? az
32070 41 72 67 5b 31 5d 20 3a 20 22 73 74 64 6f 75 74  Arg[1] : "stdout
32080 22 3b 0a 20 20 20 20 69 6e 74 20 62 54 78 74 4d  ";.    int bTxtM
32090 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  ode = 0;.    if(
320a0 20 61 7a 41 72 67 5b 30 5d 5b 30 5d 3d 3d 27 65   azArg[0][0]=='e
320b0 27 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 72  ' ){.      /* Tr
320c0 61 6e 73 66 6f 72 6d 20 74 68 65 20 22 2e 65 78  ansform the ".ex
320d0 63 65 6c 22 20 63 6f 6d 6d 61 6e 64 20 69 6e 74  cel" command int
320e0 6f 20 22 2e 6f 6e 63 65 20 2d 78 22 20 2a 2f 0a  o ".once -x" */.
320f0 20 20 20 20 20 20 6e 41 72 67 20 3d 20 32 3b 0a        nArg = 2;.
32100 20 20 20 20 20 20 61 7a 41 72 67 5b 30 5d 20 3d        azArg[0] =
32110 20 22 6f 6e 63 65 22 3b 0a 20 20 20 20 20 20 7a   "once";.      z
32120 46 69 6c 65 20 3d 20 61 7a 41 72 67 5b 31 5d 20  File = azArg[1] 
32130 3d 20 22 2d 78 22 3b 0a 20 20 20 20 20 20 6e 20  = "-x";.      n 
32140 3d 20 34 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  = 4;.    }.    i
32150 66 28 20 6e 41 72 67 3e 32 20 29 7b 0a 20 20 20  f( nArg>2 ){.   
32160 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73     utf8_printf(s
32170 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e  tderr, "Usage: .
32180 25 73 20 5b 2d 65 7c 2d 78 7c 46 49 4c 45 5d 5c  %s [-e|-x|FILE]\
32190 6e 22 2c 20 61 7a 41 72 67 5b 30 5d 29 3b 0a 20  n", azArg[0]);. 
321a0 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20       rc = 1;.   
321b0 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d     goto meta_com
321c0 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20 7d  mand_exit;.    }
321d0 0a 20 20 20 20 69 66 28 20 6e 3e 31 20 26 26 20  .    if( n>1 && 
321e0 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d  strncmp(azArg[0]
321f0 2c 20 22 6f 6e 63 65 22 2c 20 6e 29 3d 3d 30 20  , "once", n)==0 
32200 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 41 72  ){.      if( nAr
32210 67 3c 32 20 29 7b 0a 20 20 20 20 20 20 20 20 72  g<2 ){.        r
32220 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  aw_printf(stderr
32230 2c 20 22 55 73 61 67 65 3a 20 2e 6f 6e 63 65 20  , "Usage: .once 
32240 28 2d 65 7c 2d 78 7c 46 49 4c 45 29 5c 6e 22 29  (-e|-x|FILE)\n")
32250 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 31  ;.        rc = 1
32260 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d  ;.        goto m
32270 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74  eta_command_exit
32280 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
32290 70 2d 3e 6f 75 74 43 6f 75 6e 74 20 3d 20 32 3b  p->outCount = 2;
322a0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
322b0 20 20 70 2d 3e 6f 75 74 43 6f 75 6e 74 20 3d 20    p->outCount = 
322c0 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6f 75 74  0;.    }.    out
322d0 70 75 74 5f 72 65 73 65 74 28 70 29 3b 0a 20 20  put_reset(p);.  
322e0 20 20 69 66 28 20 7a 46 69 6c 65 5b 30 5d 3d 3d    if( zFile[0]==
322f0 27 2d 27 20 26 26 20 7a 46 69 6c 65 5b 31 5d 3d  '-' && zFile[1]=
32300 3d 27 2d 27 20 29 20 7a 46 69 6c 65 2b 2b 3b 0a  ='-' ) zFile++;.
32310 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4e  #ifndef SQLITE_N
32320 4f 48 41 56 45 5f 53 59 53 54 45 4d 0a 20 20 20  OHAVE_SYSTEM.   
32330 20 69 66 28 20 73 74 72 63 6d 70 28 7a 46 69 6c   if( strcmp(zFil
32340 65 2c 20 22 2d 65 22 29 3d 3d 30 20 7c 7c 20 73  e, "-e")==0 || s
32350 74 72 63 6d 70 28 7a 46 69 6c 65 2c 20 22 2d 78  trcmp(zFile, "-x
32360 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  ")==0 ){.      p
32370 2d 3e 64 6f 58 64 67 4f 70 65 6e 20 3d 20 31 3b  ->doXdgOpen = 1;
32380 0a 20 20 20 20 20 20 6f 75 74 70 75 74 4d 6f 64  .      outputMod
32390 65 50 75 73 68 28 70 29 3b 0a 20 20 20 20 20 20  ePush(p);.      
323a0 69 66 28 20 7a 46 69 6c 65 5b 31 5d 3d 3d 27 78  if( zFile[1]=='x
323b0 27 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 65 77  ' ){.        new
323c0 54 65 6d 70 46 69 6c 65 28 70 2c 20 22 63 73 76  TempFile(p, "csv
323d0 22 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6d  ");.        p->m
323e0 6f 64 65 20 3d 20 4d 4f 44 45 5f 43 73 76 3b 0a  ode = MODE_Csv;.
323f0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
32400 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
32410 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 29  p->colSeparator)
32420 2c 20 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f  , p->colSeparato
32430 72 2c 20 53 45 50 5f 43 6f 6d 6d 61 29 3b 0a 20  r, SEP_Comma);. 
32440 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73         sqlite3_s
32450 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 70  nprintf(sizeof(p
32460 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 29 2c  ->rowSeparator),
32470 20 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72   p->rowSeparator
32480 2c 20 53 45 50 5f 43 72 4c 66 29 3b 0a 20 20 20  , SEP_CrLf);.   
32490 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
324a0 20 20 6e 65 77 54 65 6d 70 46 69 6c 65 28 70 2c    newTempFile(p,
324b0 20 22 74 78 74 22 29 3b 0a 20 20 20 20 20 20 20   "txt");.       
324c0 20 62 54 78 74 4d 6f 64 65 20 3d 20 31 3b 0a 20   bTxtMode = 1;. 
324d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 46 69       }.      zFi
324e0 6c 65 20 3d 20 70 2d 3e 7a 54 65 6d 70 46 69 6c  le = p->zTempFil
324f0 65 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20  e;.    }.#endif 
32500 2f 2a 20 53 51 4c 49 54 45 5f 4e 4f 48 41 56 45  /* SQLITE_NOHAVE
32510 5f 53 59 53 54 45 4d 20 2a 2f 0a 20 20 20 20 69  _SYSTEM */.    i
32520 66 28 20 7a 46 69 6c 65 5b 30 5d 3d 3d 27 7c 27  f( zFile[0]=='|'
32530 20 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   ){.#ifdef SQLIT
32540 45 5f 4f 4d 49 54 5f 50 4f 50 45 4e 0a 20 20 20  E_OMIT_POPEN.   
32550 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74     raw_printf(st
32560 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 70 69  derr, "Error: pi
32570 70 65 73 20 61 72 65 20 6e 6f 74 20 73 75 70 70  pes are not supp
32580 6f 72 74 65 64 20 69 6e 20 74 68 69 73 20 4f 53  orted in this OS
32590 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  \n");.      rc =
325a0 20 31 3b 0a 20 20 20 20 20 20 70 2d 3e 6f 75 74   1;.      p->out
325b0 20 3d 20 73 74 64 6f 75 74 3b 0a 23 65 6c 73 65   = stdout;.#else
325c0 0a 20 20 20 20 20 20 70 2d 3e 6f 75 74 20 3d 20  .      p->out = 
325d0 70 6f 70 65 6e 28 7a 46 69 6c 65 20 2b 20 31 2c  popen(zFile + 1,
325e0 20 22 77 22 29 3b 0a 20 20 20 20 20 20 69 66 28   "w");.      if(
325f0 20 70 2d 3e 6f 75 74 3d 3d 30 20 29 7b 0a 20 20   p->out==0 ){.  
32600 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
32610 66 28 73 74 64 65 72 72 2c 22 45 72 72 6f 72 3a  f(stderr,"Error:
32620 20 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 70 69 70   cannot open pip
32630 65 20 5c 22 25 73 5c 22 5c 6e 22 2c 20 7a 46 69  e \"%s\"\n", zFi
32640 6c 65 20 2b 20 31 29 3b 0a 20 20 20 20 20 20 20  le + 1);.       
32650 20 70 2d 3e 6f 75 74 20 3d 20 73 74 64 6f 75 74   p->out = stdout
32660 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 31  ;.        rc = 1
32670 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
32680 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73         sqlite3_s
32690 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 70  nprintf(sizeof(p
326a0 2d 3e 6f 75 74 66 69 6c 65 29 2c 20 70 2d 3e 6f  ->outfile), p->o
326b0 75 74 66 69 6c 65 2c 20 22 25 73 22 2c 20 7a 46  utfile, "%s", zF
326c0 69 6c 65 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65  ile);.      }.#e
326d0 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ndif.    }else{.
326e0 20 20 20 20 20 20 70 2d 3e 6f 75 74 20 3d 20 6f        p->out = o
326f0 75 74 70 75 74 5f 66 69 6c 65 5f 6f 70 65 6e 28  utput_file_open(
32700 7a 46 69 6c 65 2c 20 62 54 78 74 4d 6f 64 65 29  zFile, bTxtMode)
32710 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6f  ;.      if( p->o
32720 75 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ut==0 ){.       
32730 20 69 66 28 20 73 74 72 63 6d 70 28 7a 46 69 6c   if( strcmp(zFil
32740 65 2c 22 6f 66 66 22 29 21 3d 30 20 29 7b 0a 20  e,"off")!=0 ){. 
32750 20 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72           utf8_pr
32760 69 6e 74 66 28 73 74 64 65 72 72 2c 22 45 72 72  intf(stderr,"Err
32770 6f 72 3a 20 63 61 6e 6e 6f 74 20 77 72 69 74 65  or: cannot write
32780 20 74 6f 20 5c 22 25 73 5c 22 5c 6e 22 2c 20 7a   to \"%s\"\n", z
32790 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 7d  File);.        }
327a0 0a 20 20 20 20 20 20 20 20 70 2d 3e 6f 75 74 20  .        p->out 
327b0 3d 20 73 74 64 6f 75 74 3b 0a 20 20 20 20 20 20  = stdout;.      
327c0 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20    rc = 1;.      
327d0 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20  } else {.       
327e0 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
327f0 66 28 73 69 7a 65 6f 66 28 70 2d 3e 6f 75 74 66  f(sizeof(p->outf
32800 69 6c 65 29 2c 20 70 2d 3e 6f 75 74 66 69 6c 65  ile), p->outfile
32810 2c 20 22 25 73 22 2c 20 7a 46 69 6c 65 29 3b 0a  , "%s", zFile);.
32820 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
32830 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d  }else..  if( c==
32840 27 70 27 20 26 26 20 6e 3e 3d 33 20 26 26 20 73  'p' && n>=3 && s
32850 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c  trncmp(azArg[0],
32860 20 22 70 72 69 6e 74 22 2c 20 6e 29 3d 3d 30 20   "print", n)==0 
32870 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
32880 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 41 72    for(i=1; i<nAr
32890 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  g; i++){.      i
328a0 66 28 20 69 3e 31 20 29 20 72 61 77 5f 70 72 69  f( i>1 ) raw_pri
328b0 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 20 22 29  ntf(p->out, " ")
328c0 3b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69  ;.      utf8_pri
328d0 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22  ntf(p->out, "%s"
328e0 2c 20 61 7a 41 72 67 5b 69 5d 29 3b 0a 20 20 20  , azArg[i]);.   
328f0 20 7d 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74   }.    raw_print
32900 66 28 70 2d 3e 6f 75 74 2c 20 22 5c 6e 22 29 3b  f(p->out, "\n");
32910 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20  .  }else..  if( 
32920 63 3d 3d 27 70 27 20 26 26 20 73 74 72 6e 63 6d  c=='p' && strncm
32930 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 70 72 6f  p(azArg[0], "pro
32940 6d 70 74 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20  mpt", n)==0 ){. 
32950 20 20 20 69 66 28 20 6e 41 72 67 20 3e 3d 20 32     if( nArg >= 2
32960 29 20 7b 0a 20 20 20 20 20 20 73 74 72 6e 63 70  ) {.      strncp
32970 79 28 6d 61 69 6e 50 72 6f 6d 70 74 2c 61 7a 41  y(mainPrompt,azA
32980 72 67 5b 31 5d 2c 28 69 6e 74 29 41 72 72 61 79  rg[1],(int)Array
32990 53 69 7a 65 28 6d 61 69 6e 50 72 6f 6d 70 74 29  Size(mainPrompt)
329a0 2d 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  -1);.    }.    i
329b0 66 28 20 6e 41 72 67 20 3e 3d 20 33 29 20 7b 0a  f( nArg >= 3) {.
329c0 20 20 20 20 20 20 73 74 72 6e 63 70 79 28 63 6f        strncpy(co
329d0 6e 74 69 6e 75 65 50 72 6f 6d 70 74 2c 61 7a 41  ntinuePrompt,azA
329e0 72 67 5b 32 5d 2c 28 69 6e 74 29 41 72 72 61 79  rg[2],(int)Array
329f0 53 69 7a 65 28 63 6f 6e 74 69 6e 75 65 50 72 6f  Size(continuePro
32a00 6d 70 74 29 2d 31 29 3b 0a 20 20 20 20 7d 0a 20  mpt)-1);.    }. 
32a10 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d   }else..  if( c=
32a20 3d 27 71 27 20 26 26 20 73 74 72 6e 63 6d 70 28  ='q' && strncmp(
32a30 61 7a 41 72 67 5b 30 5d 2c 20 22 71 75 69 74 22  azArg[0], "quit"
32a40 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72  , n)==0 ){.    r
32a50 63 20 3d 20 32 3b 0a 20 20 7d 65 6c 73 65 0a 0a  c = 2;.  }else..
32a60 20 20 69 66 28 20 63 3d 3d 27 72 27 20 26 26 20    if( c=='r' && 
32a70 6e 3e 3d 33 20 26 26 20 73 74 72 6e 63 6d 70 28  n>=3 && strncmp(
32a80 61 7a 41 72 67 5b 30 5d 2c 20 22 72 65 61 64 22  azArg[0], "read"
32a90 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 46  , n)==0 ){.    F
32aa0 49 4c 45 20 2a 61 6c 74 3b 0a 20 20 20 20 69 66  ILE *alt;.    if
32ab0 28 20 6e 41 72 67 21 3d 32 20 29 7b 0a 20 20 20  ( nArg!=2 ){.   
32ac0 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74     raw_printf(st
32ad0 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 72  derr, "Usage: .r
32ae0 65 61 64 20 46 49 4c 45 5c 6e 22 29 3b 0a 20 20  ead FILE\n");.  
32af0 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
32b00 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d    goto meta_comm
32b10 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a  and_exit;.    }.
32b20 20 20 20 20 61 6c 74 20 3d 20 66 6f 70 65 6e 28      alt = fopen(
32b30 61 7a 41 72 67 5b 31 5d 2c 20 22 72 62 22 29 3b  azArg[1], "rb");
32b40 0a 20 20 20 20 69 66 28 20 61 6c 74 3d 3d 30 20  .    if( alt==0 
32b50 29 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72  ){.      utf8_pr
32b60 69 6e 74 66 28 73 74 64 65 72 72 2c 22 45 72 72  intf(stderr,"Err
32b70 6f 72 3a 20 63 61 6e 6e 6f 74 20 6f 70 65 6e 20  or: cannot open 
32b80 5c 22 25 73 5c 22 5c 6e 22 2c 20 61 7a 41 72 67  \"%s\"\n", azArg
32b90 5b 31 5d 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  [1]);.      rc =
32ba0 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   1;.    }else{. 
32bb0 20 20 20 20 20 72 63 20 3d 20 70 72 6f 63 65 73       rc = proces
32bc0 73 5f 69 6e 70 75 74 28 70 2c 20 61 6c 74 29 3b  s_input(p, alt);
32bd0 0a 20 20 20 20 20 20 66 63 6c 6f 73 65 28 61 6c  .      fclose(al
32be0 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  t);.    }.  }els
32bf0 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 72 27 20  e..  if( c=='r' 
32c00 26 26 20 6e 3e 3d 33 20 26 26 20 73 74 72 6e 63  && n>=3 && strnc
32c10 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 72 65  mp(azArg[0], "re
32c20 73 74 6f 72 65 22 2c 20 6e 29 3d 3d 30 20 29 7b  store", n)==0 ){
32c30 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
32c40 2a 7a 53 72 63 46 69 6c 65 3b 0a 20 20 20 20 63  *zSrcFile;.    c
32c50 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 3b 0a  onst char *zDb;.
32c60 20 20 20 20 73 71 6c 69 74 65 33 20 2a 70 53 72      sqlite3 *pSr
32c70 63 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62  c;.    sqlite3_b
32c80 61 63 6b 75 70 20 2a 70 42 61 63 6b 75 70 3b 0a  ackup *pBackup;.
32c90 20 20 20 20 69 6e 74 20 6e 54 69 6d 65 6f 75 74      int nTimeout
32ca0 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28 20 6e   = 0;..    if( n
32cb0 41 72 67 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20  Arg==2 ){.      
32cc0 7a 53 72 63 46 69 6c 65 20 3d 20 61 7a 41 72 67  zSrcFile = azArg
32cd0 5b 31 5d 3b 0a 20 20 20 20 20 20 7a 44 62 20 3d  [1];.      zDb =
32ce0 20 22 6d 61 69 6e 22 3b 0a 20 20 20 20 7d 65 6c   "main";.    }el
32cf0 73 65 20 69 66 28 20 6e 41 72 67 3d 3d 33 20 29  se if( nArg==3 )
32d00 7b 0a 20 20 20 20 20 20 7a 53 72 63 46 69 6c 65  {.      zSrcFile
32d10 20 3d 20 61 7a 41 72 67 5b 32 5d 3b 0a 20 20 20   = azArg[2];.   
32d20 20 20 20 7a 44 62 20 3d 20 61 7a 41 72 67 5b 31     zDb = azArg[1
32d30 5d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  ];.    }else{.  
32d40 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73      raw_printf(s
32d50 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e  tderr, "Usage: .
32d60 72 65 73 74 6f 72 65 20 3f 44 42 3f 20 46 49 4c  restore ?DB? FIL
32d70 45 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20  E\n");.      rc 
32d80 3d 20 31 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  = 1;.      goto 
32d90 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69  meta_command_exi
32da0 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  t;.    }.    rc 
32db0 3d 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 7a  = sqlite3_open(z
32dc0 53 72 63 46 69 6c 65 2c 20 26 70 53 72 63 29 3b  SrcFile, &pSrc);
32dd0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
32de0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
32df0 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65  utf8_printf(stde
32e00 72 72 2c 20 22 45 72 72 6f 72 3a 20 63 61 6e 6e  rr, "Error: cann
32e10 6f 74 20 6f 70 65 6e 20 5c 22 25 73 5c 22 5c 6e  ot open \"%s\"\n
32e20 22 2c 20 7a 53 72 63 46 69 6c 65 29 3b 0a 20 20  ", zSrcFile);.  
32e30 20 20 20 20 63 6c 6f 73 65 5f 64 62 28 70 53 72      close_db(pSr
32e40 63 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  c);.      return
32e50 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6f 70   1;.    }.    op
32e60 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a 20 20 20  en_db(p, 0);.   
32e70 20 70 42 61 63 6b 75 70 20 3d 20 73 71 6c 69 74   pBackup = sqlit
32e80 65 33 5f 62 61 63 6b 75 70 5f 69 6e 69 74 28 70  e3_backup_init(p
32e90 2d 3e 64 62 2c 20 7a 44 62 2c 20 70 53 72 63 2c  ->db, zDb, pSrc,
32ea0 20 22 6d 61 69 6e 22 29 3b 0a 20 20 20 20 69 66   "main");.    if
32eb0 28 20 70 42 61 63 6b 75 70 3d 3d 30 20 29 7b 0a  ( pBackup==0 ){.
32ec0 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
32ed0 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72  f(stderr, "Error
32ee0 3a 20 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65 33  : %s\n", sqlite3
32ef0 5f 65 72 72 6d 73 67 28 70 2d 3e 64 62 29 29 3b  _errmsg(p->db));
32f00 0a 20 20 20 20 20 20 63 6c 6f 73 65 5f 64 62 28  .      close_db(
32f10 70 53 72 63 29 3b 0a 20 20 20 20 20 20 72 65 74  pSrc);.      ret
32f20 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 1;.    }.   
32f30 20 77 68 69 6c 65 28 20 28 72 63 20 3d 20 73 71   while( (rc = sq
32f40 6c 69 74 65 33 5f 62 61 63 6b 75 70 5f 73 74 65  lite3_backup_ste
32f50 70 28 70 42 61 63 6b 75 70 2c 31 30 30 29 29 3d  p(pBackup,100))=
32f60 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 20 20  =SQLITE_OK.     
32f70 20 20 20 20 20 7c 7c 20 72 63 3d 3d 53 51 4c 49       || rc==SQLI
32f80 54 45 5f 42 55 53 59 20 20 29 7b 0a 20 20 20 20  TE_BUSY  ){.    
32f90 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
32fa0 5f 42 55 53 59 20 29 7b 0a 20 20 20 20 20 20 20  _BUSY ){.       
32fb0 20 69 66 28 20 6e 54 69 6d 65 6f 75 74 2b 2b 20   if( nTimeout++ 
32fc0 3e 3d 20 33 20 29 20 62 72 65 61 6b 3b 0a 20 20  >= 3 ) break;.  
32fd0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6c        sqlite3_sl
32fe0 65 65 70 28 31 30 30 29 3b 0a 20 20 20 20 20 20  eep(100);.      
32ff0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  }.    }.    sqli
33000 74 65 33 5f 62 61 63 6b 75 70 5f 66 69 6e 69 73  te3_backup_finis
33010 68 28 70 42 61 63 6b 75 70 29 3b 0a 20 20 20 20  h(pBackup);.    
33020 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44  if( rc==SQLITE_D
33030 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ONE ){.      rc 
33040 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  = 0;.    }else i
33050 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55  f( rc==SQLITE_BU
33060 53 59 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45  SY || rc==SQLITE
33070 5f 4c 4f 43 4b 45 44 20 29 7b 0a 20 20 20 20 20  _LOCKED ){.     
33080 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65   raw_printf(stde
33090 72 72 2c 20 22 45 72 72 6f 72 3a 20 73 6f 75 72  rr, "Error: sour
330a0 63 65 20 64 61 74 61 62 61 73 65 20 69 73 20 62  ce database is b
330b0 75 73 79 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72  usy\n");.      r
330c0 63 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65  c = 1;.    }else
330d0 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69  {.      utf8_pri
330e0 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72  ntf(stderr, "Err
330f0 6f 72 3a 20 25 73 5c 6e 22 2c 20 73 71 6c 69 74  or: %s\n", sqlit
33100 65 33 5f 65 72 72 6d 73 67 28 70 2d 3e 64 62 29  e3_errmsg(p->db)
33110 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b  );.      rc = 1;
33120 0a 20 20 20 20 7d 0a 20 20 20 20 63 6c 6f 73 65  .    }.    close
33130 5f 64 62 28 70 53 72 63 29 3b 0a 20 20 7d 65 6c  _db(pSrc);.  }el
33140 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 73 27  se..  if( c=='s'
33150 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72   && strncmp(azAr
33160 67 5b 30 5d 2c 20 22 73 63 61 6e 73 74 61 74 73  g[0], "scanstats
33170 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ", n)==0 ){.    
33180 69 66 28 20 6e 41 72 67 3d 3d 32 20 29 7b 0a 20  if( nArg==2 ){. 
33190 20 20 20 20 20 70 2d 3e 73 63 61 6e 73 74 61 74       p->scanstat
331a0 73 4f 6e 20 3d 20 28 75 38 29 62 6f 6f 6c 65 61  sOn = (u8)boolea
331b0 6e 56 61 6c 75 65 28 61 7a 41 72 67 5b 31 5d 29  nValue(azArg[1])
331c0 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
331d0 5f 45 4e 41 42 4c 45 5f 53 54 4d 54 5f 53 43 41  _ENABLE_STMT_SCA
331e0 4e 53 54 41 54 55 53 0a 20 20 20 20 20 20 72 61  NSTATUS.      ra
331f0 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  w_printf(stderr,
33200 20 22 57 61 72 6e 69 6e 67 3a 20 2e 73 63 61 6e   "Warning: .scan
33210 73 74 61 74 73 20 6e 6f 74 20 61 76 61 69 6c 61  stats not availa
33220 62 6c 65 20 69 6e 20 74 68 69 73 20 62 75 69 6c  ble in this buil
33230 64 2e 5c 6e 22 29 3b 0a 23 65 6e 64 69 66 0a 20  d.\n");.#endif. 
33240 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
33250 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72  raw_printf(stder
33260 72 2c 20 22 55 73 61 67 65 3a 20 2e 73 63 61 6e  r, "Usage: .scan
33270 73 74 61 74 73 20 6f 6e 7c 6f 66 66 5c 6e 22 29  stats on|off\n")
33280 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a  ;.      rc = 1;.
33290 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20      }.  }else.. 
332a0 20 69 66 28 20 63 3d 3d 27 73 27 20 26 26 20 73   if( c=='s' && s
332b0 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c  trncmp(azArg[0],
332c0 20 22 73 63 68 65 6d 61 22 2c 20 6e 29 3d 3d 30   "schema", n)==0
332d0 20 29 7b 0a 20 20 20 20 53 68 65 6c 6c 54 65 78   ){.    ShellTex
332e0 74 20 73 53 65 6c 65 63 74 3b 0a 20 20 20 20 53  t sSelect;.    S
332f0 68 65 6c 6c 53 74 61 74 65 20 64 61 74 61 3b 0a  hellState data;.
33300 20 20 20 20 63 68 61 72 20 2a 7a 45 72 72 4d 73      char *zErrMs
33310 67 20 3d 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74  g = 0;.    const
33320 20 63 68 61 72 20 2a 7a 44 69 76 20 3d 20 22 28   char *zDiv = "(
33330 22 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  ";.    const cha
33340 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20  r *zName = 0;.  
33350 20 20 69 6e 74 20 69 53 63 68 65 6d 61 20 3d 20    int iSchema = 
33360 30 3b 0a 20 20 20 20 69 6e 74 20 62 44 65 62 75  0;.    int bDebu
33370 67 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 69  g = 0;.    int i
33380 69 3b 0a 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28  i;..    open_db(
33390 70 2c 20 30 29 3b 0a 20 20 20 20 6d 65 6d 63 70  p, 0);.    memcp
333a0 79 28 26 64 61 74 61 2c 20 70 2c 20 73 69 7a 65  y(&data, p, size
333b0 6f 66 28 64 61 74 61 29 29 3b 0a 20 20 20 20 64  of(data));.    d
333c0 61 74 61 2e 73 68 6f 77 48 65 61 64 65 72 20 3d  ata.showHeader =
333d0 20 30 3b 0a 20 20 20 20 64 61 74 61 2e 63 4d 6f   0;.    data.cMo
333e0 64 65 20 3d 20 64 61 74 61 2e 6d 6f 64 65 20 3d  de = data.mode =
333f0 20 4d 4f 44 45 5f 53 65 6d 69 3b 0a 20 20 20 20   MODE_Semi;.    
33400 69 6e 69 74 54 65 78 74 28 26 73 53 65 6c 65 63  initText(&sSelec
33410 74 29 3b 0a 20 20 20 20 66 6f 72 28 69 69 3d 31  t);.    for(ii=1
33420 3b 20 69 69 3c 6e 41 72 67 3b 20 69 69 2b 2b 29  ; ii<nArg; ii++)
33430 7b 0a 20 20 20 20 20 20 69 66 28 20 6f 70 74 69  {.      if( opti
33440 6f 6e 4d 61 74 63 68 28 61 7a 41 72 67 5b 69 69  onMatch(azArg[ii
33450 5d 2c 22 69 6e 64 65 6e 74 22 29 20 29 7b 0a 20  ],"indent") ){. 
33460 20 20 20 20 20 20 20 64 61 74 61 2e 63 4d 6f 64         data.cMod
33470 65 20 3d 20 64 61 74 61 2e 6d 6f 64 65 20 3d 20  e = data.mode = 
33480 4d 4f 44 45 5f 50 72 65 74 74 79 3b 0a 20 20 20  MODE_Pretty;.   
33490 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 74     }else if( opt
334a0 69 6f 6e 4d 61 74 63 68 28 61 7a 41 72 67 5b 69  ionMatch(azArg[i
334b0 69 5d 2c 22 64 65 62 75 67 22 29 20 29 7b 0a 20  i],"debug") ){. 
334c0 20 20 20 20 20 20 20 62 44 65 62 75 67 20 3d 20         bDebug = 
334d0 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  1;.      }else i
334e0 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20  f( zName==0 ){. 
334f0 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 61         zName = a
33500 7a 41 72 67 5b 69 69 5d 3b 0a 20 20 20 20 20 20  zArg[ii];.      
33510 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72  }else{.        r
33520 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  aw_printf(stderr
33530 2c 20 22 55 73 61 67 65 3a 20 2e 73 63 68 65 6d  , "Usage: .schem
33540 61 20 3f 2d 2d 69 6e 64 65 6e 74 3f 20 3f 4c 49  a ?--indent? ?LI
33550 4b 45 2d 50 41 54 54 45 52 4e 3f 5c 6e 22 29 3b  KE-PATTERN?\n");
33560 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b  .        rc = 1;
33570 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 65  .        goto me
33580 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b  ta_command_exit;
33590 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
335a0 20 20 20 69 66 28 20 7a 4e 61 6d 65 21 3d 30 20     if( zName!=0 
335b0 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 73 4d  ){.      int isM
335c0 61 73 74 65 72 20 3d 20 73 71 6c 69 74 65 33 5f  aster = sqlite3_
335d0 73 74 72 6c 69 6b 65 28 7a 4e 61 6d 65 2c 20 22  strlike(zName, "
335e0 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 22 2c 20  sqlite_master", 
335f0 27 5c 5c 27 29 3d 3d 30 3b 0a 20 20 20 20 20 20  '\\')==0;.      
33600 69 66 28 20 69 73 4d 61 73 74 65 72 20 7c 7c 20  if( isMaster || 
33610 73 71 6c 69 74 65 33 5f 73 74 72 6c 69 6b 65 28  sqlite3_strlike(
33620 7a 4e 61 6d 65 2c 22 73 71 6c 69 74 65 5f 74 65  zName,"sqlite_te
33630 6d 70 5f 6d 61 73 74 65 72 22 2c 20 27 5c 5c 27  mp_master", '\\'
33640 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
33650 63 68 61 72 20 2a 6e 65 77 5f 61 72 67 76 5b 32  char *new_argv[2
33660 5d 2c 20 2a 6e 65 77 5f 63 6f 6c 76 5b 32 5d 3b  ], *new_colv[2];
33670 0a 20 20 20 20 20 20 20 20 6e 65 77 5f 61 72 67  .        new_arg
33680 76 5b 30 5d 20 3d 20 73 71 6c 69 74 65 33 5f 6d  v[0] = sqlite3_m
33690 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20  printf(.        
336a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 43                "C
336b0 52 45 41 54 45 20 54 41 42 4c 45 20 25 73 20 28  REATE TABLE %s (
336c0 5c 6e 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  \n".            
336d0 20 20 20 20 20 20 20 20 20 20 22 20 20 74 79 70            "  typ
336e0 65 20 74 65 78 74 2c 5c 6e 22 0a 20 20 20 20 20  e text,\n".     
336f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33700 20 22 20 20 6e 61 6d 65 20 74 65 78 74 2c 5c 6e   "  name text,\n
33710 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ".              
33720 20 20 20 20 20 20 20 20 22 20 20 74 62 6c 5f 6e          "  tbl_n
33730 61 6d 65 20 74 65 78 74 2c 5c 6e 22 0a 20 20 20  ame text,\n".   
33740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33750 20 20 20 22 20 20 72 6f 6f 74 70 61 67 65 20 69     "  rootpage i
33760 6e 74 65 67 65 72 2c 5c 6e 22 0a 20 20 20 20 20  nteger,\n".     
33770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33780 20 22 20 20 73 71 6c 20 74 65 78 74 5c 6e 22 0a   "  sql text\n".
33790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
337a0 20 20 20 20 20 20 22 29 22 2c 20 69 73 4d 61 73        ")", isMas
337b0 74 65 72 20 3f 20 22 73 71 6c 69 74 65 5f 6d 61  ter ? "sqlite_ma
337c0 73 74 65 72 22 20 3a 20 22 73 71 6c 69 74 65 5f  ster" : "sqlite_
337d0 74 65 6d 70 5f 6d 61 73 74 65 72 22 29 3b 0a 20  temp_master");. 
337e0 20 20 20 20 20 20 20 6e 65 77 5f 61 72 67 76 5b         new_argv[
337f0 31 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  1] = 0;.        
33800 6e 65 77 5f 63 6f 6c 76 5b 30 5d 20 3d 20 22 73  new_colv[0] = "s
33810 71 6c 22 3b 0a 20 20 20 20 20 20 20 20 6e 65 77  ql";.        new
33820 5f 63 6f 6c 76 5b 31 5d 20 3d 20 30 3b 0a 20 20  _colv[1] = 0;.  
33830 20 20 20 20 20 20 63 61 6c 6c 62 61 63 6b 28 26        callback(&
33840 64 61 74 61 2c 20 31 2c 20 6e 65 77 5f 61 72 67  data, 1, new_arg
33850 76 2c 20 6e 65 77 5f 63 6f 6c 76 29 3b 0a 20 20  v, new_colv);.  
33860 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
33870 65 65 28 6e 65 77 5f 61 72 67 76 5b 30 5d 29 3b  ee(new_argv[0]);
33880 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
33890 20 20 20 69 66 28 20 7a 44 69 76 20 29 7b 0a 20     if( zDiv ){. 
338a0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d       sqlite3_stm
338b0 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20  t *pStmt = 0;.  
338c0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
338d0 5f 70 72 65 70 61 72 65 5f 76 32 28 70 2d 3e 64  _prepare_v2(p->d
338e0 62 2c 20 22 53 45 4c 45 43 54 20 6e 61 6d 65 20  b, "SELECT name 
338f0 46 52 4f 4d 20 70 72 61 67 6d 61 5f 64 61 74 61  FROM pragma_data
33900 62 61 73 65 5f 6c 69 73 74 22 2c 0a 20 20 20 20  base_list",.    
33910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33920 20 20 20 20 20 20 20 20 20 20 2d 31 2c 20 26 70            -1, &p
33930 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 20 20  Stmt, 0);.      
33940 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
33950 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74    utf8_printf(st
33960 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 25 73  derr, "Error: %s
33970 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72  \n", sqlite3_err
33980 6d 73 67 28 70 2d 3e 64 62 29 29 3b 0a 20 20 20  msg(p->db));.   
33990 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e       sqlite3_fin
339a0 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20  alize(pStmt);.  
339b0 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
339c0 20 20 20 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f        goto meta_
339d0 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20  command_exit;.  
339e0 20 20 20 20 7d 0a 20 20 20 20 20 20 61 70 70 65      }.      appe
339f0 6e 64 54 65 78 74 28 26 73 53 65 6c 65 63 74 2c  ndText(&sSelect,
33a00 20 22 53 45 4c 45 43 54 20 73 71 6c 20 46 52 4f   "SELECT sql FRO
33a10 4d 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 53  M", 0);.      iS
33a20 63 68 65 6d 61 20 3d 20 30 3b 0a 20 20 20 20 20  chema = 0;.     
33a30 20 77 68 69 6c 65 28 20 73 71 6c 69 74 65 33 5f   while( sqlite3_
33a40 73 74 65 70 28 70 53 74 6d 74 29 3d 3d 53 51 4c  step(pStmt)==SQL
33a50 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 20  ITE_ROW ){.     
33a60 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
33a70 44 62 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  Db = (const char
33a80 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  *)sqlite3_column
33a90 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 30 29 3b  _text(pStmt, 0);
33aa0 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 7a 53  .        char zS
33ab0 63 4e 75 6d 5b 33 30 5d 3b 0a 20 20 20 20 20 20  cNum[30];.      
33ac0 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
33ad0 74 66 28 73 69 7a 65 6f 66 28 7a 53 63 4e 75 6d  tf(sizeof(zScNum
33ae0 29 2c 20 7a 53 63 4e 75 6d 2c 20 22 25 64 22 2c  ), zScNum, "%d",
33af0 20 2b 2b 69 53 63 68 65 6d 61 29 3b 0a 20 20 20   ++iSchema);.   
33b00 20 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28       appendText(
33b10 26 73 53 65 6c 65 63 74 2c 20 7a 44 69 76 2c 20  &sSelect, zDiv, 
33b20 30 29 3b 0a 20 20 20 20 20 20 20 20 7a 44 69 76  0);.        zDiv
33b30 20 3d 20 22 20 55 4e 49 4f 4e 20 41 4c 4c 20 22   = " UNION ALL "
33b40 3b 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e 64  ;.        append
33b50 54 65 78 74 28 26 73 53 65 6c 65 63 74 2c 20 22  Text(&sSelect, "
33b60 53 45 4c 45 43 54 20 73 68 65 6c 6c 5f 61 64 64  SELECT shell_add
33b70 5f 73 63 68 65 6d 61 28 73 71 6c 2c 22 2c 20 30  _schema(sql,", 0
33b80 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  );.        if( s
33b90 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28 7a  qlite3_stricmp(z
33ba0 44 62 2c 20 22 6d 61 69 6e 22 29 21 3d 30 20 29  Db, "main")!=0 )
33bb0 7b 0a 20 20 20 20 20 20 20 20 20 20 61 70 70 65  {.          appe
33bc0 6e 64 54 65 78 74 28 26 73 53 65 6c 65 63 74 2c  ndText(&sSelect,
33bd0 20 7a 44 62 2c 20 27 22 27 29 3b 0a 20 20 20 20   zDb, '"');.    
33be0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
33bf0 20 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28       appendText(
33c00 26 73 53 65 6c 65 63 74 2c 20 22 4e 55 4c 4c 22  &sSelect, "NULL"
33c10 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  , 0);.        }.
33c20 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 54 65          appendTe
33c30 78 74 28 26 73 53 65 6c 65 63 74 2c 20 22 2c 6e  xt(&sSelect, ",n
33c40 61 6d 65 29 20 41 53 20 73 71 6c 2c 20 74 79 70  ame) AS sql, typ
33c50 65 2c 20 74 62 6c 5f 6e 61 6d 65 2c 20 6e 61 6d  e, tbl_name, nam
33c60 65 2c 20 72 6f 77 69 64 2c 22 2c 20 30 29 3b 0a  e, rowid,", 0);.
33c70 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 54 65          appendTe
33c80 78 74 28 26 73 53 65 6c 65 63 74 2c 20 7a 53 63  xt(&sSelect, zSc
33c90 4e 75 6d 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  Num, 0);.       
33ca0 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 53 65   appendText(&sSe
33cb0 6c 65 63 74 2c 20 22 20 41 53 20 73 6e 75 6d 2c  lect, " AS snum,
33cc0 20 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20   ", 0);.        
33cd0 61 70 70 65 6e 64 54 65 78 74 28 26 73 53 65 6c  appendText(&sSel
33ce0 65 63 74 2c 20 7a 44 62 2c 20 27 5c 27 27 29 3b  ect, zDb, '\'');
33cf0 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 54  .        appendT
33d00 65 78 74 28 26 73 53 65 6c 65 63 74 2c 20 22 20  ext(&sSelect, " 
33d10 41 53 20 73 6e 61 6d 65 20 46 52 4f 4d 20 22 2c  AS sname FROM ",
33d20 20 30 29 3b 0a 20 20 20 20 20 20 20 20 61 70 70   0);.        app
33d30 65 6e 64 54 65 78 74 28 26 73 53 65 6c 65 63 74  endText(&sSelect
33d40 2c 20 7a 44 62 2c 20 27 22 27 29 3b 0a 20 20 20  , zDb, '"');.   
33d50 20 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28       appendText(
33d60 26 73 53 65 6c 65 63 74 2c 20 22 2e 73 71 6c 69  &sSelect, ".sqli
33d70 74 65 5f 6d 61 73 74 65 72 22 2c 20 30 29 3b 0a  te_master", 0);.
33d80 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
33d90 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
33da0 53 74 6d 74 29 3b 0a 23 69 66 64 65 66 20 53 51  Stmt);.#ifdef SQ
33db0 4c 49 54 45 5f 49 4e 54 52 4f 53 50 45 43 54 49  LITE_INTROSPECTI
33dc0 4f 4e 5f 50 52 41 47 4d 41 53 0a 20 20 20 20 20  ON_PRAGMAS.     
33dd0 20 69 66 28 20 7a 4e 61 6d 65 20 29 7b 0a 20 20   if( zName ){.  
33de0 20 20 20 20 20 20 61 70 70 65 6e 64 54 65 78 74        appendText
33df0 28 26 73 53 65 6c 65 63 74 2c 0a 20 20 20 20 20  (&sSelect,.     
33e00 20 20 20 20 20 20 22 20 55 4e 49 4f 4e 20 41 4c        " UNION AL
33e10 4c 20 53 45 4c 45 43 54 20 73 68 65 6c 6c 5f 6d  L SELECT shell_m
33e20 6f 64 75 6c 65 5f 73 63 68 65 6d 61 28 6e 61 6d  odule_schema(nam
33e30 65 29 2c 22 0a 20 20 20 20 20 20 20 20 20 20 20  e),".           
33e40 22 20 27 74 61 62 6c 65 27 2c 20 6e 61 6d 65 2c  " 'table', name,
33e50 20 6e 61 6d 65 2c 20 6e 61 6d 65 2c 20 39 65 2b   name, name, 9e+
33e60 39 39 2c 20 27 6d 61 69 6e 27 20 46 52 4f 4d 20  99, 'main' FROM 
33e70 70 72 61 67 6d 61 5f 6d 6f 64 75 6c 65 5f 6c 69  pragma_module_li
33e80 73 74 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  st", 0);.      }
33e90 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 61 70  .#endif.      ap
33ea0 70 65 6e 64 54 65 78 74 28 26 73 53 65 6c 65 63  pendText(&sSelec
33eb0 74 2c 20 22 29 20 57 48 45 52 45 20 22 2c 20 30  t, ") WHERE ", 0
33ec0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 4e 61  );.      if( zNa
33ed0 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68  me ){.        ch
33ee0 61 72 20 2a 7a 51 61 72 67 20 3d 20 73 71 6c 69  ar *zQarg = sqli
33ef0 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 51 22  te3_mprintf("%Q"
33f00 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  , zName);.      
33f10 20 20 69 6e 74 20 62 47 6c 6f 62 20 3d 20 73 74    int bGlob = st
33f20 72 63 68 72 28 7a 4e 61 6d 65 2c 20 27 2a 27 29  rchr(zName, '*')
33f30 20 21 3d 20 30 20 7c 7c 20 73 74 72 63 68 72 28   != 0 || strchr(
33f40 7a 4e 61 6d 65 2c 20 27 3f 27 29 20 21 3d 20 30  zName, '?') != 0
33f50 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20   ||.            
33f60 20 20 20 20 20 20 20 20 73 74 72 63 68 72 28 7a          strchr(z
33f70 4e 61 6d 65 2c 20 27 5b 27 29 20 21 3d 20 30 3b  Name, '[') != 0;
33f80 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 74 72  .        if( str
33f90 63 68 72 28 7a 4e 61 6d 65 2c 20 27 2e 27 29 20  chr(zName, '.') 
33fa0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 70 70  ){.          app
33fb0 65 6e 64 54 65 78 74 28 26 73 53 65 6c 65 63 74  endText(&sSelect
33fc0 2c 20 22 6c 6f 77 65 72 28 70 72 69 6e 74 66 28  , "lower(printf(
33fd0 27 25 73 2e 25 73 27 2c 73 6e 61 6d 65 2c 74 62  '%s.%s',sname,tb
33fe0 6c 5f 6e 61 6d 65 29 29 22 2c 20 30 29 3b 0a 20  l_name))", 0);. 
33ff0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
34000 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 54 65          appendTe
34010 78 74 28 26 73 53 65 6c 65 63 74 2c 20 22 6c 6f  xt(&sSelect, "lo
34020 77 65 72 28 74 62 6c 5f 6e 61 6d 65 29 22 2c 20  wer(tbl_name)", 
34030 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  0);.        }.  
34040 20 20 20 20 20 20 61 70 70 65 6e 64 54 65 78 74        appendText
34050 28 26 73 53 65 6c 65 63 74 2c 20 62 47 6c 6f 62  (&sSelect, bGlob
34060 20 3f 20 22 20 47 4c 4f 42 20 22 20 3a 20 22 20   ? " GLOB " : " 
34070 4c 49 4b 45 20 22 2c 20 30 29 3b 0a 20 20 20 20  LIKE ", 0);.    
34080 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26      appendText(&
34090 73 53 65 6c 65 63 74 2c 20 7a 51 61 72 67 2c 20  sSelect, zQarg, 
340a0 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  0);.        if( 
340b0 21 62 47 6c 6f 62 20 29 7b 0a 20 20 20 20 20 20  !bGlob ){.      
340c0 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26      appendText(&
340d0 73 53 65 6c 65 63 74 2c 20 22 20 45 53 43 41 50  sSelect, " ESCAP
340e0 45 20 27 5c 5c 27 20 22 2c 20 30 29 3b 0a 20 20  E '\\' ", 0);.  
340f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
34100 61 70 70 65 6e 64 54 65 78 74 28 26 73 53 65 6c  appendText(&sSel
34110 65 63 74 2c 20 22 20 41 4e 44 20 22 2c 20 30 29  ect, " AND ", 0)
34120 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
34130 33 5f 66 72 65 65 28 7a 51 61 72 67 29 3b 0a 20  3_free(zQarg);. 
34140 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 70 70       }.      app
34150 65 6e 64 54 65 78 74 28 26 73 53 65 6c 65 63 74  endText(&sSelect
34160 2c 20 22 74 79 70 65 21 3d 27 6d 65 74 61 27 20  , "type!='meta' 
34170 41 4e 44 20 73 71 6c 20 49 53 20 4e 4f 54 20 4e  AND sql IS NOT N
34180 55 4c 4c 22 0a 20 20 20 20 20 20 20 20 20 20 20  ULL".           
34190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
341a0 22 20 4f 52 44 45 52 20 42 59 20 73 6e 75 6d 2c  " ORDER BY snum,
341b0 20 72 6f 77 69 64 22 2c 20 30 29 3b 0a 20 20 20   rowid", 0);.   
341c0 20 20 20 69 66 28 20 62 44 65 62 75 67 20 29 7b     if( bDebug ){
341d0 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72  .        utf8_pr
341e0 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 53 51  intf(p->out, "SQ
341f0 4c 3a 20 25 73 3b 5c 6e 22 2c 20 73 53 65 6c 65  L: %s;\n", sSele
34200 63 74 2e 7a 29 3b 0a 20 20 20 20 20 20 7d 65 6c  ct.z);.      }el
34210 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  se{.        rc =
34220 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d   sqlite3_exec(p-
34230 3e 64 62 2c 20 73 53 65 6c 65 63 74 2e 7a 2c 20  >db, sSelect.z, 
34240 63 61 6c 6c 62 61 63 6b 2c 20 26 64 61 74 61 2c  callback, &data,
34250 20 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20   &zErrMsg);.    
34260 20 20 7d 0a 20 20 20 20 20 20 66 72 65 65 54 65    }.      freeTe
34270 78 74 28 26 73 53 65 6c 65 63 74 29 3b 0a 20 20  xt(&sSelect);.  
34280 20 20 7d 0a 20 20 20 20 69 66 28 20 7a 45 72 72    }.    if( zErr
34290 4d 73 67 20 29 7b 0a 20 20 20 20 20 20 75 74 66  Msg ){.      utf
342a0 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  8_printf(stderr,
342b0 22 45 72 72 6f 72 3a 20 25 73 5c 6e 22 2c 20 7a  "Error: %s\n", z
342c0 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 73  ErrMsg);.      s
342d0 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 45 72 72  qlite3_free(zErr
342e0 4d 73 67 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  Msg);.      rc =
342f0 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66   1;.    }else if
34300 28 20 72 63 20 21 3d 20 53 51 4c 49 54 45 5f 4f  ( rc != SQLITE_O
34310 4b 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70  K ){.      raw_p
34320 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 45 72  rintf(stderr,"Er
34330 72 6f 72 3a 20 71 75 65 72 79 69 6e 67 20 73 63  ror: querying sc
34340 68 65 6d 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  hema information
34350 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  \n");.      rc =
34360 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   1;.    }else{. 
34370 20 20 20 20 20 72 63 20 3d 20 30 3b 0a 20 20 20       rc = 0;.   
34380 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 23 69 66 20   }.  }else..#if 
34390 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44  defined(SQLITE_D
343a0 45 42 55 47 29 20 26 26 20 64 65 66 69 6e 65 64  EBUG) && defined
343b0 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53  (SQLITE_ENABLE_S
343c0 45 4c 45 43 54 54 52 41 43 45 29 0a 20 20 69 66  ELECTTRACE).  if
343d0 28 20 63 3d 3d 27 73 27 20 26 26 20 6e 3d 3d 31  ( c=='s' && n==1
343e0 31 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41  1 && strncmp(azA
343f0 72 67 5b 30 5d 2c 20 22 73 65 6c 65 63 74 74 72  rg[0], "selecttr
34400 61 63 65 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20  ace", n)==0 ){. 
34410 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
34420 54 72 61 63 65 20 3d 20 28 69 6e 74 29 69 6e 74  Trace = (int)int
34430 65 67 65 72 56 61 6c 75 65 28 61 7a 41 72 67 5b  egerValue(azArg[
34440 31 5d 29 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e  1]);.  }else.#en
34450 64 69 66 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  dif..#if defined
34460 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53  (SQLITE_ENABLE_S
34470 45 53 53 49 4f 4e 29 0a 20 20 69 66 28 20 63 3d  ESSION).  if( c=
34480 3d 27 73 27 20 26 26 20 73 74 72 6e 63 6d 70 28  ='s' && strncmp(
34490 61 7a 41 72 67 5b 30 5d 2c 22 73 65 73 73 69 6f  azArg[0],"sessio
344a0 6e 22 2c 6e 29 3d 3d 30 20 26 26 20 6e 3e 3d 33  n",n)==0 && n>=3
344b0 20 29 7b 0a 20 20 20 20 4f 70 65 6e 53 65 73 73   ){.    OpenSess
344c0 69 6f 6e 20 2a 70 53 65 73 73 69 6f 6e 20 3d 20  ion *pSession = 
344d0 26 70 2d 3e 61 53 65 73 73 69 6f 6e 5b 30 5d 3b  &p->aSession[0];
344e0 0a 20 20 20 20 63 68 61 72 20 2a 2a 61 7a 43 6d  .    char **azCm
344f0 64 20 3d 20 26 61 7a 41 72 67 5b 31 5d 3b 0a 20  d = &azArg[1];. 
34500 20 20 20 69 6e 74 20 69 53 65 73 20 3d 20 30 3b     int iSes = 0;
34510 0a 20 20 20 20 69 6e 74 20 6e 43 6d 64 20 3d 20  .    int nCmd = 
34520 6e 41 72 67 20 2d 20 31 3b 0a 20 20 20 20 69 6e  nArg - 1;.    in
34530 74 20 69 3b 0a 20 20 20 20 69 66 28 20 6e 41 72  t i;.    if( nAr
34540 67 3c 3d 31 20 29 20 67 6f 74 6f 20 73 65 73 73  g<=1 ) goto sess
34550 69 6f 6e 5f 73 79 6e 74 61 78 5f 65 72 72 6f 72  ion_syntax_error
34560 3b 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28 70 2c  ;.    open_db(p,
34570 20 30 29 3b 0a 20 20 20 20 69 66 28 20 6e 41 72   0);.    if( nAr
34580 67 3e 3d 33 20 29 7b 0a 20 20 20 20 20 20 66 6f  g>=3 ){.      fo
34590 72 28 69 53 65 73 3d 30 3b 20 69 53 65 73 3c 70  r(iSes=0; iSes<p
345a0 2d 3e 6e 53 65 73 73 69 6f 6e 3b 20 69 53 65 73  ->nSession; iSes
345b0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
345c0 20 73 74 72 63 6d 70 28 70 2d 3e 61 53 65 73 73   strcmp(p->aSess
345d0 69 6f 6e 5b 69 53 65 73 5d 2e 7a 4e 61 6d 65 2c  ion[iSes].zName,
345e0 20 61 7a 41 72 67 5b 31 5d 29 3d 3d 30 20 29 20   azArg[1])==0 ) 
345f0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
34600 20 20 20 20 20 69 66 28 20 69 53 65 73 3c 70 2d       if( iSes<p-
34610 3e 6e 53 65 73 73 69 6f 6e 20 29 7b 0a 20 20 20  >nSession ){.   
34620 20 20 20 20 20 70 53 65 73 73 69 6f 6e 20 3d 20       pSession = 
34630 26 70 2d 3e 61 53 65 73 73 69 6f 6e 5b 69 53 65  &p->aSession[iSe
34640 73 5d 3b 0a 20 20 20 20 20 20 20 20 61 7a 43 6d  s];.        azCm
34650 64 2b 2b 3b 0a 20 20 20 20 20 20 20 20 6e 43 6d  d++;.        nCm
34660 64 2d 2d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  d--;.      }else
34670 7b 0a 20 20 20 20 20 20 20 20 70 53 65 73 73 69  {.        pSessi
34680 6f 6e 20 3d 20 26 70 2d 3e 61 53 65 73 73 69 6f  on = &p->aSessio
34690 6e 5b 30 5d 3b 0a 20 20 20 20 20 20 20 20 69 53  n[0];.        iS
346a0 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  es = 0;.      }.
346b0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 2e 73      }..    /* .s
346c0 65 73 73 69 6f 6e 20 61 74 74 61 63 68 20 54 41  ession attach TA
346d0 42 4c 45 0a 20 20 20 20 2a 2a 20 49 6e 76 6f 6b  BLE.    ** Invok
346e0 65 20 74 68 65 20 73 71 6c 69 74 65 33 73 65 73  e the sqlite3ses
346f0 73 69 6f 6e 5f 61 74 74 61 63 68 28 29 20 69 6e  sion_attach() in
34700 74 65 72 66 61 63 65 20 74 6f 20 61 74 74 61 63  terface to attac
34710 68 20 61 20 70 61 72 74 69 63 75 6c 61 72 0a 20  h a particular. 
34720 20 20 20 2a 2a 20 74 61 62 6c 65 20 73 6f 20 74     ** table so t
34730 68 61 74 20 69 74 20 69 73 20 6e 65 76 65 72 20  hat it is never 
34740 66 69 6c 74 65 72 65 64 2e 0a 20 20 20 20 2a 2f  filtered..    */
34750 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28  .    if( strcmp(
34760 61 7a 43 6d 64 5b 30 5d 2c 22 61 74 74 61 63 68  azCmd[0],"attach
34770 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  ")==0 ){.      i
34780 66 28 20 6e 43 6d 64 21 3d 32 20 29 20 67 6f 74  f( nCmd!=2 ) got
34790 6f 20 73 65 73 73 69 6f 6e 5f 73 79 6e 74 61 78  o session_syntax
347a0 5f 65 72 72 6f 72 3b 0a 20 20 20 20 20 20 69 66  _error;.      if
347b0 28 20 70 53 65 73 73 69 6f 6e 2d 3e 70 3d 3d 30  ( pSession->p==0
347c0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 65 73 73   ){.        sess
347d0 69 6f 6e 5f 6e 6f 74 5f 6f 70 65 6e 3a 0a 20 20  ion_not_open:.  
347e0 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
347f0 28 73 74 64 65 72 72 2c 20 22 45 52 52 4f 52 3a  (stderr, "ERROR:
34800 20 4e 6f 20 73 65 73 73 69 6f 6e 73 20 61 72 65   No sessions are
34810 20 6f 70 65 6e 5c 6e 22 29 3b 0a 20 20 20 20 20   open\n");.     
34820 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
34830 72 63 20 3d 20 73 71 6c 69 74 65 33 73 65 73 73  rc = sqlite3sess
34840 69 6f 6e 5f 61 74 74 61 63 68 28 70 53 65 73 73  ion_attach(pSess
34850 69 6f 6e 2d 3e 70 2c 20 61 7a 43 6d 64 5b 31 5d  ion->p, azCmd[1]
34860 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
34870 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  c ){.          r
34880 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  aw_printf(stderr
34890 2c 20 22 45 52 52 4f 52 3a 20 73 71 6c 69 74 65  , "ERROR: sqlite
348a0 33 73 65 73 73 69 6f 6e 5f 61 74 74 61 63 68 28  3session_attach(
348b0 29 20 72 65 74 75 72 6e 73 20 25 64 5c 6e 22 2c  ) returns %d\n",
348c0 20 72 63 29 3b 0a 20 20 20 20 20 20 20 20 20 20   rc);.          
348d0 72 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  rc = 0;.        
348e0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  }.      }.    }e
348f0 6c 73 65 0a 0a 20 20 20 20 2f 2a 20 2e 73 65 73  lse..    /* .ses
34900 73 69 6f 6e 20 63 68 61 6e 67 65 73 65 74 20 46  sion changeset F
34910 49 4c 45 0a 20 20 20 20 2a 2a 20 2e 73 65 73 73  ILE.    ** .sess
34920 69 6f 6e 20 70 61 74 63 68 73 65 74 20 46 49 4c  ion patchset FIL
34930 45 0a 20 20 20 20 2a 2a 20 57 72 69 74 65 20 61  E.    ** Write a
34940 20 63 68 61 6e 67 65 73 65 74 20 6f 72 20 70 61   changeset or pa
34950 74 63 68 73 65 74 20 69 6e 74 6f 20 61 20 66 69  tchset into a fi
34960 6c 65 2e 20 20 54 68 65 20 66 69 6c 65 20 69 73  le.  The file is
34970 20 6f 76 65 72 77 72 69 74 74 65 6e 2e 0a 20 20   overwritten..  
34980 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 74 72    */.    if( str
34990 63 6d 70 28 61 7a 43 6d 64 5b 30 5d 2c 22 63 68  cmp(azCmd[0],"ch
349a0 61 6e 67 65 73 65 74 22 29 3d 3d 30 20 7c 7c 20  angeset")==0 || 
349b0 73 74 72 63 6d 70 28 61 7a 43 6d 64 5b 30 5d 2c  strcmp(azCmd[0],
349c0 22 70 61 74 63 68 73 65 74 22 29 3d 3d 30 20 29  "patchset")==0 )
349d0 7b 0a 20 20 20 20 20 20 46 49 4c 45 20 2a 6f 75  {.      FILE *ou
349e0 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28  t = 0;.      if(
349f0 20 6e 43 6d 64 21 3d 32 20 29 20 67 6f 74 6f 20   nCmd!=2 ) goto 
34a00 73 65 73 73 69 6f 6e 5f 73 79 6e 74 61 78 5f 65  session_syntax_e
34a10 72 72 6f 72 3b 0a 20 20 20 20 20 20 69 66 28 20  rror;.      if( 
34a20 70 53 65 73 73 69 6f 6e 2d 3e 70 3d 3d 30 20 29  pSession->p==0 )
34a30 20 67 6f 74 6f 20 73 65 73 73 69 6f 6e 5f 6e 6f   goto session_no
34a40 74 5f 6f 70 65 6e 3b 0a 20 20 20 20 20 20 6f 75  t_open;.      ou
34a50 74 20 3d 20 66 6f 70 65 6e 28 61 7a 43 6d 64 5b  t = fopen(azCmd[
34a60 31 5d 2c 20 22 77 62 22 29 3b 0a 20 20 20 20 20  1], "wb");.     
34a70 20 69 66 28 20 6f 75 74 3d 3d 30 20 29 7b 0a 20   if( out==0 ){. 
34a80 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e         utf8_prin
34a90 74 66 28 73 74 64 65 72 72 2c 20 22 45 52 52 4f  tf(stderr, "ERRO
34aa0 52 3a 20 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 5c  R: cannot open \
34ab0 22 25 73 5c 22 20 66 6f 72 20 77 72 69 74 69 6e  "%s\" for writin
34ac0 67 5c 6e 22 2c 20 61 7a 43 6d 64 5b 31 5d 29 3b  g\n", azCmd[1]);
34ad0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
34ae0 20 20 20 20 20 20 69 6e 74 20 73 7a 43 68 6e 67        int szChng
34af0 3b 0a 20 20 20 20 20 20 20 20 76 6f 69 64 20 2a  ;.        void *
34b00 70 43 68 6e 67 3b 0a 20 20 20 20 20 20 20 20 69  pChng;.        i
34b10 66 28 20 61 7a 43 6d 64 5b 30 5d 5b 30 5d 3d 3d  f( azCmd[0][0]==
34b20 27 63 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20  'c' ){.         
34b30 20 72 63 20 3d 20 73 71 6c 69 74 65 33 73 65 73   rc = sqlite3ses
34b40 73 69 6f 6e 5f 63 68 61 6e 67 65 73 65 74 28 70  sion_changeset(p
34b50 53 65 73 73 69 6f 6e 2d 3e 70 2c 20 26 73 7a 43  Session->p, &szC
34b60 68 6e 67 2c 20 26 70 43 68 6e 67 29 3b 0a 20 20  hng, &pChng);.  
34b70 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
34b80 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
34b90 74 65 33 73 65 73 73 69 6f 6e 5f 70 61 74 63 68  te3session_patch
34ba0 73 65 74 28 70 53 65 73 73 69 6f 6e 2d 3e 70 2c  set(pSession->p,
34bb0 20 26 73 7a 43 68 6e 67 2c 20 26 70 43 68 6e 67   &szChng, &pChng
34bc0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
34bd0 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
34be0 20 20 20 20 20 20 20 20 20 70 72 69 6e 74 66 28           printf(
34bf0 22 45 72 72 6f 72 3a 20 65 72 72 6f 72 20 63 6f  "Error: error co
34c00 64 65 20 25 64 5c 6e 22 2c 20 72 63 29 3b 0a 20  de %d\n", rc);. 
34c10 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 30 3b           rc = 0;
34c20 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
34c30 20 20 20 69 66 28 20 70 43 68 6e 67 0a 20 20 20     if( pChng.   
34c40 20 20 20 20 20 20 20 26 26 20 66 77 72 69 74 65         && fwrite
34c50 28 70 43 68 6e 67 2c 20 73 7a 43 68 6e 67 2c 20  (pChng, szChng, 
34c60 31 2c 20 6f 75 74 29 21 3d 31 20 29 7b 0a 20 20  1, out)!=1 ){.  
34c70 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e          raw_prin
34c80 74 66 28 73 74 64 65 72 72 2c 20 22 45 52 52 4f  tf(stderr, "ERRO
34c90 52 3a 20 46 61 69 6c 65 64 20 74 6f 20 77 72 69  R: Failed to wri
34ca0 74 65 20 65 6e 74 69 72 65 20 25 64 2d 62 79 74  te entire %d-byt
34cb0 65 20 6f 75 74 70 75 74 5c 6e 22 2c 0a 20 20 20  e output\n",.   
34cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
34cd0 7a 43 68 6e 67 29 3b 0a 20 20 20 20 20 20 20 20  zChng);.        
34ce0 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  }.        sqlite
34cf0 33 5f 66 72 65 65 28 70 43 68 6e 67 29 3b 0a 20  3_free(pChng);. 
34d00 20 20 20 20 20 20 20 66 63 6c 6f 73 65 28 6f 75         fclose(ou
34d10 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  t);.      }.    
34d20 7d 65 6c 73 65 0a 0a 20 20 20 20 2f 2a 20 2e 73  }else..    /* .s
34d30 65 73 73 69 6f 6e 20 63 6c 6f 73 65 0a 20 20 20  ession close.   
34d40 20 2a 2a 20 43 6c 6f 73 65 20 74 68 65 20 69 64   ** Close the id
34d50 65 6e 74 69 66 69 65 64 20 73 65 73 73 69 6f 6e  entified session
34d60 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
34d70 73 74 72 63 6d 70 28 61 7a 43 6d 64 5b 30 5d 2c  strcmp(azCmd[0],
34d80 20 22 63 6c 6f 73 65 22 29 3d 3d 30 20 29 7b 0a   "close")==0 ){.
34d90 20 20 20 20 20 20 69 66 28 20 6e 43 6d 64 21 3d        if( nCmd!=
34da0 31 20 29 20 67 6f 74 6f 20 73 65 73 73 69 6f 6e  1 ) goto session
34db0 5f 73 79 6e 74 61 78 5f 65 72 72 6f 72 3b 0a 20  _syntax_error;. 
34dc0 20 20 20 20 20 69 66 28 20 70 2d 3e 6e 53 65 73       if( p->nSes
34dd0 73 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  sion ){.        
34de0 73 65 73 73 69 6f 6e 5f 63 6c 6f 73 65 28 70 53  session_close(pS
34df0 65 73 73 69 6f 6e 29 3b 0a 20 20 20 20 20 20 20  ession);.       
34e00 20 70 2d 3e 61 53 65 73 73 69 6f 6e 5b 69 53 65   p->aSession[iSe
34e10 73 5d 20 3d 20 70 2d 3e 61 53 65 73 73 69 6f 6e  s] = p->aSession
34e20 5b 2d 2d 70 2d 3e 6e 53 65 73 73 69 6f 6e 5d 3b  [--p->nSession];
34e30 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
34e40 73 65 0a 0a 20 20 20 20 2f 2a 20 2e 73 65 73 73  se..    /* .sess
34e50 69 6f 6e 20 65 6e 61 62 6c 65 20 3f 42 4f 4f 4c  ion enable ?BOOL
34e60 45 41 4e 3f 0a 20 20 20 20 2a 2a 20 51 75 65 72  EAN?.    ** Quer
34e70 79 20 6f 72 20 73 65 74 20 74 68 65 20 65 6e 61  y or set the ena
34e80 62 6c 65 20 66 6c 61 67 0a 20 20 20 20 2a 2f 0a  ble flag.    */.
34e90 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 61      if( strcmp(a
34ea0 7a 43 6d 64 5b 30 5d 2c 20 22 65 6e 61 62 6c 65  zCmd[0], "enable
34eb0 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  ")==0 ){.      i
34ec0 6e 74 20 69 69 3b 0a 20 20 20 20 20 20 69 66 28  nt ii;.      if(
34ed0 20 6e 43 6d 64 3e 32 20 29 20 67 6f 74 6f 20 73   nCmd>2 ) goto s
34ee0 65 73 73 69 6f 6e 5f 73 79 6e 74 61 78 5f 65 72  ession_syntax_er
34ef0 72 6f 72 3b 0a 20 20 20 20 20 20 69 69 20 3d 20  ror;.      ii = 
34f00 6e 43 6d 64 3d 3d 31 20 3f 20 2d 31 20 3a 20 62  nCmd==1 ? -1 : b
34f10 6f 6f 6c 65 61 6e 56 61 6c 75 65 28 61 7a 43 6d  ooleanValue(azCm
34f20 64 5b 31 5d 29 3b 0a 20 20 20 20 20 20 69 66 28  d[1]);.      if(
34f30 20 70 2d 3e 6e 53 65 73 73 69 6f 6e 20 29 7b 0a   p->nSession ){.
34f40 20 20 20 20 20 20 20 20 69 69 20 3d 20 73 71 6c          ii = sql
34f50 69 74 65 33 73 65 73 73 69 6f 6e 5f 65 6e 61 62  ite3session_enab
34f60 6c 65 28 70 53 65 73 73 69 6f 6e 2d 3e 70 2c 20  le(pSession->p, 
34f70 69 69 29 3b 0a 20 20 20 20 20 20 20 20 75 74 66  ii);.        utf
34f80 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  8_printf(p->out,
34f90 20 22 73 65 73 73 69 6f 6e 20 25 73 20 65 6e 61   "session %s ena
34fa0 62 6c 65 20 66 6c 61 67 20 3d 20 25 64 5c 6e 22  ble flag = %d\n"
34fb0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
34fc0 20 20 20 20 20 20 70 53 65 73 73 69 6f 6e 2d 3e        pSession->
34fd0 7a 4e 61 6d 65 2c 20 69 69 29 3b 0a 20 20 20 20  zName, ii);.    
34fe0 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 0a 0a 20    }.    }else.. 
34ff0 20 20 20 2f 2a 20 2e 73 65 73 73 69 6f 6e 20 66     /* .session f
35000 69 6c 74 65 72 20 47 4c 4f 42 20 2e 2e 2e 2e 0a  ilter GLOB .....
35010 20 20 20 20 2a 2a 20 53 65 74 20 61 20 6c 69 73      ** Set a lis
35020 74 20 6f 66 20 47 4c 4f 42 20 70 61 74 74 65 72  t of GLOB patter
35030 6e 73 20 6f 66 20 74 61 62 6c 65 20 6e 61 6d 65  ns of table name
35040 73 20 74 6f 20 62 65 20 65 78 63 6c 75 64 65 64  s to be excluded
35050 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
35060 20 73 74 72 63 6d 70 28 61 7a 43 6d 64 5b 30 5d   strcmp(azCmd[0]
35070 2c 20 22 66 69 6c 74 65 72 22 29 3d 3d 30 20 29  , "filter")==0 )
35080 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 69 2c 20  {.      int ii, 
35090 6e 42 79 74 65 3b 0a 20 20 20 20 20 20 69 66 28  nByte;.      if(
350a0 20 6e 43 6d 64 3c 32 20 29 20 67 6f 74 6f 20 73   nCmd<2 ) goto s
350b0 65 73 73 69 6f 6e 5f 73 79 6e 74 61 78 5f 65 72  ession_syntax_er
350c0 72 6f 72 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ror;.      if( p
350d0 2d 3e 6e 53 65 73 73 69 6f 6e 20 29 7b 0a 20 20  ->nSession ){.  
350e0 20 20 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20        for(ii=0; 
350f0 69 69 3c 70 53 65 73 73 69 6f 6e 2d 3e 6e 46 69  ii<pSession->nFi
35100 6c 74 65 72 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  lter; ii++){.   
35110 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
35120 72 65 65 28 70 53 65 73 73 69 6f 6e 2d 3e 61 7a  ree(pSession->az
35130 46 69 6c 74 65 72 5b 69 69 5d 29 3b 0a 20 20 20  Filter[ii]);.   
35140 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73       }.        s
35150 71 6c 69 74 65 33 5f 66 72 65 65 28 70 53 65 73  qlite3_free(pSes
35160 73 69 6f 6e 2d 3e 61 7a 46 69 6c 74 65 72 29 3b  sion->azFilter);
35170 0a 20 20 20 20 20 20 20 20 6e 42 79 74 65 20 3d  .        nByte =
35180 20 73 69 7a 65 6f 66 28 70 53 65 73 73 69 6f 6e   sizeof(pSession
35190 2d 3e 61 7a 46 69 6c 74 65 72 5b 30 5d 29 2a 28  ->azFilter[0])*(
351a0 6e 43 6d 64 2d 31 29 3b 0a 20 20 20 20 20 20 20  nCmd-1);.       
351b0 20 70 53 65 73 73 69 6f 6e 2d 3e 61 7a 46 69 6c   pSession->azFil
351c0 74 65 72 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61  ter = sqlite3_ma
351d0 6c 6c 6f 63 28 20 6e 42 79 74 65 20 29 3b 0a 20  lloc( nByte );. 
351e0 20 20 20 20 20 20 20 69 66 28 20 70 53 65 73 73         if( pSess
351f0 69 6f 6e 2d 3e 61 7a 46 69 6c 74 65 72 3d 3d 30  ion->azFilter==0
35200 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 61   ){.          ra
35210 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  w_printf(stderr,
35220 20 22 45 72 72 6f 72 3a 20 6f 75 74 20 6f 72 20   "Error: out or 
35230 6d 65 6d 6f 72 79 5c 6e 22 29 3b 0a 20 20 20 20  memory\n");.    
35240 20 20 20 20 20 20 65 78 69 74 28 31 29 3b 0a 20        exit(1);. 
35250 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
35260 20 66 6f 72 28 69 69 3d 31 3b 20 69 69 3c 6e 43   for(ii=1; ii<nC
35270 6d 64 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20  md; ii++){.     
35280 20 20 20 20 20 70 53 65 73 73 69 6f 6e 2d 3e 61       pSession->a
35290 7a 46 69 6c 74 65 72 5b 69 69 2d 31 5d 20 3d 20  zFilter[ii-1] = 
352a0 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
352b0 22 25 73 22 2c 20 61 7a 43 6d 64 5b 69 69 5d 29  "%s", azCmd[ii])
352c0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
352d0 20 20 20 20 70 53 65 73 73 69 6f 6e 2d 3e 6e 46      pSession->nF
352e0 69 6c 74 65 72 20 3d 20 69 69 2d 31 3b 0a 20 20  ilter = ii-1;.  
352f0 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 0a      }.    }else.
35300 0a 20 20 20 20 2f 2a 20 2e 73 65 73 73 69 6f 6e  .    /* .session
35310 20 69 6e 64 69 72 65 63 74 20 3f 42 4f 4f 4c 45   indirect ?BOOLE
35320 41 4e 3f 0a 20 20 20 20 2a 2a 20 51 75 65 72 79  AN?.    ** Query
35330 20 6f 72 20 73 65 74 20 74 68 65 20 69 6e 64 69   or set the indi
35340 72 65 63 74 20 66 6c 61 67 0a 20 20 20 20 2a 2f  rect flag.    */
35350 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28  .    if( strcmp(
35360 61 7a 43 6d 64 5b 30 5d 2c 20 22 69 6e 64 69 72  azCmd[0], "indir
35370 65 63 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ect")==0 ){.    
35380 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 20 20    int ii;.      
35390 69 66 28 20 6e 43 6d 64 3e 32 20 29 20 67 6f 74  if( nCmd>2 ) got
353a0 6f 20 73 65 73 73 69 6f 6e 5f 73 79 6e 74 61 78  o session_syntax
353b0 5f 65 72 72 6f 72 3b 0a 20 20 20 20 20 20 69 69  _error;.      ii
353c0 20 3d 20 6e 43 6d 64 3d 3d 31 20 3f 20 2d 31 20   = nCmd==1 ? -1 
353d0 3a 20 62 6f 6f 6c 65 61 6e 56 61 6c 75 65 28 61  : booleanValue(a
353e0 7a 43 6d 64 5b 31 5d 29 3b 0a 20 20 20 20 20 20  zCmd[1]);.      
353f0 69 66 28 20 70 2d 3e 6e 53 65 73 73 69 6f 6e 20  if( p->nSession 
35400 29 7b 0a 20 20 20 20 20 20 20 20 69 69 20 3d 20  ){.        ii = 
35410 73 71 6c 69 74 65 33 73 65 73 73 69 6f 6e 5f 69  sqlite3session_i
35420 6e 64 69 72 65 63 74 28 70 53 65 73 73 69 6f 6e  ndirect(pSession
35430 2d 3e 70 2c 20 69 69 29 3b 0a 20 20 20 20 20 20  ->p, ii);.      
35440 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d    utf8_printf(p-
35450 3e 6f 75 74 2c 20 22 73 65 73 73 69 6f 6e 20 25  >out, "session %
35460 73 20 69 6e 64 69 72 65 63 74 20 66 6c 61 67 20  s indirect flag 
35470 3d 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  = %d\n",.       
35480 20 20 20 20 20 20 20 20 20 20 20 20 20 70 53 65               pSe
35490 73 73 69 6f 6e 2d 3e 7a 4e 61 6d 65 2c 20 69 69  ssion->zName, ii
354a0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
354b0 65 6c 73 65 0a 0a 20 20 20 20 2f 2a 20 2e 73 65  else..    /* .se
354c0 73 73 69 6f 6e 20 69 73 65 6d 70 74 79 0a 20 20  ssion isempty.  
354d0 20 20 2a 2a 20 44 65 74 65 72 6d 69 6e 65 20 69    ** Determine i
354e0 66 20 74 68 65 20 73 65 73 73 69 6f 6e 20 69 73  f the session is
354f0 20 65 6d 70 74 79 0a 20 20 20 20 2a 2f 0a 20 20   empty.    */.  
35500 20 20 69 66 28 20 73 74 72 63 6d 70 28 61 7a 43    if( strcmp(azC
35510 6d 64 5b 30 5d 2c 20 22 69 73 65 6d 70 74 79 22  md[0], "isempty"
35520 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e  )==0 ){.      in
35530 74 20 69 69 3b 0a 20 20 20 20 20 20 69 66 28 20  t ii;.      if( 
35540 6e 43 6d 64 21 3d 31 20 29 20 67 6f 74 6f 20 73  nCmd!=1 ) goto s
35550 65 73 73 69 6f 6e 5f 73 79 6e 74 61 78 5f 65 72  ession_syntax_er
35560 72 6f 72 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ror;.      if( p
35570 2d 3e 6e 53 65 73 73 69 6f 6e 20 29 7b 0a 20 20  ->nSession ){.  
35580 20 20 20 20 20 20 69 69 20 3d 20 73 71 6c 69 74        ii = sqlit
35590 65 33 73 65 73 73 69 6f 6e 5f 69 73 65 6d 70 74  e3session_isempt
355a0 79 28 70 53 65 73 73 69 6f 6e 2d 3e 70 29 3b 0a  y(pSession->p);.
355b0 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69          utf8_pri
355c0 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 73 65 73  ntf(p->out, "ses
355d0 73 69 6f 6e 20 25 73 20 69 73 65 6d 70 74 79 20  sion %s isempty 
355e0 66 6c 61 67 20 3d 20 25 64 5c 6e 22 2c 0a 20 20  flag = %d\n",.  
355f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35600 20 20 70 53 65 73 73 69 6f 6e 2d 3e 7a 4e 61 6d    pSession->zNam
35610 65 2c 20 69 69 29 3b 0a 20 20 20 20 20 20 7d 0a  e, ii);.      }.
35620 20 20 20 20 7d 65 6c 73 65 0a 0a 20 20 20 20 2f      }else..    /
35630 2a 20 2e 73 65 73 73 69 6f 6e 20 6c 69 73 74 0a  * .session list.
35640 20 20 20 20 2a 2a 20 4c 69 73 74 20 61 6c 6c 20      ** List all 
35650 63 75 72 72 65 6e 74 6c 79 20 6f 70 65 6e 20 73  currently open s
35660 65 73 73 69 6f 6e 73 0a 20 20 20 20 2a 2f 0a 20  essions.    */. 
35670 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 61 7a     if( strcmp(az
35680 43 6d 64 5b 30 5d 2c 22 6c 69 73 74 22 29 3d 3d  Cmd[0],"list")==
35690 30 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69  0 ){.      for(i
356a0 3d 30 3b 20 69 3c 70 2d 3e 6e 53 65 73 73 69 6f  =0; i<p->nSessio
356b0 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  n; i++){.       
356c0 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e   utf8_printf(p->
356d0 6f 75 74 2c 20 22 25 64 20 25 73 5c 6e 22 2c 20  out, "%d %s\n", 
356e0 69 2c 20 70 2d 3e 61 53 65 73 73 69 6f 6e 5b 69  i, p->aSession[i
356f0 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ].zName);.      
35700 7d 0a 20 20 20 20 7d 65 6c 73 65 0a 0a 20 20 20  }.    }else..   
35710 20 2f 2a 20 2e 73 65 73 73 69 6f 6e 20 6f 70 65   /* .session ope
35720 6e 20 44 42 20 4e 41 4d 45 0a 20 20 20 20 2a 2a  n DB NAME.    **
35730 20 4f 70 65 6e 20 61 20 6e 65 77 20 73 65 73 73   Open a new sess
35740 69 6f 6e 20 63 61 6c 6c 65 64 20 4e 41 4d 45 20  ion called NAME 
35750 6f 6e 20 74 68 65 20 61 74 74 61 63 68 65 64 20  on the attached 
35760 64 61 74 61 62 61 73 65 20 44 42 2e 0a 20 20 20  database DB..   
35770 20 2a 2a 20 44 42 20 69 73 20 6e 6f 72 6d 61 6c   ** DB is normal
35780 6c 79 20 22 6d 61 69 6e 22 2e 0a 20 20 20 20 2a  ly "main"..    *
35790 2f 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70  /.    if( strcmp
357a0 28 61 7a 43 6d 64 5b 30 5d 2c 22 6f 70 65 6e 22  (azCmd[0],"open"
357b0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 68  )==0 ){.      ch
357c0 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  ar *zName;.     
357d0 20 69 66 28 20 6e 43 6d 64 21 3d 33 20 29 20 67   if( nCmd!=3 ) g
357e0 6f 74 6f 20 73 65 73 73 69 6f 6e 5f 73 79 6e 74  oto session_synt
357f0 61 78 5f 65 72 72 6f 72 3b 0a 20 20 20 20 20 20  ax_error;.      
35800 7a 4e 61 6d 65 20 3d 20 61 7a 43 6d 64 5b 32 5d  zName = azCmd[2]
35810 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 4e 61 6d  ;.      if( zNam
35820 65 5b 30 5d 3d 3d 30 20 29 20 67 6f 74 6f 20 73  e[0]==0 ) goto s
35830 65 73 73 69 6f 6e 5f 73 79 6e 74 61 78 5f 65 72  ession_syntax_er
35840 72 6f 72 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  ror;.      for(i
35850 3d 30 3b 20 69 3c 70 2d 3e 6e 53 65 73 73 69 6f  =0; i<p->nSessio
35860 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  n; i++){.       
35870 20 69 66 28 20 73 74 72 63 6d 70 28 70 2d 3e 61   if( strcmp(p->a
35880 53 65 73 73 69 6f 6e 5b 69 5d 2e 7a 4e 61 6d 65  Session[i].zName
35890 2c 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20  ,zName)==0 ){.  
358a0 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69          utf8_pri
358b0 6e 74 66 28 73 74 64 65 72 72 2c 20 22 53 65 73  ntf(stderr, "Ses
358c0 73 69 6f 6e 20 5c 22 25 73 5c 22 20 61 6c 72 65  sion \"%s\" alre
358d0 61 64 79 20 65 78 69 73 74 73 5c 6e 22 2c 20 7a  ady exists\n", z
358e0 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Name);.         
358f0 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61   goto meta_comma
35900 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 20  nd_exit;.       
35910 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
35920 20 69 66 28 20 70 2d 3e 6e 53 65 73 73 69 6f 6e   if( p->nSession
35930 3e 3d 41 72 72 61 79 53 69 7a 65 28 70 2d 3e 61  >=ArraySize(p->a
35940 53 65 73 73 69 6f 6e 29 20 29 7b 0a 20 20 20 20  Session) ){.    
35950 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73      raw_printf(s
35960 74 64 65 72 72 2c 20 22 4d 61 78 69 6d 75 6d 20  tderr, "Maximum 
35970 6f 66 20 25 64 20 73 65 73 73 69 6f 6e 73 5c 6e  of %d sessions\n
35980 22 2c 20 41 72 72 61 79 53 69 7a 65 28 70 2d 3e  ", ArraySize(p->
35990 61 53 65 73 73 69 6f 6e 29 29 3b 0a 20 20 20 20  aSession));.    
359a0 20 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f      goto meta_co
359b0 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20  mmand_exit;.    
359c0 20 20 7d 0a 20 20 20 20 20 20 70 53 65 73 73 69    }.      pSessi
359d0 6f 6e 20 3d 20 26 70 2d 3e 61 53 65 73 73 69 6f  on = &p->aSessio
359e0 6e 5b 70 2d 3e 6e 53 65 73 73 69 6f 6e 5d 3b 0a  n[p->nSession];.
359f0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
35a00 65 33 73 65 73 73 69 6f 6e 5f 63 72 65 61 74 65  e3session_create
35a10 28 70 2d 3e 64 62 2c 20 61 7a 43 6d 64 5b 31 5d  (p->db, azCmd[1]
35a20 2c 20 26 70 53 65 73 73 69 6f 6e 2d 3e 70 29 3b  , &pSession->p);
35a30 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b  .      if( rc ){
35a40 0a 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69  .        raw_pri
35a50 6e 74 66 28 73 74 64 65 72 72 2c 20 22 43 61 6e  ntf(stderr, "Can
35a60 6e 6f 74 20 6f 70 65 6e 20 73 65 73 73 69 6f 6e  not open session
35a70 3a 20 65 72 72 6f 72 20 63 6f 64 65 3d 25 64 5c  : error code=%d\
35a80 6e 22 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 20  n", rc);.       
35a90 20 72 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 20   rc = 0;.       
35aa0 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61   goto meta_comma
35ab0 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 7d  nd_exit;.      }
35ac0 0a 20 20 20 20 20 20 70 53 65 73 73 69 6f 6e 2d  .      pSession-
35ad0 3e 6e 46 69 6c 74 65 72 20 3d 20 30 3b 0a 20 20  >nFilter = 0;.  
35ae0 20 20 20 20 73 71 6c 69 74 65 33 73 65 73 73 69      sqlite3sessi
35af0 6f 6e 5f 74 61 62 6c 65 5f 66 69 6c 74 65 72 28  on_table_filter(
35b00 70 53 65 73 73 69 6f 6e 2d 3e 70 2c 20 73 65 73  pSession->p, ses
35b10 73 69 6f 6e 5f 66 69 6c 74 65 72 2c 20 70 53 65  sion_filter, pSe
35b20 73 73 69 6f 6e 29 3b 0a 20 20 20 20 20 20 70 2d  ssion);.      p-
35b30 3e 6e 53 65 73 73 69 6f 6e 2b 2b 3b 0a 20 20 20  >nSession++;.   
35b40 20 20 20 70 53 65 73 73 69 6f 6e 2d 3e 7a 4e 61     pSession->zNa
35b50 6d 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  me = sqlite3_mpr
35b60 69 6e 74 66 28 22 25 73 22 2c 20 7a 4e 61 6d 65  intf("%s", zName
35b70 29 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 20 20 20  );.    }else.   
35b80 20 2f 2a 20 49 66 20 6e 6f 20 63 6f 6d 6d 61 6e   /* If no comman
35b90 64 20 6e 61 6d 65 20 6d 61 74 63 68 65 73 2c 20  d name matches, 
35ba0 73 68 6f 77 20 61 20 73 79 6e 74 61 78 20 65 72  show a syntax er
35bb0 72 6f 72 20 2a 2f 0a 20 20 20 20 73 65 73 73 69  ror */.    sessi
35bc0 6f 6e 5f 73 79 6e 74 61 78 5f 65 72 72 6f 72 3a  on_syntax_error:
35bd0 0a 20 20 20 20 73 65 73 73 69 6f 6e 5f 68 65 6c  .    session_hel
35be0 70 28 70 29 3b 0a 20 20 7d 65 6c 73 65 0a 23 65  p(p);.  }else.#e
35bf0 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c  ndif..#ifdef SQL
35c00 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 55  ITE_DEBUG.  /* U
35c10 6e 64 6f 63 75 6d 65 6e 74 65 64 20 63 6f 6d 6d  ndocumented comm
35c20 61 6e 64 73 20 66 6f 72 20 69 6e 74 65 72 6e 61  ands for interna
35c30 6c 20 74 65 73 74 69 6e 67 2e 20 20 53 75 62 6a  l testing.  Subj
35c40 65 63 74 20 74 6f 20 63 68 61 6e 67 65 0a 20 20  ect to change.  
35c50 2a 2a 20 77 69 74 68 6f 75 74 20 6e 6f 74 69 63  ** without notic
35c60 65 2e 20 2a 2f 0a 20 20 69 66 28 20 63 3d 3d 27  e. */.  if( c=='
35c70 73 27 20 26 26 20 6e 3e 3d 31 30 20 26 26 20 73  s' && n>=10 && s
35c80 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c  trncmp(azArg[0],
35c90 20 22 73 65 6c 66 74 65 73 74 2d 22 2c 20 39 29   "selftest-", 9)
35ca0 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 73  ==0 ){.    if( s
35cb0 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2b  trncmp(azArg[0]+
35cc0 39 2c 20 22 62 6f 6f 6c 65 61 6e 22 2c 20 6e 2d  9, "boolean", n-
35cd0 39 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  9)==0 ){.      i
35ce0 6e 74 20 69 2c 20 76 3b 0a 20 20 20 20 20 20 66  nt i, v;.      f
35cf0 6f 72 28 69 3d 31 3b 20 69 3c 6e 41 72 67 3b 20  or(i=1; i<nArg; 
35d00 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 76 20  i++){.        v 
35d10 3d 20 62 6f 6f 6c 65 61 6e 56 61 6c 75 65 28 61  = booleanValue(a
35d20 7a 41 72 67 5b 69 5d 29 3b 0a 20 20 20 20 20 20  zArg[i]);.      
35d30 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d    utf8_printf(p-
35d40 3e 6f 75 74 2c 20 22 25 73 3a 20 25 64 20 30 78  >out, "%s: %d 0x
35d50 25 78 5c 6e 22 2c 20 61 7a 41 72 67 5b 69 5d 2c  %x\n", azArg[i],
35d60 20 76 2c 20 76 29 3b 0a 20 20 20 20 20 20 7d 0a   v, v);.      }.
35d70 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 74      }.    if( st
35d80 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2b 39  rncmp(azArg[0]+9
35d90 2c 20 22 69 6e 74 65 67 65 72 22 2c 20 6e 2d 39  , "integer", n-9
35da0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e  )==0 ){.      in
35db0 74 20 69 3b 20 73 71 6c 69 74 65 33 5f 69 6e 74  t i; sqlite3_int
35dc0 36 34 20 76 3b 0a 20 20 20 20 20 20 66 6f 72 28  64 v;.      for(
35dd0 69 3d 31 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b  i=1; i<nArg; i++
35de0 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  ){.        char 
35df0 7a 42 75 66 5b 32 30 30 5d 3b 0a 20 20 20 20 20  zBuf[200];.     
35e00 20 20 20 76 20 3d 20 69 6e 74 65 67 65 72 56 61     v = integerVa
35e10 6c 75 65 28 61 7a 41 72 67 5b 69 5d 29 3b 0a 20  lue(azArg[i]);. 
35e20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73         sqlite3_s
35e30 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a  nprintf(sizeof(z
35e40 42 75 66 29 2c 7a 42 75 66 2c 22 25 73 3a 20 25  Buf),zBuf,"%s: %
35e50 6c 6c 64 20 30 78 25 6c 6c 78 5c 6e 22 2c 20 61  lld 0x%llx\n", a
35e60 7a 41 72 67 5b 69 5d 2c 76 2c 76 29 3b 0a 20 20  zArg[i],v,v);.  
35e70 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
35e80 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20  f(p->out, "%s", 
35e90 7a 42 75 66 29 3b 0a 20 20 20 20 20 20 7d 0a 20  zBuf);.      }. 
35ea0 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 23 65 6e     }.  }else.#en
35eb0 64 69 66 0a 0a 20 20 69 66 28 20 63 3d 3d 27 73  dif..  if( c=='s
35ec0 27 20 26 26 20 6e 3e 3d 34 20 26 26 20 73 74 72  ' && n>=4 && str
35ed0 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 22 73  ncmp(azArg[0],"s
35ee0 65 6c 66 74 65 73 74 22 2c 6e 29 3d 3d 30 20 29  elftest",n)==0 )
35ef0 7b 0a 20 20 20 20 69 6e 74 20 62 49 73 49 6e 69  {.    int bIsIni
35f00 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f  t = 0;         /
35f10 2a 20 54 72 75 65 20 74 6f 20 69 6e 69 74 69 61  * True to initia
35f20 6c 69 7a 65 20 74 68 65 20 53 45 4c 46 54 45 53  lize the SELFTES
35f30 54 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 69  T table */.    i
35f40 6e 74 20 62 56 65 72 62 6f 73 65 20 3d 20 30 3b  nt bVerbose = 0;
35f50 20 20 20 20 20 20 20 20 2f 2a 20 56 65 72 62 6f          /* Verbo
35f60 73 65 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20 20  se output */.   
35f70 20 69 6e 74 20 62 53 65 6c 66 74 65 73 74 45 78   int bSelftestEx
35f80 69 73 74 73 3b 20 20 20 20 20 2f 2a 20 54 72 75  ists;     /* Tru
35f90 65 20 69 66 20 53 45 4c 46 54 45 53 54 20 61 6c  e if SELFTEST al
35fa0 72 65 61 64 79 20 65 78 69 73 74 73 20 2a 2f 0a  ready exists */.
35fb0 20 20 20 20 69 6e 74 20 69 2c 20 6b 3b 20 20 20      int i, k;   
35fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
35fd0 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f  Loop counters */
35fe0 0a 20 20 20 20 69 6e 74 20 6e 54 65 73 74 20 3d  .    int nTest =
35ff0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a   0;           /*
36000 20 4e 75 6d 62 65 72 20 6f 66 20 74 65 73 74 73   Number of tests
36010 20 72 75 6e 73 20 2a 2f 0a 20 20 20 20 69 6e 74   runs */.    int
36020 20 6e 45 72 72 20 3d 20 30 3b 20 20 20 20 20 20   nErr = 0;      
36030 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
36040 6f 66 20 65 72 72 6f 72 73 20 73 65 65 6e 20 2a  of errors seen *
36050 2f 0a 20 20 20 20 53 68 65 6c 6c 54 65 78 74 20  /.    ShellText 
36060 73 74 72 3b 20 20 20 20 20 20 20 20 20 20 20 2f  str;           /
36070 2a 20 41 6e 73 77 65 72 20 66 6f 72 20 61 20 71  * Answer for a q
36080 75 65 72 79 20 2a 2f 0a 20 20 20 20 73 71 6c 69  uery */.    sqli
36090 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20  te3_stmt *pStmt 
360a0 3d 20 30 3b 20 2f 2a 20 51 75 65 72 79 20 61 67  = 0; /* Query ag
360b0 61 69 6e 73 74 20 74 68 65 20 53 45 4c 46 54 45  ainst the SELFTE
360c0 53 54 20 74 61 62 6c 65 20 2a 2f 0a 0a 20 20 20  ST table */..   
360d0 20 6f 70 65 6e 5f 64 62 28 70 2c 30 29 3b 0a 20   open_db(p,0);. 
360e0 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 41     for(i=1; i<nA
360f0 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  rg; i++){.      
36100 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20  const char *z = 
36110 61 7a 41 72 67 5b 69 5d 3b 0a 20 20 20 20 20 20  azArg[i];.      
36120 69 66 28 20 7a 5b 30 5d 3d 3d 27 2d 27 20 26 26  if( z[0]=='-' &&
36130 20 7a 5b 31 5d 3d 3d 27 2d 27 20 29 20 7a 2b 2b   z[1]=='-' ) z++
36140 3b 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 63  ;.      if( strc
36150 6d 70 28 7a 2c 22 2d 69 6e 69 74 22 29 3d 3d 30  mp(z,"-init")==0
36160 20 29 7b 0a 20 20 20 20 20 20 20 20 62 49 73 49   ){.        bIsI
36170 6e 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  nit = 1;.      }
36180 65 6c 73 65 0a 20 20 20 20 20 20 69 66 28 20 73  else.      if( s
36190 74 72 63 6d 70 28 7a 2c 22 2d 76 22 29 3d 3d 30  trcmp(z,"-v")==0
361a0 20 29 7b 0a 20 20 20 20 20 20 20 20 62 56 65 72   ){.        bVer
361b0 62 6f 73 65 2b 2b 3b 0a 20 20 20 20 20 20 7d 65  bose++;.      }e
361c0 6c 73 65 0a 20 20 20 20 20 20 7b 0a 20 20 20 20  lse.      {.    
361d0 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
361e0 73 74 64 65 72 72 2c 20 22 55 6e 6b 6e 6f 77 6e  stderr, "Unknown
361f0 20 6f 70 74 69 6f 6e 20 5c 22 25 73 5c 22 20 6f   option \"%s\" o
36200 6e 20 5c 22 25 73 5c 22 5c 6e 22 2c 0a 20 20 20  n \"%s\"\n",.   
36210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36220 20 61 7a 41 72 67 5b 69 5d 2c 20 61 7a 41 72 67   azArg[i], azArg
36230 5b 30 5d 29 3b 0a 20 20 20 20 20 20 20 20 72 61  [0]);.        ra
36240 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  w_printf(stderr,
36250 20 22 53 68 6f 75 6c 64 20 62 65 20 6f 6e 65 20   "Should be one 
36260 6f 66 3a 20 2d 2d 69 6e 69 74 20 2d 76 5c 6e 22  of: --init -v\n"
36270 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
36280 31 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  1;.        goto 
36290 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69  meta_command_exi
362a0 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  t;.      }.    }
362b0 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
362c0 5f 74 61 62 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d 65  _table_column_me
362d0 74 61 64 61 74 61 28 70 2d 3e 64 62 2c 22 6d 61  tadata(p->db,"ma
362e0 69 6e 22 2c 22 73 65 6c 66 74 65 73 74 22 2c 30  in","selftest",0
362f0 2c 30 2c 30 2c 30 2c 30 2c 30 29 0a 20 20 20 20  ,0,0,0,0,0).    
36300 20 20 20 20 20 20 20 21 3d 20 53 51 4c 49 54 45         != SQLITE
36310 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 62 53 65  _OK ){.      bSe
36320 6c 66 74 65 73 74 45 78 69 73 74 73 20 3d 20 30  lftestExists = 0
36330 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
36340 20 20 20 62 53 65 6c 66 74 65 73 74 45 78 69 73     bSelftestExis
36350 74 73 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  ts = 1;.    }.  
36360 20 20 69 66 28 20 62 49 73 49 6e 69 74 20 29 7b    if( bIsInit ){
36370 0a 20 20 20 20 20 20 63 72 65 61 74 65 53 65 6c  .      createSel
36380 66 74 65 73 74 54 61 62 6c 65 28 70 29 3b 0a 20  ftestTable(p);. 
36390 20 20 20 20 20 62 53 65 6c 66 74 65 73 74 45 78       bSelftestEx
363a0 69 73 74 73 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  ists = 1;.    }.
363b0 20 20 20 20 69 6e 69 74 54 65 78 74 28 26 73 74      initText(&st
363c0 72 29 3b 0a 20 20 20 20 61 70 70 65 6e 64 54 65  r);.    appendTe
363d0 78 74 28 26 73 74 72 2c 20 22 78 22 2c 20 30 29  xt(&str, "x", 0)
363e0 3b 0a 20 20 20 20 66 6f 72 28 6b 3d 62 53 65 6c  ;.    for(k=bSel
363f0 66 74 65 73 74 45 78 69 73 74 73 3b 20 6b 3e 3d  ftestExists; k>=
36400 30 3b 20 6b 2d 2d 29 7b 0a 20 20 20 20 20 20 69  0; k--){.      i
36410 66 28 20 6b 3d 3d 31 20 29 7b 0a 20 20 20 20 20  f( k==1 ){.     
36420 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
36430 70 72 65 70 61 72 65 5f 76 32 28 70 2d 3e 64 62  prepare_v2(p->db
36440 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 53  ,.            "S
36450 45 4c 45 43 54 20 74 6e 6f 2c 6f 70 2c 63 6d 64  ELECT tno,op,cmd
36460 2c 61 6e 73 20 46 52 4f 4d 20 73 65 6c 66 74 65  ,ans FROM selfte
36470 73 74 20 4f 52 44 45 52 20 42 59 20 74 6e 6f 22  st ORDER BY tno"
36480 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 2d 31  ,.            -1
36490 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20  , &pStmt, 0);.  
364a0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
364b0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
364c0 70 72 65 70 61 72 65 5f 76 32 28 70 2d 3e 64 62  prepare_v2(p->db
364d0 2c 0a 20 20 20 20 20 20 20 20 20 20 22 56 41 4c  ,.          "VAL
364e0 55 45 53 28 30 2c 27 6d 65 6d 6f 27 2c 27 4d 69  UES(0,'memo','Mi
364f0 73 73 69 6e 67 20 53 45 4c 46 54 45 53 54 20 74  ssing SELFTEST t
36500 61 62 6c 65 20 2d 20 64 65 66 61 75 6c 74 20 63  able - default c
36510 68 65 63 6b 73 20 6f 6e 6c 79 27 2c 27 27 29 2c  hecks only',''),
36520 22 0a 20 20 20 20 20 20 20 20 20 20 22 20 20 20  ".          "   
36530 20 20 20 28 31 2c 27 72 75 6e 27 2c 27 50 52 41     (1,'run','PRA
36540 47 4d 41 20 69 6e 74 65 67 72 69 74 79 5f 63 68  GMA integrity_ch
36550 65 63 6b 27 2c 27 6f 6b 27 29 22 2c 0a 20 20 20  eck','ok')",.   
36560 20 20 20 20 20 20 20 2d 31 2c 20 26 70 53 74 6d         -1, &pStm
36570 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  t, 0);.      }. 
36580 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
36590 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74         raw_print
365a0 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72  f(stderr, "Error
365b0 20 71 75 65 72 79 69 6e 67 20 74 68 65 20 73 65   querying the se
365c0 6c 66 74 65 73 74 20 74 61 62 6c 65 5c 6e 22 29  lftest table\n")
365d0 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 31  ;.        rc = 1
365e0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
365f0 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74  3_finalize(pStmt
36600 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  );.        goto 
36610 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69  meta_command_exi
36620 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  t;.      }.     
36630 20 66 6f 72 28 69 3d 31 3b 20 73 71 6c 69 74 65   for(i=1; sqlite
36640 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3d 3d 53  3_step(pStmt)==S
36650 51 4c 49 54 45 5f 52 4f 57 3b 20 69 2b 2b 29 7b  QLITE_ROW; i++){
36660 0a 20 20 20 20 20 20 20 20 69 6e 74 20 74 6e 6f  .        int tno
36670 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
36680 6e 5f 69 6e 74 28 70 53 74 6d 74 2c 20 30 29 3b  n_int(pStmt, 0);
36690 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63  .        const c
366a0 68 61 72 20 2a 7a 4f 70 20 3d 20 28 63 6f 6e 73  har *zOp = (cons
366b0 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f  t char*)sqlite3_
366c0 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d  column_text(pStm
366d0 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 63  t, 1);.        c
366e0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 20  onst char *zSql 
366f0 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73  = (const char*)s
36700 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
36710 78 74 28 70 53 74 6d 74 2c 20 32 29 3b 0a 20 20  xt(pStmt, 2);.  
36720 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
36730 20 2a 7a 41 6e 73 20 3d 20 28 63 6f 6e 73 74 20   *zAns = (const 
36740 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f  char*)sqlite3_co
36750 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c  lumn_text(pStmt,
36760 20 33 29 3b 0a 0a 20 20 20 20 20 20 20 20 6b 20   3);..        k 
36770 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69 66 28  = 0;.        if(
36780 20 62 56 65 72 62 6f 73 65 3e 30 20 29 7b 0a 20   bVerbose>0 ){. 
36790 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a           char *z
367a0 51 75 6f 74 65 20 3d 20 73 71 6c 69 74 65 33 5f  Quote = sqlite3_
367b0 6d 70 72 69 6e 74 66 28 22 25 71 22 2c 20 7a 53  mprintf("%q", zS
367c0 71 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  ql);.          p
367d0 72 69 6e 74 66 28 22 25 64 3a 20 25 73 20 25 73  rintf("%d: %s %s
367e0 5c 6e 22 2c 20 74 6e 6f 2c 20 7a 4f 70 2c 20 7a  \n", tno, zOp, z
367f0 53 71 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Sql);.          
36800 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 51 75  sqlite3_free(zQu
36810 6f 74 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ote);.        }.
36820 20 20 20 20 20 20 20 20 69 66 28 20 73 74 72 63          if( strc
36830 6d 70 28 7a 4f 70 2c 22 6d 65 6d 6f 22 29 3d 3d  mp(zOp,"memo")==
36840 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75  0 ){.          u
36850 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  tf8_printf(p->ou
36860 74 2c 20 22 25 73 5c 6e 22 2c 20 7a 53 71 6c 29  t, "%s\n", zSql)
36870 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 0a  ;.        }else.
36880 20 20 20 20 20 20 20 20 69 66 28 20 73 74 72 63          if( strc
36890 6d 70 28 7a 4f 70 2c 22 72 75 6e 22 29 3d 3d 30  mp(zOp,"run")==0
368a0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 68   ){.          ch
368b0 61 72 20 2a 7a 45 72 72 4d 73 67 20 3d 20 30 3b  ar *zErrMsg = 0;
368c0 0a 20 20 20 20 20 20 20 20 20 20 73 74 72 2e 6e  .          str.n
368d0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
368e0 73 74 72 2e 7a 5b 30 5d 20 3d 20 30 3b 0a 20 20  str.z[0] = 0;.  
368f0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
36900 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c  ite3_exec(p->db,
36910 20 7a 53 71 6c 2c 20 63 61 70 74 75 72 65 4f 75   zSql, captureOu
36920 74 70 75 74 43 61 6c 6c 62 61 63 6b 2c 20 26 73  tputCallback, &s
36930 74 72 2c 20 26 7a 45 72 72 4d 73 67 29 3b 0a 20  tr, &zErrMsg);. 
36940 20 20 20 20 20 20 20 20 20 6e 54 65 73 74 2b 2b           nTest++
36950 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
36960 62 56 65 72 62 6f 73 65 20 29 7b 0a 20 20 20 20  bVerbose ){.    
36970 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69          utf8_pri
36980 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 52 65 73  ntf(p->out, "Res
36990 75 6c 74 3a 20 25 73 5c 6e 22 2c 20 73 74 72 2e  ult: %s\n", str.
369a0 7a 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  z);.          }.
369b0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
369c0 20 7c 7c 20 7a 45 72 72 4d 73 67 20 29 7b 0a 20   || zErrMsg ){. 
369d0 20 20 20 20 20 20 20 20 20 20 20 6e 45 72 72 2b             nErr+
369e0 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  +;.            r
369f0 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  c = 1;.         
36a00 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70     utf8_printf(p
36a10 2d 3e 6f 75 74 2c 20 22 25 64 3a 20 65 72 72 6f  ->out, "%d: erro
36a20 72 2d 63 6f 64 65 2d 25 64 3a 20 25 73 5c 6e 22  r-code-%d: %s\n"
36a30 2c 20 74 6e 6f 2c 20 72 63 2c 20 7a 45 72 72 4d  , tno, rc, zErrM
36a40 73 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  sg);.           
36a50 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 45   sqlite3_free(zE
36a60 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 20 20  rrMsg);.        
36a70 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
36a80 6d 70 28 7a 41 6e 73 2c 73 74 72 2e 7a 29 21 3d  mp(zAns,str.z)!=
36a90 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
36aa0 20 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 20   nErr++;.       
36ab0 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20       rc = 1;.   
36ac0 20 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72           utf8_pr
36ad0 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 64  intf(p->out, "%d
36ae0 3a 20 45 78 70 65 63 74 65 64 3a 20 5b 25 73 5d  : Expected: [%s]
36af0 5c 6e 22 2c 20 74 6e 6f 2c 20 7a 41 6e 73 29 3b  \n", tno, zAns);
36b00 0a 20 20 20 20 20 20 20 20 20 20 20 20 75 74 66  .            utf
36b10 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  8_printf(p->out,
36b20 20 22 25 64 3a 20 20 20 20 20 20 47 6f 74 3a 20   "%d:      Got: 
36b30 5b 25 73 5d 5c 6e 22 2c 20 74 6e 6f 2c 20 73 74  [%s]\n", tno, st
36b40 72 2e 7a 29 3b 0a 20 20 20 20 20 20 20 20 20 20  r.z);.          
36b50 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 0a  }.        }else.
36b60 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20          {.      
36b70 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
36b80 73 74 64 65 72 72 2c 0a 20 20 20 20 20 20 20 20  stderr,.        
36b90 20 20 20 20 22 55 6e 6b 6e 6f 77 6e 20 6f 70 65      "Unknown ope
36ba0 72 61 74 69 6f 6e 20 5c 22 25 73 5c 22 20 6f 6e  ration \"%s\" on
36bb0 20 73 65 6c 66 74 65 73 74 20 6c 69 6e 65 20 25   selftest line %
36bc0 64 5c 6e 22 2c 20 7a 4f 70 2c 20 74 6e 6f 29 3b  d\n", zOp, tno);
36bd0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
36be0 31 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  1;.          bre
36bf0 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
36c00 20 20 20 20 7d 20 2f 2a 20 45 6e 64 20 6c 6f 6f      } /* End loo
36c10 70 20 6f 76 65 72 20 72 6f 77 73 20 6f 66 20 63  p over rows of c
36c20 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 53 45 4c 46  ontent from SELF
36c30 54 45 53 54 20 2a 2f 0a 20 20 20 20 20 20 73 71  TEST */.      sq
36c40 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
36c50 53 74 6d 74 29 3b 0a 20 20 20 20 7d 20 2f 2a 20  Stmt);.    } /* 
36c60 45 6e 64 20 6c 6f 6f 70 20 6f 76 65 72 20 6b 20  End loop over k 
36c70 2a 2f 0a 20 20 20 20 66 72 65 65 54 65 78 74 28  */.    freeText(
36c80 26 73 74 72 29 3b 0a 20 20 20 20 75 74 66 38 5f  &str);.    utf8_
36c90 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
36ca0 25 64 20 65 72 72 6f 72 73 20 6f 75 74 20 6f 66  %d errors out of
36cb0 20 25 64 20 74 65 73 74 73 5c 6e 22 2c 20 6e 45   %d tests\n", nE
36cc0 72 72 2c 20 6e 54 65 73 74 29 3b 0a 20 20 7d 65  rr, nTest);.  }e
36cd0 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 73  lse..  if( c=='s
36ce0 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41  ' && strncmp(azA
36cf0 72 67 5b 30 5d 2c 20 22 73 65 70 61 72 61 74 6f  rg[0], "separato
36d00 72 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20  r", n)==0 ){.   
36d10 20 69 66 28 20 6e 41 72 67 3c 32 20 7c 7c 20 6e   if( nArg<2 || n
36d20 41 72 67 3e 33 20 29 7b 0a 20 20 20 20 20 20 72  Arg>3 ){.      r
36d30 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  aw_printf(stderr
36d40 2c 20 22 55 73 61 67 65 3a 20 2e 73 65 70 61 72  , "Usage: .separ
36d50 61 74 6f 72 20 43 4f 4c 20 3f 52 4f 57 3f 5c 6e  ator COL ?ROW?\n
36d60 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31  ");.      rc = 1
36d70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
36d80 6e 41 72 67 3e 3d 32 20 29 7b 0a 20 20 20 20 20  nArg>=2 ){.     
36d90 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
36da0 66 28 73 69 7a 65 6f 66 28 70 2d 3e 63 6f 6c 53  f(sizeof(p->colS
36db0 65 70 61 72 61 74 6f 72 29 2c 20 70 2d 3e 63 6f  eparator), p->co
36dc0 6c 53 65 70 61 72 61 74 6f 72 2c 0a 20 20 20 20  lSeparator,.    
36dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36de0 20 20 20 22 25 2e 2a 73 22 2c 20 28 69 6e 74 29     "%.*s", (int)
36df0 41 72 72 61 79 53 69 7a 65 28 70 2d 3e 63 6f 6c  ArraySize(p->col
36e00 53 65 70 61 72 61 74 6f 72 29 2d 31 2c 20 61 7a  Separator)-1, az
36e10 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20 7d 0a 20  Arg[1]);.    }. 
36e20 20 20 20 69 66 28 20 6e 41 72 67 3e 3d 33 20 29     if( nArg>=3 )
36e30 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
36e40 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
36e50 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 29  p->rowSeparator)
36e60 2c 20 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f  , p->rowSeparato
36e70 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r,.             
36e80 20 20 20 20 20 20 20 20 20 20 22 25 2e 2a 73 22            "%.*s"
36e90 2c 20 28 69 6e 74 29 41 72 72 61 79 53 69 7a 65  , (int)ArraySize
36ea0 28 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72  (p->rowSeparator
36eb0 29 2d 31 2c 20 61 7a 41 72 67 5b 32 5d 29 3b 0a  )-1, azArg[2]);.
36ec0 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20      }.  }else.. 
36ed0 20 69 66 28 20 63 3d 3d 27 73 27 20 26 26 20 6e   if( c=='s' && n
36ee0 3e 3d 34 20 26 26 20 73 74 72 6e 63 6d 70 28 61  >=4 && strncmp(a
36ef0 7a 41 72 67 5b 30 5d 2c 22 73 68 61 33 73 75 6d  zArg[0],"sha3sum
36f00 22 2c 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 63  ",n)==0 ){.    c
36f10 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4c 69 6b 65  onst char *zLike
36f20 20 3d 20 30 3b 20 20 20 2f 2a 20 57 68 69 63 68   = 0;   /* Which
36f30 20 74 61 62 6c 65 20 74 6f 20 63 68 65 63 6b 73   table to checks
36f40 75 6d 2e 20 30 20 6d 65 61 6e 73 20 65 76 65 72  um. 0 means ever
36f50 79 74 68 69 6e 67 20 2a 2f 0a 20 20 20 20 69 6e  ything */.    in
36f60 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
36f70 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
36f80 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 69 6e  ounter */.    in
36f90 74 20 62 53 63 68 65 6d 61 20 3d 20 30 3b 20 20  t bSchema = 0;  
36fa0 20 20 20 20 20 20 20 2f 2a 20 41 6c 73 6f 20 68         /* Also h
36fb0 61 73 68 20 74 68 65 20 73 63 68 65 6d 61 20 2a  ash the schema *
36fc0 2f 0a 20 20 20 20 69 6e 74 20 62 53 65 70 61 72  /.    int bSepar
36fd0 61 74 65 20 3d 20 30 3b 20 20 20 20 20 20 20 2f  ate = 0;       /
36fe0 2a 20 48 61 73 68 20 65 61 63 68 20 74 61 62 6c  * Hash each tabl
36ff0 65 20 73 65 70 61 72 61 74 65 6c 79 20 2a 2f 0a  e separately */.
37000 20 20 20 20 69 6e 74 20 69 53 69 7a 65 20 3d 20      int iSize = 
37010 32 32 34 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  224;         /* 
37020 48 61 73 68 20 61 6c 67 6f 72 69 74 68 6d 20 74  Hash algorithm t
37030 6f 20 75 73 65 20 2a 2f 0a 20 20 20 20 69 6e 74  o use */.    int
37040 20 62 44 65 62 75 67 20 3d 20 30 3b 20 20 20 20   bDebug = 0;    
37050 20 20 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 73 68        /* Only sh
37060 6f 77 20 74 68 65 20 71 75 65 72 79 20 74 68 61  ow the query tha
37070 74 20 77 6f 75 6c 64 20 68 61 76 65 20 72 75 6e  t would have run
37080 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   */.    sqlite3_
37090 73 74 6d 74 20 2a 70 53 74 6d 74 3b 20 20 20 20  stmt *pStmt;    
370a0 20 2f 2a 20 46 6f 72 20 71 75 65 72 79 69 6e 67   /* For querying
370b0 20 74 61 62 6c 65 73 20 6e 61 6d 65 73 20 2a 2f   tables names */
370c0 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b  .    char *zSql;
370d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
370e0 20 53 51 4c 20 74 6f 20 62 65 20 72 75 6e 20 2a   SQL to be run *
370f0 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 65 70  /.    char *zSep
37100 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
37110 2a 20 53 65 70 61 72 61 74 6f 72 20 2a 2f 0a 20  * Separator */. 
37120 20 20 20 53 68 65 6c 6c 54 65 78 74 20 73 53 71     ShellText sSq
37130 6c 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43  l;          /* C
37140 6f 6d 70 6c 65 74 65 20 53 51 4c 20 66 6f 72 20  omplete SQL for 
37150 74 68 65 20 71 75 65 72 79 20 74 6f 20 72 75 6e  the query to run
37160 20 74 68 65 20 68 61 73 68 20 2a 2f 0a 20 20 20   the hash */.   
37170 20 53 68 65 6c 6c 54 65 78 74 20 73 51 75 65 72   ShellText sQuer
37180 79 3b 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74  y;        /* Set
37190 20 6f 66 20 71 75 65 72 69 65 73 20 75 73 65 64   of queries used
371a0 20 74 6f 20 72 65 61 64 20 61 6c 6c 20 63 6f 6e   to read all con
371b0 74 65 6e 74 20 2a 2f 0a 20 20 20 20 6f 70 65 6e  tent */.    open
371c0 5f 64 62 28 70 2c 20 30 29 3b 0a 20 20 20 20 66  _db(p, 0);.    f
371d0 6f 72 28 69 3d 31 3b 20 69 3c 6e 41 72 67 3b 20  or(i=1; i<nArg; 
371e0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73  i++){.      cons
371f0 74 20 63 68 61 72 20 2a 7a 20 3d 20 61 7a 41 72  t char *z = azAr
37200 67 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20  g[i];.      if( 
37210 7a 5b 30 5d 3d 3d 27 2d 27 20 29 7b 0a 20 20 20  z[0]=='-' ){.   
37220 20 20 20 20 20 7a 2b 2b 3b 0a 20 20 20 20 20 20       z++;.      
37230 20 20 69 66 28 20 7a 5b 30 5d 3d 3d 27 2d 27 20    if( z[0]=='-' 
37240 29 20 7a 2b 2b 3b 0a 20 20 20 20 20 20 20 20 69  ) z++;.        i
37250 66 28 20 73 74 72 63 6d 70 28 7a 2c 22 73 63 68  f( strcmp(z,"sch
37260 65 6d 61 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ema")==0 ){.    
37270 20 20 20 20 20 20 62 53 63 68 65 6d 61 20 3d 20        bSchema = 
37280 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  1;.        }else
37290 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 74 72  .        if( str
372a0 63 6d 70 28 7a 2c 22 73 68 61 33 2d 32 32 34 22  cmp(z,"sha3-224"
372b0 29 3d 3d 30 20 7c 7c 20 73 74 72 63 6d 70 28 7a  )==0 || strcmp(z
372c0 2c 22 73 68 61 33 2d 32 35 36 22 29 3d 3d 30 0a  ,"sha3-256")==0.
372d0 20 20 20 20 20 20 20 20 20 7c 7c 20 73 74 72 63           || strc
372e0 6d 70 28 7a 2c 22 73 68 61 33 2d 33 38 34 22 29  mp(z,"sha3-384")
372f0 3d 3d 30 20 7c 7c 20 73 74 72 63 6d 70 28 7a 2c  ==0 || strcmp(z,
37300 22 73 68 61 33 2d 35 31 32 22 29 3d 3d 30 0a 20  "sha3-512")==0. 
37310 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
37320 20 20 20 20 69 53 69 7a 65 20 3d 20 61 74 6f 69      iSize = atoi
37330 28 26 7a 5b 35 5d 29 3b 0a 20 20 20 20 20 20 20  (&z[5]);.       
37340 20 7d 65 6c 73 65 0a 20 20 20 20 20 20 20 20 69   }else.        i
37350 66 28 20 73 74 72 63 6d 70 28 7a 2c 22 64 65 62  f( strcmp(z,"deb
37360 75 67 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ug")==0 ){.     
37370 20 20 20 20 20 62 44 65 62 75 67 20 3d 20 31 3b       bDebug = 1;
37380 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 0a 20  .        }else. 
37390 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20         {.       
373a0 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73     utf8_printf(s
373b0 74 64 65 72 72 2c 20 22 55 6e 6b 6e 6f 77 6e 20  tderr, "Unknown 
373c0 6f 70 74 69 6f 6e 20 5c 22 25 73 5c 22 20 6f 6e  option \"%s\" on
373d0 20 5c 22 25 73 5c 22 5c 6e 22 2c 0a 20 20 20 20   \"%s\"\n",.    
373e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
373f0 20 20 61 7a 41 72 67 5b 69 5d 2c 20 61 7a 41 72    azArg[i], azAr
37400 67 5b 30 5d 29 3b 0a 20 20 20 20 20 20 20 20 20  g[0]);.         
37410 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65   raw_printf(stde
37420 72 72 2c 20 22 53 68 6f 75 6c 64 20 62 65 20 6f  rr, "Should be o
37430 6e 65 20 6f 66 3a 20 2d 2d 73 63 68 65 6d 61 22  ne of: --schema"
37440 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
37450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20                " 
37460 2d 2d 73 68 61 33 2d 32 32 34 20 2d 2d 73 68 61  --sha3-224 --sha
37470 33 2d 32 35 36 20 2d 2d 73 68 61 33 2d 33 38 34  3-256 --sha3-384
37480 20 2d 2d 73 68 61 33 2d 35 31 32 5c 6e 22 29 3b   --sha3-512\n");
37490 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
374a0 31 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  1;.          got
374b0 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65  o meta_command_e
374c0 78 69 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  xit;.        }. 
374d0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 7a       }else if( z
374e0 4c 69 6b 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Like ){.        
374f0 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72  raw_printf(stder
37500 72 2c 20 22 55 73 61 67 65 3a 20 2e 73 68 61 33  r, "Usage: .sha3
37510 73 75 6d 20 3f 4f 50 54 49 4f 4e 53 3f 20 3f 4c  sum ?OPTIONS? ?L
37520 49 4b 45 2d 50 41 54 54 45 52 4e 3f 5c 6e 22 29  IKE-PATTERN?\n")
37530 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 31  ;.        rc = 1
37540 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d  ;.        goto m
37550 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74  eta_command_exit
37560 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
37570 20 20 20 20 20 20 20 7a 4c 69 6b 65 20 3d 20 7a         zLike = z
37580 3b 0a 20 20 20 20 20 20 20 20 62 53 65 70 61 72  ;.        bSepar
37590 61 74 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  ate = 1;.       
375a0 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72   if( sqlite3_str
375b0 6c 69 6b 65 28 22 73 71 6c 69 74 65 5c 5c 5f 25  like("sqlite\\_%
375c0 22 2c 20 7a 4c 69 6b 65 2c 20 27 5c 5c 27 29 3d  ", zLike, '\\')=
375d0 3d 30 20 29 20 62 53 63 68 65 6d 61 20 3d 20 31  =0 ) bSchema = 1
375e0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
375f0 20 20 20 20 69 66 28 20 62 53 63 68 65 6d 61 20      if( bSchema 
37600 29 7b 0a 20 20 20 20 20 20 7a 53 71 6c 20 3d 20  ){.      zSql = 
37610 22 53 45 4c 45 43 54 20 6c 6f 77 65 72 28 6e 61  "SELECT lower(na
37620 6d 65 29 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f  me) FROM sqlite_
37630 6d 61 73 74 65 72 22 0a 20 20 20 20 20 20 20 20  master".        
37640 20 20 20 20 20 22 20 57 48 45 52 45 20 74 79 70       " WHERE typ
37650 65 3d 27 74 61 62 6c 65 27 20 41 4e 44 20 63 6f  e='table' AND co
37660 61 6c 65 73 63 65 28 72 6f 6f 74 70 61 67 65 2c  alesce(rootpage,
37670 30 29 3e 31 22 0a 20 20 20 20 20 20 20 20 20 20  0)>1".          
37680 20 20 20 22 20 55 4e 49 4f 4e 20 41 4c 4c 20 53     " UNION ALL S
37690 45 4c 45 43 54 20 27 73 71 6c 69 74 65 5f 6d 61  ELECT 'sqlite_ma
376a0 73 74 65 72 27 22 0a 20 20 20 20 20 20 20 20 20  ster'".         
376b0 20 20 20 20 22 20 4f 52 44 45 52 20 42 59 20 31      " ORDER BY 1
376c0 20 63 6f 6c 6c 61 74 65 20 6e 6f 63 61 73 65 22   collate nocase"
376d0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
376e0 20 20 20 7a 53 71 6c 20 3d 20 22 53 45 4c 45 43     zSql = "SELEC
376f0 54 20 6c 6f 77 65 72 28 6e 61 6d 65 29 20 46 52  T lower(name) FR
37700 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  OM sqlite_master
37710 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 22  ".             "
37720 20 57 48 45 52 45 20 74 79 70 65 3d 27 74 61 62   WHERE type='tab
37730 6c 65 27 20 41 4e