/ Hex Artifact Content
Login

Artifact d1dbc1514d74b425db41be006f2a4f91d26c5e1c2db4ab198b45c12920171e11:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 63 6f 64  ile contains cod
0190: 65 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74  e to implement t
01a0: 68 65 20 22 73 71 6c 69 74 65 22 20 63 6f 6d 6d  he "sqlite" comm
01b0: 61 6e 64 20 6c 69 6e 65 0a 2a 2a 20 75 74 69 6c  and line.** util
01c0: 69 74 79 20 66 6f 72 20 61 63 63 65 73 73 69 6e  ity for accessin
01d0: 67 20 53 51 4c 69 74 65 20 64 61 74 61 62 61 73  g SQLite databas
01e0: 65 73 2e 0a 2a 2f 0a 23 69 66 20 28 64 65 66 69  es..*/.#if (defi
01f0: 6e 65 64 28 5f 57 49 4e 33 32 29 20 7c 7c 20 64  ned(_WIN32) || d
0200: 65 66 69 6e 65 64 28 57 49 4e 33 32 29 29 20 26  efined(WIN32)) &
0210: 26 20 21 64 65 66 69 6e 65 64 28 5f 43 52 54 5f  & !defined(_CRT_
0220: 53 45 43 55 52 45 5f 4e 4f 5f 57 41 52 4e 49 4e  SECURE_NO_WARNIN
0230: 47 53 29 0a 2f 2a 20 54 68 69 73 20 6e 65 65 64  GS)./* This need
0240: 73 20 74 6f 20 63 6f 6d 65 20 62 65 66 6f 72 65  s to come before
0250: 20 61 6e 79 20 69 6e 63 6c 75 64 65 73 20 66 6f   any includes fo
0260: 72 20 4d 53 56 43 20 63 6f 6d 70 69 6c 65 72 20  r MSVC compiler 
0270: 2a 2f 0a 23 64 65 66 69 6e 65 20 5f 43 52 54 5f  */.#define _CRT_
0280: 53 45 43 55 52 45 5f 4e 4f 5f 57 41 52 4e 49 4e  SECURE_NO_WARNIN
0290: 47 53 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  GS.#endif../*.**
02a0: 20 57 61 72 6e 69 6e 67 20 70 72 61 67 6d 61 73   Warning pragmas
02b0: 20 63 6f 70 69 65 64 20 66 72 6f 6d 20 6d 73 76   copied from msv
02c0: 63 2e 68 20 69 6e 20 74 68 65 20 63 6f 72 65 2e  c.h in the core.
02d0: 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28  .*/.#if defined(
02e0: 5f 4d 53 43 5f 56 45 52 29 0a 23 70 72 61 67 6d  _MSC_VER).#pragm
02f0: 61 20 77 61 72 6e 69 6e 67 28 64 69 73 61 62 6c  a warning(disabl
0300: 65 20 3a 20 34 30 35 34 29 0a 23 70 72 61 67 6d  e : 4054).#pragm
0310: 61 20 77 61 72 6e 69 6e 67 28 64 69 73 61 62 6c  a warning(disabl
0320: 65 20 3a 20 34 30 35 35 29 0a 23 70 72 61 67 6d  e : 4055).#pragm
0330: 61 20 77 61 72 6e 69 6e 67 28 64 69 73 61 62 6c  a warning(disabl
0340: 65 20 3a 20 34 31 30 30 29 0a 23 70 72 61 67 6d  e : 4100).#pragm
0350: 61 20 77 61 72 6e 69 6e 67 28 64 69 73 61 62 6c  a warning(disabl
0360: 65 20 3a 20 34 31 32 37 29 0a 23 70 72 61 67 6d  e : 4127).#pragm
0370: 61 20 77 61 72 6e 69 6e 67 28 64 69 73 61 62 6c  a warning(disabl
0380: 65 20 3a 20 34 31 33 30 29 0a 23 70 72 61 67 6d  e : 4130).#pragm
0390: 61 20 77 61 72 6e 69 6e 67 28 64 69 73 61 62 6c  a warning(disabl
03a0: 65 20 3a 20 34 31 35 32 29 0a 23 70 72 61 67 6d  e : 4152).#pragm
03b0: 61 20 77 61 72 6e 69 6e 67 28 64 69 73 61 62 6c  a warning(disabl
03c0: 65 20 3a 20 34 31 38 39 29 0a 23 70 72 61 67 6d  e : 4189).#pragm
03d0: 61 20 77 61 72 6e 69 6e 67 28 64 69 73 61 62 6c  a warning(disabl
03e0: 65 20 3a 20 34 32 30 36 29 0a 23 70 72 61 67 6d  e : 4206).#pragm
03f0: 61 20 77 61 72 6e 69 6e 67 28 64 69 73 61 62 6c  a warning(disabl
0400: 65 20 3a 20 34 32 31 30 29 0a 23 70 72 61 67 6d  e : 4210).#pragm
0410: 61 20 77 61 72 6e 69 6e 67 28 64 69 73 61 62 6c  a warning(disabl
0420: 65 20 3a 20 34 32 33 32 29 0a 23 70 72 61 67 6d  e : 4232).#pragm
0430: 61 20 77 61 72 6e 69 6e 67 28 64 69 73 61 62 6c  a warning(disabl
0440: 65 20 3a 20 34 32 34 34 29 0a 23 70 72 61 67 6d  e : 4244).#pragm
0450: 61 20 77 61 72 6e 69 6e 67 28 64 69 73 61 62 6c  a warning(disabl
0460: 65 20 3a 20 34 33 30 35 29 0a 23 70 72 61 67 6d  e : 4305).#pragm
0470: 61 20 77 61 72 6e 69 6e 67 28 64 69 73 61 62 6c  a warning(disabl
0480: 65 20 3a 20 34 33 30 36 29 0a 23 70 72 61 67 6d  e : 4306).#pragm
0490: 61 20 77 61 72 6e 69 6e 67 28 64 69 73 61 62 6c  a warning(disabl
04a0: 65 20 3a 20 34 37 30 32 29 0a 23 70 72 61 67 6d  e : 4702).#pragm
04b0: 61 20 77 61 72 6e 69 6e 67 28 64 69 73 61 62 6c  a warning(disabl
04c0: 65 20 3a 20 34 37 30 36 29 0a 23 65 6e 64 69 66  e : 4706).#endif
04d0: 20 2f 2a 20 64 65 66 69 6e 65 64 28 5f 4d 53 43   /* defined(_MSC
04e0: 5f 56 45 52 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  _VER) */../*.** 
04f0: 4e 6f 20 73 75 70 70 6f 72 74 20 66 6f 72 20 6c  No support for l
0500: 6f 61 64 61 62 6c 65 20 65 78 74 65 6e 73 69 6f  oadable extensio
0510: 6e 73 20 69 6e 20 56 78 57 6f 72 6b 73 2e 0a 2a  ns in VxWorks..*
0520: 2f 0a 23 69 66 20 28 64 65 66 69 6e 65 64 28 5f  /.#if (defined(_
0530: 5f 52 54 50 5f 5f 29 20 7c 7c 20 64 65 66 69 6e  _RTP__) || defin
0540: 65 64 28 5f 57 52 53 5f 4b 45 52 4e 45 4c 29 29  ed(_WRS_KERNEL))
0550: 20 26 26 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54   && !SQLITE_OMIT
0560: 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 0a  _LOAD_EXTENSION.
0570: 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f  # define SQLITE_
0580: 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53  OMIT_LOAD_EXTENS
0590: 49 4f 4e 20 31 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ION 1.#endif../*
05a0: 0a 2a 2a 20 45 6e 61 62 6c 65 20 6c 61 72 67 65  .** Enable large
05b0: 2d 66 69 6c 65 20 73 75 70 70 6f 72 74 20 66 6f  -file support fo
05c0: 72 20 66 6f 70 65 6e 28 29 20 61 6e 64 20 66 72  r fopen() and fr
05d0: 69 65 6e 64 73 20 6f 6e 20 75 6e 69 78 2e 0a 2a  iends on unix..*
05e0: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
05f0: 5f 44 49 53 41 42 4c 45 5f 4c 46 53 0a 23 20 64  _DISABLE_LFS.# d
0600: 65 66 69 6e 65 20 5f 4c 41 52 47 45 5f 46 49 4c  efine _LARGE_FIL
0610: 45 20 20 20 20 20 20 20 31 0a 23 20 69 66 6e 64  E       1.# ifnd
0620: 65 66 20 5f 46 49 4c 45 5f 4f 46 46 53 45 54 5f  ef _FILE_OFFSET_
0630: 42 49 54 53 0a 23 20 20 20 64 65 66 69 6e 65 20  BITS.#   define 
0640: 5f 46 49 4c 45 5f 4f 46 46 53 45 54 5f 42 49 54  _FILE_OFFSET_BIT
0650: 53 20 36 34 0a 23 20 65 6e 64 69 66 0a 23 20 64  S 64.# endif.# d
0660: 65 66 69 6e 65 20 5f 4c 41 52 47 45 46 49 4c 45  efine _LARGEFILE
0670: 5f 53 4f 55 52 43 45 20 31 0a 23 65 6e 64 69 66  _SOURCE 1.#endif
0680: 0a 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 64 6c  ..#include <stdl
0690: 69 62 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c  ib.h>.#include <
06a0: 73 74 72 69 6e 67 2e 68 3e 0a 23 69 6e 63 6c 75  string.h>.#inclu
06b0: 64 65 20 3c 73 74 64 69 6f 2e 68 3e 0a 23 69 6e  de <stdio.h>.#in
06c0: 63 6c 75 64 65 20 3c 61 73 73 65 72 74 2e 68 3e  clude <assert.h>
06d0: 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74  .#include "sqlit
06e0: 65 33 2e 68 22 0a 74 79 70 65 64 65 66 20 73 71  e3.h".typedef sq
06f0: 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 36 34 3b  lite3_int64 i64;
0700: 0a 74 79 70 65 64 65 66 20 73 71 6c 69 74 65 33  .typedef sqlite3
0710: 5f 75 69 6e 74 36 34 20 75 36 34 3b 0a 74 79 70  _uint64 u64;.typ
0720: 65 64 65 66 20 75 6e 73 69 67 6e 65 64 20 63 68  edef unsigned ch
0730: 61 72 20 75 38 3b 0a 23 69 66 20 53 51 4c 49 54  ar u8;.#if SQLIT
0740: 45 5f 55 53 45 52 5f 41 55 54 48 45 4e 54 49 43  E_USER_AUTHENTIC
0750: 41 54 49 4f 4e 0a 23 20 69 6e 63 6c 75 64 65 20  ATION.# include 
0760: 22 73 71 6c 69 74 65 33 75 73 65 72 61 75 74 68  "sqlite3userauth
0770: 2e 68 22 0a 23 65 6e 64 69 66 0a 23 69 6e 63 6c  .h".#endif.#incl
0780: 75 64 65 20 3c 63 74 79 70 65 2e 68 3e 0a 23 69  ude <ctype.h>.#i
0790: 6e 63 6c 75 64 65 20 3c 73 74 64 61 72 67 2e 68  nclude <stdarg.h
07a0: 3e 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  >..#if !defined(
07b0: 5f 57 49 4e 33 32 29 20 26 26 20 21 64 65 66 69  _WIN32) && !defi
07c0: 6e 65 64 28 57 49 4e 33 32 29 0a 23 20 69 6e 63  ned(WIN32).# inc
07d0: 6c 75 64 65 20 3c 73 69 67 6e 61 6c 2e 68 3e 0a  lude <signal.h>.
07e0: 23 20 69 66 20 21 64 65 66 69 6e 65 64 28 5f 5f  # if !defined(__
07f0: 52 54 50 5f 5f 29 20 26 26 20 21 64 65 66 69 6e  RTP__) && !defin
0800: 65 64 28 5f 57 52 53 5f 4b 45 52 4e 45 4c 29 0a  ed(_WRS_KERNEL).
0810: 23 20 20 69 6e 63 6c 75 64 65 20 3c 70 77 64 2e  #  include <pwd.
0820: 68 3e 0a 23 20 65 6e 64 69 66 0a 23 65 6e 64 69  h>.# endif.#endi
0830: 66 0a 23 69 66 20 28 21 64 65 66 69 6e 65 64 28  f.#if (!defined(
0840: 5f 57 49 4e 33 32 29 20 26 26 20 21 64 65 66 69  _WIN32) && !defi
0850: 6e 65 64 28 57 49 4e 33 32 29 29 20 7c 7c 20 64  ned(WIN32)) || d
0860: 65 66 69 6e 65 64 28 5f 5f 4d 49 4e 47 57 33 32  efined(__MINGW32
0870: 5f 5f 29 0a 23 20 69 6e 63 6c 75 64 65 20 3c 75  __).# include <u
0880: 6e 69 73 74 64 2e 68 3e 0a 23 20 69 6e 63 6c 75  nistd.h>.# inclu
0890: 64 65 20 3c 64 69 72 65 6e 74 2e 68 3e 0a 23 20  de <dirent.h>.# 
08a0: 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 4d 49 4e  if defined(__MIN
08b0: 47 57 33 32 5f 5f 29 0a 23 20 20 64 65 66 69 6e  GW32__).#  defin
08c0: 65 20 44 49 52 45 4e 54 20 64 69 72 65 6e 74 0a  e DIRENT dirent.
08d0: 23 20 20 69 66 6e 64 65 66 20 53 5f 49 53 4c 4e  #  ifndef S_ISLN
08e0: 4b 0a 23 20 20 20 64 65 66 69 6e 65 20 53 5f 49  K.#   define S_I
08f0: 53 4c 4e 4b 28 6d 6f 64 65 29 20 28 30 29 0a 23  SLNK(mode) (0).#
0900: 20 20 65 6e 64 69 66 0a 23 20 65 6e 64 69 66 0a    endif.# endif.
0910: 23 65 6e 64 69 66 0a 23 69 6e 63 6c 75 64 65 20  #endif.#include 
0920: 3c 73 79 73 2f 74 79 70 65 73 2e 68 3e 0a 23 69  <sys/types.h>.#i
0930: 6e 63 6c 75 64 65 20 3c 73 79 73 2f 73 74 61 74  nclude <sys/stat
0940: 2e 68 3e 0a 0a 23 69 66 20 48 41 56 45 5f 52 45  .h>..#if HAVE_RE
0950: 41 44 4c 49 4e 45 0a 23 20 69 6e 63 6c 75 64 65  ADLINE.# include
0960: 20 3c 72 65 61 64 6c 69 6e 65 2f 72 65 61 64 6c   <readline/readl
0970: 69 6e 65 2e 68 3e 0a 23 20 69 6e 63 6c 75 64 65  ine.h>.# include
0980: 20 3c 72 65 61 64 6c 69 6e 65 2f 68 69 73 74 6f   <readline/histo
0990: 72 79 2e 68 3e 0a 23 65 6e 64 69 66 0a 0a 23 69  ry.h>.#endif..#i
09a0: 66 20 48 41 56 45 5f 45 44 49 54 4c 49 4e 45 0a  f HAVE_EDITLINE.
09b0: 23 20 69 6e 63 6c 75 64 65 20 3c 65 64 69 74 6c  # include <editl
09c0: 69 6e 65 2f 72 65 61 64 6c 69 6e 65 2e 68 3e 0a  ine/readline.h>.
09d0: 23 65 6e 64 69 66 0a 0a 23 69 66 20 48 41 56 45  #endif..#if HAVE
09e0: 5f 45 44 49 54 4c 49 4e 45 20 7c 7c 20 48 41 56  _EDITLINE || HAV
09f0: 45 5f 52 45 41 44 4c 49 4e 45 0a 0a 23 20 64 65  E_READLINE..# de
0a00: 66 69 6e 65 20 73 68 65 6c 6c 5f 61 64 64 5f 68  fine shell_add_h
0a10: 69 73 74 6f 72 79 28 58 29 20 61 64 64 5f 68 69  istory(X) add_hi
0a20: 73 74 6f 72 79 28 58 29 0a 23 20 64 65 66 69 6e  story(X).# defin
0a30: 65 20 73 68 65 6c 6c 5f 72 65 61 64 5f 68 69 73  e shell_read_his
0a40: 74 6f 72 79 28 58 29 20 72 65 61 64 5f 68 69 73  tory(X) read_his
0a50: 74 6f 72 79 28 58 29 0a 23 20 64 65 66 69 6e 65  tory(X).# define
0a60: 20 73 68 65 6c 6c 5f 77 72 69 74 65 5f 68 69 73   shell_write_his
0a70: 74 6f 72 79 28 58 29 20 77 72 69 74 65 5f 68 69  tory(X) write_hi
0a80: 73 74 6f 72 79 28 58 29 0a 23 20 64 65 66 69 6e  story(X).# defin
0a90: 65 20 73 68 65 6c 6c 5f 73 74 69 66 6c 65 5f 68  e shell_stifle_h
0aa0: 69 73 74 6f 72 79 28 58 29 20 73 74 69 66 6c 65  istory(X) stifle
0ab0: 5f 68 69 73 74 6f 72 79 28 58 29 0a 23 20 64 65  _history(X).# de
0ac0: 66 69 6e 65 20 73 68 65 6c 6c 5f 72 65 61 64 6c  fine shell_readl
0ad0: 69 6e 65 28 58 29 20 72 65 61 64 6c 69 6e 65 28  ine(X) readline(
0ae0: 58 29 0a 0a 23 65 6c 69 66 20 48 41 56 45 5f 4c  X)..#elif HAVE_L
0af0: 49 4e 45 4e 4f 49 53 45 0a 0a 23 20 69 6e 63 6c  INENOISE..# incl
0b00: 75 64 65 20 22 6c 69 6e 65 6e 6f 69 73 65 2e 68  ude "linenoise.h
0b10: 22 0a 23 20 64 65 66 69 6e 65 20 73 68 65 6c 6c  ".# define shell
0b20: 5f 61 64 64 5f 68 69 73 74 6f 72 79 28 58 29 20  _add_history(X) 
0b30: 6c 69 6e 65 6e 6f 69 73 65 48 69 73 74 6f 72 79  linenoiseHistory
0b40: 41 64 64 28 58 29 0a 23 20 64 65 66 69 6e 65 20  Add(X).# define 
0b50: 73 68 65 6c 6c 5f 72 65 61 64 5f 68 69 73 74 6f  shell_read_histo
0b60: 72 79 28 58 29 20 6c 69 6e 65 6e 6f 69 73 65 48  ry(X) linenoiseH
0b70: 69 73 74 6f 72 79 4c 6f 61 64 28 58 29 0a 23 20  istoryLoad(X).# 
0b80: 64 65 66 69 6e 65 20 73 68 65 6c 6c 5f 77 72 69  define shell_wri
0b90: 74 65 5f 68 69 73 74 6f 72 79 28 58 29 20 6c 69  te_history(X) li
0ba0: 6e 65 6e 6f 69 73 65 48 69 73 74 6f 72 79 53 61  nenoiseHistorySa
0bb0: 76 65 28 58 29 0a 23 20 64 65 66 69 6e 65 20 73  ve(X).# define s
0bc0: 68 65 6c 6c 5f 73 74 69 66 6c 65 5f 68 69 73 74  hell_stifle_hist
0bd0: 6f 72 79 28 58 29 20 6c 69 6e 65 6e 6f 69 73 65  ory(X) linenoise
0be0: 48 69 73 74 6f 72 79 53 65 74 4d 61 78 4c 65 6e  HistorySetMaxLen
0bf0: 28 58 29 0a 23 20 64 65 66 69 6e 65 20 73 68 65  (X).# define she
0c00: 6c 6c 5f 72 65 61 64 6c 69 6e 65 28 58 29 20 6c  ll_readline(X) l
0c10: 69 6e 65 6e 6f 69 73 65 28 58 29 0a 0a 23 65 6c  inenoise(X)..#el
0c20: 73 65 0a 0a 23 20 64 65 66 69 6e 65 20 73 68 65  se..# define she
0c30: 6c 6c 5f 72 65 61 64 5f 68 69 73 74 6f 72 79 28  ll_read_history(
0c40: 58 29 0a 23 20 64 65 66 69 6e 65 20 73 68 65 6c  X).# define shel
0c50: 6c 5f 77 72 69 74 65 5f 68 69 73 74 6f 72 79 28  l_write_history(
0c60: 58 29 0a 23 20 64 65 66 69 6e 65 20 73 68 65 6c  X).# define shel
0c70: 6c 5f 73 74 69 66 6c 65 5f 68 69 73 74 6f 72 79  l_stifle_history
0c80: 28 58 29 0a 0a 23 20 64 65 66 69 6e 65 20 53 48  (X)..# define SH
0c90: 45 4c 4c 5f 55 53 45 5f 4c 4f 43 41 4c 5f 47 45  ELL_USE_LOCAL_GE
0ca0: 54 4c 49 4e 45 20 31 0a 23 65 6e 64 69 66 0a 0a  TLINE 1.#endif..
0cb0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 57 49  .#if defined(_WI
0cc0: 4e 33 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  N32) || defined(
0cd0: 57 49 4e 33 32 29 0a 23 20 69 6e 63 6c 75 64 65  WIN32).# include
0ce0: 20 3c 69 6f 2e 68 3e 0a 23 20 69 6e 63 6c 75 64   <io.h>.# includ
0cf0: 65 20 3c 66 63 6e 74 6c 2e 68 3e 0a 23 20 64 65  e <fcntl.h>.# de
0d00: 66 69 6e 65 20 69 73 61 74 74 79 28 68 29 20 5f  fine isatty(h) _
0d10: 69 73 61 74 74 79 28 68 29 0a 23 20 69 66 6e 64  isatty(h).# ifnd
0d20: 65 66 20 61 63 63 65 73 73 0a 23 20 20 64 65 66  ef access.#  def
0d30: 69 6e 65 20 61 63 63 65 73 73 28 66 2c 6d 29 20  ine access(f,m) 
0d40: 5f 61 63 63 65 73 73 28 28 66 29 2c 28 6d 29 29  _access((f),(m))
0d50: 0a 23 20 65 6e 64 69 66 0a 23 20 75 6e 64 65 66  .# endif.# undef
0d60: 20 70 6f 70 65 6e 0a 23 20 64 65 66 69 6e 65 20   popen.# define 
0d70: 70 6f 70 65 6e 20 5f 70 6f 70 65 6e 0a 23 20 75  popen _popen.# u
0d80: 6e 64 65 66 20 70 63 6c 6f 73 65 0a 23 20 64 65  ndef pclose.# de
0d90: 66 69 6e 65 20 70 63 6c 6f 73 65 20 5f 70 63 6c  fine pclose _pcl
0da0: 6f 73 65 0a 23 65 6c 73 65 0a 20 2f 2a 20 4d 61  ose.#else. /* Ma
0db0: 6b 65 20 73 75 72 65 20 69 73 61 74 74 79 28 29  ke sure isatty()
0dc0: 20 68 61 73 20 61 20 70 72 6f 74 6f 74 79 70 65   has a prototype
0dd0: 2e 20 2a 2f 0a 20 65 78 74 65 72 6e 20 69 6e 74  . */. extern int
0de0: 20 69 73 61 74 74 79 28 69 6e 74 29 3b 0a 0a 23   isatty(int);..#
0df0: 20 69 66 20 21 64 65 66 69 6e 65 64 28 5f 5f 52   if !defined(__R
0e00: 54 50 5f 5f 29 20 26 26 20 21 64 65 66 69 6e 65  TP__) && !define
0e10: 64 28 5f 57 52 53 5f 4b 45 52 4e 45 4c 29 0a 20  d(_WRS_KERNEL). 
0e20: 20 2f 2a 20 70 6f 70 65 6e 20 61 6e 64 20 70 63   /* popen and pc
0e30: 6c 6f 73 65 20 61 72 65 20 6e 6f 74 20 43 38 39  lose are not C89
0e40: 20 66 75 6e 63 74 69 6f 6e 73 20 61 6e 64 20 73   functions and s
0e50: 6f 20 61 72 65 0a 20 20 2a 2a 20 73 6f 6d 65 74  o are.  ** somet
0e60: 69 6d 65 73 20 6f 6d 69 74 74 65 64 20 66 72 6f  imes omitted fro
0e70: 6d 20 74 68 65 20 3c 73 74 64 69 6f 2e 68 3e 20  m the <stdio.h> 
0e80: 68 65 61 64 65 72 20 2a 2f 0a 20 20 20 65 78 74  header */.   ext
0e90: 65 72 6e 20 46 49 4c 45 20 2a 70 6f 70 65 6e 28  ern FILE *popen(
0ea0: 63 6f 6e 73 74 20 63 68 61 72 2a 2c 63 6f 6e 73  const char*,cons
0eb0: 74 20 63 68 61 72 2a 29 3b 0a 20 20 20 65 78 74  t char*);.   ext
0ec0: 65 72 6e 20 69 6e 74 20 70 63 6c 6f 73 65 28 46  ern int pclose(F
0ed0: 49 4c 45 2a 29 3b 0a 23 20 65 6c 73 65 0a 23 20  ILE*);.# else.# 
0ee0: 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 4f   define SQLITE_O
0ef0: 4d 49 54 5f 50 4f 50 45 4e 20 31 0a 23 20 65 6e  MIT_POPEN 1.# en
0f00: 64 69 66 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20  dif.#endif..#if 
0f10: 64 65 66 69 6e 65 64 28 5f 57 49 4e 33 32 5f 57  defined(_WIN32_W
0f20: 43 45 29 0a 2f 2a 20 57 69 6e 64 6f 77 73 20 43  CE)./* Windows C
0f30: 45 20 28 61 72 6d 2d 77 69 6e 63 65 2d 6d 69 6e  E (arm-wince-min
0f40: 67 77 33 32 63 65 2d 67 63 63 29 20 64 6f 65 73  gw32ce-gcc) does
0f50: 20 6e 6f 74 20 70 72 6f 76 69 64 65 20 69 73 61   not provide isa
0f60: 74 74 79 28 29 0a 20 2a 20 74 68 75 73 20 77 65  tty(). * thus we
0f70: 20 61 6c 77 61 79 73 20 61 73 73 75 6d 65 20 74   always assume t
0f80: 68 61 74 20 77 65 20 68 61 76 65 20 61 20 63 6f  hat we have a co
0f90: 6e 73 6f 6c 65 2e 20 54 68 61 74 20 63 61 6e 20  nsole. That can 
0fa0: 62 65 0a 20 2a 20 6f 76 65 72 72 69 64 64 65 6e  be. * overridden
0fb0: 20 77 69 74 68 20 74 68 65 20 2d 62 61 74 63 68   with the -batch
0fc0: 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20 6f 70   command line op
0fd0: 74 69 6f 6e 2e 0a 20 2a 2f 0a 23 64 65 66 69 6e  tion.. */.#defin
0fe0: 65 20 69 73 61 74 74 79 28 78 29 20 31 0a 23 65  e isatty(x) 1.#e
0ff0: 6e 64 69 66 0a 0a 2f 2a 20 63 74 79 70 65 20 6d  ndif../* ctype m
1000: 61 63 72 6f 73 20 74 68 61 74 20 77 6f 72 6b 20  acros that work 
1010: 77 69 74 68 20 73 69 67 6e 65 64 20 63 68 61 72  with signed char
1020: 61 63 74 65 72 73 20 2a 2f 0a 23 64 65 66 69 6e  acters */.#defin
1030: 65 20 49 73 53 70 61 63 65 28 58 29 20 20 69 73  e IsSpace(X)  is
1040: 73 70 61 63 65 28 28 75 6e 73 69 67 6e 65 64 20  space((unsigned 
1050: 63 68 61 72 29 58 29 0a 23 64 65 66 69 6e 65 20  char)X).#define 
1060: 49 73 44 69 67 69 74 28 58 29 20 20 69 73 64 69  IsDigit(X)  isdi
1070: 67 69 74 28 28 75 6e 73 69 67 6e 65 64 20 63 68  git((unsigned ch
1080: 61 72 29 58 29 0a 23 64 65 66 69 6e 65 20 54 6f  ar)X).#define To
1090: 4c 6f 77 65 72 28 58 29 20 20 28 63 68 61 72 29  Lower(X)  (char)
10a0: 74 6f 6c 6f 77 65 72 28 28 75 6e 73 69 67 6e 65  tolower((unsigne
10b0: 64 20 63 68 61 72 29 58 29 0a 0a 23 69 66 20 64  d char)X)..#if d
10c0: 65 66 69 6e 65 64 28 5f 57 49 4e 33 32 29 20 7c  efined(_WIN32) |
10d0: 7c 20 64 65 66 69 6e 65 64 28 57 49 4e 33 32 29  | defined(WIN32)
10e0: 0a 23 69 6e 63 6c 75 64 65 20 3c 77 69 6e 64 6f  .#include <windo
10f0: 77 73 2e 68 3e 0a 0a 2f 2a 20 73 74 72 69 6e 67  ws.h>../* string
1100: 20 63 6f 6e 76 65 72 73 69 6f 6e 20 72 6f 75 74   conversion rout
1110: 69 6e 65 73 20 6f 6e 6c 79 20 6e 65 65 64 65 64  ines only needed
1120: 20 6f 6e 20 57 69 6e 33 32 20 2a 2f 0a 65 78 74   on Win32 */.ext
1130: 65 72 6e 20 63 68 61 72 20 2a 73 71 6c 69 74 65  ern char *sqlite
1140: 33 5f 77 69 6e 33 32 5f 75 6e 69 63 6f 64 65 5f  3_win32_unicode_
1150: 74 6f 5f 75 74 66 38 28 4c 50 43 57 53 54 52 29  to_utf8(LPCWSTR)
1160: 3b 0a 65 78 74 65 72 6e 20 63 68 61 72 20 2a 73  ;.extern char *s
1170: 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 6d 62 63  qlite3_win32_mbc
1180: 73 5f 74 6f 5f 75 74 66 38 5f 76 32 28 63 6f 6e  s_to_utf8_v2(con
1190: 73 74 20 63 68 61 72 20 2a 2c 20 69 6e 74 29 3b  st char *, int);
11a0: 0a 65 78 74 65 72 6e 20 63 68 61 72 20 2a 73 71  .extern char *sq
11b0: 6c 69 74 65 33 5f 77 69 6e 33 32 5f 75 74 66 38  lite3_win32_utf8
11c0: 5f 74 6f 5f 6d 62 63 73 5f 76 32 28 63 6f 6e 73  _to_mbcs_v2(cons
11d0: 74 20 63 68 61 72 20 2a 2c 20 69 6e 74 29 3b 0a  t char *, int);.
11e0: 65 78 74 65 72 6e 20 4c 50 57 53 54 52 20 73 71  extern LPWSTR sq
11f0: 6c 69 74 65 33 5f 77 69 6e 33 32 5f 75 74 66 38  lite3_win32_utf8
1200: 5f 74 6f 5f 75 6e 69 63 6f 64 65 28 63 6f 6e 73  _to_unicode(cons
1210: 74 20 63 68 61 72 20 2a 7a 54 65 78 74 29 3b 0a  t char *zText);.
1220: 23 65 6e 64 69 66 0a 0a 2f 2a 20 4f 6e 20 57 69  #endif../* On Wi
1230: 6e 64 6f 77 73 2c 20 77 65 20 6e 6f 72 6d 61 6c  ndows, we normal
1240: 6c 79 20 72 75 6e 20 77 69 74 68 20 6f 75 74 70  ly run with outp
1250: 75 74 20 6d 6f 64 65 20 6f 66 20 54 45 58 54 20  ut mode of TEXT 
1260: 73 6f 20 74 68 61 74 20 5c 6e 20 63 68 61 72 61  so that \n chara
1270: 63 74 65 72 73 0a 2a 2a 20 61 72 65 20 61 75 74  cters.** are aut
1280: 6f 6d 61 74 69 63 61 6c 6c 79 20 74 72 61 6e 73  omatically trans
1290: 6c 61 74 65 64 20 69 6e 74 6f 20 5c 72 5c 6e 2e  lated into \r\n.
12a0: 20 20 48 6f 77 65 76 65 72 2c 20 74 68 69 73 20    However, this 
12b0: 62 65 68 61 76 69 6f 72 20 6e 65 65 64 73 0a 2a  behavior needs.*
12c0: 2a 20 74 6f 20 62 65 20 64 69 73 61 62 6c 65 64  * to be disabled
12d0: 20 69 6e 20 73 6f 6d 65 20 63 61 73 65 73 20 28   in some cases (
12e0: 65 78 3a 20 77 68 65 6e 20 67 65 6e 65 72 61 74  ex: when generat
12f0: 69 6e 67 20 43 53 56 20 6f 75 74 70 75 74 20 61  ing CSV output a
1300: 6e 64 20 77 68 65 6e 0a 2a 2a 20 72 65 6e 64 65  nd when.** rende
1310: 72 69 6e 67 20 71 75 6f 74 65 64 20 73 74 72 69  ring quoted stri
1320: 6e 67 73 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  ngs that contain
1330: 20 5c 6e 20 63 68 61 72 61 63 74 65 72 73 29 2e   \n characters).
1340: 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a    The following.
1350: 2a 2a 20 72 6f 75 74 69 6e 65 73 20 74 61 6b 65  ** routines take
1360: 20 63 61 72 65 20 6f 66 20 74 68 61 74 2e 0a 2a   care of that..*
1370: 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 57  /.#if defined(_W
1380: 49 4e 33 32 29 20 7c 7c 20 64 65 66 69 6e 65 64  IN32) || defined
1390: 28 57 49 4e 33 32 29 0a 73 74 61 74 69 63 20 76  (WIN32).static v
13a0: 6f 69 64 20 73 65 74 42 69 6e 61 72 79 4d 6f 64  oid setBinaryMod
13b0: 65 28 46 49 4c 45 20 2a 66 69 6c 65 2c 20 69 6e  e(FILE *file, in
13c0: 74 20 69 73 4f 75 74 70 75 74 29 7b 0a 20 20 69  t isOutput){.  i
13d0: 66 28 20 69 73 4f 75 74 70 75 74 20 29 20 66 66  f( isOutput ) ff
13e0: 6c 75 73 68 28 66 69 6c 65 29 3b 0a 20 20 5f 73  lush(file);.  _s
13f0: 65 74 6d 6f 64 65 28 5f 66 69 6c 65 6e 6f 28 66  etmode(_fileno(f
1400: 69 6c 65 29 2c 20 5f 4f 5f 42 49 4e 41 52 59 29  ile), _O_BINARY)
1410: 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  ;.}.static void 
1420: 73 65 74 54 65 78 74 4d 6f 64 65 28 46 49 4c 45  setTextMode(FILE
1430: 20 2a 66 69 6c 65 2c 20 69 6e 74 20 69 73 4f 75   *file, int isOu
1440: 74 70 75 74 29 7b 0a 20 20 69 66 28 20 69 73 4f  tput){.  if( isO
1450: 75 74 70 75 74 20 29 20 66 66 6c 75 73 68 28 66  utput ) fflush(f
1460: 69 6c 65 29 3b 0a 20 20 5f 73 65 74 6d 6f 64 65  ile);.  _setmode
1470: 28 5f 66 69 6c 65 6e 6f 28 66 69 6c 65 29 2c 20  (_fileno(file), 
1480: 5f 4f 5f 54 45 58 54 29 3b 0a 7d 0a 23 65 6c 73  _O_TEXT);.}.#els
1490: 65 0a 23 20 64 65 66 69 6e 65 20 73 65 74 42 69  e.# define setBi
14a0: 6e 61 72 79 4d 6f 64 65 28 58 2c 59 29 0a 23 20  naryMode(X,Y).# 
14b0: 64 65 66 69 6e 65 20 73 65 74 54 65 78 74 4d 6f  define setTextMo
14c0: 64 65 28 58 2c 59 29 0a 23 65 6e 64 69 66 0a 0a  de(X,Y).#endif..
14d0: 0a 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20  ./* True if the 
14e0: 74 69 6d 65 72 20 69 73 20 65 6e 61 62 6c 65 64  timer is enabled
14f0: 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65   */.static int e
1500: 6e 61 62 6c 65 54 69 6d 65 72 20 3d 20 30 3b 0a  nableTimer = 0;.
1510: 0a 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63  ./* Return the c
1520: 75 72 72 65 6e 74 20 77 61 6c 6c 2d 63 6c 6f 63  urrent wall-cloc
1530: 6b 20 74 69 6d 65 20 2a 2f 0a 73 74 61 74 69 63  k time */.static
1540: 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 74   sqlite3_int64 t
1550: 69 6d 65 4f 66 44 61 79 28 76 6f 69 64 29 7b 0a  imeOfDay(void){.
1560: 20 20 73 74 61 74 69 63 20 73 71 6c 69 74 65 33    static sqlite3
1570: 5f 76 66 73 20 2a 63 6c 6f 63 6b 56 66 73 20 3d  _vfs *clockVfs =
1580: 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e   0;.  sqlite3_in
1590: 74 36 34 20 74 3b 0a 20 20 69 66 28 20 63 6c 6f  t64 t;.  if( clo
15a0: 63 6b 56 66 73 3d 3d 30 20 29 20 63 6c 6f 63 6b  ckVfs==0 ) clock
15b0: 56 66 73 20 3d 20 73 71 6c 69 74 65 33 5f 76 66  Vfs = sqlite3_vf
15c0: 73 5f 66 69 6e 64 28 30 29 3b 0a 20 20 69 66 28  s_find(0);.  if(
15d0: 20 63 6c 6f 63 6b 56 66 73 2d 3e 69 56 65 72 73   clockVfs->iVers
15e0: 69 6f 6e 3e 3d 32 20 26 26 20 63 6c 6f 63 6b 56  ion>=2 && clockV
15f0: 66 73 2d 3e 78 43 75 72 72 65 6e 74 54 69 6d 65  fs->xCurrentTime
1600: 49 6e 74 36 34 21 3d 30 20 29 7b 0a 20 20 20 20  Int64!=0 ){.    
1610: 63 6c 6f 63 6b 56 66 73 2d 3e 78 43 75 72 72 65  clockVfs->xCurre
1620: 6e 74 54 69 6d 65 49 6e 74 36 34 28 63 6c 6f 63  ntTimeInt64(cloc
1630: 6b 56 66 73 2c 20 26 74 29 3b 0a 20 20 7d 65 6c  kVfs, &t);.  }el
1640: 73 65 7b 0a 20 20 20 20 64 6f 75 62 6c 65 20 72  se{.    double r
1650: 3b 0a 20 20 20 20 63 6c 6f 63 6b 56 66 73 2d 3e  ;.    clockVfs->
1660: 78 43 75 72 72 65 6e 74 54 69 6d 65 28 63 6c 6f  xCurrentTime(clo
1670: 63 6b 56 66 73 2c 20 26 72 29 3b 0a 20 20 20 20  ckVfs, &r);.    
1680: 74 20 3d 20 28 73 71 6c 69 74 65 33 5f 69 6e 74  t = (sqlite3_int
1690: 36 34 29 28 72 2a 38 36 34 30 30 30 30 30 2e 30  64)(r*86400000.0
16a0: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
16b0: 74 3b 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e  t;.}..#if !defin
16c0: 65 64 28 5f 57 49 4e 33 32 29 20 26 26 20 21 64  ed(_WIN32) && !d
16d0: 65 66 69 6e 65 64 28 57 49 4e 33 32 29 20 26 26  efined(WIN32) &&
16e0: 20 21 64 65 66 69 6e 65 64 28 5f 5f 6d 69 6e 75   !defined(__minu
16f0: 78 29 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79 73  x).#include <sys
1700: 2f 74 69 6d 65 2e 68 3e 0a 23 69 6e 63 6c 75 64  /time.h>.#includ
1710: 65 20 3c 73 79 73 2f 72 65 73 6f 75 72 63 65 2e  e <sys/resource.
1720: 68 3e 0a 0a 2f 2a 20 56 78 57 6f 72 6b 73 20 64  h>../* VxWorks d
1730: 6f 65 73 20 6e 6f 74 20 73 75 70 70 6f 72 74 20  oes not support 
1740: 67 65 74 72 75 73 61 67 65 28 29 20 61 73 20 66  getrusage() as f
1750: 61 72 20 61 73 20 77 65 20 63 61 6e 20 64 65 74  ar as we can det
1760: 65 72 6d 69 6e 65 20 2a 2f 0a 23 69 66 20 64 65  ermine */.#if de
1770: 66 69 6e 65 64 28 5f 57 52 53 5f 4b 45 52 4e 45  fined(_WRS_KERNE
1780: 4c 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f 5f  L) || defined(__
1790: 52 54 50 5f 5f 29 0a 73 74 72 75 63 74 20 72 75  RTP__).struct ru
17a0: 73 61 67 65 20 7b 0a 20 20 73 74 72 75 63 74 20  sage {.  struct 
17b0: 74 69 6d 65 76 61 6c 20 72 75 5f 75 74 69 6d 65  timeval ru_utime
17c0: 3b 20 2f 2a 20 75 73 65 72 20 43 50 55 20 74 69  ; /* user CPU ti
17d0: 6d 65 20 75 73 65 64 20 2a 2f 0a 20 20 73 74 72  me used */.  str
17e0: 75 63 74 20 74 69 6d 65 76 61 6c 20 72 75 5f 73  uct timeval ru_s
17f0: 74 69 6d 65 3b 20 2f 2a 20 73 79 73 74 65 6d 20  time; /* system 
1800: 43 50 55 20 74 69 6d 65 20 75 73 65 64 20 2a 2f  CPU time used */
1810: 0a 7d 3b 0a 23 64 65 66 69 6e 65 20 67 65 74 72  .};.#define getr
1820: 75 73 61 67 65 28 41 2c 42 29 20 6d 65 6d 73 65  usage(A,B) memse
1830: 74 28 42 2c 30 2c 73 69 7a 65 6f 66 28 2a 42 29  t(B,0,sizeof(*B)
1840: 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 53 61 76  ).#endif../* Sav
1850: 65 64 20 72 65 73 6f 75 72 63 65 20 69 6e 66 6f  ed resource info
1860: 72 6d 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20  rmation for the 
1870: 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 61 6e 20  beginning of an 
1880: 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 73 74 61  operation */.sta
1890: 74 69 63 20 73 74 72 75 63 74 20 72 75 73 61 67  tic struct rusag
18a0: 65 20 73 42 65 67 69 6e 3b 20 20 2f 2a 20 43 50  e sBegin;  /* CP
18b0: 55 20 74 69 6d 65 20 61 74 20 73 74 61 72 74 20  U time at start 
18c0: 2a 2f 0a 73 74 61 74 69 63 20 73 71 6c 69 74 65  */.static sqlite
18d0: 33 5f 69 6e 74 36 34 20 69 42 65 67 69 6e 3b 20  3_int64 iBegin; 
18e0: 20 2f 2a 20 57 61 6c 6c 2d 63 6c 6f 63 6b 20 74   /* Wall-clock t
18f0: 69 6d 65 20 61 74 20 73 74 61 72 74 20 2a 2f 0a  ime at start */.
1900: 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 74 69 6d  ./*.** Begin tim
1910: 69 6e 67 20 61 6e 20 6f 70 65 72 61 74 69 6f 6e  ing an operation
1920: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1930: 62 65 67 69 6e 54 69 6d 65 72 28 76 6f 69 64 29  beginTimer(void)
1940: 7b 0a 20 20 69 66 28 20 65 6e 61 62 6c 65 54 69  {.  if( enableTi
1950: 6d 65 72 20 29 7b 0a 20 20 20 20 67 65 74 72 75  mer ){.    getru
1960: 73 61 67 65 28 52 55 53 41 47 45 5f 53 45 4c 46  sage(RUSAGE_SELF
1970: 2c 20 26 73 42 65 67 69 6e 29 3b 0a 20 20 20 20  , &sBegin);.    
1980: 69 42 65 67 69 6e 20 3d 20 74 69 6d 65 4f 66 44  iBegin = timeOfD
1990: 61 79 28 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20  ay();.  }.}../* 
19a0: 52 65 74 75 72 6e 20 74 68 65 20 64 69 66 66 65  Return the diffe
19b0: 72 65 6e 63 65 20 6f 66 20 74 77 6f 20 74 69 6d  rence of two tim
19c0: 65 5f 73 74 72 75 63 74 73 20 69 6e 20 73 65 63  e_structs in sec
19d0: 6f 6e 64 73 20 2a 2f 0a 73 74 61 74 69 63 20 64  onds */.static d
19e0: 6f 75 62 6c 65 20 74 69 6d 65 44 69 66 66 28 73  ouble timeDiff(s
19f0: 74 72 75 63 74 20 74 69 6d 65 76 61 6c 20 2a 70  truct timeval *p
1a00: 53 74 61 72 74 2c 20 73 74 72 75 63 74 20 74 69  Start, struct ti
1a10: 6d 65 76 61 6c 20 2a 70 45 6e 64 29 7b 0a 20 20  meval *pEnd){.  
1a20: 72 65 74 75 72 6e 20 28 70 45 6e 64 2d 3e 74 76  return (pEnd->tv
1a30: 5f 75 73 65 63 20 2d 20 70 53 74 61 72 74 2d 3e  _usec - pStart->
1a40: 74 76 5f 75 73 65 63 29 2a 30 2e 30 30 30 30 30  tv_usec)*0.00000
1a50: 31 20 2b 0a 20 20 20 20 20 20 20 20 20 28 64 6f  1 +.         (do
1a60: 75 62 6c 65 29 28 70 45 6e 64 2d 3e 74 76 5f 73  uble)(pEnd->tv_s
1a70: 65 63 20 2d 20 70 53 74 61 72 74 2d 3e 74 76 5f  ec - pStart->tv_
1a80: 73 65 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  sec);.}../*.** P
1a90: 72 69 6e 74 20 74 68 65 20 74 69 6d 69 6e 67 20  rint the timing 
1aa0: 72 65 73 75 6c 74 73 2e 0a 2a 2f 0a 73 74 61 74  results..*/.stat
1ab0: 69 63 20 76 6f 69 64 20 65 6e 64 54 69 6d 65 72  ic void endTimer
1ac0: 28 76 6f 69 64 29 7b 0a 20 20 69 66 28 20 65 6e  (void){.  if( en
1ad0: 61 62 6c 65 54 69 6d 65 72 20 29 7b 0a 20 20 20  ableTimer ){.   
1ae0: 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69   sqlite3_int64 i
1af0: 45 6e 64 20 3d 20 74 69 6d 65 4f 66 44 61 79 28  End = timeOfDay(
1b00: 29 3b 0a 20 20 20 20 73 74 72 75 63 74 20 72 75  );.    struct ru
1b10: 73 61 67 65 20 73 45 6e 64 3b 0a 20 20 20 20 67  sage sEnd;.    g
1b20: 65 74 72 75 73 61 67 65 28 52 55 53 41 47 45 5f  etrusage(RUSAGE_
1b30: 53 45 4c 46 2c 20 26 73 45 6e 64 29 3b 0a 20 20  SELF, &sEnd);.  
1b40: 20 20 70 72 69 6e 74 66 28 22 52 75 6e 20 54 69    printf("Run Ti
1b50: 6d 65 3a 20 72 65 61 6c 20 25 2e 33 66 20 75 73  me: real %.3f us
1b60: 65 72 20 25 66 20 73 79 73 20 25 66 5c 6e 22 2c  er %f sys %f\n",
1b70: 0a 20 20 20 20 20 20 20 28 69 45 6e 64 20 2d 20  .       (iEnd - 
1b80: 69 42 65 67 69 6e 29 2a 30 2e 30 30 31 2c 0a 20  iBegin)*0.001,. 
1b90: 20 20 20 20 20 20 74 69 6d 65 44 69 66 66 28 26        timeDiff(&
1ba0: 73 42 65 67 69 6e 2e 72 75 5f 75 74 69 6d 65 2c  sBegin.ru_utime,
1bb0: 20 26 73 45 6e 64 2e 72 75 5f 75 74 69 6d 65 29   &sEnd.ru_utime)
1bc0: 2c 0a 20 20 20 20 20 20 20 74 69 6d 65 44 69 66  ,.       timeDif
1bd0: 66 28 26 73 42 65 67 69 6e 2e 72 75 5f 73 74 69  f(&sBegin.ru_sti
1be0: 6d 65 2c 20 26 73 45 6e 64 2e 72 75 5f 73 74 69  me, &sEnd.ru_sti
1bf0: 6d 65 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 64 65  me));.  }.}..#de
1c00: 66 69 6e 65 20 42 45 47 49 4e 5f 54 49 4d 45 52  fine BEGIN_TIMER
1c10: 20 62 65 67 69 6e 54 69 6d 65 72 28 29 0a 23 64   beginTimer().#d
1c20: 65 66 69 6e 65 20 45 4e 44 5f 54 49 4d 45 52 20  efine END_TIMER 
1c30: 65 6e 64 54 69 6d 65 72 28 29 0a 23 64 65 66 69  endTimer().#defi
1c40: 6e 65 20 48 41 53 5f 54 49 4d 45 52 20 31 0a 0a  ne HAS_TIMER 1..
1c50: 23 65 6c 69 66 20 28 64 65 66 69 6e 65 64 28 5f  #elif (defined(_
1c60: 57 49 4e 33 32 29 20 7c 7c 20 64 65 66 69 6e 65  WIN32) || define
1c70: 64 28 57 49 4e 33 32 29 29 0a 0a 2f 2a 20 53 61  d(WIN32))../* Sa
1c80: 76 65 64 20 72 65 73 6f 75 72 63 65 20 69 6e 66  ved resource inf
1c90: 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 74 68 65  ormation for the
1ca0: 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 61 6e   beginning of an
1cb0: 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 73 74   operation */.st
1cc0: 61 74 69 63 20 48 41 4e 44 4c 45 20 68 50 72 6f  atic HANDLE hPro
1cd0: 63 65 73 73 3b 0a 73 74 61 74 69 63 20 46 49 4c  cess;.static FIL
1ce0: 45 54 49 4d 45 20 66 74 4b 65 72 6e 65 6c 42 65  ETIME ftKernelBe
1cf0: 67 69 6e 3b 0a 73 74 61 74 69 63 20 46 49 4c 45  gin;.static FILE
1d00: 54 49 4d 45 20 66 74 55 73 65 72 42 65 67 69 6e  TIME ftUserBegin
1d10: 3b 0a 73 74 61 74 69 63 20 73 71 6c 69 74 65 33  ;.static sqlite3
1d20: 5f 69 6e 74 36 34 20 66 74 57 61 6c 6c 42 65 67  _int64 ftWallBeg
1d30: 69 6e 3b 0a 74 79 70 65 64 65 66 20 42 4f 4f 4c  in;.typedef BOOL
1d40: 20 28 57 49 4e 41 50 49 20 2a 47 45 54 50 52 4f   (WINAPI *GETPRO
1d50: 43 54 49 4d 45 53 29 28 48 41 4e 44 4c 45 2c 20  CTIMES)(HANDLE, 
1d60: 4c 50 46 49 4c 45 54 49 4d 45 2c 20 4c 50 46 49  LPFILETIME, LPFI
1d70: 4c 45 54 49 4d 45 2c 0a 20 20 20 20 20 20 20 20  LETIME,.        
1d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d90: 20 20 20 20 20 20 20 20 20 20 20 20 4c 50 46 49              LPFI
1da0: 4c 45 54 49 4d 45 2c 20 4c 50 46 49 4c 45 54 49  LETIME, LPFILETI
1db0: 4d 45 29 3b 0a 73 74 61 74 69 63 20 47 45 54 50  ME);.static GETP
1dc0: 52 4f 43 54 49 4d 45 53 20 67 65 74 50 72 6f 63  ROCTIMES getProc
1dd0: 65 73 73 54 69 6d 65 73 41 64 64 72 20 3d 20 4e  essTimesAddr = N
1de0: 55 4c 4c 3b 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63  ULL;../*.** Chec
1df0: 6b 20 74 6f 20 73 65 65 20 69 66 20 77 65 20 68  k to see if we h
1e00: 61 76 65 20 74 69 6d 65 72 20 73 75 70 70 6f 72  ave timer suppor
1e10: 74 2e 20 20 52 65 74 75 72 6e 20 31 20 69 66 20  t.  Return 1 if 
1e20: 6e 65 63 65 73 73 61 72 79 0a 2a 2a 20 73 75 70  necessary.** sup
1e30: 70 6f 72 74 20 66 6f 75 6e 64 20 28 6f 72 20 66  port found (or f
1e40: 6f 75 6e 64 20 70 72 65 76 69 6f 75 73 6c 79 29  ound previously)
1e50: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1e60: 68 61 73 54 69 6d 65 72 28 76 6f 69 64 29 7b 0a  hasTimer(void){.
1e70: 20 20 69 66 28 20 67 65 74 50 72 6f 63 65 73 73    if( getProcess
1e80: 54 69 6d 65 73 41 64 64 72 20 29 7b 0a 20 20 20  TimesAddr ){.   
1e90: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 20 65   return 1;.  } e
1ea0: 6c 73 65 20 7b 0a 20 20 20 20 2f 2a 20 47 65 74  lse {.    /* Get
1eb0: 50 72 6f 63 65 73 73 54 69 6d 65 73 28 29 20 69  ProcessTimes() i
1ec0: 73 6e 27 74 20 73 75 70 70 6f 72 74 65 64 20 69  sn't supported i
1ed0: 6e 20 57 49 4e 39 35 20 61 6e 64 20 73 6f 6d 65  n WIN95 and some
1ee0: 20 6f 74 68 65 72 20 57 69 6e 64 6f 77 73 0a 20   other Windows. 
1ef0: 20 20 20 2a 2a 20 76 65 72 73 69 6f 6e 73 2e 20     ** versions. 
1f00: 53 65 65 20 69 66 20 74 68 65 20 76 65 72 73 69  See if the versi
1f10: 6f 6e 20 77 65 20 61 72 65 20 72 75 6e 6e 69 6e  on we are runnin
1f20: 67 20 6f 6e 20 68 61 73 20 69 74 2c 20 61 6e 64  g on has it, and
1f30: 20 69 66 20 69 74 0a 20 20 20 20 2a 2a 20 64 6f   if it.    ** do
1f40: 65 73 2c 20 73 61 76 65 20 6f 66 66 20 61 20 70  es, save off a p
1f50: 6f 69 6e 74 65 72 20 74 6f 20 69 74 20 61 6e 64  ointer to it and
1f60: 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 72 6f   the current pro
1f70: 63 65 73 73 20 68 61 6e 64 6c 65 2e 0a 20 20 20  cess handle..   
1f80: 20 2a 2f 0a 20 20 20 20 68 50 72 6f 63 65 73 73   */.    hProcess
1f90: 20 3d 20 47 65 74 43 75 72 72 65 6e 74 50 72 6f   = GetCurrentPro
1fa0: 63 65 73 73 28 29 3b 0a 20 20 20 20 69 66 28 20  cess();.    if( 
1fb0: 68 50 72 6f 63 65 73 73 20 29 7b 0a 20 20 20 20  hProcess ){.    
1fc0: 20 20 48 49 4e 53 54 41 4e 43 45 20 68 69 6e 73    HINSTANCE hins
1fd0: 74 4c 69 62 20 3d 20 4c 6f 61 64 4c 69 62 72 61  tLib = LoadLibra
1fe0: 72 79 28 54 45 58 54 28 22 4b 65 72 6e 65 6c 33  ry(TEXT("Kernel3
1ff0: 32 2e 64 6c 6c 22 29 29 3b 0a 20 20 20 20 20 20  2.dll"));.      
2000: 69 66 28 20 4e 55 4c 4c 20 21 3d 20 68 69 6e 73  if( NULL != hins
2010: 74 4c 69 62 20 29 7b 0a 20 20 20 20 20 20 20 20  tLib ){.        
2020: 67 65 74 50 72 6f 63 65 73 73 54 69 6d 65 73 41  getProcessTimesA
2030: 64 64 72 20 3d 0a 20 20 20 20 20 20 20 20 20 20  ddr =.          
2040: 20 20 28 47 45 54 50 52 4f 43 54 49 4d 45 53 29    (GETPROCTIMES)
2050: 20 47 65 74 50 72 6f 63 41 64 64 72 65 73 73 28   GetProcAddress(
2060: 68 69 6e 73 74 4c 69 62 2c 20 22 47 65 74 50 72  hinstLib, "GetPr
2070: 6f 63 65 73 73 54 69 6d 65 73 22 29 3b 0a 20 20  ocessTimes");.  
2080: 20 20 20 20 20 20 69 66 28 20 4e 55 4c 4c 20 21        if( NULL !
2090: 3d 20 67 65 74 50 72 6f 63 65 73 73 54 69 6d 65  = getProcessTime
20a0: 73 41 64 64 72 20 29 7b 0a 20 20 20 20 20 20 20  sAddr ){.       
20b0: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
20c0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 46       }.        F
20d0: 72 65 65 4c 69 62 72 61 72 79 28 68 69 6e 73 74  reeLibrary(hinst
20e0: 4c 69 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Lib);.      }.  
20f0: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
2100: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67   0;.}../*.** Beg
2110: 69 6e 20 74 69 6d 69 6e 67 20 61 6e 20 6f 70 65  in timing an ope
2120: 72 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63  ration.*/.static
2130: 20 76 6f 69 64 20 62 65 67 69 6e 54 69 6d 65 72   void beginTimer
2140: 28 76 6f 69 64 29 7b 0a 20 20 69 66 28 20 65 6e  (void){.  if( en
2150: 61 62 6c 65 54 69 6d 65 72 20 26 26 20 67 65 74  ableTimer && get
2160: 50 72 6f 63 65 73 73 54 69 6d 65 73 41 64 64 72  ProcessTimesAddr
2170: 20 29 7b 0a 20 20 20 20 46 49 4c 45 54 49 4d 45   ){.    FILETIME
2180: 20 66 74 43 72 65 61 74 69 6f 6e 2c 20 66 74 45   ftCreation, ftE
2190: 78 69 74 3b 0a 20 20 20 20 67 65 74 50 72 6f 63  xit;.    getProc
21a0: 65 73 73 54 69 6d 65 73 41 64 64 72 28 68 50 72  essTimesAddr(hPr
21b0: 6f 63 65 73 73 2c 26 66 74 43 72 65 61 74 69 6f  ocess,&ftCreatio
21c0: 6e 2c 26 66 74 45 78 69 74 2c 0a 20 20 20 20 20  n,&ftExit,.     
21d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21e0: 20 20 20 26 66 74 4b 65 72 6e 65 6c 42 65 67 69     &ftKernelBegi
21f0: 6e 2c 26 66 74 55 73 65 72 42 65 67 69 6e 29 3b  n,&ftUserBegin);
2200: 0a 20 20 20 20 66 74 57 61 6c 6c 42 65 67 69 6e  .    ftWallBegin
2210: 20 3d 20 74 69 6d 65 4f 66 44 61 79 28 29 3b 0a   = timeOfDay();.
2220: 20 20 7d 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e    }.}../* Return
2230: 20 74 68 65 20 64 69 66 66 65 72 65 6e 63 65 20   the difference 
2240: 6f 66 20 74 77 6f 20 46 49 4c 45 54 49 4d 45 20  of two FILETIME 
2250: 73 74 72 75 63 74 73 20 69 6e 20 73 65 63 6f 6e  structs in secon
2260: 64 73 20 2a 2f 0a 73 74 61 74 69 63 20 64 6f 75  ds */.static dou
2270: 62 6c 65 20 74 69 6d 65 44 69 66 66 28 46 49 4c  ble timeDiff(FIL
2280: 45 54 49 4d 45 20 2a 70 53 74 61 72 74 2c 20 46  ETIME *pStart, F
2290: 49 4c 45 54 49 4d 45 20 2a 70 45 6e 64 29 7b 0a  ILETIME *pEnd){.
22a0: 20 20 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 69    sqlite_int64 i
22b0: 36 34 53 74 61 72 74 20 3d 20 2a 28 28 73 71 6c  64Start = *((sql
22c0: 69 74 65 5f 69 6e 74 36 34 20 2a 29 20 70 53 74  ite_int64 *) pSt
22d0: 61 72 74 29 3b 0a 20 20 73 71 6c 69 74 65 5f 69  art);.  sqlite_i
22e0: 6e 74 36 34 20 69 36 34 45 6e 64 20 3d 20 2a 28  nt64 i64End = *(
22f0: 28 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 2a 29  (sqlite_int64 *)
2300: 20 70 45 6e 64 29 3b 0a 20 20 72 65 74 75 72 6e   pEnd);.  return
2310: 20 28 64 6f 75 62 6c 65 29 20 28 28 69 36 34 45   (double) ((i64E
2320: 6e 64 20 2d 20 69 36 34 53 74 61 72 74 29 20 2f  nd - i64Start) /
2330: 20 31 30 30 30 30 30 30 30 2e 30 29 3b 0a 7d 0a   10000000.0);.}.
2340: 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 74 68 65  ./*.** Print the
2350: 20 74 69 6d 69 6e 67 20 72 65 73 75 6c 74 73 2e   timing results.
2360: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
2370: 65 6e 64 54 69 6d 65 72 28 76 6f 69 64 29 7b 0a  endTimer(void){.
2380: 20 20 69 66 28 20 65 6e 61 62 6c 65 54 69 6d 65    if( enableTime
2390: 72 20 26 26 20 67 65 74 50 72 6f 63 65 73 73 54  r && getProcessT
23a0: 69 6d 65 73 41 64 64 72 29 7b 0a 20 20 20 20 46  imesAddr){.    F
23b0: 49 4c 45 54 49 4d 45 20 66 74 43 72 65 61 74 69  ILETIME ftCreati
23c0: 6f 6e 2c 20 66 74 45 78 69 74 2c 20 66 74 4b 65  on, ftExit, ftKe
23d0: 72 6e 65 6c 45 6e 64 2c 20 66 74 55 73 65 72 45  rnelEnd, ftUserE
23e0: 6e 64 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  nd;.    sqlite3_
23f0: 69 6e 74 36 34 20 66 74 57 61 6c 6c 45 6e 64 20  int64 ftWallEnd 
2400: 3d 20 74 69 6d 65 4f 66 44 61 79 28 29 3b 0a 20  = timeOfDay();. 
2410: 20 20 20 67 65 74 50 72 6f 63 65 73 73 54 69 6d     getProcessTim
2420: 65 73 41 64 64 72 28 68 50 72 6f 63 65 73 73 2c  esAddr(hProcess,
2430: 26 66 74 43 72 65 61 74 69 6f 6e 2c 26 66 74 45  &ftCreation,&ftE
2440: 78 69 74 2c 26 66 74 4b 65 72 6e 65 6c 45 6e 64  xit,&ftKernelEnd
2450: 2c 26 66 74 55 73 65 72 45 6e 64 29 3b 0a 20 20  ,&ftUserEnd);.  
2460: 20 20 70 72 69 6e 74 66 28 22 52 75 6e 20 54 69    printf("Run Ti
2470: 6d 65 3a 20 72 65 61 6c 20 25 2e 33 66 20 75 73  me: real %.3f us
2480: 65 72 20 25 66 20 73 79 73 20 25 66 5c 6e 22 2c  er %f sys %f\n",
2490: 0a 20 20 20 20 20 20 20 28 66 74 57 61 6c 6c 45  .       (ftWallE
24a0: 6e 64 20 2d 20 66 74 57 61 6c 6c 42 65 67 69 6e  nd - ftWallBegin
24b0: 29 2a 30 2e 30 30 31 2c 0a 20 20 20 20 20 20 20  )*0.001,.       
24c0: 74 69 6d 65 44 69 66 66 28 26 66 74 55 73 65 72  timeDiff(&ftUser
24d0: 42 65 67 69 6e 2c 20 26 66 74 55 73 65 72 45 6e  Begin, &ftUserEn
24e0: 64 29 2c 0a 20 20 20 20 20 20 20 74 69 6d 65 44  d),.       timeD
24f0: 69 66 66 28 26 66 74 4b 65 72 6e 65 6c 42 65 67  iff(&ftKernelBeg
2500: 69 6e 2c 20 26 66 74 4b 65 72 6e 65 6c 45 6e 64  in, &ftKernelEnd
2510: 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 64 65 66 69  ));.  }.}..#defi
2520: 6e 65 20 42 45 47 49 4e 5f 54 49 4d 45 52 20 62  ne BEGIN_TIMER b
2530: 65 67 69 6e 54 69 6d 65 72 28 29 0a 23 64 65 66  eginTimer().#def
2540: 69 6e 65 20 45 4e 44 5f 54 49 4d 45 52 20 65 6e  ine END_TIMER en
2550: 64 54 69 6d 65 72 28 29 0a 23 64 65 66 69 6e 65  dTimer().#define
2560: 20 48 41 53 5f 54 49 4d 45 52 20 68 61 73 54 69   HAS_TIMER hasTi
2570: 6d 65 72 28 29 0a 0a 23 65 6c 73 65 0a 23 64 65  mer()..#else.#de
2580: 66 69 6e 65 20 42 45 47 49 4e 5f 54 49 4d 45 52  fine BEGIN_TIMER
2590: 0a 23 64 65 66 69 6e 65 20 45 4e 44 5f 54 49 4d  .#define END_TIM
25a0: 45 52 0a 23 64 65 66 69 6e 65 20 48 41 53 5f 54  ER.#define HAS_T
25b0: 49 4d 45 52 20 30 0a 23 65 6e 64 69 66 0a 0a 2f  IMER 0.#endif../
25c0: 2a 0a 2a 2a 20 55 73 65 64 20 74 6f 20 70 72 65  *.** Used to pre
25d0: 76 65 6e 74 20 77 61 72 6e 69 6e 67 73 20 61 62  vent warnings ab
25e0: 6f 75 74 20 75 6e 75 73 65 64 20 70 61 72 61 6d  out unused param
25f0: 65 74 65 72 73 0a 2a 2f 0a 23 64 65 66 69 6e 65  eters.*/.#define
2600: 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
2610: 52 28 78 29 20 28 76 6f 69 64 29 28 78 29 0a 0a  R(x) (void)(x)..
2620: 2f 2a 0a 2a 2a 20 4e 75 6d 62 65 72 20 6f 66 20  /*.** Number of 
2630: 65 6c 65 6d 65 6e 74 73 20 69 6e 20 61 6e 20 61  elements in an a
2640: 72 72 61 79 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  rray.*/.#define 
2650: 41 72 72 61 79 53 69 7a 65 28 58 29 20 20 28 69  ArraySize(X)  (i
2660: 6e 74 29 28 73 69 7a 65 6f 66 28 58 29 2f 73 69  nt)(sizeof(X)/si
2670: 7a 65 6f 66 28 58 5b 30 5d 29 29 0a 0a 2f 2a 0a  zeof(X[0]))../*.
2680: 2a 2a 20 49 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ** If the follow
2690: 69 6e 67 20 66 6c 61 67 20 69 73 20 73 65 74 2c  ing flag is set,
26a0: 20 74 68 65 6e 20 63 6f 6d 6d 61 6e 64 20 65 78   then command ex
26b0: 65 63 75 74 69 6f 6e 20 73 74 6f 70 73 0a 2a 2a  ecution stops.**
26c0: 20 61 74 20 61 6e 20 65 72 72 6f 72 20 69 66 20   at an error if 
26d0: 77 65 20 61 72 65 20 6e 6f 74 20 69 6e 74 65 72  we are not inter
26e0: 61 63 74 69 76 65 2e 0a 2a 2f 0a 73 74 61 74 69  active..*/.stati
26f0: 63 20 69 6e 74 20 62 61 69 6c 5f 6f 6e 5f 65 72  c int bail_on_er
2700: 72 6f 72 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20  ror = 0;../*.** 
2710: 54 68 72 65 61 74 20 73 74 64 69 6e 20 61 73 20  Threat stdin as 
2720: 61 6e 20 69 6e 74 65 72 61 63 74 69 76 65 20 69  an interactive i
2730: 6e 70 75 74 20 69 66 20 74 68 65 20 66 6f 6c 6c  nput if the foll
2740: 6f 77 69 6e 67 20 76 61 72 69 61 62 6c 65 0a 2a  owing variable.*
2750: 2a 20 69 73 20 74 72 75 65 2e 20 20 4f 74 68 65  * is true.  Othe
2760: 72 77 69 73 65 2c 20 61 73 73 75 6d 65 20 73 74  rwise, assume st
2770: 64 69 6e 20 69 73 20 63 6f 6e 6e 65 63 74 65 64  din is connected
2780: 20 74 6f 20 61 20 66 69 6c 65 20 6f 72 20 70 69   to a file or pi
2790: 70 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  pe..*/.static in
27a0: 74 20 73 74 64 69 6e 5f 69 73 5f 69 6e 74 65 72  t stdin_is_inter
27b0: 61 63 74 69 76 65 20 3d 20 31 3b 0a 0a 2f 2a 0a  active = 1;../*.
27c0: 2a 2a 20 4f 6e 20 57 69 6e 64 6f 77 73 20 73 79  ** On Windows sy
27d0: 73 74 65 6d 73 20 77 65 20 68 61 76 65 20 74 6f  stems we have to
27e0: 20 6b 6e 6f 77 20 69 66 20 73 74 61 6e 64 61 72   know if standar
27f0: 64 20 6f 75 74 70 75 74 20 69 73 20 61 20 63 6f  d output is a co
2800: 6e 73 6f 6c 65 0a 2a 2a 20 69 6e 20 6f 72 64 65  nsole.** in orde
2810: 72 20 74 6f 20 74 72 61 6e 73 6c 61 74 65 20 55  r to translate U
2820: 54 46 2d 38 20 69 6e 74 6f 20 4d 42 43 53 2e 20  TF-8 into MBCS. 
2830: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76   The following v
2840: 61 72 69 61 62 6c 65 20 69 73 0a 2a 2a 20 74 72  ariable is.** tr
2850: 75 65 20 69 66 20 74 72 61 6e 73 6c 61 74 69 6f  ue if translatio
2860: 6e 20 69 73 20 72 65 71 75 69 72 65 64 2e 0a 2a  n is required..*
2870: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 74 64  /.static int std
2880: 6f 75 74 5f 69 73 5f 63 6f 6e 73 6f 6c 65 20 3d  out_is_console =
2890: 20 31 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66   1;../*.** The f
28a0: 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 74 68 65 20  ollowing is the 
28b0: 6f 70 65 6e 20 53 51 4c 69 74 65 20 64 61 74 61  open SQLite data
28c0: 62 61 73 65 2e 20 20 57 65 20 6d 61 6b 65 20 61  base.  We make a
28d0: 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74   pointer.** to t
28e0: 68 69 73 20 64 61 74 61 62 61 73 65 20 61 20 73  his database a s
28f0: 74 61 74 69 63 20 76 61 72 69 61 62 6c 65 20 73  tatic variable s
2900: 6f 20 74 68 61 74 20 69 74 20 63 61 6e 20 62 65  o that it can be
2910: 20 61 63 63 65 73 73 65 64 0a 2a 2a 20 62 79 20   accessed.** by 
2920: 74 68 65 20 53 49 47 49 4e 54 20 68 61 6e 64 6c  the SIGINT handl
2930: 65 72 20 74 6f 20 69 6e 74 65 72 72 75 70 74 20  er to interrupt 
2940: 64 61 74 61 62 61 73 65 20 70 72 6f 63 65 73 73  database process
2950: 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73  ing..*/.static s
2960: 71 6c 69 74 65 33 20 2a 67 6c 6f 62 61 6c 44 62  qlite3 *globalDb
2970: 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 54 72 75   = 0;../*.** Tru
2980: 65 20 69 66 20 61 6e 20 69 6e 74 65 72 72 75 70  e if an interrup
2990: 74 20 28 43 6f 6e 74 72 6f 6c 2d 43 29 20 68 61  t (Control-C) ha
29a0: 73 20 62 65 65 6e 20 72 65 63 65 69 76 65 64 2e  s been received.
29b0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 6c 61 74  .*/.static volat
29c0: 69 6c 65 20 69 6e 74 20 73 65 65 6e 49 6e 74 65  ile int seenInte
29d0: 72 72 75 70 74 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a  rrupt = 0;../*.*
29e0: 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 6e 61  * This is the na
29f0: 6d 65 20 6f 66 20 6f 75 72 20 70 72 6f 67 72 61  me of our progra
2a00: 6d 2e 20 49 74 20 69 73 20 73 65 74 20 69 6e 20  m. It is set in 
2a10: 6d 61 69 6e 28 29 2c 20 75 73 65 64 0a 2a 2a 20  main(), used.** 
2a20: 69 6e 20 61 20 6e 75 6d 62 65 72 20 6f 66 20 6f  in a number of o
2a30: 74 68 65 72 20 70 6c 61 63 65 73 2c 20 6d 6f 73  ther places, mos
2a40: 74 6c 79 20 66 6f 72 20 65 72 72 6f 72 20 6d 65  tly for error me
2a50: 73 73 61 67 65 73 2e 0a 2a 2f 0a 73 74 61 74 69  ssages..*/.stati
2a60: 63 20 63 68 61 72 20 2a 41 72 67 76 30 3b 0a 0a  c char *Argv0;..
2a70: 2f 2a 0a 2a 2a 20 50 72 6f 6d 70 74 20 73 74 72  /*.** Prompt str
2a80: 69 6e 67 73 2e 20 49 6e 69 74 69 61 6c 69 7a 65  ings. Initialize
2a90: 64 20 69 6e 20 6d 61 69 6e 2e 20 53 65 74 74 61  d in main. Setta
2aa0: 62 6c 65 20 77 69 74 68 0a 2a 2a 20 20 20 2e 70  ble with.**   .p
2ab0: 72 6f 6d 70 74 20 6d 61 69 6e 20 63 6f 6e 74 69  rompt main conti
2ac0: 6e 75 65 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68  nue.*/.static ch
2ad0: 61 72 20 6d 61 69 6e 50 72 6f 6d 70 74 5b 32 30  ar mainPrompt[20
2ae0: 5d 3b 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20  ];     /* First 
2af0: 6c 69 6e 65 20 70 72 6f 6d 70 74 2e 20 64 65 66  line prompt. def
2b00: 61 75 6c 74 3a 20 22 73 71 6c 69 74 65 3e 20 22  ault: "sqlite> "
2b10: 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 63  */.static char c
2b20: 6f 6e 74 69 6e 75 65 50 72 6f 6d 70 74 5b 32 30  ontinuePrompt[20
2b30: 5d 3b 20 2f 2a 20 43 6f 6e 74 69 6e 75 61 74 69  ]; /* Continuati
2b40: 6f 6e 20 70 72 6f 6d 70 74 2e 20 64 65 66 61 75  on prompt. defau
2b50: 6c 74 3a 20 22 20 20 20 2e 2e 2e 3e 20 22 20 2a  lt: "   ...> " *
2b60: 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 6e 64 65 72 20  /../*.** Render 
2b70: 6f 75 74 70 75 74 20 6c 69 6b 65 20 66 70 72 69  output like fpri
2b80: 6e 74 66 28 29 2e 20 20 45 78 63 65 70 74 2c 20  ntf().  Except, 
2b90: 69 66 20 74 68 65 20 6f 75 74 70 75 74 20 69 73  if the output is
2ba0: 20 67 6f 69 6e 67 20 74 6f 20 74 68 65 0a 2a 2a   going to the.**
2bb0: 20 63 6f 6e 73 6f 6c 65 20 61 6e 64 20 69 66 20   console and if 
2bc0: 74 68 69 73 20 69 73 20 72 75 6e 6e 69 6e 67 20  this is running 
2bd0: 6f 6e 20 61 20 57 69 6e 64 6f 77 73 20 6d 61 63  on a Windows mac
2be0: 68 69 6e 65 2c 20 74 72 61 6e 73 6c 61 74 65 20  hine, translate 
2bf0: 74 68 65 0a 2a 2a 20 6f 75 74 70 75 74 20 66 72  the.** output fr
2c00: 6f 6d 20 55 54 46 2d 38 20 69 6e 74 6f 20 4d 42  om UTF-8 into MB
2c10: 43 53 2e 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e  CS..*/.#if defin
2c20: 65 64 28 5f 57 49 4e 33 32 29 20 7c 7c 20 64 65  ed(_WIN32) || de
2c30: 66 69 6e 65 64 28 57 49 4e 33 32 29 0a 76 6f 69  fined(WIN32).voi
2c40: 64 20 75 74 66 38 5f 70 72 69 6e 74 66 28 46 49  d utf8_printf(FI
2c50: 4c 45 20 2a 6f 75 74 2c 20 63 6f 6e 73 74 20 63  LE *out, const c
2c60: 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e  har *zFormat, ..
2c70: 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70  .){.  va_list ap
2c80: 3b 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c  ;.  va_start(ap,
2c90: 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 69 66 28   zFormat);.  if(
2ca0: 20 73 74 64 6f 75 74 5f 69 73 5f 63 6f 6e 73 6f   stdout_is_conso
2cb0: 6c 65 20 26 26 20 28 6f 75 74 3d 3d 73 74 64 6f  le && (out==stdo
2cc0: 75 74 20 7c 7c 20 6f 75 74 3d 3d 73 74 64 65 72  ut || out==stder
2cd0: 72 29 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a  r) ){.    char *
2ce0: 7a 31 20 3d 20 73 71 6c 69 74 65 33 5f 76 6d 70  z1 = sqlite3_vmp
2cf0: 72 69 6e 74 66 28 7a 46 6f 72 6d 61 74 2c 20 61  rintf(zFormat, a
2d00: 70 29 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 32  p);.    char *z2
2d10: 20 3d 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32   = sqlite3_win32
2d20: 5f 75 74 66 38 5f 74 6f 5f 6d 62 63 73 5f 76 32  _utf8_to_mbcs_v2
2d30: 28 7a 31 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  (z1, 0);.    sql
2d40: 69 74 65 33 5f 66 72 65 65 28 7a 31 29 3b 0a 20  ite3_free(z1);. 
2d50: 20 20 20 66 70 75 74 73 28 7a 32 2c 20 6f 75 74     fputs(z2, out
2d60: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
2d70: 72 65 65 28 7a 32 29 3b 0a 20 20 7d 65 6c 73 65  ree(z2);.  }else
2d80: 7b 0a 20 20 20 20 76 66 70 72 69 6e 74 66 28 6f  {.    vfprintf(o
2d90: 75 74 2c 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29  ut, zFormat, ap)
2da0: 3b 0a 20 20 7d 0a 20 20 76 61 5f 65 6e 64 28 61  ;.  }.  va_end(a
2db0: 70 29 3b 0a 7d 0a 23 65 6c 69 66 20 21 64 65 66  p);.}.#elif !def
2dc0: 69 6e 65 64 28 75 74 66 38 5f 70 72 69 6e 74 66  ined(utf8_printf
2dd0: 29 0a 23 20 64 65 66 69 6e 65 20 75 74 66 38 5f  ).# define utf8_
2de0: 70 72 69 6e 74 66 20 66 70 72 69 6e 74 66 0a 23  printf fprintf.#
2df0: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 6e  endif../*.** Ren
2e00: 64 65 72 20 6f 75 74 70 75 74 20 6c 69 6b 65 20  der output like 
2e10: 66 70 72 69 6e 74 66 28 29 2e 20 20 54 68 69 73  fprintf().  This
2e20: 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 75   should not be u
2e30: 73 65 64 20 6f 6e 20 61 6e 79 74 68 69 6e 67 20  sed on anything 
2e40: 74 68 61 74 0a 2a 2a 20 69 6e 63 6c 75 64 65 73  that.** includes
2e50: 20 73 74 72 69 6e 67 20 66 6f 72 6d 61 74 74 69   string formatti
2e60: 6e 67 20 28 65 2e 67 2e 20 22 25 73 22 29 2e 0a  ng (e.g. "%s")..
2e70: 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  */.#if !defined(
2e80: 72 61 77 5f 70 72 69 6e 74 66 29 0a 23 20 64 65  raw_printf).# de
2e90: 66 69 6e 65 20 72 61 77 5f 70 72 69 6e 74 66 20  fine raw_printf 
2ea0: 66 70 72 69 6e 74 66 0a 23 65 6e 64 69 66 0a 0a  fprintf.#endif..
2eb0: 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 49 2f 4f 20  /*.** Write I/O 
2ec0: 74 72 61 63 65 73 20 74 6f 20 74 68 65 20 66 6f  traces to the fo
2ed0: 6c 6c 6f 77 69 6e 67 20 73 74 72 65 61 6d 2e 0a  llowing stream..
2ee0: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
2ef0: 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41 43 45 0a  _ENABLE_IOTRACE.
2f00: 73 74 61 74 69 63 20 46 49 4c 45 20 2a 69 6f 74  static FILE *iot
2f10: 72 61 63 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66  race = 0;.#endif
2f20: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
2f30: 74 69 6e 65 20 77 6f 72 6b 73 20 6c 69 6b 65 20  tine works like 
2f40: 70 72 69 6e 74 66 20 69 6e 20 74 68 61 74 20 69  printf in that i
2f50: 74 73 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  ts first argumen
2f60: 74 20 69 73 20 61 0a 2a 2a 20 66 6f 72 6d 61 74  t is a.** format
2f70: 20 73 74 72 69 6e 67 20 61 6e 64 20 73 75 62 73   string and subs
2f80: 65 71 75 65 6e 74 20 61 72 67 75 6d 65 6e 74 73  equent arguments
2f90: 20 61 72 65 20 76 61 6c 75 65 73 20 74 6f 20 62   are values to b
2fa0: 65 20 73 75 62 73 74 69 74 75 74 65 64 0a 2a 2a  e substituted.**
2fb0: 20 69 6e 20 70 6c 61 63 65 20 6f 66 20 25 20 66   in place of % f
2fc0: 69 65 6c 64 73 2e 20 20 54 68 65 20 72 65 73 75  ields.  The resu
2fd0: 6c 74 20 6f 66 20 66 6f 72 6d 61 74 74 69 6e 67  lt of formatting
2fe0: 20 74 68 69 73 20 73 74 72 69 6e 67 0a 2a 2a 20   this string.** 
2ff0: 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 69 6f  is written to io
3000: 74 72 61 63 65 2e 0a 2a 2f 0a 23 69 66 64 65 66  trace..*/.#ifdef
3010: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49   SQLITE_ENABLE_I
3020: 4f 54 52 41 43 45 0a 73 74 61 74 69 63 20 76 6f  OTRACE.static vo
3030: 69 64 20 53 51 4c 49 54 45 5f 43 44 45 43 4c 20  id SQLITE_CDECL 
3040: 69 6f 74 72 61 63 65 50 72 69 6e 74 66 28 63 6f  iotracePrintf(co
3050: 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61  nst char *zForma
3060: 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69  t, ...){.  va_li
3070: 73 74 20 61 70 3b 0a 20 20 63 68 61 72 20 2a 7a  st ap;.  char *z
3080: 3b 0a 20 20 69 66 28 20 69 6f 74 72 61 63 65 3d  ;.  if( iotrace=
3090: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 76  =0 ) return;.  v
30a0: 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72  a_start(ap, zFor
30b0: 6d 61 74 29 3b 0a 20 20 7a 20 3d 20 73 71 6c 69  mat);.  z = sqli
30c0: 74 65 33 5f 76 6d 70 72 69 6e 74 66 28 7a 46 6f  te3_vmprintf(zFo
30d0: 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 76 61 5f  rmat, ap);.  va_
30e0: 65 6e 64 28 61 70 29 3b 0a 20 20 75 74 66 38 5f  end(ap);.  utf8_
30f0: 70 72 69 6e 74 66 28 69 6f 74 72 61 63 65 2c 20  printf(iotrace, 
3100: 22 25 73 22 2c 20 7a 29 3b 0a 20 20 73 71 6c 69  "%s", z);.  sqli
3110: 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a 7d 0a 23  te3_free(z);.}.#
3120: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4f 75 74  endif../*.** Out
3130: 70 75 74 20 73 74 72 69 6e 67 20 7a 55 74 66 20  put string zUtf 
3140: 74 6f 20 73 74 72 65 61 6d 20 70 4f 75 74 20 61  to stream pOut a
3150: 73 20 77 20 63 68 61 72 61 63 74 65 72 73 2e 20  s w characters. 
3160: 20 49 66 20 77 20 69 73 20 6e 65 67 61 74 69 76   If w is negativ
3170: 65 2c 0a 2a 2a 20 74 68 65 6e 20 72 69 67 68 74  e,.** then right
3180: 2d 6a 75 73 74 69 66 79 20 74 68 65 20 74 65 78  -justify the tex
3190: 74 2e 20 20 57 20 69 73 20 74 68 65 20 77 69 64  t.  W is the wid
31a0: 74 68 20 69 6e 20 55 54 46 2d 38 20 63 68 61 72  th in UTF-8 char
31b0: 61 63 74 65 72 73 2c 20 6e 6f 74 0a 2a 2a 20 69  acters, not.** i
31c0: 6e 20 62 79 74 65 73 2e 20 20 54 68 69 73 20 69  n bytes.  This i
31d0: 73 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d  s different from
31e0: 20 74 68 65 20 25 2a 2e 2a 73 20 73 70 65 63 69   the %*.*s speci
31f0: 66 69 63 61 74 69 6f 6e 20 69 6e 20 70 72 69 6e  fication in prin
3200: 74 66 0a 2a 2a 20 73 69 6e 63 65 20 77 69 74 68  tf.** since with
3210: 20 25 2a 2e 2a 73 20 74 68 65 20 77 69 64 74 68   %*.*s the width
3220: 20 69 73 20 6d 65 61 73 75 72 65 64 20 69 6e 20   is measured in 
3230: 62 79 74 65 73 2c 20 6e 6f 74 20 63 68 61 72 61  bytes, not chara
3240: 63 74 65 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  cters..*/.static
3250: 20 76 6f 69 64 20 75 74 66 38 5f 77 69 64 74 68   void utf8_width
3260: 5f 70 72 69 6e 74 28 46 49 4c 45 20 2a 70 4f 75  _print(FILE *pOu
3270: 74 2c 20 69 6e 74 20 77 2c 20 63 6f 6e 73 74 20  t, int w, const 
3280: 63 68 61 72 20 2a 7a 55 74 66 29 7b 0a 20 20 69  char *zUtf){.  i
3290: 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20  nt i;.  int n;. 
32a0: 20 69 6e 74 20 61 77 20 3d 20 77 3c 30 20 3f 20   int aw = w<0 ? 
32b0: 2d 77 20 3a 20 77 3b 0a 20 20 63 68 61 72 20 7a  -w : w;.  char z
32c0: 42 75 66 5b 31 30 30 30 5d 3b 0a 20 20 69 66 28  Buf[1000];.  if(
32d0: 20 61 77 3e 28 69 6e 74 29 73 69 7a 65 6f 66 28   aw>(int)sizeof(
32e0: 7a 42 75 66 29 2f 33 20 29 20 61 77 20 3d 20 28  zBuf)/3 ) aw = (
32f0: 69 6e 74 29 73 69 7a 65 6f 66 28 7a 42 75 66 29  int)sizeof(zBuf)
3300: 2f 33 3b 0a 20 20 66 6f 72 28 69 3d 6e 3d 30 3b  /3;.  for(i=n=0;
3310: 20 7a 55 74 66 5b 69 5d 3b 20 69 2b 2b 29 7b 0a   zUtf[i]; i++){.
3320: 20 20 20 20 69 66 28 20 28 7a 55 74 66 5b 69 5d      if( (zUtf[i]
3330: 26 30 78 63 30 29 21 3d 30 78 38 30 20 29 7b 0a  &0xc0)!=0x80 ){.
3340: 20 20 20 20 20 20 6e 2b 2b 3b 0a 20 20 20 20 20        n++;.     
3350: 20 69 66 28 20 6e 3d 3d 61 77 20 29 7b 0a 20 20   if( n==aw ){.  
3360: 20 20 20 20 20 20 64 6f 7b 20 69 2b 2b 3b 20 7d        do{ i++; }
3370: 77 68 69 6c 65 28 20 28 7a 55 74 66 5b 69 5d 26  while( (zUtf[i]&
3380: 30 78 63 30 29 3d 3d 30 78 38 30 20 29 3b 0a 20  0xc0)==0x80 );. 
3390: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
33a0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
33b0: 20 20 69 66 28 20 6e 3e 3d 61 77 20 29 7b 0a 20    if( n>=aw ){. 
33c0: 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70     utf8_printf(p
33d0: 4f 75 74 2c 20 22 25 2e 2a 73 22 2c 20 69 2c 20  Out, "%.*s", i, 
33e0: 7a 55 74 66 29 3b 0a 20 20 7d 65 6c 73 65 20 69  zUtf);.  }else i
33f0: 66 28 20 77 3c 30 20 29 7b 0a 20 20 20 20 75 74  f( w<0 ){.    ut
3400: 66 38 5f 70 72 69 6e 74 66 28 70 4f 75 74 2c 20  f8_printf(pOut, 
3410: 22 25 2a 73 25 73 22 2c 20 61 77 2d 6e 2c 20 22  "%*s%s", aw-n, "
3420: 22 2c 20 7a 55 74 66 29 3b 0a 20 20 7d 65 6c 73  ", zUtf);.  }els
3430: 65 7b 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e  e{.    utf8_prin
3440: 74 66 28 70 4f 75 74 2c 20 22 25 73 25 2a 73 22  tf(pOut, "%s%*s"
3450: 2c 20 7a 55 74 66 2c 20 61 77 2d 6e 2c 20 22 22  , zUtf, aw-n, ""
3460: 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  );.  }.}.../*.**
3470: 20 44 65 74 65 72 6d 69 6e 65 73 20 69 66 20 61   Determines if a
3480: 20 73 74 72 69 6e 67 20 69 73 20 61 20 6e 75 6d   string is a num
3490: 62 65 72 20 6f 66 20 6e 6f 74 2e 0a 2a 2f 0a 73  ber of not..*/.s
34a0: 74 61 74 69 63 20 69 6e 74 20 69 73 4e 75 6d 62  tatic int isNumb
34b0: 65 72 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  er(const char *z
34c0: 2c 20 69 6e 74 20 2a 72 65 61 6c 6e 75 6d 29 7b  , int *realnum){
34d0: 0a 20 20 69 66 28 20 2a 7a 3d 3d 27 2d 27 20 7c  .  if( *z=='-' |
34e0: 7c 20 2a 7a 3d 3d 27 2b 27 20 29 20 7a 2b 2b 3b  | *z=='+' ) z++;
34f0: 0a 20 20 69 66 28 20 21 49 73 44 69 67 69 74 28  .  if( !IsDigit(
3500: 2a 7a 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  *z) ){.    retur
3510: 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a 2b 2b 3b 0a  n 0;.  }.  z++;.
3520: 20 20 69 66 28 20 72 65 61 6c 6e 75 6d 20 29 20    if( realnum ) 
3530: 2a 72 65 61 6c 6e 75 6d 20 3d 20 30 3b 0a 20 20  *realnum = 0;.  
3540: 77 68 69 6c 65 28 20 49 73 44 69 67 69 74 28 2a  while( IsDigit(*
3550: 7a 29 20 29 7b 20 7a 2b 2b 3b 20 7d 0a 20 20 69  z) ){ z++; }.  i
3560: 66 28 20 2a 7a 3d 3d 27 2e 27 20 29 7b 0a 20 20  f( *z=='.' ){.  
3570: 20 20 7a 2b 2b 3b 0a 20 20 20 20 69 66 28 20 21    z++;.    if( !
3580: 49 73 44 69 67 69 74 28 2a 7a 29 20 29 20 72 65  IsDigit(*z) ) re
3590: 74 75 72 6e 20 30 3b 0a 20 20 20 20 77 68 69 6c  turn 0;.    whil
35a0: 65 28 20 49 73 44 69 67 69 74 28 2a 7a 29 20 29  e( IsDigit(*z) )
35b0: 7b 20 7a 2b 2b 3b 20 7d 0a 20 20 20 20 69 66 28  { z++; }.    if(
35c0: 20 72 65 61 6c 6e 75 6d 20 29 20 2a 72 65 61 6c   realnum ) *real
35d0: 6e 75 6d 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 69  num = 1;.  }.  i
35e0: 66 28 20 2a 7a 3d 3d 27 65 27 20 7c 7c 20 2a 7a  f( *z=='e' || *z
35f0: 3d 3d 27 45 27 20 29 7b 0a 20 20 20 20 7a 2b 2b  =='E' ){.    z++
3600: 3b 0a 20 20 20 20 69 66 28 20 2a 7a 3d 3d 27 2b  ;.    if( *z=='+
3610: 27 20 7c 7c 20 2a 7a 3d 3d 27 2d 27 20 29 20 7a  ' || *z=='-' ) z
3620: 2b 2b 3b 0a 20 20 20 20 69 66 28 20 21 49 73 44  ++;.    if( !IsD
3630: 69 67 69 74 28 2a 7a 29 20 29 20 72 65 74 75 72  igit(*z) ) retur
3640: 6e 20 30 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  n 0;.    while( 
3650: 49 73 44 69 67 69 74 28 2a 7a 29 20 29 7b 20 7a  IsDigit(*z) ){ z
3660: 2b 2b 3b 20 7d 0a 20 20 20 20 69 66 28 20 72 65  ++; }.    if( re
3670: 61 6c 6e 75 6d 20 29 20 2a 72 65 61 6c 6e 75 6d  alnum ) *realnum
3680: 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 1;.  }.  retu
3690: 72 6e 20 2a 7a 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a  rn *z==0;.}../*.
36a0: 2a 2a 20 43 6f 6d 70 75 74 65 20 61 20 73 74 72  ** Compute a str
36b0: 69 6e 67 20 6c 65 6e 67 74 68 20 74 68 61 74 20  ing length that 
36c0: 69 73 20 6c 69 6d 69 74 65 64 20 74 6f 20 77 68  is limited to wh
36d0: 61 74 20 63 61 6e 20 62 65 20 73 74 6f 72 65 64  at can be stored
36e0: 20 69 6e 0a 2a 2a 20 6c 6f 77 65 72 20 33 30 20   in.** lower 30 
36f0: 62 69 74 73 20 6f 66 20 61 20 33 32 2d 62 69 74  bits of a 32-bit
3700: 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 2e   signed integer.
3710: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
3720: 74 72 6c 65 6e 33 30 28 63 6f 6e 73 74 20 63 68  trlen30(const ch
3730: 61 72 20 2a 7a 29 7b 0a 20 20 63 6f 6e 73 74 20  ar *z){.  const 
3740: 63 68 61 72 20 2a 7a 32 20 3d 20 7a 3b 0a 20 20  char *z2 = z;.  
3750: 77 68 69 6c 65 28 20 2a 7a 32 20 29 7b 20 7a 32  while( *z2 ){ z2
3760: 2b 2b 3b 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ++; }.  return 0
3770: 78 33 66 66 66 66 66 66 66 20 26 20 28 69 6e 74  x3fffffff & (int
3780: 29 28 7a 32 20 2d 20 7a 29 3b 0a 7d 0a 0a 2f 2a  )(z2 - z);.}../*
3790: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6c  .** Return the l
37a0: 65 6e 67 74 68 20 6f 66 20 61 20 73 74 72 69 6e  ength of a strin
37b0: 67 20 69 6e 20 63 68 61 72 61 63 74 65 72 73 2e  g in characters.
37c0: 20 20 4d 75 6c 74 69 62 79 74 65 20 55 54 46 38    Multibyte UTF8
37d0: 20 63 68 61 72 61 63 74 65 72 73 0a 2a 2a 20 63   characters.** c
37e0: 6f 75 6e 74 20 61 73 20 61 20 73 69 6e 67 6c 65  ount as a single
37f0: 20 63 68 61 72 61 63 74 65 72 2e 0a 2a 2f 0a 73   character..*/.s
3800: 74 61 74 69 63 20 69 6e 74 20 73 74 72 6c 65 6e  tatic int strlen
3810: 43 68 61 72 28 63 6f 6e 73 74 20 63 68 61 72 20  Char(const char 
3820: 2a 7a 29 7b 0a 20 20 69 6e 74 20 6e 20 3d 20 30  *z){.  int n = 0
3830: 3b 0a 20 20 77 68 69 6c 65 28 20 2a 7a 20 29 7b  ;.  while( *z ){
3840: 0a 20 20 20 20 69 66 28 20 28 30 78 63 30 26 2a  .    if( (0xc0&*
3850: 28 7a 2b 2b 29 29 21 3d 30 78 38 30 20 29 20 6e  (z++))!=0x80 ) n
3860: 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ++;.  }.  return
3870: 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69   n;.}../*.** Thi
3880: 73 20 72 6f 75 74 69 6e 65 20 72 65 61 64 73 20  s routine reads 
3890: 61 20 6c 69 6e 65 20 6f 66 20 74 65 78 74 20 66  a line of text f
38a0: 72 6f 6d 20 46 49 4c 45 20 69 6e 2c 20 73 74 6f  rom FILE in, sto
38b0: 72 65 73 0a 2a 2a 20 74 68 65 20 74 65 78 74 20  res.** the text 
38c0: 69 6e 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e  in memory obtain
38d0: 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 28 29  ed from malloc()
38e0: 20 61 6e 64 20 72 65 74 75 72 6e 73 20 61 20 70   and returns a p
38f0: 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65  ointer.** to the
3900: 20 74 65 78 74 2e 20 20 4e 55 4c 4c 20 69 73 20   text.  NULL is 
3910: 72 65 74 75 72 6e 65 64 20 61 74 20 65 6e 64 20  returned at end 
3920: 6f 66 20 66 69 6c 65 2c 20 6f 72 20 69 66 20 6d  of file, or if m
3930: 61 6c 6c 6f 63 28 29 0a 2a 2a 20 66 61 69 6c 73  alloc().** fails
3940: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 4c 69 6e 65  ..**.** If zLine
3950: 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 74 68 65   is not NULL the
3960: 6e 20 69 74 20 69 73 20 61 20 6d 61 6c 6c 6f 63  n it is a malloc
3970: 65 64 20 62 75 66 66 65 72 20 72 65 74 75 72 6e  ed buffer return
3980: 65 64 20 66 72 6f 6d 0a 2a 2a 20 61 20 70 72 65  ed from.** a pre
3990: 76 69 6f 75 73 20 63 61 6c 6c 20 74 6f 20 74 68  vious call to th
39a0: 69 73 20 72 6f 75 74 69 6e 65 20 74 68 61 74 20  is routine that 
39b0: 6d 61 79 20 62 65 20 72 65 75 73 65 64 2e 0a 2a  may be reused..*
39c0: 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 6c  /.static char *l
39d0: 6f 63 61 6c 5f 67 65 74 6c 69 6e 65 28 63 68 61  ocal_getline(cha
39e0: 72 20 2a 7a 4c 69 6e 65 2c 20 46 49 4c 45 20 2a  r *zLine, FILE *
39f0: 69 6e 29 7b 0a 20 20 69 6e 74 20 6e 4c 69 6e 65  in){.  int nLine
3a00: 20 3d 20 7a 4c 69 6e 65 3d 3d 30 20 3f 20 30 20   = zLine==0 ? 0 
3a10: 3a 20 31 30 30 3b 0a 20 20 69 6e 74 20 6e 20 3d  : 100;.  int n =
3a20: 20 30 3b 0a 0a 20 20 77 68 69 6c 65 28 20 31 20   0;..  while( 1 
3a30: 29 7b 0a 20 20 20 20 69 66 28 20 6e 2b 31 30 30  ){.    if( n+100
3a40: 3e 6e 4c 69 6e 65 20 29 7b 0a 20 20 20 20 20 20  >nLine ){.      
3a50: 6e 4c 69 6e 65 20 3d 20 6e 4c 69 6e 65 2a 32 20  nLine = nLine*2 
3a60: 2b 20 31 30 30 3b 0a 20 20 20 20 20 20 7a 4c 69  + 100;.      zLi
3a70: 6e 65 20 3d 20 72 65 61 6c 6c 6f 63 28 7a 4c 69  ne = realloc(zLi
3a80: 6e 65 2c 20 6e 4c 69 6e 65 29 3b 0a 20 20 20 20  ne, nLine);.    
3a90: 20 20 69 66 28 20 7a 4c 69 6e 65 3d 3d 30 20 29    if( zLine==0 )
3aa0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
3ab0: 0a 20 20 20 20 69 66 28 20 66 67 65 74 73 28 26  .    if( fgets(&
3ac0: 7a 4c 69 6e 65 5b 6e 5d 2c 20 6e 4c 69 6e 65 20  zLine[n], nLine 
3ad0: 2d 20 6e 2c 20 69 6e 29 3d 3d 30 20 29 7b 0a 20  - n, in)==0 ){. 
3ae0: 20 20 20 20 20 69 66 28 20 6e 3d 3d 30 20 29 7b       if( n==0 ){
3af0: 0a 20 20 20 20 20 20 20 20 66 72 65 65 28 7a 4c  .        free(zL
3b00: 69 6e 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65  ine);.        re
3b10: 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a  turn 0;.      }.
3b20: 20 20 20 20 20 20 7a 4c 69 6e 65 5b 6e 5d 20 3d        zLine[n] =
3b30: 20 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   0;.      break;
3b40: 0a 20 20 20 20 7d 0a 20 20 20 20 77 68 69 6c 65  .    }.    while
3b50: 28 20 7a 4c 69 6e 65 5b 6e 5d 20 29 20 6e 2b 2b  ( zLine[n] ) n++
3b60: 3b 0a 20 20 20 20 69 66 28 20 6e 3e 30 20 26 26  ;.    if( n>0 &&
3b70: 20 7a 4c 69 6e 65 5b 6e 2d 31 5d 3d 3d 27 5c 6e   zLine[n-1]=='\n
3b80: 27 20 29 7b 0a 20 20 20 20 20 20 6e 2d 2d 3b 0a  ' ){.      n--;.
3b90: 20 20 20 20 20 20 69 66 28 20 6e 3e 30 20 26 26        if( n>0 &&
3ba0: 20 7a 4c 69 6e 65 5b 6e 2d 31 5d 3d 3d 27 5c 72   zLine[n-1]=='\r
3bb0: 27 20 29 20 6e 2d 2d 3b 0a 20 20 20 20 20 20 7a  ' ) n--;.      z
3bc0: 4c 69 6e 65 5b 6e 5d 20 3d 20 30 3b 0a 20 20 20  Line[n] = 0;.   
3bd0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
3be0: 20 20 7d 0a 23 69 66 20 64 65 66 69 6e 65 64 28    }.#if defined(
3bf0: 5f 57 49 4e 33 32 29 20 7c 7c 20 64 65 66 69 6e  _WIN32) || defin
3c00: 65 64 28 57 49 4e 33 32 29 0a 20 20 2f 2a 20 46  ed(WIN32).  /* F
3c10: 6f 72 20 69 6e 74 65 72 61 63 74 69 76 65 20 69  or interactive i
3c20: 6e 70 75 74 20 6f 6e 20 57 69 6e 64 6f 77 73 20  nput on Windows 
3c30: 73 79 73 74 65 6d 73 2c 20 74 72 61 6e 73 6c 61  systems, transla
3c40: 74 65 20 74 68 65 0a 20 20 2a 2a 20 6d 75 6c 74  te the.  ** mult
3c50: 69 2d 62 79 74 65 20 63 68 61 72 61 63 74 65 72  i-byte character
3c60: 73 65 74 20 63 68 61 72 61 63 74 65 72 73 20 69  set characters i
3c70: 6e 74 6f 20 55 54 46 2d 38 2e 20 2a 2f 0a 20 20  nto UTF-8. */.  
3c80: 69 66 28 20 73 74 64 69 6e 5f 69 73 5f 69 6e 74  if( stdin_is_int
3c90: 65 72 61 63 74 69 76 65 20 26 26 20 69 6e 3d 3d  eractive && in==
3ca0: 73 74 64 69 6e 20 29 7b 0a 20 20 20 20 63 68 61  stdin ){.    cha
3cb0: 72 20 2a 7a 54 72 61 6e 73 20 3d 20 73 71 6c 69  r *zTrans = sqli
3cc0: 74 65 33 5f 77 69 6e 33 32 5f 6d 62 63 73 5f 74  te3_win32_mbcs_t
3cd0: 6f 5f 75 74 66 38 5f 76 32 28 7a 4c 69 6e 65 2c  o_utf8_v2(zLine,
3ce0: 20 30 29 3b 0a 20 20 20 20 69 66 28 20 7a 54 72   0);.    if( zTr
3cf0: 61 6e 73 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ans ){.      int
3d00: 20 6e 54 72 61 6e 73 20 3d 20 73 74 72 6c 65 6e   nTrans = strlen
3d10: 33 30 28 7a 54 72 61 6e 73 29 2b 31 3b 0a 20 20  30(zTrans)+1;.  
3d20: 20 20 20 20 69 66 28 20 6e 54 72 61 6e 73 3e 6e      if( nTrans>n
3d30: 4c 69 6e 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Line ){.        
3d40: 7a 4c 69 6e 65 20 3d 20 72 65 61 6c 6c 6f 63 28  zLine = realloc(
3d50: 7a 4c 69 6e 65 2c 20 6e 54 72 61 6e 73 29 3b 0a  zLine, nTrans);.
3d60: 20 20 20 20 20 20 20 20 69 66 28 20 7a 4c 69 6e          if( zLin
3d70: 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e==0 ){.        
3d80: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
3d90: 54 72 61 6e 73 29 3b 0a 20 20 20 20 20 20 20 20  Trans);.        
3da0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
3db0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
3dc0: 20 20 20 20 6d 65 6d 63 70 79 28 7a 4c 69 6e 65      memcpy(zLine
3dd0: 2c 20 7a 54 72 61 6e 73 2c 20 6e 54 72 61 6e 73  , zTrans, nTrans
3de0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
3df0: 5f 66 72 65 65 28 7a 54 72 61 6e 73 29 3b 0a 20  _free(zTrans);. 
3e00: 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 20     }.  }.#endif 
3e10: 2f 2a 20 64 65 66 69 6e 65 64 28 5f 57 49 4e 33  /* defined(_WIN3
3e20: 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 57 49  2) || defined(WI
3e30: 4e 33 32 29 20 2a 2f 0a 20 20 72 65 74 75 72 6e  N32) */.  return
3e40: 20 7a 4c 69 6e 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   zLine;.}../*.**
3e50: 20 52 65 74 72 69 65 76 65 20 61 20 73 69 6e 67   Retrieve a sing
3e60: 6c 65 20 6c 69 6e 65 20 6f 66 20 69 6e 70 75 74  le line of input
3e70: 20 74 65 78 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   text..**.** If 
3e80: 69 6e 3d 3d 30 20 74 68 65 6e 20 72 65 61 64 20  in==0 then read 
3e90: 66 72 6f 6d 20 73 74 61 6e 64 61 72 64 20 69 6e  from standard in
3ea0: 70 75 74 20 61 6e 64 20 70 72 6f 6d 70 74 20 62  put and prompt b
3eb0: 65 66 6f 72 65 20 65 61 63 68 20 6c 69 6e 65 2e  efore each line.
3ec0: 0a 2a 2a 20 49 66 20 69 73 43 6f 6e 74 69 6e 75  .** If isContinu
3ed0: 61 74 69 6f 6e 20 69 73 20 74 72 75 65 2c 20 74  ation is true, t
3ee0: 68 65 6e 20 61 20 63 6f 6e 74 69 6e 75 61 74 69  hen a continuati
3ef0: 6f 6e 20 70 72 6f 6d 70 74 20 69 73 20 61 70 70  on prompt is app
3f00: 72 6f 70 72 69 61 74 65 2e 0a 2a 2a 20 49 66 20  ropriate..** If 
3f10: 69 73 43 6f 6e 74 69 6e 75 61 74 69 6f 6e 20 69  isContinuation i
3f20: 73 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65  s zero, then the
3f30: 20 6d 61 69 6e 20 70 72 6f 6d 70 74 20 73 68 6f   main prompt sho
3f40: 75 6c 64 20 62 65 20 75 73 65 64 2e 0a 2a 2a 0a  uld be used..**.
3f50: 2a 2a 20 49 66 20 7a 50 72 69 6f 72 20 69 73 20  ** If zPrior is 
3f60: 6e 6f 74 20 4e 55 4c 4c 20 74 68 65 6e 20 69 74  not NULL then it
3f70: 20 69 73 20 61 20 62 75 66 66 65 72 20 66 72 6f   is a buffer fro
3f80: 6d 20 61 20 70 72 69 6f 72 20 63 61 6c 6c 20 74  m a prior call t
3f90: 6f 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e  o this.** routin
3fa0: 65 20 74 68 61 74 20 63 61 6e 20 62 65 20 72 65  e that can be re
3fb0: 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  used..**.** The 
3fc0: 72 65 73 75 6c 74 20 69 73 20 73 74 6f 72 65 64  result is stored
3fd0: 20 69 6e 20 73 70 61 63 65 20 6f 62 74 61 69 6e   in space obtain
3fe0: 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 28 29  ed from malloc()
3ff0: 20 61 6e 64 20 6d 75 73 74 20 65 69 74 68 65 72   and must either
4000: 0a 2a 2a 20 62 65 20 66 72 65 65 64 20 62 79 20  .** be freed by 
4010: 74 68 65 20 63 61 6c 6c 65 72 20 6f 72 20 65 6c  the caller or el
4020: 73 65 20 70 61 73 73 65 64 20 62 61 63 6b 20 69  se passed back i
4030: 6e 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65  nto this routine
4040: 20 76 69 61 20 74 68 65 0a 2a 2a 20 7a 50 72 69   via the.** zPri
4050: 6f 72 20 61 72 67 75 6d 65 6e 74 20 66 6f 72 20  or argument for 
4060: 72 65 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  reuse..*/.static
4070: 20 63 68 61 72 20 2a 6f 6e 65 5f 69 6e 70 75 74   char *one_input
4080: 5f 6c 69 6e 65 28 46 49 4c 45 20 2a 69 6e 2c 20  _line(FILE *in, 
4090: 63 68 61 72 20 2a 7a 50 72 69 6f 72 2c 20 69 6e  char *zPrior, in
40a0: 74 20 69 73 43 6f 6e 74 69 6e 75 61 74 69 6f 6e  t isContinuation
40b0: 29 7b 0a 20 20 63 68 61 72 20 2a 7a 50 72 6f 6d  ){.  char *zProm
40c0: 70 74 3b 0a 20 20 63 68 61 72 20 2a 7a 52 65 73  pt;.  char *zRes
40d0: 75 6c 74 3b 0a 20 20 69 66 28 20 69 6e 21 3d 30  ult;.  if( in!=0
40e0: 20 29 7b 0a 20 20 20 20 7a 52 65 73 75 6c 74 20   ){.    zResult 
40f0: 3d 20 6c 6f 63 61 6c 5f 67 65 74 6c 69 6e 65 28  = local_getline(
4100: 7a 50 72 69 6f 72 2c 20 69 6e 29 3b 0a 20 20 7d  zPrior, in);.  }
4110: 65 6c 73 65 7b 0a 20 20 20 20 7a 50 72 6f 6d 70  else{.    zPromp
4120: 74 20 3d 20 69 73 43 6f 6e 74 69 6e 75 61 74 69  t = isContinuati
4130: 6f 6e 20 3f 20 63 6f 6e 74 69 6e 75 65 50 72 6f  on ? continuePro
4140: 6d 70 74 20 3a 20 6d 61 69 6e 50 72 6f 6d 70 74  mpt : mainPrompt
4150: 3b 0a 23 69 66 20 53 48 45 4c 4c 5f 55 53 45 5f  ;.#if SHELL_USE_
4160: 4c 4f 43 41 4c 5f 47 45 54 4c 49 4e 45 0a 20 20  LOCAL_GETLINE.  
4170: 20 20 70 72 69 6e 74 66 28 22 25 73 22 2c 20 7a    printf("%s", z
4180: 50 72 6f 6d 70 74 29 3b 0a 20 20 20 20 66 66 6c  Prompt);.    ffl
4190: 75 73 68 28 73 74 64 6f 75 74 29 3b 0a 20 20 20  ush(stdout);.   
41a0: 20 7a 52 65 73 75 6c 74 20 3d 20 6c 6f 63 61 6c   zResult = local
41b0: 5f 67 65 74 6c 69 6e 65 28 7a 50 72 69 6f 72 2c  _getline(zPrior,
41c0: 20 73 74 64 69 6e 29 3b 0a 23 65 6c 73 65 0a 20   stdin);.#else. 
41d0: 20 20 20 66 72 65 65 28 7a 50 72 69 6f 72 29 3b     free(zPrior);
41e0: 0a 20 20 20 20 7a 52 65 73 75 6c 74 20 3d 20 73  .    zResult = s
41f0: 68 65 6c 6c 5f 72 65 61 64 6c 69 6e 65 28 7a 50  hell_readline(zP
4200: 72 6f 6d 70 74 29 3b 0a 20 20 20 20 69 66 28 20  rompt);.    if( 
4210: 7a 52 65 73 75 6c 74 20 26 26 20 2a 7a 52 65 73  zResult && *zRes
4220: 75 6c 74 20 29 20 73 68 65 6c 6c 5f 61 64 64 5f  ult ) shell_add_
4230: 68 69 73 74 6f 72 79 28 7a 52 65 73 75 6c 74 29  history(zResult)
4240: 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 72  ;.#endif.  }.  r
4250: 65 74 75 72 6e 20 7a 52 65 73 75 6c 74 3b 0a 7d  eturn zResult;.}
4260: 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  .../*.** Return 
4270: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 61 20 68  the value of a h
4280: 65 78 61 64 65 63 69 6d 61 6c 20 64 69 67 69 74  exadecimal digit
4290: 2e 20 20 52 65 74 75 72 6e 20 2d 31 20 69 66 20  .  Return -1 if 
42a0: 74 68 65 20 69 6e 70 75 74 0a 2a 2a 20 69 73 20  the input.** is 
42b0: 6e 6f 74 20 61 20 68 65 78 20 64 69 67 69 74 2e  not a hex digit.
42c0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 68  .*/.static int h
42d0: 65 78 44 69 67 69 74 56 61 6c 75 65 28 63 68 61  exDigitValue(cha
42e0: 72 20 63 29 7b 0a 20 20 69 66 28 20 63 3e 3d 27  r c){.  if( c>='
42f0: 30 27 20 26 26 20 63 3c 3d 27 39 27 20 29 20 72  0' && c<='9' ) r
4300: 65 74 75 72 6e 20 63 20 2d 20 27 30 27 3b 0a 20  eturn c - '0';. 
4310: 20 69 66 28 20 63 3e 3d 27 61 27 20 26 26 20 63   if( c>='a' && c
4320: 3c 3d 27 66 27 20 29 20 72 65 74 75 72 6e 20 63  <='f' ) return c
4330: 20 2d 20 27 61 27 20 2b 20 31 30 3b 0a 20 20 69   - 'a' + 10;.  i
4340: 66 28 20 63 3e 3d 27 41 27 20 26 26 20 63 3c 3d  f( c>='A' && c<=
4350: 27 46 27 20 29 20 72 65 74 75 72 6e 20 63 20 2d  'F' ) return c -
4360: 20 27 41 27 20 2b 20 31 30 3b 0a 20 20 72 65 74   'A' + 10;.  ret
4370: 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn -1;.}../*.**
4380: 20 49 6e 74 65 72 70 72 65 74 20 7a 41 72 67 20   Interpret zArg 
4390: 61 73 20 61 6e 20 69 6e 74 65 67 65 72 20 76 61  as an integer va
43a0: 6c 75 65 2c 20 70 6f 73 73 69 62 6c 79 20 77 69  lue, possibly wi
43b0: 74 68 20 73 75 66 66 69 78 65 73 2e 0a 2a 2f 0a  th suffixes..*/.
43c0: 73 74 61 74 69 63 20 73 71 6c 69 74 65 33 5f 69  static sqlite3_i
43d0: 6e 74 36 34 20 69 6e 74 65 67 65 72 56 61 6c 75  nt64 integerValu
43e0: 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41  e(const char *zA
43f0: 72 67 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69  rg){.  sqlite3_i
4400: 6e 74 36 34 20 76 20 3d 20 30 3b 0a 20 20 73 74  nt64 v = 0;.  st
4410: 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63  atic const struc
4420: 74 20 7b 20 63 68 61 72 20 2a 7a 53 75 66 66 69  t { char *zSuffi
4430: 78 3b 20 69 6e 74 20 69 4d 75 6c 74 3b 20 7d 20  x; int iMult; } 
4440: 61 4d 75 6c 74 5b 5d 20 3d 20 7b 0a 20 20 20 20  aMult[] = {.    
4450: 7b 20 22 4b 69 42 22 2c 20 31 30 32 34 20 7d 2c  { "KiB", 1024 },
4460: 0a 20 20 20 20 7b 20 22 4d 69 42 22 2c 20 31 30  .    { "MiB", 10
4470: 32 34 2a 31 30 32 34 20 7d 2c 0a 20 20 20 20 7b  24*1024 },.    {
4480: 20 22 47 69 42 22 2c 20 31 30 32 34 2a 31 30 32   "GiB", 1024*102
4490: 34 2a 31 30 32 34 20 7d 2c 0a 20 20 20 20 7b 20  4*1024 },.    { 
44a0: 22 4b 42 22 2c 20 20 31 30 30 30 20 7d 2c 0a 20  "KB",  1000 },. 
44b0: 20 20 20 7b 20 22 4d 42 22 2c 20 20 31 30 30 30     { "MB",  1000
44c0: 30 30 30 20 7d 2c 0a 20 20 20 20 7b 20 22 47 42  000 },.    { "GB
44d0: 22 2c 20 20 31 30 30 30 30 30 30 30 30 30 20 7d  ",  1000000000 }
44e0: 2c 0a 20 20 20 20 7b 20 22 4b 22 2c 20 20 20 31  ,.    { "K",   1
44f0: 30 30 30 20 7d 2c 0a 20 20 20 20 7b 20 22 4d 22  000 },.    { "M"
4500: 2c 20 20 20 31 30 30 30 30 30 30 20 7d 2c 0a 20  ,   1000000 },. 
4510: 20 20 20 7b 20 22 47 22 2c 20 20 20 31 30 30 30     { "G",   1000
4520: 30 30 30 30 30 30 20 7d 2c 0a 20 20 7d 3b 0a 20  000000 },.  };. 
4530: 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 69 73   int i;.  int is
4540: 4e 65 67 20 3d 20 30 3b 0a 20 20 69 66 28 20 7a  Neg = 0;.  if( z
4550: 41 72 67 5b 30 5d 3d 3d 27 2d 27 20 29 7b 0a 20  Arg[0]=='-' ){. 
4560: 20 20 20 69 73 4e 65 67 20 3d 20 31 3b 0a 20 20     isNeg = 1;.  
4570: 20 20 7a 41 72 67 2b 2b 3b 0a 20 20 7d 65 6c 73    zArg++;.  }els
4580: 65 20 69 66 28 20 7a 41 72 67 5b 30 5d 3d 3d 27  e if( zArg[0]=='
4590: 2b 27 20 29 7b 0a 20 20 20 20 7a 41 72 67 2b 2b  +' ){.    zArg++
45a0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a 41 72 67  ;.  }.  if( zArg
45b0: 5b 30 5d 3d 3d 27 30 27 20 26 26 20 7a 41 72 67  [0]=='0' && zArg
45c0: 5b 31 5d 3d 3d 27 78 27 20 29 7b 0a 20 20 20 20  [1]=='x' ){.    
45d0: 69 6e 74 20 78 3b 0a 20 20 20 20 7a 41 72 67 20  int x;.    zArg 
45e0: 2b 3d 20 32 3b 0a 20 20 20 20 77 68 69 6c 65 28  += 2;.    while(
45f0: 20 28 78 20 3d 20 68 65 78 44 69 67 69 74 56 61   (x = hexDigitVa
4600: 6c 75 65 28 7a 41 72 67 5b 30 5d 29 29 3e 3d 30  lue(zArg[0]))>=0
4610: 20 29 7b 0a 20 20 20 20 20 20 76 20 3d 20 28 76   ){.      v = (v
4620: 3c 3c 34 29 20 2b 20 78 3b 0a 20 20 20 20 20 20  <<4) + x;.      
4630: 7a 41 72 67 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  zArg++;.    }.  
4640: 7d 65 6c 73 65 7b 0a 20 20 20 20 77 68 69 6c 65  }else{.    while
4650: 28 20 49 73 44 69 67 69 74 28 7a 41 72 67 5b 30  ( IsDigit(zArg[0
4660: 5d 29 20 29 7b 0a 20 20 20 20 20 20 76 20 3d 20  ]) ){.      v = 
4670: 76 2a 31 30 20 2b 20 7a 41 72 67 5b 30 5d 20 2d  v*10 + zArg[0] -
4680: 20 27 30 27 3b 0a 20 20 20 20 20 20 7a 41 72 67   '0';.      zArg
4690: 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ++;.    }.  }.  
46a0: 66 6f 72 28 69 3d 30 3b 20 69 3c 41 72 72 61 79  for(i=0; i<Array
46b0: 53 69 7a 65 28 61 4d 75 6c 74 29 3b 20 69 2b 2b  Size(aMult); i++
46c0: 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  ){.    if( sqlit
46d0: 65 33 5f 73 74 72 69 63 6d 70 28 61 4d 75 6c 74  e3_stricmp(aMult
46e0: 5b 69 5d 2e 7a 53 75 66 66 69 78 2c 20 7a 41 72  [i].zSuffix, zAr
46f0: 67 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 76  g)==0 ){.      v
4700: 20 2a 3d 20 61 4d 75 6c 74 5b 69 5d 2e 69 4d 75   *= aMult[i].iMu
4710: 6c 74 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  lt;.      break;
4720: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
4730: 75 72 6e 20 69 73 4e 65 67 3f 20 2d 76 20 3a 20  urn isNeg? -v : 
4740: 76 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 76 61  v;.}../*.** A va
4750: 72 69 61 62 6c 65 20 6c 65 6e 67 74 68 20 73 74  riable length st
4760: 72 69 6e 67 20 74 6f 20 77 68 69 63 68 20 6f 6e  ring to which on
4770: 65 20 63 61 6e 20 61 70 70 65 6e 64 20 74 65 78  e can append tex
4780: 74 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  t..*/.typedef st
4790: 72 75 63 74 20 53 68 65 6c 6c 54 65 78 74 20 53  ruct ShellText S
47a0: 68 65 6c 6c 54 65 78 74 3b 0a 73 74 72 75 63 74  hellText;.struct
47b0: 20 53 68 65 6c 6c 54 65 78 74 20 7b 0a 20 20 63   ShellText {.  c
47c0: 68 61 72 20 2a 7a 3b 0a 20 20 69 6e 74 20 6e 3b  har *z;.  int n;
47d0: 0a 20 20 69 6e 74 20 6e 41 6c 6c 6f 63 3b 0a 7d  .  int nAlloc;.}
47e0: 3b 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c  ;../*.** Initial
47f0: 69 7a 65 20 61 6e 64 20 64 65 73 74 72 6f 79 20  ize and destroy 
4800: 61 20 53 68 65 6c 6c 54 65 78 74 20 6f 62 6a 65  a ShellText obje
4810: 63 74 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  ct.*/.static voi
4820: 64 20 69 6e 69 74 54 65 78 74 28 53 68 65 6c 6c  d initText(Shell
4830: 54 65 78 74 20 2a 70 29 7b 0a 20 20 6d 65 6d 73  Text *p){.  mems
4840: 65 74 28 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28  et(p, 0, sizeof(
4850: 2a 70 29 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76  *p));.}.static v
4860: 6f 69 64 20 66 72 65 65 54 65 78 74 28 53 68 65  oid freeText(She
4870: 6c 6c 54 65 78 74 20 2a 70 29 7b 0a 20 20 66 72  llText *p){.  fr
4880: 65 65 28 70 2d 3e 7a 29 3b 0a 20 20 69 6e 69 74  ee(p->z);.  init
4890: 54 65 78 74 28 70 29 3b 0a 7d 0a 0a 2f 2a 20 7a  Text(p);.}../* z
48a0: 49 6e 20 69 73 20 65 69 74 68 65 72 20 61 20 70  In is either a p
48b0: 6f 69 6e 74 65 72 20 74 6f 20 61 20 4e 55 4c 4c  ointer to a NULL
48c0: 2d 74 65 72 6d 69 6e 61 74 65 64 20 73 74 72 69  -terminated stri
48d0: 6e 67 20 69 6e 20 6d 65 6d 6f 72 79 20 6f 62 74  ng in memory obt
48e0: 61 69 6e 65 64 0a 2a 2a 20 66 72 6f 6d 20 6d 61  ained.** from ma
48f0: 6c 6c 6f 63 28 29 2c 20 6f 72 20 61 20 4e 55 4c  lloc(), or a NUL
4900: 4c 20 70 6f 69 6e 74 65 72 2e 20 54 68 65 20 73  L pointer. The s
4910: 74 72 69 6e 67 20 70 6f 69 6e 74 65 64 20 74 6f  tring pointed to
4920: 20 62 79 20 7a 41 70 70 65 6e 64 20 69 73 0a 2a   by zAppend is.*
4930: 2a 20 61 64 64 65 64 20 74 6f 20 7a 49 6e 2c 20  * added to zIn, 
4940: 61 6e 64 20 74 68 65 20 72 65 73 75 6c 74 20 72  and the result r
4950: 65 74 75 72 6e 65 64 20 69 6e 20 6d 65 6d 6f 72  eturned in memor
4960: 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  y obtained from 
4970: 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 7a 49 6e  malloc()..** zIn
4980: 2c 20 69 66 20 69 74 20 77 61 73 20 6e 6f 74 20  , if it was not 
4990: 4e 55 4c 4c 2c 20 69 73 20 66 72 65 65 64 2e 0a  NULL, is freed..
49a0: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 74 68 69  **.** If the thi
49b0: 72 64 20 61 72 67 75 6d 65 6e 74 2c 20 71 75 6f  rd argument, quo
49c0: 74 65 2c 20 69 73 20 6e 6f 74 20 27 5c 30 27 2c  te, is not '\0',
49d0: 20 74 68 65 6e 20 69 74 20 69 73 20 75 73 65 64   then it is used
49e0: 20 61 73 20 61 0a 2a 2a 20 71 75 6f 74 65 20 63   as a.** quote c
49f0: 68 61 72 61 63 74 65 72 20 66 6f 72 20 7a 41 70  haracter for zAp
4a00: 70 65 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  pend..*/.static 
4a10: 76 6f 69 64 20 61 70 70 65 6e 64 54 65 78 74 28  void appendText(
4a20: 53 68 65 6c 6c 54 65 78 74 20 2a 70 2c 20 63 68  ShellText *p, ch
4a30: 61 72 20 63 6f 6e 73 74 20 2a 7a 41 70 70 65 6e  ar const *zAppen
4a40: 64 2c 20 63 68 61 72 20 71 75 6f 74 65 29 7b 0a  d, char quote){.
4a50: 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 69 6e 74    int len;.  int
4a60: 20 69 3b 0a 20 20 69 6e 74 20 6e 41 70 70 65 6e   i;.  int nAppen
4a70: 64 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a 41 70  d = strlen30(zAp
4a80: 70 65 6e 64 29 3b 0a 0a 20 20 6c 65 6e 20 3d 20  pend);..  len = 
4a90: 6e 41 70 70 65 6e 64 2b 70 2d 3e 6e 2b 31 3b 0a  nAppend+p->n+1;.
4aa0: 20 20 69 66 28 20 71 75 6f 74 65 20 29 7b 0a 20    if( quote ){. 
4ab0: 20 20 20 6c 65 6e 20 2b 3d 20 32 3b 0a 20 20 20     len += 2;.   
4ac0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 70 70   for(i=0; i<nApp
4ad0: 65 6e 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  end; i++){.     
4ae0: 20 69 66 28 20 7a 41 70 70 65 6e 64 5b 69 5d 3d   if( zAppend[i]=
4af0: 3d 71 75 6f 74 65 20 29 20 6c 65 6e 2b 2b 3b 0a  =quote ) len++;.
4b00: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28      }.  }..  if(
4b10: 20 70 2d 3e 6e 2b 6c 65 6e 3e 3d 70 2d 3e 6e 41   p->n+len>=p->nA
4b20: 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 70 2d 3e 6e  lloc ){.    p->n
4b30: 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 41 6c 6c 6f  Alloc = p->nAllo
4b40: 63 2a 32 20 2b 20 6c 65 6e 20 2b 20 32 30 3b 0a  c*2 + len + 20;.
4b50: 20 20 20 20 70 2d 3e 7a 20 3d 20 72 65 61 6c 6c      p->z = reall
4b60: 6f 63 28 70 2d 3e 7a 2c 20 70 2d 3e 6e 41 6c 6c  oc(p->z, p->nAll
4b70: 6f 63 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  oc);.    if( p->
4b80: 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6d 65  z==0 ){.      me
4b90: 6d 73 65 74 28 70 2c 20 30 2c 20 73 69 7a 65 6f  mset(p, 0, sizeo
4ba0: 66 28 2a 70 29 29 3b 0a 20 20 20 20 20 20 72 65  f(*p));.      re
4bb0: 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  turn;.    }.  }.
4bc0: 0a 20 20 69 66 28 20 71 75 6f 74 65 20 29 7b 0a  .  if( quote ){.
4bd0: 20 20 20 20 63 68 61 72 20 2a 7a 43 73 72 20 3d      char *zCsr =
4be0: 20 70 2d 3e 7a 2b 70 2d 3e 6e 3b 0a 20 20 20 20   p->z+p->n;.    
4bf0: 2a 7a 43 73 72 2b 2b 20 3d 20 71 75 6f 74 65 3b  *zCsr++ = quote;
4c00: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
4c10: 6e 41 70 70 65 6e 64 3b 20 69 2b 2b 29 7b 0a 20  nAppend; i++){. 
4c20: 20 20 20 20 20 2a 7a 43 73 72 2b 2b 20 3d 20 7a       *zCsr++ = z
4c30: 41 70 70 65 6e 64 5b 69 5d 3b 0a 20 20 20 20 20  Append[i];.     
4c40: 20 69 66 28 20 7a 41 70 70 65 6e 64 5b 69 5d 3d   if( zAppend[i]=
4c50: 3d 71 75 6f 74 65 20 29 20 2a 7a 43 73 72 2b 2b  =quote ) *zCsr++
4c60: 20 3d 20 71 75 6f 74 65 3b 0a 20 20 20 20 7d 0a   = quote;.    }.
4c70: 20 20 20 20 2a 7a 43 73 72 2b 2b 20 3d 20 71 75      *zCsr++ = qu
4c80: 6f 74 65 3b 0a 20 20 20 20 70 2d 3e 6e 20 3d 20  ote;.    p->n = 
4c90: 28 69 6e 74 29 28 7a 43 73 72 20 2d 20 70 2d 3e  (int)(zCsr - p->
4ca0: 7a 29 3b 0a 20 20 20 20 2a 7a 43 73 72 20 3d 20  z);.    *zCsr = 
4cb0: 27 5c 30 27 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  '\0';.  }else{. 
4cc0: 20 20 20 6d 65 6d 63 70 79 28 70 2d 3e 7a 2b 70     memcpy(p->z+p
4cd0: 2d 3e 6e 2c 20 7a 41 70 70 65 6e 64 2c 20 6e 41  ->n, zAppend, nA
4ce0: 70 70 65 6e 64 29 3b 0a 20 20 20 20 70 2d 3e 6e  ppend);.    p->n
4cf0: 20 2b 3d 20 6e 41 70 70 65 6e 64 3b 0a 20 20 20   += nAppend;.   
4d00: 20 70 2d 3e 7a 5b 70 2d 3e 6e 5d 20 3d 20 27 5c   p->z[p->n] = '\
4d10: 30 27 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  0';.  }.}../*.**
4d20: 20 41 74 74 65 6d 70 74 20 74 6f 20 64 65 74 65   Attempt to dete
4d30: 72 6d 69 6e 65 20 69 66 20 69 64 65 6e 74 69 66  rmine if identif
4d40: 69 65 72 20 7a 4e 61 6d 65 20 6e 65 65 64 73 20  ier zName needs 
4d50: 74 6f 20 62 65 20 71 75 6f 74 65 64 2c 20 65 69  to be quoted, ei
4d60: 74 68 65 72 0a 2a 2a 20 62 65 63 61 75 73 65 20  ther.** because 
4d70: 69 74 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 6e 2d  it contains non-
4d80: 61 6c 70 68 61 6e 75 6d 65 72 69 63 20 63 68 61  alphanumeric cha
4d90: 72 61 63 74 65 72 73 2c 20 6f 72 20 62 65 63 61  racters, or beca
4da0: 75 73 65 20 69 74 20 69 73 20 61 6e 0a 2a 2a 20  use it is an.** 
4db0: 53 51 4c 69 74 65 20 6b 65 79 77 6f 72 64 2e 20  SQLite keyword. 
4dc0: 20 42 65 20 63 6f 6e 73 65 72 76 61 74 69 76 65   Be conservative
4dd0: 20 69 6e 20 74 68 69 73 20 65 73 74 69 6d 61 74   in this estimat
4de0: 65 3a 20 20 57 68 65 6e 20 69 6e 20 64 6f 75 62  e:  When in doub
4df0: 74 20 61 73 73 75 6d 65 0a 2a 2a 20 74 68 61 74  t assume.** that
4e00: 20 71 75 6f 74 69 6e 67 20 69 73 20 72 65 71 75   quoting is requ
4e10: 69 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  ired..**.** Retu
4e20: 72 6e 20 27 22 27 20 69 66 20 71 75 6f 74 69 6e  rn '"' if quotin
4e30: 67 20 69 73 20 72 65 71 75 69 72 65 64 2e 20 20  g is required.  
4e40: 52 65 74 75 72 6e 20 30 20 69 66 20 6e 6f 20 71  Return 0 if no q
4e50: 75 6f 74 69 6e 67 20 69 73 20 72 65 71 75 69 72  uoting is requir
4e60: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68  ed..*/.static ch
4e70: 61 72 20 71 75 6f 74 65 43 68 61 72 28 63 6f 6e  ar quoteChar(con
4e80: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b  st char *zName){
4e90: 0a 20 20 2f 2a 20 41 6c 6c 20 53 51 4c 69 74 65  .  /* All SQLite
4ea0: 20 6b 65 79 77 6f 72 64 73 2c 20 69 6e 20 61 6c   keywords, in al
4eb0: 70 68 61 62 65 74 69 63 61 6c 20 6f 72 64 65 72  phabetical order
4ec0: 20 2a 2f 0a 20 20 73 74 61 74 69 63 20 63 6f 6e   */.  static con
4ed0: 73 74 20 63 68 61 72 20 2a 61 7a 4b 65 79 77 6f  st char *azKeywo
4ee0: 72 64 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 22 41  rds[] = {.    "A
4ef0: 42 4f 52 54 22 2c 20 22 41 43 54 49 4f 4e 22 2c  BORT", "ACTION",
4f00: 20 22 41 44 44 22 2c 20 22 41 46 54 45 52 22 2c   "ADD", "AFTER",
4f10: 20 22 41 4c 4c 22 2c 20 22 41 4c 54 45 52 22 2c   "ALL", "ALTER",
4f20: 20 22 41 4e 41 4c 59 5a 45 22 2c 20 22 41 4e 44   "ANALYZE", "AND
4f30: 22 2c 20 22 41 53 22 2c 0a 20 20 20 20 22 41 53  ", "AS",.    "AS
4f40: 43 22 2c 20 22 41 54 54 41 43 48 22 2c 20 22 41  C", "ATTACH", "A
4f50: 55 54 4f 49 4e 43 52 45 4d 45 4e 54 22 2c 20 22  UTOINCREMENT", "
4f60: 42 45 46 4f 52 45 22 2c 20 22 42 45 47 49 4e 22  BEFORE", "BEGIN"
4f70: 2c 20 22 42 45 54 57 45 45 4e 22 2c 20 22 42 59  , "BETWEEN", "BY
4f80: 22 2c 0a 20 20 20 20 22 43 41 53 43 41 44 45 22  ",.    "CASCADE"
4f90: 2c 20 22 43 41 53 45 22 2c 20 22 43 41 53 54 22  , "CASE", "CAST"
4fa0: 2c 20 22 43 48 45 43 4b 22 2c 20 22 43 4f 4c 4c  , "CHECK", "COLL
4fb0: 41 54 45 22 2c 20 22 43 4f 4c 55 4d 4e 22 2c 20  ATE", "COLUMN", 
4fc0: 22 43 4f 4d 4d 49 54 22 2c 0a 20 20 20 20 22 43  "COMMIT",.    "C
4fd0: 4f 4e 46 4c 49 43 54 22 2c 20 22 43 4f 4e 53 54  ONFLICT", "CONST
4fe0: 52 41 49 4e 54 22 2c 20 22 43 52 45 41 54 45 22  RAINT", "CREATE"
4ff0: 2c 20 22 43 52 4f 53 53 22 2c 20 22 43 55 52 52  , "CROSS", "CURR
5000: 45 4e 54 5f 44 41 54 45 22 2c 0a 20 20 20 20 22  ENT_DATE",.    "
5010: 43 55 52 52 45 4e 54 5f 54 49 4d 45 22 2c 20 22  CURRENT_TIME", "
5020: 43 55 52 52 45 4e 54 5f 54 49 4d 45 53 54 41 4d  CURRENT_TIMESTAM
5030: 50 22 2c 20 22 44 41 54 41 42 41 53 45 22 2c 20  P", "DATABASE", 
5040: 22 44 45 46 41 55 4c 54 22 2c 20 22 44 45 46 45  "DEFAULT", "DEFE
5050: 52 52 41 42 4c 45 22 2c 0a 20 20 20 20 22 44 45  RRABLE",.    "DE
5060: 46 45 52 52 45 44 22 2c 20 22 44 45 4c 45 54 45  FERRED", "DELETE
5070: 22 2c 20 22 44 45 53 43 22 2c 20 22 44 45 54 41  ", "DESC", "DETA
5080: 43 48 22 2c 20 22 44 49 53 54 49 4e 43 54 22 2c  CH", "DISTINCT",
5090: 20 22 44 52 4f 50 22 2c 20 22 45 41 43 48 22 2c   "DROP", "EACH",
50a0: 0a 20 20 20 20 22 45 4c 53 45 22 2c 20 22 45 4e  .    "ELSE", "EN
50b0: 44 22 2c 20 22 45 53 43 41 50 45 22 2c 20 22 45  D", "ESCAPE", "E
50c0: 58 43 45 50 54 22 2c 20 22 45 58 43 4c 55 53 49  XCEPT", "EXCLUSI
50d0: 56 45 22 2c 20 22 45 58 49 53 54 53 22 2c 20 22  VE", "EXISTS", "
50e0: 45 58 50 4c 41 49 4e 22 2c 0a 20 20 20 20 22 46  EXPLAIN",.    "F
50f0: 41 49 4c 22 2c 20 22 46 4f 52 22 2c 20 22 46 4f  AIL", "FOR", "FO
5100: 52 45 49 47 4e 22 2c 20 22 46 52 4f 4d 22 2c 20  REIGN", "FROM", 
5110: 22 46 55 4c 4c 22 2c 20 22 47 4c 4f 42 22 2c 20  "FULL", "GLOB", 
5120: 22 47 52 4f 55 50 22 2c 20 22 48 41 56 49 4e 47  "GROUP", "HAVING
5130: 22 2c 20 22 49 46 22 2c 0a 20 20 20 20 22 49 47  ", "IF",.    "IG
5140: 4e 4f 52 45 22 2c 20 22 49 4d 4d 45 44 49 41 54  NORE", "IMMEDIAT
5150: 45 22 2c 20 22 49 4e 22 2c 20 22 49 4e 44 45 58  E", "IN", "INDEX
5160: 22 2c 20 22 49 4e 44 45 58 45 44 22 2c 20 22 49  ", "INDEXED", "I
5170: 4e 49 54 49 41 4c 4c 59 22 2c 20 22 49 4e 4e 45  NITIALLY", "INNE
5180: 52 22 2c 0a 20 20 20 20 22 49 4e 53 45 52 54 22  R",.    "INSERT"
5190: 2c 20 22 49 4e 53 54 45 41 44 22 2c 20 22 49 4e  , "INSTEAD", "IN
51a0: 54 45 52 53 45 43 54 22 2c 20 22 49 4e 54 4f 22  TERSECT", "INTO"
51b0: 2c 20 22 49 53 22 2c 20 22 49 53 4e 55 4c 4c 22  , "IS", "ISNULL"
51c0: 2c 20 22 4a 4f 49 4e 22 2c 20 22 4b 45 59 22 2c  , "JOIN", "KEY",
51d0: 0a 20 20 20 20 22 4c 45 46 54 22 2c 20 22 4c 49  .    "LEFT", "LI
51e0: 4b 45 22 2c 20 22 4c 49 4d 49 54 22 2c 20 22 4d  KE", "LIMIT", "M
51f0: 41 54 43 48 22 2c 20 22 4e 41 54 55 52 41 4c 22  ATCH", "NATURAL"
5200: 2c 20 22 4e 4f 22 2c 20 22 4e 4f 54 22 2c 20 22  , "NO", "NOT", "
5210: 4e 4f 54 4e 55 4c 4c 22 2c 0a 20 20 20 20 22 4e  NOTNULL",.    "N
5220: 55 4c 4c 22 2c 20 22 4f 46 22 2c 20 22 4f 46 46  ULL", "OF", "OFF
5230: 53 45 54 22 2c 20 22 4f 4e 22 2c 20 22 4f 52 22  SET", "ON", "OR"
5240: 2c 20 22 4f 52 44 45 52 22 2c 20 22 4f 55 54 45  , "ORDER", "OUTE
5250: 52 22 2c 20 22 50 4c 41 4e 22 2c 20 22 50 52 41  R", "PLAN", "PRA
5260: 47 4d 41 22 2c 0a 20 20 20 20 22 50 52 49 4d 41  GMA",.    "PRIMA
5270: 52 59 22 2c 20 22 51 55 45 52 59 22 2c 20 22 52  RY", "QUERY", "R
5280: 41 49 53 45 22 2c 20 22 52 45 43 55 52 53 49 56  AISE", "RECURSIV
5290: 45 22 2c 20 22 52 45 46 45 52 45 4e 43 45 53 22  E", "REFERENCES"
52a0: 2c 20 22 52 45 47 45 58 50 22 2c 0a 20 20 20 20  , "REGEXP",.    
52b0: 22 52 45 49 4e 44 45 58 22 2c 20 22 52 45 4c 45  "REINDEX", "RELE
52c0: 41 53 45 22 2c 20 22 52 45 4e 41 4d 45 22 2c 20  ASE", "RENAME", 
52d0: 22 52 45 50 4c 41 43 45 22 2c 20 22 52 45 53 54  "REPLACE", "REST
52e0: 52 49 43 54 22 2c 20 22 52 49 47 48 54 22 2c 0a  RICT", "RIGHT",.
52f0: 20 20 20 20 22 52 4f 4c 4c 42 41 43 4b 22 2c 20      "ROLLBACK", 
5300: 22 52 4f 57 22 2c 20 22 53 41 56 45 50 4f 49 4e  "ROW", "SAVEPOIN
5310: 54 22 2c 20 22 53 45 4c 45 43 54 22 2c 20 22 53  T", "SELECT", "S
5320: 45 54 22 2c 20 22 54 41 42 4c 45 22 2c 20 22 54  ET", "TABLE", "T
5330: 45 4d 50 22 2c 0a 20 20 20 20 22 54 45 4d 50 4f  EMP",.    "TEMPO
5340: 52 41 52 59 22 2c 20 22 54 48 45 4e 22 2c 20 22  RARY", "THEN", "
5350: 54 4f 22 2c 20 22 54 52 41 4e 53 41 43 54 49 4f  TO", "TRANSACTIO
5360: 4e 22 2c 20 22 54 52 49 47 47 45 52 22 2c 20 22  N", "TRIGGER", "
5370: 55 4e 49 4f 4e 22 2c 20 22 55 4e 49 51 55 45 22  UNION", "UNIQUE"
5380: 2c 0a 20 20 20 20 22 55 50 44 41 54 45 22 2c 20  ,.    "UPDATE", 
5390: 22 55 53 49 4e 47 22 2c 20 22 56 41 43 55 55 4d  "USING", "VACUUM
53a0: 22 2c 20 22 56 41 4c 55 45 53 22 2c 20 22 56 49  ", "VALUES", "VI
53b0: 45 57 22 2c 20 22 56 49 52 54 55 41 4c 22 2c 20  EW", "VIRTUAL", 
53c0: 22 57 48 45 4e 22 2c 20 22 57 48 45 52 45 22 2c  "WHEN", "WHERE",
53d0: 0a 20 20 20 20 22 57 49 54 48 22 2c 20 22 57 49  .    "WITH", "WI
53e0: 54 48 4f 55 54 22 2c 0a 20 20 7d 3b 0a 20 20 69  THOUT",.  };.  i
53f0: 6e 74 20 69 2c 20 6c 77 72 2c 20 75 70 72 2c 20  nt i, lwr, upr, 
5400: 6d 69 64 2c 20 63 3b 0a 20 20 69 66 28 20 21 69  mid, c;.  if( !i
5410: 73 61 6c 70 68 61 28 28 75 6e 73 69 67 6e 65 64  salpha((unsigned
5420: 20 63 68 61 72 29 7a 4e 61 6d 65 5b 30 5d 29 20   char)zName[0]) 
5430: 26 26 20 7a 4e 61 6d 65 5b 30 5d 21 3d 27 5f 27  && zName[0]!='_'
5440: 20 29 20 72 65 74 75 72 6e 20 27 22 27 3b 0a 20   ) return '"';. 
5450: 20 66 6f 72 28 69 3d 30 3b 20 7a 4e 61 6d 65 5b   for(i=0; zName[
5460: 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  i]; i++){.    if
5470: 28 20 21 69 73 61 6c 6e 75 6d 28 28 75 6e 73 69  ( !isalnum((unsi
5480: 67 6e 65 64 20 63 68 61 72 29 7a 4e 61 6d 65 5b  gned char)zName[
5490: 69 5d 29 20 26 26 20 7a 4e 61 6d 65 5b 69 5d 21  i]) && zName[i]!
54a0: 3d 27 5f 27 20 29 20 72 65 74 75 72 6e 20 27 22  ='_' ) return '"
54b0: 27 3b 0a 20 20 7d 0a 20 20 6c 77 72 20 3d 20 30  ';.  }.  lwr = 0
54c0: 3b 0a 20 20 75 70 72 20 3d 20 73 69 7a 65 6f 66  ;.  upr = sizeof
54d0: 28 61 7a 4b 65 79 77 6f 72 64 73 29 2f 73 69 7a  (azKeywords)/siz
54e0: 65 6f 66 28 61 7a 4b 65 79 77 6f 72 64 73 5b 30  eof(azKeywords[0
54f0: 5d 29 20 2d 20 31 3b 0a 20 20 77 68 69 6c 65 28  ]) - 1;.  while(
5500: 20 6c 77 72 3c 3d 75 70 72 20 29 7b 0a 20 20 20   lwr<=upr ){.   
5510: 20 6d 69 64 20 3d 20 28 6c 77 72 2b 75 70 72 29   mid = (lwr+upr)
5520: 2f 32 3b 0a 20 20 20 20 63 20 3d 20 73 71 6c 69  /2;.    c = sqli
5530: 74 65 33 5f 73 74 72 69 63 6d 70 28 61 7a 4b 65  te3_stricmp(azKe
5540: 79 77 6f 72 64 73 5b 6d 69 64 5d 2c 20 7a 4e 61  ywords[mid], zNa
5550: 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 63 3d 3d  me);.    if( c==
5560: 30 20 29 20 72 65 74 75 72 6e 20 27 22 27 3b 0a  0 ) return '"';.
5570: 20 20 20 20 69 66 28 20 63 3c 30 20 29 7b 0a 20      if( c<0 ){. 
5580: 20 20 20 20 20 6c 77 72 20 3d 20 6d 69 64 2b 31       lwr = mid+1
5590: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
55a0: 20 20 20 75 70 72 20 3d 20 6d 69 64 2d 31 3b 0a     upr = mid-1;.
55b0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
55c0: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  rn 0;.}../*.** C
55d0: 6f 6e 73 74 72 75 63 74 20 61 20 66 61 6b 65 20  onstruct a fake 
55e0: 6f 62 6a 65 63 74 20 6e 61 6d 65 20 61 6e 64 20  object name and 
55f0: 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 74 6f 20 64  column list to d
5600: 65 73 63 72 69 62 65 20 74 68 65 20 73 74 72 75  escribe the stru
5610: 63 74 75 72 65 0a 2a 2a 20 6f 66 20 74 68 65 20  cture.** of the 
5620: 76 69 65 77 2c 20 76 69 72 74 75 61 6c 20 74 61  view, virtual ta
5630: 62 6c 65 2c 20 6f 72 20 74 61 62 6c 65 20 76 61  ble, or table va
5640: 6c 75 65 64 20 66 75 6e 63 74 69 6f 6e 20 7a 53  lued function zS
5650: 63 68 65 6d 61 2e 7a 4e 61 6d 65 2e 0a 2a 2f 0a  chema.zName..*/.
5660: 73 74 61 74 69 63 20 63 68 61 72 20 2a 73 68 65  static char *she
5670: 6c 6c 46 61 6b 65 53 63 68 65 6d 61 28 0a 20 20  llFakeSchema(.  
5680: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20  sqlite3 *db,    
5690: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64          /* The d
56a0: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
56b0: 6f 6e 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  on containing th
56c0: 65 20 76 74 61 62 20 2a 2f 0a 20 20 63 6f 6e 73  e vtab */.  cons
56d0: 74 20 63 68 61 72 20 2a 7a 53 63 68 65 6d 61 2c  t char *zSchema,
56e0: 20 20 20 20 2f 2a 20 53 63 68 65 6d 61 20 6f 66      /* Schema of
56f0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68 6f   the database ho
5700: 6c 64 69 6e 67 20 74 68 65 20 76 74 61 62 20 2a  lding the vtab *
5710: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
5720: 7a 4e 61 6d 65 20 20 20 20 20 20 20 2f 2a 20 54  zName       /* T
5730: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 76  he name of the v
5740: 69 72 74 75 61 6c 20 74 61 62 6c 65 20 2a 2f 0a  irtual table */.
5750: 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  ){.  sqlite3_stm
5760: 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20  t *pStmt = 0;.  
5770: 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 53 68  char *zSql;.  Sh
5780: 65 6c 6c 54 65 78 74 20 73 3b 0a 20 20 63 68 61  ellText s;.  cha
5790: 72 20 63 51 75 6f 74 65 3b 0a 20 20 63 68 61 72  r cQuote;.  char
57a0: 20 2a 7a 44 69 76 20 3d 20 22 28 22 3b 0a 20 20   *zDiv = "(";.  
57b0: 69 6e 74 20 6e 52 6f 77 20 3d 20 30 3b 0a 0a 20  int nRow = 0;.. 
57c0: 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f   zSql = sqlite3_
57d0: 6d 70 72 69 6e 74 66 28 22 50 52 41 47 4d 41 20  mprintf("PRAGMA 
57e0: 5c 22 25 77 5c 22 2e 74 61 62 6c 65 5f 69 6e 66  \"%w\".table_inf
57f0: 6f 3d 25 51 3b 22 2c 0a 20 20 20 20 20 20 20 20  o=%Q;",.        
5800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5810: 20 7a 53 63 68 65 6d 61 20 3f 20 7a 53 63 68 65   zSchema ? zSche
5820: 6d 61 20 3a 20 22 6d 61 69 6e 22 2c 20 7a 4e 61  ma : "main", zNa
5830: 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 70  me);.  sqlite3_p
5840: 72 65 70 61 72 65 5f 76 32 28 64 62 2c 20 7a 53  repare_v2(db, zS
5850: 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20  ql, -1, &pStmt, 
5860: 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  0);.  sqlite3_fr
5870: 65 65 28 7a 53 71 6c 29 3b 0a 20 20 69 6e 69 74  ee(zSql);.  init
5880: 54 65 78 74 28 26 73 29 3b 0a 20 20 69 66 28 20  Text(&s);.  if( 
5890: 7a 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 63  zSchema ){.    c
58a0: 51 75 6f 74 65 20 3d 20 71 75 6f 74 65 43 68 61  Quote = quoteCha
58b0: 72 28 7a 53 63 68 65 6d 61 29 3b 0a 20 20 20 20  r(zSchema);.    
58c0: 69 66 28 20 63 51 75 6f 74 65 20 26 26 20 73 71  if( cQuote && sq
58d0: 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28 7a 53  lite3_stricmp(zS
58e0: 63 68 65 6d 61 2c 22 74 65 6d 70 22 29 3d 3d 30  chema,"temp")==0
58f0: 20 29 20 63 51 75 6f 74 65 20 3d 20 30 3b 0a 20   ) cQuote = 0;. 
5900: 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73     appendText(&s
5910: 2c 20 7a 53 63 68 65 6d 61 2c 20 63 51 75 6f 74  , zSchema, cQuot
5920: 65 29 3b 0a 20 20 20 20 61 70 70 65 6e 64 54 65  e);.    appendTe
5930: 78 74 28 26 73 2c 20 22 2e 22 2c 20 30 29 3b 0a  xt(&s, ".", 0);.
5940: 20 20 7d 0a 20 20 63 51 75 6f 74 65 20 3d 20 71    }.  cQuote = q
5950: 75 6f 74 65 43 68 61 72 28 7a 4e 61 6d 65 29 3b  uoteChar(zName);
5960: 0a 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73  .  appendText(&s
5970: 2c 20 7a 4e 61 6d 65 2c 20 63 51 75 6f 74 65 29  , zName, cQuote)
5980: 3b 0a 20 20 77 68 69 6c 65 28 20 73 71 6c 69 74  ;.  while( sqlit
5990: 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3d 3d  e3_step(pStmt)==
59a0: 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20  SQLITE_ROW ){.  
59b0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43    const char *zC
59c0: 6f 6c 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  ol = (const char
59d0: 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  *)sqlite3_column
59e0: 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 31 29 3b  _text(pStmt, 1);
59f0: 0a 20 20 20 20 6e 52 6f 77 2b 2b 3b 0a 20 20 20  .    nRow++;.   
5a00: 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 2c 20   appendText(&s, 
5a10: 7a 44 69 76 2c 20 30 29 3b 0a 20 20 20 20 7a 44  zDiv, 0);.    zD
5a20: 69 76 20 3d 20 22 2c 22 3b 0a 20 20 20 20 63 51  iv = ",";.    cQ
5a30: 75 6f 74 65 20 3d 20 71 75 6f 74 65 43 68 61 72  uote = quoteChar
5a40: 28 7a 43 6f 6c 29 3b 0a 20 20 20 20 61 70 70 65  (zCol);.    appe
5a50: 6e 64 54 65 78 74 28 26 73 2c 20 7a 43 6f 6c 2c  ndText(&s, zCol,
5a60: 20 63 51 75 6f 74 65 29 3b 0a 20 20 7d 0a 20 20   cQuote);.  }.  
5a70: 61 70 70 65 6e 64 54 65 78 74 28 26 73 2c 20 22  appendText(&s, "
5a80: 29 22 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65  )", 0);.  sqlite
5a90: 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74  3_finalize(pStmt
5aa0: 29 3b 0a 20 20 69 66 28 20 6e 52 6f 77 3d 3d 30  );.  if( nRow==0
5ab0: 20 29 7b 0a 20 20 20 20 66 72 65 65 54 65 78 74   ){.    freeText
5ac0: 28 26 73 29 3b 0a 20 20 20 20 73 2e 7a 20 3d 20  (&s);.    s.z = 
5ad0: 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
5ae0: 73 2e 7a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 51  s.z;.}../*.** SQ
5af0: 4c 20 66 75 6e 63 74 69 6f 6e 3a 20 20 73 68 65  L function:  she
5b00: 6c 6c 5f 6d 6f 64 75 6c 65 5f 73 63 68 65 6d 61  ll_module_schema
5b10: 28 58 29 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  (X).**.** Return
5b20: 20 61 20 66 61 6b 65 20 73 63 68 65 6d 61 20 66   a fake schema f
5b30: 6f 72 20 74 68 65 20 74 61 62 6c 65 2d 76 61 6c  or the table-val
5b40: 75 65 64 20 66 75 6e 63 74 69 6f 6e 20 6f 72 20  ued function or 
5b50: 65 70 6f 6e 79 6d 6f 75 73 20 76 69 72 74 75 61  eponymous virtua
5b60: 6c 0a 2a 2a 20 74 61 62 6c 65 20 58 2e 0a 2a 2f  l.** table X..*/
5b70: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 68 65  .static void she
5b80: 6c 6c 4d 6f 64 75 6c 65 53 63 68 65 6d 61 28 0a  llModuleSchema(.
5b90: 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78    sqlite3_contex
5ba0: 74 20 2a 70 43 74 78 2c 0a 20 20 69 6e 74 20 6e  t *pCtx,.  int n
5bb0: 56 61 6c 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76  Val,.  sqlite3_v
5bc0: 61 6c 75 65 20 2a 2a 61 70 56 61 6c 0a 29 7b 0a  alue **apVal.){.
5bd0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
5be0: 61 6d 65 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  ame = (const cha
5bf0: 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  r*)sqlite3_value
5c00: 5f 74 65 78 74 28 61 70 56 61 6c 5b 30 5d 29 3b  _text(apVal[0]);
5c10: 0a 20 20 63 68 61 72 20 2a 7a 46 61 6b 65 20 3d  .  char *zFake =
5c20: 20 73 68 65 6c 6c 46 61 6b 65 53 63 68 65 6d 61   shellFakeSchema
5c30: 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
5c40: 5f 64 62 5f 68 61 6e 64 6c 65 28 70 43 74 78 29  _db_handle(pCtx)
5c50: 2c 20 30 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 69  , 0, zName);.  i
5c60: 66 28 20 7a 46 61 6b 65 20 29 7b 0a 20 20 20 20  f( zFake ){.    
5c70: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74  sqlite3_result_t
5c80: 65 78 74 28 70 43 74 78 2c 20 73 71 6c 69 74 65  ext(pCtx, sqlite
5c90: 33 5f 6d 70 72 69 6e 74 66 28 22 2f 2a 20 25 73  3_mprintf("/* %s
5ca0: 20 2a 2f 22 2c 20 7a 46 61 6b 65 29 2c 0a 20 20   */", zFake),.  
5cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5cc0: 20 20 20 20 20 20 2d 31 2c 20 73 71 6c 69 74 65        -1, sqlite
5cd0: 33 5f 66 72 65 65 29 3b 0a 20 20 20 20 66 72 65  3_free);.    fre
5ce0: 65 28 7a 46 61 6b 65 29 3b 0a 20 20 7d 0a 7d 0a  e(zFake);.  }.}.
5cf0: 0a 2f 2a 0a 2a 2a 20 53 51 4c 20 66 75 6e 63 74  ./*.** SQL funct
5d00: 69 6f 6e 3a 20 20 73 68 65 6c 6c 5f 61 64 64 5f  ion:  shell_add_
5d10: 73 63 68 65 6d 61 28 53 2c 58 29 0a 2a 2a 0a 2a  schema(S,X).**.*
5d20: 2a 20 41 64 64 20 74 68 65 20 73 63 68 65 6d 61  * Add the schema
5d30: 20 6e 61 6d 65 20 58 20 74 6f 20 74 68 65 20 43   name X to the C
5d40: 52 45 41 54 45 20 73 74 61 74 65 6d 65 6e 74 20  REATE statement 
5d50: 69 6e 20 53 20 61 6e 64 20 72 65 74 75 72 6e 20  in S and return 
5d60: 74 68 65 20 72 65 73 75 6c 74 2e 0a 2a 2a 20 45  the result..** E
5d70: 78 61 6d 70 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20  xamples:.**.**  
5d80: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
5d90: 31 28 78 29 20 20 20 2d 3e 20 20 20 43 52 45 41  1(x)   ->   CREA
5da0: 54 45 20 54 41 42 4c 45 20 78 79 7a 2e 74 31 28  TE TABLE xyz.t1(
5db0: 78 29 3b 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 77  x);.**.** Also w
5dc0: 6f 72 6b 73 20 6f 6e 0a 2a 2a 0a 2a 2a 20 20 20  orks on.**.**   
5dd0: 20 43 52 45 41 54 45 20 49 4e 44 45 58 0a 2a 2a   CREATE INDEX.**
5de0: 20 20 20 20 43 52 45 41 54 45 20 55 4e 49 51 55      CREATE UNIQU
5df0: 45 20 49 4e 44 45 58 0a 2a 2a 20 20 20 20 43 52  E INDEX.**    CR
5e00: 45 41 54 45 20 56 49 45 57 0a 2a 2a 20 20 20 20  EATE VIEW.**    
5e10: 43 52 45 41 54 45 20 54 52 49 47 47 45 52 0a 2a  CREATE TRIGGER.*
5e20: 2a 20 20 20 20 43 52 45 41 54 45 20 56 49 52 54  *    CREATE VIRT
5e30: 55 41 4c 20 54 41 42 4c 45 0a 2a 2a 0a 2a 2a 20  UAL TABLE.**.** 
5e40: 54 68 69 73 20 55 44 46 20 69 73 20 75 73 65 64  This UDF is used
5e50: 20 62 79 20 74 68 65 20 2e 73 63 68 65 6d 61 20   by the .schema 
5e60: 63 6f 6d 6d 61 6e 64 20 74 6f 20 69 6e 73 65 72  command to inser
5e70: 74 20 74 68 65 20 73 63 68 65 6d 61 20 6e 61 6d  t the schema nam
5e80: 65 20 6f 66 0a 2a 2a 20 61 74 74 61 63 68 65 64  e of.** attached
5e90: 20 64 61 74 61 62 61 73 65 73 20 69 6e 74 6f 20   databases into 
5ea0: 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 20 74 68  the middle of th
5eb0: 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 2e  e sqlite_master.
5ec0: 73 71 6c 20 66 69 65 6c 64 2e 0a 2a 2f 0a 73 74  sql field..*/.st
5ed0: 61 74 69 63 20 76 6f 69 64 20 73 68 65 6c 6c 41  atic void shellA
5ee0: 64 64 53 63 68 65 6d 61 4e 61 6d 65 28 0a 20 20  ddSchemaName(.  
5ef0: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
5f00: 2a 70 43 74 78 2c 0a 20 20 69 6e 74 20 6e 56 61  *pCtx,.  int nVa
5f10: 6c 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  l,.  sqlite3_val
5f20: 75 65 20 2a 2a 61 70 56 61 6c 0a 29 7b 0a 20 20  ue **apVal.){.  
5f30: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
5f40: 72 20 2a 61 50 72 65 66 69 78 5b 5d 20 3d 20 7b  r *aPrefix[] = {
5f50: 0a 20 20 20 20 20 22 54 41 42 4c 45 22 2c 0a 20  .     "TABLE",. 
5f60: 20 20 20 20 22 49 4e 44 45 58 22 2c 0a 20 20 20      "INDEX",.   
5f70: 20 20 22 55 4e 49 51 55 45 20 49 4e 44 45 58 22    "UNIQUE INDEX"
5f80: 2c 0a 20 20 20 20 20 22 56 49 45 57 22 2c 0a 20  ,.     "VIEW",. 
5f90: 20 20 20 20 22 54 52 49 47 47 45 52 22 2c 0a 20      "TRIGGER",. 
5fa0: 20 20 20 20 22 56 49 52 54 55 41 4c 20 54 41 42      "VIRTUAL TAB
5fb0: 4c 45 22 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69  LE".  };.  int i
5fc0: 20 3d 20 30 3b 0a 20 20 63 6f 6e 73 74 20 63 68   = 0;.  const ch
5fd0: 61 72 20 2a 7a 49 6e 20 3d 20 28 63 6f 6e 73 74  ar *zIn = (const
5fe0: 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76   char*)sqlite3_v
5ff0: 61 6c 75 65 5f 74 65 78 74 28 61 70 56 61 6c 5b  alue_text(apVal[
6000: 30 5d 29 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  0]);.  const cha
6010: 72 20 2a 7a 53 63 68 65 6d 61 20 3d 20 28 63 6f  r *zSchema = (co
6020: 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65  nst char*)sqlite
6030: 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 70 56  3_value_text(apV
6040: 61 6c 5b 31 5d 29 3b 0a 20 20 63 6f 6e 73 74 20  al[1]);.  const 
6050: 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 28 63  char *zName = (c
6060: 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74  onst char*)sqlit
6070: 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 70  e3_value_text(ap
6080: 56 61 6c 5b 32 5d 29 3b 0a 20 20 73 71 6c 69 74  Val[2]);.  sqlit
6090: 65 33 20 2a 64 62 20 3d 20 73 71 6c 69 74 65 33  e3 *db = sqlite3
60a0: 5f 63 6f 6e 74 65 78 74 5f 64 62 5f 68 61 6e 64  _context_db_hand
60b0: 6c 65 28 70 43 74 78 29 3b 0a 20 20 69 66 28 20  le(pCtx);.  if( 
60c0: 7a 49 6e 21 3d 30 20 26 26 20 73 74 72 6e 63 6d  zIn!=0 && strncm
60d0: 70 28 7a 49 6e 2c 20 22 43 52 45 41 54 45 20 22  p(zIn, "CREATE "
60e0: 2c 20 37 29 3d 3d 30 20 29 7b 0a 20 20 20 20 66  , 7)==0 ){.    f
60f0: 6f 72 28 69 3d 30 3b 20 69 3c 28 69 6e 74 29 28  or(i=0; i<(int)(
6100: 73 69 7a 65 6f 66 28 61 50 72 65 66 69 78 29 2f  sizeof(aPrefix)/
6110: 73 69 7a 65 6f 66 28 61 50 72 65 66 69 78 5b 30  sizeof(aPrefix[0
6120: 5d 29 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  ])); i++){.     
6130: 20 69 6e 74 20 6e 20 3d 20 73 74 72 6c 65 6e 33   int n = strlen3
6140: 30 28 61 50 72 65 66 69 78 5b 69 5d 29 3b 0a 20  0(aPrefix[i]);. 
6150: 20 20 20 20 20 69 66 28 20 73 74 72 6e 63 6d 70       if( strncmp
6160: 28 7a 49 6e 2b 37 2c 20 61 50 72 65 66 69 78 5b  (zIn+7, aPrefix[
6170: 69 5d 2c 20 6e 29 3d 3d 30 20 26 26 20 7a 49 6e  i], n)==0 && zIn
6180: 5b 6e 2b 37 5d 3d 3d 27 20 27 20 29 7b 0a 20 20  [n+7]==' ' ){.  
6190: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20        char *z = 
61a0: 30 3b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  0;.        char 
61b0: 2a 7a 46 61 6b 65 20 3d 20 30 3b 0a 20 20 20 20  *zFake = 0;.    
61c0: 20 20 20 20 69 66 28 20 7a 53 63 68 65 6d 61 20      if( zSchema 
61d0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 68 61  ){.          cha
61e0: 72 20 63 51 75 6f 74 65 20 3d 20 71 75 6f 74 65  r cQuote = quote
61f0: 43 68 61 72 28 7a 53 63 68 65 6d 61 29 3b 0a 20  Char(zSchema);. 
6200: 20 20 20 20 20 20 20 20 20 69 66 28 20 63 51 75           if( cQu
6210: 6f 74 65 20 26 26 20 73 71 6c 69 74 65 33 5f 73  ote && sqlite3_s
6220: 74 72 69 63 6d 70 28 7a 53 63 68 65 6d 61 2c 22  tricmp(zSchema,"
6230: 74 65 6d 70 22 29 21 3d 30 20 29 7b 0a 20 20 20  temp")!=0 ){.   
6240: 20 20 20 20 20 20 20 20 20 7a 20 3d 20 73 71 6c           z = sql
6250: 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 2e  ite3_mprintf("%.
6260: 2a 73 20 5c 22 25 77 5c 22 2e 25 73 22 2c 20 6e  *s \"%w\".%s", n
6270: 2b 37 2c 20 7a 49 6e 2c 20 7a 53 63 68 65 6d 61  +7, zIn, zSchema
6280: 2c 20 7a 49 6e 2b 6e 2b 38 29 3b 0a 20 20 20 20  , zIn+n+8);.    
6290: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
62a0: 20 20 20 20 20 20 20 20 20 7a 20 3d 20 73 71 6c           z = sql
62b0: 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 2e  ite3_mprintf("%.
62c0: 2a 73 20 25 73 2e 25 73 22 2c 20 6e 2b 37 2c 20  *s %s.%s", n+7, 
62d0: 7a 49 6e 2c 20 7a 53 63 68 65 6d 61 2c 20 7a 49  zIn, zSchema, zI
62e0: 6e 2b 6e 2b 38 29 3b 0a 20 20 20 20 20 20 20 20  n+n+8);.        
62f0: 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
6300: 20 20 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 0a        if( zName.
6310: 20 20 20 20 20 20 20 20 20 26 26 20 61 50 72 65           && aPre
6320: 66 69 78 5b 69 5d 5b 30 5d 3d 3d 27 56 27 0a 20  fix[i][0]=='V'. 
6330: 20 20 20 20 20 20 20 20 26 26 20 28 7a 46 61 6b          && (zFak
6340: 65 20 3d 20 73 68 65 6c 6c 46 61 6b 65 53 63 68  e = shellFakeSch
6350: 65 6d 61 28 64 62 2c 20 7a 53 63 68 65 6d 61 2c  ema(db, zSchema,
6360: 20 7a 4e 61 6d 65 29 29 21 3d 30 0a 20 20 20 20   zName))!=0.    
6370: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
6380: 20 69 66 28 20 7a 3d 3d 30 20 29 7b 0a 20 20 20   if( z==0 ){.   
6390: 20 20 20 20 20 20 20 20 20 7a 20 3d 20 73 71 6c           z = sql
63a0: 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73  ite3_mprintf("%s
63b0: 5c 6e 2f 2a 20 25 73 20 2a 2f 22 2c 20 7a 49 6e  \n/* %s */", zIn
63c0: 2c 20 7a 46 61 6b 65 29 3b 0a 20 20 20 20 20 20  , zFake);.      
63d0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
63e0: 20 20 20 20 20 20 20 7a 20 3d 20 73 71 6c 69 74         z = sqlit
63f0: 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 7a 5c 6e  e3_mprintf("%z\n
6400: 2f 2a 20 25 73 20 2a 2f 22 2c 20 7a 2c 20 7a 46  /* %s */", z, zF
6410: 61 6b 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ake);.          
6420: 7d 0a 20 20 20 20 20 20 20 20 20 20 66 72 65 65  }.          free
6430: 28 7a 46 61 6b 65 29 3b 0a 20 20 20 20 20 20 20  (zFake);.       
6440: 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a   }.        if( z
6450: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
6460: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78  lite3_result_tex
6470: 74 28 70 43 74 78 2c 20 7a 2c 20 2d 31 2c 20 73  t(pCtx, z, -1, s
6480: 71 6c 69 74 65 33 5f 66 72 65 65 29 3b 0a 20 20  qlite3_free);.  
6490: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a          return;.
64a0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
64b0: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  }.    }.  }.  sq
64c0: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 76 61 6c  lite3_result_val
64d0: 75 65 28 70 43 74 78 2c 20 61 70 56 61 6c 5b 30  ue(pCtx, apVal[0
64e0: 5d 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  ]);.}../*.** The
64f0: 20 73 6f 75 72 63 65 20 63 6f 64 65 20 66 6f 72   source code for
6500: 20 73 65 76 65 72 61 6c 20 72 75 6e 2d 74 69 6d   several run-tim
6510: 65 20 6c 6f 61 64 61 62 6c 65 20 65 78 74 65 6e  e loadable exten
6520: 73 69 6f 6e 73 20 69 73 20 69 6e 73 65 72 74 65  sions is inserte
6530: 64 0a 2a 2a 20 62 65 6c 6f 77 20 62 79 20 74 68  d.** below by th
6540: 65 20 2e 2e 2f 74 6f 6f 6c 2f 6d 6b 73 68 65 6c  e ../tool/mkshel
6550: 6c 63 2e 74 63 6c 20 73 63 72 69 70 74 2e 20 20  lc.tcl script.  
6560: 42 65 66 6f 72 65 20 70 72 6f 63 65 73 73 69 6e  Before processin
6570: 67 20 74 68 61 74 20 69 6e 63 6c 75 64 65 64 0a  g that included.
6580: 2a 2a 20 63 6f 64 65 2c 20 77 65 20 6e 65 65 64  ** code, we need
6590: 20 74 6f 20 6f 76 65 72 72 69 64 65 20 73 6f 6d   to override som
65a0: 65 20 6d 61 63 72 6f 73 20 74 6f 20 6d 61 6b 65  e macros to make
65b0: 20 74 68 65 20 69 6e 63 6c 75 64 65 64 20 70 72   the included pr
65c0: 6f 67 72 61 6d 20 63 6f 64 65 0a 2a 2a 20 77 6f  ogram code.** wo
65d0: 72 6b 20 68 65 72 65 20 69 6e 20 74 68 65 20 6d  rk here in the m
65e0: 69 64 64 6c 65 20 6f 66 20 74 68 69 73 20 72 65  iddle of this re
65f0: 67 75 6c 61 72 20 70 72 6f 67 72 61 6d 2e 0a 2a  gular program..*
6600: 2f 0a 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45  /.#define SQLITE
6610: 5f 45 58 54 45 4e 53 49 4f 4e 5f 49 4e 49 54 31  _EXTENSION_INIT1
6620: 0a 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f  .#define SQLITE_
6630: 45 58 54 45 4e 53 49 4f 4e 5f 49 4e 49 54 32 28  EXTENSION_INIT2(
6640: 58 29 20 28 76 6f 69 64 29 28 58 29 0a 0a 23 69  X) (void)(X)..#i
6650: 66 20 64 65 66 69 6e 65 64 28 5f 57 49 4e 33 32  f defined(_WIN32
6660: 29 20 26 26 20 64 65 66 69 6e 65 64 28 5f 4d 53  ) && defined(_MS
6670: 43 5f 56 45 52 29 0a 49 4e 43 4c 55 44 45 20 74  C_VER).INCLUDE t
6680: 65 73 74 5f 77 69 6e 64 69 72 65 6e 74 2e 68 0a  est_windirent.h.
6690: 49 4e 43 4c 55 44 45 20 74 65 73 74 5f 77 69 6e  INCLUDE test_win
66a0: 64 69 72 65 6e 74 2e 63 0a 23 64 65 66 69 6e 65  dirent.c.#define
66b0: 20 64 69 72 65 6e 74 20 44 49 52 45 4e 54 0a 23   dirent DIRENT.#
66c0: 65 6e 64 69 66 0a 49 4e 43 4c 55 44 45 20 2e 2e  endif.INCLUDE ..
66d0: 2f 65 78 74 2f 6d 69 73 63 2f 73 68 61 74 68 72  /ext/misc/shathr
66e0: 65 65 2e 63 0a 49 4e 43 4c 55 44 45 20 2e 2e 2f  ee.c.INCLUDE ../
66f0: 65 78 74 2f 6d 69 73 63 2f 66 69 6c 65 69 6f 2e  ext/misc/fileio.
6700: 63 0a 49 4e 43 4c 55 44 45 20 2e 2e 2f 65 78 74  c.INCLUDE ../ext
6710: 2f 6d 69 73 63 2f 63 6f 6d 70 6c 65 74 69 6f 6e  /misc/completion
6720: 2e 63 0a 49 4e 43 4c 55 44 45 20 2e 2e 2f 65 78  .c.INCLUDE ../ex
6730: 74 2f 6d 69 73 63 2f 61 70 70 65 6e 64 76 66 73  t/misc/appendvfs
6740: 2e 63 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  .c.#ifdef SQLITE
6750: 5f 48 41 56 45 5f 5a 4c 49 42 0a 49 4e 43 4c 55  _HAVE_ZLIB.INCLU
6760: 44 45 20 2e 2e 2f 65 78 74 2f 6d 69 73 63 2f 7a  DE ../ext/misc/z
6770: 69 70 66 69 6c 65 2e 63 0a 49 4e 43 4c 55 44 45  ipfile.c.INCLUDE
6780: 20 2e 2e 2f 65 78 74 2f 6d 69 73 63 2f 73 71 6c   ../ext/misc/sql
6790: 61 72 2e 63 0a 23 65 6e 64 69 66 0a 49 4e 43 4c  ar.c.#endif.INCL
67a0: 55 44 45 20 2e 2e 2f 65 78 74 2f 65 78 70 65 72  UDE ../ext/exper
67b0: 74 2f 73 71 6c 69 74 65 33 65 78 70 65 72 74 2e  t/sqlite3expert.
67c0: 68 0a 49 4e 43 4c 55 44 45 20 2e 2e 2f 65 78 74  h.INCLUDE ../ext
67d0: 2f 65 78 70 65 72 74 2f 73 71 6c 69 74 65 33 65  /expert/sqlite3e
67e0: 78 70 65 72 74 2e 63 0a 0a 23 69 66 20 64 65 66  xpert.c..#if def
67f0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
6800: 4c 45 5f 53 45 53 53 49 4f 4e 29 0a 2f 2a 0a 2a  LE_SESSION)./*.*
6810: 2a 20 53 74 61 74 65 20 69 6e 66 6f 72 6d 61 74  * State informat
6820: 69 6f 6e 20 66 6f 72 20 61 20 73 69 6e 67 6c 65  ion for a single
6830: 20 6f 70 65 6e 20 73 65 73 73 69 6f 6e 0a 2a 2f   open session.*/
6840: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
6850: 4f 70 65 6e 53 65 73 73 69 6f 6e 20 4f 70 65 6e  OpenSession Open
6860: 53 65 73 73 69 6f 6e 3b 0a 73 74 72 75 63 74 20  Session;.struct 
6870: 4f 70 65 6e 53 65 73 73 69 6f 6e 20 7b 0a 20 20  OpenSession {.  
6880: 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 20  char *zName;    
6890: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 79 6d 62           /* Symb
68a0: 6f 6c 69 63 20 6e 61 6d 65 20 66 6f 72 20 74 68  olic name for th
68b0: 69 73 20 73 65 73 73 69 6f 6e 20 2a 2f 0a 20 20  is session */.  
68c0: 69 6e 74 20 6e 46 69 6c 74 65 72 3b 20 20 20 20  int nFilter;    
68d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
68e0: 65 72 20 6f 66 20 78 46 69 6c 74 65 72 20 72 65  er of xFilter re
68f0: 6a 65 63 74 69 6f 6e 20 47 4c 4f 42 20 70 61 74  jection GLOB pat
6900: 74 65 72 6e 73 20 2a 2f 0a 20 20 63 68 61 72 20  terns */.  char 
6910: 2a 2a 61 7a 46 69 6c 74 65 72 3b 20 20 20 20 20  **azFilter;     
6920: 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20      /* Array of 
6930: 78 46 69 6c 74 65 72 20 72 65 6a 65 63 74 69 6f  xFilter rejectio
6940: 6e 20 47 4c 4f 42 20 70 61 74 74 65 72 6e 73 20  n GLOB patterns 
6950: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 65 73  */.  sqlite3_ses
6960: 73 69 6f 6e 20 2a 70 3b 20 20 20 20 20 20 2f 2a  sion *p;      /*
6970: 20 54 68 65 20 6f 70 65 6e 20 73 65 73 73 69 6f   The open sessio
6980: 6e 20 2a 2f 0a 7d 3b 0a 23 65 6e 64 69 66 0a 0a  n */.};.#endif..
6990: 2f 2a 0a 2a 2a 20 53 68 65 6c 6c 20 6f 75 74 70  /*.** Shell outp
69a0: 75 74 20 6d 6f 64 65 20 69 6e 66 6f 72 6d 61 74  ut mode informat
69b0: 69 6f 6e 20 66 72 6f 6d 20 62 65 66 6f 72 65 20  ion from before 
69c0: 22 2e 65 78 70 6c 61 69 6e 20 6f 6e 22 2c 0a 2a  ".explain on",.*
69d0: 2a 20 73 61 76 65 64 20 73 6f 20 74 68 61 74 20  * saved so that 
69e0: 69 74 20 63 61 6e 20 62 65 20 72 65 73 74 6f 72  it can be restor
69f0: 65 64 20 62 79 20 22 2e 65 78 70 6c 61 69 6e 20  ed by ".explain 
6a00: 6f 66 66 22 0a 2a 2f 0a 74 79 70 65 64 65 66 20  off".*/.typedef 
6a10: 73 74 72 75 63 74 20 53 61 76 65 64 4d 6f 64 65  struct SavedMode
6a20: 49 6e 66 6f 20 53 61 76 65 64 4d 6f 64 65 49 6e  Info SavedModeIn
6a30: 66 6f 3b 0a 73 74 72 75 63 74 20 53 61 76 65 64  fo;.struct Saved
6a40: 4d 6f 64 65 49 6e 66 6f 20 7b 0a 20 20 69 6e 74  ModeInfo {.  int
6a50: 20 76 61 6c 69 64 3b 20 20 20 20 20 20 20 20 20   valid;         
6a60: 20 2f 2a 20 49 73 20 74 68 65 72 65 20 6c 65 67   /* Is there leg
6a70: 69 74 20 64 61 74 61 20 69 6e 20 68 65 72 65 3f  it data in here?
6a80: 20 2a 2f 0a 20 20 69 6e 74 20 6d 6f 64 65 3b 20   */.  int mode; 
6a90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 6f 64            /* Mod
6aa0: 65 20 70 72 69 6f 72 20 74 6f 20 22 2e 65 78 70  e prior to ".exp
6ab0: 6c 61 69 6e 20 6f 6e 22 20 2a 2f 0a 20 20 69 6e  lain on" */.  in
6ac0: 74 20 73 68 6f 77 48 65 61 64 65 72 3b 20 20 20  t showHeader;   
6ad0: 20 20 2f 2a 20 54 68 65 20 22 2e 68 65 61 64 65    /* The ".heade
6ae0: 72 22 20 73 65 74 74 69 6e 67 20 70 72 69 6f 72  r" setting prior
6af0: 20 74 6f 20 22 2e 65 78 70 6c 61 69 6e 20 6f 6e   to ".explain on
6b00: 22 20 2a 2f 0a 20 20 69 6e 74 20 63 6f 6c 57 69  " */.  int colWi
6b10: 64 74 68 5b 31 30 30 5d 3b 20 20 2f 2a 20 43 6f  dth[100];  /* Co
6b20: 6c 75 6d 6e 20 77 69 64 74 68 73 20 70 72 69 6f  lumn widths prio
6b30: 72 20 74 6f 20 22 2e 65 78 70 6c 61 69 6e 20 6f  r to ".explain o
6b40: 6e 22 20 2a 2f 0a 7d 3b 0a 0a 74 79 70 65 64 65  n" */.};..typede
6b50: 66 20 73 74 72 75 63 74 20 45 78 70 65 72 74 49  f struct ExpertI
6b60: 6e 66 6f 20 45 78 70 65 72 74 49 6e 66 6f 3b 0a  nfo ExpertInfo;.
6b70: 73 74 72 75 63 74 20 45 78 70 65 72 74 49 6e 66  struct ExpertInf
6b80: 6f 20 7b 0a 20 20 73 71 6c 69 74 65 33 65 78 70  o {.  sqlite3exp
6b90: 65 72 74 20 2a 70 45 78 70 65 72 74 3b 0a 20 20  ert *pExpert;.  
6ba0: 69 6e 74 20 62 56 65 72 62 6f 73 65 3b 0a 7d 3b  int bVerbose;.};
6bb0: 0a 0a 2f 2a 0a 2a 2a 20 53 74 61 74 65 20 69 6e  ../*.** State in
6bc0: 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20  formation about 
6bd0: 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  the database con
6be0: 6e 65 63 74 69 6f 6e 20 69 73 20 63 6f 6e 74 61  nection is conta
6bf0: 69 6e 65 64 20 69 6e 20 61 6e 0a 2a 2a 20 69 6e  ined in an.** in
6c00: 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f  stance of the fo
6c10: 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72  llowing structur
6c20: 65 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  e..*/.typedef st
6c30: 72 75 63 74 20 53 68 65 6c 6c 53 74 61 74 65 20  ruct ShellState 
6c40: 53 68 65 6c 6c 53 74 61 74 65 3b 0a 73 74 72 75  ShellState;.stru
6c50: 63 74 20 53 68 65 6c 6c 53 74 61 74 65 20 7b 0a  ct ShellState {.
6c60: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20    sqlite3 *db;  
6c70: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
6c80: 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 75 38  database */.  u8
6c90: 20 61 75 74 6f 45 78 70 6c 61 69 6e 3b 20 20 20   autoExplain;   
6ca0: 20 20 20 20 20 2f 2a 20 41 75 74 6f 6d 61 74 69       /* Automati
6cb0: 63 61 6c 6c 79 20 74 75 72 6e 20 6f 6e 20 2e 65  cally turn on .e
6cc0: 78 70 6c 61 69 6e 20 6d 6f 64 65 20 2a 2f 0a 20  xplain mode */. 
6cd0: 20 75 38 20 61 75 74 6f 45 51 50 3b 20 20 20 20   u8 autoEQP;    
6ce0: 20 20 20 20 20 20 20 20 2f 2a 20 52 75 6e 20 45          /* Run E
6cf0: 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41  XPLAIN QUERY PLA
6d00: 4e 20 70 72 69 6f 72 20 74 6f 20 73 65 61 63 68  N prior to seach
6d10: 20 53 51 4c 20 73 74 6d 74 20 2a 2f 0a 20 20 75   SQL stmt */.  u
6d20: 38 20 73 74 61 74 73 4f 6e 3b 20 20 20 20 20 20  8 statsOn;      
6d30: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f        /* True to
6d40: 20 64 69 73 70 6c 61 79 20 6d 65 6d 6f 72 79 20   display memory 
6d50: 73 74 61 74 73 20 62 65 66 6f 72 65 20 65 61 63  stats before eac
6d60: 68 20 66 69 6e 61 6c 69 7a 65 20 2a 2f 0a 20 20  h finalize */.  
6d70: 75 38 20 73 63 61 6e 73 74 61 74 73 4f 6e 3b 20  u8 scanstatsOn; 
6d80: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74         /* True t
6d90: 6f 20 64 69 73 70 6c 61 79 20 73 63 61 6e 20 73  o display scan s
6da0: 74 61 74 73 20 62 65 66 6f 72 65 20 65 61 63 68  tats before each
6db0: 20 66 69 6e 61 6c 69 7a 65 20 2a 2f 0a 20 20 75   finalize */.  u
6dc0: 38 20 6f 70 65 6e 4d 6f 64 65 3b 20 20 20 20 20  8 openMode;     
6dd0: 20 20 20 20 20 20 2f 2a 20 53 48 45 4c 4c 5f 4f        /* SHELL_O
6de0: 50 45 4e 5f 4e 4f 52 4d 41 4c 2c 20 5f 41 50 50  PEN_NORMAL, _APP
6df0: 45 4e 44 56 46 53 2c 20 6f 72 20 5f 5a 49 50 46  ENDVFS, or _ZIPF
6e00: 49 4c 45 20 2a 2f 0a 20 20 75 38 20 64 6f 58 64  ILE */.  u8 doXd
6e10: 67 4f 70 65 6e 3b 20 20 20 20 20 20 20 20 20 20  gOpen;          
6e20: 2f 2a 20 49 6e 76 6f 6b 65 20 73 74 61 72 74 2f  /* Invoke start/
6e30: 6f 70 65 6e 2f 78 64 67 2d 6f 70 65 6e 20 69 6e  open/xdg-open in
6e40: 20 6f 75 74 70 75 74 5f 72 65 73 65 74 28 29 20   output_reset() 
6e50: 2a 2f 0a 20 20 69 6e 74 20 6f 75 74 43 6f 75 6e  */.  int outCoun
6e60: 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52  t;          /* R
6e70: 65 76 65 72 74 20 74 6f 20 73 74 64 6f 75 74 20  evert to stdout 
6e80: 77 68 65 6e 20 72 65 61 63 68 69 6e 67 20 7a 65  when reaching ze
6e90: 72 6f 20 2a 2f 0a 20 20 69 6e 74 20 63 6e 74 3b  ro */.  int cnt;
6ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
6eb0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 63 6f  * Number of reco
6ec0: 72 64 73 20 64 69 73 70 6c 61 79 65 64 20 73 6f  rds displayed so
6ed0: 20 66 61 72 20 2a 2f 0a 20 20 46 49 4c 45 20 2a   far */.  FILE *
6ee0: 6f 75 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  out;            
6ef0: 20 2f 2a 20 57 72 69 74 65 20 72 65 73 75 6c 74   /* Write result
6f00: 73 20 68 65 72 65 20 2a 2f 0a 20 20 46 49 4c 45  s here */.  FILE
6f10: 20 2a 74 72 61 63 65 4f 75 74 3b 20 20 20 20 20   *traceOut;     
6f20: 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 66 6f 72     /* Output for
6f30: 20 73 71 6c 69 74 65 33 5f 74 72 61 63 65 28 29   sqlite3_trace()
6f40: 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 72 72 3b 20   */.  int nErr; 
6f50: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
6f60: 4e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73  Number of errors
6f70: 20 73 65 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 6d   seen */.  int m
6f80: 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ode;            
6f90: 20 20 2f 2a 20 41 6e 20 6f 75 74 70 75 74 20 6d    /* An output m
6fa0: 6f 64 65 20 73 65 74 74 69 6e 67 20 2a 2f 0a 20  ode setting */. 
6fb0: 20 69 6e 74 20 63 4d 6f 64 65 3b 20 20 20 20 20   int cMode;     
6fc0: 20 20 20 20 20 20 20 20 2f 2a 20 74 65 6d 70 6f          /* tempo
6fd0: 72 61 72 79 20 6f 75 74 70 75 74 20 6d 6f 64 65  rary output mode
6fe0: 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74   for the current
6ff0: 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20   query */.  int 
7000: 6e 6f 72 6d 61 6c 4d 6f 64 65 3b 20 20 20 20 20  normalMode;     
7010: 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 6d 6f 64     /* Output mod
7020: 65 20 62 65 66 6f 72 65 20 22 2e 65 78 70 6c 61  e before ".expla
7030: 69 6e 20 6f 6e 22 20 2a 2f 0a 20 20 69 6e 74 20  in on" */.  int 
7040: 77 72 69 74 61 62 6c 65 53 63 68 65 6d 61 3b 20  writableSchema; 
7050: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 50 52     /* True if PR
7060: 41 47 4d 41 20 77 72 69 74 61 62 6c 65 5f 73 63  AGMA writable_sc
7070: 68 65 6d 61 3d 4f 4e 20 2a 2f 0a 20 20 69 6e 74  hema=ON */.  int
7080: 20 73 68 6f 77 48 65 61 64 65 72 3b 20 20 20 20   showHeader;    
7090: 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 73      /* True to s
70a0: 68 6f 77 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  how column names
70b0: 20 69 6e 20 4c 69 73 74 20 6f 72 20 43 6f 6c 75   in List or Colu
70c0: 6d 6e 20 6d 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  mn mode */.  int
70d0: 20 6e 43 68 65 63 6b 3b 20 20 20 20 20 20 20 20   nCheck;        
70e0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
70f0: 20 22 2e 63 68 65 63 6b 22 20 63 6f 6d 6d 61 6e   ".check" comman
7100: 64 73 20 72 75 6e 20 2a 2f 0a 20 20 75 6e 73 69  ds run */.  unsi
7110: 67 6e 65 64 20 73 68 65 6c 6c 46 6c 67 73 3b 20  gned shellFlgs; 
7120: 20 20 20 2f 2a 20 56 61 72 69 6f 75 73 20 66 6c     /* Various fl
7130: 61 67 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ags */.  char *z
7140: 44 65 73 74 54 61 62 6c 65 3b 20 20 20 20 20 20  DestTable;      
7150: 2f 2a 20 4e 61 6d 65 20 6f 66 20 64 65 73 74 69  /* Name of desti
7160: 6e 61 74 69 6f 6e 20 74 61 62 6c 65 20 77 68 65  nation table whe
7170: 6e 20 4d 4f 44 45 5f 49 6e 73 65 72 74 20 2a 2f  n MODE_Insert */
7180: 0a 20 20 63 68 61 72 20 2a 7a 54 65 6d 70 46 69  .  char *zTempFi
7190: 6c 65 3b 20 20 20 20 20 20 20 2f 2a 20 54 65 6d  le;       /* Tem
71a0: 70 6f 72 61 72 79 20 66 69 6c 65 20 74 68 61 74  porary file that
71b0: 20 6d 69 67 68 74 20 6e 65 65 64 20 64 65 6c 65   might need dele
71c0: 74 69 6e 67 20 2a 2f 0a 20 20 63 68 61 72 20 7a  ting */.  char z
71d0: 54 65 73 74 63 61 73 65 5b 33 30 5d 3b 20 20 20  Testcase[30];   
71e0: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 63 75 72 72   /* Name of curr
71f0: 65 6e 74 20 74 65 73 74 20 63 61 73 65 20 2a 2f  ent test case */
7200: 0a 20 20 63 68 61 72 20 63 6f 6c 53 65 70 61 72  .  char colSepar
7210: 61 74 6f 72 5b 32 30 5d 3b 20 2f 2a 20 43 6f 6c  ator[20]; /* Col
7220: 75 6d 6e 20 73 65 70 61 72 61 74 6f 72 20 63 68  umn separator ch
7230: 61 72 61 63 74 65 72 20 66 6f 72 20 73 65 76 65  aracter for seve
7240: 72 61 6c 20 6d 6f 64 65 73 20 2a 2f 0a 20 20 63  ral modes */.  c
7250: 68 61 72 20 72 6f 77 53 65 70 61 72 61 74 6f 72  har rowSeparator
7260: 5b 32 30 5d 3b 20 2f 2a 20 52 6f 77 20 73 65 70  [20]; /* Row sep
7270: 61 72 61 74 6f 72 20 63 68 61 72 61 63 74 65 72  arator character
7280: 20 66 6f 72 20 4d 4f 44 45 5f 41 73 63 69 69 20   for MODE_Ascii 
7290: 2a 2f 0a 20 20 69 6e 74 20 63 6f 6c 57 69 64 74  */.  int colWidt
72a0: 68 5b 31 30 30 5d 3b 20 20 20 20 20 2f 2a 20 52  h[100];     /* R
72b0: 65 71 75 65 73 74 65 64 20 77 69 64 74 68 20 6f  equested width o
72c0: 66 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20 77 68  f each column wh
72d0: 65 6e 20 69 6e 20 63 6f 6c 75 6d 6e 20 6d 6f 64  en in column mod
72e0: 65 2a 2f 0a 20 20 69 6e 74 20 61 63 74 75 61 6c  e*/.  int actual
72f0: 57 69 64 74 68 5b 31 30 30 5d 3b 20 20 2f 2a 20  Width[100];  /* 
7300: 41 63 74 75 61 6c 20 77 69 64 74 68 20 6f 66 20  Actual width of 
7310: 65 61 63 68 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20  each column */. 
7320: 20 63 68 61 72 20 6e 75 6c 6c 56 61 6c 75 65 5b   char nullValue[
7330: 32 30 5d 3b 20 20 20 20 2f 2a 20 54 68 65 20 74  20];    /* The t
7340: 65 78 74 20 74 6f 20 70 72 69 6e 74 20 77 68 65  ext to print whe
7350: 6e 20 61 20 4e 55 4c 4c 20 63 6f 6d 65 73 20 62  n a NULL comes b
7360: 61 63 6b 20 66 72 6f 6d 0a 20 20 20 20 20 20 20  ack from.       
7370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7380: 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73    ** the databas
7390: 65 20 2a 2f 0a 20 20 63 68 61 72 20 6f 75 74 66  e */.  char outf
73a0: 69 6c 65 5b 46 49 4c 45 4e 41 4d 45 5f 4d 41 58  ile[FILENAME_MAX
73b0: 5d 3b 20 2f 2a 20 46 69 6c 65 6e 61 6d 65 20 66  ]; /* Filename f
73c0: 6f 72 20 2a 6f 75 74 20 2a 2f 0a 20 20 63 6f 6e  or *out */.  con
73d0: 73 74 20 63 68 61 72 20 2a 7a 44 62 46 69 6c 65  st char *zDbFile
73e0: 6e 61 6d 65 3b 20 20 20 20 2f 2a 20 6e 61 6d 65  name;    /* name
73f0: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
7400: 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20   file */.  char 
7410: 2a 7a 46 72 65 65 4f 6e 43 6c 6f 73 65 3b 20 20  *zFreeOnClose;  
7420: 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 6e 61         /* Filena
7430: 6d 65 20 74 6f 20 66 72 65 65 20 77 68 65 6e 20  me to free when 
7440: 63 6c 6f 73 69 6e 67 20 2a 2f 0a 20 20 63 6f 6e  closing */.  con
7450: 73 74 20 63 68 61 72 20 2a 7a 56 66 73 3b 20 20  st char *zVfs;  
7460: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
7470: 20 6f 66 20 56 46 53 20 74 6f 20 75 73 65 20 2a   of VFS to use *
7480: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  /.  sqlite3_stmt
7490: 20 2a 70 53 74 6d 74 3b 20 20 20 2f 2a 20 43 75   *pStmt;   /* Cu
74a0: 72 72 65 6e 74 20 73 74 61 74 65 6d 65 6e 74 20  rrent statement 
74b0: 69 66 20 61 6e 79 2e 20 2a 2f 0a 20 20 46 49 4c  if any. */.  FIL
74c0: 45 20 2a 70 4c 6f 67 3b 20 20 20 20 20 20 20 20  E *pLog;        
74d0: 20 20 20 20 2f 2a 20 57 72 69 74 65 20 6c 6f 67      /* Write log
74e0: 20 6f 75 74 70 75 74 20 68 65 72 65 20 2a 2f 0a   output here */.
74f0: 20 20 69 6e 74 20 2a 61 69 49 6e 64 65 6e 74 3b    int *aiIndent;
7500: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61           /* Arra
7510: 79 20 6f 66 20 69 6e 64 65 6e 74 73 20 75 73 65  y of indents use
7520: 64 20 69 6e 20 4d 4f 44 45 5f 45 78 70 6c 61 69  d in MODE_Explai
7530: 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 49 6e 64 65  n */.  int nInde
7540: 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  nt;           /*
7550: 20 53 69 7a 65 20 6f 66 20 61 72 72 61 79 20 61   Size of array a
7560: 69 49 6e 64 65 6e 74 5b 5d 20 2a 2f 0a 20 20 69  iIndent[] */.  i
7570: 6e 74 20 69 49 6e 64 65 6e 74 3b 20 20 20 20 20  nt iIndent;     
7580: 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
7590: 66 20 63 75 72 72 65 6e 74 20 6f 70 20 69 6e 20  f current op in 
75a0: 61 69 49 6e 64 65 6e 74 5b 5d 20 2a 2f 0a 23 69  aiIndent[] */.#i
75b0: 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
75c0: 5f 45 4e 41 42 4c 45 5f 53 45 53 53 49 4f 4e 29  _ENABLE_SESSION)
75d0: 0a 20 20 69 6e 74 20 6e 53 65 73 73 69 6f 6e 3b  .  int nSession;
75e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
75f0: 4e 75 6d 62 65 72 20 6f 66 20 61 63 74 69 76 65  Number of active
7600: 20 73 65 73 73 69 6f 6e 73 20 2a 2f 0a 20 20 4f   sessions */.  O
7610: 70 65 6e 53 65 73 73 69 6f 6e 20 61 53 65 73 73  penSession aSess
7620: 69 6f 6e 5b 34 5d 3b 20 20 2f 2a 20 41 72 72 61  ion[4];  /* Arra
7630: 79 20 6f 66 20 73 65 73 73 69 6f 6e 73 2e 20 20  y of sessions.  
7640: 5b 30 5d 20 69 73 20 69 6e 20 66 6f 63 75 73 2e  [0] is in focus.
7650: 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 45 78 70   */.#endif.  Exp
7660: 65 72 74 49 6e 66 6f 20 65 78 70 65 72 74 3b 20  ertInfo expert; 
7670: 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 69 64 20         /* Valid 
7680: 69 66 20 70 72 65 76 69 6f 75 73 20 63 6f 6d 6d  if previous comm
7690: 61 6e 64 20 77 61 73 20 22 2e 65 78 70 65 72 74  and was ".expert
76a0: 20 4f 50 54 2e 2e 2e 22 20 2a 2f 0a 7d 3b 0a 0a   OPT..." */.};..
76b0: 0a 2f 2a 20 41 6c 6c 6f 77 65 64 20 76 61 6c 75  ./* Allowed valu
76c0: 65 73 20 66 6f 72 20 53 68 65 6c 6c 53 74 61 74  es for ShellStat
76d0: 65 2e 61 75 74 6f 45 51 50 0a 2a 2f 0a 23 64 65  e.autoEQP.*/.#de
76e0: 66 69 6e 65 20 41 55 54 4f 45 51 50 5f 6f 66 66  fine AUTOEQP_off
76f0: 20 20 20 20 20 20 30 0a 23 64 65 66 69 6e 65 20        0.#define 
7700: 41 55 54 4f 45 51 50 5f 6f 6e 20 20 20 20 20 20  AUTOEQP_on      
7710: 20 31 0a 23 64 65 66 69 6e 65 20 41 55 54 4f 45   1.#define AUTOE
7720: 51 50 5f 74 72 69 67 67 65 72 20 20 32 0a 23 64  QP_trigger  2.#d
7730: 65 66 69 6e 65 20 41 55 54 4f 45 51 50 5f 66 75  efine AUTOEQP_fu
7740: 6c 6c 20 20 20 20 20 33 0a 0a 2f 2a 20 41 6c 6c  ll     3../* All
7750: 6f 77 65 64 20 76 61 6c 75 65 73 20 66 6f 72 20  owed values for 
7760: 53 68 65 6c 6c 53 74 61 74 65 2e 6f 70 65 6e 4d  ShellState.openM
7770: 6f 64 65 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 53  ode.*/.#define S
7780: 48 45 4c 4c 5f 4f 50 45 4e 5f 55 4e 53 50 45 43  HELL_OPEN_UNSPEC
7790: 20 20 20 20 20 30 20 20 20 20 20 20 2f 2a 20 4e       0      /* N
77a0: 6f 20 6f 70 65 6e 2d 6d 6f 64 65 20 73 70 65 63  o open-mode spec
77b0: 69 66 69 65 64 20 2a 2f 0a 23 64 65 66 69 6e 65  ified */.#define
77c0: 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f 4e 4f 52 4d   SHELL_OPEN_NORM
77d0: 41 4c 20 20 20 20 20 31 20 20 20 20 20 20 2f 2a  AL     1      /*
77e0: 20 4e 6f 72 6d 61 6c 20 64 61 74 61 62 61 73 65   Normal database
77f0: 20 66 69 6c 65 20 2a 2f 0a 23 64 65 66 69 6e 65   file */.#define
7800: 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f 41 50 50 45   SHELL_OPEN_APPE
7810: 4e 44 56 46 53 20 20 32 20 20 20 20 20 20 2f 2a  NDVFS  2      /*
7820: 20 55 73 65 20 61 70 70 65 6e 64 76 66 73 20 2a   Use appendvfs *
7830: 2f 0a 23 64 65 66 69 6e 65 20 53 48 45 4c 4c 5f  /.#define SHELL_
7840: 4f 50 45 4e 5f 5a 49 50 46 49 4c 45 20 20 20 20  OPEN_ZIPFILE    
7850: 33 20 20 20 20 20 20 2f 2a 20 55 73 65 20 74 68  3      /* Use th
7860: 65 20 7a 69 70 66 69 6c 65 20 76 69 72 74 75 61  e zipfile virtua
7870: 6c 20 74 61 62 6c 65 20 2a 2f 0a 0a 2f 2a 0a 2a  l table */../*.*
7880: 2a 20 54 68 65 73 65 20 61 72 65 20 74 68 65 20  * These are the 
7890: 61 6c 6c 6f 77 65 64 20 73 68 65 6c 6c 46 6c 67  allowed shellFlg
78a0: 73 20 76 61 6c 75 65 73 0a 2a 2f 0a 23 64 65 66  s values.*/.#def
78b0: 69 6e 65 20 53 48 46 4c 47 5f 50 61 67 65 63 61  ine SHFLG_Pageca
78c0: 63 68 65 20 20 20 20 20 20 30 78 30 30 30 30 30  che      0x00000
78d0: 30 30 31 20 2f 2a 20 54 68 65 20 2d 2d 70 61 67  001 /* The --pag
78e0: 65 63 61 63 68 65 20 6f 70 74 69 6f 6e 20 69 73  ecache option is
78f0: 20 75 73 65 64 20 2a 2f 0a 23 64 65 66 69 6e 65   used */.#define
7900: 20 53 48 46 4c 47 5f 4c 6f 6f 6b 61 73 69 64 65   SHFLG_Lookaside
7910: 20 20 20 20 20 20 30 78 30 30 30 30 30 30 30 32        0x00000002
7920: 20 2f 2a 20 4c 6f 6f 6b 61 73 69 64 65 20 6d 65   /* Lookaside me
7930: 6d 6f 72 79 20 69 73 20 75 73 65 64 20 2a 2f 0a  mory is used */.
7940: 23 64 65 66 69 6e 65 20 53 48 46 4c 47 5f 42 61  #define SHFLG_Ba
7950: 63 6b 73 6c 61 73 68 20 20 20 20 20 20 30 78 30  ckslash      0x0
7960: 30 30 30 30 30 30 34 20 2f 2a 20 54 68 65 20 2d  0000004 /* The -
7970: 2d 62 61 63 6b 73 6c 61 73 68 20 6f 70 74 69 6f  -backslash optio
7980: 6e 20 69 73 20 75 73 65 64 20 2a 2f 0a 23 64 65  n is used */.#de
7990: 66 69 6e 65 20 53 48 46 4c 47 5f 50 72 65 73 65  fine SHFLG_Prese
79a0: 72 76 65 52 6f 77 69 64 20 20 30 78 30 30 30 30  rveRowid  0x0000
79b0: 30 30 30 38 20 2f 2a 20 2e 64 75 6d 70 20 70 72  0008 /* .dump pr
79c0: 65 73 65 72 76 65 73 20 72 6f 77 69 64 20 76 61  eserves rowid va
79d0: 6c 75 65 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20  lues */.#define 
79e0: 53 48 46 4c 47 5f 4e 65 77 6c 69 6e 65 73 20 20  SHFLG_Newlines  
79f0: 20 20 20 20 20 30 78 30 30 30 30 30 30 31 30 20       0x00000010 
7a00: 2f 2a 20 2e 64 75 6d 70 20 2d 2d 6e 65 77 6c 69  /* .dump --newli
7a10: 6e 65 20 66 6c 61 67 20 2a 2f 0a 23 64 65 66 69  ne flag */.#defi
7a20: 6e 65 20 53 48 46 4c 47 5f 43 6f 75 6e 74 43 68  ne SHFLG_CountCh
7a30: 61 6e 67 65 73 20 20 20 30 78 30 30 30 30 30 30  anges   0x000000
7a40: 32 30 20 2f 2a 20 2e 63 68 61 6e 67 65 73 20 73  20 /* .changes s
7a50: 65 74 74 69 6e 67 20 2a 2f 0a 23 64 65 66 69 6e  etting */.#defin
7a60: 65 20 53 48 46 4c 47 5f 45 63 68 6f 20 20 20 20  e SHFLG_Echo    
7a70: 20 20 20 20 20 20 20 30 78 30 30 30 30 30 30 34         0x0000004
7a80: 30 20 2f 2a 20 2e 65 63 68 6f 20 6f 72 20 2d 2d  0 /* .echo or --
7a90: 65 63 68 6f 20 73 65 74 74 69 6e 67 20 2a 2f 0a  echo setting */.
7aa0: 0a 2f 2a 0a 2a 2a 20 4d 61 63 72 6f 73 20 66 6f  ./*.** Macros fo
7ab0: 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20 73 65  r testing and se
7ac0: 74 74 69 6e 67 20 73 68 65 6c 6c 46 6c 67 73 0a  tting shellFlgs.
7ad0: 2a 2f 0a 23 64 65 66 69 6e 65 20 53 68 65 6c 6c  */.#define Shell
7ae0: 48 61 73 46 6c 61 67 28 50 2c 58 29 20 20 20 20  HasFlag(P,X)    
7af0: 28 28 28 50 29 2d 3e 73 68 65 6c 6c 46 6c 67 73  (((P)->shellFlgs
7b00: 20 26 20 28 58 29 29 21 3d 30 29 0a 23 64 65 66   & (X))!=0).#def
7b10: 69 6e 65 20 53 68 65 6c 6c 53 65 74 46 6c 61 67  ine ShellSetFlag
7b20: 28 50 2c 58 29 20 20 20 20 28 28 50 29 2d 3e 73  (P,X)    ((P)->s
7b30: 68 65 6c 6c 46 6c 67 73 7c 3d 28 58 29 29 0a 23  hellFlgs|=(X)).#
7b40: 64 65 66 69 6e 65 20 53 68 65 6c 6c 43 6c 65 61  define ShellClea
7b50: 72 46 6c 61 67 28 50 2c 58 29 20 20 28 28 50 29  rFlag(P,X)  ((P)
7b60: 2d 3e 73 68 65 6c 6c 46 6c 67 73 26 3d 28 7e 28  ->shellFlgs&=(~(
7b70: 58 29 29 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 73  X)))../*.** Thes
7b80: 65 20 61 72 65 20 74 68 65 20 61 6c 6c 6f 77 65  e are the allowe
7b90: 64 20 6d 6f 64 65 73 2e 0a 2a 2f 0a 23 64 65 66  d modes..*/.#def
7ba0: 69 6e 65 20 4d 4f 44 45 5f 4c 69 6e 65 20 20 20  ine MODE_Line   
7bb0: 20 20 30 20 20 2f 2a 20 4f 6e 65 20 63 6f 6c 75    0  /* One colu
7bc0: 6d 6e 20 70 65 72 20 6c 69 6e 65 2e 20 20 42 6c  mn per line.  Bl
7bd0: 61 6e 6b 20 6c 69 6e 65 20 62 65 74 77 65 65 6e  ank line between
7be0: 20 72 65 63 6f 72 64 73 20 2a 2f 0a 23 64 65 66   records */.#def
7bf0: 69 6e 65 20 4d 4f 44 45 5f 43 6f 6c 75 6d 6e 20  ine MODE_Column 
7c00: 20 20 31 20 20 2f 2a 20 4f 6e 65 20 72 65 63 6f    1  /* One reco
7c10: 72 64 20 70 65 72 20 6c 69 6e 65 20 69 6e 20 6e  rd per line in n
7c20: 65 61 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 23  eat columns */.#
7c30: 64 65 66 69 6e 65 20 4d 4f 44 45 5f 4c 69 73 74  define MODE_List
7c40: 20 20 20 20 20 32 20 20 2f 2a 20 4f 6e 65 20 72       2  /* One r
7c50: 65 63 6f 72 64 20 70 65 72 20 6c 69 6e 65 20 77  ecord per line w
7c60: 69 74 68 20 61 20 73 65 70 61 72 61 74 6f 72 20  ith a separator 
7c70: 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 4f 44 45 5f  */.#define MODE_
7c80: 53 65 6d 69 20 20 20 20 20 33 20 20 2f 2a 20 53  Semi     3  /* S
7c90: 61 6d 65 20 61 73 20 4d 4f 44 45 5f 4c 69 73 74  ame as MODE_List
7ca0: 20 62 75 74 20 61 70 70 65 6e 64 20 22 3b 22 20   but append ";" 
7cb0: 74 6f 20 65 61 63 68 20 6c 69 6e 65 20 2a 2f 0a  to each line */.
7cc0: 23 64 65 66 69 6e 65 20 4d 4f 44 45 5f 48 74 6d  #define MODE_Htm
7cd0: 6c 20 20 20 20 20 34 20 20 2f 2a 20 47 65 6e 65  l     4  /* Gene
7ce0: 72 61 74 65 20 61 6e 20 58 48 54 4d 4c 20 74 61  rate an XHTML ta
7cf0: 62 6c 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4d  ble */.#define M
7d00: 4f 44 45 5f 49 6e 73 65 72 74 20 20 20 35 20 20  ODE_Insert   5  
7d10: 2f 2a 20 47 65 6e 65 72 61 74 65 20 53 51 4c 20  /* Generate SQL 
7d20: 22 69 6e 73 65 72 74 22 20 73 74 61 74 65 6d 65  "insert" stateme
7d30: 6e 74 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4d  nts */.#define M
7d40: 4f 44 45 5f 51 75 6f 74 65 20 20 20 20 36 20 20  ODE_Quote    6  
7d50: 2f 2a 20 51 75 6f 74 65 20 76 61 6c 75 65 73 20  /* Quote values 
7d60: 61 73 20 66 6f 72 20 53 51 4c 20 2a 2f 0a 23 64  as for SQL */.#d
7d70: 65 66 69 6e 65 20 4d 4f 44 45 5f 54 63 6c 20 20  efine MODE_Tcl  
7d80: 20 20 20 20 37 20 20 2f 2a 20 47 65 6e 65 72 61      7  /* Genera
7d90: 74 65 20 41 4e 53 49 2d 43 20 6f 72 20 54 43 4c  te ANSI-C or TCL
7da0: 20 71 75 6f 74 65 64 20 65 6c 65 6d 65 6e 74 73   quoted elements
7db0: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 4f 44 45   */.#define MODE
7dc0: 5f 43 73 76 20 20 20 20 20 20 38 20 20 2f 2a 20  _Csv      8  /* 
7dd0: 51 75 6f 74 65 20 73 74 72 69 6e 67 73 2c 20 6e  Quote strings, n
7de0: 75 6d 62 65 72 73 20 61 72 65 20 70 6c 61 69 6e  umbers are plain
7df0: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 4f 44 45   */.#define MODE
7e00: 5f 45 78 70 6c 61 69 6e 20 20 39 20 20 2f 2a 20  _Explain  9  /* 
7e10: 4c 69 6b 65 20 4d 4f 44 45 5f 43 6f 6c 75 6d 6e  Like MODE_Column
7e20: 2c 20 62 75 74 20 64 6f 20 6e 6f 74 20 74 72 75  , but do not tru
7e30: 6e 63 61 74 65 20 64 61 74 61 20 2a 2f 0a 23 64  ncate data */.#d
7e40: 65 66 69 6e 65 20 4d 4f 44 45 5f 41 73 63 69 69  efine MODE_Ascii
7e50: 20 20 20 31 30 20 20 2f 2a 20 55 73 65 20 41 53     10  /* Use AS
7e60: 43 49 49 20 75 6e 69 74 20 61 6e 64 20 72 65 63  CII unit and rec
7e70: 6f 72 64 20 73 65 70 61 72 61 74 6f 72 73 20 28  ord separators (
7e80: 30 78 31 46 2f 30 78 31 45 29 20 2a 2f 0a 23 64  0x1F/0x1E) */.#d
7e90: 65 66 69 6e 65 20 4d 4f 44 45 5f 50 72 65 74 74  efine MODE_Prett
7ea0: 79 20 20 31 31 20 20 2f 2a 20 50 72 65 74 74 79  y  11  /* Pretty
7eb0: 2d 70 72 69 6e 74 20 73 63 68 65 6d 61 73 20 2a  -print schemas *
7ec0: 2f 0a 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  /..static const 
7ed0: 63 68 61 72 20 2a 6d 6f 64 65 44 65 73 63 72 5b  char *modeDescr[
7ee0: 5d 20 3d 20 7b 0a 20 20 22 6c 69 6e 65 22 2c 0a  ] = {.  "line",.
7ef0: 20 20 22 63 6f 6c 75 6d 6e 22 2c 0a 20 20 22 6c    "column",.  "l
7f00: 69 73 74 22 2c 0a 20 20 22 73 65 6d 69 22 2c 0a  ist",.  "semi",.
7f10: 20 20 22 68 74 6d 6c 22 2c 0a 20 20 22 69 6e 73    "html",.  "ins
7f20: 65 72 74 22 2c 0a 20 20 22 71 75 6f 74 65 22 2c  ert",.  "quote",
7f30: 0a 20 20 22 74 63 6c 22 2c 0a 20 20 22 63 73 76  .  "tcl",.  "csv
7f40: 22 2c 0a 20 20 22 65 78 70 6c 61 69 6e 22 2c 0a  ",.  "explain",.
7f50: 20 20 22 61 73 63 69 69 22 2c 0a 20 20 22 70 72    "ascii",.  "pr
7f60: 65 74 74 79 70 72 69 6e 74 22 2c 0a 7d 3b 0a 0a  ettyprint",.};..
7f70: 2f 2a 0a 2a 2a 20 54 68 65 73 65 20 61 72 65 20  /*.** These are 
7f80: 74 68 65 20 63 6f 6c 75 6d 6e 2f 72 6f 77 2f 6c  the column/row/l
7f90: 69 6e 65 20 73 65 70 61 72 61 74 6f 72 73 20 75  ine separators u
7fa0: 73 65 64 20 62 79 20 74 68 65 20 76 61 72 69 6f  sed by the vario
7fb0: 75 73 0a 2a 2a 20 69 6d 70 6f 72 74 2f 65 78 70  us.** import/exp
7fc0: 6f 72 74 20 6d 6f 64 65 73 2e 0a 2a 2f 0a 23 64  ort modes..*/.#d
7fd0: 65 66 69 6e 65 20 53 45 50 5f 43 6f 6c 75 6d 6e  efine SEP_Column
7fe0: 20 20 20 20 22 7c 22 0a 23 64 65 66 69 6e 65 20      "|".#define 
7ff0: 53 45 50 5f 52 6f 77 20 20 20 20 20 20 20 22 5c  SEP_Row       "\
8000: 6e 22 0a 23 64 65 66 69 6e 65 20 53 45 50 5f 54  n".#define SEP_T
8010: 61 62 20 20 20 20 20 20 20 22 5c 74 22 0a 23 64  ab       "\t".#d
8020: 65 66 69 6e 65 20 53 45 50 5f 53 70 61 63 65 20  efine SEP_Space 
8030: 20 20 20 20 22 20 22 0a 23 64 65 66 69 6e 65 20      " ".#define 
8040: 53 45 50 5f 43 6f 6d 6d 61 20 20 20 20 20 22 2c  SEP_Comma     ",
8050: 22 0a 23 64 65 66 69 6e 65 20 53 45 50 5f 43 72  ".#define SEP_Cr
8060: 4c 66 20 20 20 20 20 20 22 5c 72 5c 6e 22 0a 23  Lf      "\r\n".#
8070: 64 65 66 69 6e 65 20 53 45 50 5f 55 6e 69 74 20  define SEP_Unit 
8080: 20 20 20 20 20 22 5c 78 31 46 22 0a 23 64 65 66       "\x1F".#def
8090: 69 6e 65 20 53 45 50 5f 52 65 63 6f 72 64 20 20  ine SEP_Record  
80a0: 20 20 22 5c 78 31 45 22 0a 0a 2f 2a 0a 2a 2a 20    "\x1E"../*.** 
80b0: 41 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20 74  A callback for t
80c0: 68 65 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 29  he sqlite3_log()
80d0: 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2f 0a 73   interface..*/.s
80e0: 74 61 74 69 63 20 76 6f 69 64 20 73 68 65 6c 6c  tatic void shell
80f0: 4c 6f 67 28 76 6f 69 64 20 2a 70 41 72 67 2c 20  Log(void *pArg, 
8100: 69 6e 74 20 69 45 72 72 43 6f 64 65 2c 20 63 6f  int iErrCode, co
8110: 6e 73 74 20 63 68 61 72 20 2a 7a 4d 73 67 29 7b  nst char *zMsg){
8120: 0a 20 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 70  .  ShellState *p
8130: 20 3d 20 28 53 68 65 6c 6c 53 74 61 74 65 2a 29   = (ShellState*)
8140: 70 41 72 67 3b 0a 20 20 69 66 28 20 70 2d 3e 70  pArg;.  if( p->p
8150: 4c 6f 67 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  Log==0 ) return;
8160: 0a 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70  .  utf8_printf(p
8170: 2d 3e 70 4c 6f 67 2c 20 22 28 25 64 29 20 25 73  ->pLog, "(%d) %s
8180: 5c 6e 22 2c 20 69 45 72 72 43 6f 64 65 2c 20 7a  \n", iErrCode, z
8190: 4d 73 67 29 3b 0a 20 20 66 66 6c 75 73 68 28 70  Msg);.  fflush(p
81a0: 2d 3e 70 4c 6f 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  ->pLog);.}../*.*
81b0: 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 3a 20  * SQL function: 
81c0: 20 73 68 65 6c 6c 5f 70 75 74 73 6e 6c 28 58 29   shell_putsnl(X)
81d0: 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65  .**.** Write the
81e0: 20 74 65 78 74 20 58 20 74 6f 20 74 68 65 20 73   text X to the s
81f0: 63 72 65 65 6e 20 28 6f 72 20 77 68 61 74 65 76  creen (or whatev
8200: 65 72 20 6f 75 74 70 75 74 20 69 73 20 62 65 69  er output is bei
8210: 6e 67 20 64 69 72 65 63 74 65 64 29 0a 2a 2a 20  ng directed).** 
8220: 61 64 64 69 6e 67 20 61 20 6e 65 77 6c 69 6e 65  adding a newline
8230: 20 61 74 20 74 68 65 20 65 6e 64 2c 20 61 6e 64   at the end, and
8240: 20 74 68 65 6e 20 72 65 74 75 72 6e 20 58 2e 0a   then return X..
8250: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
8260: 68 65 6c 6c 50 75 74 73 46 75 6e 63 28 0a 20 20  hellPutsFunc(.  
8270: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
8280: 2a 70 43 74 78 2c 0a 20 20 69 6e 74 20 6e 56 61  *pCtx,.  int nVa
8290: 6c 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  l,.  sqlite3_val
82a0: 75 65 20 2a 2a 61 70 56 61 6c 0a 29 7b 0a 20 20  ue **apVal.){.  
82b0: 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 20 3d 20  ShellState *p = 
82c0: 28 53 68 65 6c 6c 53 74 61 74 65 2a 29 73 71 6c  (ShellState*)sql
82d0: 69 74 65 33 5f 75 73 65 72 5f 64 61 74 61 28 70  ite3_user_data(p
82e0: 43 74 78 29 3b 0a 20 20 75 74 66 38 5f 70 72 69  Ctx);.  utf8_pri
82f0: 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 5c  ntf(p->out, "%s\
8300: 6e 22 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  n", sqlite3_valu
8310: 65 5f 74 65 78 74 28 61 70 56 61 6c 5b 30 5d 29  e_text(apVal[0])
8320: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73  );.  sqlite3_res
8330: 75 6c 74 5f 76 61 6c 75 65 28 70 43 74 78 2c 20  ult_value(pCtx, 
8340: 61 70 56 61 6c 5b 30 5d 29 3b 0a 7d 0a 0a 2f 2a  apVal[0]);.}../*
8350: 0a 2a 2a 20 4f 75 74 70 75 74 20 74 68 65 20 67  .** Output the g
8360: 69 76 65 6e 20 73 74 72 69 6e 67 20 61 73 20 61  iven string as a
8370: 20 68 65 78 2d 65 6e 63 6f 64 65 64 20 62 6c 6f   hex-encoded blo
8380: 62 20 28 65 67 2e 20 58 27 31 32 33 34 27 20 29  b (eg. X'1234' )
8390: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
83a0: 6f 75 74 70 75 74 5f 68 65 78 5f 62 6c 6f 62 28  output_hex_blob(
83b0: 46 49 4c 45 20 2a 6f 75 74 2c 20 63 6f 6e 73 74  FILE *out, const
83c0: 20 76 6f 69 64 20 2a 70 42 6c 6f 62 2c 20 69 6e   void *pBlob, in
83d0: 74 20 6e 42 6c 6f 62 29 7b 0a 20 20 69 6e 74 20  t nBlob){.  int 
83e0: 69 3b 0a 20 20 63 68 61 72 20 2a 7a 42 6c 6f 62  i;.  char *zBlob
83f0: 20 3d 20 28 63 68 61 72 20 2a 29 70 42 6c 6f 62   = (char *)pBlob
8400: 3b 0a 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f  ;.  raw_printf(o
8410: 75 74 2c 22 58 27 22 29 3b 0a 20 20 66 6f 72 28  ut,"X'");.  for(
8420: 69 3d 30 3b 20 69 3c 6e 42 6c 6f 62 3b 20 69 2b  i=0; i<nBlob; i+
8430: 2b 29 7b 20 72 61 77 5f 70 72 69 6e 74 66 28 6f  +){ raw_printf(o
8440: 75 74 2c 22 25 30 32 78 22 2c 7a 42 6c 6f 62 5b  ut,"%02x",zBlob[
8450: 69 5d 26 30 78 66 66 29 3b 20 7d 0a 20 20 72 61  i]&0xff); }.  ra
8460: 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 22 27 22  w_printf(out,"'"
8470: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64  );.}../*.** Find
8480: 20 61 20 73 74 72 69 6e 67 20 74 68 61 74 20 69   a string that i
8490: 73 20 6e 6f 74 20 66 6f 75 6e 64 20 61 6e 79 77  s not found anyw
84a0: 68 65 72 65 20 69 6e 20 7a 5b 5d 2e 20 20 52 65  here in z[].  Re
84b0: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 0a 2a  turn a pointer.*
84c0: 2a 20 74 6f 20 74 68 61 74 20 73 74 72 69 6e 67  * to that string
84d0: 2e 0a 2a 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 75  ..**.** Try to u
84e0: 73 65 20 7a 41 20 61 6e 64 20 7a 42 20 66 69 72  se zA and zB fir
84f0: 73 74 2e 20 20 49 66 20 62 6f 74 68 20 6f 66 20  st.  If both of 
8500: 74 68 6f 73 65 20 61 72 65 20 61 6c 72 65 61 64  those are alread
8510: 79 20 66 6f 75 6e 64 20 69 6e 20 7a 5b 5d 0a 2a  y found in z[].*
8520: 2a 20 74 68 65 6e 20 6d 61 6b 65 20 75 70 20 73  * then make up s
8530: 6f 6d 65 20 73 74 72 69 6e 67 20 61 6e 64 20 73  ome string and s
8540: 74 6f 72 65 20 69 74 20 69 6e 20 74 68 65 20 62  tore it in the b
8550: 75 66 66 65 72 20 7a 42 75 66 2e 0a 2a 2f 0a 73  uffer zBuf..*/.s
8560: 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
8570: 20 2a 75 6e 75 73 65 64 5f 73 74 72 69 6e 67 28   *unused_string(
8580: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
8590: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
85a0: 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 6d       /* Result m
85b0: 75 73 74 20 6e 6f 74 20 61 70 70 65 61 72 20 61  ust not appear a
85c0: 6e 79 77 68 65 72 65 20 69 6e 20 7a 20 2a 2f 0a  nywhere in z */.
85d0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41    const char *zA
85e0: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 42  , const char *zB
85f0: 2c 20 20 20 2f 2a 20 54 72 79 20 74 68 65 73 65  ,   /* Try these
8600: 20 66 69 72 73 74 20 2a 2f 0a 20 20 63 68 61 72   first */.  char
8610: 20 2a 7a 42 75 66 20 20 20 20 20 20 20 20 20 20   *zBuf          
8620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8630: 20 53 70 61 63 65 20 74 6f 20 73 74 6f 72 65 20   Space to store 
8640: 61 20 67 65 6e 65 72 61 74 65 64 20 73 74 72 69  a generated stri
8650: 6e 67 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69 67  ng */.){.  unsig
8660: 6e 65 64 20 69 20 3d 20 30 3b 0a 20 20 69 66 28  ned i = 0;.  if(
8670: 20 73 74 72 73 74 72 28 7a 2c 20 7a 41 29 3d 3d   strstr(z, zA)==
8680: 30 20 29 20 72 65 74 75 72 6e 20 7a 41 3b 0a 20  0 ) return zA;. 
8690: 20 69 66 28 20 73 74 72 73 74 72 28 7a 2c 20 7a   if( strstr(z, z
86a0: 42 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 7a  B)==0 ) return z
86b0: 42 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 73 71 6c  B;.  do{.    sql
86c0: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 32 30  ite3_snprintf(20
86d0: 2c 7a 42 75 66 2c 22 28 25 73 25 75 29 22 2c 20  ,zBuf,"(%s%u)", 
86e0: 7a 41 2c 20 69 2b 2b 29 3b 0a 20 20 7d 77 68 69  zA, i++);.  }whi
86f0: 6c 65 28 20 73 74 72 73 74 72 28 7a 2c 7a 42 75  le( strstr(z,zBu
8700: 66 29 21 3d 30 20 29 3b 0a 20 20 72 65 74 75 72  f)!=0 );.  retur
8710: 6e 20 7a 42 75 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n zBuf;.}../*.**
8720: 20 4f 75 74 70 75 74 20 74 68 65 20 67 69 76 65   Output the give
8730: 6e 20 73 74 72 69 6e 67 20 61 73 20 61 20 71 75  n string as a qu
8740: 6f 74 65 64 20 73 74 72 69 6e 67 20 75 73 69 6e  oted string usin
8750: 67 20 53 51 4c 20 71 75 6f 74 69 6e 67 20 63 6f  g SQL quoting co
8760: 6e 76 65 6e 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a  nventions..**.**
8770: 20 53 65 65 20 61 6c 73 6f 3a 20 6f 75 74 70 75   See also: outpu
8780: 74 5f 71 75 6f 74 65 64 5f 65 73 63 61 70 65 64  t_quoted_escaped
8790: 5f 73 74 72 69 6e 67 28 29 0a 2a 2f 0a 73 74 61  _string().*/.sta
87a0: 74 69 63 20 76 6f 69 64 20 6f 75 74 70 75 74 5f  tic void output_
87b0: 71 75 6f 74 65 64 5f 73 74 72 69 6e 67 28 46 49  quoted_string(FI
87c0: 4c 45 20 2a 6f 75 74 2c 20 63 6f 6e 73 74 20 63  LE *out, const c
87d0: 68 61 72 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 69  har *z){.  int i
87e0: 3b 0a 20 20 63 68 61 72 20 63 3b 0a 20 20 73 65  ;.  char c;.  se
87f0: 74 42 69 6e 61 72 79 4d 6f 64 65 28 6f 75 74 2c  tBinaryMode(out,
8800: 20 31 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20   1);.  for(i=0; 
8810: 28 63 20 3d 20 7a 5b 69 5d 29 21 3d 30 20 26 26  (c = z[i])!=0 &&
8820: 20 63 21 3d 27 5c 27 27 3b 20 69 2b 2b 29 7b 7d   c!='\''; i++){}
8830: 0a 20 20 69 66 28 20 63 3d 3d 30 20 29 7b 0a 20  .  if( c==0 ){. 
8840: 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 6f     utf8_printf(o
8850: 75 74 2c 22 27 25 73 27 22 2c 7a 29 3b 0a 20 20  ut,"'%s'",z);.  
8860: 7d 65 6c 73 65 7b 0a 20 20 20 20 72 61 77 5f 70  }else{.    raw_p
8870: 72 69 6e 74 66 28 6f 75 74 2c 20 22 27 22 29 3b  rintf(out, "'");
8880: 0a 20 20 20 20 77 68 69 6c 65 28 20 2a 7a 20 29  .    while( *z )
8890: 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  {.      for(i=0;
88a0: 20 28 63 20 3d 20 7a 5b 69 5d 29 21 3d 30 20 26   (c = z[i])!=0 &
88b0: 26 20 63 21 3d 27 5c 27 27 3b 20 69 2b 2b 29 7b  & c!='\''; i++){
88c0: 7d 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27  }.      if( c=='
88d0: 5c 27 27 20 29 20 69 2b 2b 3b 0a 20 20 20 20 20  \'' ) i++;.     
88e0: 20 69 66 28 20 69 20 29 7b 0a 20 20 20 20 20 20   if( i ){.      
88f0: 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 6f 75    utf8_printf(ou
8900: 74 2c 20 22 25 2e 2a 73 22 2c 20 69 2c 20 7a 29  t, "%.*s", i, z)
8910: 3b 0a 20 20 20 20 20 20 20 20 7a 20 2b 3d 20 69  ;.        z += i
8920: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
8930: 69 66 28 20 63 3d 3d 27 5c 27 27 20 29 7b 0a 20  if( c=='\'' ){. 
8940: 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74         raw_print
8950: 66 28 6f 75 74 2c 20 22 27 22 29 3b 0a 20 20 20  f(out, "'");.   
8960: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
8970: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
8980: 20 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20   c==0 ){.       
8990: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
89a0: 20 20 20 20 20 20 7a 2b 2b 3b 0a 20 20 20 20 7d        z++;.    }
89b0: 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28  .    raw_printf(
89c0: 6f 75 74 2c 20 22 27 22 29 3b 0a 20 20 7d 0a 20  out, "'");.  }. 
89d0: 20 73 65 74 54 65 78 74 4d 6f 64 65 28 6f 75 74   setTextMode(out
89e0: 2c 20 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f  , 1);.}../*.** O
89f0: 75 74 70 75 74 20 74 68 65 20 67 69 76 65 6e 20  utput the given 
8a00: 73 74 72 69 6e 67 20 61 73 20 61 20 71 75 6f 74  string as a quot
8a10: 65 64 20 73 74 72 69 6e 67 20 75 73 69 6e 67 20  ed string using 
8a20: 53 51 4c 20 71 75 6f 74 69 6e 67 20 63 6f 6e 76  SQL quoting conv
8a30: 65 6e 74 69 6f 6e 73 2e 0a 2a 2a 20 41 64 64 69  entions..** Addi
8a40: 74 69 6f 6e 61 6c 6c 6c 79 20 2c 20 65 73 63 61  tionallly , esca
8a50: 70 65 20 74 68 65 20 22 5c 6e 22 20 61 6e 64 20  pe the "\n" and 
8a60: 22 5c 72 22 20 63 68 61 72 61 63 74 65 72 73 20  "\r" characters 
8a70: 73 6f 20 74 68 61 74 20 74 68 65 79 20 64 6f 20  so that they do 
8a80: 6e 6f 74 0a 2a 2a 20 67 65 74 20 63 6f 72 72 75  not.** get corru
8a90: 70 74 65 64 20 62 79 20 65 6e 64 2d 6f 66 2d 6c  pted by end-of-l
8aa0: 69 6e 65 20 74 72 61 6e 73 6c 61 74 69 6f 6e 20  ine translation 
8ab0: 66 61 63 69 6c 69 74 69 65 73 20 69 6e 20 73 6f  facilities in so
8ac0: 6d 65 20 6f 70 65 72 61 74 69 6e 67 0a 2a 2a 20  me operating.** 
8ad0: 73 79 73 74 65 6d 73 2e 0a 2a 2a 0a 2a 2a 20 54  systems..**.** T
8ae0: 68 69 73 20 69 73 20 6c 69 6b 65 20 6f 75 74 70  his is like outp
8af0: 75 74 5f 71 75 6f 74 65 64 5f 73 74 72 69 6e 67  ut_quoted_string
8b00: 28 29 20 62 75 74 20 77 69 74 68 20 74 68 65 20  () but with the 
8b10: 61 64 64 69 74 69 6f 6e 20 6f 66 20 74 68 65 20  addition of the 
8b20: 5c 72 5c 6e 0a 2a 2a 20 65 73 63 61 70 65 20 6d  \r\n.** escape m
8b30: 65 63 68 61 6e 69 73 6d 2e 0a 2a 2f 0a 73 74 61  echanism..*/.sta
8b40: 74 69 63 20 76 6f 69 64 20 6f 75 74 70 75 74 5f  tic void output_
8b50: 71 75 6f 74 65 64 5f 65 73 63 61 70 65 64 5f 73  quoted_escaped_s
8b60: 74 72 69 6e 67 28 46 49 4c 45 20 2a 6f 75 74 2c  tring(FILE *out,
8b70: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b   const char *z){
8b80: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 68 61 72  .  int i;.  char
8b90: 20 63 3b 0a 20 20 73 65 74 42 69 6e 61 72 79 4d   c;.  setBinaryM
8ba0: 6f 64 65 28 6f 75 74 2c 20 31 29 3b 0a 20 20 66  ode(out, 1);.  f
8bb0: 6f 72 28 69 3d 30 3b 20 28 63 20 3d 20 7a 5b 69  or(i=0; (c = z[i
8bc0: 5d 29 21 3d 30 20 26 26 20 63 21 3d 27 5c 27 27  ])!=0 && c!='\''
8bd0: 20 26 26 20 63 21 3d 27 5c 6e 27 20 26 26 20 63   && c!='\n' && c
8be0: 21 3d 27 5c 72 27 3b 20 69 2b 2b 29 7b 7d 0a 20  !='\r'; i++){}. 
8bf0: 20 69 66 28 20 63 3d 3d 30 20 29 7b 0a 20 20 20   if( c==0 ){.   
8c00: 20 75 74 66 38 5f 70 72 69 6e 74 66 28 6f 75 74   utf8_printf(out
8c10: 2c 22 27 25 73 27 22 2c 7a 29 3b 0a 20 20 7d 65  ,"'%s'",z);.  }e
8c20: 6c 73 65 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  lse{.    const c
8c30: 68 61 72 20 2a 7a 4e 4c 20 3d 20 30 3b 0a 20 20  har *zNL = 0;.  
8c40: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43    const char *zC
8c50: 52 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 6e  R = 0;.    int n
8c60: 4e 4c 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20  NL = 0;.    int 
8c70: 6e 43 52 20 3d 20 30 3b 0a 20 20 20 20 63 68 61  nCR = 0;.    cha
8c80: 72 20 7a 42 75 66 31 5b 32 30 5d 2c 20 7a 42 75  r zBuf1[20], zBu
8c90: 66 32 5b 32 30 5d 3b 0a 20 20 20 20 66 6f 72 28  f2[20];.    for(
8ca0: 69 3d 30 3b 20 7a 5b 69 5d 3b 20 69 2b 2b 29 7b  i=0; z[i]; i++){
8cb0: 0a 20 20 20 20 20 20 69 66 28 20 7a 5b 69 5d 3d  .      if( z[i]=
8cc0: 3d 27 5c 6e 27 20 29 20 6e 4e 4c 2b 2b 3b 0a 20  ='\n' ) nNL++;. 
8cd0: 20 20 20 20 20 69 66 28 20 7a 5b 69 5d 3d 3d 27       if( z[i]=='
8ce0: 5c 72 27 20 29 20 6e 43 52 2b 2b 3b 0a 20 20 20  \r' ) nCR++;.   
8cf0: 20 7d 0a 20 20 20 20 69 66 28 20 6e 4e 4c 20 29   }.    if( nNL )
8d00: 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e  {.      raw_prin
8d10: 74 66 28 6f 75 74 2c 20 22 72 65 70 6c 61 63 65  tf(out, "replace
8d20: 28 22 29 3b 0a 20 20 20 20 20 20 7a 4e 4c 20 3d  (");.      zNL =
8d30: 20 75 6e 75 73 65 64 5f 73 74 72 69 6e 67 28 7a   unused_string(z
8d40: 2c 20 22 5c 5c 6e 22 2c 20 22 5c 5c 30 31 32 22  , "\\n", "\\012"
8d50: 2c 20 7a 42 75 66 31 29 3b 0a 20 20 20 20 7d 0a  , zBuf1);.    }.
8d60: 20 20 20 20 69 66 28 20 6e 43 52 20 29 7b 0a 20      if( nCR ){. 
8d70: 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
8d80: 6f 75 74 2c 20 22 72 65 70 6c 61 63 65 28 22 29  out, "replace(")
8d90: 3b 0a 20 20 20 20 20 20 7a 43 52 20 3d 20 75 6e  ;.      zCR = un
8da0: 75 73 65 64 5f 73 74 72 69 6e 67 28 7a 2c 20 22  used_string(z, "
8db0: 5c 5c 72 22 2c 20 22 5c 5c 30 31 35 22 2c 20 7a  \\r", "\\015", z
8dc0: 42 75 66 32 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Buf2);.    }.   
8dd0: 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c   raw_printf(out,
8de0: 20 22 27 22 29 3b 0a 20 20 20 20 77 68 69 6c 65   "'");.    while
8df0: 28 20 2a 7a 20 29 7b 0a 20 20 20 20 20 20 66 6f  ( *z ){.      fo
8e00: 72 28 69 3d 30 3b 20 28 63 20 3d 20 7a 5b 69 5d  r(i=0; (c = z[i]
8e10: 29 21 3d 30 20 26 26 20 63 21 3d 27 5c 6e 27 20  )!=0 && c!='\n' 
8e20: 26 26 20 63 21 3d 27 5c 72 27 20 26 26 20 63 21  && c!='\r' && c!
8e30: 3d 27 5c 27 27 3b 20 69 2b 2b 29 7b 7d 0a 20 20  ='\''; i++){}.  
8e40: 20 20 20 20 69 66 28 20 63 3d 3d 27 5c 27 27 20      if( c=='\'' 
8e50: 29 20 69 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28  ) i++;.      if(
8e60: 20 69 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74   i ){.        ut
8e70: 66 38 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22  f8_printf(out, "
8e80: 25 2e 2a 73 22 2c 20 69 2c 20 7a 29 3b 0a 20 20  %.*s", i, z);.  
8e90: 20 20 20 20 20 20 7a 20 2b 3d 20 69 3b 0a 20 20        z += i;.  
8ea0: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
8eb0: 63 3d 3d 27 5c 27 27 20 29 7b 0a 20 20 20 20 20  c=='\'' ){.     
8ec0: 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75     raw_printf(ou
8ed0: 74 2c 20 22 27 22 29 3b 0a 20 20 20 20 20 20 20  t, "'");.       
8ee0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
8ef0: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d   }.      if( c==
8f00: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65  0 ){.        bre
8f10: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
8f20: 20 20 7a 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28    z++;.      if(
8f30: 20 63 3d 3d 27 5c 6e 27 20 29 7b 0a 20 20 20 20   c=='\n' ){.    
8f40: 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f      raw_printf(o
8f50: 75 74 2c 20 22 25 73 22 2c 20 7a 4e 4c 29 3b 0a  ut, "%s", zNL);.
8f60: 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
8f70: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
8f80: 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20  raw_printf(out, 
8f90: 22 25 73 22 2c 20 7a 43 52 29 3b 0a 20 20 20 20  "%s", zCR);.    
8fa0: 7d 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66  }.    raw_printf
8fb0: 28 6f 75 74 2c 20 22 27 22 29 3b 0a 20 20 20 20  (out, "'");.    
8fc0: 69 66 28 20 6e 43 52 20 29 7b 0a 20 20 20 20 20  if( nCR ){.     
8fd0: 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c   raw_printf(out,
8fe0: 20 22 2c 27 25 73 27 2c 63 68 61 72 28 31 33 29   ",'%s',char(13)
8ff0: 29 22 2c 20 7a 43 52 29 3b 0a 20 20 20 20 7d 0a  )", zCR);.    }.
9000: 20 20 20 20 69 66 28 20 6e 4e 4c 20 29 7b 0a 20      if( nNL ){. 
9010: 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
9020: 6f 75 74 2c 20 22 2c 27 25 73 27 2c 63 68 61 72  out, ",'%s',char
9030: 28 31 30 29 29 22 2c 20 7a 4e 4c 29 3b 0a 20 20  (10))", zNL);.  
9040: 20 20 7d 0a 20 20 7d 0a 20 20 73 65 74 54 65 78    }.  }.  setTex
9050: 74 4d 6f 64 65 28 6f 75 74 2c 20 31 29 3b 0a 7d  tMode(out, 1);.}
9060: 0a 0a 2f 2a 0a 2a 2a 20 4f 75 74 70 75 74 20 74  ../*.** Output t
9070: 68 65 20 67 69 76 65 6e 20 73 74 72 69 6e 67 20  he given string 
9080: 61 73 20 61 20 71 75 6f 74 65 64 20 61 63 63 6f  as a quoted acco
9090: 72 64 69 6e 67 20 74 6f 20 43 20 6f 72 20 54 43  rding to C or TC
90a0: 4c 20 71 75 6f 74 69 6e 67 20 72 75 6c 65 73 2e  L quoting rules.
90b0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
90c0: 6f 75 74 70 75 74 5f 63 5f 73 74 72 69 6e 67 28  output_c_string(
90d0: 46 49 4c 45 20 2a 6f 75 74 2c 20 63 6f 6e 73 74  FILE *out, const
90e0: 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 75 6e 73   char *z){.  uns
90f0: 69 67 6e 65 64 20 69 6e 74 20 63 3b 0a 20 20 66  igned int c;.  f
9100: 70 75 74 63 28 27 22 27 2c 20 6f 75 74 29 3b 0a  putc('"', out);.
9110: 20 20 77 68 69 6c 65 28 20 28 63 20 3d 20 2a 28    while( (c = *(
9120: 7a 2b 2b 29 29 21 3d 30 20 29 7b 0a 20 20 20 20  z++))!=0 ){.    
9130: 69 66 28 20 63 3d 3d 27 5c 5c 27 20 29 7b 0a 20  if( c=='\\' ){. 
9140: 20 20 20 20 20 66 70 75 74 63 28 63 2c 20 6f 75       fputc(c, ou
9150: 74 29 3b 0a 20 20 20 20 20 20 66 70 75 74 63 28  t);.      fputc(
9160: 63 2c 20 6f 75 74 29 3b 0a 20 20 20 20 7d 65 6c  c, out);.    }el
9170: 73 65 20 69 66 28 20 63 3d 3d 27 22 27 20 29 7b  se if( c=='"' ){
9180: 0a 20 20 20 20 20 20 66 70 75 74 63 28 27 5c 5c  .      fputc('\\
9190: 27 2c 20 6f 75 74 29 3b 0a 20 20 20 20 20 20 66  ', out);.      f
91a0: 70 75 74 63 28 27 22 27 2c 20 6f 75 74 29 3b 0a  putc('"', out);.
91b0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d      }else if( c=
91c0: 3d 27 5c 74 27 20 29 7b 0a 20 20 20 20 20 20 66  ='\t' ){.      f
91d0: 70 75 74 63 28 27 5c 5c 27 2c 20 6f 75 74 29 3b  putc('\\', out);
91e0: 0a 20 20 20 20 20 20 66 70 75 74 63 28 27 74 27  .      fputc('t'
91f0: 2c 20 6f 75 74 29 3b 0a 20 20 20 20 7d 65 6c 73  , out);.    }els
9200: 65 20 69 66 28 20 63 3d 3d 27 5c 6e 27 20 29 7b  e if( c=='\n' ){
9210: 0a 20 20 20 20 20 20 66 70 75 74 63 28 27 5c 5c  .      fputc('\\
9220: 27 2c 20 6f 75 74 29 3b 0a 20 20 20 20 20 20 66  ', out);.      f
9230: 70 75 74 63 28 27 6e 27 2c 20 6f 75 74 29 3b 0a  putc('n', out);.
9240: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d      }else if( c=
9250: 3d 27 5c 72 27 20 29 7b 0a 20 20 20 20 20 20 66  ='\r' ){.      f
9260: 70 75 74 63 28 27 5c 5c 27 2c 20 6f 75 74 29 3b  putc('\\', out);
9270: 0a 20 20 20 20 20 20 66 70 75 74 63 28 27 72 27  .      fputc('r'
9280: 2c 20 6f 75 74 29 3b 0a 20 20 20 20 7d 65 6c 73  , out);.    }els
9290: 65 20 69 66 28 20 21 69 73 70 72 69 6e 74 28 63  e if( !isprint(c
92a0: 26 30 78 66 66 29 20 29 7b 0a 20 20 20 20 20 20  &0xff) ){.      
92b0: 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20  raw_printf(out, 
92c0: 22 5c 5c 25 30 33 6f 22 2c 20 63 26 30 78 66 66  "\\%03o", c&0xff
92d0: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
92e0: 20 20 20 20 66 70 75 74 63 28 63 2c 20 6f 75 74      fputc(c, out
92f0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66  );.    }.  }.  f
9300: 70 75 74 63 28 27 22 27 2c 20 6f 75 74 29 3b 0a  putc('"', out);.
9310: 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 75 74 70 75 74 20  }../*.** Output 
9320: 74 68 65 20 67 69 76 65 6e 20 73 74 72 69 6e 67  the given string
9330: 20 77 69 74 68 20 63 68 61 72 61 63 74 65 72 73   with characters
9340: 20 74 68 61 74 20 61 72 65 20 73 70 65 63 69 61   that are specia
9350: 6c 20 74 6f 0a 2a 2a 20 48 54 4d 4c 20 65 73 63  l to.** HTML esc
9360: 61 70 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  aped..*/.static 
9370: 76 6f 69 64 20 6f 75 74 70 75 74 5f 68 74 6d 6c  void output_html
9380: 5f 73 74 72 69 6e 67 28 46 49 4c 45 20 2a 6f 75  _string(FILE *ou
9390: 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  t, const char *z
93a0: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  ){.  int i;.  if
93b0: 28 20 7a 3d 3d 30 20 29 20 7a 20 3d 20 22 22 3b  ( z==0 ) z = "";
93c0: 0a 20 20 77 68 69 6c 65 28 20 2a 7a 20 29 7b 0a  .  while( *z ){.
93d0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 20 20 7a      for(i=0;   z
93e0: 5b 69 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20  [i].            
93f0: 26 26 20 7a 5b 69 5d 21 3d 27 3c 27 0a 20 20 20  && z[i]!='<'.   
9400: 20 20 20 20 20 20 20 20 20 26 26 20 7a 5b 69 5d           && z[i]
9410: 21 3d 27 26 27 0a 20 20 20 20 20 20 20 20 20 20  !='&'.          
9420: 20 20 26 26 20 7a 5b 69 5d 21 3d 27 3e 27 0a 20    && z[i]!='>'. 
9430: 20 20 20 20 20 20 20 20 20 20 20 26 26 20 7a 5b             && z[
9440: 69 5d 21 3d 27 5c 22 27 0a 20 20 20 20 20 20 20  i]!='\"'.       
9450: 20 20 20 20 20 26 26 20 7a 5b 69 5d 21 3d 27 5c       && z[i]!='\
9460: 27 27 3b 0a 20 20 20 20 20 20 20 20 69 2b 2b 29  '';.        i++)
9470: 7b 7d 0a 20 20 20 20 69 66 28 20 69 3e 30 20 29  {}.    if( i>0 )
9480: 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69  {.      utf8_pri
9490: 6e 74 66 28 6f 75 74 2c 22 25 2e 2a 73 22 2c 69  ntf(out,"%.*s",i
94a0: 2c 7a 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ,z);.    }.    i
94b0: 66 28 20 7a 5b 69 5d 3d 3d 27 3c 27 20 29 7b 0a  f( z[i]=='<' ){.
94c0: 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
94d0: 28 6f 75 74 2c 22 26 6c 74 3b 22 29 3b 0a 20 20  (out,"&lt;");.  
94e0: 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 5b 69 5d    }else if( z[i]
94f0: 3d 3d 27 26 27 20 29 7b 0a 20 20 20 20 20 20 72  =='&' ){.      r
9500: 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 22 26  aw_printf(out,"&
9510: 61 6d 70 3b 22 29 3b 0a 20 20 20 20 7d 65 6c 73  amp;");.    }els
9520: 65 20 69 66 28 20 7a 5b 69 5d 3d 3d 27 3e 27 20  e if( z[i]=='>' 
9530: 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69  ){.      raw_pri
9540: 6e 74 66 28 6f 75 74 2c 22 26 67 74 3b 22 29 3b  ntf(out,"&gt;");
9550: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 7a  .    }else if( z
9560: 5b 69 5d 3d 3d 27 5c 22 27 20 29 7b 0a 20 20 20  [i]=='\"' ){.   
9570: 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75     raw_printf(ou
9580: 74 2c 22 26 71 75 6f 74 3b 22 29 3b 0a 20 20 20  t,"&quot;");.   
9590: 20 7d 65 6c 73 65 20 69 66 28 20 7a 5b 69 5d 3d   }else if( z[i]=
95a0: 3d 27 5c 27 27 20 29 7b 0a 20 20 20 20 20 20 72  ='\'' ){.      r
95b0: 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 22 26  aw_printf(out,"&
95c0: 23 33 39 3b 22 29 3b 0a 20 20 20 20 7d 65 6c 73  #39;");.    }els
95d0: 65 7b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  e{.      break;.
95e0: 20 20 20 20 7d 0a 20 20 20 20 7a 20 2b 3d 20 69      }.    z += i
95f0: 20 2b 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a   + 1;.  }.}../*.
9600: 2a 2a 20 49 66 20 61 20 66 69 65 6c 64 20 63 6f  ** If a field co
9610: 6e 74 61 69 6e 73 20 61 6e 79 20 63 68 61 72 61  ntains any chara
9620: 63 74 65 72 20 69 64 65 6e 74 69 66 69 65 64 20  cter identified 
9630: 62 79 20 61 20 31 20 69 6e 20 74 68 65 20 66 6f  by a 1 in the fo
9640: 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 61 72 72 61 79  llowing.** array
9650: 2c 20 74 68 65 6e 20 74 68 65 20 73 74 72 69 6e  , then the strin
9660: 67 20 6d 75 73 74 20 62 65 20 71 75 6f 74 65 64  g must be quoted
9670: 20 66 6f 72 20 43 53 56 2e 0a 2a 2f 0a 73 74 61   for CSV..*/.sta
9680: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 6e  tic const char n
9690: 65 65 64 43 73 76 51 75 6f 74 65 5b 5d 20 3d 20  eedCsvQuote[] = 
96a0: 7b 0a 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20  {.  1, 1, 1, 1, 
96b0: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 20 20 31 2c  1, 1, 1, 1,   1,
96c0: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
96d0: 31 2c 20 31 2c 0a 20 20 31 2c 20 31 2c 20 31 2c  1, 1,.  1, 1, 1,
96e0: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
96f0: 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c    1, 1, 1, 1, 1,
9700: 20 31 2c 20 31 2c 20 31 2c 0a 20 20 31 2c 20 30   1, 1, 1,.  1, 0
9710: 2c 20 31 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 1, 0, 0, 0, 0,
9720: 20 31 2c 20 20 20 30 2c 20 30 2c 20 30 2c 20 30   1,   0, 0, 0, 0
9730: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 0a 20 20  , 0, 0, 0, 0,.  
9740: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
9750: 2c 20 30 2c 20 30 2c 20 20 20 30 2c 20 30 2c 20  , 0, 0,   0, 0, 
9760: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
9770: 2c 0a 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20  ,.  0, 0, 0, 0, 
9780: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 20 20 30 2c  0, 0, 0, 0,   0,
9790: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
97a0: 30 2c 20 30 2c 0a 20 20 30 2c 20 30 2c 20 30 2c  0, 0,.  0, 0, 0,
97b0: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
97c0: 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c    0, 0, 0, 0, 0,
97d0: 20 30 2c 20 30 2c 20 30 2c 0a 20 20 30 2c 20 30   0, 0, 0,.  0, 0
97e0: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
97f0: 20 30 2c 20 20 20 30 2c 20 30 2c 20 30 2c 20 30   0,   0, 0, 0, 0
9800: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 0a 20 20  , 0, 0, 0, 0,.  
9810: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
9820: 2c 20 30 2c 20 30 2c 20 20 20 30 2c 20 30 2c 20  , 0, 0,   0, 0, 
9830: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 31  0, 0, 0, 0, 0, 1
9840: 2c 0a 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20  ,.  1, 1, 1, 1, 
9850: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 20 20 31 2c  1, 1, 1, 1,   1,
9860: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
9870: 31 2c 20 31 2c 0a 20 20 31 2c 20 31 2c 20 31 2c  1, 1,.  1, 1, 1,
9880: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
9890: 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c    1, 1, 1, 1, 1,
98a0: 20 31 2c 20 31 2c 20 31 2c 0a 20 20 31 2c 20 31   1, 1, 1,.  1, 1
98b0: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c  , 1, 1, 1, 1, 1,
98c0: 20 31 2c 20 20 20 31 2c 20 31 2c 20 31 2c 20 31   1,   1, 1, 1, 1
98d0: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 0a 20 20  , 1, 1, 1, 1,.  
98e0: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
98f0: 2c 20 31 2c 20 31 2c 20 20 20 31 2c 20 31 2c 20  , 1, 1,   1, 1, 
9900: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
9910: 2c 0a 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20  ,.  1, 1, 1, 1, 
9920: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 20 20 31 2c  1, 1, 1, 1,   1,
9930: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
9940: 31 2c 20 31 2c 0a 20 20 31 2c 20 31 2c 20 31 2c  1, 1,.  1, 1, 1,
9950: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
9960: 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c    1, 1, 1, 1, 1,
9970: 20 31 2c 20 31 2c 20 31 2c 0a 20 20 31 2c 20 31   1, 1, 1,.  1, 1
9980: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c  , 1, 1, 1, 1, 1,
9990: 20 31 2c 20 20 20 31 2c 20 31 2c 20 31 2c 20 31   1,   1, 1, 1, 1
99a0: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 0a 20 20  , 1, 1, 1, 1,.  
99b0: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
99c0: 2c 20 31 2c 20 31 2c 20 20 20 31 2c 20 31 2c 20  , 1, 1,   1, 1, 
99d0: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
99e0: 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 4f 75 74 70  ,.};../*.** Outp
99f0: 75 74 20 61 20 73 69 6e 67 6c 65 20 74 65 72 6d  ut a single term
9a00: 20 6f 66 20 43 53 56 2e 20 20 41 63 74 75 61 6c   of CSV.  Actual
9a10: 6c 79 2c 20 70 2d 3e 63 6f 6c 53 65 70 61 72 61  ly, p->colSepara
9a20: 74 6f 72 20 69 73 20 75 73 65 64 20 66 6f 72 0a  tor is used for.
9a30: 2a 2a 20 74 68 65 20 73 65 70 61 72 61 74 6f 72  ** the separator
9a40: 2c 20 77 68 69 63 68 20 6d 61 79 20 6f 72 20 6d  , which may or m
9a50: 61 79 20 6e 6f 74 20 62 65 20 61 20 63 6f 6d 6d  ay not be a comm
9a60: 61 2e 20 20 70 2d 3e 6e 75 6c 6c 56 61 6c 75 65  a.  p->nullValue
9a70: 20 69 73 0a 2a 2a 20 74 68 65 20 6e 75 6c 6c 20   is.** the null 
9a80: 76 61 6c 75 65 2e 20 20 53 74 72 69 6e 67 73 20  value.  Strings 
9a90: 61 72 65 20 71 75 6f 74 65 64 20 69 66 20 6e 65  are quoted if ne
9aa0: 63 65 73 73 61 72 79 2e 20 20 54 68 65 20 73 65  cessary.  The se
9ab0: 70 61 72 61 74 6f 72 0a 2a 2a 20 69 73 20 6f 6e  parator.** is on
9ac0: 6c 79 20 69 73 73 75 65 64 20 69 66 20 62 53 65  ly issued if bSe
9ad0: 70 20 69 73 20 74 72 75 65 2e 0a 2a 2f 0a 73 74  p is true..*/.st
9ae0: 61 74 69 63 20 76 6f 69 64 20 6f 75 74 70 75 74  atic void output
9af0: 5f 63 73 76 28 53 68 65 6c 6c 53 74 61 74 65 20  _csv(ShellState 
9b00: 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  *p, const char *
9b10: 7a 2c 20 69 6e 74 20 62 53 65 70 29 7b 0a 20 20  z, int bSep){.  
9b20: 46 49 4c 45 20 2a 6f 75 74 20 3d 20 70 2d 3e 6f  FILE *out = p->o
9b30: 75 74 3b 0a 20 20 69 66 28 20 7a 3d 3d 30 20 29  ut;.  if( z==0 )
9b40: 7b 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74  {.    utf8_print
9b50: 66 28 6f 75 74 2c 22 25 73 22 2c 70 2d 3e 6e 75  f(out,"%s",p->nu
9b60: 6c 6c 56 61 6c 75 65 29 3b 0a 20 20 7d 65 6c 73  llValue);.  }els
9b70: 65 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  e{.    int i;.  
9b80: 20 20 69 6e 74 20 6e 53 65 70 20 3d 20 73 74 72    int nSep = str
9b90: 6c 65 6e 33 30 28 70 2d 3e 63 6f 6c 53 65 70 61  len30(p->colSepa
9ba0: 72 61 74 6f 72 29 3b 0a 20 20 20 20 66 6f 72 28  rator);.    for(
9bb0: 69 3d 30 3b 20 7a 5b 69 5d 3b 20 69 2b 2b 29 7b  i=0; z[i]; i++){
9bc0: 0a 20 20 20 20 20 20 69 66 28 20 6e 65 65 64 43  .      if( needC
9bd0: 73 76 51 75 6f 74 65 5b 28 28 75 6e 73 69 67 6e  svQuote[((unsign
9be0: 65 64 20 63 68 61 72 2a 29 7a 29 5b 69 5d 5d 0a  ed char*)z)[i]].
9bf0: 20 20 20 20 20 20 20 20 20 7c 7c 20 28 7a 5b 69           || (z[i
9c00: 5d 3d 3d 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74  ]==p->colSeparat
9c10: 6f 72 5b 30 5d 20 26 26 0a 20 20 20 20 20 20 20  or[0] &&.       
9c20: 20 20 20 20 20 20 28 6e 53 65 70 3d 3d 31 20 7c        (nSep==1 |
9c30: 7c 20 6d 65 6d 63 6d 70 28 7a 2c 20 70 2d 3e 63  | memcmp(z, p->c
9c40: 6f 6c 53 65 70 61 72 61 74 6f 72 2c 20 6e 53 65  olSeparator, nSe
9c50: 70 29 3d 3d 30 29 29 20 29 7b 0a 20 20 20 20 20  p)==0)) ){.     
9c60: 20 20 20 69 20 3d 20 30 3b 0a 20 20 20 20 20 20     i = 0;.      
9c70: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
9c80: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
9c90: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 68 61  ==0 ){.      cha
9ca0: 72 20 2a 7a 51 75 6f 74 65 64 20 3d 20 73 71 6c  r *zQuoted = sql
9cb0: 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 5c 22  ite3_mprintf("\"
9cc0: 25 77 5c 22 22 2c 20 7a 29 3b 0a 20 20 20 20 20  %w\"", z);.     
9cd0: 20 75 74 66 38 5f 70 72 69 6e 74 66 28 6f 75 74   utf8_printf(out
9ce0: 2c 20 22 25 73 22 2c 20 7a 51 75 6f 74 65 64 29  , "%s", zQuoted)
9cf0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
9d00: 66 72 65 65 28 7a 51 75 6f 74 65 64 29 3b 0a 20  free(zQuoted);. 
9d10: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
9d20: 75 74 66 38 5f 70 72 69 6e 74 66 28 6f 75 74 2c  utf8_printf(out,
9d30: 20 22 25 73 22 2c 20 7a 29 3b 0a 20 20 20 20 7d   "%s", z);.    }
9d40: 0a 20 20 7d 0a 20 20 69 66 28 20 62 53 65 70 20  .  }.  if( bSep 
9d50: 29 7b 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e  ){.    utf8_prin
9d60: 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c  tf(p->out, "%s",
9d70: 20 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72   p->colSeparator
9d80: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
9d90: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 75 6e  This routine run
9da0: 73 20 77 68 65 6e 20 74 68 65 20 75 73 65 72 20  s when the user 
9db0: 70 72 65 73 73 65 73 20 43 74 72 6c 2d 43 0a 2a  presses Ctrl-C.*
9dc0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69 6e  /.static void in
9dd0: 74 65 72 72 75 70 74 5f 68 61 6e 64 6c 65 72 28  terrupt_handler(
9de0: 69 6e 74 20 4e 6f 74 55 73 65 64 29 7b 0a 20 20  int NotUsed){.  
9df0: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
9e00: 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 73 65 65  (NotUsed);.  see
9e10: 6e 49 6e 74 65 72 72 75 70 74 2b 2b 3b 0a 20 20  nInterrupt++;.  
9e20: 69 66 28 20 73 65 65 6e 49 6e 74 65 72 72 75 70  if( seenInterrup
9e30: 74 3e 32 20 29 20 65 78 69 74 28 31 29 3b 0a 20  t>2 ) exit(1);. 
9e40: 20 69 66 28 20 67 6c 6f 62 61 6c 44 62 20 29 20   if( globalDb ) 
9e50: 73 71 6c 69 74 65 33 5f 69 6e 74 65 72 72 75 70  sqlite3_interrup
9e60: 74 28 67 6c 6f 62 61 6c 44 62 29 3b 0a 7d 0a 0a  t(globalDb);.}..
9e70: 23 69 66 20 28 64 65 66 69 6e 65 64 28 5f 57 49  #if (defined(_WI
9e80: 4e 33 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  N32) || defined(
9e90: 57 49 4e 33 32 29 29 20 26 26 20 21 64 65 66 69  WIN32)) && !defi
9ea0: 6e 65 64 28 5f 57 49 4e 33 32 5f 57 43 45 29 0a  ned(_WIN32_WCE).
9eb0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
9ec0: 6e 65 20 72 75 6e 73 20 66 6f 72 20 63 6f 6e 73  ne runs for cons
9ed0: 6f 6c 65 20 65 76 65 6e 74 73 20 28 65 2e 67 2e  ole events (e.g.
9ee0: 20 43 74 72 6c 2d 43 29 20 6f 6e 20 57 69 6e 33   Ctrl-C) on Win3
9ef0: 32 0a 2a 2f 0a 73 74 61 74 69 63 20 42 4f 4f 4c  2.*/.static BOOL
9f00: 20 57 49 4e 41 50 49 20 43 6f 6e 73 6f 6c 65 43   WINAPI ConsoleC
9f10: 74 72 6c 48 61 6e 64 6c 65 72 28 0a 20 20 44 57  trlHandler(.  DW
9f20: 4f 52 44 20 64 77 43 74 72 6c 54 79 70 65 20 2f  ORD dwCtrlType /
9f30: 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 43 54 52  * One of the CTR
9f40: 4c 5f 2a 5f 45 56 45 4e 54 20 63 6f 6e 73 74 61  L_*_EVENT consta
9f50: 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20  nts */.){.  if( 
9f60: 64 77 43 74 72 6c 54 79 70 65 3d 3d 43 54 52 4c  dwCtrlType==CTRL
9f70: 5f 43 5f 45 56 45 4e 54 20 29 7b 0a 20 20 20 20  _C_EVENT ){.    
9f80: 69 6e 74 65 72 72 75 70 74 5f 68 61 6e 64 6c 65  interrupt_handle
9f90: 72 28 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  r(0);.    return
9fa0: 20 54 52 55 45 3b 0a 20 20 7d 0a 20 20 72 65 74   TRUE;.  }.  ret
9fb0: 75 72 6e 20 46 41 4c 53 45 3b 0a 7d 0a 23 65 6e  urn FALSE;.}.#en
9fc0: 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  dif..#ifndef SQL
9fd0: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49  ITE_OMIT_AUTHORI
9fe0: 5a 41 54 49 4f 4e 0a 2f 2a 0a 2a 2a 20 57 68 65  ZATION./*.** Whe
9ff0: 6e 20 74 68 65 20 22 2e 61 75 74 68 20 4f 4e 22  n the ".auth ON"
a000: 20 69 73 20 73 65 74 2c 20 74 68 65 20 66 6f 6c   is set, the fol
a010: 6c 6f 77 69 6e 67 20 61 75 74 68 6f 72 69 7a 65  lowing authorize
a020: 72 20 63 61 6c 6c 62 61 63 6b 20 69 73 0a 2a 2a  r callback is.**
a030: 20 69 6e 76 6f 6b 65 64 2e 20 20 49 74 20 61 6c   invoked.  It al
a040: 77 61 79 73 20 72 65 74 75 72 6e 73 20 53 51 4c  ways returns SQL
a050: 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69  ITE_OK..*/.stati
a060: 63 20 69 6e 74 20 73 68 65 6c 6c 41 75 74 68 28  c int shellAuth(
a070: 0a 20 20 76 6f 69 64 20 2a 70 43 6c 69 65 6e 74  .  void *pClient
a080: 44 61 74 61 2c 0a 20 20 69 6e 74 20 6f 70 2c 0a  Data,.  int op,.
a090: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41    const char *zA
a0a0: 31 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  1,.  const char 
a0b0: 2a 7a 41 32 2c 0a 20 20 63 6f 6e 73 74 20 63 68  *zA2,.  const ch
a0c0: 61 72 20 2a 7a 41 33 2c 0a 20 20 63 6f 6e 73 74  ar *zA3,.  const
a0d0: 20 63 68 61 72 20 2a 7a 41 34 0a 29 7b 0a 20 20   char *zA4.){.  
a0e0: 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 20 3d 20  ShellState *p = 
a0f0: 28 53 68 65 6c 6c 53 74 61 74 65 2a 29 70 43 6c  (ShellState*)pCl
a100: 69 65 6e 74 44 61 74 61 3b 0a 20 20 73 74 61 74  ientData;.  stat
a110: 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61  ic const char *a
a120: 7a 41 63 74 69 6f 6e 5b 5d 20 3d 20 7b 20 30 2c  zAction[] = { 0,
a130: 0a 20 20 20 20 20 22 43 52 45 41 54 45 5f 49 4e  .     "CREATE_IN
a140: 44 45 58 22 2c 20 20 20 20 20 20 20 20 20 22 43  DEX",         "C
a150: 52 45 41 54 45 5f 54 41 42 4c 45 22 2c 20 20 20  REATE_TABLE",   
a160: 20 20 20 20 20 20 22 43 52 45 41 54 45 5f 54 45        "CREATE_TE
a170: 4d 50 5f 49 4e 44 45 58 22 2c 0a 20 20 20 20 20  MP_INDEX",.     
a180: 22 43 52 45 41 54 45 5f 54 45 4d 50 5f 54 41 42  "CREATE_TEMP_TAB
a190: 4c 45 22 2c 20 20 20 20 22 43 52 45 41 54 45 5f  LE",    "CREATE_
a1a0: 54 45 4d 50 5f 54 52 49 47 47 45 52 22 2c 20 20  TEMP_TRIGGER",  
a1b0: 22 43 52 45 41 54 45 5f 54 45 4d 50 5f 56 49 45  "CREATE_TEMP_VIE
a1c0: 57 22 2c 0a 20 20 20 20 20 22 43 52 45 41 54 45  W",.     "CREATE
a1d0: 5f 54 52 49 47 47 45 52 22 2c 20 20 20 20 20 20  _TRIGGER",      
a1e0: 20 22 43 52 45 41 54 45 5f 56 49 45 57 22 2c 20   "CREATE_VIEW", 
a1f0: 20 20 20 20 20 20 20 20 20 22 44 45 4c 45 54 45           "DELETE
a200: 22 2c 0a 20 20 20 20 20 22 44 52 4f 50 5f 49 4e  ",.     "DROP_IN
a210: 44 45 58 22 2c 20 20 20 20 20 20 20 20 20 20 20  DEX",           
a220: 22 44 52 4f 50 5f 54 41 42 4c 45 22 2c 20 20 20  "DROP_TABLE",   
a230: 20 20 20 20 20 20 20 20 22 44 52 4f 50 5f 54 45          "DROP_TE
a240: 4d 50 5f 49 4e 44 45 58 22 2c 0a 20 20 20 20 20  MP_INDEX",.     
a250: 22 44 52 4f 50 5f 54 45 4d 50 5f 54 41 42 4c 45  "DROP_TEMP_TABLE
a260: 22 2c 20 20 20 20 20 20 22 44 52 4f 50 5f 54 45  ",      "DROP_TE
a270: 4d 50 5f 54 52 49 47 47 45 52 22 2c 20 20 20 20  MP_TRIGGER",    
a280: 22 44 52 4f 50 5f 54 45 4d 50 5f 56 49 45 57 22  "DROP_TEMP_VIEW"
a290: 2c 0a 20 20 20 20 20 22 44 52 4f 50 5f 54 52 49  ,.     "DROP_TRI
a2a0: 47 47 45 52 22 2c 20 20 20 20 20 20 20 20 20 22  GGER",         "
a2b0: 44 52 4f 50 5f 56 49 45 57 22 2c 20 20 20 20 20  DROP_VIEW",     
a2c0: 20 20 20 20 20 20 20 22 49 4e 53 45 52 54 22 2c         "INSERT",
a2d0: 0a 20 20 20 20 20 22 50 52 41 47 4d 41 22 2c 20  .     "PRAGMA", 
a2e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 52                "R
a2f0: 45 41 44 22 2c 20 20 20 20 20 20 20 20 20 20 20  EAD",           
a300: 20 20 20 20 20 20 22 53 45 4c 45 43 54 22 2c 0a        "SELECT",.
a310: 20 20 20 20 20 22 54 52 41 4e 53 41 43 54 49 4f       "TRANSACTIO
a320: 4e 22 2c 20 20 20 20 20 20 20 20 20 20 22 55 50  N",          "UP
a330: 44 41 54 45 22 2c 20 20 20 20 20 20 20 20 20 20  DATE",          
a340: 20 20 20 20 20 22 41 54 54 41 43 48 22 2c 0a 20       "ATTACH",. 
a350: 20 20 20 20 22 44 45 54 41 43 48 22 2c 20 20 20      "DETACH",   
a360: 20 20 20 20 20 20 20 20 20 20 20 20 22 41 4c 54              "ALT
a370: 45 52 5f 54 41 42 4c 45 22 2c 20 20 20 20 20 20  ER_TABLE",      
a380: 20 20 20 20 22 52 45 49 4e 44 45 58 22 2c 0a 20      "REINDEX",. 
a390: 20 20 20 20 22 41 4e 41 4c 59 5a 45 22 2c 20 20      "ANALYZE",  
a3a0: 20 20 20 20 20 20 20 20 20 20 20 20 22 43 52 45              "CRE
a3b0: 41 54 45 5f 56 54 41 42 4c 45 22 2c 20 20 20 20  ATE_VTABLE",    
a3c0: 20 20 20 20 22 44 52 4f 50 5f 56 54 41 42 4c 45      "DROP_VTABLE
a3d0: 22 2c 0a 20 20 20 20 20 22 46 55 4e 43 54 49 4f  ",.     "FUNCTIO
a3e0: 4e 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  N",             
a3f0: 22 53 41 56 45 50 4f 49 4e 54 22 2c 20 20 20 20  "SAVEPOINT",    
a400: 20 20 20 20 20 20 20 20 22 52 45 43 55 52 53 49          "RECURSI
a410: 56 45 22 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69  VE".  };.  int i
a420: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
a430: 61 7a 5b 34 5d 3b 0a 20 20 61 7a 5b 30 5d 20 3d  az[4];.  az[0] =
a440: 20 7a 41 31 3b 0a 20 20 61 7a 5b 31 5d 20 3d 20   zA1;.  az[1] = 
a450: 7a 41 32 3b 0a 20 20 61 7a 5b 32 5d 20 3d 20 7a  zA2;.  az[2] = z
a460: 41 33 3b 0a 20 20 61 7a 5b 33 5d 20 3d 20 7a 41  A3;.  az[3] = zA
a470: 34 3b 0a 20 20 75 74 66 38 5f 70 72 69 6e 74 66  4;.  utf8_printf
a480: 28 70 2d 3e 6f 75 74 2c 20 22 61 75 74 68 6f 72  (p->out, "author
a490: 69 7a 65 72 3a 20 25 73 22 2c 20 61 7a 41 63 74  izer: %s", azAct
a4a0: 69 6f 6e 5b 6f 70 5d 29 3b 0a 20 20 66 6f 72 28  ion[op]);.  for(
a4b0: 69 3d 30 3b 20 69 3c 34 3b 20 69 2b 2b 29 7b 0a  i=0; i<4; i++){.
a4c0: 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70      raw_printf(p
a4d0: 2d 3e 6f 75 74 2c 20 22 20 22 29 3b 0a 20 20 20  ->out, " ");.   
a4e0: 20 69 66 28 20 61 7a 5b 69 5d 20 29 7b 0a 20 20   if( az[i] ){.  
a4f0: 20 20 20 20 6f 75 74 70 75 74 5f 63 5f 73 74 72      output_c_str
a500: 69 6e 67 28 70 2d 3e 6f 75 74 2c 20 61 7a 5b 69  ing(p->out, az[i
a510: 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ]);.    }else{. 
a520: 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
a530: 70 2d 3e 6f 75 74 2c 20 22 4e 55 4c 4c 22 29 3b  p->out, "NULL");
a540: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 61 77  .    }.  }.  raw
a550: 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
a560: 22 5c 6e 22 29 3b 0a 20 20 72 65 74 75 72 6e 20  "\n");.  return 
a570: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e  SQLITE_OK;.}.#en
a580: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74  dif../*.** Print
a590: 20 61 20 73 63 68 65 6d 61 20 73 74 61 74 65 6d   a schema statem
a5a0: 65 6e 74 2e 20 20 50 61 72 74 20 6f 66 20 4d 4f  ent.  Part of MO
a5b0: 44 45 5f 53 65 6d 69 20 61 6e 64 20 4d 4f 44 45  DE_Semi and MODE
a5c0: 5f 50 72 65 74 74 79 20 6f 75 74 70 75 74 2e 0a  _Pretty output..
a5d0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
a5e0: 6e 65 20 63 6f 6e 76 65 72 74 73 20 73 6f 6d 65  ne converts some
a5f0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74   CREATE TABLE st
a600: 61 74 65 6d 65 6e 74 73 20 66 6f 72 20 73 68 61  atements for sha
a610: 64 6f 77 20 74 61 62 6c 65 73 0a 2a 2a 20 69 6e  dow tables.** in
a620: 20 46 54 53 33 2f 34 2f 35 20 69 6e 74 6f 20 43   FTS3/4/5 into C
a630: 52 45 41 54 45 20 54 41 42 4c 45 20 49 46 20 4e  REATE TABLE IF N
a640: 4f 54 20 45 58 49 53 54 53 20 73 74 61 74 65 6d  OT EXISTS statem
a650: 65 6e 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ents..*/.static 
a660: 76 6f 69 64 20 70 72 69 6e 74 53 63 68 65 6d 61  void printSchema
a670: 4c 69 6e 65 28 46 49 4c 45 20 2a 6f 75 74 2c 20  Line(FILE *out, 
a680: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 63  const char *z, c
a690: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 69 6c  onst char *zTail
a6a0: 29 7b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  ){.  if( sqlite3
a6b0: 5f 73 74 72 67 6c 6f 62 28 22 43 52 45 41 54 45  _strglob("CREATE
a6c0: 20 54 41 42 4c 45 20 5b 27 5c 22 5d 2a 22 2c 20   TABLE ['\"]*", 
a6d0: 7a 29 3d 3d 30 20 29 7b 0a 20 20 20 20 75 74 66  z)==0 ){.    utf
a6e0: 38 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 43  8_printf(out, "C
a6f0: 52 45 41 54 45 20 54 41 42 4c 45 20 49 46 20 4e  REATE TABLE IF N
a700: 4f 54 20 45 58 49 53 54 53 20 25 73 25 73 22 2c  OT EXISTS %s%s",
a710: 20 7a 2b 31 33 2c 20 7a 54 61 69 6c 29 3b 0a 20   z+13, zTail);. 
a720: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 75 74 66 38   }else{.    utf8
a730: 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 73  _printf(out, "%s
a740: 25 73 22 2c 20 7a 2c 20 7a 54 61 69 6c 29 3b 0a  %s", z, zTail);.
a750: 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69    }.}.static voi
a760: 64 20 70 72 69 6e 74 53 63 68 65 6d 61 4c 69 6e  d printSchemaLin
a770: 65 4e 28 46 49 4c 45 20 2a 6f 75 74 2c 20 63 68  eN(FILE *out, ch
a780: 61 72 20 2a 7a 2c 20 69 6e 74 20 6e 2c 20 63 6f  ar *z, int n, co
a790: 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 69 6c 29  nst char *zTail)
a7a0: 7b 0a 20 20 63 68 61 72 20 63 20 3d 20 7a 5b 6e  {.  char c = z[n
a7b0: 5d 3b 0a 20 20 7a 5b 6e 5d 20 3d 20 30 3b 0a 20  ];.  z[n] = 0;. 
a7c0: 20 70 72 69 6e 74 53 63 68 65 6d 61 4c 69 6e 65   printSchemaLine
a7d0: 28 6f 75 74 2c 20 7a 2c 20 7a 54 61 69 6c 29 3b  (out, z, zTail);
a7e0: 0a 20 20 7a 5b 6e 5d 20 3d 20 63 3b 0a 7d 0a 0a  .  z[n] = c;.}..
a7f0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75  /*.** Return tru
a800: 65 20 69 66 20 73 74 72 69 6e 67 20 7a 5b 5d 20  e if string z[] 
a810: 68 61 73 20 6e 6f 74 68 69 6e 67 20 62 75 74 20  has nothing but 
a820: 77 68 69 74 65 73 70 61 63 65 20 61 6e 64 20 63  whitespace and c
a830: 6f 6d 6d 65 6e 74 73 20 74 6f 20 74 68 65 0a 2a  omments to the.*
a840: 2a 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69 72  * end of the fir
a850: 73 74 20 6c 69 6e 65 2e 0a 2a 2f 0a 73 74 61 74  st line..*/.stat
a860: 69 63 20 69 6e 74 20 77 73 54 6f 45 6f 6c 28 63  ic int wsToEol(c
a870: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20  onst char *z){. 
a880: 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d   int i;.  for(i=
a890: 30 3b 20 7a 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20  0; z[i]; i++){. 
a8a0: 20 20 20 69 66 28 20 7a 5b 69 5d 3d 3d 27 5c 6e     if( z[i]=='\n
a8b0: 27 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  ' ) return 1;.  
a8c0: 20 20 69 66 28 20 49 73 53 70 61 63 65 28 7a 5b    if( IsSpace(z[
a8d0: 69 5d 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  i]) ) continue;.
a8e0: 20 20 20 20 69 66 28 20 7a 5b 69 5d 3d 3d 27 2d      if( z[i]=='-
a8f0: 27 20 26 26 20 7a 5b 69 2b 31 5d 3d 3d 27 2d 27  ' && z[i+1]=='-'
a900: 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20   ) return 1;.   
a910: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
a920: 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 20 20 20   return 1;.}.   
a930: 20 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73   ../*.** This is
a940: 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 72 6f   the callback ro
a950: 75 74 69 6e 65 20 74 68 61 74 20 74 68 65 20 73  utine that the s
a960: 68 65 6c 6c 0a 2a 2a 20 69 6e 76 6f 6b 65 73 20  hell.** invokes 
a970: 66 6f 72 20 65 61 63 68 20 72 6f 77 20 6f 66 20  for each row of 
a980: 61 20 71 75 65 72 79 20 72 65 73 75 6c 74 2e 0a  a query result..
a990: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 68  */.static int sh
a9a0: 65 6c 6c 5f 63 61 6c 6c 62 61 63 6b 28 0a 20 20  ell_callback(.  
a9b0: 76 6f 69 64 20 2a 70 41 72 67 2c 0a 20 20 69 6e  void *pArg,.  in
a9c0: 74 20 6e 41 72 67 2c 20 20 20 20 20 20 20 20 2f  t nArg,        /
a9d0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 73 75  * Number of resu
a9e0: 6c 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20  lt columns */.  
a9f0: 63 68 61 72 20 2a 2a 61 7a 41 72 67 2c 20 20 20  char **azArg,   
aa00: 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68   /* Text of each
aa10: 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 20 2a   result column *
aa20: 2f 0a 20 20 63 68 61 72 20 2a 2a 61 7a 43 6f 6c  /.  char **azCol
aa30: 2c 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e  ,    /* Column n
aa40: 61 6d 65 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 61  ames */.  int *a
aa50: 69 54 79 70 65 20 20 20 20 20 20 2f 2a 20 43 6f  iType      /* Co
aa60: 6c 75 6d 6e 20 74 79 70 65 73 20 2a 2f 0a 29 7b  lumn types */.){
aa70: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 53 68 65 6c  .  int i;.  Shel
aa80: 6c 53 74 61 74 65 20 2a 70 20 3d 20 28 53 68 65  lState *p = (She
aa90: 6c 6c 53 74 61 74 65 2a 29 70 41 72 67 3b 0a 0a  llState*)pArg;..
aaa0: 20 20 69 66 28 20 61 7a 41 72 67 3d 3d 30 20 29    if( azArg==0 )
aab0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 73 77 69   return 0;.  swi
aac0: 74 63 68 28 20 70 2d 3e 63 4d 6f 64 65 20 29 7b  tch( p->cMode ){
aad0: 0a 20 20 20 20 63 61 73 65 20 4d 4f 44 45 5f 4c  .    case MODE_L
aae0: 69 6e 65 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  ine: {.      int
aaf0: 20 77 20 3d 20 35 3b 0a 20 20 20 20 20 20 69 66   w = 5;.      if
ab00: 28 20 61 7a 41 72 67 3d 3d 30 20 29 20 62 72 65  ( azArg==0 ) bre
ab10: 61 6b 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  ak;.      for(i=
ab20: 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b  0; i<nArg; i++){
ab30: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6c 65 6e  .        int len
ab40: 20 3d 20 73 74 72 6c 65 6e 33 30 28 61 7a 43 6f   = strlen30(azCo
ab50: 6c 5b 69 5d 20 3f 20 61 7a 43 6f 6c 5b 69 5d 20  l[i] ? azCol[i] 
ab60: 3a 20 22 22 29 3b 0a 20 20 20 20 20 20 20 20 69  : "");.        i
ab70: 66 28 20 6c 65 6e 3e 77 20 29 20 77 20 3d 20 6c  f( len>w ) w = l
ab80: 65 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  en;.      }.    
ab90: 20 20 69 66 28 20 70 2d 3e 63 6e 74 2b 2b 3e 30    if( p->cnt++>0
aba0: 20 29 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70   ) utf8_printf(p
abb0: 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20 70 2d 3e  ->out, "%s", p->
abc0: 72 6f 77 53 65 70 61 72 61 74 6f 72 29 3b 0a 20  rowSeparator);. 
abd0: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
abe0: 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nArg; i++){.    
abf0: 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
ac00: 70 2d 3e 6f 75 74 2c 22 25 2a 73 20 3d 20 25 73  p->out,"%*s = %s
ac10: 25 73 22 2c 20 77 2c 20 61 7a 43 6f 6c 5b 69 5d  %s", w, azCol[i]
ac20: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
ac30: 20 20 61 7a 41 72 67 5b 69 5d 20 3f 20 61 7a 41    azArg[i] ? azA
ac40: 72 67 5b 69 5d 20 3a 20 70 2d 3e 6e 75 6c 6c 56  rg[i] : p->nullV
ac50: 61 6c 75 65 2c 20 70 2d 3e 72 6f 77 53 65 70 61  alue, p->rowSepa
ac60: 72 61 74 6f 72 29 3b 0a 20 20 20 20 20 20 7d 0a  rator);.      }.
ac70: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
ac80: 20 7d 0a 20 20 20 20 63 61 73 65 20 4d 4f 44 45   }.    case MODE
ac90: 5f 45 78 70 6c 61 69 6e 3a 0a 20 20 20 20 63 61  _Explain:.    ca
aca0: 73 65 20 4d 4f 44 45 5f 43 6f 6c 75 6d 6e 3a 20  se MODE_Column: 
acb0: 7b 0a 20 20 20 20 20 20 73 74 61 74 69 63 20 63  {.      static c
acc0: 6f 6e 73 74 20 69 6e 74 20 61 45 78 70 6c 61 69  onst int aExplai
acd0: 6e 57 69 64 74 68 73 5b 5d 20 3d 20 7b 34 2c 20  nWidths[] = {4, 
ace0: 31 33 2c 20 34 2c 20 34 2c 20 34 2c 20 31 33 2c  13, 4, 4, 4, 13,
acf0: 20 32 2c 20 31 33 7d 3b 0a 20 20 20 20 20 20 63   2, 13};.      c
ad00: 6f 6e 73 74 20 69 6e 74 20 2a 63 6f 6c 57 69 64  onst int *colWid
ad10: 74 68 3b 0a 20 20 20 20 20 20 69 6e 74 20 73 68  th;.      int sh
ad20: 6f 77 48 64 72 3b 0a 20 20 20 20 20 20 63 68 61  owHdr;.      cha
ad30: 72 20 2a 72 6f 77 53 65 70 3b 0a 20 20 20 20 20  r *rowSep;.     
ad40: 20 69 66 28 20 70 2d 3e 63 4d 6f 64 65 3d 3d 4d   if( p->cMode==M
ad50: 4f 44 45 5f 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20  ODE_Column ){.  
ad60: 20 20 20 20 20 20 63 6f 6c 57 69 64 74 68 20 3d        colWidth =
ad70: 20 70 2d 3e 63 6f 6c 57 69 64 74 68 3b 0a 20 20   p->colWidth;.  
ad80: 20 20 20 20 20 20 73 68 6f 77 48 64 72 20 3d 20        showHdr = 
ad90: 70 2d 3e 73 68 6f 77 48 65 61 64 65 72 3b 0a 20  p->showHeader;. 
ada0: 20 20 20 20 20 20 20 72 6f 77 53 65 70 20 3d 20         rowSep = 
adb0: 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 3b  p->rowSeparator;
adc0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
add0: 20 20 20 20 20 20 63 6f 6c 57 69 64 74 68 20 3d        colWidth =
ade0: 20 61 45 78 70 6c 61 69 6e 57 69 64 74 68 73 3b   aExplainWidths;
adf0: 0a 20 20 20 20 20 20 20 20 73 68 6f 77 48 64 72  .        showHdr
ae00: 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 72 6f   = 1;.        ro
ae10: 77 53 65 70 20 3d 20 53 45 50 5f 52 6f 77 3b 0a  wSep = SEP_Row;.
ae20: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
ae30: 28 20 70 2d 3e 63 6e 74 2b 2b 3d 3d 30 20 29 7b  ( p->cnt++==0 ){
ae40: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30  .        for(i=0
ae50: 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a  ; i<nArg; i++){.
ae60: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 77 2c            int w,
ae70: 20 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66   n;.          if
ae80: 28 20 69 3c 41 72 72 61 79 53 69 7a 65 28 70 2d  ( i<ArraySize(p-
ae90: 3e 63 6f 6c 57 69 64 74 68 29 20 29 7b 0a 20 20  >colWidth) ){.  
aea0: 20 20 20 20 20 20 20 20 20 20 77 20 3d 20 63 6f            w = co
aeb0: 6c 57 69 64 74 68 5b 69 5d 3b 0a 20 20 20 20 20  lWidth[i];.     
aec0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
aed0: 20 20 20 20 20 20 20 20 77 20 3d 20 30 3b 0a 20          w = 0;. 
aee0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
aef0: 20 20 20 20 20 69 66 28 20 77 3d 3d 30 20 29 7b       if( w==0 ){
af00: 0a 20 20 20 20 20 20 20 20 20 20 20 20 77 20 3d  .            w =
af10: 20 73 74 72 6c 65 6e 43 68 61 72 28 61 7a 43 6f   strlenChar(azCo
af20: 6c 5b 69 5d 20 3f 20 61 7a 43 6f 6c 5b 69 5d 20  l[i] ? azCol[i] 
af30: 3a 20 22 22 29 3b 0a 20 20 20 20 20 20 20 20 20  : "");.         
af40: 20 20 20 69 66 28 20 77 3c 31 30 20 29 20 77 20     if( w<10 ) w 
af50: 3d 20 31 30 3b 0a 20 20 20 20 20 20 20 20 20 20  = 10;.          
af60: 20 20 6e 20 3d 20 73 74 72 6c 65 6e 43 68 61 72    n = strlenChar
af70: 28 61 7a 41 72 67 20 26 26 20 61 7a 41 72 67 5b  (azArg && azArg[
af80: 69 5d 20 3f 20 61 7a 41 72 67 5b 69 5d 20 3a 20  i] ? azArg[i] : 
af90: 70 2d 3e 6e 75 6c 6c 56 61 6c 75 65 29 3b 0a 20  p->nullValue);. 
afa0: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 77             if( w
afb0: 3c 6e 20 29 20 77 20 3d 20 6e 3b 0a 20 20 20 20  <n ) w = n;.    
afc0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
afd0: 20 20 69 66 28 20 69 3c 41 72 72 61 79 53 69 7a    if( i<ArraySiz
afe0: 65 28 70 2d 3e 61 63 74 75 61 6c 57 69 64 74 68  e(p->actualWidth
aff0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
b000: 20 70 2d 3e 61 63 74 75 61 6c 57 69 64 74 68 5b   p->actualWidth[
b010: 69 5d 20 3d 20 77 3b 0a 20 20 20 20 20 20 20 20  i] = w;.        
b020: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66    }.          if
b030: 28 20 73 68 6f 77 48 64 72 20 29 7b 0a 20 20 20  ( showHdr ){.   
b040: 20 20 20 20 20 20 20 20 20 75 74 66 38 5f 77 69           utf8_wi
b050: 64 74 68 5f 70 72 69 6e 74 28 70 2d 3e 6f 75 74  dth_print(p->out
b060: 2c 20 77 2c 20 61 7a 43 6f 6c 5b 69 5d 29 3b 0a  , w, azCol[i]);.
b070: 20 20 20 20 20 20 20 20 20 20 20 20 75 74 66 38              utf8
b080: 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
b090: 22 25 73 22 2c 20 69 3d 3d 6e 41 72 67 2d 31 20  "%s", i==nArg-1 
b0a0: 3f 20 72 6f 77 53 65 70 20 3a 20 22 20 20 22 29  ? rowSep : "  ")
b0b0: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
b0c0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
b0d0: 69 66 28 20 73 68 6f 77 48 64 72 20 29 7b 0a 20  if( showHdr ){. 
b0e0: 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30           for(i=0
b0f0: 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a  ; i<nArg; i++){.
b100: 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20              int 
b110: 77 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  w;.            i
b120: 66 28 20 69 3c 41 72 72 61 79 53 69 7a 65 28 70  f( i<ArraySize(p
b130: 2d 3e 61 63 74 75 61 6c 57 69 64 74 68 29 20 29  ->actualWidth) )
b140: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
b150: 20 77 20 3d 20 70 2d 3e 61 63 74 75 61 6c 57 69   w = p->actualWi
b160: 64 74 68 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20  dth[i];.        
b170: 20 20 20 20 20 20 20 69 66 28 20 77 3c 30 20 29         if( w<0 )
b180: 20 77 20 3d 20 2d 77 3b 0a 20 20 20 20 20 20 20   w = -w;.       
b190: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
b1a0: 20 20 20 20 20 20 20 20 20 20 20 77 20 3d 20 31             w = 1
b1b0: 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  0;.            }
b1c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 75 74 66  .            utf
b1d0: 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  8_printf(p->out,
b1e0: 22 25 2d 2a 2e 2a 73 25 73 22 2c 77 2c 77 2c 0a  "%-*.*s%s",w,w,.
b1f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b200: 20 20 20 22 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d     "------------
b210: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b220: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b230: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 22 0a  --------------".
b240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b250: 20 20 20 22 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d     "------------
b260: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b270: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b280: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 22 2c  --------------",
b290: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
b2a0: 20 20 20 20 20 69 3d 3d 6e 41 72 67 2d 31 20 3f       i==nArg-1 ?
b2b0: 20 72 6f 77 53 65 70 20 3a 20 22 20 20 22 29 3b   rowSep : "  ");
b2c0: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
b2d0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
b2e0: 20 20 20 20 20 69 66 28 20 61 7a 41 72 67 3d 3d       if( azArg==
b2f0: 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  0 ) break;.     
b300: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67   for(i=0; i<nArg
b310: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
b320: 69 6e 74 20 77 3b 0a 20 20 20 20 20 20 20 20 69  int w;.        i
b330: 66 28 20 69 3c 41 72 72 61 79 53 69 7a 65 28 70  f( i<ArraySize(p
b340: 2d 3e 61 63 74 75 61 6c 57 69 64 74 68 29 20 29  ->actualWidth) )
b350: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 77 20 3d  {.           w =
b360: 20 70 2d 3e 61 63 74 75 61 6c 57 69 64 74 68 5b   p->actualWidth[
b370: 69 5d 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  i];.        }els
b380: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 77 20  e{.           w 
b390: 3d 20 31 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a  = 10;.        }.
b3a0: 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 63          if( p->c
b3b0: 4d 6f 64 65 3d 3d 4d 4f 44 45 5f 45 78 70 6c 61  Mode==MODE_Expla
b3c0: 69 6e 20 26 26 20 61 7a 41 72 67 5b 69 5d 20 26  in && azArg[i] &
b3d0: 26 20 73 74 72 6c 65 6e 43 68 61 72 28 61 7a 41  & strlenChar(azA
b3e0: 72 67 5b 69 5d 29 3e 77 20 29 7b 0a 20 20 20 20  rg[i])>w ){.    
b3f0: 20 20 20 20 20 20 77 20 3d 20 73 74 72 6c 65 6e        w = strlen
b400: 43 68 61 72 28 61 7a 41 72 67 5b 69 5d 29 3b 0a  Char(azArg[i]);.
b410: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
b420: 20 20 69 66 28 20 69 3d 3d 31 20 26 26 20 70 2d    if( i==1 && p-
b430: 3e 61 69 49 6e 64 65 6e 74 20 26 26 20 70 2d 3e  >aiIndent && p->
b440: 70 53 74 6d 74 20 29 7b 0a 20 20 20 20 20 20 20  pStmt ){.       
b450: 20 20 20 69 66 28 20 70 2d 3e 69 49 6e 64 65 6e     if( p->iInden
b460: 74 3c 70 2d 3e 6e 49 6e 64 65 6e 74 20 29 7b 0a  t<p->nIndent ){.
b470: 20 20 20 20 20 20 20 20 20 20 20 20 75 74 66 38              utf8
b480: 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
b490: 22 25 2a 2e 73 22 2c 20 70 2d 3e 61 69 49 6e 64  "%*.s", p->aiInd
b4a0: 65 6e 74 5b 70 2d 3e 69 49 6e 64 65 6e 74 5d 2c  ent[p->iIndent],
b4b0: 20 22 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20   "");.          
b4c0: 7d 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 69  }.          p->i
b4d0: 49 6e 64 65 6e 74 2b 2b 3b 0a 20 20 20 20 20 20  Indent++;.      
b4e0: 20 20 7d 0a 20 20 20 20 20 20 20 20 75 74 66 38    }.        utf8
b4f0: 5f 77 69 64 74 68 5f 70 72 69 6e 74 28 70 2d 3e  _width_print(p->
b500: 6f 75 74 2c 20 77 2c 20 61 7a 41 72 67 5b 69 5d  out, w, azArg[i]
b510: 20 3f 20 61 7a 41 72 67 5b 69 5d 20 3a 20 70 2d   ? azArg[i] : p-
b520: 3e 6e 75 6c 6c 56 61 6c 75 65 29 3b 0a 20 20 20  >nullValue);.   
b530: 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
b540: 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20 69  (p->out, "%s", i
b550: 3d 3d 6e 41 72 67 2d 31 20 3f 20 72 6f 77 53 65  ==nArg-1 ? rowSe
b560: 70 20 3a 20 22 20 20 22 29 3b 0a 20 20 20 20 20  p : "  ");.     
b570: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
b580: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 4d      }.    case M
b590: 4f 44 45 5f 53 65 6d 69 3a 20 7b 20 20 20 2f 2a  ODE_Semi: {   /*
b5a0: 20 2e 73 63 68 65 6d 61 20 61 6e 64 20 2e 66 75   .schema and .fu
b5b0: 6c 6c 73 63 68 65 6d 61 20 6f 75 74 70 75 74 20  llschema output 
b5c0: 2a 2f 0a 20 20 20 20 20 20 70 72 69 6e 74 53 63  */.      printSc
b5d0: 68 65 6d 61 4c 69 6e 65 28 70 2d 3e 6f 75 74 2c  hemaLine(p->out,
b5e0: 20 61 7a 41 72 67 5b 30 5d 2c 20 22 3b 5c 6e 22   azArg[0], ";\n"
b5f0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
b600: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 4d      }.    case M
b610: 4f 44 45 5f 50 72 65 74 74 79 3a 20 7b 20 20 2f  ODE_Pretty: {  /
b620: 2a 20 2e 73 63 68 65 6d 61 20 61 6e 64 20 2e 66  * .schema and .f
b630: 75 6c 6c 73 63 68 65 6d 61 20 77 69 74 68 20 2d  ullschema with -
b640: 2d 69 6e 64 65 6e 74 20 2a 2f 0a 20 20 20 20 20  -indent */.     
b650: 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20 20 20   char *z;.      
b660: 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 69 6e 74  int j;.      int
b670: 20 6e 50 61 72 65 6e 20 3d 20 30 3b 0a 20 20 20   nParen = 0;.   
b680: 20 20 20 63 68 61 72 20 63 45 6e 64 20 3d 20 30     char cEnd = 0
b690: 3b 0a 20 20 20 20 20 20 63 68 61 72 20 63 3b 0a  ;.      char c;.
b6a0: 20 20 20 20 20 20 69 6e 74 20 6e 4c 69 6e 65 20        int nLine 
b6b0: 3d 20 30 3b 0a 20 20 20 20 20 20 61 73 73 65 72  = 0;.      asser
b6c0: 74 28 20 6e 41 72 67 3d 3d 31 20 29 3b 0a 20 20  t( nArg==1 );.  
b6d0: 20 20 20 20 69 66 28 20 61 7a 41 72 67 5b 30 5d      if( azArg[0]
b6e0: 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
b6f0: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73     if( sqlite3_s
b700: 74 72 6c 69 6b 65 28 22 43 52 45 41 54 45 20 56  trlike("CREATE V
b710: 49 45 57 25 22 2c 20 61 7a 41 72 67 5b 30 5d 2c  IEW%", azArg[0],
b720: 20 30 29 3d 3d 30 0a 20 20 20 20 20 20 20 7c 7c   0)==0.       ||
b730: 20 73 71 6c 69 74 65 33 5f 73 74 72 6c 69 6b 65   sqlite3_strlike
b740: 28 22 43 52 45 41 54 45 20 54 52 49 47 25 22 2c  ("CREATE TRIG%",
b750: 20 61 7a 41 72 67 5b 30 5d 2c 20 30 29 3d 3d 30   azArg[0], 0)==0
b760: 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20  .      ){.      
b770: 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d    utf8_printf(p-
b780: 3e 6f 75 74 2c 20 22 25 73 3b 5c 6e 22 2c 20 61  >out, "%s;\n", a
b790: 7a 41 72 67 5b 30 5d 29 3b 0a 20 20 20 20 20 20  zArg[0]);.      
b7a0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
b7b0: 0a 20 20 20 20 20 20 7a 20 3d 20 73 71 6c 69 74  .      z = sqlit
b7c0: 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 22 2c  e3_mprintf("%s",
b7d0: 20 61 7a 41 72 67 5b 30 5d 29 3b 0a 20 20 20 20   azArg[0]);.    
b7e0: 20 20 6a 20 3d 20 30 3b 0a 20 20 20 20 20 20 66    j = 0;.      f
b7f0: 6f 72 28 69 3d 30 3b 20 49 73 53 70 61 63 65 28  or(i=0; IsSpace(
b800: 7a 5b 69 5d 29 3b 20 69 2b 2b 29 7b 7d 0a 20 20  z[i]); i++){}.  
b810: 20 20 20 20 66 6f 72 28 3b 20 28 63 20 3d 20 7a      for(; (c = z
b820: 5b 69 5d 29 21 3d 30 3b 20 69 2b 2b 29 7b 0a 20  [i])!=0; i++){. 
b830: 20 20 20 20 20 20 20 69 66 28 20 49 73 53 70 61         if( IsSpa
b840: 63 65 28 63 29 20 29 7b 0a 20 20 20 20 20 20 20  ce(c) ){.       
b850: 20 20 20 69 66 28 20 7a 5b 6a 2d 31 5d 3d 3d 27     if( z[j-1]=='
b860: 5c 72 27 20 29 20 7a 5b 6a 2d 31 5d 20 3d 20 27  \r' ) z[j-1] = '
b870: 5c 6e 27 3b 0a 20 20 20 20 20 20 20 20 20 20 69  \n';.          i
b880: 66 28 20 49 73 53 70 61 63 65 28 7a 5b 6a 2d 31  f( IsSpace(z[j-1
b890: 5d 29 20 7c 7c 20 7a 5b 6a 2d 31 5d 3d 3d 27 28  ]) || z[j-1]=='(
b8a0: 27 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  ' ) continue;.  
b8b0: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
b8c0: 28 63 3d 3d 27 28 27 20 7c 7c 20 63 3d 3d 27 29  (c=='(' || c==')
b8d0: 27 29 20 26 26 20 6a 3e 30 20 26 26 20 49 73 53  ') && j>0 && IsS
b8e0: 70 61 63 65 28 7a 5b 6a 2d 31 5d 29 20 29 7b 0a  pace(z[j-1]) ){.
b8f0: 20 20 20 20 20 20 20 20 20 20 6a 2d 2d 3b 0a 20            j--;. 
b900: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
b910: 20 7a 5b 6a 2b 2b 5d 20 3d 20 63 3b 0a 20 20 20   z[j++] = c;.   
b920: 20 20 20 7d 0a 20 20 20 20 20 20 77 68 69 6c 65     }.      while
b930: 28 20 6a 3e 30 20 26 26 20 49 73 53 70 61 63 65  ( j>0 && IsSpace
b940: 28 7a 5b 6a 2d 31 5d 29 20 29 7b 20 6a 2d 2d 3b  (z[j-1]) ){ j--;
b950: 20 7d 0a 20 20 20 20 20 20 7a 5b 6a 5d 20 3d 20   }.      z[j] = 
b960: 30 3b 0a 20 20 20 20 20 20 69 66 28 20 73 74 72  0;.      if( str
b970: 6c 65 6e 33 30 28 7a 29 3e 3d 37 39 20 29 7b 0a  len30(z)>=79 ){.
b980: 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 6a 3d          for(i=j=
b990: 30 3b 20 28 63 20 3d 20 7a 5b 69 5d 29 21 3d 30  0; (c = z[i])!=0
b9a0: 3b 20 69 2b 2b 29 7b 20 20 2f 2a 20 43 6f 70 79  ; i++){  /* Copy
b9b0: 20 63 68 61 6e 67 65 73 20 66 72 6f 6d 20 7a 5b   changes from z[
b9c0: 69 5d 20 62 61 63 6b 20 74 6f 20 7a 5b 6a 5d 20  i] back to z[j] 
b9d0: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  */.          if(
b9e0: 20 63 3d 3d 63 45 6e 64 20 29 7b 0a 20 20 20 20   c==cEnd ){.    
b9f0: 20 20 20 20 20 20 20 20 63 45 6e 64 20 3d 20 30          cEnd = 0
ba00: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
ba10: 65 20 69 66 28 20 63 3d 3d 27 22 27 20 7c 7c 20  e if( c=='"' || 
ba20: 63 3d 3d 27 5c 27 27 20 7c 7c 20 63 3d 3d 27 60  c=='\'' || c=='`
ba30: 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ' ){.           
ba40: 20 63 45 6e 64 20 3d 20 63 3b 0a 20 20 20 20 20   cEnd = c;.     
ba50: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63       }else if( c
ba60: 3d 3d 27 5b 27 20 29 7b 0a 20 20 20 20 20 20 20  =='[' ){.       
ba70: 20 20 20 20 20 63 45 6e 64 20 3d 20 27 5d 27 3b       cEnd = ']';
ba80: 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
ba90: 20 69 66 28 20 63 3d 3d 27 2d 27 20 26 26 20 7a   if( c=='-' && z
baa0: 5b 69 2b 31 5d 3d 3d 27 2d 27 20 29 7b 0a 20 20  [i+1]=='-' ){.  
bab0: 20 20 20 20 20 20 20 20 20 20 63 45 6e 64 20 3d            cEnd =
bac0: 20 27 5c 6e 27 3b 0a 20 20 20 20 20 20 20 20 20   '\n';.         
bad0: 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 28   }else if( c=='(
bae0: 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ' ){.           
baf0: 20 6e 50 61 72 65 6e 2b 2b 3b 0a 20 20 20 20 20   nParen++;.     
bb00: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63       }else if( c
bb10: 3d 3d 27 29 27 20 29 7b 0a 20 20 20 20 20 20 20  ==')' ){.       
bb20: 20 20 20 20 20 6e 50 61 72 65 6e 2d 2d 3b 0a 20       nParen--;. 
bb30: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6e             if( n
bb40: 4c 69 6e 65 3e 30 20 26 26 20 6e 50 61 72 65 6e  Line>0 && nParen
bb50: 3d 3d 30 20 26 26 20 6a 3e 30 20 29 7b 0a 20 20  ==0 && j>0 ){.  
bb60: 20 20 20 20 20 20 20 20 20 20 20 20 70 72 69 6e              prin
bb70: 74 53 63 68 65 6d 61 4c 69 6e 65 4e 28 70 2d 3e  tSchemaLineN(p->
bb80: 6f 75 74 2c 20 7a 2c 20 6a 2c 20 22 5c 6e 22 29  out, z, j, "\n")
bb90: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
bba0: 6a 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  j = 0;.         
bbb0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
bbc0: 0a 20 20 20 20 20 20 20 20 20 20 7a 5b 6a 2b 2b  .          z[j++
bbd0: 5d 20 3d 20 63 3b 0a 20 20 20 20 20 20 20 20 20  ] = c;.         
bbe0: 20 69 66 28 20 6e 50 61 72 65 6e 3d 3d 31 20 26   if( nParen==1 &
bbf0: 26 20 63 45 6e 64 3d 3d 30 0a 20 20 20 20 20 20  & cEnd==0.      
bc00: 20 20 20 20 20 26 26 20 28 63 3d 3d 27 28 27 20       && (c=='(' 
bc10: 7c 7c 20 63 3d 3d 27 5c 6e 27 20 7c 7c 20 28 63  || c=='\n' || (c
bc20: 3d 3d 27 2c 27 20 26 26 20 21 77 73 54 6f 45 6f  ==',' && !wsToEo
bc30: 6c 28 7a 2b 69 2b 31 29 29 29 0a 20 20 20 20 20  l(z+i+1))).     
bc40: 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
bc50: 20 20 20 20 69 66 28 20 63 3d 3d 27 5c 6e 27 20      if( c=='\n' 
bc60: 29 20 6a 2d 2d 3b 0a 20 20 20 20 20 20 20 20 20  ) j--;.         
bc70: 20 20 20 70 72 69 6e 74 53 63 68 65 6d 61 4c 69     printSchemaLi
bc80: 6e 65 4e 28 70 2d 3e 6f 75 74 2c 20 7a 2c 20 6a  neN(p->out, z, j
bc90: 2c 20 22 5c 6e 20 20 22 29 3b 0a 20 20 20 20 20  , "\n  ");.     
bca0: 20 20 20 20 20 20 20 6a 20 3d 20 30 3b 0a 20 20         j = 0;.  
bcb0: 20 20 20 20 20 20 20 20 20 20 6e 4c 69 6e 65 2b            nLine+
bcc0: 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 77  +;.            w
bcd0: 68 69 6c 65 28 20 49 73 53 70 61 63 65 28 7a 5b  hile( IsSpace(z[
bce0: 69 2b 31 5d 29 20 29 7b 20 69 2b 2b 3b 20 7d 0a  i+1]) ){ i++; }.
bcf0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
bd00: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7a 5b      }.        z[
bd10: 6a 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  j] = 0;.      }.
bd20: 20 20 20 20 20 20 70 72 69 6e 74 53 63 68 65 6d        printSchem
bd30: 61 4c 69 6e 65 28 70 2d 3e 6f 75 74 2c 20 7a 2c  aLine(p->out, z,
bd40: 20 22 3b 5c 6e 22 29 3b 0a 20 20 20 20 20 20 73   ";\n");.      s
bd50: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a  qlite3_free(z);.
bd60: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
bd70: 20 7d 0a 20 20 20 20 63 61 73 65 20 4d 4f 44 45   }.    case MODE
bd80: 5f 4c 69 73 74 3a 20 7b 0a 20 20 20 20 20 20 69  _List: {.      i
bd90: 66 28 20 70 2d 3e 63 6e 74 2b 2b 3d 3d 30 20 26  f( p->cnt++==0 &
bda0: 26 20 70 2d 3e 73 68 6f 77 48 65 61 64 65 72 20  & p->showHeader 
bdb0: 29 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  ){.        for(i
bdc0: 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29  =0; i<nArg; i++)
bdd0: 7b 0a 20 20 20 20 20 20 20 20 20 20 75 74 66 38  {.          utf8
bde0: 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22  _printf(p->out,"
bdf0: 25 73 25 73 22 2c 61 7a 43 6f 6c 5b 69 5d 2c 0a  %s%s",azCol[i],.
be00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
be10: 20 20 69 3d 3d 6e 41 72 67 2d 31 20 3f 20 70 2d    i==nArg-1 ? p-
be20: 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 20 3a 20  >rowSeparator : 
be30: 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 29  p->colSeparator)
be40: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
be50: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 61 7a    }.      if( az
be60: 41 72 67 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  Arg==0 ) break;.
be70: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
be80: 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nArg; i++){.   
be90: 20 20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20 61       char *z = a
bea0: 7a 41 72 67 5b 69 5d 3b 0a 20 20 20 20 20 20 20  zArg[i];.       
beb0: 20 69 66 28 20 7a 3d 3d 30 20 29 20 7a 20 3d 20   if( z==0 ) z = 
bec0: 70 2d 3e 6e 75 6c 6c 56 61 6c 75 65 3b 0a 20 20  p->nullValue;.  
bed0: 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
bee0: 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20  f(p->out, "%s", 
bef0: 7a 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  z);.        if( 
bf00: 69 3c 6e 41 72 67 2d 31 20 29 7b 0a 20 20 20 20  i<nArg-1 ){.    
bf10: 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
bf20: 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20  f(p->out, "%s", 
bf30: 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 29  p->colSeparator)
bf40: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
bf50: 0a 20 20 20 20 20 20 20 20 20 20 75 74 66 38 5f  .          utf8_
bf60: 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
bf70: 25 73 22 2c 20 70 2d 3e 72 6f 77 53 65 70 61 72  %s", p->rowSepar
bf80: 61 74 6f 72 29 3b 0a 20 20 20 20 20 20 20 20 7d  ator);.        }
bf90: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
bfa0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
bfb0: 63 61 73 65 20 4d 4f 44 45 5f 48 74 6d 6c 3a 20  case MODE_Html: 
bfc0: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 63  {.      if( p->c
bfd0: 6e 74 2b 2b 3d 3d 30 20 26 26 20 70 2d 3e 73 68  nt++==0 && p->sh
bfe0: 6f 77 48 65 61 64 65 72 20 29 7b 0a 20 20 20 20  owHeader ){.    
bff0: 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70      raw_printf(p
c000: 2d 3e 6f 75 74 2c 22 3c 54 52 3e 22 29 3b 0a 20  ->out,"<TR>");. 
c010: 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20         for(i=0; 
c020: 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20  i<nArg; i++){.  
c030: 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e          raw_prin
c040: 74 66 28 70 2d 3e 6f 75 74 2c 22 3c 54 48 3e 22  tf(p->out,"<TH>"
c050: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6f 75 74  );.          out
c060: 70 75 74 5f 68 74 6d 6c 5f 73 74 72 69 6e 67 28  put_html_string(
c070: 70 2d 3e 6f 75 74 2c 20 61 7a 43 6f 6c 5b 69 5d  p->out, azCol[i]
c080: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 61 77  );.          raw
c090: 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22  _printf(p->out,"
c0a0: 3c 2f 54 48 3e 5c 6e 22 29 3b 0a 20 20 20 20 20  </TH>\n");.     
c0b0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 61 77     }.        raw
c0c0: 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22  _printf(p->out,"
c0d0: 3c 2f 54 52 3e 5c 6e 22 29 3b 0a 20 20 20 20 20  </TR>\n");.     
c0e0: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 61 7a 41   }.      if( azA
c0f0: 72 67 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  rg==0 ) break;. 
c100: 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
c110: 70 2d 3e 6f 75 74 2c 22 3c 54 52 3e 22 29 3b 0a  p->out,"<TR>");.
c120: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
c130: 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nArg; i++){.   
c140: 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
c150: 70 2d 3e 6f 75 74 2c 22 3c 54 44 3e 22 29 3b 0a  p->out,"<TD>");.
c160: 20 20 20 20 20 20 20 20 6f 75 74 70 75 74 5f 68          output_h
c170: 74 6d 6c 5f 73 74 72 69 6e 67 28 70 2d 3e 6f 75  tml_string(p->ou
c180: 74 2c 20 61 7a 41 72 67 5b 69 5d 20 3f 20 61 7a  t, azArg[i] ? az
c190: 41 72 67 5b 69 5d 20 3a 20 70 2d 3e 6e 75 6c 6c  Arg[i] : p->null
c1a0: 56 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 20 20  Value);.        
c1b0: 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  raw_printf(p->ou
c1c0: 74 2c 22 3c 2f 54 44 3e 5c 6e 22 29 3b 0a 20 20  t,"</TD>\n");.  
c1d0: 20 20 20 20 7d 0a 20 20 20 20 20 20 72 61 77 5f      }.      raw_
c1e0: 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 3c  printf(p->out,"<
c1f0: 2f 54 52 3e 5c 6e 22 29 3b 0a 20 20 20 20 20 20  /TR>\n");.      
c200: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
c210: 20 63 61 73 65 20 4d 4f 44 45 5f 54 63 6c 3a 20   case MODE_Tcl: 
c220: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 63  {.      if( p->c
c230: 6e 74 2b 2b 3d 3d 30 20 26 26 20 70 2d 3e 73 68  nt++==0 && p->sh
c240: 6f 77 48 65 61 64 65 72 20 29 7b 0a 20 20 20 20  owHeader ){.    
c250: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
c260: 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Arg; i++){.     
c270: 20 20 20 20 20 6f 75 74 70 75 74 5f 63 5f 73 74       output_c_st
c280: 72 69 6e 67 28 70 2d 3e 6f 75 74 2c 61 7a 43 6f  ring(p->out,azCo
c290: 6c 5b 69 5d 20 3f 20 61 7a 43 6f 6c 5b 69 5d 20  l[i] ? azCol[i] 
c2a0: 3a 20 22 22 29 3b 0a 20 20 20 20 20 20 20 20 20  : "");.         
c2b0: 20 69 66 28 69 3c 6e 41 72 67 2d 31 29 20 75 74   if(i<nArg-1) ut
c2c0: 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  f8_printf(p->out
c2d0: 2c 20 22 25 73 22 2c 20 70 2d 3e 63 6f 6c 53 65  , "%s", p->colSe
c2e0: 70 61 72 61 74 6f 72 29 3b 0a 20 20 20 20 20 20  parator);.      
c2f0: 20 20 7d 0a 20 20 20 20 20 20 20 20 75 74 66 38    }.        utf8
c300: 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
c310: 22 25 73 22 2c 20 70 2d 3e 72 6f 77 53 65 70 61  "%s", p->rowSepa
c320: 72 61 74 6f 72 29 3b 0a 20 20 20 20 20 20 7d 0a  rator);.      }.
c330: 20 20 20 20 20 20 69 66 28 20 61 7a 41 72 67 3d        if( azArg=
c340: 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
c350: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72    for(i=0; i<nAr
c360: 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  g; i++){.       
c370: 20 6f 75 74 70 75 74 5f 63 5f 73 74 72 69 6e 67   output_c_string
c380: 28 70 2d 3e 6f 75 74 2c 20 61 7a 41 72 67 5b 69  (p->out, azArg[i
c390: 5d 20 3f 20 61 7a 41 72 67 5b 69 5d 20 3a 20 70  ] ? azArg[i] : p
c3a0: 2d 3e 6e 75 6c 6c 56 61 6c 75 65 29 3b 0a 20 20  ->nullValue);.  
c3b0: 20 20 20 20 20 20 69 66 28 69 3c 6e 41 72 67 2d        if(i<nArg-
c3c0: 31 29 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70  1) utf8_printf(p
c3d0: 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20 70 2d 3e  ->out, "%s", p->
c3e0: 63 6f 6c 53 65 70 61 72 61 74 6f 72 29 3b 0a 20  colSeparator);. 
c3f0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 75 74 66       }.      utf
c400: 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  8_printf(p->out,
c410: 20 22 25 73 22 2c 20 70 2d 3e 72 6f 77 53 65 70   "%s", p->rowSep
c420: 61 72 61 74 6f 72 29 3b 0a 20 20 20 20 20 20 62  arator);.      b
c430: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
c440: 63 61 73 65 20 4d 4f 44 45 5f 43 73 76 3a 20 7b  case MODE_Csv: {
c450: 0a 20 20 20 20 20 20 73 65 74 42 69 6e 61 72 79  .      setBinary
c460: 4d 6f 64 65 28 70 2d 3e 6f 75 74 2c 20 31 29 3b  Mode(p->out, 1);
c470: 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 63 6e  .      if( p->cn
c480: 74 2b 2b 3d 3d 30 20 26 26 20 70 2d 3e 73 68 6f  t++==0 && p->sho
c490: 77 48 65 61 64 65 72 20 29 7b 0a 20 20 20 20 20  wHeader ){.     
c4a0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41     for(i=0; i<nA
c4b0: 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  rg; i++){.      
c4c0: 20 20 20 20 6f 75 74 70 75 74 5f 63 73 76 28 70      output_csv(p
c4d0: 2c 20 61 7a 43 6f 6c 5b 69 5d 20 3f 20 61 7a 43  , azCol[i] ? azC
c4e0: 6f 6c 5b 69 5d 20 3a 20 22 22 2c 20 69 3c 6e 41  ol[i] : "", i<nA
c4f0: 72 67 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 7d  rg-1);.        }
c500: 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72  .        utf8_pr
c510: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73  intf(p->out, "%s
c520: 22 2c 20 70 2d 3e 72 6f 77 53 65 70 61 72 61 74  ", p->rowSeparat
c530: 6f 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  or);.      }.   
c540: 20 20 20 69 66 28 20 6e 41 72 67 3e 30 20 29 7b     if( nArg>0 ){
c550: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30  .        for(i=0
c560: 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a  ; i<nArg; i++){.
c570: 20 20 20 20 20 20 20 20 20 20 6f 75 74 70 75 74            output
c580: 5f 63 73 76 28 70 2c 20 61 7a 41 72 67 5b 69 5d  _csv(p, azArg[i]
c590: 2c 20 69 3c 6e 41 72 67 2d 31 29 3b 0a 20 20 20  , i<nArg-1);.   
c5a0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 75       }.        u
c5b0: 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  tf8_printf(p->ou
c5c0: 74 2c 20 22 25 73 22 2c 20 70 2d 3e 72 6f 77 53  t, "%s", p->rowS
c5d0: 65 70 61 72 61 74 6f 72 29 3b 0a 20 20 20 20 20  eparator);.     
c5e0: 20 7d 0a 20 20 20 20 20 20 73 65 74 54 65 78 74   }.      setText
c5f0: 4d 6f 64 65 28 70 2d 3e 6f 75 74 2c 20 31 29 3b  Mode(p->out, 1);
c600: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
c610: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 4d 4f 44    }.    case MOD
c620: 45 5f 49 6e 73 65 72 74 3a 20 7b 0a 20 20 20 20  E_Insert: {.    
c630: 20 20 69 66 28 20 61 7a 41 72 67 3d 3d 30 20 29    if( azArg==0 )
c640: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 75 74   break;.      ut
c650: 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  f8_printf(p->out
c660: 2c 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 25 73  ,"INSERT INTO %s
c670: 22 2c 70 2d 3e 7a 44 65 73 74 54 61 62 6c 65 29  ",p->zDestTable)
c680: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 73  ;.      if( p->s
c690: 68 6f 77 48 65 61 64 65 72 20 29 7b 0a 20 20 20  howHeader ){.   
c6a0: 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
c6b0: 70 2d 3e 6f 75 74 2c 22 28 22 29 3b 0a 20 20 20  p->out,"(");.   
c6c0: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
c6d0: 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nArg; i++){.    
c6e0: 20 20 20 20 20 20 69 66 28 20 69 3e 30 20 29 20        if( i>0 ) 
c6f0: 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  raw_printf(p->ou
c700: 74 2c 20 22 2c 22 29 3b 0a 20 20 20 20 20 20 20  t, ",");.       
c710: 20 20 20 69 66 28 20 71 75 6f 74 65 43 68 61 72     if( quoteChar
c720: 28 61 7a 43 6f 6c 5b 69 5d 29 20 29 7b 0a 20 20  (azCol[i]) ){.  
c730: 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a            char *
c740: 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  z = sqlite3_mpri
c750: 6e 74 66 28 22 5c 22 25 77 5c 22 22 2c 20 61 7a  ntf("\"%w\"", az
c760: 43 6f 6c 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20  Col[i]);.       
c770: 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
c780: 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20 7a  (p->out, "%s", z
c790: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  );.            s
c7a0: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a  qlite3_free(z);.
c7b0: 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
c7c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 61 77  .            raw
c7d0: 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
c7e0: 22 25 73 22 2c 20 61 7a 43 6f 6c 5b 69 5d 29 3b  "%s", azCol[i]);
c7f0: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
c800: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72       }.        r
c810: 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  aw_printf(p->out
c820: 2c 22 29 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ,")");.      }. 
c830: 20 20 20 20 20 70 2d 3e 63 6e 74 2b 2b 3b 0a 20       p->cnt++;. 
c840: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
c850: 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nArg; i++){.    
c860: 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70      raw_printf(p
c870: 2d 3e 6f 75 74 2c 20 69 3e 30 20 3f 20 22 2c 22  ->out, i>0 ? ","
c880: 20 3a 20 22 20 56 41 4c 55 45 53 28 22 29 3b 0a   : " VALUES(");.
c890: 20 20 20 20 20 20 20 20 69 66 28 20 28 61 7a 41          if( (azA
c8a0: 72 67 5b 69 5d 3d 3d 30 29 20 7c 7c 20 28 61 69  rg[i]==0) || (ai
c8b0: 54 79 70 65 20 26 26 20 61 69 54 79 70 65 5b 69  Type && aiType[i
c8c0: 5d 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 29 20  ]==SQLITE_NULL) 
c8d0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 74 66  ){.          utf
c8e0: 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  8_printf(p->out,
c8f0: 22 4e 55 4c 4c 22 29 3b 0a 20 20 20 20 20 20 20  "NULL");.       
c900: 20 7d 65 6c 73 65 20 69 66 28 20 61 69 54 79 70   }else if( aiTyp
c910: 65 20 26 26 20 61 69 54 79 70 65 5b 69 5d 3d 3d  e && aiType[i]==
c920: 53 51 4c 49 54 45 5f 54 45 58 54 20 29 7b 0a 20  SQLITE_TEXT ){. 
c930: 20 20 20 20 20 20 20 20 20 69 66 28 20 53 68 65           if( She
c940: 6c 6c 48 61 73 46 6c 61 67 28 70 2c 20 53 48 46  llHasFlag(p, SHF
c950: 4c 47 5f 4e 65 77 6c 69 6e 65 73 29 20 29 7b 0a  LG_Newlines) ){.
c960: 20 20 20 20 20 20 20 20 20 20 20 20 6f 75 74 70              outp
c970: 75 74 5f 71 75 6f 74 65 64 5f 73 74 72 69 6e 67  ut_quoted_string
c980: 28 70 2d 3e 6f 75 74 2c 20 61 7a 41 72 67 5b 69  (p->out, azArg[i
c990: 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  ]);.          }e
c9a0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
c9b0: 20 6f 75 74 70 75 74 5f 71 75 6f 74 65 64 5f 65   output_quoted_e
c9c0: 73 63 61 70 65 64 5f 73 74 72 69 6e 67 28 70 2d  scaped_string(p-
c9d0: 3e 6f 75 74 2c 20 61 7a 41 72 67 5b 69 5d 29 3b  >out, azArg[i]);
c9e0: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
c9f0: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 61       }else if( a
ca00: 69 54 79 70 65 20 26 26 20 61 69 54 79 70 65 5b  iType && aiType[
ca10: 69 5d 3d 3d 53 51 4c 49 54 45 5f 49 4e 54 45 47  i]==SQLITE_INTEG
ca20: 45 52 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ER ){.          
ca30: 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f  utf8_printf(p->o
ca40: 75 74 2c 22 25 73 22 2c 20 61 7a 41 72 67 5b 69  ut,"%s", azArg[i
ca50: 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ]);.        }els
ca60: 65 20 69 66 28 20 61 69 54 79 70 65 20 26 26 20  e if( aiType && 
ca70: 61 69 54 79 70 65 5b 69 5d 3d 3d 53 51 4c 49 54  aiType[i]==SQLIT
ca80: 45 5f 46 4c 4f 41 54 20 29 7b 0a 20 20 20 20 20  E_FLOAT ){.     
ca90: 20 20 20 20 20 63 68 61 72 20 7a 5b 35 30 5d 3b       char z[50];
caa0: 0a 20 20 20 20 20 20 20 20 20 20 64 6f 75 62 6c  .          doubl
cab0: 65 20 72 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  e r = sqlite3_co
cac0: 6c 75 6d 6e 5f 64 6f 75 62 6c 65 28 70 2d 3e 70  lumn_double(p->p
cad0: 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20 20 20 20  Stmt, i);.      
cae0: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
caf0: 69 6e 74 66 28 35 30 2c 7a 2c 22 25 21 2e 32 30  intf(50,z,"%!.20
cb00: 67 22 2c 20 72 29 3b 0a 20 20 20 20 20 20 20 20  g", r);.        
cb10: 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e    raw_printf(p->
cb20: 6f 75 74 2c 20 22 25 73 22 2c 20 7a 29 3b 0a 20  out, "%s", z);. 
cb30: 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
cb40: 20 61 69 54 79 70 65 20 26 26 20 61 69 54 79 70   aiType && aiTyp
cb50: 65 5b 69 5d 3d 3d 53 51 4c 49 54 45 5f 42 4c 4f  e[i]==SQLITE_BLO
cb60: 42 20 26 26 20 70 2d 3e 70 53 74 6d 74 20 29 7b  B && p->pStmt ){
cb70: 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74  .          const
cb80: 20 76 6f 69 64 20 2a 70 42 6c 6f 62 20 3d 20 73   void *pBlob = s
cb90: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c  qlite3_column_bl
cba0: 6f 62 28 70 2d 3e 70 53 74 6d 74 2c 20 69 29 3b  ob(p->pStmt, i);
cbb0: 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e  .          int n
cbc0: 42 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33 5f 63  Blob = sqlite3_c
cbd0: 6f 6c 75 6d 6e 5f 62 79 74 65 73 28 70 2d 3e 70  olumn_bytes(p->p
cbe0: 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20 20 20 20  Stmt, i);.      
cbf0: 20 20 20 20 6f 75 74 70 75 74 5f 68 65 78 5f 62      output_hex_b
cc00: 6c 6f 62 28 70 2d 3e 6f 75 74 2c 20 70 42 6c 6f  lob(p->out, pBlo
cc10: 62 2c 20 6e 42 6c 6f 62 29 3b 0a 20 20 20 20 20  b, nBlob);.     
cc20: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69 73 4e     }else if( isN
cc30: 75 6d 62 65 72 28 61 7a 41 72 67 5b 69 5d 2c 20  umber(azArg[i], 
cc40: 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  0) ){.          
cc50: 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f  utf8_printf(p->o
cc60: 75 74 2c 22 25 73 22 2c 20 61 7a 41 72 67 5b 69  ut,"%s", azArg[i
cc70: 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ]);.        }els
cc80: 65 20 69 66 28 20 53 68 65 6c 6c 48 61 73 46 6c  e if( ShellHasFl
cc90: 61 67 28 70 2c 20 53 48 46 4c 47 5f 4e 65 77 6c  ag(p, SHFLG_Newl
cca0: 69 6e 65 73 29 20 29 7b 0a 20 20 20 20 20 20 20  ines) ){.       
ccb0: 20 20 20 6f 75 74 70 75 74 5f 71 75 6f 74 65 64     output_quoted
ccc0: 5f 73 74 72 69 6e 67 28 70 2d 3e 6f 75 74 2c 20  _string(p->out, 
ccd0: 61 7a 41 72 67 5b 69 5d 29 3b 0a 20 20 20 20 20  azArg[i]);.     
cce0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
ccf0: 20 20 20 20 6f 75 74 70 75 74 5f 71 75 6f 74 65      output_quote
cd00: 64 5f 65 73 63 61 70 65 64 5f 73 74 72 69 6e 67  d_escaped_string
cd10: 28 70 2d 3e 6f 75 74 2c 20 61 7a 41 72 67 5b 69  (p->out, azArg[i
cd20: 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ]);.        }.  
cd30: 20 20 20 20 7d 0a 20 20 20 20 20 20 72 61 77 5f      }.      raw_
cd40: 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 29  printf(p->out,")
cd50: 3b 5c 6e 22 29 3b 0a 20 20 20 20 20 20 62 72 65  ;\n");.      bre
cd60: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
cd70: 73 65 20 4d 4f 44 45 5f 51 75 6f 74 65 3a 20 7b  se MODE_Quote: {
cd80: 0a 20 20 20 20 20 20 69 66 28 20 61 7a 41 72 67  .      if( azArg
cd90: 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
cda0: 20 20 20 69 66 28 20 70 2d 3e 63 6e 74 3d 3d 30     if( p->cnt==0
cdb0: 20 26 26 20 70 2d 3e 73 68 6f 77 48 65 61 64 65   && p->showHeade
cdc0: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6f 72  r ){.        for
cdd0: 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b  (i=0; i<nArg; i+
cde0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66  +){.          if
cdf0: 28 20 69 3e 30 20 29 20 72 61 77 5f 70 72 69 6e  ( i>0 ) raw_prin
ce00: 74 66 28 70 2d 3e 6f 75 74 2c 20 22 2c 22 29 3b  tf(p->out, ",");
ce10: 0a 20 20 20 20 20 20 20 20 20 20 6f 75 74 70 75  .          outpu
ce20: 74 5f 71 75 6f 74 65 64 5f 73 74 72 69 6e 67 28  t_quoted_string(
ce30: 70 2d 3e 6f 75 74 2c 20 61 7a 43 6f 6c 5b 69 5d  p->out, azCol[i]
ce40: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
ce50: 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
ce60: 70 2d 3e 6f 75 74 2c 22 5c 6e 22 29 3b 0a 20 20  p->out,"\n");.  
ce70: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e 63      }.      p->c
ce80: 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 66 6f 72 28  nt++;.      for(
ce90: 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b  i=0; i<nArg; i++
cea0: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  ){.        if( i
ceb0: 3e 30 20 29 20 72 61 77 5f 70 72 69 6e 74 66 28  >0 ) raw_printf(
cec0: 70 2d 3e 6f 75 74 2c 20 22 2c 22 29 3b 0a 20 20  p->out, ",");.  
ced0: 20 20 20 20 20 20 69 66 28 20 28 61 7a 41 72 67        if( (azArg
cee0: 5b 69 5d 3d 3d 30 29 20 7c 7c 20 28 61 69 54 79  [i]==0) || (aiTy
cef0: 70 65 20 26 26 20 61 69 54 79 70 65 5b 69 5d 3d  pe && aiType[i]=
cf00: 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 29 20 29 7b  =SQLITE_NULL) ){
cf10: 0a 20 20 20 20 20 20 20 20 20 20 75 74 66 38 5f  .          utf8_
cf20: 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 4e  printf(p->out,"N
cf30: 55 4c 4c 22 29 3b 0a 20 20 20 20 20 20 20 20 7d  ULL");.        }
cf40: 65 6c 73 65 20 69 66 28 20 61 69 54 79 70 65 20  else if( aiType 
cf50: 26 26 20 61 69 54 79 70 65 5b 69 5d 3d 3d 53 51  && aiType[i]==SQ
cf60: 4c 49 54 45 5f 54 45 58 54 20 29 7b 0a 20 20 20  LITE_TEXT ){.   
cf70: 20 20 20 20 20 20 20 6f 75 74 70 75 74 5f 71 75         output_qu
cf80: 6f 74 65 64 5f 73 74 72 69 6e 67 28 70 2d 3e 6f  oted_string(p->o
cf90: 75 74 2c 20 61 7a 41 72 67 5b 69 5d 29 3b 0a 20  ut, azArg[i]);. 
cfa0: 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
cfb0: 20 61 69 54 79 70 65 20 26 26 20 61 69 54 79 70   aiType && aiTyp
cfc0: 65 5b 69 5d 3d 3d 53 51 4c 49 54 45 5f 49 4e 54  e[i]==SQLITE_INT
cfd0: 45 47 45 52 20 29 7b 0a 20 20 20 20 20 20 20 20  EGER ){.        
cfe0: 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d    utf8_printf(p-
cff0: 3e 6f 75 74 2c 22 25 73 22 2c 20 61 7a 41 72 67  >out,"%s", azArg
d000: 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  [i]);.        }e
d010: 6c 73 65 20 69 66 28 20 61 69 54 79 70 65 20 26  lse if( aiType &
d020: 26 20 61 69 54 79 70 65 5b 69 5d 3d 3d 53 51 4c  & aiType[i]==SQL
d030: 49 54 45 5f 46 4c 4f 41 54 20 29 7b 0a 20 20 20  ITE_FLOAT ){.   
d040: 20 20 20 20 20 20 20 63 68 61 72 20 7a 5b 35 30         char z[50
d050: 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 64 6f 75  ];.          dou
d060: 62 6c 65 20 72 20 3d 20 73 71 6c 69 74 65 33 5f  ble r = sqlite3_
d070: 63 6f 6c 75 6d 6e 5f 64 6f 75 62 6c 65 28 70 2d  column_double(p-
d080: 3e 70 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20 20  >pStmt, i);.    
d090: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
d0a0: 70 72 69 6e 74 66 28 35 30 2c 7a 2c 22 25 21 2e  printf(50,z,"%!.
d0b0: 32 30 67 22 2c 20 72 29 3b 0a 20 20 20 20 20 20  20g", r);.      
d0c0: 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70      raw_printf(p
d0d0: 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20 7a 29 3b  ->out, "%s", z);
d0e0: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
d0f0: 66 28 20 61 69 54 79 70 65 20 26 26 20 61 69 54  f( aiType && aiT
d100: 79 70 65 5b 69 5d 3d 3d 53 51 4c 49 54 45 5f 42  ype[i]==SQLITE_B
d110: 4c 4f 42 20 26 26 20 70 2d 3e 70 53 74 6d 74 20  LOB && p->pStmt 
d120: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e  ){.          con
d130: 73 74 20 76 6f 69 64 20 2a 70 42 6c 6f 62 20 3d  st void *pBlob =
d140: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
d150: 62 6c 6f 62 28 70 2d 3e 70 53 74 6d 74 2c 20 69  blob(p->pStmt, i
d160: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  );.          int
d170: 20 6e 42 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33   nBlob = sqlite3
d180: 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 28 70 2d  _column_bytes(p-
d190: 3e 70 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20 20  >pStmt, i);.    
d1a0: 20 20 20 20 20 20 6f 75 74 70 75 74 5f 68 65 78        output_hex
d1b0: 5f 62 6c 6f 62 28 70 2d 3e 6f 75 74 2c 20 70 42  _blob(p->out, pB
d1c0: 6c 6f 62 2c 20 6e 42 6c 6f 62 29 3b 0a 20 20 20  lob, nBlob);.   
d1d0: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69       }else if( i
d1e0: 73 4e 75 6d 62 65 72 28 61 7a 41 72 67 5b 69 5d  sNumber(azArg[i]
d1f0: 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20  , 0) ){.        
d200: 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d    utf8_printf(p-
d210: 3e 6f 75 74 2c 22 25 73 22 2c 20 61 7a 41 72 67  >out,"%s", azArg
d220: 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  [i]);.        }e
d230: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 6f  lse{.          o
d240: 75 74 70 75 74 5f 71 75 6f 74 65 64 5f 73 74 72  utput_quoted_str
d250: 69 6e 67 28 70 2d 3e 6f 75 74 2c 20 61 7a 41 72  ing(p->out, azAr
d260: 67 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d  g[i]);.        }
d270: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
d280: 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  aw_printf(p->out
d290: 2c 22 5c 6e 22 29 3b 0a 20 20 20 20 20 20 62 72  ,"\n");.      br
d2a0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
d2b0: 61 73 65 20 4d 4f 44 45 5f 41 73 63 69 69 3a 20  ase MODE_Ascii: 
d2c0: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 63  {.      if( p->c
d2d0: 6e 74 2b 2b 3d 3d 30 20 26 26 20 70 2d 3e 73 68  nt++==0 && p->sh
d2e0: 6f 77 48 65 61 64 65 72 20 29 7b 0a 20 20 20 20  owHeader ){.    
d2f0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
d300: 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Arg; i++){.     
d310: 20 20 20 20 20 69 66 28 20 69 3e 30 20 29 20 75       if( i>0 ) u
d320: 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  tf8_printf(p->ou
d330: 74 2c 20 22 25 73 22 2c 20 70 2d 3e 63 6f 6c 53  t, "%s", p->colS
d340: 65 70 61 72 61 74 6f 72 29 3b 0a 20 20 20 20 20  eparator);.     
d350: 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
d360: 28 70 2d 3e 6f 75 74 2c 22 25 73 22 2c 61 7a 43  (p->out,"%s",azC
d370: 6f 6c 5b 69 5d 20 3f 20 61 7a 43 6f 6c 5b 69 5d  ol[i] ? azCol[i]
d380: 20 3a 20 22 22 29 3b 0a 20 20 20 20 20 20 20 20   : "");.        
d390: 7d 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70  }.        utf8_p
d3a0: 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25  rintf(p->out, "%
d3b0: 73 22 2c 20 70 2d 3e 72 6f 77 53 65 70 61 72 61  s", p->rowSepara
d3c0: 74 6f 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  tor);.      }.  
d3d0: 20 20 20 20 69 66 28 20 61 7a 41 72 67 3d 3d 30      if( azArg==0
d3e0: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
d3f0: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b  for(i=0; i<nArg;
d400: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   i++){.        i
d410: 66 28 20 69 3e 30 20 29 20 75 74 66 38 5f 70 72  f( i>0 ) utf8_pr
d420: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73  intf(p->out, "%s
d430: 22 2c 20 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74  ", p->colSeparat
d440: 6f 72 29 3b 0a 20 20 20 20 20 20 20 20 75 74 66  or);.        utf
d450: 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  8_printf(p->out,
d460: 22 25 73 22 2c 61 7a 41 72 67 5b 69 5d 20 3f 20  "%s",azArg[i] ? 
d470: 61 7a 41 72 67 5b 69 5d 20 3a 20 70 2d 3e 6e 75  azArg[i] : p->nu
d480: 6c 6c 56 61 6c 75 65 29 3b 0a 20 20 20 20 20 20  llValue);.      
d490: 7d 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69  }.      utf8_pri
d4a0: 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22  ntf(p->out, "%s"
d4b0: 2c 20 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f  , p->rowSeparato
d4c0: 72 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  r);.      break;
d4d0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
d4e0: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
d4f0: 54 68 69 73 20 69 73 20 74 68 65 20 63 61 6c 6c  This is the call
d500: 62 61 63 6b 20 72 6f 75 74 69 6e 65 20 74 68 61  back routine tha
d510: 74 20 74 68 65 20 53 51 4c 69 74 65 20 6c 69 62  t the SQLite lib
d520: 72 61 72 79 0a 2a 2a 20 69 6e 76 6f 6b 65 73 20  rary.** invokes 
d530: 66 6f 72 20 65 61 63 68 20 72 6f 77 20 6f 66 20  for each row of 
d540: 61 20 71 75 65 72 79 20 72 65 73 75 6c 74 2e 0a  a query result..
d550: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 61  */.static int ca
d560: 6c 6c 62 61 63 6b 28 76 6f 69 64 20 2a 70 41 72  llback(void *pAr
d570: 67 2c 20 69 6e 74 20 6e 41 72 67 2c 20 63 68 61  g, int nArg, cha
d580: 72 20 2a 2a 61 7a 41 72 67 2c 20 63 68 61 72 20  r **azArg, char 
d590: 2a 2a 61 7a 43 6f 6c 29 7b 0a 20 20 2f 2a 20 73  **azCol){.  /* s
d5a0: 69 6e 63 65 20 77 65 20 64 6f 6e 27 74 20 68 61  ince we don't ha
d5b0: 76 65 20 74 79 70 65 20 69 6e 66 6f 2c 20 63 61  ve type info, ca
d5c0: 6c 6c 20 74 68 65 20 73 68 65 6c 6c 5f 63 61 6c  ll the shell_cal
d5d0: 6c 62 61 63 6b 20 77 69 74 68 20 61 20 4e 55 4c  lback with a NUL
d5e0: 4c 20 76 61 6c 75 65 20 2a 2f 0a 20 20 72 65 74  L value */.  ret
d5f0: 75 72 6e 20 73 68 65 6c 6c 5f 63 61 6c 6c 62 61  urn shell_callba
d600: 63 6b 28 70 41 72 67 2c 20 6e 41 72 67 2c 20 61  ck(pArg, nArg, a
d610: 7a 41 72 67 2c 20 61 7a 43 6f 6c 2c 20 4e 55 4c  zArg, azCol, NUL
d620: 4c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  L);.}../*.** Thi
d630: 73 20 69 73 20 74 68 65 20 63 61 6c 6c 62 61 63  s is the callbac
d640: 6b 20 72 6f 75 74 69 6e 65 20 66 72 6f 6d 20 73  k routine from s
d650: 71 6c 69 74 65 33 5f 65 78 65 63 28 29 20 74 68  qlite3_exec() th
d660: 61 74 20 61 70 70 65 6e 64 73 20 61 6c 6c 0a 2a  at appends all.*
d670: 2a 20 6f 75 74 70 75 74 20 6f 6e 74 6f 20 74 68  * output onto th
d680: 65 20 65 6e 64 20 6f 66 20 61 20 53 68 65 6c 6c  e end of a Shell
d690: 54 65 78 74 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a  Text object..*/.
d6a0: 73 74 61 74 69 63 20 69 6e 74 20 63 61 70 74 75  static int captu
d6b0: 72 65 4f 75 74 70 75 74 43 61 6c 6c 62 61 63 6b  reOutputCallback
d6c0: 28 76 6f 69 64 20 2a 70 41 72 67 2c 20 69 6e 74  (void *pArg, int
d6d0: 20 6e 41 72 67 2c 20 63 68 61 72 20 2a 2a 61 7a   nArg, char **az
d6e0: 41 72 67 2c 20 63 68 61 72 20 2a 2a 61 7a 29 7b  Arg, char **az){
d6f0: 0a 20 20 53 68 65 6c 6c 54 65 78 74 20 2a 70 20  .  ShellText *p 
d700: 3d 20 28 53 68 65 6c 6c 54 65 78 74 2a 29 70 41  = (ShellText*)pA
d710: 72 67 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 55  rg;.  int i;.  U
d720: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
d730: 61 7a 29 3b 0a 20 20 69 66 28 20 61 7a 41 72 67  az);.  if( azArg
d740: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
d750: 20 20 69 66 28 20 70 2d 3e 6e 20 29 20 61 70 70    if( p->n ) app
d760: 65 6e 64 54 65 78 74 28 70 2c 20 22 7c 22 2c 20  endText(p, "|", 
d770: 30 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  0);.  for(i=0; i
d780: 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nArg; i++){.   
d790: 20 69 66 28 20 69 20 29 20 61 70 70 65 6e 64 54   if( i ) appendT
d7a0: 65 78 74 28 70 2c 20 22 2c 22 2c 20 30 29 3b 0a  ext(p, ",", 0);.
d7b0: 20 20 20 20 69 66 28 20 61 7a 41 72 67 5b 69 5d      if( azArg[i]
d7c0: 20 29 20 61 70 70 65 6e 64 54 65 78 74 28 70 2c   ) appendText(p,
d7d0: 20 61 7a 41 72 67 5b 69 5d 2c 20 30 29 3b 0a 20   azArg[i], 0);. 
d7e0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
d7f0: 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
d800: 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20   an appropriate 
d810: 53 45 4c 46 54 45 53 54 20 74 61 62 6c 65 20 69  SELFTEST table i
d820: 6e 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62  n the main datab
d830: 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ase..*/.static v
d840: 6f 69 64 20 63 72 65 61 74 65 53 65 6c 66 74 65  oid createSelfte
d850: 73 74 54 61 62 6c 65 28 53 68 65 6c 6c 53 74 61  stTable(ShellSta
d860: 74 65 20 2a 70 29 7b 0a 20 20 63 68 61 72 20 2a  te *p){.  char *
d870: 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 73  zErrMsg = 0;.  s
d880: 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64  qlite3_exec(p->d
d890: 62 2c 0a 20 20 20 20 22 53 41 56 45 50 4f 49 4e  b,.    "SAVEPOIN
d8a0: 54 20 73 65 6c 66 74 65 73 74 5f 69 6e 69 74 3b  T selftest_init;
d8b0: 5c 6e 22 0a 20 20 20 20 22 43 52 45 41 54 45 20  \n".    "CREATE 
d8c0: 54 41 42 4c 45 20 49 46 20 4e 4f 54 20 45 58 49  TABLE IF NOT EXI
d8d0: 53 54 53 20 73 65 6c 66 74 65 73 74 28 5c 6e 22  STS selftest(\n"
d8e0: 0a 20 20 20 20 22 20 20 74 6e 6f 20 49 4e 54 45  .    "  tno INTE
d8f0: 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c  GER PRIMARY KEY,
d900: 5c 6e 22 20 20 20 2f 2a 20 54 65 73 74 20 6e 75  \n"   /* Test nu
d910: 6d 62 65 72 20 2a 2f 0a 20 20 20 20 22 20 20 6f  mber */.    "  o
d920: 70 20 54 45 58 54 2c 5c 6e 22 20 20 20 20 20 20  p TEXT,\n"      
d930: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
d940: 4f 70 65 72 61 74 6f 72 3a 20 20 6d 65 6d 6f 20  Operator:  memo 
d950: 72 75 6e 20 2a 2f 0a 20 20 20 20 22 20 20 63 6d  run */.    "  cm
d960: 64 20 54 45 58 54 2c 5c 6e 22 20 20 20 20 20 20  d TEXT,\n"      
d970: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
d980: 6f 6d 6d 61 6e 64 20 74 65 78 74 20 2a 2f 0a 20  ommand text */. 
d990: 20 20 20 22 20 20 61 6e 73 20 54 45 58 54 5c 6e     "  ans TEXT\n
d9a0: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
d9b0: 20 20 20 20 2f 2a 20 44 65 73 69 72 65 64 20 61      /* Desired a
d9c0: 6e 73 77 65 72 20 2a 2f 0a 20 20 20 20 22 29 3b  nswer */.    ");
d9d0: 22 0a 20 20 20 20 22 43 52 45 41 54 45 20 54 45  ".    "CREATE TE
d9e0: 4d 50 20 54 41 42 4c 45 20 5b 5f 73 68 65 6c 6c  MP TABLE [_shell
d9f0: 24 73 65 6c 66 5d 28 6f 70 2c 63 6d 64 2c 61 6e  $self](op,cmd,an
da00: 73 29 3b 5c 6e 22 0a 20 20 20 20 22 49 4e 53 45  s);\n".    "INSE
da10: 52 54 20 49 4e 54 4f 20 5b 5f 73 68 65 6c 6c 24  RT INTO [_shell$
da20: 73 65 6c 66 5d 28 72 6f 77 69 64 2c 6f 70 2c 63  self](rowid,op,c
da30: 6d 64 29 5c 6e 22 0a 20 20 20 20 22 20 20 56 41  md)\n".    "  VA
da40: 4c 55 45 53 28 63 6f 61 6c 65 73 63 65 28 28 53  LUES(coalesce((S
da50: 45 4c 45 43 54 20 28 6d 61 78 28 74 6e 6f 29 2b  ELECT (max(tno)+
da60: 31 30 30 29 2f 31 30 20 46 52 4f 4d 20 73 65 6c  100)/10 FROM sel
da70: 66 74 65 73 74 29 2c 31 30 29 2c 5c 6e 22 0a 20  ftest),10),\n". 
da80: 20 20 20 22 20 20 20 20 20 20 20 20 20 27 6d 65     "         'me
da90: 6d 6f 27 2c 27 54 65 73 74 73 20 67 65 6e 65 72  mo','Tests gener
daa0: 61 74 65 64 20 62 79 20 2d 2d 69 6e 69 74 27 29  ated by --init')
dab0: 3b 5c 6e 22 0a 20 20 20 20 22 49 4e 53 45 52 54  ;\n".    "INSERT
dac0: 20 49 4e 54 4f 20 5b 5f 73 68 65 6c 6c 24 73 65   INTO [_shell$se
dad0: 6c 66 5d 5c 6e 22 0a 20 20 20 20 22 20 20 53 45  lf]\n".    "  SE
dae0: 4c 45 43 54 20 27 72 75 6e 27 2c 5c 6e 22 0a 20  LECT 'run',\n". 
daf0: 20 20 20 22 20 20 20 20 27 53 45 4c 45 43 54 20     "    'SELECT 
db00: 68 65 78 28 73 68 61 33 5f 71 75 65 72 79 28 27  hex(sha3_query('
db10: 27 53 45 4c 45 43 54 20 74 79 70 65 2c 6e 61 6d  'SELECT type,nam
db20: 65 2c 74 62 6c 5f 6e 61 6d 65 2c 73 71 6c 20 22  e,tbl_name,sql "
db30: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
db40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
db50: 20 20 22 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d    "FROM sqlite_m
db60: 61 73 74 65 72 20 4f 52 44 45 52 20 42 59 20 32  aster ORDER BY 2
db70: 27 27 2c 32 32 34 29 29 27 2c 5c 6e 22 0a 20 20  '',224))',\n".  
db80: 20 20 22 20 20 20 20 68 65 78 28 73 68 61 33 5f    "    hex(sha3_
db90: 71 75 65 72 79 28 27 53 45 4c 45 43 54 20 74 79  query('SELECT ty
dba0: 70 65 2c 6e 61 6d 65 2c 74 62 6c 5f 6e 61 6d 65  pe,name,tbl_name
dbb0: 2c 73 71 6c 20 22 0a 20 20 20 20 20 20 20 20 20  ,sql ".         
dbc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dbd0: 20 22 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61   "FROM sqlite_ma
dbe0: 73 74 65 72 20 4f 52 44 45 52 20 42 59 20 32 27  ster ORDER BY 2'
dbf0: 2c 32 32 34 29 29 3b 5c 6e 22 0a 20 20 20 20 22  ,224));\n".    "
dc00: 49 4e 53 45 52 54 20 49 4e 54 4f 20 5b 5f 73 68  INSERT INTO [_sh
dc10: 65 6c 6c 24 73 65 6c 66 5d 5c 6e 22 0a 20 20 20  ell$self]\n".   
dc20: 20 22 20 20 53 45 4c 45 43 54 20 27 72 75 6e 27   "  SELECT 'run'
dc30: 2c 22 0a 20 20 20 20 22 20 20 20 20 27 53 45 4c  ,".    "    'SEL
dc40: 45 43 54 20 68 65 78 28 73 68 61 33 5f 71 75 65  ECT hex(sha3_que
dc50: 72 79 28 27 27 53 45 4c 45 43 54 20 2a 20 46 52  ry(''SELECT * FR
dc60: 4f 4d 20 5c 22 27 20 7c 7c 22 0a 20 20 20 20 22  OM \"' ||".    "
dc70: 20 20 20 20 20 20 20 20 70 72 69 6e 74 66 28 27          printf('
dc80: 25 77 27 2c 6e 61 6d 65 29 20 7c 7c 20 27 5c 22  %w',name) || '\"
dc90: 20 4e 4f 54 20 49 4e 44 45 58 45 44 27 27 2c 32   NOT INDEXED'',2
dca0: 32 34 29 29 27 2c 5c 6e 22 0a 20 20 20 20 22 20  24))',\n".    " 
dcb0: 20 20 20 68 65 78 28 73 68 61 33 5f 71 75 65 72     hex(sha3_quer
dcc0: 79 28 70 72 69 6e 74 66 28 27 53 45 4c 45 43 54  y(printf('SELECT
dcd0: 20 2a 20 46 52 4f 4d 20 5c 22 25 77 5c 22 20 4e   * FROM \"%w\" N
dce0: 4f 54 20 49 4e 44 45 58 45 44 27 2c 6e 61 6d 65  OT INDEXED',name
dcf0: 29 2c 32 32 34 29 29 5c 6e 22 0a 20 20 20 20 22  ),224))\n".    "
dd00: 20 20 46 52 4f 4d 20 28 5c 6e 22 0a 20 20 20 20    FROM (\n".    
dd10: 22 20 20 20 20 53 45 4c 45 43 54 20 6e 61 6d 65  "    SELECT name
dd20: 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73   FROM sqlite_mas
dd30: 74 65 72 5c 6e 22 0a 20 20 20 20 22 20 20 20 20  ter\n".    "    
dd40: 20 57 48 45 52 45 20 74 79 70 65 3d 27 74 61 62   WHERE type='tab
dd50: 6c 65 27 5c 6e 22 0a 20 20 20 20 22 20 20 20 20  le'\n".    "    
dd60: 20 20 20 41 4e 44 20 6e 61 6d 65 3c 3e 27 73 65     AND name<>'se
dd70: 6c 66 74 65 73 74 27 5c 6e 22 0a 20 20 20 20 22  lftest'\n".    "
dd80: 20 20 20 20 20 20 20 41 4e 44 20 63 6f 61 6c 65         AND coale
dd90: 73 63 65 28 72 6f 6f 74 70 61 67 65 2c 30 29 3e  sce(rootpage,0)>
dda0: 30 5c 6e 22 0a 20 20 20 20 22 20 20 29 5c 6e 22  0\n".    "  )\n"
ddb0: 0a 20 20 20 20 22 20 4f 52 44 45 52 20 42 59 20  .    " ORDER BY 
ddc0: 6e 61 6d 65 3b 5c 6e 22 0a 20 20 20 20 22 49 4e  name;\n".    "IN
ddd0: 53 45 52 54 20 49 4e 54 4f 20 5b 5f 73 68 65 6c  SERT INTO [_shel
dde0: 6c 24 73 65 6c 66 5d 5c 6e 22 0a 20 20 20 20 22  l$self]\n".    "
ddf0: 20 20 56 41 4c 55 45 53 28 27 72 75 6e 27 2c 27    VALUES('run','
de00: 50 52 41 47 4d 41 20 69 6e 74 65 67 72 69 74 79  PRAGMA integrity
de10: 5f 63 68 65 63 6b 27 2c 27 6f 6b 27 29 3b 5c 6e  _check','ok');\n
de20: 22 0a 20 20 20 20 22 49 4e 53 45 52 54 20 49 4e  ".    "INSERT IN
de30: 54 4f 20 73 65 6c 66 74 65 73 74 28 74 6e 6f 2c  TO selftest(tno,
de40: 6f 70 2c 63 6d 64 2c 61 6e 73 29 22 0a 20 20 20  op,cmd,ans)".   
de50: 20 22 20 20 53 45 4c 45 43 54 20 72 6f 77 69 64   "  SELECT rowid
de60: 2a 31 30 2c 6f 70 2c 63 6d 64 2c 61 6e 73 20 46  *10,op,cmd,ans F
de70: 52 4f 4d 20 5b 5f 73 68 65 6c 6c 24 73 65 6c 66  ROM [_shell$self
de80: 5d 3b 5c 6e 22 0a 20 20 20 20 22 44 52 4f 50 20  ];\n".    "DROP 
de90: 54 41 42 4c 45 20 5b 5f 73 68 65 6c 6c 24 73 65  TABLE [_shell$se
dea0: 6c 66 5d 3b 22 0a 20 20 20 20 2c 30 2c 30 2c 26  lf];".    ,0,0,&
deb0: 7a 45 72 72 4d 73 67 29 3b 0a 20 20 69 66 28 20  zErrMsg);.  if( 
dec0: 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20 75  zErrMsg ){.    u
ded0: 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72  tf8_printf(stder
dee0: 72 2c 20 22 53 45 4c 46 54 45 53 54 20 69 6e 69  r, "SELFTEST ini
def0: 74 69 61 6c 69 7a 61 74 69 6f 6e 20 66 61 69 6c  tialization fail
df00: 75 72 65 3a 20 25 73 5c 6e 22 2c 20 7a 45 72 72  ure: %s\n", zErr
df10: 4d 73 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Msg);.    sqlite
df20: 33 5f 66 72 65 65 28 7a 45 72 72 4d 73 67 29 3b  3_free(zErrMsg);
df30: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 65  .  }.  sqlite3_e
df40: 78 65 63 28 70 2d 3e 64 62 2c 20 22 52 45 4c 45  xec(p->db, "RELE
df50: 41 53 45 20 73 65 6c 66 74 65 73 74 5f 69 6e 69  ASE selftest_ini
df60: 74 22 2c 30 2c 30 2c 30 29 3b 0a 7d 0a 0a 0a 2f  t",0,0,0);.}.../
df70: 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 64 65 73  *.** Set the des
df80: 74 69 6e 61 74 69 6f 6e 20 74 61 62 6c 65 20 66  tination table f
df90: 69 65 6c 64 20 6f 66 20 74 68 65 20 53 68 65 6c  ield of the Shel
dfa0: 6c 53 74 61 74 65 20 73 74 72 75 63 74 75 72 65  lState structure
dfb0: 20 74 6f 0a 2a 2a 20 74 68 65 20 6e 61 6d 65 20   to.** the name 
dfc0: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 67 69 76  of the table giv
dfd0: 65 6e 2e 20 20 45 73 63 61 70 65 20 61 6e 79 20  en.  Escape any 
dfe0: 71 75 6f 74 65 20 63 68 61 72 61 63 74 65 72 73  quote characters
dff0: 20 69 6e 20 74 68 65 0a 2a 2a 20 74 61 62 6c 65   in the.** table
e000: 20 6e 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   name..*/.static
e010: 20 76 6f 69 64 20 73 65 74 5f 74 61 62 6c 65 5f   void set_table_
e020: 6e 61 6d 65 28 53 68 65 6c 6c 53 74 61 74 65 20  name(ShellState 
e030: 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  *p, const char *
e040: 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69 2c  zName){.  int i,
e050: 20 6e 3b 0a 20 20 63 68 61 72 20 63 51 75 6f 74   n;.  char cQuot
e060: 65 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 0a 20  e;.  char *z;.. 
e070: 20 69 66 28 20 70 2d 3e 7a 44 65 73 74 54 61 62   if( p->zDestTab
e080: 6c 65 20 29 7b 0a 20 20 20 20 66 72 65 65 28 70  le ){.    free(p
e090: 2d 3e 7a 44 65 73 74 54 61 62 6c 65 29 3b 0a 20  ->zDestTable);. 
e0a0: 20 20 20 70 2d 3e 7a 44 65 73 74 54 61 62 6c 65     p->zDestTable
e0b0: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20   = 0;.  }.  if( 
e0c0: 7a 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74 75 72  zName==0 ) retur
e0d0: 6e 3b 0a 20 20 63 51 75 6f 74 65 20 3d 20 71 75  n;.  cQuote = qu
e0e0: 6f 74 65 43 68 61 72 28 7a 4e 61 6d 65 29 3b 0a  oteChar(zName);.
e0f0: 20 20 6e 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a    n = strlen30(z
e100: 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 63 51 75  Name);.  if( cQu
e110: 6f 74 65 20 29 20 6e 20 2b 3d 20 6e 2b 32 3b 0a  ote ) n += n+2;.
e120: 20 20 7a 20 3d 20 70 2d 3e 7a 44 65 73 74 54 61    z = p->zDestTa
e130: 62 6c 65 20 3d 20 6d 61 6c 6c 6f 63 28 20 6e 2b  ble = malloc( n+
e140: 31 20 29 3b 0a 20 20 69 66 28 20 7a 3d 3d 30 20  1 );.  if( z==0 
e150: 29 7b 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74  ){.    raw_print
e160: 66 28 73 74 64 65 72 72 2c 22 45 72 72 6f 72 3a  f(stderr,"Error:
e170: 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 5c 6e   out of memory\n
e180: 22 29 3b 0a 20 20 20 20 65 78 69 74 28 31 29 3b  ");.    exit(1);
e190: 0a 20 20 7d 0a 20 20 6e 20 3d 20 30 3b 0a 20 20  .  }.  n = 0;.  
e1a0: 69 66 28 20 63 51 75 6f 74 65 20 29 20 7a 5b 6e  if( cQuote ) z[n
e1b0: 2b 2b 5d 20 3d 20 63 51 75 6f 74 65 3b 0a 20 20  ++] = cQuote;.  
e1c0: 66 6f 72 28 69 3d 30 3b 20 7a 4e 61 6d 65 5b 69  for(i=0; zName[i
e1d0: 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 7a 5b 6e  ]; i++){.    z[n
e1e0: 2b 2b 5d 20 3d 20 7a 4e 61 6d 65 5b 69 5d 3b 0a  ++] = zName[i];.
e1f0: 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 5b 69 5d      if( zName[i]
e200: 3d 3d 63 51 75 6f 74 65 20 29 20 7a 5b 6e 2b 2b  ==cQuote ) z[n++
e210: 5d 20 3d 20 63 51 75 6f 74 65 3b 0a 20 20 7d 0a  ] = cQuote;.  }.
e220: 20 20 69 66 28 20 63 51 75 6f 74 65 20 29 20 7a    if( cQuote ) z
e230: 5b 6e 2b 2b 5d 20 3d 20 63 51 75 6f 74 65 3b 0a  [n++] = cQuote;.
e240: 20 20 7a 5b 6e 5d 20 3d 20 30 3b 0a 7d 0a 0a 0a    z[n] = 0;.}...
e250: 2f 2a 0a 2a 2a 20 45 78 65 63 75 74 65 20 61 20  /*.** Execute a 
e260: 71 75 65 72 79 20 73 74 61 74 65 6d 65 6e 74 20  query statement 
e270: 74 68 61 74 20 77 69 6c 6c 20 67 65 6e 65 72 61  that will genera
e280: 74 65 20 53 51 4c 20 6f 75 74 70 75 74 2e 20 20  te SQL output.  
e290: 50 72 69 6e 74 0a 2a 2a 20 74 68 65 20 72 65 73  Print.** the res
e2a0: 75 6c 74 20 63 6f 6c 75 6d 6e 73 2c 20 63 6f 6d  ult columns, com
e2b0: 6d 61 2d 73 65 70 61 72 61 74 65 64 2c 20 6f 6e  ma-separated, on
e2c0: 20 61 20 6c 69 6e 65 20 61 6e 64 20 74 68 65 6e   a line and then
e2d0: 20 61 64 64 20 61 0a 2a 2a 20 73 65 6d 69 63 6f   add a.** semico
e2e0: 6c 6f 6e 20 74 65 72 6d 69 6e 61 74 6f 72 20 74  lon terminator t
e2f0: 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 61  o the end of tha
e300: 74 20 6c 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  t line..**.** If
e310: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63   the number of c
e320: 6f 6c 75 6d 6e 73 20 69 73 20 31 20 61 6e 64 20  olumns is 1 and 
e330: 74 68 61 74 20 63 6f 6c 75 6d 6e 20 63 6f 6e 74  that column cont
e340: 61 69 6e 73 20 74 65 78 74 20 22 2d 2d 22 0a 2a  ains text "--".*
e350: 2a 20 74 68 65 6e 20 77 72 69 74 65 20 74 68 65  * then write the
e360: 20 73 65 6d 69 63 6f 6c 6f 6e 20 6f 6e 20 61 20   semicolon on a 
e370: 73 65 70 61 72 61 74 65 20 6c 69 6e 65 2e 20 20  separate line.  
e380: 54 68 61 74 20 77 61 79 2c 20 69 66 20 61 0a 2a  That way, if a.*
e390: 2a 20 22 2d 2d 22 20 63 6f 6d 6d 65 6e 74 20 6f  * "--" comment o
e3a0: 63 63 75 72 73 20 61 74 20 74 68 65 20 65 6e 64  ccurs at the end
e3b0: 20 6f 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e   of the statemen
e3c0: 74 2c 20 74 68 65 20 63 6f 6d 6d 65 6e 74 0a 2a  t, the comment.*
e3d0: 2a 20 77 6f 6e 27 74 20 63 6f 6e 73 75 6d 65 20  * won't consume 
e3e0: 74 68 65 20 73 65 6d 69 63 6f 6c 6f 6e 20 74 65  the semicolon te
e3f0: 72 6d 69 6e 61 74 6f 72 2e 0a 2a 2f 0a 73 74 61  rminator..*/.sta
e400: 74 69 63 20 69 6e 74 20 72 75 6e 5f 74 61 62 6c  tic int run_tabl
e410: 65 5f 64 75 6d 70 5f 71 75 65 72 79 28 0a 20 20  e_dump_query(.  
e420: 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 2c 20 20  ShellState *p,  
e430: 20 20 20 20 20 20 20 20 20 2f 2a 20 51 75 65 72           /* Quer
e440: 79 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 63  y context */.  c
e450: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 65 6c 65  onst char *zSele
e460: 63 74 2c 20 20 20 20 20 2f 2a 20 53 45 4c 45 43  ct,     /* SELEC
e470: 54 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 65  T statement to e
e480: 78 74 72 61 63 74 20 63 6f 6e 74 65 6e 74 20 2a  xtract content *
e490: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
e4a0: 7a 46 69 72 73 74 52 6f 77 20 20 20 20 2f 2a 20  zFirstRow    /* 
e4b0: 50 72 69 6e 74 20 62 65 66 6f 72 65 20 66 69 72  Print before fir
e4c0: 73 74 20 72 6f 77 2c 20 69 66 20 6e 6f 74 20 4e  st row, if not N
e4d0: 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  ULL */.){.  sqli
e4e0: 74 65 33 5f 73 74 6d 74 20 2a 70 53 65 6c 65 63  te3_stmt *pSelec
e4f0: 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  t;.  int rc;.  i
e500: 6e 74 20 6e 52 65 73 75 6c 74 3b 0a 20 20 69 6e  nt nResult;.  in
e510: 74 20 69 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  t i;.  const cha
e520: 72 20 2a 7a 3b 0a 20 20 72 63 20 3d 20 73 71 6c  r *z;.  rc = sql
e530: 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28  ite3_prepare_v2(
e540: 70 2d 3e 64 62 2c 20 7a 53 65 6c 65 63 74 2c 20  p->db, zSelect, 
e550: 2d 31 2c 20 26 70 53 65 6c 65 63 74 2c 20 30 29  -1, &pSelect, 0)
e560: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
e570: 54 45 5f 4f 4b 20 7c 7c 20 21 70 53 65 6c 65 63  TE_OK || !pSelec
e580: 74 20 29 7b 0a 20 20 20 20 75 74 66 38 5f 70 72  t ){.    utf8_pr
e590: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 2f 2a  intf(p->out, "/*
e5a0: 2a 2a 2a 20 45 52 52 4f 52 3a 20 28 25 64 29 20  *** ERROR: (%d) 
e5b0: 25 73 20 2a 2a 2a 2a 2a 2f 5c 6e 22 2c 20 72 63  %s *****/\n", rc
e5c0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
e5d0: 20 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67    sqlite3_errmsg
e5e0: 28 70 2d 3e 64 62 29 29 3b 0a 20 20 20 20 69 66  (p->db));.    if
e5f0: 28 20 28 72 63 26 30 78 66 66 29 21 3d 53 51 4c  ( (rc&0xff)!=SQL
e600: 49 54 45 5f 43 4f 52 52 55 50 54 20 29 20 70 2d  ITE_CORRUPT ) p-
e610: 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 72 65 74  >nErr++;.    ret
e620: 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 72 63  urn rc;.  }.  rc
e630: 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28   = sqlite3_step(
e640: 70 53 65 6c 65 63 74 29 3b 0a 20 20 6e 52 65 73  pSelect);.  nRes
e650: 75 6c 74 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  ult = sqlite3_co
e660: 6c 75 6d 6e 5f 63 6f 75 6e 74 28 70 53 65 6c 65  lumn_count(pSele
e670: 63 74 29 3b 0a 20 20 77 68 69 6c 65 28 20 72 63  ct);.  while( rc
e680: 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a  ==SQLITE_ROW ){.
e690: 20 20 20 20 69 66 28 20 7a 46 69 72 73 74 52 6f      if( zFirstRo
e6a0: 77 20 29 7b 0a 20 20 20 20 20 20 75 74 66 38 5f  w ){.      utf8_
e6b0: 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
e6c0: 25 73 22 2c 20 7a 46 69 72 73 74 52 6f 77 29 3b  %s", zFirstRow);
e6d0: 0a 20 20 20 20 20 20 7a 46 69 72 73 74 52 6f 77  .      zFirstRow
e6e0: 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 0;.    }.    
e6f0: 7a 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a  z = (const char*
e700: 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  )sqlite3_column_
e710: 74 65 78 74 28 70 53 65 6c 65 63 74 2c 20 30 29  text(pSelect, 0)
e720: 3b 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74  ;.    utf8_print
e730: 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20  f(p->out, "%s", 
e740: 7a 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b  z);.    for(i=1;
e750: 20 69 3c 6e 52 65 73 75 6c 74 3b 20 69 2b 2b 29   i<nResult; i++)
e760: 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69  {.      utf8_pri
e770: 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 2c 25 73  ntf(p->out, ",%s
e780: 22 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  ", sqlite3_colum
e790: 6e 5f 74 65 78 74 28 70 53 65 6c 65 63 74 2c 20  n_text(pSelect, 
e7a0: 69 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  i));.    }.    i
e7b0: 66 28 20 7a 3d 3d 30 20 29 20 7a 20 3d 20 22 22  f( z==0 ) z = ""
e7c0: 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 7a 5b 30  ;.    while( z[0
e7d0: 5d 20 26 26 20 28 7a 5b 30 5d 21 3d 27 2d 27 20  ] && (z[0]!='-' 
e7e0: 7c 7c 20 7a 5b 31 5d 21 3d 27 2d 27 29 20 29 20  || z[1]!='-') ) 
e7f0: 7a 2b 2b 3b 0a 20 20 20 20 69 66 28 20 7a 5b 30  z++;.    if( z[0
e800: 5d 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70  ] ){.      raw_p
e810: 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 5c  rintf(p->out, "\
e820: 6e 3b 5c 6e 22 29 3b 0a 20 20 20 20 7d 65 6c 73  n;\n");.    }els
e830: 65 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69  e{.      raw_pri
e840: 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 3b 5c 6e  ntf(p->out, ";\n
e850: 22 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  ");.    }.    rc
e860: 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28   = sqlite3_step(
e870: 70 53 65 6c 65 63 74 29 3b 0a 20 20 7d 0a 20 20  pSelect);.  }.  
e880: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6e  rc = sqlite3_fin
e890: 61 6c 69 7a 65 28 70 53 65 6c 65 63 74 29 3b 0a  alize(pSelect);.
e8a0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
e8b0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 75 74 66 38 5f  _OK ){.    utf8_
e8c0: 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
e8d0: 2f 2a 2a 2a 2a 20 45 52 52 4f 52 3a 20 28 25 64  /**** ERROR: (%d
e8e0: 29 20 25 73 20 2a 2a 2a 2a 2a 2f 5c 6e 22 2c 20  ) %s *****/\n", 
e8f0: 72 63 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  rc,.            
e900: 20 20 20 20 73 71 6c 69 74 65 33 5f 65 72 72 6d      sqlite3_errm
e910: 73 67 28 70 2d 3e 64 62 29 29 3b 0a 20 20 20 20  sg(p->db));.    
e920: 69 66 28 20 28 72 63 26 30 78 66 66 29 21 3d 53  if( (rc&0xff)!=S
e930: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 29 20  QLITE_CORRUPT ) 
e940: 70 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 7d 0a 20  p->nErr++;.  }. 
e950: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
e960: 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70  *.** Allocate sp
e970: 61 63 65 20 61 6e 64 20 73 61 76 65 20 6f 66 66  ace and save off
e980: 20 63 75 72 72 65 6e 74 20 65 72 72 6f 72 20 73   current error s
e990: 74 72 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  tring..*/.static
e9a0: 20 63 68 61 72 20 2a 73 61 76 65 5f 65 72 72 5f   char *save_err_
e9b0: 6d 73 67 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  msg(.  sqlite3 *
e9c0: 64 62 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  db            /*
e9d0: 20 44 61 74 61 62 61 73 65 20 74 6f 20 71 75 65   Database to que
e9e0: 72 79 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e  ry */.){.  int n
e9f0: 45 72 72 4d 73 67 20 3d 20 31 2b 73 74 72 6c 65  ErrMsg = 1+strle
ea00: 6e 33 30 28 73 71 6c 69 74 65 33 5f 65 72 72 6d  n30(sqlite3_errm
ea10: 73 67 28 64 62 29 29 3b 0a 20 20 63 68 61 72 20  sg(db));.  char 
ea20: 2a 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c 69 74  *zErrMsg = sqlit
ea30: 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 6e 45 72 72  e3_malloc64(nErr
ea40: 4d 73 67 29 3b 0a 20 20 69 66 28 20 7a 45 72 72  Msg);.  if( zErr
ea50: 4d 73 67 20 29 7b 0a 20 20 20 20 6d 65 6d 63 70  Msg ){.    memcp
ea60: 79 28 7a 45 72 72 4d 73 67 2c 20 73 71 6c 69 74  y(zErrMsg, sqlit
ea70: 65 33 5f 65 72 72 6d 73 67 28 64 62 29 2c 20 6e  e3_errmsg(db), n
ea80: 45 72 72 4d 73 67 29 3b 0a 20 20 7d 0a 20 20 72  ErrMsg);.  }.  r
ea90: 65 74 75 72 6e 20 7a 45 72 72 4d 73 67 3b 0a 7d  eturn zErrMsg;.}
eaa0: 0a 0a 23 69 66 64 65 66 20 5f 5f 6c 69 6e 75 78  ..#ifdef __linux
eab0: 5f 5f 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74  __./*.** Attempt
eac0: 20 74 6f 20 64 69 73 70 6c 61 79 20 49 2f 4f 20   to display I/O 
ead0: 73 74 61 74 73 20 6f 6e 20 4c 69 6e 75 78 20 75  stats on Linux u
eae0: 73 69 6e 67 20 2f 70 72 6f 63 2f 50 49 44 2f 69  sing /proc/PID/i
eaf0: 6f 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  o.*/.static void
eb00: 20 64 69 73 70 6c 61 79 4c 69 6e 75 78 49 6f 53   displayLinuxIoS
eb10: 74 61 74 73 28 46 49 4c 45 20 2a 6f 75 74 29 7b  tats(FILE *out){
eb20: 0a 20 20 46 49 4c 45 20 2a 69 6e 3b 0a 20 20 63  .  FILE *in;.  c
eb30: 68 61 72 20 7a 5b 32 30 30 5d 3b 0a 20 20 73 71  har z[200];.  sq
eb40: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
eb50: 69 7a 65 6f 66 28 7a 29 2c 20 7a 2c 20 22 2f 70  izeof(z), z, "/p
eb60: 72 6f 63 2f 25 64 2f 69 6f 22 2c 20 67 65 74 70  roc/%d/io", getp
eb70: 69 64 28 29 29 3b 0a 20 20 69 6e 20 3d 20 66 6f  id());.  in = fo
eb80: 70 65 6e 28 7a 2c 20 22 72 62 22 29 3b 0a 20 20  pen(z, "rb");.  
eb90: 69 66 28 20 69 6e 3d 3d 30 20 29 20 72 65 74 75  if( in==0 ) retu
eba0: 72 6e 3b 0a 20 20 77 68 69 6c 65 28 20 66 67 65  rn;.  while( fge
ebb0: 74 73 28 7a 2c 20 73 69 7a 65 6f 66 28 7a 29 2c  ts(z, sizeof(z),
ebc0: 20 69 6e 29 21 3d 30 20 29 7b 0a 20 20 20 20 73   in)!=0 ){.    s
ebd0: 74 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75  tatic const stru
ebe0: 63 74 20 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74  ct {.      const
ebf0: 20 63 68 61 72 20 2a 7a 50 61 74 74 65 72 6e 3b   char *zPattern;
ec00: 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
ec10: 72 20 2a 7a 44 65 73 63 3b 0a 20 20 20 20 7d 20  r *zDesc;.    } 
ec20: 61 54 72 61 6e 73 5b 5d 20 3d 20 7b 0a 20 20 20  aTrans[] = {.   
ec30: 20 20 20 7b 20 22 72 63 68 61 72 3a 20 22 2c 20     { "rchar: ", 
ec40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ec50: 20 22 42 79 74 65 73 20 72 65 63 65 69 76 65 64   "Bytes received
ec60: 20 62 79 20 72 65 61 64 28 29 3a 22 20 7d 2c 0a   by read():" },.
ec70: 20 20 20 20 20 20 7b 20 22 77 63 68 61 72 3a 20        { "wchar: 
ec80: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
ec90: 20 20 20 20 22 42 79 74 65 73 20 73 65 6e 74 20      "Bytes sent 
eca0: 74 6f 20 77 72 69 74 65 28 29 3a 22 20 20 20 20  to write():"    
ecb0: 7d 2c 0a 20 20 20 20 20 20 7b 20 22 73 79 73 63  },.      { "sysc
ecc0: 72 3a 20 22 2c 20 20 20 20 20 20 20 20 20 20 20  r: ",           
ecd0: 20 20 20 20 20 20 20 22 52 65 61 64 28 29 20 73         "Read() s
ece0: 79 73 74 65 6d 20 63 61 6c 6c 73 3a 22 20 20 20  ystem calls:"   
ecf0: 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 73     },.      { "s
ed00: 79 73 63 77 3a 20 22 2c 20 20 20 20 20 20 20 20  yscw: ",        
ed10: 20 20 20 20 20 20 20 20 20 20 22 57 72 69 74 65            "Write
ed20: 28 29 20 73 79 73 74 65 6d 20 63 61 6c 6c 73 3a  () system calls:
ed30: 22 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b  "     },.      {
ed40: 20 22 72 65 61 64 5f 62 79 74 65 73 3a 20 22 2c   "read_bytes: ",
ed50: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 42 79               "By
ed60: 74 65 73 20 72 65 61 64 20 66 72 6f 6d 20 73 74  tes read from st
ed70: 6f 72 61 67 65 3a 22 20 20 7d 2c 0a 20 20 20 20  orage:"  },.    
ed80: 20 20 7b 20 22 77 72 69 74 65 5f 62 79 74 65 73    { "write_bytes
ed90: 3a 20 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  : ",            
eda0: 22 42 79 74 65 73 20 77 72 69 74 74 65 6e 20 74  "Bytes written t
edb0: 6f 20 73 74 6f 72 61 67 65 3a 22 20 7d 2c 0a 20  o storage:" },. 
edc0: 20 20 20 20 20 7b 20 22 63 61 6e 63 65 6c 6c 65       { "cancelle
edd0: 64 5f 77 72 69 74 65 5f 62 79 74 65 73 3a 20 22  d_write_bytes: "
ede0: 2c 20 20 22 43 61 6e 63 65 6c 6c 65 64 20 77 72  ,  "Cancelled wr
edf0: 69 74 65 20 62 79 74 65 73 3a 22 20 20 20 20 7d  ite bytes:"    }
ee00: 2c 0a 20 20 20 20 7d 3b 0a 20 20 20 20 69 6e 74  ,.    };.    int
ee10: 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   i;.    for(i=0;
ee20: 20 69 3c 41 72 72 61 79 53 69 7a 65 28 61 54 72   i<ArraySize(aTr
ee30: 61 6e 73 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  ans); i++){.    
ee40: 20 20 69 6e 74 20 6e 20 3d 20 73 74 72 6c 65 6e    int n = strlen
ee50: 33 30 28 61 54 72 61 6e 73 5b 69 5d 2e 7a 50 61  30(aTrans[i].zPa
ee60: 74 74 65 72 6e 29 3b 0a 20 20 20 20 20 20 69 66  ttern);.      if
ee70: 28 20 73 74 72 6e 63 6d 70 28 61 54 72 61 6e 73  ( strncmp(aTrans
ee80: 5b 69 5d 2e 7a 50 61 74 74 65 72 6e 2c 20 7a 2c  [i].zPattern, z,
ee90: 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20   n)==0 ){.      
eea0: 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 6f 75    utf8_printf(ou
eeb0: 74 2c 20 22 25 2d 33 36 73 20 25 73 22 2c 20 61  t, "%-36s %s", a
eec0: 54 72 61 6e 73 5b 69 5d 2e 7a 44 65 73 63 2c 20  Trans[i].zDesc, 
eed0: 26 7a 5b 6e 5d 29 3b 0a 20 20 20 20 20 20 20 20  &z[n]);.        
eee0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
eef0: 20 20 20 7d 0a 20 20 7d 0a 20 20 66 63 6c 6f 73     }.  }.  fclos
ef00: 65 28 69 6e 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a  e(in);.}.#endif.
ef10: 0a 2f 2a 0a 2a 2a 20 44 69 73 70 6c 61 79 20 61  ./*.** Display a
ef20: 20 73 69 6e 67 6c 65 20 6c 69 6e 65 20 6f 66 20   single line of 
ef30: 73 74 61 74 75 73 20 75 73 69 6e 67 20 36 34 2d  status using 64-
ef40: 62 69 74 20 76 61 6c 75 65 73 2e 0a 2a 2f 0a 73  bit values..*/.s
ef50: 74 61 74 69 63 20 76 6f 69 64 20 64 69 73 70 6c  tatic void displ
ef60: 61 79 53 74 61 74 4c 69 6e 65 28 0a 20 20 53 68  ayStatLine(.  Sh
ef70: 65 6c 6c 53 74 61 74 65 20 2a 70 2c 20 20 20 20  ellState *p,    
ef80: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73          /* The s
ef90: 68 65 6c 6c 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  hell context */.
efa0: 20 20 63 68 61 72 20 2a 7a 4c 61 62 65 6c 2c 20    char *zLabel, 
efb0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
efc0: 61 62 65 6c 20 66 6f 72 20 74 68 69 73 20 6f 6e  abel for this on
efd0: 65 20 6c 69 6e 65 20 2a 2f 0a 20 20 63 68 61 72  e line */.  char
efe0: 20 2a 7a 46 6f 72 6d 61 74 2c 20 20 20 20 20 20   *zFormat,      
eff0: 20 20 20 20 20 20 2f 2a 20 46 6f 72 6d 61 74 20        /* Format 
f000: 66 6f 72 20 74 68 65 20 72 65 73 75 6c 74 20 2a  for the result *
f010: 2f 0a 20 20 69 6e 74 20 69 53 74 61 74 75 73 43  /.  int iStatusC
f020: 74 72 6c 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  trl,          /*
f030: 20 57 68 69 63 68 20 73 74 61 74 75 73 20 74 6f   Which status to
f040: 20 64 69 73 70 6c 61 79 20 2a 2f 0a 20 20 69 6e   display */.  in
f050: 74 20 62 52 65 73 65 74 20 20 20 20 20 20 20 20  t bReset        
f060: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
f070: 74 6f 20 72 65 73 65 74 20 74 68 65 20 73 74 61  to reset the sta
f080: 74 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  ts */.){.  sqlit
f090: 65 33 5f 69 6e 74 36 34 20 69 43 75 72 20 3d 20  e3_int64 iCur = 
f0a0: 2d 31 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e  -1;.  sqlite3_in
f0b0: 74 36 34 20 69 48 69 77 74 72 20 3d 20 2d 31 3b  t64 iHiwtr = -1;
f0c0: 0a 20 20 69 6e 74 20 69 2c 20 6e 50 65 72 63 65  .  int i, nPerce
f0d0: 6e 74 3b 0a 20 20 63 68 61 72 20 7a 4c 69 6e 65  nt;.  char zLine
f0e0: 5b 32 30 30 5d 3b 0a 20 20 73 71 6c 69 74 65 33  [200];.  sqlite3
f0f0: 5f 73 74 61 74 75 73 36 34 28 69 53 74 61 74 75  _status64(iStatu
f100: 73 43 74 72 6c 2c 20 26 69 43 75 72 2c 20 26 69  sCtrl, &iCur, &i
f110: 48 69 77 74 72 2c 20 62 52 65 73 65 74 29 3b 0a  Hiwtr, bReset);.
f120: 20 20 66 6f 72 28 69 3d 30 2c 20 6e 50 65 72 63    for(i=0, nPerc
f130: 65 6e 74 3d 30 3b 20 7a 46 6f 72 6d 61 74 5b 69  ent=0; zFormat[i
f140: 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  ]; i++){.    if(
f150: 20 7a 46 6f 72 6d 61 74 5b 69 5d 3d 3d 27 25 27   zFormat[i]=='%'
f160: 20 29 20 6e 50 65 72 63 65 6e 74 2b 2b 3b 0a 20   ) nPercent++;. 
f170: 20 7d 0a 20 20 69 66 28 20 6e 50 65 72 63 65 6e   }.  if( nPercen
f180: 74 3e 31 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  t>1 ){.    sqlit
f190: 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
f1a0: 6f 66 28 7a 4c 69 6e 65 29 2c 20 7a 4c 69 6e 65  of(zLine), zLine
f1b0: 2c 20 7a 46 6f 72 6d 61 74 2c 20 69 43 75 72 2c  , zFormat, iCur,
f1c0: 20 69 48 69 77 74 72 29 3b 0a 20 20 7d 65 6c 73   iHiwtr);.  }els
f1d0: 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  e{.    sqlite3_s
f1e0: 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a  nprintf(sizeof(z
f1f0: 4c 69 6e 65 29 2c 20 7a 4c 69 6e 65 2c 20 7a 46  Line), zLine, zF
f200: 6f 72 6d 61 74 2c 20 69 48 69 77 74 72 29 3b 0a  ormat, iHiwtr);.
f210: 20 20 7d 0a 20 20 72 61 77 5f 70 72 69 6e 74 66    }.  raw_printf
f220: 28 70 2d 3e 6f 75 74 2c 20 22 25 2d 33 36 73 20  (p->out, "%-36s 
f230: 25 73 5c 6e 22 2c 20 7a 4c 61 62 65 6c 2c 20 7a  %s\n", zLabel, z
f240: 4c 69 6e 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Line);.}../*.** 
f250: 44 69 73 70 6c 61 79 20 6d 65 6d 6f 72 79 20 73  Display memory s
f260: 74 61 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tats..*/.static 
f270: 69 6e 74 20 64 69 73 70 6c 61 79 5f 73 74 61 74  int display_stat
f280: 73 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  s(.  sqlite3 *db
f290: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
f2a0: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 74 6f 20   /* Database to 
f2b0: 71 75 65 72 79 20 2a 2f 0a 20 20 53 68 65 6c 6c  query */.  Shell
f2c0: 53 74 61 74 65 20 2a 70 41 72 67 2c 20 20 20 20  State *pArg,    
f2d0: 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
f2e0: 72 20 74 6f 20 53 68 65 6c 6c 53 74 61 74 65 20  r to ShellState 
f2f0: 2a 2f 0a 20 20 69 6e 74 20 62 52 65 73 65 74 20  */.  int bReset 
f300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f310: 20 2f 2a 20 54 72 75 65 20 74 6f 20 72 65 73 65   /* True to rese
f320: 74 20 74 68 65 20 73 74 61 74 73 20 2a 2f 0a 29  t the stats */.)
f330: 7b 0a 20 20 69 6e 74 20 69 43 75 72 3b 0a 20 20  {.  int iCur;.  
f340: 69 6e 74 20 69 48 69 77 74 72 3b 0a 0a 20 20 69  int iHiwtr;..  i
f350: 66 28 20 70 41 72 67 20 26 26 20 70 41 72 67 2d  f( pArg && pArg-
f360: 3e 6f 75 74 20 29 7b 0a 20 20 20 20 64 69 73 70  >out ){.    disp
f370: 6c 61 79 53 74 61 74 4c 69 6e 65 28 70 41 72 67  layStatLine(pArg
f380: 2c 20 22 4d 65 6d 6f 72 79 20 55 73 65 64 3a 22  , "Memory Used:"
f390: 2c 0a 20 20 20 20 20 20 20 22 25 6c 6c 64 20 28  ,.       "%lld (
f3a0: 6d 61 78 20 25 6c 6c 64 29 20 62 79 74 65 73 22  max %lld) bytes"
f3b0: 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 55 53 5f  , SQLITE_STATUS_
f3c0: 4d 45 4d 4f 52 59 5f 55 53 45 44 2c 20 62 52 65  MEMORY_USED, bRe
f3d0: 73 65 74 29 3b 0a 20 20 20 20 64 69 73 70 6c 61  set);.    displa
f3e0: 79 53 74 61 74 4c 69 6e 65 28 70 41 72 67 2c 20  yStatLine(pArg, 
f3f0: 22 4e 75 6d 62 65 72 20 6f 66 20 4f 75 74 73 74  "Number of Outst
f400: 61 6e 64 69 6e 67 20 41 6c 6c 6f 63 61 74 69 6f  anding Allocatio
f410: 6e 73 3a 22 2c 0a 20 20 20 20 20 20 20 22 25 6c  ns:",.       "%l
f420: 6c 64 20 28 6d 61 78 20 25 6c 6c 64 29 22 2c 20  ld (max %lld)", 
f430: 53 51 4c 49 54 45 5f 53 54 41 54 55 53 5f 4d 41  SQLITE_STATUS_MA
f440: 4c 4c 4f 43 5f 43 4f 55 4e 54 2c 20 62 52 65 73  LLOC_COUNT, bRes
f450: 65 74 29 3b 0a 20 20 20 20 69 66 28 20 70 41 72  et);.    if( pAr
f460: 67 2d 3e 73 68 65 6c 6c 46 6c 67 73 20 26 20 53  g->shellFlgs & S
f470: 48 46 4c 47 5f 50 61 67 65 63 61 63 68 65 20 29  HFLG_Pagecache )
f480: 7b 0a 20 20 20 20 20 20 64 69 73 70 6c 61 79 53  {.      displayS
f490: 74 61 74 4c 69 6e 65 28 70 41 72 67 2c 20 22 4e  tatLine(pArg, "N
f4a0: 75 6d 62 65 72 20 6f 66 20 50 63 61 63 68 65 20  umber of Pcache 
f4b0: 50 61 67 65 73 20 55 73 65 64 3a 22 2c 0a 20 20  Pages Used:",.  
f4c0: 20 20 20 20 20 20 20 22 25 6c 6c 64 20 28 6d 61         "%lld (ma
f4d0: 78 20 25 6c 6c 64 29 20 70 61 67 65 73 22 2c 20  x %lld) pages", 
f4e0: 53 51 4c 49 54 45 5f 53 54 41 54 55 53 5f 50 41  SQLITE_STATUS_PA
f4f0: 47 45 43 41 43 48 45 5f 55 53 45 44 2c 20 62 52  GECACHE_USED, bR
f500: 65 73 65 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20  eset);.    }.   
f510: 20 64 69 73 70 6c 61 79 53 74 61 74 4c 69 6e 65   displayStatLine
f520: 28 70 41 72 67 2c 20 22 4e 75 6d 62 65 72 20 6f  (pArg, "Number o
f530: 66 20 50 63 61 63 68 65 20 4f 76 65 72 66 6c 6f  f Pcache Overflo
f540: 77 20 42 79 74 65 73 3a 22 2c 0a 20 20 20 20 20  w Bytes:",.     
f550: 20 20 22 25 6c 6c 64 20 28 6d 61 78 20 25 6c 6c    "%lld (max %ll
f560: 64 29 20 62 79 74 65 73 22 2c 20 53 51 4c 49 54  d) bytes", SQLIT
f570: 45 5f 53 54 41 54 55 53 5f 50 41 47 45 43 41 43  E_STATUS_PAGECAC
f580: 48 45 5f 4f 56 45 52 46 4c 4f 57 2c 20 62 52 65  HE_OVERFLOW, bRe
f590: 73 65 74 29 3b 0a 20 20 20 20 64 69 73 70 6c 61  set);.    displa
f5a0: 79 53 74 61 74 4c 69 6e 65 28 70 41 72 67 2c 20  yStatLine(pArg, 
f5b0: 22 4c 61 72 67 65 73 74 20 41 6c 6c 6f 63 61 74  "Largest Allocat
f5c0: 69 6f 6e 3a 22 2c 0a 20 20 20 20 20 20 20 22 25  ion:",.       "%
f5d0: 6c 6c 64 20 62 79 74 65 73 22 2c 20 53 51 4c 49  lld bytes", SQLI
f5e0: 54 45 5f 53 54 41 54 55 53 5f 4d 41 4c 4c 4f 43  TE_STATUS_MALLOC
f5f0: 5f 53 49 5a 45 2c 20 62 52 65 73 65 74 29 3b 0a  _SIZE, bReset);.
f600: 20 20 20 20 64 69 73 70 6c 61 79 53 74 61 74 4c      displayStatL
f610: 69 6e 65 28 70 41 72 67 2c 20 22 4c 61 72 67 65  ine(pArg, "Large
f620: 73 74 20 50 63 61 63 68 65 20 41 6c 6c 6f 63 61  st Pcache Alloca
f630: 74 69 6f 6e 3a 22 2c 0a 20 20 20 20 20 20 20 22  tion:",.       "
f640: 25 6c 6c 64 20 62 79 74 65 73 22 2c 20 53 51 4c  %lld bytes", SQL
f650: 49 54 45 5f 53 54 41 54 55 53 5f 50 41 47 45 43  ITE_STATUS_PAGEC
f660: 41 43 48 45 5f 53 49 5a 45 2c 20 62 52 65 73 65  ACHE_SIZE, bRese
f670: 74 29 3b 0a 23 69 66 64 65 66 20 59 59 54 52 41  t);.#ifdef YYTRA
f680: 43 4b 4d 41 58 53 54 41 43 4b 44 45 50 54 48 0a  CKMAXSTACKDEPTH.
f690: 20 20 20 20 64 69 73 70 6c 61 79 53 74 61 74 4c      displayStatL
f6a0: 69 6e 65 28 70 41 72 67 2c 20 22 44 65 65 70 65  ine(pArg, "Deepe
f6b0: 73 74 20 50 61 72 73 65 72 20 53 74 61 63 6b 3a  st Parser Stack:
f6c0: 22 2c 0a 20 20 20 20 20 20 20 22 25 6c 6c 64 20  ",.       "%lld 
f6d0: 28 6d 61 78 20 25 6c 6c 64 29 22 2c 20 53 51 4c  (max %lld)", SQL
f6e0: 49 54 45 5f 53 54 41 54 55 53 5f 50 41 52 53 45  ITE_STATUS_PARSE
f6f0: 52 5f 53 54 41 43 4b 2c 20 62 52 65 73 65 74 29  R_STACK, bReset)
f700: 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20  ;.#endif.  }..  
f710: 69 66 28 20 70 41 72 67 20 26 26 20 70 41 72 67  if( pArg && pArg
f720: 2d 3e 6f 75 74 20 26 26 20 64 62 20 29 7b 0a 20  ->out && db ){. 
f730: 20 20 20 69 66 28 20 70 41 72 67 2d 3e 73 68 65     if( pArg->she
f740: 6c 6c 46 6c 67 73 20 26 20 53 48 46 4c 47 5f 4c  llFlgs & SHFLG_L
f750: 6f 6f 6b 61 73 69 64 65 20 29 7b 0a 20 20 20 20  ookaside ){.    
f760: 20 20 69 48 69 77 74 72 20 3d 20 69 43 75 72 20    iHiwtr = iCur 
f770: 3d 20 2d 31 3b 0a 20 20 20 20 20 20 73 71 6c 69  = -1;.      sqli
f780: 74 65 33 5f 64 62 5f 73 74 61 74 75 73 28 64 62  te3_db_status(db
f790: 2c 20 53 51 4c 49 54 45 5f 44 42 53 54 41 54 55  , SQLITE_DBSTATU
f7a0: 53 5f 4c 4f 4f 4b 41 53 49 44 45 5f 55 53 45 44  S_LOOKASIDE_USED
f7b0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
f7c0: 20 20 20 20 20 20 20 20 20 20 26 69 43 75 72 2c            &iCur,
f7d0: 20 26 69 48 69 77 74 72 2c 20 62 52 65 73 65 74   &iHiwtr, bReset
f7e0: 29 3b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69  );.      raw_pri
f7f0: 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c 0a 20  ntf(pArg->out,. 
f800: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 4c 6f               "Lo
f810: 6f 6b 61 73 69 64 65 20 53 6c 6f 74 73 20 55 73  okaside Slots Us
f820: 65 64 3a 20 20 20 20 20 20 20 20 20 20 20 20 20  ed:             
f830: 20 20 20 25 64 20 28 6d 61 78 20 25 64 29 5c 6e     %d (max %d)\n
f840: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
f850: 20 69 43 75 72 2c 20 69 48 69 77 74 72 29 3b 0a   iCur, iHiwtr);.
f860: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 64 62        sqlite3_db
f870: 5f 73 74 61 74 75 73 28 64 62 2c 20 53 51 4c 49  _status(db, SQLI
f880: 54 45 5f 44 42 53 54 41 54 55 53 5f 4c 4f 4f 4b  TE_DBSTATUS_LOOK
f890: 41 53 49 44 45 5f 48 49 54 2c 0a 20 20 20 20 20  ASIDE_HIT,.     
f8a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f8b0: 20 20 20 26 69 43 75 72 2c 20 26 69 48 69 77 74     &iCur, &iHiwt
f8c0: 72 2c 20 62 52 65 73 65 74 29 3b 0a 20 20 20 20  r, bReset);.    
f8d0: 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 41 72    raw_printf(pAr
f8e0: 67 2d 3e 6f 75 74 2c 20 22 53 75 63 63 65 73 73  g->out, "Success
f8f0: 66 75 6c 20 6c 6f 6f 6b 61 73 69 64 65 20 61 74  ful lookaside at
f900: 74 65 6d 70 74 73 3a 20 20 20 20 20 20 20 25 64  tempts:       %d
f910: 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
f920: 20 20 20 69 48 69 77 74 72 29 3b 0a 20 20 20 20     iHiwtr);.    
f930: 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 73 74 61    sqlite3_db_sta
f940: 74 75 73 28 64 62 2c 20 53 51 4c 49 54 45 5f 44  tus(db, SQLITE_D
f950: 42 53 54 41 54 55 53 5f 4c 4f 4f 4b 41 53 49 44  BSTATUS_LOOKASID
f960: 45 5f 4d 49 53 53 5f 53 49 5a 45 2c 0a 20 20 20  E_MISS_SIZE,.   
f970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f980: 20 20 20 20 20 26 69 43 75 72 2c 20 26 69 48 69       &iCur, &iHi
f990: 77 74 72 2c 20 62 52 65 73 65 74 29 3b 0a 20 20  wtr, bReset);.  
f9a0: 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70      raw_printf(p
f9b0: 41 72 67 2d 3e 6f 75 74 2c 20 22 4c 6f 6f 6b 61  Arg->out, "Looka
f9c0: 73 69 64 65 20 66 61 69 6c 75 72 65 73 20 64 75  side failures du
f9d0: 65 20 74 6f 20 73 69 7a 65 3a 20 20 20 20 20 20  e to size:      
f9e0: 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %d\n",.         
f9f0: 20 20 20 20 20 69 48 69 77 74 72 29 3b 0a 20 20       iHiwtr);.  
fa00: 20 20 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 73      sqlite3_db_s
fa10: 74 61 74 75 73 28 64 62 2c 20 53 51 4c 49 54 45  tatus(db, SQLITE
fa20: 5f 44 42 53 54 41 54 55 53 5f 4c 4f 4f 4b 41 53  _DBSTATUS_LOOKAS
fa30: 49 44 45 5f 4d 49 53 53 5f 46 55 4c 4c 2c 0a 20  IDE_MISS_FULL,. 
fa40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fa50: 20 20 20 20 20 20 20 26 69 43 75 72 2c 20 26 69         &iCur, &i
fa60: 48 69 77 74 72 2c 20 62 52 65 73 65 74 29 3b 0a  Hiwtr, bReset);.
fa70: 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
fa80: 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22 4c 6f 6f  (pArg->out, "Loo
fa90: 6b 61 73 69 64 65 20 66 61 69 6c 75 72 65 73 20  kaside failures 
faa0: 64 75 65 20 74 6f 20 4f 4f 4d 3a 20 20 20 20 20  due to OOM:     
fab0: 20 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20    %d\n",.       
fac0: 20 20 20 20 20 20 20 69 48 69 77 74 72 29 3b 0a         iHiwtr);.
fad0: 20 20 20 20 7d 0a 20 20 20 20 69 48 69 77 74 72      }.    iHiwtr
fae0: 20 3d 20 69 43 75 72 20 3d 20 2d 31 3b 0a 20 20   = iCur = -1;.  
faf0: 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 73 74 61    sqlite3_db_sta
fb00: 74 75 73 28 64 62 2c 20 53 51 4c 49 54 45 5f 44  tus(db, SQLITE_D
fb10: 42 53 54 41 54 55 53 5f 43 41 43 48 45 5f 55 53  BSTATUS_CACHE_US
fb20: 45 44 2c 20 26 69 43 75 72 2c 20 26 69 48 69 77  ED, &iCur, &iHiw
fb30: 74 72 2c 20 62 52 65 73 65 74 29 3b 0a 20 20 20  tr, bReset);.   
fb40: 20 72 61 77 5f 70 72 69 6e 74 66 28 70 41 72 67   raw_printf(pArg
fb50: 2d 3e 6f 75 74 2c 20 22 50 61 67 65 72 20 48 65  ->out, "Pager He
fb60: 61 70 20 55 73 61 67 65 3a 20 20 20 20 20 20 20  ap Usage:       
fb70: 20 20 20 20 20 20 20 20 20 20 20 20 20 25 64 20               %d 
fb80: 62 79 74 65 73 5c 6e 22 2c 0a 20 20 20 20 20 20  bytes\n",.      
fb90: 20 20 20 20 20 20 69 43 75 72 29 3b 0a 20 20 20        iCur);.   
fba0: 20 69 48 69 77 74 72 20 3d 20 69 43 75 72 20 3d   iHiwtr = iCur =
fbb0: 20 2d 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   -1;.    sqlite3
fbc0: 5f 64 62 5f 73 74 61 74 75 73 28 64 62 2c 20 53  _db_status(db, S
fbd0: 51 4c 49 54 45 5f 44 42 53 54 41 54 55 53 5f 43  QLITE_DBSTATUS_C
fbe0: 41 43 48 45 5f 48 49 54 2c 20 26 69 43 75 72 2c  ACHE_HIT, &iCur,
fbf0: 20 26 69 48 69 77 74 72 2c 20 31 29 3b 0a 20 20   &iHiwtr, 1);.  
fc00: 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 41 72    raw_printf(pAr
fc10: 67 2d 3e 6f 75 74 2c 20 22 50 61 67 65 20 63 61  g->out, "Page ca
fc20: 63 68 65 20 68 69 74 73 3a 20 20 20 20 20 20 20  che hits:       
fc30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 25 64                %d
fc40: 5c 6e 22 2c 20 69 43 75 72 29 3b 0a 20 20 20 20  \n", iCur);.    
fc50: 69 48 69 77 74 72 20 3d 20 69 43 75 72 20 3d 20  iHiwtr = iCur = 
fc60: 2d 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  -1;.    sqlite3_
fc70: 64 62 5f 73 74 61 74 75 73 28 64 62 2c 20 53 51  db_status(db, SQ
fc80: 4c 49 54 45 5f 44 42 53 54 41 54 55 53 5f 43 41  LITE_DBSTATUS_CA
fc90: 43 48 45 5f 4d 49 53 53 2c 20 26 69 43 75 72 2c  CHE_MISS, &iCur,
fca0: 20 26 69 48 69 77 74 72 2c 20 31 29 3b 0a 20 20   &iHiwtr, 1);.  
fcb0: 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 41 72    raw_printf(pAr
fcc0: 67 2d 3e 6f 75 74 2c 20 22 50 61 67 65 20 63 61  g->out, "Page ca
fcd0: 63 68 65 20 6d 69 73 73 65 73 3a 20 20 20 20 20  che misses:     
fce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 25 64                %d
fcf0: 5c 6e 22 2c 20 69 43 75 72 29 3b 0a 20 20 20 20  \n", iCur);.    
fd00: 69 48 69 77 74 72 20 3d 20 69 43 75 72 20 3d 20  iHiwtr = iCur = 
fd10: 2d 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  -1;.    sqlite3_
fd20: 64 62 5f 73 74 61 74 75 73 28 64 62 2c 20 53 51  db_status(db, SQ
fd30: 4c 49 54 45 5f 44 42 53 54 41 54 55 53 5f 43 41  LITE_DBSTATUS_CA
fd40: 43 48 45 5f 57 52 49 54 45 2c 20 26 69 43 75 72  CHE_WRITE, &iCur
fd50: 2c 20 26 69 48 69 77 74 72 2c 20 31 29 3b 0a 20  , &iHiwtr, 1);. 
fd60: 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 41     raw_printf(pA
fd70: 72 67 2d 3e 6f 75 74 2c 20 22 50 61 67 65 20 63  rg->out, "Page c
fd80: 61 63 68 65 20 77 72 69 74 65 73 3a 20 20 20 20  ache writes:    
fd90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 25                 %
fda0: 64 5c 6e 22 2c 20 69 43 75 72 29 3b 0a 20 20 20  d\n", iCur);.   
fdb0: 20 69 48 69 77 74 72 20 3d 20 69 43 75 72 20 3d   iHiwtr = iCur =
fdc0: 20 2d 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   -1;.    sqlite3
fdd0: 5f 64 62 5f 73 74 61 74 75 73 28 64 62 2c 20 53  _db_status(db, S
fde0: 51 4c 49 54 45 5f 44 42 53 54 41 54 55 53 5f 53  QLITE_DBSTATUS_S
fdf0: 43 48 45 4d 41 5f 55 53 45 44 2c 20 26 69 43 75  CHEMA_USED, &iCu
fe00: 72 2c 20 26 69 48 69 77 74 72 2c 20 62 52 65 73  r, &iHiwtr, bRes
fe10: 65 74 29 3b 0a 20 20 20 20 72 61 77 5f 70 72 69  et);.    raw_pri
fe20: 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22  ntf(pArg->out, "
fe30: 53 63 68 65 6d 61 20 48 65 61 70 20 55 73 61 67  Schema Heap Usag
fe40: 65 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e:              
fe50: 20 20 20 20 20 25 64 20 62 79 74 65 73 5c 6e 22       %d bytes\n"
fe60: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 43  ,.            iC
fe70: 75 72 29 3b 0a 20 20 20 20 69 48 69 77 74 72 20  ur);.    iHiwtr 
fe80: 3d 20 69 43 75 72 20 3d 20 2d 31 3b 0a 20 20 20  = iCur = -1;.   
fe90: 20 73 71 6c 69 74 65 33 5f 64 62 5f 73 74 61 74   sqlite3_db_stat
fea0: 75 73 28 64 62 2c 20 53 51 4c 49 54 45 5f 44 42  us(db, SQLITE_DB
feb0: 53 54 41 54 55 53 5f 53 54 4d 54 5f 55 53 45 44  STATUS_STMT_USED
fec0: 2c 20 26 69 43 75 72 2c 20 26 69 48 69 77 74 72  , &iCur, &iHiwtr
fed0: 2c 20 62 52 65 73 65 74 29 3b 0a 20 20 20 20 72  , bReset);.    r
fee0: 61 77 5f 70 72 69 6e 74 66 28 70 41 72 67 2d 3e  aw_printf(pArg->
fef0: 6f 75 74 2c 20 22 53 74 61 74 65 6d 65 6e 74 20  out, "Statement 
ff00: 48 65 61 70 2f 4c 6f 6f 6b 61 73 69 64 65 20 55  Heap/Lookaside U
ff10: 73 61 67 65 3a 20 20 20 20 20 20 25 64 20 62 79  sage:      %d by
ff20: 74 65 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  tes\n",.        
ff30: 20 20 20 20 69 43 75 72 29 3b 0a 20 20 7d 0a 0a      iCur);.  }..
ff40: 20 20 69 66 28 20 70 41 72 67 20 26 26 20 70 41    if( pArg && pA
ff50: 72 67 2d 3e 6f 75 74 20 26 26 20 64 62 20 26 26  rg->out && db &&
ff60: 20 70 41 72 67 2d 3e 70 53 74 6d 74 20 29 7b 0a   pArg->pStmt ){.
ff70: 20 20 20 20 69 43 75 72 20 3d 20 73 71 6c 69 74      iCur = sqlit
ff80: 65 33 5f 73 74 6d 74 5f 73 74 61 74 75 73 28 70  e3_stmt_status(p
ff90: 41 72 67 2d 3e 70 53 74 6d 74 2c 20 53 51 4c 49  Arg->pStmt, SQLI
ffa0: 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 46 55  TE_STMTSTATUS_FU
ffb0: 4c 4c 53 43 41 4e 5f 53 54 45 50 2c 0a 20 20 20  LLSCAN_STEP,.   
ffc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ffd0: 20 20 20 20 20 20 20 20 20 20 20 20 62 52 65 73              bRes
ffe0: 65 74 29 3b 0a 20 20 20 20 72 61 77 5f 70 72 69  et);.    raw_pri
fff0: 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22  ntf(pArg->out, "
10000 46 75 6c 6c 73 63 61 6e 20 53 74 65 70 73 3a 20  Fullscan Steps: 
10010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10020 20 20 20 20 20 25 64 5c 6e 22 2c 20 69 43 75 72       %d\n", iCur
10030 29 3b 0a 20 20 20 20 69 43 75 72 20 3d 20 73 71  );.    iCur = sq
10040 6c 69 74 65 33 5f 73 74 6d 74 5f 73 74 61 74 75  lite3_stmt_statu
10050 73 28 70 41 72 67 2d 3e 70 53 74 6d 74 2c 20 53  s(pArg->pStmt, S
10060 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53  QLITE_STMTSTATUS
10070 5f 53 4f 52 54 2c 20 62 52 65 73 65 74 29 3b 0a  _SORT, bReset);.
10080 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70      raw_printf(p
10090 41 72 67 2d 3e 6f 75 74 2c 20 22 53 6f 72 74 20  Arg->out, "Sort 
100a0 4f 70 65 72 61 74 69 6f 6e 73 3a 20 20 20 20 20  Operations:     
100b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
100c0 25 64 5c 6e 22 2c 20 69 43 75 72 29 3b 0a 20 20  %d\n", iCur);.  
100d0 20 20 69 43 75 72 20 3d 20 73 71 6c 69 74 65 33    iCur = sqlite3
100e0 5f 73 74 6d 74 5f 73 74 61 74 75 73 28 70 41 72  _stmt_status(pAr
100f0 67 2d 3e 70 53 74 6d 74 2c 20 53 51 4c 49 54 45  g->pStmt, SQLITE
10100 5f 53 54 4d 54 53 54 41 54 55 53 5f 41 55 54 4f  _STMTSTATUS_AUTO
10110 49 4e 44 45 58 2c 62 52 65 73 65 74 29 3b 0a 20  INDEX,bReset);. 
10120 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 41     raw_printf(pA
10130 72 67 2d 3e 6f 75 74 2c 20 22 41 75 74 6f 69 6e  rg->out, "Autoin
10140 64 65 78 20 49 6e 73 65 72 74 73 3a 20 20 20 20  dex Inserts:    
10150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 25                 %
10160 64 5c 6e 22 2c 20 69 43 75 72 29 3b 0a 20 20 20  d\n", iCur);.   
10170 20 69 43 75 72 20 3d 20 73 71 6c 69 74 65 33 5f   iCur = sqlite3_
10180 73 74 6d 74 5f 73 74 61 74 75 73 28 70 41 72 67  stmt_status(pArg
10190 2d 3e 70 53 74 6d 74 2c 20 53 51 4c 49 54 45 5f  ->pStmt, SQLITE_
101a0 53 54 4d 54 53 54 41 54 55 53 5f 56 4d 5f 53 54  STMTSTATUS_VM_ST
101b0 45 50 2c 20 62 52 65 73 65 74 29 3b 0a 20 20 20  EP, bReset);.   
101c0 20 72 61 77 5f 70 72 69 6e 74 66 28 70 41 72 67   raw_printf(pArg
101d0 2d 3e 6f 75 74 2c 20 22 56 69 72 74 75 61 6c 20  ->out, "Virtual 
101e0 4d 61 63 68 69 6e 65 20 53 74 65 70 73 3a 20 20  Machine Steps:  
101f0 20 20 20 20 20 20 20 20 20 20 20 20 20 25 64 5c               %d\
10200 6e 22 2c 20 69 43 75 72 29 3b 0a 20 20 7d 0a 0a  n", iCur);.  }..
10210 23 69 66 64 65 66 20 5f 5f 6c 69 6e 75 78 5f 5f  #ifdef __linux__
10220 0a 20 20 64 69 73 70 6c 61 79 4c 69 6e 75 78 49  .  displayLinuxI
10230 6f 53 74 61 74 73 28 70 41 72 67 2d 3e 6f 75 74  oStats(pArg->out
10240 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20  );.#endif..  /* 
10250 44 6f 20 6e 6f 74 20 72 65 6d 6f 76 65 20 74 68  Do not remove th
10260 69 73 20 6d 61 63 68 69 6e 65 20 72 65 61 64 61  is machine reada
10270 62 6c 65 20 63 6f 6d 6d 65 6e 74 3a 20 65 78 74  ble comment: ext
10280 72 61 2d 73 74 61 74 73 2d 6f 75 74 70 75 74 2d  ra-stats-output-
10290 68 65 72 65 20 2a 2f 0a 0a 20 20 72 65 74 75 72  here */..  retur
102a0 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69  n 0;.}../*.** Di
102b0 73 70 6c 61 79 20 73 63 61 6e 20 73 74 61 74 73  splay scan stats
102c0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
102d0 20 64 69 73 70 6c 61 79 5f 73 63 61 6e 73 74 61   display_scansta
102e0 74 73 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  ts(.  sqlite3 *d
102f0 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b,              
10300 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
10310 65 20 74 6f 20 71 75 65 72 79 20 2a 2f 0a 20 20  e to query */.  
10320 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 41 72 67  ShellState *pArg
10330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10340 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 53 68  /* Pointer to Sh
10350 65 6c 6c 53 74 61 74 65 20 2a 2f 0a 29 7b 0a 23  ellState */.){.#
10360 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  ifndef SQLITE_EN
10370 41 42 4c 45 5f 53 54 4d 54 5f 53 43 41 4e 53 54  ABLE_STMT_SCANST
10380 41 54 55 53 0a 20 20 55 4e 55 53 45 44 5f 50 41  ATUS.  UNUSED_PA
10390 52 41 4d 45 54 45 52 28 64 62 29 3b 0a 20 20 55  RAMETER(db);.  U
103a0 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
103b0 70 41 72 67 29 3b 0a 23 65 6c 73 65 0a 20 20 69  pArg);.#else.  i
103c0 6e 74 20 69 2c 20 6b 2c 20 6e 2c 20 6d 78 3b 0a  nt i, k, n, mx;.
103d0 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 41 72    raw_printf(pAr
103e0 67 2d 3e 6f 75 74 2c 20 22 2d 2d 2d 2d 2d 2d 2d  g->out, "-------
103f0 2d 20 73 63 61 6e 73 74 61 74 73 20 2d 2d 2d 2d  - scanstats ----
10400 2d 2d 2d 2d 5c 6e 22 29 3b 0a 20 20 6d 78 20 3d  ----\n");.  mx =
10410 20 30 3b 0a 20 20 66 6f 72 28 6b 3d 30 3b 20 6b   0;.  for(k=0; k
10420 3c 3d 6d 78 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20  <=mx; k++){.    
10430 64 6f 75 62 6c 65 20 72 45 73 74 4c 6f 6f 70 20  double rEstLoop 
10440 3d 20 31 2e 30 3b 0a 20 20 20 20 66 6f 72 28 69  = 1.0;.    for(i
10450 3d 6e 3d 30 3b 20 31 3b 20 69 2b 2b 29 7b 0a 20  =n=0; 1; i++){. 
10460 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d       sqlite3_stm
10470 74 20 2a 70 20 3d 20 70 41 72 67 2d 3e 70 53 74  t *p = pArg->pSt
10480 6d 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  mt;.      sqlite
10490 33 5f 69 6e 74 36 34 20 6e 4c 6f 6f 70 2c 20 6e  3_int64 nLoop, n
104a0 56 69 73 69 74 3b 0a 20 20 20 20 20 20 64 6f 75  Visit;.      dou
104b0 62 6c 65 20 72 45 73 74 3b 0a 20 20 20 20 20 20  ble rEst;.      
104c0 69 6e 74 20 69 53 69 64 3b 0a 20 20 20 20 20 20  int iSid;.      
104d0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 78 70  const char *zExp
104e0 6c 61 69 6e 3b 0a 20 20 20 20 20 20 69 66 28 20  lain;.      if( 
104f0 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 63 61  sqlite3_stmt_sca
10500 6e 73 74 61 74 75 73 28 70 2c 20 69 2c 20 53 51  nstatus(p, i, SQ
10510 4c 49 54 45 5f 53 43 41 4e 53 54 41 54 5f 4e 4c  LITE_SCANSTAT_NL
10520 4f 4f 50 2c 20 28 76 6f 69 64 2a 29 26 6e 4c 6f  OOP, (void*)&nLo
10530 6f 70 29 20 29 7b 0a 20 20 20 20 20 20 20 20 62  op) ){.        b
10540 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
10550 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74      sqlite3_stmt
10560 5f 73 63 61 6e 73 74 61 74 75 73 28 70 2c 20 69  _scanstatus(p, i
10570 2c 20 53 51 4c 49 54 45 5f 53 43 41 4e 53 54 41  , SQLITE_SCANSTA
10580 54 5f 53 45 4c 45 43 54 49 44 2c 20 28 76 6f 69  T_SELECTID, (voi
10590 64 2a 29 26 69 53 69 64 29 3b 0a 20 20 20 20 20  d*)&iSid);.     
105a0 20 69 66 28 20 69 53 69 64 3e 6d 78 20 29 20 6d   if( iSid>mx ) m
105b0 78 20 3d 20 69 53 69 64 3b 0a 20 20 20 20 20 20  x = iSid;.      
105c0 69 66 28 20 69 53 69 64 21 3d 6b 20 29 20 63 6f  if( iSid!=k ) co
105d0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66  ntinue;.      if
105e0 28 20 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ( n==0 ){.      
105f0 20 20 72 45 73 74 4c 6f 6f 70 20 3d 20 28 64 6f    rEstLoop = (do
10600 75 62 6c 65 29 6e 4c 6f 6f 70 3b 0a 20 20 20 20  uble)nLoop;.    
10610 20 20 20 20 69 66 28 20 6b 3e 30 20 29 20 72 61      if( k>0 ) ra
10620 77 5f 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f  w_printf(pArg->o
10630 75 74 2c 20 22 2d 2d 2d 2d 2d 2d 2d 2d 20 73 75  ut, "-------- su
10640 62 71 75 65 72 79 20 25 64 20 2d 2d 2d 2d 2d 2d  bquery %d ------
10650 2d 5c 6e 22 2c 20 6b 29 3b 0a 20 20 20 20 20 20  -\n", k);.      
10660 7d 0a 20 20 20 20 20 20 6e 2b 2b 3b 0a 20 20 20  }.      n++;.   
10670 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f     sqlite3_stmt_
10680 73 63 61 6e 73 74 61 74 75 73 28 70 2c 20 69 2c  scanstatus(p, i,
10690 20 53 51 4c 49 54 45 5f 53 43 41 4e 53 54 41 54   SQLITE_SCANSTAT
106a0 5f 4e 56 49 53 49 54 2c 20 28 76 6f 69 64 2a 29  _NVISIT, (void*)
106b0 26 6e 56 69 73 69 74 29 3b 0a 20 20 20 20 20 20  &nVisit);.      
106c0 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 63 61  sqlite3_stmt_sca
106d0 6e 73 74 61 74 75 73 28 70 2c 20 69 2c 20 53 51  nstatus(p, i, SQ
106e0 4c 49 54 45 5f 53 43 41 4e 53 54 41 54 5f 45 53  LITE_SCANSTAT_ES
106f0 54 2c 20 28 76 6f 69 64 2a 29 26 72 45 73 74 29  T, (void*)&rEst)
10700 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
10710 73 74 6d 74 5f 73 63 61 6e 73 74 61 74 75 73 28  stmt_scanstatus(
10720 70 2c 20 69 2c 20 53 51 4c 49 54 45 5f 53 43 41  p, i, SQLITE_SCA
10730 4e 53 54 41 54 5f 45 58 50 4c 41 49 4e 2c 20 28  NSTAT_EXPLAIN, (
10740 76 6f 69 64 2a 29 26 7a 45 78 70 6c 61 69 6e 29  void*)&zExplain)
10750 3b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69  ;.      utf8_pri
10760 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22  ntf(pArg->out, "
10770 4c 6f 6f 70 20 25 32 64 3a 20 25 73 5c 6e 22 2c  Loop %2d: %s\n",
10780 20 6e 2c 20 7a 45 78 70 6c 61 69 6e 29 3b 0a 20   n, zExplain);. 
10790 20 20 20 20 20 72 45 73 74 4c 6f 6f 70 20 2a 3d       rEstLoop *=
107a0 20 72 45 73 74 3b 0a 20 20 20 20 20 20 72 61 77   rEst;.      raw
107b0 5f 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75  _printf(pArg->ou
107c0 74 2c 0a 20 20 20 20 20 20 20 20 20 20 22 20 20  t,.          "  
107d0 20 20 20 20 20 20 20 6e 4c 6f 6f 70 3d 25 2d 38         nLoop=%-8
107e0 6c 6c 64 20 6e 52 6f 77 3d 25 2d 38 6c 6c 64 20  lld nRow=%-8lld 
107f0 65 73 74 52 6f 77 3d 25 2d 38 6c 6c 64 20 65 73  estRow=%-8lld es
10800 74 52 6f 77 2f 4c 6f 6f 70 3d 25 2d 38 67 5c 6e  tRow/Loop=%-8g\n
10810 22 2c 0a 20 20 20 20 20 20 20 20 20 20 6e 4c 6f  ",.          nLo
10820 6f 70 2c 20 6e 56 69 73 69 74 2c 20 28 73 71 6c  op, nVisit, (sql
10830 69 74 65 33 5f 69 6e 74 36 34 29 28 72 45 73 74  ite3_int64)(rEst
10840 4c 6f 6f 70 2b 30 2e 35 29 2c 20 72 45 73 74 0a  Loop+0.5), rEst.
10850 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20        );.    }. 
10860 20 7d 0a 20 20 72 61 77 5f 70 72 69 6e 74 66 28   }.  raw_printf(
10870 70 41 72 67 2d 3e 6f 75 74 2c 20 22 2d 2d 2d 2d  pArg->out, "----
10880 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10890 2d 2d 2d 2d 2d 2d 2d 5c 6e 22 29 3b 0a 23 65 6e  -------\n");.#en
108a0 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72  dif.}../*.** Par
108b0 61 6d 65 74 65 72 20 61 7a 41 72 72 61 79 20 70  ameter azArray p
108c0 6f 69 6e 74 73 20 74 6f 20 61 20 7a 65 72 6f 2d  oints to a zero-
108d0 74 65 72 6d 69 6e 61 74 65 64 20 61 72 72 61 79  terminated array
108e0 20 6f 66 20 73 74 72 69 6e 67 73 2e 20 7a 53 74   of strings. zSt
108f0 72 0a 2a 2a 20 70 6f 69 6e 74 73 20 74 6f 20 61  r.** points to a
10900 20 73 69 6e 67 6c 65 20 6e 75 6c 2d 74 65 72 6d   single nul-term
10910 69 6e 61 74 65 64 20 73 74 72 69 6e 67 2e 20 52  inated string. R
10920 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69  eturn non-zero i
10930 66 20 7a 53 74 72 0a 2a 2a 20 69 73 20 65 71 75  f zStr.** is equ
10940 61 6c 2c 20 61 63 63 6f 72 64 69 6e 67 20 74 6f  al, according to
10950 20 73 74 72 63 6d 70 28 29 2c 20 74 6f 20 61 6e   strcmp(), to an
10960 79 20 6f 66 20 74 68 65 20 73 74 72 69 6e 67 73  y of the strings
10970 20 69 6e 20 74 68 65 20 61 72 72 61 79 2e 0a 2a   in the array..*
10980 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65 74  * Otherwise, ret
10990 75 72 6e 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61  urn zero..*/.sta
109a0 74 69 63 20 69 6e 74 20 73 74 72 5f 69 6e 5f 61  tic int str_in_a
109b0 72 72 61 79 28 63 6f 6e 73 74 20 63 68 61 72 20  rray(const char 
109c0 2a 7a 53 74 72 2c 20 63 6f 6e 73 74 20 63 68 61  *zStr, const cha
109d0 72 20 2a 2a 61 7a 41 72 72 61 79 29 7b 0a 20 20  r **azArray){.  
109e0 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30  int i;.  for(i=0
109f0 3b 20 61 7a 41 72 72 61 79 5b 69 5d 3b 20 69 2b  ; azArray[i]; i+
10a00 2b 29 7b 0a 20 20 20 20 69 66 28 20 30 3d 3d 73  +){.    if( 0==s
10a10 74 72 63 6d 70 28 7a 53 74 72 2c 20 61 7a 41 72  trcmp(zStr, azAr
10a20 72 61 79 5b 69 5d 29 20 29 20 72 65 74 75 72 6e  ray[i]) ) return
10a30 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   1;.  }.  return
10a40 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20   0;.}../*.** If 
10a50 63 6f 6d 70 69 6c 65 64 20 73 74 61 74 65 6d 65  compiled stateme
10a60 6e 74 20 70 53 71 6c 20 61 70 70 65 61 72 73 20  nt pSql appears 
10a70 74 6f 20 62 65 20 61 6e 20 45 58 50 4c 41 49 4e  to be an EXPLAIN
10a80 20 73 74 61 74 65 6d 65 6e 74 2c 20 61 6c 6c 6f   statement, allo
10a90 63 61 74 65 0a 2a 2a 20 61 6e 64 20 70 6f 70 75  cate.** and popu
10aa0 6c 61 74 65 20 74 68 65 20 53 68 65 6c 6c 53 74  late the ShellSt
10ab0 61 74 65 2e 61 69 49 6e 64 65 6e 74 5b 5d 20 61  ate.aiIndent[] a
10ac0 72 72 61 79 20 77 69 74 68 20 74 68 65 20 6e 75  rray with the nu
10ad0 6d 62 65 72 20 6f 66 0a 2a 2a 20 73 70 61 63 65  mber of.** space
10ae0 73 20 65 61 63 68 20 6f 70 63 6f 64 65 20 73 68  s each opcode sh
10af0 6f 75 6c 64 20 62 65 20 69 6e 64 65 6e 74 65 64  ould be indented
10b00 20 62 65 66 6f 72 65 20 69 74 20 69 73 20 6f 75   before it is ou
10b10 74 70 75 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tput..**.** The 
10b20 69 6e 64 65 6e 74 69 6e 67 20 72 75 6c 65 73 20  indenting rules 
10b30 61 72 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a  are:.**.**     *
10b40 20 46 6f 72 20 65 61 63 68 20 22 4e 65 78 74 22   For each "Next"
10b50 2c 20 22 50 72 65 76 22 2c 20 22 56 4e 65 78 74  , "Prev", "VNext
10b60 22 20 6f 72 20 22 56 50 72 65 76 22 20 69 6e 73  " or "VPrev" ins
10b70 74 72 75 63 74 69 6f 6e 2c 20 69 6e 64 65 6e 74  truction, indent
10b80 0a 2a 2a 20 20 20 20 20 20 20 61 6c 6c 20 6f 70  .**       all op
10b90 63 6f 64 65 73 20 74 68 61 74 20 6f 63 63 75 72  codes that occur
10ba0 20 62 65 74 77 65 65 6e 20 74 68 65 20 70 32 20   between the p2 
10bb0 6a 75 6d 70 20 64 65 73 74 69 6e 61 74 69 6f 6e  jump destination
10bc0 20 61 6e 64 20 74 68 65 20 6f 70 63 6f 64 65 0a   and the opcode.
10bd0 2a 2a 20 20 20 20 20 20 20 69 74 73 65 6c 66 20  **       itself 
10be0 62 79 20 32 20 73 70 61 63 65 73 2e 0a 2a 2a 0a  by 2 spaces..**.
10bf0 2a 2a 20 20 20 20 20 2a 20 46 6f 72 20 65 61 63  **     * For eac
10c00 68 20 22 47 6f 74 6f 22 2c 20 69 66 20 74 68 65  h "Goto", if the
10c10 20 6a 75 6d 70 20 64 65 73 74 69 6e 61 74 69 6f   jump destinatio
10c20 6e 20 69 73 20 65 61 72 6c 69 65 72 20 69 6e 20  n is earlier in 
10c30 74 68 65 20 70 72 6f 67 72 61 6d 0a 2a 2a 20 20  the program.**  
10c40 20 20 20 20 20 61 6e 64 20 65 6e 64 73 20 6f 6e       and ends on
10c50 20 6f 6e 65 20 6f 66 3a 0a 2a 2a 20 20 20 20 20   one of:.**     
10c60 20 20 20 20 20 59 69 65 6c 64 20 20 53 65 65 6b       Yield  Seek
10c70 47 74 20 20 53 65 65 6b 4c 74 20 20 52 6f 77 53  Gt  SeekLt  RowS
10c80 65 74 52 65 61 64 20 20 52 65 77 69 6e 64 0a 2a  etRead  Rewind.*
10c90 2a 20 20 20 20 20 20 20 6f 72 20 69 66 20 74 68  *       or if th
10ca0 65 20 50 31 20 70 61 72 61 6d 65 74 65 72 20 69  e P1 parameter i
10cb0 73 20 6f 6e 65 20 69 6e 73 74 65 61 64 20 6f 66  s one instead of
10cc0 20 7a 65 72 6f 2c 0a 2a 2a 20 20 20 20 20 20 20   zero,.**       
10cd0 74 68 65 6e 20 69 6e 64 65 6e 74 20 61 6c 6c 20  then indent all 
10ce0 6f 70 63 6f 64 65 73 20 62 65 74 77 65 65 6e 20  opcodes between 
10cf0 74 68 65 20 65 61 72 6c 69 65 72 20 69 6e 73 74  the earlier inst
10d00 72 75 63 74 69 6f 6e 0a 2a 2a 20 20 20 20 20 20  ruction.**      
10d10 20 61 6e 64 20 22 47 6f 74 6f 22 20 62 79 20 32   and "Goto" by 2
10d20 20 73 70 61 63 65 73 2e 0a 2a 2f 0a 73 74 61 74   spaces..*/.stat
10d30 69 63 20 76 6f 69 64 20 65 78 70 6c 61 69 6e 5f  ic void explain_
10d40 64 61 74 61 5f 70 72 65 70 61 72 65 28 53 68 65  data_prepare(She
10d50 6c 6c 53 74 61 74 65 20 2a 70 2c 20 73 71 6c 69  llState *p, sqli
10d60 74 65 33 5f 73 74 6d 74 20 2a 70 53 71 6c 29 7b  te3_stmt *pSql){
10d70 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
10d80 53 71 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Sql;            
10d90 20 20 20 2f 2a 20 54 68 65 20 74 65 78 74 20 6f     /* The text o
10da0 66 20 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d  f the SQL statem
10db0 65 6e 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ent */.  const c
10dc0 68 61 72 20 2a 7a 3b 20 20 20 20 20 20 20 20 20  har *z;         
10dd0 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64           /* Used
10de0 20 74 6f 20 63 68 65 63 6b 20 69 66 20 74 68 69   to check if thi
10df0 73 20 69 73 20 61 6e 20 45 58 50 4c 41 49 4e 20  s is an EXPLAIN 
10e00 2a 2f 0a 20 20 69 6e 74 20 2a 61 62 59 69 65 6c  */.  int *abYiel
10e10 64 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  d = 0;          
10e20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
10e30 6f 70 20 69 73 20 61 6e 20 4f 50 5f 59 69 65 6c  op is an OP_Yiel
10e40 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 6c 6c 6f  d */.  int nAllo
10e50 63 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  c = 0;          
10e60 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61         /* Alloca
10e70 74 65 64 20 73 69 7a 65 20 6f 66 20 70 2d 3e 61  ted size of p->a
10e80 69 49 6e 64 65 6e 74 5b 5d 2c 20 61 62 59 69 65  iIndent[], abYie
10e90 6c 64 20 2a 2f 0a 20 20 69 6e 74 20 69 4f 70 3b  ld */.  int iOp;
10ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10eb0 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
10ec0 20 6f 66 20 6f 70 65 72 61 74 69 6f 6e 20 69 6e   of operation in
10ed0 20 70 2d 3e 61 69 49 6e 64 65 6e 74 5b 5d 20 2a   p->aiIndent[] *
10ee0 2f 0a 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  /..  const char 
10ef0 2a 61 7a 4e 65 78 74 5b 5d 20 3d 20 7b 20 22 4e  *azNext[] = { "N
10f00 65 78 74 22 2c 20 22 50 72 65 76 22 2c 20 22 56  ext", "Prev", "V
10f10 50 72 65 76 22 2c 20 22 56 4e 65 78 74 22 2c 20  Prev", "VNext", 
10f20 22 53 6f 72 74 65 72 4e 65 78 74 22 2c 0a 20 20  "SorterNext",.  
10f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10f40 20 20 20 20 20 20 20 20 20 22 4e 65 78 74 49 66           "NextIf
10f50 4f 70 65 6e 22 2c 20 22 50 72 65 76 49 66 4f 70  Open", "PrevIfOp
10f60 65 6e 22 2c 20 30 20 7d 3b 0a 20 20 63 6f 6e 73  en", 0 };.  cons
10f70 74 20 63 68 61 72 20 2a 61 7a 59 69 65 6c 64 5b  t char *azYield[
10f80 5d 20 3d 20 7b 20 22 59 69 65 6c 64 22 2c 20 22  ] = { "Yield", "
10f90 53 65 65 6b 4c 54 22 2c 20 22 53 65 65 6b 47 54  SeekLT", "SeekGT
10fa0 22 2c 20 22 52 6f 77 53 65 74 52 65 61 64 22 2c  ", "RowSetRead",
10fb0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
10fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 52 65               "Re
10fd0 77 69 6e 64 22 2c 20 30 20 7d 3b 0a 20 20 63 6f  wind", 0 };.  co
10fe0 6e 73 74 20 63 68 61 72 20 2a 61 7a 47 6f 74 6f  nst char *azGoto
10ff0 5b 5d 20 3d 20 7b 20 22 47 6f 74 6f 22 2c 20 30  [] = { "Goto", 0
11000 20 7d 3b 0a 0a 20 20 2f 2a 20 54 72 79 20 74 6f   };..  /* Try to
11010 20 66 69 67 75 72 65 20 6f 75 74 20 69 66 20 74   figure out if t
11020 68 69 73 20 69 73 20 72 65 61 6c 6c 79 20 61 6e  his is really an
11030 20 45 58 50 4c 41 49 4e 20 73 74 61 74 65 6d 65   EXPLAIN stateme
11040 6e 74 2e 20 49 66 20 74 68 69 73 0a 20 20 2a 2a  nt. If this.  **
11050 20 63 61 6e 6e 6f 74 20 62 65 20 76 65 72 69 66   cannot be verif
11060 69 65 64 2c 20 72 65 74 75 72 6e 20 65 61 72 6c  ied, return earl
11070 79 2e 20 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c  y.  */.  if( sql
11080 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e  ite3_column_coun
11090 74 28 70 53 71 6c 29 21 3d 38 20 29 7b 0a 20 20  t(pSql)!=8 ){.  
110a0 20 20 70 2d 3e 63 4d 6f 64 65 20 3d 20 70 2d 3e    p->cMode = p->
110b0 6d 6f 64 65 3b 0a 20 20 20 20 72 65 74 75 72 6e  mode;.    return
110c0 3b 0a 20 20 7d 0a 20 20 7a 53 71 6c 20 3d 20 73  ;.  }.  zSql = s
110d0 71 6c 69 74 65 33 5f 73 71 6c 28 70 53 71 6c 29  qlite3_sql(pSql)
110e0 3b 0a 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20  ;.  if( zSql==0 
110f0 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28  ) return;.  for(
11100 7a 3d 7a 53 71 6c 3b 20 2a 7a 3d 3d 27 20 27 20  z=zSql; *z==' ' 
11110 7c 7c 20 2a 7a 3d 3d 27 5c 74 27 20 7c 7c 20 2a  || *z=='\t' || *
11120 7a 3d 3d 27 5c 6e 27 20 7c 7c 20 2a 7a 3d 3d 27  z=='\n' || *z=='
11130 5c 66 27 20 7c 7c 20 2a 7a 3d 3d 27 5c 72 27 3b  \f' || *z=='\r';
11140 20 7a 2b 2b 29 3b 0a 20 20 69 66 28 20 73 71 6c   z++);.  if( sql
11150 69 74 65 33 5f 73 74 72 6e 69 63 6d 70 28 7a 2c  ite3_strnicmp(z,
11160 20 22 65 78 70 6c 61 69 6e 22 2c 20 37 29 20 29   "explain", 7) )
11170 7b 0a 20 20 20 20 70 2d 3e 63 4d 6f 64 65 20 3d  {.    p->cMode =
11180 20 70 2d 3e 6d 6f 64 65 3b 0a 20 20 20 20 72 65   p->mode;.    re
11190 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72  turn;.  }..  for
111a0 28 69 4f 70 3d 30 3b 20 53 51 4c 49 54 45 5f 52  (iOp=0; SQLITE_R
111b0 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70  OW==sqlite3_step
111c0 28 70 53 71 6c 29 3b 20 69 4f 70 2b 2b 29 7b 0a  (pSql); iOp++){.
111d0 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69      int i;.    i
111e0 6e 74 20 69 41 64 64 72 20 3d 20 73 71 6c 69 74  nt iAddr = sqlit
111f0 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53  e3_column_int(pS
11200 71 6c 2c 20 30 29 3b 0a 20 20 20 20 63 6f 6e 73  ql, 0);.    cons
11210 74 20 63 68 61 72 20 2a 7a 4f 70 20 3d 20 28 63  t char *zOp = (c
11220 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74  onst char*)sqlit
11230 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70  e3_column_text(p
11240 53 71 6c 2c 20 31 29 3b 0a 0a 20 20 20 20 2f 2a  Sql, 1);..    /*
11250 20 53 65 74 20 70 32 20 74 6f 20 74 68 65 20 50   Set p2 to the P
11260 32 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 63  2 field of the c
11270 75 72 72 65 6e 74 20 6f 70 63 6f 64 65 2e 20 54  urrent opcode. T
11280 68 65 6e 2c 20 61 73 73 75 6d 69 6e 67 20 74 68  hen, assuming th
11290 61 74 0a 20 20 20 20 2a 2a 20 70 32 20 69 73 20  at.    ** p2 is 
112a0 61 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 61  an instruction a
112b0 64 64 72 65 73 73 2c 20 73 65 74 20 76 61 72 69  ddress, set vari
112c0 61 62 6c 65 20 70 32 6f 70 20 74 6f 20 74 68 65  able p2op to the
112d0 20 69 6e 64 65 78 20 6f 66 20 74 68 61 74 0a 20   index of that. 
112e0 20 20 20 2a 2a 20 69 6e 73 74 72 75 63 74 69 6f     ** instructio
112f0 6e 20 69 6e 20 74 68 65 20 61 69 49 6e 64 65 6e  n in the aiInden
11300 74 5b 5d 20 61 72 72 61 79 2e 20 70 32 20 61 6e  t[] array. p2 an
11310 64 20 70 32 6f 70 20 6d 61 79 20 62 65 20 64 69  d p2op may be di
11320 66 66 65 72 65 6e 74 20 69 66 0a 20 20 20 20 2a  fferent if.    *
11330 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20 69 6e  * the current in
11340 73 74 72 75 63 74 69 6f 6e 20 69 73 20 70 61 72  struction is par
11350 74 20 6f 66 20 61 20 73 75 62 2d 70 72 6f 67 72  t of a sub-progr
11360 61 6d 20 67 65 6e 65 72 61 74 65 64 20 62 79 20  am generated by 
11370 61 6e 0a 20 20 20 20 2a 2a 20 53 51 4c 20 74 72  an.    ** SQL tr
11380 69 67 67 65 72 20 6f 72 20 66 6f 72 65 69 67 6e  igger or foreign
11390 20 6b 65 79 2e 20 20 2a 2f 0a 20 20 20 20 69 6e   key.  */.    in
113a0 74 20 70 32 20 3d 20 73 71 6c 69 74 65 33 5f 63  t p2 = sqlite3_c
113b0 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 71 6c 2c 20  olumn_int(pSql, 
113c0 33 29 3b 0a 20 20 20 20 69 6e 74 20 70 32 6f 70  3);.    int p2op
113d0 20 3d 20 28 70 32 20 2b 20 28 69 4f 70 2d 69 41   = (p2 + (iOp-iA
113e0 64 64 72 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 47  ddr));..    /* G
113f0 72 6f 77 20 74 68 65 20 70 2d 3e 61 69 49 6e 64  row the p->aiInd
11400 65 6e 74 20 61 72 72 61 79 20 61 73 20 72 65 71  ent array as req
11410 75 69 72 65 64 20 2a 2f 0a 20 20 20 20 69 66 28  uired */.    if(
11420 20 69 4f 70 3e 3d 6e 41 6c 6c 6f 63 20 29 7b 0a   iOp>=nAlloc ){.
11430 20 20 20 20 20 20 69 66 28 20 69 4f 70 3d 3d 30        if( iOp==0
11440 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 44   ){.        /* D
11450 6f 20 66 75 72 74 68 65 72 20 76 65 72 66 69 63  o further verfic
11460 61 74 69 6f 6e 20 74 68 61 74 20 74 68 69 73 20  ation that this 
11470 69 73 20 65 78 70 6c 61 69 6e 20 6f 75 74 70 75  is explain outpu
11480 74 2e 20 20 41 62 6f 72 74 20 69 66 0a 20 20 20  t.  Abort if.   
11490 20 20 20 20 20 2a 2a 20 69 74 20 69 73 20 6e 6f       ** it is no
114a0 74 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 74 61  t */.        sta
114b0 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tic const char *
114c0 65 78 70 6c 61 69 6e 43 6f 6c 73 5b 5d 20 3d 20  explainCols[] = 
114d0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 22 61 64  {.           "ad
114e0 64 72 22 2c 20 22 6f 70 63 6f 64 65 22 2c 20 22  dr", "opcode", "
114f0 70 31 22 2c 20 22 70 32 22 2c 20 22 70 33 22 2c  p1", "p2", "p3",
11500 20 22 70 34 22 2c 20 22 70 35 22 2c 20 22 63 6f   "p4", "p5", "co
11510 6d 6d 65 6e 74 22 20 7d 3b 0a 20 20 20 20 20 20  mment" };.      
11520 20 20 69 6e 74 20 6a 6a 3b 0a 20 20 20 20 20 20    int jj;.      
11530 20 20 66 6f 72 28 6a 6a 3d 30 3b 20 6a 6a 3c 41    for(jj=0; jj<A
11540 72 72 61 79 53 69 7a 65 28 65 78 70 6c 61 69 6e  rraySize(explain
11550 43 6f 6c 73 29 3b 20 6a 6a 2b 2b 29 7b 0a 20 20  Cols); jj++){.  
11560 20 20 20 20 20 20 20 20 69 66 28 20 73 74 72 63          if( strc
11570 6d 70 28 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  mp(sqlite3_colum
11580 6e 5f 6e 61 6d 65 28 70 53 71 6c 2c 6a 6a 29 2c  n_name(pSql,jj),
11590 65 78 70 6c 61 69 6e 43 6f 6c 73 5b 6a 6a 5d 29  explainCols[jj])
115a0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  !=0 ){.         
115b0 20 20 20 70 2d 3e 63 4d 6f 64 65 20 3d 20 70 2d     p->cMode = p-
115c0 3e 6d 6f 64 65 3b 0a 20 20 20 20 20 20 20 20 20  >mode;.         
115d0 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74     sqlite3_reset
115e0 28 70 53 71 6c 29 3b 0a 20 20 20 20 20 20 20 20  (pSql);.        
115f0 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
11600 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
11610 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
11620 6e 41 6c 6c 6f 63 20 2b 3d 20 31 30 30 3b 0a 20  nAlloc += 100;. 
11630 20 20 20 20 20 70 2d 3e 61 69 49 6e 64 65 6e 74       p->aiIndent
11640 20 3d 20 28 69 6e 74 2a 29 73 71 6c 69 74 65 33   = (int*)sqlite3
11650 5f 72 65 61 6c 6c 6f 63 36 34 28 70 2d 3e 61 69  _realloc64(p->ai
11660 49 6e 64 65 6e 74 2c 20 6e 41 6c 6c 6f 63 2a 73  Indent, nAlloc*s
11670 69 7a 65 6f 66 28 69 6e 74 29 29 3b 0a 20 20 20  izeof(int));.   
11680 20 20 20 61 62 59 69 65 6c 64 20 3d 20 28 69 6e     abYield = (in
11690 74 2a 29 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c  t*)sqlite3_reall
116a0 6f 63 36 34 28 61 62 59 69 65 6c 64 2c 20 6e 41  oc64(abYield, nA
116b0 6c 6c 6f 63 2a 73 69 7a 65 6f 66 28 69 6e 74 29  lloc*sizeof(int)
116c0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 62 59  );.    }.    abY
116d0 69 65 6c 64 5b 69 4f 70 5d 20 3d 20 73 74 72 5f  ield[iOp] = str_
116e0 69 6e 5f 61 72 72 61 79 28 7a 4f 70 2c 20 61 7a  in_array(zOp, az
116f0 59 69 65 6c 64 29 3b 0a 20 20 20 20 70 2d 3e 61  Yield);.    p->a
11700 69 49 6e 64 65 6e 74 5b 69 4f 70 5d 20 3d 20 30  iIndent[iOp] = 0
11710 3b 0a 20 20 20 20 70 2d 3e 6e 49 6e 64 65 6e 74  ;.    p->nIndent
11720 20 3d 20 69 4f 70 2b 31 3b 0a 0a 20 20 20 20 69   = iOp+1;..    i
11730 66 28 20 73 74 72 5f 69 6e 5f 61 72 72 61 79 28  f( str_in_array(
11740 7a 4f 70 2c 20 61 7a 4e 65 78 74 29 20 29 7b 0a  zOp, azNext) ){.
11750 20 20 20 20 20 20 66 6f 72 28 69 3d 70 32 6f 70        for(i=p2op
11760 3b 20 69 3c 69 4f 70 3b 20 69 2b 2b 29 20 70 2d  ; i<iOp; i++) p-
11770 3e 61 69 49 6e 64 65 6e 74 5b 69 5d 20 2b 3d 20  >aiIndent[i] += 
11780 32 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  2;.    }.    if(
11790 20 73 74 72 5f 69 6e 5f 61 72 72 61 79 28 7a 4f   str_in_array(zO
117a0 70 2c 20 61 7a 47 6f 74 6f 29 20 26 26 20 70 32  p, azGoto) && p2
117b0 6f 70 3c 70 2d 3e 6e 49 6e 64 65 6e 74 0a 20 20  op<p->nIndent.  
117c0 20 20 20 26 26 20 28 61 62 59 69 65 6c 64 5b 70     && (abYield[p
117d0 32 6f 70 5d 20 7c 7c 20 73 71 6c 69 74 65 33 5f  2op] || sqlite3_
117e0 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 71 6c 2c  column_int(pSql,
117f0 20 32 29 29 0a 20 20 20 20 29 7b 0a 20 20 20 20   2)).    ){.    
11800 20 20 66 6f 72 28 69 3d 70 32 6f 70 3b 20 69 3c    for(i=p2op; i<
11810 69 4f 70 3b 20 69 2b 2b 29 20 70 2d 3e 61 69 49  iOp; i++) p->aiI
11820 6e 64 65 6e 74 5b 69 5d 20 2b 3d 20 32 3b 0a 20  ndent[i] += 2;. 
11830 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 2d 3e 69     }.  }..  p->i
11840 49 6e 64 65 6e 74 20 3d 20 30 3b 0a 20 20 73 71  Indent = 0;.  sq
11850 6c 69 74 65 33 5f 66 72 65 65 28 61 62 59 69 65  lite3_free(abYie
11860 6c 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72  ld);.  sqlite3_r
11870 65 73 65 74 28 70 53 71 6c 29 3b 0a 7d 0a 0a 2f  eset(pSql);.}../
11880 2a 0a 2a 2a 20 46 72 65 65 20 74 68 65 20 61 72  *.** Free the ar
11890 72 61 79 20 61 6c 6c 6f 63 61 74 65 64 20 62 79  ray allocated by
118a0 20 65 78 70 6c 61 69 6e 5f 64 61 74 61 5f 70 72   explain_data_pr
118b0 65 70 61 72 65 28 29 2e 0a 2a 2f 0a 73 74 61 74  epare()..*/.stat
118c0 69 63 20 76 6f 69 64 20 65 78 70 6c 61 69 6e 5f  ic void explain_
118d0 64 61 74 61 5f 64 65 6c 65 74 65 28 53 68 65 6c  data_delete(Shel
118e0 6c 53 74 61 74 65 20 2a 70 29 7b 0a 20 20 73 71  lState *p){.  sq
118f0 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 61 69  lite3_free(p->ai
11900 49 6e 64 65 6e 74 29 3b 0a 20 20 70 2d 3e 61 69  Indent);.  p->ai
11910 49 6e 64 65 6e 74 20 3d 20 30 3b 0a 20 20 70 2d  Indent = 0;.  p-
11920 3e 6e 49 6e 64 65 6e 74 20 3d 20 30 3b 0a 20 20  >nIndent = 0;.  
11930 70 2d 3e 69 49 6e 64 65 6e 74 20 3d 20 30 3b 0a  p->iIndent = 0;.
11940 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 61 62 6c 65  }../*.** Disable
11950 20 61 6e 64 20 72 65 73 74 6f 72 65 20 2e 77 68   and restore .wh
11960 65 72 65 74 72 61 63 65 20 61 6e 64 20 2e 73 65  eretrace and .se
11970 6c 65 63 74 74 72 61 63 65 20 73 65 74 74 69 6e  lecttrace settin
11980 67 73 2e 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e  gs..*/.#if defin
11990 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29  ed(SQLITE_DEBUG)
119a0 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49   && defined(SQLI
119b0 54 45 5f 45 4e 41 42 4c 45 5f 53 45 4c 45 43 54  TE_ENABLE_SELECT
119c0 54 52 41 43 45 29 0a 65 78 74 65 72 6e 20 69 6e  TRACE).extern in
119d0 74 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54  t sqlite3SelectT
119e0 72 61 63 65 3b 0a 73 74 61 74 69 63 20 69 6e 74  race;.static int
119f0 20 73 61 76 65 64 53 65 6c 65 63 74 54 72 61 63   savedSelectTrac
11a00 65 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65  e;.#endif.#if de
11a10 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42  fined(SQLITE_DEB
11a20 55 47 29 20 26 26 20 64 65 66 69 6e 65 64 28 53  UG) && defined(S
11a30 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 57 48 45  QLITE_ENABLE_WHE
11a40 52 45 54 52 41 43 45 29 0a 65 78 74 65 72 6e 20  RETRACE).extern 
11a50 69 6e 74 20 73 71 6c 69 74 65 33 57 68 65 72 65  int sqlite3Where
11a60 54 72 61 63 65 3b 0a 73 74 61 74 69 63 20 69 6e  Trace;.static in
11a70 74 20 73 61 76 65 64 57 68 65 72 65 54 72 61 63  t savedWhereTrac
11a80 65 3b 0a 23 65 6e 64 69 66 0a 73 74 61 74 69 63  e;.#endif.static
11a90 20 76 6f 69 64 20 64 69 73 61 62 6c 65 5f 64 65   void disable_de
11aa0 62 75 67 5f 74 72 61 63 65 5f 6d 6f 64 65 73 28  bug_trace_modes(
11ab0 76 6f 69 64 29 7b 0a 23 69 66 20 64 65 66 69 6e  void){.#if defin
11ac0 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29  ed(SQLITE_DEBUG)
11ad0 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49   && defined(SQLI
11ae0 54 45 5f 45 4e 41 42 4c 45 5f 53 45 4c 45 43 54  TE_ENABLE_SELECT
11af0 54 52 41 43 45 29 0a 20 20 73 61 76 65 64 53 65  TRACE).  savedSe
11b00 6c 65 63 74 54 72 61 63 65 20 3d 20 73 71 6c 69  lectTrace = sqli
11b10 74 65 33 53 65 6c 65 63 74 54 72 61 63 65 3b 0a  te3SelectTrace;.
11b20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54    sqlite3SelectT
11b30 72 61 63 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66  race = 0;.#endif
11b40 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
11b50 49 54 45 5f 44 45 42 55 47 29 20 26 26 20 64 65  ITE_DEBUG) && de
11b60 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
11b70 42 4c 45 5f 57 48 45 52 45 54 52 41 43 45 29 0a  BLE_WHERETRACE).
11b80 20 20 73 61 76 65 64 57 68 65 72 65 54 72 61 63    savedWhereTrac
11b90 65 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65  e = sqlite3Where
11ba0 54 72 61 63 65 3b 0a 20 20 73 71 6c 69 74 65 33  Trace;.  sqlite3
11bb0 57 68 65 72 65 54 72 61 63 65 20 3d 20 30 3b 0a  WhereTrace = 0;.
11bc0 23 65 6e 64 69 66 0a 7d 0a 73 74 61 74 69 63 20  #endif.}.static 
11bd0 76 6f 69 64 20 72 65 73 74 6f 72 65 5f 64 65 62  void restore_deb
11be0 75 67 5f 74 72 61 63 65 5f 6d 6f 64 65 73 28 76  ug_trace_modes(v
11bf0 6f 69 64 29 7b 0a 23 69 66 20 64 65 66 69 6e 65  oid){.#if define
11c00 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 20  d(SQLITE_DEBUG) 
11c10 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  && defined(SQLIT
11c20 45 5f 45 4e 41 42 4c 45 5f 53 45 4c 45 43 54 54  E_ENABLE_SELECTT
11c30 52 41 43 45 29 0a 20 20 73 71 6c 69 74 65 33 53  RACE).  sqlite3S
11c40 65 6c 65 63 74 54 72 61 63 65 20 3d 20 73 61 76  electTrace = sav
11c50 65 64 53 65 6c 65 63 74 54 72 61 63 65 3b 0a 23  edSelectTrace;.#
11c60 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65  endif.#if define
11c70 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 20  d(SQLITE_DEBUG) 
11c80 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  && defined(SQLIT
11c90 45 5f 45 4e 41 42 4c 45 5f 57 48 45 52 45 54 52  E_ENABLE_WHERETR
11ca0 41 43 45 29 0a 20 20 73 71 6c 69 74 65 33 57 68  ACE).  sqlite3Wh
11cb0 65 72 65 54 72 61 63 65 20 3d 20 73 61 76 65 64  ereTrace = saved
11cc0 57 68 65 72 65 54 72 61 63 65 3b 0a 23 65 6e 64  WhereTrace;.#end
11cd0 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 75 6e 20  if.}../*.** Run 
11ce0 61 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65  a prepared state
11cf0 6d 65 6e 74 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ment.*/.static v
11d00 6f 69 64 20 65 78 65 63 5f 70 72 65 70 61 72 65  oid exec_prepare
11d10 64 5f 73 74 6d 74 28 0a 20 20 53 68 65 6c 6c 53  d_stmt(.  ShellS
11d20 74 61 74 65 20 2a 70 41 72 67 2c 20 20 20 20 20  tate *pArg,     
11d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11d40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
11d50 69 6e 74 65 72 20 74 6f 20 53 68 65 6c 6c 53 74  inter to ShellSt
11d60 61 74 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ate */.  sqlite3
11d70 5f 73 74 6d 74 20 2a 70 53 74 6d 74 2c 20 20 20  _stmt *pStmt,   
11d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11d90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61            /* Sta
11da0 74 6d 65 6e 74 20 74 6f 20 72 75 6e 20 2a 2f 0a  tment to run */.
11db0 20 20 69 6e 74 20 28 2a 78 43 61 6c 6c 62 61 63    int (*xCallbac
11dc0 6b 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 68 61  k)(void*,int,cha
11dd0 72 2a 2a 2c 63 68 61 72 2a 2a 2c 69 6e 74 2a 29  r**,char**,int*)
11de0 20 20 20 2f 2a 20 43 61 6c 6c 62 61 63 6b 20 66     /* Callback f
11df0 75 6e 63 74 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20  unction */.){.  
11e00 69 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a 20 70 65  int rc;..  /* pe
11e10 72 66 6f 72 6d 20 74 68 65 20 66 69 72 73 74 20  rform the first 
11e20 73 74 65 70 2e 20 20 74 68 69 73 20 77 69 6c 6c  step.  this will
11e30 20 74 65 6c 6c 20 75 73 20 69 66 20 77 65 0a 20   tell us if we. 
11e40 20 2a 2a 20 68 61 76 65 20 61 20 72 65 73 75 6c   ** have a resul
11e50 74 20 73 65 74 20 6f 72 20 6e 6f 74 20 61 6e 64  t set or not and
11e60 20 68 6f 77 20 77 69 64 65 20 69 74 20 69 73 2e   how wide it is.
11e70 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c  .  */.  rc = sql
11e80 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29  ite3_step(pStmt)
11e90 3b 0a 20 20 2f 2a 20 69 66 20 77 65 20 68 61 76  ;.  /* if we hav
11ea0 65 20 61 20 72 65 73 75 6c 74 20 73 65 74 2e 2e  e a result set..
11eb0 2e 20 2a 2f 0a 20 20 69 66 28 20 53 51 4c 49 54  . */.  if( SQLIT
11ec0 45 5f 52 4f 57 20 3d 3d 20 72 63 20 29 7b 0a 20  E_ROW == rc ){. 
11ed0 20 20 20 2f 2a 20 69 66 20 77 65 20 68 61 76 65     /* if we have
11ee0 20 61 20 63 61 6c 6c 62 61 63 6b 2e 2e 2e 20 2a   a callback... *
11ef0 2f 0a 20 20 20 20 69 66 28 20 78 43 61 6c 6c 62  /.    if( xCallb
11f00 61 63 6b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ack ){.      /* 
11f10 61 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66  allocate space f
11f20 6f 72 20 63 6f 6c 20 6e 61 6d 65 20 70 74 72 2c  or col name ptr,
11f30 20 76 61 6c 75 65 20 70 74 72 2c 20 61 6e 64 20   value ptr, and 
11f40 74 79 70 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e  type */.      in
11f50 74 20 6e 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33  t nCol = sqlite3
11f60 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 70 53  _column_count(pS
11f70 74 6d 74 29 3b 0a 20 20 20 20 20 20 76 6f 69 64  tmt);.      void
11f80 20 2a 70 44 61 74 61 20 3d 20 73 71 6c 69 74 65   *pData = sqlite
11f90 33 5f 6d 61 6c 6c 6f 63 36 34 28 33 2a 6e 43 6f  3_malloc64(3*nCo
11fa0 6c 2a 73 69 7a 65 6f 66 28 63 6f 6e 73 74 20 63  l*sizeof(const c
11fb0 68 61 72 2a 29 20 2b 20 31 29 3b 0a 20 20 20 20  har*) + 1);.    
11fc0 20 20 69 66 28 20 21 70 44 61 74 61 20 29 7b 0a    if( !pData ){.
11fd0 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
11fe0 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
11ff0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
12000 63 68 61 72 20 2a 2a 61 7a 43 6f 6c 73 20 3d 20  char **azCols = 
12010 28 63 68 61 72 20 2a 2a 29 70 44 61 74 61 3b 20  (char **)pData; 
12020 20 20 20 20 20 2f 2a 20 4e 61 6d 65 73 20 6f 66       /* Names of
12030 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20   result columns 
12040 2a 2f 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  */.        char 
12050 2a 2a 61 7a 56 61 6c 73 20 3d 20 26 61 7a 43 6f  **azVals = &azCo
12060 6c 73 5b 6e 43 6f 6c 5d 3b 20 20 20 20 20 20 20  ls[nCol];       
12070 2f 2a 20 52 65 73 75 6c 74 73 20 2a 2f 0a 20 20  /* Results */.  
12080 20 20 20 20 20 20 69 6e 74 20 2a 61 69 54 79 70        int *aiTyp
12090 65 73 20 3d 20 28 69 6e 74 20 2a 29 26 61 7a 56  es = (int *)&azV
120a0 61 6c 73 5b 6e 43 6f 6c 5d 3b 20 2f 2a 20 52 65  als[nCol]; /* Re
120b0 73 75 6c 74 20 74 79 70 65 73 20 2a 2f 0a 20 20  sult types */.  
120c0 20 20 20 20 20 20 69 6e 74 20 69 2c 20 78 3b 0a        int i, x;.
120d0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 73          assert(s
120e0 69 7a 65 6f 66 28 69 6e 74 29 20 3c 3d 20 73 69  izeof(int) <= si
120f0 7a 65 6f 66 28 63 68 61 72 20 2a 29 29 3b 0a 20  zeof(char *));. 
12100 20 20 20 20 20 20 20 2f 2a 20 73 61 76 65 20 6f         /* save o
12110 66 66 20 70 74 72 73 20 74 6f 20 63 6f 6c 75 6d  ff ptrs to colum
12120 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 20 20 20  n names */.     
12130 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43     for(i=0; i<nC
12140 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; i++){.      
12150 20 20 20 20 61 7a 43 6f 6c 73 5b 69 5d 20 3d 20      azCols[i] = 
12160 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f  (char *)sqlite3_
12170 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 28 70 53 74 6d  column_name(pStm
12180 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20 7d  t, i);.        }
12190 0a 20 20 20 20 20 20 20 20 64 6f 7b 0a 20 20 20  .        do{.   
121a0 20 20 20 20 20 20 20 2f 2a 20 65 78 74 72 61 63         /* extrac
121b0 74 20 74 68 65 20 64 61 74 61 20 61 6e 64 20 64  t the data and d
121c0 61 74 61 20 74 79 70 65 73 20 2a 2f 0a 20 20 20  ata types */.   
121d0 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20         for(i=0; 
121e0 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  i<nCol; i++){.  
121f0 20 20 20 20 20 20 20 20 20 20 61 69 54 79 70 65            aiType
12200 73 5b 69 5d 20 3d 20 78 20 3d 20 73 71 6c 69 74  s[i] = x = sqlit
12210 65 33 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65 28 70  e3_column_type(p
12220 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20 20 20 20  Stmt, i);.      
12230 20 20 20 20 20 20 69 66 28 20 78 3d 3d 53 51 4c        if( x==SQL
12240 49 54 45 5f 42 4c 4f 42 20 26 26 20 70 41 72 67  ITE_BLOB && pArg
12250 20 26 26 20 70 41 72 67 2d 3e 63 4d 6f 64 65 3d   && pArg->cMode=
12260 3d 4d 4f 44 45 5f 49 6e 73 65 72 74 20 29 7b 0a  =MODE_Insert ){.
12270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 7a                az
12280 56 61 6c 73 5b 69 5d 20 3d 20 22 22 3b 0a 20 20  Vals[i] = "";.  
12290 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
122a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61  .              a
122b0 7a 56 61 6c 73 5b 69 5d 20 3d 20 28 63 68 61 72  zVals[i] = (char
122c0 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  *)sqlite3_column
122d0 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 69 29 3b  _text(pStmt, i);
122e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
122f0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21             if( !
12300 61 7a 56 61 6c 73 5b 69 5d 20 26 26 20 28 61 69  azVals[i] && (ai
12310 54 79 70 65 73 5b 69 5d 21 3d 53 51 4c 49 54 45  Types[i]!=SQLITE
12320 5f 4e 55 4c 4c 29 20 29 7b 0a 20 20 20 20 20 20  _NULL) ){.      
12330 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
12340 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
12350 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 20           break; 
12360 2f 2a 20 66 72 6f 6d 20 66 6f 72 20 2a 2f 0a 20  /* from for */. 
12370 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
12380 20 20 20 20 20 20 20 7d 20 2f 2a 20 65 6e 64 20         } /* end 
12390 66 6f 72 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20  for */..        
123a0 20 20 2f 2a 20 69 66 20 64 61 74 61 20 61 6e 64    /* if data and
123b0 20 74 79 70 65 73 20 65 78 74 72 61 63 74 65 64   types extracted
123c0 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2e 2e 2e   successfully...
123d0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66   */.          if
123e0 28 20 53 51 4c 49 54 45 5f 52 4f 57 20 3d 3d 20  ( SQLITE_ROW == 
123f0 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  rc ){.          
12400 20 20 2f 2a 20 63 61 6c 6c 20 74 68 65 20 73 75    /* call the su
12410 70 70 6c 69 65 64 20 63 61 6c 6c 62 61 63 6b 20  pplied callback 
12420 77 69 74 68 20 74 68 65 20 72 65 73 75 6c 74 20  with the result 
12430 72 6f 77 20 64 61 74 61 20 2a 2f 0a 20 20 20 20  row data */.    
12440 20 20 20 20 20 20 20 20 69 66 28 20 78 43 61 6c          if( xCal
12450 6c 62 61 63 6b 28 70 41 72 67 2c 20 6e 43 6f 6c  lback(pArg, nCol
12460 2c 20 61 7a 56 61 6c 73 2c 20 61 7a 43 6f 6c 73  , azVals, azCols
12470 2c 20 61 69 54 79 70 65 73 29 20 29 7b 0a 20 20  , aiTypes) ){.  
12480 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
12490 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 3b 0a 20   SQLITE_ABORT;. 
124a0 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65             }else
124b0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
124c0 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 65  rc = sqlite3_ste
124d0 70 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20  p(pStmt);.      
124e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
124f0 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 20 77 68    }.        } wh
12500 69 6c 65 28 20 53 51 4c 49 54 45 5f 52 4f 57 20  ile( SQLITE_ROW 
12510 3d 3d 20 72 63 20 29 3b 0a 20 20 20 20 20 20 20  == rc );.       
12520 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 44   sqlite3_free(pD
12530 61 74 61 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ata);.      }.  
12540 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 64    }else{.      d
12550 6f 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  o{.        rc = 
12560 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74  sqlite3_step(pSt
12570 6d 74 29 3b 0a 20 20 20 20 20 20 7d 20 77 68 69  mt);.      } whi
12580 6c 65 28 20 72 63 20 3d 3d 20 53 51 4c 49 54 45  le( rc == SQLITE
12590 5f 52 4f 57 20 29 3b 0a 20 20 20 20 7d 0a 20 20  _ROW );.    }.  
125a0 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  }.}..#ifndef SQL
125b0 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
125c0 54 41 42 4c 45 0a 2f 2a 0a 2a 2a 20 54 68 69 73  TABLE./*.** This
125d0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
125e0 6c 65 64 20 74 6f 20 70 72 6f 63 65 73 73 20 53  led to process S
125f0 51 4c 20 69 66 20 74 68 65 20 70 72 65 76 69 6f  QL if the previo
12600 75 73 20 73 68 65 6c 6c 20 63 6f 6d 6d 61 6e 64  us shell command
12610 0a 2a 2a 20 77 61 73 20 22 2e 65 78 70 65 72 74  .** was ".expert
12620 22 2e 20 49 74 20 70 61 73 73 65 73 20 74 68 65  ". It passes the
12630 20 53 51 4c 20 69 6e 20 74 68 65 20 73 65 63 6f   SQL in the seco
12640 6e 64 20 61 72 67 75 6d 65 6e 74 20 64 69 72 65  nd argument dire
12650 63 74 6c 79 20 74 6f 0a 2a 2a 20 74 68 65 20 73  ctly to.** the s
12660 71 6c 69 74 65 33 65 78 70 65 72 74 20 6f 62 6a  qlite3expert obj
12670 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75  ect..**.** If su
12680 63 63 65 73 73 66 75 6c 2c 20 53 51 4c 49 54 45  ccessful, SQLITE
12690 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e  _OK is returned.
126a0 20 4f 74 68 65 72 77 69 73 65 2c 20 61 6e 20 53   Otherwise, an S
126b0 51 4c 69 74 65 20 65 72 72 6f 72 0a 2a 2a 20 63  QLite error.** c
126c0 6f 64 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ode. In this cas
126d0 65 2c 20 28 2a 70 7a 45 72 72 29 20 6d 61 79 20  e, (*pzErr) may 
126e0 62 65 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20  be set to point 
126f0 74 6f 20 61 20 62 75 66 66 65 72 20 63 6f 6e 74  to a buffer cont
12700 61 69 6e 69 6e 67 0a 2a 2a 20 61 6e 20 45 6e 67  aining.** an Eng
12710 6c 69 73 68 20 6c 61 6e 67 75 61 67 65 20 65 72  lish language er
12720 72 6f 72 20 6d 65 73 73 61 67 65 2e 20 49 74 20  ror message. It 
12730 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62  is the responsib
12740 69 6c 69 74 79 20 6f 66 20 74 68 65 0a 2a 2a 20  ility of the.** 
12750 63 61 6c 6c 65 72 20 74 6f 20 65 76 65 6e 74 75  caller to eventu
12760 61 6c 6c 79 20 66 72 65 65 20 74 68 69 73 20 62  ally free this b
12770 75 66 66 65 72 20 75 73 69 6e 67 20 73 71 6c 69  uffer using sqli
12780 74 65 33 5f 66 72 65 65 28 29 2e 0a 2a 2f 0a 73  te3_free()..*/.s
12790 74 61 74 69 63 20 69 6e 74 20 65 78 70 65 72 74  tatic int expert
127a0 48 61 6e 64 6c 65 53 51 4c 28 0a 20 20 53 68 65  HandleSQL(.  She
127b0 6c 6c 53 74 61 74 65 20 2a 70 53 74 61 74 65 2c  llState *pState,
127c0 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a   .  const char *
127d0 7a 53 71 6c 2c 20 0a 20 20 63 68 61 72 20 2a 2a  zSql, .  char **
127e0 70 7a 45 72 72 0a 29 7b 0a 20 20 61 73 73 65 72  pzErr.){.  asser
127f0 74 28 20 70 53 74 61 74 65 2d 3e 65 78 70 65 72  t( pState->exper
12800 74 2e 70 45 78 70 65 72 74 20 29 3b 0a 20 20 61  t.pExpert );.  a
12810 73 73 65 72 74 28 20 70 7a 45 72 72 3d 3d 30 20  ssert( pzErr==0 
12820 7c 7c 20 2a 70 7a 45 72 72 3d 3d 30 20 29 3b 0a  || *pzErr==0 );.
12830 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
12840 5f 65 78 70 65 72 74 5f 73 71 6c 28 70 53 74 61  _expert_sql(pSta
12850 74 65 2d 3e 65 78 70 65 72 74 2e 70 45 78 70 65  te->expert.pExpe
12860 72 74 2c 20 7a 53 71 6c 2c 20 70 7a 45 72 72 29  rt, zSql, pzErr)
12870 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
12880 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
12890 65 64 20 65 69 74 68 65 72 20 74 6f 20 73 69 6c  ed either to sil
128a0 65 6e 74 6c 79 20 63 6c 65 61 6e 20 75 70 20 74  ently clean up t
128b0 68 65 20 6f 62 6a 65 63 74 0a 2a 2a 20 63 72 65  he object.** cre
128c0 61 74 65 64 20 62 79 20 74 68 65 20 22 2e 65 78  ated by the ".ex
128d0 70 65 72 74 22 20 63 6f 6d 6d 61 6e 64 20 28 69  pert" command (i
128e0 66 20 62 43 61 6e 63 65 6c 3d 3d 31 29 2c 20 6f  f bCancel==1), o
128f0 72 20 74 6f 20 67 65 6e 65 72 61 74 65 20 61 20  r to generate a 
12900 0a 2a 2a 20 72 65 70 6f 72 74 20 66 72 6f 6d 20  .** report from 
12910 69 74 20 61 6e 64 20 74 68 65 6e 20 63 6c 65 61  it and then clea
12920 6e 20 69 74 20 75 70 20 28 69 66 20 62 43 61 6e  n it up (if bCan
12930 63 65 6c 3d 3d 30 29 2e 0a 2a 2a 0a 2a 2a 20 49  cel==0)..**.** I
12940 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 53 51  f successful, SQ
12950 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
12960 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ned. Otherwise, 
12970 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 0a  an SQLite error.
12980 2a 2a 20 63 6f 64 65 2e 20 49 6e 20 74 68 69 73  ** code. In this
12990 20 63 61 73 65 2c 20 28 2a 70 7a 45 72 72 29 20   case, (*pzErr) 
129a0 6d 61 79 20 62 65 20 73 65 74 20 74 6f 20 70 6f  may be set to po
129b0 69 6e 74 20 74 6f 20 61 20 62 75 66 66 65 72 20  int to a buffer 
129c0 63 6f 6e 74 61 69 6e 69 6e 67 0a 2a 2a 20 61 6e  containing.** an
129d0 20 45 6e 67 6c 69 73 68 20 6c 61 6e 67 75 61 67   English languag
129e0 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 2e  e error message.
129f0 20 49 74 20 69 73 20 74 68 65 20 72 65 73 70 6f   It is the respo
12a00 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65  nsibility of the
12a10 0a 2a 2a 20 63 61 6c 6c 65 72 20 74 6f 20 65 76  .** caller to ev
12a20 65 6e 74 75 61 6c 6c 79 20 66 72 65 65 20 74 68  entually free th
12a30 69 73 20 62 75 66 66 65 72 20 75 73 69 6e 67 20  is buffer using 
12a40 73 71 6c 69 74 65 33 5f 66 72 65 65 28 29 2e 0a  sqlite3_free()..
12a50 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78  */.static int ex
12a60 70 65 72 74 46 69 6e 69 73 68 28 0a 20 20 53 68  pertFinish(.  Sh
12a70 65 6c 6c 53 74 61 74 65 20 2a 70 53 74 61 74 65  ellState *pState
12a80 2c 0a 20 20 69 6e 74 20 62 43 61 6e 63 65 6c 2c  ,.  int bCancel,
12a90 0a 20 20 63 68 61 72 20 2a 2a 70 7a 45 72 72 0a  .  char **pzErr.
12aa0 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
12ab0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 73 71 6c 69 74  LITE_OK;.  sqlit
12ac0 65 33 65 78 70 65 72 74 20 2a 70 20 3d 20 70 53  e3expert *p = pS
12ad0 74 61 74 65 2d 3e 65 78 70 65 72 74 2e 70 45 78  tate->expert.pEx
12ae0 70 65 72 74 3b 0a 20 20 61 73 73 65 72 74 28 20  pert;.  assert( 
12af0 70 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 62  p );.  assert( b
12b00 43 61 6e 63 65 6c 20 7c 7c 20 70 7a 45 72 72 3d  Cancel || pzErr=
12b10 3d 30 20 7c 7c 20 2a 70 7a 45 72 72 3d 3d 30 20  =0 || *pzErr==0 
12b20 29 3b 0a 20 20 69 66 28 20 62 43 61 6e 63 65 6c  );.  if( bCancel
12b30 3d 3d 30 20 29 7b 0a 20 20 20 20 46 49 4c 45 20  ==0 ){.    FILE 
12b40 2a 6f 75 74 20 3d 20 70 53 74 61 74 65 2d 3e 6f  *out = pState->o
12b50 75 74 3b 0a 20 20 20 20 69 6e 74 20 62 56 65 72  ut;.    int bVer
12b60 62 6f 73 65 20 3d 20 70 53 74 61 74 65 2d 3e 65  bose = pState->e
12b70 78 70 65 72 74 2e 62 56 65 72 62 6f 73 65 3b 0a  xpert.bVerbose;.
12b80 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
12b90 33 5f 65 78 70 65 72 74 5f 61 6e 61 6c 79 7a 65  3_expert_analyze
12ba0 28 70 2c 20 70 7a 45 72 72 29 3b 0a 20 20 20 20  (p, pzErr);.    
12bb0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
12bc0 4b 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  K ){.      int n
12bd0 51 75 65 72 79 20 3d 20 73 71 6c 69 74 65 33 5f  Query = sqlite3_
12be0 65 78 70 65 72 74 5f 63 6f 75 6e 74 28 70 29 3b  expert_count(p);
12bf0 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 0a 20  .      int i;.. 
12c00 20 20 20 20 20 69 66 28 20 62 56 65 72 62 6f 73       if( bVerbos
12c10 65 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e  e ){.        con
12c20 73 74 20 63 68 61 72 20 2a 7a 43 61 6e 64 20 3d  st char *zCand =
12c30 20 73 71 6c 69 74 65 33 5f 65 78 70 65 72 74 5f   sqlite3_expert_
12c40 72 65 70 6f 72 74 28 70 2c 30 2c 45 58 50 45 52  report(p,0,EXPER
12c50 54 5f 52 45 50 4f 52 54 5f 43 41 4e 44 49 44 41  T_REPORT_CANDIDA
12c60 54 45 53 29 3b 0a 20 20 20 20 20 20 20 20 72 61  TES);.        ra
12c70 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 2d  w_printf(out, "-
12c80 2d 20 43 61 6e 64 69 64 61 74 65 73 20 2d 2d 2d  - Candidates ---
12c90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12ca0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 5c 6e 22 29 3b 0a  ----------\n");.
12cb0 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e          raw_prin
12cc0 74 66 28 6f 75 74 2c 20 22 25 73 5c 6e 22 2c 20  tf(out, "%s\n", 
12cd0 7a 43 61 6e 64 29 3b 0a 20 20 20 20 20 20 7d 0a  zCand);.      }.
12ce0 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
12cf0 3c 6e 51 75 65 72 79 3b 20 69 2b 2b 29 7b 0a 20  <nQuery; i++){. 
12d00 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61         const cha
12d10 72 20 2a 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65  r *zSql = sqlite
12d20 33 5f 65 78 70 65 72 74 5f 72 65 70 6f 72 74 28  3_expert_report(
12d30 70 2c 20 69 2c 20 45 58 50 45 52 54 5f 52 45 50  p, i, EXPERT_REP
12d40 4f 52 54 5f 53 51 4c 29 3b 0a 20 20 20 20 20 20  ORT_SQL);.      
12d50 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49    const char *zI
12d60 64 78 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 70  dx = sqlite3_exp
12d70 65 72 74 5f 72 65 70 6f 72 74 28 70 2c 20 69 2c  ert_report(p, i,
12d80 20 45 58 50 45 52 54 5f 52 45 50 4f 52 54 5f 49   EXPERT_REPORT_I
12d90 4e 44 45 58 45 53 29 3b 0a 20 20 20 20 20 20 20  NDEXES);.       
12da0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 51   const char *zEQ
12db0 50 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 70 65  P = sqlite3_expe
12dc0 72 74 5f 72 65 70 6f 72 74 28 70 2c 20 69 2c 20  rt_report(p, i, 
12dd0 45 58 50 45 52 54 5f 52 45 50 4f 52 54 5f 50 4c  EXPERT_REPORT_PL
12de0 41 4e 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  AN);.        if(
12df0 20 7a 49 64 78 3d 3d 30 20 29 20 7a 49 64 78 20   zIdx==0 ) zIdx 
12e00 3d 20 22 28 6e 6f 20 6e 65 77 20 69 6e 64 65 78  = "(no new index
12e10 65 73 29 5c 6e 22 3b 0a 20 20 20 20 20 20 20 20  es)\n";.        
12e20 69 66 28 20 62 56 65 72 62 6f 73 65 20 29 7b 0a  if( bVerbose ){.
12e30 20 20 20 20 20 20 20 20 20 20 72 61 77 5f 70 72            raw_pr
12e40 69 6e 74 66 28 6f 75 74 2c 20 22 2d 2d 20 51 75  intf(out, "-- Qu
12e50 65 72 79 20 25 64 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  ery %d ---------
12e60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12e70 2d 2d 2d 2d 2d 2d 2d 5c 6e 22 2c 69 2b 31 29 3b  -------\n",i+1);
12e80 0a 20 20 20 20 20 20 20 20 20 20 72 61 77 5f 70  .          raw_p
12e90 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 73 5c 6e  rintf(out, "%s\n
12ea0 5c 6e 22 2c 20 7a 53 71 6c 29 3b 0a 20 20 20 20  \n", zSql);.    
12eb0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 61      }.        ra
12ec0 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25  w_printf(out, "%
12ed0 73 5c 6e 22 2c 20 7a 49 64 78 29 3b 0a 20 20 20  s\n", zIdx);.   
12ee0 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
12ef0 6f 75 74 2c 20 22 25 73 5c 6e 22 2c 20 7a 45 51  out, "%s\n", zEQ
12f00 50 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  P);.      }.    
12f10 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  }.  }.  sqlite3_
12f20 65 78 70 65 72 74 5f 64 65 73 74 72 6f 79 28 70  expert_destroy(p
12f30 29 3b 0a 20 20 70 53 74 61 74 65 2d 3e 65 78 70  );.  pState->exp
12f40 65 72 74 2e 70 45 78 70 65 72 74 20 3d 20 30 3b  ert.pExpert = 0;
12f50 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
12f60 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74  ./*.** Implement
12f70 61 74 69 6f 6e 20 6f 66 20 22 2e 65 78 70 65 72  ation of ".exper
12f80 74 22 20 64 6f 74 20 63 6f 6d 6d 61 6e 64 2e 0a  t" dot command..
12f90 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78  */.static int ex
12fa0 70 65 72 74 44 6f 74 43 6f 6d 6d 61 6e 64 28 0a  pertDotCommand(.
12fb0 20 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 53    ShellState *pS
12fc0 74 61 74 65 2c 20 20 20 20 20 20 20 20 20 20 20  tate,           
12fd0 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 73 68 65    /* Current she
12fe0 6c 6c 20 74 6f 6f 6c 20 73 74 61 74 65 20 2a 2f  ll tool state */
12ff0 0a 20 20 63 68 61 72 20 2a 2a 61 7a 41 72 67 2c  .  char **azArg,
13000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13010 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 61     /* Array of a
13020 72 67 75 6d 65 6e 74 73 20 70 61 73 73 65 64 20  rguments passed 
13030 74 6f 20 64 6f 74 20 63 6f 6d 6d 61 6e 64 20 2a  to dot command *
13040 2f 0a 20 20 69 6e 74 20 6e 41 72 67 20 20 20 20  /.  int nArg    
13050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13060 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
13070 20 65 6e 74 72 69 65 73 20 69 6e 20 61 7a 41 72   entries in azAr
13080 67 5b 5d 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  g[] */.){.  int 
13090 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
130a0 20 20 63 68 61 72 20 2a 7a 45 72 72 20 3d 20 30    char *zErr = 0
130b0 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  ;.  int i;.  int
130c0 20 69 53 61 6d 70 6c 65 20 3d 20 30 3b 0a 0a 20   iSample = 0;.. 
130d0 20 61 73 73 65 72 74 28 20 70 53 74 61 74 65 2d   assert( pState-
130e0 3e 65 78 70 65 72 74 2e 70 45 78 70 65 72 74 3d  >expert.pExpert=
130f0 3d 30 20 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26  =0 );.  memset(&
13100 70 53 74 61 74 65 2d 3e 65 78 70 65 72 74 2c 20  pState->expert, 
13110 30 2c 20 73 69 7a 65 6f 66 28 45 78 70 65 72 74  0, sizeof(Expert
13120 49 6e 66 6f 29 29 3b 0a 0a 20 20 66 6f 72 28 69  Info));..  for(i
13130 3d 31 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  =1; rc==SQLITE_O
13140 4b 20 26 26 20 69 3c 6e 41 72 67 3b 20 69 2b 2b  K && i<nArg; i++
13150 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 20 3d  ){.    char *z =
13160 20 61 7a 41 72 67 5b 69 5d 3b 0a 20 20 20 20 69   azArg[i];.    i
13170 6e 74 20 6e 3b 0a 20 20 20 20 69 66 28 20 7a 5b  nt n;.    if( z[
13180 30 5d 3d 3d 27 2d 27 20 26 26 20 7a 5b 31 5d 3d  0]=='-' && z[1]=
13190 3d 27 2d 27 20 29 20 7a 2b 2b 3b 0a 20 20 20 20  ='-' ) z++;.    
131a0 6e 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a 29 3b  n = strlen30(z);
131b0 0a 20 20 20 20 69 66 28 20 6e 3e 3d 32 20 26 26  .    if( n>=2 &&
131c0 20 30 3d 3d 73 74 72 6e 63 6d 70 28 7a 2c 20 22   0==strncmp(z, "
131d0 2d 76 65 72 62 6f 73 65 22 2c 20 6e 29 20 29 7b  -verbose", n) ){
131e0 0a 20 20 20 20 20 20 70 53 74 61 74 65 2d 3e 65  .      pState->e
131f0 78 70 65 72 74 2e 62 56 65 72 62 6f 73 65 20 3d  xpert.bVerbose =
13200 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65 6c   1;.    }.    el
13210 73 65 20 69 66 28 20 6e 3e 3d 32 20 26 26 20 30  se if( n>=2 && 0
13220 3d 3d 73 74 72 6e 63 6d 70 28 7a 2c 20 22 2d 73  ==strncmp(z, "-s
13230 61 6d 70 6c 65 22 2c 20 6e 29 20 29 7b 0a 20 20  ample", n) ){.  
13240 20 20 20 20 69 66 28 20 69 3d 3d 28 6e 41 72 67      if( i==(nArg
13250 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72  -1) ){.        r
13260 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  aw_printf(stderr
13270 2c 20 22 6f 70 74 69 6f 6e 20 72 65 71 75 69 72  , "option requir
13280 65 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 3a 20  es an argument: 
13290 25 73 5c 6e 22 2c 20 7a 29 3b 0a 20 20 20 20 20  %s\n", z);.     
132a0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45     rc = SQLITE_E
132b0 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 65 6c 73  RROR;.      }els
132c0 65 7b 0a 20 20 20 20 20 20 20 20 69 53 61 6d 70  e{.        iSamp
132d0 6c 65 20 3d 20 28 69 6e 74 29 69 6e 74 65 67 65  le = (int)intege
132e0 72 56 61 6c 75 65 28 61 7a 41 72 67 5b 2b 2b 69  rValue(azArg[++i
132f0 5d 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ]);.        if( 
13300 69 53 61 6d 70 6c 65 3c 30 20 7c 7c 20 69 53 61  iSample<0 || iSa
13310 6d 70 6c 65 3e 31 30 30 20 29 7b 0a 20 20 20 20  mple>100 ){.    
13320 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
13330 28 73 74 64 65 72 72 2c 20 22 76 61 6c 75 65 20  (stderr, "value 
13340 6f 75 74 20 6f 66 20 72 61 6e 67 65 3a 20 25 73  out of range: %s
13350 5c 6e 22 2c 20 61 7a 41 72 67 5b 69 5d 29 3b 0a  \n", azArg[i]);.
13360 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
13370 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
13380 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
13390 20 20 20 7d 0a 20 20 20 20 65 6c 73 65 7b 0a 20     }.    else{. 
133a0 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
133b0 73 74 64 65 72 72 2c 20 22 75 6e 6b 6e 6f 77 6e  stderr, "unknown
133c0 20 6f 70 74 69 6f 6e 3a 20 25 73 5c 6e 22 2c 20   option: %s\n", 
133d0 7a 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  z);.      rc = S
133e0 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
133f0 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63   }.  }..  if( rc
13400 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
13410 20 20 20 70 53 74 61 74 65 2d 3e 65 78 70 65 72     pState->exper
13420 74 2e 70 45 78 70 65 72 74 20 3d 20 73 71 6c 69  t.pExpert = sqli
13430 74 65 33 5f 65 78 70 65 72 74 5f 6e 65 77 28 70  te3_expert_new(p
13440 53 74 61 74 65 2d 3e 64 62 2c 20 26 7a 45 72 72  State->db, &zErr
13450 29 3b 0a 20 20 20 20 69 66 28 20 70 53 74 61 74  );.    if( pStat
13460 65 2d 3e 65 78 70 65 72 74 2e 70 45 78 70 65 72  e->expert.pExper
13470 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 61  t==0 ){.      ra
13480 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  w_printf(stderr,
13490 20 22 73 71 6c 69 74 65 33 5f 65 78 70 65 72 74   "sqlite3_expert
134a0 5f 6e 65 77 3a 20 25 73 5c 6e 22 2c 20 7a 45 72  _new: %s\n", zEr
134b0 72 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  r);.      rc = S
134c0 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
134d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
134e0 6c 69 74 65 33 5f 65 78 70 65 72 74 5f 63 6f 6e  lite3_expert_con
134f0 66 69 67 28 0a 20 20 20 20 20 20 20 20 20 20 70  fig(.          p
13500 53 74 61 74 65 2d 3e 65 78 70 65 72 74 2e 70 45  State->expert.pE
13510 78 70 65 72 74 2c 20 45 58 50 45 52 54 5f 43 4f  xpert, EXPERT_CO
13520 4e 46 49 47 5f 53 41 4d 50 4c 45 2c 20 69 53 61  NFIG_SAMPLE, iSa
13530 6d 70 6c 65 0a 20 20 20 20 20 20 29 3b 0a 20 20  mple.      );.  
13540 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
13550 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  n rc;.}.#endif /
13560 2a 20 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  * ifndef SQLITE_
13570 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
13580 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 45 78 65 63  E */../*.** Exec
13590 75 74 65 20 61 20 73 74 61 74 65 6d 65 6e 74 20  ute a statement 
135a0 6f 72 20 73 65 74 20 6f 66 20 73 74 61 74 65 6d  or set of statem
135b0 65 6e 74 73 2e 20 20 50 72 69 6e 74 0a 2a 2a 20  ents.  Print.** 
135c0 61 6e 79 20 72 65 73 75 6c 74 20 72 6f 77 73 2f  any result rows/
135d0 63 6f 6c 75 6d 6e 73 20 64 65 70 65 6e 64 69 6e  columns dependin
135e0 67 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74  g on the current
135f0 20 6d 6f 64 65 0a 2a 2a 20 73 65 74 20 76 69 61   mode.** set via
13600 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 63 61   the supplied ca
13610 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68  llback..**.** Th
13620 69 73 20 69 73 20 76 65 72 79 20 73 69 6d 69 6c  is is very simil
13630 61 72 20 74 6f 20 53 51 4c 69 74 65 27 73 20 62  ar to SQLite's b
13640 75 69 6c 74 2d 69 6e 20 73 71 6c 69 74 65 33 5f  uilt-in sqlite3_
13650 65 78 65 63 28 29 0a 2a 2a 20 66 75 6e 63 74 69  exec().** functi
13660 6f 6e 20 65 78 63 65 70 74 20 69 74 20 74 61 6b  on except it tak
13670 65 73 20 61 20 73 6c 69 67 68 74 6c 79 20 64 69  es a slightly di
13680 66 66 65 72 65 6e 74 20 63 61 6c 6c 62 61 63 6b  fferent callback
13690 0a 2a 2a 20 61 6e 64 20 63 61 6c 6c 62 61 63 6b  .** and callback
136a0 20 64 61 74 61 20 61 72 67 75 6d 65 6e 74 2e 0a   data argument..
136b0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 68  */.static int sh
136c0 65 6c 6c 5f 65 78 65 63 28 0a 20 20 73 71 6c 69  ell_exec(.  sqli
136d0 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20  te3 *db,        
136e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
136f0 20 20 20 20 20 20 2f 2a 20 41 6e 20 6f 70 65 6e        /* An open
13700 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 63   database */.  c
13710 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 2c  onst char *zSql,
13720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13730 20 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 20           /* SQL 
13740 74 6f 20 62 65 20 65 76 61 6c 75 61 74 65 64 20  to be evaluated 
13750 2a 2f 0a 20 20 69 6e 74 20 28 2a 78 43 61 6c 6c  */.  int (*xCall
13760 62 61 63 6b 29 28 76 6f 69 64 2a 2c 69 6e 74 2c  back)(void*,int,
13770 63 68 61 72 2a 2a 2c 63 68 61 72 2a 2a 2c 69 6e  char**,char**,in
13780 74 2a 29 2c 20 20 20 2f 2a 20 43 61 6c 6c 62 61  t*),   /* Callba
13790 63 6b 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  ck function */. 
137a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
137b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
137c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28 6e             /* (n
137d0 6f 74 20 74 68 65 20 73 61 6d 65 20 61 73 20 73  ot the same as s
137e0 71 6c 69 74 65 33 5f 65 78 65 63 29 20 2a 2f 0a  qlite3_exec) */.
137f0 20 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 41    ShellState *pA
13800 72 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  rg,             
13810 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
13820 6f 69 6e 74 65 72 20 74 6f 20 53 68 65 6c 6c 53  ointer to ShellS
13830 74 61 74 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  tate */.  char *
13840 2a 70 7a 45 72 72 4d 73 67 20 20 20 20 20 20 20  *pzErrMsg       
13850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13860 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 6d 73 67      /* Error msg
13870 20 77 72 69 74 74 65 6e 20 68 65 72 65 20 2a 2f   written here */
13880 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  .){.  sqlite3_st
13890 6d 74 20 2a 70 53 74 6d 74 20 3d 20 4e 55 4c 4c  mt *pStmt = NULL
138a0 3b 20 20 20 20 20 2f 2a 20 53 74 61 74 65 6d 65  ;     /* Stateme
138b0 6e 74 20 74 6f 20 65 78 65 63 75 74 65 2e 20 2a  nt to execute. *
138c0 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  /.  int rc = SQL
138d0 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
138e0 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f      /* Return Co
138f0 64 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 32 3b  de */.  int rc2;
13900 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
13910 4c 65 66 74 6f 76 65 72 3b 20 20 20 20 20 20 20  Leftover;       
13920 20 20 20 2f 2a 20 54 61 69 6c 20 6f 66 20 75 6e     /* Tail of un
13930 70 72 6f 63 65 73 73 65 64 20 53 51 4c 20 2a 2f  processed SQL */
13940 0a 0a 20 20 69 66 28 20 70 7a 45 72 72 4d 73 67  ..  if( pzErrMsg
13950 20 29 7b 0a 20 20 20 20 2a 70 7a 45 72 72 4d 73   ){.    *pzErrMs
13960 67 20 3d 20 4e 55 4c 4c 3b 0a 20 20 7d 0a 0a 23  g = NULL;.  }..#
13970 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
13980 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
13990 20 20 69 66 28 20 70 41 72 67 2d 3e 65 78 70 65    if( pArg->expe
139a0 72 74 2e 70 45 78 70 65 72 74 20 29 7b 0a 20 20  rt.pExpert ){.  
139b0 20 20 72 63 20 3d 20 65 78 70 65 72 74 48 61 6e    rc = expertHan
139c0 64 6c 65 53 51 4c 28 70 41 72 67 2c 20 7a 53 71  dleSQL(pArg, zSq
139d0 6c 2c 20 70 7a 45 72 72 4d 73 67 29 3b 0a 20 20  l, pzErrMsg);.  
139e0 20 20 72 65 74 75 72 6e 20 65 78 70 65 72 74 46    return expertF
139f0 69 6e 69 73 68 28 70 41 72 67 2c 20 28 72 63 21  inish(pArg, (rc!
13a00 3d 53 51 4c 49 54 45 5f 4f 4b 29 2c 20 70 7a 45  =SQLITE_OK), pzE
13a10 72 72 4d 73 67 29 3b 0a 20 20 7d 0a 23 65 6e 64  rrMsg);.  }.#end
13a20 69 66 0a 0a 20 20 77 68 69 6c 65 28 20 7a 53 71  if..  while( zSq
13a30 6c 5b 30 5d 20 26 26 20 28 53 51 4c 49 54 45 5f  l[0] && (SQLITE_
13a40 4f 4b 20 3d 3d 20 72 63 29 20 29 7b 0a 20 20 20  OK == rc) ){.   
13a50 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68   static const ch
13a60 61 72 20 2a 7a 53 74 6d 74 53 71 6c 3b 0a 20 20  ar *zStmtSql;.  
13a70 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70    rc = sqlite3_p
13a80 72 65 70 61 72 65 5f 76 32 28 64 62 2c 20 7a 53  repare_v2(db, zS
13a90 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20  ql, -1, &pStmt, 
13aa0 26 7a 4c 65 66 74 6f 76 65 72 29 3b 0a 20 20 20  &zLeftover);.   
13ab0 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 20 21   if( SQLITE_OK !
13ac0 3d 20 72 63 20 29 7b 0a 20 20 20 20 20 20 69 66  = rc ){.      if
13ad0 28 20 70 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20  ( pzErrMsg ){.  
13ae0 20 20 20 20 20 20 2a 70 7a 45 72 72 4d 73 67 20        *pzErrMsg 
13af0 3d 20 73 61 76 65 5f 65 72 72 5f 6d 73 67 28 64  = save_err_msg(d
13b00 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  b);.      }.    
13b10 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28  }else{.      if(
13b20 20 21 70 53 74 6d 74 20 29 7b 0a 20 20 20 20 20   !pStmt ){.     
13b30 20 20 20 2f 2a 20 74 68 69 73 20 68 61 70 70 65     /* this happe
13b40 6e 73 20 66 6f 72 20 61 20 63 6f 6d 6d 65 6e 74  ns for a comment
13b50 20 6f 72 20 77 68 69 74 65 2d 73 70 61 63 65 20   or white-space 
13b60 2a 2f 0a 20 20 20 20 20 20 20 20 7a 53 71 6c 20  */.        zSql 
13b70 3d 20 7a 4c 65 66 74 6f 76 65 72 3b 0a 20 20 20  = zLeftover;.   
13b80 20 20 20 20 20 77 68 69 6c 65 28 20 49 73 53 70       while( IsSp
13b90 61 63 65 28 7a 53 71 6c 5b 30 5d 29 20 29 20 7a  ace(zSql[0]) ) z
13ba0 53 71 6c 2b 2b 3b 0a 20 20 20 20 20 20 20 20 63  Sql++;.        c
13bb0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d  ontinue;.      }
13bc0 0a 20 20 20 20 20 20 7a 53 74 6d 74 53 71 6c 20  .      zStmtSql 
13bd0 3d 20 73 71 6c 69 74 65 33 5f 73 71 6c 28 70 53  = sqlite3_sql(pS
13be0 74 6d 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20  tmt);.      if( 
13bf0 7a 53 74 6d 74 53 71 6c 3d 3d 30 20 29 20 7a 53  zStmtSql==0 ) zS
13c00 74 6d 74 53 71 6c 20 3d 20 22 22 3b 0a 20 20 20  tmtSql = "";.   
13c10 20 20 20 77 68 69 6c 65 28 20 49 73 53 70 61 63     while( IsSpac
13c20 65 28 7a 53 74 6d 74 53 71 6c 5b 30 5d 29 20 29  e(zStmtSql[0]) )
13c30 20 7a 53 74 6d 74 53 71 6c 2b 2b 3b 0a 0a 20 20   zStmtSql++;..  
13c40 20 20 20 20 2f 2a 20 73 61 76 65 20 6f 66 66 20      /* save off 
13c50 74 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61  the prepared sta
13c60 74 6d 65 6e 74 20 68 61 6e 64 6c 65 20 61 6e 64  tment handle and
13c70 20 72 65 73 65 74 20 72 6f 77 20 63 6f 75 6e 74   reset row count
13c80 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 41   */.      if( pA
13c90 72 67 20 29 7b 0a 20 20 20 20 20 20 20 20 70 41  rg ){.        pA
13ca0 72 67 2d 3e 70 53 74 6d 74 20 3d 20 70 53 74 6d  rg->pStmt = pStm
13cb0 74 3b 0a 20 20 20 20 20 20 20 20 70 41 72 67 2d  t;.        pArg-
13cc0 3e 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  >cnt = 0;.      
13cd0 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 65 63 68 6f  }..      /* echo
13ce0 20 74 68 65 20 73 71 6c 20 73 74 61 74 65 6d 65   the sql stateme
13cf0 6e 74 20 69 66 20 65 63 68 6f 20 6f 6e 20 2a 2f  nt if echo on */
13d00 0a 20 20 20 20 20 20 69 66 28 20 70 41 72 67 20  .      if( pArg 
13d10 26 26 20 53 68 65 6c 6c 48 61 73 46 6c 61 67 28  && ShellHasFlag(
13d20 70 41 72 67 2c 20 53 48 46 4c 47 5f 45 63 68 6f  pArg, SHFLG_Echo
13d30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66  ) ){.        utf
13d40 38 5f 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f  8_printf(pArg->o
13d50 75 74 2c 20 22 25 73 5c 6e 22 2c 20 7a 53 74 6d  ut, "%s\n", zStm
13d60 74 53 71 6c 20 3f 20 7a 53 74 6d 74 53 71 6c 20  tSql ? zStmtSql 
13d70 3a 20 7a 53 71 6c 29 3b 0a 20 20 20 20 20 20 7d  : zSql);.      }
13d80 0a 0a 20 20 20 20 20 20 2f 2a 20 53 68 6f 77 20  ..      /* Show 
13d90 74 68 65 20 45 58 50 4c 41 49 4e 20 51 55 45 52  the EXPLAIN QUER
13da0 59 20 50 4c 41 4e 20 69 66 20 2e 65 71 70 20 69  Y PLAN if .eqp i
13db0 73 20 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 69 66  s on */.      if
13dc0 28 20 70 41 72 67 20 26 26 20 70 41 72 67 2d 3e  ( pArg && pArg->
13dd0 61 75 74 6f 45 51 50 20 26 26 20 73 71 6c 69 74  autoEQP && sqlit
13de0 65 33 5f 73 74 72 6c 69 6b 65 28 22 45 58 50 4c  e3_strlike("EXPL
13df0 41 49 4e 25 22 2c 7a 53 74 6d 74 53 71 6c 2c 30  AIN%",zStmtSql,0
13e00 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
13e10 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 45  sqlite3_stmt *pE
13e20 78 70 6c 61 69 6e 3b 0a 20 20 20 20 20 20 20 20  xplain;.        
13e30 63 68 61 72 20 2a 7a 45 51 50 3b 0a 20 20 20 20  char *zEQP;.    
13e40 20 20 20 20 69 6e 74 20 74 72 69 67 67 65 72 45      int triggerE
13e50 51 50 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  QP = 0;.        
13e60 64 69 73 61 62 6c 65 5f 64 65 62 75 67 5f 74 72  disable_debug_tr
13e70 61 63 65 5f 6d 6f 64 65 73 28 29 3b 0a 20 20 20  ace_modes();.   
13e80 20 20 20 20 20 73 71 6c 69 74 65 33 5f 64 62 5f       sqlite3_db_
13e90 63 6f 6e 66 69 67 28 64 62 2c 20 53 51 4c 49 54  config(db, SQLIT
13ea0 45 5f 44 42 43 4f 4e 46 49 47 5f 54 52 49 47 47  E_DBCONFIG_TRIGG
13eb0 45 52 5f 45 51 50 2c 20 2d 31 2c 20 26 74 72 69  ER_EQP, -1, &tri
13ec0 67 67 65 72 45 51 50 29 3b 0a 20 20 20 20 20 20  ggerEQP);.      
13ed0 20 20 69 66 28 20 70 41 72 67 2d 3e 61 75 74 6f    if( pArg->auto
13ee0 45 51 50 3e 3d 41 55 54 4f 45 51 50 5f 74 72 69  EQP>=AUTOEQP_tri
13ef0 67 67 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20  gger ){.        
13f00 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 63 6f 6e    sqlite3_db_con
13f10 66 69 67 28 64 62 2c 20 53 51 4c 49 54 45 5f 44  fig(db, SQLITE_D
13f20 42 43 4f 4e 46 49 47 5f 54 52 49 47 47 45 52 5f  BCONFIG_TRIGGER_
13f30 45 51 50 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20  EQP, 1, 0);.    
13f40 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7a 45      }.        zE
13f50 51 50 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  QP = sqlite3_mpr
13f60 69 6e 74 66 28 22 45 58 50 4c 41 49 4e 20 51 55  intf("EXPLAIN QU
13f70 45 52 59 20 50 4c 41 4e 20 25 73 22 2c 20 7a 53  ERY PLAN %s", zS
13f80 74 6d 74 53 71 6c 29 3b 0a 20 20 20 20 20 20 20  tmtSql);.       
13f90 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72   rc = sqlite3_pr
13fa0 65 70 61 72 65 5f 76 32 28 64 62 2c 20 7a 45 51  epare_v2(db, zEQ
13fb0 50 2c 20 2d 31 2c 20 26 70 45 78 70 6c 61 69 6e  P, -1, &pExplain
13fc0 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , 0);.        if
13fd0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
13fe0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 77 68 69  ){.          whi
13ff0 6c 65 28 20 73 71 6c 69 74 65 33 5f 73 74 65 70  le( sqlite3_step
14000 28 70 45 78 70 6c 61 69 6e 29 3d 3d 53 51 4c 49  (pExplain)==SQLI
14010 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 20 20  TE_ROW ){.      
14020 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
14030 28 70 41 72 67 2d 3e 6f 75 74 2c 22 2d 2d 45 51  (pArg->out,"--EQ
14040 50 2d 2d 20 25 64 2c 22 2c 73 71 6c 69 74 65 33  P-- %d,",sqlite3
14050 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 45 78 70  _column_int(pExp
14060 6c 61 69 6e 2c 20 30 29 29 3b 0a 20 20 20 20 20  lain, 0));.     
14070 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74         raw_print
14080 66 28 70 41 72 67 2d 3e 6f 75 74 2c 22 25 64 2c  f(pArg->out,"%d,
14090 22 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  ", sqlite3_colum
140a0 6e 5f 69 6e 74 28 70 45 78 70 6c 61 69 6e 2c 20  n_int(pExplain, 
140b0 31 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  1));.           
140c0 20 72 61 77 5f 70 72 69 6e 74 66 28 70 41 72 67   raw_printf(pArg
140d0 2d 3e 6f 75 74 2c 22 25 64 2c 22 2c 20 73 71 6c  ->out,"%d,", sql
140e0 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28  ite3_column_int(
140f0 70 45 78 70 6c 61 69 6e 2c 20 32 29 29 3b 0a 20  pExplain, 2));. 
14100 20 20 20 20 20 20 20 20 20 20 20 75 74 66 38 5f             utf8_
14110 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74  printf(pArg->out
14120 2c 22 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65 33  ,"%s\n", sqlite3
14130 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 45 78  _column_text(pEx
14140 70 6c 61 69 6e 2c 20 33 29 29 3b 0a 20 20 20 20  plain, 3));.    
14150 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
14160 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  }.        sqlite
14170 33 5f 66 69 6e 61 6c 69 7a 65 28 70 45 78 70 6c  3_finalize(pExpl
14180 61 69 6e 29 3b 0a 20 20 20 20 20 20 20 20 73 71  ain);.        sq
14190 6c 69 74 65 33 5f 66 72 65 65 28 7a 45 51 50 29  lite3_free(zEQP)
141a0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 41  ;.        if( pA
141b0 72 67 2d 3e 61 75 74 6f 45 51 50 3e 3d 41 55 54  rg->autoEQP>=AUT
141c0 4f 45 51 50 5f 66 75 6c 6c 20 29 7b 0a 20 20 20  OEQP_full ){.   
141d0 20 20 20 20 20 20 20 2f 2a 20 41 6c 73 6f 20 64         /* Also d
141e0 6f 20 61 6e 20 45 58 50 4c 41 49 4e 20 66 6f 72  o an EXPLAIN for
141f0 20 22 2e 65 71 70 20 66 75 6c 6c 22 20 6d 6f 64   ".eqp full" mod
14200 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 7a  e */.          z
14210 45 51 50 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  EQP = sqlite3_mp
14220 72 69 6e 74 66 28 22 45 58 50 4c 41 49 4e 20 25  rintf("EXPLAIN %
14230 73 22 2c 20 7a 53 74 6d 74 53 71 6c 29 3b 0a 20  s", zStmtSql);. 
14240 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
14250 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32  lite3_prepare_v2
14260 28 64 62 2c 20 7a 45 51 50 2c 20 2d 31 2c 20 26  (db, zEQP, -1, &
14270 70 45 78 70 6c 61 69 6e 2c 20 30 29 3b 0a 20 20  pExplain, 0);.  
14280 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
14290 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
142a0 20 20 20 20 20 20 20 20 20 70 41 72 67 2d 3e 63           pArg->c
142b0 4d 6f 64 65 20 3d 20 4d 4f 44 45 5f 45 78 70 6c  Mode = MODE_Expl
142c0 61 69 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ain;.           
142d0 20 65 78 70 6c 61 69 6e 5f 64 61 74 61 5f 70 72   explain_data_pr
142e0 65 70 61 72 65 28 70 41 72 67 2c 20 70 45 78 70  epare(pArg, pExp
142f0 6c 61 69 6e 29 3b 0a 20 20 20 20 20 20 20 20 20  lain);.         
14300 20 20 20 65 78 65 63 5f 70 72 65 70 61 72 65 64     exec_prepared
14310 5f 73 74 6d 74 28 70 41 72 67 2c 20 70 45 78 70  _stmt(pArg, pExp
14320 6c 61 69 6e 2c 20 78 43 61 6c 6c 62 61 63 6b 29  lain, xCallback)
14330 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 65 78  ;.            ex
14340 70 6c 61 69 6e 5f 64 61 74 61 5f 64 65 6c 65 74  plain_data_delet
14350 65 28 70 41 72 67 29 3b 0a 20 20 20 20 20 20 20  e(pArg);.       
14360 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73     }.          s
14370 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
14380 70 45 78 70 6c 61 69 6e 29 3b 0a 20 20 20 20 20  pExplain);.     
14390 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
143a0 65 28 7a 45 51 50 29 3b 0a 20 20 20 20 20 20 20  e(zEQP);.       
143b0 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   }.        sqlit
143c0 65 33 5f 64 62 5f 63 6f 6e 66 69 67 28 64 62 2c  e3_db_config(db,
143d0 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47   SQLITE_DBCONFIG
143e0 5f 54 52 49 47 47 45 52 5f 45 51 50 2c 20 74 72  _TRIGGER_EQP, tr
143f0 69 67 67 65 72 45 51 50 2c 20 30 29 3b 0a 20 20  iggerEQP, 0);.  
14400 20 20 20 20 20 20 72 65 73 74 6f 72 65 5f 64 65        restore_de
14410 62 75 67 5f 74 72 61 63 65 5f 6d 6f 64 65 73 28  bug_trace_modes(
14420 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
14430 20 20 69 66 28 20 70 41 72 67 20 29 7b 0a 20 20    if( pArg ){.  
14440 20 20 20 20 20 20 70 41 72 67 2d 3e 63 4d 6f 64        pArg->cMod
14450 65 20 3d 20 70 41 72 67 2d 3e 6d 6f 64 65 3b 0a  e = pArg->mode;.
14460 20 20 20 20 20 20 20 20 69 66 28 20 70 41 72 67          if( pArg
14470 2d 3e 61 75 74 6f 45 78 70 6c 61 69 6e 0a 20 20  ->autoExplain.  
14480 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65         && sqlite
14490 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 70  3_column_count(p
144a0 53 74 6d 74 29 3d 3d 38 0a 20 20 20 20 20 20 20  Stmt)==8.       
144b0 20 20 26 26 20 73 71 6c 69 74 65 33 5f 73 74 72    && sqlite3_str
144c0 6c 69 6b 65 28 22 45 58 50 4c 41 49 4e 25 22 2c  like("EXPLAIN%",
144d0 20 7a 53 74 6d 74 53 71 6c 2c 30 29 3d 3d 30 0a   zStmtSql,0)==0.
144e0 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
144f0 20 20 20 20 20 70 41 72 67 2d 3e 63 4d 6f 64 65       pArg->cMode
14500 20 3d 20 4d 4f 44 45 5f 45 78 70 6c 61 69 6e 3b   = MODE_Explain;
14510 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
14520 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73 68      /* If the sh
14530 65 6c 6c 20 69 73 20 63 75 72 72 65 6e 74 6c 79  ell is currently
14540 20 69 6e 20 22 2e 65 78 70 6c 61 69 6e 22 20 6d   in ".explain" m
14550 6f 64 65 2c 20 67 61 74 68 65 72 20 74 68 65 20  ode, gather the 
14560 65 78 74 72 61 0a 20 20 20 20 20 20 20 20 2a 2a  extra.        **
14570 20 64 61 74 61 20 72 65 71 75 69 72 65 64 20 74   data required t
14580 6f 20 61 64 64 20 69 6e 64 65 6e 74 73 20 74 6f  o add indents to
14590 20 74 68 65 20 6f 75 74 70 75 74 2e 2a 2f 0a 20   the output.*/. 
145a0 20 20 20 20 20 20 20 69 66 28 20 70 41 72 67 2d         if( pArg-
145b0 3e 63 4d 6f 64 65 3d 3d 4d 4f 44 45 5f 45 78 70  >cMode==MODE_Exp
145c0 6c 61 69 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  lain ){.        
145d0 20 20 65 78 70 6c 61 69 6e 5f 64 61 74 61 5f 70    explain_data_p
145e0 72 65 70 61 72 65 28 70 41 72 67 2c 20 70 53 74  repare(pArg, pSt
145f0 6d 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  mt);.        }. 
14600 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 65 78       }..      ex
14610 65 63 5f 70 72 65 70 61 72 65 64 5f 73 74 6d 74  ec_prepared_stmt
14620 28 70 41 72 67 2c 20 70 53 74 6d 74 2c 20 78 43  (pArg, pStmt, xC
14630 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 20 20  allback);.      
14640 65 78 70 6c 61 69 6e 5f 64 61 74 61 5f 64 65 6c  explain_data_del
14650 65 74 65 28 70 41 72 67 29 3b 0a 0a 20 20 20 20  ete(pArg);..    
14660 20 20 2f 2a 20 70 72 69 6e 74 20 75 73 61 67 65    /* print usage
14670 20 73 74 61 74 73 20 69 66 20 73 74 61 74 73 20   stats if stats 
14680 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  on */.      if( 
14690 70 41 72 67 20 26 26 20 70 41 72 67 2d 3e 73 74  pArg && pArg->st
146a0 61 74 73 4f 6e 20 29 7b 0a 20 20 20 20 20 20 20  atsOn ){.       
146b0 20 64 69 73 70 6c 61 79 5f 73 74 61 74 73 28 64   display_stats(d
146c0 62 2c 20 70 41 72 67 2c 20 30 29 3b 0a 20 20 20  b, pArg, 0);.   
146d0 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 70     }..      /* p
146e0 72 69 6e 74 20 6c 6f 6f 70 2d 63 6f 75 6e 74 65  rint loop-counte
146f0 72 73 20 69 66 20 72 65 71 75 69 72 65 64 20 2a  rs if required *
14700 2f 0a 20 20 20 20 20 20 69 66 28 20 70 41 72 67  /.      if( pArg
14710 20 26 26 20 70 41 72 67 2d 3e 73 63 61 6e 73 74   && pArg->scanst
14720 61 74 73 4f 6e 20 29 7b 0a 20 20 20 20 20 20 20  atsOn ){.       
14730 20 64 69 73 70 6c 61 79 5f 73 63 61 6e 73 74 61   display_scansta
14740 74 73 28 64 62 2c 20 70 41 72 67 29 3b 0a 20 20  ts(db, pArg);.  
14750 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
14760 46 69 6e 61 6c 69 7a 65 20 74 68 65 20 73 74 61  Finalize the sta
14770 74 65 6d 65 6e 74 20 6a 75 73 74 20 65 78 65 63  tement just exec
14780 75 74 65 64 2e 20 49 66 20 74 68 69 73 20 66 61  uted. If this fa
14790 69 6c 73 2c 20 73 61 76 65 20 61 0a 20 20 20 20  ils, save a.    
147a0 20 20 2a 2a 20 63 6f 70 79 20 6f 66 20 74 68 65    ** copy of the
147b0 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 2e 20   error message. 
147c0 4f 74 68 65 72 77 69 73 65 2c 20 73 65 74 20 7a  Otherwise, set z
147d0 53 71 6c 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  Sql to point to 
147e0 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 6e 65 78  the.      ** nex
147f0 74 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 65  t statement to e
14800 78 65 63 75 74 65 2e 20 2a 2f 0a 20 20 20 20 20  xecute. */.     
14810 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33 5f 66   rc2 = sqlite3_f
14820 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a  inalize(pStmt);.
14830 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
14840 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 20 72 63 20  LITE_NOMEM ) rc 
14850 3d 20 72 63 32 3b 0a 20 20 20 20 20 20 69 66 28  = rc2;.      if(
14860 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
14870 7b 0a 20 20 20 20 20 20 20 20 7a 53 71 6c 20 3d  {.        zSql =
14880 20 7a 4c 65 66 74 6f 76 65 72 3b 0a 20 20 20 20   zLeftover;.    
14890 20 20 20 20 77 68 69 6c 65 28 20 49 73 53 70 61      while( IsSpa
148a0 63 65 28 7a 53 71 6c 5b 30 5d 29 20 29 20 7a 53  ce(zSql[0]) ) zS
148b0 71 6c 2b 2b 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ql++;.      }els
148c0 65 20 69 66 28 20 70 7a 45 72 72 4d 73 67 20 29  e if( pzErrMsg )
148d0 7b 0a 20 20 20 20 20 20 20 20 2a 70 7a 45 72 72  {.        *pzErr
148e0 4d 73 67 20 3d 20 73 61 76 65 5f 65 72 72 5f 6d  Msg = save_err_m
148f0 73 67 28 64 62 29 3b 0a 20 20 20 20 20 20 7d 0a  sg(db);.      }.
14900 0a 20 20 20 20 20 20 2f 2a 20 63 6c 65 61 72 20  .      /* clear 
14910 73 61 76 65 64 20 73 74 6d 74 20 68 61 6e 64 6c  saved stmt handl
14920 65 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70  e */.      if( p
14930 41 72 67 20 29 7b 0a 20 20 20 20 20 20 20 20 70  Arg ){.        p
14940 41 72 67 2d 3e 70 53 74 6d 74 20 3d 20 4e 55 4c  Arg->pStmt = NUL
14950 4c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  L;.      }.    }
14960 0a 20 20 7d 20 2f 2a 20 65 6e 64 20 77 68 69 6c  .  } /* end whil
14970 65 20 2a 2f 0a 0a 20 20 72 65 74 75 72 6e 20 72  e */..  return r
14980 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65  c;.}../*.** Rele
14990 61 73 65 20 6d 65 6d 6f 72 79 20 70 72 65 76 69  ase memory previ
149a0 6f 75 73 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20  ously allocated 
149b0 62 79 20 74 61 62 6c 65 43 6f 6c 75 6d 6e 4c 69  by tableColumnLi
149c0 73 74 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  st()..*/.static 
149d0 76 6f 69 64 20 66 72 65 65 43 6f 6c 75 6d 6e 4c  void freeColumnL
149e0 69 73 74 28 63 68 61 72 20 2a 2a 61 7a 43 6f 6c  ist(char **azCol
149f0 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f  ){.  int i;.  fo
14a00 72 28 69 3d 31 3b 20 61 7a 43 6f 6c 5b 69 5d 3b  r(i=1; azCol[i];
14a10 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74   i++){.    sqlit
14a20 65 33 5f 66 72 65 65 28 61 7a 43 6f 6c 5b 69 5d  e3_free(azCol[i]
14a30 29 3b 0a 20 20 7d 0a 20 20 2f 2a 20 61 7a 43 6f  );.  }.  /* azCo
14a40 6c 5b 30 5d 20 69 73 20 61 20 73 74 61 74 69 63  l[0] is a static
14a50 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20 73 71 6c   string */.  sql
14a60 69 74 65 33 5f 66 72 65 65 28 61 7a 43 6f 6c 29  ite3_free(azCol)
14a70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
14a80 6e 20 61 20 6c 69 73 74 20 6f 66 20 70 6f 69 6e  n a list of poin
14a90 74 65 72 73 20 74 6f 20 73 74 72 69 6e 67 73 20  ters to strings 
14aa0 77 68 69 63 68 20 61 72 65 20 74 68 65 20 6e 61  which are the na
14ab0 6d 65 73 20 6f 66 20 61 6c 6c 0a 2a 2a 20 63 6f  mes of all.** co
14ac0 6c 75 6d 6e 73 20 69 6e 20 74 61 62 6c 65 20 7a  lumns in table z
14ad0 54 61 62 2e 20 20 20 54 68 65 20 6d 65 6d 6f 72  Tab.   The memor
14ae0 79 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6e 61  y to hold the na
14af0 6d 65 73 20 69 73 20 64 79 6e 61 6d 69 63 61 6c  mes is dynamical
14b00 6c 79 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20  ly.** allocated 
14b10 61 6e 64 20 6d 75 73 74 20 62 65 20 72 65 6c 65  and must be rele
14b20 61 73 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c  ased by the call
14b30 65 72 20 75 73 69 6e 67 20 61 20 73 75 62 73 65  er using a subse
14b40 71 75 65 6e 74 20 63 61 6c 6c 0a 2a 2a 20 74 6f  quent call.** to
14b50 20 66 72 65 65 43 6f 6c 75 6d 6e 4c 69 73 74 28   freeColumnList(
14b60 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 7a 43  )..**.** The azC
14b70 6f 6c 5b 30 5d 20 65 6e 74 72 79 20 69 73 20 75  ol[0] entry is u
14b80 73 75 61 6c 6c 79 20 4e 55 4c 4c 2e 20 20 48 6f  sually NULL.  Ho
14b90 77 65 76 65 72 2c 20 69 66 20 7a 54 61 62 20 63  wever, if zTab c
14ba0 6f 6e 74 61 69 6e 73 20 61 20 72 6f 77 69 64 0a  ontains a rowid.
14bb0 2a 2a 20 76 61 6c 75 65 20 74 68 61 74 20 6e 65  ** value that ne
14bc0 65 64 73 20 74 6f 20 62 65 20 70 72 65 73 65 72  eds to be preser
14bd0 76 65 64 2c 20 74 68 65 6e 20 61 7a 43 6f 6c 5b  ved, then azCol[
14be0 30 5d 20 69 73 20 66 69 6c 6c 65 64 20 69 6e 20  0] is filled in 
14bf0 77 69 74 68 20 74 68 65 0a 2a 2a 20 6e 61 6d 65  with the.** name
14c00 20 6f 66 20 74 68 65 20 72 6f 77 69 64 20 63 6f   of the rowid co
14c10 6c 75 6d 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  lumn..**.** The 
14c20 66 69 72 73 74 20 72 65 67 75 6c 61 72 20 63 6f  first regular co
14c30 6c 75 6d 6e 20 69 6e 20 74 68 65 20 74 61 62 6c  lumn in the tabl
14c40 65 20 69 73 20 61 7a 43 6f 6c 5b 31 5d 2e 20 20  e is azCol[1].  
14c50 54 68 65 20 6c 69 73 74 20 69 73 20 74 65 72 6d  The list is term
14c60 69 6e 61 74 65 64 0a 2a 2a 20 62 79 20 61 6e 20  inated.** by an 
14c70 65 6e 74 72 79 20 77 69 74 68 20 61 7a 43 6f 6c  entry with azCol
14c80 5b 69 5d 3d 3d 30 2e 0a 2a 2f 0a 73 74 61 74 69  [i]==0..*/.stati
14c90 63 20 63 68 61 72 20 2a 2a 74 61 62 6c 65 43 6f  c char **tableCo
14ca0 6c 75 6d 6e 4c 69 73 74 28 53 68 65 6c 6c 53 74  lumnList(ShellSt
14cb0 61 74 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68  ate *p, const ch
14cc0 61 72 20 2a 7a 54 61 62 29 7b 0a 20 20 63 68 61  ar *zTab){.  cha
14cd0 72 20 2a 2a 61 7a 43 6f 6c 20 3d 20 30 3b 0a 20  r **azCol = 0;. 
14ce0 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
14cf0 53 74 6d 74 3b 0a 20 20 63 68 61 72 20 2a 7a 53  Stmt;.  char *zS
14d00 71 6c 3b 0a 20 20 69 6e 74 20 6e 43 6f 6c 20 3d  ql;.  int nCol =
14d10 20 30 3b 0a 20 20 69 6e 74 20 6e 41 6c 6c 6f 63   0;.  int nAlloc
14d20 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 50 4b 20   = 0;.  int nPK 
14d30 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4e 75  = 0;       /* Nu
14d40 6d 62 65 72 20 6f 66 20 50 52 49 4d 41 52 59 20  mber of PRIMARY 
14d50 4b 45 59 20 63 6f 6c 75 6d 6e 73 20 73 65 65 6e  KEY columns seen
14d60 20 2a 2f 0a 20 20 69 6e 74 20 69 73 49 50 4b 20   */.  int isIPK 
14d70 3d 20 30 3b 20 20 20 20 20 2f 2a 20 54 72 75 65  = 0;     /* True
14d80 20 69 66 20 6f 6e 65 20 50 52 49 4d 41 52 59 20   if one PRIMARY 
14d90 4b 45 59 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 79  KEY column of ty
14da0 70 65 20 49 4e 54 45 47 45 52 20 2a 2f 0a 20 20  pe INTEGER */.  
14db0 69 6e 74 20 70 72 65 73 65 72 76 65 52 6f 77 69  int preserveRowi
14dc0 64 20 3d 20 53 68 65 6c 6c 48 61 73 46 6c 61 67  d = ShellHasFlag
14dd0 28 70 2c 20 53 48 46 4c 47 5f 50 72 65 73 65 72  (p, SHFLG_Preser
14de0 76 65 52 6f 77 69 64 29 3b 0a 20 20 69 6e 74 20  veRowid);.  int 
14df0 72 63 3b 0a 0a 20 20 7a 53 71 6c 20 3d 20 73 71  rc;..  zSql = sq
14e00 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 50  lite3_mprintf("P
14e10 52 41 47 4d 41 20 74 61 62 6c 65 5f 69 6e 66 6f  RAGMA table_info
14e20 3d 25 51 22 2c 20 7a 54 61 62 29 3b 0a 20 20 72  =%Q", zTab);.  r
14e30 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70  c = sqlite3_prep
14e40 61 72 65 5f 76 32 28 70 2d 3e 64 62 2c 20 7a 53  are_v2(p->db, zS
14e50 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20  ql, -1, &pStmt, 
14e60 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  0);.  sqlite3_fr
14e70 65 65 28 7a 53 71 6c 29 3b 0a 20 20 69 66 28 20  ee(zSql);.  if( 
14e80 72 63 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  rc ) return 0;. 
14e90 20 77 68 69 6c 65 28 20 73 71 6c 69 74 65 33 5f   while( sqlite3_
14ea0 73 74 65 70 28 70 53 74 6d 74 29 3d 3d 53 51 4c  step(pStmt)==SQL
14eb0 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 69  ITE_ROW ){.    i
14ec0 66 28 20 6e 43 6f 6c 3e 3d 6e 41 6c 6c 6f 63 2d  f( nCol>=nAlloc-
14ed0 32 20 29 7b 0a 20 20 20 20 20 20 6e 41 6c 6c 6f  2 ){.      nAllo
14ee0 63 20 3d 20 6e 41 6c 6c 6f 63 2a 32 20 2b 20 6e  c = nAlloc*2 + n
14ef0 43 6f 6c 20 2b 20 31 30 3b 0a 20 20 20 20 20 20  Col + 10;.      
14f00 61 7a 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33 5f  azCol = sqlite3_
14f10 72 65 61 6c 6c 6f 63 28 61 7a 43 6f 6c 2c 20 6e  realloc(azCol, n
14f20 41 6c 6c 6f 63 2a 73 69 7a 65 6f 66 28 61 7a 43  Alloc*sizeof(azC
14f30 6f 6c 5b 30 5d 29 29 3b 0a 20 20 20 20 20 20 69  ol[0]));.      i
14f40 66 28 20 61 7a 43 6f 6c 3d 3d 30 20 29 7b 0a 20  f( azCol==0 ){. 
14f50 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74         raw_print
14f60 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72  f(stderr, "Error
14f70 3a 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 5c  : out of memory\
14f80 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 65 78 69  n");.        exi
14f90 74 28 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  t(1);.      }.  
14fa0 20 20 7d 0a 20 20 20 20 61 7a 43 6f 6c 5b 2b 2b    }.    azCol[++
14fb0 6e 43 6f 6c 5d 20 3d 20 73 71 6c 69 74 65 33 5f  nCol] = sqlite3_
14fc0 6d 70 72 69 6e 74 66 28 22 25 73 22 2c 20 73 71  mprintf("%s", sq
14fd0 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
14fe0 74 28 70 53 74 6d 74 2c 20 31 29 29 3b 0a 20 20  t(pStmt, 1));.  
14ff0 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 63 6f    if( sqlite3_co
15000 6c 75 6d 6e 5f 69 6e 74 28 70 53 74 6d 74 2c 20  lumn_int(pStmt, 
15010 35 29 20 29 7b 0a 20 20 20 20 20 20 6e 50 4b 2b  5) ){.      nPK+
15020 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 50 4b  +;.      if( nPK
15030 3d 3d 31 0a 20 20 20 20 20 20 20 26 26 20 73 71  ==1.       && sq
15040 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28 28 63  lite3_stricmp((c
15050 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74  onst char*)sqlit
15060 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70  e3_column_text(p
15070 53 74 6d 74 2c 32 29 2c 0a 20 20 20 20 20 20 20  Stmt,2),.       
15080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15090 20 20 20 22 49 4e 54 45 47 45 52 22 29 3d 3d 30     "INTEGER")==0
150a0 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20  .      ){.      
150b0 20 20 69 73 49 50 4b 20 3d 20 31 3b 0a 20 20 20    isIPK = 1;.   
150c0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
150d0 20 20 69 73 49 50 4b 20 3d 20 30 3b 0a 20 20 20    isIPK = 0;.   
150e0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
150f0 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
15100 65 28 70 53 74 6d 74 29 3b 0a 20 20 69 66 28 20  e(pStmt);.  if( 
15110 61 7a 43 6f 6c 3d 3d 30 20 29 20 72 65 74 75 72  azCol==0 ) retur
15120 6e 20 30 3b 0a 20 20 61 7a 43 6f 6c 5b 30 5d 20  n 0;.  azCol[0] 
15130 3d 20 30 3b 0a 20 20 61 7a 43 6f 6c 5b 6e 43 6f  = 0;.  azCol[nCo
15140 6c 2b 31 5d 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20  l+1] = 0;..  /* 
15150 54 68 65 20 64 65 63 69 73 69 6f 6e 20 6f 66 20  The decision of 
15160 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61  whether or not a
15170 20 72 6f 77 69 64 20 72 65 61 6c 6c 79 20 6e 65   rowid really ne
15180 65 64 73 20 74 6f 20 62 65 20 70 72 65 73 65 72  eds to be preser
15190 76 65 64 0a 20 20 2a 2a 20 69 73 20 74 72 69 63  ved.  ** is tric
151a0 6b 79 2e 20 20 57 65 20 6e 65 76 65 72 20 6e 65  ky.  We never ne
151b0 65 64 20 74 6f 20 70 72 65 73 65 72 76 65 20 61  ed to preserve a
151c0 20 72 6f 77 69 64 20 66 6f 72 20 61 20 57 49 54   rowid for a WIT
151d0 48 4f 55 54 20 52 4f 57 49 44 20 74 61 62 6c 65  HOUT ROWID table
151e0 0a 20 20 2a 2a 20 6f 72 20 61 20 74 61 62 6c 65  .  ** or a table
151f0 20 77 69 74 68 20 61 6e 20 49 4e 54 45 47 45 52   with an INTEGER
15200 20 50 52 49 4d 41 52 59 20 4b 45 59 2e 20 20 57   PRIMARY KEY.  W
15210 65 20 61 72 65 20 75 6e 61 62 6c 65 20 74 6f 20  e are unable to 
15220 70 72 65 73 65 72 76 65 0a 20 20 2a 2a 20 72 6f  preserve.  ** ro
15230 77 69 64 73 20 6f 6e 20 74 61 62 6c 65 73 20 77  wids on tables w
15240 68 65 72 65 20 74 68 65 20 72 6f 77 69 64 20 69  here the rowid i
15250 73 20 69 6e 61 63 63 65 73 73 69 62 6c 65 20 62  s inaccessible b
15260 65 63 61 75 73 65 20 74 68 65 72 65 20 61 72 65  ecause there are
15270 20 6f 74 68 65 72 0a 20 20 2a 2a 20 63 6f 6c 75   other.  ** colu
15280 6d 6e 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65  mns in the table
15290 20 6e 61 6d 65 64 20 22 72 6f 77 69 64 22 2c 20   named "rowid", 
152a0 22 5f 72 6f 77 69 64 5f 22 2c 20 61 6e 64 20 22  "_rowid_", and "
152b0 6f 69 64 22 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  oid"..  */.  if(
152c0 20 70 72 65 73 65 72 76 65 52 6f 77 69 64 20 26   preserveRowid &
152d0 26 20 69 73 49 50 4b 20 29 7b 0a 20 20 20 20 2f  & isIPK ){.    /
152e0 2a 20 49 66 20 61 20 73 69 6e 67 6c 65 20 50 52  * If a single PR
152f0 49 4d 41 52 59 20 4b 45 59 20 63 6f 6c 75 6d 6e  IMARY KEY column
15300 20 77 69 74 68 20 74 79 70 65 20 49 4e 54 45 47   with type INTEG
15310 45 52 20 77 61 73 20 73 65 65 6e 2c 20 74 68 65  ER was seen, the
15320 6e 20 69 74 0a 20 20 20 20 2a 2a 20 6d 69 67 68  n it.    ** migh
15330 74 20 62 65 20 61 6e 20 61 6c 69 73 65 20 66 6f  t be an alise fo
15340 72 20 74 68 65 20 52 4f 57 49 44 2e 20 20 42 75  r the ROWID.  Bu
15350 74 20 69 74 20 6d 69 67 68 74 20 61 6c 73 6f 20  t it might also 
15360 62 65 20 61 20 57 49 54 48 4f 55 54 20 52 4f 57  be a WITHOUT ROW
15370 49 44 0a 20 20 20 20 2a 2a 20 74 61 62 6c 65 20  ID.    ** table 
15380 6f 72 20 61 20 49 4e 54 45 47 45 52 20 50 52 49  or a INTEGER PRI
15390 4d 41 52 59 20 4b 45 59 20 44 45 53 43 20 63 6f  MARY KEY DESC co
153a0 6c 75 6d 6e 2c 20 6e 65 69 74 68 65 72 20 6f 66  lumn, neither of
153b0 20 77 68 69 63 68 20 61 72 65 0a 20 20 20 20 2a   which are.    *
153c0 2a 20 52 4f 57 49 44 20 61 6c 69 61 73 65 73 2e  * ROWID aliases.
153d0 20 20 54 6f 20 64 69 73 74 69 6e 67 75 69 73 68    To distinguish
153e0 20 74 68 65 73 65 20 63 61 73 65 73 2c 20 63 68   these cases, ch
153f0 65 63 6b 20 74 6f 20 73 65 65 20 69 66 0a 20 20  eck to see if.  
15400 20 20 2a 2a 20 74 68 65 72 65 20 69 73 20 61 20    ** there is a 
15410 22 70 6b 22 20 65 6e 74 72 79 20 69 6e 20 22 50  "pk" entry in "P
15420 52 41 47 4d 41 20 69 6e 64 65 78 5f 6c 69 73 74  RAGMA index_list
15430 22 2e 20 20 54 68 65 72 65 20 77 69 6c 6c 20 62  ".  There will b
15440 65 0a 20 20 20 20 2a 2a 20 6e 6f 20 22 70 6b 22  e.    ** no "pk"
15450 20 69 6e 64 65 78 20 69 66 20 74 68 65 20 50 52   index if the PR
15460 49 4d 41 52 59 20 4b 45 59 20 72 65 61 6c 6c 79  IMARY KEY really
15470 20 69 73 20 61 6e 20 61 6c 69 61 73 20 66 6f 72   is an alias for
15480 20 74 68 65 20 52 4f 57 49 44 2e 0a 20 20 20 20   the ROWID..    
15490 2a 2f 0a 20 20 20 20 7a 53 71 6c 20 3d 20 73 71  */.    zSql = sq
154a0 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 53  lite3_mprintf("S
154b0 45 4c 45 43 54 20 31 20 46 52 4f 4d 20 70 72 61  ELECT 1 FROM pra
154c0 67 6d 61 5f 69 6e 64 65 78 5f 6c 69 73 74 28 25  gma_index_list(%
154d0 51 29 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  Q)".            
154e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
154f0 20 57 48 45 52 45 20 6f 72 69 67 69 6e 3d 27 70   WHERE origin='p
15500 6b 27 22 2c 20 7a 54 61 62 29 3b 0a 20 20 20 20  k'", zTab);.    
15510 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65  rc = sqlite3_pre
15520 70 61 72 65 5f 76 32 28 70 2d 3e 64 62 2c 20 7a  pare_v2(p->db, z
15530 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c  Sql, -1, &pStmt,
15540 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
15550 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20  _free(zSql);.   
15560 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
15570 20 66 72 65 65 43 6f 6c 75 6d 6e 4c 69 73 74 28   freeColumnList(
15580 61 7a 43 6f 6c 29 3b 0a 20 20 20 20 20 20 72 65  azCol);.      re
15590 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20  turn 0;.    }.  
155a0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 73    rc = sqlite3_s
155b0 74 65 70 28 70 53 74 6d 74 29 3b 0a 20 20 20 20  tep(pStmt);.    
155c0 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
155d0 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 70 72 65  (pStmt);.    pre
155e0 73 65 72 76 65 52 6f 77 69 64 20 3d 20 72 63 3d  serveRowid = rc=
155f0 3d 53 51 4c 49 54 45 5f 52 4f 57 3b 0a 20 20 7d  =SQLITE_ROW;.  }
15600 0a 20 20 69 66 28 20 70 72 65 73 65 72 76 65 52  .  if( preserveR
15610 6f 77 69 64 20 29 7b 0a 20 20 20 20 2f 2a 20 4f  owid ){.    /* O
15620 6e 6c 79 20 70 72 65 73 65 72 76 65 20 74 68 65  nly preserve the
15630 20 72 6f 77 69 64 20 69 66 20 77 65 20 63 61 6e   rowid if we can
15640 20 66 69 6e 64 20 61 20 6e 61 6d 65 20 74 6f 20   find a name to 
15650 75 73 65 20 66 6f 72 20 74 68 65 0a 20 20 20 20  use for the.    
15660 2a 2a 20 72 6f 77 69 64 20 2a 2f 0a 20 20 20 20  ** rowid */.    
15670 73 74 61 74 69 63 20 63 68 61 72 20 2a 61 7a 52  static char *azR
15680 6f 77 69 64 5b 5d 20 3d 20 7b 20 22 72 6f 77 69  owid[] = { "rowi
15690 64 22 2c 20 22 5f 72 6f 77 69 64 5f 22 2c 20 22  d", "_rowid_", "
156a0 6f 69 64 22 20 7d 3b 0a 20 20 20 20 69 6e 74 20  oid" };.    int 
156b0 69 2c 20 6a 3b 0a 20 20 20 20 66 6f 72 28 6a 3d  i, j;.    for(j=
156c0 30 3b 20 6a 3c 33 3b 20 6a 2b 2b 29 7b 0a 20 20  0; j<3; j++){.  
156d0 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 3d      for(i=1; i<=
156e0 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
156f0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f      if( sqlite3_
15700 73 74 72 69 63 6d 70 28 61 7a 52 6f 77 69 64 5b  stricmp(azRowid[
15710 6a 5d 2c 61 7a 43 6f 6c 5b 69 5d 29 3d 3d 30 20  j],azCol[i])==0 
15720 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d  ) break;.      }
15730 0a 20 20 20 20 20 20 69 66 28 20 69 3e 6e 43 6f  .      if( i>nCo
15740 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  l ){.        /* 
15750 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 77  At this point, w
15760 65 20 6b 6e 6f 77 20 74 68 61 74 20 61 7a 52 6f  e know that azRo
15770 77 69 64 5b 6a 5d 20 69 73 20 6e 6f 74 20 74 68  wid[j] is not th
15780 65 20 6e 61 6d 65 20 6f 66 20 61 6e 79 0a 20 20  e name of any.  
15790 20 20 20 20 20 20 2a 2a 20 6f 72 64 69 6e 61 72        ** ordinar
157a0 79 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20  y column in the 
157b0 74 61 62 6c 65 2e 20 20 56 65 72 69 66 79 20 74  table.  Verify t
157c0 68 61 74 20 61 7a 52 6f 77 69 64 5b 6a 5d 20 69  hat azRowid[j] i
157d0 73 20 61 20 76 61 6c 69 64 0a 20 20 20 20 20 20  s a valid.      
157e0 20 20 2a 2a 20 6e 61 6d 65 20 66 6f 72 20 74 68    ** name for th
157f0 65 20 72 6f 77 69 64 20 62 65 66 6f 72 65 20 61  e rowid before a
15800 64 64 69 6e 67 20 69 74 20 74 6f 20 61 7a 43 6f  dding it to azCo
15810 6c 5b 30 5d 2e 20 20 57 49 54 48 4f 55 54 20 52  l[0].  WITHOUT R
15820 4f 57 49 44 0a 20 20 20 20 20 20 20 20 2a 2a 20  OWID.        ** 
15830 74 61 62 6c 65 73 20 77 69 6c 6c 20 66 61 69 6c  tables will fail
15840 20 74 68 69 73 20 6c 61 73 74 20 63 68 65 63 6b   this last check
15850 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d   */.        rc =
15860 20 73 71 6c 69 74 65 33 5f 74 61 62 6c 65 5f 63   sqlite3_table_c
15870 6f 6c 75 6d 6e 5f 6d 65 74 61 64 61 74 61 28 70  olumn_metadata(p
15880 2d 3e 64 62 2c 30 2c 7a 54 61 62 2c 61 7a 52 6f  ->db,0,zTab,azRo
15890 77 69 64 5b 6a 5d 2c 30 2c 30 2c 30 2c 30 2c 30  wid[j],0,0,0,0,0
158a0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
158b0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 61  c==SQLITE_OK ) a
158c0 7a 43 6f 6c 5b 30 5d 20 3d 20 61 7a 52 6f 77 69  zCol[0] = azRowi
158d0 64 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 62 72  d[j];.        br
158e0 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
158f0 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
15900 61 7a 43 6f 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  azCol;.}../*.** 
15910 54 6f 67 67 6c 65 20 74 68 65 20 72 65 76 65 72  Toggle the rever
15920 73 65 5f 75 6e 6f 72 64 65 72 65 64 5f 73 65 6c  se_unordered_sel
15930 65 63 74 73 20 73 65 74 74 69 6e 67 2e 0a 2a 2f  ects setting..*/
15940 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74 6f 67  .static void tog
15950 67 6c 65 53 65 6c 65 63 74 4f 72 64 65 72 28 73  gleSelectOrder(s
15960 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 73  qlite3 *db){.  s
15970 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
15980 6d 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 53  mt = 0;.  int iS
15990 65 74 74 69 6e 67 20 3d 20 30 3b 0a 20 20 63 68  etting = 0;.  ch
159a0 61 72 20 7a 53 74 6d 74 5b 31 30 30 5d 3b 0a 20  ar zStmt[100];. 
159b0 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
159c0 5f 76 32 28 64 62 2c 20 22 50 52 41 47 4d 41 20  _v2(db, "PRAGMA 
159d0 72 65 76 65 72 73 65 5f 75 6e 6f 72 64 65 72 65  reverse_unordere
159e0 64 5f 73 65 6c 65 63 74 73 22 2c 20 2d 31 2c 20  d_selects", -1, 
159f0 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 69 66  &pStmt, 0);.  if
15a00 28 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70  ( sqlite3_step(p
15a10 53 74 6d 74 29 3d 3d 53 51 4c 49 54 45 5f 52 4f  Stmt)==SQLITE_RO
15a20 57 20 29 7b 0a 20 20 20 20 69 53 65 74 74 69 6e  W ){.    iSettin
15a30 67 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  g = sqlite3_colu
15a40 6d 6e 5f 69 6e 74 28 70 53 74 6d 74 2c 20 30 29  mn_int(pStmt, 0)
15a50 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
15a60 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b  finalize(pStmt);
15a70 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69  .  sqlite3_snpri
15a80 6e 74 66 28 73 69 7a 65 6f 66 28 7a 53 74 6d 74  ntf(sizeof(zStmt
15a90 29 2c 20 7a 53 74 6d 74 2c 0a 20 20 20 20 20 20  ), zStmt,.      
15aa0 20 22 50 52 41 47 4d 41 20 72 65 76 65 72 73 65   "PRAGMA reverse
15ab0 5f 75 6e 6f 72 64 65 72 65 64 5f 73 65 6c 65 63  _unordered_selec
15ac0 74 73 28 25 64 29 22 2c 20 21 69 53 65 74 74 69  ts(%d)", !iSetti
15ad0 6e 67 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 65  ng);.  sqlite3_e
15ae0 78 65 63 28 64 62 2c 20 7a 53 74 6d 74 2c 20 30  xec(db, zStmt, 0
15af0 2c 20 30 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  , 0, 0);.}../*.*
15b00 2a 20 54 68 69 73 20 69 73 20 61 20 64 69 66 66  * This is a diff
15b10 65 72 65 6e 74 20 63 61 6c 6c 62 61 63 6b 20 72  erent callback r
15b20 6f 75 74 69 6e 65 20 75 73 65 64 20 66 6f 72 20  outine used for 
15b30 64 75 6d 70 69 6e 67 20 74 68 65 20 64 61 74 61  dumping the data
15b40 62 61 73 65 2e 0a 2a 2a 20 45 61 63 68 20 72 6f  base..** Each ro
15b50 77 20 72 65 63 65 69 76 65 64 20 62 79 20 74 68  w received by th
15b60 69 73 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6e 73  is callback cons
15b70 69 73 74 73 20 6f 66 20 61 20 74 61 62 6c 65 20  ists of a table 
15b80 6e 61 6d 65 2c 0a 2a 2a 20 74 68 65 20 74 61 62  name,.** the tab
15b90 6c 65 20 74 79 70 65 20 28 22 69 6e 64 65 78 22  le type ("index"
15ba0 20 6f 72 20 22 74 61 62 6c 65 22 29 20 61 6e 64   or "table") and
15bb0 20 53 51 4c 20 74 6f 20 63 72 65 61 74 65 20 74   SQL to create t
15bc0 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 20 54 68 69  he table..** Thi
15bd0 73 20 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64  s routine should
15be0 20 70 72 69 6e 74 20 74 65 78 74 20 73 75 66 66   print text suff
15bf0 69 63 69 65 6e 74 20 74 6f 20 72 65 63 72 65 61  icient to recrea
15c00 74 65 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2f  te the table..*/
15c10 0a 73 74 61 74 69 63 20 69 6e 74 20 64 75 6d 70  .static int dump
15c20 5f 63 61 6c 6c 62 61 63 6b 28 76 6f 69 64 20 2a  _callback(void *
15c30 70 41 72 67 2c 20 69 6e 74 20 6e 41 72 67 2c 20  pArg, int nArg, 
15c40 63 68 61 72 20 2a 2a 61 7a 41 72 67 2c 20 63 68  char **azArg, ch
15c50 61 72 20 2a 2a 61 7a 4e 6f 74 55 73 65 64 29 7b  ar **azNotUsed){
15c60 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 6f 6e  .  int rc;.  con
15c70 73 74 20 63 68 61 72 20 2a 7a 54 61 62 6c 65 3b  st char *zTable;
15c80 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
15c90 54 79 70 65 3b 0a 20 20 63 6f 6e 73 74 20 63 68  Type;.  const ch
15ca0 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 53 68 65 6c  ar *zSql;.  Shel
15cb0 6c 53 74 61 74 65 20 2a 70 20 3d 20 28 53 68 65  lState *p = (She
15cc0 6c 6c 53 74 61 74 65 20 2a 29 70 41 72 67 3b 0a  llState *)pArg;.
15cd0 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
15ce0 54 45 52 28 61 7a 4e 6f 74 55 73 65 64 29 3b 0a  TER(azNotUsed);.
15cf0 20 20 69 66 28 20 6e 41 72 67 21 3d 33 20 7c 7c    if( nArg!=3 ||
15d00 20 61 7a 41 72 67 3d 3d 30 20 29 20 72 65 74 75   azArg==0 ) retu
15d10 72 6e 20 30 3b 0a 20 20 7a 54 61 62 6c 65 20 3d  rn 0;.  zTable =
15d20 20 61 7a 41 72 67 5b 30 5d 3b 0a 20 20 7a 54 79   azArg[0];.  zTy
15d30 70 65 20 3d 20 61 7a 41 72 67 5b 31 5d 3b 0a 20  pe = azArg[1];. 
15d40 20 7a 53 71 6c 20 3d 20 61 7a 41 72 67 5b 32 5d   zSql = azArg[2]
15d50 3b 0a 0a 20 20 69 66 28 20 73 74 72 63 6d 70 28  ;..  if( strcmp(
15d60 7a 54 61 62 6c 65 2c 20 22 73 71 6c 69 74 65 5f  zTable, "sqlite_
15d70 73 65 71 75 65 6e 63 65 22 29 3d 3d 30 20 29 7b  sequence")==0 ){
15d80 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28  .    raw_printf(
15d90 70 2d 3e 6f 75 74 2c 20 22 44 45 4c 45 54 45 20  p->out, "DELETE 
15da0 46 52 4f 4d 20 73 71 6c 69 74 65 5f 73 65 71 75  FROM sqlite_sequ
15db0 65 6e 63 65 3b 5c 6e 22 29 3b 0a 20 20 7d 65 6c  ence;\n");.  }el
15dc0 73 65 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73  se if( sqlite3_s
15dd0 74 72 67 6c 6f 62 28 22 73 71 6c 69 74 65 5f 73  trglob("sqlite_s
15de0 74 61 74 3f 22 2c 20 7a 54 61 62 6c 65 29 3d 3d  tat?", zTable)==
15df0 30 20 29 7b 0a 20 20 20 20 72 61 77 5f 70 72 69  0 ){.    raw_pri
15e00 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 41 4e 41  ntf(p->out, "ANA
15e10 4c 59 5a 45 20 73 71 6c 69 74 65 5f 6d 61 73 74  LYZE sqlite_mast
15e20 65 72 3b 5c 6e 22 29 3b 0a 20 20 7d 65 6c 73 65  er;\n");.  }else
15e30 20 69 66 28 20 73 74 72 6e 63 6d 70 28 7a 54 61   if( strncmp(zTa
15e40 62 6c 65 2c 20 22 73 71 6c 69 74 65 5f 22 2c 20  ble, "sqlite_", 
15e50 37 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  7)==0 ){.    ret
15e60 75 72 6e 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69  urn 0;.  }else i
15e70 66 28 20 73 74 72 6e 63 6d 70 28 7a 53 71 6c 2c  f( strncmp(zSql,
15e80 20 22 43 52 45 41 54 45 20 56 49 52 54 55 41 4c   "CREATE VIRTUAL
15e90 20 54 41 42 4c 45 22 2c 20 32 30 29 3d 3d 30 20   TABLE", 20)==0 
15ea0 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 49 6e  ){.    char *zIn
15eb0 73 3b 0a 20 20 20 20 69 66 28 20 21 70 2d 3e 77  s;.    if( !p->w
15ec0 72 69 74 61 62 6c 65 53 63 68 65 6d 61 20 29 7b  ritableSchema ){
15ed0 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74  .      raw_print
15ee0 66 28 70 2d 3e 6f 75 74 2c 20 22 50 52 41 47 4d  f(p->out, "PRAGM
15ef0 41 20 77 72 69 74 61 62 6c 65 5f 73 63 68 65 6d  A writable_schem
15f00 61 3d 4f 4e 3b 5c 6e 22 29 3b 0a 20 20 20 20 20  a=ON;\n");.     
15f10 20 70 2d 3e 77 72 69 74 61 62 6c 65 53 63 68 65   p->writableSche
15f20 6d 61 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  ma = 1;.    }.  
15f30 20 20 7a 49 6e 73 20 3d 20 73 71 6c 69 74 65 33    zIns = sqlite3
15f40 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20  _mprintf(.      
15f50 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 73 71   "INSERT INTO sq
15f60 6c 69 74 65 5f 6d 61 73 74 65 72 28 74 79 70 65  lite_master(type
15f70 2c 6e 61 6d 65 2c 74 62 6c 5f 6e 61 6d 65 2c 72  ,name,tbl_name,r
15f80 6f 6f 74 70 61 67 65 2c 73 71 6c 29 22 0a 20 20  ootpage,sql)".  
15f90 20 20 20 20 20 22 56 41 4c 55 45 53 28 27 74 61       "VALUES('ta
15fa0 62 6c 65 27 2c 27 25 71 27 2c 27 25 71 27 2c 30  ble','%q','%q',0
15fb0 2c 27 25 71 27 29 3b 22 2c 0a 20 20 20 20 20 20  ,'%q');",.      
15fc0 20 7a 54 61 62 6c 65 2c 20 7a 54 61 62 6c 65 2c   zTable, zTable,
15fd0 20 7a 53 71 6c 29 3b 0a 20 20 20 20 75 74 66 38   zSql);.    utf8
15fe0 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
15ff0 22 25 73 5c 6e 22 2c 20 7a 49 6e 73 29 3b 0a 20  "%s\n", zIns);. 
16000 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
16010 7a 49 6e 73 29 3b 0a 20 20 20 20 72 65 74 75 72  zIns);.    retur
16020 6e 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  n 0;.  }else{.  
16030 20 20 70 72 69 6e 74 53 63 68 65 6d 61 4c 69 6e    printSchemaLin
16040 65 28 70 2d 3e 6f 75 74 2c 20 7a 53 71 6c 2c 20  e(p->out, zSql, 
16050 22 3b 5c 6e 22 29 3b 0a 20 20 7d 0a 0a 20 20 69  ";\n");.  }..  i
16060 66 28 20 73 74 72 63 6d 70 28 7a 54 79 70 65 2c  f( strcmp(zType,
16070 20 22 74 61 62 6c 65 22 29 3d 3d 30 20 29 7b 0a   "table")==0 ){.
16080 20 20 20 20 53 68 65 6c 6c 54 65 78 74 20 73 53      ShellText sS
16090 65 6c 65 63 74 3b 0a 20 20 20 20 53 68 65 6c 6c  elect;.    Shell
160a0 54 65 78 74 20 73 54 61 62 6c 65 3b 0a 20 20 20  Text sTable;.   
160b0 20 63 68 61 72 20 2a 2a 61 7a 43 6f 6c 3b 0a 20   char **azCol;. 
160c0 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 63 68     int i;.    ch
160d0 61 72 20 2a 73 61 76 65 64 44 65 73 74 54 61 62  ar *savedDestTab
160e0 6c 65 3b 0a 20 20 20 20 69 6e 74 20 73 61 76 65  le;.    int save
160f0 64 4d 6f 64 65 3b 0a 0a 20 20 20 20 61 7a 43 6f  dMode;..    azCo
16100 6c 20 3d 20 74 61 62 6c 65 43 6f 6c 75 6d 6e 4c  l = tableColumnL
16110 69 73 74 28 70 2c 20 7a 54 61 62 6c 65 29 3b 0a  ist(p, zTable);.
16120 20 20 20 20 69 66 28 20 61 7a 43 6f 6c 3d 3d 30      if( azCol==0
16130 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 45 72   ){.      p->nEr
16140 72 2b 2b 3b 0a 20 20 20 20 20 20 72 65 74 75 72  r++;.      retur
16150 6e 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  n 0;.    }..    
16160 2f 2a 20 41 6c 77 61 79 73 20 71 75 6f 74 65 20  /* Always quote 
16170 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 2c 20  the table name, 
16180 65 76 65 6e 20 69 66 20 69 74 20 61 70 70 65 61  even if it appea
16190 72 73 20 74 6f 20 62 65 20 70 75 72 65 20 61 73  rs to be pure as
161a0 63 69 69 2c 0a 20 20 20 20 2a 2a 20 69 6e 20 63  cii,.    ** in c
161b0 61 73 65 20 69 74 20 69 73 20 61 20 6b 65 79 77  ase it is a keyw
161c0 6f 72 64 2e 20 45 78 3a 20 20 49 4e 53 45 52 54  ord. Ex:  INSERT
161d0 20 49 4e 54 4f 20 22 74 61 62 6c 65 22 20 2e 2e   INTO "table" ..
161e0 2e 20 2a 2f 0a 20 20 20 20 69 6e 69 74 54 65 78  . */.    initTex
161f0 74 28 26 73 54 61 62 6c 65 29 3b 0a 20 20 20 20  t(&sTable);.    
16200 61 70 70 65 6e 64 54 65 78 74 28 26 73 54 61 62  appendText(&sTab
16210 6c 65 2c 20 7a 54 61 62 6c 65 2c 20 71 75 6f 74  le, zTable, quot
16220 65 43 68 61 72 28 7a 54 61 62 6c 65 29 29 3b 0a  eChar(zTable));.
16230 20 20 20 20 2f 2a 20 49 66 20 70 72 65 73 65 72      /* If preser
16240 76 69 6e 67 20 74 68 65 20 72 6f 77 69 64 2c 20  ving the rowid, 
16250 61 64 64 20 61 20 63 6f 6c 75 6d 6e 20 6c 69 73  add a column lis
16260 74 20 61 66 74 65 72 20 74 68 65 20 74 61 62 6c  t after the tabl
16270 65 20 6e 61 6d 65 2e 0a 20 20 20 20 2a 2a 20 49  e name..    ** I
16280 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 3a 20 20  n other words:  
16290 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 61 62  "INSERT INTO tab
162a0 28 72 6f 77 69 64 2c 61 2c 62 2c 63 2c 2e 2e 2e  (rowid,a,b,c,...
162b0 29 20 56 41 4c 55 45 53 28 2e 2e 2e 29 22 0a 20  ) VALUES(...)". 
162c0 20 20 20 2a 2a 20 69 6e 73 74 65 61 64 20 6f 66     ** instead of
162d0 20 74 68 65 20 75 73 75 61 6c 20 22 49 4e 53 45   the usual "INSE
162e0 52 54 20 49 4e 54 4f 20 74 61 62 20 56 41 4c 55  RT INTO tab VALU
162f0 45 53 28 2e 2e 2e 29 22 2e 0a 20 20 20 20 2a 2f  ES(...)"..    */
16300 0a 20 20 20 20 69 66 28 20 61 7a 43 6f 6c 5b 30  .    if( azCol[0
16310 5d 20 29 7b 0a 20 20 20 20 20 20 61 70 70 65 6e  ] ){.      appen
16320 64 54 65 78 74 28 26 73 54 61 62 6c 65 2c 20 22  dText(&sTable, "
16330 28 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 61 70  (", 0);.      ap
16340 70 65 6e 64 54 65 78 74 28 26 73 54 61 62 6c 65  pendText(&sTable
16350 2c 20 61 7a 43 6f 6c 5b 30 5d 2c 20 30 29 3b 0a  , azCol[0], 0);.
16360 20 20 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 61        for(i=1; a
16370 7a 43 6f 6c 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20  zCol[i]; i++){. 
16380 20 20 20 20 20 20 20 61 70 70 65 6e 64 54 65 78         appendTex
16390 74 28 26 73 54 61 62 6c 65 2c 20 22 2c 22 2c 20  t(&sTable, ",", 
163a0 30 29 3b 0a 20 20 20 20 20 20 20 20 61 70 70 65  0);.        appe
163b0 6e 64 54 65 78 74 28 26 73 54 61 62 6c 65 2c 20  ndText(&sTable, 
163c0 61 7a 43 6f 6c 5b 69 5d 2c 20 71 75 6f 74 65 43  azCol[i], quoteC
163d0 68 61 72 28 61 7a 43 6f 6c 5b 69 5d 29 29 3b 0a  har(azCol[i]));.
163e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 70        }.      ap
163f0 70 65 6e 64 54 65 78 74 28 26 73 54 61 62 6c 65  pendText(&sTable
16400 2c 20 22 29 22 2c 20 30 29 3b 0a 20 20 20 20 7d  , ")", 0);.    }
16410 0a 0a 20 20 20 20 2f 2a 20 42 75 69 6c 64 20 61  ..    /* Build a
16420 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 53 45  n appropriate SE
16430 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a  LECT statement *
16440 2f 0a 20 20 20 20 69 6e 69 74 54 65 78 74 28 26  /.    initText(&
16450 73 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 61 70  sSelect);.    ap
16460 70 65 6e 64 54 65 78 74 28 26 73 53 65 6c 65 63  pendText(&sSelec
16470 74 2c 20 22 53 45 4c 45 43 54 20 22 2c 20 30 29  t, "SELECT ", 0)
16480 3b 0a 20 20 20 20 69 66 28 20 61 7a 43 6f 6c 5b  ;.    if( azCol[
16490 30 5d 20 29 7b 0a 20 20 20 20 20 20 61 70 70 65  0] ){.      appe
164a0 6e 64 54 65 78 74 28 26 73 53 65 6c 65 63 74 2c  ndText(&sSelect,
164b0 20 61 7a 43 6f 6c 5b 30 5d 2c 20 30 29 3b 0a 20   azCol[0], 0);. 
164c0 20 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28       appendText(
164d0 26 73 53 65 6c 65 63 74 2c 20 22 2c 22 2c 20 30  &sSelect, ",", 0
164e0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72  );.    }.    for
164f0 28 69 3d 31 3b 20 61 7a 43 6f 6c 5b 69 5d 3b 20  (i=1; azCol[i]; 
16500 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61 70 70 65  i++){.      appe
16510 6e 64 54 65 78 74 28 26 73 53 65 6c 65 63 74 2c  ndText(&sSelect,
16520 20 61 7a 43 6f 6c 5b 69 5d 2c 20 71 75 6f 74 65   azCol[i], quote
16530 43 68 61 72 28 61 7a 43 6f 6c 5b 69 5d 29 29 3b  Char(azCol[i]));
16540 0a 20 20 20 20 20 20 69 66 28 20 61 7a 43 6f 6c  .      if( azCol
16550 5b 69 2b 31 5d 20 29 7b 0a 20 20 20 20 20 20 20  [i+1] ){.       
16560 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 53 65   appendText(&sSe
16570 6c 65 63 74 2c 20 22 2c 22 2c 20 30 29 3b 0a 20  lect, ",", 0);. 
16580 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
16590 20 66 72 65 65 43 6f 6c 75 6d 6e 4c 69 73 74 28   freeColumnList(
165a0 61 7a 43 6f 6c 29 3b 0a 20 20 20 20 61 70 70 65  azCol);.    appe
165b0 6e 64 54 65 78 74 28 26 73 53 65 6c 65 63 74 2c  ndText(&sSelect,
165c0 20 22 20 46 52 4f 4d 20 22 2c 20 30 29 3b 0a 20   " FROM ", 0);. 
165d0 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73     appendText(&s
165e0 53 65 6c 65 63 74 2c 20 7a 54 61 62 6c 65 2c 20  Select, zTable, 
165f0 71 75 6f 74 65 43 68 61 72 28 7a 54 61 62 6c 65  quoteChar(zTable
16600 29 29 3b 0a 0a 20 20 20 20 73 61 76 65 64 44 65  ));..    savedDe
16610 73 74 54 61 62 6c 65 20 3d 20 70 2d 3e 7a 44 65  stTable = p->zDe
16620 73 74 54 61 62 6c 65 3b 0a 20 20 20 20 73 61 76  stTable;.    sav
16630 65 64 4d 6f 64 65 20 3d 20 70 2d 3e 6d 6f 64 65  edMode = p->mode
16640 3b 0a 20 20 20 20 70 2d 3e 7a 44 65 73 74 54 61  ;.    p->zDestTa
16650 62 6c 65 20 3d 20 73 54 61 62 6c 65 2e 7a 3b 0a  ble = sTable.z;.
16660 20 20 20 20 70 2d 3e 6d 6f 64 65 20 3d 20 70 2d      p->mode = p-
16670 3e 63 4d 6f 64 65 20 3d 20 4d 4f 44 45 5f 49 6e  >cMode = MODE_In
16680 73 65 72 74 3b 0a 20 20 20 20 72 63 20 3d 20 73  sert;.    rc = s
16690 68 65 6c 6c 5f 65 78 65 63 28 70 2d 3e 64 62 2c  hell_exec(p->db,
166a0 20 73 53 65 6c 65 63 74 2e 7a 2c 20 73 68 65 6c   sSelect.z, shel
166b0 6c 5f 63 61 6c 6c 62 61 63 6b 2c 20 70 2c 20 30  l_callback, p, 0
166c0 29 3b 0a 20 20 20 20 69 66 28 20 28 72 63 26 30  );.    if( (rc&0
166d0 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f 43 4f 52  xff)==SQLITE_COR
166e0 52 55 50 54 20 29 7b 0a 20 20 20 20 20 20 72 61  RUPT ){.      ra
166f0 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  w_printf(p->out,
16700 20 22 2f 2a 2a 2a 2a 2a 2a 20 43 4f 52 52 55 50   "/****** CORRUP
16710 54 49 4f 4e 20 45 52 52 4f 52 20 2a 2a 2a 2a 2a  TION ERROR *****
16720 2a 2a 2f 5c 6e 22 29 3b 0a 20 20 20 20 20 20 74  **/\n");.      t
16730 6f 67 67 6c 65 53 65 6c 65 63 74 4f 72 64 65 72  oggleSelectOrder
16740 28 70 2d 3e 64 62 29 3b 0a 20 20 20 20 20 20 73  (p->db);.      s
16750 68 65 6c 6c 5f 65 78 65 63 28 70 2d 3e 64 62 2c  hell_exec(p->db,
16760 20 73 53 65 6c 65 63 74 2e 7a 2c 20 73 68 65 6c   sSelect.z, shel
16770 6c 5f 63 61 6c 6c 62 61 63 6b 2c 20 70 2c 20 30  l_callback, p, 0
16780 29 3b 0a 20 20 20 20 20 20 74 6f 67 67 6c 65 53  );.      toggleS
16790 65 6c 65 63 74 4f 72 64 65 72 28 70 2d 3e 64 62  electOrder(p->db
167a0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e  );.    }.    p->
167b0 7a 44 65 73 74 54 61 62 6c 65 20 3d 20 73 61 76  zDestTable = sav
167c0 65 64 44 65 73 74 54 61 62 6c 65 3b 0a 20 20 20  edDestTable;.   
167d0 20 70 2d 3e 6d 6f 64 65 20 3d 20 73 61 76 65 64   p->mode = saved
167e0 4d 6f 64 65 3b 0a 20 20 20 20 66 72 65 65 54 65  Mode;.    freeTe
167f0 78 74 28 26 73 54 61 62 6c 65 29 3b 0a 20 20 20  xt(&sTable);.   
16800 20 66 72 65 65 54 65 78 74 28 26 73 53 65 6c 65   freeText(&sSele
16810 63 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  ct);.    if( rc 
16820 29 20 70 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 7d  ) p->nErr++;.  }
16830 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
16840 2f 2a 0a 2a 2a 20 52 75 6e 20 7a 51 75 65 72 79  /*.** Run zQuery
16850 2e 20 20 55 73 65 20 64 75 6d 70 5f 63 61 6c 6c  .  Use dump_call
16860 62 61 63 6b 28 29 20 61 73 20 74 68 65 20 63 61  back() as the ca
16870 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65 20 73  llback routine s
16880 6f 20 74 68 61 74 0a 2a 2a 20 74 68 65 20 63 6f  o that.** the co
16890 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 71 75  ntents of the qu
168a0 65 72 79 20 61 72 65 20 6f 75 74 70 75 74 20 61  ery are output a
168b0 73 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73  s SQL statements
168c0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 77 65 20 67 65  ..**.** If we ge
168d0 74 20 61 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  t a SQLITE_CORRU
168e0 50 54 20 65 72 72 6f 72 2c 20 72 65 72 75 6e 20  PT error, rerun 
168f0 74 68 65 20 71 75 65 72 79 20 61 66 74 65 72 20  the query after 
16900 61 70 70 65 6e 64 69 6e 67 0a 2a 2a 20 22 4f 52  appending.** "OR
16910 44 45 52 20 42 59 20 72 6f 77 69 64 20 44 45 53  DER BY rowid DES
16920 43 22 20 74 6f 20 74 68 65 20 65 6e 64 2e 0a 2a  C" to the end..*
16930 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 75 6e  /.static int run
16940 5f 73 63 68 65 6d 61 5f 64 75 6d 70 5f 71 75 65  _schema_dump_que
16950 72 79 28 0a 20 20 53 68 65 6c 6c 53 74 61 74 65  ry(.  ShellState
16960 20 2a 70 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61   *p,.  const cha
16970 72 20 2a 7a 51 75 65 72 79 0a 29 7b 0a 20 20 69  r *zQuery.){.  i
16980 6e 74 20 72 63 3b 0a 20 20 63 68 61 72 20 2a 7a  nt rc;.  char *z
16990 45 72 72 20 3d 20 30 3b 0a 20 20 72 63 20 3d 20  Err = 0;.  rc = 
169a0 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e  sqlite3_exec(p->
169b0 64 62 2c 20 7a 51 75 65 72 79 2c 20 64 75 6d 70  db, zQuery, dump
169c0 5f 63 61 6c 6c 62 61 63 6b 2c 20 70 2c 20 26 7a  _callback, p, &z
169d0 45 72 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  Err);.  if( rc==
169e0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 29  SQLITE_CORRUPT )
169f0 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 51 32 3b  {.    char *zQ2;
16a00 0a 20 20 20 20 69 6e 74 20 6c 65 6e 20 3d 20 73  .    int len = s
16a10 74 72 6c 65 6e 33 30 28 7a 51 75 65 72 79 29 3b  trlen30(zQuery);
16a20 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28  .    raw_printf(
16a30 70 2d 3e 6f 75 74 2c 20 22 2f 2a 2a 2a 2a 2a 2a  p->out, "/******
16a40 20 43 4f 52 52 55 50 54 49 4f 4e 20 45 52 52 4f   CORRUPTION ERRO
16a50 52 20 2a 2a 2a 2a 2a 2a 2a 2f 5c 6e 22 29 3b 0a  R *******/\n");.
16a60 20 20 20 20 69 66 28 20 7a 45 72 72 20 29 7b 0a      if( zErr ){.
16a70 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
16a80 66 28 70 2d 3e 6f 75 74 2c 20 22 2f 2a 2a 2a 2a  f(p->out, "/****
16a90 2a 2a 20 25 73 20 2a 2a 2a 2a 2a 2a 2f 5c 6e 22  ** %s ******/\n"
16aa0 2c 20 7a 45 72 72 29 3b 0a 20 20 20 20 20 20 73  , zErr);.      s
16ab0 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 45 72 72  qlite3_free(zErr
16ac0 29 3b 0a 20 20 20 20 20 20 7a 45 72 72 20 3d 20  );.      zErr = 
16ad0 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 51 32  0;.    }.    zQ2
16ae0 20 3d 20 6d 61 6c 6c 6f 63 28 20 6c 65 6e 2b 31   = malloc( len+1
16af0 30 30 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 51  00 );.    if( zQ
16b00 32 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 72 63  2==0 ) return rc
16b10 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  ;.    sqlite3_sn
16b20 70 72 69 6e 74 66 28 6c 65 6e 2b 31 30 30 2c 20  printf(len+100, 
16b30 7a 51 32 2c 20 22 25 73 20 4f 52 44 45 52 20 42  zQ2, "%s ORDER B
16b40 59 20 72 6f 77 69 64 20 44 45 53 43 22 2c 20 7a  Y rowid DESC", z
16b50 51 75 65 72 79 29 3b 0a 20 20 20 20 72 63 20 3d  Query);.    rc =
16b60 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d   sqlite3_exec(p-
16b70 3e 64 62 2c 20 7a 51 32 2c 20 64 75 6d 70 5f 63  >db, zQ2, dump_c
16b80 61 6c 6c 62 61 63 6b 2c 20 70 2c 20 26 7a 45 72  allback, p, &zEr
16b90 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  r);.    if( rc )
16ba0 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69  {.      utf8_pri
16bb0 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 2f 2a 2a  ntf(p->out, "/**
16bc0 2a 2a 2a 2a 20 45 52 52 4f 52 3a 20 25 73 20 2a  **** ERROR: %s *
16bd0 2a 2a 2a 2a 2a 2f 5c 6e 22 2c 20 7a 45 72 72 29  *****/\n", zErr)
16be0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
16bf0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
16c00 4f 52 52 55 50 54 3b 0a 20 20 20 20 7d 0a 20 20  ORRUPT;.    }.  
16c10 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
16c20 45 72 72 29 3b 0a 20 20 20 20 66 72 65 65 28 7a  Err);.    free(z
16c30 51 32 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  Q2);.  }.  retur
16c40 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
16c50 65 78 74 20 6f 66 20 61 20 68 65 6c 70 20 6d 65  ext of a help me
16c60 73 73 61 67 65 0a 2a 2f 0a 73 74 61 74 69 63 20  ssage.*/.static 
16c70 63 68 61 72 20 7a 48 65 6c 70 5b 5d 20 3d 0a 23  char zHelp[] =.#
16c80 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
16c90 45 5f 48 41 56 45 5f 5a 4c 49 42 29 20 26 26 20  E_HAVE_ZLIB) && 
16ca0 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
16cb0 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
16cc0 45 29 0a 20 20 22 2e 61 72 63 68 69 76 65 20 2e  E).  ".archive .
16cd0 2e 2e 20 20 20 20 20 20 20 20 20 20 20 4d 61 6e  ..           Man
16ce0 61 67 65 20 53 51 4c 20 61 72 63 68 69 76 65 73  age SQL archives
16cf0 3a 20 5c 22 2e 61 72 63 68 69 76 65 20 2d 2d 68  : \".archive --h
16d00 65 6c 70 5c 22 20 66 6f 72 20 64 65 74 61 69 6c  elp\" for detail
16d10 73 5c 6e 22 0a 23 65 6e 64 69 66 0a 23 69 66 6e  s\n".#endif.#ifn
16d20 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
16d30 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20  AUTHORIZATION.  
16d40 22 2e 61 75 74 68 20 4f 4e 7c 4f 46 46 20 20 20  ".auth ON|OFF   
16d50 20 20 20 20 20 20 20 20 53 68 6f 77 20 61 75 74          Show aut
16d60 68 6f 72 69 7a 65 72 20 63 61 6c 6c 62 61 63 6b  horizer callback
16d70 73 5c 6e 22 0a 23 65 6e 64 69 66 0a 20 20 22 2e  s\n".#endif.  ".
16d80 62 61 63 6b 75 70 20 3f 44 42 3f 20 46 49 4c 45  backup ?DB? FILE
16d90 20 20 20 20 20 20 42 61 63 6b 75 70 20 44 42 20        Backup DB 
16da0 28 64 65 66 61 75 6c 74 20 5c 22 6d 61 69 6e 5c  (default \"main\
16db0 22 29 20 74 6f 20 46 49 4c 45 5c 6e 22 0a 20 20  ") to FILE\n".  
16dc0 22 2e 62 61 69 6c 20 6f 6e 7c 6f 66 66 20 20 20  ".bail on|off   
16dd0 20 20 20 20 20 20 20 20 53 74 6f 70 20 61 66 74          Stop aft
16de0 65 72 20 68 69 74 74 69 6e 67 20 61 6e 20 65 72  er hitting an er
16df0 72 6f 72 2e 20 20 44 65 66 61 75 6c 74 20 4f 46  ror.  Default OF
16e00 46 5c 6e 22 0a 20 20 22 2e 62 69 6e 61 72 79 20  F\n".  ".binary 
16e10 6f 6e 7c 6f 66 66 20 20 20 20 20 20 20 20 20 54  on|off         T
16e20 75 72 6e 20 62 69 6e 61 72 79 20 6f 75 74 70 75  urn binary outpu
16e30 74 20 6f 6e 20 6f 72 20 6f 66 66 2e 20 20 44 65  t on or off.  De
16e40 66 61 75 6c 74 20 4f 46 46 5c 6e 22 0a 20 20 22  fault OFF\n".  "
16e50 2e 63 64 20 44 49 52 45 43 54 4f 52 59 20 20 20  .cd DIRECTORY   
16e60 20 20 20 20 20 20 20 43 68 61 6e 67 65 20 74 68         Change th
16e70 65 20 77 6f 72 6b 69 6e 67 20 64 69 72 65 63 74  e working direct
16e80 6f 72 79 20 74 6f 20 44 49 52 45 43 54 4f 52 59  ory to DIRECTORY
16e90 5c 6e 22 0a 20 20 22 2e 63 68 61 6e 67 65 73 20  \n".  ".changes 
16ea0 6f 6e 7c 6f 66 66 20 20 20 20 20 20 20 20 53 68  on|off        Sh
16eb0 6f 77 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  ow number of row
16ec0 73 20 63 68 61 6e 67 65 64 20 62 79 20 53 51 4c  s changed by SQL
16ed0 5c 6e 22 0a 20 20 22 2e 63 68 65 63 6b 20 47 4c  \n".  ".check GL
16ee0 4f 42 20 20 20 20 20 20 20 20 20 20 20 20 46 61  OB            Fa
16ef0 69 6c 20 69 66 20 6f 75 74 70 75 74 20 73 69 6e  il if output sin
16f00 63 65 20 2e 74 65 73 74 63 61 73 65 20 64 6f 65  ce .testcase doe
16f10 73 20 6e 6f 74 20 6d 61 74 63 68 5c 6e 22 0a 20  s not match\n". 
16f20 20 22 2e 63 6c 6f 6e 65 20 4e 45 57 44 42 20 20   ".clone NEWDB  
16f30 20 20 20 20 20 20 20 20 20 43 6c 6f 6e 65 20 64           Clone d
16f40 61 74 61 20 69 6e 74 6f 20 4e 45 57 44 42 20 66  ata into NEWDB f
16f50 72 6f 6d 20 74 68 65 20 65 78 69 73 74 69 6e 67  rom the existing
16f60 20 64 61 74 61 62 61 73 65 5c 6e 22 0a 20 20 22   database\n".  "
16f70 2e 64 61 74 61 62 61 73 65 73 20 20 20 20 20 20  .databases      
16f80 20 20 20 20 20 20 20 4c 69 73 74 20 6e 61 6d 65         List name
16f90 73 20 61 6e 64 20 66 69 6c 65 73 20 6f 66 20 61  s and files of a
16fa0 74 74 61 63 68 65 64 20 64 61 74 61 62 61 73 65  ttached database
16fb0 73 5c 6e 22 0a 20 20 22 2e 64 62 69 6e 66 6f 20  s\n".  ".dbinfo 
16fc0 3f 44 42 3f 20 20 20 20 20 20 20 20 20 20 20 53  ?DB?           S
16fd0 68 6f 77 20 73 74 61 74 75 73 20 69 6e 66 6f 72  how status infor
16fe0 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65  mation about the
16ff0 20 64 61 74 61 62 61 73 65 5c 6e 22 0a 20 20 22   database\n".  "
17000 2e 64 75 6d 70 20 3f 54 41 42 4c 45 3f 20 2e 2e  .dump ?TABLE? ..
17010 2e 20 20 20 20 20 20 44 75 6d 70 20 74 68 65 20  .      Dump the 
17020 64 61 74 61 62 61 73 65 20 69 6e 20 61 6e 20 53  database in an S
17030 51 4c 20 74 65 78 74 20 66 6f 72 6d 61 74 5c 6e  QL text format\n
17040 22 0a 20 20 22 20 20 20 20 20 20 20 20 20 20 20  ".  "           
17050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 49 66                If
17060 20 54 41 42 4c 45 20 73 70 65 63 69 66 69 65 64   TABLE specified
17070 2c 20 6f 6e 6c 79 20 64 75 6d 70 20 74 61 62 6c  , only dump tabl
17080 65 73 20 6d 61 74 63 68 69 6e 67 5c 6e 22 0a 20  es matching\n". 
17090 20 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20   "              
170a0 20 20 20 20 20 20 20 20 20 20 20 4c 49 4b 45 20             LIKE 
170b0 70 61 74 74 65 72 6e 20 54 41 42 4c 45 2e 5c 6e  pattern TABLE.\n
170c0 22 0a 20 20 22 2e 65 63 68 6f 20 6f 6e 7c 6f 66  ".  ".echo on|of
170d0 66 20 20 20 20 20 20 20 20 20 20 20 54 75 72 6e  f           Turn
170e0 20 63 6f 6d 6d 61 6e 64 20 65 63 68 6f 20 6f 6e   command echo on
170f0 20 6f 72 20 6f 66 66 5c 6e 22 0a 20 20 22 2e 65   or off\n".  ".e
17100 71 70 20 6f 6e 7c 6f 66 66 7c 66 75 6c 6c 20 20  qp on|off|full  
17110 20 20 20 20 20 45 6e 61 62 6c 65 20 6f 72 20 64       Enable or d
17120 69 73 61 62 6c 65 20 61 75 74 6f 6d 61 74 69 63  isable automatic
17130 20 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50   EXPLAIN QUERY P
17140 4c 41 4e 5c 6e 22 0a 20 20 22 2e 65 78 63 65 6c  LAN\n".  ".excel
17150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17160 20 44 69 73 70 6c 61 79 20 74 68 65 20 6f 75 74   Display the out
17170 70 75 74 20 6f 66 20 6e 65 78 74 20 63 6f 6d 6d  put of next comm
17180 61 6e 64 20 69 6e 20 61 20 73 70 72 65 61 64 73  and in a spreads
17190 68 65 65 74 5c 6e 22 0a 20 20 22 2e 65 78 69 74  heet\n".  ".exit
171a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
171b0 20 20 45 78 69 74 20 74 68 69 73 20 70 72 6f 67    Exit this prog
171c0 72 61 6d 5c 6e 22 0a 20 20 22 2e 65 78 70 65 72  ram\n".  ".exper
171d0 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
171e0 20 45 58 50 45 52 49 4d 45 4e 54 41 4c 2e 20 53   EXPERIMENTAL. S
171f0 75 67 67 65 73 74 20 69 6e 64 65 78 65 73 20 66  uggest indexes f
17200 6f 72 20 73 70 65 63 69 66 69 65 64 20 71 75 65  or specified que
17210 72 69 65 73 5c 6e 22 0a 2f 2a 20 42 65 63 61 75  ries\n"./* Becau
17220 73 65 20 65 78 70 6c 61 69 6e 20 6d 6f 64 65 20  se explain mode 
17230 63 6f 6d 65 73 20 6f 6e 20 61 75 74 6f 6d 61 74  comes on automat
17240 69 63 61 6c 6c 79 20 6e 6f 77 2c 20 74 68 65 20  ically now, the 
17250 22 2e 65 78 70 6c 61 69 6e 22 20 6d 6f 64 65 0a  ".explain" mode.
17260 2a 2a 20 69 73 20 72 65 6d 6f 76 65 64 20 66 72  ** is removed fr
17270 6f 6d 20 74 68 65 20 68 65 6c 70 20 73 63 72 65  om the help scre
17280 65 6e 2e 20 20 49 74 20 69 73 20 73 74 69 6c 6c  en.  It is still
17290 20 73 75 70 70 6f 72 74 65 64 20 66 6f 72 20 6c   supported for l
172a0 65 67 61 63 79 2c 20 68 6f 77 65 76 65 72 20 2a  egacy, however *
172b0 2f 0a 2f 2a 22 2e 65 78 70 6c 61 69 6e 20 3f 6f  /./*".explain ?o
172c0 6e 7c 6f 66 66 7c 61 75 74 6f 3f 20 54 75 72 6e  n|off|auto? Turn
172d0 20 45 58 50 4c 41 49 4e 20 6f 75 74 70 75 74 20   EXPLAIN output 
172e0 6d 6f 64 65 20 6f 6e 20 6f 72 20 6f 66 66 20 6f  mode on or off o
172f0 72 20 74 6f 20 61 75 74 6f 6d 61 74 69 63 5c 6e  r to automatic\n
17300 22 2a 2f 0a 20 20 22 2e 66 75 6c 6c 73 63 68 65  "*/.  ".fullsche
17310 6d 61 20 3f 2d 2d 69 6e 64 65 6e 74 3f 20 53 68  ma ?--indent? Sh
17320 6f 77 20 73 63 68 65 6d 61 20 61 6e 64 20 74 68  ow schema and th
17330 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 73 71 6c  e content of sql
17340 69 74 65 5f 73 74 61 74 20 74 61 62 6c 65 73 5c  ite_stat tables\
17350 6e 22 0a 20 20 22 2e 68 65 61 64 65 72 73 20 6f  n".  ".headers o
17360 6e 7c 6f 66 66 20 20 20 20 20 20 20 20 54 75 72  n|off        Tur
17370 6e 20 64 69 73 70 6c 61 79 20 6f 66 20 68 65 61  n display of hea
17380 64 65 72 73 20 6f 6e 20 6f 72 20 6f 66 66 5c 6e  ders on or off\n
17390 22 0a 20 20 22 2e 68 65 6c 70 20 20 20 20 20 20  ".  ".help      
173a0 20 20 20 20 20 20 20 20 20 20 20 20 53 68 6f 77              Show
173b0 20 74 68 69 73 20 6d 65 73 73 61 67 65 5c 6e 22   this message\n"
173c0 0a 20 20 22 2e 69 6d 70 6f 72 74 20 46 49 4c 45  .  ".import FILE
173d0 20 54 41 42 4c 45 20 20 20 20 20 49 6d 70 6f 72   TABLE     Impor
173e0 74 20 64 61 74 61 20 66 72 6f 6d 20 46 49 4c 45  t data from FILE
173f0 20 69 6e 74 6f 20 54 41 42 4c 45 5c 6e 22 0a 23   into TABLE\n".#
17400 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
17410 49 54 5f 54 45 53 54 5f 43 4f 4e 54 52 4f 4c 0a  IT_TEST_CONTROL.
17420 20 20 22 2e 69 6d 70 6f 73 74 65 72 20 49 4e 44    ".imposter IND
17430 45 58 20 54 41 42 4c 45 20 20 43 72 65 61 74 65  EX TABLE  Create
17440 20 69 6d 70 6f 73 74 65 72 20 74 61 62 6c 65 20   imposter table 
17450 54 41 42 4c 45 20 6f 6e 20 69 6e 64 65 78 20 49  TABLE on index I
17460 4e 44 45 58 5c 6e 22 0a 23 65 6e 64 69 66 0a 20  NDEX\n".#endif. 
17470 20 22 2e 69 6e 64 65 78 65 73 20 3f 54 41 42 4c   ".indexes ?TABL
17480 45 3f 20 20 20 20 20 20 20 53 68 6f 77 20 6e 61  E?       Show na
17490 6d 65 73 20 6f 66 20 61 6c 6c 20 69 6e 64 65 78  mes of all index
174a0 65 73 5c 6e 22 0a 20 20 22 20 20 20 20 20 20 20  es\n".  "       
174b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
174c0 20 20 49 66 20 54 41 42 4c 45 20 73 70 65 63 69    If TABLE speci
174d0 66 69 65 64 2c 20 6f 6e 6c 79 20 73 68 6f 77 20  fied, only show 
174e0 69 6e 64 65 78 65 73 20 66 6f 72 20 74 61 62 6c  indexes for tabl
174f0 65 73 5c 6e 22 0a 20 20 22 20 20 20 20 20 20 20  es\n".  "       
17500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17510 20 20 6d 61 74 63 68 69 6e 67 20 4c 49 4b 45 20    matching LIKE 
17520 70 61 74 74 65 72 6e 20 54 41 42 4c 45 2e 5c 6e  pattern TABLE.\n
17530 22 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ".#ifdef SQLITE_
17540 45 4e 41 42 4c 45 5f 49 4f 54 52 41 43 45 0a 20  ENABLE_IOTRACE. 
17550 20 22 2e 69 6f 74 72 61 63 65 20 46 49 4c 45 20   ".iotrace FILE 
17560 20 20 20 20 20 20 20 20 20 45 6e 61 62 6c 65 20           Enable 
17570 49 2f 4f 20 64 69 61 67 6e 6f 73 74 69 63 20 6c  I/O diagnostic l
17580 6f 67 67 69 6e 67 20 74 6f 20 46 49 4c 45 5c 6e  ogging to FILE\n
17590 22 0a 23 65 6e 64 69 66 0a 20 20 22 2e 6c 69 6d  ".#endif.  ".lim
175a0 69 74 20 3f 4c 49 4d 49 54 3f 20 3f 56 41 4c 3f  it ?LIMIT? ?VAL?
175b0 20 20 20 44 69 73 70 6c 61 79 20 6f 72 20 63 68     Display or ch
175c0 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f  ange the value o
175d0 66 20 61 6e 20 53 51 4c 49 54 45 5f 4c 49 4d 49  f an SQLITE_LIMI
175e0 54 5c 6e 22 0a 20 20 22 2e 6c 69 6e 74 20 4f 50  T\n".  ".lint OP
175f0 54 49 4f 4e 53 20 20 20 20 20 20 20 20 20 20 52  TIONS          R
17600 65 70 6f 72 74 20 70 6f 74 65 6e 74 69 61 6c 20  eport potential 
17610 73 63 68 65 6d 61 20 69 73 73 75 65 73 2e 20 4f  schema issues. O
17620 70 74 69 6f 6e 73 3a 5c 6e 22 0a 20 20 22 20 20  ptions:\n".  "  
17630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17640 20 20 20 20 20 20 20 66 6b 65 79 2d 69 6e 64 65         fkey-inde
17650 78 65 73 20 20 20 20 20 46 69 6e 64 20 6d 69 73  xes     Find mis
17660 73 69 6e 67 20 66 6f 72 65 69 67 6e 20 6b 65 79  sing foreign key
17670 20 69 6e 64 65 78 65 73 5c 6e 22 0a 23 69 66 6e   indexes\n".#ifn
17680 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
17690 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 0a 20  LOAD_EXTENSION. 
176a0 20 22 2e 6c 6f 61 64 20 46 49 4c 45 20 3f 45 4e   ".load FILE ?EN
176b0 54 52 59 3f 20 20 20 20 20 4c 6f 61 64 20 61 6e  TRY?     Load an
176c0 20 65 78 74 65 6e 73 69 6f 6e 20 6c 69 62 72 61   extension libra
176d0 72 79 5c 6e 22 0a 23 65 6e 64 69 66 0a 20 20 22  ry\n".#endif.  "
176e0 2e 6c 6f 67 20 46 49 4c 45 7c 6f 66 66 20 20 20  .log FILE|off   
176f0 20 20 20 20 20 20 20 54 75 72 6e 20 6c 6f 67 67         Turn logg
17700 69 6e 67 20 6f 6e 20 6f 72 20 6f 66 66 2e 20 20  ing on or off.  
17710 46 49 4c 45 20 63 61 6e 20 62 65 20 73 74 64 65  FILE can be stde
17720 72 72 2f 73 74 64 6f 75 74 5c 6e 22 0a 20 20 22  rr/stdout\n".  "
17730 2e 6d 6f 64 65 20 4d 4f 44 45 20 3f 54 41 42 4c  .mode MODE ?TABL
17740 45 3f 20 20 20 20 20 53 65 74 20 6f 75 74 70 75  E?     Set outpu
17750 74 20 6d 6f 64 65 20 77 68 65 72 65 20 4d 4f 44  t mode where MOD
17760 45 20 69 73 20 6f 6e 65 20 6f 66 3a 5c 6e 22 0a  E is one of:\n".
17770 20 20 22 20 20 20 20 20 20 20 20 20 20 20 20 20    "             
17780 20 20 20 20 20 20 20 20 20 20 20 20 61 73 63 69              asci
17790 69 20 20 20 20 43 6f 6c 75 6d 6e 73 2f 72 6f 77  i    Columns/row
177a0 73 20 64 65 6c 69 6d 69 74 65 64 20 62 79 20 30  s delimited by 0
177b0 78 31 46 20 61 6e 64 20 30 78 31 45 5c 6e 22 0a  x1F and 0x1E\n".
177c0 20 20 22 20 20 20 20 20 20 20 20 20 20 20 20 20    "             
177d0 20 20 20 20 20 20 20 20 20 20 20 20 63 73 76 20              csv 
177e0 20 20 20 20 20 43 6f 6d 6d 61 2d 73 65 70 61 72       Comma-separ
177f0 61 74 65 64 20 76 61 6c 75 65 73 5c 6e 22 0a 20  ated values\n". 
17800 20 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20   "              
17810 20 20 20 20 20 20 20 20 20 20 20 63 6f 6c 75 6d             colum
17820 6e 20 20 20 4c 65 66 74 2d 61 6c 69 67 6e 65 64  n   Left-aligned
17830 20 63 6f 6c 75 6d 6e 73 2e 20 20 28 53 65 65 20   columns.  (See 
17840 2e 77 69 64 74 68 29 5c 6e 22 0a 20 20 22 20 20  .width)\n".  "  
17850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17860 20 20 20 20 20 20 20 68 74 6d 6c 20 20 20 20 20         html     
17870 48 54 4d 4c 20 3c 74 61 62 6c 65 3e 20 63 6f 64  HTML <table> cod
17880 65 5c 6e 22 0a 20 20 22 20 20 20 20 20 20 20 20  e\n".  "        
17890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
178a0 20 69 6e 73 65 72 74 20 20 20 53 51 4c 20 69 6e   insert   SQL in
178b0 73 65 72 74 20 73 74 61 74 65 6d 65 6e 74 73 20  sert statements 
178c0 66 6f 72 20 54 41 42 4c 45 5c 6e 22 0a 20 20 22  for TABLE\n".  "
178d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
178e0 20 20 20 20 20 20 20 20 20 6c 69 6e 65 20 20 20           line   
178f0 20 20 4f 6e 65 20 76 61 6c 75 65 20 70 65 72 20    One value per 
17900 6c 69 6e 65 5c 6e 22 0a 20 20 22 20 20 20 20 20  line\n".  "     
17910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17920 20 20 20 20 6c 69 73 74 20 20 20 20 20 56 61 6c      list     Val
17930 75 65 73 20 64 65 6c 69 6d 69 74 65 64 20 62 79  ues delimited by
17940 20 5c 22 7c 5c 22 5c 6e 22 0a 20 20 22 20 20 20   \"|\"\n".  "   
17950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17960 20 20 20 20 20 20 71 75 6f 74 65 20 20 20 20 45        quote    E
17970 73 63 61 70 65 20 61 6e 73 77 65 72 73 20 61 73  scape answers as
17980 20 66 6f 72 20 53 51 4c 5c 6e 22 0a 20 20 22 20   for SQL\n".  " 
17990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
179a0 20 20 20 20 20 20 20 20 74 61 62 73 20 20 20 20          tabs    
179b0 20 54 61 62 2d 73 65 70 61 72 61 74 65 64 20 76   Tab-separated v
179c0 61 6c 75 65 73 5c 6e 22 0a 20 20 22 20 20 20 20  alues\n".  "    
179d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
179e0 20 20 20 20 20 74 63 6c 20 20 20 20 20 20 54 43       tcl      TC
179f0 4c 20 6c 69 73 74 20 65 6c 65 6d 65 6e 74 73 5c  L list elements\
17a00 6e 22 0a 20 20 22 2e 6e 75 6c 6c 76 61 6c 75 65  n".  ".nullvalue
17a10 20 53 54 52 49 4e 47 20 20 20 20 20 20 55 73 65   STRING      Use
17a20 20 53 54 52 49 4e 47 20 69 6e 20 70 6c 61 63 65   STRING in place
17a30 20 6f 66 20 4e 55 4c 4c 20 76 61 6c 75 65 73 5c   of NULL values\
17a40 6e 22 0a 20 20 22 2e 6f 6e 63 65 20 46 49 4c 45  n".  ".once FILE
17a50 4e 41 4d 45 20 20 20 20 20 20 20 20 20 4f 75 74  NAME         Out
17a60 70 75 74 20 66 6f 72 20 74 68 65 20 6e 65 78 74  put for the next
17a70 20 53 51 4c 20 63 6f 6d 6d 61 6e 64 20 6f 6e 6c   SQL command onl
17a80 79 20 74 6f 20 46 49 4c 45 4e 41 4d 45 5c 6e 22  y to FILENAME\n"
17a90 0a 20 20 22 2e 6f 70 65 6e 20 3f 4f 50 54 49 4f  .  ".open ?OPTIO
17aa0 4e 53 3f 20 3f 46 49 4c 45 3f 20 43 6c 6f 73 65  NS? ?FILE? Close
17ab0 20 65 78 69 73 74 69 6e 67 20 64 61 74 61 62 61   existing databa
17ac0 73 65 20 61 6e 64 20 72 65 6f 70 65 6e 20 46 49  se and reopen FI
17ad0 4c 45 5c 6e 22 0a 20 20 22 20 20 20 20 20 20 20  LE\n".  "       
17ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17af0 20 20 54 68 65 20 2d 2d 6e 65 77 20 6f 70 74 69    The --new opti
17b00 6f 6e 20 73 74 61 72 74 73 20 77 69 74 68 20 61  on starts with a
17b10 6e 20 65 6d 70 74 79 20 66 69 6c 65 5c 6e 22 0a  n empty file\n".
17b20 20 20 22 2e 6f 75 74 70 75 74 20 3f 46 49 4c 45    ".output ?FILE
17b30 4e 41 4d 45 3f 20 20 20 20 20 53 65 6e 64 20 6f  NAME?     Send o
17b40 75 74 70 75 74 20 74 6f 20 46 49 4c 45 4e 41 4d  utput to FILENAM
17b50 45 20 6f 72 20 73 74 64 6f 75 74 5c 6e 22 0a 20  E or stdout\n". 
17b60 20 22 2e 70 72 69 6e 74 20 53 54 52 49 4e 47 2e   ".print STRING.
17b70 2e 2e 20 20 20 20 20 20 20 50 72 69 6e 74 20 6c  ..       Print l
17b80 69 74 65 72 61 6c 20 53 54 52 49 4e 47 5c 6e 22  iteral STRING\n"
17b90 0a 20 20 22 2e 70 72 6f 6d 70 74 20 4d 41 49 4e  .  ".prompt MAIN
17ba0 20 43 4f 4e 54 49 4e 55 45 20 20 52 65 70 6c 61   CONTINUE  Repla
17bb0 63 65 20 74 68 65 20 73 74 61 6e 64 61 72 64 20  ce the standard 
17bc0 70 72 6f 6d 70 74 73 5c 6e 22 0a 20 20 22 2e 71  prompts\n".  ".q
17bd0 75 69 74 20 20 20 20 20 20 20 20 20 20 20 20 20  uit             
17be0 20 20 20 20 20 45 78 69 74 20 74 68 69 73 20 70       Exit this p
17bf0 72 6f 67 72 61 6d 5c 6e 22 0a 20 20 22 2e 72 65  rogram\n".  ".re
17c00 61 64 20 46 49 4c 45 4e 41 4d 45 20 20 20 20 20  ad FILENAME     
17c10 20 20 20 20 45 78 65 63 75 74 65 20 53 51 4c 20      Execute SQL 
17c20 69 6e 20 46 49 4c 45 4e 41 4d 45 5c 6e 22 0a 20  in FILENAME\n". 
17c30 20 22 2e 72 65 73 74 6f 72 65 20 3f 44 42 3f 20   ".restore ?DB? 
17c40 46 49 4c 45 20 20 20 20 20 52 65 73 74 6f 72 65  FILE     Restore
17c50 20 63 6f 6e 74 65 6e 74 20 6f 66 20 44 42 20 28   content of DB (
17c60 64 65 66 61 75 6c 74 20 5c 22 6d 61 69 6e 5c 22  default \"main\"
17c70 29 20 66 72 6f 6d 20 46 49 4c 45 5c 6e 22 0a 20  ) from FILE\n". 
17c80 20 22 2e 73 61 76 65 20 46 49 4c 45 20 20 20 20   ".save FILE    
17c90 20 20 20 20 20 20 20 20 20 57 72 69 74 65 20 69           Write i
17ca0 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
17cb0 65 20 69 6e 74 6f 20 46 49 4c 45 5c 6e 22 0a 20  e into FILE\n". 
17cc0 20 22 2e 73 63 61 6e 73 74 61 74 73 20 6f 6e 7c   ".scanstats on|
17cd0 6f 66 66 20 20 20 20 20 20 54 75 72 6e 20 73 71  off      Turn sq
17ce0 6c 69 74 65 33 5f 73 74 6d 74 5f 73 63 61 6e 73  lite3_stmt_scans
17cf0 74 61 74 75 73 28 29 20 6d 65 74 72 69 63 73 20  tatus() metrics 
17d00 6f 6e 20 6f 72 20 6f 66 66 5c 6e 22 0a 20 20 22  on or off\n".  "
17d10 2e 73 63 68 65 6d 61 20 3f 50 41 54 54 45 52 4e  .schema ?PATTERN
17d20 3f 20 20 20 20 20 20 53 68 6f 77 20 74 68 65 20  ?      Show the 
17d30 43 52 45 41 54 45 20 73 74 61 74 65 6d 65 6e 74  CREATE statement
17d40 73 20 6d 61 74 63 68 69 6e 67 20 50 41 54 54 45  s matching PATTE
17d50 52 4e 5c 6e 22 0a 20 20 22 20 20 20 20 20 20 20  RN\n".  "       
17d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17d70 20 20 20 41 64 64 20 2d 2d 69 6e 64 65 6e 74 20     Add --indent 
17d80 66 6f 72 20 70 72 65 74 74 79 2d 70 72 69 6e 74  for pretty-print
17d90 69 6e 67 5c 6e 22 0a 20 20 22 2e 73 65 6c 66 74  ing\n".  ".selft
17da0 65 73 74 20 3f 2d 2d 69 6e 69 74 3f 20 20 20 20  est ?--init?    
17db0 20 52 75 6e 20 74 65 73 74 73 20 64 65 66 69 6e   Run tests defin
17dc0 65 64 20 69 6e 20 74 68 65 20 53 45 4c 46 54 45  ed in the SELFTE
17dd0 53 54 20 74 61 62 6c 65 5c 6e 22 0a 20 20 22 2e  ST table\n".  ".
17de0 73 65 70 61 72 61 74 6f 72 20 43 4f 4c 20 3f 52  separator COL ?R
17df0 4f 57 3f 20 20 20 43 68 61 6e 67 65 20 74 68 65  OW?   Change the
17e00 20 63 6f 6c 75 6d 6e 20 73 65 70 61 72 61 74 6f   column separato
17e10 72 20 61 6e 64 20 6f 70 74 69 6f 6e 61 6c 6c 79  r and optionally
17e20 20 74 68 65 20 72 6f 77 5c 6e 22 0a 20 20 22 20   the row\n".  " 
17e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17e40 20 20 20 20 20 20 20 20 73 65 70 61 72 61 74 6f          separato
17e50 72 20 66 6f 72 20 62 6f 74 68 20 74 68 65 20 6f  r for both the o
17e60 75 74 70 75 74 20 6d 6f 64 65 20 61 6e 64 20 2e  utput mode and .
17e70 69 6d 70 6f 72 74 5c 6e 22 0a 23 69 66 20 64 65  import\n".#if de
17e80 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
17e90 42 4c 45 5f 53 45 53 53 49 4f 4e 29 0a 20 20 22  BLE_SESSION).  "
17ea0 2e 73 65 73 73 69 6f 6e 20 43 4d 44 20 2e 2e 2e  .session CMD ...
17eb0 20 20 20 20 20 20 20 43 72 65 61 74 65 20 6f 72         Create or
17ec0 20 63 6f 6e 74 72 6f 6c 20 73 65 73 73 69 6f 6e   control session
17ed0 73 5c 6e 22 0a 23 65 6e 64 69 66 0a 20 20 22 2e  s\n".#endif.  ".
17ee0 73 68 61 33 73 75 6d 20 3f 4f 50 54 49 4f 4e 53  sha3sum ?OPTIONS
17ef0 2e 2e 2e 3f 20 20 43 6f 6d 70 75 74 65 20 61 20  ...?  Compute a 
17f00 53 48 41 33 20 68 61 73 68 20 6f 66 20 64 61 74  SHA3 hash of dat
17f10 61 62 61 73 65 20 63 6f 6e 74 65 6e 74 5c 6e 22  abase content\n"
17f20 0a 20 20 22 2e 73 68 65 6c 6c 20 43 4d 44 20 41  .  ".shell CMD A
17f30 52 47 53 2e 2e 2e 20 20 20 20 20 52 75 6e 20 43  RGS...     Run C
17f40 4d 44 20 41 52 47 53 2e 2e 2e 20 69 6e 20 61 20  MD ARGS... in a 
17f50 73 79 73 74 65 6d 20 73 68 65 6c 6c 5c 6e 22 0a  system shell\n".
17f60 20 20 22 2e 73 68 6f 77 20 20 20 20 20 20 20 20    ".show        
17f70 20 20 20 20 20 20 20 20 20 20 53 68 6f 77 20 74            Show t
17f80 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65  he current value
17f90 73 20 66 6f 72 20 76 61 72 69 6f 75 73 20 73 65  s for various se
17fa0 74 74 69 6e 67 73 5c 6e 22 0a 20 20 22 2e 73 74  ttings\n".  ".st
17fb0 61 74 73 20 3f 6f 6e 7c 6f 66 66 3f 20 20 20 20  ats ?on|off?    
17fc0 20 20 20 20 53 68 6f 77 20 73 74 61 74 73 20 6f      Show stats o
17fd0 72 20 74 75 72 6e 20 73 74 61 74 73 20 6f 6e 20  r turn stats on 
17fe0 6f 72 20 6f 66 66 5c 6e 22 0a 20 20 22 2e 73 79  or off\n".  ".sy
17ff0 73 74 65 6d 20 43 4d 44 20 41 52 47 53 2e 2e 2e  stem CMD ARGS...
18000 20 20 20 20 52 75 6e 20 43 4d 44 20 41 52 47 53      Run CMD ARGS
18010 2e 2e 2e 20 69 6e 20 61 20 73 79 73 74 65 6d 20  ... in a system 
18020 73 68 65 6c 6c 5c 6e 22 0a 20 20 22 2e 74 61 62  shell\n".  ".tab
18030 6c 65 73 20 3f 54 41 42 4c 45 3f 20 20 20 20 20  les ?TABLE?     
18040 20 20 20 4c 69 73 74 20 6e 61 6d 65 73 20 6f 66     List names of
18050 20 74 61 62 6c 65 73 5c 6e 22 0a 20 20 22 20 20   tables\n".  "  
18060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18070 20 20 20 20 20 20 20 49 66 20 54 41 42 4c 45 20         If TABLE 
18080 73 70 65 63 69 66 69 65 64 2c 20 6f 6e 6c 79 20  specified, only 
18090 6c 69 73 74 20 74 61 62 6c 65 73 20 6d 61 74 63  list tables matc
180a0 68 69 6e 67 5c 6e 22 0a 20 20 22 20 20 20 20 20  hing\n".  "     
180b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
180c0 20 20 20 20 4c 49 4b 45 20 70 61 74 74 65 72 6e      LIKE pattern
180d0 20 54 41 42 4c 45 2e 5c 6e 22 0a 20 20 22 2e 74   TABLE.\n".  ".t
180e0 65 73 74 63 61 73 65 20 4e 41 4d 45 20 20 20 20  estcase NAME    
180f0 20 20 20 20 20 42 65 67 69 6e 20 72 65 64 69 72       Begin redir
18100 65 63 74 69 6e 67 20 6f 75 74 70 75 74 20 74 6f  ecting output to
18110 20 27 74 65 73 74 63 61 73 65 2d 6f 75 74 2e 74   'testcase-out.t
18120 78 74 27 5c 6e 22 0a 20 20 22 2e 74 69 6d 65 6f  xt'\n".  ".timeo
18130 75 74 20 4d 53 20 20 20 20 20 20 20 20 20 20 20  ut MS           
18140 20 54 72 79 20 6f 70 65 6e 69 6e 67 20 6c 6f 63   Try opening loc
18150 6b 65 64 20 74 61 62 6c 65 73 20 66 6f 72 20 4d  ked tables for M
18160 53 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 5c 6e  S milliseconds\n
18170 22 0a 20 20 22 2e 74 69 6d 65 72 20 6f 6e 7c 6f  ".  ".timer on|o
18180 66 66 20 20 20 20 20 20 20 20 20 20 54 75 72 6e  ff          Turn
18190 20 53 51 4c 20 74 69 6d 65 72 20 6f 6e 20 6f 72   SQL timer on or
181a0 20 6f 66 66 5c 6e 22 0a 20 20 22 2e 74 72 61 63   off\n".  ".trac
181b0 65 20 46 49 4c 45 7c 6f 66 66 20 20 20 20 20 20  e FILE|off      
181c0 20 20 4f 75 74 70 75 74 20 65 61 63 68 20 53 51    Output each SQ
181d0 4c 20 73 74 61 74 65 6d 65 6e 74 20 61 73 20 69  L statement as i
181e0 74 20 69 73 20 72 75 6e 5c 6e 22 0a 20 20 22 2e  t is run\n".  ".
181f0 76 66 73 69 6e 66 6f 20 3f 41 55 58 3f 20 20 20  vfsinfo ?AUX?   
18200 20 20 20 20 20 20 49 6e 66 6f 72 6d 61 74 69 6f        Informatio
18210 6e 20 61 62 6f 75 74 20 74 68 65 20 74 6f 70 2d  n about the top-
18220 6c 65 76 65 6c 20 56 46 53 5c 6e 22 0a 20 20 22  level VFS\n".  "
18230 2e 76 66 73 6c 69 73 74 20 20 20 20 20 20 20 20  .vfslist        
18240 20 20 20 20 20 20 20 4c 69 73 74 20 61 6c 6c 20         List all 
18250 61 76 61 69 6c 61 62 6c 65 20 56 46 53 65 73 5c  available VFSes\
18260 6e 22 0a 20 20 22 2e 76 66 73 6e 61 6d 65 20 3f  n".  ".vfsname ?
18270 41 55 58 3f 20 20 20 20 20 20 20 20 20 50 72 69  AUX?         Pri
18280 6e 74 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  nt the name of t
18290 68 65 20 56 46 53 20 73 74 61 63 6b 5c 6e 22 0a  he VFS stack\n".
182a0 20 20 22 2e 77 69 64 74 68 20 4e 55 4d 31 20 4e    ".width NUM1 N
182b0 55 4d 32 20 2e 2e 2e 20 20 20 53 65 74 20 63 6f  UM2 ...   Set co
182c0 6c 75 6d 6e 20 77 69 64 74 68 73 20 66 6f 72 20  lumn widths for 
182d0 5c 22 63 6f 6c 75 6d 6e 5c 22 20 6d 6f 64 65 5c  \"column\" mode\
182e0 6e 22 0a 20 20 22 20 20 20 20 20 20 20 20 20 20  n".  "          
182f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4e                 N
18300 65 67 61 74 69 76 65 20 76 61 6c 75 65 73 20 72  egative values r
18310 69 67 68 74 2d 6a 75 73 74 69 66 79 5c 6e 22 0a  ight-justify\n".
18320 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  ;..#if defined(S
18330 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 45 53  QLITE_ENABLE_SES
18340 53 49 4f 4e 29 0a 2f 2a 0a 2a 2a 20 50 72 69 6e  SION)./*.** Prin
18350 74 20 68 65 6c 70 20 69 6e 66 6f 72 6d 61 74 69  t help informati
18360 6f 6e 20 66 6f 72 20 74 68 65 20 22 2e 73 65 73  on for the ".ses
18370 73 69 6f 6e 73 22 20 63 6f 6d 6d 61 6e 64 0a 2a  sions" command.*
18380 2f 0a 76 6f 69 64 20 73 65 73 73 69 6f 6e 5f 68  /.void session_h
18390 65 6c 70 28 53 68 65 6c 6c 53 74 61 74 65 20 2a  elp(ShellState *
183a0 70 29 7b 0a 20 20 72 61 77 5f 70 72 69 6e 74 66  p){.  raw_printf
183b0 28 70 2d 3e 6f 75 74 2c 0a 20 20 20 20 22 2e 73  (p->out,.    ".s
183c0 65 73 73 69 6f 6e 20 3f 4e 41 4d 45 3f 20 53 55  ession ?NAME? SU
183d0 42 43 4f 4d 4d 41 4e 44 20 3f 41 52 47 53 2e 2e  BCOMMAND ?ARGS..
183e0 2e 3f 5c 6e 22 0a 20 20 20 20 22 49 66 20 3f 4e  .?\n".    "If ?N
183f0 41 4d 45 3f 20 69 73 20 6f 6d 69 74 74 65 64 2c  AME? is omitted,
18400 20 74 68 65 20 66 69 72 73 74 20 64 65 66 69 6e   the first defin
18410 65 64 20 73 65 73 73 69 6f 6e 20 69 73 20 75 73  ed session is us
18420 65 64 2e 5c 6e 22 0a 20 20 20 20 22 53 75 62 63  ed.\n".    "Subc
18430 6f 6d 6d 61 6e 64 73 3a 5c 6e 22 0a 20 20 20 20  ommands:\n".    
18440 22 20 20 20 61 74 74 61 63 68 20 54 41 42 4c 45  "   attach TABLE
18450 20 20 20 20 20 20 20 20 20 20 20 20 20 41 74 74               Att
18460 61 63 68 20 54 41 42 4c 45 5c 6e 22 0a 20 20 20  ach TABLE\n".   
18470 20 22 20 20 20 63 68 61 6e 67 65 73 65 74 20 46   "   changeset F
18480 49 4c 45 20 20 20 20 20 20 20 20 20 20 20 57 72  ILE           Wr
18490 69 74 65 20 61 20 63 68 61 6e 67 65 73 65 74 20  ite a changeset 
184a0 69 6e 74 6f 20 46 49 4c 45 5c 6e 22 0a 20 20 20  into FILE\n".   
184b0 20 22 20 20 20 63 6c 6f 73 65 20 20 20 20 20 20   "   close      
184c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 43 6c                Cl
184d0 6f 73 65 20 6f 6e 65 20 73 65 73 73 69 6f 6e 5c  ose one session\
184e0 6e 22 0a 20 20 20 20 22 20 20 20 65 6e 61 62 6c  n".    "   enabl
184f0 65 20 3f 42 4f 4f 4c 45 41 4e 3f 20 20 20 20 20  e ?BOOLEAN?     
18500 20 20 20 20 53 65 74 20 6f 72 20 71 75 65 72 79      Set or query
18510 20 74 68 65 20 65 6e 61 62 6c 65 20 62 69 74 5c   the enable bit\
18520 6e 22 0a 20 20 20 20 22 20 20 20 66 69 6c 74 65  n".    "   filte
18530 72 20 47 4c 4f 42 2e 2e 2e 20 20 20 20 20 20 20  r GLOB...       
18540 20 20 20 20 52 65 6a 65 63 74 20 74 61 62 6c 65      Reject table
18550 73 20 6d 61 74 63 68 69 6e 67 20 47 4c 4f 42 73  s matching GLOBs
18560 5c 6e 22 0a 20 20 20 20 22 20 20 20 69 6e 64 69  \n".    "   indi
18570 72 65 63 74 20 3f 42 4f 4f 4c 45 41 4e 3f 20 20  rect ?BOOLEAN?  
18580 20 20 20 20 20 4d 61 72 6b 20 6f 72 20 71 75 65       Mark or que
18590 72 79 20 74 68 65 20 69 6e 64 69 72 65 63 74 20  ry the indirect 
185a0 73 74 61 74 75 73 5c 6e 22 0a 20 20 20 20 22 20  status\n".    " 
185b0 20 20 69 73 65 6d 70 74 79 20 20 20 20 20 20 20    isempty       
185c0 20 20 20 20 20 20 20 20 20 20 20 51 75 65 72 79             Query
185d0 20 77 68 65 74 68 65 72 20 74 68 65 20 73 65 73   whether the ses
185e0 73 69 6f 6e 20 69 73 20 65 6d 70 74 79 5c 6e 22  sion is empty\n"
185f0 0a 20 20 20 20 22 20 20 20 6c 69 73 74 20 20 20  .    "   list   
18600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18610 20 20 4c 69 73 74 20 63 75 72 72 65 6e 74 6c 79    List currently
18620 20 6f 70 65 6e 20 73 65 73 73 69 6f 6e 20 6e 61   open session na
18630 6d 65 73 5c 6e 22 0a 20 20 20 20 22 20 20 20 6f  mes\n".    "   o
18640 70 65 6e 20 44 42 20 4e 41 4d 45 20 20 20 20 20  pen DB NAME     
18650 20 20 20 20 20 20 20 20 4f 70 65 6e 20 61 20 6e          Open a n
18660 65 77 20 73 65 73 73 69 6f 6e 20 6f 6e 20 44 42  ew session on DB
18670 5c 6e 22 0a 20 20 20 20 22 20 20 20 70 61 74 63  \n".    "   patc
18680 68 73 65 74 20 46 49 4c 45 20 20 20 20 20 20 20  hset FILE       
18690 20 20 20 20 20 57 72 69 74 65 20 61 20 70 61 74       Write a pat
186a0 63 68 73 65 74 20 69 6e 74 6f 20 46 49 4c 45 5c  chset into FILE\
186b0 6e 22 0a 20 20 29 3b 0a 7d 0a 23 65 6e 64 69 66  n".  );.}.#endif
186c0 0a 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65  .../* Forward re
186d0 66 65 72 65 6e 63 65 20 2a 2f 0a 73 74 61 74 69  ference */.stati
186e0 63 20 69 6e 74 20 70 72 6f 63 65 73 73 5f 69 6e  c int process_in
186f0 70 75 74 28 53 68 65 6c 6c 53 74 61 74 65 20 2a  put(ShellState *
18700 70 2c 20 46 49 4c 45 20 2a 69 6e 29 3b 0a 0a 2f  p, FILE *in);../
18710 2a 0a 2a 2a 20 52 65 61 64 20 74 68 65 20 63 6f  *.** Read the co
18720 6e 74 65 6e 74 20 6f 66 20 66 69 6c 65 20 7a 4e  ntent of file zN
18730 61 6d 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20  ame into memory 
18740 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71  obtained from sq
18750 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 29  lite3_malloc64()
18760 0a 2a 2a 20 61 6e 64 20 72 65 74 75 72 6e 20 61  .** and return a
18770 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
18780 62 75 66 66 65 72 2e 20 54 68 65 20 63 61 6c 6c  buffer. The call
18790 65 72 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  er is responsibl
187a0 65 20 66 6f 72 20 66 72 65 65 69 6e 67 0a 2a 2a  e for freeing.**
187b0 20 74 68 65 20 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a   the memory..**.
187c0 2a 2a 20 49 66 20 70 61 72 61 6d 65 74 65 72 20  ** If parameter 
187d0 70 6e 42 79 74 65 20 69 73 20 6e 6f 74 20 4e 55  pnByte is not NU
187e0 4c 4c 2c 20 28 2a 70 6e 42 79 74 65 29 20 69 73  LL, (*pnByte) is
187f0 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62   set to the numb
18800 65 72 20 6f 66 20 62 79 74 65 73 0a 2a 2a 20 72  er of bytes.** r
18810 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 63  ead..**.** For c
18820 6f 6e 76 65 6e 69 65 6e 63 65 2c 20 61 20 6e 75  onvenience, a nu
18830 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 20 62 79 74  l-terminator byt
18840 65 20 69 73 20 61 6c 77 61 79 73 20 61 70 70 65  e is always appe
18850 6e 64 65 64 20 74 6f 20 74 68 65 20 64 61 74 61  nded to the data
18860 20 72 65 61 64 0a 2a 2a 20 66 72 6f 6d 20 74 68   read.** from th
18870 65 20 66 69 6c 65 20 62 65 66 6f 72 65 20 74 68  e file before th
18880 65 20 62 75 66 66 65 72 20 69 73 20 72 65 74 75  e buffer is retu
18890 72 6e 65 64 2e 20 54 68 69 73 20 62 79 74 65 20  rned. This byte 
188a0 69 73 20 6e 6f 74 20 69 6e 63 6c 75 64 65 64 20  is not included 
188b0 69 6e 0a 2a 2a 20 74 68 65 20 66 69 6e 61 6c 20  in.** the final 
188c0 76 61 6c 75 65 20 6f 66 20 28 2a 70 6e 42 79 74  value of (*pnByt
188d0 65 29 2c 20 69 66 20 61 70 70 6c 69 63 61 62 6c  e), if applicabl
188e0 65 2e 0a 2a 2a 0a 2a 2a 20 4e 55 4c 4c 20 69 73  e..**.** NULL is
188f0 20 72 65 74 75 72 6e 65 64 20 69 66 20 61 6e 79   returned if any
18900 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e   error is encoun
18910 74 65 72 65 64 2e 20 54 68 65 20 66 69 6e 61 6c  tered. The final
18920 20 76 61 6c 75 65 20 6f 66 20 2a 70 6e 42 79 74   value of *pnByt
18930 65 0a 2a 2a 20 69 73 20 75 6e 64 65 66 69 6e 65  e.** is undefine
18940 64 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a  d in this case..
18950 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a  */.static char *
18960 72 65 61 64 46 69 6c 65 28 63 6f 6e 73 74 20 63  readFile(const c
18970 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 69 6e 74 20  har *zName, int 
18980 2a 70 6e 42 79 74 65 29 7b 0a 20 20 46 49 4c 45  *pnByte){.  FILE
18990 20 2a 69 6e 20 3d 20 66 6f 70 65 6e 28 7a 4e 61   *in = fopen(zNa
189a0 6d 65 2c 20 22 72 62 22 29 3b 0a 20 20 6c 6f 6e  me, "rb");.  lon
189b0 67 20 6e 49 6e 3b 0a 20 20 73 69 7a 65 5f 74 20  g nIn;.  size_t 
189c0 6e 52 65 61 64 3b 0a 20 20 63 68 61 72 20 2a 70  nRead;.  char *p
189d0 42 75 66 3b 0a 20 20 69 66 28 20 69 6e 3d 3d 30  Buf;.  if( in==0
189e0 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 66   ) return 0;.  f
189f0 73 65 65 6b 28 69 6e 2c 20 30 2c 20 53 45 45 4b  seek(in, 0, SEEK
18a00 5f 45 4e 44 29 3b 0a 20 20 6e 49 6e 20 3d 20 66  _END);.  nIn = f
18a10 74 65 6c 6c 28 69 6e 29 3b 0a 20 20 72 65 77 69  tell(in);.  rewi
18a20 6e 64 28 69 6e 29 3b 0a 20 20 70 42 75 66 20 3d  nd(in);.  pBuf =
18a30 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36   sqlite3_malloc6
18a40 34 28 20 6e 49 6e 2b 31 20 29 3b 0a 20 20 69 66  4( nIn+1 );.  if
18a50 28 20 70 42 75 66 3d 3d 30 20 29 20 72 65 74 75  ( pBuf==0 ) retu
18a60 72 6e 20 30 3b 0a 20 20 6e 52 65 61 64 20 3d 20  rn 0;.  nRead = 
18a70 66 72 65 61 64 28 70 42 75 66 2c 20 6e 49 6e 2c  fread(pBuf, nIn,
18a80 20 31 2c 20 69 6e 29 3b 0a 20 20 66 63 6c 6f 73   1, in);.  fclos
18a90 65 28 69 6e 29 3b 0a 20 20 69 66 28 20 6e 52 65  e(in);.  if( nRe
18aa0 61 64 21 3d 31 20 29 7b 0a 20 20 20 20 73 71 6c  ad!=1 ){.    sql
18ab0 69 74 65 33 5f 66 72 65 65 28 70 42 75 66 29 3b  ite3_free(pBuf);
18ac0 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
18ad0 20 7d 0a 20 20 70 42 75 66 5b 6e 49 6e 5d 20 3d   }.  pBuf[nIn] =
18ae0 20 30 3b 0a 20 20 69 66 28 20 70 6e 42 79 74 65   0;.  if( pnByte
18af0 20 29 20 2a 70 6e 42 79 74 65 20 3d 20 6e 49 6e   ) *pnByte = nIn
18b00 3b 0a 20 20 72 65 74 75 72 6e 20 70 42 75 66 3b  ;.  return pBuf;
18b10 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  .}..#if defined(
18b20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 45  SQLITE_ENABLE_SE
18b30 53 53 49 4f 4e 29 0a 2f 2a 0a 2a 2a 20 43 6c 6f  SSION)./*.** Clo
18b40 73 65 20 61 20 73 69 6e 67 6c 65 20 4f 70 65 6e  se a single Open
18b50 53 65 73 73 69 6f 6e 20 6f 62 6a 65 63 74 20 61  Session object a
18b60 6e 64 20 72 65 6c 65 61 73 65 20 61 6c 6c 20 6f  nd release all o
18b70 66 20 69 74 73 20 61 73 73 6f 63 69 61 74 65 64  f its associated
18b80 0a 2a 2a 20 72 65 73 6f 75 72 63 65 73 2e 0a 2a  .** resources..*
18b90 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65  /.static void se
18ba0 73 73 69 6f 6e 5f 63 6c 6f 73 65 28 4f 70 65 6e  ssion_close(Open
18bb0 53 65 73 73 69 6f 6e 20 2a 70 53 65 73 73 69 6f  Session *pSessio
18bc0 6e 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73  n){.  int i;.  s
18bd0 71 6c 69 74 65 33 73 65 73 73 69 6f 6e 5f 64 65  qlite3session_de
18be0 6c 65 74 65 28 70 53 65 73 73 69 6f 6e 2d 3e 70  lete(pSession->p
18bf0 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
18c00 65 28 70 53 65 73 73 69 6f 6e 2d 3e 7a 4e 61 6d  e(pSession->zNam
18c10 65 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  e);.  for(i=0; i
18c20 3c 70 53 65 73 73 69 6f 6e 2d 3e 6e 46 69 6c 74  <pSession->nFilt
18c30 65 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71  er; i++){.    sq
18c40 6c 69 74 65 33 5f 66 72 65 65 28 70 53 65 73 73  lite3_free(pSess
18c50 69 6f 6e 2d 3e 61 7a 46 69 6c 74 65 72 5b 69 5d  ion->azFilter[i]
18c60 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
18c70 5f 66 72 65 65 28 70 53 65 73 73 69 6f 6e 2d 3e  _free(pSession->
18c80 61 7a 46 69 6c 74 65 72 29 3b 0a 20 20 6d 65 6d  azFilter);.  mem
18c90 73 65 74 28 70 53 65 73 73 69 6f 6e 2c 20 30 2c  set(pSession, 0,
18ca0 20 73 69 7a 65 6f 66 28 4f 70 65 6e 53 65 73 73   sizeof(OpenSess
18cb0 69 6f 6e 29 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a  ion));.}.#endif.
18cc0 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6c 6c  ./*.** Close all
18cd0 20 4f 70 65 6e 53 65 73 73 69 6f 6e 20 6f 62 6a   OpenSession obj
18ce0 65 63 74 73 20 61 6e 64 20 72 65 6c 65 61 73 65  ects and release
18cf0 20 61 6c 6c 20 61 73 73 6f 63 69 61 74 65 64 20   all associated 
18d00 72 65 73 6f 75 72 63 65 73 2e 0a 2a 2f 0a 23 69  resources..*/.#i
18d10 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
18d20 5f 45 4e 41 42 4c 45 5f 53 45 53 53 49 4f 4e 29  _ENABLE_SESSION)
18d30 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 73  .static void ses
18d40 73 69 6f 6e 5f 63 6c 6f 73 65 5f 61 6c 6c 28 53  sion_close_all(S
18d50 68 65 6c 6c 53 74 61 74 65 20 2a 70 29 7b 0a 20  hellState *p){. 
18d60 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d   int i;.  for(i=
18d70 30 3b 20 69 3c 70 2d 3e 6e 53 65 73 73 69 6f 6e  0; i<p->nSession
18d80 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 65 73 73  ; i++){.    sess
18d90 69 6f 6e 5f 63 6c 6f 73 65 28 26 70 2d 3e 61 53  ion_close(&p->aS
18da0 65 73 73 69 6f 6e 5b 69 5d 29 3b 0a 20 20 7d 0a  ession[i]);.  }.
18db0 20 20 70 2d 3e 6e 53 65 73 73 69 6f 6e 20 3d 20    p->nSession = 
18dc0 30 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66  0;.}.#else.# def
18dd0 69 6e 65 20 73 65 73 73 69 6f 6e 5f 63 6c 6f 73  ine session_clos
18de0 65 5f 61 6c 6c 28 58 29 0a 23 65 6e 64 69 66 0a  e_all(X).#endif.
18df0 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74  ./*.** Implement
18e00 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 78 46 69  ation of the xFi
18e10 6c 74 65 72 20 66 75 6e 63 74 69 6f 6e 20 66 6f  lter function fo
18e20 72 20 61 6e 20 6f 70 65 6e 20 73 65 73 73 69 6f  r an open sessio
18e30 6e 2e 20 20 4f 6d 69 74 0a 2a 2a 20 61 6e 79 20  n.  Omit.** any 
18e40 74 61 62 6c 65 73 20 6e 61 6d 65 64 20 62 79 20  tables named by 
18e50 22 2e 73 65 73 73 69 6f 6e 20 66 69 6c 74 65 72  ".session filter
18e60 22 20 62 75 74 20 6c 65 74 20 61 6c 6c 20 6f 74  " but let all ot
18e70 68 65 72 20 74 61 62 6c 65 20 74 68 72 6f 75 67  her table throug
18e80 68 2e 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65  h..*/.#if define
18e90 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  d(SQLITE_ENABLE_
18ea0 53 45 53 53 49 4f 4e 29 0a 73 74 61 74 69 63 20  SESSION).static 
18eb0 69 6e 74 20 73 65 73 73 69 6f 6e 5f 66 69 6c 74  int session_filt
18ec0 65 72 28 76 6f 69 64 20 2a 70 43 74 78 2c 20 63  er(void *pCtx, c
18ed0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62 29  onst char *zTab)
18ee0 7b 0a 20 20 4f 70 65 6e 53 65 73 73 69 6f 6e 20  {.  OpenSession 
18ef0 2a 70 53 65 73 73 69 6f 6e 20 3d 20 28 4f 70 65  *pSession = (Ope
18f00 6e 53 65 73 73 69 6f 6e 2a 29 70 43 74 78 3b 0a  nSession*)pCtx;.
18f10 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69    int i;.  for(i
18f20 3d 30 3b 20 69 3c 70 53 65 73 73 69 6f 6e 2d 3e  =0; i<pSession->
18f30 6e 46 69 6c 74 65 72 3b 20 69 2b 2b 29 7b 0a 20  nFilter; i++){. 
18f40 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73     if( sqlite3_s
18f50 74 72 67 6c 6f 62 28 70 53 65 73 73 69 6f 6e 2d  trglob(pSession-
18f60 3e 61 7a 46 69 6c 74 65 72 5b 69 5d 2c 20 7a 54  >azFilter[i], zT
18f70 61 62 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ab)==0 ) return 
18f80 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
18f90 31 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  1;.}.#endif../*.
18fa0 2a 2a 20 54 72 79 20 74 6f 20 64 65 64 75 63 65  ** Try to deduce
18fb0 20 74 68 65 20 74 79 70 65 20 6f 66 20 66 69 6c   the type of fil
18fc0 65 20 66 6f 72 20 7a 4e 61 6d 65 20 62 61 73 65  e for zName base
18fd0 64 20 6f 6e 20 69 74 73 20 63 6f 6e 74 65 6e 74  d on its content
18fe0 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 6f 6e 65  .  Return.** one
18ff0 20 6f 66 20 74 68 65 20 53 48 45 4c 4c 5f 4f 50   of the SHELL_OP
19000 45 4e 5f 2a 20 63 6f 6e 73 74 61 6e 74 73 2e 0a  EN_* constants..
19010 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 65  */.static int de
19020 64 75 63 65 44 61 74 61 62 61 73 65 54 79 70 65  duceDatabaseType
19030 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61  (const char *zNa
19040 6d 65 29 7b 0a 20 20 46 49 4c 45 20 2a 66 20 3d  me){.  FILE *f =
19050 20 66 6f 70 65 6e 28 7a 4e 61 6d 65 2c 20 22 72   fopen(zName, "r
19060 62 22 29 3b 0a 20 20 73 69 7a 65 5f 74 20 6e 3b  b");.  size_t n;
19070 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 48 45 4c  .  int rc = SHEL
19080 4c 5f 4f 50 45 4e 5f 55 4e 53 50 45 43 3b 0a 20  L_OPEN_UNSPEC;. 
19090 20 63 68 61 72 20 7a 42 75 66 5b 31 30 30 5d 3b   char zBuf[100];
190a0 0a 20 20 69 66 28 20 66 3d 3d 30 20 29 20 72 65  .  if( f==0 ) re
190b0 74 75 72 6e 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f  turn SHELL_OPEN_
190c0 4e 4f 52 4d 41 4c 3b 0a 20 20 66 73 65 65 6b 28  NORMAL;.  fseek(
190d0 66 2c 20 2d 32 35 2c 20 53 45 45 4b 5f 45 4e 44  f, -25, SEEK_END
190e0 29 3b 0a 20 20 6e 20 3d 20 66 72 65 61 64 28 7a  );.  n = fread(z
190f0 42 75 66 2c 20 32 35 2c 20 31 2c 20 66 29 3b 0a  Buf, 25, 1, f);.
19100 20 20 69 66 28 20 6e 3d 3d 31 20 26 26 20 6d 65    if( n==1 && me
19110 6d 63 6d 70 28 7a 42 75 66 2c 20 22 53 74 61 72  mcmp(zBuf, "Star
19120 74 2d 4f 66 2d 53 51 4c 69 74 65 33 2d 22 2c 20  t-Of-SQLite3-", 
19130 31 37 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63  17)==0 ){.    rc
19140 20 3d 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f 41 50   = SHELL_OPEN_AP
19150 50 45 4e 44 56 46 53 3b 0a 20 20 7d 65 6c 73 65  PENDVFS;.  }else
19160 7b 0a 20 20 20 20 66 73 65 65 6b 28 66 2c 20 2d  {.    fseek(f, -
19170 32 32 2c 20 53 45 45 4b 5f 45 4e 44 29 3b 0a 20  22, SEEK_END);. 
19180 20 20 20 6e 20 3d 20 66 72 65 61 64 28 7a 42 75     n = fread(zBu
19190 66 2c 20 32 32 2c 20 31 2c 20 66 29 3b 0a 20 20  f, 22, 1, f);.  
191a0 20 20 69 66 28 20 6e 3d 3d 31 20 26 26 20 7a 42    if( n==1 && zB
191b0 75 66 5b 30 5d 3d 3d 30 78 35 30 20 26 26 20 7a  uf[0]==0x50 && z
191c0 42 75 66 5b 31 5d 3d 3d 30 78 34 62 20 26 26 20  Buf[1]==0x4b && 
191d0 7a 42 75 66 5b 32 5d 3d 3d 30 78 30 35 0a 20 20  zBuf[2]==0x05.  
191e0 20 20 20 20 20 26 26 20 7a 42 75 66 5b 33 5d 3d       && zBuf[3]=
191f0 3d 30 78 30 36 20 29 7b 0a 20 20 20 20 20 20 72  =0x06 ){.      r
19200 63 20 3d 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f 5a  c = SHELL_OPEN_Z
19210 49 50 46 49 4c 45 3b 0a 20 20 20 20 7d 0a 20 20  IPFILE;.    }.  
19220 7d 0a 20 20 66 63 6c 6f 73 65 28 66 29 3b 0a 20  }.  fclose(f);. 
19230 20 72 65 74 75 72 6e 20 72 63 3b 20 20 0a 7d 0a   return rc;  .}.
19240 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65  ./*.** Make sure
19250 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
19260 20 6f 70 65 6e 2e 20 20 49 66 20 69 74 20 69 73   open.  If it is
19270 20 6e 6f 74 2c 20 74 68 65 6e 20 6f 70 65 6e 20   not, then open 
19280 69 74 2e 20 20 49 66 0a 2a 2a 20 74 68 65 20 64  it.  If.** the d
19290 61 74 61 62 61 73 65 20 66 61 69 6c 73 20 74 6f  atabase fails to
192a0 20 6f 70 65 6e 2c 20 70 72 69 6e 74 20 61 6e 20   open, print an 
192b0 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 61 6e  error message an
192c0 64 20 65 78 69 74 2e 0a 2a 2f 0a 73 74 61 74 69  d exit..*/.stati
192d0 63 20 76 6f 69 64 20 6f 70 65 6e 5f 64 62 28 53  c void open_db(S
192e0 68 65 6c 6c 53 74 61 74 65 20 2a 70 2c 20 69 6e  hellState *p, in
192f0 74 20 6b 65 65 70 41 6c 69 76 65 29 7b 0a 20 20  t keepAlive){.  
19300 69 66 28 20 70 2d 3e 64 62 3d 3d 30 20 29 7b 0a  if( p->db==0 ){.
19310 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 69 74      sqlite3_init
19320 69 61 6c 69 7a 65 28 29 3b 0a 20 20 20 20 69 66  ialize();.    if
19330 28 20 70 2d 3e 6f 70 65 6e 4d 6f 64 65 3d 3d 53  ( p->openMode==S
19340 48 45 4c 4c 5f 4f 50 45 4e 5f 55 4e 53 50 45 43  HELL_OPEN_UNSPEC
19350 20 26 26 20 61 63 63 65 73 73 28 70 2d 3e 7a 44   && access(p->zD
19360 62 46 69 6c 65 6e 61 6d 65 2c 30 29 3d 3d 30 20  bFilename,0)==0 
19370 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6f 70 65 6e  ){.      p->open
19380 4d 6f 64 65 20 3d 20 64 65 64 75 63 65 44 61 74  Mode = deduceDat
19390 61 62 61 73 65 54 79 70 65 28 70 2d 3e 7a 44 62  abaseType(p->zDb
193a0 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 7d  Filename);.    }
193b0 0a 20 20 20 20 73 77 69 74 63 68 28 20 70 2d 3e  .    switch( p->
193c0 6f 70 65 6e 4d 6f 64 65 20 29 7b 0a 20 20 20 20  openMode ){.    
193d0 20 20 63 61 73 65 20 53 48 45 4c 4c 5f 4f 50 45    case SHELL_OPE
193e0 4e 5f 41 50 50 45 4e 44 56 46 53 3a 20 7b 0a 20  N_APPENDVFS: {. 
193f0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6f         sqlite3_o
19400 70 65 6e 5f 76 32 28 70 2d 3e 7a 44 62 46 69 6c  pen_v2(p->zDbFil
19410 65 6e 61 6d 65 2c 20 26 70 2d 3e 64 62 2c 20 0a  ename, &p->db, .
19420 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
19430 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
19440 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45  |SQLITE_OPEN_CRE
19450 41 54 45 2c 20 22 61 70 6e 64 76 66 73 22 29 3b  ATE, "apndvfs");
19460 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
19470 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61        }.      ca
19480 73 65 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f 5a 49  se SHELL_OPEN_ZI
19490 50 46 49 4c 45 3a 20 7b 0a 20 20 20 20 20 20 20  PFILE: {.       
194a0 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 22 3a   sqlite3_open(":
194b0 6d 65 6d 6f 72 79 3a 22 2c 20 26 70 2d 3e 64 62  memory:", &p->db
194c0 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
194d0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
194e0 63 61 73 65 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f  case SHELL_OPEN_
194f0 55 4e 53 50 45 43 3a 0a 20 20 20 20 20 20 63 61  UNSPEC:.      ca
19500 73 65 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f 4e 4f  se SHELL_OPEN_NO
19510 52 4d 41 4c 3a 20 7b 0a 20 20 20 20 20 20 20 20  RMAL: {.        
19520 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 70 2d 3e  sqlite3_open(p->
19530 7a 44 62 46 69 6c 65 6e 61 6d 65 2c 20 26 70 2d  zDbFilename, &p-
19540 3e 64 62 29 3b 0a 20 20 20 20 20 20 20 20 62 72  >db);.        br
19550 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
19560 20 7d 0a 20 20 20 20 67 6c 6f 62 61 6c 44 62 20   }.    globalDb 
19570 3d 20 70 2d 3e 64 62 3b 0a 20 20 20 20 69 66 28  = p->db;.    if(
19580 20 70 2d 3e 64 62 3d 3d 30 20 7c 7c 20 53 51 4c   p->db==0 || SQL
19590 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 5f  ITE_OK!=sqlite3_
195a0 65 72 72 63 6f 64 65 28 70 2d 3e 64 62 29 20 29  errcode(p->db) )
195b0 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69  {.      utf8_pri
195c0 6e 74 66 28 73 74 64 65 72 72 2c 22 45 72 72 6f  ntf(stderr,"Erro
195d0 72 3a 20 75 6e 61 62 6c 65 20 74 6f 20 6f 70 65  r: unable to ope
195e0 6e 20 64 61 74 61 62 61 73 65 20 5c 22 25 73 5c  n database \"%s\
195f0 22 3a 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20  ": %s\n",.      
19600 20 20 20 20 70 2d 3e 7a 44 62 46 69 6c 65 6e 61      p->zDbFilena
19610 6d 65 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d  me, sqlite3_errm
19620 73 67 28 70 2d 3e 64 62 29 29 3b 0a 20 20 20 20  sg(p->db));.    
19630 20 20 69 66 28 20 6b 65 65 70 41 6c 69 76 65 20    if( keepAlive 
19640 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20  ) return;.      
19650 65 78 69 74 28 31 29 3b 0a 20 20 20 20 7d 0a 23  exit(1);.    }.#
19660 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
19670 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f  IT_LOAD_EXTENSIO
19680 4e 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 65 6e  N.    sqlite3_en
19690 61 62 6c 65 5f 6c 6f 61 64 5f 65 78 74 65 6e 73  able_load_extens
196a0 69 6f 6e 28 70 2d 3e 64 62 2c 20 31 29 3b 0a 23  ion(p->db, 1);.#
196b0 65 6e 64 69 66 0a 20 20 20 20 73 71 6c 69 74 65  endif.    sqlite
196c0 33 5f 66 69 6c 65 69 6f 5f 69 6e 69 74 28 70 2d  3_fileio_init(p-
196d0 3e 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  >db, 0, 0);.    
196e0 73 71 6c 69 74 65 33 5f 73 68 61 74 68 72 65 65  sqlite3_shathree
196f0 5f 69 6e 69 74 28 70 2d 3e 64 62 2c 20 30 2c 20  _init(p->db, 0, 
19700 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  0);.    sqlite3_
19710 63 6f 6d 70 6c 65 74 69 6f 6e 5f 69 6e 69 74 28  completion_init(
19720 70 2d 3e 64 62 2c 20 30 2c 20 30 29 3b 0a 23 69  p->db, 0, 0);.#i
19730 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 56 45  fdef SQLITE_HAVE
19740 5f 5a 4c 49 42 0a 20 20 20 20 73 71 6c 69 74 65  _ZLIB.    sqlite
19750 33 5f 7a 69 70 66 69 6c 65 5f 69 6e 69 74 28 70  3_zipfile_init(p
19760 2d 3e 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20 20  ->db, 0, 0);.   
19770 20 73 71 6c 69 74 65 33 5f 73 71 6c 61 72 5f 69   sqlite3_sqlar_i
19780 6e 69 74 28 70 2d 3e 64 62 2c 20 30 2c 20 30 29  nit(p->db, 0, 0)
19790 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 73 71 6c  ;.#endif.    sql
197a0 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
197b0 74 69 6f 6e 28 70 2d 3e 64 62 2c 20 22 73 68 65  tion(p->db, "she
197c0 6c 6c 5f 61 64 64 5f 73 63 68 65 6d 61 22 2c 20  ll_add_schema", 
197d0 33 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  3, SQLITE_UTF8, 
197e0 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
197f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
19800 68 65 6c 6c 41 64 64 53 63 68 65 6d 61 4e 61 6d  hellAddSchemaNam
19810 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71  e, 0, 0);.    sq
19820 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
19830 63 74 69 6f 6e 28 70 2d 3e 64 62 2c 20 22 73 68  ction(p->db, "sh
19840 65 6c 6c 5f 6d 6f 64 75 6c 65 5f 73 63 68 65 6d  ell_module_schem
19850 61 22 2c 20 31 2c 20 53 51 4c 49 54 45 5f 55 54  a", 1, SQLITE_UT
19860 46 38 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20  F8, 0,.         
19870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19880 20 20 20 73 68 65 6c 6c 4d 6f 64 75 6c 65 53 63     shellModuleSc
19890 68 65 6d 61 2c 20 30 2c 20 30 29 3b 0a 20 20 20  hema, 0, 0);.   
198a0 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
198b0 66 75 6e 63 74 69 6f 6e 28 70 2d 3e 64 62 2c 20  function(p->db, 
198c0 22 73 68 65 6c 6c 5f 70 75 74 73 6e 6c 22 2c 20  "shell_putsnl", 
198d0 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  1, SQLITE_UTF8, 
198e0 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  p,.             
198f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
19900 68 65 6c 6c 50 75 74 73 46 75 6e 63 2c 20 30 2c  hellPutsFunc, 0,
19910 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e   0);.    if( p->
19920 6f 70 65 6e 4d 6f 64 65 3d 3d 53 48 45 4c 4c 5f  openMode==SHELL_
19930 4f 50 45 4e 5f 5a 49 50 46 49 4c 45 20 29 7b 0a  OPEN_ZIPFILE ){.
19940 20 20 20 20 20 20 63 68 61 72 20 2a 7a 53 71 6c        char *zSql
19950 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
19960 74 66 28 0a 20 20 20 20 20 20 20 20 20 22 43 52  tf(.         "CR
19970 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42  EATE VIRTUAL TAB
19980 4c 45 20 7a 69 70 20 55 53 49 4e 47 20 7a 69 70  LE zip USING zip
19990 66 69 6c 65 28 25 51 29 3b 22 2c 20 70 2d 3e 7a  file(%Q);", p->z
199a0 44 62 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20  DbFilename);.   
199b0 20 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28     sqlite3_exec(
199c0 70 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 30 2c 20  p->db, zSql, 0, 
199d0 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  0, 0);.      sql
199e0 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b  ite3_free(zSql);
199f0 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 69  .    }.  }.}..#i
19a00 66 20 48 41 56 45 5f 52 45 41 44 4c 49 4e 45 20  f HAVE_READLINE 
19a10 7c 7c 20 48 41 56 45 5f 45 44 49 54 4c 49 4e 45  || HAVE_EDITLINE
19a20 0a 2f 2a 0a 2a 2a 20 52 65 61 64 6c 69 6e 65 20  ./*.** Readline 
19a30 63 6f 6d 70 6c 65 74 69 6f 6e 20 63 61 6c 6c 62  completion callb
19a40 61 63 6b 73 0a 2a 2f 0a 73 74 61 74 69 63 20 63  acks.*/.static c
19a50 68 61 72 20 2a 72 65 61 64 6c 69 6e 65 5f 63 6f  har *readline_co
19a60 6d 70 6c 65 74 69 6f 6e 5f 67 65 6e 65 72 61 74  mpletion_generat
19a70 6f 72 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 74  or(const char *t
19a80 65 78 74 2c 20 69 6e 74 20 73 74 61 74 65 29 7b  ext, int state){
19a90 0a 20 20 73 74 61 74 69 63 20 73 71 6c 69 74 65  .  static sqlite
19aa0 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20  3_stmt *pStmt = 
19ab0 30 3b 0a 20 20 63 68 61 72 20 2a 7a 52 65 74 3b  0;.  char *zRet;
19ac0 0a 20 20 69 66 28 20 73 74 61 74 65 3d 3d 30 20  .  if( state==0 
19ad0 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 71  ){.    char *zSq
19ae0 6c 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  l;.    sqlite3_f
19af0 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a  inalize(pStmt);.
19b00 20 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74      zSql = sqlit
19b10 65 33 5f 6d 70 72 69 6e 74 66 28 22 53 45 4c 45  e3_mprintf("SELE
19b20 43 54 20 44 49 53 54 49 4e 43 54 20 63 61 6e 64  CT DISTINCT cand
19b30 69 64 61 74 65 20 43 4f 4c 4c 41 54 45 20 6e 6f  idate COLLATE no
19b40 63 61 73 65 22 0a 20 20 20 20 20 20 20 20 20 20  case".          
19b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19b60 20 22 20 20 46 52 4f 4d 20 63 6f 6d 70 6c 65 74   "  FROM complet
19b70 69 6f 6e 28 25 51 29 20 4f 52 44 45 52 20 42 59  ion(%Q) ORDER BY
19b80 20 31 22 2c 20 74 65 78 74 29 3b 0a 20 20 20 20   1", text);.    
19b90 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f  sqlite3_prepare_
19ba0 76 32 28 67 6c 6f 62 61 6c 44 62 2c 20 7a 53 71  v2(globalDb, zSq
19bb0 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30  l, -1, &pStmt, 0
19bc0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
19bd0 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 7d 0a 20  ree(zSql);.  }. 
19be0 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74 65   if( sqlite3_ste
19bf0 70 28 70 53 74 6d 74 29 3d 3d 53 51 4c 49 54 45  p(pStmt)==SQLITE
19c00 5f 52 4f 57 20 29 7b 0a 20 20 20 20 7a 52 65 74  _ROW ){.    zRet
19c10 20 3d 20 73 74 72 64 75 70 28 28 63 6f 6e 73 74   = strdup((const
19c20 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63   char*)sqlite3_c
19c30 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74  olumn_text(pStmt
19c40 2c 20 30 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  , 0));.  }else{.
19c50 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61      sqlite3_fina
19c60 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20  lize(pStmt);.   
19c70 20 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20   pStmt = 0;.    
19c80 7a 52 65 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  zRet = 0;.  }.  
19c90 72 65 74 75 72 6e 20 7a 52 65 74 3b 0a 7d 0a 73  return zRet;.}.s
19ca0 74 61 74 69 63 20 63 68 61 72 20 2a 2a 72 65 61  tatic char **rea
19cb0 64 6c 69 6e 65 5f 63 6f 6d 70 6c 65 74 69 6f 6e  dline_completion
19cc0 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 65  (const char *zTe
19cd0 78 74 2c 20 69 6e 74 20 69 53 74 61 72 74 2c 20  xt, int iStart, 
19ce0 69 6e 74 20 69 45 6e 64 29 7b 0a 20 20 72 6c 5f  int iEnd){.  rl_
19cf0 61 74 74 65 6d 70 74 65 64 5f 63 6f 6d 70 6c 65  attempted_comple
19d00 74 69 6f 6e 5f 6f 76 65 72 20 3d 20 31 3b 0a 20  tion_over = 1;. 
19d10 20 72 65 74 75 72 6e 20 72 6c 5f 63 6f 6d 70 6c   return rl_compl
19d20 65 74 69 6f 6e 5f 6d 61 74 63 68 65 73 28 7a 54  etion_matches(zT
19d30 65 78 74 2c 20 72 65 61 64 6c 69 6e 65 5f 63 6f  ext, readline_co
19d40 6d 70 6c 65 74 69 6f 6e 5f 67 65 6e 65 72 61 74  mpletion_generat
19d50 6f 72 29 3b 0a 7d 0a 0a 23 65 6c 69 66 20 48 41  or);.}..#elif HA
19d60 56 45 5f 4c 49 4e 45 4e 4f 49 53 45 0a 2f 2a 0a  VE_LINENOISE./*.
19d70 2a 2a 20 4c 69 6e 65 6e 6f 69 73 65 20 63 6f 6d  ** Linenoise com
19d80 70 6c 65 74 69 6f 6e 20 63 61 6c 6c 62 61 63 6b  pletion callback
19d90 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
19da0 6c 69 6e 65 6e 6f 69 73 65 5f 63 6f 6d 70 6c 65  linenoise_comple
19db0 74 69 6f 6e 28 63 6f 6e 73 74 20 63 68 61 72 20  tion(const char 
19dc0 2a 7a 4c 69 6e 65 2c 20 6c 69 6e 65 6e 6f 69 73  *zLine, linenois
19dd0 65 43 6f 6d 70 6c 65 74 69 6f 6e 73 20 2a 6c 63  eCompletions *lc
19de0 29 7b 0a 20 20 69 6e 74 20 6e 4c 69 6e 65 20 3d  ){.  int nLine =
19df0 20 73 74 72 6c 65 6e 33 30 28 7a 4c 69 6e 65 29   strlen30(zLine)
19e00 3b 0a 20 20 69 6e 74 20 69 2c 20 69 53 74 61 72  ;.  int i, iStar
19e10 74 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  t;.  sqlite3_stm
19e20 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20  t *pStmt = 0;.  
19e30 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 63 68  char *zSql;.  ch
19e40 61 72 20 7a 42 75 66 5b 31 30 30 30 5d 3b 0a 0a  ar zBuf[1000];..
19e50 20 20 69 66 28 20 6e 4c 69 6e 65 3e 73 69 7a 65    if( nLine>size
19e60 6f 66 28 7a 42 75 66 29 2d 33 30 20 29 20 72 65  of(zBuf)-30 ) re
19e70 74 75 72 6e 3b 0a 20 20 69 66 28 20 7a 4c 69 6e  turn;.  if( zLin
19e80 65 5b 30 5d 3d 3d 27 2e 27 20 29 20 72 65 74 75  e[0]=='.' ) retu
19e90 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 6e 4c 69 6e  rn;.  for(i=nLin
19ea0 65 2d 31 3b 20 69 3e 3d 30 20 26 26 20 28 69 73  e-1; i>=0 && (is
19eb0 61 6c 6e 75 6d 28 7a 4c 69 6e 65 5b 69 5d 29 20  alnum(zLine[i]) 
19ec0 7c 7c 20 7a 4c 69 6e 65 5b 69 5d 3d 3d 27 5f 27  || zLine[i]=='_'
19ed0 29 3b 20 69 2d 2d 29 7b 7d 0a 20 20 69 66 28 20  ); i--){}.  if( 
19ee0 69 3d 3d 6e 4c 69 6e 65 2d 31 20 29 20 72 65 74  i==nLine-1 ) ret
19ef0 75 72 6e 3b 0a 20 20 69 53 74 61 72 74 20 3d 20  urn;.  iStart = 
19f00 69 2b 31 3b 0a 20 20 6d 65 6d 63 70 79 28 7a 42  i+1;.  memcpy(zB
19f10 75 66 2c 20 7a 4c 69 6e 65 2c 20 69 53 74 61 72  uf, zLine, iStar
19f20 74 29 3b 0a 20 20 7a 53 71 6c 20 3d 20 73 71 6c  t);.  zSql = sql
19f30 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 53 45  ite3_mprintf("SE
19f40 4c 45 43 54 20 44 49 53 54 49 4e 43 54 20 63 61  LECT DISTINCT ca
19f50 6e 64 69 64 61 74 65 20 43 4f 4c 4c 41 54 45 20  ndidate COLLATE 
19f60 6e 6f 63 61 73 65 22 0a 20 20 20 20 20 20 20 20  nocase".        
19f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19f80 20 22 20 20 46 52 4f 4d 20 63 6f 6d 70 6c 65 74   "  FROM complet
19f90 69 6f 6e 28 25 51 2c 25 51 29 20 4f 52 44 45 52  ion(%Q,%Q) ORDER
19fa0 20 42 59 20 31 22 2c 0a 20 20 20 20 20 20 20 20   BY 1",.        
19fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19fc0 20 26 7a 4c 69 6e 65 5b 69 53 74 61 72 74 5d 2c   &zLine[iStart],
19fd0 20 7a 4c 69 6e 65 29 3b 0a 20 20 73 71 6c 69 74   zLine);.  sqlit
19fe0 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 67 6c  e3_prepare_v2(gl
19ff0 6f 62 61 6c 44 62 2c 20 7a 53 71 6c 2c 20 2d 31  obalDb, zSql, -1
1a000 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20  , &pStmt, 0);.  
1a010 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71  sqlite3_free(zSq
1a020 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 65 78  l);.  sqlite3_ex
1a030 65 63 28 67 6c 6f 62 61 6c 44 62 2c 20 22 50 52  ec(globalDb, "PR
1a040 41 47 4d 41 20 70 61 67 65 5f 63 6f 75 6e 74 22  AGMA page_count"
1a050 2c 20 30 2c 20 30 2c 20 30 29 3b 20 2f 2a 20 4c  , 0, 0, 0); /* L
1a060 6f 61 64 20 74 68 65 20 73 63 68 65 6d 61 20 2a  oad the schema *
1a070 2f 0a 20 20 77 68 69 6c 65 28 20 73 71 6c 69 74  /.  while( sqlit
1a080 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3d 3d  e3_step(pStmt)==
1a090 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20  SQLITE_ROW ){.  
1a0a0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43    const char *zC
1a0b0 6f 6d 70 6c 65 74 69 6f 6e 20 3d 20 28 63 6f 6e  ompletion = (con
1a0c0 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33  st char*)sqlite3
1a0d0 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74  _column_text(pSt
1a0e0 6d 74 2c 20 30 29 3b 0a 20 20 20 20 69 6e 74 20  mt, 0);.    int 
1a0f0 6e 43 6f 6d 70 6c 65 74 69 6f 6e 20 3d 20 73 71  nCompletion = sq
1a100 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74  lite3_column_byt
1a110 65 73 28 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20  es(pStmt, 0);.  
1a120 20 20 69 66 28 20 69 53 74 61 72 74 2b 6e 43 6f    if( iStart+nCo
1a130 6d 70 6c 65 74 69 6f 6e 20 3c 20 73 69 7a 65 6f  mpletion < sizeo
1a140 66 28 7a 42 75 66 29 2d 31 20 29 7b 0a 20 20 20  f(zBuf)-1 ){.   
1a150 20 20 20 6d 65 6d 63 70 79 28 7a 42 75 66 2b 69     memcpy(zBuf+i
1a160 53 74 61 72 74 2c 20 7a 43 6f 6d 70 6c 65 74 69  Start, zCompleti
1a170 6f 6e 2c 20 6e 43 6f 6d 70 6c 65 74 69 6f 6e 2b  on, nCompletion+
1a180 31 29 3b 0a 20 20 20 20 20 20 6c 69 6e 65 6e 6f  1);.      lineno
1a190 69 73 65 41 64 64 43 6f 6d 70 6c 65 74 69 6f 6e  iseAddCompletion
1a1a0 28 6c 63 2c 20 7a 42 75 66 29 3b 0a 20 20 20 20  (lc, zBuf);.    
1a1b0 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  }.  }.  sqlite3_
1a1c0 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b  finalize(pStmt);
1a1d0 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
1a1e0 20 44 6f 20 43 2d 6c 61 6e 67 75 61 67 65 20 73   Do C-language s
1a1f0 74 79 6c 65 20 64 65 71 75 6f 74 69 6e 67 2e 0a  tyle dequoting..
1a200 2a 2a 0a 2a 2a 20 20 20 20 5c 61 20 20 20 20 2d  **.**    \a    -
1a210 3e 20 61 6c 61 72 6d 0a 2a 2a 20 20 20 20 5c 62  > alarm.**    \b
1a220 20 20 20 20 2d 3e 20 62 61 63 6b 73 70 61 63 65      -> backspace
1a230 0a 2a 2a 20 20 20 20 5c 74 20 20 20 20 2d 3e 20  .**    \t    -> 
1a240 74 61 62 0a 2a 2a 20 20 20 20 5c 6e 20 20 20 20  tab.**    \n    
1a250 2d 3e 20 6e 65 77 6c 69 6e 65 0a 2a 2a 20 20 20  -> newline.**   
1a260 20 5c 76 20 20 20 20 2d 3e 20 76 65 72 74 69 63   \v    -> vertic
1a270 61 6c 20 74 61 62 0a 2a 2a 20 20 20 20 5c 66 20  al tab.**    \f 
1a280 20 20 20 2d 3e 20 66 6f 72 6d 20 66 65 65 64 0a     -> form feed.
1a290 2a 2a 20 20 20 20 5c 72 20 20 20 20 2d 3e 20 63  **    \r    -> c
1a2a0 61 72 72 69 61 67 65 20 72 65 74 75 72 6e 0a 2a  arriage return.*
1a2b0 2a 20 20 20 20 5c 73 20 20 20 20 2d 3e 20 73 70  *    \s    -> sp
1a2c0 61 63 65 0a 2a 2a 20 20 20 20 5c 22 20 20 20 20  ace.**    \"    
1a2d0 2d 3e 20 22 0a 2a 2a 20 20 20 20 5c 27 20 20 20  -> ".**    \'   
1a2e0 20 2d 3e 20 27 0a 2a 2a 20 20 20 20 5c 5c 20 20   -> '.**    \\  
1a2f0 20 20 2d 3e 20 62 61 63 6b 73 6c 61 73 68 0a 2a    -> backslash.*
1a300 2a 20 20 20 20 5c 4e 4e 4e 20 20 2d 3e 20 61 73  *    \NNN  -> as
1a310 63 69 69 20 63 68 61 72 61 63 74 65 72 20 4e 4e  cii character NN
1a320 4e 20 69 6e 20 6f 63 74 61 6c 0a 2a 2f 0a 73 74  N in octal.*/.st
1a330 61 74 69 63 20 76 6f 69 64 20 72 65 73 6f 6c 76  atic void resolv
1a340 65 5f 62 61 63 6b 73 6c 61 73 68 65 73 28 63 68  e_backslashes(ch
1a350 61 72 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 69 2c  ar *z){.  int i,
1a360 20 6a 3b 0a 20 20 63 68 61 72 20 63 3b 0a 20 20   j;.  char c;.  
1a370 77 68 69 6c 65 28 20 2a 7a 20 26 26 20 2a 7a 21  while( *z && *z!
1a380 3d 27 5c 5c 27 20 29 20 7a 2b 2b 3b 0a 20 20 66  ='\\' ) z++;.  f
1a390 6f 72 28 69 3d 6a 3d 30 3b 20 28 63 20 3d 20 7a  or(i=j=0; (c = z
1a3a0 5b 69 5d 29 21 3d 30 3b 20 69 2b 2b 2c 20 6a 2b  [i])!=0; i++, j+
1a3b0 2b 29 7b 0a 20 20 20 20 69 66 28 20 63 3d 3d 27  +){.    if( c=='
1a3c0 5c 5c 27 20 26 26 20 7a 5b 69 2b 31 5d 21 3d 30  \\' && z[i+1]!=0
1a3d0 20 29 7b 0a 20 20 20 20 20 20 63 20 3d 20 7a 5b   ){.      c = z[
1a3e0 2b 2b 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20  ++i];.      if( 
1a3f0 63 3d 3d 27 61 27 20 29 7b 0a 20 20 20 20 20 20  c=='a' ){.      
1a400 20 20 63 20 3d 20 27 5c 61 27 3b 0a 20 20 20 20    c = '\a';.    
1a410 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27    }else if( c=='
1a420 62 27 20 29 7b 0a 20 20 20 20 20 20 20 20 63 20  b' ){.        c 
1a430 3d 20 27 5c 62 27 3b 0a 20 20 20 20 20 20 7d 65  = '\b';.      }e
1a440 6c 73 65 20 69 66 28 20 63 3d 3d 27 74 27 20 29  lse if( c=='t' )
1a450 7b 0a 20 20 20 20 20 20 20 20 63 20 3d 20 27 5c  {.        c = '\
1a460 74 27 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  t';.      }else 
1a470 69 66 28 20 63 3d 3d 27 6e 27 20 29 7b 0a 20 20  if( c=='n' ){.  
1a480 20 20 20 20 20 20 63 20 3d 20 27 5c 6e 27 3b 0a        c = '\n';.
1a490 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
1a4a0 63 3d 3d 27 76 27 20 29 7b 0a 20 20 20 20 20 20  c=='v' ){.      
1a4b0 20 20 63 20 3d 20 27 5c 76 27 3b 0a 20 20 20 20    c = '\v';.    
1a4c0 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27    }else if( c=='
1a4d0 66 27 20 29 7b 0a 20 20 20 20 20 20 20 20 63 20  f' ){.        c 
1a4e0 3d 20 27 5c 66 27 3b 0a 20 20 20 20 20 20 7d 65  = '\f';.      }e
1a4f0 6c 73 65 20 69 66 28 20 63 3d 3d 27 72 27 20 29  lse if( c=='r' )
1a500 7b 0a 20 20 20 20 20 20 20 20 63 20 3d 20 27 5c  {.        c = '\
1a510 72 27 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  r';.      }else 
1a520 69 66 28 20 63 3d 3d 27 22 27 20 29 7b 0a 20 20  if( c=='"' ){.  
1a530 20 20 20 20 20 20 63 20 3d 20 27 22 27 3b 0a 20        c = '"';. 
1a540 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63       }else if( c
1a550 3d 3d 27 5c 27 27 20 29 7b 0a 20 20 20 20 20 20  =='\'' ){.      
1a560 20 20 63 20 3d 20 27 5c 27 27 3b 0a 20 20 20 20    c = '\'';.    
1a570 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27    }else if( c=='
1a580 5c 5c 27 20 29 7b 0a 20 20 20 20 20 20 20 20 63  \\' ){.        c
1a590 20 3d 20 27 5c 5c 27 3b 0a 20 20 20 20 20 20 7d   = '\\';.      }
1a5a0 65 6c 73 65 20 69 66 28 20 63 3e 3d 27 30 27 20  else if( c>='0' 
1a5b0 26 26 20 63 3c 3d 27 37 27 20 29 7b 0a 20 20 20  && c<='7' ){.   
1a5c0 20 20 20 20 20 63 20 2d 3d 20 27 30 27 3b 0a 20       c -= '0';. 
1a5d0 20 20 20 20 20 20 20 69 66 28 20 7a 5b 69 2b 31         if( z[i+1
1a5e0 5d 3e 3d 27 30 27 20 26 26 20 7a 5b 69 2b 31 5d  ]>='0' && z[i+1]
1a5f0 3c 3d 27 37 27 20 29 7b 0a 20 20 20 20 20 20 20  <='7' ){.       
1a600 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20 20 20     i++;.        
1a610 20 20 63 20 3d 20 28 63 3c 3c 33 29 20 2b 20 7a    c = (c<<3) + z
1a620 5b 69 5d 20 2d 20 27 30 27 3b 0a 20 20 20 20 20  [i] - '0';.     
1a630 20 20 20 20 20 69 66 28 20 7a 5b 69 2b 31 5d 3e       if( z[i+1]>
1a640 3d 27 30 27 20 26 26 20 7a 5b 69 2b 31 5d 3c 3d  ='0' && z[i+1]<=
1a650 27 37 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20  '7' ){.         
1a660 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20 20 20     i++;.        
1a670 20 20 20 20 63 20 3d 20 28 63 3c 3c 33 29 20 2b      c = (c<<3) +
1a680 20 7a 5b 69 5d 20 2d 20 27 30 27 3b 0a 20 20 20   z[i] - '0';.   
1a690 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1a6a0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
1a6b0 0a 20 20 20 20 7a 5b 6a 5d 20 3d 20 63 3b 0a 20  .    z[j] = c;. 
1a6c0 20 7d 0a 20 20 69 66 28 20 6a 3c 69 20 29 20 7a   }.  if( j<i ) z
1a6d0 5b 6a 5d 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  [j] = 0;.}../*.*
1a6e0 2a 20 49 6e 74 65 72 70 72 65 74 20 7a 41 72 67  * Interpret zArg
1a6f0 20 61 73 20 65 69 74 68 65 72 20 61 6e 20 69 6e   as either an in
1a700 74 65 67 65 72 20 6f 72 20 61 20 62 6f 6f 6c 65  teger or a boole
1a710 61 6e 20 76 61 6c 75 65 2e 20 20 52 65 74 75 72  an value.  Retur
1a720 6e 20 31 20 6f 72 20 30 0a 2a 2a 20 66 6f 72 20  n 1 or 0.** for 
1a730 54 52 55 45 20 61 6e 64 20 46 41 4c 53 45 2e 20  TRUE and FALSE. 
1a740 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e 74 65   Return the inte
1a750 67 65 72 20 76 61 6c 75 65 20 69 66 20 61 70 70  ger value if app
1a760 72 6f 70 72 69 61 74 65 2e 0a 2a 2f 0a 73 74 61  ropriate..*/.sta
1a770 74 69 63 20 69 6e 74 20 62 6f 6f 6c 65 61 6e 56  tic int booleanV
1a780 61 6c 75 65 28 63 6f 6e 73 74 20 63 68 61 72 20  alue(const char 
1a790 2a 7a 41 72 67 29 7b 0a 20 20 69 6e 74 20 69 3b  *zArg){.  int i;
1a7a0 0a 20 20 69 66 28 20 7a 41 72 67 5b 30 5d 3d 3d  .  if( zArg[0]==
1a7b0 27 30 27 20 26 26 20 7a 41 72 67 5b 31 5d 3d 3d  '0' && zArg[1]==
1a7c0 27 78 27 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  'x' ){.    for(i
1a7d0 3d 32 3b 20 68 65 78 44 69 67 69 74 56 61 6c 75  =2; hexDigitValu
1a7e0 65 28 7a 41 72 67 5b 69 5d 29 3e 3d 30 3b 20 69  e(zArg[i])>=0; i
1a7f0 2b 2b 29 7b 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20  ++){}.  }else{. 
1a800 20 20 20 66 6f 72 28 69 3d 30 3b 20 7a 41 72 67     for(i=0; zArg
1a810 5b 69 5d 3e 3d 27 30 27 20 26 26 20 7a 41 72 67  [i]>='0' && zArg
1a820 5b 69 5d 3c 3d 27 39 27 3b 20 69 2b 2b 29 7b 7d  [i]<='9'; i++){}
1a830 0a 20 20 7d 0a 20 20 69 66 28 20 69 3e 30 20 26  .  }.  if( i>0 &
1a840 26 20 7a 41 72 67 5b 69 5d 3d 3d 30 20 29 20 72  & zArg[i]==0 ) r
1a850 65 74 75 72 6e 20 28 69 6e 74 29 28 69 6e 74 65  eturn (int)(inte
1a860 67 65 72 56 61 6c 75 65 28 7a 41 72 67 29 20 26  gerValue(zArg) &
1a870 20 30 78 66 66 66 66 66 66 66 66 29 3b 0a 20 20   0xffffffff);.  
1a880 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72 69  if( sqlite3_stri
1a890 63 6d 70 28 7a 41 72 67 2c 20 22 6f 6e 22 29 3d  cmp(zArg, "on")=
1a8a0 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 5f 73 74  =0 || sqlite3_st
1a8b0 72 69 63 6d 70 28 7a 41 72 67 2c 22 79 65 73 22  ricmp(zArg,"yes"
1a8c0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  )==0 ){.    retu
1a8d0 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn 1;.  }.  if( 
1a8e0 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28  sqlite3_stricmp(
1a8f0 7a 41 72 67 2c 20 22 6f 66 66 22 29 3d 3d 30 20  zArg, "off")==0 
1a900 7c 7c 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63  || sqlite3_stric
1a910 6d 70 28 7a 41 72 67 2c 22 6e 6f 22 29 3d 3d 30  mp(zArg,"no")==0
1a920 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
1a930 3b 0a 20 20 7d 0a 20 20 75 74 66 38 5f 70 72 69  ;.  }.  utf8_pri
1a940 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 52 52  ntf(stderr, "ERR
1a950 4f 52 3a 20 4e 6f 74 20 61 20 62 6f 6f 6c 65 61  OR: Not a boolea
1a960 6e 20 76 61 6c 75 65 3a 20 5c 22 25 73 5c 22 2e  n value: \"%s\".
1a970 20 41 73 73 75 6d 69 6e 67 20 5c 22 6e 6f 5c 22   Assuming \"no\"
1a980 2e 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  .\n",.          
1a990 7a 41 72 67 29 3b 0a 20 20 72 65 74 75 72 6e 20  zArg);.  return 
1a9a0 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  0;.}../*.** Set 
1a9b0 6f 72 20 63 6c 65 61 72 20 61 20 73 68 65 6c 6c  or clear a shell
1a9c0 20 66 6c 61 67 20 61 63 63 6f 72 64 69 6e 67 20   flag according 
1a9d0 74 6f 20 61 20 62 6f 6f 6c 65 61 6e 20 76 61 6c  to a boolean val
1a9e0 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ue..*/.static vo
1a9f0 69 64 20 73 65 74 4f 72 43 6c 65 61 72 46 6c 61  id setOrClearFla
1aa00 67 28 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 2c  g(ShellState *p,
1aa10 20 75 6e 73 69 67 6e 65 64 20 6d 46 6c 61 67 2c   unsigned mFlag,
1aa20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 72   const char *zAr
1aa30 67 29 7b 0a 20 20 69 66 28 20 62 6f 6f 6c 65 61  g){.  if( boolea
1aa40 6e 56 61 6c 75 65 28 7a 41 72 67 29 20 29 7b 0a  nValue(zArg) ){.
1aa50 20 20 20 20 53 68 65 6c 6c 53 65 74 46 6c 61 67      ShellSetFlag
1aa60 28 70 2c 20 6d 46 6c 61 67 29 3b 0a 20 20 7d 65  (p, mFlag);.  }e
1aa70 6c 73 65 7b 0a 20 20 20 20 53 68 65 6c 6c 43 6c  lse{.    ShellCl
1aa80 65 61 72 46 6c 61 67 28 70 2c 20 6d 46 6c 61 67  earFlag(p, mFlag
1aa90 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
1aaa0 43 6c 6f 73 65 20 61 6e 20 6f 75 74 70 75 74 20  Close an output 
1aab0 66 69 6c 65 2c 20 61 73 73 75 6d 69 6e 67 20 69  file, assuming i
1aac0 74 20 69 73 20 6e 6f 74 20 73 74 64 65 72 72 20  t is not stderr 
1aad0 6f 72 20 73 74 64 6f 75 74 0a 2a 2f 0a 73 74 61  or stdout.*/.sta
1aae0 74 69 63 20 76 6f 69 64 20 6f 75 74 70 75 74 5f  tic void output_
1aaf0 66 69 6c 65 5f 63 6c 6f 73 65 28 46 49 4c 45 20  file_close(FILE 
1ab00 2a 66 29 7b 0a 20 20 69 66 28 20 66 20 26 26 20  *f){.  if( f && 
1ab10 66 21 3d 73 74 64 6f 75 74 20 26 26 20 66 21 3d  f!=stdout && f!=
1ab20 73 74 64 65 72 72 20 29 20 66 63 6c 6f 73 65 28  stderr ) fclose(
1ab30 66 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 79  f);.}../*.** Try
1ab40 20 74 6f 20 6f 70 65 6e 20 61 6e 20 6f 75 74 70   to open an outp
1ab50 75 74 20 66 69 6c 65 2e 20 20 20 54 68 65 20 6e  ut file.   The n
1ab60 61 6d 65 73 20 22 73 74 64 6f 75 74 22 20 61 6e  ames "stdout" an
1ab70 64 20 22 73 74 64 65 72 72 22 20 61 72 65 0a 2a  d "stderr" are.*
1ab80 2a 20 72 65 63 6f 67 6e 69 7a 65 64 20 61 6e 64  * recognized and
1ab90 20 64 6f 20 74 68 65 20 72 69 67 68 74 20 74 68   do the right th
1aba0 69 6e 67 2e 20 20 4e 55 4c 4c 20 69 73 20 72 65  ing.  NULL is re
1abb0 74 75 72 6e 65 64 20 69 66 20 74 68 65 20 6f 75  turned if the ou
1abc0 74 70 75 74 0a 2a 2a 20 66 69 6c 65 6e 61 6d 65  tput.** filename
1abd0 20 69 73 20 22 6f 66 66 22 2e 0a 2a 2f 0a 73 74   is "off"..*/.st
1abe0 61 74 69 63 20 46 49 4c 45 20 2a 6f 75 74 70 75  atic FILE *outpu
1abf0 74 5f 66 69 6c 65 5f 6f 70 65 6e 28 63 6f 6e 73  t_file_open(cons
1ac00 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 29 7b 0a  t char *zFile){.
1ac10 20 20 46 49 4c 45 20 2a 66 3b 0a 20 20 69 66 28    FILE *f;.  if(
1ac20 20 73 74 72 63 6d 70 28 7a 46 69 6c 65 2c 22 73   strcmp(zFile,"s
1ac30 74 64 6f 75 74 22 29 3d 3d 30 20 29 7b 0a 20 20  tdout")==0 ){.  
1ac40 20 20 66 20 3d 20 73 74 64 6f 75 74 3b 0a 20 20    f = stdout;.  
1ac50 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
1ac60 28 7a 46 69 6c 65 2c 20 22 73 74 64 65 72 72 22  (zFile, "stderr"
1ac70 29 3d 3d 30 20 29 7b 0a 20 20 20 20 66 20 3d 20  )==0 ){.    f = 
1ac80 73 74 64 65 72 72 3b 0a 20 20 7d 65 6c 73 65 20  stderr;.  }else 
1ac90 69 66 28 20 73 74 72 63 6d 70 28 7a 46 69 6c 65  if( strcmp(zFile
1aca0 2c 20 22 6f 66 66 22 29 3d 3d 30 20 29 7b 0a 20  , "off")==0 ){. 
1acb0 20 20 20 66 20 3d 20 30 3b 0a 20 20 7d 65 6c 73     f = 0;.  }els
1acc0 65 7b 0a 20 20 20 20 66 20 3d 20 66 6f 70 65 6e  e{.    f = fopen
1acd0 28 7a 46 69 6c 65 2c 20 22 77 62 22 29 3b 0a 20  (zFile, "wb");. 
1ace0 20 20 20 69 66 28 20 66 3d 3d 30 20 29 7b 0a 20     if( f==0 ){. 
1acf0 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
1ad00 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a  (stderr, "Error:
1ad10 20 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 5c 22 25   cannot open \"%
1ad20 73 5c 22 5c 6e 22 2c 20 7a 46 69 6c 65 29 3b 0a  s\"\n", zFile);.
1ad30 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
1ad40 72 6e 20 66 3b 0a 7d 0a 0a 23 69 66 20 21 64 65  rn f;.}..#if !de
1ad50 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 55 4e 54  fined(SQLITE_UNT
1ad60 45 53 54 41 42 4c 45 29 0a 23 69 66 20 21 64 65  ESTABLE).#if !de
1ad70 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
1ad80 54 5f 54 52 41 43 45 29 20 26 26 20 21 64 65 66  T_TRACE) && !def
1ad90 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
1ada0 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 29  _FLOATING_POINT)
1adb0 0a 2f 2a 0a 2a 2a 20 41 20 72 6f 75 74 69 6e 65  ./*.** A routine
1adc0 20 66 6f 72 20 68 61 6e 64 6c 69 6e 67 20 6f 75   for handling ou
1add0 74 70 75 74 20 66 72 6f 6d 20 73 71 6c 69 74 65  tput from sqlite
1ade0 33 5f 74 72 61 63 65 28 29 2e 0a 2a 2f 0a 73 74  3_trace()..*/.st
1adf0 61 74 69 63 20 69 6e 74 20 73 71 6c 5f 74 72 61  atic int sql_tra
1ae00 63 65 5f 63 61 6c 6c 62 61 63 6b 28 0a 20 20 75  ce_callback(.  u
1ae10 6e 73 69 67 6e 65 64 20 6d 54 79 70 65 2c 0a 20  nsigned mType,. 
1ae20 20 76 6f 69 64 20 2a 70 41 72 67 2c 0a 20 20 76   void *pArg,.  v
1ae30 6f 69 64 20 2a 70 50 2c 0a 20 20 76 6f 69 64 20  oid *pP,.  void 
1ae40 2a 70 58 0a 29 7b 0a 20 20 46 49 4c 45 20 2a 66  *pX.){.  FILE *f
1ae50 20 3d 20 28 46 49 4c 45 2a 29 70 41 72 67 3b 0a   = (FILE*)pArg;.
1ae60 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
1ae70 45 52 28 6d 54 79 70 65 29 3b 0a 20 20 55 4e 55  ER(mType);.  UNU
1ae80 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 50  SED_PARAMETER(pP
1ae90 29 3b 0a 20 20 69 66 28 20 66 20 29 7b 0a 20 20  );.  if( f ){.  
1aea0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20    const char *z 
1aeb0 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 70  = (const char*)p
1aec0 58 3b 0a 20 20 20 20 69 6e 74 20 69 20 3d 20 73  X;.    int i = s
1aed0 74 72 6c 65 6e 33 30 28 7a 29 3b 0a 20 20 20 20  trlen30(z);.    
1aee0 77 68 69 6c 65 28 20 69 3e 30 20 26 26 20 7a 5b  while( i>0 && z[
1aef0 69 2d 31 5d 3d 3d 27 3b 27 20 29 7b 20 69 2d 2d  i-1]==';' ){ i--
1af00 3b 20 7d 0a 20 20 20 20 75 74 66 38 5f 70 72 69  ; }.    utf8_pri
1af10 6e 74 66 28 66 2c 20 22 25 2e 2a 73 3b 5c 6e 22  ntf(f, "%.*s;\n"
1af20 2c 20 69 2c 20 7a 29 3b 0a 20 20 7d 0a 20 20 72  , i, z);.  }.  r
1af30 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69  eturn 0;.}.#endi
1af40 66 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  f.#endif../*.** 
1af50 41 20 6e 6f 2d 6f 70 20 72 6f 75 74 69 6e 65 20  A no-op routine 
1af60 74 68 61 74 20 72 75 6e 73 20 77 69 74 68 20 74  that runs with t
1af70 68 65 20 22 2e 62 72 65 61 6b 70 6f 69 6e 74 22  he ".breakpoint"
1af80 20 64 6f 63 2d 63 6f 6d 6d 61 6e 64 2e 20 20 54   doc-command.  T
1af90 68 69 73 20 69 73 0a 2a 2a 20 61 20 75 73 65 66  his is.** a usef
1afa0 75 6c 20 73 70 6f 74 20 74 6f 20 73 65 74 20 61  ul spot to set a
1afb0 20 64 65 62 75 67 67 65 72 20 62 72 65 61 6b 70   debugger breakp
1afc0 6f 69 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  oint..*/.static 
1afd0 76 6f 69 64 20 74 65 73 74 5f 62 72 65 61 6b 70  void test_breakp
1afe0 6f 69 6e 74 28 76 6f 69 64 29 7b 0a 20 20 73 74  oint(void){.  st
1aff0 61 74 69 63 20 69 6e 74 20 6e 43 61 6c 6c 20 3d  atic int nCall =
1b000 20 30 3b 0a 20 20 6e 43 61 6c 6c 2b 2b 3b 0a 7d   0;.  nCall++;.}
1b010 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 6f 62 6a 65 63  ../*.** An objec
1b020 74 20 75 73 65 64 20 74 6f 20 72 65 61 64 20 61  t used to read a
1b030 20 43 53 56 20 61 6e 64 20 6f 74 68 65 72 20 66   CSV and other f
1b040 69 6c 65 73 20 66 6f 72 20 69 6d 70 6f 72 74 2e  iles for import.
1b050 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75  .*/.typedef stru
1b060 63 74 20 49 6d 70 6f 72 74 43 74 78 20 49 6d 70  ct ImportCtx Imp
1b070 6f 72 74 43 74 78 3b 0a 73 74 72 75 63 74 20 49  ortCtx;.struct I
1b080 6d 70 6f 72 74 43 74 78 20 7b 0a 20 20 63 6f 6e  mportCtx {.  con
1b090 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 3b 20  st char *zFile; 
1b0a0 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
1b0b0 69 6e 70 75 74 20 66 69 6c 65 20 2a 2f 0a 20 20  input file */.  
1b0c0 46 49 4c 45 20 2a 69 6e 3b 20 20 20 20 20 20 20  FILE *in;       
1b0d0 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20      /* Read the 
1b0e0 43 53 56 20 74 65 78 74 20 66 72 6f 6d 20 74 68  CSV text from th
1b0f0 69 73 20 69 6e 70 75 74 20 73 74 72 65 61 6d 20  is input stream 
1b100 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 3b 20 20 20  */.  char *z;   
1b110 20 20 20 20 20 20 20 20 20 2f 2a 20 41 63 63 75           /* Accu
1b120 6d 75 6c 61 74 65 64 20 74 65 78 74 20 66 6f 72  mulated text for
1b130 20 61 20 66 69 65 6c 64 20 2a 2f 0a 20 20 69 6e   a field */.  in
1b140 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  t n;            
1b150 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
1b160 79 74 65 73 20 69 6e 20 7a 20 2a 2f 0a 20 20 69  ytes in z */.  i
1b170 6e 74 20 6e 41 6c 6c 6f 63 3b 20 20 20 20 20 20  nt nAlloc;      
1b180 20 20 20 2f 2a 20 53 70 61 63 65 20 61 6c 6c 6f     /* Space allo
1b190 63 61 74 65 64 20 66 6f 72 20 7a 5b 5d 20 2a 2f  cated for z[] */
1b1a0 0a 20 20 69 6e 74 20 6e 4c 69 6e 65 3b 20 20 20  .  int nLine;   
1b1b0 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e         /* Curren
1b1c0 74 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20 2a 2f  t line number */
1b1d0 0a 20 20 69 6e 74 20 62 4e 6f 74 46 69 72 73 74  .  int bNotFirst
1b1e0 3b 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69  ;      /* True i
1b1f0 66 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 62 79  f one or more by
1b200 74 65 73 20 61 6c 72 65 61 64 79 20 72 65 61 64  tes already read
1b210 20 2a 2f 0a 20 20 69 6e 74 20 63 54 65 72 6d 3b   */.  int cTerm;
1b220 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68 61            /* Cha
1b230 72 61 63 74 65 72 20 74 68 61 74 20 74 65 72 6d  racter that term
1b240 69 6e 61 74 65 64 20 74 68 65 20 6d 6f 73 74 20  inated the most 
1b250 72 65 63 65 6e 74 20 66 69 65 6c 64 20 2a 2f 0a  recent field */.
1b260 20 20 69 6e 74 20 63 43 6f 6c 53 65 70 3b 20 20    int cColSep;  
1b270 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6c        /* The col
1b280 75 6d 6e 20 73 65 70 61 72 61 74 6f 72 20 63 68  umn separator ch
1b290 61 72 61 63 74 65 72 2e 20 20 28 55 73 75 61 6c  aracter.  (Usual
1b2a0 6c 79 20 22 2c 22 29 20 2a 2f 0a 20 20 69 6e 74  ly ",") */.  int
1b2b0 20 63 52 6f 77 53 65 70 3b 20 20 20 20 20 20 20   cRowSep;       
1b2c0 20 2f 2a 20 54 68 65 20 72 6f 77 20 73 65 70 61   /* The row sepa
1b2d0 72 61 74 6f 72 20 63 68 61 72 61 63 74 65 72 2e  rator character.
1b2e0 20 20 28 55 73 75 61 6c 6c 79 20 22 5c 6e 22 29    (Usually "\n")
1b2f0 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 41 70 70 65 6e   */.};../* Appen
1b300 64 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65 20  d a single byte 
1b310 74 6f 20 7a 5b 5d 20 2a 2f 0a 73 74 61 74 69 63  to z[] */.static
1b320 20 76 6f 69 64 20 69 6d 70 6f 72 74 5f 61 70 70   void import_app
1b330 65 6e 64 5f 63 68 61 72 28 49 6d 70 6f 72 74 43  end_char(ImportC
1b340 74 78 20 2a 70 2c 20 69 6e 74 20 63 29 7b 0a 20  tx *p, int c){. 
1b350 20 69 66 28 20 70 2d 3e 6e 2b 31 3e 3d 70 2d 3e   if( p->n+1>=p->
1b360 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 70 2d  nAlloc ){.    p-
1b370 3e 6e 41 6c 6c 6f 63 20 2b 3d 20 70 2d 3e 6e 41  >nAlloc += p->nA
1b380 6c 6c 6f 63 20 2b 20 31 30 30 3b 0a 20 20 20 20  lloc + 100;.    
1b390 70 2d 3e 7a 20 3d 20 73 71 6c 69 74 65 33 5f 72  p->z = sqlite3_r
1b3a0 65 61 6c 6c 6f 63 36 34 28 70 2d 3e 7a 2c 20 70  ealloc64(p->z, p
1b3b0 2d 3e 6e 41 6c 6c 6f 63 29 3b 0a 20 20 20 20 69  ->nAlloc);.    i
1b3c0 66 28 20 70 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20  f( p->z==0 ){.  
1b3d0 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73      raw_printf(s
1b3e0 74 64 65 72 72 2c 20 22 6f 75 74 20 6f 66 20 6d  tderr, "out of m
1b3f0 65 6d 6f 72 79 5c 6e 22 29 3b 0a 20 20 20 20 20  emory\n");.     
1b400 20 65 78 69 74 28 31 29 3b 0a 20 20 20 20 7d 0a   exit(1);.    }.
1b410 20 20 7d 0a 20 20 70 2d 3e 7a 5b 70 2d 3e 6e 2b    }.  p->z[p->n+
1b420 2b 5d 20 3d 20 28 63 68 61 72 29 63 3b 0a 7d 0a  +] = (char)c;.}.
1b430 0a 2f 2a 20 52 65 61 64 20 61 20 73 69 6e 67 6c  ./* Read a singl
1b440 65 20 66 69 65 6c 64 20 6f 66 20 43 53 56 20 74  e field of CSV t
1b450 65 78 74 2e 20 20 43 6f 6d 70 61 74 69 62 6c 65  ext.  Compatible
1b460 20 77 69 74 68 20 72 66 63 34 31 38 30 20 61 6e   with rfc4180 an
1b470 64 20 65 78 74 65 6e 64 65 64 0a 2a 2a 20 77 69  d extended.** wi
1b480 74 68 20 74 68 65 20 6f 70 74 69 6f 6e 20 6f 66  th the option of
1b490 20 68 61 76 69 6e 67 20 61 20 73 65 70 61 72 61   having a separa
1b4a0 74 6f 72 20 6f 74 68 65 72 20 74 68 61 6e 20 22  tor other than "
1b4b0 2c 22 2e 0a 2a 2a 0a 2a 2a 20 20 20 2b 20 20 49  ,"..**.**   +  I
1b4c0 6e 70 75 74 20 63 6f 6d 65 73 20 66 72 6f 6d 20  nput comes from 
1b4d0 70 2d 3e 69 6e 2e 0a 2a 2a 20 20 20 2b 20 20 53  p->in..**   +  S
1b4e0 74 6f 72 65 20 72 65 73 75 6c 74 73 20 69 6e 20  tore results in 
1b4f0 70 2d 3e 7a 20 6f 66 20 6c 65 6e 67 74 68 20 70  p->z of length p
1b500 2d 3e 6e 2e 20 20 53 70 61 63 65 20 74 6f 20 68  ->n.  Space to h
1b510 6f 6c 64 20 70 2d 3e 7a 20 63 6f 6d 65 73 0a 2a  old p->z comes.*
1b520 2a 20 20 20 20 20 20 66 72 6f 6d 20 73 71 6c 69  *      from sqli
1b530 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 29 2e 0a  te3_malloc64()..
1b540 2a 2a 20 20 20 2b 20 20 55 73 65 20 70 2d 3e 63  **   +  Use p->c
1b550 53 65 70 20 61 73 20 74 68 65 20 63 6f 6c 75 6d  Sep as the colum
1b560 6e 20 73 65 70 61 72 61 74 6f 72 2e 20 20 54 68  n separator.  Th
1b570 65 20 64 65 66 61 75 6c 74 20 69 73 20 22 2c 22  e default is ","
1b580 2e 0a 2a 2a 20 20 20 2b 20 20 55 73 65 20 70 2d  ..**   +  Use p-
1b590 3e 72 53 65 70 20 61 73 20 74 68 65 20 72 6f 77  >rSep as the row
1b5a0 20 73 65 70 61 72 61 74 6f 72 2e 20 20 54 68 65   separator.  The
1b5b0 20 64 65 66 61 75 6c 74 20 69 73 20 22 5c 6e 22   default is "\n"
1b5c0 2e 0a 2a 2a 20 20 20 2b 20 20 4b 65 65 70 20 74  ..**   +  Keep t
1b5d0 72 61 63 6b 20 6f 66 20 74 68 65 20 6c 69 6e 65  rack of the line
1b5e0 20 6e 75 6d 62 65 72 20 69 6e 20 70 2d 3e 6e 4c   number in p->nL
1b5f0 69 6e 65 2e 0a 2a 2a 20 20 20 2b 20 20 53 74 6f  ine..**   +  Sto
1b600 72 65 20 74 68 65 20 63 68 61 72 61 63 74 65 72  re the character
1b610 20 74 68 61 74 20 74 65 72 6d 69 6e 61 74 65 73   that terminates
1b620 20 74 68 65 20 66 69 65 6c 64 20 69 6e 20 70 2d   the field in p-
1b630 3e 63 54 65 72 6d 2e 20 20 53 74 6f 72 65 0a 2a  >cTerm.  Store.*
1b640 2a 20 20 20 20 20 20 45 4f 46 20 6f 6e 20 65 6e  *      EOF on en
1b650 64 2d 6f 66 2d 66 69 6c 65 2e 0a 2a 2a 20 20 20  d-of-file..**   
1b660 2b 20 20 52 65 70 6f 72 74 20 73 79 6e 74 61 78  +  Report syntax
1b670 20 65 72 72 6f 72 73 20 6f 6e 20 73 74 64 65 72   errors on stder
1b680 72 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  r.*/.static char
1b690 20 2a 53 51 4c 49 54 45 5f 43 44 45 43 4c 20 63   *SQLITE_CDECL c
1b6a0 73 76 5f 72 65 61 64 5f 6f 6e 65 5f 66 69 65 6c  sv_read_one_fiel
1b6b0 64 28 49 6d 70 6f 72 74 43 74 78 20 2a 70 29 7b  d(ImportCtx *p){
1b6c0 0a 20 20 69 6e 74 20 63 3b 0a 20 20 69 6e 74 20  .  int c;.  int 
1b6d0 63 53 65 70 20 3d 20 70 2d 3e 63 43 6f 6c 53 65  cSep = p->cColSe
1b6e0 70 3b 0a 20 20 69 6e 74 20 72 53 65 70 20 3d 20  p;.  int rSep = 
1b6f0 70 2d 3e 63 52 6f 77 53 65 70 3b 0a 20 20 70 2d  p->cRowSep;.  p-
1b700 3e 6e 20 3d 20 30 3b 0a 20 20 63 20 3d 20 66 67  >n = 0;.  c = fg
1b710 65 74 63 28 70 2d 3e 69 6e 29 3b 0a 20 20 69 66  etc(p->in);.  if
1b720 28 20 63 3d 3d 45 4f 46 20 7c 7c 20 73 65 65 6e  ( c==EOF || seen
1b730 49 6e 74 65 72 72 75 70 74 20 29 7b 0a 20 20 20  Interrupt ){.   
1b740 20 70 2d 3e 63 54 65 72 6d 20 3d 20 45 4f 46 3b   p->cTerm = EOF;
1b750 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
1b760 20 7d 0a 20 20 69 66 28 20 63 3d 3d 27 22 27 20   }.  if( c=='"' 
1b770 29 7b 0a 20 20 20 20 69 6e 74 20 70 63 2c 20 70  ){.    int pc, p
1b780 70 63 3b 0a 20 20 20 20 69 6e 74 20 73 74 61 72  pc;.    int star
1b790 74 4c 69 6e 65 20 3d 20 70 2d 3e 6e 4c 69 6e 65  tLine = p->nLine
1b7a0 3b 0a 20 20 20 20 69 6e 74 20 63 51 75 6f 74 65  ;.    int cQuote
1b7b0 20 3d 20 63 3b 0a 20 20 20 20 70 63 20 3d 20 70   = c;.    pc = p
1b7c0 70 63 20 3d 20 30 3b 0a 20 20 20 20 77 68 69 6c  pc = 0;.    whil
1b7d0 65 28 20 31 20 29 7b 0a 20 20 20 20 20 20 63 20  e( 1 ){.      c 
1b7e0 3d 20 66 67 65 74 63 28 70 2d 3e 69 6e 29 3b 0a  = fgetc(p->in);.
1b7f0 20 20 20 20 20 20 69 66 28 20 63 3d 3d 72 53 65        if( c==rSe
1b800 70 20 29 20 70 2d 3e 6e 4c 69 6e 65 2b 2b 3b 0a  p ) p->nLine++;.
1b810 20 20 20 20 20 20 69 66 28 20 63 3d 3d 63 51 75        if( c==cQu
1b820 6f 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ote ){.        i
1b830 66 28 20 70 63 3d 3d 63 51 75 6f 74 65 20 29 7b  f( pc==cQuote ){
1b840 0a 20 20 20 20 20 20 20 20 20 20 70 63 20 3d 20  .          pc = 
1b850 30 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e  0;.          con
1b860 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 7d  tinue;.        }
1b870 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
1b880 66 28 20 28 63 3d 3d 63 53 65 70 20 26 26 20 70  f( (c==cSep && p
1b890 63 3d 3d 63 51 75 6f 74 65 29 0a 20 20 20 20 20  c==cQuote).     
1b8a0 20 20 7c 7c 20 28 63 3d 3d 72 53 65 70 20 26 26    || (c==rSep &&
1b8b0 20 70 63 3d 3d 63 51 75 6f 74 65 29 0a 20 20 20   pc==cQuote).   
1b8c0 20 20 20 20 7c 7c 20 28 63 3d 3d 72 53 65 70 20      || (c==rSep 
1b8d0 26 26 20 70 63 3d 3d 27 5c 72 27 20 26 26 20 70  && pc=='\r' && p
1b8e0 70 63 3d 3d 63 51 75 6f 74 65 29 0a 20 20 20 20  pc==cQuote).    
1b8f0 20 20 20 7c 7c 20 28 63 3d 3d 45 4f 46 20 26 26     || (c==EOF &&
1b900 20 70 63 3d 3d 63 51 75 6f 74 65 29 0a 20 20 20   pc==cQuote).   
1b910 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 64 6f     ){.        do
1b920 7b 20 70 2d 3e 6e 2d 2d 3b 20 7d 77 68 69 6c 65  { p->n--; }while
1b930 28 20 70 2d 3e 7a 5b 70 2d 3e 6e 5d 21 3d 63 51  ( p->z[p->n]!=cQ
1b940 75 6f 74 65 20 29 3b 0a 20 20 20 20 20 20 20 20  uote );.        
1b950 70 2d 3e 63 54 65 72 6d 20 3d 20 63 3b 0a 20 20  p->cTerm = c;.  
1b960 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1b970 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
1b980 63 3d 3d 63 51 75 6f 74 65 20 26 26 20 63 21 3d  c==cQuote && c!=
1b990 27 5c 72 27 20 29 7b 0a 20 20 20 20 20 20 20 20  '\r' ){.        
1b9a0 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65  utf8_printf(stde
1b9b0 72 72 2c 20 22 25 73 3a 25 64 3a 20 75 6e 65 73  rr, "%s:%d: unes
1b9c0 63 61 70 65 64 20 25 63 20 63 68 61 72 61 63 74  caped %c charact
1b9d0 65 72 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  er\n",.         
1b9e0 20 20 20 20 20 20 20 70 2d 3e 7a 46 69 6c 65 2c         p->zFile,
1b9f0 20 70 2d 3e 6e 4c 69 6e 65 2c 20 63 51 75 6f 74   p->nLine, cQuot
1ba00 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
1ba10 20 20 69 66 28 20 63 3d 3d 45 4f 46 20 29 7b 0a    if( c==EOF ){.
1ba20 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69          utf8_pri
1ba30 6e 74 66 28 73 74 64 65 72 72 2c 20 22 25 73 3a  ntf(stderr, "%s:
1ba40 25 64 3a 20 75 6e 74 65 72 6d 69 6e 61 74 65 64  %d: unterminated
1ba50 20 25 63 2d 71 75 6f 74 65 64 20 66 69 65 6c 64   %c-quoted field
1ba60 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
1ba70 20 20 20 20 20 70 2d 3e 7a 46 69 6c 65 2c 20 73       p->zFile, s
1ba80 74 61 72 74 4c 69 6e 65 2c 20 63 51 75 6f 74 65  tartLine, cQuote
1ba90 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 63 54  );.        p->cT
1baa0 65 72 6d 20 3d 20 63 3b 0a 20 20 20 20 20 20 20  erm = c;.       
1bab0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
1bac0 20 20 20 20 20 20 69 6d 70 6f 72 74 5f 61 70 70        import_app
1bad0 65 6e 64 5f 63 68 61 72 28 70 2c 20 63 29 3b 0a  end_char(p, c);.
1bae0 20 20 20 20 20 20 70 70 63 20 3d 20 70 63 3b 0a        ppc = pc;.
1baf0 20 20 20 20 20 20 70 63 20 3d 20 63 3b 0a 20 20        pc = c;.  
1bb00 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
1bb10 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 74   /* If this is t
1bb20 68 65 20 66 69 72 73 74 20 66 69 65 6c 64 20 62  he first field b
1bb30 65 69 6e 67 20 70 61 72 73 65 64 20 61 6e 64 20  eing parsed and 
1bb40 69 74 20 62 65 67 69 6e 73 20 77 69 74 68 20 74  it begins with t
1bb50 68 65 0a 20 20 20 20 2a 2a 20 55 54 46 2d 38 20  he.    ** UTF-8 
1bb60 42 4f 4d 20 20 28 30 78 45 46 20 42 42 20 42 46  BOM  (0xEF BB BF
1bb70 29 20 74 68 65 6e 20 73 6b 69 70 20 74 68 65 20  ) then skip the 
1bb80 42 4f 4d 20 2a 2f 0a 20 20 20 20 69 66 28 20 28  BOM */.    if( (
1bb90 63 26 30 78 66 66 29 3d 3d 30 78 65 66 20 26 26  c&0xff)==0xef &&
1bba0 20 70 2d 3e 62 4e 6f 74 46 69 72 73 74 3d 3d 30   p->bNotFirst==0
1bbb0 20 29 7b 0a 20 20 20 20 20 20 69 6d 70 6f 72 74   ){.      import
1bbc0 5f 61 70 70 65 6e 64 5f 63 68 61 72 28 70 2c 20  _append_char(p, 
1bbd0 63 29 3b 0a 20 20 20 20 20 20 63 20 3d 20 66 67  c);.      c = fg
1bbe0 65 74 63 28 70 2d 3e 69 6e 29 3b 0a 20 20 20 20  etc(p->in);.    
1bbf0 20 20 69 66 28 20 28 63 26 30 78 66 66 29 3d 3d    if( (c&0xff)==
1bc00 30 78 62 62 20 29 7b 0a 20 20 20 20 20 20 20 20  0xbb ){.        
1bc10 69 6d 70 6f 72 74 5f 61 70 70 65 6e 64 5f 63 68  import_append_ch
1bc20 61 72 28 70 2c 20 63 29 3b 0a 20 20 20 20 20 20  ar(p, c);.      
1bc30 20 20 63 20 3d 20 66 67 65 74 63 28 70 2d 3e 69    c = fgetc(p->i
1bc40 6e 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  n);.        if( 
1bc50 28 63 26 30 78 66 66 29 3d 3d 30 78 62 66 20 29  (c&0xff)==0xbf )
1bc60 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 62  {.          p->b
1bc70 4e 6f 74 46 69 72 73 74 20 3d 20 31 3b 0a 20 20  NotFirst = 1;.  
1bc80 20 20 20 20 20 20 20 20 70 2d 3e 6e 20 3d 20 30          p->n = 0
1bc90 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ;.          retu
1bca0 72 6e 20 63 73 76 5f 72 65 61 64 5f 6f 6e 65 5f  rn csv_read_one_
1bcb0 66 69 65 6c 64 28 70 29 3b 0a 20 20 20 20 20 20  field(p);.      
1bcc0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
1bcd0 7d 0a 20 20 20 20 77 68 69 6c 65 28 20 63 21 3d  }.    while( c!=
1bce0 45 4f 46 20 26 26 20 63 21 3d 63 53 65 70 20 26  EOF && c!=cSep &
1bcf0 26 20 63 21 3d 72 53 65 70 20 29 7b 0a 20 20 20  & c!=rSep ){.   
1bd00 20 20 20 69 6d 70 6f 72 74 5f 61 70 70 65 6e 64     import_append
1bd10 5f 63 68 61 72 28 70 2c 20 63 29 3b 0a 20 20 20  _char(p, c);.   
1bd20 20 20 20 63 20 3d 20 66 67 65 74 63 28 70 2d 3e     c = fgetc(p->
1bd30 69 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  in);.    }.    i
1bd40 66 28 20 63 3d 3d 72 53 65 70 20 29 7b 0a 20 20  f( c==rSep ){.  
1bd50 20 20 20 20 70 2d 3e 6e 4c 69 6e 65 2b 2b 3b 0a      p->nLine++;.
1bd60 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6e 3e 30        if( p->n>0
1bd70 20 26 26 20 70 2d 3e 7a 5b 70 2d 3e 6e 2d 31 5d   && p->z[p->n-1]
1bd80 3d 3d 27 5c 72 27 20 29 20 70 2d 3e 6e 2d 2d 3b  =='\r' ) p->n--;
1bd90 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 63 54  .    }.    p->cT
1bda0 65 72 6d 20 3d 20 63 3b 0a 20 20 7d 0a 20 20 69  erm = c;.  }.  i
1bdb0 66 28 20 70 2d 3e 7a 20 29 20 70 2d 3e 7a 5b 70  f( p->z ) p->z[p
1bdc0 2d 3e 6e 5d 20 3d 20 30 3b 0a 20 20 70 2d 3e 62  ->n] = 0;.  p->b
1bdd0 4e 6f 74 46 69 72 73 74 20 3d 20 31 3b 0a 20 20  NotFirst = 1;.  
1bde0 72 65 74 75 72 6e 20 70 2d 3e 7a 3b 0a 7d 0a 0a  return p->z;.}..
1bdf0 2f 2a 20 52 65 61 64 20 61 20 73 69 6e 67 6c 65  /* Read a single
1be00 20 66 69 65 6c 64 20 6f 66 20 41 53 43 49 49 20   field of ASCII 
1be10 64 65 6c 69 6d 69 74 65 64 20 74 65 78 74 2e 0a  delimited text..
1be20 2a 2a 0a 2a 2a 20 20 20 2b 20 20 49 6e 70 75 74  **.**   +  Input
1be30 20 63 6f 6d 65 73 20 66 72 6f 6d 20 70 2d 3e 69   comes from p->i
1be40 6e 2e 0a 2a 2a 20 20 20 2b 20 20 53 74 6f 72 65  n..**   +  Store
1be50 20 72 65 73 75 6c 74 73 20 69 6e 20 70 2d 3e 7a   results in p->z
1be60 20 6f 66 20 6c 65 6e 67 74 68 20 70 2d 3e 6e 2e   of length p->n.
1be70 20 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20    Space to hold 
1be80 70 2d 3e 7a 20 63 6f 6d 65 73 0a 2a 2a 20 20 20  p->z comes.**   
1be90 20 20 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f     from sqlite3_
1bea0 6d 61 6c 6c 6f 63 36 34 28 29 2e 0a 2a 2a 20 20  malloc64()..**  
1beb0 20 2b 20 20 55 73 65 20 70 2d 3e 63 53 65 70 20   +  Use p->cSep 
1bec0 61 73 20 74 68 65 20 63 6f 6c 75 6d 6e 20 73 65  as the column se
1bed0 70 61 72 61 74 6f 72 2e 20 20 54 68 65 20 64 65  parator.  The de
1bee0 66 61 75 6c 74 20 69 73 20 22 5c 78 31 46 22 2e  fault is "\x1F".
1bef0 0a 2a 2a 20 20 20 2b 20 20 55 73 65 20 70 2d 3e  .**   +  Use p->
1bf00 72 53 65 70 20 61 73 20 74 68 65 20 72 6f 77 20  rSep as the row 
1bf10 73 65 70 61 72 61 74 6f 72 2e 20 20 54 68 65 20  separator.  The 
1bf20 64 65 66 61 75 6c 74 20 69 73 20 22 5c 78 31 45  default is "\x1E
1bf30 22 2e 0a 2a 2a 20 20 20 2b 20 20 4b 65 65 70 20  "..**   +  Keep 
1bf40 74 72 61 63 6b 20 6f 66 20 74 68 65 20 72 6f 77  track of the row
1bf50 20 6e 75 6d 62 65 72 20 69 6e 20 70 2d 3e 6e 4c   number in p->nL
1bf60 69 6e 65 2e 0a 2a 2a 20 20 20 2b 20 20 53 74 6f  ine..**   +  Sto
1bf70 72 65 20 74 68 65 20 63 68 61 72 61 63 74 65 72  re the character
1bf80 20 74 68 61 74 20 74 65 72 6d 69 6e 61 74 65 73   that terminates
1bf90 20 74 68 65 20 66 69 65 6c 64 20 69 6e 20 70 2d   the field in p-
1bfa0 3e 63 54 65 72 6d 2e 20 20 53 74 6f 72 65 0a 2a  >cTerm.  Store.*
1bfb0 2a 20 20 20 20 20 20 45 4f 46 20 6f 6e 20 65 6e  *      EOF on en
1bfc0 64 2d 6f 66 2d 66 69 6c 65 2e 0a 2a 2a 20 20 20  d-of-file..**   
1bfd0 2b 20 20 52 65 70 6f 72 74 20 73 79 6e 74 61 78  +  Report syntax
1bfe0 20 65 72 72 6f 72 73 20 6f 6e 20 73 74 64 65 72   errors on stder
1bff0 72 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  r.*/.static char
1c000 20 2a 53 51 4c 49 54 45 5f 43 44 45 43 4c 20 61   *SQLITE_CDECL a
1c010 73 63 69 69 5f 72 65 61 64 5f 6f 6e 65 5f 66 69  scii_read_one_fi
1c020 65 6c 64 28 49 6d 70 6f 72 74 43 74 78 20 2a 70  eld(ImportCtx *p
1c030 29 7b 0a 20 20 69 6e 74 20 63 3b 0a 20 20 69 6e  ){.  int c;.  in
1c040 74 20 63 53 65 70 20 3d 20 70 2d 3e 63 43 6f 6c  t cSep = p->cCol
1c050 53 65 70 3b 0a 20 20 69 6e 74 20 72 53 65 70 20  Sep;.  int rSep 
1c060 3d 20 70 2d 3e 63 52 6f 77 53 65 70 3b 0a 20 20  = p->cRowSep;.  
1c070 70 2d 3e 6e 20 3d 20 30 3b 0a 20 20 63 20 3d 20  p->n = 0;.  c = 
1c080 66 67 65 74 63 28 70 2d 3e 69 6e 29 3b 0a 20 20  fgetc(p->in);.  
1c090 69 66 28 20 63 3d 3d 45 4f 46 20 7c 7c 20 73 65  if( c==EOF || se
1c0a0 65 6e 49 6e 74 65 72 72 75 70 74 20 29 7b 0a 20  enInterrupt ){. 
1c0b0 20 20 20 70 2d 3e 63 54 65 72 6d 20 3d 20 45 4f     p->cTerm = EO
1c0c0 46 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  F;.    return 0;
1c0d0 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 63 21  .  }.  while( c!
1c0e0 3d 45 4f 46 20 26 26 20 63 21 3d 63 53 65 70 20  =EOF && c!=cSep 
1c0f0 26 26 20 63 21 3d 72 53 65 70 20 29 7b 0a 20 20  && c!=rSep ){.  
1c100 20 20 69 6d 70 6f 72 74 5f 61 70 70 65 6e 64 5f    import_append_
1c110 63 68 61 72 28 70 2c 20 63 29 3b 0a 20 20 20 20  char(p, c);.    
1c120 63 20 3d 20 66 67 65 74 63 28 70 2d 3e 69 6e 29  c = fgetc(p->in)
1c130 3b 0a 20 20 7d 0a 20 20 69 66 28 20 63 3d 3d 72  ;.  }.  if( c==r
1c140 53 65 70 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 4c  Sep ){.    p->nL
1c150 69 6e 65 2b 2b 3b 0a 20 20 7d 0a 20 20 70 2d 3e  ine++;.  }.  p->
1c160 63 54 65 72 6d 20 3d 20 63 3b 0a 20 20 69 66 28  cTerm = c;.  if(
1c170 20 70 2d 3e 7a 20 29 20 70 2d 3e 7a 5b 70 2d 3e   p->z ) p->z[p->
1c180 6e 5d 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e  n] = 0;.  return
1c190 20 70 2d 3e 7a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   p->z;.}../*.** 
1c1a0 54 72 79 20 74 6f 20 74 72 61 6e 73 66 65 72 20  Try to transfer 
1c1b0 64 61 74 61 20 66 6f 72 20 74 61 62 6c 65 20 7a  data for table z
1c1c0 54 61 62 6c 65 2e 20 20 49 66 20 61 6e 20 65 72  Table.  If an er
1c1d0 72 6f 72 20 69 73 20 73 65 65 6e 20 77 68 69 6c  ror is seen whil
1c1e0 65 0a 2a 2a 20 6d 6f 76 69 6e 67 20 66 6f 72 77  e.** moving forw
1c1f0 61 72 64 2c 20 74 72 79 20 74 6f 20 67 6f 20 62  ard, try to go b
1c200 61 63 6b 77 61 72 64 73 2e 20 20 54 68 65 20 62  ackwards.  The b
1c210 61 63 6b 77 61 72 64 73 20 6d 6f 76 65 6d 65 6e  ackwards movemen
1c220 74 20 77 6f 6e 27 74 0a 2a 2a 20 77 6f 72 6b 20  t won't.** work 
1c230 66 6f 72 20 57 49 54 48 4f 55 54 20 52 4f 57 49  for WITHOUT ROWI
1c240 44 20 74 61 62 6c 65 73 2e 0a 2a 2f 0a 73 74 61  D tables..*/.sta
1c250 74 69 63 20 76 6f 69 64 20 74 72 79 54 6f 43 6c  tic void tryToCl
1c260 6f 6e 65 44 61 74 61 28 0a 20 20 53 68 65 6c 6c  oneData(.  Shell
1c270 53 74 61 74 65 20 2a 70 2c 0a 20 20 73 71 6c 69  State *p,.  sqli
1c280 74 65 33 20 2a 6e 65 77 44 62 2c 0a 20 20 63 6f  te3 *newDb,.  co
1c290 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62 6c 65  nst char *zTable
1c2a0 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  .){.  sqlite3_st
1c2b0 6d 74 20 2a 70 51 75 65 72 79 20 3d 20 30 3b 0a  mt *pQuery = 0;.
1c2c0 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
1c2d0 70 49 6e 73 65 72 74 20 3d 20 30 3b 0a 20 20 63  pInsert = 0;.  c
1c2e0 68 61 72 20 2a 7a 51 75 65 72 79 20 3d 20 30 3b  har *zQuery = 0;
1c2f0 0a 20 20 63 68 61 72 20 2a 7a 49 6e 73 65 72 74  .  char *zInsert
1c300 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a   = 0;.  int rc;.
1c310 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6e 3b 0a 20    int i, j, n;. 
1c320 20 69 6e 74 20 6e 54 61 62 6c 65 20 3d 20 73 74   int nTable = st
1c330 72 6c 65 6e 33 30 28 7a 54 61 62 6c 65 29 3b 0a  rlen30(zTable);.
1c340 20 20 69 6e 74 20 6b 20 3d 20 30 3b 0a 20 20 69    int k = 0;.  i
1c350 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 63 6f  nt cnt = 0;.  co
1c360 6e 73 74 20 69 6e 74 20 73 70 69 6e 52 61 74 65  nst int spinRate
1c370 20 3d 20 31 30 30 30 30 3b 0a 0a 20 20 7a 51 75   = 10000;..  zQu
1c380 65 72 79 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  ery = sqlite3_mp
1c390 72 69 6e 74 66 28 22 53 45 4c 45 43 54 20 2a 20  rintf("SELECT * 
1c3a0 46 52 4f 4d 20 5c 22 25 77 5c 22 22 2c 20 7a 54  FROM \"%w\"", zT
1c3b0 61 62 6c 65 29 3b 0a 20 20 72 63 20 3d 20 73 71  able);.  rc = sq
1c3c0 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32  lite3_prepare_v2
1c3d0 28 70 2d 3e 64 62 2c 20 7a 51 75 65 72 79 2c 20  (p->db, zQuery, 
1c3e0 2d 31 2c 20 26 70 51 75 65 72 79 2c 20 30 29 3b  -1, &pQuery, 0);
1c3f0 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20  .  if( rc ){.   
1c400 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64   utf8_printf(std
1c410 65 72 72 2c 20 22 45 72 72 6f 72 20 25 64 3a 20  err, "Error %d: 
1c420 25 73 20 6f 6e 20 5b 25 73 5d 5c 6e 22 2c 0a 20  %s on [%s]\n",. 
1c430 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
1c440 65 33 5f 65 78 74 65 6e 64 65 64 5f 65 72 72 63  e3_extended_errc
1c450 6f 64 65 28 70 2d 3e 64 62 29 2c 20 73 71 6c 69  ode(p->db), sqli
1c460 74 65 33 5f 65 72 72 6d 73 67 28 70 2d 3e 64 62  te3_errmsg(p->db
1c470 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a  ),.            z
1c480 51 75 65 72 79 29 3b 0a 20 20 20 20 67 6f 74 6f  Query);.    goto
1c490 20 65 6e 64 5f 64 61 74 61 5f 78 66 65 72 3b 0a   end_data_xfer;.
1c4a0 20 20 7d 0a 20 20 6e 20 3d 20 73 71 6c 69 74 65    }.  n = sqlite
1c4b0 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 70  3_column_count(p
1c4c0 51 75 65 72 79 29 3b 0a 20 20 7a 49 6e 73 65 72  Query);.  zInser
1c4d0 74 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  t = sqlite3_mall
1c4e0 6f 63 36 34 28 32 30 30 20 2b 20 6e 54 61 62 6c  oc64(200 + nTabl
1c4f0 65 20 2b 20 6e 2a 33 29 3b 0a 20 20 69 66 28 20  e + n*3);.  if( 
1c500 7a 49 6e 73 65 72 74 3d 3d 30 20 29 7b 0a 20 20  zInsert==0 ){.  
1c510 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64    raw_printf(std
1c520 65 72 72 2c 20 22 6f 75 74 20 6f 66 20 6d 65 6d  err, "out of mem
1c530 6f 72 79 5c 6e 22 29 3b 0a 20 20 20 20 67 6f 74  ory\n");.    got
1c540 6f 20 65 6e 64 5f 64 61 74 61 5f 78 66 65 72 3b  o end_data_xfer;
1c550 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 73  .  }.  sqlite3_s
1c560 6e 70 72 69 6e 74 66 28 32 30 30 2b 6e 54 61 62  nprintf(200+nTab
1c570 6c 65 2c 7a 49 6e 73 65 72 74 2c 0a 20 20 20 20  le,zInsert,.    
1c580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
1c590 49 4e 53 45 52 54 20 4f 52 20 49 47 4e 4f 52 45  INSERT OR IGNORE
1c5a0 20 49 4e 54 4f 20 5c 22 25 73 5c 22 20 56 41 4c   INTO \"%s\" VAL
1c5b0 55 45 53 28 3f 22 2c 20 7a 54 61 62 6c 65 29 3b  UES(?", zTable);
1c5c0 0a 20 20 69 20 3d 20 73 74 72 6c 65 6e 33 30 28  .  i = strlen30(
1c5d0 7a 49 6e 73 65 72 74 29 3b 0a 20 20 66 6f 72 28  zInsert);.  for(
1c5e0 6a 3d 31 3b 20 6a 3c 6e 3b 20 6a 2b 2b 29 7b 0a  j=1; j<n; j++){.
1c5f0 20 20 20 20 6d 65 6d 63 70 79 28 7a 49 6e 73 65      memcpy(zInse
1c600 72 74 2b 69 2c 20 22 2c 3f 22 2c 20 32 29 3b 0a  rt+i, ",?", 2);.
1c610 20 20 20 20 69 20 2b 3d 20 32 3b 0a 20 20 7d 0a      i += 2;.  }.
1c620 20 20 6d 65 6d 63 70 79 28 7a 49 6e 73 65 72 74    memcpy(zInsert
1c630 2b 69 2c 20 22 29 3b 22 2c 20 33 29 3b 0a 20 20  +i, ");", 3);.  
1c640 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65  rc = sqlite3_pre
1c650 70 61 72 65 5f 76 32 28 6e 65 77 44 62 2c 20 7a  pare_v2(newDb, z
1c660 49 6e 73 65 72 74 2c 20 2d 31 2c 20 26 70 49 6e  Insert, -1, &pIn
1c670 73 65 72 74 2c 20 30 29 3b 0a 20 20 69 66 28 20  sert, 0);.  if( 
1c680 72 63 20 29 7b 0a 20 20 20 20 75 74 66 38 5f 70  rc ){.    utf8_p
1c690 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45  rintf(stderr, "E
1c6a0 72 72 6f 72 20 25 64 3a 20 25 73 20 6f 6e 20 5b  rror %d: %s on [
1c6b0 25 73 5d 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  %s]\n",.        
1c6c0 20 20 20 20 73 71 6c 69 74 65 33 5f 65 78 74 65      sqlite3_exte
1c6d0 6e 64 65 64 5f 65 72 72 63 6f 64 65 28 6e 65 77  nded_errcode(new
1c6e0 44 62 29 2c 20 73 71 6c 69 74 65 33 5f 65 72 72  Db), sqlite3_err
1c6f0 6d 73 67 28 6e 65 77 44 62 29 2c 0a 20 20 20 20  msg(newDb),.    
1c700 20 20 20 20 20 20 20 20 7a 51 75 65 72 79 29 3b          zQuery);
1c710 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 64 61  .    goto end_da
1c720 74 61 5f 78 66 65 72 3b 0a 20 20 7d 0a 20 20 66  ta_xfer;.  }.  f
1c730 6f 72 28 6b 3d 30 3b 20 6b 3c 32 3b 20 6b 2b 2b  or(k=0; k<2; k++
1c740 29 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 28 72  ){.    while( (r
1c750 63 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 65 70  c = sqlite3_step
1c760 28 70 51 75 65 72 79 29 29 3d 3d 53 51 4c 49 54  (pQuery))==SQLIT
1c770 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 20 20 66  E_ROW ){.      f
1c780 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b  or(i=0; i<n; i++
1c790 29 7b 0a 20 20 20 20 20 20 20 20 73 77 69 74 63  ){.        switc
1c7a0 68 28 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  h( sqlite3_colum
1c7b0 6e 5f 74 79 70 65 28 70 51 75 65 72 79 2c 20 69  n_type(pQuery, i
1c7c0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63  ) ){.          c
1c7d0 61 73 65 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 3a  ase SQLITE_NULL:
1c7e0 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73   {.            s
1c7f0 71 6c 69 74 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c  qlite3_bind_null
1c800 28 70 49 6e 73 65 72 74 2c 20 69 2b 31 29 3b 0a  (pInsert, i+1);.
1c810 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
1c820 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  k;.          }. 
1c830 20 20 20 20 20 20 20 20 20 63 61 73 65 20 53 51           case SQ
1c840 4c 49 54 45 5f 49 4e 54 45 47 45 52 3a 20 7b 0a  LITE_INTEGER: {.
1c850 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
1c860 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70  te3_bind_int64(p
1c870 49 6e 73 65 72 74 2c 20 69 2b 31 2c 20 73 71 6c  Insert, i+1, sql
1c880 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36  ite3_column_int6
1c890 34 28 70 51 75 65 72 79 2c 69 29 29 3b 0a 20 20  4(pQuery,i));.  
1c8a0 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
1c8b0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
1c8c0 20 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49         case SQLI
1c8d0 54 45 5f 46 4c 4f 41 54 3a 20 7b 0a 20 20 20 20  TE_FLOAT: {.    
1c8e0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
1c8f0 62 69 6e 64 5f 64 6f 75 62 6c 65 28 70 49 6e 73  bind_double(pIns
1c900 65 72 74 2c 20 69 2b 31 2c 20 73 71 6c 69 74 65  ert, i+1, sqlite
1c910 33 5f 63 6f 6c 75 6d 6e 5f 64 6f 75 62 6c 65 28  3_column_double(
1c920 70 51 75 65 72 79 2c 69 29 29 3b 0a 20 20 20 20  pQuery,i));.    
1c930 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
1c940 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1c950 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
1c960 5f 54 45 58 54 3a 20 7b 0a 20 20 20 20 20 20 20  _TEXT: {.       
1c970 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e       sqlite3_bin
1c980 64 5f 74 65 78 74 28 70 49 6e 73 65 72 74 2c 20  d_text(pInsert, 
1c990 69 2b 31 2c 0a 20 20 20 20 20 20 20 20 20 20 20  i+1,.           
1c9a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c9b0 20 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73    (const char*)s
1c9c0 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
1c9d0 78 74 28 70 51 75 65 72 79 2c 69 29 2c 0a 20 20  xt(pQuery,i),.  
1c9e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c9f0 20 20 20 20 20 20 20 20 20 20 20 2d 31 2c 20 53             -1, S
1ca00 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20  QLITE_STATIC);. 
1ca10 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
1ca20 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
1ca30 20 20 20 20 20 20 20 20 63 61 73 65 20 53 51 4c          case SQL
1ca40 49 54 45 5f 42 4c 4f 42 3a 20 7b 0a 20 20 20 20  ITE_BLOB: {.    
1ca50 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
1ca60 62 69 6e 64 5f 62 6c 6f 62 28 70 49 6e 73 65 72  bind_blob(pInser
1ca70 74 2c 20 69 2b 31 2c 20 73 71 6c 69 74 65 33 5f  t, i+1, sqlite3_
1ca80 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 28 70 51 75 65  column_blob(pQue
1ca90 72 79 2c 69 29 2c 0a 20 20 20 20 20 20 20 20 20  ry,i),.         
1caa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cac0 20 20 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d     sqlite3_colum
1cad0 6e 5f 62 79 74 65 73 28 70 51 75 65 72 79 2c 69  n_bytes(pQuery,i
1cae0 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
1caf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cb00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
1cb10 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20  QLITE_STATIC);. 
1cb20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
1cb30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
1cb40 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 20        }.      } 
1cb50 2f 2a 20 45 6e 64 20 66 6f 72 20 2a 2f 0a 20 20  /* End for */.  
1cb60 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1cb70 5f 73 74 65 70 28 70 49 6e 73 65 72 74 29 3b 0a  _step(pInsert);.
1cb80 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
1cb90 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63 21 3d 53  LITE_OK && rc!=S
1cba0 51 4c 49 54 45 5f 52 4f 57 20 26 26 20 72 63 21  QLITE_ROW && rc!
1cbb0 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a  =SQLITE_DONE ){.
1cbc0 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69          utf8_pri
1cbd0 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72  ntf(stderr, "Err
1cbe0 6f 72 20 25 64 3a 20 25 73 5c 6e 22 2c 20 73 71  or %d: %s\n", sq
1cbf0 6c 69 74 65 33 5f 65 78 74 65 6e 64 65 64 5f 65  lite3_extended_e
1cc00 72 72 63 6f 64 65 28 6e 65 77 44 62 29 2c 0a 20  rrcode(newDb),. 
1cc10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cc20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65         sqlite3_e
1cc30 72 72 6d 73 67 28 6e 65 77 44 62 29 29 3b 0a 20  rrmsg(newDb));. 
1cc40 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
1cc50 69 74 65 33 5f 72 65 73 65 74 28 70 49 6e 73 65  ite3_reset(pInse
1cc60 72 74 29 3b 0a 20 20 20 20 20 20 63 6e 74 2b 2b  rt);.      cnt++
1cc70 3b 0a 20 20 20 20 20 20 69 66 28 20 28 63 6e 74  ;.      if( (cnt
1cc80 25 73 70 69 6e 52 61 74 65 29 3d 3d 30 20 29 7b  %spinRate)==0 ){
1cc90 0a 20 20 20 20 20 20 20 20 70 72 69 6e 74 66 28  .        printf(
1cca0 22 25 63 5c 62 22 2c 20 22 7c 2f 2d 5c 5c 22 5b  "%c\b", "|/-\\"[
1ccb0 28 63 6e 74 2f 73 70 69 6e 52 61 74 65 29 25 34  (cnt/spinRate)%4
1ccc0 5d 29 3b 0a 20 20 20 20 20 20 20 20 66 66 6c 75  ]);.        fflu
1ccd0 73 68 28 73 74 64 6f 75 74 29 3b 0a 20 20 20 20  sh(stdout);.    
1cce0 20 20 7d 0a 20 20 20 20 7d 20 2f 2a 20 45 6e 64    }.    } /* End
1ccf0 20 77 68 69 6c 65 20 2a 2f 0a 20 20 20 20 69 66   while */.    if
1cd00 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e  ( rc==SQLITE_DON
1cd10 45 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 73  E ) break;.    s
1cd20 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
1cd30 70 51 75 65 72 79 29 3b 0a 20 20 20 20 73 71 6c  pQuery);.    sql
1cd40 69 74 65 33 5f 66 72 65 65 28 7a 51 75 65 72 79  ite3_free(zQuery
1cd50 29 3b 0a 20 20 20 20 7a 51 75 65 72 79 20 3d 20  );.    zQuery = 
1cd60 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
1cd70 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 5c  "SELECT * FROM \
1cd80 22 25 77 5c 22 20 4f 52 44 45 52 20 42 59 20 72  "%w\" ORDER BY r
1cd90 6f 77 69 64 20 44 45 53 43 3b 22 2c 0a 20 20 20  owid DESC;",.   
1cda0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cdb0 20 20 20 20 20 20 20 20 20 20 7a 54 61 62 6c 65            zTable
1cdc0 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
1cdd0 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 70  te3_prepare_v2(p
1cde0 2d 3e 64 62 2c 20 7a 51 75 65 72 79 2c 20 2d 31  ->db, zQuery, -1
1cdf0 2c 20 26 70 51 75 65 72 79 2c 20 30 29 3b 0a 20  , &pQuery, 0);. 
1ce00 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
1ce10 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73     utf8_printf(s
1ce20 74 64 65 72 72 2c 20 22 57 61 72 6e 69 6e 67 3a  tderr, "Warning:
1ce30 20 63 61 6e 6e 6f 74 20 73 74 65 70 20 5c 22 25   cannot step \"%
1ce40 73 5c 22 20 62 61 63 6b 77 61 72 64 73 22 2c 20  s\" backwards", 
1ce50 7a 54 61 62 6c 65 29 3b 0a 20 20 20 20 20 20 62  zTable);.      b
1ce60 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 20  reak;.    }.  } 
1ce70 2f 2a 20 45 6e 64 20 66 6f 72 28 6b 3d 30 2e 2e  /* End for(k=0..
1ce80 2e 29 20 2a 2f 0a 0a 65 6e 64 5f 64 61 74 61 5f  .) */..end_data_
1ce90 78 66 65 72 3a 0a 20 20 73 71 6c 69 74 65 33 5f  xfer:.  sqlite3_
1cea0 66 69 6e 61 6c 69 7a 65 28 70 51 75 65 72 79 29  finalize(pQuery)
1ceb0 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61  ;.  sqlite3_fina
1cec0 6c 69 7a 65 28 70 49 6e 73 65 72 74 29 3b 0a 20  lize(pInsert);. 
1ced0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 51   sqlite3_free(zQ
1cee0 75 65 72 79 29 3b 0a 20 20 73 71 6c 69 74 65 33  uery);.  sqlite3
1cef0 5f 66 72 65 65 28 7a 49 6e 73 65 72 74 29 3b 0a  _free(zInsert);.
1cf00 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f  }.../*.** Try to
1cf10 20 74 72 61 6e 73 66 65 72 20 61 6c 6c 20 72 6f   transfer all ro
1cf20 77 73 20 6f 66 20 74 68 65 20 73 63 68 65 6d 61  ws of the schema
1cf30 20 74 68 61 74 20 6d 61 74 63 68 20 7a 57 68 65   that match zWhe
1cf40 72 65 2e 20 20 46 6f 72 0a 2a 2a 20 65 61 63 68  re.  For.** each
1cf50 20 72 6f 77 2c 20 69 6e 76 6f 6b 65 20 78 46 6f   row, invoke xFo
1cf60 72 45 61 63 68 28 29 20 6f 6e 20 74 68 65 20 6f  rEach() on the o
1cf70 62 6a 65 63 74 20 64 65 66 69 6e 65 64 20 62 79  bject defined by
1cf80 20 74 68 61 74 20 72 6f 77 2e 0a 2a 2a 20 49 66   that row..** If
1cf90 20 61 6e 20 65 72 72 6f 72 20 69 73 20 65 6e 63   an error is enc
1cfa0 6f 75 6e 74 65 72 65 64 20 77 68 69 6c 65 20 6d  ountered while m
1cfb0 6f 76 69 6e 67 20 66 6f 72 77 61 72 64 20 74 68  oving forward th
1cfc0 72 6f 75 67 68 20 74 68 65 0a 2a 2a 20 73 71 6c  rough the.** sql
1cfd0 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65  ite_master table
1cfe0 2c 20 74 72 79 20 61 67 61 69 6e 20 6d 6f 76 69  , try again movi
1cff0 6e 67 20 62 61 63 6b 77 61 72 64 73 2e 0a 2a 2f  ng backwards..*/
1d000 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74 72 79  .static void try
1d010 54 6f 43 6c 6f 6e 65 53 63 68 65 6d 61 28 0a 20  ToCloneSchema(. 
1d020 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 2c 0a   ShellState *p,.
1d030 20 20 73 71 6c 69 74 65 33 20 2a 6e 65 77 44 62    sqlite3 *newDb
1d040 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
1d050 7a 57 68 65 72 65 2c 0a 20 20 76 6f 69 64 20 28  zWhere,.  void (
1d060 2a 78 46 6f 72 45 61 63 68 29 28 53 68 65 6c 6c  *xForEach)(Shell
1d070 53 74 61 74 65 2a 2c 73 71 6c 69 74 65 33 2a 2c  State*,sqlite3*,
1d080 63 6f 6e 73 74 20 63 68 61 72 2a 29 0a 29 7b 0a  const char*).){.
1d090 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
1d0a0 70 51 75 65 72 79 20 3d 20 30 3b 0a 20 20 63 68  pQuery = 0;.  ch
1d0b0 61 72 20 2a 7a 51 75 65 72 79 20 3d 20 30 3b 0a  ar *zQuery = 0;.
1d0c0 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 6f 6e 73    int rc;.  cons
1d0d0 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
1d0e0 2a 7a 4e 61 6d 65 3b 0a 20 20 63 6f 6e 73 74 20  *zName;.  const 
1d0f0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a  unsigned char *z
1d100 53 71 6c 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72  Sql;.  char *zEr
1d110 72 4d 73 67 20 3d 20 30 3b 0a 0a 20 20 7a 51 75  rMsg = 0;..  zQu
1d120 65 72 79 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  ery = sqlite3_mp
1d130 72 69 6e 74 66 28 22 53 45 4c 45 43 54 20 6e 61  rintf("SELECT na
1d140 6d 65 2c 20 73 71 6c 20 46 52 4f 4d 20 73 71 6c  me, sql FROM sql
1d150 69 74 65 5f 6d 61 73 74 65 72 22 0a 20 20 20 20  ite_master".    
1d160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d170 20 20 20 20 20 20 20 22 20 57 48 45 52 45 20 25         " WHERE %
1d180 73 22 2c 20 7a 57 68 65 72 65 29 3b 0a 20 20 72  s", zWhere);.  r
1d190 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70  c = sqlite3_prep
1d1a0 61 72 65 5f 76 32 28 70 2d 3e 64 62 2c 20 7a 51  are_v2(p->db, zQ
1d1b0 75 65 72 79 2c 20 2d 31 2c 20 26 70 51 75 65 72  uery, -1, &pQuer
1d1c0 79 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 20  y, 0);.  if( rc 
1d1d0 29 7b 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e  ){.    utf8_prin
1d1e0 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f  tf(stderr, "Erro
1d1f0 72 3a 20 28 25 64 29 20 25 73 20 6f 6e 20 5b 25  r: (%d) %s on [%
1d200 73 5d 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  s]\n",.         
1d210 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
1d220 65 33 5f 65 78 74 65 6e 64 65 64 5f 65 72 72 63  e3_extended_errc
1d230 6f 64 65 28 70 2d 3e 64 62 29 2c 20 73 71 6c 69  ode(p->db), sqli
1d240 74 65 33 5f 65 72 72 6d 73 67 28 70 2d 3e 64 62  te3_errmsg(p->db
1d250 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
1d260 20 20 20 20 20 20 20 7a 51 75 65 72 79 29 3b 0a         zQuery);.
1d270 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 73 63 68      goto end_sch
1d280 65 6d 61 5f 78 66 65 72 3b 0a 20 20 7d 0a 20 20  ema_xfer;.  }.  
1d290 77 68 69 6c 65 28 20 28 72 63 20 3d 20 73 71 6c  while( (rc = sql
1d2a0 69 74 65 33 5f 73 74 65 70 28 70 51 75 65 72 79  ite3_step(pQuery
1d2b0 29 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29  ))==SQLITE_ROW )
1d2c0 7b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71  {.    zName = sq
1d2d0 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
1d2e0 74 28 70 51 75 65 72 79 2c 20 30 29 3b 0a 20 20  t(pQuery, 0);.  
1d2f0 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33    zSql = sqlite3
1d300 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 51 75  _column_text(pQu
1d310 65 72 79 2c 20 31 29 3b 0a 20 20 20 20 70 72 69  ery, 1);.    pri
1d320 6e 74 66 28 22 25 73 2e 2e 2e 20 22 2c 20 7a 4e  ntf("%s... ", zN
1d330 61 6d 65 29 3b 20 66 66 6c 75 73 68 28 73 74 64  ame); fflush(std
1d340 6f 75 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  out);.    sqlite
1d350 33 5f 65 78 65 63 28 6e 65 77 44 62 2c 20 28 63  3_exec(newDb, (c
1d360 6f 6e 73 74 20 63 68 61 72 2a 29 7a 53 71 6c 2c  onst char*)zSql,
1d370 20 30 2c 20 30 2c 20 26 7a 45 72 72 4d 73 67 29   0, 0, &zErrMsg)
1d380 3b 0a 20 20 20 20 69 66 28 20 7a 45 72 72 4d 73  ;.    if( zErrMs
1d390 67 20 29 7b 0a 20 20 20 20 20 20 75 74 66 38 5f  g ){.      utf8_
1d3a0 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
1d3b0 45 72 72 6f 72 3a 20 25 73 5c 6e 53 51 4c 3a 20  Error: %s\nSQL: 
1d3c0 5b 25 73 5d 5c 6e 22 2c 20 7a 45 72 72 4d 73 67  [%s]\n", zErrMsg
1d3d0 2c 20 7a 53 71 6c 29 3b 0a 20 20 20 20 20 20 73  , zSql);.      s
1d3e0 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 45 72 72  qlite3_free(zErr
1d3f0 4d 73 67 29 3b 0a 20 20 20 20 20 20 7a 45 72 72  Msg);.      zErr
1d400 4d 73 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  Msg = 0;.    }. 
1d410 20 20 20 69 66 28 20 78 46 6f 72 45 61 63 68 20     if( xForEach 
1d420 29 7b 0a 20 20 20 20 20 20 78 46 6f 72 45 61 63  ){.      xForEac
1d430 68 28 70 2c 20 6e 65 77 44 62 2c 20 28 63 6f 6e  h(p, newDb, (con
1d440 73 74 20 63 68 61 72 2a 29 7a 4e 61 6d 65 29 3b  st char*)zName);
1d450 0a 20 20 20 20 7d 0a 20 20 20 20 70 72 69 6e 74  .    }.    print
1d460 66 28 22 64 6f 6e 65 5c 6e 22 29 3b 0a 20 20 7d  f("done\n");.  }
1d470 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
1d480 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 73 71  E_DONE ){.    sq
1d490 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
1d4a0 51 75 65 72 79 29 3b 0a 20 20 20 20 73 71 6c 69  Query);.    sqli
1d4b0 74 65 33 5f 66 72 65 65 28 7a 51 75 65 72 79 29  te3_free(zQuery)
1d4c0 3b 0a 20 20 20 20 7a 51 75 65 72 79 20 3d 20 73  ;.    zQuery = s
1d4d0 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
1d4e0 53 45 4c 45 43 54 20 6e 61 6d 65 2c 20 73 71 6c  SELECT name, sql
1d4f0 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73   FROM sqlite_mas
1d500 74 65 72 22 0a 20 20 20 20 20 20 20 20 20 20 20  ter".           
1d510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d520 20 20 22 20 57 48 45 52 45 20 25 73 20 4f 52 44    " WHERE %s ORD
1d530 45 52 20 42 59 20 72 6f 77 69 64 20 44 45 53 43  ER BY rowid DESC
1d540 22 2c 20 7a 57 68 65 72 65 29 3b 0a 20 20 20 20  ", zWhere);.    
1d550 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65  rc = sqlite3_pre
1d560 70 61 72 65 5f 76 32 28 70 2d 3e 64 62 2c 20 7a  pare_v2(p->db, z
1d570 51 75 65 72 79 2c 20 2d 31 2c 20 26 70 51 75 65  Query, -1, &pQue
1d580 72 79 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  ry, 0);.    if( 
1d590 72 63 20 29 7b 0a 20 20 20 20 20 20 75 74 66 38  rc ){.      utf8
1d5a0 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
1d5b0 22 45 72 72 6f 72 3a 20 28 25 64 29 20 25 73 20  "Error: (%d) %s 
1d5c0 6f 6e 20 5b 25 73 5d 5c 6e 22 2c 0a 20 20 20 20  on [%s]\n",.    
1d5d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d5e0 20 20 73 71 6c 69 74 65 33 5f 65 78 74 65 6e 64    sqlite3_extend
1d5f0 65 64 5f 65 72 72 63 6f 64 65 28 70 2d 3e 64 62  ed_errcode(p->db
1d600 29 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73  ), sqlite3_errms
1d610 67 28 70 2d 3e 64 62 29 2c 0a 20 20 20 20 20 20  g(p->db),.      
1d620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d630 7a 51 75 65 72 79 29 3b 0a 20 20 20 20 20 20 67  zQuery);.      g
1d640 6f 74 6f 20 65 6e 64 5f 73 63 68 65 6d 61 5f 78  oto end_schema_x
1d650 66 65 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 77  fer;.    }.    w
1d660 68 69 6c 65 28 20 28 72 63 20 3d 20 73 71 6c 69  hile( (rc = sqli
1d670 74 65 33 5f 73 74 65 70 28 70 51 75 65 72 79 29  te3_step(pQuery)
1d680 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b  )==SQLITE_ROW ){
1d690 0a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73  .      zName = s
1d6a0 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
1d6b0 78 74 28 70 51 75 65 72 79 2c 20 30 29 3b 0a 20  xt(pQuery, 0);. 
1d6c0 20 20 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69       zSql = sqli
1d6d0 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28  te3_column_text(
1d6e0 70 51 75 65 72 79 2c 20 31 29 3b 0a 20 20 20 20  pQuery, 1);.    
1d6f0 20 20 70 72 69 6e 74 66 28 22 25 73 2e 2e 2e 20    printf("%s... 
1d700 22 2c 20 7a 4e 61 6d 65 29 3b 20 66 66 6c 75 73  ", zName); fflus
1d710 68 28 73 74 64 6f 75 74 29 3b 0a 20 20 20 20 20  h(stdout);.     
1d720 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 6e 65   sqlite3_exec(ne
1d730 77 44 62 2c 20 28 63 6f 6e 73 74 20 63 68 61 72  wDb, (const char
1d740 2a 29 7a 53 71 6c 2c 20 30 2c 20 30 2c 20 26 7a  *)zSql, 0, 0, &z
1d750 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 69  ErrMsg);.      i
1d760 66 28 20 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20  f( zErrMsg ){.  
1d770 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
1d780 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72  f(stderr, "Error
1d790 3a 20 25 73 5c 6e 53 51 4c 3a 20 5b 25 73 5d 5c  : %s\nSQL: [%s]\
1d7a0 6e 22 2c 20 7a 45 72 72 4d 73 67 2c 20 7a 53 71  n", zErrMsg, zSq
1d7b0 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  l);.        sqli
1d7c0 74 65 33 5f 66 72 65 65 28 7a 45 72 72 4d 73 67  te3_free(zErrMsg
1d7d0 29 3b 0a 20 20 20 20 20 20 20 20 7a 45 72 72 4d  );.        zErrM
1d7e0 73 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  sg = 0;.      }.
1d7f0 20 20 20 20 20 20 69 66 28 20 78 46 6f 72 45 61        if( xForEa
1d800 63 68 20 29 7b 0a 20 20 20 20 20 20 20 20 78 46  ch ){.        xF
1d810 6f 72 45 61 63 68 28 70 2c 20 6e 65 77 44 62 2c  orEach(p, newDb,
1d820 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 7a 4e   (const char*)zN
1d830 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ame);.      }.  
1d840 20 20 20 20 70 72 69 6e 74 66 28 22 64 6f 6e 65      printf("done
1d850 5c 6e 22 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  \n");.    }.  }.
1d860 65 6e 64 5f 73 63 68 65 6d 61 5f 78 66 65 72 3a  end_schema_xfer:
1d870 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c  .  sqlite3_final
1d880 69 7a 65 28 70 51 75 65 72 79 29 3b 0a 20 20 73  ize(pQuery);.  s
1d890 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 51 75 65  qlite3_free(zQue
1d8a0 72 79 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70  ry);.}../*.** Op
1d8b0 65 6e 20 61 20 6e 65 77 20 64 61 74 61 62 61 73  en a new databas
1d8c0 65 20 66 69 6c 65 20 6e 61 6d 65 64 20 22 7a 4e  e file named "zN
1d8d0 65 77 44 62 22 2e 20 20 54 72 79 20 74 6f 20 72  ewDb".  Try to r
1d8e0 65 63 6f 76 65 72 20 61 73 20 6d 75 63 68 20 69  ecover as much i
1d8f0 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 61 73  nformation.** as
1d900 20 70 6f 73 73 69 62 6c 65 20 6f 75 74 20 6f 66   possible out of
1d910 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
1d920 73 65 20 28 77 68 69 63 68 20 6d 69 67 68 74 20  se (which might 
1d930 62 65 20 63 6f 72 72 75 70 74 29 20 61 6e 64 20  be corrupt) and 
1d940 77 72 69 74 65 20 69 74 0a 2a 2a 20 69 6e 74 6f  write it.** into
1d950 20 7a 4e 65 77 44 62 2e 0a 2a 2f 0a 73 74 61 74   zNewDb..*/.stat
1d960 69 63 20 76 6f 69 64 20 74 72 79 54 6f 43 6c 6f  ic void tryToClo
1d970 6e 65 28 53 68 65 6c 6c 53 74 61 74 65 20 2a 70  ne(ShellState *p
1d980 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e  , const char *zN
1d990 65 77 44 62 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ewDb){.  int rc;
1d9a0 0a 20 20 73 71 6c 69 74 65 33 20 2a 6e 65 77 44  .  sqlite3 *newD
1d9b0 62 20 3d 20 30 3b 0a 20 20 69 66 28 20 61 63 63  b = 0;.  if( acc
1d9c0 65 73 73 28 7a 4e 65 77 44 62 2c 30 29 3d 3d 30  ess(zNewDb,0)==0
1d9d0 20 29 7b 0a 20 20 20 20 75 74 66 38 5f 70 72 69   ){.    utf8_pri
1d9e0 6e 74 66 28 73 74 64 65 72 72 2c 20 22 46 69 6c  ntf(stderr, "Fil
1d9f0 65 20 5c 22 25 73 5c 22 20 61 6c 72 65 61 64 79  e \"%s\" already
1da00 20 65 78 69 73 74 73 2e 5c 6e 22 2c 20 7a 4e 65   exists.\n", zNe
1da10 77 44 62 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  wDb);.    return
1da20 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c  ;.  }.  rc = sql
1da30 69 74 65 33 5f 6f 70 65 6e 28 7a 4e 65 77 44 62  ite3_open(zNewDb
1da40 2c 20 26 6e 65 77 44 62 29 3b 0a 20 20 69 66 28  , &newDb);.  if(
1da50 20 72 63 20 29 7b 0a 20 20 20 20 75 74 66 38 5f   rc ){.    utf8_
1da60 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
1da70 43 61 6e 6e 6f 74 20 63 72 65 61 74 65 20 6f 75  Cannot create ou
1da80 74 70 75 74 20 64 61 74 61 62 61 73 65 3a 20 25  tput database: %
1da90 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  s\n",.          
1daa0 20 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67    sqlite3_errmsg
1dab0 28 6e 65 77 44 62 29 29 3b 0a 20 20 7d 65 6c 73  (newDb));.  }els
1dac0 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 65  e{.    sqlite3_e
1dad0 78 65 63 28 70 2d 3e 64 62 2c 20 22 50 52 41 47  xec(p->db, "PRAG
1dae0 4d 41 20 77 72 69 74 61 62 6c 65 5f 73 63 68 65  MA writable_sche
1daf0 6d 61 3d 4f 4e 3b 22 2c 20 30 2c 20 30 2c 20 30  ma=ON;", 0, 0, 0
1db00 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 65  );.    sqlite3_e
1db10 78 65 63 28 6e 65 77 44 62 2c 20 22 42 45 47 49  xec(newDb, "BEGI
1db20 4e 20 45 58 43 4c 55 53 49 56 45 3b 22 2c 20 30  N EXCLUSIVE;", 0
1db30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 74 72 79  , 0, 0);.    try
1db40 54 6f 43 6c 6f 6e 65 53 63 68 65 6d 61 28 70 2c  ToCloneSchema(p,
1db50 20 6e 65 77 44 62 2c 20 22 74 79 70 65 3d 27 74   newDb, "type='t
1db60 61 62 6c 65 27 22 2c 20 74 72 79 54 6f 43 6c 6f  able'", tryToClo
1db70 6e 65 44 61 74 61 29 3b 0a 20 20 20 20 74 72 79  neData);.    try
1db80 54 6f 43 6c 6f 6e 65 53 63 68 65 6d 61 28 70 2c  ToCloneSchema(p,
1db90 20 6e 65 77 44 62 2c 20 22 74 79 70 65 21 3d 27   newDb, "type!='
1dba0 74 61 62 6c 65 27 22 2c 20 30 29 3b 0a 20 20 20  table'", 0);.   
1dbb0 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 6e 65   sqlite3_exec(ne
1dbc0 77 44 62 2c 20 22 43 4f 4d 4d 49 54 3b 22 2c 20  wDb, "COMMIT;", 
1dbd0 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71  0, 0, 0);.    sq
1dbe0 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62  lite3_exec(p->db
1dbf0 2c 20 22 50 52 41 47 4d 41 20 77 72 69 74 61 62  , "PRAGMA writab
1dc00 6c 65 5f 73 63 68 65 6d 61 3d 4f 46 46 3b 22 2c  le_schema=OFF;",
1dc10 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20   0, 0, 0);.  }. 
1dc20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 6e   sqlite3_close(n
1dc30 65 77 44 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ewDb);.}../*.** 
1dc40 43 68 61 6e 67 65 20 74 68 65 20 6f 75 74 70 75  Change the outpu
1dc50 74 20 66 69 6c 65 20 62 61 63 6b 20 74 6f 20 73  t file back to s
1dc60 74 64 6f 75 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  tdout..**.** If 
1dc70 74 68 65 20 70 2d 3e 64 6f 58 64 67 4f 70 65 6e  the p->doXdgOpen
1dc80 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68   flag is set, th
1dc90 61 74 20 6d 65 61 6e 73 20 74 68 65 20 6f 75 74  at means the out
1dca0 70 75 74 20 77 61 73 20 62 65 69 6e 67 0a 2a 2a  put was being.**
1dcb0 20 72 65 64 69 72 65 63 74 65 64 20 74 6f 20 61   redirected to a
1dcc0 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20   temporary file 
1dcd0 6e 61 6d 65 64 20 62 79 20 70 2d 3e 7a 54 65 6d  named by p->zTem
1dce0 70 46 69 6c 65 2e 20 20 49 6e 20 74 68 61 74 20  pFile.  In that 
1dcf0 63 61 73 65 2c 0a 2a 2a 20 6c 61 75 6e 63 68 20  case,.** launch 
1dd00 73 74 61 72 74 2f 6f 70 65 6e 2f 78 64 67 2d 6f  start/open/xdg-o
1dd10 70 65 6e 20 6f 6e 20 74 68 61 74 20 74 65 6d 70  pen on that temp
1dd20 6f 72 61 72 79 20 66 69 6c 65 2e 0a 2a 2f 0a 73  orary file..*/.s
1dd30 74 61 74 69 63 20 76 6f 69 64 20 6f 75 74 70 75  tatic void outpu
1dd40 74 5f 72 65 73 65 74 28 53 68 65 6c 6c 53 74 61  t_reset(ShellSta
1dd50 74 65 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d  te *p){.  if( p-
1dd60 3e 6f 75 74 66 69 6c 65 5b 30 5d 3d 3d 27 7c 27  >outfile[0]=='|'
1dd70 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   ){.#ifndef SQLI
1dd80 54 45 5f 4f 4d 49 54 5f 50 4f 50 45 4e 0a 20 20  TE_OMIT_POPEN.  
1dd90 20 20 70 63 6c 6f 73 65 28 70 2d 3e 6f 75 74 29    pclose(p->out)
1dda0 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 65 6c 73 65  ;.#endif.  }else
1ddb0 7b 0a 20 20 20 20 6f 75 74 70 75 74 5f 66 69 6c  {.    output_fil
1ddc0 65 5f 63 6c 6f 73 65 28 70 2d 3e 6f 75 74 29 3b  e_close(p->out);
1ddd0 0a 20 20 20 20 69 66 28 20 70 2d 3e 64 6f 58 64  .    if( p->doXd
1dde0 67 4f 70 65 6e 20 29 7b 0a 20 20 20 20 20 20 63  gOpen ){.      c
1ddf0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 58 64 67 4f  onst char *zXdgO
1de00 70 65 6e 43 6d 64 20 3d 0a 23 69 66 20 64 65 66  penCmd =.#if def
1de10 69 6e 65 64 28 5f 57 49 4e 33 32 29 0a 20 20 20  ined(_WIN32).   
1de20 20 20 20 22 73 74 61 72 74 22 3b 0a 23 65 6c 69     "start";.#eli
1de30 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  f defined(__APPL
1de40 45 5f 5f 29 0a 20 20 20 20 20 20 22 6f 70 65 6e  E__).      "open
1de50 22 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 22  ";.#else.      "
1de60 78 64 67 2d 6f 70 65 6e 22 3b 0a 23 65 6e 64 69  xdg-open";.#endi
1de70 66 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 43  f.      char *zC
1de80 6d 64 3b 0a 20 20 20 20 20 20 7a 43 6d 64 20 3d  md;.      zCmd =
1de90 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
1dea0 28 22 25 73 20 25 73 22 2c 20 7a 58 64 67 4f 70  ("%s %s", zXdgOp
1deb0 65 6e 43 6d 64 2c 20 70 2d 3e 7a 54 65 6d 70 46  enCmd, p->zTempF
1dec0 69 6c 65 29 3b 0a 20 20 20 20 20 20 73 79 73 74  ile);.      syst
1ded0 65 6d 28 7a 43 6d 64 29 3b 0a 20 20 20 20 20 20  em(zCmd);.      
1dee0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6d  sqlite3_free(zCm
1def0 64 29 3b 0a 20 20 20 20 20 20 70 2d 3e 6d 6f 64  d);.      p->mod
1df00 65 20 3d 20 70 2d 3e 64 6f 58 64 67 4f 70 65 6e  e = p->doXdgOpen
1df10 20 2d 20 31 3b 0a 20 20 20 20 20 20 70 2d 3e 64   - 1;.      p->d
1df20 6f 58 64 67 4f 70 65 6e 20 3d 20 30 3b 0a 20 20  oXdgOpen = 0;.  
1df30 20 20 7d 0a 20 20 7d 0a 20 20 70 2d 3e 6f 75 74    }.  }.  p->out
1df40 66 69 6c 65 5b 30 5d 20 3d 20 30 3b 0a 20 20 70  file[0] = 0;.  p
1df50 2d 3e 6f 75 74 20 3d 20 73 74 64 6f 75 74 3b 0a  ->out = stdout;.
1df60 7d 0a 0a 2f 2a 0a 2a 2a 20 52 75 6e 20 61 6e 20  }../*.** Run an 
1df70 53 51 4c 20 63 6f 6d 6d 61 6e 64 20 61 6e 64 20  SQL command and 
1df80 72 65 74 75 72 6e 20 74 68 65 20 73 69 6e 67 6c  return the singl
1df90 65 20 69 6e 74 65 67 65 72 20 72 65 73 75 6c 74  e integer result
1dfa0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1dfb0 64 62 5f 69 6e 74 28 53 68 65 6c 6c 53 74 61 74  db_int(ShellStat
1dfc0 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72  e *p, const char
1dfd0 20 2a 7a 53 71 6c 29 7b 0a 20 20 73 71 6c 69 74   *zSql){.  sqlit
1dfe0 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a  e3_stmt *pStmt;.
1dff0 20 20 69 6e 74 20 72 65 73 20 3d 20 30 3b 0a 20    int res = 0;. 
1e000 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
1e010 5f 76 32 28 70 2d 3e 64 62 2c 20 7a 53 71 6c 2c  _v2(p->db, zSql,
1e020 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b   -1, &pStmt, 0);
1e030 0a 20 20 69 66 28 20 70 53 74 6d 74 20 26 26 20  .  if( pStmt && 
1e040 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74  sqlite3_step(pSt
1e050 6d 74 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20  mt)==SQLITE_ROW 
1e060 29 7b 0a 20 20 20 20 72 65 73 20 3d 20 73 71 6c  ){.    res = sql
1e070 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28  ite3_column_int(
1e080 70 53 74 6d 74 2c 30 29 3b 0a 20 20 7d 0a 20 20  pStmt,0);.  }.  
1e090 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
1e0a0 28 70 53 74 6d 74 29 3b 0a 20 20 72 65 74 75 72  (pStmt);.  retur
1e0b0 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n res;.}../*.** 
1e0c0 43 6f 6e 76 65 72 74 20 61 20 32 2d 62 79 74 65  Convert a 2-byte
1e0d0 20 6f 72 20 34 2d 62 79 74 65 20 62 69 67 2d 65   or 4-byte big-e
1e0e0 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 69 6e  ndian integer in
1e0f0 74 6f 20 61 20 6e 61 74 69 76 65 20 69 6e 74 65  to a native inte
1e100 67 65 72 0a 2a 2f 0a 73 74 61 74 69 63 20 75 6e  ger.*/.static un
1e110 73 69 67 6e 65 64 20 69 6e 74 20 67 65 74 32 62  signed int get2b
1e120 79 74 65 49 6e 74 28 75 6e 73 69 67 6e 65 64 20  yteInt(unsigned 
1e130 63 68 61 72 20 2a 61 29 7b 0a 20 20 72 65 74 75  char *a){.  retu
1e140 72 6e 20 28 61 5b 30 5d 3c 3c 38 29 20 2b 20 61  rn (a[0]<<8) + a
1e150 5b 31 5d 3b 0a 7d 0a 73 74 61 74 69 63 20 75 6e  [1];.}.static un
1e160 73 69 67 6e 65 64 20 69 6e 74 20 67 65 74 34 62  signed int get4b
1e170 79 74 65 49 6e 74 28 75 6e 73 69 67 6e 65 64 20  yteInt(unsigned 
1e180 63 68 61 72 20 2a 61 29 7b 0a 20 20 72 65 74 75  char *a){.  retu
1e190 72 6e 20 28 61 5b 30 5d 3c 3c 32 34 29 20 2b 20  rn (a[0]<<24) + 
1e1a0 28 61 5b 31 5d 3c 3c 31 36 29 20 2b 20 28 61 5b  (a[1]<<16) + (a[
1e1b0 32 5d 3c 3c 38 29 20 2b 20 61 5b 33 5d 3b 0a 7d  2]<<8) + a[3];.}
1e1c0 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e  ../*.** Implemen
1e1d0 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 22 2e  tation of the ".
1e1e0 69 6e 66 6f 22 20 63 6f 6d 6d 61 6e 64 2e 0a 2a  info" command..*
1e1f0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 31 20 6f 6e  *.** Return 1 on
1e200 20 65 72 72 6f 72 2c 20 32 20 74 6f 20 65 78 69   error, 2 to exi
1e210 74 2c 20 61 6e 64 20 30 20 6f 74 68 65 72 77 69  t, and 0 otherwi
1e220 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  se..*/.static in
1e230 74 20 73 68 65 6c 6c 5f 64 62 69 6e 66 6f 5f 63  t shell_dbinfo_c
1e240 6f 6d 6d 61 6e 64 28 53 68 65 6c 6c 53 74 61 74  ommand(ShellStat
1e250 65 20 2a 70 2c 20 69 6e 74 20 6e 41 72 67 2c 20  e *p, int nArg, 
1e260 63 68 61 72 20 2a 2a 61 7a 41 72 67 29 7b 0a 20  char **azArg){. 
1e270 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 74   static const st
1e280 72 75 63 74 20 7b 20 63 6f 6e 73 74 20 63 68 61  ruct { const cha
1e290 72 20 2a 7a 4e 61 6d 65 3b 20 69 6e 74 20 6f 66  r *zName; int of
1e2a0 73 74 3b 20 7d 20 61 46 69 65 6c 64 5b 5d 20 3d  st; } aField[] =
1e2b0 20 7b 0a 20 20 20 20 20 7b 20 22 66 69 6c 65 20   {.     { "file 
1e2c0 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 3a 22  change counter:"
1e2d0 2c 20 20 32 34 20 20 7d 2c 0a 20 20 20 20 20 7b  ,  24  },.     {
1e2e0 20 22 64 61 74 61 62 61 73 65 20 70 61 67 65 20   "database page 
1e2f0 63 6f 75 6e 74 3a 22 2c 20 20 32 38 20 20 7d 2c  count:",  28  },
1e300 0a 20 20 20 20 20 7b 20 22 66 72 65 65 6c 69 73  .     { "freelis
1e310 74 20 70 61 67 65 20 63 6f 75 6e 74 3a 22 2c 20  t page count:", 
1e320 20 33 36 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22   36  },.     { "
1e330 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 3a 22 2c  schema cookie:",
1e340 20 20 20 20 20 20 20 20 34 30 20 20 7d 2c 0a 20          40  },. 
1e350 20 20 20 20 7b 20 22 73 63 68 65 6d 61 20 66 6f      { "schema fo
1e360 72 6d 61 74 3a 22 2c 20 20 20 20 20 20 20 20 34  rmat:",        4
1e370 34 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 64 65  4  },.     { "de
1e380 66 61 75 6c 74 20 63 61 63 68 65 20 73 69 7a 65  fault cache size
1e390 3a 22 2c 20 20 20 34 38 20 20 7d 2c 0a 20 20 20  :",   48  },.   
1e3a0 20 20 7b 20 22 61 75 74 6f 76 61 63 75 75 6d 20    { "autovacuum 
1e3b0 74 6f 70 20 72 6f 6f 74 3a 22 2c 20 20 35 32 20  top root:",  52 
1e3c0 20 7d 2c 0a 20 20 20 20 20 7b 20 22 69 6e 63 72   },.     { "incr
1e3d0 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 3a 22  emental vacuum:"
1e3e0 2c 20 20 20 36 34 20 20 7d 2c 0a 20 20 20 20 20  ,   64  },.     
1e3f0 7b 20 22 74 65 78 74 20 65 6e 63 6f 64 69 6e 67  { "text encoding
1e400 3a 22 2c 20 20 20 20 20 20 20 20 35 36 20 20 7d  :",        56  }
1e410 2c 0a 20 20 20 20 20 7b 20 22 75 73 65 72 20 76  ,.     { "user v
1e420 65 72 73 69 6f 6e 3a 22 2c 20 20 20 20 20 20 20  ersion:",       
1e430 20 20 36 30 20 20 7d 2c 0a 20 20 20 20 20 7b 20    60  },.     { 
1e440 22 61 70 70 6c 69 63 61 74 69 6f 6e 20 69 64 3a  "application id:
1e450 22 2c 20 20 20 20 20 20 20 36 38 20 20 7d 2c 0a  ",       68  },.
1e460 20 20 20 20 20 7b 20 22 73 6f 66 74 77 61 72 65       { "software
1e470 20 76 65 72 73 69 6f 6e 3a 22 2c 20 20 20 20 20   version:",     
1e480 39 36 20 20 7d 2c 0a 20 20 7d 3b 0a 20 20 73 74  96  },.  };.  st
1e490 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63  atic const struc
1e4a0 74 20 7b 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  t { const char *
1e4b0 7a 4e 61 6d 65 3b 20 63 6f 6e 73 74 20 63 68 61  zName; const cha
1e4c0 72 20 2a 7a 53 71 6c 3b 20 7d 20 61 51 75 65 72  r *zSql; } aQuer
1e4d0 79 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 7b 20 22  y[] = {.     { "
1e4e0 6e 75 6d 62 65 72 20 6f 66 20 74 61 62 6c 65 73  number of tables
1e4f0 3a 22 2c 0a 20 20 20 20 20 20 20 22 53 45 4c 45  :",.       "SELE
1e500 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d  CT count(*) FROM
1e510 20 25 73 20 57 48 45 52 45 20 74 79 70 65 3d 27   %s WHERE type='
1e520 74 61 62 6c 65 27 22 20 7d 2c 0a 20 20 20 20 20  table'" },.     
1e530 7b 20 22 6e 75 6d 62 65 72 20 6f 66 20 69 6e 64  { "number of ind
1e540 65 78 65 73 3a 22 2c 0a 20 20 20 20 20 20 20 22  exes:",.       "
1e550 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20  SELECT count(*) 
1e560 46 52 4f 4d 20 25 73 20 57 48 45 52 45 20 74 79  FROM %s WHERE ty
1e570 70 65 3d 27 69 6e 64 65 78 27 22 20 7d 2c 0a 20  pe='index'" },. 
1e580 20 20 20 20 7b 20 22 6e 75 6d 62 65 72 20 6f 66      { "number of
1e590 20 74 72 69 67 67 65 72 73 3a 22 2c 0a 20 20 20   triggers:",.   
1e5a0 20 20 20 20 22 53 45 4c 45 43 54 20 63 6f 75 6e      "SELECT coun
1e5b0 74 28 2a 29 20 46 52 4f 4d 20 25 73 20 57 48 45  t(*) FROM %s WHE
1e5c0 52 45 20 74 79 70 65 3d 27 74 72 69 67 67 65 72  RE type='trigger
1e5d0 27 22 20 7d 2c 0a 20 20 20 20 20 7b 20 22 6e 75  '" },.     { "nu
1e5e0 6d 62 65 72 20 6f 66 20 76 69 65 77 73 3a 22 2c  mber of views:",
1e5f0 0a 20 20 20 20 20 20 20 22 53 45 4c 45 43 54 20  .       "SELECT 
1e600 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 25 73  count(*) FROM %s
1e610 20 57 48 45 52 45 20 74 79 70 65 3d 27 76 69 65   WHERE type='vie
1e620 77 27 22 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73  w'" },.     { "s
1e630 63 68 65 6d 61 20 73 69 7a 65 3a 22 2c 0a 20 20  chema size:",.  
1e640 20 20 20 20 20 22 53 45 4c 45 43 54 20 74 6f 74       "SELECT tot
1e650 61 6c 28 6c 65 6e 67 74 68 28 73 71 6c 29 29 20  al(length(sql)) 
1e660 46 52 4f 4d 20 25 73 22 20 7d 2c 0a 20 20 7d 3b  FROM %s" },.  };
1e670 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 68 61 72  .  int i;.  char
1e680 20 2a 7a 53 63 68 65 6d 61 54 61 62 3b 0a 20 20   *zSchemaTab;.  
1e690 63 68 61 72 20 2a 7a 44 62 20 3d 20 6e 41 72 67  char *zDb = nArg
1e6a0 3e 3d 32 20 3f 20 61 7a 41 72 67 5b 31 5d 20 3a  >=2 ? azArg[1] :
1e6b0 20 22 6d 61 69 6e 22 3b 0a 20 20 73 71 6c 69 74   "main";.  sqlit
1e6c0 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d  e3_stmt *pStmt =
1e6d0 20 30 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   0;.  unsigned c
1e6e0 68 61 72 20 61 48 64 72 5b 31 30 30 5d 3b 0a 20  har aHdr[100];. 
1e6f0 20 6f 70 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a   open_db(p, 0);.
1e700 20 20 69 66 28 20 70 2d 3e 64 62 3d 3d 30 20 29    if( p->db==0 )
1e710 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 73 71 6c   return 1;.  sql
1e720 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28  ite3_prepare_v2(
1e730 70 2d 3e 64 62 2c 22 53 45 4c 45 43 54 20 64 61  p->db,"SELECT da
1e740 74 61 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 64  ta FROM sqlite_d
1e750 62 70 61 67 65 28 3f 31 29 20 57 48 45 52 45 20  bpage(?1) WHERE 
1e760 70 67 6e 6f 3d 31 22 2c 0a 20 20 20 20 20 20 20  pgno=1",.       
1e770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 31                -1
1e780 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20  , &pStmt, 0);.  
1e790 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78  sqlite3_bind_tex
1e7a0 74 28 70 53 74 6d 74 2c 20 31 2c 20 7a 44 62 2c  t(pStmt, 1, zDb,
1e7b0 20 2d 31 2c 20 53 51 4c 49 54 45 5f 53 54 41 54   -1, SQLITE_STAT
1e7c0 49 43 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  IC);.  if( sqlit
1e7d0 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3d 3d  e3_step(pStmt)==
1e7e0 53 51 4c 49 54 45 5f 52 4f 57 0a 20 20 20 26 26  SQLITE_ROW.   &&
1e7f0 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
1e800 62 79 74 65 73 28 70 53 74 6d 74 2c 30 29 3e 31  bytes(pStmt,0)>1
1e810 30 30 0a 20 20 29 7b 0a 20 20 20 20 6d 65 6d 63  00.  ){.    memc
1e820 70 79 28 61 48 64 72 2c 20 73 71 6c 69 74 65 33  py(aHdr, sqlite3
1e830 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 28 70 53 74  _column_blob(pSt
1e840 6d 74 2c 30 29 2c 20 31 30 30 29 3b 0a 20 20 20  mt,0), 100);.   
1e850 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
1e860 65 28 70 53 74 6d 74 29 3b 0a 20 20 7d 65 6c 73  e(pStmt);.  }els
1e870 65 7b 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74  e{.    raw_print
1e880 66 28 73 74 64 65 72 72 2c 20 22 75 6e 61 62 6c  f(stderr, "unabl
1e890 65 20 74 6f 20 72 65 61 64 20 64 61 74 61 62 61  e to read databa
1e8a0 73 65 20 68 65 61 64 65 72 5c 6e 22 29 3b 0a 20  se header\n");. 
1e8b0 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c     sqlite3_final
1e8c0 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20  ize(pStmt);.    
1e8d0 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20  return 1;.  }.  
1e8e0 69 20 3d 20 67 65 74 32 62 79 74 65 49 6e 74 28  i = get2byteInt(
1e8f0 61 48 64 72 2b 31 36 29 3b 0a 20 20 69 66 28 20  aHdr+16);.  if( 
1e900 69 3d 3d 31 20 29 20 69 20 3d 20 36 35 35 33 36  i==1 ) i = 65536
1e910 3b 0a 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28  ;.  utf8_printf(
1e920 70 2d 3e 6f 75 74 2c 20 22 25 2d 32 30 73 20 25  p->out, "%-20s %
1e930 64 5c 6e 22 2c 20 22 64 61 74 61 62 61 73 65 20  d\n", "database 
1e940 70 61 67 65 20 73 69 7a 65 3a 22 2c 20 69 29 3b  page size:", i);
1e950 0a 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70  .  utf8_printf(p
1e960 2d 3e 6f 75 74 2c 20 22 25 2d 32 30 73 20 25 64  ->out, "%-20s %d
1e970 5c 6e 22 2c 20 22 77 72 69 74 65 20 66 6f 72 6d  \n", "write form
1e980 61 74 3a 22 2c 20 61 48 64 72 5b 31 38 5d 29 3b  at:", aHdr[18]);
1e990 0a 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70  .  utf8_printf(p
1e9a0 2d 3e 6f 75 74 2c 20 22 25 2d 32 30 73 20 25 64  ->out, "%-20s %d
1e9b0 5c 6e 22 2c 20 22 72 65 61 64 20 66 6f 72 6d 61  \n", "read forma
1e9c0 74 3a 22 2c 20 61 48 64 72 5b 31 39 5d 29 3b 0a  t:", aHdr[19]);.
1e9d0 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d    utf8_printf(p-
1e9e0 3e 6f 75 74 2c 20 22 25 2d 32 30 73 20 25 64 5c  >out, "%-20s %d\
1e9f0 6e 22 2c 20 22 72 65 73 65 72 76 65 64 20 62 79  n", "reserved by
1ea00 74 65 73 3a 22 2c 20 61 48 64 72 5b 32 30 5d 29  tes:", aHdr[20])
1ea10 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 41  ;.  for(i=0; i<A
1ea20 72 72 61 79 53 69 7a 65 28 61 46 69 65 6c 64 29  rraySize(aField)
1ea30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20  ; i++){.    int 
1ea40 6f 66 73 74 20 3d 20 61 46 69 65 6c 64 5b 69 5d  ofst = aField[i]
1ea50 2e 6f 66 73 74 3b 0a 20 20 20 20 75 6e 73 69 67  .ofst;.    unsig
1ea60 6e 65 64 20 69 6e 74 20 76 61 6c 20 3d 20 67 65  ned int val = ge
1ea70 74 34 62 79 74 65 49 6e 74 28 61 48 64 72 20 2b  t4byteInt(aHdr +
1ea80 20 6f 66 73 74 29 3b 0a 20 20 20 20 75 74 66 38   ofst);.    utf8
1ea90 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
1eaa0 22 25 2d 32 30 73 20 25 75 22 2c 20 61 46 69 65  "%-20s %u", aFie
1eab0 6c 64 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 76 61 6c  ld[i].zName, val
1eac0 29 3b 0a 20 20 20 20 73 77 69 74 63 68 28 20 6f  );.    switch( o
1ead0 66 73 74 20 29 7b 0a 20 20 20 20 20 20 63 61 73  fst ){.      cas
1eae0 65 20 35 36 3a 20 7b 0a 20 20 20 20 20 20 20 20  e 56: {.        
1eaf0 69 66 28 20 76 61 6c 3d 3d 31 20 29 20 72 61 77  if( val==1 ) raw
1eb00 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
1eb10 22 20 28 75 74 66 38 29 22 29 3b 0a 20 20 20 20  " (utf8)");.    
1eb20 20 20 20 20 69 66 28 20 76 61 6c 3d 3d 32 20 29      if( val==2 )
1eb30 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f   raw_printf(p->o
1eb40 75 74 2c 20 22 20 28 75 74 66 31 36 6c 65 29 22  ut, " (utf16le)"
1eb50 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 76  );.        if( v
1eb60 61 6c 3d 3d 33 20 29 20 72 61 77 5f 70 72 69 6e  al==3 ) raw_prin
1eb70 74 66 28 70 2d 3e 6f 75 74 2c 20 22 20 28 75 74  tf(p->out, " (ut
1eb80 66 31 36 62 65 29 22 29 3b 0a 20 20 20 20 20 20  f16be)");.      
1eb90 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72 61 77 5f  }.    }.    raw_
1eba0 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
1ebb0 5c 6e 22 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  \n");.  }.  if( 
1ebc0 7a 44 62 3d 3d 30 20 29 7b 0a 20 20 20 20 7a 53  zDb==0 ){.    zS
1ebd0 63 68 65 6d 61 54 61 62 20 3d 20 73 71 6c 69 74  chemaTab = sqlit
1ebe0 65 33 5f 6d 70 72 69 6e 74 66 28 22 6d 61 69 6e  e3_mprintf("main
1ebf0 2e 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 22 29  .sqlite_master")
1ec00 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74  ;.  }else if( st
1ec10 72 63 6d 70 28 7a 44 62 2c 22 74 65 6d 70 22 29  rcmp(zDb,"temp")
1ec20 3d 3d 30 20 29 7b 0a 20 20 20 20 7a 53 63 68 65  ==0 ){.    zSche
1ec30 6d 61 54 61 62 20 3d 20 73 71 6c 69 74 65 33 5f  maTab = sqlite3_
1ec40 6d 70 72 69 6e 74 66 28 22 25 73 22 2c 20 22 73  mprintf("%s", "s
1ec50 71 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65  qlite_temp_maste
1ec60 72 22 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  r");.  }else{.  
1ec70 20 20 7a 53 63 68 65 6d 61 54 61 62 20 3d 20 73    zSchemaTab = s
1ec80 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
1ec90 5c 22 25 77 5c 22 2e 73 71 6c 69 74 65 5f 6d 61  \"%w\".sqlite_ma
1eca0 73 74 65 72 22 2c 20 7a 44 62 29 3b 0a 20 20 7d  ster", zDb);.  }
1ecb0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 41 72  .  for(i=0; i<Ar
1ecc0 72 61 79 53 69 7a 65 28 61 51 75 65 72 79 29 3b  raySize(aQuery);
1ecd0 20 69 2b 2b 29 7b 0a 20 20 20 20 63 68 61 72 20   i++){.    char 
1ece0 2a 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f  *zSql = sqlite3_
1ecf0 6d 70 72 69 6e 74 66 28 61 51 75 65 72 79 5b 69  mprintf(aQuery[i
1ed00 5d 2e 7a 53 71 6c 2c 20 7a 53 63 68 65 6d 61 54  ].zSql, zSchemaT
1ed10 61 62 29 3b 0a 20 20 20 20 69 6e 74 20 76 61 6c  ab);.    int val
1ed20 20 3d 20 64 62 5f 69 6e 74 28 70 2c 20 7a 53 71   = db_int(p, zSq
1ed30 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  l);.    sqlite3_
1ed40 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20  free(zSql);.    
1ed50 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f  utf8_printf(p->o
1ed60 75 74 2c 20 22 25 2d 32 30 73 20 25 64 5c 6e 22  ut, "%-20s %d\n"
1ed70 2c 20 61 51 75 65 72 79 5b 69 5d 2e 7a 4e 61 6d  , aQuery[i].zNam
1ed80 65 2c 20 76 61 6c 29 3b 0a 20 20 7d 0a 20 20 73  e, val);.  }.  s
1ed90 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 63 68  qlite3_free(zSch
1eda0 65 6d 61 54 61 62 29 3b 0a 20 20 72 65 74 75 72  emaTab);.  retur
1edb0 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72  n 0;.}../*.** Pr
1edc0 69 6e 74 20 74 68 65 20 63 75 72 72 65 6e 74 20  int the current 
1edd0 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 29  sqlite3_errmsg()
1ede0 20 76 61 6c 75 65 20 74 6f 20 73 74 64 65 72 72   value to stderr
1edf0 20 61 6e 64 20 72 65 74 75 72 6e 20 31 2e 0a 2a   and return 1..*
1ee00 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 68 65  /.static int she
1ee10 6c 6c 44 61 74 61 62 61 73 65 45 72 72 6f 72 28  llDatabaseError(
1ee20 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20  sqlite3 *db){.  
1ee30 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 72 72  const char *zErr
1ee40 20 3d 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73   = sqlite3_errms
1ee50 67 28 64 62 29 3b 0a 20 20 75 74 66 38 5f 70 72  g(db);.  utf8_pr
1ee60 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72  intf(stderr, "Er
1ee70 72 6f 72 3a 20 25 73 5c 6e 22 2c 20 7a 45 72 72  ror: %s\n", zErr
1ee80 29 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d  );.  return 1;.}
1ee90 0a 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 6e  ../*.** Print an
1eea0 20 6f 75 74 2d 6f 66 2d 6d 65 6d 6f 72 79 20 6d   out-of-memory m
1eeb0 65 73 73 61 67 65 20 74 6f 20 73 74 64 65 72 72  essage to stderr
1eec0 20 61 6e 64 20 72 65 74 75 72 6e 20 31 2e 0a 2a   and return 1..*
1eed0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 68 65  /.static int she
1eee0 6c 6c 4e 6f 6d 65 6d 45 72 72 6f 72 28 76 6f 69  llNomemError(voi
1eef0 64 29 7b 0a 20 20 72 61 77 5f 70 72 69 6e 74 66  d){.  raw_printf
1ef00 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a  (stderr, "Error:
1ef10 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 5c 6e   out of memory\n
1ef20 22 29 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a  ");.  return 1;.
1ef30 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65  }../*.** Compare
1ef40 20 74 68 65 20 70 61 74 74 65 72 6e 20 69 6e 20   the pattern in 
1ef50 7a 47 6c 6f 62 5b 5d 20 61 67 61 69 6e 73 74 20  zGlob[] against 
1ef60 74 68 65 20 74 65 78 74 20 69 6e 20 7a 5b 5d 2e  the text in z[].
1ef70 20 20 52 65 74 75 72 6e 20 54 52 55 45 0a 2a 2a    Return TRUE.**
1ef80 20 69 66 20 74 68 65 79 20 6d 61 74 63 68 20 61   if they match a
1ef90 6e 64 20 46 41 4c 53 45 20 28 30 29 20 69 66 20  nd FALSE (0) if 
1efa0 74 68 65 79 20 64 6f 20 6e 6f 74 20 6d 61 74 63  they do not matc
1efb0 68 2e 0a 2a 2a 0a 2a 2a 20 47 6c 6f 62 62 69 6e  h..**.** Globbin
1efc0 67 20 72 75 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20  g rules:.**.**  
1efd0 20 20 20 20 27 2a 27 20 20 20 20 20 20 20 4d 61      '*'       Ma
1efe0 74 63 68 65 73 20 61 6e 79 20 73 65 71 75 65 6e  tches any sequen
1eff0 63 65 20 6f 66 20 7a 65 72 6f 20 6f 72 20 6d 6f  ce of zero or mo
1f000 72 65 20 63 68 61 72 61 63 74 65 72 73 2e 0a 2a  re characters..*
1f010 2a 0a 2a 2a 20 20 20 20 20 20 27 3f 27 20 20 20  *.**      '?'   
1f020 20 20 20 20 4d 61 74 63 68 65 73 20 65 78 61 63      Matches exac
1f030 74 6c 79 20 6f 6e 65 20 63 68 61 72 61 63 74 65  tly one characte
1f040 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 5b 2e 2e  r..**.**     [..
1f050 2e 5d 20 20 20 20 20 20 4d 61 74 63 68 65 73 20  .]      Matches 
1f060 6f 6e 65 20 63 68 61 72 61 63 74 65 72 20 66 72  one character fr
1f070 6f 6d 20 74 68 65 20 65 6e 63 6c 6f 73 65 64 20  om the enclosed 
1f080 6c 69 73 74 20 6f 66 0a 2a 2a 20 20 20 20 20 20  list of.**      
1f090 20 20 20 20 20 20 20 20 20 20 63 68 61 72 61 63            charac
1f0a0 74 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  ters..**.**     
1f0b0 5b 5e 2e 2e 2e 5d 20 20 20 20 20 4d 61 74 63 68  [^...]     Match
1f0c0 65 73 20 6f 6e 65 20 63 68 61 72 61 63 74 65 72  es one character
1f0d0 20 6e 6f 74 20 69 6e 20 74 68 65 20 65 6e 63 6c   not in the encl
1f0e0 6f 73 65 64 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a  osed list..**.**
1f0f0 20 20 20 20 20 20 27 23 27 20 20 20 20 20 20 20        '#'       
1f100 4d 61 74 63 68 65 73 20 61 6e 79 20 73 65 71 75  Matches any sequ
1f110 65 6e 63 65 20 6f 66 20 6f 6e 65 20 6f 72 20 6d  ence of one or m
1f120 6f 72 65 20 64 69 67 69 74 73 20 77 69 74 68 20  ore digits with 
1f130 61 6e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  an.**           
1f140 20 20 20 20 20 6f 70 74 69 6f 6e 61 6c 20 2b 20       optional + 
1f150 6f 72 20 2d 20 73 69 67 6e 20 69 6e 20 66 72 6f  or - sign in fro
1f160 6e 74 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 27 20  nt.**.**      ' 
1f170 27 20 20 20 20 20 20 20 41 6e 79 20 73 70 61 6e  '       Any span
1f180 20 6f 66 20 77 68 69 74 65 73 70 61 63 65 20 6d   of whitespace m
1f190 61 74 63 68 65 73 20 61 6e 79 20 6f 74 68 65 72  atches any other
1f1a0 20 73 70 61 6e 20 6f 66 0a 2a 2a 20 20 20 20 20   span of.**     
1f1b0 20 20 20 20 20 20 20 20 20 20 20 77 68 69 74 65             white
1f1c0 73 70 61 63 65 2e 0a 2a 2a 0a 2a 2a 20 45 78 74  space..**.** Ext
1f1d0 72 61 20 77 68 69 74 65 73 70 61 63 65 20 61 74  ra whitespace at
1f1e0 20 74 68 65 20 65 6e 64 20 6f 66 20 7a 5b 5d 20   the end of z[] 
1f1f0 69 73 20 69 67 6e 6f 72 65 64 2e 0a 2a 2f 0a 73  is ignored..*/.s
1f200 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 63 61  tatic int testca
1f210 73 65 5f 67 6c 6f 62 28 63 6f 6e 73 74 20 63 68  se_glob(const ch
1f220 61 72 20 2a 7a 47 6c 6f 62 2c 20 63 6f 6e 73 74  ar *zGlob, const
1f230 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69 6e 74   char *z){.  int
1f240 20 63 2c 20 63 32 3b 0a 20 20 69 6e 74 20 69 6e   c, c2;.  int in
1f250 76 65 72 74 3b 0a 20 20 69 6e 74 20 73 65 65 6e  vert;.  int seen
1f260 3b 0a 0a 20 20 77 68 69 6c 65 28 20 28 63 20 3d  ;..  while( (c =
1f270 20 28 2a 28 7a 47 6c 6f 62 2b 2b 29 29 29 21 3d   (*(zGlob++)))!=
1f280 30 20 29 7b 0a 20 20 20 20 69 66 28 20 49 73 53  0 ){.    if( IsS
1f290 70 61 63 65 28 63 29 20 29 7b 0a 20 20 20 20 20  pace(c) ){.     
1f2a0 20 69 66 28 20 21 49 73 53 70 61 63 65 28 2a 7a   if( !IsSpace(*z
1f2b0 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  ) ) return 0;.  
1f2c0 20 20 20 20 77 68 69 6c 65 28 20 49 73 53 70 61      while( IsSpa
1f2d0 63 65 28 2a 7a 47 6c 6f 62 29 20 29 20 7a 47 6c  ce(*zGlob) ) zGl
1f2e0 6f 62 2b 2b 3b 0a 20 20 20 20 20 20 77 68 69 6c  ob++;.      whil
1f2f0 65 28 20 49 73 53 70 61 63 65 28 2a 7a 29 20 29  e( IsSpace(*z) )
1f300 20 7a 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73 65 20   z++;.    }else 
1f310 69 66 28 20 63 3d 3d 27 2a 27 20 29 7b 0a 20 20  if( c=='*' ){.  
1f320 20 20 20 20 77 68 69 6c 65 28 20 28 63 3d 28 2a      while( (c=(*
1f330 28 7a 47 6c 6f 62 2b 2b 29 29 29 20 3d 3d 20 27  (zGlob++))) == '
1f340 2a 27 20 7c 7c 20 63 3d 3d 27 3f 27 20 29 7b 0a  *' || c=='?' ){.
1f350 20 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27          if( c=='
1f360 3f 27 20 26 26 20 28 2a 28 7a 2b 2b 29 29 3d 3d  ?' && (*(z++))==
1f370 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
1f380 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
1f390 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  c==0 ){.        
1f3a0 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20  return 1;.      
1f3b0 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 5b 27  }else if( c=='['
1f3c0 20 29 7b 0a 20 20 20 20 20 20 20 20 77 68 69 6c   ){.        whil
1f3d0 65 28 20 2a 7a 20 26 26 20 74 65 73 74 63 61 73  e( *z && testcas
1f3e0 65 5f 67 6c 6f 62 28 7a 47 6c 6f 62 2d 31 2c 7a  e_glob(zGlob-1,z
1f3f0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
1f400 20 20 7a 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d    z++;.        }
1f410 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
1f420 28 2a 7a 29 21 3d 30 3b 0a 20 20 20 20 20 20 7d  (*z)!=0;.      }
1f430 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 28 63  .      while( (c
1f440 32 20 3d 20 28 2a 28 7a 2b 2b 29 29 29 21 3d 30  2 = (*(z++)))!=0
1f450 20 29 7b 0a 20 20 20 20 20 20 20 20 77 68 69 6c   ){.        whil
1f460 65 28 20 63 32 21 3d 63 20 29 7b 0a 20 20 20 20  e( c2!=c ){.    
1f470 20 20 20 20 20 20 63 32 20 3d 20 2a 28 7a 2b 2b        c2 = *(z++
1f480 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
1f490 20 63 32 3d 3d 30 20 29 20 72 65 74 75 72 6e 20   c2==0 ) return 
1f4a0 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  0;.        }.   
1f4b0 20 20 20 20 20 69 66 28 20 74 65 73 74 63 61 73       if( testcas
1f4c0 65 5f 67 6c 6f 62 28 7a 47 6c 6f 62 2c 7a 29 20  e_glob(zGlob,z) 
1f4d0 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20  ) return 1;.    
1f4e0 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e    }.      return
1f4f0 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66   0;.    }else if
1f500 28 20 63 3d 3d 27 3f 27 20 29 7b 0a 20 20 20 20  ( c=='?' ){.    
1f510 20 20 69 66 28 20 28 2a 28 7a 2b 2b 29 29 3d 3d    if( (*(z++))==
1f520 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
1f530 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27    }else if( c=='
1f540 5b 27 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  [' ){.      int 
1f550 70 72 69 6f 72 5f 63 20 3d 20 30 3b 0a 20 20 20  prior_c = 0;.   
1f560 20 20 20 73 65 65 6e 20 3d 20 30 3b 0a 20 20 20     seen = 0;.   
1f570 20 20 20 69 6e 76 65 72 74 20 3d 20 30 3b 0a 20     invert = 0;. 
1f580 20 20 20 20 20 63 20 3d 20 2a 28 7a 2b 2b 29 3b       c = *(z++);
1f590 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d 30 20  .      if( c==0 
1f5a0 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20  ) return 0;.    
1f5b0 20 20 63 32 20 3d 20 2a 28 7a 47 6c 6f 62 2b 2b    c2 = *(zGlob++
1f5c0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 63 32 3d  );.      if( c2=
1f5d0 3d 27 5e 27 20 29 7b 0a 20 20 20 20 20 20 20 20  ='^' ){.        
1f5e0 69 6e 76 65 72 74 20 3d 20 31 3b 0a 20 20 20 20  invert = 1;.    
1f5f0 20 20 20 20 63 32 20 3d 20 2a 28 7a 47 6c 6f 62      c2 = *(zGlob
1f600 2b 2b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ++);.      }.   
1f610 20 20 20 69 66 28 20 63 32 3d 3d 27 5d 27 20 29     if( c2==']' )
1f620 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 3d  {.        if( c=
1f630 3d 27 5d 27 20 29 20 73 65 65 6e 20 3d 20 31 3b  =']' ) seen = 1;
1f640 0a 20 20 20 20 20 20 20 20 63 32 20 3d 20 2a 28  .        c2 = *(
1f650 7a 47 6c 6f 62 2b 2b 29 3b 0a 20 20 20 20 20 20  zGlob++);.      
1f660 7d 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 63  }.      while( c
1f670 32 20 26 26 20 63 32 21 3d 27 5d 27 20 29 7b 0a  2 && c2!=']' ){.
1f680 20 20 20 20 20 20 20 20 69 66 28 20 63 32 3d 3d          if( c2==
1f690 27 2d 27 20 26 26 20 7a 47 6c 6f 62 5b 30 5d 21  '-' && zGlob[0]!
1f6a0 3d 27 5d 27 20 26 26 20 7a 47 6c 6f 62 5b 30 5d  =']' && zGlob[0]
1f6b0 21 3d 30 20 26 26 20 70 72 69 6f 72 5f 63 3e 30  !=0 && prior_c>0
1f6c0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 32   ){.          c2
1f6d0 20 3d 20 2a 28 7a 47 6c 6f 62 2b 2b 29 3b 0a 20   = *(zGlob++);. 
1f6e0 20 20 20 20 20 20 20 20 20 69 66 28 20 63 3e 3d           if( c>=
1f6f0 70 72 69 6f 72 5f 63 20 26 26 20 63 3c 3d 63 32  prior_c && c<=c2
1f700 20 29 20 73 65 65 6e 20 3d 20 31 3b 0a 20 20 20   ) seen = 1;.   
1f710 20 20 20 20 20 20 20 70 72 69 6f 72 5f 63 20 3d         prior_c =
1f720 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73   0;.        }els
1f730 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  e{.          if(
1f740 20 63 3d 3d 63 32 20 29 7b 0a 20 20 20 20 20 20   c==c2 ){.      
1f750 20 20 20 20 20 20 73 65 65 6e 20 3d 20 31 3b 0a        seen = 1;.
1f760 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1f770 20 20 20 20 20 20 70 72 69 6f 72 5f 63 20 3d 20        prior_c = 
1f780 63 32 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  c2;.        }.  
1f790 20 20 20 20 20 20 63 32 20 3d 20 2a 28 7a 47 6c        c2 = *(zGl
1f7a0 6f 62 2b 2b 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ob++);.      }. 
1f7b0 20 20 20 20 20 69 66 28 20 63 32 3d 3d 30 20 7c       if( c2==0 |
1f7c0 7c 20 28 73 65 65 6e 20 5e 20 69 6e 76 65 72 74  | (seen ^ invert
1f7d0 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  )==0 ) return 0;
1f7e0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63  .    }else if( c
1f7f0 3d 3d 27 23 27 20 29 7b 0a 20 20 20 20 20 20 69  =='#' ){.      i
1f800 66 28 20 28 7a 5b 30 5d 3d 3d 27 2d 27 20 7c 7c  f( (z[0]=='-' ||
1f810 20 7a 5b 30 5d 3d 3d 27 2b 27 29 20 26 26 20 49   z[0]=='+') && I
1f820 73 44 69 67 69 74 28 7a 5b 31 5d 29 20 29 20 7a  sDigit(z[1]) ) z
1f830 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 21 49  ++;.      if( !I
1f840 73 44 69 67 69 74 28 7a 5b 30 5d 29 20 29 20 72  sDigit(z[0]) ) r
1f850 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7a  eturn 0;.      z
1f860 2b 2b 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28  ++;.      while(
1f870 20 49 73 44 69 67 69 74 28 7a 5b 30 5d 29 20 29   IsDigit(z[0]) )
1f880 7b 20 7a 2b 2b 3b 20 7d 0a 20 20 20 20 7d 65 6c  { z++; }.    }el
1f890 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20 63 21  se{.      if( c!
1f8a0 3d 28 2a 28 7a 2b 2b 29 29 20 29 20 72 65 74 75  =(*(z++)) ) retu
1f8b0 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rn 0;.    }.  }.
1f8c0 20 20 77 68 69 6c 65 28 20 49 73 53 70 61 63 65    while( IsSpace
1f8d0 28 2a 7a 29 20 29 7b 20 7a 2b 2b 3b 20 7d 0a 20  (*z) ){ z++; }. 
1f8e0 20 72 65 74 75 72 6e 20 2a 7a 3d 3d 30 3b 0a 7d   return *z==0;.}
1f8f0 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65  .../*.** Compare
1f900 20 74 68 65 20 73 74 72 69 6e 67 20 61 73 20 61   the string as a
1f910 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20 6f 70   command-line op
1f920 74 69 6f 6e 20 77 69 74 68 20 65 69 74 68 65 72  tion with either
1f930 20 6f 6e 65 20 6f 72 20 74 77 6f 0a 2a 2a 20 69   one or two.** i
1f940 6e 69 74 69 61 6c 20 22 2d 22 20 63 68 61 72 61  nitial "-" chara
1f950 63 74 65 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  cters..*/.static
1f960 20 69 6e 74 20 6f 70 74 69 6f 6e 4d 61 74 63 68   int optionMatch
1f970 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 74  (const char *zSt
1f980 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  r, const char *z
1f990 4f 70 74 29 7b 0a 20 20 69 66 28 20 7a 53 74 72  Opt){.  if( zStr
1f9a0 5b 30 5d 21 3d 27 2d 27 20 29 20 72 65 74 75 72  [0]!='-' ) retur
1f9b0 6e 20 30 3b 0a 20 20 7a 53 74 72 2b 2b 3b 0a 20  n 0;.  zStr++;. 
1f9c0 20 69 66 28 20 7a 53 74 72 5b 30 5d 3d 3d 27 2d   if( zStr[0]=='-
1f9d0 27 20 29 20 7a 53 74 72 2b 2b 3b 0a 20 20 72 65  ' ) zStr++;.  re
1f9e0 74 75 72 6e 20 73 74 72 63 6d 70 28 7a 53 74 72  turn strcmp(zStr
1f9f0 2c 20 7a 4f 70 74 29 3d 3d 30 3b 0a 7d 0a 0a 2f  , zOpt)==0;.}../
1fa00 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 20 66 69  *.** Delete a fi
1fa10 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 68 65 6c 6c  le..*/.int shell
1fa20 44 65 6c 65 74 65 46 69 6c 65 28 63 6f 6e 73 74  DeleteFile(const
1fa30 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
1fa40 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 23 69 66  ){.  int rc;.#if
1fa50 64 65 66 20 5f 57 49 4e 33 32 0a 20 20 77 63 68  def _WIN32.  wch
1fa60 61 72 5f 74 20 2a 7a 20 3d 20 73 71 6c 69 74 65  ar_t *z = sqlite
1fa70 33 5f 77 69 6e 33 32 5f 75 74 66 38 5f 74 6f 5f  3_win32_utf8_to_
1fa80 75 6e 69 63 6f 64 65 28 7a 46 69 6c 65 6e 61 6d  unicode(zFilenam
1fa90 65 29 3b 0a 20 20 72 63 20 3d 20 5f 77 75 6e 6c  e);.  rc = _wunl
1faa0 69 6e 6b 28 7a 29 3b 0a 20 20 73 71 6c 69 74 65  ink(z);.  sqlite
1fab0 33 5f 66 72 65 65 28 7a 29 3b 0a 23 65 6c 73 65  3_free(z);.#else
1fac0 0a 20 20 72 63 20 3d 20 75 6e 6c 69 6e 6b 28 7a  .  rc = unlink(z
1fad0 46 69 6c 65 6e 61 6d 65 29 3b 0a 23 65 6e 64 69  Filename);.#endi
1fae0 66 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  f.  return rc;.}
1faf0 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 64  ../*.** Try to d
1fb00 65 6c 65 74 65 20 74 68 65 20 74 65 6d 70 6f 72  elete the tempor
1fb10 61 72 79 20 66 69 6c 65 20 28 69 66 20 74 68 65  ary file (if the
1fb20 72 65 20 69 73 20 6f 6e 65 29 20 61 6e 64 20 66  re is one) and f
1fb30 72 65 65 20 74 68 65 0a 2a 2a 20 6d 65 6d 6f 72  ree the.** memor
1fb40 79 20 75 73 65 64 20 74 6f 20 68 6f 6c 64 20 74  y used to hold t
1fb50 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74  he name of the t
1fb60 65 6d 70 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61  emp file..*/.sta
1fb70 74 69 63 20 76 6f 69 64 20 63 6c 65 61 72 54 65  tic void clearTe
1fb80 6d 70 46 69 6c 65 28 53 68 65 6c 6c 53 74 61 74  mpFile(ShellStat
1fb90 65 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e  e *p){.  if( p->
1fba0 7a 54 65 6d 70 46 69 6c 65 3d 3d 30 20 29 20 72  zTempFile==0 ) r
1fbb0 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 73 68 65  eturn;.  if( she
1fbc0 6c 6c 44 65 6c 65 74 65 46 69 6c 65 28 70 2d 3e  llDeleteFile(p->
1fbd0 7a 54 65 6d 70 46 69 6c 65 29 20 29 20 72 65 74  zTempFile) ) ret
1fbe0 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  urn;.  sqlite3_f
1fbf0 72 65 65 28 70 2d 3e 7a 54 65 6d 70 46 69 6c 65  ree(p->zTempFile
1fc00 29 3b 0a 20 20 70 2d 3e 7a 54 65 6d 70 46 69 6c  );.  p->zTempFil
1fc10 65 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  e = 0;.}../*.** 
1fc20 43 72 65 61 74 65 20 61 20 6e 65 77 20 74 65 6d  Create a new tem
1fc30 70 20 66 69 6c 65 20 6e 61 6d 65 20 77 69 74 68  p file name with
1fc40 20 74 68 65 20 67 69 76 65 6e 20 73 75 66 66 69   the given suffi
1fc50 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  x..*/.static voi
1fc60 64 20 6e 65 77 54 65 6d 70 46 69 6c 65 28 53 68  d newTempFile(Sh
1fc70 65 6c 6c 53 74 61 74 65 20 2a 70 2c 20 63 6f 6e  ellState *p, con
1fc80 73 74 20 63 68 61 72 20 2a 7a 53 75 66 66 69 78  st char *zSuffix
1fc90 29 7b 0a 20 20 63 6c 65 61 72 54 65 6d 70 46 69  ){.  clearTempFi
1fca0 6c 65 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33  le(p);.  sqlite3
1fcb0 5f 66 72 65 65 28 70 2d 3e 7a 54 65 6d 70 46 69  _free(p->zTempFi
1fcc0 6c 65 29 3b 0a 20 20 70 2d 3e 7a 54 65 6d 70 46  le);.  p->zTempF
1fcd0 69 6c 65 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  ile = 0;.  sqlit
1fce0 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28  e3_file_control(
1fcf0 70 2d 3e 64 62 2c 20 30 2c 20 53 51 4c 49 54 45  p->db, 0, SQLITE
1fd00 5f 46 43 4e 54 4c 5f 54 45 4d 50 46 49 4c 45 4e  _FCNTL_TEMPFILEN
1fd10 41 4d 45 2c 20 26 70 2d 3e 7a 54 65 6d 70 46 69  AME, &p->zTempFi
1fd20 6c 65 29 3b 0a 20 20 69 66 28 20 70 2d 3e 7a 54  le);.  if( p->zT
1fd30 65 6d 70 46 69 6c 65 3d 3d 30 20 29 7b 0a 20 20  empFile==0 ){.  
1fd40 20 20 73 71 6c 69 74 65 33 5f 75 69 6e 74 36 34    sqlite3_uint64
1fd50 20 72 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   r;.    sqlite3_
1fd60 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f  randomness(sizeo
1fd70 66 28 72 29 2c 20 26 72 29 3b 0a 20 20 20 20 70  f(r), &r);.    p
1fd80 2d 3e 7a 54 65 6d 70 46 69 6c 65 20 3d 20 73 71  ->zTempFile = sq
1fd90 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 74  lite3_mprintf("t
1fda0 65 6d 70 25 6c 6c 78 2e 25 73 22 2c 20 72 2c 20  emp%llx.%s", r, 
1fdb0 7a 53 75 66 66 69 78 29 3b 0a 20 20 7d 65 6c 73  zSuffix);.  }els
1fdc0 65 7b 0a 20 20 20 20 70 2d 3e 7a 54 65 6d 70 46  e{.    p->zTempF
1fdd0 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  ile = sqlite3_mp
1fde0 72 69 6e 74 66 28 22 25 7a 2e 25 73 22 2c 20 70  rintf("%z.%s", p
1fdf0 2d 3e 7a 54 65 6d 70 46 69 6c 65 2c 20 7a 53 75  ->zTempFile, zSu
1fe00 66 66 69 78 29 3b 0a 20 20 7d 0a 20 20 69 66 28  ffix);.  }.  if(
1fe10 20 70 2d 3e 7a 54 65 6d 70 46 69 6c 65 3d 3d 30   p->zTempFile==0
1fe20 20 29 7b 0a 20 20 20 20 72 61 77 5f 70 72 69 6e   ){.    raw_prin
1fe30 74 66 28 73 74 64 65 72 72 2c 20 22 6f 75 74 20  tf(stderr, "out 
1fe40 6f 66 20 6d 65 6d 6f 72 79 5c 6e 22 29 3b 0a 20  of memory\n");. 
1fe50 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20 7d 0a     exit(1);.  }.
1fe60 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69 6d  }.../*.** The im
1fe70 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
1fe80 53 51 4c 20 73 63 61 6c 61 72 20 66 75 6e 63 74  SQL scalar funct
1fe90 69 6f 6e 20 66 6b 65 79 5f 63 6f 6c 6c 61 74 65  ion fkey_collate
1fea0 5f 63 6c 61 75 73 65 28 29 2c 20 75 73 65 64 0a  _clause(), used.
1feb0 2a 2a 20 62 79 20 74 68 65 20 22 2e 6c 69 6e 74  ** by the ".lint
1fec0 20 66 6b 65 79 2d 69 6e 64 65 78 65 73 22 20 63   fkey-indexes" c
1fed0 6f 6d 6d 61 6e 64 2e 20 54 68 69 73 20 73 63 61  ommand. This sca
1fee0 6c 61 72 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  lar function is 
1fef0 61 6c 77 61 79 73 0a 2a 2a 20 63 61 6c 6c 65 64  always.** called
1ff00 20 77 69 74 68 20 66 6f 75 72 20 61 72 67 75 6d   with four argum
1ff10 65 6e 74 73 20 2d 20 74 68 65 20 70 61 72 65 6e  ents - the paren
1ff20 74 20 74 61 62 6c 65 20 6e 61 6d 65 2c 20 74 68  t table name, th
1ff30 65 20 70 61 72 65 6e 74 20 63 6f 6c 75 6d 6e 20  e parent column 
1ff40 6e 61 6d 65 2c 0a 2a 2a 20 74 68 65 20 63 68 69  name,.** the chi
1ff50 6c 64 20 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e  ld table name an
1ff60 64 20 74 68 65 20 63 68 69 6c 64 20 63 6f 6c 75  d the child colu
1ff70 6d 6e 20 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 20  mn name..**.**  
1ff80 20 66 6b 65 79 5f 63 6f 6c 6c 61 74 65 5f 63 6c   fkey_collate_cl
1ff90 61 75 73 65 28 27 70 61 72 65 6e 74 2d 74 61 62  ause('parent-tab
1ffa0 27 2c 20 27 70 61 72 65 6e 74 2d 63 6f 6c 27 2c  ', 'parent-col',
1ffb0 20 27 63 68 69 6c 64 2d 74 61 62 27 2c 20 27 63   'child-tab', 'c
1ffc0 68 69 6c 64 2d 63 6f 6c 27 29 0a 2a 2a 0a 2a 2a  hild-col').**.**
1ffd0 20 49 66 20 65 69 74 68 65 72 20 6f 66 20 74 68   If either of th
1ffe0 65 20 6e 61 6d 65 64 20 74 61 62 6c 65 73 20 6f  e named tables o
1fff0 72 20 63 6f 6c 75 6d 6e 73 20 64 6f 20 6e 6f 74  r columns do not
20000 20 65 78 69 73 74 2c 20 74 68 69 73 20 66 75 6e   exist, this fun
20010 63 74 69 6f 6e 0a 2a 2a 20 72 65 74 75 72 6e 73  ction.** returns
20020 20 61 6e 20 65 6d 70 74 79 20 73 74 72 69 6e 67   an empty string
20030 2e 20 41 6e 20 65 6d 70 74 79 20 73 74 72 69 6e  . An empty strin
20040 67 20 69 73 20 61 6c 73 6f 20 72 65 74 75 72 6e  g is also return
20050 65 64 20 69 66 20 62 6f 74 68 20 74 61 62 6c 65  ed if both table
20060 73 0a 2a 2a 20 61 6e 64 20 63 6f 6c 75 6d 6e 73  s.** and columns
20070 20 65 78 69 73 74 20 62 75 74 20 68 61 76 65 20   exist but have 
20080 74 68 65 20 73 61 6d 65 20 64 65 66 61 75 6c 74  the same default
20090 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
200a0 6e 63 65 2e 20 4f 72 2c 0a 2a 2a 20 69 66 20 62  nce. Or,.** if b
200b0 6f 74 68 20 65 78 69 73 74 20 62 75 74 20 74 68  oth exist but th
200c0 65 20 64 65 66 61 75 6c 74 20 63 6f 6c 6c 61 74  e default collat
200d0 69 6f 6e 20 73 65 71 75 65 6e 63 65 73 20 61 72  ion sequences ar
200e0 65 20 64 69 66 66 65 72 65 6e 74 2c 20 74 68 69  e different, thi
200f0 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 72 65  s.** function re
20100 74 75 72 6e 73 20 74 68 65 20 73 74 72 69 6e 67  turns the string
20110 20 22 20 43 4f 4c 4c 41 54 45 20 3c 70 61 72 65   " COLLATE <pare
20120 6e 74 2d 63 6f 6c 6c 61 74 69 6f 6e 3e 22 2c 20  nt-collation>", 
20130 77 68 65 72 65 0a 2a 2a 20 3c 70 61 72 65 6e 74  where.** <parent
20140 2d 63 6f 6c 6c 61 74 69 6f 6e 3e 20 69 73 20 74  -collation> is t
20150 68 65 20 64 65 66 61 75 6c 74 20 63 6f 6c 6c 61  he default colla
20160 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 6f 66  tion sequence of
20170 20 74 68 65 20 70 61 72 65 6e 74 20 63 6f 6c 75   the parent colu
20180 6d 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  mn..*/.static vo
20190 69 64 20 73 68 65 6c 6c 46 6b 65 79 43 6f 6c 6c  id shellFkeyColl
201a0 61 74 65 43 6c 61 75 73 65 28 0a 20 20 73 71 6c  ateClause(.  sql
201b0 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43  ite3_context *pC
201c0 74 78 2c 0a 20 20 69 6e 74 20 6e 56 61 6c 2c 0a  tx,.  int nVal,.
201d0 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
201e0 2a 2a 61 70 56 61 6c 0a 29 7b 0a 20 20 73 71 6c  **apVal.){.  sql
201f0 69 74 65 33 20 2a 64 62 20 3d 20 73 71 6c 69 74  ite3 *db = sqlit
20200 65 33 5f 63 6f 6e 74 65 78 74 5f 64 62 5f 68 61  e3_context_db_ha
20210 6e 64 6c 65 28 70 43 74 78 29 3b 0a 20 20 63 6f  ndle(pCtx);.  co
20220 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 72 65 6e  nst char *zParen
20230 74 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  t;.  const char 
20240 2a 7a 50 61 72 65 6e 74 43 6f 6c 3b 0a 20 20 63  *zParentCol;.  c
20250 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 72 65  onst char *zPare
20260 6e 74 53 65 71 3b 0a 20 20 63 6f 6e 73 74 20 63  ntSeq;.  const c
20270 68 61 72 20 2a 7a 43 68 69 6c 64 3b 0a 20 20 63  har *zChild;.  c
20280 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 68 69 6c  onst char *zChil
20290 64 43 6f 6c 3b 0a 20 20 63 6f 6e 73 74 20 63 68  dCol;.  const ch
202a0 61 72 20 2a 7a 43 68 69 6c 64 53 65 71 20 3d 20  ar *zChildSeq = 
202b0 30 3b 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a  0;  /* Initializ
202c0 65 20 74 6f 20 61 76 6f 69 64 20 66 61 6c 73 65  e to avoid false
202d0 2d 70 6f 73 69 74 69 76 65 20 77 61 72 6e 69 6e  -positive warnin
202e0 67 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  g */.  int rc;..
202f0 20 20 61 73 73 65 72 74 28 20 6e 56 61 6c 3d 3d    assert( nVal==
20300 34 20 29 3b 0a 20 20 7a 50 61 72 65 6e 74 20 3d  4 );.  zParent =
20310 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71   (const char*)sq
20320 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
20330 28 61 70 56 61 6c 5b 30 5d 29 3b 0a 20 20 7a 50  (apVal[0]);.  zP
20340 61 72 65 6e 74 43 6f 6c 20 3d 20 28 63 6f 6e 73  arentCol = (cons
20350 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f  t char*)sqlite3_
20360 76 61 6c 75 65 5f 74 65 78 74 28 61 70 56 61 6c  value_text(apVal
20370 5b 31 5d 29 3b 0a 20 20 7a 43 68 69 6c 64 20 3d  [1]);.  zChild =
20380 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71   (const char*)sq
20390 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
203a0 28 61 70 56 61 6c 5b 32 5d 29 3b 0a 20 20 7a 43  (apVal[2]);.  zC
203b0 68 69 6c 64 43 6f 6c 20 3d 20 28 63 6f 6e 73 74  hildCol = (const
203c0 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76   char*)sqlite3_v
203d0 61 6c 75 65 5f 74 65 78 74 28 61 70 56 61 6c 5b  alue_text(apVal[
203e0 33 5d 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f  3]);..  sqlite3_
203f0 72 65 73 75 6c 74 5f 74 65 78 74 28 70 43 74 78  result_text(pCtx
20400 2c 20 22 22 2c 20 2d 31 2c 20 53 51 4c 49 54 45  , "", -1, SQLITE
20410 5f 53 54 41 54 49 43 29 3b 0a 20 20 72 63 20 3d  _STATIC);.  rc =
20420 20 73 71 6c 69 74 65 33 5f 74 61 62 6c 65 5f 63   sqlite3_table_c
20430 6f 6c 75 6d 6e 5f 6d 65 74 61 64 61 74 61 28 0a  olumn_metadata(.
20440 20 20 20 20 20 20 64 62 2c 20 22 6d 61 69 6e 22        db, "main"
20450 2c 20 7a 50 61 72 65 6e 74 2c 20 7a 50 61 72 65  , zParent, zPare
20460 6e 74 43 6f 6c 2c 20 30 2c 20 26 7a 50 61 72 65  ntCol, 0, &zPare
20470 6e 74 53 65 71 2c 20 30 2c 20 30 2c 20 30 0a 20  ntSeq, 0, 0, 0. 
20480 20 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   );.  if( rc==SQ
20490 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
204a0 63 20 3d 20 73 71 6c 69 74 65 33 5f 74 61 62 6c  c = sqlite3_tabl
204b0 65 5f 63 6f 6c 75 6d 6e 5f 6d 65 74 61 64 61 74  e_column_metadat
204c0 61 28 0a 20 20 20 20 20 20 20 20 64 62 2c 20 22  a(.        db, "
204d0 6d 61 69 6e 22 2c 20 7a 43 68 69 6c 64 2c 20 7a  main", zChild, z
204e0 43 68 69 6c 64 43 6f 6c 2c 20 30 2c 20 26 7a 43  ChildCol, 0, &zC
204f0 68 69 6c 64 53 65 71 2c 20 30 2c 20 30 2c 20 30  hildSeq, 0, 0, 0
20500 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 0a 20 20 69  .    );.  }..  i
20510 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
20520 20 26 26 20 73 71 6c 69 74 65 33 5f 73 74 72 69   && sqlite3_stri
20530 63 6d 70 28 7a 50 61 72 65 6e 74 53 65 71 2c 20  cmp(zParentSeq, 
20540 7a 43 68 69 6c 64 53 65 71 29 20 29 7b 0a 20 20  zChildSeq) ){.  
20550 20 20 63 68 61 72 20 2a 7a 20 3d 20 73 71 6c 69    char *z = sqli
20560 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 20 43 4f  te3_mprintf(" CO
20570 4c 4c 41 54 45 20 25 73 22 2c 20 7a 50 61 72 65  LLATE %s", zPare
20580 6e 74 53 65 71 29 3b 0a 20 20 20 20 73 71 6c 69  ntSeq);.    sqli
20590 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28  te3_result_text(
205a0 70 43 74 78 2c 20 7a 2c 20 2d 31 2c 20 53 51 4c  pCtx, z, -1, SQL
205b0 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a  ITE_TRANSIENT);.
205c0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
205d0 28 7a 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a  (z);.  }.}.../*.
205e0 2a 2a 20 54 68 65 20 69 6d 70 6c 65 6d 65 6e 74  ** The implement
205f0 61 74 69 6f 6e 20 6f 66 20 64 6f 74 2d 63 6f 6d  ation of dot-com
20600 6d 61 6e 64 20 22 2e 6c 69 6e 74 20 66 6b 65 79  mand ".lint fkey
20610 2d 69 6e 64 65 78 65 73 22 2e 0a 2a 2f 0a 73 74  -indexes"..*/.st
20620 61 74 69 63 20 69 6e 74 20 6c 69 6e 74 46 6b 65  atic int lintFke
20630 79 49 6e 64 65 78 65 73 28 0a 20 20 53 68 65 6c  yIndexes(.  Shel
20640 6c 53 74 61 74 65 20 2a 70 53 74 61 74 65 2c 20  lState *pState, 
20650 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
20660 75 72 72 65 6e 74 20 73 68 65 6c 6c 20 74 6f 6f  urrent shell too
20670 6c 20 73 74 61 74 65 20 2a 2f 0a 20 20 63 68 61  l state */.  cha
20680 72 20 2a 2a 61 7a 41 72 67 2c 20 20 20 20 20 20  r **azArg,      
20690 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
206a0 41 72 72 61 79 20 6f 66 20 61 72 67 75 6d 65 6e  Array of argumen
206b0 74 73 20 70 61 73 73 65 64 20 74 6f 20 64 6f 74  ts passed to dot
206c0 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e   command */.  in
206d0 74 20 6e 41 72 67 20 20 20 20 20 20 20 20 20 20  t nArg          
206e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
206f0 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69   Number of entri
20700 65 73 20 69 6e 20 61 7a 41 72 67 5b 5d 20 2a 2f  es in azArg[] */
20710 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  .){.  sqlite3 *d
20720 62 20 3d 20 70 53 74 61 74 65 2d 3e 64 62 3b 20  b = pState->db; 
20730 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
20740 65 20 68 61 6e 64 6c 65 20 74 6f 20 71 75 65 72  e handle to quer
20750 79 20 22 6d 61 69 6e 22 20 64 62 20 6f 66 20 2a  y "main" db of *
20760 2f 0a 20 20 46 49 4c 45 20 2a 6f 75 74 20 3d 20  /.  FILE *out = 
20770 70 53 74 61 74 65 2d 3e 6f 75 74 3b 20 20 20 20  pState->out;    
20780 20 20 20 20 2f 2a 20 53 74 72 65 61 6d 20 74 6f      /* Stream to
20790 20 77 72 69 74 65 20 6e 6f 6e 2d 65 72 72 6f 72   write non-error
207a0 20 6f 75 74 70 75 74 20 74 6f 20 2a 2f 0a 20 20   output to */.  
207b0 69 6e 74 20 62 56 65 72 62 6f 73 65 20 3d 20 30  int bVerbose = 0
207c0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
207d0 2f 2a 20 49 66 20 2d 76 65 72 62 6f 73 65 20 69  /* If -verbose i
207e0 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20 69  s present */.  i
207f0 6e 74 20 62 47 72 6f 75 70 42 79 50 61 72 65 6e  nt bGroupByParen
20800 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f  t = 0;         /
20810 2a 20 49 66 20 2d 67 72 6f 75 70 62 79 70 61 72  * If -groupbypar
20820 65 6e 74 20 69 73 20 70 72 65 73 65 6e 74 20 2a  ent is present *
20830 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  /.  int i;      
20840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20850 20 20 20 20 2f 2a 20 54 6f 20 69 74 65 72 61 74      /* To iterat
20860 65 20 74 68 72 6f 75 67 68 20 61 7a 41 72 67 5b  e through azArg[
20870 5d 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  ] */.  const cha
20880 72 20 2a 7a 49 6e 64 65 6e 74 20 3d 20 22 22 3b  r *zIndent = "";
20890 20 20 20 20 20 20 20 2f 2a 20 48 6f 77 20 6d 75         /* How mu
208a0 63 68 20 74 6f 20 69 6e 64 65 6e 74 20 43 52 45  ch to indent CRE
208b0 41 54 45 20 49 4e 44 45 58 20 62 79 20 2a 2f 0a  ATE INDEX by */.
208c0 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
208d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
208e0 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
208f0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74   */.  sqlite3_st
20900 6d 74 20 2a 70 53 71 6c 20 3d 20 30 3b 20 20 20  mt *pSql = 0;   
20910 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 69 6c 65        /* Compile
20920 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 53 51 4c  d version of SQL
20930 20 73 74 61 74 65 6d 65 6e 74 20 62 65 6c 6f 77   statement below
20940 20 2a 2f 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 54   */..  /*.  ** T
20950 68 69 73 20 53 45 4c 45 43 54 20 73 74 61 74 65  his SELECT state
20960 6d 65 6e 74 20 72 65 74 75 72 6e 73 20 6f 6e 65  ment returns one
20970 20 72 6f 77 20 66 6f 72 20 65 61 63 68 20 66 6f   row for each fo
20980 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72  reign key constr
20990 61 69 6e 74 0a 20 20 2a 2a 20 69 6e 20 74 68 65  aint.  ** in the
209a0 20 73 63 68 65 6d 61 20 6f 66 20 74 68 65 20 6d   schema of the m
209b0 61 69 6e 20 64 61 74 61 62 61 73 65 2e 20 54 68  ain database. Th
209c0 65 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 73 20  e column values 
209d0 61 72 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 30  are:.  **.  ** 0
209e0 2e 20 54 68 65 20 74 65 78 74 20 6f 66 20 61 6e  . The text of an
209f0 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 73   SQL statement s
20a00 69 6d 69 6c 61 72 20 74 6f 3a 0a 20 20 2a 2a 0a  imilar to:.  **.
20a10 20 20 2a 2a 20 20 20 20 20 20 22 45 58 50 4c 41    **      "EXPLA
20a20 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 20 53 45  IN QUERY PLAN SE
20a30 4c 45 43 54 20 31 20 46 52 4f 4d 20 63 68 69 6c  LECT 1 FROM chil
20a40 64 5f 74 61 62 6c 65 20 57 48 45 52 45 20 63 68  d_table WHERE ch
20a50 69 6c 64 5f 6b 65 79 3d 3f 22 0a 20 20 2a 2a 0a  ild_key=?".  **.
20a60 20 20 2a 2a 20 20 20 20 54 68 69 73 20 53 45 4c    **    This SEL
20a70 45 43 54 20 69 73 20 73 69 6d 69 6c 61 72 20 74  ECT is similar t
20a80 6f 20 74 68 65 20 6f 6e 65 20 74 68 61 74 20 74  o the one that t
20a90 68 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 73 20  he foreign keys 
20aa0 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 0a 20  implementation. 
20ab0 20 2a 2a 20 20 20 20 6e 65 65 64 73 20 74 6f 20   **    needs to 
20ac0 72 75 6e 20 69 6e 74 65 72 6e 61 6c 6c 79 20 6f  run internally o
20ad0 6e 20 63 68 69 6c 64 20 74 61 62 6c 65 73 2e 20  n child tables. 
20ae0 49 66 20 74 68 65 72 65 20 69 73 20 61 6e 20 69  If there is an i
20af0 6e 64 65 78 20 74 68 61 74 20 63 61 6e 0a 20 20  ndex that can.  
20b00 2a 2a 20 20 20 20 62 65 20 75 73 65 64 20 74 6f  **    be used to
20b10 20 6f 70 74 69 6d 69 7a 65 20 74 68 69 73 20 71   optimize this q
20b20 75 65 72 79 2c 20 74 68 65 6e 20 69 74 20 63 61  uery, then it ca
20b30 6e 20 61 6c 73 6f 20 62 65 20 75 73 65 64 20 62  n also be used b
20b40 79 20 74 68 65 20 46 4b 0a 20 20 2a 2a 20 20 20  y the FK.  **   
20b50 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
20b60 74 6f 20 6f 70 74 69 6d 69 7a 65 20 44 45 4c 45  to optimize DELE
20b70 54 45 20 6f 72 20 55 50 44 41 54 45 20 73 74 61  TE or UPDATE sta
20b80 74 65 6d 65 6e 74 73 20 6f 6e 20 74 68 65 20 70  tements on the p
20b90 61 72 65 6e 74 0a 20 20 2a 2a 20 20 20 20 74 61  arent.  **    ta
20ba0 62 6c 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 31  ble..  **.  ** 1
20bb0 2e 20 41 20 47 4c 4f 42 20 70 61 74 74 65 72 6e  . A GLOB pattern
20bc0 20 73 75 69 74 61 62 6c 65 20 66 6f 72 20 73 71   suitable for sq
20bd0 6c 69 74 65 33 5f 73 74 72 67 6c 6f 62 28 29 2e  lite3_strglob().
20be0 20 49 66 20 74 68 65 20 70 6c 61 6e 20 6f 75 74   If the plan out
20bf0 70 75 74 20 62 79 0a 20 20 2a 2a 20 20 20 20 74  put by.  **    t
20c00 68 65 20 45 58 50 4c 41 49 4e 20 51 55 45 52 59  he EXPLAIN QUERY
20c10 20 50 4c 41 4e 20 63 6f 6d 6d 61 6e 64 20 6d 61   PLAN command ma
20c20 74 63 68 65 73 20 74 68 69 73 20 70 61 74 74 65  tches this patte
20c30 72 6e 2c 20 74 68 65 6e 20 74 68 65 20 73 63 68  rn, then the sch
20c40 65 6d 61 0a 20 20 2a 2a 20 20 20 20 63 6f 6e 74  ema.  **    cont
20c50 61 69 6e 73 20 61 6e 20 69 6e 64 65 78 20 74 68  ains an index th
20c60 61 74 20 63 61 6e 20 62 65 20 75 73 65 64 20 74  at can be used t
20c70 6f 20 6f 70 74 69 6d 69 7a 65 20 74 68 65 20 71  o optimize the q
20c80 75 65 72 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  uery..  **.  ** 
20c90 32 2e 20 48 75 6d 61 6e 20 72 65 61 64 61 62 6c  2. Human readabl
20ca0 65 20 74 65 78 74 20 74 68 61 74 20 64 65 73 63  e text that desc
20cb0 72 69 62 65 73 20 74 68 65 20 63 68 69 6c 64 20  ribes the child 
20cc0 74 61 62 6c 65 20 61 6e 64 20 63 6f 6c 75 6d 6e  table and column
20cd0 73 2e 20 65 2e 67 2e 0a 20 20 2a 2a 0a 20 20 2a  s. e.g..  **.  *
20ce0 2a 20 20 20 20 20 20 20 22 63 68 69 6c 64 5f 74  *       "child_t
20cf0 61 62 6c 65 28 63 68 69 6c 64 5f 6b 65 79 31 2c  able(child_key1,
20d00 20 63 68 69 6c 64 5f 6b 65 79 32 29 22 0a 20 20   child_key2)".  
20d10 2a 2a 0a 20 20 2a 2a 20 33 2e 20 48 75 6d 61 6e  **.  ** 3. Human
20d20 20 72 65 61 64 61 62 6c 65 20 74 65 78 74 20 74   readable text t
20d30 68 61 74 20 64 65 73 63 72 69 62 65 73 20 74 68  hat describes th
20d40 65 20 70 61 72 65 6e 74 20 74 61 62 6c 65 20 61  e parent table a
20d50 6e 64 20 63 6f 6c 75 6d 6e 73 2e 20 65 2e 67 2e  nd columns. e.g.
20d60 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20  .  **.  **      
20d70 20 22 70 61 72 65 6e 74 5f 74 61 62 6c 65 28 70   "parent_table(p
20d80 61 72 65 6e 74 5f 6b 65 79 31 2c 20 70 61 72 65  arent_key1, pare
20d90 6e 74 5f 6b 65 79 32 29 22 0a 20 20 2a 2a 0a 20  nt_key2)".  **. 
20da0 20 2a 2a 20 34 2e 20 41 20 66 75 6c 6c 20 43 52   ** 4. A full CR
20db0 45 41 54 45 20 49 4e 44 45 58 20 73 74 61 74 65  EATE INDEX state
20dc0 6d 65 6e 74 20 66 6f 72 20 61 6e 20 69 6e 64 65  ment for an inde
20dd0 78 20 74 68 61 74 20 63 6f 75 6c 64 20 62 65 20  x that could be 
20de0 75 73 65 64 20 74 6f 0a 20 20 2a 2a 20 20 20 20  used to.  **    
20df0 6f 70 74 69 6d 69 7a 65 20 44 45 4c 45 54 45 20  optimize DELETE 
20e00 6f 72 20 55 50 44 41 54 45 20 73 74 61 74 65 6d  or UPDATE statem
20e10 65 6e 74 73 20 6f 6e 20 74 68 65 20 70 61 72 65  ents on the pare
20e20 6e 74 20 74 61 62 6c 65 2e 20 65 2e 67 2e 0a 20  nt table. e.g.. 
20e30 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 22   **.  **       "
20e40 43 52 45 41 54 45 20 49 4e 44 45 58 20 63 68 69  CREATE INDEX chi
20e50 6c 64 5f 74 61 62 6c 65 5f 63 68 69 6c 64 5f 6b  ld_table_child_k
20e60 65 79 20 4f 4e 20 63 68 69 6c 64 5f 74 61 62 6c  ey ON child_tabl
20e70 65 28 63 68 69 6c 64 5f 6b 65 79 29 22 0a 20 20  e(child_key)".  
20e80 2a 2a 0a 20 20 2a 2a 20 35 2e 20 54 68 65 20 6e  **.  ** 5. The n
20e90 61 6d 65 20 6f 66 20 74 68 65 20 70 61 72 65 6e  ame of the paren
20ea0 74 20 74 61 62 6c 65 2e 0a 20 20 2a 2a 0a 20 20  t table..  **.  
20eb0 2a 2a 20 54 68 65 73 65 20 73 69 78 20 76 61 6c  ** These six val
20ec0 75 65 73 20 61 72 65 20 75 73 65 64 20 62 79 20  ues are used by 
20ed0 74 68 65 20 43 20 6c 6f 67 69 63 20 62 65 6c 6f  the C logic belo
20ee0 77 20 74 6f 20 67 65 6e 65 72 61 74 65 20 74 68  w to generate th
20ef0 65 20 72 65 70 6f 72 74 2e 0a 20 20 2a 2f 0a 20  e report..  */. 
20f00 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71   const char *zSq
20f10 6c 20 3d 0a 20 20 22 53 45 4c 45 43 54 20 22 0a  l =.  "SELECT ".
20f20 20 20 20 20 22 20 20 20 20 20 27 45 58 50 4c 41      "     'EXPLA
20f30 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 20 53 45  IN QUERY PLAN SE
20f40 4c 45 43 54 20 31 20 46 52 4f 4d 20 27 20 7c 7c  LECT 1 FROM ' ||
20f50 20 71 75 6f 74 65 28 73 2e 6e 61 6d 65 29 20 7c   quote(s.name) |
20f60 7c 20 27 20 57 48 45 52 45 20 27 22 0a 20 20 20  | ' WHERE '".   
20f70 20 22 20 20 7c 7c 20 67 72 6f 75 70 5f 63 6f 6e   "  || group_con
20f80 63 61 74 28 71 75 6f 74 65 28 73 2e 6e 61 6d 65  cat(quote(s.name
20f90 29 20 7c 7c 20 27 2e 27 20 7c 7c 20 71 75 6f 74  ) || '.' || quot
20fa0 65 28 66 2e 5b 66 72 6f 6d 5d 29 20 7c 7c 20 27  e(f.[from]) || '
20fb0 3d 3f 27 20 22 0a 20 20 20 20 22 20 20 7c 7c 20  =?' ".    "  || 
20fc0 66 6b 65 79 5f 63 6f 6c 6c 61 74 65 5f 63 6c 61  fkey_collate_cla
20fd0 75 73 65 28 22 0a 20 20 20 20 22 20 20 20 20 20  use(".    "     
20fe0 20 20 66 2e 5b 74 61 62 6c 65 5d 2c 20 43 4f 41    f.[table], COA
20ff0 4c 45 53 43 45 28 66 2e 5b 74 6f 5d 2c 20 70 2e  LESCE(f.[to], p.
21000 5b 6e 61 6d 65 5d 29 2c 20 73 2e 6e 61 6d 65 2c  [name]), s.name,
21010 20 66 2e 5b 66 72 6f 6d 5d 29 2c 27 20 41 4e 44   f.[from]),' AND
21020 20 27 29 22 0a 20 20 20 20 22 2c 20 22 0a 20 20   ')".    ", ".  
21030 20 20 22 20 20 20 20 20 27 53 45 41 52 43 48 20    "     'SEARCH 
21040 54 41 42 4c 45 20 27 20 7c 7c 20 73 2e 6e 61 6d  TABLE ' || s.nam
21050 65 20 7c 7c 20 27 20 55 53 49 4e 47 20 43 4f 56  e || ' USING COV
21060 45 52 49 4e 47 20 49 4e 44 45 58 2a 28 27 22 0a  ERING INDEX*('".
21070 20 20 20 20 22 20 20 7c 7c 20 67 72 6f 75 70 5f      "  || group_
21080 63 6f 6e 63 61 74 28 27 2a 3d 3f 27 2c 20 27 20  concat('*=?', ' 
21090 41 4e 44 20 27 29 20 7c 7c 20 27 29 27 22 0a 20  AND ') || ')'". 
210a0 20 20 20 22 2c 20 22 0a 20 20 20 20 22 20 20 20     ", ".    "   
210b0 20 20 73 2e 6e 61 6d 65 20 20 7c 7c 20 27 28 27    s.name  || '('
210c0 20 7c 7c 20 67 72 6f 75 70 5f 63 6f 6e 63 61 74   || group_concat
210d0 28 66 2e 5b 66 72 6f 6d 5d 2c 20 20 27 2c 20 27  (f.[from],  ', '
210e0 29 20 7c 7c 20 27 29 27 22 0a 20 20 20 20 22 2c  ) || ')'".    ",
210f0 20 22 0a 20 20 20 20 22 20 20 20 20 20 66 2e 5b   ".    "     f.[
21100 74 61 62 6c 65 5d 20 7c 7c 20 27 28 27 20 7c 7c  table] || '(' ||
21110 20 67 72 6f 75 70 5f 63 6f 6e 63 61 74 28 43 4f   group_concat(CO
21120 41 4c 45 53 43 45 28 66 2e 5b 74 6f 5d 2c 20 70  ALESCE(f.[to], p
21130 2e 5b 6e 61 6d 65 5d 29 29 20 7c 7c 20 27 29 27  .[name])) || ')'
21140 22 0a 20 20 20 20 22 2c 20 22 0a 20 20 20 20 22  ".    ", ".    "
21150 20 20 20 20 20 27 43 52 45 41 54 45 20 49 4e 44       'CREATE IND
21160 45 58 20 27 20 7c 7c 20 71 75 6f 74 65 28 73 2e  EX ' || quote(s.
21170 6e 61 6d 65 20 7c 7c 27 5f 27 7c 7c 20 67 72 6f  name ||'_'|| gro
21180 75 70 5f 63 6f 6e 63 61 74 28 66 2e 5b 66 72 6f  up_concat(f.[fro
21190 6d 5d 2c 20 27 5f 27 29 29 22 0a 20 20 20 20 22  m], '_'))".    "
211a0 20 20 7c 7c 20 27 20 4f 4e 20 27 20 7c 7c 20 71    || ' ON ' || q
211b0 75 6f 74 65 28 73 2e 6e 61 6d 65 29 20 7c 7c 20  uote(s.name) || 
211c0 27 28 27 22 0a 20 20 20 20 22 20 20 7c 7c 20 67  '('".    "  || g
211d0 72 6f 75 70 5f 63 6f 6e 63 61 74 28 71 75 6f 74  roup_concat(quot
211e0 65 28 66 2e 5b 66 72 6f 6d 5d 29 20 7c 7c 22 0a  e(f.[from]) ||".
211f0 20 20 20 20 22 20 20 20 20 20 20 20 20 66 6b 65      "        fke
21200 79 5f 63 6f 6c 6c 61 74 65 5f 63 6c 61 75 73 65  y_collate_clause
21210 28 22 0a 20 20 20 20 22 20 20 20 20 20 20 20 20  (".    "        
21220 20 20 66 2e 5b 74 61 62 6c 65 5d 2c 20 43 4f 41    f.[table], COA
21230 4c 45 53 43 45 28 66 2e 5b 74 6f 5d 2c 20 70 2e  LESCE(f.[to], p.
21240 5b 6e 61 6d 65 5d 29 2c 20 73 2e 6e 61 6d 65 2c  [name]), s.name,
21250 20 66 2e 5b 66 72 6f 6d 5d 29 2c 20 27 2c 20 27   f.[from]), ', '
21260 29 22 0a 20 20 20 20 22 20 20 7c 7c 20 27 29 3b  )".    "  || ');
21270 27 22 0a 20 20 20 20 22 2c 20 22 0a 20 20 20 20  '".    ", ".    
21280 22 20 20 20 20 20 66 2e 5b 74 61 62 6c 65 5d 20  "     f.[table] 
21290 22 0a 20 20 20 20 22 46 52 4f 4d 20 73 71 6c 69  ".    "FROM sqli
212a0 74 65 5f 6d 61 73 74 65 72 20 41 53 20 73 2c 20  te_master AS s, 
212b0 70 72 61 67 6d 61 5f 66 6f 72 65 69 67 6e 5f 6b  pragma_foreign_k
212c0 65 79 5f 6c 69 73 74 28 73 2e 6e 61 6d 65 29 20  ey_list(s.name) 
212d0 41 53 20 66 20 22 0a 20 20 20 20 22 4c 45 46 54  AS f ".    "LEFT
212e0 20 4a 4f 49 4e 20 70 72 61 67 6d 61 5f 74 61 62   JOIN pragma_tab
212f0 6c 65 5f 69 6e 66 6f 20 41 53 20 70 20 4f 4e 20  le_info AS p ON 
21300 28 70 6b 2d 31 3d 73 65 71 20 41 4e 44 20 70 2e  (pk-1=seq AND p.
21310 61 72 67 3d 66 2e 5b 74 61 62 6c 65 5d 29 20 22  arg=f.[table]) "
21320 0a 20 20 20 20 22 47 52 4f 55 50 20 42 59 20 73  .    "GROUP BY s
21330 2e 6e 61 6d 65 2c 20 66 2e 69 64 20 22 0a 20 20  .name, f.id ".  
21340 20 20 22 4f 52 44 45 52 20 42 59 20 28 43 41 53    "ORDER BY (CAS
21350 45 20 57 48 45 4e 20 3f 20 54 48 45 4e 20 66 2e  E WHEN ? THEN f.
21360 5b 74 61 62 6c 65 5d 20 45 4c 53 45 20 73 2e 6e  [table] ELSE s.n
21370 61 6d 65 20 45 4e 44 29 22 0a 20 20 3b 0a 20 20  ame END)".  ;.  
21380 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 47 6c 6f  const char *zGlo
21390 62 49 50 4b 20 3d 20 22 53 45 41 52 43 48 20 54  bIPK = "SEARCH T
213a0 41 42 4c 45 20 2a 20 55 53 49 4e 47 20 49 4e 54  ABLE * USING INT
213b0 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
213c0 20 28 72 6f 77 69 64 3d 3f 29 22 3b 0a 0a 20 20   (rowid=?)";..  
213d0 66 6f 72 28 69 3d 32 3b 20 69 3c 6e 41 72 67 3b  for(i=2; i<nArg;
213e0 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6e   i++){.    int n
213f0 20 3d 20 73 74 72 6c 65 6e 33 30 28 61 7a 41 72   = strlen30(azAr
21400 67 5b 69 5d 29 3b 0a 20 20 20 20 69 66 28 20 6e  g[i]);.    if( n
21410 3e 31 20 26 26 20 73 71 6c 69 74 65 33 5f 73 74  >1 && sqlite3_st
21420 72 6e 69 63 6d 70 28 22 2d 76 65 72 62 6f 73 65  rnicmp("-verbose
21430 22 2c 20 61 7a 41 72 67 5b 69 5d 2c 20 6e 29 3d  ", azArg[i], n)=
21440 3d 30 20 29 7b 0a 20 20 20 20 20 20 62 56 65 72  =0 ){.      bVer
21450 62 6f 73 65 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  bose = 1;.    }.
21460 20 20 20 20 65 6c 73 65 20 69 66 28 20 6e 3e 31      else if( n>1
21470 20 26 26 20 73 71 6c 69 74 65 33 5f 73 74 72 6e   && sqlite3_strn
21480 69 63 6d 70 28 22 2d 67 72 6f 75 70 62 79 70 61  icmp("-groupbypa
21490 72 65 6e 74 22 2c 20 61 7a 41 72 67 5b 69 5d 2c  rent", azArg[i],
214a0 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20   n)==0 ){.      
214b0 62 47 72 6f 75 70 42 79 50 61 72 65 6e 74 20 3d  bGroupByParent =
214c0 20 31 3b 0a 20 20 20 20 20 20 7a 49 6e 64 65 6e   1;.      zInden
214d0 74 20 3d 20 22 20 20 20 20 22 3b 0a 20 20 20 20  t = "    ";.    
214e0 7d 0a 20 20 20 20 65 6c 73 65 7b 0a 20 20 20 20  }.    else{.    
214f0 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64    raw_printf(std
21500 65 72 72 2c 20 22 55 73 61 67 65 3a 20 25 73 20  err, "Usage: %s 
21510 25 73 20 3f 2d 76 65 72 62 6f 73 65 3f 20 3f 2d  %s ?-verbose? ?-
21520 67 72 6f 75 70 62 79 70 61 72 65 6e 74 3f 5c 6e  groupbyparent?\n
21530 22 2c 0a 20 20 20 20 20 20 20 20 20 20 61 7a 41  ",.          azA
21540 72 67 5b 30 5d 2c 20 61 7a 41 72 67 5b 31 5d 0a  rg[0], azArg[1].
21550 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 72        );.      r
21560 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
21570 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  OR;.    }.  }.. 
21580 20 2f 2a 20 52 65 67 69 73 74 65 72 20 74 68 65   /* Register the
21590 20 66 6b 65 79 5f 63 6f 6c 6c 61 74 65 5f 63 6c   fkey_collate_cl
215a0 61 75 73 65 28 29 20 53 51 4c 20 66 75 6e 63 74  ause() SQL funct
215b0 69 6f 6e 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71  ion */.  rc = sq
215c0 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
215d0 63 74 69 6f 6e 28 64 62 2c 20 22 66 6b 65 79 5f  ction(db, "fkey_
215e0 63 6f 6c 6c 61 74 65 5f 63 6c 61 75 73 65 22 2c  collate_clause",
215f0 20 34 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c   4, SQLITE_UTF8,
21600 0a 20 20 20 20 20 20 30 2c 20 73 68 65 6c 6c 46  .      0, shellF
21610 6b 65 79 43 6f 6c 6c 61 74 65 43 6c 61 75 73 65  keyCollateClause
21620 2c 20 30 2c 20 30 0a 20 20 29 3b 0a 0a 0a 20 20  , 0, 0.  );...  
21630 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
21640 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  K ){.    rc = sq
21650 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32  lite3_prepare_v2
21660 28 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26  (db, zSql, -1, &
21670 70 53 71 6c 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  pSql, 0);.  }.  
21680 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
21690 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  K ){.    sqlite3
216a0 5f 62 69 6e 64 5f 69 6e 74 28 70 53 71 6c 2c 20  _bind_int(pSql, 
216b0 31 2c 20 62 47 72 6f 75 70 42 79 50 61 72 65 6e  1, bGroupByParen
216c0 74 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72  t);.  }..  if( r
216d0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
216e0 20 20 20 20 69 6e 74 20 72 63 32 3b 0a 20 20 20      int rc2;.   
216f0 20 63 68 61 72 20 2a 7a 50 72 65 76 20 3d 20 30   char *zPrev = 0
21700 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 53 51 4c  ;.    while( SQL
21710 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33  ITE_ROW==sqlite3
21720 5f 73 74 65 70 28 70 53 71 6c 29 20 29 7b 0a 20  _step(pSql) ){. 
21730 20 20 20 20 20 69 6e 74 20 72 65 73 20 3d 20 2d       int res = -
21740 31 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  1;.      sqlite3
21750 5f 73 74 6d 74 20 2a 70 45 78 70 6c 61 69 6e 20  _stmt *pExplain 
21760 3d 20 30 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74  = 0;.      const
21770 20 63 68 61 72 20 2a 7a 45 51 50 20 3d 20 28 63   char *zEQP = (c
21780 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74  onst char*)sqlit
21790 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70  e3_column_text(p
217a0 53 71 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 63  Sql, 0);.      c
217b0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 47 6c 6f 62  onst char *zGlob
217c0 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29   = (const char*)
217d0 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
217e0 65 78 74 28 70 53 71 6c 2c 20 31 29 3b 0a 20 20  ext(pSql, 1);.  
217f0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
21800 7a 46 72 6f 6d 20 3d 20 28 63 6f 6e 73 74 20 63  zFrom = (const c
21810 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c  har*)sqlite3_col
21820 75 6d 6e 5f 74 65 78 74 28 70 53 71 6c 2c 20 32  umn_text(pSql, 2
21830 29 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  );.      const c
21840 68 61 72 20 2a 7a 54 61 72 67 65 74 20 3d 20 28  har *zTarget = (
21850 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69  const char*)sqli
21860 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28  te3_column_text(
21870 70 53 71 6c 2c 20 33 29 3b 0a 20 20 20 20 20 20  pSql, 3);.      
21880 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 49 20  const char *zCI 
21890 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73  = (const char*)s
218a0 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
218b0 78 74 28 70 53 71 6c 2c 20 34 29 3b 0a 20 20 20  xt(pSql, 4);.   
218c0 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
218d0 50 61 72 65 6e 74 20 3d 20 28 63 6f 6e 73 74 20  Parent = (const 
218e0 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f  char*)sqlite3_co
218f0 6c 75 6d 6e 5f 74 65 78 74 28 70 53 71 6c 2c 20  lumn_text(pSql, 
21900 35 29 3b 0a 0a 20 20 20 20 20 20 72 63 20 3d 20  5);..      rc = 
21910 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f  sqlite3_prepare_
21920 76 32 28 64 62 2c 20 7a 45 51 50 2c 20 2d 31 2c  v2(db, zEQP, -1,
21930 20 26 70 45 78 70 6c 61 69 6e 2c 20 30 29 3b 0a   &pExplain, 0);.
21940 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
21950 4c 49 54 45 5f 4f 4b 20 29 20 62 72 65 61 6b 3b  LITE_OK ) break;
21960 0a 20 20 20 20 20 20 69 66 28 20 53 51 4c 49 54  .      if( SQLIT
21970 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73  E_ROW==sqlite3_s
21980 74 65 70 28 70 45 78 70 6c 61 69 6e 29 20 29 7b  tep(pExplain) ){
21990 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63  .        const c
219a0 68 61 72 20 2a 7a 50 6c 61 6e 20 3d 20 28 63 6f  har *zPlan = (co
219b0 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65  nst char*)sqlite
219c0 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 45  3_column_text(pE
219d0 78 70 6c 61 69 6e 2c 20 33 29 3b 0a 20 20 20 20  xplain, 3);.    
219e0 20 20 20 20 72 65 73 20 3d 20 28 0a 20 20 20 20      res = (.    
219f0 20 20 20 20 20 20 20 20 20 20 30 3d 3d 73 71 6c            0==sql
21a00 69 74 65 33 5f 73 74 72 67 6c 6f 62 28 7a 47 6c  ite3_strglob(zGl
21a10 6f 62 2c 20 7a 50 6c 61 6e 29 0a 20 20 20 20 20  ob, zPlan).     
21a20 20 20 20 20 20 20 7c 7c 20 30 3d 3d 73 71 6c 69        || 0==sqli
21a30 74 65 33 5f 73 74 72 67 6c 6f 62 28 7a 47 6c 6f  te3_strglob(zGlo
21a40 62 49 50 4b 2c 20 7a 50 6c 61 6e 29 0a 20 20 20  bIPK, zPlan).   
21a50 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a       );.      }.
21a60 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
21a70 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 45 78 70  e3_finalize(pExp
21a80 6c 61 69 6e 29 3b 0a 20 20 20 20 20 20 69 66 28  lain);.      if(
21a90 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
21aa0 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20 69   break;..      i
21ab0 66 28 20 72 65 73 3c 30 20 29 7b 0a 20 20 20 20  f( res<0 ){.    
21ac0 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73      raw_printf(s
21ad0 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 69  tderr, "Error: i
21ae0 6e 74 65 72 6e 61 6c 20 65 72 72 6f 72 22 29 3b  nternal error");
21af0 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
21b00 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
21b10 20 20 20 20 20 69 66 28 20 62 47 72 6f 75 70 42       if( bGroupB
21b20 79 50 61 72 65 6e 74 0a 20 20 20 20 20 20 20 20  yParent.        
21b30 26 26 20 28 62 56 65 72 62 6f 73 65 20 7c 7c 20  && (bVerbose || 
21b40 72 65 73 3d 3d 30 29 0a 20 20 20 20 20 20 20 20  res==0).        
21b50 26 26 20 28 7a 50 72 65 76 3d 3d 30 20 7c 7c 20  && (zPrev==0 || 
21b60 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28  sqlite3_stricmp(
21b70 7a 50 61 72 65 6e 74 2c 20 7a 50 72 65 76 29 29  zParent, zPrev))
21b80 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20  .        ){.    
21b90 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
21ba0 28 6f 75 74 2c 20 22 2d 2d 20 50 61 72 65 6e 74  (out, "-- Parent
21bb0 20 74 61 62 6c 65 20 25 73 5c 6e 22 2c 20 7a 50   table %s\n", zP
21bc0 61 72 65 6e 74 29 3b 0a 20 20 20 20 20 20 20 20  arent);.        
21bd0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
21be0 50 72 65 76 29 3b 0a 20 20 20 20 20 20 20 20 20  Prev);.         
21bf0 20 7a 50 72 65 76 20 3d 20 73 71 6c 69 74 65 33   zPrev = sqlite3
21c00 5f 6d 70 72 69 6e 74 66 28 22 25 73 22 2c 20 7a  _mprintf("%s", z
21c10 50 61 72 65 6e 74 29 3b 0a 20 20 20 20 20 20 20  Parent);.       
21c20 20 7d 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20   }..        if( 
21c30 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  res==0 ){.      
21c40 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f      raw_printf(o
21c50 75 74 2c 20 22 25 73 25 73 20 2d 2d 3e 20 25 73  ut, "%s%s --> %s
21c60 5c 6e 22 2c 20 7a 49 6e 64 65 6e 74 2c 20 7a 43  \n", zIndent, zC
21c70 49 2c 20 7a 54 61 72 67 65 74 29 3b 0a 20 20 20  I, zTarget);.   
21c80 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 62       }else if( b
21c90 56 65 72 62 6f 73 65 20 29 7b 0a 20 20 20 20 20  Verbose ){.     
21ca0 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
21cb0 6f 75 74 2c 20 22 25 73 2f 2a 20 6e 6f 20 65 78  out, "%s/* no ex
21cc0 74 72 61 20 69 6e 64 65 78 65 73 20 72 65 71 75  tra indexes requ
21cd0 69 72 65 64 20 66 6f 72 20 25 73 20 2d 3e 20 25  ired for %s -> %
21ce0 73 20 2a 2f 5c 6e 22 2c 0a 20 20 20 20 20 20 20  s */\n",.       
21cf0 20 20 20 20 20 20 20 7a 49 6e 64 65 6e 74 2c 20         zIndent, 
21d00 7a 46 72 6f 6d 2c 20 7a 54 61 72 67 65 74 0a 20  zFrom, zTarget. 
21d10 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20           );.    
21d20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
21d30 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f    }.    sqlite3_
21d40 66 72 65 65 28 7a 50 72 65 76 29 3b 0a 0a 20 20  free(zPrev);..  
21d50 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
21d60 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 61 77  _OK ){.      raw
21d70 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
21d80 22 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f  "%s\n", sqlite3_
21d90 65 72 72 6d 73 67 28 64 62 29 29 3b 0a 20 20 20  errmsg(db));.   
21da0 20 7d 0a 0a 20 20 20 20 72 63 32 20 3d 20 73 71   }..    rc2 = sq
21db0 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
21dc0 53 71 6c 29 3b 0a 20 20 20 20 69 66 28 20 72 63  Sql);.    if( rc
21dd0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72  ==SQLITE_OK && r
21de0 63 32 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  c2!=SQLITE_OK ){
21df0 0a 20 20 20 20 20 20 72 63 20 3d 20 72 63 32 3b  .      rc = rc2;
21e00 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74  .      raw_print
21e10 66 28 73 74 64 65 72 72 2c 20 22 25 73 5c 6e 22  f(stderr, "%s\n"
21e20 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  , sqlite3_errmsg
21e30 28 64 62 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  (db));.    }.  }
21e40 65 6c 73 65 7b 0a 20 20 20 20 72 61 77 5f 70 72  else{.    raw_pr
21e50 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 25 73  intf(stderr, "%s
21e60 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72  \n", sqlite3_err
21e70 6d 73 67 28 64 62 29 29 3b 0a 20 20 7d 0a 0a 20  msg(db));.  }.. 
21e80 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
21e90 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74  *.** Implementat
21ea0 69 6f 6e 20 6f 66 20 22 2e 6c 69 6e 74 22 20 64  ion of ".lint" d
21eb0 6f 74 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a 73  ot command..*/.s
21ec0 74 61 74 69 63 20 69 6e 74 20 6c 69 6e 74 44 6f  tatic int lintDo
21ed0 74 43 6f 6d 6d 61 6e 64 28 0a 20 20 53 68 65 6c  tCommand(.  Shel
21ee0 6c 53 74 61 74 65 20 2a 70 53 74 61 74 65 2c 20  lState *pState, 
21ef0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
21f00 75 72 72 65 6e 74 20 73 68 65 6c 6c 20 74 6f 6f  urrent shell too
21f10 6c 20 73 74 61 74 65 20 2a 2f 0a 20 20 63 68 61  l state */.  cha
21f20 72 20 2a 2a 61 7a 41 72 67 2c 20 20 20 20 20 20  r **azArg,      
21f30 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21f40 41 72 72 61 79 20 6f 66 20 61 72 67 75 6d 65 6e  Array of argumen
21f50 74 73 20 70 61 73 73 65 64 20 74 6f 20 64 6f 74  ts passed to dot
21f60 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e   command */.  in
21f70 74 20 6e 41 72 67 20 20 20 20 20 20 20 20 20 20  t nArg          
21f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
21f90 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69   Number of entri
21fa0 65 73 20 69 6e 20 61 7a 41 72 67 5b 5d 20 2a 2f  es in azArg[] */
21fb0 0a 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 6e  .){.  int n;.  n
21fc0 20 3d 20 28 6e 41 72 67 3e 3d 32 20 3f 20 73 74   = (nArg>=2 ? st
21fd0 72 6c 65 6e 33 30 28 61 7a 41 72 67 5b 31 5d 29  rlen30(azArg[1])
21fe0 20 3a 20 30 29 3b 0a 20 20 69 66 28 20 6e 3c 31   : 0);.  if( n<1
21ff0 20 7c 7c 20 73 71 6c 69 74 65 33 5f 73 74 72 6e   || sqlite3_strn
22000 69 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 20 22  icmp(azArg[1], "
22010 66 6b 65 79 2d 69 6e 64 65 78 65 73 22 2c 20 6e  fkey-indexes", n
22020 29 20 29 20 67 6f 74 6f 20 75 73 61 67 65 3b 0a  ) ) goto usage;.
22030 20 20 72 65 74 75 72 6e 20 6c 69 6e 74 46 6b 65    return lintFke
22040 79 49 6e 64 65 78 65 73 28 70 53 74 61 74 65 2c  yIndexes(pState,
22050 20 61 7a 41 72 67 2c 20 6e 41 72 67 29 3b 0a 0a   azArg, nArg);..
22060 20 75 73 61 67 65 3a 0a 20 20 72 61 77 5f 70 72   usage:.  raw_pr
22070 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55 73  intf(stderr, "Us
22080 61 67 65 20 25 73 20 73 75 62 2d 63 6f 6d 6d 61  age %s sub-comma
22090 6e 64 20 3f 73 77 69 74 63 68 65 73 2e 2e 2e 3f  nd ?switches...?
220a0 5c 6e 22 2c 20 61 7a 41 72 67 5b 30 5d 29 3b 0a  \n", azArg[0]);.
220b0 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64    raw_printf(std
220c0 65 72 72 2c 20 22 57 68 65 72 65 20 73 75 62 2d  err, "Where sub-
220d0 63 6f 6d 6d 61 6e 64 73 20 61 72 65 3a 5c 6e 22  commands are:\n"
220e0 29 3b 0a 20 20 72 61 77 5f 70 72 69 6e 74 66 28  );.  raw_printf(
220f0 73 74 64 65 72 72 2c 20 22 20 20 20 20 66 6b 65  stderr, "    fke
22100 79 2d 69 6e 64 65 78 65 73 5c 6e 22 29 3b 0a 20  y-indexes\n");. 
22110 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
22120 52 52 4f 52 3b 0a 7d 0a 0a 23 69 66 20 21 64 65  RROR;.}..#if !de
22130 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
22140 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 20  T_VIRTUALTABLE) 
22150 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  && defined(SQLIT
22160 45 5f 48 41 56 45 5f 5a 4c 49 42 29 0a 2f 2a 2a  E_HAVE_ZLIB)./**
22170 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
22180 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
22190 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
221a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
221b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
221c0 2a 2a 20 54 68 65 20 22 2e 61 72 63 68 69 76 65  ** The ".archive
221d0 22 20 6f 72 20 22 2e 61 72 22 20 63 6f 6d 6d 61  " or ".ar" comma
221e0 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  nd..*/.static vo
221f0 69 64 20 73 68 65 6c 6c 50 72 65 70 61 72 65 28  id shellPrepare(
22200 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
22210 0a 20 20 69 6e 74 20 2a 70 52 63 2c 20 0a 20 20  .  int *pRc, .  
22220 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c  const char *zSql
22230 2c 20 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  , .  sqlite3_stm
22240 74 20 2a 2a 70 70 53 74 6d 74 0a 29 7b 0a 20 20  t **ppStmt.){.  
22250 2a 70 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 69  *ppStmt = 0;.  i
22260 66 28 20 2a 70 52 63 3d 3d 53 51 4c 49 54 45 5f  f( *pRc==SQLITE_
22270 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63  OK ){.    int rc
22280 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61   = sqlite3_prepa
22290 72 65 5f 76 32 28 64 62 2c 20 7a 53 71 6c 2c 20  re_v2(db, zSql, 
222a0 2d 31 2c 20 70 70 53 74 6d 74 2c 20 30 29 3b 0a  -1, ppStmt, 0);.
222b0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
222c0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
222d0 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  aw_printf(stderr
222e0 2c 20 22 73 71 6c 20 65 72 72 6f 72 3a 20 25 73  , "sql error: %s
222f0 20 28 25 64 29 5c 6e 22 2c 20 0a 20 20 20 20 20   (%d)\n", .     
22300 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65 72 72       sqlite3_err
22310 6d 73 67 28 64 62 29 2c 20 73 71 6c 69 74 65 33  msg(db), sqlite3
22320 5f 65 72 72 63 6f 64 65 28 64 62 29 0a 20 20 20  _errcode(db).   
22330 20 20 20 29 3b 0a 20 20 20 20 20 20 2a 70 52 63     );.      *pRc
22340 20 3d 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d   = rc;.    }.  }
22350 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .}..static void 
22360 73 68 65 6c 6c 50 72 65 70 61 72 65 50 72 69 6e  shellPreparePrin
22370 74 66 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  tf(.  sqlite3 *d
22380 62 2c 20 0a 20 20 69 6e 74 20 2a 70 52 63 2c 20  b, .  int *pRc, 
22390 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
223a0 2a 2a 70 70 53 74 6d 74 2c 0a 20 20 63 6f 6e 73  **ppStmt,.  cons
223b0 74 20 63 68 61 72 20 2a 7a 46 6d 74 2c 20 0a 20  t char *zFmt, . 
223c0 20 2e 2e 2e 0a 29 7b 0a 20 20 2a 70 70 53 74 6d   ....){.  *ppStm
223d0 74 20 3d 20 30 3b 0a 20 20 69 66 28 20 2a 70 52  t = 0;.  if( *pR
223e0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
223f0 20 20 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a      va_list ap;.
22400 20 20 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20      char *z;.   
22410 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46   va_start(ap, zF
22420 6d 74 29 3b 0a 20 20 20 20 7a 20 3d 20 73 71 6c  mt);.    z = sql
22430 69 74 65 33 5f 76 6d 70 72 69 6e 74 66 28 7a 46  ite3_vmprintf(zF
22440 6d 74 2c 20 61 70 29 3b 0a 20 20 20 20 69 66 28  mt, ap);.    if(
22450 20 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2a   z==0 ){.      *
22460 70 52 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d  pRc = SQLITE_NOM
22470 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  EM;.    }else{. 
22480 20 20 20 20 20 73 68 65 6c 6c 50 72 65 70 61 72       shellPrepar
22490 65 28 64 62 2c 20 70 52 63 2c 20 7a 2c 20 70 70  e(db, pRc, z, pp
224a0 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  Stmt);.      sql
224b0 69 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20  ite3_free(z);.  
224c0 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69    }.  }.}..stati
224d0 63 20 76 6f 69 64 20 73 68 65 6c 6c 46 69 6e 61  c void shellFina
224e0 6c 69 7a 65 28 0a 20 20 69 6e 74 20 2a 70 52 63  lize(.  int *pRc
224f0 2c 20 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  , .  sqlite3_stm
22500 74 20 2a 70 53 74 6d 74 0a 29 7b 0a 20 20 69 66  t *pStmt.){.  if
22510 28 20 70 53 74 6d 74 20 29 7b 0a 20 20 20 20 73  ( pStmt ){.    s
22520 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 73 71 6c  qlite3 *db = sql
22530 69 74 65 33 5f 64 62 5f 68 61 6e 64 6c 65 28 70  ite3_db_handle(p
22540 53 74 6d 74 29 3b 0a 20 20 20 20 69 6e 74 20 72  Stmt);.    int r
22550 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6e 61  c = sqlite3_fina
22560 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20  lize(pStmt);.   
22570 20 69 66 28 20 2a 70 52 63 3d 3d 53 51 4c 49 54   if( *pRc==SQLIT
22580 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66  E_OK ){.      if
22590 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
225a0 29 7b 0a 20 20 20 20 20 20 20 20 72 61 77 5f 70  ){.        raw_p
225b0 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 53  rintf(stderr, "S
225c0 51 4c 20 65 72 72 6f 72 3a 20 25 73 5c 6e 22 2c  QL error: %s\n",
225d0 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
225e0 64 62 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  db));.      }.  
225f0 20 20 20 20 2a 70 52 63 20 3d 20 72 63 3b 0a 20      *pRc = rc;. 
22600 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74     }.  }.}..stat
22610 69 63 20 76 6f 69 64 20 73 68 65 6c 6c 52 65 73  ic void shellRes
22620 65 74 28 0a 20 20 69 6e 74 20 2a 70 52 63 2c 20  et(.  int *pRc, 
22630 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
22640 2a 70 53 74 6d 74 0a 29 7b 0a 20 20 69 6e 74 20  *pStmt.){.  int 
22650 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73  rc = sqlite3_res
22660 65 74 28 70 53 74 6d 74 29 3b 0a 20 20 69 66 28  et(pStmt);.  if(
22670 20 2a 70 52 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b   *pRc==SQLITE_OK
22680 20 29 7b 0a 20 20 20 20 69 66 28 20 72 63 21 3d   ){.    if( rc!=
22690 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
226a0 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d     sqlite3 *db =
226b0 20 73 71 6c 69 74 65 33 5f 64 62 5f 68 61 6e 64   sqlite3_db_hand
226c0 6c 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20  le(pStmt);.     
226d0 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65   raw_printf(stde
226e0 72 72 2c 20 22 53 51 4c 20 65 72 72 6f 72 3a 20  rr, "SQL error: 
226f0 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f 65  %s\n", sqlite3_e
22700 72 72 6d 73 67 28 64 62 29 29 3b 0a 20 20 20 20  rrmsg(db));.    
22710 7d 0a 20 20 20 20 2a 70 52 63 20 3d 20 72 63 3b  }.    *pRc = rc;
22720 0a 20 20 7d 0a 7d 0a 2f 2a 0a 2a 2a 20 53 74 72  .  }.}./*.** Str
22730 75 63 74 75 72 65 20 72 65 70 72 65 73 65 6e 74  ucture represent
22740 69 6e 67 20 61 20 73 69 6e 67 6c 65 20 22 2e 61  ing a single ".a
22750 72 22 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a 74  r" command..*/.t
22760 79 70 65 64 65 66 20 73 74 72 75 63 74 20 41 72  ypedef struct Ar
22770 43 6f 6d 6d 61 6e 64 20 41 72 43 6f 6d 6d 61 6e  Command ArComman
22780 64 3b 0a 73 74 72 75 63 74 20 41 72 43 6f 6d 6d  d;.struct ArComm
22790 61 6e 64 20 7b 0a 20 20 75 38 20 65 43 6d 64 3b  and {.  u8 eCmd;
227a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
227b0 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 41 52          /* An AR
227c0 5f 43 4d 44 5f 2a 20 76 61 6c 75 65 20 2a 2f 0a  _CMD_* value */.
227d0 20 20 75 38 20 62 56 65 72 62 6f 73 65 3b 20 20    u8 bVerbose;  
227e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
227f0 20 20 2f 2a 20 54 72 75 65 20 69 66 20 2d 2d 76    /* True if --v
22800 65 72 62 6f 73 65 20 2a 2f 0a 20 20 75 38 20 62  erbose */.  u8 b
22810 5a 69 70 3b 20 20 20 20 20 20 20 20 20 20 20 20  Zip;            
22820 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
22830 72 75 65 20 69 66 20 74 68 65 20 61 72 63 68 69  rue if the archi
22840 76 65 20 69 73 20 61 20 5a 49 50 20 2a 2f 0a 20  ve is a ZIP */. 
22850 20 75 38 20 62 44 72 79 52 75 6e 3b 20 20 20 20   u8 bDryRun;    
22860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22870 20 2f 2a 20 54 72 75 65 20 69 66 20 2d 2d 64 72   /* True if --dr
22880 79 2d 72 75 6e 20 2a 2f 0a 20 20 75 38 20 62 41  y-run */.  u8 bA
22890 70 70 65 6e 64 3b 20 20 20 20 20 20 20 20 20 20  ppend;          
228a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
228b0 75 65 20 69 66 20 2d 2d 61 70 70 65 6e 64 20 2a  ue if --append *
228c0 2f 0a 20 20 69 6e 74 20 6e 41 72 67 3b 20 20 20  /.  int nArg;   
228d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
228e0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
228f0 20 63 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e   command argumen
22900 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 53  ts */.  char *zS
22910 72 63 54 61 62 6c 65 3b 20 20 20 20 20 20 20 20  rcTable;        
22920 20 20 20 20 20 20 20 20 2f 2a 20 22 73 71 6c 61          /* "sqla
22930 72 22 2c 20 22 7a 69 70 66 69 6c 65 28 24 66 69  r", "zipfile($fi
22940 6c 65 29 22 20 6f 72 20 22 7a 69 70 22 20 2a 2f  le)" or "zip" */
22950 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
22960 46 69 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20  File;           
22970 20 20 20 2f 2a 20 2d 2d 66 69 6c 65 20 61 72 67     /* --file arg
22980 75 6d 65 6e 74 2c 20 6f 72 20 4e 55 4c 4c 20 2a  ument, or NULL *
22990 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
229a0 7a 44 69 72 3b 20 20 20 20 20 20 20 20 20 20 20  zDir;           
229b0 20 20 20 20 2f 2a 20 2d 2d 64 69 72 65 63 74 6f      /* --directo
229c0 72 79 20 61 72 67 75 6d 65 6e 74 2c 20 6f 72 20  ry argument, or 
229d0 4e 55 4c 4c 20 2a 2f 0a 20 20 63 68 61 72 20 2a  NULL */.  char *
229e0 2a 61 7a 41 72 67 3b 20 20 20 20 20 20 20 20 20  *azArg;         
229f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72            /* Arr
22a00 61 79 20 6f 66 20 63 6f 6d 6d 61 6e 64 20 61 72  ay of command ar
22a10 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 53 68 65  guments */.  She
22a20 6c 6c 53 74 61 74 65 20 2a 70 3b 20 20 20 20 20  llState *p;     
22a30 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
22a40 53 68 65 6c 6c 20 73 74 61 74 65 20 2a 2f 0a 20  Shell state */. 
22a50 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20   sqlite3 *db;   
22a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22a70 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e   /* Database con
22a80 74 61 69 6e 69 6e 67 20 74 68 65 20 61 72 63 68  taining the arch
22a90 69 76 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  ive */.};../*.**
22aa0 20 50 72 69 6e 74 20 61 20 75 73 61 67 65 20 6d   Print a usage m
22ab0 65 73 73 61 67 65 20 66 6f 72 20 74 68 65 20 2e  essage for the .
22ac0 61 72 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 73 74  ar command to st
22ad0 64 65 72 72 20 61 6e 64 20 72 65 74 75 72 6e 20  derr and return 
22ae0 53 51 4c 49 54 45 5f 45 52 52 4f 52 2e 0a 2a 2f  SQLITE_ERROR..*/
22af0 0a 73 74 61 74 69 63 20 69 6e 74 20 61 72 55 73  .static int arUs
22b00 61 67 65 28 46 49 4c 45 20 2a 66 29 7b 0a 20 20  age(FILE *f){.  
22b10 72 61 77 5f 70 72 69 6e 74 66 28 66 2c 0a 22 5c  raw_printf(f,."\
22b20 6e 22 0a 22 55 73 61 67 65 3a 20 2e 61 72 20 5b  n"."Usage: .ar [
22b30 4f 50 54 49 4f 4e 2e 2e 2e 5d 20 5b 46 49 4c 45  OPTION...] [FILE
22b40 2e 2e 2e 5d 5c 6e 22 0a 22 54 68 65 20 2e 61 72  ...]\n"."The .ar
22b50 20 63 6f 6d 6d 61 6e 64 20 6d 61 6e 61 67 65 73   command manages
22b60 20 73 71 6c 61 72 20 61 72 63 68 69 76 65 73 2e   sqlar archives.
22b70 5c 6e 22 0a 22 5c 6e 22 0a 22 45 78 61 6d 70 6c  \n"."\n"."Exampl
22b80 65 73 3a 5c 6e 22 0a 22 20 20 2e 61 72 20 2d 63  es:\n"."  .ar -c
22b90 66 20 61 72 63 68 69 76 65 2e 73 61 72 20 66 6f  f archive.sar fo
22ba0 6f 20 62 61 72 20 20 20 20 23 20 43 72 65 61 74  o bar    # Creat
22bb0 65 20 61 72 63 68 69 76 65 2e 73 61 72 20 66 72  e archive.sar fr
22bc0 6f 6d 20 66 69 6c 65 73 20 66 6f 6f 20 61 6e 64  om files foo and
22bd0 20 62 61 72 5c 6e 22 0a 22 20 20 2e 61 72 20 2d   bar\n"."  .ar -
22be0 74 66 20 61 72 63 68 69 76 65 2e 73 61 72 20 20  tf archive.sar  
22bf0 20 20 20 20 20 20 20 20 20 20 23 20 4c 69 73 74            # List
22c00 20 6d 65 6d 62 65 72 73 20 6f 66 20 61 72 63 68   members of arch
22c10 69 76 65 2e 73 61 72 5c 6e 22 0a 22 20 20 2e 61  ive.sar\n"."  .a
22c20 72 20 2d 78 76 66 20 61 72 63 68 69 76 65 2e 73  r -xvf archive.s
22c30 61 72 20 20 20 20 20 20 20 20 20 20 20 23 20 56  ar           # V
22c40 65 72 62 6f 73 65 6c 79 20 65 78 74 72 61 63 74  erbosely extract
22c50 20 66 69 6c 65 73 20 66 72 6f 6d 20 61 72 63 68   files from arch
22c60 69 76 65 2e 73 61 72 5c 6e 22 0a 22 5c 6e 22 0a  ive.sar\n"."\n".
22c70 22 45 61 63 68 20 63 6f 6d 6d 61 6e 64 20 6c 69  "Each command li
22c80 6e 65 20 6d 75 73 74 20 66 65 61 74 75 72 65 20  ne must feature 
22c90 65 78 61 63 74 6c 79 20 6f 6e 65 20 63 6f 6d 6d  exactly one comm
22ca0 61 6e 64 20 6f 70 74 69 6f 6e 3a 5c 6e 22 0a 22  and option:\n"."
22cb0 20 20 2d 63 2c 20 2d 2d 63 72 65 61 74 65 20 20    -c, --create  
22cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 43 72 65               Cre
22cd0 61 74 65 20 61 20 6e 65 77 20 61 72 63 68 69 76  ate a new archiv
22ce0 65 5c 6e 22 0a 22 20 20 2d 75 2c 20 2d 2d 75 70  e\n"."  -u, --up
22cf0 64 61 74 65 20 20 20 20 20 20 20 20 20 20 20 20  date            
22d00 20 20 20 55 70 64 61 74 65 20 6f 72 20 61 64 64     Update or add
22d10 20 66 69 6c 65 73 20 74 6f 20 61 6e 20 65 78 69   files to an exi
22d20 73 74 69 6e 67 20 61 72 63 68 69 76 65 5c 6e 22  sting archive\n"
22d30 0a 22 20 20 2d 74 2c 20 2d 2d 6c 69 73 74 20 20  ."  -t, --list  
22d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4c                 L
22d50 69 73 74 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  ist contents of 
22d60 61 72 63 68 69 76 65 5c 6e 22 0a 22 20 20 2d 78  archive\n"."  -x
22d70 2c 20 2d 2d 65 78 74 72 61 63 74 20 20 20 20 20  , --extract     
22d80 20 20 20 20 20 20 20 20 20 45 78 74 72 61 63 74           Extract
22d90 20 66 69 6c 65 73 20 66 72 6f 6d 20 61 72 63 68   files from arch
22da0 69 76 65 5c 6e 22 0a 22 5c 6e 22 0a 22 41 6e 64  ive\n"."\n"."And
22db0 20 7a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 6f 70   zero or more op
22dc0 74 69 6f 6e 61 6c 20 6f 70 74 69 6f 6e 73 3a 5c  tional options:\
22dd0 6e 22 0a 22 20 20 2d 76 2c 20 2d 2d 76 65 72 62  n"."  -v, --verb
22de0 6f 73 65 20 20 20 20 20 20 20 20 20 20 20 20 20  ose             
22df0 20 50 72 69 6e 74 20 65 61 63 68 20 66 69 6c 65   Print each file
22e00 6e 61 6d 65 20 61 73 20 69 74 20 69 73 20 70 72  name as it is pr
22e10 6f 63 65 73 73 65 64 5c 6e 22 0a 22 20 20 2d 66  ocessed\n"."  -f
22e20 20 46 49 4c 45 2c 20 2d 2d 66 69 6c 65 20 46 49   FILE, --file FI
22e30 4c 45 20 20 20 20 20 20 20 4f 70 65 72 61 74 65  LE       Operate
22e40 20 6f 6e 20 61 72 63 68 69 76 65 20 46 49 4c 45   on archive FILE
22e50 20 28 64 65 66 61 75 6c 74 20 69 73 20 63 75 72   (default is cur
22e60 72 65 6e 74 20 64 62 29 5c 6e 22 0a 22 20 20 2d  rent db)\n"."  -
22e70 61 20 46 49 4c 45 2c 20 2d 2d 61 70 70 65 6e 64  a FILE, --append
22e80 20 46 49 4c 45 20 20 20 20 20 4f 70 65 72 61 74   FILE     Operat
22e90 65 20 6f 6e 20 46 49 4c 45 20 6f 70 65 6e 65 64  e on FILE opened
22ea0 20 75 73 69 6e 67 20 74 68 65 20 61 70 6e 64 76   using the apndv
22eb0 66 73 20 56 46 53 5c 6e 22 0a 22 20 20 2d 43 20  fs VFS\n"."  -C 
22ec0 44 49 52 2c 20 2d 2d 64 69 72 65 63 74 6f 72 79  DIR, --directory
22ed0 20 44 49 52 20 20 20 20 43 68 61 6e 67 65 20 74   DIR    Change t
22ee0 6f 20 64 69 72 65 63 74 6f 72 79 20 44 49 52 20  o directory DIR 
22ef0 74 6f 20 72 65 61 64 2f 65 78 74 72 61 63 74 20  to read/extract 
22f00 66 69 6c 65 73 5c 6e 22 0a 22 20 20 2d 6e 2c 20  files\n"."  -n, 
22f10 2d 2d 64 72 79 72 75 6e 20 20 20 20 20 20 20 20  --dryrun        
22f20 20 20 20 20 20 20 20 53 68 6f 77 20 74 68 65 20         Show the 
22f30 53 51 4c 20 74 68 61 74 20 77 6f 75 6c 64 20 68  SQL that would h
22f40 61 76 65 20 6f 63 63 75 72 72 65 64 5c 6e 22 0a  ave occurred\n".
22f50 22 5c 6e 22 0a 22 53 65 65 20 61 6c 73 6f 3a 20  "\n"."See also: 
22f60 68 74 74 70 3a 2f 2f 73 71 6c 69 74 65 2e 6f 72  http://sqlite.or
22f70 67 2f 63 6c 69 2e 68 74 6d 6c 23 73 71 6c 61 72  g/cli.html#sqlar
22f80 5f 61 72 63 68 69 76 65 5f 73 75 70 70 6f 72 74  _archive_support
22f90 5c 6e 22 0a 22 5c 6e 22 0a 29 3b 0a 20 20 72 65  \n"."\n".);.  re
22fa0 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
22fb0 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 69 6e  R;.}../*.** Prin
22fc0 74 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  t an error messa
22fd0 67 65 20 66 6f 72 20 74 68 65 20 2e 61 72 20 63  ge for the .ar c
22fe0 6f 6d 6d 61 6e 64 20 74 6f 20 73 74 64 65 72 72  ommand to stderr
22ff0 20 61 6e 64 20 72 65 74 75 72 6e 20 0a 2a 2a 20   and return .** 
23000 53 51 4c 49 54 45 5f 45 52 52 4f 52 2e 0a 2a 2f  SQLITE_ERROR..*/
23010 0a 73 74 61 74 69 63 20 69 6e 74 20 61 72 45 72  .static int arEr
23020 72 6f 72 4d 73 67 28 63 6f 6e 73 74 20 63 68 61  rorMsg(const cha
23030 72 20 2a 7a 46 6d 74 2c 20 2e 2e 2e 29 7b 0a 20  r *zFmt, ...){. 
23040 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 63   va_list ap;.  c
23050 68 61 72 20 2a 7a 3b 0a 20 20 76 61 5f 73 74 61  har *z;.  va_sta
23060 72 74 28 61 70 2c 20 7a 46 6d 74 29 3b 0a 20 20  rt(ap, zFmt);.  
23070 7a 20 3d 20 73 71 6c 69 74 65 33 5f 76 6d 70 72  z = sqlite3_vmpr
23080 69 6e 74 66 28 7a 46 6d 74 2c 20 61 70 29 3b 0a  intf(zFmt, ap);.
23090 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20    va_end(ap);.  
230a0 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72  raw_printf(stder
230b0 72 2c 20 22 45 72 72 6f 72 3a 20 25 73 20 28 74  r, "Error: %s (t
230c0 72 79 20 5c 22 2e 61 72 20 2d 2d 68 65 6c 70 5c  ry \".ar --help\
230d0 22 29 5c 6e 22 2c 20 7a 29 3b 0a 20 20 73 71 6c  ")\n", z);.  sql
230e0 69 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20  ite3_free(z);.  
230f0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
23100 52 4f 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 56 61  ROR;.}../*.** Va
23110 6c 75 65 73 20 66 6f 72 20 41 72 43 6f 6d 6d 61  lues for ArComma
23120 6e 64 2e 65 43 6d 64 2e 0a 2a 2f 0a 23 64 65 66  nd.eCmd..*/.#def
23130 69 6e 65 20 41 52 5f 43 4d 44 5f 43 52 45 41 54  ine AR_CMD_CREAT
23140 45 20 20 20 20 20 20 20 31 0a 23 64 65 66 69 6e  E       1.#defin
23150 65 20 41 52 5f 43 4d 44 5f 45 58 54 52 41 43 54  e AR_CMD_EXTRACT
23160 20 20 20 20 20 20 32 0a 23 64 65 66 69 6e 65 20        2.#define 
23170 41 52 5f 43 4d 44 5f 4c 49 53 54 20 20 20 20 20  AR_CMD_LIST     
23180 20 20 20 20 33 0a 23 64 65 66 69 6e 65 20 41 52      3.#define AR
23190 5f 43 4d 44 5f 55 50 44 41 54 45 20 20 20 20 20  _CMD_UPDATE     
231a0 20 20 34 0a 23 64 65 66 69 6e 65 20 41 52 5f 43    4.#define AR_C
231b0 4d 44 5f 48 45 4c 50 20 20 20 20 20 20 20 20 20  MD_HELP         
231c0 35 0a 0a 2f 2a 0a 2a 2a 20 4f 74 68 65 72 20 28  5../*.** Other (
231d0 6e 6f 6e 2d 63 6f 6d 6d 61 6e 64 29 20 73 77 69  non-command) swi
231e0 74 63 68 65 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e  tches..*/.#defin
231f0 65 20 41 52 5f 53 57 49 54 43 48 5f 56 45 52 42  e AR_SWITCH_VERB
23200 4f 53 45 20 20 20 20 20 36 0a 23 64 65 66 69 6e  OSE     6.#defin
23210 65 20 41 52 5f 53 57 49 54 43 48 5f 46 49 4c 45  e AR_SWITCH_FILE
23220 20 20 20 20 20 20 20 20 37 0a 23 64 65 66 69 6e          7.#defin
23230 65 20 41 52 5f 53 57 49 54 43 48 5f 44 49 52 45  e AR_SWITCH_DIRE
23240 43 54 4f 52 59 20 20 20 38 0a 23 64 65 66 69 6e  CTORY   8.#defin
23250 65 20 41 52 5f 53 57 49 54 43 48 5f 41 50 50 45  e AR_SWITCH_APPE
23260 4e 44 20 20 20 20 20 20 39 0a 23 64 65 66 69 6e  ND      9.#defin
23270 65 20 41 52 5f 53 57 49 54 43 48 5f 44 52 59 52  e AR_SWITCH_DRYR
23280 55 4e 20 20 20 20 20 31 30 0a 0a 73 74 61 74 69  UN     10..stati
23290 63 20 69 6e 74 20 61 72 50 72 6f 63 65 73 73 53  c int arProcessS
232a0 77 69 74 63 68 28 41 72 43 6f 6d 6d 61 6e 64 20  witch(ArCommand 
232b0 2a 70 41 72 2c 20 69 6e 74 20 65 53 77 69 74 63  *pAr, int eSwitc
232c0 68 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  h, const char *z
232d0 41 72 67 29 7b 0a 20 20 73 77 69 74 63 68 28 20  Arg){.  switch( 
232e0 65 53 77 69 74 63 68 20 29 7b 0a 20 20 20 20 63  eSwitch ){.    c
232f0 61 73 65 20 41 52 5f 43 4d 44 5f 43 52 45 41 54  ase AR_CMD_CREAT
23300 45 3a 0a 20 20 20 20 63 61 73 65 20 41 52 5f 43  E:.    case AR_C
23310 4d 44 5f 45 58 54 52 41 43 54 3a 0a 20 20 20 20  MD_EXTRACT:.    
23320 63 61 73 65 20 41 52 5f 43 4d 44 5f 4c 49 53 54  case AR_CMD_LIST
23330 3a 0a 20 20 20 20 63 61 73 65 20 41 52 5f 43 4d  :.    case AR_CM
23340 44 5f 55 50 44 41 54 45 3a 0a 20 20 20 20 63 61  D_UPDATE:.    ca
23350 73 65 20 41 52 5f 43 4d 44 5f 48 45 4c 50 3a 0a  se AR_CMD_HELP:.
23360 20 20 20 20 20 20 69 66 28 20 70 41 72 2d 3e 65        if( pAr->e
23370 43 6d 64 20 29 7b 0a 20 20 20 20 20 20 20 20 72  Cmd ){.        r
23380 65 74 75 72 6e 20 61 72 45 72 72 6f 72 4d 73 67  eturn arErrorMsg
23390 28 22 6d 75 6c 74 69 70 6c 65 20 63 6f 6d 6d 61  ("multiple comma
233a0 6e 64 20 6f 70 74 69 6f 6e 73 22 29 3b 0a 20 20  nd options");.  
233b0 20 20 20 20 7d 0a 20 20 20 20 20 20 70 41 72 2d      }.      pAr-
233c0 3e 65 43 6d 64 20 3d 20 65 53 77 69 74 63 68 3b  >eCmd = eSwitch;
233d0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20  .      break;.. 
233e0 20 20 20 63 61 73 65 20 41 52 5f 53 57 49 54 43     case AR_SWITC
233f0 48 5f 44 52 59 52 55 4e 3a 0a 20 20 20 20 20 20  H_DRYRUN:.      
23400 70 41 72 2d 3e 62 44 72 79 52 75 6e 20 3d 20 31  pAr->bDryRun = 1
23410 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
23420 20 20 20 63 61 73 65 20 41 52 5f 53 57 49 54 43     case AR_SWITC
23430 48 5f 56 45 52 42 4f 53 45 3a 0a 20 20 20 20 20  H_VERBOSE:.     
23440 20 70 41 72 2d 3e 62 56 65 72 62 6f 73 65 20 3d   pAr->bVerbose =
23450 20 31 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   1;.      break;
23460 0a 20 20 20 20 63 61 73 65 20 41 52 5f 53 57 49  .    case AR_SWI
23470 54 43 48 5f 41 50 50 45 4e 44 3a 0a 20 20 20 20  TCH_APPEND:.    
23480 20 20 70 41 72 2d 3e 62 41 70 70 65 6e 64 20 3d    pAr->bAppend =
23490 20 31 3b 0a 20 20 20 20 20 20 2f 2a 20 46 61 6c   1;.      /* Fal
234a0 6c 20 74 68 72 75 20 69 6e 74 6f 20 2d 2d 66 69  l thru into --fi
234b0 6c 65 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 41  le */.    case A
234c0 52 5f 53 57 49 54 43 48 5f 46 49 4c 45 3a 0a 20  R_SWITCH_FILE:. 
234d0 20 20 20 20 20 70 41 72 2d 3e 7a 46 69 6c 65 20       pAr->zFile 
234e0 3d 20 7a 41 72 67 3b 0a 20 20 20 20 20 20 62 72  = zArg;.      br
234f0 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 41 52  eak;.    case AR
23500 5f 53 57 49 54 43 48 5f 44 49 52 45 43 54 4f 52  _SWITCH_DIRECTOR
23510 59 3a 0a 20 20 20 20 20 20 70 41 72 2d 3e 7a 44  Y:.      pAr->zD
23520 69 72 20 3d 20 7a 41 72 67 3b 0a 20 20 20 20 20  ir = zArg;.     
23530 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 72   break;.  }..  r
23540 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
23550 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 73 65 20  .}../*.** Parse 
23560 74 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65  the command line
23570 20 66 6f 72 20 61 6e 20 22 2e 61 72 22 20 63 6f   for an ".ar" co
23580 6d 6d 61 6e 64 2e 20 54 68 65 20 72 65 73 75 6c  mmand. The resul
23590 74 73 20 61 72 65 20 77 72 69 74 74 65 6e 20 69  ts are written i
235a0 6e 74 6f 0a 2a 2a 20 73 74 72 75 63 74 75 72 65  nto.** structure
235b0 20 28 2a 70 41 72 29 2e 20 53 51 4c 49 54 45 5f   (*pAr). SQLITE_
235c0 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  OK is returned i
235d0 66 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69  f the command li
235e0 6e 65 20 69 73 20 70 61 72 73 65 64 0a 2a 2a 20  ne is parsed.** 
235f0 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 6f 74  successfully, ot
23600 68 65 72 77 69 73 65 20 61 6e 20 65 72 72 6f 72  herwise an error
23610 20 6d 65 73 73 61 67 65 20 69 73 20 77 72 69 74   message is writ
23620 74 65 6e 20 74 6f 20 73 74 64 65 72 72 20 61 6e  ten to stderr an
23630 64 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 45 52 52  d .** SQLITE_ERR
23640 4f 52 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  OR returned..*/.
23650 73 74 61 74 69 63 20 69 6e 74 20 61 72 50 61 72  static int arPar
23660 73 65 43 6f 6d 6d 61 6e 64 28 0a 20 20 63 68 61  seCommand(.  cha
23670 72 20 2a 2a 61 7a 41 72 67 2c 20 20 20 20 20 20  r **azArg,      
23680 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23690 41 72 72 61 79 20 6f 66 20 61 72 67 75 6d 65 6e  Array of argumen
236a0 74 73 20 70 61 73 73 65 64 20 74 6f 20 64 6f 74  ts passed to dot
236b0 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e   command */.  in
236c0 74 20 6e 41 72 67 2c 20 20 20 20 20 20 20 20 20  t nArg,         
236d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
236e0 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69   Number of entri
236f0 65 73 20 69 6e 20 61 7a 41 72 67 5b 5d 20 2a 2f  es in azArg[] */
23700 0a 20 20 41 72 43 6f 6d 6d 61 6e 64 20 2a 70 41  .  ArCommand *pA
23710 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r               
23720 20 20 20 2f 2a 20 50 6f 70 75 6c 61 74 65 20 74     /* Populate t
23730 68 69 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b  his object */.){
23740 0a 20 20 73 74 72 75 63 74 20 41 72 53 77 69 74  .  struct ArSwit
23750 63 68 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  ch {.    const c
23760 68 61 72 20 2a 7a 4c 6f 6e 67 3b 0a 20 20 20 20  har *zLong;.    
23770 63 68 61 72 20 63 53 68 6f 72 74 3b 0a 20 20 20  char cShort;.   
23780 20 75 38 20 65 53 77 69 74 63 68 3b 0a 20 20 20   u8 eSwitch;.   
23790 20 75 38 20 62 41 72 67 3b 0a 20 20 7d 20 61 53   u8 bArg;.  } aS
237a0 77 69 74 63 68 5b 5d 20 3d 20 7b 0a 20 20 20 20  witch[] = {.    
237b0 7b 20 22 63 72 65 61 74 65 22 2c 20 20 20 20 27  { "create",    '
237c0 63 27 2c 20 41 52 5f 43 4d 44 5f 43 52 45 41 54  c', AR_CMD_CREAT
237d0 45 2c 20 20 20 20 20 20 20 30 20 7d 2c 0a 20 20  E,       0 },.  
237e0 20 20 7b 20 22 65 78 74 72 61 63 74 22 2c 20 20    { "extract",  
237f0 20 27 78 27 2c 20 41 52 5f 43 4d 44 5f 45 58 54   'x', AR_CMD_EXT
23800 52 41 43 54 2c 20 20 20 20 20 20 30 20 7d 2c 0a  RACT,      0 },.
23810 20 20 20 20 7b 20 22 6c 69 73 74 22 2c 20 20 20      { "list",   
23820 20 20 20 27 74 27 2c 20 41 52 5f 43 4d 44 5f 4c     't', AR_CMD_L
23830 49 53 54 2c 20 20 20 20 20 20 20 20 20 30 20 7d  IST,         0 }
23840 2c 0a 20 20 20 20 7b 20 22 75 70 64 61 74 65 22  ,.    { "update"
23850 2c 20 20 20 20 27 75 27 2c 20 41 52 5f 43 4d 44  ,    'u', AR_CMD
23860 5f 55 50 44 41 54 45 2c 20 20 20 20 20 20 20 30  _UPDATE,       0
23870 20 7d 2c 0a 20 20 20 20 7b 20 22 68 65 6c 70 22   },.    { "help"
23880 2c 20 20 20 20 20 20 27 68 27 2c 20 41 52 5f 43  ,      'h', AR_C
23890 4d 44 5f 48 45 4c 50 2c 20 20 20 20 20 20 20 20  MD_HELP,        
238a0 20 30 20 7d 2c 0a 20 20 20 20 7b 20 22 76 65 72   0 },.    { "ver
238b0 62 6f 73 65 22 2c 20 20 20 27 76 27 2c 20 41 52  bose",   'v', AR
238c0 5f 53 57 49 54 43 48 5f 56 45 52 42 4f 53 45 2c  _SWITCH_VERBOSE,
238d0 20 20 20 30 20 7d 2c 0a 20 20 20 20 7b 20 22 66     0 },.    { "f
238e0 69 6c 65 22 2c 20 20 20 20 20 20 27 66 27 2c 20  ile",      'f', 
238f0 41 52 5f 53 57 49 54 43 48 5f 46 49 4c 45 2c 20  AR_SWITCH_FILE, 
23900 20 20 20 20 20 31 20 7d 2c 0a 20 20 20 20 7b 20       1 },.    { 
23910 22 61 70 70 65 6e 64 22 2c 20 20 20 20 27 61 27  "append",    'a'
23920 2c 20 41 52 5f 53 57 49 54 43 48 5f 41 50 50 45  , AR_SWITCH_APPE
23930 4e 44 2c 20 20 20 20 31 20 7d 2c 0a 20 20 20 20  ND,    1 },.    
23940 7b 20 22 64 69 72 65 63 74 6f 72 79 22 2c 20 27  { "directory", '
23950 43 27 2c 20 41 52 5f 53 57 49 54 43 48 5f 44 49  C', AR_SWITCH_DI
23960 52 45 43 54 4f 52 59 2c 20 31 20 7d 2c 0a 20 20  RECTORY, 1 },.  
23970 20 20 7b 20 22 64 72 79 72 75 6e 22 2c 20 20 20    { "dryrun",   
23980 20 27 6e 27 2c 20 41 52 5f 53 57 49 54 43 48 5f   'n', AR_SWITCH_
23990 44 52 59 52 55 4e 2c 20 20 20 20 30 20 7d 2c 0a  DRYRUN,    0 },.
239a0 20 20 7d 3b 0a 20 20 69 6e 74 20 6e 53 77 69 74    };.  int nSwit
239b0 63 68 20 3d 20 73 69 7a 65 6f 66 28 61 53 77 69  ch = sizeof(aSwi
239c0 74 63 68 29 20 2f 20 73 69 7a 65 6f 66 28 73 74  tch) / sizeof(st
239d0 72 75 63 74 20 41 72 53 77 69 74 63 68 29 3b 0a  ruct ArSwitch);.
239e0 20 20 73 74 72 75 63 74 20 41 72 53 77 69 74 63    struct ArSwitc
239f0 68 20 2a 70 45 6e 64 20 3d 20 26 61 53 77 69 74  h *pEnd = &aSwit
23a00 63 68 5b 6e 53 77 69 74 63 68 5d 3b 0a 0a 20 20  ch[nSwitch];..  
23a10 69 66 28 20 6e 41 72 67 3c 3d 31 20 29 7b 0a 20  if( nArg<=1 ){. 
23a20 20 20 20 72 65 74 75 72 6e 20 61 72 55 73 61 67     return arUsag
23a30 65 28 73 74 64 65 72 72 29 3b 0a 20 20 7d 65 6c  e(stderr);.  }el
23a40 73 65 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 20  se{.    char *z 
23a50 3d 20 61 7a 41 72 67 5b 31 5d 3b 0a 20 20 20 20  = azArg[1];.    
23a60 6d 65 6d 73 65 74 28 70 41 72 2c 20 30 2c 20 73  memset(pAr, 0, s
23a70 69 7a 65 6f 66 28 41 72 43 6f 6d 6d 61 6e 64 29  izeof(ArCommand)
23a80 29 3b 0a 0a 20 20 20 20 69 66 28 20 7a 5b 30 5d  );..    if( z[0]
23a90 21 3d 27 2d 27 20 29 7b 0a 20 20 20 20 20 20 2f  !='-' ){.      /
23aa0 2a 20 54 72 61 64 69 74 69 6f 6e 61 6c 20 73 74  * Traditional st
23ab0 79 6c 65 20 5b 74 61 72 5d 20 69 6e 76 6f 63 61  yle [tar] invoca
23ac0 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 69 6e  tion */.      in
23ad0 74 20 69 3b 0a 20 20 20 20 20 20 69 6e 74 20 69  t i;.      int i
23ae0 41 72 67 20 3d 20 32 3b 0a 20 20 20 20 20 20 66  Arg = 2;.      f
23af0 6f 72 28 69 3d 30 3b 20 7a 5b 69 5d 3b 20 69 2b  or(i=0; z[i]; i+
23b00 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73  +){.        cons
23b10 74 20 63 68 61 72 20 2a 7a 41 72 67 20 3d 20 30  t char *zArg = 0
23b20 3b 0a 20 20 20 20 20 20 20 20 73 74 72 75 63 74  ;.        struct
23b30 20 41 72 53 77 69 74 63 68 20 2a 70 4f 70 74 3b   ArSwitch *pOpt;
23b40 0a 20 20 20 20 20 20 20 20 66 6f 72 28 70 4f 70  .        for(pOp
23b50 74 3d 26 61 53 77 69 74 63 68 5b 30 5d 3b 20 70  t=&aSwitch[0]; p
23b60 4f 70 74 3c 70 45 6e 64 3b 20 70 4f 70 74 2b 2b  Opt<pEnd; pOpt++
23b70 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
23b80 20 7a 5b 69 5d 3d 3d 70 4f 70 74 2d 3e 63 53 68   z[i]==pOpt->cSh
23b90 6f 72 74 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ort ) break;.   
23ba0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
23bb0 66 28 20 70 4f 70 74 3d 3d 70 45 6e 64 20 29 7b  f( pOpt==pEnd ){
23bc0 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
23bd0 6e 20 61 72 45 72 72 6f 72 4d 73 67 28 22 75 6e  n arErrorMsg("un
23be0 72 65 63 6f 67 6e 69 7a 65 64 20 6f 70 74 69 6f  recognized optio
23bf0 6e 3a 20 25 63 22 2c 20 7a 5b 69 5d 29 3b 0a 20  n: %c", z[i]);. 
23c00 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
23c10 20 69 66 28 20 70 4f 70 74 2d 3e 62 41 72 67 20   if( pOpt->bArg 
23c20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
23c30 20 69 41 72 67 3e 3d 6e 41 72 67 20 29 7b 0a 20   iArg>=nArg ){. 
23c40 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
23c50 6e 20 61 72 45 72 72 6f 72 4d 73 67 28 22 6f 70  n arErrorMsg("op
23c60 74 69 6f 6e 20 72 65 71 75 69 72 65 73 20 61 6e  tion requires an
23c70 20 61 72 67 75 6d 65 6e 74 3a 20 25 63 22 2c 7a   argument: %c",z
23c80 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20  [i]);.          
23c90 7d 0a 20 20 20 20 20 20 20 20 20 20 7a 41 72 67  }.          zArg
23ca0 20 3d 20 61 7a 41 72 67 5b 69 41 72 67 2b 2b 5d   = azArg[iArg++]
23cb0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
23cc0 20 20 20 20 69 66 28 20 61 72 50 72 6f 63 65 73      if( arProces
23cd0 73 53 77 69 74 63 68 28 70 41 72 2c 20 70 4f 70  sSwitch(pAr, pOp
23ce0 74 2d 3e 65 53 77 69 74 63 68 2c 20 7a 41 72 67  t->eSwitch, zArg
23cf0 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ) ) return SQLIT
23d00 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d  E_ERROR;.      }
23d10 0a 20 20 20 20 20 20 70 41 72 2d 3e 6e 41 72 67  .      pAr->nArg
23d20 20 3d 20 6e 41 72 67 2d 69 41 72 67 3b 0a 20 20   = nArg-iArg;.  
23d30 20 20 20 20 69 66 28 20 70 41 72 2d 3e 6e 41 72      if( pAr->nAr
23d40 67 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  g>0 ){.        p
23d50 41 72 2d 3e 61 7a 41 72 67 20 3d 20 26 61 7a 41  Ar->azArg = &azA
23d60 72 67 5b 69 41 72 67 5d 3b 0a 20 20 20 20 20 20  rg[iArg];.      
23d70 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
23d80 20 20 20 2f 2a 20 4e 6f 6e 2d 74 72 61 64 69 74     /* Non-tradit
23d90 69 6f 6e 61 6c 20 69 6e 76 6f 63 61 74 69 6f 6e  ional invocation
23da0 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 41   */.      int iA
23db0 72 67 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 41  rg;.      for(iA
23dc0 72 67 3d 31 3b 20 69 41 72 67 3c 6e 41 72 67 3b  rg=1; iArg<nArg;
23dd0 20 69 41 72 67 2b 2b 29 7b 0a 20 20 20 20 20 20   iArg++){.      
23de0 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 20 20 20    int n;.       
23df0 20 7a 20 3d 20 61 7a 41 72 67 5b 69 41 72 67 5d   z = azArg[iArg]
23e00 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 5b  ;.        if( z[
23e10 30 5d 21 3d 27 2d 27 20 29 7b 0a 20 20 20 20 20  0]!='-' ){.     
23e20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 72 65 6d 61       /* All rema
23e30 69 6e 69 6e 67 20 63 6f 6d 6d 61 6e 64 20 6c 69  ining command li
23e40 6e 65 20 77 6f 72 64 73 20 61 72 65 20 63 6f 6d  ne words are com
23e50 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 2e 20  mand arguments. 
23e60 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 70 41 72  */.          pAr
23e70 2d 3e 61 7a 41 72 67 20 3d 20 26 61 7a 41 72 67  ->azArg = &azArg
23e80 5b 69 41 72 67 5d 3b 0a 20 20 20 20 20 20 20 20  [iArg];.        
23e90 20 20 70 41 72 2d 3e 6e 41 72 67 20 3d 20 6e 41    pAr->nArg = nA
23ea0 72 67 2d 69 41 72 67 3b 0a 20 20 20 20 20 20 20  rg-iArg;.       
23eb0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
23ec0 20 20 7d 0a 20 20 20 20 20 20 20 20 6e 20 3d 20    }.        n = 
23ed0 73 74 72 6c 65 6e 33 30 28 7a 29 3b 0a 0a 20 20  strlen30(z);..  
23ee0 20 20 20 20 20 20 69 66 28 20 7a 5b 31 5d 21 3d        if( z[1]!=
23ef0 27 2d 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20  '-' ){.         
23f00 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 20 20   int i;.        
23f10 20 20 2f 2a 20 4f 6e 65 20 6f 72 20 6d 6f 72 65    /* One or more
23f20 20 73 68 6f 72 74 20 6f 70 74 69 6f 6e 73 20 2a   short options *
23f30 2f 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28  /.          for(
23f40 69 3d 31 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a  i=1; i<n; i++){.
23f50 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73              cons
23f60 74 20 63 68 61 72 20 2a 7a 41 72 67 20 3d 20 30  t char *zArg = 0
23f70 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 74  ;.            st
23f80 72 75 63 74 20 41 72 53 77 69 74 63 68 20 2a 70  ruct ArSwitch *p
23f90 4f 70 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20  Opt;.           
23fa0 20 66 6f 72 28 70 4f 70 74 3d 26 61 53 77 69 74   for(pOpt=&aSwit
23fb0 63 68 5b 30 5d 3b 20 70 4f 70 74 3c 70 45 6e 64  ch[0]; pOpt<pEnd
23fc0 3b 20 70 4f 70 74 2b 2b 29 7b 0a 20 20 20 20 20  ; pOpt++){.     
23fd0 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 5b 69           if( z[i
23fe0 5d 3d 3d 70 4f 70 74 2d 3e 63 53 68 6f 72 74 20  ]==pOpt->cShort 
23ff0 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20  ) break;.       
24000 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
24010 20 20 20 69 66 28 20 70 4f 70 74 3d 3d 70 45 6e     if( pOpt==pEn
24020 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  d ){.           
24030 20 20 20 72 65 74 75 72 6e 20 61 72 45 72 72 6f     return arErro
24040 72 4d 73 67 28 22 75 6e 72 65 63 6f 67 6e 69 7a  rMsg("unrecogniz
24050 65 64 20 6f 70 74 69 6f 6e 3a 20 25 63 5c 6e 22  ed option: %c\n"
24060 2c 20 7a 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20  , z[i]);.       
24070 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
24080 20 20 20 69 66 28 20 70 4f 70 74 2d 3e 62 41 72     if( pOpt->bAr
24090 67 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  g ){.           
240a0 20 20 20 69 66 28 20 69 3c 28 6e 2d 31 29 20 29     if( i<(n-1) )
240b0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
240c0 20 20 7a 41 72 67 20 3d 20 26 7a 5b 69 2b 31 5d    zArg = &z[i+1]
240d0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
240e0 20 20 69 20 3d 20 6e 3b 0a 20 20 20 20 20 20 20    i = n;.       
240f0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
24100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
24110 28 20 69 41 72 67 3e 3d 28 6e 41 72 67 2d 31 29  ( iArg>=(nArg-1)
24120 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
24130 20 20 20 20 20 20 72 65 74 75 72 6e 20 61 72 45        return arE
24140 72 72 6f 72 4d 73 67 28 22 6f 70 74 69 6f 6e 20  rrorMsg("option 
24150 72 65 71 75 69 72 65 73 20 61 6e 20 61 72 67 75  requires an argu
24160 6d 65 6e 74 3a 20 25 63 5c 6e 22 2c 7a 5b 69 5d  ment: %c\n",z[i]
24170 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
24180 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
24190 20 20 20 20 20 7a 41 72 67 20 3d 20 61 7a 41 72       zArg = azAr
241a0 67 5b 2b 2b 69 41 72 67 5d 3b 0a 20 20 20 20 20  g[++iArg];.     
241b0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
241c0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
241d0 20 20 20 20 20 69 66 28 20 61 72 50 72 6f 63 65       if( arProce
241e0 73 73 53 77 69 74 63 68 28 70 41 72 2c 20 70 4f  ssSwitch(pAr, pO
241f0 70 74 2d 3e 65 53 77 69 74 63 68 2c 20 7a 41 72  pt->eSwitch, zAr
24200 67 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  g) ) return SQLI
24210 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  TE_ERROR;.      
24220 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65      }.        }e
24230 6c 73 65 20 69 66 28 20 7a 5b 32 5d 3d 3d 27 5c  lse if( z[2]=='\
24240 30 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  0' ){.          
24250 2f 2a 20 41 20 2d 2d 20 6f 70 74 69 6f 6e 2c 20  /* A -- option, 
24260 69 6e 64 69 63 61 74 69 6e 67 20 74 68 61 74 20  indicating that 
24270 61 6c 6c 20 72 65 6d 61 69 6e 69 6e 67 20 63 6f  all remaining co
24280 6d 6d 61 6e 64 20 6c 69 6e 65 20 77 6f 72 64 73  mmand line words
24290 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 72  .          ** ar
242a0 65 20 63 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65  e command argume
242b0 6e 74 73 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20  nts.  */.       
242c0 20 20 20 70 41 72 2d 3e 61 7a 41 72 67 20 3d 20     pAr->azArg = 
242d0 26 61 7a 41 72 67 5b 69 41 72 67 2b 31 5d 3b 0a  &azArg[iArg+1];.
242e0 20 20 20 20 20 20 20 20 20 20 70 41 72 2d 3e 6e            pAr->n
242f0 41 72 67 20 3d 20 6e 41 72 67 2d 69 41 72 67 2d  Arg = nArg-iArg-
24300 31 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  1;.          bre
24310 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ak;.        }els
24320 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e{.          /* 
24330 41 20 6c 6f 6e 67 20 6f 70 74 69 6f 6e 20 2a 2f  A long option */
24340 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74  .          const
24350 20 63 68 61 72 20 2a 7a 41 72 67 20 3d 20 30 3b   char *zArg = 0;
24360 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
24370 41 72 67 75 6d 65 6e 74 20 66 6f 72 20 6f 70 74  Argument for opt
24380 69 6f 6e 2c 20 69 66 20 61 6e 79 20 2a 2f 0a 20  ion, if any */. 
24390 20 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20           struct 
243a0 41 72 53 77 69 74 63 68 20 2a 70 4d 61 74 63 68  ArSwitch *pMatch
243b0 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 4d 61   = 0;      /* Ma
243c0 74 63 68 69 6e 67 20 6f 70 74 69 6f 6e 20 2a 2f  tching option */
243d0 0a 20 20 20 20 20 20 20 20 20 20 73 74 72 75 63  .          struc
243e0 74 20 41 72 53 77 69 74 63 68 20 2a 70 4f 70 74  t ArSwitch *pOpt
243f0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
24400 49 74 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20  Iterator */.    
24410 20 20 20 20 20 20 66 6f 72 28 70 4f 70 74 3d 26        for(pOpt=&
24420 61 53 77 69 74 63 68 5b 30 5d 3b 20 70 4f 70 74  aSwitch[0]; pOpt
24430 3c 70 45 6e 64 3b 20 70 4f 70 74 2b 2b 29 7b 0a  <pEnd; pOpt++){.
24440 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73              cons
24450 74 20 63 68 61 72 20 2a 7a 4c 6f 6e 67 20 3d 20  t char *zLong = 
24460 70 4f 70 74 2d 3e 7a 4c 6f 6e 67 3b 0a 20 20 20  pOpt->zLong;.   
24470 20 20 20 20 20 20 20 20 20 69 66 28 20 28 6e 2d           if( (n-
24480 32 29 3c 3d 73 74 72 6c 65 6e 33 30 28 7a 4c 6f  2)<=strlen30(zLo
24490 6e 67 29 20 26 26 20 30 3d 3d 6d 65 6d 63 6d 70  ng) && 0==memcmp
244a0 28 26 7a 5b 32 5d 2c 20 7a 4c 6f 6e 67 2c 20 6e  (&z[2], zLong, n
244b0 2d 32 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  -2) ){.         
244c0 20 20 20 20 20 69 66 28 20 70 4d 61 74 63 68 20       if( pMatch 
244d0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
244e0 20 20 20 72 65 74 75 72 6e 20 61 72 45 72 72 6f     return arErro
244f0 72 4d 73 67 28 22 61 6d 62 69 67 75 6f 75 73 20  rMsg("ambiguous 
24500 6f 70 74 69 6f 6e 3a 20 25 73 22 2c 7a 29 3b 0a  option: %s",z);.
24510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 65                }e
24520 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
24530 20 20 20 20 20 70 4d 61 74 63 68 20 3d 20 70 4f       pMatch = pO
24540 70 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  pt;.            
24550 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
24560 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 0a 20  }.          }.. 
24570 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4d 61           if( pMa
24580 74 63 68 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  tch==0 ){.      
24590 20 20 20 20 20 20 72 65 74 75 72 6e 20 61 72 45        return arE
245a0 72 72 6f 72 4d 73 67 28 22 75 6e 72 65 63 6f 67  rrorMsg("unrecog
245b0 6e 69 7a 65 64 20 6f 70 74 69 6f 6e 3a 20 25 73  nized option: %s
245c0 22 2c 20 7a 29 3b 0a 20 20 20 20 20 20 20 20 20  ", z);.         
245d0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28   }.          if(
245e0 20 70 4d 61 74 63 68 2d 3e 62 41 72 67 20 29 7b   pMatch->bArg ){
245f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
24600 20 69 41 72 67 3e 3d 28 6e 41 72 67 2d 31 29 20   iArg>=(nArg-1) 
24610 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
24620 20 72 65 74 75 72 6e 20 61 72 45 72 72 6f 72 4d   return arErrorM
24630 73 67 28 22 6f 70 74 69 6f 6e 20 72 65 71 75 69  sg("option requi
24640 72 65 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 3a  res an argument:
24650 20 25 73 22 2c 20 7a 29 3b 0a 20 20 20 20 20 20   %s", z);.      
24660 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
24670 20 20 20 20 7a 41 72 67 20 3d 20 61 7a 41 72 67      zArg = azArg
24680 5b 2b 2b 69 41 72 67 5d 3b 0a 20 20 20 20 20 20  [++iArg];.      
24690 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
246a0 69 66 28 20 61 72 50 72 6f 63 65 73 73 53 77 69  if( arProcessSwi
246b0 74 63 68 28 70 41 72 2c 20 70 4d 61 74 63 68 2d  tch(pAr, pMatch-
246c0 3e 65 53 77 69 74 63 68 2c 20 7a 41 72 67 29 20  >eSwitch, zArg) 
246d0 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
246e0 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 7d  ERROR;.        }
246f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
24700 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   }..  return SQL
24710 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
24720 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   This function a
24730 73 73 75 6d 65 73 20 74 68 61 74 20 61 6c 6c 20  ssumes that all 
24740 61 72 67 75 6d 65 6e 74 73 20 77 69 74 68 69 6e  arguments within
24750 20 74 68 65 20 41 72 43 6f 6d 6d 61 6e 64 2e 61   the ArCommand.a
24760 7a 41 72 67 5b 5d 0a 2a 2a 20 61 72 72 61 79 20  zArg[].** array 
24770 72 65 66 65 72 20 74 6f 20 61 72 63 68 69 76 65  refer to archive
24780 20 6d 65 6d 62 65 72 73 2c 20 61 73 20 66 6f 72   members, as for
24790 20 74 68 65 20 2d 2d 65 78 74 72 61 63 74 20 6f   the --extract o
247a0 72 20 2d 2d 6c 69 73 74 20 63 6f 6d 6d 61 6e 64  r --list command
247b0 73 2e 20 0a 2a 2a 20 49 74 20 63 68 65 63 6b 73  s. .** It checks
247c0 20 74 68 61 74 20 65 61 63 68 20 6f 66 20 74 68   that each of th
247d0 65 6d 20 61 72 65 20 70 72 65 73 65 6e 74 2e 20  em are present. 
247e0 49 66 20 61 6e 79 20 73 70 65 63 69 66 69 65 64  If any specified
247f0 20 66 69 6c 65 20 69 73 20 6e 6f 74 0a 2a 2a 20   file is not.** 
24800 70 72 65 73 65 6e 74 20 69 6e 20 74 68 65 20 61  present in the a
24810 72 63 68 69 76 65 2c 20 61 6e 20 65 72 72 6f 72  rchive, an error
24820 20 69 73 20 70 72 69 6e 74 65 64 20 74 6f 20 73   is printed to s
24830 74 64 65 72 72 20 61 6e 64 20 61 6e 20 65 72 72  tderr and an err
24840 6f 72 0a 2a 2a 20 63 6f 64 65 20 72 65 74 75 72  or.** code retur
24850 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ned. Otherwise, 
24860 69 66 20 61 6c 6c 20 73 70 65 63 69 66 69 65 64  if all specified
24870 20 61 72 67 75 6d 65 6e 74 73 20 61 72 65 20 70   arguments are p
24880 72 65 73 65 6e 74 20 69 6e 0a 2a 2a 20 74 68 65  resent in.** the
24890 20 61 72 63 68 69 76 65 2c 20 53 51 4c 49 54 45   archive, SQLITE
248a0 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e  _OK is returned.
248b0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
248c0 74 69 6f 6e 20 73 74 72 69 70 73 20 61 6e 79 20  tion strips any 
248d0 74 72 61 69 6c 69 6e 67 20 27 2f 27 20 63 68 61  trailing '/' cha
248e0 72 61 63 74 65 72 73 20 66 72 6f 6d 20 65 61 63  racters from eac
248f0 68 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 20 54  h argument..** T
24900 68 69 73 20 69 73 20 63 6f 6e 73 69 73 74 65 6e  his is consisten
24910 74 20 77 69 74 68 20 74 68 65 20 77 61 79 20 74  t with the way t
24920 68 65 20 5b 74 61 72 5d 20 63 6f 6d 6d 61 6e 64  he [tar] command
24930 20 73 65 65 6d 73 20 74 6f 20 77 6f 72 6b 20 6f   seems to work o
24940 6e 0a 2a 2a 20 4c 69 6e 75 78 2e 0a 2a 2f 0a 73  n.** Linux..*/.s
24950 74 61 74 69 63 20 69 6e 74 20 61 72 43 68 65 63  tatic int arChec
24960 6b 45 6e 74 72 69 65 73 28 41 72 43 6f 6d 6d 61  kEntries(ArComma
24970 6e 64 20 2a 70 41 72 29 7b 0a 20 20 69 6e 74 20  nd *pAr){.  int 
24980 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
24990 20 20 69 66 28 20 70 41 72 2d 3e 6e 41 72 67 20    if( pAr->nArg 
249a0 29 7b 0a 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b  ){.    int i, j;
249b0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  .    sqlite3_stm
249c0 74 20 2a 70 54 65 73 74 20 3d 20 30 3b 0a 0a 20  t *pTest = 0;.. 
249d0 20 20 20 73 68 65 6c 6c 50 72 65 70 61 72 65 50     shellPrepareP
249e0 72 69 6e 74 66 28 70 41 72 2d 3e 64 62 2c 20 26  rintf(pAr->db, &
249f0 72 63 2c 20 26 70 54 65 73 74 2c 0a 20 20 20 20  rc, &pTest,.    
24a00 20 20 20 20 22 53 45 4c 45 43 54 20 6e 61 6d 65      "SELECT name
24a10 20 46 52 4f 4d 20 25 73 20 57 48 45 52 45 20 6e   FROM %s WHERE n
24a20 61 6d 65 3d 24 6e 61 6d 65 22 2c 20 0a 20 20 20  ame=$name", .   
24a30 20 20 20 20 20 70 41 72 2d 3e 7a 53 72 63 54 61       pAr->zSrcTa
24a40 62 6c 65 0a 20 20 20 20 29 3b 0a 20 20 20 20 6a  ble.    );.    j
24a50 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f   = sqlite3_bind_
24a60 70 61 72 61 6d 65 74 65 72 5f 69 6e 64 65 78 28  parameter_index(
24a70 70 54 65 73 74 2c 20 22 24 6e 61 6d 65 22 29 3b  pTest, "$name");
24a80 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
24a90 70 41 72 2d 3e 6e 41 72 67 20 26 26 20 72 63 3d  pAr->nArg && rc=
24aa0 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 2b 2b 29  =SQLITE_OK; i++)
24ab0 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 20  {.      char *z 
24ac0 3d 20 70 41 72 2d 3e 61 7a 41 72 67 5b 69 5d 3b  = pAr->azArg[i];
24ad0 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 73  .      int n = s
24ae0 74 72 6c 65 6e 33 30 28 7a 29 3b 0a 20 20 20 20  trlen30(z);.    
24af0 20 20 69 6e 74 20 62 4f 6b 20 3d 20 30 3b 0a 20    int bOk = 0;. 
24b00 20 20 20 20 20 77 68 69 6c 65 28 20 6e 3e 30 20       while( n>0 
24b10 26 26 20 7a 5b 6e 2d 31 5d 3d 3d 27 2f 27 20 29  && z[n-1]=='/' )
24b20 20 6e 2d 2d 3b 0a 20 20 20 20 20 20 7a 5b 6e 5d   n--;.      z[n]
24b30 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 20 20 73   = '\0';.      s
24b40 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74  qlite3_bind_text
24b50 28 70 54 65 73 74 2c 20 6a 2c 20 7a 2c 20 2d 31  (pTest, j, z, -1
24b60 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29  , SQLITE_STATIC)
24b70 3b 0a 20 20 20 20 20 20 69 66 28 20 53 51 4c 49  ;.      if( SQLI
24b80 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f  TE_ROW==sqlite3_
24b90 73 74 65 70 28 70 54 65 73 74 29 20 29 7b 0a 20  step(pTest) ){. 
24ba0 20 20 20 20 20 20 20 62 4f 6b 20 3d 20 31 3b 0a         bOk = 1;.
24bb0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 68        }.      sh
24bc0 65 6c 6c 52 65 73 65 74 28 26 72 63 2c 20 70 54  ellReset(&rc, pT
24bd0 65 73 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20  est);.      if( 
24be0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
24bf0 20 62 4f 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20   bOk==0 ){.     
24c00 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73     utf8_printf(s
24c10 74 64 65 72 72 2c 20 22 6e 6f 74 20 66 6f 75 6e  tderr, "not foun
24c20 64 20 69 6e 20 61 72 63 68 69 76 65 3a 20 25 73  d in archive: %s
24c30 5c 6e 22 2c 20 7a 29 3b 0a 20 20 20 20 20 20 20  \n", z);.       
24c40 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
24c50 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OR;.      }.    
24c60 7d 0a 20 20 20 20 73 68 65 6c 6c 46 69 6e 61 6c  }.    shellFinal
24c70 69 7a 65 28 26 72 63 2c 20 70 54 65 73 74 29 3b  ize(&rc, pTest);
24c80 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
24c90 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 6d 61  ;.}../*.** Forma
24ca0 74 20 61 20 57 48 45 52 45 20 63 6c 61 75 73 65  t a WHERE clause
24cb0 20 74 68 61 74 20 63 61 6e 20 62 65 20 75 73 65   that can be use
24cc0 64 20 61 67 61 69 6e 73 74 20 74 68 65 20 22 73  d against the "s
24cd0 71 6c 61 72 22 20 74 61 62 6c 65 20 74 6f 0a 2a  qlar" table to.*
24ce0 2a 20 69 64 65 6e 74 69 66 79 20 61 6c 6c 20 61  * identify all a
24cf0 72 63 68 69 76 65 20 6d 65 6d 62 65 72 73 20 74  rchive members t
24d00 68 61 74 20 6d 61 74 63 68 20 74 68 65 20 63 6f  hat match the co
24d10 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20  mmand arguments 
24d20 68 65 6c 64 0a 2a 2a 20 69 6e 20 28 2a 70 41 72  held.** in (*pAr
24d30 29 2e 20 4c 65 61 76 65 20 74 68 69 73 20 57 48  ). Leave this WH
24d40 45 52 45 20 63 6c 61 75 73 65 20 69 6e 20 28 2a  ERE clause in (*
24d50 70 7a 57 68 65 72 65 29 20 62 65 66 6f 72 65 20  pzWhere) before 
24d60 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 20 54 68  returning..** Th
24d70 65 20 63 61 6c 6c 65 72 20 69 73 20 72 65 73 70  e caller is resp
24d80 6f 6e 73 69 62 6c 65 20 66 6f 72 20 65 76 65 6e  onsible for even
24d90 74 75 61 6c 6c 79 20 63 61 6c 6c 69 6e 67 20 73  tually calling s
24da0 71 6c 69 74 65 33 5f 66 72 65 65 28 29 20 6f 6e  qlite3_free() on
24db0 0a 2a 2a 20 61 6e 79 20 6e 6f 6e 2d 4e 55 4c 4c  .** any non-NULL
24dc0 20 28 2a 70 7a 57 68 65 72 65 29 20 76 61 6c 75   (*pzWhere) valu
24dd0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
24de0 64 20 61 72 57 68 65 72 65 43 6c 61 75 73 65 28  d arWhereClause(
24df0 0a 20 20 69 6e 74 20 2a 70 52 63 2c 20 0a 20 20  .  int *pRc, .  
24e00 41 72 43 6f 6d 6d 61 6e 64 20 2a 70 41 72 2c 20  ArCommand *pAr, 
24e10 0a 20 20 63 68 61 72 20 2a 2a 70 7a 57 68 65 72  .  char **pzWher
24e20 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e               
24e30 20 20 20 2f 2a 20 4f 55 54 3a 20 4e 65 77 20 57     /* OUT: New W
24e40 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 29  HERE clause */.)
24e50 7b 0a 20 20 63 68 61 72 20 2a 7a 57 68 65 72 65  {.  char *zWhere
24e60 20 3d 20 30 3b 0a 20 20 69 66 28 20 2a 70 52 63   = 0;.  if( *pRc
24e70 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
24e80 20 20 20 69 66 28 20 70 41 72 2d 3e 6e 41 72 67     if( pAr->nArg
24e90 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 57 68  ==0 ){.      zWh
24ea0 65 72 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  ere = sqlite3_mp
24eb0 72 69 6e 74 66 28 22 31 22 29 3b 0a 20 20 20 20  rintf("1");.    
24ec0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74  }else{.      int
24ed0 20 69 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20   i;.      const 
24ee0 63 68 61 72 20 2a 7a 53 65 70 20 3d 20 22 22 3b  char *zSep = "";
24ef0 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
24f00 69 3c 70 41 72 2d 3e 6e 41 72 67 3b 20 69 2b 2b  i<pAr->nArg; i++
24f10 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74  ){.        const
24f20 20 63 68 61 72 20 2a 7a 20 3d 20 70 41 72 2d 3e   char *z = pAr->
24f30 61 7a 41 72 67 5b 69 5d 3b 0a 20 20 20 20 20 20  azArg[i];.      
24f40 20 20 7a 57 68 65 72 65 20 3d 20 73 71 6c 69 74    zWhere = sqlit
24f50 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20 20  e3_mprintf(.    
24f60 20 20 20 20 20 20 22 25 7a 25 73 20 6e 61 6d 65        "%z%s name
24f70 20 3d 20 27 25 71 27 20 4f 52 20 73 75 62 73 74   = '%q' OR subst
24f80 72 28 6e 61 6d 65 2c 31 2c 25 64 29 20 3d 20 27  r(name,1,%d) = '
24f90 25 71 2f 27 22 2c 20 0a 20 20 20 20 20 20 20 20  %q/'", .        
24fa0 20 20 7a 57 68 65 72 65 2c 20 7a 53 65 70 2c 20    zWhere, zSep, 
24fb0 7a 2c 20 73 74 72 6c 65 6e 33 30 28 7a 29 2b 31  z, strlen30(z)+1
24fc0 2c 20 7a 0a 20 20 20 20 20 20 20 20 29 3b 0a 20  , z.        );. 
24fd0 20 20 20 20 20 20 20 69 66 28 20 7a 57 68 65 72         if( zWher
24fe0 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e==0 ){.        
24ff0 20 20 2a 70 52 63 20 3d 20 53 51 4c 49 54 45 5f    *pRc = SQLITE_
25000 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 20  NOMEM;.         
25010 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
25020 7d 0a 20 20 20 20 20 20 20 20 7a 53 65 70 20 3d  }.        zSep =
25030 20 22 20 4f 52 20 22 3b 0a 20 20 20 20 20 20 7d   " OR ";.      }
25040 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 7a  .    }.  }.  *pz
25050 57 68 65 72 65 20 3d 20 7a 57 68 65 72 65 3b 0a  Where = zWhere;.
25060 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65  }../*.** Impleme
25070 6e 74 61 74 69 6f 6e 20 6f 66 20 2e 61 72 20 22  ntation of .ar "
25080 6c 69 73 54 22 20 63 6f 6d 6d 61 6e 64 2e 20 0a  lisT" command. .
25090 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 72  */.static int ar
250a0 4c 69 73 74 43 6f 6d 6d 61 6e 64 28 41 72 43 6f  ListCommand(ArCo
250b0 6d 6d 61 6e 64 20 2a 70 41 72 29 7b 0a 20 20 63  mmand *pAr){.  c
250c0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 20  onst char *zSql 
250d0 3d 20 22 53 45 4c 45 43 54 20 25 73 20 46 52 4f  = "SELECT %s FRO
250e0 4d 20 25 73 20 57 48 45 52 45 20 25 73 22 3b 20  M %s WHERE %s"; 
250f0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61  .  const char *a
25100 7a 43 6f 6c 73 5b 5d 20 3d 20 7b 0a 20 20 20 20  zCols[] = {.    
25110 22 6e 61 6d 65 22 2c 0a 20 20 20 20 22 6c 73 6d  "name",.    "lsm
25120 6f 64 65 28 6d 6f 64 65 29 2c 20 73 7a 2c 20 64  ode(mode), sz, d
25130 61 74 65 74 69 6d 65 28 6d 74 69 6d 65 2c 20 27  atetime(mtime, '
25140 75 6e 69 78 65 70 6f 63 68 27 29 2c 20 6e 61 6d  unixepoch'), nam
25150 65 22 0a 20 20 7d 3b 0a 0a 20 20 63 68 61 72 20  e".  };..  char 
25160 2a 7a 57 68 65 72 65 20 3d 20 30 3b 0a 20 20 73  *zWhere = 0;.  s
25170 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 71  qlite3_stmt *pSq
25180 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b  l = 0;.  int rc;
25190 0a 0a 20 20 72 63 20 3d 20 61 72 43 68 65 63 6b  ..  rc = arCheck
251a0 45 6e 74 72 69 65 73 28 70 41 72 29 3b 0a 20 20  Entries(pAr);.  
251b0 61 72 57 68 65 72 65 43 6c 61 75 73 65 28 26 72  arWhereClause(&r
251c0 63 2c 20 70 41 72 2c 20 26 7a 57 68 65 72 65 29  c, pAr, &zWhere)
251d0 3b 0a 0a 20 20 73 68 65 6c 6c 50 72 65 70 61 72  ;..  shellPrepar
251e0 65 50 72 69 6e 74 66 28 70 41 72 2d 3e 64 62 2c  ePrintf(pAr->db,
251f0 20 26 72 63 2c 20 26 70 53 71 6c 2c 20 7a 53 71   &rc, &pSql, zSq
25200 6c 2c 20 61 7a 43 6f 6c 73 5b 70 41 72 2d 3e 62  l, azCols[pAr->b
25210 56 65 72 62 6f 73 65 5d 2c 0a 20 20 20 20 20 20  Verbose],.      
25220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
25230 41 72 2d 3e 7a 53 72 63 54 61 62 6c 65 2c 20 7a  Ar->zSrcTable, z
25240 57 68 65 72 65 29 3b 0a 20 20 69 66 28 20 70 41  Where);.  if( pA
25250 72 2d 3e 62 44 72 79 52 75 6e 20 29 7b 0a 20 20  r->bDryRun ){.  
25260 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 41    utf8_printf(pA
25270 72 2d 3e 70 2d 3e 6f 75 74 2c 20 22 25 73 5c 6e  r->p->out, "%s\n
25280 22 2c 20 73 71 6c 69 74 65 33 5f 73 71 6c 28 70  ", sqlite3_sql(p
25290 53 71 6c 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Sql));.  }else{.
252a0 20 20 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53      while( rc==S
252b0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 53 51 4c 49  QLITE_OK && SQLI
252c0 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f  TE_ROW==sqlite3_
252d0 73 74 65 70 28 70 53 71 6c 29 20 29 7b 0a 20 20  step(pSql) ){.  
252e0 20 20 20 20 69 66 28 20 70 41 72 2d 3e 62 56 65      if( pAr->bVe
252f0 72 62 6f 73 65 20 29 7b 0a 20 20 20 20 20 20 20  rbose ){.       
25300 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 41 72   utf8_printf(pAr
25310 2d 3e 70 2d 3e 6f 75 74 2c 20 22 25 73 20 25 20  ->p->out, "%s % 
25320 31 30 64 20 20 25 73 20 20 25 73 5c 6e 22 2c 0a  10d  %s  %s\n",.
25330 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
25340 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28  te3_column_text(
25350 70 53 71 6c 2c 20 30 29 2c 0a 20 20 20 20 20 20  pSql, 0),.      
25360 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6f        sqlite3_co
25370 6c 75 6d 6e 5f 69 6e 74 28 70 53 71 6c 2c 20 31  lumn_int(pSql, 1
25380 29 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  ), .            
25390 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
253a0 65 78 74 28 70 53 71 6c 2c 20 32 29 2c 0a 20 20  ext(pSql, 2),.  
253b0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
253c0 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53  3_column_text(pS
253d0 71 6c 2c 20 33 29 0a 20 20 20 20 20 20 20 20 29  ql, 3).        )
253e0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
253f0 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e         utf8_prin
25400 74 66 28 70 41 72 2d 3e 70 2d 3e 6f 75 74 2c 20  tf(pAr->p->out, 
25410 22 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f  "%s\n", sqlite3_
25420 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 71 6c  column_text(pSql
25430 2c 20 30 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20  , 0));.      }. 
25440 20 20 20 7d 0a 20 20 7d 0a 20 20 73 68 65 6c 6c     }.  }.  shell
25450 46 69 6e 61 6c 69 7a 65 28 26 72 63 2c 20 70 53  Finalize(&rc, pS
25460 71 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ql);.  return rc
25470 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c  ;.}.../*.** Impl
25480 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 2e 61  ementation of .a
25490 72 20 22 65 58 74 72 61 63 74 22 20 63 6f 6d 6d  r "eXtract" comm
254a0 61 6e 64 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20  and. .*/.static 
254b0 69 6e 74 20 61 72 45 78 74 72 61 63 74 43 6f 6d  int arExtractCom
254c0 6d 61 6e 64 28 41 72 43 6f 6d 6d 61 6e 64 20 2a  mand(ArCommand *
254d0 70 41 72 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68  pAr){.  const ch
254e0 61 72 20 2a 7a 53 71 6c 31 20 3d 20 0a 20 20 20  ar *zSql1 = .   
254f0 20 22 53 45 4c 45 43 54 20 22 0a 20 20 20 20 22   "SELECT ".    "
25500 20 28 24 64 69 72 20 7c 7c 20 6e 61 6d 65 29 2c   ($dir || name),
25510 22 0a 20 20 20 20 22 20 77 72 69 74 65 66 69 6c  ".    " writefil
25520 65 28 28 24 64 69 72 20 7c 7c 20 6e 61 6d 65 29  e(($dir || name)
25530 2c 20 25 73 2c 20 6d 6f 64 65 2c 20 6d 74 69 6d  , %s, mode, mtim
25540 65 29 20 22 0a 20 20 20 20 22 46 52 4f 4d 20 25  e) ".    "FROM %
25550 73 20 57 48 45 52 45 20 28 25 73 29 20 41 4e 44  s WHERE (%s) AND
25560 20 28 64 61 74 61 20 49 53 20 4e 55 4c 4c 20 4f   (data IS NULL O
25570 52 20 24 64 69 72 4f 6e 6c 79 20 3d 20 30 29 22  R $dirOnly = 0)"
25580 3b 0a 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ;..  const char 
25590 2a 61 7a 45 78 74 72 61 41 72 67 5b 5d 20 3d 20  *azExtraArg[] = 
255a0 7b 20 0a 20 20 20 20 22 73 71 6c 61 72 5f 75 6e  { .    "sqlar_un
255b0 63 6f 6d 70 72 65 73 73 28 64 61 74 61 2c 20 73  compress(data, s
255c0 7a 29 22 2c 0a 20 20 20 20 22 64 61 74 61 22 0a  z)",.    "data".
255d0 20 20 7d 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f    };..  sqlite3_
255e0 73 74 6d 74 20 2a 70 53 71 6c 20 3d 20 30 3b 0a  stmt *pSql = 0;.
255f0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
25600 45 5f 4f 4b 3b 0a 20 20 63 68 61 72 20 2a 7a 44  E_OK;.  char *zD
25610 69 72 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a  ir = 0;.  char *
25620 7a 57 68 65 72 65 20 3d 20 30 3b 0a 20 20 69 6e  zWhere = 0;.  in
25630 74 20 69 2c 20 6a 3b 0a 0a 20 20 2f 2a 20 49 66  t i, j;..  /* If
25640 20 61 72 67 75 6d 65 6e 74 73 20 61 72 65 20 73   arguments are s
25650 70 65 63 69 66 69 65 64 2c 20 63 68 65 63 6b 20  pecified, check 
25660 74 68 61 74 20 74 68 65 79 20 61 63 74 75 61 6c  that they actual
25670 6c 79 20 65 78 69 73 74 20 77 69 74 68 69 6e 0a  ly exist within.
25680 20 20 2a 2a 20 74 68 65 20 61 72 63 68 69 76 65    ** the archive
25690 20 62 65 66 6f 72 65 20 70 72 6f 63 65 65 64 69   before proceedi
256a0 6e 67 2e 20 41 6e 64 20 66 6f 72 6d 75 6c 61 74  ng. And formulat
256b0 65 20 61 20 57 48 45 52 45 20 63 6c 61 75 73 65  e a WHERE clause
256c0 20 74 6f 0a 20 20 2a 2a 20 6d 61 74 63 68 20 74   to.  ** match t
256d0 68 65 6d 2e 20 20 2a 2f 0a 20 20 72 63 20 3d 20  hem.  */.  rc = 
256e0 61 72 43 68 65 63 6b 45 6e 74 72 69 65 73 28 70  arCheckEntries(p
256f0 41 72 29 3b 0a 20 20 61 72 57 68 65 72 65 43 6c  Ar);.  arWhereCl
25700 61 75 73 65 28 26 72 63 2c 20 70 41 72 2c 20 26  ause(&rc, pAr, &
25710 7a 57 68 65 72 65 29 3b 0a 0a 20 20 69 66 28 20  zWhere);..  if( 
25720 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
25730 0a 20 20 20 20 69 66 28 20 70 41 72 2d 3e 7a 44  .    if( pAr->zD
25740 69 72 20 29 7b 0a 20 20 20 20 20 20 7a 44 69 72  ir ){.      zDir
25750 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
25760 74 66 28 22 25 73 2f 22 2c 20 70 41 72 2d 3e 7a  tf("%s/", pAr->z
25770 44 69 72 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Dir);.    }else{
25780 0a 20 20 20 20 20 20 7a 44 69 72 20 3d 20 73 71  .      zDir = sq
25790 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 22  lite3_mprintf(""
257a0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
257b0 20 7a 44 69 72 3d 3d 30 20 29 20 72 63 20 3d 20   zDir==0 ) rc = 
257c0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
257d0 7d 0a 0a 20 20 73 68 65 6c 6c 50 72 65 70 61 72  }..  shellPrepar
257e0 65 50 72 69 6e 74 66 28 70 41 72 2d 3e 64 62 2c  ePrintf(pAr->db,
257f0 20 26 72 63 2c 20 26 70 53 71 6c 2c 20 7a 53 71   &rc, &pSql, zSq
25800 6c 31 2c 20 0a 20 20 20 20 20 20 61 7a 45 78 74  l1, .      azExt
25810 72 61 41 72 67 5b 70 41 72 2d 3e 62 5a 69 70 5d  raArg[pAr->bZip]
25820 2c 20 70 41 72 2d 3e 7a 53 72 63 54 61 62 6c 65  , pAr->zSrcTable
25830 2c 20 7a 57 68 65 72 65 0a 20 20 29 3b 0a 0a 20  , zWhere.  );.. 
25840 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
25850 4f 4b 20 29 7b 0a 20 20 20 20 6a 20 3d 20 73 71  OK ){.    j = sq
25860 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d  lite3_bind_param
25870 65 74 65 72 5f 69 6e 64 65 78 28 70 53 71 6c 2c  eter_index(pSql,
25880 20 22 24 64 69 72 22 29 3b 0a 20 20 20 20 73 71   "$dir");.    sq
25890 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 28  lite3_bind_text(
258a0 70 53 71 6c 2c 20 6a 2c 20 7a 44 69 72 2c 20 2d  pSql, j, zDir, -
258b0 31 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43  1, SQLITE_STATIC
258c0 29 3b 0a 0a 20 20 20 20 2f 2a 20 52 75 6e 20 74  );..    /* Run t
258d0 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
258e0 65 6e 74 20 74 77 69 63 65 2e 20 54 68 65 20 66  ent twice. The f
258f0 69 72 73 74 20 74 69 6d 65 2c 20 77 72 69 74 65  irst time, write
25900 66 69 6c 65 28 29 20 69 73 20 63 61 6c 6c 65 64  file() is called
25910 0a 20 20 20 20 2a 2a 20 66 6f 72 20 61 6c 6c 20  .    ** for all 
25920 61 72 63 68 69 76 65 20 6d 65 6d 62 65 72 73 20  archive members 
25930 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 65  that should be e
25940 78 74 72 61 63 74 65 64 2e 20 54 68 65 20 73 65  xtracted. The se
25950 63 6f 6e 64 20 74 69 6d 65 2c 0a 20 20 20 20 2a  cond time,.    *
25960 2a 20 6f 6e 6c 79 20 66 6f 72 20 74 68 65 20 64  * only for the d
25970 69 72 65 63 74 6f 72 69 65 73 2e 20 54 68 69 73  irectories. This
25980 20 69 73 20 62 65 63 61 75 73 65 20 74 68 65 20   is because the 
25990 74 69 6d 65 73 74 61 6d 70 73 20 66 6f 72 0a 20  timestamps for. 
259a0 20 20 20 2a 2a 20 65 78 74 72 61 63 74 65 64 20     ** extracted 
259b0 64 69 72 65 63 74 6f 72 69 65 73 20 6d 75 73 74  directories must
259c0 20 62 65 20 72 65 73 65 74 20 61 66 74 65 72 20   be reset after 
259d0 74 68 65 79 20 61 72 65 20 70 6f 70 75 6c 61 74  they are populat
259e0 65 64 20 28 61 73 0a 20 20 20 20 2a 2a 20 70 6f  ed (as.    ** po
259f0 70 75 6c 61 74 69 6e 67 20 74 68 65 6d 20 63 68  pulating them ch
25a00 61 6e 67 65 73 20 74 68 65 20 74 69 6d 65 73 74  anges the timest
25a10 61 6d 70 29 2e 20 20 2a 2f 0a 20 20 20 20 66 6f  amp).  */.    fo
25a20 72 28 69 3d 30 3b 20 69 3c 32 3b 20 69 2b 2b 29  r(i=0; i<2; i++)
25a30 7b 0a 20 20 20 20 20 20 6a 20 3d 20 73 71 6c 69  {.      j = sqli
25a40 74 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74  te3_bind_paramet
25a50 65 72 5f 69 6e 64 65 78 28 70 53 71 6c 2c 20 22  er_index(pSql, "
25a60 24 64 69 72 4f 6e 6c 79 22 29 3b 0a 20 20 20 20  $dirOnly");.    
25a70 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69    sqlite3_bind_i
25a80 6e 74 28 70 53 71 6c 2c 20 6a 2c 20 69 29 3b 0a  nt(pSql, j, i);.
25a90 20 20 20 20 20 20 69 66 28 20 70 41 72 2d 3e 62        if( pAr->b
25aa0 44 72 79 52 75 6e 20 29 7b 0a 20 20 20 20 20 20  DryRun ){.      
25ab0 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 41    utf8_printf(pA
25ac0 72 2d 3e 70 2d 3e 6f 75 74 2c 20 22 25 73 5c 6e  r->p->out, "%s\n
25ad0 22 2c 20 73 71 6c 69 74 65 33 5f 73 71 6c 28 70  ", sqlite3_sql(p
25ae0 53 71 6c 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c  Sql));.      }el
25af0 73 65 7b 0a 20 20 20 20 20 20 20 20 77 68 69 6c  se{.        whil
25b00 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc==SQLITE_OK
25b10 20 26 26 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d   && SQLITE_ROW==
25b20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 71  sqlite3_step(pSq
25b30 6c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  l) ){.          
25b40 69 66 28 20 69 3d 3d 30 20 26 26 20 70 41 72 2d  if( i==0 && pAr-
25b50 3e 62 56 65 72 62 6f 73 65 20 29 7b 0a 20 20 20  >bVerbose ){.   
25b60 20 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72           utf8_pr
25b70 69 6e 74 66 28 70 41 72 2d 3e 70 2d 3e 6f 75 74  intf(pAr->p->out
25b80 2c 20 22 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65  , "%s\n", sqlite
25b90 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53  3_column_text(pS
25ba0 71 6c 2c 20 30 29 29 3b 0a 20 20 20 20 20 20 20  ql, 0));.       
25bb0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
25bc0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 68 65       }.      she
25bd0 6c 6c 52 65 73 65 74 28 26 72 63 2c 20 70 53 71  llReset(&rc, pSq
25be0 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 68  l);.    }.    sh
25bf0 65 6c 6c 46 69 6e 61 6c 69 7a 65 28 26 72 63 2c  ellFinalize(&rc,
25c00 20 70 53 71 6c 29 3b 0a 20 20 7d 0a 0a 20 20 73   pSql);.  }..  s
25c10 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 44 69 72  qlite3_free(zDir
25c20 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
25c30 65 28 7a 57 68 65 72 65 29 3b 0a 20 20 72 65 74  e(zWhere);.  ret
25c40 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
25c50 20 52 75 6e 20 74 68 65 20 53 51 4c 20 73 74 61   Run the SQL sta
25c60 74 65 6d 65 6e 74 20 69 6e 20 7a 53 71 6c 2e 20  tement in zSql. 
25c70 20 4f 72 20 69 66 20 64 6f 69 6e 67 20 61 20 2d   Or if doing a -
25c80 2d 64 72 79 72 75 6e 2c 20 6d 65 72 65 6c 79 20  -dryrun, merely 
25c90 70 72 69 6e 74 20 69 74 20 6f 75 74 2e 0a 2a 2f  print it out..*/
25ca0 0a 73 74 61 74 69 63 20 69 6e 74 20 61 72 45 78  .static int arEx
25cb0 65 63 53 71 6c 28 41 72 43 6f 6d 6d 61 6e 64 20  ecSql(ArCommand 
25cc0 2a 70 41 72 2c 20 63 6f 6e 73 74 20 63 68 61 72  *pAr, const char
25cd0 20 2a 7a 53 71 6c 29 7b 0a 20 20 69 6e 74 20 72   *zSql){.  int r
25ce0 63 3b 0a 20 20 69 66 28 20 70 41 72 2d 3e 62 44  c;.  if( pAr->bD
25cf0 72 79 52 75 6e 20 29 7b 0a 20 20 20 20 75 74 66  ryRun ){.    utf
25d00 38 5f 70 72 69 6e 74 66 28 70 41 72 2d 3e 70 2d  8_printf(pAr->p-
25d10 3e 6f 75 74 2c 20 22 25 73 5c 6e 22 2c 20 7a 53  >out, "%s\n", zS
25d20 71 6c 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51  ql);.    rc = SQ
25d30 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65  LITE_OK;.  }else
25d40 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 45 72 72  {.    char *zErr
25d50 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 73   = 0;.    rc = s
25d60 71 6c 69 74 65 33 5f 65 78 65 63 28 70 41 72 2d  qlite3_exec(pAr-
25d70 3e 64 62 2c 20 7a 53 71 6c 2c 20 30 2c 20 30 2c  >db, zSql, 0, 0,
25d80 20 26 7a 45 72 72 29 3b 0a 20 20 20 20 69 66 28   &zErr);.    if(
25d90 20 7a 45 72 72 20 29 7b 0a 20 20 20 20 20 20 75   zErr ){.      u
25da0 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 6f 75  tf8_printf(stdou
25db0 74 2c 20 22 45 52 52 4f 52 3a 20 25 73 5c 6e 22  t, "ERROR: %s\n"
25dc0 2c 20 7a 45 72 72 29 3b 0a 20 20 20 20 20 20 73  , zErr);.      s
25dd0 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 45 72 72  qlite3_free(zErr
25de0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
25df0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a  eturn rc;.}.../*
25e00 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69  .** Implementati
25e10 6f 6e 20 6f 66 20 2e 61 72 20 22 63 72 65 61 74  on of .ar "creat
25e20 65 22 20 61 6e 64 20 22 75 70 64 61 74 65 22 20  e" and "update" 
25e30 63 6f 6d 6d 61 6e 64 73 2e 0a 2a 2a 0a 2a 2a 20  commands..**.** 
25e40 43 72 65 61 74 65 20 74 68 65 20 22 73 71 6c 61  Create the "sqla
25e50 72 22 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20  r" table in the 
25e60 64 61 74 61 62 61 73 65 20 69 66 20 69 74 20 64  database if it d
25e70 6f 65 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20  oes not already 
25e80 65 78 69 73 74 2e 0a 2a 2a 20 54 68 65 6e 20 61  exist..** Then a
25e90 64 64 20 65 61 63 68 20 66 69 6c 65 20 69 6e 20  dd each file in 
25ea0 74 68 65 20 61 7a 46 69 6c 65 5b 5d 20 61 72 72  the azFile[] arr
25eb0 61 79 20 74 6f 20 74 68 65 20 61 72 63 68 69 76  ay to the archiv
25ec0 65 2e 20 44 69 72 65 63 74 6f 72 69 65 73 0a 2a  e. Directories.*
25ed0 2a 20 61 72 65 20 61 64 64 65 64 20 72 65 63 75  * are added recu
25ee0 72 73 69 76 65 6c 79 2e 20 49 66 20 61 72 67 75  rsively. If argu
25ef0 6d 65 6e 74 20 62 56 65 72 62 6f 73 65 20 69 73  ment bVerbose is
25f00 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 61 20 6d 65 73   non-zero, a mes
25f10 73 61 67 65 20 69 73 0a 2a 2a 20 70 72 69 6e 74  sage is.** print
25f20 65 64 20 6f 6e 20 73 74 64 6f 75 74 20 66 6f 72  ed on stdout for
25f30 20 65 61 63 68 20 66 69 6c 65 20 61 72 63 68 69   each file archi
25f40 76 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63  ved..**.** The c
25f50 72 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20 69 73  reate command is
25f60 20 74 68 65 20 73 61 6d 65 20 61 73 20 75 70 64   the same as upd
25f70 61 74 65 2c 20 65 78 63 65 70 74 20 74 68 61 74  ate, except that
25f80 20 69 74 20 64 72 6f 70 73 0a 2a 2a 20 61 6e 79   it drops.** any
25f90 20 65 78 69 73 74 69 6e 67 20 22 73 71 6c 61 72   existing "sqlar
25fa0 22 20 74 61 62 6c 65 20 62 65 66 6f 72 65 20 62  " table before b
25fb0 65 67 69 6e 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61  eginning..*/.sta
25fc0 74 69 63 20 69 6e 74 20 61 72 43 72 65 61 74 65  tic int arCreate
25fd0 4f 72 55 70 64 61 74 65 43 6f 6d 6d 61 6e 64 28  OrUpdateCommand(
25fe0 0a 20 20 41 72 43 6f 6d 6d 61 6e 64 20 2a 70 41  .  ArCommand *pA
25ff0 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r,              
26000 20 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72     /* Command ar
26010 67 75 6d 65 6e 74 73 20 61 6e 64 20 6f 70 74 69  guments and opti
26020 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 62 55 70  ons */.  int bUp
26030 64 61 74 65 20 20 20 20 20 20 20 20 20 20 20 20  date            
26040 20 20 20 20 20 20 20 20 20 2f 2a 20 74 72 75 65           /* true
26050 20 66 6f 72 20 61 20 2d 2d 63 72 65 61 74 65 2e   for a --create.
26060 20 20 66 61 6c 73 65 20 66 6f 72 20 2d 2d 75 70    false for --up
26070 64 61 74 65 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e  date */.){.  con
26080 73 74 20 63 68 61 72 20 2a 7a 43 72 65 61 74 65  st char *zCreate
26090 20 3d 20 0a 20 20 20 20 20 20 22 43 52 45 41 54   = .      "CREAT
260a0 45 20 54 41 42 4c 45 20 49 46 20 4e 4f 54 20 45  E TABLE IF NOT E
260b0 58 49 53 54 53 20 73 71 6c 61 72 28 5c 6e 22 0a  XISTS sqlar(\n".
260c0 20 20 20 20 20 20 22 20 20 6e 61 6d 65 20 54 45        "  name TE
260d0 58 54 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20  XT PRIMARY KEY, 
260e0 20 2d 2d 20 6e 61 6d 65 20 6f 66 20 74 68 65 20   -- name of the 
260f0 66 69 6c 65 5c 6e 22 0a 20 20 20 20 20 20 22 20  file\n".      " 
26100 20 6d 6f 64 65 20 49 4e 54 2c 20 20 20 20 20 20   mode INT,      
26110 20 20 20 20 20 20 20 20 20 2d 2d 20 61 63 63 65           -- acce
26120 73 73 20 70 65 72 6d 69 73 73 69 6f 6e 73 5c 6e  ss permissions\n
26130 22 0a 20 20 20 20 20 20 22 20 20 6d 74 69 6d 65  ".      "  mtime
26140 20 49 4e 54 2c 20 20 20 20 20 20 20 20 20 20 20   INT,           
26150 20 20 20 2d 2d 20 6c 61 73 74 20 6d 6f 64 69 66     -- last modif
26160 69 63 61 74 69 6f 6e 20 74 69 6d 65 5c 6e 22 0a  ication time\n".
26170 20 20 20 20 20 20 22 20 20 73 7a 20 49 4e 54 2c        "  sz INT,
26180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26190 20 2d 2d 20 6f 72 69 67 69 6e 61 6c 20 66 69 6c   -- original fil
261a0 65 20 73 69 7a 65 5c 6e 22 0a 20 20 20 20 20 20  e size\n".      
261b0 22 20 20 64 61 74 61 20 42 4c 4f 42 20 20 20 20  "  data BLOB    
261c0 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20 63 6f             -- co
261d0 6d 70 72 65 73 73 65 64 20 63 6f 6e 74 65 6e 74  mpressed content
261e0 5c 6e 22 0a 20 20 20 20 20 20 22 29 22 3b 0a 20  \n".      ")";. 
261f0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 72   const char *zDr
26200 6f 70 20 3d 20 22 44 52 4f 50 20 54 41 42 4c 45  op = "DROP TABLE
26210 20 49 46 20 45 58 49 53 54 53 20 73 71 6c 61 72   IF EXISTS sqlar
26220 22 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ";.  const char 
26230 2a 7a 49 6e 73 65 72 74 46 6d 74 20 3d 20 0a 20  *zInsertFmt = . 
26240 20 20 20 20 22 52 45 50 4c 41 43 45 20 49 4e 54      "REPLACE INT
26250 4f 20 73 71 6c 61 72 28 6e 61 6d 65 2c 6d 6f 64  O sqlar(name,mod
26260 65 2c 6d 74 69 6d 65 2c 73 7a 2c 64 61 74 61 29  e,mtime,sz,data)
26270 5c 6e 22 0a 20 20 20 20 20 22 20 20 53 45 4c 45  \n".     "  SELE
26280 43 54 5c 6e 22 0a 20 20 20 20 20 22 20 20 20 20  CT\n".     "    
26290 25 73 2c 5c 6e 22 0a 20 20 20 20 20 22 20 20 20  %s,\n".     "   
262a0 20 6d 6f 64 65 2c 5c 6e 22 0a 20 20 20 20 20 22   mode,\n".     "
262b0 20 20 20 20 6d 74 69 6d 65 2c 5c 6e 22 0a 20 20      mtime,\n".  
262c0 20 20 20 22 20 20 20 20 43 41 53 45 20 73 75 62     "    CASE sub
262d0 73 74 72 28 6c 73 6d 6f 64 65 28 6d 6f 64 65 29  str(lsmode(mode)
262e0 2c 31 2c 31 29 5c 6e 22 0a 20 20 20 20 20 22 20  ,1,1)\n".     " 
262f0 20 20 20 20 20 57 48 45 4e 20 27 2d 27 20 54 48       WHEN '-' TH
26300 45 4e 20 6c 65 6e 67 74 68 28 64 61 74 61 29 5c  EN length(data)\
26310 6e 22 0a 20 20 20 20 20 22 20 20 20 20 20 20 57  n".     "      W
26320 48 45 4e 20 27 64 27 20 54 48 45 4e 20 30 5c 6e  HEN 'd' THEN 0\n
26330 22 0a 20 20 20 20 20 22 20 20 20 20 20 20 45 4c  ".     "      EL
26340 53 45 20 2d 31 20 45 4e 44 2c 5c 6e 22 0a 20 20  SE -1 END,\n".  
26350 20 20 20 22 20 20 20 20 43 41 53 45 20 57 48 45     "    CASE WHE
26360 4e 20 6c 73 6d 6f 64 65 28 6d 6f 64 65 29 20 4c  N lsmode(mode) L
26370 49 4b 45 20 27 64 25 25 27 20 54 48 45 4e 20 4e  IKE 'd%%' THEN N
26380 55 4c 4c 20 65 6c 73 65 20 64 61 74 61 20 45 4e  ULL else data EN
26390 44 5c 6e 22 0a 20 20 20 20 20 22 20 20 46 52 4f  D\n".     "  FRO
263a0 4d 20 66 73 64 69 72 28 25 51 2c 25 51 29 5c 6e  M fsdir(%Q,%Q)\n
263b0 22 0a 20 20 20 20 20 22 20 20 57 48 45 52 45 20  ".     "  WHERE 
263c0 6c 73 6d 6f 64 65 28 6d 6f 64 65 29 20 4e 4f 54  lsmode(mode) NOT
263d0 20 4c 49 4b 45 20 27 3f 25 25 27 3b 22 3b 0a 20   LIKE '?%%';";. 
263e0 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
263f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26400 20 2f 2a 20 46 6f 72 20 69 74 65 72 61 74 69 6e   /* For iteratin
26410 67 20 74 68 72 6f 75 67 68 20 61 7a 46 69 6c 65  g through azFile
26420 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20  [] */.  int rc; 
26430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26440 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
26450 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 72 63 20  n code */..  rc 
26460 3d 20 61 72 45 78 65 63 53 71 6c 28 70 41 72 2c  = arExecSql(pAr,
26470 20 22 53 41 56 45 50 4f 49 4e 54 20 61 72 3b 22   "SAVEPOINT ar;"
26480 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
26490 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
264a0 72 63 3b 0a 20 20 69 66 28 20 62 55 70 64 61 74  rc;.  if( bUpdat
264b0 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d  e==0 ){.    rc =
264c0 20 61 72 45 78 65 63 53 71 6c 28 70 41 72 2c 20   arExecSql(pAr, 
264d0 7a 44 72 6f 70 29 3b 0a 20 20 20 20 69 66 28 20  zDrop);.    if( 
264e0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
264f0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
26500 20 72 63 20 3d 20 61 72 45 78 65 63 53 71 6c 28   rc = arExecSql(
26510 70 41 72 2c 20 7a 43 72 65 61 74 65 29 3b 0a 20  pAr, zCreate);. 
26520 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41 72 2d   for(i=0; i<pAr-
26530 3e 6e 41 72 67 20 26 26 20 72 63 3d 3d 53 51 4c  >nArg && rc==SQL
26540 49 54 45 5f 4f 4b 3b 20 69 2b 2b 29 7b 0a 20 20  ITE_OK; i++){.  
26550 20 20 63 68 61 72 20 2a 7a 53 71 6c 20 3d 20 73    char *zSql = s
26560 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 7a  qlite3_mprintf(z
26570 49 6e 73 65 72 74 46 6d 74 2c 0a 20 20 20 20 20  InsertFmt,.     
26580 20 20 20 70 41 72 2d 3e 62 56 65 72 62 6f 73 65     pAr->bVerbose
26590 20 3f 20 22 73 68 65 6c 6c 5f 70 75 74 73 6e 6c   ? "shell_putsnl
265a0 28 6e 61 6d 65 29 22 20 3a 20 22 6e 61 6d 65 22  (name)" : "name"
265b0 2c 0a 20 20 20 20 20 20 20 20 70 41 72 2d 3e 61  ,.        pAr->a
265c0 7a 41 72 67 5b 69 5d 2c 20 70 41 72 2d 3e 7a 44  zArg[i], pAr->zD
265d0 69 72 29 3b 0a 20 20 20 20 72 63 20 3d 20 61 72  ir);.    rc = ar
265e0 45 78 65 63 53 71 6c 28 70 41 72 2c 20 7a 53 71  ExecSql(pAr, zSq
265f0 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  l);.    sqlite3_
26600 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 7d 0a  free(zSql);.  }.
26610 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
26620 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 72 45 78 65  _OK ){.    arExe
26630 63 53 71 6c 28 70 41 72 2c 20 22 52 4f 4c 4c 42  cSql(pAr, "ROLLB
26640 41 43 4b 20 54 4f 20 61 72 3b 20 52 45 4c 45 41  ACK TO ar; RELEA
26650 53 45 20 61 72 3b 22 29 3b 0a 20 20 7d 65 6c 73  SE ar;");.  }els
26660 65 7b 0a 20 20 20 20 72 63 20 3d 20 61 72 45 78  e{.    rc = arEx
26670 65 63 53 71 6c 28 70 41 72 2c 20 22 52 45 4c 45  ecSql(pAr, "RELE
26680 41 53 45 20 61 72 3b 22 29 3b 0a 20 20 7d 0a 20  ASE ar;");.  }. 
26690 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
266a0 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74  *.** Implementat
266b0 69 6f 6e 20 6f 66 20 22 2e 61 72 22 20 64 6f 74  ion of ".ar" dot
266c0 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a 73 74 61   command..*/.sta
266d0 74 69 63 20 69 6e 74 20 61 72 44 6f 74 43 6f 6d  tic int arDotCom
266e0 6d 61 6e 64 28 0a 20 20 53 68 65 6c 6c 53 74 61  mand(.  ShellSta
266f0 74 65 20 2a 70 53 74 61 74 65 2c 20 20 20 20 20  te *pState,     
26700 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65          /* Curre
26710 6e 74 20 73 68 65 6c 6c 20 74 6f 6f 6c 20 73 74  nt shell tool st
26720 61 74 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a  ate */.  char **
26730 61 7a 41 72 67 2c 20 20 20 20 20 20 20 20 20 20  azArg,          
26740 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61           /* Arra
26750 79 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 70  y of arguments p
26760 61 73 73 65 64 20 74 6f 20 64 6f 74 20 63 6f 6d  assed to dot com
26770 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 41  mand */.  int nA
26780 72 67 20 20 20 20 20 20 20 20 20 20 20 20 20 20  rg              
26790 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
267a0 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69  ber of entries i
267b0 6e 20 61 7a 41 72 67 5b 5d 20 2a 2f 0a 29 7b 0a  n azArg[] */.){.
267c0 20 20 41 72 43 6f 6d 6d 61 6e 64 20 63 6d 64 3b    ArCommand cmd;
267d0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 6d 65 6d  .  int rc;.  mem
267e0 73 65 74 28 26 63 6d 64 2c 20 30 2c 20 73 69 7a  set(&cmd, 0, siz
267f0 65 6f 66 28 63 6d 64 29 29 3b 0a 20 20 72 63 20  eof(cmd));.  rc 
26800 3d 20 61 72 50 61 72 73 65 43 6f 6d 6d 61 6e 64  = arParseCommand
26810 28 61 7a 41 72 67 2c 20 6e 41 72 67 2c 20 26 63  (azArg, nArg, &c
26820 6d 64 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  md);.  if( rc==S
26830 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
26840 69 6e 74 20 65 44 62 54 79 70 65 20 3d 20 53 48  int eDbType = SH
26850 45 4c 4c 5f 4f 50 45 4e 5f 55 4e 53 50 45 43 3b  ELL_OPEN_UNSPEC;
26860 0a 20 20 20 20 63 6d 64 2e 70 20 3d 20 70 53 74  .    cmd.p = pSt
26870 61 74 65 3b 0a 20 20 20 20 63 6d 64 2e 64 62 20  ate;.    cmd.db 
26880 3d 20 70 53 74 61 74 65 2d 3e 64 62 3b 0a 20 20  = pState->db;.  
26890 20 20 69 66 28 20 63 6d 64 2e 7a 46 69 6c 65 20    if( cmd.zFile 
268a0 29 7b 0a 20 20 20 20 20 20 65 44 62 54 79 70 65  ){.      eDbType
268b0 20 3d 20 64 65 64 75 63 65 44 61 74 61 62 61 73   = deduceDatabas
268c0 65 54 79 70 65 28 63 6d 64 2e 7a 46 69 6c 65 29  eType(cmd.zFile)
268d0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
268e0 20 20 20 65 44 62 54 79 70 65 20 3d 20 70 53 74     eDbType = pSt
268f0 61 74 65 2d 3e 6f 70 65 6e 4d 6f 64 65 3b 0a 20  ate->openMode;. 
26900 20 20 20 7d 0a 20 20 20 20 69 66 28 20 65 44 62     }.    if( eDb
26910 54 79 70 65 3d 3d 53 48 45 4c 4c 5f 4f 50 45 4e  Type==SHELL_OPEN
26920 5f 5a 49 50 46 49 4c 45 20 29 7b 0a 20 20 20 20  _ZIPFILE ){.    
26930 20 20 69 66 28 20 63 6d 64 2e 7a 46 69 6c 65 3d    if( cmd.zFile=
26940 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6d  =0 ){.        cm
26950 64 2e 7a 53 72 63 54 61 62 6c 65 20 3d 20 73 71  d.zSrcTable = sq
26960 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 7a  lite3_mprintf("z
26970 69 70 22 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ip");.      }els
26980 65 7b 0a 20 20 20 20 20 20 20 20 63 6d 64 2e 7a  e{.        cmd.z
26990 53 72 63 54 61 62 6c 65 20 3d 20 73 71 6c 69 74  SrcTable = sqlit
269a0 65 33 5f 6d 70 72 69 6e 74 66 28 22 7a 69 70 66  e3_mprintf("zipf
269b0 69 6c 65 28 25 51 29 22 2c 20 63 6d 64 2e 7a 46  ile(%Q)", cmd.zF
269c0 69 6c 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ile);.      }.  
269d0 20 20 20 20 69 66 28 20 63 6d 64 2e 65 43 6d 64      if( cmd.eCmd
269e0 3d 3d 41 52 5f 43 4d 44 5f 43 52 45 41 54 45 20  ==AR_CMD_CREATE 
269f0 7c 7c 20 63 6d 64 2e 65 43 6d 64 3d 3d 41 52 5f  || cmd.eCmd==AR_
26a00 43 4d 44 5f 55 50 44 41 54 45 20 29 7b 0a 20 20  CMD_UPDATE ){.  
26a10 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
26a20 66 28 73 74 64 65 72 72 2c 20 22 7a 69 70 20 61  f(stderr, "zip a
26a30 72 63 68 69 76 65 73 20 61 72 65 20 72 65 61 64  rchives are read
26a40 2d 6f 6e 6c 79 5c 6e 22 29 3b 0a 20 20 20 20 20  -only\n");.     
26a50 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45     rc = SQLITE_E
26a60 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 67 6f  RROR;.        go
26a70 74 6f 20 65 6e 64 5f 61 72 5f 63 6f 6d 6d 61 6e  to end_ar_comman
26a80 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  d;.      }.     
26a90 20 63 6d 64 2e 62 5a 69 70 20 3d 20 31 3b 0a 20   cmd.bZip = 1;. 
26aa0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 6d 64     }else if( cmd
26ab0 2e 7a 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20  .zFile ){.      
26ac0 69 6e 74 20 66 6c 61 67 73 3b 0a 20 20 20 20 20  int flags;.     
26ad0 20 69 66 28 20 63 6d 64 2e 62 41 70 70 65 6e 64   if( cmd.bAppend
26ae0 20 29 20 65 44 62 54 79 70 65 20 3d 20 53 48 45   ) eDbType = SHE
26af0 4c 4c 5f 4f 50 45 4e 5f 41 50 50 45 4e 44 56 46  LL_OPEN_APPENDVF
26b00 53 3b 0a 20 20 20 20 20 20 69 66 28 20 63 6d 64  S;.      if( cmd
26b10 2e 65 43 6d 64 3d 3d 41 52 5f 43 4d 44 5f 43 52  .eCmd==AR_CMD_CR
26b20 45 41 54 45 20 7c 7c 20 63 6d 64 2e 65 43 6d 64  EATE || cmd.eCmd
26b30 3d 3d 41 52 5f 43 4d 44 5f 55 50 44 41 54 45 20  ==AR_CMD_UPDATE 
26b40 29 7b 0a 20 20 20 20 20 20 20 20 66 6c 61 67 73  ){.        flags
26b50 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52   = SQLITE_OPEN_R
26b60 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f  EADWRITE|SQLITE_
26b70 4f 50 45 4e 5f 43 52 45 41 54 45 3b 0a 20 20 20  OPEN_CREATE;.   
26b80 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
26b90 20 20 66 6c 61 67 73 20 3d 20 53 51 4c 49 54 45    flags = SQLITE
26ba0 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 3b 0a  _OPEN_READONLY;.
26bb0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 6d        }.      cm
26bc0 64 2e 64 62 20 3d 20 30 3b 0a 20 20 20 20 20 20  d.db = 0;.      
26bd0 69 66 28 20 63 6d 64 2e 62 44 72 79 52 75 6e 20  if( cmd.bDryRun 
26be0 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f  ){.        utf8_
26bf0 70 72 69 6e 74 66 28 70 53 74 61 74 65 2d 3e 6f  printf(pState->o
26c00 75 74 2c 20 22 2d 2d 20 6f 70 65 6e 20 64 61 74  ut, "-- open dat
26c10 61 62 61 73 65 20 27 25 73 27 25 73 5c 6e 22 2c  abase '%s'%s\n",
26c20 20 63 6d 64 2e 7a 46 69 6c 65 2c 0a 20 20 20 20   cmd.zFile,.    
26c30 20 20 20 20 20 20 20 20 20 65 44 62 54 79 70 65           eDbType
26c40 3d 3d 53 48 45 4c 4c 5f 4f 50 45 4e 5f 41 50 50  ==SHELL_OPEN_APP
26c50 45 4e 44 56 46 53 20 3f 20 22 20 75 73 69 6e 67  ENDVFS ? " using
26c60 20 27 61 70 6e 64 76 66 73 27 22 20 3a 20 22 22   'apndvfs'" : ""
26c70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
26c80 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 6f 70   rc = sqlite3_op
26c90 65 6e 5f 76 32 28 63 6d 64 2e 7a 46 69 6c 65 2c  en_v2(cmd.zFile,
26ca0 20 26 63 6d 64 2e 64 62 2c 20 66 6c 61 67 73 2c   &cmd.db, flags,
26cb0 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 65   .             e
26cc0 44 62 54 79 70 65 3d 3d 53 48 45 4c 4c 5f 4f 50  DbType==SHELL_OP
26cd0 45 4e 5f 41 50 50 45 4e 44 56 46 53 20 3f 20 22  EN_APPENDVFS ? "
26ce0 61 70 6e 64 76 66 73 22 20 3a 20 30 29 3b 0a 20  apndvfs" : 0);. 
26cf0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
26d00 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
26d10 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74    utf8_printf(st
26d20 64 65 72 72 2c 20 22 63 61 6e 6e 6f 74 20 6f 70  derr, "cannot op
26d30 65 6e 20 66 69 6c 65 3a 20 25 73 20 28 25 73 29  en file: %s (%s)
26d40 5c 6e 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20  \n", .          
26d50 20 20 63 6d 64 2e 7a 46 69 6c 65 2c 20 73 71 6c    cmd.zFile, sql
26d60 69 74 65 33 5f 65 72 72 6d 73 67 28 63 6d 64 2e  ite3_errmsg(cmd.
26d70 64 62 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20  db).        );. 
26d80 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
26d90 61 72 5f 63 6f 6d 6d 61 6e 64 3b 0a 20 20 20 20  ar_command;.    
26da0 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
26db0 33 5f 66 69 6c 65 69 6f 5f 69 6e 69 74 28 63 6d  3_fileio_init(cm
26dc0 64 2e 64 62 2c 20 30 2c 20 30 29 3b 0a 23 69 66  d.db, 0, 0);.#if
26dd0 64 65 66 20 53 51 4c 49 54 45 5f 48 41 56 45 5f  def SQLITE_HAVE_
26de0 5a 4c 49 42 0a 20 20 20 20 20 20 73 71 6c 69 74  ZLIB.      sqlit
26df0 65 33 5f 73 71 6c 61 72 5f 69 6e 69 74 28 63 6d  e3_sqlar_init(cm
26e00 64 2e 64 62 2c 20 30 2c 20 30 29 3b 0a 23 65 6e  d.db, 0, 0);.#en
26e10 64 69 66 0a 20 20 20 20 20 20 73 71 6c 69 74 65  dif.      sqlite
26e20 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
26e30 6e 28 63 6d 64 2e 64 62 2c 20 22 73 68 65 6c 6c  n(cmd.db, "shell
26e40 5f 70 75 74 73 6e 6c 22 2c 20 31 2c 20 53 51 4c  _putsnl", 1, SQL
26e50 49 54 45 5f 55 54 46 38 2c 20 63 6d 64 2e 70 2c  ITE_UTF8, cmd.p,
26e60 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
26e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
26e80 68 65 6c 6c 50 75 74 73 46 75 6e 63 2c 20 30 2c  hellPutsFunc, 0,
26e90 20 30 29 3b 0a 0a 20 20 20 20 7d 0a 20 20 20 20   0);..    }.    
26ea0 69 66 28 20 63 6d 64 2e 7a 53 72 63 54 61 62 6c  if( cmd.zSrcTabl
26eb0 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66  e==0 ){.      if
26ec0 28 20 63 6d 64 2e 65 43 6d 64 21 3d 41 52 5f 43  ( cmd.eCmd!=AR_C
26ed0 4d 44 5f 43 52 45 41 54 45 0a 20 20 20 20 20 20  MD_CREATE.      
26ee0 20 26 26 20 73 71 6c 69 74 65 33 5f 74 61 62 6c   && sqlite3_tabl
26ef0 65 5f 63 6f 6c 75 6d 6e 5f 6d 65 74 61 64 61 74  e_column_metadat
26f00 61 28 63 6d 64 2e 64 62 2c 30 2c 22 73 71 6c 61  a(cmd.db,0,"sqla
26f10 72 22 2c 22 6e 61 6d 65 22 2c 30 2c 30 2c 30 2c  r","name",0,0,0,
26f20 30 2c 30 29 0a 20 20 20 20 20 20 29 7b 0a 20 20  0,0).      ){.  
26f30 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
26f40 66 28 73 74 64 65 72 72 2c 20 22 64 61 74 61 62  f(stderr, "datab
26f50 61 73 65 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e  ase does not con
26f60 74 61 69 6e 20 61 6e 20 27 73 71 6c 61 72 27 20  tain an 'sqlar' 
26f70 74 61 62 6c 65 5c 6e 22 29 3b 0a 20 20 20 20 20  table\n");.     
26f80 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45     rc = SQLITE_E
26f90 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 67 6f  RROR;.        go
26fa0 74 6f 20 65 6e 64 5f 61 72 5f 63 6f 6d 6d 61 6e  to end_ar_comman
26fb0 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  d;.      }.     
26fc0 20 63 6d 64 2e 7a 53 72 63 54 61 62 6c 65 20 3d   cmd.zSrcTable =
26fd0 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
26fe0 28 22 73 71 6c 61 72 22 29 3b 0a 20 20 20 20 7d  ("sqlar");.    }
26ff0 0a 0a 20 20 20 20 73 77 69 74 63 68 28 20 63 6d  ..    switch( cm
27000 64 2e 65 43 6d 64 20 29 7b 0a 20 20 20 20 20 20  d.eCmd ){.      
27010 63 61 73 65 20 41 52 5f 43 4d 44 5f 43 52 45 41  case AR_CMD_CREA
27020 54 45 3a 0a 20 20 20 20 20 20 20 20 72 63 20 3d  TE:.        rc =
27030 20 61 72 43 72 65 61 74 65 4f 72 55 70 64 61 74   arCreateOrUpdat
27040 65 43 6f 6d 6d 61 6e 64 28 26 63 6d 64 2c 20 30  eCommand(&cmd, 0
27050 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
27060 3b 0a 0a 20 20 20 20 20 20 63 61 73 65 20 41 52  ;..      case AR
27070 5f 43 4d 44 5f 45 58 54 52 41 43 54 3a 0a 20 20  _CMD_EXTRACT:.  
27080 20 20 20 20 20 20 72 63 20 3d 20 61 72 45 78 74        rc = arExt
27090 72 61 63 74 43 6f 6d 6d 61 6e 64 28 26 63 6d 64  ractCommand(&cmd
270a0 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
270b0 3b 0a 0a 20 20 20 20 20 20 63 61 73 65 20 41 52  ;..      case AR
270c0 5f 43 4d 44 5f 4c 49 53 54 3a 0a 20 20 20 20 20  _CMD_LIST:.     
270d0 20 20 20 72 63 20 3d 20 61 72 4c 69 73 74 43 6f     rc = arListCo
270e0 6d 6d 61 6e 64 28 26 63 6d 64 29 3b 0a 20 20 20  mmand(&cmd);.   
270f0 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20       break;..   
27100 20 20 20 63 61 73 65 20 41 52 5f 43 4d 44 5f 48     case AR_CMD_H
27110 45 4c 50 3a 0a 20 20 20 20 20 20 20 20 61 72 55  ELP:.        arU
27120 73 61 67 65 28 70 53 74 61 74 65 2d 3e 6f 75 74  sage(pState->out
27130 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
27140 3b 0a 0a 20 20 20 20 20 20 64 65 66 61 75 6c 74  ;..      default
27150 3a 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  :.        assert
27160 28 20 63 6d 64 2e 65 43 6d 64 3d 3d 41 52 5f 43  ( cmd.eCmd==AR_C
27170 4d 44 5f 55 50 44 41 54 45 20 29 3b 0a 20 20 20  MD_UPDATE );.   
27180 20 20 20 20 20 72 63 20 3d 20 61 72 43 72 65 61       rc = arCrea
27190 74 65 4f 72 55 70 64 61 74 65 43 6f 6d 6d 61 6e  teOrUpdateComman
271a0 64 28 26 63 6d 64 2c 20 31 29 3b 0a 20 20 20 20  d(&cmd, 1);.    
271b0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
271c0 0a 20 20 7d 0a 65 6e 64 5f 61 72 5f 63 6f 6d 6d  .  }.end_ar_comm
271d0 61 6e 64 3a 0a 20 20 69 66 28 20 63 6d 64 2e 64  and:.  if( cmd.d
271e0 62 21 3d 70 53 74 61 74 65 2d 3e 64 62 20 29 7b  b!=pState->db ){
271f0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f  .    sqlite3_clo
27200 73 65 28 63 6d 64 2e 64 62 29 3b 0a 20 20 7d 0a  se(cmd.db);.  }.
27210 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 63    sqlite3_free(c
27220 6d 64 2e 7a 53 72 63 54 61 62 6c 65 29 3b 0a 0a  md.zSrcTable);..
27230 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 2f    return rc;.}./
27240 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 22 2e 61  * End of the ".a
27250 72 63 68 69 76 65 22 20 6f 72 20 22 2e 61 72 22  rchive" or ".ar"
27260 20 63 6f 6d 6d 61 6e 64 20 6c 6f 67 69 63 0a 2a   command logic.*
27270 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27280 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27290 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
272a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
272b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
272c0 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65  */.#endif /* !de
272d0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
272e0 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 20  T_VIRTUALTABLE) 
272f0 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  && defined(SQLIT
27300 45 5f 48 41 56 45 5f 5a 4c 49 42 29 20 2a 2f 0a  E_HAVE_ZLIB) */.
27310 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 61 6e 20 69 6e  ../*.** If an in
27320 70 75 74 20 6c 69 6e 65 20 62 65 67 69 6e 73 20  put line begins 
27330 77 69 74 68 20 22 2e 22 20 74 68 65 6e 20 69 6e  with "." then in
27340 76 6f 6b 65 20 74 68 69 73 20 72 6f 75 74 69 6e  voke this routin
27350 65 20 74 6f 0a 2a 2a 20 70 72 6f 63 65 73 73 20  e to.** process 
27360 74 68 61 74 20 6c 69 6e 65 2e 0a 2a 2a 0a 2a 2a  that line..**.**
27370 20 52 65 74 75 72 6e 20 31 20 6f 6e 20 65 72 72   Return 1 on err
27380 6f 72 2c 20 32 20 74 6f 20 65 78 69 74 2c 20 61  or, 2 to exit, a
27390 6e 64 20 30 20 6f 74 68 65 72 77 69 73 65 2e 0a  nd 0 otherwise..
273a0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 6f  */.static int do
273b0 5f 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 28 63 68  _meta_command(ch
273c0 61 72 20 2a 7a 4c 69 6e 65 2c 20 53 68 65 6c 6c  ar *zLine, Shell
273d0 53 74 61 74 65 20 2a 70 29 7b 0a 20 20 69 6e 74  State *p){.  int
273e0 20 68 20 3d 20 31 3b 0a 20 20 69 6e 74 20 6e 41   h = 1;.  int nA
273f0 72 67 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 2c  rg = 0;.  int n,
27400 20 63 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30   c;.  int rc = 0
27410 3b 0a 20 20 63 68 61 72 20 2a 61 7a 41 72 67 5b  ;.  char *azArg[
27420 35 30 5d 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  50];..#ifndef SQ
27430 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
27440 4c 54 41 42 4c 45 0a 20 20 69 66 28 20 70 2d 3e  LTABLE.  if( p->
27450 65 78 70 65 72 74 2e 70 45 78 70 65 72 74 20 29  expert.pExpert )
27460 7b 0a 20 20 20 20 65 78 70 65 72 74 46 69 6e 69  {.    expertFini
27470 73 68 28 70 2c 20 31 2c 20 30 29 3b 0a 20 20 7d  sh(p, 1, 0);.  }
27480 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 50 61  .#endif..  /* Pa
27490 72 73 65 20 74 68 65 20 69 6e 70 75 74 20 6c 69  rse the input li
274a0 6e 65 20 69 6e 74 6f 20 74 6f 6b 65 6e 73 2e 0a  ne into tokens..
274b0 20 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 7a 4c    */.  while( zL
274c0 69 6e 65 5b 68 5d 20 26 26 20 6e 41 72 67 3c 41  ine[h] && nArg<A
274d0 72 72 61 79 53 69 7a 65 28 61 7a 41 72 67 29 20  rraySize(azArg) 
274e0 29 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 49 73  ){.    while( Is
274f0 53 70 61 63 65 28 7a 4c 69 6e 65 5b 68 5d 29 20  Space(zLine[h]) 
27500 29 7b 20 68 2b 2b 3b 20 7d 0a 20 20 20 20 69 66  ){ h++; }.    if
27510 28 20 7a 4c 69 6e 65 5b 68 5d 3d 3d 30 20 29 20  ( zLine[h]==0 ) 
27520 62 72 65 61 6b 3b 0a 20 20 20 20 69 66 28 20 7a  break;.    if( z
27530 4c 69 6e 65 5b 68 5d 3d 3d 27 5c 27 27 20 7c 7c  Line[h]=='\'' ||
27540 20 7a 4c 69 6e 65 5b 68 5d 3d 3d 27 22 27 20 29   zLine[h]=='"' )
27550 7b 0a 20 20 20 20 20 20 69 6e 74 20 64 65 6c 69  {.      int deli
27560 6d 20 3d 20 7a 4c 69 6e 65 5b 68 2b 2b 5d 3b 0a  m = zLine[h++];.
27570 20 20 20 20 20 20 61 7a 41 72 67 5b 6e 41 72 67        azArg[nArg
27580 2b 2b 5d 20 3d 20 26 7a 4c 69 6e 65 5b 68 5d 3b  ++] = &zLine[h];
27590 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 7a 4c  .      while( zL
275a0 69 6e 65 5b 68 5d 20 26 26 20 7a 4c 69 6e 65 5b  ine[h] && zLine[
275b0 68 5d 21 3d 64 65 6c 69 6d 20 29 7b 0a 20 20 20  h]!=delim ){.   
275c0 20 20 20 20 20 69 66 28 20 7a 4c 69 6e 65 5b 68       if( zLine[h
275d0 5d 3d 3d 27 5c 5c 27 20 26 26 20 64 65 6c 69 6d  ]=='\\' && delim
275e0 3d 3d 27 22 27 20 26 26 20 7a 4c 69 6e 65 5b 68  =='"' && zLine[h
275f0 2b 31 5d 21 3d 30 20 29 20 68 2b 2b 3b 0a 20 20  +1]!=0 ) h++;.  
27600 20 20 20 20 20 20 68 2b 2b 3b 0a 20 20 20 20 20        h++;.     
27610 20 7d 0a 20 20 20 20 20 20 69 66 28 20 7a 4c 69   }.      if( zLi
27620 6e 65 5b 68 5d 3d 3d 64 65 6c 69 6d 20 29 7b 0a  ne[h]==delim ){.
27630 20 20 20 20 20 20 20 20 7a 4c 69 6e 65 5b 68 2b          zLine[h+
27640 2b 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  +] = 0;.      }.
27650 20 20 20 20 20 20 69 66 28 20 64 65 6c 69 6d 3d        if( delim=
27660 3d 27 22 27 20 29 20 72 65 73 6f 6c 76 65 5f 62  ='"' ) resolve_b
27670 61 63 6b 73 6c 61 73 68 65 73 28 61 7a 41 72 67  ackslashes(azArg
27680 5b 6e 41 72 67 2d 31 5d 29 3b 0a 20 20 20 20 7d  [nArg-1]);.    }
27690 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 7a 41 72  else{.      azAr
276a0 67 5b 6e 41 72 67 2b 2b 5d 20 3d 20 26 7a 4c 69  g[nArg++] = &zLi
276b0 6e 65 5b 68 5d 3b 0a 20 20 20 20 20 20 77 68 69  ne[h];.      whi
276c0 6c 65 28 20 7a 4c 69 6e 65 5b 68 5d 20 26 26 20  le( zLine[h] && 
276d0 21 49 73 53 70 61 63 65 28 7a 4c 69 6e 65 5b 68  !IsSpace(zLine[h
276e0 5d 29 20 29 7b 20 68 2b 2b 3b 20 7d 0a 20 20 20  ]) ){ h++; }.   
276f0 20 20 20 69 66 28 20 7a 4c 69 6e 65 5b 68 5d 20     if( zLine[h] 
27700 29 20 7a 4c 69 6e 65 5b 68 2b 2b 5d 20 3d 20 30  ) zLine[h++] = 0
27710 3b 0a 20 20 20 20 20 20 72 65 73 6f 6c 76 65 5f  ;.      resolve_
27720 62 61 63 6b 73 6c 61 73 68 65 73 28 61 7a 41 72  backslashes(azAr
27730 67 5b 6e 41 72 67 2d 31 5d 29 3b 0a 20 20 20 20  g[nArg-1]);.    
27740 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 72 6f 63  }.  }..  /* Proc
27750 65 73 73 20 74 68 65 20 69 6e 70 75 74 20 6c 69  ess the input li
27760 6e 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e  ne..  */.  if( n
27770 41 72 67 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  Arg==0 ) return 
27780 30 3b 20 2f 2a 20 6e 6f 20 74 6f 6b 65 6e 73 2c  0; /* no tokens,
27790 20 6e 6f 20 65 72 72 6f 72 20 2a 2f 0a 20 20 6e   no error */.  n
277a0 20 3d 20 73 74 72 6c 65 6e 33 30 28 61 7a 41 72   = strlen30(azAr
277b0 67 5b 30 5d 29 3b 0a 20 20 63 20 3d 20 61 7a 41  g[0]);.  c = azA
277c0 72 67 5b 30 5d 5b 30 5d 3b 0a 20 20 63 6c 65 61  rg[0][0];.  clea
277d0 72 54 65 6d 70 46 69 6c 65 28 70 29 3b 0a 0a 23  rTempFile(p);..#
277e0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
277f0 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e  IT_AUTHORIZATION
27800 0a 20 20 69 66 28 20 63 3d 3d 27 61 27 20 26 26  .  if( c=='a' &&
27810 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30   strncmp(azArg[0
27820 5d 2c 20 22 61 75 74 68 22 2c 20 6e 29 3d 3d 30  ], "auth", n)==0
27830 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 41 72 67   ){.    if( nArg
27840 21 3d 32 20 29 7b 0a 20 20 20 20 20 20 72 61 77  !=2 ){.      raw
27850 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
27860 22 55 73 61 67 65 3a 20 2e 61 75 74 68 20 4f 4e  "Usage: .auth ON
27870 7c 4f 46 46 5c 6e 22 29 3b 0a 20 20 20 20 20 20  |OFF\n");.      
27880 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 67 6f  rc = 1;.      go
27890 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f  to meta_command_
278a0 65 78 69 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  exit;.    }.    
278b0 6f 70 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a 20  open_db(p, 0);. 
278c0 20 20 20 69 66 28 20 62 6f 6f 6c 65 61 6e 56 61     if( booleanVa
278d0 6c 75 65 28 61 7a 41 72 67 5b 31 5d 29 20 29 7b  lue(azArg[1]) ){
278e0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
278f0 65 74 5f 61 75 74 68 6f 72 69 7a 65 72 28 70 2d  et_authorizer(p-
27900 3e 64 62 2c 20 73 68 65 6c 6c 41 75 74 68 2c 20  >db, shellAuth, 
27910 70 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  p);.    }else{. 
27920 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 65 74       sqlite3_set
27930 5f 61 75 74 68 6f 72 69 7a 65 72 28 70 2d 3e 64  _authorizer(p->d
27940 62 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  b, 0, 0);.    }.
27950 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 0a    }else.#endif..
27960 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
27970 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
27980 54 41 42 4c 45 29 20 26 26 20 64 65 66 69 6e 65  TABLE) && define
27990 64 28 53 51 4c 49 54 45 5f 48 41 56 45 5f 5a 4c  d(SQLITE_HAVE_ZL
279a0 49 42 29 0a 20 20 69 66 28 20 63 3d 3d 27 61 27  IB).  if( c=='a'
279b0 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72   && strncmp(azAr
279c0 67 5b 30 5d 2c 20 22 61 72 63 68 69 76 65 22 2c  g[0], "archive",
279d0 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 6f 70   n)==0 ){.    op
279e0 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a 20 20 20  en_db(p, 0);.   
279f0 20 72 63 20 3d 20 61 72 44 6f 74 43 6f 6d 6d 61   rc = arDotComma
27a00 6e 64 28 70 2c 20 61 7a 41 72 67 2c 20 6e 41 72  nd(p, azArg, nAr
27a10 67 29 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64  g);.  }else.#end
27a20 69 66 0a 0a 20 20 69 66 28 20 28 63 3d 3d 27 62  if..  if( (c=='b
27a30 27 20 26 26 20 6e 3e 3d 33 20 26 26 20 73 74 72  ' && n>=3 && str
27a40 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22  ncmp(azArg[0], "
27a50 62 61 63 6b 75 70 22 2c 20 6e 29 3d 3d 30 29 0a  backup", n)==0).
27a60 20 20 20 7c 7c 20 28 63 3d 3d 27 73 27 20 26 26     || (c=='s' &&
27a70 20 6e 3e 3d 33 20 26 26 20 73 74 72 6e 63 6d 70   n>=3 && strncmp
27a80 28 61 7a 41 72 67 5b 30 5d 2c 20 22 73 61 76 65  (azArg[0], "save
27a90 22 2c 20 6e 29 3d 3d 30 29 0a 20 20 29 7b 0a 20  ", n)==0).  ){. 
27aa0 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
27ab0 44 65 73 74 46 69 6c 65 20 3d 20 30 3b 0a 20 20  DestFile = 0;.  
27ac0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
27ad0 62 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74  b = 0;.    sqlit
27ae0 65 33 20 2a 70 44 65 73 74 3b 0a 20 20 20 20 73  e3 *pDest;.    s
27af0 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 20 2a 70  qlite3_backup *p
27b00 42 61 63 6b 75 70 3b 0a 20 20 20 20 69 6e 74 20  Backup;.    int 
27b10 6a 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 31 3b 20  j;.    for(j=1; 
27b20 6a 3c 6e 41 72 67 3b 20 6a 2b 2b 29 7b 0a 20 20  j<nArg; j++){.  
27b30 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
27b40 7a 20 3d 20 61 7a 41 72 67 5b 6a 5d 3b 0a 20 20  z = azArg[j];.  
27b50 20 20 20 20 69 66 28 20 7a 5b 30 5d 3d 3d 27 2d      if( z[0]=='-
27b60 27 20 29 7b 0a 20 20 20 20 20 20 20 20 77 68 69  ' ){.        whi
27b70 6c 65 28 20 7a 5b 30 5d 3d 3d 27 2d 27 20 29 20  le( z[0]=='-' ) 
27b80 7a 2b 2b 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20  z++;.        /* 
27b90 4e 6f 20 6f 70 74 69 6f 6e 73 20 74 6f 20 70 72  No options to pr
27ba0 6f 63 65 73 73 20 61 74 20 74 68 69 73 20 74 69  ocess at this ti
27bb0 6d 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 7b 0a  me */.        {.
27bc0 20 20 20 20 20 20 20 20 20 20 75 74 66 38 5f 70            utf8_p
27bd0 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 75  rintf(stderr, "u
27be0 6e 6b 6e 6f 77 6e 20 6f 70 74 69 6f 6e 3a 20 25  nknown option: %
27bf0 73 5c 6e 22 2c 20 61 7a 41 72 67 5b 6a 5d 29 3b  s\n", azArg[j]);
27c00 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
27c10 6e 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  n 1;.        }. 
27c20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 7a       }else if( z
27c30 44 65 73 74 46 69 6c 65 3d 3d 30 20 29 7b 0a 20  DestFile==0 ){. 
27c40 20 20 20 20 20 20 20 7a 44 65 73 74 46 69 6c 65         zDestFile
27c50 20 3d 20 61 7a 41 72 67 5b 6a 5d 3b 0a 20 20 20   = azArg[j];.   
27c60 20 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 44 62     }else if( zDb
27c70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  ==0 ){.        z
27c80 44 62 20 3d 20 7a 44 65 73 74 46 69 6c 65 3b 0a  Db = zDestFile;.
27c90 20 20 20 20 20 20 20 20 7a 44 65 73 74 46 69 6c          zDestFil
27ca0 65 20 3d 20 61 7a 41 72 67 5b 6a 5d 3b 0a 20 20  e = azArg[j];.  
27cb0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
27cc0 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74     raw_printf(st
27cd0 64 65 72 72 2c 20 22 74 6f 6f 20 6d 61 6e 79 20  derr, "too many 
27ce0 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 2e 62 61  arguments to .ba
27cf0 63 6b 75 70 5c 6e 22 29 3b 0a 20 20 20 20 20 20  ckup\n");.      
27d00 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
27d10 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
27d20 28 20 7a 44 65 73 74 46 69 6c 65 3d 3d 30 20 29  ( zDestFile==0 )
27d30 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e  {.      raw_prin
27d40 74 66 28 73 74 64 65 72 72 2c 20 22 6d 69 73 73  tf(stderr, "miss
27d50 69 6e 67 20 46 49 4c 45 4e 41 4d 45 20 61 72 67  ing FILENAME arg
27d60 75 6d 65 6e 74 20 6f 6e 20 2e 62 61 63 6b 75 70  ument on .backup
27d70 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75  \n");.      retu
27d80 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 1;.    }.    
27d90 69 66 28 20 7a 44 62 3d 3d 30 20 29 20 7a 44 62  if( zDb==0 ) zDb
27da0 20 3d 20 22 6d 61 69 6e 22 3b 0a 20 20 20 20 72   = "main";.    r
27db0 63 20 3d 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e  c = sqlite3_open
27dc0 28 7a 44 65 73 74 46 69 6c 65 2c 20 26 70 44 65  (zDestFile, &pDe
27dd0 73 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  st);.    if( rc!
27de0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
27df0 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
27e00 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20  stderr, "Error: 
27e10 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 5c 22 25 73  cannot open \"%s
27e20 5c 22 5c 6e 22 2c 20 7a 44 65 73 74 46 69 6c 65  \"\n", zDestFile
27e30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
27e40 5f 63 6c 6f 73 65 28 70 44 65 73 74 29 3b 0a 20  _close(pDest);. 
27e50 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
27e60 20 20 20 7d 0a 20 20 20 20 6f 70 65 6e 5f 64 62     }.    open_db
27e70 28 70 2c 20 30 29 3b 0a 20 20 20 20 70 42 61 63  (p, 0);.    pBac
27e80 6b 75 70 20 3d 20 73 71 6c 69 74 65 33 5f 62 61  kup = sqlite3_ba
27e90 63 6b 75 70 5f 69 6e 69 74 28 70 44 65 73 74 2c  ckup_init(pDest,
27ea0 20 22 6d 61 69 6e 22 2c 20 70 2d 3e 64 62 2c 20   "main", p->db, 
27eb0 7a 44 62 29 3b 0a 20 20 20 20 69 66 28 20 70 42  zDb);.    if( pB
27ec0 61 63 6b 75 70 3d 3d 30 20 29 7b 0a 20 20 20 20  ackup==0 ){.    
27ed0 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74    utf8_printf(st
27ee0 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 25 73  derr, "Error: %s
27ef0 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72  \n", sqlite3_err
27f00 6d 73 67 28 70 44 65 73 74 29 29 3b 0a 20 20 20  msg(pDest));.   
27f10 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65     sqlite3_close
27f20 28 70 44 65 73 74 29 3b 0a 20 20 20 20 20 20 72  (pDest);.      r
27f30 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
27f40 20 20 20 77 68 69 6c 65 28 20 20 28 72 63 20 3d     while(  (rc =
27f50 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 5f   sqlite3_backup_
27f60 73 74 65 70 28 70 42 61 63 6b 75 70 2c 31 30 30  step(pBackup,100
27f70 29 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  ))==SQLITE_OK ){
27f80 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 61  }.    sqlite3_ba
27f90 63 6b 75 70 5f 66 69 6e 69 73 68 28 70 42 61 63  ckup_finish(pBac
27fa0 6b 75 70 29 3b 0a 20 20 20 20 69 66 28 20 72 63  kup);.    if( rc
27fb0 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b  ==SQLITE_DONE ){
27fc0 0a 20 20 20 20 20 20 72 63 20 3d 20 30 3b 0a 20  .      rc = 0;. 
27fd0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
27fe0 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65  utf8_printf(stde
27ff0 72 72 2c 20 22 45 72 72 6f 72 3a 20 25 73 5c 6e  rr, "Error: %s\n
28000 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73  ", sqlite3_errms
28010 67 28 70 44 65 73 74 29 29 3b 0a 20 20 20 20 20  g(pDest));.     
28020 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20   rc = 1;.    }. 
28030 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65     sqlite3_close
28040 28 70 44 65 73 74 29 3b 0a 20 20 7d 65 6c 73 65  (pDest);.  }else
28050 0a 0a 20 20 69 66 28 20 63 3d 3d 27 62 27 20 26  ..  if( c=='b' &
28060 26 20 6e 3e 3d 33 20 26 26 20 73 74 72 6e 63 6d  & n>=3 && strncm
28070 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 62 61 69  p(azArg[0], "bai
28080 6c 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20  l", n)==0 ){.   
28090 20 69 66 28 20 6e 41 72 67 3d 3d 32 20 29 7b 0a   if( nArg==2 ){.
280a0 20 20 20 20 20 20 62 61 69 6c 5f 6f 6e 5f 65 72        bail_on_er
280b0 72 6f 72 20 3d 20 62 6f 6f 6c 65 61 6e 56 61 6c  ror = booleanVal
280c0 75 65 28 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20  ue(azArg[1]);.  
280d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
280e0 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  aw_printf(stderr
280f0 2c 20 22 55 73 61 67 65 3a 20 2e 62 61 69 6c 20  , "Usage: .bail 
28100 6f 6e 7c 6f 66 66 5c 6e 22 29 3b 0a 20 20 20 20  on|off\n");.    
28110 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a    rc = 1;.    }.
28120 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63    }else..  if( c
28130 3d 3d 27 62 27 20 26 26 20 6e 3e 3d 33 20 26 26  =='b' && n>=3 &&
28140 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30   strncmp(azArg[0
28150 5d 2c 20 22 62 69 6e 61 72 79 22 2c 20 6e 29 3d  ], "binary", n)=
28160 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 41  =0 ){.    if( nA
28170 72 67 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 69  rg==2 ){.      i
28180 66 28 20 62 6f 6f 6c 65 61 6e 56 61 6c 75 65 28  f( booleanValue(
28190 61 7a 41 72 67 5b 31 5d 29 20 29 7b 0a 20 20 20  azArg[1]) ){.   
281a0 20 20 20 20 20 73 65 74 42 69 6e 61 72 79 4d 6f       setBinaryMo
281b0 64 65 28 70 2d 3e 6f 75 74 2c 20 31 29 3b 0a 20  de(p->out, 1);. 
281c0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
281d0 20 20 20 20 73 65 74 54 65 78 74 4d 6f 64 65 28      setTextMode(
281e0 70 2d 3e 6f 75 74 2c 20 31 29 3b 0a 20 20 20 20  p->out, 1);.    
281f0 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
28200 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
28210 73 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20  stderr, "Usage: 
28220 2e 62 69 6e 61 72 79 20 6f 6e 7c 6f 66 66 5c 6e  .binary on|off\n
28230 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31  ");.      rc = 1
28240 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a  ;.    }.  }else.
28250 0a 20 20 69 66 28 20 63 3d 3d 27 63 27 20 26 26  .  if( c=='c' &&
28260 20 73 74 72 63 6d 70 28 61 7a 41 72 67 5b 30 5d   strcmp(azArg[0]
28270 2c 22 63 64 22 29 3d 3d 30 20 29 7b 0a 20 20 20  ,"cd")==0 ){.   
28280 20 69 66 28 20 6e 41 72 67 3d 3d 32 20 29 7b 0a   if( nArg==2 ){.
28290 23 69 66 20 64 65 66 69 6e 65 64 28 5f 57 49 4e  #if defined(_WIN
282a0 33 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 57  32) || defined(W
282b0 49 4e 33 32 29 0a 20 20 20 20 20 20 77 63 68 61  IN32).      wcha
282c0 72 5f 74 20 2a 7a 20 3d 20 73 71 6c 69 74 65 33  r_t *z = sqlite3
282d0 5f 77 69 6e 33 32 5f 75 74 66 38 5f 74 6f 5f 75  _win32_utf8_to_u
282e0 6e 69 63 6f 64 65 28 61 7a 41 72 67 5b 31 5d 29  nicode(azArg[1])
282f0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 21 53 65  ;.      rc = !Se
28300 74 43 75 72 72 65 6e 74 44 69 72 65 63 74 6f 72  tCurrentDirector
28310 79 57 28 7a 29 3b 0a 20 20 20 20 20 20 73 71 6c  yW(z);.      sql
28320 69 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a 23 65  ite3_free(z);.#e
28330 6c 73 65 0a 20 20 20 20 20 20 72 63 20 3d 20 63  lse.      rc = c
28340 68 64 69 72 28 61 7a 41 72 67 5b 31 5d 29 3b 0a  hdir(azArg[1]);.
28350 23 65 6e 64 69 66 0a 20 20 20 20 20 20 69 66 28  #endif.      if(
28360 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 75   rc ){.        u
28370 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72  tf8_printf(stder
28380 72 2c 20 22 43 61 6e 6e 6f 74 20 63 68 61 6e 67  r, "Cannot chang
28390 65 20 74 6f 20 64 69 72 65 63 74 6f 72 79 20 5c  e to directory \
283a0 22 25 73 5c 22 5c 6e 22 2c 20 61 7a 41 72 67 5b  "%s\"\n", azArg[
283b0 31 5d 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  1]);.        rc 
283c0 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
283d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 61   }else{.      ra
283e0 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  w_printf(stderr,
283f0 20 22 55 73 61 67 65 3a 20 2e 63 64 20 44 49 52   "Usage: .cd DIR
28400 45 43 54 4f 52 59 5c 6e 22 29 3b 0a 20 20 20 20  ECTORY\n");.    
28410 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a    rc = 1;.    }.
28420 20 20 7d 65 6c 73 65 0a 0a 20 20 2f 2a 20 54 68    }else..  /* Th
28430 65 20 75 6e 64 6f 63 75 6d 65 6e 74 65 64 20 22  e undocumented "
28440 2e 62 72 65 61 6b 70 6f 69 6e 74 22 20 63 6f 6d  .breakpoint" com
28450 6d 61 6e 64 20 63 61 75 73 65 73 20 61 20 63 61  mand causes a ca
28460 6c 6c 20 74 6f 20 74 68 65 20 6e 6f 2d 6f 70 0a  ll to the no-op.
28470 20 20 2a 2a 20 72 6f 75 74 69 6e 65 20 6e 61 6d    ** routine nam
28480 65 64 20 74 65 73 74 5f 62 72 65 61 6b 70 6f 69  ed test_breakpoi
28490 6e 74 28 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  nt()..  */.  if(
284a0 20 63 3d 3d 27 62 27 20 26 26 20 6e 3e 3d 33 20   c=='b' && n>=3 
284b0 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67  && strncmp(azArg
284c0 5b 30 5d 2c 20 22 62 72 65 61 6b 70 6f 69 6e 74  [0], "breakpoint
284d0 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ", n)==0 ){.    
284e0 74 65 73 74 5f 62 72 65 61 6b 70 6f 69 6e 74 28  test_breakpoint(
284f0 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66  );.  }else..  if
28500 28 20 63 3d 3d 27 63 27 20 26 26 20 6e 3e 3d 33  ( c=='c' && n>=3
28510 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72   && strncmp(azAr
28520 67 5b 30 5d 2c 20 22 63 68 61 6e 67 65 73 22 2c  g[0], "changes",
28530 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66   n)==0 ){.    if
28540 28 20 6e 41 72 67 3d 3d 32 20 29 7b 0a 20 20 20  ( nArg==2 ){.   
28550 20 20 20 73 65 74 4f 72 43 6c 65 61 72 46 6c 61     setOrClearFla
28560 67 28 70 2c 20 53 48 46 4c 47 5f 43 6f 75 6e 74  g(p, SHFLG_Count
28570 43 68 61 6e 67 65 73 2c 20 61 7a 41 72 67 5b 31  Changes, azArg[1
28580 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ]);.    }else{. 
28590 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
285a0 73 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20  stderr, "Usage: 
285b0 2e 63 68 61 6e 67 65 73 20 6f 6e 7c 6f 66 66 5c  .changes on|off\
285c0 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  n");.      rc = 
285d0 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  1;.    }.  }else
285e0 0a 0a 20 20 2f 2a 20 43 61 6e 63 65 6c 20 6f 75  ..  /* Cancel ou
285f0 74 70 75 74 20 72 65 64 69 72 65 63 74 69 6f 6e  tput redirection
28600 2c 20 69 66 20 69 74 20 69 73 20 63 75 72 72 65  , if it is curre
28610 6e 74 6c 79 20 73 65 74 20 28 62 79 20 2e 74 65  ntly set (by .te
28620 73 74 63 61 73 65 29 0a 20 20 2a 2a 20 54 68 65  stcase).  ** The
28630 6e 20 72 65 61 64 20 74 68 65 20 63 6f 6e 74 65  n read the conte
28640 6e 74 20 6f 66 20 74 68 65 20 74 65 73 74 63 61  nt of the testca
28650 73 65 2d 6f 75 74 2e 74 78 74 20 66 69 6c 65 20  se-out.txt file 
28660 61 6e 64 20 63 6f 6d 70 61 72 65 20 61 67 61 69  and compare agai
28670 6e 73 74 0a 20 20 2a 2a 20 61 7a 41 72 67 5b 31  nst.  ** azArg[1
28680 5d 2e 20 20 49 66 20 74 68 65 72 65 20 61 72 65  ].  If there are
28690 20 64 69 66 66 65 72 65 6e 63 65 73 2c 20 72 65   differences, re
286a0 70 6f 72 74 20 61 6e 20 65 72 72 6f 72 20 61 6e  port an error an
286b0 64 20 65 78 69 74 2e 0a 20 20 2a 2f 0a 20 20 69  d exit..  */.  i
286c0 66 28 20 63 3d 3d 27 63 27 20 26 26 20 6e 3e 3d  f( c=='c' && n>=
286d0 33 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41  3 && strncmp(azA
286e0 72 67 5b 30 5d 2c 20 22 63 68 65 63 6b 22 2c 20  rg[0], "check", 
286f0 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 63 68 61  n)==0 ){.    cha
28700 72 20 2a 7a 52 65 73 20 3d 20 30 3b 0a 20 20 20  r *zRes = 0;.   
28710 20 6f 75 74 70 75 74 5f 72 65 73 65 74 28 70 29   output_reset(p)
28720 3b 0a 20 20 20 20 69 66 28 20 6e 41 72 67 21 3d  ;.    if( nArg!=
28730 32 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70  2 ){.      raw_p
28740 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55  rintf(stderr, "U
28750 73 61 67 65 3a 20 2e 63 68 65 63 6b 20 47 4c 4f  sage: .check GLO
28760 42 2d 50 41 54 54 45 52 4e 5c 6e 22 29 3b 0a 20  B-PATTERN\n");. 
28770 20 20 20 20 20 72 63 20 3d 20 32 3b 0a 20 20 20       rc = 2;.   
28780 20 7d 65 6c 73 65 20 69 66 28 20 28 7a 52 65 73   }else if( (zRes
28790 20 3d 20 72 65 61 64 46 69 6c 65 28 22 74 65 73   = readFile("tes
287a0 74 63 61 73 65 2d 6f 75 74 2e 74 78 74 22 2c 20  tcase-out.txt", 
287b0 30 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  0))==0 ){.      
287c0 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72  raw_printf(stder
287d0 72 2c 20 22 45 72 72 6f 72 3a 20 63 61 6e 6e 6f  r, "Error: canno
287e0 74 20 72 65 61 64 20 27 74 65 73 74 63 61 73 65  t read 'testcase
287f0 2d 6f 75 74 2e 74 78 74 27 5c 6e 22 29 3b 0a 20  -out.txt'\n");. 
28800 20 20 20 20 20 72 63 20 3d 20 32 3b 0a 20 20 20       rc = 2;.   
28810 20 7d 65 6c 73 65 20 69 66 28 20 74 65 73 74 63   }else if( testc
28820 61 73 65 5f 67 6c 6f 62 28 61 7a 41 72 67 5b 31  ase_glob(azArg[1
28830 5d 2c 7a 52 65 73 29 3d 3d 30 20 29 7b 0a 20 20  ],zRes)==0 ){.  
28840 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
28850 73 74 64 65 72 72 2c 0a 20 20 20 20 20 20 20 20  stderr,.        
28860 20 20 20 20 20 20 20 20 20 22 74 65 73 74 63 61           "testca
28870 73 65 2d 25 73 20 46 41 49 4c 45 44 5c 6e 20 45  se-%s FAILED\n E
28880 78 70 65 63 74 65 64 3a 20 5b 25 73 5d 5c 6e 20  xpected: [%s]\n 
28890 20 20 20 20 20 47 6f 74 3a 20 5b 25 73 5d 5c 6e       Got: [%s]\n
288a0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
288b0 20 20 20 20 70 2d 3e 7a 54 65 73 74 63 61 73 65      p->zTestcase
288c0 2c 20 61 7a 41 72 67 5b 31 5d 2c 20 7a 52 65 73  , azArg[1], zRes
288d0 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b  );.      rc = 1;
288e0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
288f0 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74    utf8_printf(st
28900 64 6f 75 74 2c 20 22 74 65 73 74 63 61 73 65 2d  dout, "testcase-
28910 25 73 20 6f 6b 5c 6e 22 2c 20 70 2d 3e 7a 54 65  %s ok\n", p->zTe
28920 73 74 63 61 73 65 29 3b 0a 20 20 20 20 20 20 70  stcase);.      p
28930 2d 3e 6e 43 68 65 63 6b 2b 2b 3b 0a 20 20 20 20  ->nCheck++;.    
28940 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  }.    sqlite3_fr
28950 65 65 28 7a 52 65 73 29 3b 0a 20 20 7d 65 6c 73  ee(zRes);.  }els
28960 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 63 27 20  e..  if( c=='c' 
28970 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67  && strncmp(azArg
28980 5b 30 5d 2c 20 22 63 6c 6f 6e 65 22 2c 20 6e 29  [0], "clone", n)
28990 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6e  ==0 ){.    if( n
289a0 41 72 67 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20  Arg==2 ){.      
289b0 74 72 79 54 6f 43 6c 6f 6e 65 28 70 2c 20 61 7a  tryToClone(p, az
289c0 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20 7d 65 6c  Arg[1]);.    }el
289d0 73 65 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72  se{.      raw_pr
289e0 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55 73  intf(stderr, "Us
289f0 61 67 65 3a 20 2e 63 6c 6f 6e 65 20 46 49 4c 45  age: .clone FILE
28a00 4e 41 4d 45 5c 6e 22 29 3b 0a 20 20 20 20 20 20  NAME\n");.      
28a10 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  rc = 1;.    }.  
28a20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d  }else..  if( c==
28a30 27 64 27 20 26 26 20 6e 3e 31 20 26 26 20 73 74  'd' && n>1 && st
28a40 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20  rncmp(azArg[0], 
28a50 22 64 61 74 61 62 61 73 65 73 22 2c 20 6e 29 3d  "databases", n)=
28a60 3d 30 20 29 7b 0a 20 20 20 20 53 68 65 6c 6c 53  =0 ){.    ShellS
28a70 74 61 74 65 20 64 61 74 61 3b 0a 20 20 20 20 63  tate data;.    c
28a80 68 61 72 20 2a 7a 45 72 72 4d 73 67 20 3d 20 30  har *zErrMsg = 0
28a90 3b 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28 70 2c  ;.    open_db(p,
28aa0 20 30 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28   0);.    memcpy(
28ab0 26 64 61 74 61 2c 20 70 2c 20 73 69 7a 65 6f 66  &data, p, sizeof
28ac0 28 64 61 74 61 29 29 3b 0a 20 20 20 20 64 61 74  (data));.    dat
28ad0 61 2e 73 68 6f 77 48 65 61 64 65 72 20 3d 20 30  a.showHeader = 0
28ae0 3b 0a 20 20 20 20 64 61 74 61 2e 63 4d 6f 64 65  ;.    data.cMode
28af0 20 3d 20 64 61 74 61 2e 6d 6f 64 65 20 3d 20 4d   = data.mode = M
28b00 4f 44 45 5f 4c 69 73 74 3b 0a 20 20 20 20 73 71  ODE_List;.    sq
28b10 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
28b20 69 7a 65 6f 66 28 64 61 74 61 2e 63 6f 6c 53 65  izeof(data.colSe
28b30 70 61 72 61 74 6f 72 29 2c 64 61 74 61 2e 63 6f  parator),data.co
28b40 6c 53 65 70 61 72 61 74 6f 72 2c 22 3a 20 22 29  lSeparator,": ")
28b50 3b 0a 20 20 20 20 64 61 74 61 2e 63 6e 74 20 3d  ;.    data.cnt =
28b60 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   0;.    sqlite3_
28b70 65 78 65 63 28 70 2d 3e 64 62 2c 20 22 53 45 4c  exec(p->db, "SEL
28b80 45 43 54 20 6e 61 6d 65 2c 20 66 69 6c 65 20 46  ECT name, file F
28b90 52 4f 4d 20 70 72 61 67 6d 61 5f 64 61 74 61 62  ROM pragma_datab
28ba0 61 73 65 5f 6c 69 73 74 22 2c 0a 20 20 20 20 20  ase_list",.     
28bb0 20 20 20 20 20 20 20 20 20 20 20 20 63 61 6c 6c              call
28bc0 62 61 63 6b 2c 20 26 64 61 74 61 2c 20 26 7a 45  back, &data, &zE
28bd0 72 72 4d 73 67 29 3b 0a 20 20 20 20 69 66 28 20  rrMsg);.    if( 
28be0 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20 20  zErrMsg ){.     
28bf0 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64   utf8_printf(std
28c00 65 72 72 2c 22 45 72 72 6f 72 3a 20 25 73 5c 6e  err,"Error: %s\n
28c10 22 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20  ", zErrMsg);.   
28c20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
28c30 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20  zErrMsg);.      
28c40 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  rc = 1;.    }.  
28c50 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d  }else..  if( c==
28c60 27 64 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61  'd' && strncmp(a
28c70 7a 41 72 67 5b 30 5d 2c 20 22 64 62 69 6e 66 6f  zArg[0], "dbinfo
28c80 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ", n)==0 ){.    
28c90 72 63 20 3d 20 73 68 65 6c 6c 5f 64 62 69 6e 66  rc = shell_dbinf
28ca0 6f 5f 63 6f 6d 6d 61 6e 64 28 70 2c 20 6e 41 72  o_command(p, nAr
28cb0 67 2c 20 61 7a 41 72 67 29 3b 0a 20 20 7d 65 6c  g, azArg);.  }el
28cc0 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 64 27  se..  if( c=='d'
28cd0 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72   && strncmp(azAr
28ce0 67 5b 30 5d 2c 20 22 64 75 6d 70 22 2c 20 6e 29  g[0], "dump", n)
28cf0 3d 3d 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74  ==0 ){.    const
28d00 20 63 68 61 72 20 2a 7a 4c 69 6b 65 20 3d 20 30   char *zLike = 0
28d10 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  ;.    int i;.   
28d20 20 69 6e 74 20 73 61 76 65 64 53 68 6f 77 48 65   int savedShowHe
28d30 61 64 65 72 20 3d 20 70 2d 3e 73 68 6f 77 48 65  ader = p->showHe
28d40 61 64 65 72 3b 0a 20 20 20 20 53 68 65 6c 6c 43  ader;.    ShellC
28d50 6c 65 61 72 46 6c 61 67 28 70 2c 20 53 48 46 4c  learFlag(p, SHFL
28d60 47 5f 50 72 65 73 65 72 76 65 52 6f 77 69 64 7c  G_PreserveRowid|
28d70 53 48 46 4c 47 5f 4e 65 77 6c 69 6e 65 73 29 3b  SHFLG_Newlines);
28d80 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c  .    for(i=1; i<
28d90 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nArg; i++){.    
28da0 20 20 69 66 28 20 61 7a 41 72 67 5b 69 5d 5b 30    if( azArg[i][0
28db0 5d 3d 3d 27 2d 27 20 29 7b 0a 20 20 20 20 20 20  ]=='-' ){.      
28dc0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20    const char *z 
28dd0 3d 20 61 7a 41 72 67 5b 69 5d 2b 31 3b 0a 20 20  = azArg[i]+1;.  
28de0 20 20 20 20 20 20 69 66 28 20 7a 5b 30 5d 3d 3d        if( z[0]==
28df0 27 2d 27 20 29 20 7a 2b 2b 3b 0a 20 20 20 20 20  '-' ) z++;.     
28e00 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c     if( strcmp(z,
28e10 22 70 72 65 73 65 72 76 65 2d 72 6f 77 69 64 73  "preserve-rowids
28e20 22 29 3d 3d 30 20 29 7b 0a 23 69 66 64 65 66 20  ")==0 ){.#ifdef 
28e30 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
28e40 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 20 20 20  UALTABLE.       
28e50 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74     raw_printf(st
28e60 64 65 72 72 2c 20 22 54 68 65 20 2d 2d 70 72 65  derr, "The --pre
28e70 73 65 72 76 65 2d 72 6f 77 69 64 73 20 6f 70 74  serve-rowids opt
28e80 69 6f 6e 20 69 73 20 6e 6f 74 20 63 6f 6d 70 61  ion is not compa
28e90 74 69 62 6c 65 22 0a 20 20 20 20 20 20 20 20 20  tible".         
28ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28eb0 20 20 20 20 22 20 77 69 74 68 20 53 51 4c 49 54      " with SQLIT
28ec0 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
28ed0 42 4c 45 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20  BLE\n");.       
28ee0 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20     rc = 1;.     
28ef0 20 20 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63       goto meta_c
28f00 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 23 65 6c  ommand_exit;.#el
28f10 73 65 0a 20 20 20 20 20 20 20 20 20 20 53 68 65  se.          She
28f20 6c 6c 53 65 74 46 6c 61 67 28 70 2c 20 53 48 46  llSetFlag(p, SHF
28f30 4c 47 5f 50 72 65 73 65 72 76 65 52 6f 77 69 64  LG_PreserveRowid
28f40 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  );.#endif.      
28f50 20 20 7d 65 6c 73 65 0a 20 20 20 20 20 20 20 20    }else.        
28f60 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 22 6e 65  if( strcmp(z,"ne
28f70 77 6c 69 6e 65 73 22 29 3d 3d 30 20 29 7b 0a 20  wlines")==0 ){. 
28f80 20 20 20 20 20 20 20 20 20 53 68 65 6c 6c 53 65           ShellSe
28f90 74 46 6c 61 67 28 70 2c 20 53 48 46 4c 47 5f 4e  tFlag(p, SHFLG_N
28fa0 65 77 6c 69 6e 65 73 29 3b 0a 20 20 20 20 20 20  ewlines);.      
28fb0 20 20 7d 65 6c 73 65 0a 20 20 20 20 20 20 20 20    }else.        
28fc0 7b 0a 20 20 20 20 20 20 20 20 20 20 72 61 77 5f  {.          raw_
28fd0 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
28fe0 55 6e 6b 6e 6f 77 6e 20 6f 70 74 69 6f 6e 20 5c  Unknown option \
28ff0 22 25 73 5c 22 20 6f 6e 20 5c 22 2e 64 75 6d 70  "%s\" on \".dump
29000 5c 22 5c 6e 22 2c 20 61 7a 41 72 67 5b 69 5d 29  \"\n", azArg[i])
29010 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
29020 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f   1;.          go
29030 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f  to meta_command_
29040 65 78 69 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  exit;.        }.
29050 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
29060 7a 4c 69 6b 65 20 29 7b 0a 20 20 20 20 20 20 20  zLike ){.       
29070 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65   raw_printf(stde
29080 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 64 75 6d  rr, "Usage: .dum
29090 70 20 3f 2d 2d 70 72 65 73 65 72 76 65 2d 72 6f  p ?--preserve-ro
290a0 77 69 64 73 3f 20 22 0a 20 20 20 20 20 20 20 20  wids? ".        
290b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
290c0 20 20 20 22 3f 2d 2d 6e 65 77 6c 69 6e 65 73 3f     "?--newlines?
290d0 20 3f 4c 49 4b 45 2d 50 41 54 54 45 52 4e 3f 5c   ?LIKE-PATTERN?\
290e0 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  n");.        rc 
290f0 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  = 1;.        got
29100 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65  o meta_command_e
29110 78 69 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  xit;.      }else
29120 7b 0a 20 20 20 20 20 20 20 20 7a 4c 69 6b 65 20  {.        zLike 
29130 3d 20 61 7a 41 72 67 5b 69 5d 3b 0a 20 20 20 20  = azArg[i];.    
29140 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 6f 70    }.    }.    op
29150 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a 20 20 20  en_db(p, 0);.   
29160 20 2f 2a 20 57 68 65 6e 20 70 6c 61 79 69 6e 67   /* When playing
29170 20 62 61 63 6b 20 61 20 22 64 75 6d 70 22 2c 20   back a "dump", 
29180 74 68 65 20 63 6f 6e 74 65 6e 74 20 6d 69 67 68  the content migh
29190 74 20 61 70 70 65 61 72 20 69 6e 20 61 6e 20 6f  t appear in an o
291a0 72 64 65 72 0a 20 20 20 20 2a 2a 20 77 68 69 63  rder.    ** whic
291b0 68 20 63 61 75 73 65 73 20 69 6d 6d 65 64 69 61  h causes immedia
291c0 74 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 63  te foreign key c
291d0 6f 6e 73 74 72 61 69 6e 74 73 20 74 6f 20 62 65  onstraints to be
291e0 20 76 69 6f 6c 61 74 65 64 2e 0a 20 20 20 20 2a   violated..    *
291f0 2a 20 53 6f 20 64 69 73 61 62 6c 65 20 66 6f 72  * So disable for
29200 65 69 67 6e 2d 6b 65 79 20 63 6f 6e 73 74 72 61  eign-key constra
29210 69 6e 74 20 65 6e 66 6f 72 63 65 6d 65 6e 74 20  int enforcement 
29220 74 6f 20 70 72 65 76 65 6e 74 20 70 72 6f 62 6c  to prevent probl
29230 65 6d 73 2e 20 2a 2f 0a 20 20 20 20 72 61 77 5f  ems. */.    raw_
29240 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
29250 50 52 41 47 4d 41 20 66 6f 72 65 69 67 6e 5f 6b  PRAGMA foreign_k
29260 65 79 73 3d 4f 46 46 3b 5c 6e 22 29 3b 0a 20 20  eys=OFF;\n");.  
29270 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e    raw_printf(p->
29280 6f 75 74 2c 20 22 42 45 47 49 4e 20 54 52 41 4e  out, "BEGIN TRAN
29290 53 41 43 54 49 4f 4e 3b 5c 6e 22 29 3b 0a 20 20  SACTION;\n");.  
292a0 20 20 70 2d 3e 77 72 69 74 61 62 6c 65 53 63 68    p->writableSch
292b0 65 6d 61 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e  ema = 0;.    p->
292c0 73 68 6f 77 48 65 61 64 65 72 20 3d 20 30 3b 0a  showHeader = 0;.
292d0 20 20 20 20 2f 2a 20 53 65 74 20 77 72 69 74 61      /* Set writa
292e0 62 6c 65 5f 73 63 68 65 6d 61 3d 4f 4e 20 73 69  ble_schema=ON si
292f0 6e 63 65 20 64 6f 69 6e 67 20 73 6f 20 66 6f 72  nce doing so for
29300 63 65 73 20 53 51 4c 69 74 65 20 74 6f 20 69 6e  ces SQLite to in
29310 69 74 69 61 6c 69 7a 65 0a 20 20 20 20 2a 2a 20  itialize.    ** 
29320 61 73 20 6d 75 63 68 20 6f 66 20 74 68 65 20 73  as much of the s
29330 63 68 65 6d 61 20 61 73 20 69 74 20 63 61 6e 20  chema as it can 
29340 65 76 65 6e 20 69 66 20 74 68 65 20 73 71 6c 69  even if the sqli
29350 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20  te_master table 
29360 69 73 0a 20 20 20 20 2a 2a 20 63 6f 72 72 75 70  is.    ** corrup
29370 74 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  t. */.    sqlite
29380 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20 22 53  3_exec(p->db, "S
29390 41 56 45 50 4f 49 4e 54 20 64 75 6d 70 3b 20 50  AVEPOINT dump; P
293a0 52 41 47 4d 41 20 77 72 69 74 61 62 6c 65 5f 73  RAGMA writable_s
293b0 63 68 65 6d 61 3d 4f 4e 22 2c 20 30 2c 20 30 2c  chema=ON", 0, 0,
293c0 20 30 29 3b 0a 20 20 20 20 70 2d 3e 6e 45 72 72   0);.    p->nErr
293d0 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 7a 4c   = 0;.    if( zL
293e0 69 6b 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ike==0 ){.      
293f0 72 75 6e 5f 73 63 68 65 6d 61 5f 64 75 6d 70 5f  run_schema_dump_
29400 71 75 65 72 79 28 70 2c 0a 20 20 20 20 20 20 20  query(p,.       
29410 20 22 53 45 4c 45 43 54 20 6e 61 6d 65 2c 20 74   "SELECT name, t
29420 79 70 65 2c 20 73 71 6c 20 46 52 4f 4d 20 73 71  ype, sql FROM sq
29430 6c 69 74 65 5f 6d 61 73 74 65 72 20 22 0a 20 20  lite_master ".  
29440 20 20 20 20 20 20 22 57 48 45 52 45 20 73 71 6c        "WHERE sql
29450 20 4e 4f 54 20 4e 55 4c 4c 20 41 4e 44 20 74 79   NOT NULL AND ty
29460 70 65 3d 3d 27 74 61 62 6c 65 27 20 41 4e 44 20  pe=='table' AND 
29470 6e 61 6d 65 21 3d 27 73 71 6c 69 74 65 5f 73 65  name!='sqlite_se
29480 71 75 65 6e 63 65 27 22 0a 20 20 20 20 20 20 29  quence'".      )
29490 3b 0a 20 20 20 20 20 20 72 75 6e 5f 73 63 68 65  ;.      run_sche
294a0 6d 61 5f 64 75 6d 70 5f 71 75 65 72 79 28 70 2c  ma_dump_query(p,
294b0 0a 20 20 20 20 20 20 20 20 22 53 45 4c 45 43 54  .        "SELECT
294c0 20 6e 61 6d 65 2c 20 74 79 70 65 2c 20 73 71 6c   name, type, sql
294d0 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73   FROM sqlite_mas
294e0 74 65 72 20 22 0a 20 20 20 20 20 20 20 20 22 57  ter ".        "W
294f0 48 45 52 45 20 6e 61 6d 65 3d 3d 27 73 71 6c 69  HERE name=='sqli
29500 74 65 5f 73 65 71 75 65 6e 63 65 27 22 0a 20 20  te_sequence'".  
29510 20 20 20 20 29 3b 0a 20 20 20 20 20 20 72 75 6e      );.      run
29520 5f 74 61 62 6c 65 5f 64 75 6d 70 5f 71 75 65 72  _table_dump_quer
29530 79 28 70 2c 0a 20 20 20 20 20 20 20 20 22 53 45  y(p,.        "SE
29540 4c 45 43 54 20 73 71 6c 20 46 52 4f 4d 20 73 71  LECT sql FROM sq
29550 6c 69 74 65 5f 6d 61 73 74 65 72 20 22 0a 20 20  lite_master ".  
29560 20 20 20 20 20 20 22 57 48 45 52 45 20 73 71 6c        "WHERE sql
29570 20 4e 4f 54 20 4e 55 4c 4c 20 41 4e 44 20 74 79   NOT NULL AND ty
29580 70 65 20 49 4e 20 28 27 69 6e 64 65 78 27 2c 27  pe IN ('index','
29590 74 72 69 67 67 65 72 27 2c 27 76 69 65 77 27 29  trigger','view')
295a0 22 2c 20 30 0a 20 20 20 20 20 20 29 3b 0a 20 20  ", 0.      );.  
295b0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63    }else{.      c
295c0 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 20 20 20  har *zSql;.     
295d0 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f   zSql = sqlite3_
295e0 6d 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20  mprintf(.       
295f0 20 22 53 45 4c 45 43 54 20 6e 61 6d 65 2c 20 74   "SELECT name, t
29600 79 70 65 2c 20 73 71 6c 20 46 52 4f 4d 20 73 71  ype, sql FROM sq
29610 6c 69 74 65 5f 6d 61 73 74 65 72 20 22 0a 20 20  lite_master ".  
29620 20 20 20 20 20 20 22 57 48 45 52 45 20 74 62 6c        "WHERE tbl
29630 5f 6e 61 6d 65 20 4c 49 4b 45 20 25 51 20 41 4e  _name LIKE %Q AN
29640 44 20 74 79 70 65 3d 3d 27 74 61 62 6c 65 27 22  D type=='table'"
29650 0a 20 20 20 20 20 20 20 20 22 20 20 41 4e 44 20  .        "  AND 
29660 73 71 6c 20 4e 4f 54 20 4e 55 4c 4c 22 2c 20 7a  sql NOT NULL", z
29670 4c 69 6b 65 29 3b 0a 20 20 20 20 20 20 72 75 6e  Like);.      run
29680 5f 73 63 68 65 6d 61 5f 64 75 6d 70 5f 71 75 65  _schema_dump_que
29690 72 79 28 70 2c 7a 53 71 6c 29 3b 0a 20 20 20 20  ry(p,zSql);.    
296a0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
296b0 53 71 6c 29 3b 0a 20 20 20 20 20 20 7a 53 71 6c  Sql);.      zSql
296c0 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
296d0 74 66 28 0a 20 20 20 20 20 20 20 20 22 53 45 4c  tf(.        "SEL
296e0 45 43 54 20 73 71 6c 20 46 52 4f 4d 20 73 71 6c  ECT sql FROM sql
296f0 69 74 65 5f 6d 61 73 74 65 72 20 22 0a 20 20 20  ite_master ".   
29700 20 20 20 20 20 22 57 48 45 52 45 20 73 71 6c 20       "WHERE sql 
29710 4e 4f 54 20 4e 55 4c 4c 22 0a 20 20 20 20 20 20  NOT NULL".      
29720 20 20 22 20 20 41 4e 44 20 74 79 70 65 20 49 4e    "  AND type IN
29730 20 28 27 69 6e 64 65 78 27 2c 27 74 72 69 67 67   ('index','trigg
29740 65 72 27 2c 27 76 69 65 77 27 29 22 0a 20 20 20  er','view')".   
29750 20 20 20 20 20 22 20 20 41 4e 44 20 74 62 6c 5f       "  AND tbl_
29760 6e 61 6d 65 20 4c 49 4b 45 20 25 51 22 2c 20 7a  name LIKE %Q", z
29770 4c 69 6b 65 29 3b 0a 20 20 20 20 20 20 72 75 6e  Like);.      run
29780 5f 74 61 62 6c 65 5f 64 75 6d 70 5f 71 75 65 72  _table_dump_quer
29790 79 28 70 2c 20 7a 53 71 6c 2c 20 30 29 3b 0a 20  y(p, zSql, 0);. 
297a0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
297b0 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20 7d 0a 20  e(zSql);.    }. 
297c0 20 20 20 69 66 28 20 70 2d 3e 77 72 69 74 61 62     if( p->writab
297d0 6c 65 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20  leSchema ){.    
297e0 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e    raw_printf(p->
297f0 6f 75 74 2c 20 22 50 52 41 47 4d 41 20 77 72 69  out, "PRAGMA wri
29800 74 61 62 6c 65 5f 73 63 68 65 6d 61 3d 4f 46 46  table_schema=OFF
29810 3b 5c 6e 22 29 3b 0a 20 20 20 20 20 20 70 2d 3e  ;\n");.      p->
29820 77 72 69 74 61 62 6c 65 53 63 68 65 6d 61 20 3d  writableSchema =
29830 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71   0;.    }.    sq
29840 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62  lite3_exec(p->db
29850 2c 20 22 50 52 41 47 4d 41 20 77 72 69 74 61 62  , "PRAGMA writab
29860 6c 65 5f 73 63 68 65 6d 61 3d 4f 46 46 3b 22 2c  le_schema=OFF;",
29870 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73   0, 0, 0);.    s
29880 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64  qlite3_exec(p->d
29890 62 2c 20 22 52 45 4c 45 41 53 45 20 64 75 6d 70  b, "RELEASE dump
298a0 3b 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  ;", 0, 0, 0);.  
298b0 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e    raw_printf(p->
298c0 6f 75 74 2c 20 70 2d 3e 6e 45 72 72 20 3f 20 22  out, p->nErr ? "
298d0 52 4f 4c 4c 42 41 43 4b 3b 20 2d 2d 20 64 75 65  ROLLBACK; -- due
298e0 20 74 6f 20 65 72 72 6f 72 73 5c 6e 22 20 3a 20   to errors\n" : 
298f0 22 43 4f 4d 4d 49 54 3b 5c 6e 22 29 3b 0a 20 20  "COMMIT;\n");.  
29900 20 20 70 2d 3e 73 68 6f 77 48 65 61 64 65 72 20    p->showHeader 
29910 3d 20 73 61 76 65 64 53 68 6f 77 48 65 61 64 65  = savedShowHeade
29920 72 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66  r;.  }else..  if
29930 28 20 63 3d 3d 27 65 27 20 26 26 20 73 74 72 6e  ( c=='e' && strn
29940 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 65  cmp(azArg[0], "e
29950 63 68 6f 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20  cho", n)==0 ){. 
29960 20 20 20 69 66 28 20 6e 41 72 67 3d 3d 32 20 29     if( nArg==2 )
29970 7b 0a 20 20 20 20 20 20 73 65 74 4f 72 43 6c 65  {.      setOrCle
29980 61 72 46 6c 61 67 28 70 2c 20 53 48 46 4c 47 5f  arFlag(p, SHFLG_
29990 45 63 68 6f 2c 20 61 7a 41 72 67 5b 31 5d 29 3b  Echo, azArg[1]);
299a0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
299b0 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64    raw_printf(std
299c0 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 65 63  err, "Usage: .ec
299d0 68 6f 20 6f 6e 7c 6f 66 66 5c 6e 22 29 3b 0a 20  ho on|off\n");. 
299e0 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20       rc = 1;.   
299f0 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66   }.  }else..  if
29a00 28 20 63 3d 3d 27 65 27 20 26 26 20 73 74 72 6e  ( c=='e' && strn
29a10 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 65  cmp(azArg[0], "e
29a20 71 70 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20  qp", n)==0 ){.  
29a30 20 20 69 66 28 20 6e 41 72 67 3d 3d 32 20 29 7b    if( nArg==2 ){
29a40 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 63 6d  .      if( strcm
29a50 70 28 61 7a 41 72 67 5b 31 5d 2c 22 66 75 6c 6c  p(azArg[1],"full
29a60 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ")==0 ){.       
29a70 20 70 2d 3e 61 75 74 6f 45 51 50 20 3d 20 41 55   p->autoEQP = AU
29a80 54 4f 45 51 50 5f 66 75 6c 6c 3b 0a 20 20 20 20  TOEQP_full;.    
29a90 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
29aa0 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 22 74 72 69  mp(azArg[1],"tri
29ab0 67 67 65 72 22 29 3d 3d 30 20 29 7b 0a 20 20 20  gger")==0 ){.   
29ac0 20 20 20 20 20 70 2d 3e 61 75 74 6f 45 51 50 20       p->autoEQP 
29ad0 3d 20 41 55 54 4f 45 51 50 5f 74 72 69 67 67 65  = AUTOEQP_trigge
29ae0 72 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  r;.      }else{.
29af0 20 20 20 20 20 20 20 20 70 2d 3e 61 75 74 6f 45          p->autoE
29b00 51 50 20 3d 20 62 6f 6f 6c 65 61 6e 56 61 6c 75  QP = booleanValu
29b10 65 28 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20  e(azArg[1]);.   
29b20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
29b30 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
29b40 28 73 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a  (stderr, "Usage:
29b50 20 2e 65 71 70 20 6f 66 66 7c 6f 6e 7c 74 72 69   .eqp off|on|tri
29b60 67 67 65 72 7c 66 75 6c 6c 5c 6e 22 29 3b 0a 20  gger|full\n");. 
29b70 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20       rc = 1;.   
29b80 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66   }.  }else..  if
29b90 28 20 63 3d 3d 27 65 27 20 26 26 20 73 74 72 6e  ( c=='e' && strn
29ba0 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 65  cmp(azArg[0], "e
29bb0 78 69 74 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20  xit", n)==0 ){. 
29bc0 20 20 20 69 66 28 20 6e 41 72 67 3e 31 20 26 26     if( nArg>1 &&
29bd0 20 28 72 63 20 3d 20 28 69 6e 74 29 69 6e 74 65   (rc = (int)inte
29be0 67 65 72 56 61 6c 75 65 28 61 7a 41 72 67 5b 31  gerValue(azArg[1
29bf0 5d 29 29 21 3d 30 20 29 20 65 78 69 74 28 72 63  ]))!=0 ) exit(rc
29c00 29 3b 0a 20 20 20 20 72 63 20 3d 20 32 3b 0a 20  );.    rc = 2;. 
29c10 20 7d 65 6c 73 65 0a 0a 20 20 2f 2a 20 54 68 65   }else..  /* The
29c20 20 22 2e 65 78 70 6c 61 69 6e 22 20 63 6f 6d 6d   ".explain" comm
29c30 61 6e 64 20 69 73 20 61 75 74 6f 6d 61 74 69 63  and is automatic
29c40 20 6e 6f 77 2e 20 20 49 74 20 69 73 20 6c 61 72   now.  It is lar
29c50 67 65 6c 79 20 70 6f 69 6e 74 6c 65 73 73 2e 20  gely pointless. 
29c60 20 49 74 0a 20 20 2a 2a 20 72 65 74 61 69 6e 65   It.  ** retaine
29c70 64 20 70 75 72 65 6c 79 20 66 6f 72 20 62 61 63  d purely for bac
29c80 6b 77 61 72 64 73 20 63 6f 6d 70 61 74 69 62 69  kwards compatibi
29c90 6c 69 74 79 20 2a 2f 0a 20 20 69 66 28 20 63 3d  lity */.  if( c=
29ca0 3d 27 65 27 20 26 26 20 73 74 72 6e 63 6d 70 28  ='e' && strncmp(
29cb0 61 7a 41 72 67 5b 30 5d 2c 20 22 65 78 70 6c 61  azArg[0], "expla
29cc0 69 6e 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20  in", n)==0 ){.  
29cd0 20 20 69 6e 74 20 76 61 6c 20 3d 20 31 3b 0a 20    int val = 1;. 
29ce0 20 20 20 69 66 28 20 6e 41 72 67 3e 3d 32 20 29     if( nArg>=2 )
29cf0 7b 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 63  {.      if( strc
29d00 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 22 61 75 74  mp(azArg[1],"aut
29d10 6f 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  o")==0 ){.      
29d20 20 20 76 61 6c 20 3d 20 39 39 3b 0a 20 20 20 20    val = 99;.    
29d30 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
29d40 20 76 61 6c 20 3d 20 20 62 6f 6f 6c 65 61 6e 56   val =  booleanV
29d50 61 6c 75 65 28 61 7a 41 72 67 5b 31 5d 29 3b 0a  alue(azArg[1]);.
29d60 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
29d70 20 20 69 66 28 20 76 61 6c 3d 3d 31 20 26 26 20    if( val==1 && 
29d80 70 2d 3e 6d 6f 64 65 21 3d 4d 4f 44 45 5f 45 78  p->mode!=MODE_Ex
29d90 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20 20 20 70  plain ){.      p
29da0 2d 3e 6e 6f 72 6d 61 6c 4d 6f 64 65 20 3d 20 70  ->normalMode = p
29db0 2d 3e 6d 6f 64 65 3b 0a 20 20 20 20 20 20 70 2d  ->mode;.      p-
29dc0 3e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 45 78 70  >mode = MODE_Exp
29dd0 6c 61 69 6e 3b 0a 20 20 20 20 20 20 70 2d 3e 61  lain;.      p->a
29de0 75 74 6f 45 78 70 6c 61 69 6e 20 3d 20 30 3b 0a  utoExplain = 0;.
29df0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 76 61      }else if( va
29e00 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66  l==0 ){.      if
29e10 28 20 70 2d 3e 6d 6f 64 65 3d 3d 4d 4f 44 45 5f  ( p->mode==MODE_
29e20 45 78 70 6c 61 69 6e 20 29 20 70 2d 3e 6d 6f 64  Explain ) p->mod
29e30 65 20 3d 20 70 2d 3e 6e 6f 72 6d 61 6c 4d 6f 64  e = p->normalMod
29e40 65 3b 0a 20 20 20 20 20 20 70 2d 3e 61 75 74 6f  e;.      p->auto
29e50 45 78 70 6c 61 69 6e 20 3d 20 30 3b 0a 20 20 20  Explain = 0;.   
29e60 20 7d 65 6c 73 65 20 69 66 28 20 76 61 6c 3d 3d   }else if( val==
29e70 39 39 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  99 ){.      if( 
29e80 70 2d 3e 6d 6f 64 65 3d 3d 4d 4f 44 45 5f 45 78  p->mode==MODE_Ex
29e90 70 6c 61 69 6e 20 29 20 70 2d 3e 6d 6f 64 65 20  plain ) p->mode 
29ea0 3d 20 70 2d 3e 6e 6f 72 6d 61 6c 4d 6f 64 65 3b  = p->normalMode;
29eb0 0a 20 20 20 20 20 20 70 2d 3e 61 75 74 6f 45 78  .      p->autoEx
29ec0 70 6c 61 69 6e 20 3d 20 31 3b 0a 20 20 20 20 7d  plain = 1;.    }
29ed0 0a 20 20 7d 65 6c 73 65 0a 0a 23 69 66 6e 64 65  .  }else..#ifnde
29ee0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
29ef0 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 69 66 28  RTUALTABLE.  if(
29f00 20 63 3d 3d 27 65 27 20 26 26 20 73 74 72 6e 63   c=='e' && strnc
29f10 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 65 78  mp(azArg[0], "ex
29f20 70 65 72 74 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a  pert", n)==0 ){.
29f30 20 20 20 20 6f 70 65 6e 5f 64 62 28 70 2c 20 30      open_db(p, 0
29f40 29 3b 0a 20 20 20 20 65 78 70 65 72 74 44 6f 74  );.    expertDot
29f50 43 6f 6d 6d 61 6e 64 28 70 2c 20 61 7a 41 72 67  Command(p, azArg
29f60 2c 20 6e 41 72 67 29 3b 0a 20 20 7d 65 6c 73 65  , nArg);.  }else
29f70 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 63  .#endif..  if( c
29f80 3d 3d 27 66 27 20 26 26 20 73 74 72 6e 63 6d 70  =='f' && strncmp
29f90 28 61 7a 41 72 67 5b 30 5d 2c 20 22 66 75 6c 6c  (azArg[0], "full
29fa0 73 63 68 65 6d 61 22 2c 20 6e 29 3d 3d 30 20 29  schema", n)==0 )
29fb0 7b 0a 20 20 20 20 53 68 65 6c 6c 53 74 61 74 65  {.    ShellState
29fc0 20 64 61 74 61 3b 0a 20 20 20 20 63 68 61 72 20   data;.    char 
29fd0 2a 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20  *zErrMsg = 0;.  
29fe0 20 20 69 6e 74 20 64 6f 53 74 61 74 73 20 3d 20    int doStats = 
29ff0 30 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 64  0;.    memcpy(&d
2a000 61 74 61 2c 20 70 2c 20 73 69 7a 65 6f 66 28 64  ata, p, sizeof(d
2a010 61 74 61 29 29 3b 0a 20 20 20 20 64 61 74 61 2e  ata));.    data.
2a020 73 68 6f 77 48 65 61 64 65 72 20 3d 20 30 3b 0a  showHeader = 0;.
2a030 20 20 20 20 64 61 74 61 2e 63 4d 6f 64 65 20 3d      data.cMode =
2a040 20 64 61 74 61 2e 6d 6f 64 65 20 3d 20 4d 4f 44   data.mode = MOD
2a050 45 5f 53 65 6d 69 3b 0a 20 20 20 20 69 66 28 20  E_Semi;.    if( 
2a060 6e 41 72 67 3d 3d 32 20 26 26 20 6f 70 74 69 6f  nArg==2 && optio
2a070 6e 4d 61 74 63 68 28 61 7a 41 72 67 5b 31 5d 2c  nMatch(azArg[1],
2a080 20 22 69 6e 64 65 6e 74 22 29 20 29 7b 0a 20 20   "indent") ){.  
2a090 20 20 20 20 64 61 74 61 2e 63 4d 6f 64 65 20 3d      data.cMode =
2a0a0 20 64 61 74 61 2e 6d 6f 64 65 20 3d 20 4d 4f 44   data.mode = MOD
2a0b0 45 5f 50 72 65 74 74 79 3b 0a 20 20 20 20 20 20  E_Pretty;.      
2a0c0 6e 41 72 67 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  nArg = 1;.    }.
2a0d0 20 20 20 20 69 66 28 20 6e 41 72 67 21 3d 31 20      if( nArg!=1 
2a0e0 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69  ){.      raw_pri
2a0f0 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55 73 61  ntf(stderr, "Usa
2a100 67 65 3a 20 2e 66 75 6c 6c 73 63 68 65 6d 61 20  ge: .fullschema 
2a110 3f 2d 2d 69 6e 64 65 6e 74 3f 5c 6e 22 29 3b 0a  ?--indent?\n");.
2a120 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
2a130 20 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f      goto meta_co
2a140 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20  mmand_exit;.    
2a150 7d 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28 70 2c  }.    open_db(p,
2a160 20 30 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71   0);.    rc = sq
2a170 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62  lite3_exec(p->db
2a180 2c 0a 20 20 20 20 20 20 20 22 53 45 4c 45 43 54  ,.       "SELECT
2a190 20 73 71 6c 20 46 52 4f 4d 22 0a 20 20 20 20 20   sql FROM".     
2a1a0 20 20 22 20 20 28 53 45 4c 45 43 54 20 73 71 6c    "  (SELECT sql
2a1b0 20 73 71 6c 2c 20 74 79 70 65 20 74 79 70 65 2c   sql, type type,
2a1c0 20 74 62 6c 5f 6e 61 6d 65 20 74 62 6c 5f 6e 61   tbl_name tbl_na
2a1d0 6d 65 2c 20 6e 61 6d 65 20 6e 61 6d 65 2c 20 72  me, name name, r
2a1e0 6f 77 69 64 20 78 22 0a 20 20 20 20 20 20 20 22  owid x".       "
2a1f0 20 20 20 20 20 46 52 4f 4d 20 73 71 6c 69 74 65       FROM sqlite
2a200 5f 6d 61 73 74 65 72 20 55 4e 49 4f 4e 20 41 4c  _master UNION AL
2a210 4c 22 0a 20 20 20 20 20 20 20 22 20 20 20 53 45  L".       "   SE
2a220 4c 45 43 54 20 73 71 6c 2c 20 74 79 70 65 2c 20  LECT sql, type, 
2a230 74 62 6c 5f 6e 61 6d 65 2c 20 6e 61 6d 65 2c 20  tbl_name, name, 
2a240 72 6f 77 69 64 20 46 52 4f 4d 20 73 71 6c 69 74  rowid FROM sqlit
2a250 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72 29 20 22  e_temp_master) "
2a260 0a 20 20 20 20 20 20 20 22 57 48 45 52 45 20 74  .       "WHERE t
2a270 79 70 65 21 3d 27 6d 65 74 61 27 20 41 4e 44 20  ype!='meta' AND 
2a280 73 71 6c 20 4e 4f 54 4e 55 4c 4c 20 41 4e 44 20  sql NOTNULL AND 
2a290 6e 61 6d 65 20 4e 4f 54 20 4c 49 4b 45 20 27 73  name NOT LIKE 's
2a2a0 71 6c 69 74 65 5f 25 27 20 22 0a 20 20 20 20 20  qlite_%' ".     
2a2b0 20 20 22 4f 52 44 45 52 20 42 59 20 72 6f 77 69    "ORDER BY rowi
2a2c0 64 22 2c 0a 20 20 20 20 20 20 20 63 61 6c 6c 62  d",.       callb
2a2d0 61 63 6b 2c 20 26 64 61 74 61 2c 20 26 7a 45 72  ack, &data, &zEr
2a2e0 72 4d 73 67 0a 20 20 20 20 29 3b 0a 20 20 20 20  rMsg.    );.    
2a2f0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2a300 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  K ){.      sqlit
2a310 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a  e3_stmt *pStmt;.
2a320 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
2a330 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 70 2d  e3_prepare_v2(p-
2a340 3e 64 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20  >db,.           
2a350 20 20 20 20 22 53 45 4c 45 43 54 20 72 6f 77 69      "SELECT rowi
2a360 64 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61  d FROM sqlite_ma
2a370 73 74 65 72 22 0a 20 20 20 20 20 20 20 20 20 20  ster".          
2a380 20 20 20 20 20 22 20 57 48 45 52 45 20 6e 61 6d       " WHERE nam
2a390 65 20 47 4c 4f 42 20 27 73 71 6c 69 74 65 5f 73  e GLOB 'sqlite_s
2a3a0 74 61 74 5b 31 33 34 5d 27 22 2c 0a 20 20 20 20  tat[134]'",.    
2a3b0 20 20 20 20 20 20 20 20 20 20 20 2d 31 2c 20 26             -1, &
2a3c0 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 20  pStmt, 0);.     
2a3d0 20 64 6f 53 74 61 74 73 20 3d 20 73 71 6c 69 74   doStats = sqlit
2a3e0 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3d 3d  e3_step(pStmt)==
2a3f0 53 51 4c 49 54 45 5f 52 4f 57 3b 0a 20 20 20 20  SQLITE_ROW;.    
2a400 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69    sqlite3_finali
2a410 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 7d  ze(pStmt);.    }
2a420 0a 20 20 20 20 69 66 28 20 64 6f 53 74 61 74 73  .    if( doStats
2a430 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 61 77  ==0 ){.      raw
2a440 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
2a450 22 2f 2a 20 4e 6f 20 53 54 41 54 20 74 61 62 6c  "/* No STAT tabl
2a460 65 73 20 61 76 61 69 6c 61 62 6c 65 20 2a 2f 5c  es available */\
2a470 6e 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  n");.    }else{.
2a480 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
2a490 28 70 2d 3e 6f 75 74 2c 20 22 41 4e 41 4c 59 5a  (p->out, "ANALYZ
2a4a0 45 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 3b  E sqlite_master;
2a4b0 5c 6e 22 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  \n");.      sqli
2a4c0 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20  te3_exec(p->db, 
2a4d0 22 53 45 4c 45 43 54 20 27 41 4e 41 4c 59 5a 45  "SELECT 'ANALYZE
2a4e0 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 27 22   sqlite_master'"
2a4f0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2a500 20 20 20 20 20 63 61 6c 6c 62 61 63 6b 2c 20 26       callback, &
2a510 64 61 74 61 2c 20 26 7a 45 72 72 4d 73 67 29 3b  data, &zErrMsg);
2a520 0a 20 20 20 20 20 20 64 61 74 61 2e 63 4d 6f 64  .      data.cMod
2a530 65 20 3d 20 64 61 74 61 2e 6d 6f 64 65 20 3d 20  e = data.mode = 
2a540 4d 4f 44 45 5f 49 6e 73 65 72 74 3b 0a 20 20 20  MODE_Insert;.   
2a550 20 20 20 64 61 74 61 2e 7a 44 65 73 74 54 61 62     data.zDestTab
2a560 6c 65 20 3d 20 22 73 71 6c 69 74 65 5f 73 74 61  le = "sqlite_sta
2a570 74 31 22 3b 0a 20 20 20 20 20 20 73 68 65 6c 6c  t1";.      shell
2a580 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20 22 53 45  _exec(p->db, "SE
2a590 4c 45 43 54 20 2a 20 46 52 4f 4d 20 73 71 6c 69  LECT * FROM sqli
2a5a0 74 65 5f 73 74 61 74 31 22 2c 0a 20 20 20 20 20  te_stat1",.     
2a5b0 20 20 20 20 20 20 20 20 20 20 20 20 73 68 65 6c              shel
2a5c0 6c 5f 63 61 6c 6c 62 61 63 6b 2c 20 26 64 61 74  l_callback, &dat
2a5d0 61 2c 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20  a,&zErrMsg);.   
2a5e0 20 20 20 64 61 74 61 2e 7a 44 65 73 74 54 61 62     data.zDestTab
2a5f0 6c 65 20 3d 20 22 73 71 6c 69 74 65 5f 73 74 61  le = "sqlite_sta
2a600 74 33 22 3b 0a 20 20 20 20 20 20 73 68 65 6c 6c  t3";.      shell
2a610 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20 22 53 45  _exec(p->db, "SE
2a620 4c 45 43 54 20 2a 20 46 52 4f 4d 20 73 71 6c 69  LECT * FROM sqli
2a630 74 65 5f 73 74 61 74 33 22 2c 0a 20 20 20 20 20  te_stat3",.     
2a640 20 20 20 20 20 20 20 20 20 20 20 20 73 68 65 6c              shel
2a650 6c 5f 63 61 6c 6c 62 61 63 6b 2c 20 26 64 61 74  l_callback, &dat
2a660 61 2c 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20  a,&zErrMsg);.   
2a670 20 20 20 64 61 74 61 2e 7a 44 65 73 74 54 61 62     data.zDestTab
2a680 6c 65 20 3d 20 22 73 71 6c 69 74 65 5f 73 74 61  le = "sqlite_sta
2a690 74 34 22 3b 0a 20 20 20 20 20 20 73 68 65 6c 6c  t4";.      shell
2a6a0 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20 22 53 45  _exec(p->db, "SE
2a6b0 4c 45 43 54 20 2a 20 46 52 4f 4d 20 73 71 6c 69  LECT * FROM sqli
2a6c0 74 65 5f 73 74 61 74 34 22 2c 0a 20 20 20 20 20  te_stat4",.     
2a6d0 20 20 20 20 20 20 20 20 20 20 20 20 73 68 65 6c              shel
2a6e0 6c 5f 63 61 6c 6c 62 61 63 6b 2c 20 26 64 61 74  l_callback, &dat
2a6f0 61 2c 20 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20  a, &zErrMsg);.  
2a700 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70      raw_printf(p
2a710 2d 3e 6f 75 74 2c 20 22 41 4e 41 4c 59 5a 45 20  ->out, "ANALYZE 
2a720 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 3b 5c 6e  sqlite_master;\n
2a730 22 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  ");.    }.  }els
2a740 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 68 27 20  e..  if( c=='h' 
2a750 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67  && strncmp(azArg
2a760 5b 30 5d 2c 20 22 68 65 61 64 65 72 73 22 2c 20  [0], "headers", 
2a770 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  n)==0 ){.    if(
2a780 20 6e 41 72 67 3d 3d 32 20 29 7b 0a 20 20 20 20   nArg==2 ){.    
2a790 20 20 70 2d 3e 73 68 6f 77 48 65 61 64 65 72 20    p->showHeader 
2a7a0 3d 20 62 6f 6f 6c 65 61 6e 56 61 6c 75 65 28 61  = booleanValue(a
2a7b0 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20 7d 65  zArg[1]);.    }e
2a7c0 6c 73 65 7b 0a 20 20 20 20 20 20 72 61 77 5f 70  lse{.      raw_p
2a7d0 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55  rintf(stderr, "U
2a7e0 73 61 67 65 3a 20 2e 68 65 61 64 65 72 73 20 6f  sage: .headers o
2a7f0 6e 7c 6f 66 66 5c 6e 22 29 3b 0a 20 20 20 20 20  n|off\n");.     
2a800 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20   rc = 1;.    }. 
2a810 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d   }else..  if( c=
2a820 3d 27 68 27 20 26 26 20 73 74 72 6e 63 6d 70 28  ='h' && strncmp(
2a830 61 7a 41 72 67 5b 30 5d 2c 20 22 68 65 6c 70 22  azArg[0], "help"
2a840 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 75  , n)==0 ){.    u
2a850 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  tf8_printf(p->ou
2a860 74 2c 20 22 25 73 22 2c 20 7a 48 65 6c 70 29 3b  t, "%s", zHelp);
2a870 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20  .  }else..  if( 
2a880 63 3d 3d 27 69 27 20 26 26 20 73 74 72 6e 63 6d  c=='i' && strncm
2a890 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 69 6d 70  p(azArg[0], "imp
2a8a0 6f 72 74 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20  ort", n)==0 ){. 
2a8b0 20 20 20 63 68 61 72 20 2a 7a 54 61 62 6c 65 3b     char *zTable;
2a8c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2a8d0 2a 20 49 6e 73 65 72 74 20 64 61 74 61 20 69 6e  * Insert data in
2a8e0 74 6f 20 74 68 69 73 20 74 61 62 6c 65 20 2a 2f  to this table */
2a8f0 0a 20 20 20 20 63 68 61 72 20 2a 7a 46 69 6c 65  .    char *zFile
2a900 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2a910 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 66 69 6c 65   /* Name of file
2a920 20 74 6f 20 65 78 74 72 61 20 63 6f 6e 74 65 6e   to extra conten
2a930 74 20 66 72 6f 6d 20 2a 2f 0a 20 20 20 20 73 71  t from */.    sq
2a940 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
2a950 74 20 3d 20 4e 55 4c 4c 3b 20 2f 2a 20 41 20 73  t = NULL; /* A s
2a960 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20  tatement */.    
2a970 69 6e 74 20 6e 43 6f 6c 3b 20 20 20 20 20 20 20  int nCol;       
2a980 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
2a990 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
2a9a0 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 2a 2f   in the table */
2a9b0 0a 20 20 20 20 69 6e 74 20 6e 42 79 74 65 3b 20  .    int nByte; 
2a9c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a9d0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
2a9e0 74 65 73 20 69 6e 20 61 6e 20 53 51 4c 20 73 74  tes in an SQL st
2a9f0 72 69 6e 67 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ring */.    int 
2aa00 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20  i, j;           
2aa10 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
2aa20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 20 20  counters */.    
2aa30 69 6e 74 20 6e 65 65 64 43 6f 6d 6d 69 74 3b 20  int needCommit; 
2aa40 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2aa50 72 75 65 20 74 6f 20 43 4f 4d 4d 49 54 20 6f 72  rue to COMMIT or
2aa60 20 52 4f 4c 4c 42 41 43 4b 20 61 74 20 65 6e 64   ROLLBACK at end
2aa70 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 53 65 70   */.    int nSep
2aa80 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2aa90 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
2aaa0 20 62 79 74 65 73 20 69 6e 20 70 2d 3e 63 6f 6c   bytes in p->col
2aab0 53 65 70 61 72 61 74 6f 72 5b 5d 20 2a 2f 0a 20  Separator[] */. 
2aac0 20 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b 20 20     char *zSql;  
2aad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2aae0 2a 20 41 6e 20 53 51 4c 20 73 74 61 74 65 6d 65  * An SQL stateme
2aaf0 6e 74 20 2a 2f 0a 20 20 20 20 49 6d 70 6f 72 74  nt */.    Import
2ab00 43 74 78 20 73 43 74 78 3b 20 20 20 20 20 20 20  Ctx sCtx;       
2ab10 20 20 20 20 20 20 2f 2a 20 52 65 61 64 65 72 20        /* Reader 
2ab20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 20 20 63  context */.    c
2ab30 68 61 72 20 2a 28 53 51 4c 49 54 45 5f 43 44 45  har *(SQLITE_CDE
2ab40 43 4c 20 2a 78 52 65 61 64 29 28 49 6d 70 6f 72  CL *xRead)(Impor
2ab50 74 43 74 78 2a 29 3b 20 2f 2a 20 46 75 6e 63 20  tCtx*); /* Func 
2ab60 74 6f 20 72 65 61 64 20 6f 6e 65 20 76 61 6c 75  to read one valu
2ab70 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 28 53 51  e */.    int (SQ
2ab80 4c 49 54 45 5f 43 44 45 43 4c 20 2a 78 43 6c 6f  LITE_CDECL *xClo
2ab90 73 65 72 29 28 46 49 4c 45 2a 29 3b 20 20 20 20  ser)(FILE*);    
2aba0 20 20 2f 2a 20 46 75 6e 63 20 74 6f 20 63 6c 6f    /* Func to clo
2abb0 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 20 20  se file */..    
2abc0 69 66 28 20 6e 41 72 67 21 3d 33 20 29 7b 0a 20  if( nArg!=3 ){. 
2abd0 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
2abe0 73 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20  stderr, "Usage: 
2abf0 2e 69 6d 70 6f 72 74 20 46 49 4c 45 20 54 41 42  .import FILE TAB
2ac00 4c 45 5c 6e 22 29 3b 0a 20 20 20 20 20 20 67 6f  LE\n");.      go
2ac10 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f  to meta_command_
2ac20 65 78 69 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  exit;.    }.    
2ac30 7a 46 69 6c 65 20 3d 20 61 7a 41 72 67 5b 31 5d  zFile = azArg[1]
2ac40 3b 0a 20 20 20 20 7a 54 61 62 6c 65 20 3d 20 61  ;.    zTable = a
2ac50 7a 41 72 67 5b 32 5d 3b 0a 20 20 20 20 73 65 65  zArg[2];.    see
2ac60 6e 49 6e 74 65 72 72 75 70 74 20 3d 20 30 3b 0a  nInterrupt = 0;.
2ac70 20 20 20 20 6d 65 6d 73 65 74 28 26 73 43 74 78      memset(&sCtx
2ac80 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 43 74 78  , 0, sizeof(sCtx
2ac90 29 29 3b 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28  ));.    open_db(
2aca0 70 2c 20 30 29 3b 0a 20 20 20 20 6e 53 65 70 20  p, 0);.    nSep 
2acb0 3d 20 73 74 72 6c 65 6e 33 30 28 70 2d 3e 63 6f  = strlen30(p->co
2acc0 6c 53 65 70 61 72 61 74 6f 72 29 3b 0a 20 20 20  lSeparator);.   
2acd0 20 69 66 28 20 6e 53 65 70 3d 3d 30 20 29 7b 0a   if( nSep==0 ){.
2ace0 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
2acf0 28 73 74 64 65 72 72 2c 0a 20 20 20 20 20 20 20  (stderr,.       
2ad00 20 20 20 20 20 20 20 20 20 20 22 45 72 72 6f 72            "Error
2ad10 3a 20 6e 6f 6e 2d 6e 75 6c 6c 20 63 6f 6c 75 6d  : non-null colum
2ad20 6e 20 73 65 70 61 72 61 74 6f 72 20 72 65 71 75  n separator requ
2ad30 69 72 65 64 20 66 6f 72 20 69 6d 70 6f 72 74 5c  ired for import\
2ad40 6e 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  n");.      retur
2ad50 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  n 1;.    }.    i
2ad60 66 28 20 6e 53 65 70 3e 31 20 29 7b 0a 20 20 20  f( nSep>1 ){.   
2ad70 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74     raw_printf(st
2ad80 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 6d 75  derr, "Error: mu
2ad90 6c 74 69 2d 63 68 61 72 61 63 74 65 72 20 63 6f  lti-character co
2ada0 6c 75 6d 6e 20 73 65 70 61 72 61 74 6f 72 73 20  lumn separators 
2adb0 6e 6f 74 20 61 6c 6c 6f 77 65 64 22 0a 20 20 20  not allowed".   
2adc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2add0 20 20 20 22 20 66 6f 72 20 69 6d 70 6f 72 74 5c     " for import\
2ade0 6e 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  n");.      retur
2adf0 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e  n 1;.    }.    n
2ae00 53 65 70 20 3d 20 73 74 72 6c 65 6e 33 30 28 70  Sep = strlen30(p
2ae10 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 29 3b  ->rowSeparator);
2ae20 0a 20 20 20 20 69 66 28 20 6e 53 65 70 3d 3d 30  .    if( nSep==0
2ae30 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72   ){.      raw_pr
2ae40 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72  intf(stderr, "Er
2ae50 72 6f 72 3a 20 6e 6f 6e 2d 6e 75 6c 6c 20 72 6f  ror: non-null ro
2ae60 77 20 73 65 70 61 72 61 74 6f 72 20 72 65 71 75  w separator requ
2ae70 69 72 65 64 20 66 6f 72 20 69 6d 70 6f 72 74 5c  ired for import\
2ae80 6e 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  n");.      retur
2ae90 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  n 1;.    }.    i
2aea0 66 28 20 6e 53 65 70 3d 3d 32 20 26 26 20 70 2d  f( nSep==2 && p-
2aeb0 3e 6d 6f 64 65 3d 3d 4d 4f 44 45 5f 43 73 76 20  >mode==MODE_Csv 
2aec0 26 26 20 73 74 72 63 6d 70 28 70 2d 3e 72 6f 77  && strcmp(p->row
2aed0 53 65 70 61 72 61 74 6f 72 2c 20 53 45 50 5f 43  Separator, SEP_C
2aee0 72 4c 66 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  rLf)==0 ){.     
2aef0 20 2f 2a 20 57 68 65 6e 20 69 6d 70 6f 72 74 69   /* When importi
2af00 6e 67 20 43 53 56 20 28 6f 6e 6c 79 29 2c 20 69  ng CSV (only), i
2af10 66 20 74 68 65 20 72 6f 77 20 73 65 70 61 72 61  f the row separa
2af20 74 6f 72 20 69 73 20 73 65 74 20 74 6f 20 74 68  tor is set to th
2af30 65 0a 20 20 20 20 20 20 2a 2a 20 64 65 66 61 75  e.      ** defau
2af40 6c 74 20 6f 75 74 70 75 74 20 72 6f 77 20 73 65  lt output row se
2af50 70 61 72 61 74 6f 72 2c 20 63 68 61 6e 67 65 20  parator, change 
2af60 69 74 20 74 6f 20 74 68 65 20 64 65 66 61 75 6c  it to the defaul
2af70 74 20 69 6e 70 75 74 0a 20 20 20 20 20 20 2a 2a  t input.      **
2af80 20 72 6f 77 20 73 65 70 61 72 61 74 6f 72 2e 20   row separator. 
2af90 20 54 68 69 73 20 61 76 6f 69 64 73 20 68 61 76   This avoids hav
2afa0 69 6e 67 20 74 6f 20 6d 61 69 6e 74 61 69 6e 20  ing to maintain 
2afb0 64 69 66 66 65 72 65 6e 74 20 69 6e 70 75 74 0a  different input.
2afc0 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 6f 75 74        ** and out
2afd0 70 75 74 20 72 6f 77 20 73 65 70 61 72 61 74 6f  put row separato
2afe0 72 73 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c  rs. */.      sql
2aff0 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
2b000 7a 65 6f 66 28 70 2d 3e 72 6f 77 53 65 70 61 72  zeof(p->rowSepar
2b010 61 74 6f 72 29 2c 20 70 2d 3e 72 6f 77 53 65 70  ator), p->rowSep
2b020 61 72 61 74 6f 72 2c 20 53 45 50 5f 52 6f 77 29  arator, SEP_Row)
2b030 3b 0a 20 20 20 20 20 20 6e 53 65 70 20 3d 20 73  ;.      nSep = s
2b040 74 72 6c 65 6e 33 30 28 70 2d 3e 72 6f 77 53 65  trlen30(p->rowSe
2b050 70 61 72 61 74 6f 72 29 3b 0a 20 20 20 20 7d 0a  parator);.    }.
2b060 20 20 20 20 69 66 28 20 6e 53 65 70 3e 31 20 29      if( nSep>1 )
2b070 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e  {.      raw_prin
2b080 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f  tf(stderr, "Erro
2b090 72 3a 20 6d 75 6c 74 69 2d 63 68 61 72 61 63 74  r: multi-charact
2b0a0 65 72 20 72 6f 77 20 73 65 70 61 72 61 74 6f 72  er row separator
2b0b0 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 22 0a 20  s not allowed". 
2b0c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b0d0 20 20 20 20 20 22 20 66 6f 72 20 69 6d 70 6f 72       " for impor
2b0e0 74 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 65 74  t\n");.      ret
2b0f0 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 1;.    }.   
2b100 20 73 43 74 78 2e 7a 46 69 6c 65 20 3d 20 7a 46   sCtx.zFile = zF
2b110 69 6c 65 3b 0a 20 20 20 20 73 43 74 78 2e 6e 4c  ile;.    sCtx.nL
2b120 69 6e 65 20 3d 20 31 3b 0a 20 20 20 20 69 66 28  ine = 1;.    if(
2b130 20 73 43 74 78 2e 7a 46 69 6c 65 5b 30 5d 3d 3d   sCtx.zFile[0]==
2b140 27 7c 27 20 29 7b 0a 23 69 66 64 65 66 20 53 51  '|' ){.#ifdef SQ
2b150 4c 49 54 45 5f 4f 4d 49 54 5f 50 4f 50 45 4e 0a  LITE_OMIT_POPEN.
2b160 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
2b170 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a  (stderr, "Error:
2b180 20 70 69 70 65 73 20 61 72 65 20 6e 6f 74 20 73   pipes are not s
2b190 75 70 70 6f 72 74 65 64 20 69 6e 20 74 68 69 73  upported in this
2b1a0 20 4f 53 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72   OS\n");.      r
2b1b0 65 74 75 72 6e 20 31 3b 0a 23 65 6c 73 65 0a 20  eturn 1;.#else. 
2b1c0 20 20 20 20 20 73 43 74 78 2e 69 6e 20 3d 20 70       sCtx.in = p
2b1d0 6f 70 65 6e 28 73 43 74 78 2e 7a 46 69 6c 65 2b  open(sCtx.zFile+
2b1e0 31 2c 20 22 72 22 29 3b 0a 20 20 20 20 20 20 73  1, "r");.      s
2b1f0 43 74 78 2e 7a 46 69 6c 65 20 3d 20 22 3c 70 69  Ctx.zFile = "<pi
2b200 70 65 3e 22 3b 0a 20 20 20 20 20 20 78 43 6c 6f  pe>";.      xClo
2b210 73 65 72 20 3d 20 70 63 6c 6f 73 65 3b 0a 23 65  ser = pclose;.#e
2b220 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ndif.    }else{.
2b230 20 20 20 20 20 20 73 43 74 78 2e 69 6e 20 3d 20        sCtx.in = 
2b240 66 6f 70 65 6e 28 73 43 74 78 2e 7a 46 69 6c 65  fopen(sCtx.zFile
2b250 2c 20 22 72 62 22 29 3b 0a 20 20 20 20 20 20 78  , "rb");.      x
2b260 43 6c 6f 73 65 72 20 3d 20 66 63 6c 6f 73 65 3b  Closer = fclose;
2b270 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
2b280 2d 3e 6d 6f 64 65 3d 3d 4d 4f 44 45 5f 41 73 63  ->mode==MODE_Asc
2b290 69 69 20 29 7b 0a 20 20 20 20 20 20 78 52 65 61  ii ){.      xRea
2b2a0 64 20 3d 20 61 73 63 69 69 5f 72 65 61 64 5f 6f  d = ascii_read_o
2b2b0 6e 65 5f 66 69 65 6c 64 3b 0a 20 20 20 20 7d 65  ne_field;.    }e
2b2c0 6c 73 65 7b 0a 20 20 20 20 20 20 78 52 65 61 64  lse{.      xRead
2b2d0 20 3d 20 63 73 76 5f 72 65 61 64 5f 6f 6e 65 5f   = csv_read_one_
2b2e0 66 69 65 6c 64 3b 0a 20 20 20 20 7d 0a 20 20 20  field;.    }.   
2b2f0 20 69 66 28 20 73 43 74 78 2e 69 6e 3d 3d 30 20   if( sCtx.in==0 
2b300 29 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72  ){.      utf8_pr
2b310 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72  intf(stderr, "Er
2b320 72 6f 72 3a 20 63 61 6e 6e 6f 74 20 6f 70 65 6e  ror: cannot open
2b330 20 5c 22 25 73 5c 22 5c 6e 22 2c 20 7a 46 69 6c   \"%s\"\n", zFil
2b340 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  e);.      return
2b350 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 43   1;.    }.    sC
2b360 74 78 2e 63 43 6f 6c 53 65 70 20 3d 20 70 2d 3e  tx.cColSep = p->
2b370 63 6f 6c 53 65 70 61 72 61 74 6f 72 5b 30 5d 3b  colSeparator[0];
2b380 0a 20 20 20 20 73 43 74 78 2e 63 52 6f 77 53 65  .    sCtx.cRowSe
2b390 70 20 3d 20 70 2d 3e 72 6f 77 53 65 70 61 72 61  p = p->rowSepara
2b3a0 74 6f 72 5b 30 5d 3b 0a 20 20 20 20 7a 53 71 6c  tor[0];.    zSql
2b3b0 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
2b3c0 74 66 28 22 53 45 4c 45 43 54 20 2a 20 46 52 4f  tf("SELECT * FRO
2b3d0 4d 20 25 73 22 2c 20 7a 54 61 62 6c 65 29 3b 0a  M %s", zTable);.
2b3e0 20 20 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20      if( zSql==0 
2b3f0 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69  ){.      raw_pri
2b400 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72  ntf(stderr, "Err
2b410 6f 72 3a 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72  or: out of memor
2b420 79 5c 6e 22 29 3b 0a 20 20 20 20 20 20 78 43 6c  y\n");.      xCl
2b430 6f 73 65 72 28 73 43 74 78 2e 69 6e 29 3b 0a 20  oser(sCtx.in);. 
2b440 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
2b450 20 20 20 7d 0a 20 20 20 20 6e 42 79 74 65 20 3d     }.    nByte =
2b460 20 73 74 72 6c 65 6e 33 30 28 7a 53 71 6c 29 3b   strlen30(zSql);
2b470 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
2b480 33 5f 70 72 65 70 61 72 65 5f 76 32 28 70 2d 3e  3_prepare_v2(p->
2b490 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70  db, zSql, -1, &p
2b4a0 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 69 6d  Stmt, 0);.    im
2b4b0 70 6f 72 74 5f 61 70 70 65 6e 64 5f 63 68 61 72  port_append_char
2b4c0 28 26 73 43 74 78 2c 20 30 29 3b 20 20 20 20 2f  (&sCtx, 0);    /
2b4d0 2a 20 54 6f 20 65 6e 73 75 72 65 20 73 43 74 78  * To ensure sCtx
2b4e0 2e 7a 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20  .z is allocated 
2b4f0 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 20 26 26  */.    if( rc &&
2b500 20 73 71 6c 69 74 65 33 5f 73 74 72 67 6c 6f 62   sqlite3_strglob
2b510 28 22 6e 6f 20 73 75 63 68 20 74 61 62 6c 65 3a  ("no such table:
2b520 20 2a 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72   *", sqlite3_err
2b530 6d 73 67 28 70 2d 3e 64 62 29 29 3d 3d 30 20 29  msg(p->db))==0 )
2b540 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 43  {.      char *zC
2b550 72 65 61 74 65 20 3d 20 73 71 6c 69 74 65 33 5f  reate = sqlite3_
2b560 6d 70 72 69 6e 74 66 28 22 43 52 45 41 54 45 20  mprintf("CREATE 
2b570 54 41 42 4c 45 20 25 73 22 2c 20 7a 54 61 62 6c  TABLE %s", zTabl
2b580 65 29 3b 0a 20 20 20 20 20 20 63 68 61 72 20 63  e);.      char c
2b590 53 65 70 20 3d 20 27 28 27 3b 0a 20 20 20 20 20  Sep = '(';.     
2b5a0 20 77 68 69 6c 65 28 20 78 52 65 61 64 28 26 73   while( xRead(&s
2b5b0 43 74 78 29 20 29 7b 0a 20 20 20 20 20 20 20 20  Ctx) ){.        
2b5c0 7a 43 72 65 61 74 65 20 3d 20 73 71 6c 69 74 65  zCreate = sqlite
2b5d0 33 5f 6d 70 72 69 6e 74 66 28 22 25 7a 25 63 5c  3_mprintf("%z%c\
2b5e0 6e 20 20 5c 22 25 77 5c 22 20 54 45 58 54 22 2c  n  \"%w\" TEXT",
2b5f0 20 7a 43 72 65 61 74 65 2c 20 63 53 65 70 2c 20   zCreate, cSep, 
2b600 73 43 74 78 2e 7a 29 3b 0a 20 20 20 20 20 20 20  sCtx.z);.       
2b610 20 63 53 65 70 20 3d 20 27 2c 27 3b 0a 20 20 20   cSep = ',';.   
2b620 20 20 20 20 20 69 66 28 20 73 43 74 78 2e 63 54       if( sCtx.cT
2b630 65 72 6d 21 3d 73 43 74 78 2e 63 43 6f 6c 53 65  erm!=sCtx.cColSe
2b640 70 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  p ) break;.     
2b650 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63 53 65   }.      if( cSe
2b660 70 3d 3d 27 28 27 20 29 7b 0a 20 20 20 20 20 20  p=='(' ){.      
2b670 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
2b680 43 72 65 61 74 65 29 3b 0a 20 20 20 20 20 20 20  Create);.       
2b690 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 73 43   sqlite3_free(sC
2b6a0 74 78 2e 7a 29 3b 0a 20 20 20 20 20 20 20 20 78  tx.z);.        x
2b6b0 43 6c 6f 73 65 72 28 73 43 74 78 2e 69 6e 29 3b  Closer(sCtx.in);
2b6c0 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72  .        utf8_pr
2b6d0 69 6e 74 66 28 73 74 64 65 72 72 2c 22 25 73 3a  intf(stderr,"%s:
2b6e0 20 65 6d 70 74 79 20 66 69 6c 65 5c 6e 22 2c 20   empty file\n", 
2b6f0 73 43 74 78 2e 7a 46 69 6c 65 29 3b 0a 20 20 20  sCtx.zFile);.   
2b700 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
2b710 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 43 72       }.      zCr
2b720 65 61 74 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d  eate = sqlite3_m
2b730 70 72 69 6e 74 66 28 22 25 7a 5c 6e 29 22 2c 20  printf("%z\n)", 
2b740 7a 43 72 65 61 74 65 29 3b 0a 20 20 20 20 20 20  zCreate);.      
2b750 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65  rc = sqlite3_exe
2b760 63 28 70 2d 3e 64 62 2c 20 7a 43 72 65 61 74 65  c(p->db, zCreate
2b770 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
2b780 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
2b790 43 72 65 61 74 65 29 3b 0a 20 20 20 20 20 20 69  Create);.      i
2b7a0 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
2b7b0 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64   utf8_printf(std
2b7c0 65 72 72 2c 20 22 43 52 45 41 54 45 20 54 41 42  err, "CREATE TAB
2b7d0 4c 45 20 25 73 28 2e 2e 2e 29 20 66 61 69 6c 65  LE %s(...) faile
2b7e0 64 3a 20 25 73 5c 6e 22 2c 20 7a 54 61 62 6c 65  d: %s\n", zTable
2b7f0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2b800 20 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67    sqlite3_errmsg
2b810 28 70 2d 3e 64 62 29 29 3b 0a 20 20 20 20 20 20  (p->db));.      
2b820 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 73    sqlite3_free(s
2b830 43 74 78 2e 7a 29 3b 0a 20 20 20 20 20 20 20 20  Ctx.z);.        
2b840 78 43 6c 6f 73 65 72 28 73 43 74 78 2e 69 6e 29  xCloser(sCtx.in)
2b850 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
2b860 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
2b870 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70    rc = sqlite3_p
2b880 72 65 70 61 72 65 5f 76 32 28 70 2d 3e 64 62 2c  repare_v2(p->db,
2b890 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d   zSql, -1, &pStm
2b8a0 74 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20  t, 0);.    }.   
2b8b0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53   sqlite3_free(zS
2b8c0 71 6c 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  ql);.    if( rc 
2b8d0 29 7b 0a 20 20 20 20 20 20 69 66 20 28 70 53 74  ){.      if (pSt
2b8e0 6d 74 29 20 73 71 6c 69 74 65 33 5f 66 69 6e 61  mt) sqlite3_fina
2b8f0 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20  lize(pStmt);.   
2b900 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73     utf8_printf(s
2b910 74 64 65 72 72 2c 22 45 72 72 6f 72 3a 20 25 73  tderr,"Error: %s
2b920 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72  \n", sqlite3_err
2b930 6d 73 67 28 70 2d 3e 64 62 29 29 3b 0a 20 20 20  msg(p->db));.   
2b940 20 20 20 78 43 6c 6f 73 65 72 28 73 43 74 78 2e     xCloser(sCtx.
2b950 69 6e 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  in);.      retur
2b960 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e  n 1;.    }.    n
2b970 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  Col = sqlite3_co
2b980 6c 75 6d 6e 5f 63 6f 75 6e 74 28 70 53 74 6d 74  lumn_count(pStmt
2b990 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
2b9a0 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a  inalize(pStmt);.
2b9b0 20 20 20 20 70 53 74 6d 74 20 3d 20 30 3b 0a 20      pStmt = 0;. 
2b9c0 20 20 20 69 66 28 20 6e 43 6f 6c 3d 3d 30 20 29     if( nCol==0 )
2b9d0 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20 6e 6f   return 0; /* no
2b9e0 20 63 6f 6c 75 6d 6e 73 2c 20 6e 6f 20 65 72 72   columns, no err
2b9f0 6f 72 20 2a 2f 0a 20 20 20 20 7a 53 71 6c 20 3d  or */.    zSql =
2ba00 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36   sqlite3_malloc6
2ba10 34 28 20 6e 42 79 74 65 2a 32 20 2b 20 32 30 20  4( nByte*2 + 20 
2ba20 2b 20 6e 43 6f 6c 2a 32 20 29 3b 0a 20 20 20 20  + nCol*2 );.    
2ba30 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29 7b 0a 20  if( zSql==0 ){. 
2ba40 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
2ba50 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20  stderr, "Error: 
2ba60 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 5c 6e 22  out of memory\n"
2ba70 29 3b 0a 20 20 20 20 20 20 78 43 6c 6f 73 65 72  );.      xCloser
2ba80 28 73 43 74 78 2e 69 6e 29 3b 0a 20 20 20 20 20  (sCtx.in);.     
2ba90 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
2baa0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
2bab0 72 69 6e 74 66 28 6e 42 79 74 65 2b 32 30 2c 20  rintf(nByte+20, 
2bac0 7a 53 71 6c 2c 20 22 49 4e 53 45 52 54 20 49 4e  zSql, "INSERT IN
2bad0 54 4f 20 5c 22 25 77 5c 22 20 56 41 4c 55 45 53  TO \"%w\" VALUES
2bae0 28 3f 22 2c 20 7a 54 61 62 6c 65 29 3b 0a 20 20  (?", zTable);.  
2baf0 20 20 6a 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a    j = strlen30(z
2bb00 53 71 6c 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  Sql);.    for(i=
2bb10 31 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b  1; i<nCol; i++){
2bb20 0a 20 20 20 20 20 20 7a 53 71 6c 5b 6a 2b 2b 5d  .      zSql[j++]
2bb30 20 3d 20 27 2c 27 3b 0a 20 20 20 20 20 20 7a 53   = ',';.      zS
2bb40 71 6c 5b 6a 2b 2b 5d 20 3d 20 27 3f 27 3b 0a 20  ql[j++] = '?';. 
2bb50 20 20 20 7d 0a 20 20 20 20 7a 53 71 6c 5b 6a 2b     }.    zSql[j+
2bb60 2b 5d 20 3d 20 27 29 27 3b 0a 20 20 20 20 7a 53  +] = ')';.    zS
2bb70 71 6c 5b 6a 5d 20 3d 20 30 3b 0a 20 20 20 20 72  ql[j] = 0;.    r
2bb80 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70  c = sqlite3_prep
2bb90 61 72 65 5f 76 32 28 70 2d 3e 64 62 2c 20 7a 53  are_v2(p->db, zS
2bba0 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20  ql, -1, &pStmt, 
2bbb0 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  0);.    sqlite3_
2bbc0 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20  free(zSql);.    
2bbd0 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
2bbe0 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65  utf8_printf(stde
2bbf0 72 72 2c 20 22 45 72 72 6f 72 3a 20 25 73 5c 6e  rr, "Error: %s\n
2bc00 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73  ", sqlite3_errms
2bc10 67 28 70 2d 3e 64 62 29 29 3b 0a 20 20 20 20 20  g(p->db));.     
2bc20 20 69 66 20 28 70 53 74 6d 74 29 20 73 71 6c 69   if (pStmt) sqli
2bc30 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74  te3_finalize(pSt
2bc40 6d 74 29 3b 0a 20 20 20 20 20 20 78 43 6c 6f 73  mt);.      xClos
2bc50 65 72 28 73 43 74 78 2e 69 6e 29 3b 0a 20 20 20  er(sCtx.in);.   
2bc60 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
2bc70 20 7d 0a 20 20 20 20 6e 65 65 64 43 6f 6d 6d 69   }.    needCommi
2bc80 74 20 3d 20 73 71 6c 69 74 65 33 5f 67 65 74 5f  t = sqlite3_get_
2bc90 61 75 74 6f 63 6f 6d 6d 69 74 28 70 2d 3e 64 62  autocommit(p->db
2bca0 29 3b 0a 20 20 20 20 69 66 28 20 6e 65 65 64 43  );.    if( needC
2bcb0 6f 6d 6d 69 74 20 29 20 73 71 6c 69 74 65 33 5f  ommit ) sqlite3_
2bcc0 65 78 65 63 28 70 2d 3e 64 62 2c 20 22 42 45 47  exec(p->db, "BEG
2bcd0 49 4e 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  IN", 0, 0, 0);. 
2bce0 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 69 6e 74     do{.      int
2bcf0 20 73 74 61 72 74 4c 69 6e 65 20 3d 20 73 43 74   startLine = sCt
2bd00 78 2e 6e 4c 69 6e 65 3b 0a 20 20 20 20 20 20 66  x.nLine;.      f
2bd10 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20  or(i=0; i<nCol; 
2bd20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 68  i++){.        ch
2bd30 61 72 20 2a 7a 20 3d 20 78 52 65 61 64 28 26 73  ar *z = xRead(&s
2bd40 43 74 78 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a  Ctx);.        /*
2bd50 0a 20 20 20 20 20 20 20 20 2a 2a 20 44 69 64 20  .        ** Did 
2bd60 77 65 20 72 65 61 63 68 20 65 6e 64 2d 6f 66 2d  we reach end-of-
2bd70 66 69 6c 65 20 62 65 66 6f 72 65 20 66 69 6e 64  file before find
2bd80 69 6e 67 20 61 6e 79 20 63 6f 6c 75 6d 6e 73 3f  ing any columns?
2bd90 0a 20 20 20 20 20 20 20 20 2a 2a 20 49 66 20 73  .        ** If s
2bda0 6f 2c 20 73 74 6f 70 20 69 6e 73 74 65 61 64 20  o, stop instead 
2bdb0 6f 66 20 4e 55 4c 4c 20 66 69 6c 6c 69 6e 67 20  of NULL filling 
2bdc0 74 68 65 20 72 65 6d 61 69 6e 69 6e 67 20 63 6f  the remaining co
2bdd0 6c 75 6d 6e 73 2e 0a 20 20 20 20 20 20 20 20 2a  lumns..        *
2bde0 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 3d  /.        if( z=
2bdf0 3d 30 20 26 26 20 69 3d 3d 30 20 29 20 62 72 65  =0 && i==0 ) bre
2be00 61 6b 3b 0a 20 20 20 20 20 20 20 20 2f 2a 0a 20  ak;.        /*. 
2be10 20 20 20 20 20 20 20 2a 2a 20 44 69 64 20 77 65         ** Did we
2be20 20 72 65 61 63 68 20 65 6e 64 2d 6f 66 2d 66 69   reach end-of-fi
2be30 6c 65 20 4f 52 20 65 6e 64 2d 6f 66 2d 6c 69 6e  le OR end-of-lin
2be40 65 20 62 65 66 6f 72 65 20 66 69 6e 64 69 6e 67  e before finding
2be50 20 61 6e 79 0a 20 20 20 20 20 20 20 20 2a 2a 20   any.        ** 
2be60 63 6f 6c 75 6d 6e 73 20 69 6e 20 41 53 43 49 49  columns in ASCII
2be70 20 6d 6f 64 65 3f 20 20 49 66 20 73 6f 2c 20 73   mode?  If so, s
2be80 74 6f 70 20 69 6e 73 74 65 61 64 20 6f 66 20 4e  top instead of N
2be90 55 4c 4c 20 66 69 6c 6c 69 6e 67 0a 20 20 20 20  ULL filling.    
2bea0 20 20 20 20 2a 2a 20 74 68 65 20 72 65 6d 61 69      ** the remai
2beb0 6e 69 6e 67 20 63 6f 6c 75 6d 6e 73 2e 0a 20 20  ning columns..  
2bec0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
2bed0 20 69 66 28 20 70 2d 3e 6d 6f 64 65 3d 3d 4d 4f   if( p->mode==MO
2bee0 44 45 5f 41 73 63 69 69 20 26 26 20 28 7a 3d 3d  DE_Ascii && (z==
2bef0 30 20 7c 7c 20 7a 5b 30 5d 3d 3d 30 29 20 26 26  0 || z[0]==0) &&
2bf00 20 69 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20   i==0 ) break;. 
2bf10 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62         sqlite3_b
2bf20 69 6e 64 5f 74 65 78 74 28 70 53 74 6d 74 2c 20  ind_text(pStmt, 
2bf30 69 2b 31 2c 20 7a 2c 20 2d 31 2c 20 53 51 4c 49  i+1, z, -1, SQLI
2bf40 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20  TE_TRANSIENT);. 
2bf50 20 20 20 20 20 20 20 69 66 28 20 69 3c 6e 43 6f         if( i<nCo
2bf60 6c 2d 31 20 26 26 20 73 43 74 78 2e 63 54 65 72  l-1 && sCtx.cTer
2bf70 6d 21 3d 73 43 74 78 2e 63 43 6f 6c 53 65 70 20  m!=sCtx.cColSep 
2bf80 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 74 66  ){.          utf
2bf90 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  8_printf(stderr,
2bfa0 20 22 25 73 3a 25 64 3a 20 65 78 70 65 63 74 65   "%s:%d: expecte
2bfb0 64 20 25 64 20 63 6f 6c 75 6d 6e 73 20 62 75 74  d %d columns but
2bfc0 20 66 6f 75 6e 64 20 25 64 20 2d 20 22 0a 20 20   found %d - ".  
2bfd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bfe0 20 20 20 20 20 20 20 20 22 66 69 6c 6c 69 6e 67          "filling
2bff0 20 74 68 65 20 72 65 73 74 20 77 69 74 68 20 4e   the rest with N
2c000 55 4c 4c 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  ULL\n",.        
2c010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c020 20 20 73 43 74 78 2e 7a 46 69 6c 65 2c 20 73 74    sCtx.zFile, st
2c030 61 72 74 4c 69 6e 65 2c 20 6e 43 6f 6c 2c 20 69  artLine, nCol, i
2c040 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  +1);.          i
2c050 20 2b 3d 20 32 3b 0a 20 20 20 20 20 20 20 20 20   += 2;.         
2c060 20 77 68 69 6c 65 28 20 69 3c 3d 6e 43 6f 6c 20   while( i<=nCol 
2c070 29 7b 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f  ){ sqlite3_bind_
2c080 6e 75 6c 6c 28 70 53 74 6d 74 2c 20 69 29 3b 20  null(pStmt, i); 
2c090 69 2b 2b 3b 20 7d 0a 20 20 20 20 20 20 20 20 7d  i++; }.        }
2c0a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
2c0b0 66 28 20 73 43 74 78 2e 63 54 65 72 6d 3d 3d 73  f( sCtx.cTerm==s
2c0c0 43 74 78 2e 63 43 6f 6c 53 65 70 20 29 7b 0a 20  Ctx.cColSep ){. 
2c0d0 20 20 20 20 20 20 20 64 6f 7b 0a 20 20 20 20 20         do{.     
2c0e0 20 20 20 20 20 78 52 65 61 64 28 26 73 43 74 78       xRead(&sCtx
2c0f0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 2b 2b  );.          i++
2c100 3b 0a 20 20 20 20 20 20 20 20 7d 77 68 69 6c 65  ;.        }while
2c110 28 20 73 43 74 78 2e 63 54 65 72 6d 3d 3d 73 43  ( sCtx.cTerm==sC
2c120 74 78 2e 63 43 6f 6c 53 65 70 20 29 3b 0a 20 20  tx.cColSep );.  
2c130 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
2c140 66 28 73 74 64 65 72 72 2c 20 22 25 73 3a 25 64  f(stderr, "%s:%d
2c150 3a 20 65 78 70 65 63 74 65 64 20 25 64 20 63 6f  : expected %d co
2c160 6c 75 6d 6e 73 20 62 75 74 20 66 6f 75 6e 64 20  lumns but found 
2c170 25 64 20 2d 20 22 0a 20 20 20 20 20 20 20 20 20  %d - ".         
2c180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
2c190 65 78 74 72 61 73 20 69 67 6e 6f 72 65 64 5c 6e  extras ignored\n
2c1a0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
2c1b0 20 20 20 20 20 20 20 20 20 20 20 73 43 74 78 2e             sCtx.
2c1c0 7a 46 69 6c 65 2c 20 73 74 61 72 74 4c 69 6e 65  zFile, startLine
2c1d0 2c 20 6e 43 6f 6c 2c 20 69 29 3b 0a 20 20 20 20  , nCol, i);.    
2c1e0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 3e    }.      if( i>
2c1f0 3d 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20  =nCol ){.       
2c200 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53   sqlite3_step(pS
2c210 74 6d 74 29 3b 0a 20 20 20 20 20 20 20 20 72 63  tmt);.        rc
2c220 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74   = sqlite3_reset
2c230 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 20  (pStmt);.       
2c240 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2c250 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
2c260 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65  utf8_printf(stde
2c270 72 72 2c 20 22 25 73 3a 25 64 3a 20 49 4e 53 45  rr, "%s:%d: INSE
2c280 52 54 20 66 61 69 6c 65 64 3a 20 25 73 5c 6e 22  RT failed: %s\n"
2c290 2c 20 73 43 74 78 2e 7a 46 69 6c 65 2c 0a 20 20  , sCtx.zFile,.  
2c2a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c2b0 20 20 20 20 73 74 61 72 74 4c 69 6e 65 2c 20 73      startLine, s
2c2c0 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 2d  qlite3_errmsg(p-
2c2d0 3e 64 62 29 29 3b 0a 20 20 20 20 20 20 20 20 7d  >db));.        }
2c2e0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 77 68  .      }.    }wh
2c2f0 69 6c 65 28 20 73 43 74 78 2e 63 54 65 72 6d 21  ile( sCtx.cTerm!
2c300 3d 45 4f 46 20 29 3b 0a 0a 20 20 20 20 78 43 6c  =EOF );..    xCl
2c310 6f 73 65 72 28 73 43 74 78 2e 69 6e 29 3b 0a 20  oser(sCtx.in);. 
2c320 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
2c330 73 43 74 78 2e 7a 29 3b 0a 20 20 20 20 73 71 6c  sCtx.z);.    sql
2c340 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53  ite3_finalize(pS
2c350 74 6d 74 29 3b 0a 20 20 20 20 69 66 28 20 6e 65  tmt);.    if( ne
2c360 65 64 43 6f 6d 6d 69 74 20 29 20 73 71 6c 69 74  edCommit ) sqlit
2c370 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20 22  e3_exec(p->db, "
2c380 43 4f 4d 4d 49 54 22 2c 20 30 2c 20 30 2c 20 30  COMMIT", 0, 0, 0
2c390 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a 23 69 66 6e  );.  }else..#ifn
2c3a0 64 65 66 20 53 51 4c 49 54 45 5f 55 4e 54 45 53  def SQLITE_UNTES
2c3b0 54 41 42 4c 45 0a 20 20 69 66 28 20 63 3d 3d 27  TABLE.  if( c=='
2c3c0 69 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a  i' && strncmp(az
2c3d0 41 72 67 5b 30 5d 2c 20 22 69 6d 70 6f 73 74 65  Arg[0], "imposte
2c3e0 72 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20  r", n)==0 ){.   
2c3f0 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 20   char *zSql;.   
2c400 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 69 73 74 20   char *zCollist 
2c410 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  = 0;.    sqlite3
2c420 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20  _stmt *pStmt;.  
2c430 20 20 69 6e 74 20 74 6e 75 6d 20 3d 20 30 3b 0a    int tnum = 0;.
2c440 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69      int i;.    i
2c450 66 28 20 6e 41 72 67 21 3d 33 20 29 7b 0a 20 20  f( nArg!=3 ){.  
2c460 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
2c470 73 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20  stderr, "Usage: 
2c480 2e 69 6d 70 6f 73 74 65 72 20 49 4e 44 45 58 20  .imposter INDEX 
2c490 49 4d 50 4f 53 54 45 52 5c 6e 22 29 3b 0a 20 20  IMPOSTER\n");.  
2c4a0 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
2c4b0 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d    goto meta_comm
2c4c0 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a  and_exit;.    }.
2c4d0 20 20 20 20 6f 70 65 6e 5f 64 62 28 70 2c 20 30      open_db(p, 0
2c4e0 29 3b 0a 20 20 20 20 7a 53 71 6c 20 3d 20 73 71  );.    zSql = sq
2c4f0 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 53  lite3_mprintf("S
2c500 45 4c 45 43 54 20 72 6f 6f 74 70 61 67 65 20 46  ELECT rootpage F
2c510 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  ROM sqlite_maste
2c520 72 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r".             
2c530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20                " 
2c540 57 48 45 52 45 20 6e 61 6d 65 3d 27 25 71 27 20  WHERE name='%q' 
2c550 41 4e 44 20 74 79 70 65 3d 27 69 6e 64 65 78 27  AND type='index'
2c560 22 2c 20 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20  ", azArg[1]);.  
2c570 20 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72    sqlite3_prepar
2c580 65 5f 76 32 28 70 2d 3e 64 62 2c 20 7a 53 71 6c  e_v2(p->db, zSql
2c590 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29  , -1, &pStmt, 0)
2c5a0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
2c5b0 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20 69 66  ee(zSql);.    if
2c5c0 28 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70  ( sqlite3_step(p
2c5d0 53 74 6d 74 29 3d 3d 53 51 4c 49 54 45 5f 52 4f  Stmt)==SQLITE_RO
2c5e0 57 20 29 7b 0a 20 20 20 20 20 20 74 6e 75 6d 20  W ){.      tnum 
2c5f0 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
2c600 5f 69 6e 74 28 70 53 74 6d 74 2c 20 30 29 3b 0a  _int(pStmt, 0);.
2c610 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
2c620 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74  3_finalize(pStmt
2c630 29 3b 0a 20 20 20 20 69 66 28 20 74 6e 75 6d 3d  );.    if( tnum=
2c640 3d 30 20 29 7b 0a 20 20 20 20 20 20 75 74 66 38  =0 ){.      utf8
2c650 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
2c660 22 6e 6f 20 73 75 63 68 20 69 6e 64 65 78 3a 20  "no such index: 
2c670 5c 22 25 73 5c 22 5c 6e 22 2c 20 61 7a 41 72 67  \"%s\"\n", azArg
2c680 5b 31 5d 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  [1]);.      rc =
2c690 20 31 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d   1;.      goto m
2c6a0 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74  eta_command_exit
2c6b0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 53 71 6c  ;.    }.    zSql
2c6c0 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
2c6d0 74 66 28 22 50 52 41 47 4d 41 20 69 6e 64 65 78  tf("PRAGMA index
2c6e0 5f 78 69 6e 66 6f 3d 27 25 71 27 22 2c 20 61 7a  _xinfo='%q'", az
2c6f0 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20 72 63 20  Arg[1]);.    rc 
2c700 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72  = sqlite3_prepar
2c710 65 5f 76 32 28 70 2d 3e 64 62 2c 20 7a 53 71 6c  e_v2(p->db, zSql
2c720 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29  , -1, &pStmt, 0)
2c730 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
2c740 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20 69 20  ee(zSql);.    i 
2c750 3d 20 30 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  = 0;.    while( 
2c760 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74  sqlite3_step(pSt
2c770 6d 74 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20  mt)==SQLITE_ROW 
2c780 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 7a 4c  ){.      char zL
2c790 61 62 65 6c 5b 32 30 5d 3b 0a 20 20 20 20 20 20  abel[20];.      
2c7a0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c  const char *zCol
2c7b0 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29   = (const char*)
2c7c0 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
2c7d0 65 78 74 28 70 53 74 6d 74 2c 32 29 3b 0a 20 20  ext(pStmt,2);.  
2c7e0 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20 69      i++;.      i
2c7f0 66 28 20 7a 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20  f( zCol==0 ){.  
2c800 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
2c810 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 74  3_column_int(pSt
2c820 6d 74 2c 31 29 3d 3d 2d 31 20 29 7b 0a 20 20 20  mt,1)==-1 ){.   
2c830 20 20 20 20 20 20 20 7a 43 6f 6c 20 3d 20 22 5f         zCol = "_
2c840 52 4f 57 49 44 5f 22 3b 0a 20 20 20 20 20 20 20  ROWID_";.       
2c850 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2c860 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
2c870 74 66 28 73 69 7a 65 6f 66 28 7a 4c 61 62 65 6c  tf(sizeof(zLabel
2c880 29 2c 7a 4c 61 62 65 6c 2c 22 65 78 70 72 25 64  ),zLabel,"expr%d
2c890 22 2c 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ",i);.          
2c8a0 7a 43 6f 6c 20 3d 20 7a 4c 61 62 65 6c 3b 0a 20  zCol = zLabel;. 
2c8b0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
2c8c0 0a 20 20 20 20 20 20 69 66 28 20 7a 43 6f 6c 6c  .      if( zColl
2c8d0 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ist==0 ){.      
2c8e0 20 20 7a 43 6f 6c 6c 69 73 74 20 3d 20 73 71 6c    zCollist = sql
2c8f0 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 5c 22  ite3_mprintf("\"
2c900 25 77 5c 22 22 2c 20 7a 43 6f 6c 29 3b 0a 20 20  %w\"", zCol);.  
2c910 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2c920 20 20 20 7a 43 6f 6c 6c 69 73 74 20 3d 20 73 71     zCollist = sq
2c930 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25  lite3_mprintf("%
2c940 7a 2c 5c 22 25 77 5c 22 22 2c 20 7a 43 6f 6c 6c  z,\"%w\"", zColl
2c950 69 73 74 2c 20 7a 43 6f 6c 29 3b 0a 20 20 20 20  ist, zCol);.    
2c960 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71    }.    }.    sq
2c970 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
2c980 53 74 6d 74 29 3b 0a 20 20 20 20 7a 53 71 6c 20  Stmt);.    zSql 
2c990 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
2c9a0 66 28 0a 20 20 20 20 20 20 20 20 20 20 22 43 52  f(.          "CR
2c9b0 45 41 54 45 20 54 41 42 4c 45 20 5c 22 25 77 5c  EATE TABLE \"%w\
2c9c0 22 28 25 73 2c 50 52 49 4d 41 52 59 20 4b 45 59  "(%s,PRIMARY KEY
2c9d0 28 25 73 29 29 57 49 54 48 4f 55 54 20 52 4f 57  (%s))WITHOUT ROW
2c9e0 49 44 22 2c 0a 20 20 20 20 20 20 20 20 20 20 61  ID",.          a
2c9f0 7a 41 72 67 5b 32 5d 2c 20 7a 43 6f 6c 6c 69 73  zArg[2], zCollis
2ca00 74 2c 20 7a 43 6f 6c 6c 69 73 74 29 3b 0a 20 20  t, zCollist);.  
2ca10 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
2ca20 43 6f 6c 6c 69 73 74 29 3b 0a 20 20 20 20 72 63  Collist);.    rc
2ca30 20 3d 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f   = sqlite3_test_
2ca40 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54  control(SQLITE_T
2ca50 45 53 54 43 54 52 4c 5f 49 4d 50 4f 53 54 45 52  ESTCTRL_IMPOSTER
2ca60 2c 20 70 2d 3e 64 62 2c 20 22 6d 61 69 6e 22 2c  , p->db, "main",
2ca70 20 31 2c 20 74 6e 75 6d 29 3b 0a 20 20 20 20 69   1, tnum);.    i
2ca80 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2ca90 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
2caa0 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64  qlite3_exec(p->d
2cab0 62 2c 20 7a 53 71 6c 2c 20 30 2c 20 30 2c 20 30  b, zSql, 0, 0, 0
2cac0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
2cad0 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51  _test_control(SQ
2cae0 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 49 4d  LITE_TESTCTRL_IM
2caf0 50 4f 53 54 45 52 2c 20 70 2d 3e 64 62 2c 20 22  POSTER, p->db, "
2cb00 6d 61 69 6e 22 2c 20 30 2c 20 30 29 3b 0a 20 20  main", 0, 0);.  
2cb10 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
2cb20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
2cb30 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72  f(stderr, "Error
2cb40 20 69 6e 20 5b 25 73 5d 3a 20 25 73 5c 6e 22 2c   in [%s]: %s\n",
2cb50 20 7a 53 71 6c 2c 20 73 71 6c 69 74 65 33 5f 65   zSql, sqlite3_e
2cb60 72 72 6d 73 67 28 70 2d 3e 64 62 29 29 3b 0a 20  rrmsg(p->db));. 
2cb70 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2cb80 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
2cb90 73 74 64 6f 75 74 2c 20 22 25 73 3b 5c 6e 22 2c  stdout, "%s;\n",
2cba0 20 7a 53 71 6c 29 3b 0a 20 20 20 20 20 20 20 20   zSql);.        
2cbb0 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 6f 75  raw_printf(stdou
2cbc0 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 22 57  t,.           "W
2cbd0 41 52 4e 49 4e 47 3a 20 77 72 69 74 69 6e 67 20  ARNING: writing 
2cbe0 74 6f 20 61 6e 20 69 6d 70 6f 73 74 65 72 20 74  to an imposter t
2cbf0 61 62 6c 65 20 77 69 6c 6c 20 63 6f 72 72 75 70  able will corrup
2cc00 74 20 74 68 65 20 69 6e 64 65 78 21 5c 6e 22 0a  t the index!\n".
2cc10 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
2cc20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
2cc30 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73      raw_printf(s
2cc40 74 64 65 72 72 2c 20 22 53 51 4c 49 54 45 5f 54  tderr, "SQLITE_T
2cc50 45 53 54 43 54 52 4c 5f 49 4d 50 4f 53 54 45 52  ESTCTRL_IMPOSTER
2cc60 20 72 65 74 75 72 6e 73 20 25 64 5c 6e 22 2c 20   returns %d\n", 
2cc70 72 63 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  rc);.      rc = 
2cc80 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  1;.    }.    sql
2cc90 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b  ite3_free(zSql);
2cca0 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 20  .  }else.#endif 
2ccb0 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  /* !defined(SQLI
2ccc0 54 45 5f 4f 4d 49 54 5f 54 45 53 54 5f 43 4f 4e  TE_OMIT_TEST_CON
2ccd0 54 52 4f 4c 29 20 2a 2f 0a 0a 23 69 66 64 65 66  TROL) */..#ifdef
2cce0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49   SQLITE_ENABLE_I
2ccf0 4f 54 52 41 43 45 0a 20 20 69 66 28 20 63 3d 3d  OTRACE.  if( c==
2cd00 27 69 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61  'i' && strncmp(a
2cd10 7a 41 72 67 5b 30 5d 2c 20 22 69 6f 74 72 61 63  zArg[0], "iotrac
2cd20 65 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20  e", n)==0 ){.   
2cd30 20 53 51 4c 49 54 45 5f 41 50 49 20 65 78 74 65   SQLITE_API exte
2cd40 72 6e 20 76 6f 69 64 20 28 53 51 4c 49 54 45 5f  rn void (SQLITE_
2cd50 43 44 45 43 4c 20 2a 73 71 6c 69 74 65 33 49 6f  CDECL *sqlite3Io
2cd60 54 72 61 63 65 29 28 63 6f 6e 73 74 20 63 68 61  Trace)(const cha
2cd70 72 2a 2c 20 2e 2e 2e 29 3b 0a 20 20 20 20 69 66  r*, ...);.    if
2cd80 28 20 69 6f 74 72 61 63 65 20 26 26 20 69 6f 74  ( iotrace && iot
2cd90 72 61 63 65 21 3d 73 74 64 6f 75 74 20 29 20 66  race!=stdout ) f
2cda0 63 6c 6f 73 65 28 69 6f 74 72 61 63 65 29 3b 0a  close(iotrace);.
2cdb0 20 20 20 20 69 6f 74 72 61 63 65 20 3d 20 30 3b      iotrace = 0;
2cdc0 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3c 32 20  .    if( nArg<2 
2cdd0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
2cde0 49 6f 54 72 61 63 65 20 3d 20 30 3b 0a 20 20 20  IoTrace = 0;.   
2cdf0 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d   }else if( strcm
2ce00 70 28 61 7a 41 72 67 5b 31 5d 2c 20 22 2d 22 29  p(azArg[1], "-")
2ce10 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
2ce20 69 74 65 33 49 6f 54 72 61 63 65 20 3d 20 69 6f  ite3IoTrace = io
2ce30 74 72 61 63 65 50 72 69 6e 74 66 3b 0a 20 20 20  tracePrintf;.   
2ce40 20 20 20 69 6f 74 72 61 63 65 20 3d 20 73 74 64     iotrace = std
2ce50 6f 75 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  out;.    }else{.
2ce60 20 20 20 20 20 20 69 6f 74 72 61 63 65 20 3d 20        iotrace = 
2ce70 66 6f 70 65 6e 28 61 7a 41 72 67 5b 31 5d 2c 20  fopen(azArg[1], 
2ce80 22 77 22 29 3b 0a 20 20 20 20 20 20 69 66 28 20  "w");.      if( 
2ce90 69 6f 74 72 61 63 65 3d 3d 30 20 29 7b 0a 20 20  iotrace==0 ){.  
2cea0 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
2ceb0 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72  f(stderr, "Error
2cec0 3a 20 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 5c 22  : cannot open \"
2ced0 25 73 5c 22 5c 6e 22 2c 20 61 7a 41 72 67 5b 31  %s\"\n", azArg[1
2cee0 5d 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  ]);.        sqli
2cef0 74 65 33 49 6f 54 72 61 63 65 20 3d 20 30 3b 0a  te3IoTrace = 0;.
2cf00 20 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a          rc = 1;.
2cf10 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2cf20 20 20 20 20 20 73 71 6c 69 74 65 33 49 6f 54 72       sqlite3IoTr
2cf30 61 63 65 20 3d 20 69 6f 74 72 61 63 65 50 72 69  ace = iotracePri
2cf40 6e 74 66 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ntf;.      }.   
2cf50 20 7d 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69   }.  }else.#endi
2cf60 66 0a 0a 20 20 69 66 28 20 63 3d 3d 27 6c 27 20  f..  if( c=='l' 
2cf70 26 26 20 6e 3e 3d 35 20 26 26 20 73 74 72 6e 63  && n>=5 && strnc
2cf80 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 6c 69  mp(azArg[0], "li
2cf90 6d 69 74 73 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a  mits", n)==0 ){.
2cfa0 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
2cfb0 20 73 74 72 75 63 74 20 7b 0a 20 20 20 20 20 20   struct {.      
2cfc0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4c 69   const char *zLi
2cfd0 6d 69 74 4e 61 6d 65 3b 20 20 20 2f 2a 20 4e 61  mitName;   /* Na
2cfe0 6d 65 20 6f 66 20 61 20 6c 69 6d 69 74 20 2a 2f  me of a limit */
2cff0 0a 20 20 20 20 20 20 20 69 6e 74 20 6c 69 6d 69  .       int limi
2d000 74 43 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20  tCode;          
2d010 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 63 6f 64    /* Integer cod
2d020 65 20 66 6f 72 20 74 68 61 74 20 6c 69 6d 69 74  e for that limit
2d030 20 2a 2f 0a 20 20 20 20 7d 20 61 4c 69 6d 69 74   */.    } aLimit
2d040 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 7b 20 22  [] = {.      { "
2d050 6c 65 6e 67 74 68 22 2c 20 20 20 20 20 20 20 20  length",        
2d060 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4c          SQLITE_L
2d070 49 4d 49 54 5f 4c 45 4e 47 54 48 20 20 20 20 20  IMIT_LENGTH     
2d080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
2d090 2c 0a 20 20 20 20 20 20 7b 20 22 73 71 6c 5f 6c  ,.      { "sql_l
2d0a0 65 6e 67 74 68 22 2c 20 20 20 20 20 20 20 20 20  ength",         
2d0b0 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f     SQLITE_LIMIT_
2d0c0 53 51 4c 5f 4c 45 4e 47 54 48 20 20 20 20 20 20  SQL_LENGTH      
2d0d0 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
2d0e0 20 20 20 7b 20 22 63 6f 6c 75 6d 6e 22 2c 20 20     { "column",  
2d0f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
2d100 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d  LITE_LIMIT_COLUM
2d110 4e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  N               
2d120 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20       },.      { 
2d130 22 65 78 70 72 5f 64 65 70 74 68 22 2c 20 20 20  "expr_depth",   
2d140 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
2d150 4c 49 4d 49 54 5f 45 58 50 52 5f 44 45 50 54 48  LIMIT_EXPR_DEPTH
2d160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d170 7d 2c 0a 20 20 20 20 20 20 7b 20 22 63 6f 6d 70  },.      { "comp
2d180 6f 75 6e 64 5f 73 65 6c 65 63 74 22 2c 20 20 20  ound_select",   
2d190 20 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54      SQLITE_LIMIT
2d1a0 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54  _COMPOUND_SELECT
2d1b0 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
2d1c0 20 20 20 20 7b 20 22 76 64 62 65 5f 6f 70 22 2c      { "vdbe_op",
2d1d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
2d1e0 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 44 42 45  QLITE_LIMIT_VDBE
2d1f0 5f 4f 50 20 20 20 20 20 20 20 20 20 20 20 20 20  _OP             
2d200 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b        },.      {
2d210 20 22 66 75 6e 63 74 69 6f 6e 5f 61 72 67 22 2c   "function_arg",
2d220 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
2d230 5f 4c 49 4d 49 54 5f 46 55 4e 43 54 49 4f 4e 5f  _LIMIT_FUNCTION_
2d240 41 52 47 20 20 20 20 20 20 20 20 20 20 20 20 20  ARG             
2d250 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 61 74 74   },.      { "att
2d260 61 63 68 65 64 22 2c 20 20 20 20 20 20 20 20 20  ached",         
2d270 20 20 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49       SQLITE_LIMI
2d280 54 5f 41 54 54 41 43 48 45 44 20 20 20 20 20 20  T_ATTACHED      
2d290 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
2d2a0 20 20 20 20 20 7b 20 22 6c 69 6b 65 5f 70 61 74       { "like_pat
2d2b0 74 65 72 6e 5f 6c 65 6e 67 74 68 22 2c 20 20 20  tern_length",   
2d2c0 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 49 4b  SQLITE_LIMIT_LIK
2d2d0 45 5f 50 41 54 54 45 52 4e 5f 4c 45 4e 47 54 48  E_PATTERN_LENGTH
2d2e0 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20         },.      
2d2f0 7b 20 22 76 61 72 69 61 62 6c 65 5f 6e 75 6d 62  { "variable_numb
2d300 65 72 22 2c 20 20 20 20 20 20 20 53 51 4c 49 54  er",       SQLIT
2d310 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c 45  E_LIMIT_VARIABLE
2d320 5f 4e 55 4d 42 45 52 20 20 20 20 20 20 20 20 20  _NUMBER         
2d330 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 74 72    },.      { "tr
2d340 69 67 67 65 72 5f 64 65 70 74 68 22 2c 20 20 20  igger_depth",   
2d350 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d        SQLITE_LIM
2d360 49 54 5f 54 52 49 47 47 45 52 5f 44 45 50 54 48  IT_TRIGGER_DEPTH
2d370 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
2d380 20 20 20 20 20 20 7b 20 22 77 6f 72 6b 65 72 5f        { "worker_
2d390 74 68 72 65 61 64 73 22 2c 20 20 20 20 20 20 20  threads",       
2d3a0 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 57 4f   SQLITE_LIMIT_WO
2d3b0 52 4b 45 52 5f 54 48 52 45 41 44 53 20 20 20 20  RKER_THREADS    
2d3c0 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7d          },.    }
2d3d0 3b 0a 20 20 20 20 69 6e 74 20 69 2c 20 6e 32 3b  ;.    int i, n2;
2d3e0 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28 70 2c 20  .    open_db(p, 
2d3f0 30 29 3b 0a 20 20 20 20 69 66 28 20 6e 41 72 67  0);.    if( nArg
2d400 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 66 6f 72  ==1 ){.      for
2d410 28 69 3d 30 3b 20 69 3c 41 72 72 61 79 53 69 7a  (i=0; i<ArraySiz
2d420 65 28 61 4c 69 6d 69 74 29 3b 20 69 2b 2b 29 7b  e(aLimit); i++){
2d430 0a 20 20 20 20 20 20 20 20 70 72 69 6e 74 66 28  .        printf(
2d440 22 25 32 30 73 20 25 64 5c 6e 22 2c 20 61 4c 69  "%20s %d\n", aLi
2d450 6d 69 74 5b 69 5d 2e 7a 4c 69 6d 69 74 4e 61 6d  mit[i].zLimitNam
2d460 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
2d470 20 20 73 71 6c 69 74 65 33 5f 6c 69 6d 69 74 28    sqlite3_limit(
2d480 70 2d 3e 64 62 2c 20 61 4c 69 6d 69 74 5b 69 5d  p->db, aLimit[i]
2d490 2e 6c 69 6d 69 74 43 6f 64 65 2c 20 2d 31 29 29  .limitCode, -1))
2d4a0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
2d4b0 6c 73 65 20 69 66 28 20 6e 41 72 67 3e 33 20 29  lse if( nArg>3 )
2d4c0 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e  {.      raw_prin
2d4d0 74 66 28 73 74 64 65 72 72 2c 20 22 55 73 61 67  tf(stderr, "Usag
2d4e0 65 3a 20 2e 6c 69 6d 69 74 20 4e 41 4d 45 20 3f  e: .limit NAME ?
2d4f0 4e 45 57 2d 56 41 4c 55 45 3f 5c 6e 22 29 3b 0a  NEW-VALUE?\n");.
2d500 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
2d510 20 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f      goto meta_co
2d520 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20  mmand_exit;.    
2d530 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74  }else{.      int
2d540 20 69 4c 69 6d 69 74 20 3d 20 2d 31 3b 0a 20 20   iLimit = -1;.  
2d550 20 20 20 20 6e 32 20 3d 20 73 74 72 6c 65 6e 33      n2 = strlen3
2d560 30 28 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20  0(azArg[1]);.   
2d570 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 41 72     for(i=0; i<Ar
2d580 72 61 79 53 69 7a 65 28 61 4c 69 6d 69 74 29 3b  raySize(aLimit);
2d590 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   i++){.        i
2d5a0 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72 6e 69  f( sqlite3_strni
2d5b0 63 6d 70 28 61 4c 69 6d 69 74 5b 69 5d 2e 7a 4c  cmp(aLimit[i].zL
2d5c0 69 6d 69 74 4e 61 6d 65 2c 20 61 7a 41 72 67 5b  imitName, azArg[
2d5d0 31 5d 2c 20 6e 32 29 3d 3d 30 20 29 7b 0a 20 20  1], n2)==0 ){.  
2d5e0 20 20 20 20 20 20 20 20 69 66 28 20 69 4c 69 6d          if( iLim
2d5f0 69 74 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20  it<0 ){.        
2d600 20 20 20 20 69 4c 69 6d 69 74 20 3d 20 69 3b 0a      iLimit = i;.
2d610 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
2d620 0a 20 20 20 20 20 20 20 20 20 20 20 20 75 74 66  .            utf
2d630 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  8_printf(stderr,
2d640 20 22 61 6d 62 69 67 75 6f 75 73 20 6c 69 6d 69   "ambiguous limi
2d650 74 3a 20 5c 22 25 73 5c 22 5c 6e 22 2c 20 61 7a  t: \"%s\"\n", az
2d660 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20 20 20 20  Arg[1]);.       
2d670 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20       rc = 1;.   
2d680 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 65           goto me
2d690 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b  ta_command_exit;
2d6a0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2d6b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
2d6c0 20 20 20 20 20 69 66 28 20 69 4c 69 6d 69 74 3c       if( iLimit<
2d6d0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66  0 ){.        utf
2d6e0 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  8_printf(stderr,
2d6f0 20 22 75 6e 6b 6e 6f 77 6e 20 6c 69 6d 69 74 3a   "unknown limit:
2d700 20 5c 22 25 73 5c 22 5c 6e 22 0a 20 20 20 20 20   \"%s\"\n".     
2d710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d720 20 20 20 22 65 6e 74 65 72 20 5c 22 2e 6c 69 6d     "enter \".lim
2d730 69 74 73 5c 22 20 77 69 74 68 20 6e 6f 20 61 72  its\" with no ar
2d740 67 75 6d 65 6e 74 73 20 66 6f 72 20 61 20 6c 69  guments for a li
2d750 73 74 2e 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  st.\n",.        
2d760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d770 20 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20   azArg[1]);.    
2d780 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
2d790 20 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f      goto meta_co
2d7a0 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20  mmand_exit;.    
2d7b0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6e 41    }.      if( nA
2d7c0 72 67 3d 3d 33 20 29 7b 0a 20 20 20 20 20 20 20  rg==3 ){.       
2d7d0 20 73 71 6c 69 74 65 33 5f 6c 69 6d 69 74 28 70   sqlite3_limit(p
2d7e0 2d 3e 64 62 2c 20 61 4c 69 6d 69 74 5b 69 4c 69  ->db, aLimit[iLi
2d7f0 6d 69 74 5d 2e 6c 69 6d 69 74 43 6f 64 65 2c 0a  mit].limitCode,.
2d800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d810 20 20 20 20 20 20 28 69 6e 74 29 69 6e 74 65 67        (int)integ
2d820 65 72 56 61 6c 75 65 28 61 7a 41 72 67 5b 32 5d  erValue(azArg[2]
2d830 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ));.      }.    
2d840 20 20 70 72 69 6e 74 66 28 22 25 32 30 73 20 25    printf("%20s %
2d850 64 5c 6e 22 2c 20 61 4c 69 6d 69 74 5b 69 4c 69  d\n", aLimit[iLi
2d860 6d 69 74 5d 2e 7a 4c 69 6d 69 74 4e 61 6d 65 2c  mit].zLimitName,
2d870 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71  .             sq
2d880 6c 69 74 65 33 5f 6c 69 6d 69 74 28 70 2d 3e 64  lite3_limit(p->d
2d890 62 2c 20 61 4c 69 6d 69 74 5b 69 4c 69 6d 69 74  b, aLimit[iLimit
2d8a0 5d 2e 6c 69 6d 69 74 43 6f 64 65 2c 20 2d 31 29  ].limitCode, -1)
2d8b0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  );.    }.  }else
2d8c0 0a 0a 20 20 69 66 28 20 63 3d 3d 27 6c 27 20 26  ..  if( c=='l' &
2d8d0 26 20 6e 3e 32 20 26 26 20 73 74 72 6e 63 6d 70  & n>2 && strncmp
2d8e0 28 61 7a 41 72 67 5b 30 5d 2c 20 22 6c 69 6e 74  (azArg[0], "lint
2d8f0 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ", n)==0 ){.    
2d900 6f 70 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a 20  open_db(p, 0);. 
2d910 20 20 20 6c 69 6e 74 44 6f 74 43 6f 6d 6d 61 6e     lintDotComman
2d920 64 28 70 2c 20 61 7a 41 72 67 2c 20 6e 41 72 67  d(p, azArg, nArg
2d930 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a 23 69 66 6e  );.  }else..#ifn
2d940 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
2d950 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 0a 20  LOAD_EXTENSION. 
2d960 20 69 66 28 20 63 3d 3d 27 6c 27 20 26 26 20 73   if( c=='l' && s
2d970 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c  trncmp(azArg[0],
2d980 20 22 6c 6f 61 64 22 2c 20 6e 29 3d 3d 30 20 29   "load", n)==0 )
2d990 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  {.    const char
2d9a0 20 2a 7a 46 69 6c 65 2c 20 2a 7a 50 72 6f 63 3b   *zFile, *zProc;
2d9b0 0a 20 20 20 20 63 68 61 72 20 2a 7a 45 72 72 4d  .    char *zErrM
2d9c0 73 67 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  sg = 0;.    if( 
2d9d0 6e 41 72 67 3c 32 20 29 7b 0a 20 20 20 20 20 20  nArg<2 ){.      
2d9e0 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72  raw_printf(stder
2d9f0 72 2c 20 22 55 73 61 67 65 3a 20 2e 6c 6f 61 64  r, "Usage: .load
2da00 20 46 49 4c 45 20 3f 45 4e 54 52 59 50 4f 49 4e   FILE ?ENTRYPOIN
2da10 54 3f 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 63  T?\n");.      rc
2da20 20 3d 20 31 3b 0a 20 20 20 20 20 20 67 6f 74 6f   = 1;.      goto
2da30 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78   meta_command_ex
2da40 69 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 46  it;.    }.    zF
2da50 69 6c 65 20 3d 20 61 7a 41 72 67 5b 31 5d 3b 0a  ile = azArg[1];.
2da60 20 20 20 20 7a 50 72 6f 63 20 3d 20 6e 41 72 67      zProc = nArg
2da70 3e 3d 33 20 3f 20 61 7a 41 72 67 5b 32 5d 20 3a  >=3 ? azArg[2] :
2da80 20 30 3b 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28   0;.    open_db(
2da90 70 2c 20 30 29 3b 0a 20 20 20 20 72 63 20 3d 20  p, 0);.    rc = 
2daa0 73 71 6c 69 74 65 33 5f 6c 6f 61 64 5f 65 78 74  sqlite3_load_ext
2dab0 65 6e 73 69 6f 6e 28 70 2d 3e 64 62 2c 20 7a 46  ension(p->db, zF
2dac0 69 6c 65 2c 20 7a 50 72 6f 63 2c 20 26 7a 45 72  ile, zProc, &zEr
2dad0 72 4d 73 67 29 3b 0a 20 20 20 20 69 66 28 20 72  rMsg);.    if( r
2dae0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2daf0 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
2db00 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72  f(stderr, "Error
2db10 3a 20 25 73 5c 6e 22 2c 20 7a 45 72 72 4d 73 67  : %s\n", zErrMsg
2db20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
2db30 5f 66 72 65 65 28 7a 45 72 72 4d 73 67 29 3b 0a  _free(zErrMsg);.
2db40 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
2db50 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64    }.  }else.#end
2db60 69 66 0a 0a 20 20 69 66 28 20 63 3d 3d 27 6c 27  if..  if( c=='l'
2db70 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72   && strncmp(azAr
2db80 67 5b 30 5d 2c 20 22 6c 6f 67 22 2c 20 6e 29 3d  g[0], "log", n)=
2db90 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 41  =0 ){.    if( nA
2dba0 72 67 21 3d 32 20 29 7b 0a 20 20 20 20 20 20 72  rg!=2 ){.      r
2dbb0 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  aw_printf(stderr
2dbc0 2c 20 22 55 73 61 67 65 3a 20 2e 6c 6f 67 20 46  , "Usage: .log F
2dbd0 49 4c 45 4e 41 4d 45 5c 6e 22 29 3b 0a 20 20 20  ILENAME\n");.   
2dbe0 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d     rc = 1;.    }
2dbf0 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 6f 6e 73  else{.      cons
2dc00 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 20 3d 20  t char *zFile = 
2dc10 61 7a 41 72 67 5b 31 5d 3b 0a 20 20 20 20 20 20  azArg[1];.      
2dc20 6f 75 74 70 75 74 5f 66 69 6c 65 5f 63 6c 6f 73  output_file_clos
2dc30 65 28 70 2d 3e 70 4c 6f 67 29 3b 0a 20 20 20 20  e(p->pLog);.    
2dc40 20 20 70 2d 3e 70 4c 6f 67 20 3d 20 6f 75 74 70    p->pLog = outp
2dc50 75 74 5f 66 69 6c 65 5f 6f 70 65 6e 28 7a 46 69  ut_file_open(zFi
2dc60 6c 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  le);.    }.  }el
2dc70 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 6d 27  se..  if( c=='m'
2dc80 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72   && strncmp(azAr
2dc90 67 5b 30 5d 2c 20 22 6d 6f 64 65 22 2c 20 6e 29  g[0], "mode", n)
2dca0 3d 3d 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74  ==0 ){.    const
2dcb0 20 63 68 61 72 20 2a 7a 4d 6f 64 65 20 3d 20 6e   char *zMode = n
2dcc0 41 72 67 3e 3d 32 20 3f 20 61 7a 41 72 67 5b 31  Arg>=2 ? azArg[1
2dcd0 5d 20 3a 20 22 22 3b 0a 20 20 20 20 69 6e 74 20  ] : "";.    int 
2dce0 6e 32 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a 4d  n2 = strlen30(zM
2dcf0 6f 64 65 29 3b 0a 20 20 20 20 69 6e 74 20 63 32  ode);.    int c2
2dd00 20 3d 20 7a 4d 6f 64 65 5b 30 5d 3b 0a 20 20 20   = zMode[0];.   
2dd10 20 69 66 28 20 63 32 3d 3d 27 6c 27 20 26 26 20   if( c2=='l' && 
2dd20 6e 32 3e 32 20 26 26 20 73 74 72 6e 63 6d 70 28  n2>2 && strncmp(
2dd30 61 7a 41 72 67 5b 31 5d 2c 22 6c 69 6e 65 73 22  azArg[1],"lines"
2dd40 2c 6e 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ,n2)==0 ){.     
2dd50 20 70 2d 3e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f   p->mode = MODE_
2dd60 4c 69 6e 65 3b 0a 20 20 20 20 20 20 73 71 6c 69  Line;.      sqli
2dd70 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
2dd80 65 6f 66 28 70 2d 3e 72 6f 77 53 65 70 61 72 61  eof(p->rowSepara
2dd90 74 6f 72 29 2c 20 70 2d 3e 72 6f 77 53 65 70 61  tor), p->rowSepa
2dda0 72 61 74 6f 72 2c 20 53 45 50 5f 52 6f 77 29 3b  rator, SEP_Row);
2ddb0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63  .    }else if( c
2ddc0 32 3d 3d 27 63 27 20 26 26 20 73 74 72 6e 63 6d  2=='c' && strncm
2ddd0 70 28 61 7a 41 72 67 5b 31 5d 2c 22 63 6f 6c 75  p(azArg[1],"colu
2dde0 6d 6e 73 22 2c 6e 32 29 3d 3d 30 20 29 7b 0a 20  mns",n2)==0 ){. 
2ddf0 20 20 20 20 20 70 2d 3e 6d 6f 64 65 20 3d 20 4d       p->mode = M
2de00 4f 44 45 5f 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  ODE_Column;.    
2de10 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
2de20 74 66 28 73 69 7a 65 6f 66 28 70 2d 3e 72 6f 77  tf(sizeof(p->row
2de30 53 65 70 61 72 61 74 6f 72 29 2c 20 70 2d 3e 72  Separator), p->r
2de40 6f 77 53 65 70 61 72 61 74 6f 72 2c 20 53 45 50  owSeparator, SEP
2de50 5f 52 6f 77 29 3b 0a 20 20 20 20 7d 65 6c 73 65  _Row);.    }else
2de60 20 69 66 28 20 63 32 3d 3d 27 6c 27 20 26 26 20   if( c2=='l' && 
2de70 6e 32 3e 32 20 26 26 20 73 74 72 6e 63 6d 70 28  n2>2 && strncmp(
2de80 61 7a 41 72 67 5b 31 5d 2c 22 6c 69 73 74 22 2c  azArg[1],"list",
2de90 6e 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  n2)==0 ){.      
2dea0 70 2d 3e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 4c  p->mode = MODE_L
2deb0 69 73 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ist;.      sqlit
2dec0 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
2ded0 6f 66 28 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74  of(p->colSeparat
2dee0 6f 72 29 2c 20 70 2d 3e 63 6f 6c 53 65 70 61 72  or), p->colSepar
2def0 61 74 6f 72 2c 20 53 45 50 5f 43 6f 6c 75 6d 6e  ator, SEP_Column
2df00 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
2df10 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66  _snprintf(sizeof
2df20 28 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72  (p->rowSeparator
2df30 29 2c 20 70 2d 3e 72 6f 77 53 65 70 61 72 61 74  ), p->rowSeparat
2df40 6f 72 2c 20 53 45 50 5f 52 6f 77 29 3b 0a 20 20  or, SEP_Row);.  
2df50 20 20 7d 65 6c 73 65 20 69 66 28 20 63 32 3d 3d    }else if( c2==
2df60 27 68 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61  'h' && strncmp(a
2df70 7a 41 72 67 5b 31 5d 2c 22 68 74 6d 6c 22 2c 6e  zArg[1],"html",n
2df80 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  2)==0 ){.      p
2df90 2d 3e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 48 74  ->mode = MODE_Ht
2dfa0 6d 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  ml;.    }else if
2dfb0 28 20 63 32 3d 3d 27 74 27 20 26 26 20 73 74 72  ( c2=='t' && str
2dfc0 6e 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 22 74  ncmp(azArg[1],"t
2dfd0 63 6c 22 2c 6e 32 29 3d 3d 30 20 29 7b 0a 20 20  cl",n2)==0 ){.  
2dfe0 20 20 20 20 70 2d 3e 6d 6f 64 65 20 3d 20 4d 4f      p->mode = MO
2dff0 44 45 5f 54 63 6c 3b 0a 20 20 20 20 20 20 73 71  DE_Tcl;.      sq
2e000 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
2e010 69 7a 65 6f 66 28 70 2d 3e 63 6f 6c 53 65 70 61  izeof(p->colSepa
2e020 72 61 74 6f 72 29 2c 20 70 2d 3e 63 6f 6c 53 65  rator), p->colSe
2e030 70 61 72 61 74 6f 72 2c 20 53 45 50 5f 53 70 61  parator, SEP_Spa
2e040 63 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ce);.      sqlit
2e050 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
2e060 6f 66 28 70 2d 3e 72 6f 77 53 65 70 61 72 61 74  of(p->rowSeparat
2e070 6f 72 29 2c 20 70 2d 3e 72 6f 77 53 65 70 61 72  or), p->rowSepar
2e080 61 74 6f 72 2c 20 53 45 50 5f 52 6f 77 29 3b 0a  ator, SEP_Row);.
2e090 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 32      }else if( c2
2e0a0 3d 3d 27 63 27 20 26 26 20 73 74 72 6e 63 6d 70  =='c' && strncmp
2e0b0 28 61 7a 41 72 67 5b 31 5d 2c 22 63 73 76 22 2c  (azArg[1],"csv",
2e0c0 6e 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  n2)==0 ){.      
2e0d0 70 2d 3e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 43  p->mode = MODE_C
2e0e0 73 76 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  sv;.      sqlite
2e0f0 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
2e100 66 28 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f  f(p->colSeparato
2e110 72 29 2c 20 70 2d 3e 63 6f 6c 53 65 70 61 72 61  r), p->colSepara
2e120 74 6f 72 2c 20 53 45 50 5f 43 6f 6d 6d 61 29 3b  tor, SEP_Comma);
2e130 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
2e140 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 70  nprintf(sizeof(p
2e150 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 29 2c  ->rowSeparator),
2e160 20 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72   p->rowSeparator
2e170 2c 20 53 45 50 5f 43 72 4c 66 29 3b 0a 20 20 20  , SEP_CrLf);.   
2e180 20 7d 65 6c 73 65 20 69 66 28 20 63 32 3d 3d 27   }else if( c2=='
2e190 74 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a  t' && strncmp(az
2e1a0 41 72 67 5b 31 5d 2c 22 74 61 62 73 22 2c 6e 32  Arg[1],"tabs",n2
2e1b0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d  )==0 ){.      p-
2e1c0 3e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 4c 69 73  >mode = MODE_Lis
2e1d0 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  t;.      sqlite3
2e1e0 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66  _snprintf(sizeof
2e1f0 28 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72  (p->colSeparator
2e200 29 2c 20 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74  ), p->colSeparat
2e210 6f 72 2c 20 53 45 50 5f 54 61 62 29 3b 0a 20 20  or, SEP_Tab);.  
2e220 20 20 7d 65 6c 73 65 20 69 66 28 20 63 32 3d 3d    }else if( c2==
2e230 27 69 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61  'i' && strncmp(a
2e240 7a 41 72 67 5b 31 5d 2c 22 69 6e 73 65 72 74 22  zArg[1],"insert"
2e250 2c 6e 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ,n2)==0 ){.     
2e260 20 70 2d 3e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f   p->mode = MODE_
2e270 49 6e 73 65 72 74 3b 0a 20 20 20 20 20 20 73 65  Insert;.      se
2e280 74 5f 74 61 62 6c 65 5f 6e 61 6d 65 28 70 2c 20  t_table_name(p, 
2e290 6e 41 72 67 3e 3d 33 20 3f 20 61 7a 41 72 67 5b  nArg>=3 ? azArg[
2e2a0 32 5d 20 3a 20 22 74 61 62 6c 65 22 29 3b 0a 20  2] : "table");. 
2e2b0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 32 3d     }else if( c2=
2e2c0 3d 27 71 27 20 26 26 20 73 74 72 6e 63 6d 70 28  ='q' && strncmp(
2e2d0 61 7a 41 72 67 5b 31 5d 2c 22 71 75 6f 74 65 22  azArg[1],"quote"
2e2e0 2c 6e 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ,n2)==0 ){.     
2e2f0 20 70 2d 3e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f   p->mode = MODE_
2e300 51 75 6f 74 65 3b 0a 20 20 20 20 7d 65 6c 73 65  Quote;.    }else
2e310 20 69 66 28 20 63 32 3d 3d 27 61 27 20 26 26 20   if( c2=='a' && 
2e320 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 31 5d  strncmp(azArg[1]
2e330 2c 22 61 73 63 69 69 22 2c 6e 32 29 3d 3d 30 20  ,"ascii",n2)==0 
2e340 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6d 6f 64 65  ){.      p->mode
2e350 20 3d 20 4d 4f 44 45 5f 41 73 63 69 69 3b 0a 20   = MODE_Ascii;. 
2e360 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
2e370 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 70 2d 3e  rintf(sizeof(p->
2e380 63 6f 6c 53 65 70 61 72 61 74 6f 72 29 2c 20 70  colSeparator), p
2e390 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 2c 20  ->colSeparator, 
2e3a0 53 45 50 5f 55 6e 69 74 29 3b 0a 20 20 20 20 20  SEP_Unit);.     
2e3b0 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
2e3c0 66 28 73 69 7a 65 6f 66 28 70 2d 3e 72 6f 77 53  f(sizeof(p->rowS
2e3d0 65 70 61 72 61 74 6f 72 29 2c 20 70 2d 3e 72 6f  eparator), p->ro
2e3e0 77 53 65 70 61 72 61 74 6f 72 2c 20 53 45 50 5f  wSeparator, SEP_
2e3f0 52 65 63 6f 72 64 29 3b 0a 20 20 20 20 7d 65 6c  Record);.    }el
2e400 73 65 20 69 66 28 20 6e 41 72 67 3d 3d 31 20 29  se if( nArg==1 )
2e410 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e  {.      raw_prin
2e420 74 66 28 70 2d 3e 6f 75 74 2c 20 22 63 75 72 72  tf(p->out, "curr
2e430 65 6e 74 20 6f 75 74 70 75 74 20 6d 6f 64 65 3a  ent output mode:
2e440 20 25 73 5c 6e 22 2c 20 6d 6f 64 65 44 65 73 63   %s\n", modeDesc
2e450 72 5b 70 2d 3e 6d 6f 64 65 5d 29 3b 0a 20 20 20  r[p->mode]);.   
2e460 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 61   }else{.      ra
2e470 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  w_printf(stderr,
2e480 20 22 45 72 72 6f 72 3a 20 6d 6f 64 65 20 73 68   "Error: mode sh
2e490 6f 75 6c 64 20 62 65 20 6f 6e 65 20 6f 66 3a 20  ould be one of: 
2e4a0 22 0a 20 20 20 20 20 20 20 20 20 22 61 73 63 69  ".         "asci
2e4b0 69 20 63 6f 6c 75 6d 6e 20 63 73 76 20 68 74 6d  i column csv htm
2e4c0 6c 20 69 6e 73 65 72 74 20 6c 69 6e 65 20 6c 69  l insert line li
2e4d0 73 74 20 71 75 6f 74 65 20 74 61 62 73 20 74 63  st quote tabs tc
2e4e0 6c 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20  l\n");.      rc 
2e4f0 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  = 1;.    }.    p
2e500 2d 3e 63 4d 6f 64 65 20 3d 20 70 2d 3e 6d 6f 64  ->cMode = p->mod
2e510 65 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66  e;.  }else..  if
2e520 28 20 63 3d 3d 27 6e 27 20 26 26 20 73 74 72 6e  ( c=='n' && strn
2e530 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 6e  cmp(azArg[0], "n
2e540 75 6c 6c 76 61 6c 75 65 22 2c 20 6e 29 3d 3d 30  ullvalue", n)==0
2e550 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 41 72 67   ){.    if( nArg
2e560 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==2 ){.      sql
2e570 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
2e580 7a 65 6f 66 28 70 2d 3e 6e 75 6c 6c 56 61 6c 75  zeof(p->nullValu
2e590 65 29 2c 20 70 2d 3e 6e 75 6c 6c 56 61 6c 75 65  e), p->nullValue
2e5a0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2e5b0 20 20 20 20 20 20 20 20 20 22 25 2e 2a 73 22 2c           "%.*s",
2e5c0 20 28 69 6e 74 29 41 72 72 61 79 53 69 7a 65 28   (int)ArraySize(
2e5d0 70 2d 3e 6e 75 6c 6c 56 61 6c 75 65 29 2d 31 2c  p->nullValue)-1,
2e5e0 20 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20   azArg[1]);.    
2e5f0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 61 77  }else{.      raw
2e600 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
2e610 22 55 73 61 67 65 3a 20 2e 6e 75 6c 6c 76 61 6c  "Usage: .nullval
2e620 75 65 20 53 54 52 49 4e 47 5c 6e 22 29 3b 0a 20  ue STRING\n");. 
2e630 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20       rc = 1;.   
2e640 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66   }.  }else..  if
2e650 28 20 63 3d 3d 27 6f 27 20 26 26 20 73 74 72 6e  ( c=='o' && strn
2e660 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 6f  cmp(azArg[0], "o
2e670 70 65 6e 22 2c 20 6e 29 3d 3d 30 20 26 26 20 6e  pen", n)==0 && n
2e680 3e 3d 32 20 29 7b 0a 20 20 20 20 63 68 61 72 20  >=2 ){.    char 
2e690 2a 7a 4e 65 77 46 69 6c 65 6e 61 6d 65 3b 20 20  *zNewFilename;  
2e6a0 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64  /* Name of the d
2e6b0 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20  atabase file to 
2e6c0 6f 70 65 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 20  open */.    int 
2e6d0 69 4e 61 6d 65 20 3d 20 31 3b 20 20 20 20 20 20  iName = 1;      
2e6e0 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 61 7a 41   /* Index in azA
2e6f0 72 67 5b 5d 20 6f 66 20 74 68 65 20 66 69 6c 65  rg[] of the file
2e700 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20  name */.    int 
2e710 6e 65 77 46 6c 61 67 20 3d 20 30 3b 20 20 20 20  newFlag = 0;    
2e720 20 2f 2a 20 54 72 75 65 20 74 6f 20 64 65 6c 65   /* True to dele
2e730 74 65 20 66 69 6c 65 20 62 65 66 6f 72 65 20 6f  te file before o
2e740 70 65 6e 69 6e 67 20 2a 2f 0a 20 20 20 20 2f 2a  pening */.    /*
2e750 20 43 6c 6f 73 65 20 74 68 65 20 65 78 69 73 74   Close the exist
2e760 69 6e 67 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  ing database */.
2e770 20 20 20 20 73 65 73 73 69 6f 6e 5f 63 6c 6f 73      session_clos
2e780 65 5f 61 6c 6c 28 70 29 3b 0a 20 20 20 20 73 71  e_all(p);.    sq
2e790 6c 69 74 65 33 5f 63 6c 6f 73 65 28 70 2d 3e 64  lite3_close(p->d
2e7a0 62 29 3b 0a 20 20 20 20 70 2d 3e 64 62 20 3d 20  b);.    p->db = 
2e7b0 30 3b 0a 20 20 20 20 70 2d 3e 7a 44 62 46 69 6c  0;.    p->zDbFil
2e7c0 65 6e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 73  ename = 0;.    s
2e7d0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 7a  qlite3_free(p->z
2e7e0 46 72 65 65 4f 6e 43 6c 6f 73 65 29 3b 0a 20 20  FreeOnClose);.  
2e7f0 20 20 70 2d 3e 7a 46 72 65 65 4f 6e 43 6c 6f 73    p->zFreeOnClos
2e800 65 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 6f 70  e = 0;.    p->op
2e810 65 6e 4d 6f 64 65 20 3d 20 53 48 45 4c 4c 5f 4f  enMode = SHELL_O
2e820 50 45 4e 5f 55 4e 53 50 45 43 3b 0a 20 20 20 20  PEN_UNSPEC;.    
2e830 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 63 6f 6d  /* Check for com
2e840 6d 61 6e 64 2d 6c 69 6e 65 20 61 72 67 75 6d 65  mand-line argume
2e850 6e 74 73 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69  nts */.    for(i
2e860 4e 61 6d 65 3d 31 3b 20 69 4e 61 6d 65 3c 6e 41  Name=1; iName<nA
2e870 72 67 20 26 26 20 61 7a 41 72 67 5b 69 4e 61 6d  rg && azArg[iNam
2e880 65 5d 5b 30 5d 3d 3d 27 2d 27 3b 20 69 4e 61 6d  e][0]=='-'; iNam
2e890 65 2b 2b 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73  e++){.      cons
2e8a0 74 20 63 68 61 72 20 2a 7a 20 3d 20 61 7a 41 72  t char *z = azAr
2e8b0 67 5b 69 4e 61 6d 65 5d 3b 0a 20 20 20 20 20 20  g[iName];.      
2e8c0 69 66 28 20 6f 70 74 69 6f 6e 4d 61 74 63 68 28  if( optionMatch(
2e8d0 7a 2c 22 6e 65 77 22 29 20 29 7b 0a 20 20 20 20  z,"new") ){.    
2e8e0 20 20 20 20 6e 65 77 46 6c 61 67 20 3d 20 31 3b      newFlag = 1;
2e8f0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48  .#ifdef SQLITE_H
2e900 41 56 45 5f 5a 49 50 0a 20 20 20 20 20 20 7d 65  AVE_ZIP.      }e
2e910 6c 73 65 20 69 66 28 20 6f 70 74 69 6f 6e 4d 61  lse if( optionMa
2e920 74 63 68 28 7a 2c 20 22 7a 69 70 22 29 20 29 7b  tch(z, "zip") ){
2e930 0a 20 20 20 20 20 20 20 20 70 2d 3e 6f 70 65 6e  .        p->open
2e940 4d 6f 64 65 20 3d 20 53 48 45 4c 4c 5f 4f 50 45  Mode = SHELL_OPE
2e950 4e 5f 5a 49 50 46 49 4c 45 3b 0a 23 65 6e 64 69  N_ZIPFILE;.#endi
2e960 66 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  f.      }else if
2e970 28 20 6f 70 74 69 6f 6e 4d 61 74 63 68 28 7a 2c  ( optionMatch(z,
2e980 20 22 61 70 70 65 6e 64 22 29 20 29 7b 0a 20 20   "append") ){.  
2e990 20 20 20 20 20 20 70 2d 3e 6f 70 65 6e 4d 6f 64        p->openMod
2e9a0 65 20 3d 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f 41  e = SHELL_OPEN_A
2e9b0 50 50 45 4e 44 56 46 53 3b 0a 20 20 20 20 20 20  PPENDVFS;.      
2e9c0 7d 65 6c 73 65 20 69 66 28 20 7a 5b 30 5d 3d 3d  }else if( z[0]==
2e9d0 27 2d 27 20 29 7b 0a 20 20 20 20 20 20 20 20 75  '-' ){.        u
2e9e0 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72  tf8_printf(stder
2e9f0 72 2c 20 22 75 6e 6b 6e 6f 77 6e 20 6f 70 74 69  r, "unknown opti
2ea00 6f 6e 3a 20 25 73 5c 6e 22 2c 20 7a 29 3b 0a 20  on: %s\n", z);. 
2ea10 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20         rc = 1;. 
2ea20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 65 74 61         goto meta
2ea30 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20  _command_exit;. 
2ea40 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
2ea50 20 2f 2a 20 49 66 20 61 20 66 69 6c 65 6e 61 6d   /* If a filenam
2ea60 65 20 69 73 20 73 70 65 63 69 66 69 65 64 2c 20  e is specified, 
2ea70 74 72 79 20 74 6f 20 6f 70 65 6e 20 69 74 20 66  try to open it f
2ea80 69 72 73 74 20 2a 2f 0a 20 20 20 20 7a 4e 65 77  irst */.    zNew
2ea90 46 69 6c 65 6e 61 6d 65 20 3d 20 6e 41 72 67 3e  Filename = nArg>
2eaa0 69 4e 61 6d 65 20 3f 20 73 71 6c 69 74 65 33 5f  iName ? sqlite3_
2eab0 6d 70 72 69 6e 74 66 28 22 25 73 22 2c 20 61 7a  mprintf("%s", az
2eac0 41 72 67 5b 69 4e 61 6d 65 5d 29 20 3a 20 30 3b  Arg[iName]) : 0;
2ead0 0a 20 20 20 20 69 66 28 20 7a 4e 65 77 46 69 6c  .    if( zNewFil
2eae0 65 6e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 69  ename ){.      i
2eaf0 66 28 20 6e 65 77 46 6c 61 67 20 29 20 73 68 65  f( newFlag ) she
2eb00 6c 6c 44 65 6c 65 74 65 46 69 6c 65 28 7a 4e 65  llDeleteFile(zNe
2eb10 77 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20  wFilename);.    
2eb20 20 20 70 2d 3e 7a 44 62 46 69 6c 65 6e 61 6d 65    p->zDbFilename
2eb30 20 3d 20 7a 4e 65 77 46 69 6c 65 6e 61 6d 65 3b   = zNewFilename;
2eb40 0a 20 20 20 20 20 20 6f 70 65 6e 5f 64 62 28 70  .      open_db(p
2eb50 2c 20 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 1);.      if( 
2eb60 70 2d 3e 64 62 3d 3d 30 20 29 7b 0a 20 20 20 20  p->db==0 ){.    
2eb70 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
2eb80 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20  stderr, "Error: 
2eb90 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 27 25 73 27  cannot open '%s'
2eba0 5c 6e 22 2c 20 7a 4e 65 77 46 69 6c 65 6e 61 6d  \n", zNewFilenam
2ebb0 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  e);.        sqli
2ebc0 74 65 33 5f 66 72 65 65 28 7a 4e 65 77 46 69 6c  te3_free(zNewFil
2ebd0 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 65  ename);.      }e
2ebe0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e  lse{.        p->
2ebf0 7a 46 72 65 65 4f 6e 43 6c 6f 73 65 20 3d 20 7a  zFreeOnClose = z
2ec00 4e 65 77 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 20  NewFilename;.   
2ec10 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
2ec20 66 28 20 70 2d 3e 64 62 3d 3d 30 20 29 7b 0a 20  f( p->db==0 ){. 
2ec30 20 20 20 20 20 2f 2a 20 41 73 20 61 20 66 61 6c       /* As a fal
2ec40 6c 2d 62 61 63 6b 20 6f 70 65 6e 20 61 20 54 45  l-back open a TE
2ec50 4d 50 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  MP database */. 
2ec60 20 20 20 20 20 70 2d 3e 7a 44 62 46 69 6c 65 6e       p->zDbFilen
2ec70 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 6f  ame = 0;.      o
2ec80 70 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a 20 20  pen_db(p, 0);.  
2ec90 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69    }.  }else..  i
2eca0 66 28 20 28 63 3d 3d 27 6f 27 0a 20 20 20 20 20  f( (c=='o'.     
2ecb0 20 20 20 26 26 20 28 73 74 72 6e 63 6d 70 28 61     && (strncmp(a
2ecc0 7a 41 72 67 5b 30 5d 2c 20 22 6f 75 74 70 75 74  zArg[0], "output
2ecd0 22 2c 20 6e 29 3d 3d 30 7c 7c 73 74 72 6e 63 6d  ", n)==0||strncm
2ece0 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 6f 6e 63  p(azArg[0], "onc
2ecf0 65 22 2c 20 6e 29 3d 3d 30 29 29 0a 20 20 20 7c  e", n)==0)).   |
2ed00 7c 20 28 63 3d 3d 27 65 27 20 26 26 20 6e 3d 3d  | (c=='e' && n==
2ed10 35 20 26 26 20 73 74 72 63 6d 70 28 61 7a 41 72  5 && strcmp(azAr
2ed20 67 5b 30 5d 2c 22 65 78 63 65 6c 22 29 3d 3d 30  g[0],"excel")==0
2ed30 29 0a 20 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74  ).  ){.    const
2ed40 20 63 68 61 72 20 2a 7a 46 69 6c 65 20 3d 20 6e   char *zFile = n
2ed50 41 72 67 3e 3d 32 20 3f 20 61 7a 41 72 67 5b 31  Arg>=2 ? azArg[1
2ed60 5d 20 3a 20 22 73 74 64 6f 75 74 22 3b 0a 20 20  ] : "stdout";.  
2ed70 20 20 69 66 28 20 61 7a 41 72 67 5b 30 5d 5b 30    if( azArg[0][0
2ed80 5d 3d 3d 27 65 27 20 29 7b 0a 20 20 20 20 20 20  ]=='e' ){.      
2ed90 2f 2a 20 54 72 61 6e 73 66 6f 72 6d 20 74 68 65  /* Transform the
2eda0 20 22 2e 65 78 63 65 6c 22 20 63 6f 6d 6d 61 6e   ".excel" comman
2edb0 64 20 69 6e 74 6f 20 22 2e 6f 6e 63 65 20 2d 78  d into ".once -x
2edc0 22 20 2a 2f 0a 20 20 20 20 20 20 6e 41 72 67 20  " */.      nArg 
2edd0 3d 20 32 3b 0a 20 20 20 20 20 20 61 7a 41 72 67  = 2;.      azArg
2ede0 5b 30 5d 20 3d 20 22 6f 6e 63 65 22 3b 0a 20 20  [0] = "once";.  
2edf0 20 20 20 20 7a 46 69 6c 65 20 3d 20 61 7a 41 72      zFile = azAr
2ee00 67 5b 31 5d 20 3d 20 22 2d 78 22 3b 0a 20 20 20  g[1] = "-x";.   
2ee10 20 20 20 6e 20 3d 20 34 3b 0a 20 20 20 20 7d 0a     n = 4;.    }.
2ee20 20 20 20 20 69 66 28 20 6e 41 72 67 3e 32 20 29      if( nArg>2 )
2ee30 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69  {.      utf8_pri
2ee40 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55 73 61  ntf(stderr, "Usa
2ee50 67 65 3a 20 2e 25 73 20 5b 2d 65 7c 2d 78 7c 46  ge: .%s [-e|-x|F
2ee60 49 4c 45 5d 5c 6e 22 2c 20 61 7a 41 72 67 5b 30  ILE]\n", azArg[0
2ee70 5d 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31  ]);.      rc = 1
2ee80 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 65 74  ;.      goto met
2ee90 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a  a_command_exit;.
2eea0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 3e      }.    if( n>
2eeb0 31 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41  1 && strncmp(azA
2eec0 72 67 5b 30 5d 2c 20 22 6f 6e 63 65 22 2c 20 6e  rg[0], "once", n
2eed0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66  )==0 ){.      if
2eee0 28 20 6e 41 72 67 3c 32 20 29 7b 0a 20 20 20 20  ( nArg<2 ){.    
2eef0 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73      raw_printf(s
2ef00 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e  tderr, "Usage: .
2ef10 6f 6e 63 65 20 28 2d 65 7c 2d 78 7c 46 49 4c 45  once (-e|-x|FILE
2ef20 29 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 72  )\n");.        r
2ef30 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 67  c = 1;.        g
2ef40 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64  oto meta_command
2ef50 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 7d 0a 20  _exit;.      }. 
2ef60 20 20 20 20 20 70 2d 3e 6f 75 74 43 6f 75 6e 74       p->outCount
2ef70 20 3d 20 32 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 2;.    }else{
2ef80 0a 20 20 20 20 20 20 70 2d 3e 6f 75 74 43 6f 75  .      p->outCou
2ef90 6e 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  nt = 0;.    }.  
2efa0 20 20 6f 75 74 70 75 74 5f 72 65 73 65 74 28 70    output_reset(p
2efb0 29 3b 0a 20 20 20 20 69 66 28 20 7a 46 69 6c 65  );.    if( zFile
2efc0 5b 30 5d 3d 3d 27 2d 27 20 26 26 20 7a 46 69 6c  [0]=='-' && zFil
2efd0 65 5b 31 5d 3d 3d 27 2d 27 20 29 20 7a 46 69 6c  e[1]=='-' ) zFil
2efe0 65 2b 2b 3b 0a 20 20 20 20 69 66 28 20 73 74 72  e++;.    if( str
2eff0 63 6d 70 28 7a 46 69 6c 65 2c 20 22 2d 65 22 29  cmp(zFile, "-e")
2f000 3d 3d 30 20 7c 7c 20 73 74 72 63 6d 70 28 7a 46  ==0 || strcmp(zF
2f010 69 6c 65 2c 20 22 2d 78 22 29 3d 3d 30 20 29 7b  ile, "-x")==0 ){
2f020 0a 20 20 20 20 20 20 70 2d 3e 64 6f 58 64 67 4f  .      p->doXdgO
2f030 70 65 6e 20 3d 20 70 2d 3e 6d 6f 64 65 20 2b 20  pen = p->mode + 
2f040 31 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 46 69  1;.      if( zFi
2f050 6c 65 5b 31 5d 3d 3d 27 78 27 20 29 7b 0a 20 20  le[1]=='x' ){.  
2f060 20 20 20 20 20 20 6e 65 77 54 65 6d 70 46 69 6c        newTempFil
2f070 65 28 70 2c 20 22 63 73 76 22 29 3b 0a 20 20 20  e(p, "csv");.   
2f080 20 20 20 20 20 70 2d 3e 6d 6f 64 65 20 3d 20 4d       p->mode = M
2f090 4f 44 45 5f 43 73 76 3b 0a 20 20 20 20 20 20 20  ODE_Csv;.       
2f0a0 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
2f0b0 66 28 73 69 7a 65 6f 66 28 70 2d 3e 63 6f 6c 53  f(sizeof(p->colS
2f0c0 65 70 61 72 61 74 6f 72 29 2c 20 70 2d 3e 63 6f  eparator), p->co
2f0d0 6c 53 65 70 61 72 61 74 6f 72 2c 20 53 45 50 5f  lSeparator, SEP_
2f0e0 43 6f 6d 6d 61 29 3b 0a 20 20 20 20 20 20 20 20  Comma);.        
2f0f0 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
2f100 28 73 69 7a 65 6f 66 28 70 2d 3e 72 6f 77 53 65  (sizeof(p->rowSe
2f110 70 61 72 61 74 6f 72 29 2c 20 70 2d 3e 72 6f 77  parator), p->row
2f120 53 65 70 61 72 61 74 6f 72 2c 20 53 45 50 5f 43  Separator, SEP_C
2f130 72 4c 66 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  rLf);.      }els
2f140 65 7b 0a 20 20 20 20 20 20 20 20 6e 65 77 54 65  e{.        newTe
2f150 6d 70 46 69 6c 65 28 70 2c 20 22 74 78 74 22 29  mpFile(p, "txt")
2f160 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2f170 7a 46 69 6c 65 20 3d 20 70 2d 3e 7a 54 65 6d 70  zFile = p->zTemp
2f180 46 69 6c 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  File;.    }.    
2f190 69 66 28 20 7a 46 69 6c 65 5b 30 5d 3d 3d 27 7c  if( zFile[0]=='|
2f1a0 27 20 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  ' ){.#ifdef SQLI
2f1b0 54 45 5f 4f 4d 49 54 5f 50 4f 50 45 4e 0a 20 20  TE_OMIT_POPEN.  
2f1c0 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73      raw_printf(s
2f1d0 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 70  tderr, "Error: p
2f1e0 69 70 65 73 20 61 72 65 20 6e 6f 74 20 73 75 70  ipes are not sup
2f1f0 70 6f 72 74 65 64 20 69 6e 20 74 68 69 73 20 4f  ported in this O
2f200 53 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20  S\n");.      rc 
2f210 3d 20 31 3b 0a 20 20 20 20 20 20 70 2d 3e 6f 75  = 1;.      p->ou
2f220 74 20 3d 20 73 74 64 6f 75 74 3b 0a 23 65 6c 73  t = stdout;.#els
2f230 65 0a 20 20 20 20 20 20 70 2d 3e 6f 75 74 20 3d  e.      p->out =
2f240 20 70 6f 70 65 6e 28 7a 46 69 6c 65 20 2b 20 31   popen(zFile + 1
2f250 2c 20 22 77 22 29 3b 0a 20 20 20 20 20 20 69 66  , "w");.      if
2f260 28 20 70 2d 3e 6f 75 74 3d 3d 30 20 29 7b 0a 20  ( p->out==0 ){. 
2f270 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e         utf8_prin
2f280 74 66 28 73 74 64 65 72 72 2c 22 45 72 72 6f 72  tf(stderr,"Error
2f290 3a 20 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 70 69  : cannot open pi
2f2a0 70 65 20 5c 22 25 73 5c 22 5c 6e 22 2c 20 7a 46  pe \"%s\"\n", zF
2f2b0 69 6c 65 20 2b 20 31 29 3b 0a 20 20 20 20 20 20  ile + 1);.      
2f2c0 20 20 70 2d 3e 6f 75 74 20 3d 20 73 74 64 6f 75    p->out = stdou
2f2d0 74 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  t;.        rc = 
2f2e0 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  1;.      }else{.
2f2f0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
2f300 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
2f310 70 2d 3e 6f 75 74 66 69 6c 65 29 2c 20 70 2d 3e  p->outfile), p->
2f320 6f 75 74 66 69 6c 65 2c 20 22 25 73 22 2c 20 7a  outfile, "%s", z
2f330 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 7d 0a 23  File);.      }.#
2f340 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 7b  endif.    }else{
2f350 0a 20 20 20 20 20 20 70 2d 3e 6f 75 74 20 3d 20  .      p->out = 
2f360 6f 75 74 70 75 74 5f 66 69 6c 65 5f 6f 70 65 6e  output_file_open
2f370 28 7a 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 69  (zFile);.      i
2f380 66 28 20 70 2d 3e 6f 75 74 3d 3d 30 20 29 7b 0a  f( p->out==0 ){.
2f390 20 20 20 20 20 20 20 20 69 66 28 20 73 74 72 63          if( strc
2f3a0 6d 70 28 7a 46 69 6c 65 2c 22 6f 66 66 22 29 21  mp(zFile,"off")!
2f3b0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
2f3c0 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65  utf8_printf(stde
2f3d0 72 72 2c 22 45 72 72 6f 72 3a 20 63 61 6e 6e 6f  rr,"Error: canno
2f3e0 74 20 77 72 69 74 65 20 74 6f 20 5c 22 25 73 5c  t write to \"%s\
2f3f0 22 5c 6e 22 2c 20 7a 46 69 6c 65 29 3b 0a 20 20  "\n", zFile);.  
2f400 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2f410 70 2d 3e 6f 75 74 20 3d 20 73 74 64 6f 75 74 3b  p->out = stdout;
2f420 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b  .        rc = 1;
2f430 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  .      } else {.
2f440 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
2f450 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
2f460 70 2d 3e 6f 75 74 66 69 6c 65 29 2c 20 70 2d 3e  p->outfile), p->
2f470 6f 75 74 66 69 6c 65 2c 20 22 25 73 22 2c 20 7a  outfile, "%s", z
2f480 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  File);.      }. 
2f490 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20     }.  }else..  
2f4a0 69 66 28 20 63 3d 3d 27 70 27 20 26 26 20 6e 3e  if( c=='p' && n>
2f4b0 3d 33 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a  =3 && strncmp(az
2f4c0 41 72 67 5b 30 5d 2c 20 22 70 72 69 6e 74 22 2c  Arg[0], "print",
2f4d0 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e   n)==0 ){.    in
2f4e0 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 31  t i;.    for(i=1
2f4f0 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a  ; i<nArg; i++){.
2f500 20 20 20 20 20 20 69 66 28 20 69 3e 31 20 29 20        if( i>1 ) 
2f510 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  raw_printf(p->ou
2f520 74 2c 20 22 20 22 29 3b 0a 20 20 20 20 20 20 75  t, " ");.      u
2f530 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  tf8_printf(p->ou
2f540 74 2c 20 22 25 73 22 2c 20 61 7a 41 72 67 5b 69  t, "%s", azArg[i
2f550 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 61  ]);.    }.    ra
2f560 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  w_printf(p->out,
2f570 20 22 5c 6e 22 29 3b 0a 20 20 7d 65 6c 73 65 0a   "\n");.  }else.
2f580 0a 20 20 69 66 28 20 63 3d 3d 27 70 27 20 26 26  .  if( c=='p' &&
2f590 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30   strncmp(azArg[0
2f5a0 5d 2c 20 22 70 72 6f 6d 70 74 22 2c 20 6e 29 3d  ], "prompt", n)=
2f5b0 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 41  =0 ){.    if( nA
2f5c0 72 67 20 3e 3d 20 32 29 20 7b 0a 20 20 20 20 20  rg >= 2) {.     
2f5d0 20 73 74 72 6e 63 70 79 28 6d 61 69 6e 50 72 6f   strncpy(mainPro
2f5e0 6d 70 74 2c 61 7a 41 72 67 5b 31 5d 2c 28 69 6e  mpt,azArg[1],(in
2f5f0 74 29 41 72 72 61 79 53 69 7a 65 28 6d 61 69 6e  t)ArraySize(main
2f600 50 72 6f 6d 70 74 29 2d 31 29 3b 0a 20 20 20 20  Prompt)-1);.    
2f610 7d 0a 20 20 20 20 69 66 28 20 6e 41 72 67 20 3e  }.    if( nArg >
2f620 3d 20 33 29 20 7b 0a 20 20 20 20 20 20 73 74 72  = 3) {.      str
2f630 6e 63 70 79 28 63 6f 6e 74 69 6e 75 65 50 72 6f  ncpy(continuePro
2f640 6d 70 74 2c 61 7a 41 72 67 5b 32 5d 2c 28 69 6e  mpt,azArg[2],(in
2f650 74 29 41 72 72 61 79 53 69 7a 65 28 63 6f 6e 74  t)ArraySize(cont
2f660 69 6e 75 65 50 72 6f 6d 70 74 29 2d 31 29 3b 0a  inuePrompt)-1);.
2f670 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20      }.  }else.. 
2f680 20 69 66 28 20 63 3d 3d 27 71 27 20 26 26 20 73   if( c=='q' && s
2f690 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c  trncmp(azArg[0],
2f6a0 20 22 71 75 69 74 22 2c 20 6e 29 3d 3d 30 20 29   "quit", n)==0 )
2f6b0 7b 0a 20 20 20 20 72 63 20 3d 20 32 3b 0a 20 20  {.    rc = 2;.  
2f6c0 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d  }else..  if( c==
2f6d0 27 72 27 20 26 26 20 6e 3e 3d 33 20 26 26 20 73  'r' && n>=3 && s
2f6e0 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c  trncmp(azArg[0],
2f6f0 20 22 72 65 61 64 22 2c 20 6e 29 3d 3d 30 20 29   "read", n)==0 )
2f700 7b 0a 20 20 20 20 46 49 4c 45 20 2a 61 6c 74 3b  {.    FILE *alt;
2f710 0a 20 20 20 20 69 66 28 20 6e 41 72 67 21 3d 32  .    if( nArg!=2
2f720 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72   ){.      raw_pr
2f730 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55 73  intf(stderr, "Us
2f740 61 67 65 3a 20 2e 72 65 61 64 20 46 49 4c 45 5c  age: .read FILE\
2f750 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  n");.      rc = 
2f760 31 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 65  1;.      goto me
2f770 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b  ta_command_exit;
2f780 0a 20 20 20 20 7d 0a 20 20 20 20 61 6c 74 20 3d  .    }.    alt =
2f790 20 66 6f 70 65 6e 28 61 7a 41 72 67 5b 31 5d 2c   fopen(azArg[1],
2f7a0 20 22 72 62 22 29 3b 0a 20 20 20 20 69 66 28 20   "rb");.    if( 
2f7b0 61 6c 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  alt==0 ){.      
2f7c0 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65  utf8_printf(stde
2f7d0 72 72 2c 22 45 72 72 6f 72 3a 20 63 61 6e 6e 6f  rr,"Error: canno
2f7e0 74 20 6f 70 65 6e 20 5c 22 25 73 5c 22 5c 6e 22  t open \"%s\"\n"
2f7f0 2c 20 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20  , azArg[1]);.   
2f800 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d     rc = 1;.    }
2f810 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
2f820 20 70 72 6f 63 65 73 73 5f 69 6e 70 75 74 28 70   process_input(p
2f830 2c 20 61 6c 74 29 3b 0a 20 20 20 20 20 20 66 63  , alt);.      fc
2f840 6c 6f 73 65 28 61 6c 74 29 3b 0a 20 20 20 20 7d  lose(alt);.    }
2f850 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20  .  }else..  if( 
2f860 63 3d 3d 27 72 27 20 26 26 20 6e 3e 3d 33 20 26  c=='r' && n>=3 &
2f870 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b  & strncmp(azArg[
2f880 30 5d 2c 20 22 72 65 73 74 6f 72 65 22 2c 20 6e  0], "restore", n
2f890 29 3d 3d 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73  )==0 ){.    cons
2f8a0 74 20 63 68 61 72 20 2a 7a 53 72 63 46 69 6c 65  t char *zSrcFile
2f8b0 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
2f8c0 20 2a 7a 44 62 3b 0a 20 20 20 20 73 71 6c 69 74   *zDb;.    sqlit
2f8d0 65 33 20 2a 70 53 72 63 3b 0a 20 20 20 20 73 71  e3 *pSrc;.    sq
2f8e0 6c 69 74 65 33 5f 62 61 63 6b 75 70 20 2a 70 42  lite3_backup *pB
2f8f0 61 63 6b 75 70 3b 0a 20 20 20 20 69 6e 74 20 6e  ackup;.    int n
2f900 54 69 6d 65 6f 75 74 20 3d 20 30 3b 0a 0a 20 20  Timeout = 0;..  
2f910 20 20 69 66 28 20 6e 41 72 67 3d 3d 32 20 29 7b    if( nArg==2 ){
2f920 0a 20 20 20 20 20 20 7a 53 72 63 46 69 6c 65 20  .      zSrcFile 
2f930 3d 20 61 7a 41 72 67 5b 31 5d 3b 0a 20 20 20 20  = azArg[1];.    
2f940 20 20 7a 44 62 20 3d 20 22 6d 61 69 6e 22 3b 0a    zDb = "main";.
2f950 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 41      }else if( nA
2f960 72 67 3d 3d 33 20 29 7b 0a 20 20 20 20 20 20 7a  rg==3 ){.      z
2f970 53 72 63 46 69 6c 65 20 3d 20 61 7a 41 72 67 5b  SrcFile = azArg[
2f980 32 5d 3b 0a 20 20 20 20 20 20 7a 44 62 20 3d 20  2];.      zDb = 
2f990 61 7a 41 72 67 5b 31 5d 3b 0a 20 20 20 20 7d 65  azArg[1];.    }e
2f9a0 6c 73 65 7b 0a 20 20 20 20 20 20 72 61 77 5f 70  lse{.      raw_p
2f9b0 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55  rintf(stderr, "U
2f9c0 73 61 67 65 3a 20 2e 72 65 73 74 6f 72 65 20 3f  sage: .restore ?
2f9d0 44 42 3f 20 46 49 4c 45 5c 6e 22 29 3b 0a 20 20  DB? FILE\n");.  
2f9e0 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
2f9f0 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d    goto meta_comm
2fa00 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a  and_exit;.    }.
2fa10 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2fa20 5f 6f 70 65 6e 28 7a 53 72 63 46 69 6c 65 2c 20  _open(zSrcFile, 
2fa30 26 70 53 72 63 29 3b 0a 20 20 20 20 69 66 28 20  &pSrc);.    if( 
2fa40 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
2fa50 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e  .      utf8_prin
2fa60 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f  tf(stderr, "Erro
2fa70 72 3a 20 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 5c  r: cannot open \
2fa80 22 25 73 5c 22 5c 6e 22 2c 20 7a 53 72 63 46 69  "%s\"\n", zSrcFi
2fa90 6c 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  le);.      sqlit
2faa0 65 33 5f 63 6c 6f 73 65 28 70 53 72 63 29 3b 0a  e3_close(pSrc);.
2fab0 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
2fac0 20 20 20 20 7d 0a 20 20 20 20 6f 70 65 6e 5f 64      }.    open_d
2fad0 62 28 70 2c 20 30 29 3b 0a 20 20 20 20 70 42 61  b(p, 0);.    pBa
2fae0 63 6b 75 70 20 3d 20 73 71 6c 69 74 65 33 5f 62  ckup = sqlite3_b
2faf0 61 63 6b 75 70 5f 69 6e 69 74 28 70 2d 3e 64 62  ackup_init(p->db
2fb00 2c 20 7a 44 62 2c 20 70 53 72 63 2c 20 22 6d 61  , zDb, pSrc, "ma
2fb10 69 6e 22 29 3b 0a 20 20 20 20 69 66 28 20 70 42  in");.    if( pB
2fb20 61 63 6b 75 70 3d 3d 30 20 29 7b 0a 20 20 20 20  ackup==0 ){.    
2fb30 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74    utf8_printf(st
2fb40 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 25 73  derr, "Error: %s
2fb50 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72  \n", sqlite3_err
2fb60 6d 73 67 28 70 2d 3e 64 62 29 29 3b 0a 20 20 20  msg(p->db));.   
2fb70 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65     sqlite3_close
2fb80 28 70 53 72 63 29 3b 0a 20 20 20 20 20 20 72 65  (pSrc);.      re
2fb90 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20  turn 1;.    }.  
2fba0 20 20 77 68 69 6c 65 28 20 28 72 63 20 3d 20 73    while( (rc = s
2fbb0 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 5f 73 74  qlite3_backup_st
2fbc0 65 70 28 70 42 61 63 6b 75 70 2c 31 30 30 29 29  ep(pBackup,100))
2fbd0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 20  ==SQLITE_OK.    
2fbe0 20 20 20 20 20 20 7c 7c 20 72 63 3d 3d 53 51 4c        || rc==SQL
2fbf0 49 54 45 5f 42 55 53 59 20 20 29 7b 0a 20 20 20  ITE_BUSY  ){.   
2fc00 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
2fc10 45 5f 42 55 53 59 20 29 7b 0a 20 20 20 20 20 20  E_BUSY ){.      
2fc20 20 20 69 66 28 20 6e 54 69 6d 65 6f 75 74 2b 2b    if( nTimeout++
2fc30 20 3e 3d 20 33 20 29 20 62 72 65 61 6b 3b 0a 20   >= 3 ) break;. 
2fc40 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73         sqlite3_s
2fc50 6c 65 65 70 28 31 30 30 29 3b 0a 20 20 20 20 20  leep(100);.     
2fc60 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c   }.    }.    sql
2fc70 69 74 65 33 5f 62 61 63 6b 75 70 5f 66 69 6e 69  ite3_backup_fini
2fc80 73 68 28 70 42 61 63 6b 75 70 29 3b 0a 20 20 20  sh(pBackup);.   
2fc90 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2fca0 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 72 63  DONE ){.      rc
2fcb0 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20   = 0;.    }else 
2fcc0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42  if( rc==SQLITE_B
2fcd0 55 53 59 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54  USY || rc==SQLIT
2fce0 45 5f 4c 4f 43 4b 45 44 20 29 7b 0a 20 20 20 20  E_LOCKED ){.    
2fcf0 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64    raw_printf(std
2fd00 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 73 6f 75  err, "Error: sou
2fd10 72 63 65 20 64 61 74 61 62 61 73 65 20 69 73 20  rce database is 
2fd20 62 75 73 79 5c 6e 22 29 3b 0a 20 20 20 20 20 20  busy\n");.      
2fd30 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73  rc = 1;.    }els
2fd40 65 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72  e{.      utf8_pr
2fd50 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72  intf(stderr, "Er
2fd60 72 6f 72 3a 20 25 73 5c 6e 22 2c 20 73 71 6c 69  ror: %s\n", sqli
2fd70 74 65 33 5f 65 72 72 6d 73 67 28 70 2d 3e 64 62  te3_errmsg(p->db
2fd80 29 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31  ));.      rc = 1
2fd90 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
2fda0 74 65 33 5f 63 6c 6f 73 65 28 70 53 72 63 29 3b  te3_close(pSrc);
2fdb0 0a 20 20 7d 65 6c 73 65 0a 0a 0a 20 20 69 66 28  .  }else...  if(
2fdc0 20 63 3d 3d 27 73 27 20 26 26 20 73 74 72 6e 63   c=='s' && strnc
2fdd0 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 73 63  mp(azArg[0], "sc
2fde0 61 6e 73 74 61 74 73 22 2c 20 6e 29 3d 3d 30 20  anstats", n)==0 
2fdf0 29 7b 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3d  ){.    if( nArg=
2fe00 3d 32 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 73  =2 ){.      p->s
2fe10 63 61 6e 73 74 61 74 73 4f 6e 20 3d 20 62 6f 6f  canstatsOn = boo
2fe20 6c 65 61 6e 56 61 6c 75 65 28 61 7a 41 72 67 5b  leanValue(azArg[
2fe30 31 5d 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  1]);.#ifndef SQL
2fe40 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 4d 54 5f  ITE_ENABLE_STMT_
2fe50 53 43 41 4e 53 54 41 54 55 53 0a 20 20 20 20 20  SCANSTATUS.     
2fe60 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65   raw_printf(stde
2fe70 72 72 2c 20 22 57 61 72 6e 69 6e 67 3a 20 2e 73  rr, "Warning: .s
2fe80 63 61 6e 73 74 61 74 73 20 6e 6f 74 20 61 76 61  canstats not ava
2fe90 69 6c 61 62 6c 65 20 69 6e 20 74 68 69 73 20 62  ilable in this b
2fea0 75 69 6c 64 2e 5c 6e 22 29 3b 0a 23 65 6e 64 69  uild.\n");.#endi
2feb0 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  f.    }else{.   
2fec0 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74     raw_printf(st
2fed0 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 73  derr, "Usage: .s
2fee0 63 61 6e 73 74 61 74 73 20 6f 6e 7c 6f 66 66 5c  canstats on|off\
2fef0 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  n");.      rc = 
2ff00 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  1;.    }.  }else
2ff10 0a 0a 20 20 69 66 28 20 63 3d 3d 27 73 27 20 26  ..  if( c=='s' &
2ff20 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b  & strncmp(azArg[
2ff30 30 5d 2c 20 22 73 63 68 65 6d 61 22 2c 20 6e 29  0], "schema", n)
2ff40 3d 3d 30 20 29 7b 0a 20 20 20 20 53 68 65 6c 6c  ==0 ){.    Shell
2ff50 54 65 78 74 20 73 53 65 6c 65 63 74 3b 0a 20 20  Text sSelect;.  
2ff60 20 20 53 68 65 6c 6c 53 74 61 74 65 20 64 61 74    ShellState dat
2ff70 61 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 45 72  a;.    char *zEr
2ff80 72 4d 73 67 20 3d 20 30 3b 0a 20 20 20 20 63 6f  rMsg = 0;.    co
2ff90 6e 73 74 20 63 68 61 72 20 2a 7a 44 69 76 20 3d  nst char *zDiv =
2ffa0 20 22 28 22 3b 0a 20 20 20 20 63 6f 6e 73 74 20   "(";.    const 
2ffb0 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b  char *zName = 0;
2ffc0 0a 20 20 20 20 69 6e 74 20 69 53 63 68 65 6d 61  .    int iSchema
2ffd0 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 62 44   = 0;.    int bD
2ffe0 65 62 75 67 20 3d 20 30 3b 0a 20 20 20 20 69 6e  ebug = 0;.    in
2fff0 74 20 69 69 3b 0a 0a 20 20 20 20 6f 70 65 6e 5f  t ii;..    open_
30000 64 62 28 70 2c 20 30 29 3b 0a 20 20 20 20 6d 65  db(p, 0);.    me
30010 6d 63 70 79 28 26 64 61 74 61 2c 20 70 2c 20 73  mcpy(&data, p, s
30020 69 7a 65 6f 66 28 64 61 74 61 29 29 3b 0a 20 20  izeof(data));.  
30030 20 20 64 61 74 61 2e 73 68 6f 77 48 65 61 64 65    data.showHeade
30040 72 20 3d 20 30 3b 0a 20 20 20 20 64 61 74 61 2e  r = 0;.    data.
30050 63 4d 6f 64 65 20 3d 20 64 61 74 61 2e 6d 6f 64  cMode = data.mod
30060 65 20 3d 20 4d 4f 44 45 5f 53 65 6d 69 3b 0a 20  e = MODE_Semi;. 
30070 20 20 20 69 6e 69 74 54 65 78 74 28 26 73 53 65     initText(&sSe
30080 6c 65 63 74 29 3b 0a 20 20 20 20 66 6f 72 28 69  lect);.    for(i
30090 69 3d 31 3b 20 69 69 3c 6e 41 72 67 3b 20 69 69  i=1; ii<nArg; ii
300a0 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6f  ++){.      if( o
300b0 70 74 69 6f 6e 4d 61 74 63 68 28 61 7a 41 72 67  ptionMatch(azArg
300c0 5b 69 69 5d 2c 22 69 6e 64 65 6e 74 22 29 20 29  [ii],"indent") )
300d0 7b 0a 20 20 20 20 20 20 20 20 64 61 74 61 2e 63  {.        data.c
300e0 4d 6f 64 65 20 3d 20 64 61 74 61 2e 6d 6f 64 65  Mode = data.mode
300f0 20 3d 20 4d 4f 44 45 5f 50 72 65 74 74 79 3b 0a   = MODE_Pretty;.
30100 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
30110 6f 70 74 69 6f 6e 4d 61 74 63 68 28 61 7a 41 72  optionMatch(azAr
30120 67 5b 69 69 5d 2c 22 64 65 62 75 67 22 29 20 29  g[ii],"debug") )
30130 7b 0a 20 20 20 20 20 20 20 20 62 44 65 62 75 67  {.        bDebug
30140 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73   = 1;.      }els
30150 65 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29  e if( zName==0 )
30160 7b 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20  {.        zName 
30170 3d 20 61 7a 41 72 67 5b 69 69 5d 3b 0a 20 20 20  = azArg[ii];.   
30180 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
30190 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64    raw_printf(std
301a0 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 73 63  err, "Usage: .sc
301b0 68 65 6d 61 20 3f 2d 2d 69 6e 64 65 6e 74 3f 20  hema ?--indent? 
301c0 3f 4c 49 4b 45 2d 50 41 54 54 45 52 4e 3f 5c 6e  ?LIKE-PATTERN?\n
301d0 22 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  ");.        rc =
301e0 20 31 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   1;.        goto
301f0 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78   meta_command_ex
30200 69 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  it;.      }.    
30210 7d 0a 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 21  }.    if( zName!
30220 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  =0 ){.      int 
30230 69 73 4d 61 73 74 65 72 20 3d 20 73 71 6c 69 74  isMaster = sqlit
30240 65 33 5f 73 74 72 6c 69 6b 65 28 7a 4e 61 6d 65  e3_strlike(zName
30250 2c 20 22 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  , "sqlite_master
30260 22 2c 20 30 29 3d 3d 30 3b 0a 20 20 20 20 20 20  ", 0)==0;.      
30270 69 66 28 20 69 73 4d 61 73 74 65 72 20 7c 7c 20  if( isMaster || 
30280 73 71 6c 69 74 65 33 5f 73 74 72 6c 69 6b 65 28  sqlite3_strlike(
30290 7a 4e 61 6d 65 2c 22 73 71 6c 69 74 65 5f 74 65  zName,"sqlite_te
302a0 6d 70 5f 6d 61 73 74 65 72 22 2c 30 29 3d 3d 30  mp_master",0)==0
302b0 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72   ){.        char
302c0 20 2a 6e 65 77 5f 61 72 67 76 5b 32 5d 2c 20 2a   *new_argv[2], *
302d0 6e 65 77 5f 63 6f 6c 76 5b 32 5d 3b 0a 20 20 20  new_colv[2];.   
302e0 20 20 20 20 20 6e 65 77 5f 61 72 67 76 5b 30 5d       new_argv[0]
302f0 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
30300 74 66 28 0a 20 20 20 20 20 20 20 20 20 20 20 20  tf(.            
30310 20 20 20 20 20 20 20 20 20 20 22 43 52 45 41 54            "CREAT
30320 45 20 54 41 42 4c 45 20 25 73 20 28 5c 6e 22 0a  E TABLE %s (\n".
30330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30340 20 20 20 20 20 20 22 20 20 74 79 70 65 20 74 65        "  type te
30350 78 74 2c 5c 6e 22 0a 20 20 20 20 20 20 20 20 20  xt,\n".         
30360 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20 20               "  
30370 6e 61 6d 65 20 74 65 78 74 2c 5c 6e 22 0a 20 20  name text,\n".  
30380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30390 20 20 20 20 22 20 20 74 62 6c 5f 6e 61 6d 65 20      "  tbl_name 
303a0 74 65 78 74 2c 5c 6e 22 0a 20 20 20 20 20 20 20  text,\n".       
303b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
303c0 20 20 72 6f 6f 74 70 61 67 65 20 69 6e 74 65 67    rootpage integ
303d0 65 72 2c 5c 6e 22 0a 20 20 20 20 20 20 20 20 20  er,\n".         
303e0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20 20               "  
303f0 73 71 6c 20 74 65 78 74 5c 6e 22 0a 20 20 20 20  sql text\n".    
30400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30410 20 20 22 29 22 2c 20 69 73 4d 61 73 74 65 72 20    ")", isMaster 
30420 3f 20 22 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  ? "sqlite_master
30430 22 20 3a 20 22 73 71 6c 69 74 65 5f 74 65 6d 70  " : "sqlite_temp
30440 5f 6d 61 73 74 65 72 22 29 3b 0a 20 20 20 20 20  _master");.     
30450 20 20 20 6e 65 77 5f 61 72 67 76 5b 31 5d 20 3d     new_argv[1] =
30460 20 30 3b 0a 20 20 20 20 20 20 20 20 6e 65 77 5f   0;.        new_
30470 63 6f 6c 76 5b 30 5d 20 3d 20 22 73 71 6c 22 3b  colv[0] = "sql";
30480 0a 20 20 20 20 20 20 20 20 6e 65 77 5f 63 6f 6c  .        new_col
30490 76 5b 31 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  v[1] = 0;.      
304a0 20 20 63 61 6c 6c 62 61 63 6b 28 26 64 61 74 61    callback(&data
304b0 2c 20 31 2c 20 6e 65 77 5f 61 72 67 76 2c 20 6e  , 1, new_argv, n
304c0 65 77 5f 63 6f 6c 76 29 3b 0a 20 20 20 20 20 20  ew_colv);.      
304d0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 6e    sqlite3_free(n
304e0 65 77 5f 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20  ew_argv[0]);.   
304f0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
30500 66 28 20 7a 44 69 76 20 29 7b 0a 20 20 20 20 20  f( zDiv ){.     
30510 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
30520 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  Stmt = 0;.      
30530 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65  rc = sqlite3_pre
30540 70 61 72 65 5f 76 32 28 70 2d 3e 64 62 2c 20 22  pare_v2(p->db, "
30550 53 45 4c 45 43 54 20 6e 61 6d 65 20 46 52 4f 4d  SELECT name FROM
30560 20 70 72 61 67 6d 61 5f 64 61 74 61 62 61 73 65   pragma_database
30570 5f 6c 69 73 74 22 2c 0a 20 20 20 20 20 20 20 20  _list",.        
30580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30590 20 20 20 20 20 20 2d 31 2c 20 26 70 53 74 6d 74        -1, &pStmt
305a0 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
305b0 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74  rc ){.        ut
305c0 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  f8_printf(stderr
305d0 2c 20 22 45 72 72 6f 72 3a 20 25 73 5c 6e 22 2c  , "Error: %s\n",
305e0 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
305f0 70 2d 3e 64 62 29 29 3b 0a 20 20 20 20 20 20 20  p->db));.       
30600 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
30610 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20  e(pStmt);.      
30620 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20    rc = 1;.      
30630 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d    goto meta_comm
30640 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20 20 20  and_exit;.      
30650 7d 0a 20 20 20 20 20 20 61 70 70 65 6e 64 54 65  }.      appendTe
30660 78 74 28 26 73 53 65 6c 65 63 74 2c 20 22 53 45  xt(&sSelect, "SE
30670 4c 45 43 54 20 73 71 6c 20 46 52 4f 4d 22 2c 20  LECT sql FROM", 
30680 30 29 3b 0a 20 20 20 20 20 20 69 53 63 68 65 6d  0);.      iSchem
30690 61 20 3d 20 30 3b 0a 20 20 20 20 20 20 77 68 69  a = 0;.      whi
306a0 6c 65 28 20 73 71 6c 69 74 65 33 5f 73 74 65 70  le( sqlite3_step
306b0 28 70 53 74 6d 74 29 3d 3d 53 51 4c 49 54 45 5f  (pStmt)==SQLITE_
306c0 52 4f 57 20 29 7b 0a 20 20 20 20 20 20 20 20 63  ROW ){.        c
306d0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 20 3d  onst char *zDb =
306e0 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71   (const char*)sq
306f0 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
30700 74 28 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20  t(pStmt, 0);.   
30710 20 20 20 20 20 63 68 61 72 20 7a 53 63 4e 75 6d       char zScNum
30720 5b 33 30 5d 3b 0a 20 20 20 20 20 20 20 20 73 71  [30];.        sq
30730 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
30740 69 7a 65 6f 66 28 7a 53 63 4e 75 6d 29 2c 20 7a  izeof(zScNum), z
30750 53 63 4e 75 6d 2c 20 22 25 64 22 2c 20 2b 2b 69  ScNum, "%d", ++i
30760 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 20  Schema);.       
30770 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 53 65   appendText(&sSe
30780 6c 65 63 74 2c 20 7a 44 69 76 2c 20 30 29 3b 0a  lect, zDiv, 0);.
30790 20 20 20 20 20 20 20 20 7a 44 69 76 20 3d 20 22          zDiv = "
307a0 20 55 4e 49 4f 4e 20 41 4c 4c 20 22 3b 0a 20 20   UNION ALL ";.  
307b0 20 20 20 20 20 20 61 70 70 65 6e 64 54 65 78 74        appendText
307c0 28 26 73 53 65 6c 65 63 74 2c 20 22 53 45 4c 45  (&sSelect, "SELE
307d0 43 54 20 73 68 65 6c 6c 5f 61 64 64 5f 73 63 68  CT shell_add_sch
307e0 65 6d 61 28 73 71 6c 2c 22 2c 20 30 29 3b 0a 20  ema(sql,", 0);. 
307f0 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
30800 65 33 5f 73 74 72 69 63 6d 70 28 7a 44 62 2c 20  e3_stricmp(zDb, 
30810 22 6d 61 69 6e 22 29 21 3d 30 20 29 7b 0a 20 20  "main")!=0 ){.  
30820 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 54 65          appendTe
30830 78 74 28 26 73 53 65 6c 65 63 74 2c 20 7a 44 62  xt(&sSelect, zDb
30840 2c 20 27 22 27 29 3b 0a 20 20 20 20 20 20 20 20  , '"');.        
30850 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
30860 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 53 65   appendText(&sSe
30870 6c 65 63 74 2c 20 22 4e 55 4c 4c 22 2c 20 30 29  lect, "NULL", 0)
30880 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
30890 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26      appendText(&
308a0 73 53 65 6c 65 63 74 2c 20 22 2c 6e 61 6d 65 29  sSelect, ",name)
308b0 20 41 53 20 73 71 6c 2c 20 74 79 70 65 2c 20 74   AS sql, type, t
308c0 62 6c 5f 6e 61 6d 65 2c 20 6e 61 6d 65 2c 20 72  bl_name, name, r
308d0 6f 77 69 64 2c 22 2c 20 30 29 3b 0a 20 20 20 20  owid,", 0);.    
308e0 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26      appendText(&
308f0 73 53 65 6c 65 63 74 2c 20 7a 53 63 4e 75 6d 2c  sSelect, zScNum,
30900 20 30 29 3b 0a 20 20 20 20 20 20 20 20 61 70 70   0);.        app
30910 65 6e 64 54 65 78 74 28 26 73 53 65 6c 65 63 74  endText(&sSelect
30920 2c 20 22 20 41 53 20 73 6e 75 6d 2c 20 22 2c 20  , " AS snum, ", 
30930 30 29 3b 0a 20 20 20 20 20 20 20 20 61 70 70 65  0);.        appe
30940 6e 64 54 65 78 74 28 26 73 53 65 6c 65 63 74 2c  ndText(&sSelect,
30950 20 7a 44 62 2c 20 27 5c 27 27 29 3b 0a 20 20 20   zDb, '\'');.   
30960 20 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28       appendText(
30970 26 73 53 65 6c 65 63 74 2c 20 22 20 41 53 20 73  &sSelect, " AS s
30980 6e 61 6d 65 20 46 52 4f 4d 20 22 2c 20 30 29 3b  name FROM ", 0);
30990 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 54  .        appendT
309a0 65 78 74 28 26 73 53 65 6c 65 63 74 2c 20 7a 44  ext(&sSelect, zD
309b0 62 2c 20 27 22 27 29 3b 0a 20 20 20 20 20 20 20  b, '"');.       
309c0 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 53 65   appendText(&sSe
309d0 6c 65 63 74 2c 20 22 2e 73 71 6c 69 74 65 5f 6d  lect, ".sqlite_m
309e0 61 73 74 65 72 22 2c 20 30 29 3b 0a 20 20 20 20  aster", 0);.    
309f0 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
30a00 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74  3_finalize(pStmt
30a10 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
30a20 5f 49 4e 54 52 4f 53 50 45 43 54 49 4f 4e 5f 50  _INTROSPECTION_P
30a30 52 41 47 4d 41 53 0a 20 20 20 20 20 20 69 66 28  RAGMAS.      if(
30a40 20 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20   zName ){.      
30a50 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 53    appendText(&sS
30a60 65 6c 65 63 74 2c 0a 20 20 20 20 20 20 20 20 20  elect,.         
30a70 20 20 22 20 55 4e 49 4f 4e 20 41 4c 4c 20 53 45    " UNION ALL SE
30a80 4c 45 43 54 20 73 68 65 6c 6c 5f 6d 6f 64 75 6c  LECT shell_modul
30a90 65 5f 73 63 68 65 6d 61 28 6e 61 6d 65 29 2c 22  e_schema(name),"
30aa0 0a 20 20 20 20 20 20 20 20 20 20 20 22 20 27 74  .           " 't
30ab0 61 62 6c 65 27 2c 20 6e 61 6d 65 2c 20 6e 61 6d  able', name, nam
30ac0 65 2c 20 6e 61 6d 65 2c 20 39 65 2b 39 39 2c 20  e, name, 9e+99, 
30ad0 27 6d 61 69 6e 27 20 46 52 4f 4d 20 70 72 61 67  'main' FROM prag
30ae0 6d 61 5f 6d 6f 64 75 6c 65 5f 6c 69 73 74 22 2c  ma_module_list",
30af0 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e   0);.      }.#en
30b00 64 69 66 0a 20 20 20 20 20 20 61 70 70 65 6e 64  dif.      append
30b10 54 65 78 74 28 26 73 53 65 6c 65 63 74 2c 20 22  Text(&sSelect, "
30b20 29 20 57 48 45 52 45 20 22 2c 20 30 29 3b 0a 20  ) WHERE ", 0);. 
30b30 20 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 20 29       if( zName )
30b40 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a  {.        char *
30b50 7a 51 61 72 67 20 3d 20 73 71 6c 69 74 65 33 5f  zQarg = sqlite3_
30b60 6d 70 72 69 6e 74 66 28 22 25 51 22 2c 20 7a 4e  mprintf("%Q", zN
30b70 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ame);.        if
30b80 28 20 73 74 72 63 68 72 28 7a 4e 61 6d 65 2c 20  ( strchr(zName, 
30b90 27 2e 27 29 20 29 7b 0a 20 20 20 20 20 20 20 20  '.') ){.        
30ba0 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 53    appendText(&sS
30bb0 65 6c 65 63 74 2c 20 22 6c 6f 77 65 72 28 70 72  elect, "lower(pr
30bc0 69 6e 74 66 28 27 25 73 2e 25 73 27 2c 73 6e 61  intf('%s.%s',sna
30bd0 6d 65 2c 74 62 6c 5f 6e 61 6d 65 29 29 22 2c 20  me,tbl_name))", 
30be0 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  0);.        }els
30bf0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 61 70 70  e{.          app
30c00 65 6e 64 54 65 78 74 28 26 73 53 65 6c 65 63 74  endText(&sSelect
30c10 2c 20 22 6c 6f 77 65 72 28 74 62 6c 5f 6e 61 6d  , "lower(tbl_nam
30c20 65 29 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  e)", 0);.       
30c30 20 7d 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e   }.        appen
30c40 64 54 65 78 74 28 26 73 53 65 6c 65 63 74 2c 20  dText(&sSelect, 
30c50 73 74 72 63 68 72 28 7a 4e 61 6d 65 2c 20 27 2a  strchr(zName, '*
30c60 27 29 20 3f 20 22 20 47 4c 4f 42 20 22 20 3a 20  ') ? " GLOB " : 
30c70 22 20 4c 49 4b 45 20 22 2c 20 30 29 3b 0a 20 20  " LIKE ", 0);.  
30c80 20 20 20 20 20 20 61 70 70 65 6e 64 54 65 78 74        appendText
30c90 28 26 73 53 65 6c 65 63 74 2c 20 7a 51 61 72 67  (&sSelect, zQarg
30ca0 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 61 70  , 0);.        ap
30cb0 70 65 6e 64 54 65 78 74 28 26 73 53 65 6c 65 63  pendText(&sSelec
30cc0 74 2c 20 22 20 41 4e 44 20 22 2c 20 30 29 3b 0a  t, " AND ", 0);.
30cd0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
30ce0 66 72 65 65 28 7a 51 61 72 67 29 3b 0a 20 20 20  free(zQarg);.   
30cf0 20 20 20 7d 0a 20 20 20 20 20 20 61 70 70 65 6e     }.      appen
30d00 64 54 65 78 74 28 26 73 53 65 6c 65 63 74 2c 20  dText(&sSelect, 
30d10 22 74 79 70 65 21 3d 27 6d 65 74 61 27 20 41 4e  "type!='meta' AN
30d20 44 20 73 71 6c 20 49 53 20 4e 4f 54 20 4e 55 4c  D sql IS NOT NUL
30d30 4c 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  L".             
30d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20                " 
30d50 4f 52 44 45 52 20 42 59 20 73 6e 75 6d 2c 20 72  ORDER BY snum, r
30d60 6f 77 69 64 22 2c 20 30 29 3b 0a 20 20 20 20 20  owid", 0);.     
30d70 20 69 66 28 20 62 44 65 62 75 67 20 29 7b 0a 20   if( bDebug ){. 
30d80 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e         utf8_prin
30d90 74 66 28 70 2d 3e 6f 75 74 2c 20 22 53 51 4c 3a  tf(p->out, "SQL:
30da0 20 25 73 3b 5c 6e 22 2c 20 73 53 65 6c 65 63 74   %s;\n", sSelect
30db0 2e 7a 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  .z);.      }else
30dc0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
30dd0 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64  qlite3_exec(p->d
30de0 62 2c 20 73 53 65 6c 65 63 74 2e 7a 2c 20 63 61  b, sSelect.z, ca
30df0 6c 6c 62 61 63 6b 2c 20 26 64 61 74 61 2c 20 26  llback, &data, &
30e00 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20  zErrMsg);.      
30e10 7d 0a 20 20 20 20 20 20 66 72 65 65 54 65 78 74  }.      freeText
30e20 28 26 73 53 65 6c 65 63 74 29 3b 0a 20 20 20 20  (&sSelect);.    
30e30 7d 0a 20 20 20 20 69 66 28 20 7a 45 72 72 4d 73  }.    if( zErrMs
30e40 67 20 29 7b 0a 20 20 20 20 20 20 75 74 66 38 5f  g ){.      utf8_
30e50 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 45  printf(stderr,"E
30e60 72 72 6f 72 3a 20 25 73 5c 6e 22 2c 20 7a 45 72  rror: %s\n", zEr
30e70 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 73 71 6c  rMsg);.      sql
30e80 69 74 65 33 5f 66 72 65 65 28 7a 45 72 72 4d 73  ite3_free(zErrMs
30e90 67 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31  g);.      rc = 1
30ea0 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
30eb0 72 63 20 21 3d 20 53 51 4c 49 54 45 5f 4f 4b 20  rc != SQLITE_OK 
30ec0 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69  ){.      raw_pri
30ed0 6e 74 66 28 73 74 64 65 72 72 2c 22 45 72 72 6f  ntf(stderr,"Erro
30ee0 72 3a 20 71 75 65 72 79 69 6e 67 20 73 63 68 65  r: querying sche
30ef0 6d 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 5c 6e  ma information\n
30f00 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31  ");.      rc = 1
30f10 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
30f20 20 20 20 72 63 20 3d 20 30 3b 0a 20 20 20 20 7d     rc = 0;.    }
30f30 0a 20 20 7d 65 6c 73 65 0a 0a 23 69 66 20 64 65  .  }else..#if de
30f40 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42  fined(SQLITE_DEB
30f50 55 47 29 20 26 26 20 64 65 66 69 6e 65 64 28 53  UG) && defined(S
30f60 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 45 4c  QLITE_ENABLE_SEL
30f70 45 43 54 54 52 41 43 45 29 0a 20 20 69 66 28 20  ECTTRACE).  if( 
30f80 63 3d 3d 27 73 27 20 26 26 20 6e 3d 3d 31 31 20  c=='s' && n==11 
30f90 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67  && strncmp(azArg
30fa0 5b 30 5d 2c 20 22 73 65 6c 65 63 74 74 72 61 63  [0], "selecttrac
30fb0 65 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20  e", n)==0 ){.   
30fc0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72   sqlite3SelectTr
30fd0 61 63 65 20 3d 20 28 69 6e 74 29 69 6e 74 65 67  ace = (int)integ
30fe0 65 72 56 61 6c 75 65 28 61 7a 41 72 67 5b 31 5d  erValue(azArg[1]
30ff0 29 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69  );.  }else.#endi
31000 66 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  f..#if defined(S
31010 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 45 53  QLITE_ENABLE_SES
31020 53 49 4f 4e 29 0a 20 20 69 66 28 20 63 3d 3d 27  SION).  if( c=='
31030 73 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a  s' && strncmp(az
31040 41 72 67 5b 30 5d 2c 22 73 65 73 73 69 6f 6e 22  Arg[0],"session"
31050 2c 6e 29 3d 3d 30 20 26 26 20 6e 3e 3d 33 20 29  ,n)==0 && n>=3 )
31060 7b 0a 20 20 20 20 4f 70 65 6e 53 65 73 73 69 6f  {.    OpenSessio
31070 6e 20 2a 70 53 65 73 73 69 6f 6e 20 3d 20 26 70  n *pSession = &p
31080 2d 3e 61 53 65 73 73 69 6f 6e 5b 30 5d 3b 0a 20  ->aSession[0];. 
31090 20 20 20 63 68 61 72 20 2a 2a 61 7a 43 6d 64 20     char **azCmd 
310a0 3d 20 26 61 7a 41 72 67 5b 31 5d 3b 0a 20 20 20  = &azArg[1];.   
310b0 20 69 6e 74 20 69 53 65 73 20 3d 20 30 3b 0a 20   int iSes = 0;. 
310c0 20 20 20 69 6e 74 20 6e 43 6d 64 20 3d 20 6e 41     int nCmd = nA
310d0 72 67 20 2d 20 31 3b 0a 20 20 20 20 69 6e 74 20  rg - 1;.    int 
310e0 69 3b 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3c  i;.    if( nArg<
310f0 3d 31 20 29 20 67 6f 74 6f 20 73 65 73 73 69 6f  =1 ) goto sessio
31100 6e 5f 73 79 6e 74 61 78 5f 65 72 72 6f 72 3b 0a  n_syntax_error;.
31110 20 20 20 20 6f 70 65 6e 5f 64 62 28 70 2c 20 30      open_db(p, 0
31120 29 3b 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3e  );.    if( nArg>
31130 3d 33 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28  =3 ){.      for(
31140 69 53 65 73 3d 30 3b 20 69 53 65 73 3c 70 2d 3e  iSes=0; iSes<p->
31150 6e 53 65 73 73 69 6f 6e 3b 20 69 53 65 73 2b 2b  nSession; iSes++
31160 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  ){.        if( s
31170 74 72 63 6d 70 28 70 2d 3e 61 53 65 73 73 69 6f  trcmp(p->aSessio
31180 6e 5b 69 53 65 73 5d 2e 7a 4e 61 6d 65 2c 20 61  n[iSes].zName, a
31190 7a 41 72 67 5b 31 5d 29 3d 3d 30 20 29 20 62 72  zArg[1])==0 ) br
311a0 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
311b0 20 20 20 69 66 28 20 69 53 65 73 3c 70 2d 3e 6e     if( iSes<p->n
311c0 53 65 73 73 69 6f 6e 20 29 7b 0a 20 20 20 20 20  Session ){.     
311d0 20 20 20 70 53 65 73 73 69 6f 6e 20 3d 20 26 70     pSession = &p
311e0 2d 3e 61 53 65 73 73 69 6f 6e 5b 69 53 65 73 5d  ->aSession[iSes]
311f0 3b 0a 20 20 20 20 20 20 20 20 61 7a 43 6d 64 2b  ;.        azCmd+
31200 2b 3b 0a 20 20 20 20 20 20 20 20 6e 43 6d 64 2d  +;.        nCmd-
31210 2d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  -;.      }else{.
31220 20 20 20 20 20 20 20 20 70 53 65 73 73 69 6f 6e          pSession
31230 20 3d 20 26 70 2d 3e 61 53 65 73 73 69 6f 6e 5b   = &p->aSession[
31240 30 5d 3b 0a 20 20 20 20 20 20 20 20 69 53 65 73  0];.        iSes
31250 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
31260 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 2e 73 65 73    }..    /* .ses
31270 73 69 6f 6e 20 61 74 74 61 63 68 20 54 41 42 4c  sion attach TABL
31280 45 0a 20 20 20 20 2a 2a 20 49 6e 76 6f 6b 65 20  E.    ** Invoke 
31290 74 68 65 20 73 71 6c 69 74 65 33 73 65 73 73 69  the sqlite3sessi
312a0 6f 6e 5f 61 74 74 61 63 68 28 29 20 69 6e 74 65  on_attach() inte
312b0 72 66 61 63 65 20 74 6f 20 61 74 74 61 63 68 20  rface to attach 
312c0 61 20 70 61 72 74 69 63 75 6c 61 72 0a 20 20 20  a particular.   
312d0 20 2a 2a 20 74 61 62 6c 65 20 73 6f 20 74 68 61   ** table so tha
312e0 74 20 69 74 20 69 73 20 6e 65 76 65 72 20 66 69  t it is never fi
312f0 6c 74 65 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  ltered..    */. 
31300 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 61 7a     if( strcmp(az
31310 43 6d 64 5b 30 5d 2c 22 61 74 74 61 63 68 22 29  Cmd[0],"attach")
31320 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ==0 ){.      if(
31330 20 6e 43 6d 64 21 3d 32 20 29 20 67 6f 74 6f 20   nCmd!=2 ) goto 
31340 73 65 73 73 69 6f 6e 5f 73 79 6e 74 61 78 5f 65  session_syntax_e
31350 72 72 6f 72 3b 0a 20 20 20 20 20 20 69 66 28 20  rror;.      if( 
31360 70 53 65 73 73 69 6f 6e 2d 3e 70 3d 3d 30 20 29  pSession->p==0 )
31370 7b 0a 20 20 20 20 20 20 20 20 73 65 73 73 69 6f  {.        sessio
31380 6e 5f 6e 6f 74 5f 6f 70 65 6e 3a 0a 20 20 20 20  n_not_open:.    
31390 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73      raw_printf(s
313a0 74 64 65 72 72 2c 20 22 45 52 52 4f 52 3a 20 4e  tderr, "ERROR: N
313b0 6f 20 73 65 73 73 69 6f 6e 73 20 61 72 65 20 6f  o sessions are o
313c0 70 65 6e 5c 6e 22 29 3b 0a 20 20 20 20 20 20 7d  pen\n");.      }
313d0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63  else{.        rc
313e0 20 3d 20 73 71 6c 69 74 65 33 73 65 73 73 69 6f   = sqlite3sessio
313f0 6e 5f 61 74 74 61 63 68 28 70 53 65 73 73 69 6f  n_attach(pSessio
31400 6e 2d 3e 70 2c 20 61 7a 43 6d 64 5b 31 5d 29 3b  n->p, azCmd[1]);
31410 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20  .        if( rc 
31420 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 61 77  ){.          raw
31430 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
31440 22 45 52 52 4f 52 3a 20 73 71 6c 69 74 65 33 73  "ERROR: sqlite3s
31450 65 73 73 69 6f 6e 5f 61 74 74 61 63 68 28 29 20  ession_attach() 
31460 72 65 74 75 72 6e 73 20 25 64 5c 6e 22 2c 20 72  returns %d\n", r
31470 63 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63  c);.          rc
31480 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 0;.        }.
31490 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
314a0 65 0a 0a 20 20 20 20 2f 2a 20 2e 73 65 73 73 69  e..    /* .sessi
314b0 6f 6e 20 63 68 61 6e 67 65 73 65 74 20 46 49 4c  on changeset FIL
314c0 45 0a 20 20 20 20 2a 2a 20 2e 73 65 73 73 69 6f  E.    ** .sessio
314d0 6e 20 70 61 74 63 68 73 65 74 20 46 49 4c 45 0a  n patchset FILE.
314e0 20 20 20 20 2a 2a 20 57 72 69 74 65 20 61 20 63      ** Write a c
314f0 68 61 6e 67 65 73 65 74 20 6f 72 20 70 61 74 63  hangeset or patc
31500 68 73 65 74 20 69 6e 74 6f 20 61 20 66 69 6c 65  hset into a file
31510 2e 20 20 54 68 65 20 66 69 6c 65 20 69 73 20 6f  .  The file is o
31520 76 65 72 77 72 69 74 74 65 6e 2e 0a 20 20 20 20  verwritten..    
31530 2a 2f 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d  */.    if( strcm
31540 70 28 61 7a 43 6d 64 5b 30 5d 2c 22 63 68 61 6e  p(azCmd[0],"chan
31550 67 65 73 65 74 22 29 3d 3d 30 20 7c 7c 20 73 74  geset")==0 || st
31560 72 63 6d 70 28 61 7a 43 6d 64 5b 30 5d 2c 22 70  rcmp(azCmd[0],"p
31570 61 74 63 68 73 65 74 22 29 3d 3d 30 20 29 7b 0a  atchset")==0 ){.
31580 20 20 20 20 20 20 46 49 4c 45 20 2a 6f 75 74 20        FILE *out 
31590 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 6e  = 0;.      if( n
315a0 43 6d 64 21 3d 32 20 29 20 67 6f 74 6f 20 73 65  Cmd!=2 ) goto se
315b0 73 73 69 6f 6e 5f 73 79 6e 74 61 78 5f 65 72 72  ssion_syntax_err
315c0 6f 72 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53  or;.      if( pS
315d0 65 73 73 69 6f 6e 2d 3e 70 3d 3d 30 20 29 20 67  ession->p==0 ) g
315e0 6f 74 6f 20 73 65 73 73 69 6f 6e 5f 6e 6f 74 5f  oto session_not_
315f0 6f 70 65 6e 3b 0a 20 20 20 20 20 20 6f 75 74 20  open;.      out 
31600 3d 20 66 6f 70 65 6e 28 61 7a 43 6d 64 5b 31 5d  = fopen(azCmd[1]
31610 2c 20 22 77 62 22 29 3b 0a 20 20 20 20 20 20 69  , "wb");.      i
31620 66 28 20 6f 75 74 3d 3d 30 20 29 7b 0a 20 20 20  f( out==0 ){.   
31630 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
31640 28 73 74 64 65 72 72 2c 20 22 45 52 52 4f 52 3a  (stderr, "ERROR:
31650 20 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 5c 22 25   cannot open \"%
31660 73 5c 22 20 66 6f 72 20 77 72 69 74 69 6e 67 5c  s\" for writing\
31670 6e 22 2c 20 61 7a 43 6d 64 5b 31 5d 29 3b 0a 20  n", azCmd[1]);. 
31680 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
31690 20 20 20 20 69 6e 74 20 73 7a 43 68 6e 67 3b 0a      int szChng;.
316a0 20 20 20 20 20 20 20 20 76 6f 69 64 20 2a 70 43          void *pC
316b0 68 6e 67 3b 0a 20 20 20 20 20 20 20 20 69 66 28  hng;.        if(
316c0 20 61 7a 43 6d 64 5b 30 5d 5b 30 5d 3d 3d 27 63   azCmd[0][0]=='c
316d0 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  ' ){.          r
316e0 63 20 3d 20 73 71 6c 69 74 65 33 73 65 73 73 69  c = sqlite3sessi
316f0 6f 6e 5f 63 68 61 6e 67 65 73 65 74 28 70 53 65  on_changeset(pSe
31700 73 73 69 6f 6e 2d 3e 70 2c 20 26 73 7a 43 68 6e  ssion->p, &szChn
31710 67 2c 20 26 70 43 68 6e 67 29 3b 0a 20 20 20 20  g, &pChng);.    
31720 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
31730 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
31740 33 73 65 73 73 69 6f 6e 5f 70 61 74 63 68 73 65  3session_patchse
31750 74 28 70 53 65 73 73 69 6f 6e 2d 3e 70 2c 20 26  t(pSession->p, &
31760 73 7a 43 68 6e 67 2c 20 26 70 43 68 6e 67 29 3b  szChng, &pChng);
31770 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
31780 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
31790 20 20 20 20 20 20 20 70 72 69 6e 74 66 28 22 45         printf("E
317a0 72 72 6f 72 3a 20 65 72 72 6f 72 20 63 6f 64 65  rror: error code
317b0 20 25 64 5c 6e 22 2c 20 72 63 29 3b 0a 20 20 20   %d\n", rc);.   
317c0 20 20 20 20 20 20 20 72 63 20 3d 20 30 3b 0a 20         rc = 0;. 
317d0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
317e0 20 69 66 28 20 70 43 68 6e 67 0a 20 20 20 20 20   if( pChng.     
317f0 20 20 20 20 20 26 26 20 66 77 72 69 74 65 28 70       && fwrite(p
31800 43 68 6e 67 2c 20 73 7a 43 68 6e 67 2c 20 31 2c  Chng, szChng, 1,
31810 20 6f 75 74 29 21 3d 31 20 29 7b 0a 20 20 20 20   out)!=1 ){.    
31820 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
31830 28 73 74 64 65 72 72 2c 20 22 45 52 52 4f 52 3a  (stderr, "ERROR:
31840 20 46 61 69 6c 65 64 20 74 6f 20 77 72 69 74 65   Failed to write
31850 20 65 6e 74 69 72 65 20 25 64 2d 62 79 74 65 20   entire %d-byte 
31860 6f 75 74 70 75 74 5c 6e 22 2c 0a 20 20 20 20 20  output\n",.     
31870 20 20 20 20 20 20 20 20 20 20 20 20 20 73 7a 43               szC
31880 68 6e 67 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  hng);.        }.
31890 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
318a0 66 72 65 65 28 70 43 68 6e 67 29 3b 0a 20 20 20  free(pChng);.   
318b0 20 20 20 20 20 66 63 6c 6f 73 65 28 6f 75 74 29       fclose(out)
318c0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
318d0 6c 73 65 0a 0a 20 20 20 20 2f 2a 20 2e 73 65 73  lse..    /* .ses
318e0 73 69 6f 6e 20 63 6c 6f 73 65 0a 20 20 20 20 2a  sion close.    *
318f0 2a 20 43 6c 6f 73 65 20 74 68 65 20 69 64 65 6e  * Close the iden
31900 74 69 66 69 65 64 20 73 65 73 73 69 6f 6e 0a 20  tified session. 
31910 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 74     */.    if( st
31920 72 63 6d 70 28 61 7a 43 6d 64 5b 30 5d 2c 20 22  rcmp(azCmd[0], "
31930 63 6c 6f 73 65 22 29 3d 3d 30 20 29 7b 0a 20 20  close")==0 ){.  
31940 20 20 20 20 69 66 28 20 6e 43 6d 64 21 3d 31 20      if( nCmd!=1 
31950 29 20 67 6f 74 6f 20 73 65 73 73 69 6f 6e 5f 73  ) goto session_s
31960 79 6e 74 61 78 5f 65 72 72 6f 72 3b 0a 20 20 20  yntax_error;.   
31970 20 20 20 69 66 28 20 70 2d 3e 6e 53 65 73 73 69     if( p->nSessi
31980 6f 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 73 65  on ){.        se
31990 73 73 69 6f 6e 5f 63 6c 6f 73 65 28 70 53 65 73  ssion_close(pSes
319a0 73 69 6f 6e 29 3b 0a 20 20 20 20 20 20 20 20 70  sion);.        p
319b0 2d 3e 61 53 65 73 73 69 6f 6e 5b 69 53 65 73 5d  ->aSession[iSes]
319c0 20 3d 20 70 2d 3e 61 53 65 73 73 69 6f 6e 5b 2d   = p->aSession[-
319d0 2d 70 2d 3e 6e 53 65 73 73 69 6f 6e 5d 3b 0a 20  -p->nSession];. 
319e0 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
319f0 0a 0a 20 20 20 20 2f 2a 20 2e 73 65 73 73 69 6f  ..    /* .sessio
31a00 6e 20 65 6e 61 62 6c 65 20 3f 42 4f 4f 4c 45 41  n enable ?BOOLEA
31a10 4e 3f 0a 20 20 20 20 2a 2a 20 51 75 65 72 79 20  N?.    ** Query 
31a20 6f 72 20 73 65 74 20 74 68 65 20 65 6e 61 62 6c  or set the enabl
31a30 65 20 66 6c 61 67 0a 20 20 20 20 2a 2f 0a 20 20  e flag.    */.  
31a40 20 20 69 66 28 20 73 74 72 63 6d 70 28 61 7a 43    if( strcmp(azC
31a50 6d 64 5b 30 5d 2c 20 22 65 6e 61 62 6c 65 22 29  md[0], "enable")
31a60 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ==0 ){.      int
31a70 20 69 69 3b 0a 20 20 20 20 20 20 69 66 28 20 6e   ii;.      if( n
31a80 43 6d 64 3e 32 20 29 20 67 6f 74 6f 20 73 65 73  Cmd>2 ) goto ses
31a90 73 69 6f 6e 5f 73 79 6e 74 61 78 5f 65 72 72 6f  sion_syntax_erro
31aa0 72 3b 0a 20 20 20 20 20 20 69 69 20 3d 20 6e 43  r;.      ii = nC
31ab0 6d 64 3d 3d 31 20 3f 20 2d 31 20 3a 20 62 6f 6f  md==1 ? -1 : boo
31ac0 6c 65 61 6e 56 61 6c 75 65 28 61 7a 43 6d 64 5b  leanValue(azCmd[
31ad0 31 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  1]);.      if( p
31ae0 2d 3e 6e 53 65 73 73 69 6f 6e 20 29 7b 0a 20 20  ->nSession ){.  
31af0 20 20 20 20 20 20 69 69 20 3d 20 73 71 6c 69 74        ii = sqlit
31b00 65 33 73 65 73 73 69 6f 6e 5f 65 6e 61 62 6c 65  e3session_enable
31b10 28 70 53 65 73 73 69 6f 6e 2d 3e 70 2c 20 69 69  (pSession->p, ii
31b20 29 3b 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f  );.        utf8_
31b30 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
31b40 73 65 73 73 69 6f 6e 20 25 73 20 65 6e 61 62 6c  session %s enabl
31b50 65 20 66 6c 61 67 20 3d 20 25 64 5c 6e 22 2c 0a  e flag = %d\n",.
31b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31b70 20 20 20 20 70 53 65 73 73 69 6f 6e 2d 3e 7a 4e      pSession->zN
31b80 61 6d 65 2c 20 69 69 29 3b 0a 20 20 20 20 20 20  ame, ii);.      
31b90 7d 0a 20 20 20 20 7d 65 6c 73 65 0a 0a 20 20 20  }.    }else..   
31ba0 20 2f 2a 20 2e 73 65 73 73 69 6f 6e 20 66 69 6c   /* .session fil
31bb0 74 65 72 20 47 4c 4f 42 20 2e 2e 2e 2e 0a 20 20  ter GLOB .....  
31bc0 20 20 2a 2a 20 53 65 74 20 61 20 6c 69 73 74 20    ** Set a list 
31bd0 6f 66 20 47 4c 4f 42 20 70 61 74 74 65 72 6e 73  of GLOB patterns
31be0 20 6f 66 20 74 61 62 6c 65 20 6e 61 6d 65 73 20   of table names 
31bf0 74 6f 20 62 65 20 65 78 63 6c 75 64 65 64 2e 0a  to be excluded..
31c00 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73      */.    if( s
31c10 74 72 63 6d 70 28 61 7a 43 6d 64 5b 30 5d 2c 20  trcmp(azCmd[0], 
31c20 22 66 69 6c 74 65 72 22 29 3d 3d 30 20 29 7b 0a  "filter")==0 ){.
31c30 20 20 20 20 20 20 69 6e 74 20 69 69 2c 20 6e 42        int ii, nB
31c40 79 74 65 3b 0a 20 20 20 20 20 20 69 66 28 20 6e  yte;.      if( n
31c50 43 6d 64 3c 32 20 29 20 67 6f 74 6f 20 73 65 73  Cmd<2 ) goto ses
31c60 73 69 6f 6e 5f 73 79 6e 74 61 78 5f 65 72 72 6f  sion_syntax_erro
31c70 72 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  r;.      if( p->
31c80 6e 53 65 73 73 69 6f 6e 20 29 7b 0a 20 20 20 20  nSession ){.    
31c90 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69      for(ii=0; ii
31ca0 3c 70 53 65 73 73 69 6f 6e 2d 3e 6e 46 69 6c 74  <pSession->nFilt
31cb0 65 72 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20  er; ii++){.     
31cc0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
31cd0 65 28 70 53 65 73 73 69 6f 6e 2d 3e 61 7a 46 69  e(pSession->azFi
31ce0 6c 74 65 72 5b 69 69 5d 29 3b 0a 20 20 20 20 20  lter[ii]);.     
31cf0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c     }.        sql
31d00 69 74 65 33 5f 66 72 65 65 28 70 53 65 73 73 69  ite3_free(pSessi
31d10 6f 6e 2d 3e 61 7a 46 69 6c 74 65 72 29 3b 0a 20  on->azFilter);. 
31d20 20 20 20 20 20 20 20 6e 42 79 74 65 20 3d 20 73         nByte = s
31d30 69 7a 65 6f 66 28 70 53 65 73 73 69 6f 6e 2d 3e  izeof(pSession->
31d40 61 7a 46 69 6c 74 65 72 5b 30 5d 29 2a 28 6e 43  azFilter[0])*(nC
31d50 6d 64 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 70  md-1);.        p
31d60 53 65 73 73 69 6f 6e 2d 3e 61 7a 46 69 6c 74 65  Session->azFilte
31d70 72 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  r = sqlite3_mall
31d80 6f 63 28 20 6e 42 79 74 65 20 29 3b 0a 20 20 20  oc( nByte );.   
31d90 20 20 20 20 20 69 66 28 20 70 53 65 73 73 69 6f       if( pSessio
31da0 6e 2d 3e 61 7a 46 69 6c 74 65 72 3d 3d 30 20 29  n->azFilter==0 )
31db0 7b 0a 20 20 20 20 20 20 20 20 20 20 72 61 77 5f  {.          raw_
31dc0 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
31dd0 45 72 72 6f 72 3a 20 6f 75 74 20 6f 72 20 6d 65  Error: out or me
31de0 6d 6f 72 79 5c 6e 22 29 3b 0a 20 20 20 20 20 20  mory\n");.      
31df0 20 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20 20      exit(1);.   
31e00 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 66       }.        f
31e10 6f 72 28 69 69 3d 31 3b 20 69 69 3c 6e 43 6d 64  or(ii=1; ii<nCmd
31e20 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  ; ii++){.       
31e30 20 20 20 70 53 65 73 73 69 6f 6e 2d 3e 61 7a 46     pSession->azF
31e40 69 6c 74 65 72 5b 69 69 2d 31 5d 20 3d 20 73 71  ilter[ii-1] = sq
31e50 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25  lite3_mprintf("%
31e60 73 22 2c 20 61 7a 43 6d 64 5b 69 69 5d 29 3b 0a  s", azCmd[ii]);.
31e70 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
31e80 20 20 70 53 65 73 73 69 6f 6e 2d 3e 6e 46 69 6c    pSession->nFil
31e90 74 65 72 20 3d 20 69 69 2d 31 3b 0a 20 20 20 20  ter = ii-1;.    
31ea0 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 0a 0a 20    }.    }else.. 
31eb0 20 20 20 2f 2a 20 2e 73 65 73 73 69 6f 6e 20 69     /* .session i
31ec0 6e 64 69 72 65 63 74 20 3f 42 4f 4f 4c 45 41 4e  ndirect ?BOOLEAN
31ed0 3f 0a 20 20 20 20 2a 2a 20 51 75 65 72 79 20 6f  ?.    ** Query o
31ee0 72 20 73 65 74 20 74 68 65 20 69 6e 64 69 72 65  r set the indire
31ef0 63 74 20 66 6c 61 67 0a 20 20 20 20 2a 2f 0a 20  ct flag.    */. 
31f00 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 61 7a     if( strcmp(az
31f10 43 6d 64 5b 30 5d 2c 20 22 69 6e 64 69 72 65 63  Cmd[0], "indirec
31f20 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  t")==0 ){.      
31f30 69 6e 74 20 69 69 3b 0a 20 20 20 20 20 20 69 66  int ii;.      if
31f40 28 20 6e 43 6d 64 3e 32 20 29 20 67 6f 74 6f 20  ( nCmd>2 ) goto 
31f50 73 65 73 73 69 6f 6e 5f 73 79 6e 74 61 78 5f 65  session_syntax_e
31f60 72 72 6f 72 3b 0a 20 20 20 20 20 20 69 69 20 3d  rror;.      ii =
31f70 20 6e 43 6d 64 3d 3d 31 20 3f 20 2d 31 20 3a 20   nCmd==1 ? -1 : 
31f80 62 6f 6f 6c 65 61 6e 56 61 6c 75 65 28 61 7a 43  booleanValue(azC
31f90 6d 64 5b 31 5d 29 3b 0a 20 20 20 20 20 20 69 66  md[1]);.      if
31fa0 28 20 70 2d 3e 6e 53 65 73 73 69 6f 6e 20 29 7b  ( p->nSession ){
31fb0 0a 20 20 20 20 20 20 20 20 69 69 20 3d 20 73 71  .        ii = sq
31fc0 6c 69 74 65 33 73 65 73 73 69 6f 6e 5f 69 6e 64  lite3session_ind
31fd0 69 72 65 63 74 28 70 53 65 73 73 69 6f 6e 2d 3e  irect(pSession->
31fe0 70 2c 20 69 69 29 3b 0a 20 20 20 20 20 20 20 20  p, ii);.        
31ff0 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f  utf8_printf(p->o
32000 75 74 2c 20 22 73 65 73 73 69 6f 6e 20 25 73 20  ut, "session %s 
32010 69 6e 64 69 72 65 63 74 20 66 6c 61 67 20 3d 20  indirect flag = 
32020 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %d\n",.         
32030 20 20 20 20 20 20 20 20 20 20 20 70 53 65 73 73             pSess
32040 69 6f 6e 2d 3e 7a 4e 61 6d 65 2c 20 69 69 29 3b  ion->zName, ii);
32050 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
32060 73 65 0a 0a 20 20 20 20 2f 2a 20 2e 73 65 73 73  se..    /* .sess
32070 69 6f 6e 20 69 73 65 6d 70 74 79 0a 20 20 20 20  ion isempty.    
32080 2a 2a 20 44 65 74 65 72 6d 69 6e 65 20 69 66 20  ** Determine if 
32090 74 68 65 20 73 65 73 73 69 6f 6e 20 69 73 20 65  the session is e
320a0 6d 70 74 79 0a 20 20 20 20 2a 2f 0a 20 20 20 20  mpty.    */.    
320b0 69 66 28 20 73 74 72 63 6d 70 28 61 7a 43 6d 64  if( strcmp(azCmd
320c0 5b 30 5d 2c 20 22 69 73 65 6d 70 74 79 22 29 3d  [0], "isempty")=
320d0 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  =0 ){.      int 
320e0 69 69 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 43  ii;.      if( nC
320f0 6d 64 21 3d 31 20 29 20 67 6f 74 6f 20 73 65 73  md!=1 ) goto ses
32100 73 69 6f 6e 5f 73 79 6e 74 61 78 5f 65 72 72 6f  sion_syntax_erro
32110 72 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  r;.      if( p->
32120 6e 53 65 73 73 69 6f 6e 20 29 7b 0a 20 20 20 20  nSession ){.    
32130 20 20 20 20 69 69 20 3d 20 73 71 6c 69 74 65 33      ii = sqlite3
32140 73 65 73 73 69 6f 6e 5f 69 73 65 6d 70 74 79 28  session_isempty(
32150 70 53 65 73 73 69 6f 6e 2d 3e 70 29 3b 0a 20 20  pSession->p);.  
32160 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
32170 66 28 70 2d 3e 6f 75 74 2c 20 22 73 65 73 73 69  f(p->out, "sessi
32180 6f 6e 20 25 73 20 69 73 65 6d 70 74 79 20 66 6c  on %s isempty fl
32190 61 67 20 3d 20 25 64 5c 6e 22 2c 0a 20 20 20 20  ag = %d\n",.    
321a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
321b0 70 53 65 73 73 69 6f 6e 2d 3e 7a 4e 61 6d 65 2c  pSession->zName,
321c0 20 69 69 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20   ii);.      }.  
321d0 20 20 7d 65 6c 73 65 0a 0a 20 20 20 20 2f 2a 20    }else..    /* 
321e0 2e 73 65 73 73 69 6f 6e 20 6c 69 73 74 0a 20 20  .session list.  
321f0 20 20 2a 2a 20 4c 69 73 74 20 61 6c 6c 20 63 75    ** List all cu
32200 72 72 65 6e 74 6c 79 20 6f 70 65 6e 20 73 65 73  rrently open ses
32210 73 69 6f 6e 73 0a 20 20 20 20 2a 2f 0a 20 20 20  sions.    */.   
32220 20 69 66 28 20 73 74 72 63 6d 70 28 61 7a 43 6d   if( strcmp(azCm
32230 64 5b 30 5d 2c 22 6c 69 73 74 22 29 3d 3d 30 20  d[0],"list")==0 
32240 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  ){.      for(i=0
32250 3b 20 69 3c 70 2d 3e 6e 53 65 73 73 69 6f 6e 3b  ; i<p->nSession;
32260 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 75   i++){.        u
32270 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  tf8_printf(p->ou
32280 74 2c 20 22 25 64 20 25 73 5c 6e 22 2c 20 69 2c  t, "%d %s\n", i,
32290 20 70 2d 3e 61 53 65 73 73 69 6f 6e 5b 69 5d 2e   p->aSession[i].
322a0 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a  zName);.      }.
322b0 20 20 20 20 7d 65 6c 73 65 0a 0a 20 20 20 20 2f      }else..    /
322c0 2a 20 2e 73 65 73 73 69 6f 6e 20 6f 70 65 6e 20  * .session open 
322d0 44 42 20 4e 41 4d 45 0a 20 20 20 20 2a 2a 20 4f  DB NAME.    ** O
322e0 70 65 6e 20 61 20 6e 65 77 20 73 65 73 73 69 6f  pen a new sessio
322f0 6e 20 63 61 6c 6c 65 64 20 4e 41 4d 45 20 6f 6e  n called NAME on
32300 20 74 68 65 20 61 74 74 61 63 68 65 64 20 64 61   the attached da
32310 74 61 62 61 73 65 20 44 42 2e 0a 20 20 20 20 2a  tabase DB..    *
32320 2a 20 44 42 20 69 73 20 6e 6f 72 6d 61 6c 6c 79  * DB is normally
32330 20 22 6d 61 69 6e 22 2e 0a 20 20 20 20 2a 2f 0a   "main"..    */.
32340 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 61      if( strcmp(a
32350 7a 43 6d 64 5b 30 5d 2c 22 6f 70 65 6e 22 29 3d  zCmd[0],"open")=
32360 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72  =0 ){.      char
32370 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 69   *zName;.      i
32380 66 28 20 6e 43 6d 64 21 3d 33 20 29 20 67 6f 74  f( nCmd!=3 ) got
32390 6f 20 73 65 73 73 69 6f 6e 5f 73 79 6e 74 61 78  o session_syntax
323a0 5f 65 72 72 6f 72 3b 0a 20 20 20 20 20 20 7a 4e  _error;.      zN
323b0 61 6d 65 20 3d 20 61 7a 43 6d 64 5b 32 5d 3b 0a  ame = azCmd[2];.
323c0 20 20 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 5b        if( zName[
323d0 30 5d 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65 73  0]==0 ) goto ses
323e0 73 69 6f 6e 5f 73 79 6e 74 61 78 5f 65 72 72 6f  sion_syntax_erro
323f0 72 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  r;.      for(i=0
32400 3b 20 69 3c 70 2d 3e 6e 53 65 73 73 69 6f 6e 3b  ; i<p->nSession;
32410 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   i++){.        i
32420 66 28 20 73 74 72 63 6d 70 28 70 2d 3e 61 53 65  f( strcmp(p->aSe
32430 73 73 69 6f 6e 5b 69 5d 2e 7a 4e 61 6d 65 2c 7a  ssion[i].zName,z
32440 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Name)==0 ){.    
32450 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
32460 66 28 73 74 64 65 72 72 2c 20 22 53 65 73 73 69  f(stderr, "Sessi
32470 6f 6e 20 5c 22 25 73 5c 22 20 61 6c 72 65 61 64  on \"%s\" alread
32480 79 20 65 78 69 73 74 73 5c 6e 22 2c 20 7a 4e 61  y exists\n", zNa
32490 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67  me);.          g
324a0 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64  oto meta_command
324b0 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 20 20 7d  _exit;.        }
324c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
324d0 66 28 20 70 2d 3e 6e 53 65 73 73 69 6f 6e 3e 3d  f( p->nSession>=
324e0 41 72 72 61 79 53 69 7a 65 28 70 2d 3e 61 53 65  ArraySize(p->aSe
324f0 73 73 69 6f 6e 29 20 29 7b 0a 20 20 20 20 20 20  ssion) ){.      
32500 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64    raw_printf(std
32510 65 72 72 2c 20 22 4d 61 78 69 6d 75 6d 20 6f 66  err, "Maximum of
32520 20 25 64 20 73 65 73 73 69 6f 6e 73 5c 6e 22 2c   %d sessions\n",
32530 20 41 72 72 61 79 53 69 7a 65 28 70 2d 3e 61 53   ArraySize(p->aS
32540 65 73 73 69 6f 6e 29 29 3b 0a 20 20 20 20 20 20  ession));.      
32550 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d    goto meta_comm
32560 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20 20 20  and_exit;.      
32570 7d 0a 20 20 20 20 20 20 70 53 65 73 73 69 6f 6e  }.      pSession
32580 20 3d 20 26 70 2d 3e 61 53 65 73 73 69 6f 6e 5b   = &p->aSession[
32590 70 2d 3e 6e 53 65 73 73 69 6f 6e 5d 3b 0a 20 20  p->nSession];.  
325a0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
325b0 73 65 73 73 69 6f 6e 5f 63 72 65 61 74 65 28 70  session_create(p
325c0 2d 3e 64 62 2c 20 61 7a 43 6d 64 5b 31 5d 2c 20  ->db, azCmd[1], 
325d0 26 70 53 65 73 73 69 6f 6e 2d 3e 70 29 3b 0a 20  &pSession->p);. 
325e0 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
325f0 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74         raw_print
32600 66 28 73 74 64 65 72 72 2c 20 22 43 61 6e 6e 6f  f(stderr, "Canno
32610 74 20 6f 70 65 6e 20 73 65 73 73 69 6f 6e 3a 20  t open session: 
32620 65 72 72 6f 72 20 63 6f 64 65 3d 25 64 5c 6e 22  error code=%d\n"
32630 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 20 20 72  , rc);.        r
32640 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 67  c = 0;.        g
32650 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64  oto meta_command
32660 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 7d 0a 20  _exit;.      }. 
32670 20 20 20 20 20 70 53 65 73 73 69 6f 6e 2d 3e 6e       pSession->n
32680 46 69 6c 74 65 72 20 3d 20 30 3b 0a 20 20 20 20  Filter = 0;.    
32690 20 20 73 71 6c 69 74 65 33 73 65 73 73 69 6f 6e    sqlite3session
326a0 5f 74 61 62 6c 65 5f 66 69 6c 74 65 72 28 70 53  _table_filter(pS
326b0 65 73 73 69 6f 6e 2d 3e 70 2c 20 73 65 73 73 69  ession->p, sessi
326c0 6f 6e 5f 66 69 6c 74 65 72 2c 20 70 53 65 73 73  on_filter, pSess
326d0 69 6f 6e 29 3b 0a 20 20 20 20 20 20 70 2d 3e 6e  ion);.      p->n
326e0 53 65 73 73 69 6f 6e 2b 2b 3b 0a 20 20 20 20 20  Session++;.     
326f0 20 70 53 65 73 73 69 6f 6e 2d 3e 7a 4e 61 6d 65   pSession->zName
32700 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
32710 74 66 28 22 25 73 22 2c 20 7a 4e 61 6d 65 29 3b  tf("%s", zName);
32720 0a 20 20 20 20 7d 65 6c 73 65 0a 20 20 20 20 2f  .    }else.    /
32730 2a 20 49 66 20 6e 6f 20 63 6f 6d 6d 61 6e 64 20  * If no command 
32740 6e 61 6d 65 20 6d 61 74 63 68 65 73 2c 20 73 68  name matches, sh
32750 6f 77 20 61 20 73 79 6e 74 61 78 20 65 72 72 6f  ow a syntax erro
32760 72 20 2a 2f 0a 20 20 20 20 73 65 73 73 69 6f 6e  r */.    session
32770 5f 73 79 6e 74 61 78 5f 65 72 72 6f 72 3a 0a 20  _syntax_error:. 
32780 20 20 20 73 65 73 73 69 6f 6e 5f 68 65 6c 70 28     session_help(
32790 70 29 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64  p);.  }else.#end
327a0 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  if..#ifdef SQLIT
327b0 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 55 6e 64  E_DEBUG.  /* Und
327c0 6f 63 75 6d 65 6e 74 65 64 20 63 6f 6d 6d 61 6e  ocumented comman
327d0 64 73 20 66 6f 72 20 69 6e 74 65 72 6e 61 6c 20  ds for internal 
327e0 74 65 73 74 69 6e 67 2e 20 20 53 75 62 6a 65 63  testing.  Subjec
327f0 74 20 74 6f 20 63 68 61 6e 67 65 0a 20 20 2a 2a  t to change.  **
32800 20 77 69 74 68 6f 75 74 20 6e 6f 74 69 63 65 2e   without notice.
32810 20 2a 2f 0a 20 20 69 66 28 20 63 3d 3d 27 73 27   */.  if( c=='s'
32820 20 26 26 20 6e 3e 3d 31 30 20 26 26 20 73 74 72   && n>=10 && str
32830 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22  ncmp(azArg[0], "
32840 73 65 6c 66 74 65 73 74 2d 22 2c 20 39 29 3d 3d  selftest-", 9)==
32850 30 20 29 7b 0a 20 20 20 20 69 66 28 20 73 74 72  0 ){.    if( str
32860 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2b 39 2c  ncmp(azArg[0]+9,
32870 20 22 62 6f 6f 6c 65 61 6e 22 2c 20 6e 2d 39 29   "boolean", n-9)
32880 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ==0 ){.      int
32890 20 69 2c 20 76 3b 0a 20 20 20 20 20 20 66 6f 72   i, v;.      for
328a0 28 69 3d 31 3b 20 69 3c 6e 41 72 67 3b 20 69 2b  (i=1; i<nArg; i+
328b0 2b 29 7b 0a 20 20 20 20 20 20 20 20 76 20 3d 20  +){.        v = 
328c0 62 6f 6f 6c 65 61 6e 56 61 6c 75 65 28 61 7a 41  booleanValue(azA
328d0 72 67 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20  rg[i]);.        
328e0 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f  utf8_printf(p->o
328f0 75 74 2c 20 22 25 73 3a 20 25 64 20 30 78 25 78  ut, "%s: %d 0x%x
32900 5c 6e 22 2c 20 61 7a 41 72 67 5b 69 5d 2c 20 76  \n", azArg[i], v
32910 2c 20 76 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , v);.      }.  
32920 20 20 7d 0a 20 20 20 20 69 66 28 20 73 74 72 6e    }.    if( strn
32930 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2b 39 2c 20  cmp(azArg[0]+9, 
32940 22 69 6e 74 65 67 65 72 22 2c 20 6e 2d 39 29 3d  "integer", n-9)=
32950 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  =0 ){.      int 
32960 69 3b 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  i; sqlite3_int64
32970 20 76 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d   v;.      for(i=
32980 31 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b  1; i<nArg; i++){
32990 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 7a 42  .        char zB
329a0 75 66 5b 32 30 30 5d 3b 0a 20 20 20 20 20 20 20  uf[200];.       
329b0 20 76 20 3d 20 69 6e 74 65 67 65 72 56 61 6c 75   v = integerValu
329c0 65 28 61 7a 41 72 67 5b 69 5d 29 3b 0a 20 20 20  e(azArg[i]);.   
329d0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
329e0 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 42 75  rintf(sizeof(zBu
329f0 66 29 2c 7a 42 75 66 2c 22 25 73 3a 20 25 6c 6c  f),zBuf,"%s: %ll
32a00 64 20 30 78 25 6c 6c 78 5c 6e 22 2c 20 61 7a 41  d 0x%llx\n", azA
32a10 72 67 5b 69 5d 2c 76 2c 76 29 3b 0a 20 20 20 20  rg[i],v,v);.    
32a20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
32a30 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20 7a 42  p->out, "%s", zB
32a40 75 66 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  uf);.      }.   
32a50 20 7d 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69   }.  }else.#endi
32a60 66 0a 0a 20 20 69 66 28 20 63 3d 3d 27 73 27 20  f..  if( c=='s' 
32a70 26 26 20 6e 3e 3d 34 20 26 26 20 73 74 72 6e 63  && n>=4 && strnc
32a80 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 22 73 65 6c  mp(azArg[0],"sel
32a90 66 74 65 73 74 22 2c 6e 29 3d 3d 30 20 29 7b 0a  ftest",n)==0 ){.
32aa0 20 20 20 20 69 6e 74 20 62 49 73 49 6e 69 74 20      int bIsInit 
32ab0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  = 0;         /* 
32ac0 54 72 75 65 20 74 6f 20 69 6e 69 74 69 61 6c 69  True to initiali
32ad0 7a 65 20 74 68 65 20 53 45 4c 46 54 45 53 54 20  ze the SELFTEST 
32ae0 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 69 6e 74  table */.    int
32af0 20 62 56 65 72 62 6f 73 65 20 3d 20 30 3b 20 20   bVerbose = 0;  
32b00 20 20 20 20 20 20 2f 2a 20 56 65 72 62 6f 73 65        /* Verbose
32b10 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20 20 20 69   output */.    i
32b20 6e 74 20 62 53 65 6c 66 74 65 73 74 45 78 69 73  nt bSelftestExis
32b30 74 73 3b 20 20 20 20 20 2f 2a 20 54 72 75 65 20  ts;     /* True 
32b40 69 66 20 53 45 4c 46 54 45 53 54 20 61 6c 72 65  if SELFTEST alre
32b50 61 64 79 20 65 78 69 73 74 73 20 2a 2f 0a 20 20  ady exists */.  
32b60 20 20 69 6e 74 20 69 2c 20 6b 3b 20 20 20 20 20    int i, k;     
32b70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
32b80 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20  op counters */. 
32b90 20 20 20 69 6e 74 20 6e 54 65 73 74 20 3d 20 30     int nTest = 0
32ba0 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ;           /* N
32bb0 75 6d 62 65 72 20 6f 66 20 74 65 73 74 73 20 72  umber of tests r
32bc0 75 6e 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  uns */.    int n
32bd0 45 72 72 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Err = 0;        
32be0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
32bf0 20 65 72 72 6f 72 73 20 73 65 65 6e 20 2a 2f 0a   errors seen */.
32c00 20 20 20 20 53 68 65 6c 6c 54 65 78 74 20 73 74      ShellText st
32c10 72 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  r;           /* 
32c20 41 6e 73 77 65 72 20 66 6f 72 20 61 20 71 75 65  Answer for a que
32c30 72 79 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  ry */.    sqlite
32c40 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20  3_stmt *pStmt = 
32c50 30 3b 20 2f 2a 20 51 75 65 72 79 20 61 67 61 69  0; /* Query agai
32c60 6e 73 74 20 74 68 65 20 53 45 4c 46 54 45 53 54  nst the SELFTEST
32c70 20 74 61 62 6c 65 20 2a 2f 0a 0a 20 20 20 20 6f   table */..    o
32c80 70 65 6e 5f 64 62 28 70 2c 30 29 3b 0a 20 20 20  pen_db(p,0);.   
32c90 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 41 72 67   for(i=1; i<nArg
32ca0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 63 6f  ; i++){.      co
32cb0 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 61 7a  nst char *z = az
32cc0 41 72 67 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66  Arg[i];.      if
32cd0 28 20 7a 5b 30 5d 3d 3d 27 2d 27 20 26 26 20 7a  ( z[0]=='-' && z
32ce0 5b 31 5d 3d 3d 27 2d 27 20 29 20 7a 2b 2b 3b 0a  [1]=='-' ) z++;.
32cf0 20 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70        if( strcmp
32d00 28 7a 2c 22 2d 69 6e 69 74 22 29 3d 3d 30 20 29  (z,"-init")==0 )
32d10 7b 0a 20 20 20 20 20 20 20 20 62 49 73 49 6e 69  {.        bIsIni
32d20 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c  t = 1;.      }el
32d30 73 65 0a 20 20 20 20 20 20 69 66 28 20 73 74 72  se.      if( str
32d40 63 6d 70 28 7a 2c 22 2d 76 22 29 3d 3d 30 20 29  cmp(z,"-v")==0 )
32d50 7b 0a 20 20 20 20 20 20 20 20 62 56 65 72 62 6f  {.        bVerbo
32d60 73 65 2b 2b 3b 0a 20 20 20 20 20 20 7d 65 6c 73  se++;.      }els
32d70 65 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20  e.      {.      
32d80 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74    utf8_printf(st
32d90 64 65 72 72 2c 20 22 55 6e 6b 6e 6f 77 6e 20 6f  derr, "Unknown o
32da0 70 74 69 6f 6e 20 5c 22 25 73 5c 22 20 6f 6e 20  ption \"%s\" on 
32db0 5c 22 25 73 5c 22 5c 6e 22 2c 0a 20 20 20 20 20  \"%s\"\n",.     
32dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
32dd0 7a 41 72 67 5b 69 5d 2c 20 61 7a 41 72 67 5b 30  zArg[i], azArg[0
32de0 5d 29 3b 0a 20 20 20 20 20 20 20 20 72 61 77 5f  ]);.        raw_
32df0 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
32e00 53 68 6f 75 6c 64 20 62 65 20 6f 6e 65 20 6f 66  Should be one of
32e10 3a 20 2d 2d 69 6e 69 74 20 2d 76 5c 6e 22 29 3b  : --init -v\n");
32e20 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b  .        rc = 1;
32e30 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 65  .        goto me
32e40 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b  ta_command_exit;
32e50 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
32e60 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 74     if( sqlite3_t
32e70 61 62 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d 65 74 61  able_column_meta
32e80 64 61 74 61 28 70 2d 3e 64 62 2c 22 6d 61 69 6e  data(p->db,"main
32e90 22 2c 22 73 65 6c 66 74 65 73 74 22 2c 30 2c 30  ","selftest",0,0
32ea0 2c 30 2c 30 2c 30 2c 30 29 0a 20 20 20 20 20 20  ,0,0,0,0).      
32eb0 20 20 20 20 20 21 3d 20 53 51 4c 49 54 45 5f 4f       != SQLITE_O
32ec0 4b 20 29 7b 0a 20 20 20 20 20 20 62 53 65 6c 66  K ){.      bSelf
32ed0 74 65 73 74 45 78 69 73 74 73 20 3d 20 30 3b 0a  testExists = 0;.
32ee0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
32ef0 20 62 53 65 6c 66 74 65 73 74 45 78 69 73 74 73   bSelftestExists
32f00 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 1;.    }.    
32f10 69 66 28 20 62 49 73 49 6e 69 74 20 29 7b 0a 20  if( bIsInit ){. 
32f20 20 20 20 20 20 63 72 65 61 74 65 53 65 6c 66 74       createSelft
32f30 65 73 74 54 61 62 6c 65 28 70 29 3b 0a 20 20 20  estTable(p);.   
32f40 20 20 20 62 53 65 6c 66 74 65 73 74 45 78 69 73     bSelftestExis
32f50 74 73 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  ts = 1;.    }.  
32f60 20 20 69 6e 69 74 54 65 78 74 28 26 73 74 72 29    initText(&str)
32f70 3b 0a 20 20 20 20 61 70 70 65 6e 64 54 65 78 74  ;.    appendText
32f80 28 26 73 74 72 2c 20 22 78 22 2c 20 30 29 3b 0a  (&str, "x", 0);.
32f90 20 20 20 20 66 6f 72 28 6b 3d 62 53 65 6c 66 74      for(k=bSelft
32fa0 65 73 74 45 78 69 73 74 73 3b 20 6b 3e 3d 30 3b  estExists; k>=0;
32fb0 20 6b 2d 2d 29 7b 0a 20 20 20 20 20 20 69 66 28   k--){.      if(
32fc0 20 6b 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20   k==1 ){.       
32fd0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72   rc = sqlite3_pr
32fe0 65 70 61 72 65 5f 76 32 28 70 2d 3e 64 62 2c 0a  epare_v2(p->db,.
32ff0 20 20 20 20 20 20 20 20 20 20 20 20 22 53 45 4c              "SEL
33000 45 43 54 20 74 6e 6f 2c 6f 70 2c 63 6d 64 2c 61  ECT tno,op,cmd,a
33010 6e 73 20 46 52 4f 4d 20 73 65 6c 66 74 65 73 74  ns FROM selftest
33020 20 4f 52 44 45 52 20 42 59 20 74 6e 6f 22 2c 0a   ORDER BY tno",.
33030 20 20 20 20 20 20 20 20 20 20 20 20 2d 31 2c 20              -1, 
33040 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20  &pStmt, 0);.    
33050 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
33060 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72   rc = sqlite3_pr
33070 65 70 61 72 65 5f 76 32 28 70 2d 3e 64 62 2c 0a  epare_v2(p->db,.
33080 20 20 20 20 20 20 20 20 20 20 22 56 41 4c 55 45            "VALUE
33090 53 28 30 2c 27 6d 65 6d 6f 27 2c 27 4d 69 73 73  S(0,'memo','Miss
330a0 69 6e 67 20 53 45 4c 46 54 45 53 54 20 74 61 62  ing SELFTEST tab
330b0 6c 65 20 2d 20 64 65 66 61 75 6c 74 20 63 68 65  le - default che
330c0 63 6b 73 20 6f 6e 6c 79 27 2c 27 27 29 2c 22 0a  cks only',''),".
330d0 20 20 20 20 20 20 20 20 20 20 22 20 20 20 20 20            "     
330e0 20 28 31 2c 27 72 75 6e 27 2c 27 50 52 41 47 4d   (1,'run','PRAGM
330f0 41 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63  A integrity_chec
33100 6b 27 2c 27 6f 6b 27 29 22 2c 0a 20 20 20 20 20  k','ok')",.     
33110 20 20 20 20 20 2d 31 2c 20 26 70 53 74 6d 74 2c       -1, &pStmt,
33120 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
33130 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
33140 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
33150 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72 20 71  stderr, "Error q
33160 75 65 72 79 69 6e 67 20 74 68 65 20 73 65 6c 66  uerying the self
33170 74 65 73 74 20 74 61 62 6c 65 5c 6e 22 29 3b 0a  test table\n");.
33180 20 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a          rc = 1;.
33190 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
331a0 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b  finalize(pStmt);
331b0 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 65  .        goto me
331c0 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b  ta_command_exit;
331d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66  .      }.      f
331e0 6f 72 28 69 3d 31 3b 20 73 71 6c 69 74 65 33 5f  or(i=1; sqlite3_
331f0 73 74 65 70 28 70 53 74 6d 74 29 3d 3d 53 51 4c  step(pStmt)==SQL
33200 49 54 45 5f 52 4f 57 3b 20 69 2b 2b 29 7b 0a 20  ITE_ROW; i++){. 
33210 20 20 20 20 20 20 20 69 6e 74 20 74 6e 6f 20 3d         int tno =
33220 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
33230 69 6e 74 28 70 53 74 6d 74 2c 20 30 29 3b 0a 20  int(pStmt, 0);. 
33240 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61         const cha
33250 72 20 2a 7a 4f 70 20 3d 20 28 63 6f 6e 73 74 20  r *zOp = (const 
33260 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f  char*)sqlite3_co
33270 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c  lumn_text(pStmt,
33280 20 31 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e   1);.        con
33290 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 20 3d 20  st char *zSql = 
332a0 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c  (const char*)sql
332b0 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  ite3_column_text
332c0 28 70 53 74 6d 74 2c 20 32 29 3b 0a 20 20 20 20  (pStmt, 2);.    
332d0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
332e0 7a 41 6e 73 20 3d 20 28 63 6f 6e 73 74 20 63 68  zAns = (const ch
332f0 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75  ar*)sqlite3_colu
33300 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 33  mn_text(pStmt, 3
33310 29 3b 0a 0a 20 20 20 20 20 20 20 20 6b 20 3d 20  );..        k = 
33320 30 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 62  0;.        if( b
33330 56 65 72 62 6f 73 65 3e 30 20 29 7b 0a 20 20 20  Verbose>0 ){.   
33340 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 51 75         char *zQu
33350 6f 74 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  ote = sqlite3_mp
33360 72 69 6e 74 66 28 22 25 71 22 2c 20 7a 53 71 6c  rintf("%q", zSql
33370 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 72 69  );.          pri
33380 6e 74 66 28 22 25 64 3a 20 25 73 20 25 73 5c 6e  ntf("%d: %s %s\n
33390 22 2c 20 74 6e 6f 2c 20 7a 4f 70 2c 20 7a 53 71  ", tno, zOp, zSq
333a0 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  l);.          sq
333b0 6c 69 74 65 33 5f 66 72 65 65 28 7a 51 75 6f 74  lite3_free(zQuot
333c0 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  e);.        }.  
333d0 20 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70        if( strcmp
333e0 28 7a 4f 70 2c 22 6d 65 6d 6f 22 29 3d 3d 30 20  (zOp,"memo")==0 
333f0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 74 66  ){.          utf
33400 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  8_printf(p->out,
33410 20 22 25 73 5c 6e 22 2c 20 7a 53 71 6c 29 3b 0a   "%s\n", zSql);.
33420 20 20 20 20 20 20 20 20 7d 65 6c 73 65 0a 20 20          }else.  
33430 20 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70        if( strcmp
33440 28 7a 4f 70 2c 22 72 75 6e 22 29 3d 3d 30 20 29  (zOp,"run")==0 )
33450 7b 0a 20 20 20 20 20 20 20 20 20 20 63 68 61 72  {.          char
33460 20 2a 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20   *zErrMsg = 0;. 
33470 20 20 20 20 20 20 20 20 20 73 74 72 2e 6e 20 3d           str.n =
33480 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 73 74   0;.          st
33490 72 2e 7a 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20  r.z[0] = 0;.    
334a0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
334b0 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20 7a  e3_exec(p->db, z
334c0 53 71 6c 2c 20 63 61 70 74 75 72 65 4f 75 74 70  Sql, captureOutp
334d0 75 74 43 61 6c 6c 62 61 63 6b 2c 20 26 73 74 72  utCallback, &str
334e0 2c 20 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20  , &zErrMsg);.   
334f0 20 20 20 20 20 20 20 6e 54 65 73 74 2b 2b 3b 0a         nTest++;.
33500 20 20 20 20 20 20 20 20 20 20 69 66 28 20 62 56            if( bV
33510 65 72 62 6f 73 65 20 29 7b 0a 20 20 20 20 20 20  erbose ){.      
33520 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
33530 66 28 70 2d 3e 6f 75 74 2c 20 22 52 65 73 75 6c  f(p->out, "Resul
33540 74 3a 20 25 73 5c 6e 22 2c 20 73 74 72 2e 7a 29  t: %s\n", str.z)
33550 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
33560 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 7c          if( rc |
33570 7c 20 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20  | zErrMsg ){.   
33580 20 20 20 20 20 20 20 20 20 6e 45 72 72 2b 2b 3b           nErr++;
33590 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
335a0 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 1;.           
335b0 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e   utf8_printf(p->
335c0 6f 75 74 2c 20 22 25 64 3a 20 65 72 72 6f 72 2d  out, "%d: error-
335d0 63 6f 64 65 2d 25 64 3a 20 25 73 5c 6e 22 2c 20  code-%d: %s\n", 
335e0 74 6e 6f 2c 20 72 63 2c 20 7a 45 72 72 4d 73 67  tno, rc, zErrMsg
335f0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  );.            s
33600 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 45 72 72  qlite3_free(zErr
33610 4d 73 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Msg);.          
33620 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
33630 28 7a 41 6e 73 2c 73 74 72 2e 7a 29 21 3d 30 20  (zAns,str.z)!=0 
33640 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e  ){.            n
33650 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  Err++;.         
33660 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20     rc = 1;.     
33670 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e         utf8_prin
33680 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 64 3a 20  tf(p->out, "%d: 
33690 45 78 70 65 63 74 65 64 3a 20 5b 25 73 5d 5c 6e  Expected: [%s]\n
336a0 22 2c 20 74 6e 6f 2c 20 7a 41 6e 73 29 3b 0a 20  ", tno, zAns);. 
336b0 20 20 20 20 20 20 20 20 20 20 20 75 74 66 38 5f             utf8_
336c0 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
336d0 25 64 3a 20 20 20 20 20 20 47 6f 74 3a 20 5b 25  %d:      Got: [%
336e0 73 5d 5c 6e 22 2c 20 74 6e 6f 2c 20 73 74 72 2e  s]\n", tno, str.
336f0 7a 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  z);.          }.
33700 20 20 20 20 20 20 20 20 7d 65 6c 73 65 0a 20 20          }else.  
33710 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20        {.        
33720 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74    utf8_printf(st
33730 64 65 72 72 2c 0a 20 20 20 20 20 20 20 20 20 20  derr,.          
33740 20 20 22 55 6e 6b 6e 6f 77 6e 20 6f 70 65 72 61    "Unknown opera
33750 74 69 6f 6e 20 5c 22 25 73 5c 22 20 6f 6e 20 73  tion \"%s\" on s
33760 65 6c 66 74 65 73 74 20 6c 69 6e 65 20 25 64 5c  elftest line %d\
33770 6e 22 2c 20 7a 4f 70 2c 20 74 6e 6f 29 3b 0a 20  n", zOp, tno);. 
33780 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b           rc = 1;
33790 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
337a0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
337b0 20 20 7d 20 2f 2a 20 45 6e 64 20 6c 6f 6f 70 20    } /* End loop 
337c0 6f 76 65 72 20 72 6f 77 73 20 6f 66 20 63 6f 6e  over rows of con
337d0 74 65 6e 74 20 66 72 6f 6d 20 53 45 4c 46 54 45  tent from SELFTE
337e0 53 54 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  ST */.      sqli
337f0 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74  te3_finalize(pSt
33800 6d 74 29 3b 0a 20 20 20 20 7d 20 2f 2a 20 45 6e  mt);.    } /* En
33810 64 20 6c 6f 6f 70 20 6f 76 65 72 20 6b 20 2a 2f  d loop over k */
33820 0a 20 20 20 20 66 72 65 65 54 65 78 74 28 26 73  .    freeText(&s
33830 74 72 29 3b 0a 20 20 20 20 75 74 66 38 5f 70 72  tr);.    utf8_pr
33840 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 64  intf(p->out, "%d
33850 20 65 72 72 6f 72 73 20 6f 75 74 20 6f 66 20 25   errors out of %
33860 64 20 74 65 73 74 73 5c 6e 22 2c 20 6e 45 72 72  d tests\n", nErr
33870 2c 20 6e 54 65 73 74 29 3b 0a 20 20 7d 65 6c 73  , nTest);.  }els
33880 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 73 27 20  e..  if( c=='s' 
33890 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67  && strncmp(azArg
338a0 5b 30 5d 2c 20 22 73 65 70 61 72 61 74 6f 72 22  [0], "separator"
338b0 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69  , n)==0 ){.    i
338c0 66 28 20 6e 41 72 67 3c 32 20 7c 7c 20 6e 41 72  f( nArg<2 || nAr
338d0 67 3e 33 20 29 7b 0a 20 20 20 20 20 20 72 61 77  g>3 ){.      raw
338e0 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
338f0 22 55 73 61 67 65 3a 20 2e 73 65 70 61 72 61 74  "Usage: .separat
33900 6f 72 20 43 4f 4c 20 3f 52 4f 57 3f 5c 6e 22 29  or COL ?ROW?\n")
33910 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a  ;.      rc = 1;.
33920 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 41      }.    if( nA
33930 72 67 3e 3d 32 20 29 7b 0a 20 20 20 20 20 20 73  rg>=2 ){.      s
33940 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
33950 73 69 7a 65 6f 66 28 70 2d 3e 63 6f 6c 53 65 70  sizeof(p->colSep
33960 61 72 61 74 6f 72 29 2c 20 70 2d 3e 63 6f 6c 53  arator), p->colS
33970 65 70 61 72 61 74 6f 72 2c 0a 20 20 20 20 20 20  eparator,.      
33980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33990 20 22 25 2e 2a 73 22 2c 20 28 69 6e 74 29 41 72   "%.*s", (int)Ar
339a0 72 61 79 53 69 7a 65 28 70 2d 3e 63 6f 6c 53 65  raySize(p->colSe
339b0 70 61 72 61 74 6f 72 29 2d 31 2c 20 61 7a 41 72  parator)-1, azAr
339c0 67 5b 31 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20  g[1]);.    }.   
339d0 20 69 66 28 20 6e 41 72 67 3e 3d 33 20 29 7b 0a   if( nArg>=3 ){.
339e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
339f0 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 70 2d  printf(sizeof(p-
33a00 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 29 2c 20  >rowSeparator), 
33a10 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 2c  p->rowSeparator,
33a20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
33a30 20 20 20 20 20 20 20 20 22 25 2e 2a 73 22 2c 20          "%.*s", 
33a40 28 69 6e 74 29 41 72 72 61 79 53 69 7a 65 28 70  (int)ArraySize(p
33a50 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 29 2d  ->rowSeparator)-
33a60 31 2c 20 61 7a 41 72 67 5b 32 5d 29 3b 0a 20 20  1, azArg[2]);.  
33a70 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69    }.  }else..  i
33a80 66 28 20 63 3d 3d 27 73 27 20 26 26 20 6e 3e 3d  f( c=='s' && n>=
33a90 34 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41  4 && strncmp(azA
33aa0 72 67 5b 30 5d 2c 22 73 68 61 33 73 75 6d 22 2c  rg[0],"sha3sum",
33ab0 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 63 6f 6e  n)==0 ){.    con
33ac0 73 74 20 63 68 61 72 20 2a 7a 4c 69 6b 65 20 3d  st char *zLike =
33ad0 20 30 3b 20 20 20 2f 2a 20 57 68 69 63 68 20 74   0;   /* Which t
33ae0 61 62 6c 65 20 74 6f 20 63 68 65 63 6b 73 75 6d  able to checksum
33af0 2e 20 30 20 6d 65 61 6e 73 20 65 76 65 72 79 74  . 0 means everyt
33b00 68 69 6e 67 20 2a 2f 0a 20 20 20 20 69 6e 74 20  hing */.    int 
33b10 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
33b20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
33b30 6e 74 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20  nter */.    int 
33b40 62 53 63 68 65 6d 61 20 3d 20 30 3b 20 20 20 20  bSchema = 0;    
33b50 20 20 20 20 20 2f 2a 20 41 6c 73 6f 20 68 61 73       /* Also has
33b60 68 20 74 68 65 20 73 63 68 65 6d 61 20 2a 2f 0a  h the schema */.
33b70 20 20 20 20 69 6e 74 20 62 53 65 70 61 72 61 74      int bSeparat
33b80 65 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20  e = 0;       /* 
33b90 48 61 73 68 20 65 61 63 68 20 74 61 62 6c 65 20  Hash each table 
33ba0 73 65 70 61 72 61 74 65 6c 79 20 2a 2f 0a 20 20  separately */.  
33bb0 20 20 69 6e 74 20 69 53 69 7a 65 20 3d 20 32 32    int iSize = 22
33bc0 34 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61  4;         /* Ha
33bd0 73 68 20 61 6c 67 6f 72 69 74 68 6d 20 74 6f 20  sh algorithm to 
33be0 75 73 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 62  use */.    int b
33bf0 44 65 62 75 67 20 3d 20 30 3b 20 20 20 20 20 20  Debug = 0;      
33c00 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 73 68 6f 77      /* Only show
33c10 20 74 68 65 20 71 75 65 72 79 20 74 68 61 74 20   the query that 
33c20 77 6f 75 6c 64 20 68 61 76 65 20 72 75 6e 20 2a  would have run *
33c30 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74  /.    sqlite3_st
33c40 6d 74 20 2a 70 53 74 6d 74 3b 20 20 20 20 20 2f  mt *pStmt;     /
33c50 2a 20 46 6f 72 20 71 75 65 72 79 69 6e 67 20 74  * For querying t
33c60 61 62 6c 65 73 20 6e 61 6d 65 73 20 2a 2f 0a 20  ables names */. 
33c70 20 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b 20 20     char *zSql;  
33c80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
33c90 51 4c 20 74 6f 20 62 65 20 72 75 6e 20 2a 2f 0a  QL to be run */.
33ca0 20 20 20 20 63 68 61 72 20 2a 7a 53 65 70 3b 20      char *zSep; 
33cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
33cc0 53 65 70 61 72 61 74 6f 72 20 2a 2f 0a 20 20 20  Separator */.   
33cd0 20 53 68 65 6c 6c 54 65 78 74 20 73 53 71 6c 3b   ShellText sSql;
33ce0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d            /* Com
33cf0 70 6c 65 74 65 20 53 51 4c 20 66 6f 72 20 74 68  plete SQL for th
33d00 65 20 71 75 65 72 79 20 74 6f 20 72 75 6e 20 74  e query to run t
33d10 68 65 20 68 61 73 68 20 2a 2f 0a 20 20 20 20 53  he hash */.    S
33d20 68 65 6c 6c 54 65 78 74 20 73 51 75 65 72 79 3b  hellText sQuery;
33d30 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 6f          /* Set o
33d40 66 20 71 75 65 72 69 65 73 20 75 73 65 64 20 74  f queries used t
33d50 6f 20 72 65 61 64 20 61 6c 6c 20 63 6f 6e 74 65  o read all conte
33d60 6e 74 20 2a 2f 0a 20 20 20 20 6f 70 65 6e 5f 64  nt */.    open_d
33d70 62 28 70 2c 20 30 29 3b 0a 20 20 20 20 66 6f 72  b(p, 0);.    for
33d80 28 69 3d 31 3b 20 69 3c 6e 41 72 67 3b 20 69 2b  (i=1; i<nArg; i+
33d90 2b 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20  +){.      const 
33da0 63 68 61 72 20 2a 7a 20 3d 20 61 7a 41 72 67 5b  char *z = azArg[
33db0 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 5b  i];.      if( z[
33dc0 30 5d 3d 3d 27 2d 27 20 29 7b 0a 20 20 20 20 20  0]=='-' ){.     
33dd0 20 20 20 7a 2b 2b 3b 0a 20 20 20 20 20 20 20 20     z++;.        
33de0 69 66 28 20 7a 5b 30 5d 3d 3d 27 2d 27 20 29 20  if( z[0]=='-' ) 
33df0 7a 2b 2b 3b 0a 20 20 20 20 20 20 20 20 69 66 28  z++;.        if(
33e00 20 73 74 72 63 6d 70 28 7a 2c 22 73 63 68 65 6d   strcmp(z,"schem
33e10 61 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  a")==0 ){.      
33e20 20 20 20 20 62 53 63 68 65 6d 61 20 3d 20 31 3b      bSchema = 1;
33e30 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 0a 20  .        }else. 
33e40 20 20 20 20 20 20 20 69 66 28 20 73 74 72 63 6d         if( strcm
33e50 70 28 7a 2c 22 73 68 61 33 2d 32 32 34 22 29 3d  p(z,"sha3-224")=
33e60 3d 30 20 7c 7c 20 73 74 72 63 6d 70 28 7a 2c 22  =0 || strcmp(z,"
33e70 73 68 61 33 2d 32 35 36 22 29 3d 3d 30 0a 20 20  sha3-256")==0.  
33e80 20 20 20 20 20 20 20 7c 7c 20 73 74 72 63 6d 70         || strcmp
33e90 28 7a 2c 22 73 68 61 33 2d 33 38 34 22 29 3d 3d  (z,"sha3-384")==
33ea0 30 20 7c 7c 20 73 74 72 63 6d 70 28 7a 2c 22 73  0 || strcmp(z,"s
33eb0 68 61 33 2d 35 31 32 22 29 3d 3d 30 0a 20 20 20  ha3-512")==0.   
33ec0 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
33ed0 20 20 69 53 69 7a 65 20 3d 20 61 74 6f 69 28 26    iSize = atoi(&
33ee0 7a 5b 35 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d  z[5]);.        }
33ef0 65 6c 73 65 0a 20 20 20 20 20 20 20 20 69 66 28  else.        if(
33f00 20 73 74 72 63 6d 70 28 7a 2c 22 64 65 62 75 67   strcmp(z,"debug
33f10 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ")==0 ){.       
33f20 20 20 20 62 44 65 62 75 67 20 3d 20 31 3b 0a 20     bDebug = 1;. 
33f30 20 20 20 20 20 20 20 7d 65 6c 73 65 0a 20 20 20         }else.   
33f40 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20       {.         
33f50 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64   utf8_printf(std
33f60 65 72 72 2c 20 22 55 6e 6b 6e 6f 77 6e 20 6f 70  err, "Unknown op
33f70 74 69 6f 6e 20 5c 22 25 73 5c 22 20 6f 6e 20 5c  tion \"%s\" on \
33f80 22 25 73 5c 22 5c 6e 22 2c 0a 20 20 20 20 20 20  "%s\"\n",.      
33f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33fa0 61 7a 41 72 67 5b 69 5d 2c 20 61 7a 41 72 67 5b  azArg[i], azArg[
33fb0 30 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  0]);.          r
33fc0 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  aw_printf(stderr
33fd0 2c 20 22 53 68 6f 75 6c 64 20 62 65 20 6f 6e 65  , "Should be one
33fe0 20 6f 66 3a 20 2d 2d 73 63 68 65 6d 61 22 0a 20   of: --schema". 
33ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34000 20 20 20 20 20 20 20 20 20 20 20 20 22 20 2d 2d              " --
34010 73 68 61 33 2d 32 32 34 20 2d 2d 73 68 61 33 2d  sha3-224 --sha3-
34020 32 35 35 20 2d 2d 73 68 61 33 2d 33 38 34 20 2d  255 --sha3-384 -
34030 2d 73 68 61 33 2d 35 31 32 5c 6e 22 29 3b 0a 20  -sha3-512\n");. 
34040 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b           rc = 1;
34050 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
34060 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69  meta_command_exi
34070 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  t;.        }.   
34080 20 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 4c 69     }else if( zLi
34090 6b 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72 61  ke ){.        ra
340a0 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  w_printf(stderr,
340b0 20 22 55 73 61 67 65 3a 20 2e 73 68 61 33 73 75   "Usage: .sha3su
340c0 6d 20 3f 4f 50 54 49 4f 4e 53 3f 20 3f 4c 49 4b  m ?OPTIONS? ?LIK
340d0 45 2d 50 41 54 54 45 52 4e 3f 5c 6e 22 29 3b 0a  E-PATTERN?\n");.
340e0 20 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a          rc = 1;.
340f0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 65 74          goto met
34100 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a  a_command_exit;.
34110 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
34120 20 20 20 20 20 7a 4c 69 6b 65 20 3d 20 7a 3b 0a       zLike = z;.
34130 20 20 20 20 20 20 20 20 62 53 65 70 61 72 61 74          bSeparat
34140 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 69  e = 1;.        i
34150 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72 6c 69  f( sqlite3_strli
34160 6b 65 28 22 73 71 6c 69 74 65 5f 25 22 2c 20 7a  ke("sqlite_%", z
34170 4c 69 6b 65 2c 20 30 29 3d 3d 30 20 29 20 62 53  Like, 0)==0 ) bS
34180 63 68 65 6d 61 20 3d 20 31 3b 0a 20 20 20 20 20  chema = 1;.     
34190 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
341a0 20 62 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20   bSchema ){.    
341b0 20 20 7a 53 71 6c 20 3d 20 22 53 45 4c 45 43 54    zSql = "SELECT
341c0 20 6c 6f 77 65 72 28 6e 61 6d 65 29 20 46 52 4f   lower(name) FRO
341d0 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 22  M sqlite_master"
341e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20  .             " 
341f0 57 48 45 52 45 20 74 79 70 65 3d 27 74 61 62 6c  WHERE type='tabl
34200 65 27 20 41 4e 44 20 63 6f 61 6c 65 73 63 65 28  e' AND coalesce(
34210 72 6f 6f 74 70 61 67 65 2c 30 29 3e 31 22 0a 20  rootpage,0)>1". 
34220 20 20 20 20 20 20 20 20 20 20 20 20 22 20 55 4e              " UN
34230 49 4f 4e 20 41 4c 4c 20 53 45 4c 45 43 54 20 27  ION ALL SELECT '
34240 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 27 22 0a  sqlite_master'".
34250 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20 4f               " O
34260 52 44 45 52 20 42 59 20 31 20 63 6f 6c 6c 61 74  RDER BY 1 collat
34270 65 20 6e 6f 63 61 73 65 22 3b 0a 20 20 20 20 7d  e nocase";.    }
34280 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 53 71 6c  else{.      zSql
34290 20 3d 20 22 53 45 4c 45 43 54 20 6c 6f 77 65 72   = "SELECT lower
342a0 28 6e 61 6d 65 29 20 46 52 4f 4d 20 73 71 6c 69  (name) FROM sqli
342b0 74 65 5f 6d 61 73 74 65 72 22 0a 20 20 20 20 20  te_master".     
342c0 20 20 20 20 20 20 20 20 22 20 57 48 45 52 45 20          " WHERE 
342d0 74 79 70 65 3d 27 74 61 62 6c 65 27 20 41 4e 44  type='table' AND
342e0 20 63 6f 61 6c 65 73 63 65 28 72 6f 6f 74 70 61   coalesce(rootpa
342f0 67 65 2c 30 29 3e 31 22 0a 20 20 20 20 20 20 20  ge,0)>1".       
34300 20 20 20 20 20 20 22 20 41 4e 44 20 6e 61 6d 65        " AND name
34310 20 4e 4f 54 20 4c 49 4b 45 20 27 73 71 6c 69 74   NOT LIKE 'sqlit
34320 65 5f 25 27 22 0a 20 20 20 20 20 20 20 20 20 20  e_%'".          
34330 20 20 20 22 20 4f 52 44 45 52 20 42 59 20 31 20     " ORDER BY 1 
34340 63 6f 6c 6c 61 74 65 20 6e 6f 63 61 73 65 22 3b  collate nocase";
34350 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
34360 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 70 2d  e3_prepare_v2(p-
34370 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26  >db, zSql, -1, &
34380 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 69  pStmt, 0);.    i
34390 6e 69 74 54 65 78 74 28 26 73 51 75 65 72 79 29  nitText(&sQuery)
343a0 3b 0a 20 20 20 20 69 6e 69 74 54 65 78 74 28 26  ;.    initText(&
343b0 73 53 71 6c 29 3b 0a 20 20 20 20 61 70 70 65 6e  sSql);.    appen
343c0 64 54 65 78 74 28 26 73 53 71 6c 2c 20 22 57 49  dText(&sSql, "WI
343d0 54 48 20 5b 73 68 61 33 73 75 6d 24 71 75 65 72  TH [sha3sum$quer
343e0 79 5d 28 61 2c 62 29 20 41 53 28 22 2c 30 29 3b  y](a,b) AS(",0);
343f0 0a 20 20 20 20 7a 53 65 70 20 3d 20 22 56 41 4c  .    zSep = "VAL
34400 55 45 53 28 22 3b 0a 20 20 20 20 77 68 69 6c 65  UES(";.    while
34410 28 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71  ( SQLITE_ROW==sq
34420 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74  lite3_step(pStmt
34430 29 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74  ) ){.      const
34440 20 63 68 61 72 20 2a 7a 54 61 62 20 3d 20 28 63   char *zTab = (c
34450 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74  onst char*)sqlit
34460 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70  e3_column_text(p
34470 53 74 6d 74 2c 30 29 3b 0a 20 20 20 20 20 20 69  Stmt,0);.      i
34480 66 28 20 7a 4c 69 6b 65 20 26 26 20 73 71 6c 69  f( zLike && sqli
34490 74 65 33 5f 73 74 72 6c 69 6b 65 28 7a 4c 69 6b  te3_strlike(zLik
344a0 65 2c 20 7a 54 61 62 2c 20 30 29 21 3d 30 20 29  e, zTab, 0)!=0 )
344b0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
344c0 20 69 66 28 20 73 74 72 6e 63 6d 70 28 7a 54 61   if( strncmp(zTa
344d0 62 2c 20 22 73 71 6c 69 74 65 5f 22 2c 37 29 21  b, "sqlite_",7)!
344e0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61 70  =0 ){.        ap
344f0 70 65 6e 64 54 65 78 74 28 26 73 51 75 65 72 79  pendText(&sQuery
34500 2c 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  ,"SELECT * FROM 
34510 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 61  ", 0);.        a
34520 70 70 65 6e 64 54 65 78 74 28 26 73 51 75 65 72  ppendText(&sQuer
34530 79 2c 7a 54 61 62 2c 27 22 27 29 3b 0a 20 20 20  y,zTab,'"');.   
34540 20 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28       appendText(
34550 26 73 51 75 65 72 79 2c 22 20 4e 4f 54 20 49 4e  &sQuery," NOT IN
34560 44 45 58 45 44 3b 22 2c 20 30 29 3b 0a 20 20 20  DEXED;", 0);.   
34570 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72     }else if( str
34580 63 6d 70 28 7a 54 61 62 2c 20 22 73 71 6c 69 74  cmp(zTab, "sqlit
34590 65 5f 6d 61 73 74 65 72 22 29 3d 3d 30 20 29 7b  e_master")==0 ){
345a0 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 54  .        appendT
345b0 65 78 74 28 26 73 51 75 65 72 79 2c 22 53 45 4c  ext(&sQuery,"SEL
345c0 45 43 54 20 74 79 70 65 2c 6e 61 6d 65 2c 74 62  ECT type,name,tb
345d0 6c 5f 6e 61 6d 65 2c 73 71 6c 20 46 52 4f 4d 20  l_name,sql FROM 
345e0 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 22 0a 20  sqlite_master". 
345f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34600 20 20 20 20 20 20 20 20 20 20 22 20 4f 52 44 45            " ORDE
34610 52 20 42 59 20 6e 61 6d 65 3b 22 2c 20 30 29 3b  R BY name;", 0);
34620 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
34630 20 73 74 72 63 6d 70 28 7a 54 61 62 2c 20 22 73   strcmp(zTab, "s
34640 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 22 29  qlite_sequence")
34650 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61  ==0 ){.        a
34660 70 70 65 6e 64 54 65 78 74 28 26 73 51 75 65 72  ppendText(&sQuer
34670 79 2c 22 53 45 4c 45 43 54 20 6e 61 6d 65 2c 73  y,"SELECT name,s
34680 65 71 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 73  eq FROM sqlite_s
34690 65 71 75 65 6e 63 65 22 0a 20 20 20 20 20 20 20  equence".       
346a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
346b0 20 20 20 20 22 20 4f 52 44 45 52 20 42 59 20 6e      " ORDER BY n
346c0 61 6d 65 3b 22 2c 20 30 29 3b 0a 20 20 20 20 20  ame;", 0);.     
346d0 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d   }else if( strcm
346e0 70 28 7a 54 61 62 2c 20 22 73 71 6c 69 74 65 5f  p(zTab, "sqlite_
346f0 73 74 61 74 31 22 29 3d 3d 30 20 29 7b 0a 20 20  stat1")==0 ){.  
34700 20 20 20 20 20 20 61 70 70 65 6e 64 54 65 78 74        appendText
34710 28 26 73 51 75 65 72 79 2c 22 53 45 4c 45 43 54  (&sQuery,"SELECT
34720 20 74 62 6c 2c 69 64 78 2c 73 74 61 74 20 46 52   tbl,idx,stat FR
34730 4f 4d 20 73 71 6c 69 74 65 5f 73 74 61 74 31 22  OM sqlite_stat1"
34740 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
34750 20 20 20 20 20 20 20 20 20 20 20 20 22 20 4f 52              " OR
34760 44 45 52 20 42 59 20 74 62 6c 2c 69 64 78 3b 22  DER BY tbl,idx;"
34770 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  , 0);.      }els
34780 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 54 61  e if( strcmp(zTa
34790 62 2c 20 22 73 71 6c 69 74 65 5f 73 74 61 74 33  b, "sqlite_stat3
347a0 22 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20  ")==0.          
347b0 20 20 20 7c 7c 20 73 74 72 63 6d 70 28 7a 54 61     || strcmp(zTa
347c0 62 2c 20 22 73 71 6c 69 74 65 5f 73 74 61 74 34  b, "sqlite_stat4
347d0 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ")==0 ){.       
347e0 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 51 75   appendText(&sQu
347f0 65 72 79 2c 20 22 53 45 4c 45 43 54 20 2a 20 46  ery, "SELECT * F
34800 52 4f 4d 20 22 2c 20 30 29 3b 0a 20 20 20 20 20  ROM ", 0);.     
34810 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73     appendText(&s
34820 51 75 65 72 79 2c 20 7a 54 61 62 2c 20 30 29 3b  Query, zTab, 0);
34830 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 54  .        appendT
34840 65 78 74 28 26 73 51 75 65 72 79 2c 20 22 20 4f  ext(&sQuery, " O
34850 52 44 45 52 20 42 59 20 74 62 6c 2c 20 69 64 78  RDER BY tbl, idx
34860 2c 20 72 6f 77 69 64 3b 5c 6e 22 2c 20 30 29 3b  , rowid;\n", 0);
34870 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
34880 70 70 65 6e 64 54 65 78 74 28 26 73 53 71 6c 2c  ppendText(&sSql,
34890 20 7a 53 65 70 2c 20 30 29 3b 0a 20 20 20 20 20   zSep, 0);.     
348a0 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 53 71   appendText(&sSq
348b0 6c 2c 20 73 51 75 65 72 79 2e 7a 2c 20 27 5c 27  l, sQuery.z, '\'
348c0 27 29 3b 0a 20 20 20 20 20 20 73 51 75 65 72 79  ');.      sQuery
348d0 2e 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 61 70  .n = 0;.      ap
348e0 70 65 6e 64 54 65 78 74 28 26 73 53 71 6c 2c 20  pendText(&sSql, 
348f0 22 2c 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 61  ",", 0);.      a
34900 70 70 65 6e 64 54 65 78 74 28 26 73 53 71 6c 2c  ppendText(&sSql,
34910 20 7a 54 61 62 2c 20 27 5c 27 27 29 3b 0a 20 20   zTab, '\'');.  
34920 20 20 20 20 7a 53 65 70 20 3d 20 22 29 2c 28 22      zSep = "),("
34930 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
34940 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74  te3_finalize(pSt
34950 6d 74 29 3b 0a 20 20 20 20 69 66 28 20 62 53 65  mt);.    if( bSe
34960 70 61 72 61 74 65 20 29 7b 0a 20 20 20 20 20 20  parate ){.      
34970 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d  zSql = sqlite3_m
34980 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20  printf(.        
34990 20 20 22 25 73 29 29 22 0a 20 20 20 20 20 20 20    "%s))".       
349a0 20 20 20 22 20 53 45 4c 45 43 54 20 6c 6f 77 65     " SELECT lowe
349b0 72 28 68 65 78 28 73 68 61 33 5f 71 75 65 72 79  r(hex(sha3_query
349c0 28 61 2c 25 64 29 29 29 20 41 53 20 68 61 73 68  (a,%d))) AS hash
349d0 2c 20 62 20 41 53 20 6c 61 62 65 6c 22 0a 20 20  , b AS label".  
349e0 20 20 20 20 20 20 20 20 22 20 20 20 46 52 4f 4d          "   FROM
349f0 20 5b 73 68 61 33 73 75 6d 24 71 75 65 72 79 5d   [sha3sum$query]
34a00 22 2c 0a 20 20 20 20 20 20 20 20 20 20 73 53 71  ",.          sSq
34a10 6c 2e 7a 2c 20 69 53 69 7a 65 29 3b 0a 20 20 20  l.z, iSize);.   
34a20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 53   }else{.      zS
34a30 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  ql = sqlite3_mpr
34a40 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20 20 20  intf(.          
34a50 22 25 73 29 29 22 0a 20 20 20 20 20 20 20 20 20  "%s))".         
34a60 20 22 20 53 45 4c 45 43 54 20 6c 6f 77 65 72 28   " SELECT lower(
34a70 68 65 78 28 73 68 61 33 5f 71 75 65 72 79 28 67  hex(sha3_query(g
34a80 72 6f 75 70 5f 63 6f 6e 63 61 74 28 61 2c 27 27  roup_concat(a,''
34a90 29 2c 25 64 29 29 29 20 41 53 20 68 61 73 68 22  ),%d))) AS hash"
34aa0 0a 20 20 20 20 20 20 20 20 20 20 22 20 20 20 46  .          "   F
34ab0 52 4f 4d 20 5b 73 68 61 33 73 75 6d 24 71 75 65  ROM [sha3sum$que
34ac0 72 79 5d 22 2c 0a 20 20 20 20 20 20 20 20 20 20  ry]",.          
34ad0 73 53 71 6c 2e 7a 2c 20 69 53 69 7a 65 29 3b 0a  sSql.z, iSize);.
34ae0 20 20 20 20 7d 0a 20 20 20 20 66 72 65 65 54 65      }.    freeTe
34af0 78 74 28 26 73 51 75 65 72 79 29 3b 0a 20 20 20  xt(&sQuery);.   
34b00 20 66 72 65 65 54 65 78 74 28 26 73 53 71 6c 29   freeText(&sSql)
34b10 3b 0a 20 20 20 20 69 66 28 20 62 44 65 62 75 67  ;.    if( bDebug
34b20 20 29 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70   ){.      utf8_p
34b30 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25  rintf(p->out, "%
34b40 73 5c 6e 22 2c 20 7a 53 71 6c 29 3b 0a 20 20 20  s\n", zSql);.   
34b50 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 68   }else{.      sh
34b60 65 6c 6c 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20  ell_exec(p->db, 
34b70 7a 53 71 6c 2c 20 73 68 65 6c 6c 5f 63 61 6c 6c  zSql, shell_call
34b80 62 61 63 6b 2c 20 70 2c 20 30 29 3b 0a 20 20 20  back, p, 0);.   
34b90 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66   }.    sqlite3_f
34ba0 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 7d 65 6c  ree(zSql);.  }el
34bb0 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 73 27  se..  if( c=='s'
34bc0 0a 20 20 20 26 26 20 28 73 74 72 6e 63 6d 70 28  .   && (strncmp(
34bd0 61 7a 41 72 67 5b 30 5d 2c 20 22 73 68 65 6c 6c  azArg[0], "shell
34be0 22 2c 20 6e 29 3d 3d 30 20 7c 7c 20 73 74 72 6e  ", n)==0 || strn
34bf0 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 22 73 79  cmp(azArg[0],"sy
34c00 73 74 65 6d 22 2c 6e 29 3d 3d 30 29 0a 20 20 29  stem",n)==0).  )
34c10 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 43 6d 64  {.    char *zCmd
34c20 3b 0a 20 20 20 20 69 6e 74 20 69 2c 20 78 3b 0a  ;.    int i, x;.
34c30 20 20 20 20 69 66 28 20 6e 41 72 67 3c 32 20 29      if( nArg<2 )
34c40 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e  {.      raw_prin
34c50 74 66 28 73 74 64 65 72 72 2c 20 22 55 73 61 67  tf(stderr, "Usag
34c60 65 3a 20 2e 73 79 73 74 65 6d 20 43 4f 4d 4d 41  e: .system COMMA
34c70 4e 44 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 63  ND\n");.      rc
34c80 20 3d 20 31 3b 0a 20 20 20 20 20 20 67 6f 74 6f   = 1;.      goto
34c90 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78   meta_command_ex
34ca0 69 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 43  it;.    }.    zC
34cb0 6d 64 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  md = sqlite3_mpr
34cc0 69 6e 74 66 28 73 74 72 63 68 72 28 61 7a 41 72  intf(strchr(azAr
34cd0 67 5b 31 5d 2c 27 20 27 29 3d 3d 30 3f 22 25 73  g[1],' ')==0?"%s
34ce0 22 3a 22 5c 22 25 73 5c 22 22 2c 20 61 7a 41 72  ":"\"%s\"", azAr
34cf0 67 5b 31 5d 29 3b 0a 20 20 20 20 66 6f 72 28 69  g[1]);.    for(i
34d00 3d 32 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29  =2; i<nArg; i++)
34d10 7b 0a 20 20 20 20 20 20 7a 43 6d 64 20 3d 20 73  {.      zCmd = s
34d20 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 73  qlite3_mprintf(s
34d30 74 72 63 68 72 28 61 7a 41 72 67 5b 69 5d 2c 27  trchr(azArg[i],'
34d40 20 27 29 3d 3d 30 3f 22 25 7a 20 25 73 22 3a 22   ')==0?"%z %s":"
34d50 25 7a 20 5c 22 25 73 5c 22 22 2c 0a 20 20 20 20  %z \"%s\"",.    
34d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34d70 20 20 20 20 20 20 20 20 20 7a 43 6d 64 2c 20 61           zCmd, a
34d80 7a 41 72 67 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a  zArg[i]);.    }.
34d90 20 20 20 20 78 20 3d 20 73 79 73 74 65 6d 28 7a      x = system(z
34da0 43 6d 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Cmd);.    sqlite
34db0 33 5f 66 72 65 65 28 7a 43 6d 64 29 3b 0a 20 20  3_free(zCmd);.  
34dc0 20 20 69 66 28 20 78 20 29 20 72 61 77 5f 70 72    if( x ) raw_pr
34dd0 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 53 79  intf(stderr, "Sy
34de0 73 74 65 6d 20 63 6f 6d 6d 61 6e 64 20 72 65 74  stem command ret
34df0 75 72 6e 73 20 25 64 5c 6e 22 2c 20 78 29 3b 0a  urns %d\n", x);.
34e00 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63    }else..  if( c
34e10 3d 3d 27 73 27 20 26 26 20 73 74 72 6e 63 6d 70  =='s' && strncmp
34e20 28 61 7a 41 72 67 5b 30 5d 2c 20 22 73 68 6f 77  (azArg[0], "show
34e30 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ", n)==0 ){.    
34e40 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
34e50 72 20 2a 61 7a 42 6f 6f 6c 5b 5d 20 3d 20 7b 20  r *azBool[] = { 
34e60 22 6f 66 66 22 2c 20 22 6f 6e 22 2c 20 22 74 72  "off", "on", "tr
34e70 69 67 67 65 72 22 2c 20 22 66 75 6c 6c 22 7d 3b  igger", "full"};
34e80 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
34e90 69 66 28 20 6e 41 72 67 21 3d 31 20 29 7b 0a 20  if( nArg!=1 ){. 
34ea0 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
34eb0 73 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20  stderr, "Usage: 
34ec0 2e 73 68 6f 77 5c 6e 22 29 3b 0a 20 20 20 20 20  .show\n");.     
34ed0 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 67   rc = 1;.      g
34ee0 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64  oto meta_command
34ef0 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a 20 20 20  _exit;.    }.   
34f00 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e   utf8_printf(p->
34f10 6f 75 74 2c 20 22 25 31 32 2e 31 32 73 3a 20 25  out, "%12.12s: %
34f20 73 5c 6e 22 2c 22 65 63 68 6f 22 2c 0a 20 20 20  s\n","echo",.   
34f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
34f50 7a 42 6f 6f 6c 5b 53 68 65 6c 6c 48 61 73 46 6c  zBool[ShellHasFl
34f60 61 67 28 70 2c 20 53 48 46 4c 47 5f 45 63 68 6f  ag(p, SHFLG_Echo
34f70 29 5d 29 3b 0a 20 20 20 20 75 74 66 38 5f 70 72  )]);.    utf8_pr
34f80 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 31  intf(p->out, "%1
34f90 32 2e 31 32 73 3a 20 25 73 5c 6e 22 2c 22 65 71  2.12s: %s\n","eq
34fa0 70 22 2c 20 61 7a 42 6f 6f 6c 5b 70 2d 3e 61 75  p", azBool[p->au
34fb0 74 6f 45 51 50 26 33 5d 29 3b 0a 20 20 20 20 75  toEQP&3]);.    u
34fc0 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  tf8_printf(p->ou
34fd0 74 2c 20 22 25 31 32 2e 31 32 73 3a 20 25 73 5c  t, "%12.12s: %s\
34fe0 6e 22 2c 22 65 78 70 6c 61 69 6e 22 2c 0a 20 20  n","explain",.  
34ff0 20 20 20 20 20 20 20 70 2d 3e 6d 6f 64 65 3d 3d         p->mode==
35000 4d 4f 44 45 5f 45 78 70 6c 61 69 6e 20 3f 20 22  MODE_Explain ? "
35010 6f 6e 22 20 3a 20 70 2d 3e 61 75 74 6f 45 78 70  on" : p->autoExp
35020 6c 61 69 6e 20 3f 20 22 61 75 74 6f 22 20 3a 20  lain ? "auto" : 
35030 22 6f 66 66 22 29 3b 0a 20 20 20 20 75 74 66 38  "off");.    utf8
35040 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22  _printf(p->out,"
35050 25 31 32 2e 31 32 73 3a 20 25 73 5c 6e 22 2c 22  %12.12s: %s\n","
35060 68 65 61 64 65 72 73 22 2c 20 61 7a 42 6f 6f 6c  headers", azBool
35070 5b 70 2d 3e 73 68 6f 77 48 65 61 64 65 72 21 3d  [p->showHeader!=
35080 30 5d 29 3b 0a 20 20 20 20 75 74 66 38 5f 70 72  0]);.    utf8_pr
35090 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 31  intf(p->out, "%1
350a0 32 2e 31 32 73 3a 20 25 73 5c 6e 22 2c 22 6d 6f  2.12s: %s\n","mo
350b0 64 65 22 2c 20 6d 6f 64 65 44 65 73 63 72 5b 70  de", modeDescr[p
350c0 2d 3e 6d 6f 64 65 5d 29 3b 0a 20 20 20 20 75 74  ->mode]);.    ut
350d0 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  f8_printf(p->out
350e0 2c 20 22 25 31 32 2e 31 32 73 3a 20 22 2c 20 22  , "%12.12s: ", "
350f0 6e 75 6c 6c 76 61 6c 75 65 22 29 3b 0a 20 20 20  nullvalue");.   
35100 20 20 20 6f 75 74 70 75 74 5f 63 5f 73 74 72 69     output_c_stri
35110 6e 67 28 70 2d 3e 6f 75 74 2c 20 70 2d 3e 6e 75  ng(p->out, p->nu
35120 6c 6c 56 61 6c 75 65 29 3b 0a 20 20 20 20 20 20  llValue);.      
35130 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  raw_printf(p->ou
35140 74 2c 20 22 5c 6e 22 29 3b 0a 20 20 20 20 75 74  t, "\n");.    ut
35150 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  f8_printf(p->out
35160 2c 22 25 31 32 2e 31 32 73 3a 20 25 73 5c 6e 22  ,"%12.12s: %s\n"
35170 2c 22 6f 75 74 70 75 74 22 2c 0a 20 20 20 20 20  ,"output",.     
35180 20 20 20 20 20 20 20 73 74 72 6c 65 6e 33 30 28         strlen30(
35190 70 2d 3e 6f 75 74 66 69 6c 65 29 20 3f 20 70 2d  p->outfile) ? p-
351a0 3e 6f 75 74 66 69 6c 65 20 3a 20 22 73 74 64 6f  >outfile : "stdo
351b0 75 74 22 29 3b 0a 20 20 20 20 75 74 66 38 5f 70  ut");.    utf8_p
351c0 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 25 31  rintf(p->out,"%1
351d0 32 2e 31 32 73 3a 20 22 2c 20 22 63 6f 6c 73 65  2.12s: ", "colse
351e0 70 61 72 61 74 6f 72 22 29 3b 0a 20 20 20 20 20  parator");.     
351f0 20 6f 75 74 70 75 74 5f 63 5f 73 74 72 69 6e 67   output_c_string
35200 28 70 2d 3e 6f 75 74 2c 20 70 2d 3e 63 6f 6c 53  (p->out, p->colS
35210 65 70 61 72 61 74 6f 72 29 3b 0a 20 20 20 20 20  eparator);.     
35220 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f   raw_printf(p->o
35230 75 74 2c 20 22 5c 6e 22 29 3b 0a 20 20 20 20 75  ut, "\n");.    u
35240 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  tf8_printf(p->ou
35250 74 2c 22 25 31 32 2e 31 32 73 3a 20 22 2c 20 22  t,"%12.12s: ", "
35260 72 6f 77 73 65 70 61 72 61 74 6f 72 22 29 3b 0a  rowseparator");.
35270 20 20 20 20 20 20 6f 75 74 70 75 74 5f 63 5f 73        output_c_s
35280 74 72 69 6e 67 28 70 2d 3e 6f 75 74 2c 20 70 2d  tring(p->out, p-
35290 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 29 3b 0a  >rowSeparator);.
352a0 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
352b0 28 70 2d 3e 6f 75 74 2c 20 22 5c 6e 22 29 3b 0a  (p->out, "\n");.
352c0 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
352d0 70 2d 3e 6f 75 74 2c 20 22 25 31 32 2e 31 32 73  p->out, "%12.12s
352e0 3a 20 25 73 5c 6e 22 2c 22 73 74 61 74 73 22 2c  : %s\n","stats",
352f0 20 61 7a 42 6f 6f 6c 5b 70 2d 3e 73 74 61 74 73   azBool[p->stats
35300 4f 6e 21 3d 30 5d 29 3b 0a 20 20 20 20 75 74 66  On!=0]);.    utf
35310 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  8_printf(p->out,
35320 20 22 25 31 32 2e 31 32 73 3a 20 22 2c 20 22 77   "%12.12s: ", "w
35330 69 64 74 68 22 29 3b 0a 20 20 20 20 66 6f 72 20  idth");.    for 
35340 28 69 3d 30 3b 69 3c 28 69 6e 74 29 41 72 72 61  (i=0;i<(int)Arra
35350 79 53 69 7a 65 28 70 2d 3e 63 6f 6c 57 69 64 74  ySize(p->colWidt
35360 68 29 20 26 26 20 70 2d 3e 63 6f 6c 57 69 64 74  h) && p->colWidt
35370 68 5b 69 5d 20 21 3d 20 30 3b 69 2b 2b 29 20 7b  h[i] != 0;i++) {
35380 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74  .      raw_print
35390 66 28 70 2d 3e 6f 75 74 2c 20 22 25 64 20 22 2c  f(p->out, "%d ",
353a0 20 70 2d 3e 63 6f 6c 57 69 64 74 68 5b 69 5d 29   p->colWidth[i])
353b0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 61 77 5f  ;.    }.    raw_
353c0 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
353d0 5c 6e 22 29 3b 0a 20 20 20 20 75 74 66 38 5f 70  \n");.    utf8_p
353e0 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25  rintf(p->out, "%
353f0 31 32 2e 31 32 73 3a 20 25 73 5c 6e 22 2c 20 22  12.12s: %s\n", "
35400 66 69 6c 65 6e 61 6d 65 22 2c 0a 20 20 20 20 20  filename",.     
35410 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 7a 44             p->zD
35420 62 46 69 6c 65 6e 61 6d 65 20 3f 20 70 2d 3e 7a  bFilename ? p->z
35430 44 62 46 69 6c 65 6e 61 6d 65 20 3a 20 22 22 29  DbFilename : "")
35440 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28  ;.  }else..  if(
35450 20 63 3d 3d 27 73 27 20 26 26 20 73 74 72 6e 63   c=='s' && strnc
35460 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 73 74  mp(azArg[0], "st
35470 61 74 73 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20  ats", n)==0 ){. 
35480 20 20 20 69 66 28 20 6e 41 72 67 3d 3d 32 20 29     if( nArg==2 )
35490 7b 0a 20 20 20 20 20 20 70 2d 3e 73 74 61 74 73  {.      p->stats
354a0 4f 6e 20 3d 20 62 6f 6f 6c 65 61 6e 56 61 6c 75  On = booleanValu
354b0 65 28 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20  e(azArg[1]);.   
354c0 20 7d 65 6c 73 65 20 69 66 28 20 6e 41 72 67 3d   }else if( nArg=
354d0 3d 31 20 29 7b 0a 20 20 20 20 20 20 64 69 73 70  =1 ){.      disp
354e0 6c 61 79 5f 73 74 61 74 73 28 70 2d 3e 64 62 2c  lay_stats(p->db,
354f0 20 70 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73   p, 0);.    }els
35500 65 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69  e{.      raw_pri
35510 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55 73 61  ntf(stderr, "Usa
35520 67 65 3a 20 2e 73 74 61 74 73 20 3f 6f 6e 7c 6f  ge: .stats ?on|o
35530 66 66 3f 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72  ff?\n");.      r
35540 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  c = 1;.    }.  }
35550 65 6c 73 65 0a 0a 20 20 69 66 28 20 28 63 3d 3d  else..  if( (c==
35560 27 74 27 20 26 26 20 6e 3e 31 20 26 26 20 73 74  't' && n>1 && st
35570 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20  rncmp(azArg[0], 
35580 22 74 61 62 6c 65 73 22 2c 20 6e 29 3d 3d 30 29  "tables", n)==0)
35590 0a 20 20 20 7c 7c 20 28 63 3d 3d 27 69 27 20 26  .   || (c=='i' &
355a0 26 20 28 73 74 72 6e 63 6d 70 28 61 7a 41 72 67  & (strncmp(azArg
355b0 5b 30 5d 2c 20 22 69 6e 64 69 63 65 73 22 2c 20  [0], "indices", 
355c0 6e 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20  n)==0.          
355d0 20 20 20 20 20 20 20 7c 7c 20 73 74 72 6e 63 6d         || strncm
355e0 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 69 6e 64  p(azArg[0], "ind
355f0 65 78 65 73 22 2c 20 6e 29 3d 3d 30 29 20 29 0a  exes", n)==0) ).
35600 20 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33    ){.    sqlite3
35610 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20  _stmt *pStmt;.  
35620 20 20 63 68 61 72 20 2a 2a 61 7a 52 65 73 75 6c    char **azResul
35630 74 3b 0a 20 20 20 20 69 6e 74 20 6e 52 6f 77 2c  t;.    int nRow,
35640 20 6e 41 6c 6c 6f 63 3b 0a 20 20 20 20 69 6e 74   nAlloc;.    int
35650 20 69 69 3b 0a 20 20 20 20 53 68 65 6c 6c 54 65   ii;.    ShellTe
35660 78 74 20 73 3b 0a 20 20 20 20 69 6e 69 74 54 65  xt s;.    initTe
35670 78 74 28 26 73 29 3b 0a 20 20 20 20 6f 70 65 6e  xt(&s);.    open
35680 5f 64 62 28 70 2c 20 30 29 3b 0a 20 20 20 20 72  _db(p, 0);.    r
35690 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70  c = sqlite3_prep
356a0 61 72 65 5f 76 32 28 70 2d 3e 64 62 2c 20 22 50  are_v2(p->db, "P
356b0 52 41 47 4d 41 20 64 61 74 61 62 61 73 65 5f 6c  RAGMA database_l
356c0 69 73 74 22 2c 20 2d 31 2c 20 26 70 53 74 6d 74  ist", -1, &pStmt
356d0 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 0);.    if( rc
356e0 20 29 20 72 65 74 75 72 6e 20 73 68 65 6c 6c 44   ) return shellD
356f0 61 74 61 62 61 73 65 45 72 72 6f 72 28 70 2d 3e  atabaseError(p->
35700 64 62 29 3b 0a 0a 20 20 20 20 69 66 28 20 6e 41  db);..    if( nA
35710 72 67 3e 32 20 26 26 20 63 3d 3d 27 69 27 20 29  rg>2 && c=='i' )
35720 7b 0a 20 20 20 20 20 20 2f 2a 20 49 74 20 69 73  {.      /* It is
35730 20 61 6e 20 68 69 73 74 6f 72 69 63 61 6c 20 61   an historical a
35740 63 63 69 64 65 6e 74 20 74 68 61 74 20 74 68 65  ccident that the
35750 20 2e 69 6e 64 65 78 65 73 20 63 6f 6d 6d 61 6e   .indexes comman
35760 64 20 73 68 6f 77 73 20 61 6e 20 65 72 72 6f 72  d shows an error
35770 0a 20 20 20 20 20 20 2a 2a 20 77 68 65 6e 20 63  .      ** when c
35780 61 6c 6c 65 64 20 77 69 74 68 20 74 68 65 20 77  alled with the w
35790 72 6f 6e 67 20 6e 75 6d 62 65 72 20 6f 66 20 61  rong number of a
357a0 72 67 75 6d 65 6e 74 73 20 77 68 65 72 65 61 73  rguments whereas
357b0 20 74 68 65 20 2e 74 61 62 6c 65 73 0a 20 20 20   the .tables.   
357c0 20 20 20 2a 2a 20 63 6f 6d 6d 61 6e 64 20 64 6f     ** command do
357d0 65 73 20 6e 6f 74 2e 20 2a 2f 0a 20 20 20 20 20  es not. */.     
357e0 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65   raw_printf(stde
357f0 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 69 6e 64  rr, "Usage: .ind
35800 65 78 65 73 20 3f 4c 49 4b 45 2d 50 41 54 54 45  exes ?LIKE-PATTE
35810 52 4e 3f 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72  RN?\n");.      r
35820 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 67 6f 74  c = 1;.      got
35830 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65  o meta_command_e
35840 78 69 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  xit;.    }.    f
35850 6f 72 28 69 69 3d 30 3b 20 73 71 6c 69 74 65 33  or(ii=0; sqlite3
35860 5f 73 74 65 70 28 70 53 74 6d 74 29 3d 3d 53 51  _step(pStmt)==SQ
35870 4c 49 54 45 5f 52 4f 57 3b 20 69 69 2b 2b 29 7b  LITE_ROW; ii++){
35880 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
35890 72 20 2a 7a 44 62 4e 61 6d 65 20 3d 20 28 63 6f  r *zDbName = (co
358a0 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65  nst char*)sqlite
358b0 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53  3_column_text(pS
358c0 74 6d 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 69  tmt, 1);.      i
358d0 66 28 20 7a 44 62 4e 61 6d 65 3d 3d 30 20 29 20  f( zDbName==0 ) 
358e0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
358f0 69 66 28 20 73 2e 7a 20 26 26 20 73 2e 7a 5b 30  if( s.z && s.z[0
35900 5d 20 29 20 61 70 70 65 6e 64 54 65 78 74 28 26  ] ) appendText(&
35910 73 2c 20 22 20 55 4e 49 4f 4e 20 41 4c 4c 20 22  s, " UNION ALL "
35920 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
35930 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28  sqlite3_stricmp(
35940 7a 44 62 4e 61 6d 65 2c 20 22 6d 61 69 6e 22 29  zDbName, "main")
35950 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61  ==0 ){.        a
35960 70 70 65 6e 64 54 65 78 74 28 26 73 2c 20 22 53  ppendText(&s, "S
35970 45 4c 45 43 54 20 6e 61 6d 65 20 46 52 4f 4d 20  ELECT name FROM 
35980 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c  ", 0);.      }el
35990 73 65 7b 0a 20 20 20 20 20 20 20 20 61 70 70 65  se{.        appe
359a0 6e 64 54 65 78 74 28 26 73 2c 20 22 53 45 4c 45  ndText(&s, "SELE
359b0 43 54 20 22 2c 20 30 29 3b 0a 20 20 20 20 20 20  CT ", 0);.      
359c0 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 2c    appendText(&s,
359d0 20 7a 44 62 4e 61 6d 65 2c 20 27 5c 27 27 29 3b   zDbName, '\'');
359e0 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 54  .        appendT
359f0 65 78 74 28 26 73 2c 20 22 7c 7c 27 2e 27 7c 7c  ext(&s, "||'.'||
35a00 6e 61 6d 65 20 46 52 4f 4d 20 22 2c 20 30 29 3b  name FROM ", 0);
35a10 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
35a20 70 70 65 6e 64 54 65 78 74 28 26 73 2c 20 7a 44  ppendText(&s, zD
35a30 62 4e 61 6d 65 2c 20 27 22 27 29 3b 0a 20 20 20  bName, '"');.   
35a40 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73     appendText(&s
35a50 2c 20 22 2e 73 71 6c 69 74 65 5f 6d 61 73 74 65  , ".sqlite_maste
35a60 72 20 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  r ", 0);.      i
35a70 66 28 20 63 3d 3d 27 74 27 20 29 7b 0a 20 20 20  f( c=='t' ){.   
35a80 20 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28       appendText(
35a90 26 73 2c 22 20 57 48 45 52 45 20 74 79 70 65 20  &s," WHERE type 
35aa0 49 4e 20 28 27 74 61 62 6c 65 27 2c 27 76 69 65  IN ('table','vie
35ab0 77 27 29 22 0a 20 20 20 20 20 20 20 20 20 20 20  w')".           
35ac0 20 20 20 20 20 20 20 20 20 20 20 22 20 20 20 41             "   A
35ad0 4e 44 20 6e 61 6d 65 20 4e 4f 54 20 4c 49 4b 45  ND name NOT LIKE
35ae0 20 27 73 71 6c 69 74 65 5f 25 27 22 0a 20 20 20   'sqlite_%'".   
35af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35b00 20 20 20 22 20 20 20 41 4e 44 20 6e 61 6d 65 20     "   AND name 
35b10 4c 49 4b 45 20 3f 31 22 2c 20 30 29 3b 0a 20 20  LIKE ?1", 0);.  
35b20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
35b30 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73     appendText(&s
35b40 2c 22 20 57 48 45 52 45 20 74 79 70 65 3d 27 69  ," WHERE type='i
35b50 6e 64 65 78 27 22 0a 20 20 20 20 20 20 20 20 20  ndex'".         
35b60 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20 20               "  
35b70 20 41 4e 44 20 74 62 6c 5f 6e 61 6d 65 20 4c 49   AND tbl_name LI
35b80 4b 45 20 3f 31 22 2c 20 30 29 3b 0a 20 20 20 20  KE ?1", 0);.    
35b90 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72 63    }.    }.    rc
35ba0 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c   = sqlite3_final
35bb0 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20  ize(pStmt);.    
35bc0 61 70 70 65 6e 64 54 65 78 74 28 26 73 2c 20 22  appendText(&s, "
35bd0 20 4f 52 44 45 52 20 42 59 20 31 22 2c 20 30 29   ORDER BY 1", 0)
35be0 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
35bf0 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 70 2d  e3_prepare_v2(p-
35c00 3e 64 62 2c 20 73 2e 7a 2c 20 2d 31 2c 20 26 70  >db, s.z, -1, &p
35c10 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 66 72  Stmt, 0);.    fr
35c20 65 65 54 65 78 74 28 26 73 29 3b 0a 20 20 20 20  eeText(&s);.    
35c30 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
35c40 73 68 65 6c 6c 44 61 74 61 62 61 73 65 45 72 72  shellDatabaseErr
35c50 6f 72 28 70 2d 3e 64 62 29 3b 0a 0a 20 20 20 20  or(p->db);..    
35c60 2f 2a 20 52 75 6e 20 74 68 65 20 53 51 4c 20 73  /* Run the SQL s
35c70 74 61 74 65 6d 65 6e 74 20 70 72 65 70 61 72 65  tatement prepare
35c80 64 20 62 79 20 74 68 65 20 61 62 6f 76 65 20 62  d by the above b
35c90 6c 6f 63 6b 2e 20 53 74 6f 72 65 20 74 68 65 20  lock. Store the 
35ca0 72 65 73 75 6c 74 73 0a 20 20 20 20 2a 2a 20 61  results.    ** a
35cb0 73 20 61 6e 20 61 72 72 61 79 20 6f 66 20 6e 75  s an array of nu
35cc0 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 73 74 72  l-terminated str
35cd0 69 6e 67 73 20 69 6e 20 61 7a 52 65 73 75 6c 74  ings in azResult
35ce0 5b 5d 2e 20 20 2a 2f 0a 20 20 20 20 6e 52 6f 77  [].  */.    nRow
35cf0 20 3d 20 6e 41 6c 6c 6f 63 20 3d 20 30 3b 0a 20   = nAlloc = 0;. 
35d00 20 20 20 61 7a 52 65 73 75 6c 74 20 3d 20 30 3b     azResult = 0;
35d10 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3e 31 20  .    if( nArg>1 
35d20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
35d30 5f 62 69 6e 64 5f 74 65 78 74 28 70 53 74 6d 74  _bind_text(pStmt
35d40 2c 20 31 2c 20 61 7a 41 72 67 5b 31 5d 2c 20 2d  , 1, azArg[1], -
35d50 31 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  1, SQLITE_TRANSI
35d60 45 4e 54 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ENT);.    }else{
35d70 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62  .      sqlite3_b
35d80 69 6e 64 5f 74 65 78 74 28 70 53 74 6d 74 2c 20  ind_text(pStmt, 
35d90 31 2c 20 22 25 22 2c 20 2d 31 2c 20 53 51 4c 49  1, "%", -1, SQLI
35da0 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  TE_STATIC);.    
35db0 7d 0a 20 20 20 20 77 68 69 6c 65 28 20 73 71 6c  }.    while( sql
35dc0 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29  ite3_step(pStmt)
35dd0 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a  ==SQLITE_ROW ){.
35de0 20 20 20 20 20 20 69 66 28 20 6e 52 6f 77 3e 3d        if( nRow>=
35df0 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 20 20  nAlloc ){.      
35e00 20 20 63 68 61 72 20 2a 2a 61 7a 4e 65 77 3b 0a    char **azNew;.
35e10 20 20 20 20 20 20 20 20 69 6e 74 20 6e 32 20 3d          int n2 =
35e20 20 6e 41 6c 6c 6f 63 2a 32 20 2b 20 31 30 3b 0a   nAlloc*2 + 10;.
35e30 20 20 20 20 20 20 20 20 61 7a 4e 65 77 20 3d 20          azNew = 
35e40 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 36  sqlite3_realloc6
35e50 34 28 61 7a 52 65 73 75 6c 74 2c 20 73 69 7a 65  4(azResult, size
35e60 6f 66 28 61 7a 52 65 73 75 6c 74 5b 30 5d 29 2a  of(azResult[0])*
35e70 6e 32 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  n2);.        if(
35e80 20 61 7a 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20   azNew==0 ){.   
35e90 20 20 20 20 20 20 20 72 63 20 3d 20 73 68 65 6c         rc = shel
35ea0 6c 4e 6f 6d 65 6d 45 72 72 6f 72 28 29 3b 0a 20  lNomemError();. 
35eb0 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
35ec0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
35ed0 20 20 6e 41 6c 6c 6f 63 20 3d 20 6e 32 3b 0a 20    nAlloc = n2;. 
35ee0 20 20 20 20 20 20 20 61 7a 52 65 73 75 6c 74 20         azResult 
35ef0 3d 20 61 7a 4e 65 77 3b 0a 20 20 20 20 20 20 7d  = azNew;.      }
35f00 0a 20 20 20 20 20 20 61 7a 52 65 73 75 6c 74 5b  .      azResult[
35f10 6e 52 6f 77 5d 20 3d 20 73 71 6c 69 74 65 33 5f  nRow] = sqlite3_
35f20 6d 70 72 69 6e 74 66 28 22 25 73 22 2c 20 73 71  mprintf("%s", sq
35f30 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
35f40 74 28 70 53 74 6d 74 2c 20 30 29 29 3b 0a 20 20  t(pStmt, 0));.  
35f50 20 20 20 20 69 66 28 20 30 3d 3d 61 7a 52 65 73      if( 0==azRes
35f60 75 6c 74 5b 6e 52 6f 77 5d 20 29 7b 0a 20 20 20  ult[nRow] ){.   
35f70 20 20 20 20 20 72 63 20 3d 20 73 68 65 6c 6c 4e       rc = shellN
35f80 6f 6d 65 6d 45 72 72 6f 72 28 29 3b 0a 20 20 20  omemError();.   
35f90 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
35fa0 20 20 7d 0a 20 20 20 20 20 20 6e 52 6f 77 2b 2b    }.      nRow++
35fb0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
35fc0 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
35fd0 28 70 53 74 6d 74 29 21 3d 53 51 4c 49 54 45 5f  (pStmt)!=SQLITE_
35fe0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  OK ){.      rc =
35ff0 20 73 68 65 6c 6c 44 61 74 61 62 61 73 65 45 72   shellDatabaseEr
36000 72 6f 72 28 70 2d 3e 64 62 29 3b 0a 20 20 20 20  ror(p->db);.    
36010 7d 0a 0a 20 20 20 20 2f 2a 20 50 72 65 74 74 79  }..    /* Pretty
36020 2d 70 72 69 6e 74 20 74 68 65 20 63 6f 6e 74 65  -print the conte
36030 6e 74 73 20 6f 66 20 61 72 72 61 79 20 61 7a 52  nts of array azR
36040 65 73 75 6c 74 5b 5d 20 74 6f 20 74 68 65 20 6f  esult[] to the o
36050 75 74 70 75 74 20 2a 2f 0a 20 20 20 20 69 66 28  utput */.    if(
36060 20 72 63 3d 3d 30 20 26 26 20 6e 52 6f 77 3e 30   rc==0 && nRow>0
36070 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6c 65   ){.      int le
36080 6e 2c 20 6d 61 78 6c 65 6e 20 3d 20 30 3b 0a 20  n, maxlen = 0;. 
36090 20 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20       int i, j;. 
360a0 20 20 20 20 20 69 6e 74 20 6e 50 72 69 6e 74 43       int nPrintC
360b0 6f 6c 2c 20 6e 50 72 69 6e 74 52 6f 77 3b 0a 20  ol, nPrintRow;. 
360c0 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
360d0 6e 52 6f 77 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nRow; i++){.    
360e0 20 20 20 20 6c 65 6e 20 3d 20 73 74 72 6c 65 6e      len = strlen
360f0 33 30 28 61 7a 52 65 73 75 6c 74 5b 69 5d 29 3b  30(azResult[i]);
36100 0a 20 20 20 20 20 20 20 20 69 66 28 20 6c 65 6e  .        if( len
36110 3e 6d 61 78 6c 65 6e 20 29 20 6d 61 78 6c 65 6e  >maxlen ) maxlen
36120 20 3d 20 6c 65 6e 3b 0a 20 20 20 20 20 20 7d 0a   = len;.      }.
36130 20 20 20 20 20 20 6e 50 72 69 6e 74 43 6f 6c 20        nPrintCol 
36140 3d 20 38 30 2f 28 6d 61 78 6c 65 6e 2b 32 29 3b  = 80/(maxlen+2);
36150 0a 20 20 20 20 20 20 69 66 28 20 6e 50 72 69 6e  .      if( nPrin
36160 74 43 6f 6c 3c 31 20 29 20 6e 50 72 69 6e 74 43  tCol<1 ) nPrintC
36170 6f 6c 20 3d 20 31 3b 0a 20 20 20 20 20 20 6e 50  ol = 1;.      nP
36180 72 69 6e 74 52 6f 77 20 3d 20 28 6e 52 6f 77 20  rintRow = (nRow 
36190 2b 20 6e 50 72 69 6e 74 43 6f 6c 20 2d 20 31 29  + nPrintCol - 1)
361a0 2f 6e 50 72 69 6e 74 43 6f 6c 3b 0a 20 20 20 20  /nPrintCol;.    
361b0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 50 72    for(i=0; i<nPr
361c0 69 6e 74 52 6f 77 3b 20 69 2b 2b 29 7b 0a 20 20  intRow; i++){.  
361d0 20 20 20 20 20 20 66 6f 72 28 6a 3d 69 3b 20 6a        for(j=i; j
361e0 3c 6e 52 6f 77 3b 20 6a 2b 3d 6e 50 72 69 6e 74  <nRow; j+=nPrint
361f0 52 6f 77 29 7b 0a 20 20 20 20 20 20 20 20 20 20  Row){.          
36200 63 68 61 72 20 2a 7a 53 70 20 3d 20 6a 3c 6e 50  char *zSp = j<nP
36210 72 69 6e 74 52 6f 77 20 3f 20 22 22 20 3a 20 22  rintRow ? "" : "
36220 20 20 22 3b 0a 20 20 20 20 20 20 20 20 20 20 75    ";.          u
36230 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  tf8_printf(p->ou
36240 74 2c 20 22 25 73 25 2d 2a 73 22 2c 20 7a 53 70  t, "%s%-*s", zSp
36250 2c 20 6d 61 78 6c 65 6e 2c 0a 20 20 20 20 20 20  , maxlen,.      
36260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36270 61 7a 52 65 73 75 6c 74 5b 6a 5d 20 3f 20 61 7a  azResult[j] ? az
36280 52 65 73 75 6c 74 5b 6a 5d 3a 22 22 29 3b 0a 20  Result[j]:"");. 
36290 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
362a0 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f   raw_printf(p->o
362b0 75 74 2c 20 22 5c 6e 22 29 3b 0a 20 20 20 20 20  ut, "\n");.     
362c0 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f   }.    }..    fo
362d0 72 28 69 69 3d 30 3b 20 69 69 3c 6e 52 6f 77 3b  r(ii=0; ii<nRow;
362e0 20 69 69 2b 2b 29 20 73 71 6c 69 74 65 33 5f 66   ii++) sqlite3_f
362f0 72 65 65 28 61 7a 52 65 73 75 6c 74 5b 69 69 5d  ree(azResult[ii]
36300 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
36310 72 65 65 28 61 7a 52 65 73 75 6c 74 29 3b 0a 20  ree(azResult);. 
36320 20 7d 65 6c 73 65 0a 0a 20 20 2f 2a 20 42 65 67   }else..  /* Beg
36330 69 6e 20 72 65 64 69 72 65 63 74 69 6e 67 20 6f  in redirecting o
36340 75 74 70 75 74 20 74 6f 20 74 68 65 20 66 69 6c  utput to the fil
36350 65 20 22 74 65 73 74 63 61 73 65 2d 6f 75 74 2e  e "testcase-out.
36360 74 78 74 22 20 2a 2f 0a 20 20 69 66 28 20 63 3d  txt" */.  if( c=
36370 3d 27 74 27 20 26 26 20 73 74 72 63 6d 70 28 61  ='t' && strcmp(a
36380 7a 41 72 67 5b 30 5d 2c 22 74 65 73 74 63 61 73  zArg[0],"testcas
36390 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 6f 75  e")==0 ){.    ou
363a0 74 70 75 74 5f 72 65 73 65 74 28 70 29 3b 0a 20  tput_reset(p);. 
363b0 20 20 20 70 2d 3e 6f 75 74 20 3d 20 6f 75 74 70     p->out = outp
363c0 75 74 5f 66 69 6c 65 5f 6f 70 65 6e 28 22 74 65  ut_file_open("te
363d0 73 74 63 61 73 65 2d 6f 75 74 2e 74 78 74 22 29  stcase-out.txt")
363e0 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6f 75 74  ;.    if( p->out
363f0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 61 77  ==0 ){.      raw
36400 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
36410 22 45 72 72 6f 72 3a 20 63 61 6e 6e 6f 74 20 6f  "Error: cannot o
36420 70 65 6e 20 27 74 65 73 74 63 61 73 65 2d 6f 75  pen 'testcase-ou
36430 74 2e 74 78 74 27 5c 6e 22 29 3b 0a 20 20 20 20  t.txt'\n");.    
36440 7d 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3e 3d  }.    if( nArg>=
36450 32 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  2 ){.      sqlit
36460 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
36470 6f 66 28 70 2d 3e 7a 54 65 73 74 63 61 73 65 29  of(p->zTestcase)
36480 2c 20 70 2d 3e 7a 54 65 73 74 63 61 73 65 2c 20  , p->zTestcase, 
36490 22 25 73 22 2c 20 61 7a 41 72 67 5b 31 5d 29 3b  "%s", azArg[1]);
364a0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
364b0 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
364c0 74 66 28 73 69 7a 65 6f 66 28 70 2d 3e 7a 54 65  tf(sizeof(p->zTe
364d0 73 74 63 61 73 65 29 2c 20 70 2d 3e 7a 54 65 73  stcase), p->zTes
364e0 74 63 61 73 65 2c 20 22 3f 22 29 3b 0a 20 20 20  tcase, "?");.   
364f0 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 23 69 66 6e   }.  }else..#ifn
36500 64 65 66 20 53 51 4c 49 54 45 5f 55 4e 54 45 53  def SQLITE_UNTES
36510 54 41 42 4c 45 0a 20 20 69 66 28 20 63 3d 3d 27  TABLE.  if( c=='
36520 74 27 20 26 26 20 6e 3e 3d 38 20 26 26 20 73 74  t' && n>=8 && st
36530 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20  rncmp(azArg[0], 
36540 22 74 65 73 74 63 74 72 6c 22 2c 20 6e 29 3d 3d  "testctrl", n)==
36550 30 20 29 7b 0a 20 20 20 20 73 74 61 74 69 63 20  0 ){.    static 
36560 63 6f 6e 73 74 20 73 74 72 75 63 74 20 7b 0a 20  const struct {. 
36570 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
36580 20 2a 7a 43 74 72 6c 4e 61 6d 65 3b 20 20 20 2f   *zCtrlName;   /
36590 2a 20 4e 61 6d 65 20 6f 66 20 61 20 74 65 73 74  * Name of a test
365a0 2d 63 6f 6e 74 72 6f 6c 20 6f 70 74 69 6f 6e 20  -control option 
365b0 2a 2f 0a 20 20 20 20 20 20 20 69 6e 74 20 63 74  */.       int ct
365c0 72 6c 43 6f 64 65 3b 20 20 20 20 20 20 20 20 20  rlCode;         
365d0 20 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 63 6f     /* Integer co
365e0 64 65 20 66 6f 72 20 74 68 61 74 20 6f 70 74 69  de for that opti
365f0 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 63 6f 6e  on */.       con
36600 73 74 20 63 68 61 72 20 2a 7a 55 73 61 67 65 3b  st char *zUsage;
36610 20 20 20 20 20 20 2f 2a 20 55 73 61 67 65 20 6e        /* Usage n
36620 6f 74 65 73 20 2a 2f 0a 20 20 20 20 7d 20 61 43  otes */.    } aC
36630 74 72 6c 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20  trl[] = {.      
36640 7b 20 22 61 6c 77 61 79 73 22 2c 20 20 20 20 20  { "always",     
36650 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 54          SQLITE_T
36660 45 53 54 43 54 52 4c 5f 41 4c 57 41 59 53 2c 20  ESTCTRL_ALWAYS, 
36670 20 20 20 20 20 20 20 22 42 4f 4f 4c 45 41 4e 22         "BOOLEAN"
36680 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
36690 20 20 20 20 20 7b 20 22 61 73 73 65 72 74 22 2c       { "assert",
366a0 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
366b0 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 41 53 53  ITE_TESTCTRL_ASS
366c0 45 52 54 2c 20 20 20 20 20 20 20 20 22 42 4f 4f  ERT,        "BOO
366d0 4c 45 41 4e 22 20 20 20 20 20 20 20 20 20 20 20  LEAN"           
366e0 20 7d 2c 0a 20 20 20 20 2f 2a 7b 20 22 62 65 6e   },.    /*{ "ben
366f0 69 67 6e 5f 6d 61 6c 6c 6f 63 5f 68 6f 6f 6b 73  ign_malloc_hooks
36700 22 2c 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  ",SQLITE_TESTCTR
36710 4c 5f 42 45 4e 49 47 4e 5f 4d 41 4c 4c 4f 43 5f  L_BENIGN_MALLOC_
36720 48 4f 4f 4b 53 2c 20 22 22 20 20 20 20 20 20 20  HOOKS, ""       
36730 20 20 20 7d 2c 2a 2f 0a 20 20 20 20 2f 2a 7b 20     },*/.    /*{ 
36740 22 62 69 74 76 65 63 5f 74 65 73 74 22 2c 20 20  "bitvec_test",  
36750 20 20 20 20 20 20 53 51 4c 49 54 45 5f 54 45 53        SQLITE_TES
36760 54 43 54 52 4c 5f 42 49 54 56 45 43 5f 54 45 53  TCTRL_BITVEC_TES
36770 54 2c 20 20 20 22 22 20 20 20 20 20 20 20 20 20  T,   ""         
36780 20 20 20 20 20 20 20 7d 2c 2a 2f 0a 20 20 20 20         },*/.    
36790 20 20 7b 20 22 62 79 74 65 6f 72 64 65 72 22 2c    { "byteorder",
367a0 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
367b0 5f 54 45 53 54 43 54 52 4c 5f 42 59 54 45 4f 52  _TESTCTRL_BYTEOR
367c0 44 45 52 2c 20 20 20 20 20 22 22 20 20 20 20 20  DER,     ""     
367d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
367e0 0a 20 20 20 20 2f 2a 7b 20 22 66 61 75 6c 74 5f  .    /*{ "fault_
367f0 69 6e 73 74 61 6c 6c 22 2c 20 20 20 20 20 20 53  install",      S
36800 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 46  QLITE_TESTCTRL_F
36810 41 55 4c 54 5f 49 4e 53 54 41 4c 4c 2c 20 22 22  AULT_INSTALL, ""
36820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36830 7d 2c 20 2a 2f 0a 20 20 20 20 20 20 7b 20 22 69  }, */.      { "i
36840 6d 70 6f 73 74 65 72 22 2c 20 20 20 20 20 20 20  mposter",       
36850 20 20 20 20 53 51 4c 49 54 45 5f 54 45 53 54 43      SQLITE_TESTC
36860 54 52 4c 5f 49 4d 50 4f 53 54 45 52 2c 20 20 20  TRL_IMPOSTER,   
36870 22 53 43 48 45 4d 41 20 4f 4e 2f 4f 46 46 20 52  "SCHEMA ON/OFF R
36880 4f 4f 54 50 41 47 45 22 7d 2c 0a 23 69 66 64 65  OOTPAGE"},.#ifde
36890 66 20 53 51 4c 49 54 45 5f 4e 5f 4b 45 59 57 4f  f SQLITE_N_KEYWO
368a0 52 44 0a 20 20 20 20 20 20 7b 20 22 69 73 6b 65  RD.      { "iske
368b0 79 77 6f 72 64 22 2c 20 20 20 20 20 20 20 20 20  yword",         
368c0 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c   SQLITE_TESTCTRL
368d0 5f 49 53 4b 45 59 57 4f 52 44 2c 20 20 20 20 20  _ISKEYWORD,     
368e0 22 49 44 45 4e 54 49 46 49 45 52 22 20 20 20 20  "IDENTIFIER"    
368f0 20 20 20 20 20 7d 2c 0a 23 65 6e 64 69 66 0a 20       },.#endif. 
36900 20 20 20 20 20 7b 20 22 6c 6f 63 61 6c 74 69 6d       { "localtim
36910 65 5f 66 61 75 6c 74 22 2c 20 20 20 20 53 51 4c  e_fault",    SQL
36920 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4c 4f 43  ITE_TESTCTRL_LOC
36930 41 4c 54 49 4d 45 5f 46 41 55 4c 54 2c 22 42 4f  ALTIME_FAULT,"BO
36940 4f 4c 45 41 4e 22 20 20 20 20 20 20 20 20 20 20  OLEAN"          
36950 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 6e 65 76   },.      { "nev
36960 65 72 5f 63 6f 72 72 75 70 74 22 2c 20 20 20 20  er_corrupt",    
36970 20 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52    SQLITE_TESTCTR
36980 4c 5f 4e 45 56 45 52 5f 43 4f 52 52 55 50 54 2c  L_NEVER_CORRUPT,
36990 20 22 42 4f 4f 4c 45 41 4e 22 20 20 20 20 20 20   "BOOLEAN"      
369a0 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b        },.      {
369b0 20 22 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 22   "optimizations"
369c0 2c 20 20 20 20 20 20 53 51 4c 49 54 45 5f 54 45  ,      SQLITE_TE
369d0 53 54 43 54 52 4c 5f 4f 50 54 49 4d 49 5a 41 54  STCTRL_OPTIMIZAT
369e0 49 4f 4e 53 2c 20 22 44 49 53 41 42 4c 45 2d 4d  IONS, "DISABLE-M
369f0 41 53 4b 22 20 20 20 20 20 20 20 7d 2c 0a 23 69  ASK"       },.#i
36a00 66 64 65 66 20 59 59 43 4f 56 45 52 41 47 45 0a  fdef YYCOVERAGE.
36a10 20 20 20 20 20 20 7b 20 22 70 61 72 73 65 72 5f        { "parser_
36a20 63 6f 76 65 72 61 67 65 22 2c 20 20 20 20 53 51  coverage",    SQ
36a30 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 50 41  LITE_TESTCTRL_PA
36a40 52 53 45 52 5f 43 4f 56 45 52 41 47 45 2c 20 22  RSER_COVERAGE, "
36a50 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
36a60 20 20 7d 2c 0a 23 65 6e 64 69 66 0a 20 20 20 20    },.#endif.    
36a70 20 20 7b 20 22 70 65 6e 64 69 6e 67 5f 62 79 74    { "pending_byt
36a80 65 22 2c 20 20 20 20 20 20 20 53 51 4c 49 54 45  e",       SQLITE
36a90 5f 54 45 53 54 43 54 52 4c 5f 50 45 4e 44 49 4e  _TESTCTRL_PENDIN
36aa0 47 5f 42 59 54 45 2c 20 20 22 4f 46 46 53 45 54  G_BYTE,  "OFFSET
36ab0 20 20 22 20 20 20 20 20 20 20 20 20 20 20 7d 2c    "           },
36ac0 0a 20 20 20 20 20 20 7b 20 22 70 72 6e 67 5f 72  .      { "prng_r
36ad0 65 73 65 74 22 2c 20 20 20 20 20 20 20 20 20 53  eset",         S
36ae0 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 50  QLITE_TESTCTRL_P
36af0 52 4e 47 5f 52 45 53 45 54 2c 20 20 20 20 22 22  RNG_RESET,    ""
36b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36b10 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 70     },.      { "p
36b20 72 6e 67 5f 72 65 73 74 6f 72 65 22 2c 20 20 20  rng_restore",   
36b30 20 20 20 20 53 51 4c 49 54 45 5f 54 45 53 54 43      SQLITE_TESTC
36b40 54 52 4c 5f 50 52 4e 47 5f 52 45 53 54 4f 52 45  TRL_PRNG_RESTORE
36b50 2c 20 20 22 22 20 20 20 20 20 20 20 20 20 20 20  ,  ""           
36b60 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20          },.     
36b70 20 7b 20 22 70 72 6e 67 5f 73 61 76 65 22 2c 20   { "prng_save", 
36b80 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
36b90 54 45 53 54 43 54 52 4c 5f 50 52 4e 47 5f 53 41  TESTCTRL_PRNG_SA
36ba0 56 45 2c 20 20 20 20 20 22 22 20 20 20 20 20 20  VE,     ""      
36bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
36bc0 20 20 20 20 20 20 7b 20 22 72 65 73 65 72 76 65        { "reserve
36bd0 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 53 51  ",            SQ
36be0 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 52 45  LITE_TESTCTRL_RE
36bf0 53 45 52 56 45 2c 20 20 20 20 20 20 20 22 42 59  SERVE,       "BY
36c00 54 45 53 2d 4f 46 2d 52 45 53 45 52 56 45 22 20  TES-OF-RESERVE" 
36c10 20 20 7d 2c 0a 20 20 20 20 7d 3b 0a 20 20 20 20    },.    };.    
36c20 69 6e 74 20 74 65 73 74 63 74 72 6c 20 3d 20 2d  int testctrl = -
36c30 31 3b 0a 20 20 20 20 69 6e 74 20 69 43 74 72 6c  1;.    int iCtrl
36c40 20 3d 20 2d 31 3b 0a 20 20 20 20 69 6e 74 20 72   = -1;.    int r
36c50 63 32 20 3d 20 30 3b 20 20 20 20 2f 2a 20 30 3a  c2 = 0;    /* 0:
36c60 20 75 73 61 67 65 2e 20 20 31 3a 20 25 64 20 20   usage.  1: %d  
36c70 32 3a 20 25 78 20 20 33 3a 20 6e 6f 2d 6f 75 74  2: %x  3: no-out
36c80 70 75 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  put */.    int i
36c90 73 4f 6b 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74  sOk = 0;.    int
36ca0 20 69 2c 20 6e 32 3b 0a 20 20 20 20 63 6f 6e 73   i, n2;.    cons
36cb0 74 20 63 68 61 72 20 2a 7a 43 6d 64 20 3d 20 30  t char *zCmd = 0
36cc0 3b 0a 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28 70  ;..    open_db(p
36cd0 2c 20 30 29 3b 0a 20 20 20 20 7a 43 6d 64 20 3d  , 0);.    zCmd =
36ce0 20 6e 41 72 67 3e 3d 32 20 3f 20 61 7a 41 72 67   nArg>=2 ? azArg
36cf0 5b 31 5d 20 3a 20 22 68 65 6c 70 22 3b 0a 0a 20  [1] : "help";.. 
36d00 20 20 20 2f 2a 20 54 68 65 20 61 72 67 75 6d 65     /* The argume
36d10 6e 74 20 63 61 6e 20 6f 70 74 69 6f 6e 61 6c 6c  nt can optionall
36d20 79 20 62 65 67 69 6e 20 77 69 74 68 20 22 2d 22  y begin with "-"
36d30 20 6f 72 20 22 2d 2d 22 20 2a 2f 0a 20 20 20 20   or "--" */.    
36d40 69 66 28 20 7a 43 6d 64 5b 30 5d 3d 3d 27 2d 27  if( zCmd[0]=='-'
36d50 20 26 26 20 7a 43 6d 64 5b 31 5d 20 29 7b 0a 20   && zCmd[1] ){. 
36d60 20 20 20 20 20 7a 43 6d 64 2b 2b 3b 0a 20 20 20       zCmd++;.   
36d70 20 20 20 69 66 28 20 7a 43 6d 64 5b 30 5d 3d 3d     if( zCmd[0]==
36d80 27 2d 27 20 26 26 20 7a 43 6d 64 5b 31 5d 20 29  '-' && zCmd[1] )
36d90 20 7a 43 6d 64 2b 2b 3b 0a 20 20 20 20 7d 0a 0a   zCmd++;.    }..
36da0 20 20 20 20 2f 2a 20 2d 2d 68 65 6c 70 20 6c 69      /* --help li
36db0 73 74 73 20 61 6c 6c 20 74 65 73 74 2d 63 6f 6e  sts all test-con
36dc0 74 72 6f 6c 73 20 2a 2f 0a 20 20 20 20 69 66 28  trols */.    if(
36dd0 20 73 74 72 63 6d 70 28 7a 43 6d 64 2c 22 68 65   strcmp(zCmd,"he
36de0 6c 70 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  lp")==0 ){.     
36df0 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e   utf8_printf(p->
36e00 6f 75 74 2c 20 22 41 76 61 69 6c 61 62 6c 65 20  out, "Available 
36e10 74 65 73 74 2d 63 6f 6e 74 72 6f 6c 73 3a 5c 6e  test-controls:\n
36e20 22 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  ");.      for(i=
36e30 30 3b 20 69 3c 41 72 72 61 79 53 69 7a 65 28 61  0; i<ArraySize(a
36e40 43 74 72 6c 29 3b 20 69 2b 2b 29 7b 0a 20 20 20  Ctrl); i++){.   
36e50 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
36e60 28 70 2d 3e 6f 75 74 2c 20 22 20 20 2e 74 65 73  (p->out, "  .tes
36e70 74 63 74 72 6c 20 25 73 20 25 73 5c 6e 22 2c 0a  tctrl %s %s\n",.
36e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36e90 20 20 20 20 61 43 74 72 6c 5b 69 5d 2e 7a 43 74      aCtrl[i].zCt
36ea0 72 6c 4e 61 6d 65 2c 20 61 43 74 72 6c 5b 69 5d  rlName, aCtrl[i]
36eb0 2e 7a 55 73 61 67 65 29 3b 0a 20 20 20 20 20 20  .zUsage);.      
36ec0 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a  }.      rc = 1;.
36ed0 20 20 20 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f        goto meta_
36ee0 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20  command_exit;.  
36ef0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 63 6f 6e 76    }..    /* conv
36f00 65 72 74 20 74 65 73 74 63 74 72 6c 20 74 65 78  ert testctrl tex
36f10 74 20 6f 70 74 69 6f 6e 20 74 6f 20 76 61 6c 75  t option to valu
36f20 65 2e 20 61 6c 6c 6f 77 20 61 6e 79 20 75 6e 69  e. allow any uni
36f30 71 75 65 20 70 72 65 66 69 78 0a 20 20 20 20 2a  que prefix.    *
36f40 2a 20 6f 66 20 74 68 65 20 6f 70 74 69 6f 6e 20  * of the option 
36f50 6e 61 6d 65 2c 20 6f 72 20 61 20 6e 75 6d 65 72  name, or a numer
36f60 69 63 61 6c 20 76 61 6c 75 65 2e 20 2a 2f 0a 20  ical value. */. 
36f70 20 20 20 6e 32 20 3d 20 73 74 72 6c 65 6e 33 30     n2 = strlen30
36f80 28 7a 43 6d 64 29 3b 0a 20 20 20 20 66 6f 72 28  (zCmd);.    for(
36f90 69 3d 30 3b 20 69 3c 41 72 72 61 79 53 69 7a 65  i=0; i<ArraySize
36fa0 28 61 43 74 72 6c 29 3b 20 69 2b 2b 29 7b 0a 20  (aCtrl); i++){. 
36fb0 20 20 20 20 20 69 66 28 20 73 74 72 6e 63 6d 70       if( strncmp
36fc0 28 7a 43 6d 64 2c 20 61 43 74 72 6c 5b 69 5d 2e  (zCmd, aCtrl[i].
36fd0 7a 43 74 72 6c 4e 61 6d 65 2c 20 6e 32 29 3d 3d  zCtrlName, n2)==
36fe0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  0 ){.        if(
36ff0 20 74 65 73 74 63 74 72 6c 3c 30 20 29 7b 0a 20   testctrl<0 ){. 
37000 20 20 20 20 20 20 20 20 20 74 65 73 74 63 74 72           testctr
37010 6c 20 3d 20 61 43 74 72 6c 5b 69 5d 2e 63 74 72  l = aCtrl[i].ctr
37020 6c 43 6f 64 65 3b 0a 20 20 20 20 20 20 20 20 20  lCode;.         
37030 20 69 43 74 72 6c 20 3d 20 69 3b 0a 20 20 20 20   iCtrl = i;.    
37040 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
37050 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
37060 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a  (stderr, "Error:
37070 20 61 6d 62 69 67 75 6f 75 73 20 74 65 73 74 2d   ambiguous test-
37080 63 6f 6e 74 72 6f 6c 3a 20 5c 22 25 73 5c 22 5c  control: \"%s\"\
37090 6e 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n".             
370a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
370b0 20 22 55 73 65 20 5c 22 2e 74 65 73 74 63 74 72   "Use \".testctr
370c0 6c 20 2d 2d 68 65 6c 70 5c 22 20 66 6f 72 20 68  l --help\" for h
370d0 65 6c 70 5c 6e 22 2c 20 7a 43 6d 64 29 3b 0a 20  elp\n", zCmd);. 
370e0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b           rc = 1;
370f0 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
37100 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69  meta_command_exi
37110 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  t;.        }.   
37120 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
37130 66 28 20 74 65 73 74 63 74 72 6c 3c 30 20 29 7b  f( testctrl<0 ){
37140 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e  .      utf8_prin
37150 74 66 28 73 74 64 65 72 72 2c 22 45 72 72 6f 72  tf(stderr,"Error
37160 3a 20 75 6e 6b 6e 6f 77 6e 20 74 65 73 74 2d 63  : unknown test-c
37170 6f 6e 74 72 6f 6c 3a 20 25 73 5c 6e 22 0a 20 20  ontrol: %s\n".  
37180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37190 20 20 20 20 20 20 20 22 55 73 65 20 5c 22 2e 74         "Use \".t
371a0 65 73 74 63 74 72 6c 20 2d 2d 68 65 6c 70 5c 22  estctrl --help\"
371b0 20 66 6f 72 20 68 65 6c 70 5c 6e 22 2c 20 7a 43   for help\n", zC
371c0 6d 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  md);.    }else{.
371d0 20 20 20 20 20 20 73 77 69 74 63 68 28 74 65 73        switch(tes
371e0 74 63 74 72 6c 29 7b 0a 0a 20 20 20 20 20 20 20  tctrl){..       
371f0 20 2f 2a 20 73 71 6c 69 74 65 33 5f 74 65 73 74   /* sqlite3_test
37200 5f 63 6f 6e 74 72 6f 6c 28 69 6e 74 2c 20 64 62  _control(int, db
37210 2c 20 69 6e 74 29 20 2a 2f 0a 20 20 20 20 20 20  , int) */.      
37220 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45    case SQLITE_TE
37230 53 54 43 54 52 4c 5f 4f 50 54 49 4d 49 5a 41 54  STCTRL_OPTIMIZAT
37240 49 4f 4e 53 3a 0a 20 20 20 20 20 20 20 20 63 61  IONS:.        ca
37250 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54  se SQLITE_TESTCT
37260 52 4c 5f 52 45 53 45 52 56 45 3a 0a 20 20 20 20  RL_RESERVE:.    
37270 20 20 20 20 20 20 69 66 28 20 6e 41 72 67 3d 3d        if( nArg==
37280 33 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  3 ){.           
37290 20 69 6e 74 20 6f 70 74 20 3d 20 28 69 6e 74 29   int opt = (int)
372a0 73 74 72 74 6f 6c 28 61 7a 41 72 67 5b 32 5d 2c  strtol(azArg[2],
372b0 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20   0, 0);.        
372c0 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65      rc2 = sqlite
372d0 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 74  3_test_control(t
372e0 65 73 74 63 74 72 6c 2c 20 70 2d 3e 64 62 2c 20  estctrl, p->db, 
372f0 6f 70 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  opt);.          
37300 20 20 69 73 4f 6b 20 3d 20 33 3b 0a 20 20 20 20    isOk = 3;.    
37310 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
37320 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20    break;..      
37330 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 74 65 73    /* sqlite3_tes
37340 74 5f 63 6f 6e 74 72 6f 6c 28 69 6e 74 29 20 2a  t_control(int) *
37350 2f 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 53  /.        case S
37360 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 50  QLITE_TESTCTRL_P
37370 52 4e 47 5f 53 41 56 45 3a 0a 20 20 20 20 20 20  RNG_SAVE:.      
37380 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45    case SQLITE_TE
37390 53 54 43 54 52 4c 5f 50 52 4e 47 5f 52 45 53 54  STCTRL_PRNG_REST
373a0 4f 52 45 3a 0a 20 20 20 20 20 20 20 20 63 61 73  ORE:.        cas
373b0 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  e SQLITE_TESTCTR
373c0 4c 5f 50 52 4e 47 5f 52 45 53 45 54 3a 0a 20 20  L_PRNG_RESET:.  
373d0 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
373e0 45 5f 54 45 53 54 43 54 52 4c 5f 42 59 54 45 4f  E_TESTCTRL_BYTEO
373f0 52 44 45 52 3a 0a 20 20 20 20 20 20 20 20 20 20  RDER:.          
37400 69 66 28 20 6e 41 72 67 3d 3d 32 20 29 7b 0a 20  if( nArg==2 ){. 
37410 20 20 20 20 20 20 20 20 20 20 20 72 63 32 20 3d             rc2 =
37420 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f   sqlite3_test_co
37430 6e 74 72 6f 6c 28 74 65 73 74 63 74 72 6c 29 3b  ntrol(testctrl);
37440 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 73 4f  .            isO
37450 6b 20 3d 20 74 65 73 74 63 74 72 6c 3d 3d 53 51  k = testctrl==SQ
37460 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 42 59  LITE_TESTCTRL_BY
37470 54 45 4f 52 44 45 52 20 3f 20 31 20 3a 20 33 3b  TEORDER ? 1 : 3;
37480 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
37490 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20         break;.. 
374a0 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65         /* sqlite
374b0 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 69  3_test_control(i
374c0 6e 74 2c 20 75 69 6e 74 29 20 2a 2f 0a 20 20 20  nt, uint) */.   
374d0 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
374e0 5f 54 45 53 54 43 54 52 4c 5f 50 45 4e 44 49 4e  _TESTCTRL_PENDIN
374f0 47 5f 42 59 54 45 3a 0a 20 20 20 20 20 20 20 20  G_BYTE:.        
37500 20 20 69 66 28 20 6e 41 72 67 3d 3d 33 20 29 7b    if( nArg==3 ){
37510 0a 20 20 20 20 20 20 20 20 20 20 20 20 75 6e 73  .            uns
37520 69 67 6e 65 64 20 69 6e 74 20 6f 70 74 20 3d 20  igned int opt = 
37530 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 69 6e  (unsigned int)in
37540 74 65 67 65 72 56 61 6c 75 65 28 61 7a 41 72 67  tegerValue(azArg
37550 5b 32 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20  [2]);.          
37560 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33 5f    rc2 = sqlite3_
37570 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 74 65 73  test_control(tes
37580 74 63 74 72 6c 2c 20 6f 70 74 29 3b 0a 20 20 20  tctrl, opt);.   
37590 20 20 20 20 20 20 20 20 20 69 73 4f 6b 20 3d 20           isOk = 
375a0 33 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  3;.          }. 
375b0 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
375c0 0a 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69  .        /* sqli
375d0 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c  te3_test_control
375e0 28 69 6e 74 2c 20 69 6e 74 29 20 2a 2f 0a 20 20  (int, int) */.  
375f0 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54